Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/g4tools/include/tools/rroot/tree

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /externals/g4tools/include/tools/rroot/tree (Version 11.3.0) and /externals/g4tools/include/tools/rroot/tree (Version 11.0.p2)


  1 // Copyright (C) 2010, Guy Barrand. All rights      1 // Copyright (C) 2010, Guy Barrand. All rights reserved.
  2 // See the file tools.license for terms.            2 // See the file tools.license for terms.
  3                                                     3 
  4 #ifndef tools_rroot_tree                            4 #ifndef tools_rroot_tree
  5 #define tools_rroot_tree                            5 #define tools_rroot_tree
  6                                                     6 
  7 #include "ifac"                                     7 #include "ifac"
  8 #include "branch_element"                           8 #include "branch_element"
  9 #include "../sout"                                  9 #include "../sout"
 10 #include "iobject"                                 10 #include "iobject"
 11                                                    11 
 12 namespace tools {                                  12 namespace tools {
 13 namespace rroot {                                  13 namespace rroot {
 14                                                    14 
 15 inline const std::string& TTree_cls(){             15 inline const std::string& TTree_cls(){
 16   static const std::string s_v("TTree");           16   static const std::string s_v("TTree");
 17   return s_v;                                      17   return s_v;
 18 }                                                  18 }
 19                                                    19 
 20 class tree : public virtual iobject {              20 class tree : public virtual iobject {
 21 public:                                            21 public:
 22   static const std::string& s_class() {            22   static const std::string& s_class() {
 23     static const std::string s_v("tools::rroot     23     static const std::string s_v("tools::rroot::tree");
 24     return s_v;                                    24     return s_v;
 25   }                                                25   }
 26   virtual const std::string& s_cls() const {re     26   virtual const std::string& s_cls() const {return s_class();}
 27 public: //iobject                                  27 public: //iobject
 28   virtual const std::string& name() const {ret     28   virtual const std::string& name() const {return m_name;}
 29   virtual const std::string& title() const {re     29   virtual const std::string& title() const {return m_title;}
 30   virtual const std::string& store_class_name(     30   virtual const std::string& store_class_name() const {
 31     static const std::string s_v("TTree");         31     static const std::string s_v("TTree");
 32     return s_v;                                    32     return s_v;
 33   }                                                33   }
 34 public:                                            34 public:
 35   tree(ifile& a_file,ifac& a_fac)                  35   tree(ifile& a_file,ifac& a_fac)
 36   :m_file(a_file)                                  36   :m_file(a_file)
 37   ,m_fac(a_fac)                                    37   ,m_fac(a_fac)
 38   ,m_out(a_file.out())                             38   ,m_out(a_file.out())
 39   ,m_name("")                                      39   ,m_name("")
 40   ,m_title("")                                     40   ,m_title("")
 41   ,m_branches(a_fac)                               41   ,m_branches(a_fac)
 42   ,m_entries(0)                                    42   ,m_entries(0)
 43   {                                                43   {
 44 #ifdef TOOLS_MEM                                   44 #ifdef TOOLS_MEM
 45     mem::increment(s_class().c_str());             45     mem::increment(s_class().c_str());
 46 #endif                                             46 #endif
 47   }                                                47   }
 48   virtual ~tree(){                                 48   virtual ~tree(){
 49 #ifdef TOOLS_MEM                                   49 #ifdef TOOLS_MEM
 50     mem::decrement(s_class().c_str());             50     mem::decrement(s_class().c_str());
 51 #endif                                             51 #endif
 52   }                                                52   }
 53 protected:                                         53 protected:
 54   tree(const tree& a_from)                         54   tree(const tree& a_from)
 55   :iobject(a_from)                                 55   :iobject(a_from)
 56   ,m_file(a_from.m_file)                           56   ,m_file(a_from.m_file)
 57   ,m_fac(a_from.m_fac)                             57   ,m_fac(a_from.m_fac)
 58   ,m_out(a_from.m_out)                             58   ,m_out(a_from.m_out)
 59   ,m_branches(m_fac)                               59   ,m_branches(m_fac)
 60   {}                                               60   {}
 61   tree& operator=(const tree&){return *this;}      61   tree& operator=(const tree&){return *this;}
 62 public:                                            62 public:
 63   std::ostream& out() const {return m_out;}        63   std::ostream& out() const {return m_out;}
 64                                                    64 
 65   ifile& file() {return m_file;}                   65   ifile& file() {return m_file;}
 66   ifac& fac() {return m_fac;}                      66   ifac& fac() {return m_fac;}
 67                                                    67 
 68   const std::vector<branch*>& branches() const     68   const std::vector<branch*>& branches() const {return m_branches;}
 69                                                    69 
 70   bool find_entry(uint64 a_entry,uint32& a_nby     70   bool find_entry(uint64 a_entry,uint32& a_nbytes) {
 71     a_nbytes = 0;                                  71     a_nbytes = 0;
 72     if(a_entry>=m_entries) return false;           72     if(a_entry>=m_entries) return false;
 73     int nbytes = 0;                                73     int nbytes = 0;
 74     //fReadEntry = a_entry;                        74     //fReadEntry = a_entry;
 75     tools_vforit(branch*,m_branches,it) {          75     tools_vforit(branch*,m_branches,it) {
 76       uint32 n;                                    76       uint32 n;
 77       if(!(*it)->find_entry(m_file,a_entry,n))     77       if(!(*it)->find_entry(m_file,a_entry,n)) return false;
 78       nbytes += n;                                 78       nbytes += n;
 79     }                                              79     }
 80     a_nbytes = nbytes;                             80     a_nbytes = nbytes;
 81     return true;                                   81     return true;
 82   }                                                82   }
 83                                                    83 
 84   void dump(std::ostream& a_out,const std::str     84   void dump(std::ostream& a_out,const std::string& a_spaces = "",const std::string& a_indent = " "){
 85     a_out << a_spaces                              85     a_out << a_spaces
 86           << "tree :"                              86           << "tree :"
 87           << " name=" << sout(m_name)              87           << " name=" << sout(m_name)
 88           << " title=" << sout(m_title)            88           << " title=" << sout(m_title)
 89           << " entries=" << m_entries              89           << " entries=" << m_entries
 90           << std::endl;                            90           << std::endl;
 91     _dump_branches(a_out,m_branches,a_spaces+a     91     _dump_branches(a_out,m_branches,a_spaces+a_indent,a_indent);
 92   }                                                92   }
 93                                                    93 
 94   branch* find_branch(const std::string& a_nam     94   branch* find_branch(const std::string& a_name,bool a_recursive = false) const {
 95     return _find_branch(m_branches,a_name,a_re     95     return _find_branch(m_branches,a_name,a_recursive);
 96   }                                                96   }
 97                                                    97 
 98   branch_element* find_branch_element(const st     98   branch_element* find_branch_element(const std::string& a_name,bool a_recursive = false) const {
 99     branch* b = _find_branch(m_branches,a_name     99     branch* b = _find_branch(m_branches,a_name,a_recursive);
100     if(!b) return 0;                              100     if(!b) return 0;
101     return id_cast<branch,branch_element>(*b);    101     return id_cast<branch,branch_element>(*b);
102   }                                               102   }
103                                                   103 
104   base_leaf* find_leaf(const std::string& a_na    104   base_leaf* find_leaf(const std::string& a_name,bool a_recursive = false) const {
105     return _find_leaf(m_branches,a_name,a_recu    105     return _find_leaf(m_branches,a_name,a_recursive);
106   }                                               106   }
107                                                   107 
108   void find_leaves(std::vector<base_leaf*>& a_    108   void find_leaves(std::vector<base_leaf*>& a_leaves) const {
109     a_leaves.clear();                             109     a_leaves.clear();
110     _find_leaves(m_branches,a_leaves);            110     _find_leaves(m_branches,a_leaves);
111   }                                               111   }
112                                                   112 
113   void find_branches(std::vector<branch*>& a_b    113   void find_branches(std::vector<branch*>& a_branches) const {
114     a_branches.clear();                           114     a_branches.clear();
115     _find_branches(m_branches,a_branches);        115     _find_branches(m_branches,a_branches);
116   }                                               116   }
117                                                   117 
118   branch* find_leaf_branch(const base_leaf& a_    118   branch* find_leaf_branch(const base_leaf& a_leaf) const {return _find_leaf_branch(m_branches,a_leaf);}
119                                                   119 
120   bool show(std::ostream& a_out,uint64 a_entry    120   bool show(std::ostream& a_out,uint64 a_entry){
121     a_out << "======> EVENT:" << a_entry << st    121     a_out << "======> EVENT:" << a_entry << std::endl;
122     tools_vforit(branch*,m_branches,it) {         122     tools_vforit(branch*,m_branches,it) {
123       if(!(*it)->show(a_out,m_file,a_entry)) r    123       if(!(*it)->show(a_out,m_file,a_entry)) return false;
124     }                                             124     }
125     return true;                                  125     return true;
126   }                                               126   }
127                                                   127 
128   uint64 entries() const {return m_entries;}      128   uint64 entries() const {return m_entries;}
129                                                   129 
130   virtual bool stream(buffer& a_buffer) { //vi    130   virtual bool stream(buffer& a_buffer) { //virtual for iobject.
131     //uint64 m_tot_bytes;                         131     //uint64 m_tot_bytes;
132     //uint64 m_zip_bytes;                         132     //uint64 m_zip_bytes;
133     //uint64 m_saved_bytes;                       133     //uint64 m_saved_bytes;
134                                                   134 
135     short vers;                                   135     short vers;
136     unsigned int _s,_c;                        << 136     unsigned int s, c;
137     if(!a_buffer.read_version(vers,_s,_c)) ret << 137     if(!a_buffer.read_version(vers,s,c)) return false;
138                                                   138 
139     //::printf("debug : tree::stream : version    139     //::printf("debug : tree::stream : version %d count %d\n",vers,c);
140                                                   140 
141     //if (vers > 4) {                             141     //if (vers > 4) {
142       //TTree::Class()->ReadBuffer(b, this, ve    142       //TTree::Class()->ReadBuffer(b, this, vers, s, c);
143       //if (fEstimate <= 10000) fEstimate = 10    143       //if (fEstimate <= 10000) fEstimate = 1000000;
144       //m_saved_bytes = m_tot_bytes;              144       //m_saved_bytes = m_tot_bytes;
145       //fDirectory = gDirectory;                  145       //fDirectory = gDirectory;
146       //gDirectory->Append(this);                 146       //gDirectory->Append(this);
147       //return;                                   147       //return;
148     //}                                           148     //}
149                                                   149 
150     if(!Named_stream(a_buffer,m_name,m_title))    150     if(!Named_stream(a_buffer,m_name,m_title)) return false;
151                                                   151 
152    {short color,style,width;                      152    {short color,style,width;
153     if(!AttLine_stream(a_buffer,color,style,wi    153     if(!AttLine_stream(a_buffer,color,style,width)) return false;}
154    {short color,style;                            154    {short color,style;
155     if(!AttFill_stream(a_buffer,color,style))     155     if(!AttFill_stream(a_buffer,color,style)) return false;}
156     if(!AttMarker_stream(a_buffer)) return fal    156     if(!AttMarker_stream(a_buffer)) return false;
157                                                   157 
158     if(vers<=4) {                                 158     if(vers<=4) {
159       int dummy_int;                              159       int dummy_int;
160                                                   160 
161       if(!a_buffer.read(dummy_int)) return fal    161       if(!a_buffer.read(dummy_int)) return false; //fScanField
162       if(!a_buffer.read(dummy_int)) return fal    162       if(!a_buffer.read(dummy_int)) return false; //fMaxEntryLoop
163      {int fMaxVirtualSize;                        163      {int fMaxVirtualSize;
164       if(!a_buffer.read(fMaxVirtualSize)) retu    164       if(!a_buffer.read(fMaxVirtualSize)) return false;}
165      {double v;                                   165      {double v;
166       if(!a_buffer.read(v)) return false;         166       if(!a_buffer.read(v)) return false;
167       m_entries = uint64(v);}                     167       m_entries = uint64(v);}
168      {double v;                                   168      {double v;
169       if(!a_buffer.read(v)) return false;         169       if(!a_buffer.read(v)) return false;
170       //m_tot_bytes = uint64(v);                  170       //m_tot_bytes = uint64(v);
171       }                                           171       }
172      {double v;                                   172      {double v;
173       if(!a_buffer.read(v)) return false;         173       if(!a_buffer.read(v)) return false;
174       //m_zip_bytes = uint64(v);                  174       //m_zip_bytes = uint64(v);
175       }                                           175       }
176      {int fAutoSave;                              176      {int fAutoSave;
177       if(!a_buffer.read(fAutoSave)) return fal    177       if(!a_buffer.read(fAutoSave)) return false;}
178       if(!a_buffer.read(dummy_int)) return fal    178       if(!a_buffer.read(dummy_int)) return false; //fEstimate
179                                                   179 
180     } else if(vers<=9) {                          180     } else if(vers<=9) {
181      {double v;                                   181      {double v;
182       if(!a_buffer.read(v)) return false;         182       if(!a_buffer.read(v)) return false;
183       m_entries = uint64(v);}                     183       m_entries = uint64(v);}
184      {double v;                                   184      {double v;
185       if(!a_buffer.read(v)) return false;         185       if(!a_buffer.read(v)) return false;
186       //m_tot_bytes = uint64(v);                  186       //m_tot_bytes = uint64(v);
187       }                                           187       }
188      {double v;                                   188      {double v;
189       if(!a_buffer.read(v)) return false;         189       if(!a_buffer.read(v)) return false;
190       //m_zip_bytes = uint64(v);                  190       //m_zip_bytes = uint64(v);
191       }                                           191       }
192      {double v;                                   192      {double v;
193       if(!a_buffer.read(v)) return false;         193       if(!a_buffer.read(v)) return false;
194       //m_saved_bytes = uint64(v);                194       //m_saved_bytes = uint64(v);
195       }                                           195       }
196                                                   196 
197       int dummy_int;                              197       int dummy_int;
198       if(!a_buffer.read(dummy_int)) return fal    198       if(!a_buffer.read(dummy_int)) return false; //fTimerInterval
199       if(!a_buffer.read(dummy_int)) return fal    199       if(!a_buffer.read(dummy_int)) return false; //fScanField
200       if(!a_buffer.read(dummy_int)) return fal    200       if(!a_buffer.read(dummy_int)) return false; //fUpdate
201       if(!a_buffer.read(dummy_int)) return fal    201       if(!a_buffer.read(dummy_int)) return false; //fMaxEntryLoop
202                                                   202 
203      {int fMaxVirtualSize;                        203      {int fMaxVirtualSize;
204       if(!a_buffer.read(fMaxVirtualSize)) retu    204       if(!a_buffer.read(fMaxVirtualSize)) return false;}
205      {int fAutoSave;                              205      {int fAutoSave;
206       if(!a_buffer.read(fAutoSave)) return fal    206       if(!a_buffer.read(fAutoSave)) return false;}
207       if(!a_buffer.read(dummy_int)) return fal    207       if(!a_buffer.read(dummy_int)) return false; //fEstimate
208                                                   208 
209     } else if(vers<16) { //FIXME : what is the    209     } else if(vers<16) { //FIXME : what is the exact version ?
210       double dummy_double;                        210       double dummy_double;
211       int dummy_int;                              211       int dummy_int;
212                                                   212 
213      {double v;                                   213      {double v;
214       if(!a_buffer.read(v)) return false;         214       if(!a_buffer.read(v)) return false;
215       m_entries = uint64(v);}                     215       m_entries = uint64(v);}
216      {double v;                                   216      {double v;
217       if(!a_buffer.read(v)) return false;         217       if(!a_buffer.read(v)) return false;
218       //m_tot_bytes = uint64(v);                  218       //m_tot_bytes = uint64(v);
219       }                                           219       }
220      {double v;                                   220      {double v;
221       if(!a_buffer.read(v)) return false;         221       if(!a_buffer.read(v)) return false;
222       //m_zip_bytes = uint64(v);                  222       //m_zip_bytes = uint64(v);
223       }                                           223       }
224      {double v;                                   224      {double v;
225       if(!a_buffer.read(v)) return false;         225       if(!a_buffer.read(v)) return false;
226       //m_saved_bytes = uint64(v);                226       //m_saved_bytes = uint64(v);
227       }                                           227       }
228       if(!a_buffer.read(dummy_double)) return     228       if(!a_buffer.read(dummy_double)) return false; //fWeight
229       if(!a_buffer.read(dummy_int)) return fal    229       if(!a_buffer.read(dummy_int)) return false; //fTimerInterval
230       if(!a_buffer.read(dummy_int)) return fal    230       if(!a_buffer.read(dummy_int)) return false; //fScanField
231       if(!a_buffer.read(dummy_int)) return fal    231       if(!a_buffer.read(dummy_int)) return false; //fUpdate
232       if(!a_buffer.read(dummy_int)) return fal    232       if(!a_buffer.read(dummy_int)) return false; //fMaxEntryLoop
233                                                   233 
234      {int fMaxVirtualSize;                        234      {int fMaxVirtualSize;
235       if(!a_buffer.read(fMaxVirtualSize)) retu    235       if(!a_buffer.read(fMaxVirtualSize)) return false;}
236      {int fAutoSave;                              236      {int fAutoSave;
237       if(!a_buffer.read(fAutoSave)) return fal    237       if(!a_buffer.read(fAutoSave)) return false;}
238       if(!a_buffer.read(dummy_int)) return fal    238       if(!a_buffer.read(dummy_int)) return false; //fEstimate
239                                                   239 
240     } else { //vers>=16                           240     } else { //vers>=16
241       double dummy_double;                        241       double dummy_double;
242       int dummy_int;                              242       int dummy_int;
243       int64 dummy_int64;                          243       int64 dummy_int64;
244                                                   244 
245      {uint64 v;                                   245      {uint64 v;
246       if(!a_buffer.read(v)) return false;         246       if(!a_buffer.read(v)) return false;
247       m_entries = v;}                             247       m_entries = v;}
248      {uint64 v;                                   248      {uint64 v;
249       if(!a_buffer.read(v)) return false;         249       if(!a_buffer.read(v)) return false;
250       //m_tot_bytes = v;                          250       //m_tot_bytes = v;
251       }                                           251       }
252      {uint64 v;                                   252      {uint64 v;
253       if(!a_buffer.read(v)) return false;         253       if(!a_buffer.read(v)) return false;
254       //m_zip_bytes = v;                          254       //m_zip_bytes = v;
255       }                                           255       }
256      {uint64 v;                                   256      {uint64 v;
257       if(!a_buffer.read(v)) return false;         257       if(!a_buffer.read(v)) return false;
258       //m_saved_bytes = v;                        258       //m_saved_bytes = v;
259       }                                           259       }
260       if(vers>=18) {                              260       if(vers>=18) {
261         if(!a_buffer.read(dummy_int64)) return    261         if(!a_buffer.read(dummy_int64)) return false; //fFlushedBytes
262       }                                           262       }
263                                                   263 
264       if(!a_buffer.read(dummy_double)) return     264       if(!a_buffer.read(dummy_double)) return false; //fWeight
265                                                   265 
266       if(!a_buffer.read(dummy_int)) return fal    266       if(!a_buffer.read(dummy_int)) return false; //fTimerInterval
267       if(!a_buffer.read(dummy_int)) return fal    267       if(!a_buffer.read(dummy_int)) return false; //fScanField
268       if(!a_buffer.read(dummy_int)) return fal    268       if(!a_buffer.read(dummy_int)) return false; //fUpdate
269                                                   269 
270       if(vers>=18) {                              270       if(vers>=18) {
271         if(!a_buffer.read(dummy_int)) return f    271         if(!a_buffer.read(dummy_int)) return false; //fDefaultEntryOffsetLen
272       }                                           272       }
273       int fNClusterRange;                         273       int fNClusterRange;
274       if(vers>=20) {                              274       if(vers>=20) {
275         if(!a_buffer.read(fNClusterRange)) ret    275         if(!a_buffer.read(fNClusterRange)) return false; //fNClusterRange
276       }                                           276       }
277                                                   277 
278       if(!a_buffer.read(dummy_int64)) return f    278       if(!a_buffer.read(dummy_int64)) return false; //fMaxEntries
279       if(!a_buffer.read(dummy_int64)) return f    279       if(!a_buffer.read(dummy_int64)) return false; //fMaxEntryLoop
280      {uint64 fMaxVirtualSize;                     280      {uint64 fMaxVirtualSize;
281       if(!a_buffer.read(fMaxVirtualSize)) retu    281       if(!a_buffer.read(fMaxVirtualSize)) return false;}
282      {uint64 fAutoSave;                           282      {uint64 fAutoSave;
283       if(!a_buffer.read(fAutoSave)) return fal    283       if(!a_buffer.read(fAutoSave)) return false;}
284       if(vers>=18) {                              284       if(vers>=18) {
285         if(!a_buffer.read(dummy_int64)) return    285         if(!a_buffer.read(dummy_int64)) return false; //fAutoFlush
286       }                                           286       }
287       if(!a_buffer.read(dummy_int64)) return f    287       if(!a_buffer.read(dummy_int64)) return false; //fEstimate
288       if(vers>=20) {                              288       if(vers>=20) {
289         int64* fClusterRangeEnd = 0;       ///    289         int64* fClusterRangeEnd = 0;       ///<[fNClusterRange] Last entry of a cluster range.
290         if(!fixed_array_stream<int64>(a_buffer    290         if(!fixed_array_stream<int64>(a_buffer,fNClusterRange,fClusterRangeEnd)) return false;
291         delete [] fClusterRangeEnd;               291         delete [] fClusterRangeEnd;
292         int64* fClusterSize = 0;           ///    292         int64* fClusterSize = 0;           ///<[fNClusterRange] Number of entries in each cluster for a given range.
293         if(!fixed_array_stream<int64>(a_buffer    293         if(!fixed_array_stream<int64>(a_buffer,fNClusterRange,fClusterSize)) return false;
294         delete [] fClusterSize;                   294         delete [] fClusterSize;
295         dummy _dummy;                             295         dummy _dummy;
296         if(!_dummy.stream(a_buffer)) { //TIOFe    296         if(!_dummy.stream(a_buffer)) { //TIOFeatures fIOFeatures
297           m_out << "tools::rroot::tree::stream    297           m_out << "tools::rroot::tree::stream : can't read (dummy) TIOFeatures." << std::endl;
298           return false;                           298           return false;
299         }                                         299         }
300       }                                           300       }
301     }                                             301     }
302                                                   302 
303     //FIXME if (fEstimate <= 10000) fEstimate     303     //FIXME if (fEstimate <= 10000) fEstimate = 1000000;
304                                                   304 
305     //TObjArray                                   305     //TObjArray
306     //The below m_branches.read will create le    306     //The below m_branches.read will create leaves.
307     //::printf("debug : tree : read branches :    307     //::printf("debug : tree : read branches : begin\n");
308    {ifac::args args;                              308    {ifac::args args;
309     if(!m_branches.stream(a_buffer,args)) {       309     if(!m_branches.stream(a_buffer,args)) {
310       m_out << "tools::rroot::tree::stream : "    310       m_out << "tools::rroot::tree::stream : "
311             << "can't read branches."             311             << "can't read branches."
312             << std::endl;                         312             << std::endl;
313       return false;                               313       return false;
314     }}                                            314     }}
315     //::printf("debug : tree : read branches :    315     //::printf("debug : tree : read branches : end\n");
316                                                   316 
317     //TObjArray                                   317     //TObjArray
318     // We read leaves in order to keep streami    318     // We read leaves in order to keep streaming synchronisation.
319     // In fact m_leaves are references to exis    319     // In fact m_leaves are references to existing leaves read by
320     // the branches in the upper line of code.    320     // the branches in the upper line of code.
321     //::printf("debug : tree : read leaves : b    321     //::printf("debug : tree : read leaves : begin\n");
322    {obj_array<base_leaf> m_leaves(m_fac);         322    {obj_array<base_leaf> m_leaves(m_fac);
323     //branch b(m_out,m_fac);                      323     //branch b(m_out,m_fac);
324     ifac::args args;                              324     ifac::args args;
325     //args[ifac::arg_branch()] = &b;              325     //args[ifac::arg_branch()] = &b;
326     if(!m_leaves.stream(a_buffer,args)) {         326     if(!m_leaves.stream(a_buffer,args)) {
327       m_out << "tools::rroot::tree::stream : "    327       m_out << "tools::rroot::tree::stream : "
328             << "can't read leaves."               328             << "can't read leaves."
329             << std::endl;                         329             << std::endl;
330       return false;                               330       return false;
331     }}                                            331     }}
332     //::printf("debug : tree : read leaves : e    332     //::printf("debug : tree : read leaves : end\n");
333                                                   333 
334     if(vers>=10) {                                334     if(vers>=10) {
335       //TList* fAliases                           335       //TList* fAliases
336       if(!dummy_TXxx_pointer_stream(a_buffer,m    336       if(!dummy_TXxx_pointer_stream(a_buffer,m_fac)) {
337         m_out << "tools::rroot::tree::stream :    337         m_out << "tools::rroot::tree::stream : "
338               << "can't read fAliases."           338               << "can't read fAliases."
339               << std::endl;                       339               << std::endl;
340         return false;                             340         return false;
341       }                                           341       }
342     }                                             342     }
343                                                   343 
344     //m_saved_bytes = m_tot_bytes;                344     //m_saved_bytes = m_tot_bytes;
345    {std::vector<double> v;                        345    {std::vector<double> v;
346     if(!Array_stream<double>(a_buffer,v)) retu    346     if(!Array_stream<double>(a_buffer,v)) return false;} //fIndexValues TArrayD
347                                                   347 
348    {std::vector<int> v;                           348    {std::vector<int> v;
349     if(!Array_stream<int>(a_buffer,v)) return     349     if(!Array_stream<int>(a_buffer,v)) return false;}    // fIndex (TArrayI).
350                                                   350 
351     if(vers>=16) {                                351     if(vers>=16) {
352       //TVirtualIndex* fTreeIndex //FIXME ???     352       //TVirtualIndex* fTreeIndex //FIXME ???
353       if(!dummy_TXxx_pointer_stream(a_buffer,m    353       if(!dummy_TXxx_pointer_stream(a_buffer,m_fac)) {
354         m_out << "tools::rroot::tree::stream :    354         m_out << "tools::rroot::tree::stream : "
355               << "can't read fTreeIndex."         355               << "can't read fTreeIndex."
356               << std::endl;                       356               << std::endl;
357         return false;                             357         return false;
358       }                                           358       }
359     }                                             359     }
360                                                   360 
361     if(vers>=6) {                                 361     if(vers>=6) {
362       //TList* fFriends                           362       //TList* fFriends
363       if(!dummy_TXxx_pointer_stream(a_buffer,m    363       if(!dummy_TXxx_pointer_stream(a_buffer,m_fac)) {
364         m_out << "tools::rroot::tree::stream :    364         m_out << "tools::rroot::tree::stream : "
365               << "can't read fFriends."           365               << "can't read fFriends."
366               << std::endl;                       366               << std::endl;
367         return false;                             367         return false;
368       }                                           368       }
369     }                                             369     }
370                                                   370 
371     if(vers>=16) {                                371     if(vers>=16) {
372       //TList* fUserInfo                          372       //TList* fUserInfo
373       if(!dummy_TXxx_pointer_stream(a_buffer,m    373       if(!dummy_TXxx_pointer_stream(a_buffer,m_fac)) {
374         m_out << "tools::rroot::tree::stream :    374         m_out << "tools::rroot::tree::stream : "
375               << "can't read fUserInfo."          375               << "can't read fUserInfo."
376               << std::endl;                       376               << std::endl;
377         return false;                             377         return false;
378       }                                           378       }
379       //TBranchRef* fBranchRef                    379       //TBranchRef* fBranchRef
380       if(!dummy_TXxx_pointer_stream(a_buffer,m    380       if(!dummy_TXxx_pointer_stream(a_buffer,m_fac)) {
381         m_out << "tools::rroot::tree::stream :    381         m_out << "tools::rroot::tree::stream : "
382               << "can't read fBranchRef."         382               << "can't read fBranchRef."
383               << std::endl;                       383               << std::endl;
384         return false;                             384         return false;
385       }                                           385       }
386     }                                             386     }
387                                                   387 
388     if(!a_buffer.check_byte_count(_s,_c,TTree_ << 388     if(!a_buffer.check_byte_count(s,c,TTree_cls())) return false;
389                                                   389 
390     return true;                                  390     return true;
391   }                                               391   }
392 protected:                                        392 protected:
393   void _dump_branches(std::ostream& a_out,        393   void _dump_branches(std::ostream& a_out,
394                              const std::vector    394                              const std::vector<branch*>& a_bs,
395                              const std::string    395                              const std::string& a_spaces = "",
396                              const std::string    396                              const std::string& a_indent = " "){
397     tools_vforcit(branch*,a_bs,it) {              397     tools_vforcit(branch*,a_bs,it) {
398       if(branch_element* be = safe_cast<branch    398       if(branch_element* be = safe_cast<branch,branch_element>(*(*it))) {
399         a_out << a_spaces                         399         a_out << a_spaces
400               << "branch_element :"               400               << "branch_element :"
401               << " name=" << sout((*it)->name(    401               << " name=" << sout((*it)->name())
402               << " title=" << sout((*it)->titl    402               << " title=" << sout((*it)->title())
403               << " entry_number=" << be->entry    403               << " entry_number=" << be->entry_number()
404               << " ref_cls=" << sout(be->class    404               << " ref_cls=" << sout(be->class_name())
405               << " (type=" << be->type()          405               << " (type=" << be->type()
406               << ",id=" << be->id()               406               << ",id=" << be->id()
407               << ",stype=" << be->streamer_typ    407               << ",stype=" << be->streamer_type()
408               << ")."                             408               << ")."
409               << std::endl;                       409               << std::endl;
410       } else {                                    410       } else {
411         a_out << a_spaces                         411         a_out << a_spaces
412               << "branch :"                       412               << "branch :"
413               << " name=" << sout((*it)->name(    413               << " name=" << sout((*it)->name())
414               << " title=" << sout((*it)->titl    414               << " title=" << sout((*it)->title())
415               << " entry_number=" << (*it)->en    415               << " entry_number=" << (*it)->entry_number()
416               << std::endl;                       416               << std::endl;
417       }                                           417       }
418                                                   418 
419                                                   419 
420      {const std::vector<base_leaf*>& lvs = (*i    420      {const std::vector<base_leaf*>& lvs = (*it)->leaves();
421       tools_vforcit(base_leaf*,lvs,itl) {         421       tools_vforcit(base_leaf*,lvs,itl) {
422         a_out << a_spaces << a_indent             422         a_out << a_spaces << a_indent
423               << "leave :"                        423               << "leave :"
424               << " name=" << sout((*itl)->name    424               << " name=" << sout((*itl)->name())
425               << " title=" << sout((*itl)->tit    425               << " title=" << sout((*itl)->title())
426               << " cls=" << sout((*itl)->s_cls    426               << " cls=" << sout((*itl)->s_cls())
427               << std::endl;                       427               << std::endl;
428       }}                                          428       }}
429                                                   429 
430       _dump_branches(a_out,(*it)->branches(),a    430       _dump_branches(a_out,(*it)->branches(),a_spaces+a_indent,a_indent);
431     }                                             431     }
432   }                                               432   }
433                                                   433 
434   static branch* _find_branch(const std::vecto    434   static branch* _find_branch(const std::vector<branch*>& a_bs,const std::string& a_name,bool a_recursive) {
435     tools_vforcit(branch*,a_bs,it) {              435     tools_vforcit(branch*,a_bs,it) {
436       if(rcmp((*it)->name(),a_name)) return *i    436       if(rcmp((*it)->name(),a_name)) return *it;
437       if(a_recursive) {                           437       if(a_recursive) {
438         branch* br = _find_branch((*it)->branc    438         branch* br = _find_branch((*it)->branches(),a_name,a_recursive);
439         if(br) return br;                         439         if(br) return br;
440       }                                           440       }
441     }                                             441     }
442     return 0;                                     442     return 0;
443   }                                               443   }
444                                                   444 
445   static base_leaf* _find_leaf(const std::vect    445   static base_leaf* _find_leaf(const std::vector<branch*>& a_bs,const std::string& a_name,bool a_recursive) {
446     tools_vforcit(branch*,a_bs,it) {              446     tools_vforcit(branch*,a_bs,it) {
447       tools_vforcit(base_leaf*,(*it)->leaves()    447       tools_vforcit(base_leaf*,(*it)->leaves(),itl) {
448         if(rcmp((*itl)->name(),a_name)) return    448         if(rcmp((*itl)->name(),a_name)) return *itl;
449       }                                           449       }
450       if(a_recursive) {                           450       if(a_recursive) {
451         base_leaf* lf = _find_leaf((*it)->bran    451         base_leaf* lf = _find_leaf((*it)->branches(),a_name,a_recursive);
452         if(lf) return lf;                         452         if(lf) return lf;
453       }                                           453       }
454     }                                             454     }
455     return 0;                                     455     return 0;
456   }                                               456   }
457                                                   457 
458   static void _find_leaves(const std::vector<b    458   static void _find_leaves(const std::vector<branch*>& a_bs,std::vector<base_leaf*>& a_leaves) {
459     tools_vforcit(branch*,a_bs,it) {              459     tools_vforcit(branch*,a_bs,it) {
460       tools_vforcit(base_leaf*,(*it)->leaves()    460       tools_vforcit(base_leaf*,(*it)->leaves(),itl) a_leaves.push_back(*itl);
461       _find_leaves((*it)->branches(),a_leaves)    461       _find_leaves((*it)->branches(),a_leaves);
462     }                                             462     }
463   }                                               463   }
464                                                   464 
465   static void _find_branches(const std::vector    465   static void _find_branches(const std::vector<branch*>& a_bs,std::vector<branch*>& a_branches){
466     tools_vforcit(branch*,a_bs,it) {              466     tools_vforcit(branch*,a_bs,it) {
467       a_branches.push_back(*it);                  467       a_branches.push_back(*it);
468       _find_branches((*it)->branches(),a_branc    468       _find_branches((*it)->branches(),a_branches);
469     }                                             469     }
470   }                                               470   }
471                                                   471 
472   static branch* _find_leaf_branch(const std::    472   static branch* _find_leaf_branch(const std::vector<branch*>& a_bs,const base_leaf& a_leaf) {
473     tools_vforcit(branch*,a_bs,itb) {             473     tools_vforcit(branch*,a_bs,itb) {
474       tools_vforcit(base_leaf*,(*itb)->leaves(    474       tools_vforcit(base_leaf*,(*itb)->leaves(),itl) {if(*itl==&a_leaf) return *itb;}
475      {branch* br = _find_leaf_branch((*itb)->b    475      {branch* br = _find_leaf_branch((*itb)->branches(),a_leaf);
476       if(br) return br;}                          476       if(br) return br;}
477     }                                             477     }
478     return 0;                                     478     return 0;
479   }                                               479   }
480 protected:                                        480 protected:
481   ifile& m_file;                                  481   ifile& m_file;
482   ifac& m_fac;                                    482   ifac& m_fac;
483   std::ostream& m_out;                            483   std::ostream& m_out;
484   //Named                                         484   //Named
485   std::string m_name;                             485   std::string m_name;
486   std::string m_title;                            486   std::string m_title;
487                                                   487 
488   obj_array<branch> m_branches;                   488   obj_array<branch> m_branches;
489   uint64 m_entries;   // Number of entries        489   uint64 m_entries;   // Number of entries
490 };                                                490 };
491                                                   491 
492 }}                                                492 }}
493                                                   493 
494 #endif                                            494 #endif