Warning, /include/Geant4/tools/rroot/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_rroot_streamers
0005 #define tools_rroot_streamers
0006
0007 #include "dummy_fac"
0008
0009 #include "named"
0010 #include "date"
0011 #include "directory"
0012 #include "clss"
0013 #include "dummy"
0014 #include "obj_list"
0015
0016 #include "../sout"
0017 #include "../vmanip"
0018
0019 #include "../histo/profile_data"
0020
0021 #include "../histo/h1d"
0022 #include "../histo/h2d"
0023 #include "../histo/h3d"
0024 #include "../histo/p1d"
0025 #include "../histo/p2d"
0026
0027 #include <list>
0028 #include <cmath> //::log10, ::fabs.
0029 #include <utility>
0030
0031 namespace tools {
0032 namespace rroot {
0033
0034 typedef histo::histo_data<double,unsigned int,unsigned int,double> hd_data;
0035 typedef histo::profile_data<double,unsigned int,unsigned int,double,double> pd_data;
0036
0037 inline bool AttAxis_stream(buffer& a_buffer){
0038 int fNdivisions = 510; //Number of divisions(10000*n3 + 100*n2 + n1)
0039 short fAxisColor = 1; //color of the line axis
0040 short fLabelColor = 1; //color of labels
0041 short fLabelFont = 62; //font for labels
0042 float fLabelOffset = 0.005F; //offset of labels
0043 float fLabelSize = 0.04F; //size of labels
0044 float fTickLength = 0.03F; //length of tick marks
0045 float fTitleOffset = 1; //offset of axis title
0046 float fTitleSize = 0.04F; //size of axis title
0047 short fTitleColor = 1; //color of axis title
0048 short fTitleFont = 62; //font for axis title
0049
0050 // Version 4 streaming (ROOT/v3-00-6).
0051 short v;
0052 unsigned int _s,_c;
0053 if(!a_buffer.read_version(v,_s,_c)) return false;
0054
0055 if(!a_buffer.read(fNdivisions)) return false;
0056 if(!a_buffer.read(fAxisColor)) return false;
0057 if(!a_buffer.read(fLabelColor)) return false;
0058 if(!a_buffer.read(fLabelFont)) return false;
0059 if(!a_buffer.read(fLabelOffset)) return false;
0060 if(!a_buffer.read(fLabelSize)) return false;
0061 if(!a_buffer.read(fTickLength)) return false;
0062 if(!a_buffer.read(fTitleOffset)) return false;
0063 if(!a_buffer.read(fTitleSize)) return false;
0064 if(!a_buffer.read(fTitleColor)) return false;
0065 if(!a_buffer.read(fTitleFont)) return false;
0066
0067 if(!a_buffer.check_byte_count(_s,_c,"TAttAxis")) return false;
0068 return true;
0069 }
0070
0071 inline bool Axis_stream(buffer& a_buffer,histo::axis<double,unsigned int>& a_fAxis){
0072 // Version 6 streaming (ROOT/v3-00-6).
0073 short v;
0074 unsigned int _s,_c;
0075 if(!a_buffer.read_version(v,_s,_c)) return false;
0076
0077 std::string name;
0078 std::string title;
0079 if(!Named_stream(a_buffer,name,title)) return false;
0080
0081 if(!AttAxis_stream(a_buffer)) return false;
0082
0083 int number;
0084 if(!a_buffer.read(number)) return false;
0085 double min;
0086 if(!a_buffer.read(min)) return false;
0087 double max;
0088 if(!a_buffer.read(max)) return false;
0089
0090 std::vector<double> edges;
0091 if(!Array_stream<double>(a_buffer,edges)) return false; //fXbins TArrayD
0092
0093 size_t edgen = edges.size();
0094 if(!edgen) {
0095 a_fAxis.configure(number,min,max);
0096 } else {
0097 std::vector<double> vedges;
0098 for(size_t index=0;index<edgen;index++) {
0099 vedges.push_back(edges[index]);
0100 }
0101 a_fAxis.configure(vedges);
0102 }
0103
0104 int First;
0105 if(!a_buffer.read(First)) return false;
0106 int Last;
0107 if(!a_buffer.read(Last)) return false;
0108
0109 if(v>=8) { //fBits2.
0110 unsigned short dummy;
0111 if(!a_buffer.read(dummy)) return false;
0112 }
0113
0114 //Bool_t
0115 unsigned char TimeDisplay;
0116 if(!a_buffer.read(TimeDisplay)) return false;
0117
0118 //TString
0119 std::string TimeFormat;
0120 if(!a_buffer.read(TimeFormat)) return false;
0121
0122 if(v>=7) {
0123 //THashList*
0124 dummy_fac fac(a_buffer.out());
0125 if(!dummy_TXxx_pointer_stream(a_buffer,fac)) return false;
0126 }
0127
0128 if(!a_buffer.check_byte_count(_s,_c,"TAxis")) return false;
0129 return true;
0130 }
0131
0132 inline bool null_epsil(double a_1,double a_2,double a_prec = -5) {
0133 return (::log10(::fabs(a_1-a_2))<a_prec?true:false);
0134 }
0135
0136 inline bool TH_read_1D(buffer& a_buffer,hd_data& a_data,
0137 double& a_entries,double& a_Sw,double& a_Sw2,double& a_Sxw,double& a_Sx2w){
0138 a_entries = 0;
0139 a_Sw = 0;
0140 a_Sw2 = 0;
0141 a_Sxw = 0;
0142 a_Sx2w = 0;
0143
0144 unsigned int _s,_c;
0145 short vers;
0146 if(!a_buffer.read_version(vers,_s,_c)) return false;
0147
0148 // Version 3 streaming (ROOT/v3-00-6).
0149
0150 std::string name;
0151 std::string title;
0152 if(!Named_stream(a_buffer,name,title)) return false;
0153
0154 a_data.m_title = std::move(title);
0155
0156 {short color,style,width;
0157 if(!AttLine_stream(a_buffer,color,style,width)) return false;}
0158 {short color,style;
0159 if(!AttFill_stream(a_buffer,color,style)) return false;}
0160 if(!AttMarker_stream(a_buffer)) return false;
0161
0162 int Ncells;
0163 if(!a_buffer.read(Ncells)) return false;
0164
0165 //fXAxis
0166 if(!Axis_stream(a_buffer,a_data.m_axes[0])) return false;
0167 a_data.m_axes[0].m_offset = 1;
0168
0169 if(a_data.m_dimension==3) {
0170 if(!Axis_stream(a_buffer,a_data.m_axes[1])) return false; //fYAxis
0171 a_data.m_axes[1].m_offset = a_data.m_axes[0].m_offset * (a_data.m_axes[0].bins()+2);
0172
0173 if(!Axis_stream(a_buffer,a_data.m_axes[2])) return false; //fZAxis
0174 a_data.m_axes[2].m_offset = a_data.m_axes[1].m_offset * (a_data.m_axes[1].bins()+2);
0175
0176 } else if(a_data.m_dimension==2) {
0177 if(!Axis_stream(a_buffer,a_data.m_axes[1])) return false; //fYAxis
0178 a_data.m_axes[1].m_offset = a_data.m_axes[0].m_offset * (a_data.m_axes[0].bins()+2);
0179
0180 histo::axis<double,unsigned int> dummy;
0181 if(!Axis_stream(a_buffer,dummy)) return false; //fZAxis
0182 } else {
0183 histo::axis<double,unsigned int> dummy;
0184 if(!Axis_stream(a_buffer,dummy)) return false; //fYAxis
0185 if(!Axis_stream(a_buffer,dummy)) return false; //fZAxis
0186 }
0187
0188 short barOffset;
0189 if(!a_buffer.read(barOffset)) return false;
0190
0191 short barWidth;
0192 if(!a_buffer.read(barWidth)) return false;
0193
0194 if(!a_buffer.read(a_entries)) return false;
0195
0196 if(!a_buffer.read(a_Sw)) return false; //fTsumw
0197
0198 if(!a_buffer.read(a_Sw2)) return false;
0199
0200 if(!a_buffer.read(a_Sxw)) return false;
0201
0202 if(!a_buffer.read(a_Sx2w)) return false;
0203
0204 double max;
0205 if(!a_buffer.read(max)) return false;
0206
0207 double min;
0208 if(!a_buffer.read(min)) return false;
0209
0210 double NormFactor;
0211 if(!a_buffer.read(NormFactor)) return false;
0212
0213 {std::vector<double> v;
0214 if(!Array_stream<double>(a_buffer,v)) return false;} //fContour TArrayD
0215
0216 std::vector<double> sumw2; //fSumw2 TArrayD
0217 if(!Array_stream<double>(a_buffer,sumw2)) return false;
0218
0219 {std::string opt;
0220 if(!a_buffer.read(opt)) return false; //TString fOption
0221 }
0222
0223 {dummy_fac fac(a_buffer.out());
0224 obj_list dummy(fac);
0225 if(!dummy.stream(a_buffer)) {
0226 a_buffer.out() << "tools::rroot::TH_read_1D :"
0227 << " obj_list stream failed."
0228 << std::endl;
0229 return false;
0230 }} //Functions
0231
0232 if(vers>=4) {
0233 int BufferSize;
0234 if(!a_buffer.read(BufferSize)) return false;
0235
0236 //Double_t* Buffer; //[fBufferSize]
0237 if(!dummy_array_stream<double>(a_buffer,BufferSize)) return false;
0238 }
0239
0240 if(vers>=7) {
0241 //EBinErrorOpt fBinStatErrOpt;
0242 int dummy;
0243 if(!a_buffer.read(dummy)) return false;
0244 }
0245
0246 // Add two for outflows.
0247 if(a_data.m_dimension==1) {
0248 a_data.m_bin_number = a_data.m_axes[0].m_number_of_bins + 2;
0249 } else if(a_data.m_dimension==2) {
0250 a_data.m_bin_number =
0251 (a_data.m_axes[0].m_number_of_bins + 2) *
0252 (a_data.m_axes[1].m_number_of_bins + 2);
0253 } else if(a_data.m_dimension==3) {
0254 a_data.m_bin_number =
0255 (a_data.m_axes[0].m_number_of_bins + 2) *
0256 (a_data.m_axes[1].m_number_of_bins + 2) *
0257 (a_data.m_axes[2].m_number_of_bins + 2);
0258 }
0259
0260 unsigned int binn = a_data.m_bin_number;
0261 a_data.m_bin_Sw2.resize(binn);
0262 if(binn==sumw2.size()) {
0263 for(unsigned int index=0;index<binn;index++){
0264 a_data.m_bin_Sw2[index] = sumw2[index];
0265 }
0266 } else {
0267 a_data.m_bin_Sw2.assign(binn,0);
0268 }
0269
0270 if(!a_buffer.check_byte_count(_s,_c,"TH")) return false;
0271
0272 return true;
0273 }
0274
0275
0276 inline bool TH_read_2D(buffer& a_buffer,hd_data& a_data,
0277 double& a_entries,double& a_Sw,double& a_Sw2,
0278 double& a_Sxw,double& a_Sx2w,double& a_Syw,double& a_Sy2w){
0279 unsigned int _s,_c;
0280 short v;
0281 if(!a_buffer.read_version(v,_s,_c)) return false;
0282
0283 // Version 3 streaming (ROOT/v3-00-6).
0284
0285 if(!TH_read_1D(a_buffer,a_data,a_entries,a_Sw,a_Sw2,a_Sxw,a_Sx2w)) return false;
0286 // the upper set :
0287 //data.m_title
0288 //data.m_bin_number
0289 //data.m_axes
0290 //data.m_bin_Sw2
0291
0292 double ScaleFactor;
0293 if(!a_buffer.read(ScaleFactor)) return false;
0294 if(!a_buffer.read(a_Syw)) return false;
0295 if(!a_buffer.read(a_Sy2w)) return false;
0296
0297 double Tsumwxy;
0298 if(!a_buffer.read(Tsumwxy)) return false;
0299 a_data.m_in_range_plane_Sxyw[0] = Tsumwxy;
0300
0301 if(!a_buffer.check_byte_count(_s,_c,"TH2")) return false;
0302
0303 return true;
0304 }
0305
0306 inline bool TH_read_3D(buffer& a_buffer,hd_data& a_data,
0307 double& a_entries,double& a_Sw,double& a_Sw2,
0308 double& a_Sxw,double& a_Sx2w,
0309 double& a_Syw,double& a_Sy2w,
0310 double& a_Szw,double& a_Sz2w){
0311 unsigned int _s,_c;
0312 short v;
0313 if(!a_buffer.read_version(v,_s,_c)) return false;
0314
0315 if(!TH_read_1D(a_buffer,a_data,a_entries,a_Sw,a_Sw2,a_Sxw,a_Sx2w)) return false;
0316 if(!Att3D_stream(a_buffer)) return false;
0317
0318 // the upper set :
0319 //data.m_title
0320 //data.m_bin_number
0321 //data.m_axes
0322 //data.m_bin_Sw2
0323
0324 if(!a_buffer.read(a_Syw)) return false;
0325 if(!a_buffer.read(a_Sy2w)) return false;
0326 double Tsumwxy;
0327 if(!a_buffer.read(Tsumwxy)) return false;
0328
0329 if(!a_buffer.read(a_Szw)) return false;
0330 if(!a_buffer.read(a_Sz2w)) return false;
0331 double Tsumwxz;
0332 if(!a_buffer.read(Tsumwxz)) return false;
0333 double Tsumwyz;
0334 if(!a_buffer.read(Tsumwyz)) return false;
0335
0336 a_data.m_in_range_plane_Sxyw[0] = Tsumwxy;
0337 a_data.m_in_range_plane_Sxyw[1] = Tsumwyz;
0338 a_data.m_in_range_plane_Sxyw[2] = Tsumwxz;
0339
0340 if(!a_buffer.check_byte_count(_s,_c,"TH3")) return false;
0341
0342 return true;
0343 }
0344
0345 inline histo::h1d* TH1F_stream(buffer& a_buffer){
0346 unsigned int _s,_c;
0347 short v;
0348 if(!a_buffer.read_version(v,_s,_c)) return 0;
0349
0350 // Version 1 streaming (ROOT/v3-00-6).
0351
0352 // Now we have to reconstruct a valid Histogram from a_buffer :
0353 hd_data data;
0354
0355 data.m_dimension = 1;
0356 data.m_axes.resize(1);
0357
0358 double fEntries; //in range + outflow.
0359 double fSw; //in range.
0360 double fSw2; //in range.
0361 double fSxw; //in range.
0362 double fSx2w; //in range.
0363 if(!TH_read_1D(a_buffer,data,fEntries,fSw,fSw2,fSxw,fSx2w)) return 0;
0364 // the upper set :
0365 //data.m_title
0366 //data.m_bin_number
0367 //data.m_axes
0368 //data.m_bin_Sw2
0369
0370 std::vector<float> bins; //fArray TArrayF
0371 if(!Array_stream<float>(a_buffer,bins)) return 0;
0372 if(!a_buffer.check_byte_count(_s,_c,"TH1F")) return 0;
0373
0374 unsigned int binn = data.m_bin_number;
0375 data.m_bin_Sw.resize(binn,0);
0376 {for(unsigned int index=0;index<binn;index++){
0377 data.m_bin_Sw[index] = double(bins[index]);
0378 }}
0379
0380 data.m_bin_entries.resize(binn,0);
0381 {std::vector<double> empty;
0382 empty.resize(1,0);
0383 data.m_bin_Sxw.resize(binn,empty);
0384 data.m_bin_Sx2w.resize(binn,empty);}
0385 data.m_all_entries = static_cast<unsigned int>(fEntries);
0386 data.m_in_range_entries = 0;
0387 data.m_in_range_Sw = fSw;
0388 data.m_in_range_Sw2 = fSw2;
0389 data.m_in_range_Sxw.resize(1,0);
0390 data.m_in_range_Sx2w.resize(1,0);
0391 data.m_in_range_Sxw[0] = fSxw;
0392 data.m_in_range_Sx2w[0] = fSx2w;
0393
0394 histo::h1d* h = new histo::h1d("",10,0,1);
0395 h->copy_from_data(data);
0396 return h; //give ownership to caller.
0397 }
0398
0399 inline histo::h1d* TH1D_stream(buffer& a_buffer){
0400 unsigned int _s,_c;
0401 short v;
0402 if(!a_buffer.read_version(v,_s,_c)) return 0;
0403
0404 // Version 1 streaming (ROOT/v3-00-6).
0405
0406 // Now we have to reconstruct a valid Histogram from a_buffer :
0407 hd_data data;
0408
0409 data.m_dimension = 1;
0410 data.m_axes.resize(1);
0411
0412 double fEntries; //in range + outflow.
0413 double fSw; //in range.
0414 double fSw2; //in range.
0415 double fSxw; //in range.
0416 double fSx2w; //in range.
0417 if(!TH_read_1D(a_buffer,data,fEntries,fSw,fSw2,fSxw,fSx2w)) return 0;
0418 // the upper set :
0419 //data.m_title
0420 //data.m_bin_number
0421 //data.m_axes
0422 //data.m_bin_Sw2
0423
0424 std::vector<double> bins; //fArray TArrayD
0425 if(!Array_stream<double>(a_buffer,bins)) return 0;
0426 if(!a_buffer.check_byte_count(_s,_c,"TH1D")) return 0;
0427
0428 unsigned int binn = data.m_bin_number;
0429 data.m_bin_Sw = std::move(bins);
0430
0431 data.m_bin_entries.resize(binn,0);
0432 {std::vector<double> empty;
0433 empty.resize(1,0);
0434 data.m_bin_Sxw.resize(binn,empty);
0435 data.m_bin_Sx2w.resize(binn,empty);}
0436
0437 data.m_all_entries = static_cast<unsigned int>(fEntries);
0438 data.m_in_range_entries = 0;
0439 data.m_in_range_Sw = fSw;
0440 data.m_in_range_Sw2 = fSw2;
0441 data.m_in_range_Sxw.resize(1,0);
0442 data.m_in_range_Sx2w.resize(1,0);
0443 data.m_in_range_Sxw[0] = fSxw;
0444 data.m_in_range_Sx2w[0] = fSx2w;
0445
0446 histo::h1d* h = new histo::h1d("",10,0,1);
0447 h->copy_from_data(data);
0448 return h;
0449 }
0450
0451 inline histo::h2d* TH2F_stream(buffer& a_buffer){
0452 unsigned int _s,_c;
0453 short v;
0454 if(!a_buffer.read_version(v,_s,_c)) return 0;
0455
0456 // Version 3 streaming (ROOT/v3-00-6).
0457
0458 // Now we have to reconstruct a valid Histogram from a_buffer :
0459 hd_data data;
0460
0461 data.m_dimension = 2;
0462 //data.m_coords.resize(data.m_dimension,0);
0463 //data.m_ints.resize(data.m_dimension,0);
0464 data.m_axes.resize(2);
0465 data.m_in_range_plane_Sxyw.resize(1,0);
0466
0467 double fEntries; //in range + outflow.
0468 double fSw; //in range.
0469 double fSw2; //in range.
0470 double fSxw; //in range.
0471 double fSx2w; //in range.
0472 double fSyw; //in range.
0473 double fSy2w; //in range.
0474 if(!TH_read_2D(a_buffer,data,fEntries,fSw,fSw2,fSxw,fSx2w,fSyw,fSy2w)) return 0;
0475 // the upper set :
0476 //data.m_title
0477 //data.m_bin_number
0478 //data.m_axes
0479 //data.m_bin_Sw2
0480
0481 std::vector<float> bins; //fArray TArrayF
0482 if(!Array_stream<float>(a_buffer,bins)) return 0;
0483 if(!a_buffer.check_byte_count(_s,_c,"TH2F")) return 0;
0484
0485 unsigned int binn = data.m_bin_number;
0486 data.m_bin_Sw.resize(binn,0);
0487 {for(unsigned int index=0;index<binn;index++){
0488 data.m_bin_Sw[index] = double(bins[index]);
0489 }}
0490
0491 data.m_bin_entries.resize(binn,0);
0492 {std::vector<double> empty;
0493 empty.resize(2,0);
0494 data.m_bin_Sxw.resize(binn,empty);
0495 data.m_bin_Sx2w.resize(binn,empty);}
0496
0497 data.m_all_entries = static_cast<unsigned int>(fEntries);
0498 data.m_in_range_entries = 0;
0499 data.m_in_range_Sw = fSw;
0500 data.m_in_range_Sw2 = fSw2;
0501 data.m_in_range_Sxw.resize(2,0);
0502 data.m_in_range_Sx2w.resize(2,0);
0503 data.m_in_range_Sxw[0] = fSxw;
0504 data.m_in_range_Sx2w[0] = fSx2w;
0505 data.m_in_range_Sxw[1] = fSyw;
0506 data.m_in_range_Sx2w[1] = fSy2w;
0507
0508 histo::h2d* h = new histo::h2d("",10,0,1,10,0,1);
0509 h->copy_from_data(data);
0510 return h;
0511 }
0512
0513 inline histo::h2d* TH2D_stream(buffer& a_buffer){
0514 unsigned int _s,_c;
0515 short v;
0516 if(!a_buffer.read_version(v,_s,_c)) return 0;
0517
0518 // Version 3 streaming (ROOT/v3-00-6).
0519
0520 // Now we have to reconstruct a valid Histogram from a_buffer :
0521 hd_data data;
0522
0523 data.m_dimension = 2;
0524 data.m_axes.resize(2);
0525 data.m_in_range_plane_Sxyw.resize(1,0);
0526
0527 double fEntries; //in range + outflow.
0528 double fSw; //in range.
0529 double fSw2; //in range.
0530 double fSxw; //in range.
0531 double fSx2w; //in range.
0532 double fSyw; //in range.
0533 double fSy2w; //in range.
0534 if(!TH_read_2D(a_buffer,data,fEntries,fSw,fSw2,fSxw,fSx2w,fSyw,fSy2w)) return 0;
0535 // the upper set :
0536 //data.m_title
0537 //data.m_bin_number
0538 //data.m_axes
0539 //data.m_bin_Sw2
0540
0541 std::vector<double> bins; //fArray TArrayD
0542 if(!Array_stream<double>(a_buffer,bins)) return 0;
0543 if(!a_buffer.check_byte_count(_s,_c,"TH2D")) return 0;
0544
0545 unsigned int binn = data.m_bin_number;
0546 data.m_bin_Sw = std::move(bins);
0547
0548 data.m_bin_entries.resize(binn,0);
0549 {std::vector<double> empty;
0550 empty.resize(2,0);
0551 data.m_bin_Sxw.resize(binn,empty);
0552 data.m_bin_Sx2w.resize(binn,empty);}
0553
0554 data.m_all_entries = static_cast<unsigned int>(fEntries);
0555 data.m_in_range_entries = 0;
0556 data.m_in_range_Sw = fSw;
0557 data.m_in_range_Sw2 = fSw2;
0558 data.m_in_range_Sxw.resize(2,0);
0559 data.m_in_range_Sx2w.resize(2,0);
0560 data.m_in_range_Sxw[0] = fSxw;
0561 data.m_in_range_Sx2w[0] = fSx2w;
0562 data.m_in_range_Sxw[1] = fSyw;
0563 data.m_in_range_Sx2w[1] = fSy2w;
0564
0565 histo::h2d* h = new histo::h2d("",10,0,1,10,0,1);
0566 h->copy_from_data(data);
0567 return h;
0568 }
0569
0570 inline histo::h3d* TH3D_stream(buffer& a_buffer){
0571 unsigned int _s,_c;
0572 short v;
0573 if(!a_buffer.read_version(v,_s,_c)) return 0;
0574
0575 // Now we have to reconstruct a valid Histogram from a_buffer :
0576 hd_data data;
0577
0578 data.m_dimension = 3;
0579 data.m_axes.resize(3);
0580 data.m_in_range_plane_Sxyw.resize(3,0);
0581
0582 double fEntries; //in range + outflow.
0583 double fSw; //in range.
0584 double fSw2; //in range.
0585 double fSxw; //in range.
0586 double fSx2w; //in range.
0587 double fSyw; //in range.
0588 double fSy2w; //in range.
0589 double fSzw; //in range.
0590 double fSz2w; //in range.
0591 if(!TH_read_3D(a_buffer,data,fEntries,fSw,fSw2,fSxw,fSx2w,fSyw,fSy2w,fSzw,fSz2w)) return 0;
0592 // the upper set :
0593 //data.m_title
0594 //data.m_bin_number
0595 //data.m_axes
0596 //data.m_bin_Sw2
0597
0598 std::vector<double> bins; //fArray TArrayD
0599 if(!Array_stream<double>(a_buffer,bins)) return 0;
0600 if(!a_buffer.check_byte_count(_s,_c,"TH3D")) return 0;
0601
0602 unsigned int binn = data.m_bin_number;
0603 data.m_bin_Sw = std::move(bins);
0604
0605 data.m_bin_entries.resize(binn,0);
0606 {std::vector<double> empty;
0607 empty.resize(3,0);
0608 data.m_bin_Sxw.resize(binn,empty);
0609 data.m_bin_Sx2w.resize(binn,empty);}
0610
0611 data.m_all_entries = static_cast<unsigned int>(fEntries);
0612 data.m_in_range_entries = 0;
0613 data.m_in_range_Sw = fSw;
0614 data.m_in_range_Sw2 = fSw2;
0615 data.m_in_range_Sxw.resize(3,0);
0616 data.m_in_range_Sx2w.resize(3,0);
0617 data.m_in_range_Sxw[0] = fSxw;
0618 data.m_in_range_Sx2w[0] = fSx2w;
0619 data.m_in_range_Sxw[1] = fSyw;
0620 data.m_in_range_Sx2w[1] = fSy2w;
0621 data.m_in_range_Sxw[2] = fSzw;
0622 data.m_in_range_Sx2w[2] = fSz2w;
0623
0624 histo::h3d* h = new histo::h3d("",10,0,1,10,0,1,10,0,1);
0625 h->copy_from_data(data);
0626 return h;
0627 }
0628
0629 inline histo::p1d* TProfile_stream(buffer& a_buffer){
0630 unsigned int _s,_c;
0631 short v;
0632 if(!a_buffer.read_version(v,_s,_c)) return 0;
0633
0634 // Version 3 streaming (ROOT/v3-00-6).
0635
0636 //WARNING : the mapping histo::p1d / TProfile is not obvious.
0637 //p1d::m_bin_Svw <---> TProfile::fArray
0638 //p1d::m_bin_Sv2w <---> TProfile::fSumw2
0639 //p1d::m_bin_Sw <---> TProfile::fBinEntries
0640
0641 histo::h1d* h = TH1D_stream(a_buffer);
0642 if(!h) return 0;
0643
0644 //NOTE : histo.m_bin_Sw <---> TH1D::TArrayD::fArray
0645
0646 pd_data data(h->dac());
0647 delete h;
0648
0649 std::vector<double> bins; //fBinEntries TArrayD
0650 if(!Array_stream<double>(a_buffer,bins)) return 0;
0651 int errorMode;
0652 if(!a_buffer.read(errorMode)) return 0;
0653 double ymin;
0654 if(!a_buffer.read(ymin)) return 0;
0655 double ymax;
0656 if(!a_buffer.read(ymax)) return 0;
0657
0658 if(v>=4) {
0659 double sumwy;
0660 if(!a_buffer.read(sumwy)) return 0;
0661 double sumwy2;
0662 if(!a_buffer.read(sumwy2)) return 0;
0663 }
0664 if(v>=5) {
0665 std::vector<double> bins_sumw2; //fBinSumw2 TArrayD
0666 if(!Array_stream<double>(a_buffer,bins_sumw2)) return 0;
0667 }
0668
0669 if(!a_buffer.check_byte_count(_s,_c,"TProfile")) return 0;
0670
0671 data.m_is_profile = true;
0672 data.m_cut_v = true;
0673 data.m_min_v = ymin;
0674 data.m_max_v = ymax;
0675
0676 unsigned int binn = data.m_bin_number;
0677 data.m_bin_Svw.resize(binn);
0678 data.m_bin_Sv2w.resize(binn);
0679
0680 for(unsigned int index=0;index<binn;index++){
0681 double svw = data.m_bin_Sw[index];
0682 double sv2w = data.m_bin_Sw2[index];
0683 double sw = bins[index];
0684 //data.m_bin_entries[index] = (int)sw; //FIXME : ok for w = 1 only !
0685 data.m_bin_Sw[index] = (double)sw;
0686 //FIXME : data.m_bin_Sxw
0687 //FIXME : data.m_bin_Sx2w
0688 data.m_bin_Svw[index] = svw;
0689 data.m_bin_Sv2w[index] = sv2w;
0690 }
0691
0692 histo::p1d* p = new histo::p1d("",10,0,1);
0693 p->copy_from_data(data);
0694 // We have now a valid histo::p1d.
0695 return p;
0696 }
0697
0698 inline histo::p2d* TProfile2D_stream(buffer& a_buffer){
0699 unsigned int _s,_c;
0700 short v;
0701 if(!a_buffer.read_version(v,_s,_c)) return 0;
0702
0703 // Version 3 streaming (ROOT/v3-00-6).
0704
0705 //WARNING : the mapping histo::p1d / TProfile is not obvious.
0706 //p1d::m_bin_Svw <---> TProfile::fArray
0707 //p1d::m_bin_Sv2w <---> TProfile::fSumw2
0708 //p1d::m_bin_Sw <---> TProfile::fBinEntries
0709
0710 histo::h2d* h = TH2D_stream(a_buffer);
0711 if(!h) return 0;
0712
0713 //NOTE : histo.m_bin_Sw <---> TH2D::TArrayD::fArray
0714
0715 pd_data data(h->dac());
0716 delete h;
0717
0718 std::vector<double> bins; //fBinEntries TArrayD
0719 if(!Array_stream<double>(a_buffer,bins)) return 0;
0720 int errorMode;
0721 if(!a_buffer.read(errorMode)) return 0;
0722 double zmin;
0723 if(!a_buffer.read(zmin)) return 0;
0724 double zmax;
0725 if(!a_buffer.read(zmax)) return 0;
0726 if(v>=5) {
0727 double sumwz;
0728 if(!a_buffer.read(sumwz)) return 0;
0729 double sumwz2;
0730 if(!a_buffer.read(sumwz2)) return 0;
0731 }
0732 if(v>=7) {
0733 std::vector<double> bins_sumw2; //fBinSumw2 TArrayD
0734 if(!Array_stream<double>(a_buffer,bins_sumw2)) return 0;
0735 }
0736 if(!a_buffer.check_byte_count(_s,_c,"TProfile2D")) return 0;
0737
0738 data.m_is_profile = true;
0739 data.m_cut_v = true;
0740 data.m_min_v = zmin;
0741 data.m_max_v = zmax;
0742
0743 unsigned int binn = data.m_bin_number;
0744 data.m_bin_Svw.resize(binn);
0745 data.m_bin_Sv2w.resize(binn);
0746
0747 for(unsigned int index=0;index<binn;index++){
0748 double svw = data.m_bin_Sw[index];
0749 double sv2w = data.m_bin_Sw2[index];
0750 double sw = bins[index];
0751 //data.m_bin_entries[index] = (int)sw; //FIXME : ok for w = 1 only !
0752 data.m_bin_Sw[index] = (double)sw;
0753 //FIXME : data.m_bin_Sxw
0754 //FIXME : data.m_bin_Sx2w
0755 data.m_bin_Svw[index] = svw;
0756 data.m_bin_Sv2w[index] = sv2w;
0757 }
0758
0759 histo::p2d* p = new histo::p2d("",10,0,1,10,0,1);
0760 p->copy_from_data(data);
0761 return p;
0762 }
0763
0764 class TDirectory : public directory {
0765 public:
0766 TDirectory(ifile& a_file):directory(a_file){}
0767 virtual ~TDirectory(){}
0768 protected:
0769 TDirectory(const TDirectory& a_from):directory(a_from){}
0770 TDirectory& operator=(const TDirectory&){return *this;}
0771 public:
0772 bool stream(buffer& a_buffer){
0773 initialize();
0774 short version;
0775 if(!a_buffer.read_version(version)) return false;
0776 unsigned int _date;
0777 if(!a_buffer.read(_date)) return false;
0778 //m_date_C.setDate(_date);
0779 if(!a_buffer.read(_date)) return false;
0780 //m_date_M.setDate(_date);
0781 if(!a_buffer.read(m_nbytes_keys)) return false;
0782 if(!a_buffer.read(m_nbytes_name)) return false;
0783 if((uint32)version>big_file_version_tag()) {
0784 if(!a_buffer.read(m_seek_directory)) return false;
0785 if(!a_buffer.read(m_seek_parent)) return false;
0786 if(!a_buffer.read(m_seek_keys)) return false;
0787 } else {
0788 {seek32 i;
0789 if(!a_buffer.read(i)) return false;
0790 m_seek_directory = i;}
0791
0792 {seek32 i;
0793 if(!a_buffer.read(i)) return false;
0794 m_seek_parent = i;}
0795
0796 {seek32 i;
0797 if(!a_buffer.read(i)) return false;
0798 m_seek_keys = i;}
0799 }
0800
0801 if (m_seek_keys) {
0802 uint32 n;
0803 if(!read_keys(n)) {
0804 a_buffer.out() << "tools::rroot::TDirectory::stream :"
0805 << " cannot read keys."
0806 << std::endl;
0807 return false;
0808 }
0809 }
0810
0811 return true;
0812 }
0813 protected:
0814 void initialize(){
0815 // Initialise directory to defaults :
0816 // If directory is created via default ctor (when dir is read from file)
0817 // don't add it here to the directory since its name is not yet known.
0818 // It will be added to the directory in TKey::ReadObj().
0819 m_date_C = 0;//m_date_C.set();
0820 m_date_M = 0;//m_date_M.set();
0821 m_nbytes_keys = 0;
0822 m_seek_directory = 0;
0823 m_seek_parent = 0;
0824 m_seek_keys = 0;
0825 }
0826 };
0827
0828
0829 inline void dump(std::ostream& a_out,
0830 ifile& a_file,
0831 const std::vector<key*>& a_keys,
0832 bool a_recursive,
0833 unsigned int a_spaces = 0) {
0834
0835 // dump non directory objects :
0836 {std::vector<key*>::const_iterator it;
0837 for(it=a_keys.begin();it!=a_keys.end();++it) {
0838 key& k = *(*it);
0839 if(k.object_class()==TDirectory_cls()) continue;
0840 {for(unsigned int index=0;index<a_spaces;index++) a_out << " ";}
0841 k.dump(a_out);
0842 }}
0843
0844 // dump directories :
0845 {std::vector<key*>::const_iterator it;
0846 for(it=a_keys.begin();it!=a_keys.end();++it) {
0847 key& k = *(*it);
0848 if(k.object_class()!=TDirectory_cls()) continue;
0849
0850 std::string label = k.object_name();
0851 {for(unsigned int index=0;index<a_spaces;index++) a_out << " ";}
0852 a_out << "directory : " << label << std::endl;
0853
0854 if(!a_recursive) continue;
0855
0856 uint32 sz;
0857 char* buf = k.get_object_buffer(a_file,sz);
0858 //we don't have ownership of buf.
0859 if(!buf) {
0860 a_out << "tools::rroot::dump :"
0861 << " can't get directory data buffer."
0862 << std::endl;
0863 } else {
0864 buffer b(a_out,a_file.byte_swap(),sz,buf,k.key_length(),false);
0865 TDirectory tdir(a_file);
0866 if(!tdir.stream(b)) {
0867 a_out << "tools::rroot::dump :"
0868 << " can't stream TDirectory."
0869 << std::endl;
0870 } else {
0871 const std::vector<key*>& keys = tdir.keys();
0872 dump(a_out,a_file,keys,a_recursive,a_spaces+1);
0873 }
0874 }
0875 }}
0876 }
0877
0878 }}
0879
0880 #endif