Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/tools/rroot/THistogram 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_rroot_THistogram
0005 #define tools_rroot_THistogram
0006 
0007 // to read some files produced with BatchLab (opaw/examples/osc/analysis.root).
0008 
0009 #include "../histo/profile_data"
0010 
0011 #include "named"
0012 #include "../vmanip"
0013 
0014 namespace tools {
0015 namespace rroot {
0016 
0017 typedef histo::profile_data<double,unsigned int,unsigned int,double,double> pd_data_t;
0018 typedef histo::axis<double,unsigned int> axis_t;
0019 typedef std::map<std::string,std::string> annotations_t;
0020 
0021 inline bool Axis_read_v0_v3(buffer& a_buffer,axis_t& a_axis) {
0022   int idummy;
0023   double ddummy;
0024   if(!a_buffer.read(a_axis.m_minimum_value)) return false;
0025   if(!a_buffer.read(a_axis.m_maximum_value)) return false;
0026   if(!a_buffer.read(a_axis.m_offset)) return false;
0027   if(!a_buffer.read(a_axis.m_number_of_bins)) return false;
0028   if(!a_buffer.read(idummy)) return false; //fOverFlow
0029   if(!a_buffer.read(idummy)) return false; //fUnderFlow
0030   if(!a_buffer.read(a_axis.m_bin_width)) return false;
0031   if(!a_buffer.read(ddummy)) return false; //fSxw
0032   if(!a_buffer.read(ddummy)) return false; //fSx2w
0033   a_axis.m_fixed = true;
0034   a_axis.m_edges.clear();
0035   return true;
0036 }
0037 
0038 inline bool Axis_read_v4_v6(buffer& a_buffer,axis_t& a_axis) {
0039   int idummy;
0040   double ddummy;
0041   if(!a_buffer.read(a_axis.m_offset)) return false;
0042   if(!a_buffer.read(idummy)) return false; //fOverFlow
0043   if(!a_buffer.read(idummy)) return false; //fUnderFlow
0044   if(!a_buffer.read(ddummy)) return false; //fSxw
0045   if(!a_buffer.read(ddummy)) return false; //fSx2w
0046   if(!a_buffer.read(a_axis.m_number_of_bins)) return false;
0047   if(!a_buffer.read(a_axis.m_minimum_value)) return false;
0048   if(!a_buffer.read(a_axis.m_maximum_value)) return false;
0049   if(!a_buffer.read(a_axis.m_fixed)) return false;
0050   if(!a_buffer.read(a_axis.m_bin_width)) return false;
0051   int edgen;
0052   if(!a_buffer.read(edgen)) return false;
0053   for(int count=0;count<edgen;count++) {
0054     double value;
0055     if(!a_buffer.read(value)) return false;
0056     a_axis.m_edges.push_back(value);
0057   }
0058   return true;
0059 }
0060 
0061 inline bool Axis_read_v7(buffer& a_buffer,axis_t& a_axis) {
0062   if(!a_buffer.read(a_axis.m_offset)) return false;
0063   if(!a_buffer.read(a_axis.m_number_of_bins)) return false;
0064   if(!a_buffer.read(a_axis.m_minimum_value)) return false;
0065   if(!a_buffer.read(a_axis.m_maximum_value)) return false;
0066   if(!a_buffer.read(a_axis.m_fixed)) return false;
0067   if(!a_buffer.read(a_axis.m_bin_width)) return false;
0068   int edgen;
0069   if(!a_buffer.read(edgen)) return false;
0070   for(int count=0;count<edgen;count++) {
0071     double value;
0072     if(!a_buffer.read(value)) return false;
0073     a_axis.m_edges.push_back(value);
0074   }
0075   return true;
0076 }
0077 
0078 inline unsigned int new_bin_number(const std::vector< axis_t >& aAxes) {
0079   unsigned int number = 1;
0080   for(unsigned int iaxis=0;iaxis<aAxes.size();iaxis++)
0081     number *= (aAxes[iaxis].bins()+2);
0082   return number;
0083 }
0084 
0085 template <class T>
0086 inline void add_outflow(const std::vector< axis_t >& aAxes,std::vector<T>& aVector) {
0087   // aAxes[].m_offset contains the offset without outflow.
0088   std::size_t dim = aAxes.size();
0089   // new size and offsets :
0090   std::vector<int> aoff(dim);
0091 
0092   int newn = 1;
0093  {for(unsigned iaxis=0;iaxis<dim;iaxis++) newn *= (aAxes[iaxis].bins()+2);}
0094 
0095   aoff[0] = 1;
0096  {for(unsigned iaxis=1;iaxis<dim;iaxis++) {
0097     aoff[iaxis] = aoff[iaxis-1] * (aAxes[iaxis-1].bins()+2);
0098   }}
0099   // copy :
0100   std::vector<T> tmp = aVector;
0101   int oldn = (int)tmp.size();
0102   aVector.resize(newn,0);
0103   // Copy :
0104   std::vector<int> is(dim);
0105   int offset;
0106   for(int index=0;index<oldn;index++) {
0107     // Get new offset of index :
0108     offset = index;
0109    {for(int iaxis=(int)dim-1;iaxis>=0;iaxis--) {
0110       is[iaxis] = offset/aAxes[iaxis].m_offset;
0111       offset -= is[iaxis] * aAxes[iaxis].m_offset;
0112     }}
0113     // new offset :
0114     offset = 0;
0115    {for(std::size_t iaxis=0;iaxis<dim;iaxis++) offset += is[iaxis] * aoff[iaxis];}
0116     aVector[offset] = tmp[index];
0117   }
0118 }
0119 
0120 inline void add_outflow(std::vector< axis_t >& aAxes) {
0121   // Restore new offsets :
0122   aAxes[0].m_offset = 1;
0123   for(unsigned int iaxis=1;iaxis<aAxes.size();iaxis++)
0124     aAxes[iaxis].m_offset = aAxes[iaxis-1].m_offset * (aAxes[iaxis-1].bins()+2);
0125 }
0126 
0127 inline bool read_v0(buffer& a_buffer,pd_data_t& a_data) {
0128   int idummy;
0129   double ddummy;
0130   std::string sdummy;
0131   if(!a_buffer.read(sdummy)) return false;
0132   if(!a_buffer.read(a_data.m_title)) return false;
0133 
0134  {int dim;
0135   if(!a_buffer.read(dim)) return false;
0136   a_data.m_dimension = dim;}
0137 
0138  {int nbin;
0139   if(!a_buffer.read(nbin)) return false;
0140   a_data.m_bin_number = nbin;}
0141 
0142   if(!a_buffer.read(idummy)) return false; //fEntries
0143   if(!a_buffer.read(idummy)) return false; //fOutFlow
0144   if(!a_buffer.read(ddummy)) return false; //fSw
0145 
0146   std::vector<int> vec;
0147   if(!a_buffer.read_array<int>(vec)) return false;
0148   convert<int,unsigned int>(vec,a_data.m_bin_entries);
0149 
0150   if(a_data.m_bin_entries.size()!=a_data.m_bin_number) return false;
0151   if(!a_buffer.read_array<double>(a_data.m_bin_Sw)) return false;
0152   if(a_data.m_bin_Sw.size()!=a_data.m_bin_number) return false;
0153   if(!a_buffer.read_array<double>(a_data.m_bin_Sw2)) return false;
0154   if(a_data.m_bin_Sw2.size()!=a_data.m_bin_number) return false;
0155   if(a_data.m_dimension>0) {
0156     a_data.m_axes.resize(a_data.m_dimension);
0157     for(unsigned int iaxis=0;iaxis<a_data.m_dimension;iaxis++) {
0158       if(!Axis_read_v0_v3(a_buffer,a_data.m_axes[iaxis])) return false;
0159     }
0160   }
0161   axis_t axisOfValues;
0162   if(!Axis_read_v0_v3(a_buffer,axisOfValues)) return false;
0163  {int dummy;
0164   if(!a_buffer.read(dummy)) return false;} //m_mode
0165 
0166   // Add outflow :
0167   a_data.m_bin_number = new_bin_number(a_data.m_axes);
0168   add_outflow<unsigned int>(a_data.m_axes,a_data.m_bin_entries);
0169   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw);
0170   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw2);
0171   add_outflow(a_data.m_axes);
0172 
0173   // Not here in v0 :
0174   std::vector<double> empty;
0175   empty.resize(a_data.m_dimension,0);
0176   a_data.m_bin_Sxw.resize(a_data.m_bin_number,empty);
0177   a_data.m_bin_Sx2w.resize(a_data.m_bin_number,empty);
0178   a_data.m_is_profile = false;
0179   a_data.m_bin_Svw.clear();
0180   a_data.m_bin_Sv2w.clear();
0181 
0182   return true;
0183 }
0184 
0185 inline bool read_v1(buffer& a_buffer,pd_data_t& a_data) {
0186   int idummy;
0187   double ddummy;
0188   if(!a_buffer.read(a_data.m_title)) return false;
0189 
0190  {int dim;
0191   if(!a_buffer.read(dim)) return false;
0192   a_data.m_dimension = dim;}
0193 
0194  {int nbin;
0195   if(!a_buffer.read(nbin)) return false;
0196   a_data.m_bin_number = nbin;}
0197 
0198   if(!a_buffer.read(idummy)) return false; //fEntries
0199   if(!a_buffer.read(idummy)) return false; //fOutFlow
0200   if(!a_buffer.read(ddummy)) return false; //fSw
0201 
0202   std::vector<int> vec;
0203   if(!a_buffer.read_array<int>(vec)) return false;
0204   convert<int,unsigned int>(vec,a_data.m_bin_entries);
0205 
0206   if(a_data.m_bin_entries.size()!=a_data.m_bin_number) return false;
0207   if(!a_buffer.read_array<double>(a_data.m_bin_Sw)) return false;
0208   if(a_data.m_bin_Sw.size()!=a_data.m_bin_number) return false;
0209   if(!a_buffer.read_array<double>(a_data.m_bin_Sw2)) return false;
0210   if(a_data.m_bin_Sw2.size()!=a_data.m_bin_number) return false;
0211   if(a_data.m_dimension>0) {
0212     a_data.m_axes.resize(a_data.m_dimension);
0213     for(unsigned int iaxis=0;iaxis<a_data.m_dimension;iaxis++) {
0214       if(!Axis_read_v0_v3(a_buffer,a_data.m_axes[iaxis])) return false;
0215     }
0216   }
0217   axis_t axisOfValues;
0218   if(!Axis_read_v0_v3(a_buffer,axisOfValues)) return false;
0219  {int dummy;
0220   if(!a_buffer.read(dummy)) return false;} //m_mode
0221 
0222   // Add outflow :
0223   a_data.m_bin_number = new_bin_number(a_data.m_axes);
0224   add_outflow<unsigned int>(a_data.m_axes,a_data.m_bin_entries);
0225   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw);
0226   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw2);
0227   add_outflow(a_data.m_axes);
0228 
0229   // Not here in v1 :
0230   std::vector<double> empty;
0231   empty.resize(a_data.m_dimension,0);
0232   a_data.m_bin_Sxw.resize(a_data.m_bin_number,empty);
0233   a_data.m_bin_Sx2w.resize(a_data.m_bin_number,empty);
0234   a_data.m_is_profile = false;
0235   a_data.m_bin_Svw.clear();
0236   a_data.m_bin_Sv2w.clear();
0237 
0238   return true;
0239 }
0240 
0241 inline bool read_v2(buffer& a_buffer,pd_data_t& a_data) {
0242   int idummy;
0243   double ddummy;
0244   std::string sdummy;
0245   if(!a_buffer.read(a_data.m_title)) return false;
0246   if(!a_buffer.read(sdummy)) return false;
0247 
0248  {int dim;
0249   if(!a_buffer.read(dim)) return false;
0250   a_data.m_dimension = dim;}
0251 
0252  {int nbin;
0253   if(!a_buffer.read(nbin)) return false;
0254   a_data.m_bin_number = nbin;}
0255 
0256   if(!a_buffer.read(idummy)) return false; //fEntries
0257   if(!a_buffer.read(idummy)) return false; //fOutFlow
0258   if(!a_buffer.read(ddummy)) return false; //fSw
0259 
0260   std::vector<int> vec;
0261   if(!a_buffer.read_array<int>(vec)) return false;
0262   convert<int,unsigned int>(vec,a_data.m_bin_entries);
0263 
0264   if(a_data.m_bin_entries.size()!=a_data.m_bin_number) return false;
0265   if(!a_buffer.read_array<double>(a_data.m_bin_Sw)) return false;
0266   if(a_data.m_bin_Sw.size()!=a_data.m_bin_number) return false;
0267   if(!a_buffer.read_array<double>(a_data.m_bin_Sw2)) return false;
0268   if(a_data.m_bin_Sw2.size()!=a_data.m_bin_number) return false;
0269   if(a_data.m_dimension>0) {
0270     a_data.m_axes.resize(a_data.m_dimension);
0271     for(unsigned int iaxis=0;iaxis<a_data.m_dimension;iaxis++) {
0272       if(!Axis_read_v0_v3(a_buffer,a_data.m_axes[iaxis])) return false;
0273     }
0274   }
0275   axis_t axisOfValues;
0276   if(!Axis_read_v0_v3(a_buffer,axisOfValues)) return false;
0277  {int dummy;
0278   if(!a_buffer.read(dummy)) return false;} //m_mode
0279 
0280   // Add outflow :
0281   a_data.m_bin_number = new_bin_number(a_data.m_axes);
0282   add_outflow<unsigned int>(a_data.m_axes,a_data.m_bin_entries);
0283   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw);
0284   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw2);
0285   add_outflow(a_data.m_axes);
0286 
0287   // Not here in v2 :
0288   std::vector<double> empty;
0289   empty.resize(a_data.m_dimension,0);
0290   a_data.m_bin_Sxw.resize(a_data.m_bin_number,empty);
0291   a_data.m_bin_Sx2w.resize(a_data.m_bin_number,empty);
0292   a_data.m_is_profile = false;
0293   a_data.m_bin_Svw.clear();
0294   a_data.m_bin_Sv2w.clear();
0295 
0296   return true;
0297 }
0298 
0299 inline bool read_v3(buffer& a_buffer,pd_data_t& a_data) {
0300   int idummy;
0301   double ddummy;
0302 
0303   int l;
0304   if(!a_buffer.read(l)) return false;
0305   char* str = new char[l+1];
0306   for (int i = 0; i < l; i++) {
0307     if(!a_buffer.read(str[i])) { delete [] str;return false;}
0308   }
0309   str[l] = '\0';
0310   a_data.m_title = str;
0311   delete [] str;
0312 
0313  {int dim;
0314   if(!a_buffer.read(dim)) return false;
0315   a_data.m_dimension = dim;}
0316 
0317  {int nbin;
0318   if(!a_buffer.read(nbin)) return false;
0319   a_data.m_bin_number = nbin;}
0320 
0321   if(!a_buffer.read(idummy)) return false; //fEntries
0322   if(!a_buffer.read(idummy)) return false; //fOutFlow
0323   if(!a_buffer.read(ddummy)) return false; //fSw
0324 
0325   std::vector<int> vec;
0326   if(!a_buffer.read_array<int>(vec)) return false;
0327   convert<int,unsigned int>(vec,a_data.m_bin_entries);
0328 
0329   if(a_data.m_bin_entries.size()!=a_data.m_bin_number) return false;
0330   if(!a_buffer.read_array<double>(a_data.m_bin_Sw)) return false;
0331   if(a_data.m_bin_Sw.size()!=a_data.m_bin_number) return false;
0332   if(!a_buffer.read_array<double>(a_data.m_bin_Sw2)) return false;
0333   if(a_data.m_bin_Sw2.size()!=a_data.m_bin_number) return false;
0334   if(a_data.m_dimension>0) {
0335     a_data.m_axes.resize(a_data.m_dimension);
0336     for(unsigned int iaxis=0;iaxis<a_data.m_dimension;iaxis++) {
0337       if(!Axis_read_v0_v3(a_buffer,a_data.m_axes[iaxis])) return false;
0338     }
0339   }
0340   axis_t axisOfValues;
0341   if(!Axis_read_v0_v3(a_buffer,axisOfValues)) return false;
0342  {int dummy;
0343   if(!a_buffer.read(dummy)) return false;} //m_mode
0344 
0345   // Add outflow :
0346   a_data.m_bin_number = new_bin_number(a_data.m_axes);
0347   add_outflow<unsigned int>(a_data.m_axes,a_data.m_bin_entries);
0348   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw);
0349   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw2);
0350   add_outflow(a_data.m_axes);
0351 
0352   // Not here in v3 :
0353   std::vector<double> empty;
0354   empty.resize(a_data.m_dimension,0);
0355   a_data.m_bin_Sxw.resize(a_data.m_bin_number,empty);
0356   a_data.m_bin_Sx2w.resize(a_data.m_bin_number,empty);
0357   a_data.m_is_profile = false;
0358   a_data.m_bin_Svw.clear();
0359   a_data.m_bin_Sv2w.clear();
0360 
0361   return true;
0362 }
0363 
0364 inline bool read_v4(buffer& a_buffer,pd_data_t& a_data) {
0365   int idummy;
0366   double ddummy;
0367 
0368   int l;
0369   if(!a_buffer.read(l)) return false;
0370   char* str = new char[l+1];
0371   for (int i = 0; i < l; i++) {
0372     if(!a_buffer.read(str[i])) { delete [] str;return false;}
0373   }
0374   str[l] = '\0';
0375   a_data.m_title = str;
0376   delete [] str;
0377 
0378  {int dim;
0379   if(!a_buffer.read(dim)) return false;
0380   a_data.m_dimension = dim;}
0381 
0382  {int nbin;
0383   if(!a_buffer.read(nbin)) return false;
0384   a_data.m_bin_number = nbin;}
0385 
0386   if(!a_buffer.read(idummy)) return false; //fEntries
0387   if(!a_buffer.read(idummy)) return false; //fOutFlow
0388   if(!a_buffer.read(ddummy)) return false; //fSw
0389 
0390   std::vector<int> vec;
0391   if(!a_buffer.read_array<int>(vec)) return false;
0392   convert<int,unsigned int>(vec,a_data.m_bin_entries);
0393 
0394   if(a_data.m_bin_entries.size()!=a_data.m_bin_number) return false;
0395   if(!a_buffer.read_array<double>(a_data.m_bin_Sw)) return false;
0396   if(a_data.m_bin_Sw.size()!=a_data.m_bin_number) return false;
0397   if(!a_buffer.read_array<double>(a_data.m_bin_Sw2)) return false;
0398   if(a_data.m_bin_Sw2.size()!=a_data.m_bin_number) return false;
0399   if(a_data.m_dimension>0) {
0400     a_data.m_axes.resize(a_data.m_dimension);
0401     for(unsigned int iaxis=0;iaxis<a_data.m_dimension;iaxis++) {
0402       if(!Axis_read_v4_v6(a_buffer,a_data.m_axes[iaxis])) return false;
0403     }
0404   }
0405  {int dummy;
0406   if(!a_buffer.read(dummy)) return false;} //m_mode
0407 
0408   // Add outflow :
0409   a_data.m_bin_number = new_bin_number(a_data.m_axes);
0410   add_outflow<unsigned int>(a_data.m_axes,a_data.m_bin_entries);
0411   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw);
0412   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw2);
0413   add_outflow(a_data.m_axes);
0414 
0415   // Not here in v4 :
0416   std::vector<double> empty;
0417   empty.resize(a_data.m_dimension,0);
0418   a_data.m_bin_Sxw.resize(a_data.m_bin_number,empty);
0419   a_data.m_bin_Sx2w.resize(a_data.m_bin_number,empty);
0420   a_data.m_is_profile = false;
0421   a_data.m_bin_Svw.clear();
0422   a_data.m_bin_Sv2w.clear();
0423 
0424   return true;
0425 }
0426 
0427 inline bool read_v5(buffer& a_buffer,pd_data_t& a_data) {
0428   int idummy;
0429   double ddummy;
0430   if(!a_buffer.read(a_data.m_title)) return false;
0431 
0432  {int dim;
0433   if(!a_buffer.read(dim)) return false;
0434   a_data.m_dimension = dim;}
0435 
0436  {int nbin;
0437   if(!a_buffer.read(nbin)) return false;
0438   a_data.m_bin_number = nbin;}
0439 
0440   if(!a_buffer.read(idummy)) return false; //fEntries
0441   if(!a_buffer.read(idummy)) return false; //fOutFlow
0442   if(!a_buffer.read(ddummy)) return false; //fSw
0443 
0444   std::vector<int> vec;
0445   if(!a_buffer.read_array<int>(vec)) return false;
0446   convert<int,unsigned int>(vec,a_data.m_bin_entries);
0447 
0448   if(a_data.m_bin_entries.size()!=a_data.m_bin_number) return false;
0449   if(!a_buffer.read_array<double>(a_data.m_bin_Sw)) return false;
0450   if(a_data.m_bin_Sw.size()!=a_data.m_bin_number) return false;
0451   if(!a_buffer.read_array<double>(a_data.m_bin_Sw2)) return false;
0452   if(a_data.m_bin_Sw2.size()!=a_data.m_bin_number) return false;
0453   if(a_data.m_dimension>0) {
0454     a_data.m_axes.resize(a_data.m_dimension);
0455     for(unsigned int iaxis=0;iaxis<a_data.m_dimension;iaxis++) {
0456       if(!Axis_read_v4_v6(a_buffer,a_data.m_axes[iaxis])) return false;
0457     }
0458   }
0459  {int dummy;
0460   if(!a_buffer.read(dummy)) return false;} //m_mode
0461 
0462   // Add outflow :
0463   a_data.m_bin_number = new_bin_number(a_data.m_axes);
0464   add_outflow<unsigned int>(a_data.m_axes,a_data.m_bin_entries);
0465   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw);
0466   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw2);
0467   add_outflow(a_data.m_axes);
0468 
0469   // Not here in v5 :
0470   std::vector<double> empty;
0471   empty.resize(a_data.m_dimension,0);
0472   a_data.m_bin_Sxw.resize(a_data.m_bin_number,empty);
0473   a_data.m_bin_Sx2w.resize(a_data.m_bin_number,empty);
0474   a_data.m_is_profile = false;
0475   a_data.m_bin_Svw.clear();
0476   a_data.m_bin_Sv2w.clear();
0477 
0478   return true;
0479 }
0480 
0481 inline bool read_v6(buffer& a_buffer,pd_data_t& a_data) {
0482   int idummy;
0483   double ddummy;
0484   if(!a_buffer.read(a_data.m_title)) return false;
0485 
0486  {int dim;
0487   if(!a_buffer.read(dim)) return false;
0488   a_data.m_dimension = dim;}
0489 
0490  {int nbin;
0491   if(!a_buffer.read(nbin)) return false;
0492   a_data.m_bin_number = nbin;}
0493 
0494   if(!a_buffer.read(idummy)) return false; //fEntries
0495   if(!a_buffer.read(idummy)) return false; //fOutFlow
0496   if(!a_buffer.read(ddummy)) return false; //fSw
0497 
0498   std::vector<int> vec;
0499   if(!a_buffer.read_array<int>(vec)) return false;
0500   convert<int,unsigned int>(vec,a_data.m_bin_entries);
0501 
0502   if(a_data.m_bin_entries.size()!=a_data.m_bin_number) return false;
0503   if(!a_buffer.read_array<double>(a_data.m_bin_Sw)) return false;
0504   if(a_data.m_bin_Sw.size()!=a_data.m_bin_number) return false;
0505   if(!a_buffer.read_array<double>(a_data.m_bin_Sw2)) return false;
0506   if(a_data.m_bin_Sw2.size()!=a_data.m_bin_number) return false;
0507   if(a_data.m_dimension>0) {
0508     a_data.m_axes.resize(a_data.m_dimension);
0509     for(unsigned int iaxis=0;iaxis<a_data.m_dimension;iaxis++) {
0510       if(!Axis_read_v4_v6(a_buffer,a_data.m_axes[iaxis])) return false;
0511     }
0512   }
0513  {int dummy;
0514   if(!a_buffer.read(dummy)) return false;} //m_mode
0515 
0516   // Profile :
0517   if(!a_buffer.read(a_data.m_is_profile)) return false;
0518   if(a_data.m_is_profile) {
0519     if(!a_buffer.read_array<double>(a_data.m_bin_Svw)) return false;
0520     if(a_data.m_bin_Svw.size()!=a_data.m_bin_number) return false;
0521     if(!a_buffer.read(a_data.m_cut_v)) return false;
0522     if(!a_buffer.read(a_data.m_min_v)) return false;
0523     if(!a_buffer.read(a_data.m_max_v)) return false;
0524   }
0525 
0526   // Add outflow :
0527   a_data.m_bin_number = new_bin_number(a_data.m_axes);
0528   add_outflow<unsigned int>(a_data.m_axes,a_data.m_bin_entries);
0529   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw);
0530   add_outflow<double>(a_data.m_axes,a_data.m_bin_Sw2);
0531   add_outflow<double>(a_data.m_axes,a_data.m_bin_Svw);
0532   add_outflow(a_data.m_axes);
0533 
0534   // Not here in v6 :
0535   std::vector<double> empty;
0536   empty.resize(a_data.m_dimension,0);
0537   a_data.m_bin_Sxw.resize(a_data.m_bin_number,empty); //Forget to write in v6 !
0538   a_data.m_bin_Sx2w.resize(a_data.m_bin_number,empty);
0539   if(a_data.m_is_profile) {
0540     a_data.m_bin_Sv2w.resize(a_data.m_bin_number,0);
0541   }
0542 
0543   return true;
0544 }
0545 
0546 inline bool read_v7(buffer& a_buffer,pd_data_t& a_data) {
0547   if(!a_buffer.read(a_data.m_title)) return false;
0548 
0549  {int dim;
0550   if(!a_buffer.read(dim)) return false;
0551   a_data.m_dimension = dim;}
0552 
0553  {int nbin;
0554   if(!a_buffer.read(nbin)) return false;
0555   a_data.m_bin_number = nbin;}
0556 
0557   std::vector<int> vec;
0558   if(!a_buffer.read_array<int>(vec)) return false;
0559   convert<int,unsigned int>(vec,a_data.m_bin_entries);
0560 
0561   if(a_data.m_bin_entries.size()!=a_data.m_bin_number) return false;
0562   if(!a_buffer.read_array<double>(a_data.m_bin_Sw)) return false;
0563   if(a_data.m_bin_Sw.size()!=a_data.m_bin_number) return false;
0564   if(!a_buffer.read_array<double>(a_data.m_bin_Sw2)) return false;
0565   if(a_data.m_bin_Sw2.size()!=a_data.m_bin_number) return false;
0566   if(!a_buffer.read_array2<double>(a_data.m_bin_Sxw)) return false;
0567   if(a_data.m_bin_Sxw.size()!=a_data.m_bin_number) return false;
0568   if(!a_buffer.read_array2<double>(a_data.m_bin_Sx2w)) return false;
0569   if(a_data.m_bin_Sx2w.size()!=a_data.m_bin_number) return false;
0570   if(a_data.m_dimension>0) {
0571     a_data.m_axes.resize(a_data.m_dimension);
0572     for(unsigned int iaxis=0;iaxis<a_data.m_dimension;iaxis++) {
0573       if(!Axis_read_v7(a_buffer,a_data.m_axes[iaxis])) return false;
0574     }
0575   }
0576  {int dummy;
0577   if(!a_buffer.read(dummy)) return false;} //m_mode
0578   // Profile :
0579   if(!a_buffer.read(a_data.m_is_profile)) return false;
0580   if(a_data.m_is_profile) {
0581     if(!a_buffer.read_array<double>(a_data.m_bin_Svw)) return false;
0582     if(a_data.m_bin_Svw.size()!=a_data.m_bin_number) return false;
0583     if(!a_buffer.read_array<double>(a_data.m_bin_Sv2w)) return false;
0584     if(a_data.m_bin_Sv2w.size()!=a_data.m_bin_number) return false;
0585     if(!a_buffer.read(a_data.m_cut_v)) return false;
0586     if(!a_buffer.read(a_data.m_min_v)) return false;
0587     if(!a_buffer.read(a_data.m_max_v)) return false;
0588   }
0589 
0590   return true;
0591 }
0592 
0593 inline bool read_annotations(buffer& a_buffer,annotations_t& a_annotations) {
0594   a_annotations.clear(); //reset() does not remove sticky items.
0595   int number;
0596   if(!a_buffer.read(number)) return false;
0597   for(int index=0;index<number;index++) {
0598     std::string key;
0599     if(!a_buffer.read(key)) return false;
0600     std::string value;
0601     if(!a_buffer.read(value)) return false;
0602     bool sticky;
0603     if(!a_buffer.read(sticky)) return false;
0604     a_annotations[key] = value;
0605   }
0606   return true;
0607 }
0608 
0609 inline bool read_THistogram(buffer& a_buffer,pd_data_t& a_data,annotations_t& a_annotations) {
0610 
0611   short v;
0612   if(!a_buffer.read_version(v)) return false;
0613 
0614  {std::string name,title;
0615   if(!Named_stream(a_buffer,name,title)) return false;}
0616 
0617   if(v==0) {
0618     if(!read_v0(a_buffer,a_data)) return false;
0619   } else if(v==1) {
0620     if(!read_v1(a_buffer,a_data)) return false;
0621   } else if(v==2) {
0622     if(!read_v2(a_buffer,a_data)) return false;
0623   } else if(v==3) {
0624     if(!read_v3(a_buffer,a_data)) return false;
0625   } else if(v==4) {
0626     if(!read_v4(a_buffer,a_data)) return false;
0627   } else if(v==5) {
0628     if(!read_v5(a_buffer,a_data)) return false;
0629   } else if(v==6) {
0630     if(!read_v6(a_buffer,a_data)) return false;
0631   } else if(v==7) {
0632     if(!read_v7(a_buffer,a_data)) return false;
0633   } else if(v==8) {
0634     if(!read_annotations(a_buffer,a_annotations)) return false;
0635     if(!read_v7(a_buffer,a_data)) return false;
0636   } else {
0637     return false;
0638   }
0639 
0640   a_data.update_fast_getters();
0641 
0642   return true;
0643 }
0644 
0645 inline const std::string& THistogram_cls(){
0646   static const std::string s_v("THistogram");
0647   return s_v;
0648 }
0649 
0650 }}
0651 
0652 #include "key"
0653 
0654 namespace tools {
0655 namespace rroot {
0656 
0657 inline bool read_key_THistogram(ifile& a_file,key& a_key,pd_data_t& a_data,annotations_t& a_annotations,bool a_warn = true) {
0658   std::ostream& out = a_key.out();
0659   if(a_key.object_class()!=THistogram_cls()) {
0660     if(a_warn) out << "tools::rroot::read_key_THisogram : key not a THistogram." << std::endl;
0661     return 0;
0662   }
0663   unsigned int sz;
0664   char* buf = a_key.get_object_buffer(a_file,sz); //we don't have ownership of buf.
0665   if(!buf) {
0666     out << "tools::rroot::read_key_THisogram : can't get data buffer of " << a_key.object_name() << "." << std::endl;
0667     return 0;
0668   }
0669   buffer b(out,a_file.byte_swap(),sz,buf,a_key.key_length(),false);
0670   return read_THistogram(b,a_data,a_annotations);
0671 }
0672 
0673 }}
0674 
0675 #include "../histo/h1d"
0676 #include "../histo/h2d"
0677 #include "../histo/p1d"
0678 #include "../histo/p2d"
0679 
0680 namespace tools {
0681 namespace rroot {
0682 
0683 inline histo::h1d* THistogram_to_h1d(const pd_data_t& a_data) {
0684   unsigned int dim = a_data.m_dimension;
0685   bool is_profile = a_data.m_is_profile;
0686   if(dim!=1) return 0;
0687   if(is_profile) return 0;
0688   histo::h1d* histo = new histo::h1d("",10,0,1);
0689   histo->copy_from_data(a_data);
0690   return histo;
0691 }
0692 
0693 inline histo::h2d* THistogram_to_h2d(const pd_data_t& a_data) {
0694   unsigned int dim = a_data.m_dimension;
0695   bool is_profile = a_data.m_is_profile;
0696   if(dim!=2) return 0;
0697   if(is_profile) return 0;
0698   histo::h2d* histo = new histo::h2d("",10,0,1,10,0,1);
0699   histo->copy_from_data(a_data);
0700   return histo;
0701 }
0702 
0703 inline histo::p1d* THistogram_to_p1d(const pd_data_t& a_data) {
0704   unsigned int dim = a_data.m_dimension;
0705   bool is_profile = a_data.m_is_profile;
0706   if(dim!=1) return 0;
0707   if(!is_profile) return 0;
0708   histo::p1d* histo = new histo::p1d("",10,0,1);
0709   histo->copy_from_data(a_data);
0710   return histo;
0711 }
0712 
0713 inline histo::p2d* THistogram_to_p2d(const pd_data_t& a_data) {
0714   unsigned int dim = a_data.m_dimension;
0715   bool is_profile = a_data.m_is_profile;
0716   if(dim!=2) return 0;
0717   if(!is_profile) return 0;
0718   histo::p2d* histo = new histo::p2d("",10,0,1,10,0,1);
0719   histo->copy_from_data(a_data);
0720   return histo;
0721 }
0722 
0723 }}
0724 
0725 #endif