Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/tools/wroot/streamers is written in an unsupported language. File is not indexed.

0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003 
0004 #ifndef tools_wroot_streamers
0005 #define tools_wroot_streamers
0006 
0007 #include "named"
0008 #include "directory"
0009 #include "file"
0010 #include "../vmanip" //convert
0011 
0012 #include "../histo/h1d"
0013 #include "../histo/h2d"
0014 #include "../histo/h3d"
0015 #include "../histo/p1d"
0016 #include "../histo/p2d"
0017 
0018 #include "../histo/h1df"
0019 #include "../histo/h2df"
0020 #include "../histo/h3df"
0021 
0022 namespace tools {
0023 namespace wroot {
0024 
0025 typedef histo::histo_data<double,unsigned int,unsigned int,double> hd_data;
0026 typedef histo::histo_data<double,unsigned int,unsigned int,float> hf_data;
0027 typedef histo::profile_data<double,unsigned int,unsigned int,double,double> pd_data;
0028 
0029 inline bool AttAxis_stream(buffer& a_buffer) {
0030   int fNdivisions = 510;   //Number of divisions(10000*n3 + 100*n2 + n1)
0031   short fAxisColor = 1;    //color of the line axis
0032   short fLabelColor = 1;   //color of labels
0033   short fLabelFont = 62;    //font for labels
0034   float fLabelOffset = 0.005F;  //offset of labels
0035   float fLabelSize = 0.04F;    //size of labels
0036   float fTickLength = 0.03F;   //length of tick marks
0037   float fTitleOffset = 1;  //offset of axis title
0038   float fTitleSize = 0.04F;    //size of axis title
0039   short fTitleColor = 1;   //color of axis title
0040   short fTitleFont = 62;    //font for axis title
0041 
0042   // Version 4 streaming (ROOT/v3-00-6).
0043   unsigned int beg;
0044   if(!a_buffer.write_version(4,beg)) return false;
0045 
0046   if(!a_buffer.write(fNdivisions)) return false;
0047   if(!a_buffer.write(fAxisColor)) return false;
0048   if(!a_buffer.write(fLabelColor)) return false;
0049   if(!a_buffer.write(fLabelFont)) return false;
0050   if(!a_buffer.write(fLabelOffset)) return false;
0051   if(!a_buffer.write(fLabelSize)) return false;
0052   if(!a_buffer.write(fTickLength)) return false;
0053   if(!a_buffer.write(fTitleOffset)) return false;
0054   if(!a_buffer.write(fTitleSize)) return false;
0055   if(!a_buffer.write(fTitleColor)) return false;
0056   if(!a_buffer.write(fTitleFont)) return false;
0057 
0058   if(!a_buffer.set_byte_count(beg)) return false;
0059   return true;
0060 }
0061 
0062 inline bool axis_stream(buffer& a_buffer,
0063                         const histo::axis<double,unsigned int>& a_axis,
0064                         const std::string& a_name,
0065                         const std::string& a_title) {
0066     // Version 6 streaming (ROOT/v3-00-6).
0067 
0068     unsigned int beg;
0069     if(!a_buffer.write_version(6,beg)) return false;
0070 
0071     if(!Named_stream(a_buffer,a_name,a_title)) return false;
0072 
0073     if(!AttAxis_stream(a_buffer)) return false;
0074 
0075     if(!a_buffer.write(a_axis.bins())) return false;
0076     if(!a_buffer.write(a_axis.lower_edge())) return false;
0077     if(!a_buffer.write(a_axis.upper_edge())) return false;
0078 
0079     // fXbins
0080       if(!a_buffer.write_array(a_axis.edges())) return false; //TArrayD
0081 
0082     if(!a_buffer.write((int)0)) return false; //fFirst
0083     if(!a_buffer.write((int)0)) return false; //fLast
0084 
0085     //Bool_t
0086     if(!a_buffer.write((unsigned char)0)) return false;  //TimeDisplay
0087 
0088     //TString
0089     if(!a_buffer.write(std::string())) return false; //TimeFormat
0090 
0091     if(!a_buffer.set_byte_count(beg)) return false;
0092 
0093     return true;
0094 }
0095 
0096 inline bool List_empty_stream(buffer& a_buffer) {
0097   unsigned int beg;
0098   if(!a_buffer.write_version(4,beg)) return false;
0099   if(!Object_stream(a_buffer)) return false;
0100   std::string name;
0101   if(!a_buffer.write(name)) return false;
0102   int nobjects = 0;
0103   if(!a_buffer.write(nobjects)) return false;
0104   if(!a_buffer.set_byte_count(beg)) return false;
0105   return true;
0106 }
0107 
0108 template <class HIST>
0109 inline std::string axis_title(const HIST& a_h,const std::string& a_key) {
0110   typedef std::map<std::string,std::string> annotations_t;
0111   annotations_t::const_iterator it = a_h.annotations().find(a_key);
0112   if(it==a_h.annotations().end()) return std::string();
0113   return (*it).second;
0114 }
0115 
0116 template <class HIST>
0117 inline bool TH_write_1D(buffer& a_buffer,
0118                         const HIST& a_h,
0119                         const std::string& a_name,
0120                         const std::vector<double>& a_bin_Sw2) {
0121 
0122     if(!a_buffer.write_version(3)) return false;
0123 
0124     if(!Named_stream(a_buffer,a_name,a_h.title())) return false;
0125 
0126     if(!AttLine_stream(a_buffer)) return false;
0127     if(!AttFill_stream(a_buffer)) return false;
0128     if(!AttMarker_stream(a_buffer)) return false;
0129 
0130     if(!a_buffer.write((int)a_h.get_bins())) return false;
0131 
0132     //fXAxis,fYAxis,fZAxis
0133     if(a_h.dimension()==3) {
0134 
0135      {histo::axis<double,unsigned int> haxis(a_h.get_axis(0));
0136       if(!axis_stream(a_buffer,haxis,"xaxis",axis_title(a_h,histo::key_axis_x_title()))) return false;}
0137 
0138      {histo::axis<double,unsigned int> haxis(a_h.get_axis(1));
0139       if(!axis_stream(a_buffer,haxis,"yaxis",axis_title(a_h,histo::key_axis_y_title()))) return false;}
0140 
0141      {histo::axis<double,unsigned int> haxis(a_h.get_axis(2));
0142       if(!axis_stream(a_buffer,haxis,"zaxis",axis_title(a_h,histo::key_axis_z_title()))) return false;}
0143 
0144     } else if(a_h.dimension()==2) {
0145 
0146      {histo::axis<double,unsigned int> haxis(a_h.get_axis(0));
0147       if(!axis_stream(a_buffer,haxis,"xaxis",axis_title(a_h,histo::key_axis_x_title()))) return false;}
0148 
0149      {histo::axis<double,unsigned int> haxis(a_h.get_axis(1));
0150       if(!axis_stream(a_buffer,haxis,"yaxis",axis_title(a_h,histo::key_axis_y_title()))) return false;}
0151 
0152      {histo::axis<double,unsigned int> dummy;
0153       dummy.configure(1,0,1);
0154       if(!axis_stream(a_buffer,dummy,"zaxis",axis_title(a_h,histo::key_axis_z_title()))) return false;}
0155 
0156     } else if(a_h.dimension()==1) {
0157 
0158      {histo::axis<double,unsigned int> haxis(a_h.get_axis(0));
0159       if(!axis_stream(a_buffer,haxis,"xaxis",axis_title(a_h,histo::key_axis_x_title()))) return false;}
0160 
0161      {histo::axis<double,unsigned int> dummy;
0162       dummy.configure(1,0,1);
0163       if(!axis_stream(a_buffer,dummy,"yaxis",axis_title(a_h,histo::key_axis_y_title()))) return false;}
0164 
0165      {histo::axis<double,unsigned int> dummy;
0166       dummy.configure(1,0,1);
0167       if(!axis_stream(a_buffer,dummy,"zaxis",axis_title(a_h,histo::key_axis_z_title()))) return false;}
0168 
0169     } else {
0170       return false;
0171     }
0172 
0173     if(!a_buffer.write((short)(1000 * 0.25))) return false; //fBarOffset
0174     if(!a_buffer.write((short)(1000 * 0.5))) return false; //fBarWidth
0175 
0176     if(!a_buffer.write((double)a_h.all_entries())) return false;
0177     if(!a_buffer.write((double)a_h.get_in_range_Sw())) return false;  //enforce double in case h1df
0178     if(!a_buffer.write((double)a_h.get_in_range_Sw2())) return false; //idem
0179 
0180    {double value;
0181     a_h.get_ith_axis_Sxw(0,value);
0182     if(!a_buffer.write(value)) return false;}
0183 
0184    {double value;
0185     a_h.get_ith_axis_Sx2w(0,value);
0186     if(!a_buffer.write(value)) return false;}
0187 
0188     if(!a_buffer.write((double)-1111)) return false; //fMaximum
0189     if(!a_buffer.write((double)-1111)) return false; //fMinimum
0190     if(!a_buffer.write((double)0)) return false; //NormFactor
0191 
0192     if(!a_buffer.write_array(std::vector<double>())) return false; //fContour TArrayD
0193 
0194     if(!a_buffer.write_array(a_bin_Sw2)) return false; //fSumw2 TArrayD
0195 
0196     // store annotation on fOption
0197     // but try to fool CERN-ROOT in order that it does not
0198     // understand fOption as.. CERN-ROOT options !
0199    //{std::string opt = " "+fAnnotation;
0200    // opt[0] = 0; //awfull trick
0201    // if(!a_buffer.write(opt)) return false;} //TString fOption
0202    {std::string opt;
0203     if(!a_buffer.write(opt)) return false;} //TString fOption
0204 
0205     if(!List_empty_stream(a_buffer)) return false; //*TList fFunctions
0206 
0207     return true;
0208 }
0209 
0210 template <class HIST>
0211 inline bool TH_write_2D(buffer& a_buffer,
0212                         const HIST& a_h,
0213                         const std::string& a_name,
0214                         const std::vector<double>& a_bin_Sw2) {
0215   if(!a_buffer.write_version(3)) return false;
0216   if(!TH_write_1D(a_buffer,a_h,a_name,a_bin_Sw2)) return false;
0217   if(!a_buffer.write((double)1)) return false; //ScaleFactor
0218 
0219  {double value;
0220   a_h.get_ith_axis_Sxw(1,value);
0221   if(!a_buffer.write(value)) return false;}
0222 
0223  {double value;
0224   a_h.get_ith_axis_Sx2w(1,value);
0225   if(!a_buffer.write(value)) return false;}
0226 
0227   if(!a_buffer.write((double)a_h.Sxyw())) return false; //Tsumwxy
0228 
0229   return true;
0230 }
0231 
0232 template <class HIST>
0233 inline bool TH_write_3D(buffer& a_buffer,
0234                         const HIST& a_h,
0235                         const std::string& a_name,
0236                         const std::vector<double>& a_bin_Sw2) {
0237   if(!a_buffer.write_version(4)) return false;
0238   if(!TH_write_1D(a_buffer,a_h,a_name,a_bin_Sw2)) return false;
0239   if(!Att3D_stream(a_buffer)) return false;
0240 
0241  {double value;
0242   a_h.get_ith_axis_Sxw(1,value);
0243   if(!a_buffer.write(value)) return false;}    //Tsumwy : Total Sum of weight*Y
0244  {double value;
0245   a_h.get_ith_axis_Sx2w(1,value);
0246   if(!a_buffer.write(value)) return false;}    //Tsumwy2 : Total Sum of weight*Y*Y
0247   if(!a_buffer.write((double)a_h.Sxyw())) return false; //Tsumwxy : Total Sum of weight*X*Y
0248 
0249  {double value;
0250   a_h.get_ith_axis_Sxw(2,value);
0251   if(!a_buffer.write(value)) return false;}    //Tsumwz : Total Sum of weight*Z
0252  {double value;
0253   a_h.get_ith_axis_Sx2w(2,value);
0254   if(!a_buffer.write(value)) return false;}    //Tsumwz2 : Total Sum of weight*Z*Z
0255   if(!a_buffer.write((double)a_h.Szxw())) return false; //Tsumwxz : Total Sum of weight*X*Z
0256   if(!a_buffer.write((double)a_h.Syzw())) return false; //Tsumwyz : Total Sum of weight*Y*Z
0257 
0258   return true;
0259 }
0260 
0261 inline bool TH1F_stream(buffer& a_buffer,const histo::h1df& a_h,const std::string& a_name) {
0262   if(!a_buffer.write_version(1)) return false;
0263   std::vector<double> bins_sum_w2d;
0264   convert<float,double>(a_h.bins_sum_w2(),bins_sum_w2d);
0265   if(!TH_write_1D(a_buffer,a_h,a_name,bins_sum_w2d)) return false;
0266   if(!a_buffer.write_array(a_h.bins_sum_w())) return false;
0267   return true;
0268 }
0269 
0270 inline bool TH1F_stream(buffer& a_buffer,const histo::h1d& a_h,const std::string& a_name) {
0271   if(!a_buffer.write_version(1)) return false;
0272   if(!TH_write_1D(a_buffer,a_h,a_name,a_h.bins_sum_w2())) return false;
0273   std::vector<float> bins_sum_wf;
0274   convert<double,float>(a_h.bins_sum_w(),bins_sum_wf);
0275   if(!a_buffer.write_array(bins_sum_wf)) return false;
0276   return true;
0277 }
0278 
0279 inline bool TH1D_stream(buffer& a_buffer,const histo::h1d& a_h,const std::string& a_name) {
0280   if(!a_buffer.write_version(1)) return false;
0281   if(!TH_write_1D(a_buffer,a_h,a_name,a_h.bins_sum_w2())) return false;
0282   if(!a_buffer.write_array(a_h.bins_sum_w())) return false; //fArray TArrayD
0283   return true;
0284 }
0285 
0286 inline bool TH2F_stream(buffer& a_buffer,const histo::h2d& a_h,const std::string& a_name){
0287   if(!a_buffer.write_version(3)) return false;
0288   if(!TH_write_2D(a_buffer,a_h,a_name,a_h.bins_sum_w2())) return false;
0289   std::vector<float> bins_sum_wf;
0290   convert<double,float>(a_h.bins_sum_w(),bins_sum_wf);
0291   if(!a_buffer.write_array(bins_sum_wf)) return false; //fArray TArrayF
0292   return true;
0293 }
0294 
0295 inline bool TH2F_stream(buffer& a_buffer,const histo::h2df& a_h,const std::string& a_name){
0296   if(!a_buffer.write_version(3)) return false;
0297   std::vector<double> bins_sum_w2d;
0298   convert<float,double>(a_h.bins_sum_w2(),bins_sum_w2d);
0299   if(!TH_write_2D(a_buffer,a_h,a_name,bins_sum_w2d)) return false;
0300   if(!a_buffer.write_array(a_h.bins_sum_w())) return false;
0301   return true;
0302 }
0303 
0304 inline bool TH2D_stream(buffer& a_buffer,const histo::h2d& a_h,const std::string& a_name){
0305   if(!a_buffer.write_version(3)) return false;
0306   if(!TH_write_2D(a_buffer,a_h,a_name,a_h.bins_sum_w2())) return false;
0307   if(!a_buffer.write_array(a_h.bins_sum_w())) return false; //fArray TArrayD
0308   return true;
0309 }
0310 
0311 inline bool TH3F_stream(buffer& a_buffer,const histo::h3d& a_h,const std::string& a_name){
0312   if(!a_buffer.write_version(3)) return false;
0313   if(!TH_write_3D(a_buffer,a_h,a_name,a_h.bins_sum_w2())) return false;
0314   std::vector<float> bins_sum_wf;
0315   convert<double,float>(a_h.bins_sum_w(),bins_sum_wf);
0316   if(!a_buffer.write_array(bins_sum_wf)) return false; //fArray TArrayF
0317   return true;
0318 }
0319 
0320 inline bool TH3F_stream(buffer& a_buffer,const histo::h3df& a_h,const std::string& a_name){
0321   if(!a_buffer.write_version(3)) return false;
0322   std::vector<double> bins_sum_w2d;
0323   convert<float,double>(a_h.bins_sum_w2(),bins_sum_w2d);
0324   if(!TH_write_3D(a_buffer,a_h,a_name,bins_sum_w2d)) return false;
0325   if(!a_buffer.write_array(a_h.bins_sum_w())) return false; //fArray TArrayF
0326   return true;
0327 }
0328 
0329 inline bool TH3D_stream(buffer& a_buffer,const histo::h3d& a_h,const std::string& a_name){
0330   if(!a_buffer.write_version(3)) return false;
0331   if(!TH_write_3D(a_buffer,a_h,a_name,a_h.bins_sum_w2())) return false;
0332   if(!a_buffer.write_array(a_h.bins_sum_w())) return false; //fArray TArrayD
0333   return true;
0334 }
0335 
0336 inline bool TProfile_stream(buffer& a_buffer,const histo::p1d& a_p,const std::string& a_name){
0337   if(!a_buffer.write_version(4)) return false;
0338 
0339   //WARNING : the mapping histo::p1d / TProfile is not obvious.
0340   //p1d::m_bin_Svw  <---> TProfile::fArray
0341   //p1d::m_bin_Sv2w <---> TProfile::fSumw2
0342   //p1d::m_bin_Sw   <---> TProfile::fBinEntries
0343 
0344   // TH1D_stream(a_buffer,h,a_name) :
0345   //if(!a_buffer.write_version(1)) return false;
0346   //if(!TH_write_1D(a_buffer,a_h,a_name,a_h.bins_sum_w2())) return false; //fSumw2 TArrayD
0347   //if(!a_buffer.write_array(a_h.bins_sum_w())) return false; //fArray TArrayD
0348   // but for profile :
0349   if(!a_buffer.write_version(1)) return false;
0350   if(!TH_write_1D(a_buffer,a_p,a_name,a_p.bins_sum_v2w())) return false; //fSumw2 TArrayD
0351   if(!a_buffer.write_array(a_p.bins_sum_vw())) return false; //fArray TArrayD
0352 
0353   //TProfile specific :
0354   if(!a_buffer.write_array(a_p.bins_sum_w())) return false; //fBinEntries TArrayD
0355 
0356   int errorMode = 0;
0357   if(!a_buffer.write(errorMode)) return false;
0358   if(!a_buffer.write(a_p.min_v())) return false;
0359   if(!a_buffer.write(a_p.max_v())) return false;
0360 
0361   // version 4 :
0362   if(!a_buffer.write(a_p.get_Svw())) return false;              //Double_t fTsumwy;  //Total Sum of weight*Y
0363   if(!a_buffer.write(a_p.get_Sv2w())) return false;             //Double_t fTsumwy2; //Total Sum of weight*Y*Y
0364 
0365   return true;
0366 }
0367 
0368 inline bool TProfile2D_stream(buffer& a_buffer,const histo::p2d& a_p,const std::string& a_name){
0369   if(!a_buffer.write_version(5)) return false;
0370 
0371   //WARNING : the mapping histo::p2d / TProfile2D is not obvious.
0372   //p2d::m_bin_Svw  <---> TProfile2D::fArray
0373   //p2d::m_bin_Sv2w <---> TProfile2D::fSumw2
0374   //p2d::m_bin_Sw   <---> TProfile2D::fBinEntries
0375 
0376   // TH2D_stream(a_buffer,h,a_name) :
0377   //if(!a_buffer.write_version(3)) return false;
0378   //if(!TH_write_2D(a_buffer,a_h,a_name,a_h.bins_sum_w2())) return false; //fSumw2 TArrayD
0379   //if(!a_buffer.write_array(a_h.bins_sum_w())) return false; //fArray TArrayD
0380   // for profile :
0381   if(!a_buffer.write_version(3)) return false;
0382   if(!TH_write_2D(a_buffer,a_p,a_name,a_p.bins_sum_v2w())) return false; //fSumw2 TArrayD
0383   if(!a_buffer.write_array(a_p.bins_sum_vw())) return false; //fArray TArrayD
0384 
0385   //TProfile2D specific :
0386   if(!a_buffer.write_array(a_p.bins_sum_w())) return false; //fBinEntries TArrayD
0387 
0388   int errorMode = 0;
0389   if(!a_buffer.write(errorMode)) return false;    //fErrorMode
0390   if(!a_buffer.write(a_p.min_v())) return false; //fZmin
0391   if(!a_buffer.write(a_p.max_v())) return false; //fZmax
0392 
0393   // version 5 :
0394   if(!a_buffer.write(a_p.get_Svw())) return false;              //Double_t fTsumwz;  //Total Sum of weight*Z
0395   if(!a_buffer.write(a_p.get_Sv2w())) return false;             //Double_t fTsumwz2; //Total Sum of weight*Z*Z
0396 
0397   return true;
0398 }
0399 
0400 }}
0401 
0402 #endif