inlib  1.2.0
/Users/barrand/private/dev/softinex/old/inexlib-1.2/inlib/inlib/wroot/streamers
Go to the documentation of this file.
00001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
00002 // See the file inlib.license for terms.
00003 
00004 #ifndef inlib_wroot_streamers
00005 #define inlib_wroot_streamers
00006 
00007 #include "named"
00008 #include "date"
00009 #include "directory"
00010 #include "file"
00011 #include "../vmanip" //convert
00012 
00013 #include "../histo/h1d"
00014 #include "../histo/h2d"
00015 //#include "../histo/h3d"
00016 #include "../histo/p1d"
00017 //#include "../histo/p2d"
00018 
00019 namespace inlib {
00020 namespace wroot {
00021 
00022 typedef histo::histo_data<double,unsigned int,double> hd_data;
00023 typedef histo::profile_data<double,unsigned int,double,double> pd_data;
00024 
00025 inline bool AttAxis_stream(buffer& a_buffer) {
00026   int fNdivisions = 510;   //Number of divisions(10000*n3 + 100*n2 + n1)
00027   short fAxisColor = 1;    //color of the line axis
00028   short fLabelColor = 1;   //color of labels
00029   short fLabelFont = 62;    //font for labels
00030   float fLabelOffset = 0.005F;  //offset of labels
00031   float fLabelSize = 0.04F;    //size of labels
00032   float fTickLength = 0.03F;   //length of tick marks
00033   float fTitleOffset = 1;  //offset of axis title
00034   float fTitleSize = 0.04F;    //size of axis title
00035   short fTitleColor = 1;   //color of axis title
00036   short fTitleFont = 62;    //font for axis title
00037 
00038   // Version 4 streaming (ROOT/v3-00-6).
00039   unsigned int beg;
00040   if(!a_buffer.write_version(4,beg)) return false;
00041 
00042   if(!a_buffer.write(fNdivisions)) return false;
00043   if(!a_buffer.write(fAxisColor)) return false;
00044   if(!a_buffer.write(fLabelColor)) return false;
00045   if(!a_buffer.write(fLabelFont)) return false;
00046   if(!a_buffer.write(fLabelOffset)) return false;
00047   if(!a_buffer.write(fLabelSize)) return false;
00048   if(!a_buffer.write(fTickLength)) return false;
00049   if(!a_buffer.write(fTitleOffset)) return false;
00050   if(!a_buffer.write(fTitleSize)) return false;
00051   if(!a_buffer.write(fTitleColor)) return false;
00052   if(!a_buffer.write(fTitleFont)) return false;
00053 
00054   if(!a_buffer.set_byte_count(beg)) return false;
00055   return true;
00056 }
00057 
00058 inline bool axis_stream(buffer& a_buffer,
00059                         const histo::axis<double>& a_axis,
00060                         const std::string& a_name) {
00061     // Version 6 streaming (ROOT/v3-00-6).
00062 
00063     unsigned int beg;
00064     if(!a_buffer.write_version(6,beg)) return false;
00065 
00066    {std::string title;
00067     if(!Named_stream(a_buffer,a_name,title)) return false;}
00068 
00069     if(!AttAxis_stream(a_buffer)) return false;
00070 
00071     if(!a_buffer.write(a_axis.bins())) return false;
00072     if(!a_buffer.write(a_axis.lower_edge())) return false;
00073     if(!a_buffer.write(a_axis.upper_edge())) return false;
00074 
00075     // fXbins 
00076     //if(a_axis.m_fixed) {
00077     //  std::vector<double> v;
00078     //  ArrayT<double> dummy(v);
00079     //  if(!dummy.stream(a_buffer)) return false; //TArrayD
00080     //} else {
00081       if(!Array_stream(a_buffer,a_axis.edges())) return false; //TArrayD
00082     //}
00083 
00084     if(!a_buffer.write((int)0)) return false; //fFirst
00085     if(!a_buffer.write((int)0)) return false; //fLast
00086 
00087     //Bool_t
00088     if(!a_buffer.write((unsigned char)0)) return false;  //TimeDisplay
00089 
00090     //TString
00091     if(!a_buffer.write(std::string())) return false; //TimeFormat
00092 
00093     if(!a_buffer.set_byte_count(beg)) return false;
00094 
00095     return true;
00096 }
00097 
00098 inline bool List_empty_stream(buffer& a_buffer) {
00099   unsigned int beg;
00100   if(!a_buffer.write_version(4,beg)) return false;
00101   if(!Object_stream(a_buffer)) return false;
00102   std::string name;
00103   if(!a_buffer.write(name)) return false;
00104   int nobjects = 0;
00105   if(!a_buffer.write(nobjects)) return false;
00106   if(!a_buffer.set_byte_count(beg)) return false;
00107   return true;
00108 }
00109 
00110 inline bool TH_write_1D(buffer& a_buffer,
00111                         const hd_data& a_data,
00112                         const std::string& a_name) {
00113 
00114     if(!a_buffer.write_version(3)) return false;
00115 
00116     if(!Named_stream(a_buffer,a_name,a_data.m_title)) return false;
00117 
00118     if(!AttLine_stream(a_buffer)) return false;
00119     if(!AttFill_stream(a_buffer)) return false;
00120     if(!AttMarker_stream(a_buffer)) return false;
00121 
00122     if(!a_buffer.write((int)a_data.m_bin_number)) return false;
00123 
00124     //fXAxis
00125    {//have a copy because of const.
00126     histo::axis<double> haxis(a_data.m_axes[0]);
00127     if(!axis_stream(a_buffer,haxis,"xaxis")) return false;}
00128 
00129     if(a_data.m_dimension==2) {
00130      {histo::axis<double> haxis(a_data.m_axes[1]);
00131       if(!axis_stream(a_buffer,haxis,"yaxis")) return false;}
00132 
00133       histo::axis<double> dummy;
00134       dummy.configure(1,0,1);
00135       if(!axis_stream(a_buffer,dummy,"zaxis")) return false;
00136     } else {
00137       histo::axis<double> dummy;
00138       dummy.configure(1,0,1);
00139       if(!axis_stream(a_buffer,dummy,"yaxis")) return false;
00140       if(!axis_stream(a_buffer,dummy,"zaxis")) return false;
00141     }
00142 
00143     if(!a_buffer.write((short)(1000 * 0.25))) return false; //fBarOffset
00144     if(!a_buffer.write((short)(1000 * 0.5))) return false; //fBarWidth
00145 
00146     if(!a_buffer.write((double)a_data.get_entries())) return false;
00147     if(!a_buffer.write(a_data.get_Sw())) return false;
00148     if(!a_buffer.write(a_data.get_Sw2())) return false;
00149 
00150    {double value;
00151     a_data.get_ith_axis_Sxw(0,value);  
00152     if(!a_buffer.write(value)) return false;}
00153 
00154    {double value;
00155     a_data.get_ith_axis_Sx2w(0,value);  
00156     if(!a_buffer.write(value)) return false;}
00157 
00158     if(!a_buffer.write((double)-1111)) return false; //fMaximum
00159     if(!a_buffer.write((double)-1111)) return false; //fMinimum
00160     if(!a_buffer.write((double)0)) return false; //NormFactor
00161 
00162     if(!Array_stream(a_buffer,std::vector<double>()))
00163       return false; //fContour TArrayD
00164 
00165     if(!Array_stream(a_buffer,a_data.m_bin_Sw2)) return false; //fSumw2 TArrayD
00166 
00167     // store annotation on fOption    
00168     // but try to fool ROOT in order that it does not
00169     // understand fOption as.. ROOT options !
00170    //{std::string opt = " "+fAnnotation;   
00171    // opt[0] = 0; //awfull trick
00172    // if(!a_buffer.write(opt)) return false;} //TString fOption
00173    {std::string opt;   
00174     if(!a_buffer.write(opt)) return false;} //TString fOption
00175 
00176     if(!List_empty_stream(a_buffer)) return false; //Functions
00177 
00178     return true;
00179 }
00180 
00181 inline bool TH_write_2D(buffer& a_buffer,
00182                         const hd_data& a_data,
00183                         const std::string& a_name) {
00184   if(!a_buffer.write_version(3)) return false;
00185   if(!TH_write_1D(a_buffer,a_data,a_name)) return false;
00186   if(!a_buffer.write((double)1)) return false; //ScaleFactor
00187 
00188  {double value;
00189   a_data.get_ith_axis_Sxw(1,value);  
00190   if(!a_buffer.write(value)) return false;}
00191 
00192  {double value;
00193   a_data.get_ith_axis_Sx2w(1,value);  
00194   if(!a_buffer.write(value)) return false;}
00195 
00196   if(!a_buffer.write((double)0)) return false; //Tsumwxy //FIXME.
00197 
00198   return true;
00199 }
00200 
00201 inline bool TH1F_stream(buffer& a_buffer,
00202                         const histo::h1d& a_h,
00203                         const std::string& a_name) {
00204   if(!a_buffer.write_version(1)) return false;
00205   hd_data data = a_h.get_histo_data();
00206   if(!TH_write_1D(a_buffer,data,a_name)) return false;
00207   if(!Array_stream(a_buffer,convert<double,float>(data.m_bin_Sw)))
00208     return false; //TH1D::TArrayD::fArray
00209   return true;
00210 }
00211 
00212 inline bool TH1D_stream(buffer& a_buffer,
00213                         const histo::h1d& a_h,
00214                         const std::string& a_name) {
00215   if(!a_buffer.write_version(1)) return false;
00216   hd_data data = a_h.get_histo_data();
00217   if(!TH_write_1D(a_buffer,data,a_name)) return false;
00218   if(!Array_stream(a_buffer,data.m_bin_Sw)) return false; //fArray TArrayD
00219   return true;
00220 }
00221 
00222 inline bool TH2F_stream(buffer& a_buffer,
00223                         const histo::h2d& a_h,
00224                         const std::string& a_name){
00225   if(!a_buffer.write_version(3)) return false;
00226   hd_data data = a_h.get_histo_data();
00227   if(!TH_write_2D(a_buffer,data,a_name)) return false;
00228   if(!Array_stream(a_buffer,convert<double,float>(data.m_bin_Sw)))
00229     return false; //fArray TArrayD
00230   return true;
00231 }
00232 
00233 inline bool TH2D_stream(buffer& a_buffer,
00234                         const histo::h2d& a_h,
00235                         const std::string& a_name){
00236   if(!a_buffer.write_version(3)) return false;
00237   hd_data data = a_h.get_histo_data();
00238   if(!TH_write_2D(a_buffer,data,a_name)) return false;
00239   if(!Array_stream(a_buffer,data.m_bin_Sw)) return false; //fArray TArrayD
00240   return true;
00241 }
00242 
00243 inline bool TProfile_stream(buffer& a_buffer,
00244                             const histo::p1d& a_p,
00245                             const std::string& a_name){
00246     if(!a_buffer.write_version(3)) return false;
00247 
00248     //WARNING : the mapping histo::p1d / TProfile is not obvious.
00249     //HCL::m_bin_Svw  <---> TProfile::fArray
00250     //HCL::m_bin_Sv2w <---> TProfile::fSumw2
00251     //HCL::m_bin_Sw   <---> TProfile::fBinEntries
00252 
00253     pd_data data = a_p.get_histo_data();
00254     //NOTE : histo.m_bin_Sw <---> TH1D::TArrayD::fArray
00255     //       then have to copy histo.m_bin_Svw on histo.m_bin_Sw
00256     //       before streaming.
00257 
00258     //save histo.m_bin_Sw on a ::Rio::Array_double :
00259     std::vector<double> vbins;
00260    {unsigned int binn = data.m_bin_number;
00261     vbins.resize(binn);
00262     for(unsigned int index=0;index<binn;index++){
00263       vbins[index] = data.m_bin_Sw[index];
00264     }}
00265 
00266     // copy histo.m_bin_Svw on histo.m_bin_Sw :
00267     data.m_bin_Sw = data.m_bin_Svw;    
00268 
00269     //WARNING : should create a valid Rio::TH1D::fHistogram
00270     //          being a histo::h1d.
00271     //          But the histo::p1d does not inherit histo::h1d.
00272 
00273     histo::h1d h("",10,0,1);
00274     h.copy_from_data(data);
00275     h.update_fast_getters();
00276     if(!TH1D_stream(a_buffer,h,a_name)) return false;
00277 
00278     //TProfile specific :
00279     if(!Array_stream(a_buffer,vbins)) return false; //fBinEntries TArrayD
00280 
00281     int errorMode = 0;
00282     if(!a_buffer.write(errorMode)) return false;
00283     if(!a_buffer.write(data.m_min_v)) return false;
00284     if(!a_buffer.write(data.m_max_v)) return false;
00285 
00286     return true;
00287 }
00288 
00289 }}
00290 
00291 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines