Geant4 Cross Reference |
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_branch_element 4 #ifndef tools_rroot_branch_element 5 #define tools_rroot_branch_element 5 #define tools_rroot_branch_element 6 6 7 #include "branch" 7 #include "branch" 8 #include "stl_vector" 8 #include "stl_vector" 9 9 10 #include "info" 10 #include "info" 11 #include "obj_list" 11 #include "obj_list" 12 12 13 //#define TOOLS_RROOT_BRANCH_ELEMENT_DUMP 13 //#define TOOLS_RROOT_BRANCH_ELEMENT_DUMP 14 14 15 namespace tools { 15 namespace tools { 16 namespace rroot { 16 namespace rroot { 17 17 18 class branch_element : public branch { 18 class branch_element : public branch { 19 typedef branch parent; 19 typedef branch parent; 20 public: 20 public: 21 static const std::string& s_class() { 21 static const std::string& s_class() { 22 static const std::string s_v("tools::rroot 22 static const std::string s_v("tools::rroot::branch_element"); 23 return s_v; 23 return s_v; 24 } 24 } 25 public: //iro 25 public: //iro 26 virtual void* cast(const std::string& a_clas 26 virtual void* cast(const std::string& a_class) const { 27 if(void* p = cmp_cast<branch_element>(this 27 if(void* p = cmp_cast<branch_element>(this,a_class)) return p; 28 return parent::cast(a_class); 28 return parent::cast(a_class); 29 } 29 } 30 virtual const std::string& s_cls() const {re 30 virtual const std::string& s_cls() const {return s_class();} 31 public: 31 public: 32 static cid id_class() {return branch_element 32 static cid id_class() {return branch_element_cid();} 33 virtual void* cast(cid a_class) const { 33 virtual void* cast(cid a_class) const { 34 if(void* p = cmp_cast<branch_element>(this 34 if(void* p = cmp_cast<branch_element>(this,a_class)) {return p;} 35 return parent::cast(a_class); 35 return parent::cast(a_class); 36 } 36 } 37 public: 37 public: 38 virtual bool stream(buffer& a_buffer) { 38 virtual bool stream(buffer& a_buffer) { 39 _clear(); 39 _clear(); 40 40 41 short v; 41 short v; 42 unsigned int _s,_c; 42 unsigned int _s,_c; 43 if(!a_buffer.read_version(v,_s,_c)) return 43 if(!a_buffer.read_version(v,_s,_c)) return false; 44 44 45 //::printf("debug : tools::branch_element: 45 //::printf("debug : tools::branch_element::stream : version %d, count %d\n",v,c); 46 46 47 if(!parent::stream(a_buffer)) { 47 if(!parent::stream(a_buffer)) { 48 m_out << "tools::rroot::branch_element:: 48 m_out << "tools::rroot::branch_element::stream : parent::stream() failed." << std::endl; 49 return false; 49 return false; 50 } 50 } 51 51 52 if(v<=7) { 52 if(v<=7) { 53 if(!a_buffer.read(fClassName)) return fa 53 if(!a_buffer.read(fClassName)) return false; 54 if(!a_buffer.read(fClassVersion)) return 54 if(!a_buffer.read(fClassVersion)) return false; 55 if(!a_buffer.read(fID)) return false; 55 if(!a_buffer.read(fID)) return false; 56 if(!a_buffer.read(fType)) return false; 56 if(!a_buffer.read(fType)) return false; 57 if(!a_buffer.read(fStreamerType)) return 57 if(!a_buffer.read(fStreamerType)) return false; 58 } else { //v>=8 58 } else { //v>=8 59 if(!a_buffer.read(fClassName)) return fa 59 if(!a_buffer.read(fClassName)) return false; 60 //::printf("debug : tools::branch_elemen 60 //::printf("debug : tools::branch_element::stream : fClassName \"%s\"\n",fClassName.c_str()); 61 std::string fParentName; 61 std::string fParentName; 62 if(!a_buffer.read(fParentName)) return f 62 if(!a_buffer.read(fParentName)) return false; 63 //::printf("debug : tools::branch_elemen 63 //::printf("debug : tools::branch_element::stream : fParentName \"%s\"\n",fParentName.c_str()); 64 std::string fCloneName; 64 std::string fCloneName; 65 if(!a_buffer.read(fCloneName)) return fa 65 if(!a_buffer.read(fCloneName)) return false; 66 //::printf("debug : tools::branch_elemen 66 //::printf("debug : tools::branch_element::stream : fCloneName \"%s\"\n",fCloneName.c_str()); 67 int dummy_int; 67 int dummy_int; 68 if(!a_buffer.read(dummy_int)) return fal 68 if(!a_buffer.read(dummy_int)) return false; //fCheckSum 69 //::printf("debug : tools::branch_elemen 69 //::printf("debug : tools::branch_element::stream : fCheckSum %d\n",dummy_int); 70 70 71 if(v>=10) { 71 if(v>=10) { 72 short dummy_short; 72 short dummy_short; 73 if(!a_buffer.read(dummy_short)) return 73 if(!a_buffer.read(dummy_short)) return false; //fClassVersion 74 //::printf("debug : tools::branch_elem 74 //::printf("debug : tools::branch_element::stream : fClassVersion %d\n",dummy_short); 75 } else { 75 } else { 76 if(!a_buffer.read(dummy_int)) return f 76 if(!a_buffer.read(dummy_int)) return false; //fClassVersion 77 } 77 } 78 78 79 if(!a_buffer.read(fID)) return false; 79 if(!a_buffer.read(fID)) return false; 80 //::printf("debug : tools::branch_elemen 80 //::printf("debug : tools::branch_element::stream : fID %d\n",fID); 81 if(!a_buffer.read(fType)) return false; 81 if(!a_buffer.read(fType)) return false; 82 //::printf("debug : tools::branch_elemen 82 //::printf("debug : tools::branch_element::stream : fType %d\n",fType); 83 if(!a_buffer.read(fStreamerType)) return 83 if(!a_buffer.read(fStreamerType)) return false; 84 //::printf("debug : tools::branch_elemen 84 //::printf("debug : tools::branch_element::stream : fStreamerType %d\n",fStreamerType); 85 85 86 if(!a_buffer.read(dummy_int)) return fal 86 if(!a_buffer.read(dummy_int)) return false; //fMaximum 87 //::printf("debug : tools::branch_elemen 87 //::printf("debug : tools::branch_element::stream : fMaximum %d\n",dummy_int); 88 88 89 //TBranchElement* fBranchCount; 89 //TBranchElement* fBranchCount; 90 ifac::args args; 90 ifac::args args; 91 if(!pointer_stream(a_buffer,m_fac,args,f 91 if(!pointer_stream(a_buffer,m_fac,args,fBranchCount,fBranchCount_created)) { 92 m_out << "tools::rroot::branch_element 92 m_out << "tools::rroot::branch_element::stream : " 93 << "can't read fBranchCount." 93 << "can't read fBranchCount." 94 << std::endl; 94 << std::endl; 95 return false; 95 return false; 96 } 96 } 97 97 98 //TBranchElement* fBranchCount2; 98 //TBranchElement* fBranchCount2; 99 if(!pointer_stream(a_buffer,m_fac,args,f 99 if(!pointer_stream(a_buffer,m_fac,args,fBranchCount2,fBranchCount2_created)) { 100 m_out << "tools::rroot::branch_element 100 m_out << "tools::rroot::branch_element::stream : " 101 << "can't read fBranchCount2." 101 << "can't read fBranchCount2." 102 << std::endl; 102 << std::endl; 103 _clear(); 103 _clear(); 104 return false; 104 return false; 105 } 105 } 106 106 107 } 107 } 108 108 109 if(!a_buffer.check_byte_count(_s,_c,"TBran 109 if(!a_buffer.check_byte_count(_s,_c,"TBranchElement")) {_clear();return false;} 110 return true; 110 return true; 111 } 111 } 112 public: //branch 112 public: //branch 113 113 114 virtual bool read_leaves(ifile& a_file,buffe 114 virtual bool read_leaves(ifile& a_file,buffer& a_buffer){ 115 115 116 // For k<type> value, see the below commen 116 // For k<type> value, see the below commented enum EReadWrite from ROOT-6.12.06 code. 117 static int kInt = 3; 117 static int kInt = 3; 118 static int kDouble = 8; 118 static int kDouble = 8; 119 static int kDouble32 = 9; 119 static int kDouble32 = 9; 120 static int kUInt = 13; 120 static int kUInt = 13; 121 static int kBits = 15; // In v4-00-01 121 static int kBits = 15; // In v4-00-01 version 8, it is Long64_t. 122 static int kObject = 61; 122 static int kObject = 61; 123 static int kObjectP = 64; 123 static int kObjectP = 64; 124 124 125 if(fType==3) { // TClonesArray master bran 125 if(fType==3) { // TClonesArray master branch (has only the number of elements). 126 //from v4-00-01 126 //from v4-00-01 127 int n; 127 int n; 128 if(!a_buffer.read(n)) return false; 128 if(!a_buffer.read(n)) return false; 129 /* ROOT-6.12.06 code : 129 /* ROOT-6.12.06 code : 130 if ((n < 0) || (n > fMaximum)) { 130 if ((n < 0) || (n > fMaximum)) { 131 if (IsMissingCollection()) { 131 if (IsMissingCollection()) { 132 n = 0; 132 n = 0; 133 b.SetBufferOffset(b.Length() - siz 133 b.SetBufferOffset(b.Length() - sizeof(n)); 134 } else { 134 } else { 135 Error("ReadLeaves", "Incorrect siz 135 Error("ReadLeaves", "Incorrect size read for the container in %s\nThe size read is %d when the maximum is %d\nThe size is reset to 0 for this entry (%lld)", GetName(), n, fMaximum, GetReadEntry()); 136 n = 0; 136 n = 0; 137 } 137 } 138 }*/ 138 }*/ 139 //::printf("debug : uuuu : ndata %d\n",n 139 //::printf("debug : uuuu : ndata %d\n",n); 140 fNdata = n; 140 fNdata = n; 141 141 142 //TClonesArray *clones = (TClonesArray*) 142 //TClonesArray *clones = (TClonesArray*)fObject; 143 //if (!clones) return; 143 //if (!clones) return; 144 //if (clones->IsZombie()) return; 144 //if (clones->IsZombie()) return; 145 //clones->Clear(); 145 //clones->Clear(); 146 //clones->ExpandCreateFast(fNdata); 146 //clones->ExpandCreateFast(fNdata); 147 147 148 //m_out << "debug : tools::rroot::branch 148 //m_out << "debug : tools::rroot::branch_element::read_leaves :" 149 // << " name " << m_name << " ref_c 149 // << " name " << m_name << " ref_cls " << fClassName 150 // << " : type " << fType << ", fNd 150 // << " : type " << fType << ", fNdata " << n 151 // << std::endl; 151 // << std::endl; 152 return true; 152 return true; 153 153 154 } else if(fType==31) { // TClonesArray sub 154 } else if(fType==31) { // TClonesArray sub-branch (contains the elements). 155 if(fStreamerType==kObject) { //to read E 155 if(fStreamerType==kObject) { //to read EsbRoot fgd_dig.root. 156 int ndata = fBranchCount->get_ndata(); 156 int ndata = fBranchCount->get_ndata(); 157 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 157 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 158 ::printf("debug : %s : fClassName %s : 158 ::printf("debug : %s : fClassName %s : fID %d : kObject : ndata %d\n",m_name.c_str(),fClassName.c_str(),fID,ndata); 159 #endif 159 #endif 160 streamer_info* _info = a_file.find_str 160 streamer_info* _info = a_file.find_streamer_info(fClassName); 161 if(!_info) { 161 if(!_info) { 162 m_out << "tools::rroot::branch_eleme 162 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 163 << " read(kObject) : streamer_ 163 << " read(kObject) : streamer_infos for ref_cls " << fClassName << " not found." 164 << std::endl; 164 << std::endl; 165 return false; 165 return false; 166 } 166 } 167 streamer_element* _element = _info->fi 167 streamer_element* _element = _info->find_streamer_element(fID); 168 if(!_element) { 168 if(!_element) { 169 m_out << "tools::rroot::branch_eleme 169 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 170 << " read(kObject) : for ref_c 170 << " read(kObject) : for ref_cls " << fClassName << ", fID " << fID << " streamer element not found." 171 << std::endl; 171 << std::endl; 172 return false; 172 return false; 173 } 173 } 174 //::printf("debug : element type name 174 //::printf("debug : element type name %s\n",_element->type_name().c_str()); 175 175 176 obj_list* _list = 0; 176 obj_list* _list = 0; 177 if(!m_obj) { 177 if(!m_obj) { 178 _list = new obj_list(m_fac); 178 _list = new obj_list(m_fac); 179 m_obj = _list; 179 m_obj = _list; 180 } else { 180 } else { 181 _list = id_cast<iro,obj_list>(*m_obj 181 _list = id_cast<iro,obj_list>(*m_obj); 182 if(!_list) { 182 if(!_list) { 183 m_out << "tools::rroot::branch_ele 183 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 184 << " read(kObject) : m_obj i 184 << " read(kObject) : m_obj is not an obj_list." 185 << std::endl; 185 << std::endl; 186 return false; 186 return false; 187 } 187 } 188 } 188 } 189 189 190 _list->safe_clear(); 190 _list->safe_clear(); 191 191 192 for(int index=0;index<ndata;index++) { 192 for(int index=0;index<ndata;index++) { 193 ifac::args args; 193 ifac::args args; 194 iro* _obj = m_fac.create(_element->t 194 iro* _obj = m_fac.create(_element->type_name(),args); 195 if(!_obj) {_list->safe_clear();retur 195 if(!_obj) {_list->safe_clear();return false;} 196 if(!_obj->stream(a_buffer)){ 196 if(!_obj->stream(a_buffer)){ 197 m_out << "tools::rroot::branch_ele 197 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 198 << " kObject : obj stream of 198 << " kObject : obj stream of class " << sout(_element->type_name()) 199 << " failed at index " << in 199 << " failed at index " << index << " (" << ndata << ")." << std::endl; 200 _list->safe_clear(); 200 _list->safe_clear(); 201 return false; 201 return false; 202 } 202 } 203 _list->add_object(_obj); //give owne 203 _list->add_object(_obj); //give ownership. 204 } 204 } 205 205 206 return true; 206 return true; 207 } 207 } 208 if(fStreamerType==kObjectP) return true; 208 if(fStreamerType==kObjectP) return true; 209 //from v4-00-01 209 //from v4-00-01 210 if(fStreamerType==kDouble32) { 210 if(fStreamerType==kDouble32) { 211 int ndata = fBranchCount->get_ndata(); 211 int ndata = fBranchCount->get_ndata(); 212 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 212 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 213 ::printf("debug : %s : fID %d : double 213 ::printf("debug : %s : fID %d : double32 : ndata %d\n",m_name.c_str(),fID,ndata); 214 #endif 214 #endif 215 stl_vector<double>* vec = 0; 215 stl_vector<double>* vec = 0; 216 if(!m_obj) { 216 if(!m_obj) { 217 vec = new stl_vector<double>; 217 vec = new stl_vector<double>; 218 m_obj = vec; 218 m_obj = vec; 219 } else { 219 } else { 220 vec = id_cast<iro, stl_vector<double 220 vec = id_cast<iro, stl_vector<double> >(*m_obj); 221 if(!vec) { 221 if(!vec) { 222 m_out << "tools::rroot::branch_ele 222 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 223 << " read(kDouble32) : m_obj 223 << " read(kDouble32) : m_obj is not a stl_vector<double>." 224 << std::endl; 224 << std::endl; 225 return false; 225 return false; 226 } 226 } 227 } 227 } 228 228 229 vec->resize(ndata); 229 vec->resize(ndata); 230 float afloat; 230 float afloat; 231 for(int ii=0;ii<ndata;ii++) { 231 for(int ii=0;ii<ndata;ii++) { 232 if(!a_buffer.read(afloat)) { 232 if(!a_buffer.read(afloat)) { 233 m_out << "tools::rroot::branch_ele 233 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 234 << " read(float) failed." 234 << " read(float) failed." 235 << std::endl; 235 << std::endl; 236 vec->clear(); 236 vec->clear(); 237 return false; 237 return false; 238 } 238 } 239 //::printf("debug : zzzz %g\n",afloa 239 //::printf("debug : zzzz %g\n",afloat); 240 (*vec)[ii] = afloat; 240 (*vec)[ii] = afloat; 241 } 241 } 242 242 243 return true; 243 return true; 244 244 245 } else if(fStreamerType==kDouble) { 245 } else if(fStreamerType==kDouble) { 246 int ndata = fBranchCount->get_ndata(); 246 int ndata = fBranchCount->get_ndata(); 247 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 247 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 248 ::printf("debug : %s : fID %d : double 248 ::printf("debug : %s : fID %d : double : ndata %d\n",m_name.c_str(),fID,ndata); 249 #endif 249 #endif 250 stl_vector<double>* vec = 0; 250 stl_vector<double>* vec = 0; 251 if(!m_obj) { 251 if(!m_obj) { 252 vec = new stl_vector<double>; 252 vec = new stl_vector<double>; 253 m_obj = vec; 253 m_obj = vec; 254 } else { 254 } else { 255 vec = id_cast<iro, stl_vector<double 255 vec = id_cast<iro, stl_vector<double> >(*m_obj); 256 if(!vec) { 256 if(!vec) { 257 m_out << "tools::rroot::branch_ele 257 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 258 << " read(kDouble) : m_obj i 258 << " read(kDouble) : m_obj is not a stl_vector<double>." 259 << std::endl; 259 << std::endl; 260 return false; 260 return false; 261 } 261 } 262 } 262 } 263 263 264 vec->resize(ndata); 264 vec->resize(ndata); 265 double* _value = vec_data(*vec); 265 double* _value = vec_data(*vec); 266 if(!a_buffer.read_fast_array(_value,nd 266 if(!a_buffer.read_fast_array(_value,ndata)) { 267 m_out << "tools::rroot::branch_eleme 267 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 268 << " read_fast_array(double) f 268 << " read_fast_array(double) failed." 269 << std::endl; 269 << std::endl; 270 vec->clear(); 270 vec->clear(); 271 return false; 271 return false; 272 } 272 } 273 273 274 return true; 274 return true; 275 275 276 } else if(fStreamerType==kInt) { 276 } else if(fStreamerType==kInt) { 277 int ndata = fBranchCount->get_ndata(); 277 int ndata = fBranchCount->get_ndata(); 278 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 278 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 279 ::printf("debug : %s : fID %d : int : 279 ::printf("debug : %s : fID %d : int : ndata %d\n",m_name.c_str(),fID,ndata); 280 #endif 280 #endif 281 stl_vector<int>* vec = 0; 281 stl_vector<int>* vec = 0; 282 if(!m_obj) { 282 if(!m_obj) { 283 vec = new stl_vector<int>; 283 vec = new stl_vector<int>; 284 m_obj = vec; 284 m_obj = vec; 285 } else { 285 } else { 286 vec = id_cast<iro, stl_vector<int> > 286 vec = id_cast<iro, stl_vector<int> >(*m_obj); 287 if(!vec) { 287 if(!vec) { 288 m_out << "tools::rroot::branch_ele 288 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 289 << " read(kInt) : m_obj is n 289 << " read(kInt) : m_obj is not a stl_vector<int>." 290 << std::endl; 290 << std::endl; 291 return false; 291 return false; 292 } 292 } 293 } 293 } 294 294 295 vec->resize(ndata); 295 vec->resize(ndata); 296 int* _value = vec_data(*vec); 296 int* _value = vec_data(*vec); 297 if(!a_buffer.read_fast_array(_value,nd 297 if(!a_buffer.read_fast_array(_value,ndata)) { 298 m_out << "tools::rroot::branch_eleme 298 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 299 << " read_fast_array(int) fail 299 << " read_fast_array(int) failed." 300 << std::endl; 300 << std::endl; 301 vec->clear(); 301 vec->clear(); 302 return false; 302 return false; 303 } 303 } 304 304 305 return true; 305 return true; 306 306 307 } else if((fStreamerType==kUInt)||(fStre 307 } else if((fStreamerType==kUInt)||(fStreamerType==kBits)) { 308 int ndata = fBranchCount->get_ndata(); 308 int ndata = fBranchCount->get_ndata(); 309 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 309 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 310 if(fStreamerType==kUInt) ::printf("deb 310 if(fStreamerType==kUInt) ::printf("debug : %s : fID %d : uint : ndata %d\n",m_name.c_str(),fID,ndata); 311 else ::printf("deb 311 else ::printf("debug : %s : fID %d : bits : ndata %d\n",m_name.c_str(),fID,ndata); 312 #endif 312 #endif 313 stl_vector<uint32>* vec = 0; 313 stl_vector<uint32>* vec = 0; 314 if(!m_obj) { 314 if(!m_obj) { 315 vec = new stl_vector<uint32>; 315 vec = new stl_vector<uint32>; 316 m_obj = vec; 316 m_obj = vec; 317 } else { 317 } else { 318 vec = id_cast<iro, stl_vector<uint32 318 vec = id_cast<iro, stl_vector<uint32> >(*m_obj); 319 if(!vec) { 319 if(!vec) { 320 m_out << "tools::rroot::branch_ele 320 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 321 << " read(kUInt) : m_obj is 321 << " read(kUInt) : m_obj is not a stl_vector<uint32>." 322 << std::endl; 322 << std::endl; 323 return false; 323 return false; 324 } 324 } 325 } 325 } 326 326 327 vec->resize(ndata); 327 vec->resize(ndata); 328 uint32* _value = vec_data(*vec); 328 uint32* _value = vec_data(*vec); 329 if(!a_buffer.read_fast_array(_value,nd 329 if(!a_buffer.read_fast_array(_value,ndata)) { 330 m_out << "tools::rroot::branch_eleme 330 m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :" 331 << " read_fast_array(uint) fai 331 << " read_fast_array(uint) failed." 332 << std::endl; 332 << std::endl; 333 vec->clear(); 333 vec->clear(); 334 return false; 334 return false; 335 } 335 } 336 336 337 return true; 337 return true; 338 338 339 } else { 339 } else { 340 m_out << "tools::rroot::branch_element 340 m_out << "tools::rroot::branch_element::read_leaves :" 341 << " name " << m_name << " ref_c 341 << " name " << m_name << " ref_cls " << fClassName 342 << " : for type " << fType << ", 342 << " : for type " << fType << ", stream_type " << fStreamerType << " not treated." 343 << std::endl; 343 << std::endl; 344 return false; 344 return false; 345 } 345 } 346 /* 346 /* 347 //m_obj = clones_array<float>(m_fac,tr 347 //m_obj = clones_array<float>(m_fac,true,false); //true = owner of objects. 348 uint32 ndata = 1; 348 uint32 ndata = 1; 349 float* _value = new float[ndata]; 349 float* _value = new float[ndata]; 350 if(!a_buffer.read_fast_array(_value,nd 350 if(!a_buffer.read_fast_array(_value,ndata)) { 351 m_out << "tools::rroot::branch_eleme 351 m_out << "tools::rroot::branch_element::read_leaves : \"" << name() << "\" :" 352 << " read_fast_array failed." 352 << " read_fast_array failed." 353 << std::endl; 353 << std::endl; 354 return false; 354 return false; 355 } 355 } 356 */ 356 */ 357 //} else if(fType<=2) { //in v5-18-00d 357 //} else if(fType<=2) { //in v5-18-00d 358 } else if(fType==0) { // to read wroot.roo 358 } else if(fType==0) { // to read wroot.root of examples/cpp/wroot.cpp. 359 // if(fID>=0) { 359 // if(fID>=0) { 360 // // branch in split mode 360 // // branch in split mode 361 // m_out << "tools::rroot::branch_elemen 361 // m_out << "tools::rroot::branch_element::read_leaves :" 362 // << " name " << m_name << " ref_ 362 // << " name " << m_name << " ref_cls " << fClassName << " :" 363 // << " type 0 with ID " << fID << 363 // << " type 0 with ID " << fID << "." 364 // << std::endl; 364 // << std::endl; 365 // return true; 365 // return true; 366 // 366 // 367 367 368 if((fID==-1)|| 368 if((fID==-1)|| 369 (fID==1) // for pmx to read LHCb 369 (fID==1) // for pmx to read LHCb files : 370 ){ 370 ){ 371 //from v4-00-01 371 //from v4-00-01 372 //if (fBranchCount) fNdata = (Int_t)f 372 //if (fBranchCount) fNdata = (Int_t)fBranchCount->GetValue(0,0); 373 //else fNdata = 1; 373 //else fNdata = 1; 374 if(fBranchCount) { 374 if(fBranchCount) { 375 fNdata = fBranchCount->get_ndata(); 375 fNdata = fBranchCount->get_ndata(); 376 //::printf("debug : branch_element: 376 //::printf("debug : branch_element::read_leaves : (fType==0,fID==-1) : fNdata %d\n",fNdata); 377 } else { 377 } else { 378 fNdata = 1; 378 fNdata = 1; 379 } 379 } 380 380 381 // read object : 381 // read object : 382 bool created = false; 382 bool created = false; 383 if(!m_obj) { 383 if(!m_obj) { 384 ifac::args args; 384 ifac::args args; 385 m_obj = m_fac.create(fClassName,arg 385 m_obj = m_fac.create(fClassName,args); 386 if(!m_obj) return false; 386 if(!m_obj) return false; 387 created = true; 387 created = true; 388 } 388 } 389 389 390 if(!m_obj->stream(a_buffer)){ 390 if(!m_obj->stream(a_buffer)){ 391 m_out << "tools::rroot::branch_elem 391 m_out << "tools::rroot::branch_element::read_leaves :" 392 << " name " << sout(m_name) < 392 << " name " << sout(m_name) << ", ref_cls " << sout(fClassName) << " :" 393 << " obj stream failed." 393 << " obj stream failed." 394 << std::endl; 394 << std::endl; 395 if(created) {delete m_obj;m_obj = 0;} 395 if(created) {delete m_obj;m_obj = 0;} 396 return false; 396 return false; 397 } 397 } 398 398 399 return true; 399 return true; 400 400 401 } else { 401 } else { 402 m_out << "tools::rroot::branch_elemen 402 m_out << "tools::rroot::branch_element::read_leaves :" 403 << " name " << m_name << " ref_ 403 << " name " << m_name << " ref_cls " << fClassName << " :" 404 << " type 0 with ID " << fID << 404 << " type 0 with ID " << fID << " not treated." 405 << std::endl; 405 << std::endl; 406 return false; 406 return false; 407 } 407 } 408 408 409 } 409 } 410 410 411 m_out << "tools::rroot::branch_element::re 411 m_out << "tools::rroot::branch_element::read_leaves :" 412 << " name " << m_name << " ref_cls " 412 << " name " << m_name << " ref_cls " << fClassName 413 << " : type " << fType << " not trea 413 << " : type " << fType << " not treated, stream_type is " << fStreamerType << "." 414 << std::endl; 414 << std::endl; 415 return false; 415 return false; 416 416 417 /* 417 /* 418 ////////////////////////////////////////// 418 /////////////////////////////////////////////////////// 419 /// STL container //////////////////////// 419 /// STL container ///////////////////////////////////// 420 ////////////////////////////////////////// 420 /////////////////////////////////////////////////////// 421 if(fType==4) { 421 if(fType==4) { 422 // STL container master branch (has only 422 // STL container master branch (has only the number of elements). 423 //from v4-00-01 423 //from v4-00-01 424 int n; 424 int n; 425 if(!a_buffer.read(n)) return false; 425 if(!a_buffer.read(n)) return false; 426 //fNdata = n; 426 //fNdata = n; 427 427 428 m_out << "tools::rroot::branch_element:: 428 m_out << "tools::rroot::branch_element::read_leaves :" 429 << " name " << m_name << " ref_cls 429 << " name " << m_name << " ref_cls " << fClassName 430 << " : type " << fType << " not tr 430 << " : type " << fType << " not treated." 431 << std::endl; 431 << std::endl; 432 return false; 432 return false; 433 433 434 } else if(fType==41) { 434 } else if(fType==41) { 435 // STL container sub-branch (contains th 435 // STL container sub-branch (contains the elements). 436 m_out << "tools::rroot::branch_element:: 436 m_out << "tools::rroot::branch_element::read_leaves :" 437 << " name " << m_name << " ref_cls 437 << " name " << m_name << " ref_cls " << fClassName 438 << " : type " << fType << " not tr 438 << " : type " << fType << " not treated." 439 << std::endl; 439 << std::endl; 440 return false; 440 return false; 441 441 442 ////////////////////////////////////////// 442 /////////////////////////////////////////////////////// 443 /// TClonesArray container /////////////// 443 /// TClonesArray container //////////////////////////// 444 ////////////////////////////////////////// 444 /////////////////////////////////////////////////////// 445 } else if(fType==3) { 445 } else if(fType==3) { 446 // TClonesArray master branch (has only 446 // TClonesArray master branch (has only the number of elements). 447 //from v4-00-01 447 //from v4-00-01 448 int n; 448 int n; 449 if(!a_buffer.read(n)) return false; 449 if(!a_buffer.read(n)) return false; 450 450 451 //fNdata = n; 451 //fNdata = n; 452 //TClonesArray *clones = (TClonesArray*) 452 //TClonesArray *clones = (TClonesArray*)fObject; 453 //if (!clones) return; 453 //if (!clones) return; 454 //if (clones->IsZombie()) return; 454 //if (clones->IsZombie()) return; 455 //clones->Clear(); 455 //clones->Clear(); 456 //clones->ExpandCreateFast(fNdata); 456 //clones->ExpandCreateFast(fNdata); 457 457 458 m_out << "tools::rroot::branch_element:: 458 m_out << "tools::rroot::branch_element::read_leaves :" 459 << " name " << m_name << " ref_cls 459 << " name " << m_name << " ref_cls " << fClassName 460 << " : type " << fType << " not tr 460 << " : type " << fType << " not treated." 461 << std::endl; 461 << std::endl; 462 return false; 462 return false; 463 463 464 } else if(fType==31) { 464 } else if(fType==31) { 465 // TClonesArray sub-branch (contains the 465 // TClonesArray sub-branch (contains the elements). 466 m_out << "tools::rroot::branch_element:: 466 m_out << "tools::rroot::branch_element::read_leaves :" 467 << " name " << m_name << " ref_cls 467 << " name " << m_name << " ref_cls " << fClassName 468 << " : type " << fType << " not tr 468 << " : type " << fType << " not treated." 469 << std::endl; 469 << std::endl; 470 return false; 470 return false; 471 471 472 ////////////////////////////////////////// 472 /////////////////////////////////////////////////////// 473 ////////////////////////////////////////// 473 /////////////////////////////////////////////////////// 474 ////////////////////////////////////////// 474 /////////////////////////////////////////////////////// 475 } else if(fType<=2) { 475 } else if(fType<=2) { 476 // branch in split mode 476 // branch in split mode 477 477 478 //from v4-00-01 478 //from v4-00-01 479 //if (fBranchCount) fNdata = (Int_t)fBra 479 //if (fBranchCount) fNdata = (Int_t)fBranchCount->GetValue(0,0); 480 //else fNdata = 1; 480 //else fNdata = 1; 481 //if (!fInfo) return; 481 //if (!fInfo) return; 482 //fInfo->ReadBuffer(b,fObject,fID); 482 //fInfo->ReadBuffer(b,fObject,fID); 483 //if (fStreamerType == 6) fNdata = (Int_ 483 //if (fStreamerType == 6) fNdata = (Int_t)GetValue(0,0); 484 484 485 //from 3.0.06 485 //from 3.0.06 486 //if (fID >= 0) { 486 //if (fID >= 0) { 487 // fInfo->ReadBuffer(b,fAddress,fID); 487 // fInfo->ReadBuffer(b,fAddress,fID); 488 //} else if (fID == -1) { // top level 488 //} else if (fID == -1) { // top level branch in non split mode 489 // char **ppointer = (char**)fAddress; 489 // char **ppointer = (char**)fAddress; 490 // fInfo->ReadBuffer(b,*ppointer,fID); 490 // fInfo->ReadBuffer(b,*ppointer,fID); 491 //} 491 //} 492 492 493 //m_out << "tools::rroot::branch_element 493 //m_out << "tools::rroot::branch_element::read_leaves :" 494 // << " name " << m_name << " ref_c 494 // << " name " << m_name << " ref_cls " << fClassName << " :" 495 // << " type " << fType << " with I 495 // << " type " << fType << " with ID " << fID << "." 496 // << " and then ?" 496 // << " and then ?" 497 // << std::endl; 497 // << std::endl; 498 498 499 // read object ? 499 // read object ? 500 bool created = false; 500 bool created = false; 501 if(!m_obj) { 501 if(!m_obj) { 502 ifac::args args; 502 ifac::args args; 503 m_obj = m_fac.create(fClassName,args); 503 m_obj = m_fac.create(fClassName,args); 504 if(!m_obj) return false; 504 if(!m_obj) return false; 505 created = true; 505 created = true; 506 } 506 } 507 507 508 if(!m_obj->stream(a_buffer)){ 508 if(!m_obj->stream(a_buffer)){ 509 m_out << "tools::rroot::branch_element 509 m_out << "tools::rroot::branch_element::read_leaves :" 510 << " name " << m_name << " ref_c 510 << " name " << m_name << " ref_cls " << fClassName << " :" 511 << " obj stream failed." 511 << " obj stream failed." 512 << std::endl; 512 << std::endl; 513 if(created) {delete m_obj;m_obj = 0;} 513 if(created) {delete m_obj;m_obj = 0;} 514 return false; 514 return false; 515 } 515 } 516 516 517 //m_out << "tools::rroot::branch_element 517 //m_out << "tools::rroot::branch_element::read_leaves :" 518 // << " name " << m_name << " ref_c 518 // << " name " << m_name << " ref_cls " << fClassName << " :" 519 // << " obj streamed." 519 // << " obj streamed." 520 // << std::endl; 520 // << std::endl; 521 521 522 return true; 522 return true; 523 523 524 // } else if(fType==0) { 524 // } else if(fType==0) { 525 // if(fID>=0) { 525 // if(fID>=0) { 526 // // branch in split mode 526 // // branch in split mode 527 // m_out << "tools::rroot::branch_elemen 527 // m_out << "tools::rroot::branch_element::read_leaves :" 528 // << " name " << m_name << " ref_ 528 // << " name " << m_name << " ref_cls " << fClassName << " :" 529 // << " type 0 with ID " << fID << 529 // << " type 0 with ID " << fID << "." 530 // << std::endl; 530 // << std::endl; 531 // return true; 531 // return true; 532 // 532 // 533 // } else if(fID==-1) { 533 // } else if(fID==-1) { 534 // // top level branch in non split mode 534 // // top level branch in non split mode 535 // m_out << "tools::rroot::branch_elemen 535 // m_out << "tools::rroot::branch_element::read_leaves :" 536 // << " name " << m_name << " ref_ 536 // << " name " << m_name << " ref_cls " << fClassName << " :" 537 // << " type 0 with ID " << fID 537 // << " type 0 with ID " << fID 538 // << " : fill object." 538 // << " : fill object." 539 // << std::endl; 539 // << std::endl; 540 540 541 // if(!m_obj) { 541 // if(!m_obj) { 542 // m_out << "tools::rroot::branch_elem 542 // m_out << "tools::rroot::branch_element::read_leaves :" 543 // << " name " << m_name << " re 543 // << " name " << m_name << " ref_cls " << fClassName << " :" 544 // << " m_obj is null." 544 // << " m_obj is null." 545 // << std::endl; 545 // << std::endl; 546 // return false; 546 // return false; 547 // } 547 // } 548 // if(!m_obj->stream(a_buffer)){ 548 // if(!m_obj->stream(a_buffer)){ 549 // m_out << "tools::rroot::branch_elem 549 // m_out << "tools::rroot::branch_element::read_leaves :" 550 // << " name " << m_name << " re 550 // << " name " << m_name << " ref_cls " << fClassName << " :" 551 // << " obj stream failed." 551 // << " obj stream failed." 552 // << std::endl; 552 // << std::endl; 553 // return false; 553 // return false; 554 // } 554 // } 555 // return true; 555 // return true; 556 556 557 // } else { 557 // } else { 558 // m_out << "tools::rroot::branch_elemen 558 // m_out << "tools::rroot::branch_element::read_leaves :" 559 // << " name " << m_name << " ref_ 559 // << " name " << m_name << " ref_cls " << fClassName << " :" 560 // << " type 0 with ID " << fID << 560 // << " type 0 with ID " << fID << " not treated." 561 // << std::endl; 561 // << std::endl; 562 // return false; 562 // return false; 563 // } 563 // } 564 564 565 // //LHCb files : 565 // //LHCb files : 566 // } else if(fType==1) { 566 // } else if(fType==1) { 567 // // parent branch is a base class branch. 567 // // parent branch is a base class branch. 568 // // Ok, and then ? 568 // // Ok, and then ? 569 // m_out << "tools::rroot::branch_element:: 569 // m_out << "tools::rroot::branch_element::read_leaves :" 570 // << " name " << m_name << " ref_cls 570 // << " name " << m_name << " ref_cls " << fClassName << " :" 571 // << " type " << fType << " with ID 571 // << " type " << fType << " with ID " << fID << "." 572 // << std::endl; 572 // << std::endl; 573 // return true; 573 // return true; 574 574 575 } else { 575 } else { 576 m_out << "tools::rroot::branch_element:: 576 m_out << "tools::rroot::branch_element::read_leaves :" 577 << " name " << m_name << " ref_cls 577 << " name " << m_name << " ref_cls " << fClassName << " :" 578 << " type " << fType << " with ID 578 << " type " << fType << " with ID " << fID << "." 579 << " unknown case." 579 << " unknown case." 580 << std::endl; 580 << std::endl; 581 return false; 581 return false; 582 } 582 } 583 */ 583 */ 584 } 584 } 585 585 586 virtual bool find_entry(ifile& a_file,uint64 586 virtual bool find_entry(ifile& a_file,uint64 a_entry,uint32& a_nbytes){ 587 //The below line will call the upper read_ 587 //The below line will call the upper read_leaves. 588 if(!parent::find_entry(a_file,a_entry,a_nb 588 if(!parent::find_entry(a_file,a_entry,a_nbytes)) return false; 589 589 590 if(m_branches.size()) { 590 if(m_branches.size()) { 591 //if(!m_obj) { 591 //if(!m_obj) { 592 // m_obj = m_fac.create(fClassName); 592 // m_obj = m_fac.create(fClassName); 593 // if(!m_obj) return false; 593 // if(!m_obj) return false; 594 //} 594 //} 595 595 596 tools_vforcit(branch*,m_branches,it) { 596 tools_vforcit(branch*,m_branches,it) { 597 uint32 n; 597 uint32 n; 598 if(!(*it)->find_entry(a_file,a_entry,n 598 if(!(*it)->find_entry(a_file,a_entry,n)) return false; 599 a_nbytes += n; 599 a_nbytes += n; 600 } 600 } 601 } 601 } 602 602 603 return true; 603 return true; 604 } 604 } 605 605 606 virtual bool show(std::ostream& a_out,ifile& 606 virtual bool show(std::ostream& a_out,ifile& a_file,uint64 a_entry){ 607 uint32 n; 607 uint32 n; 608 if(!find_entry(a_file,a_entry,n)) return f 608 if(!find_entry(a_file,a_entry,n)) return false; 609 609 610 {std::string _s; 610 {std::string _s; 611 uint32 len = uint32(name().size())+128; 611 uint32 len = uint32(name().size())+128; 612 sprintf(_s,len," %-15s = ",name().c_str()) 612 sprintf(_s,len," %-15s = ",name().c_str()); 613 a_out << _s;} 613 a_out << _s;} 614 614 615 a_out << m_obj << std::endl; 615 a_out << m_obj << std::endl; 616 616 617 return true; 617 return true; 618 //return parent::show(a_out,a_file,a_entry 618 //return parent::show(a_out,a_file,a_entry); 619 } 619 } 620 public: 620 public: 621 branch_element(std::ostream& a_out,ifac& a_f 621 branch_element(std::ostream& a_out,ifac& a_fac) 622 :parent(a_out,a_fac) 622 :parent(a_out,a_fac) 623 ,m_obj(0) 623 ,m_obj(0) 624 ,fClassVersion(0) 624 ,fClassVersion(0) 625 ,fID(0) 625 ,fID(0) 626 ,fType(0) 626 ,fType(0) 627 ,fStreamerType(-1) 627 ,fStreamerType(-1) 628 ,fBranchCount(0) //not owner 628 ,fBranchCount(0) //not owner 629 ,fBranchCount_created(false) 629 ,fBranchCount_created(false) 630 ,fBranchCount2(0) //not owner 630 ,fBranchCount2(0) //not owner 631 ,fBranchCount2_created(false) 631 ,fBranchCount2_created(false) 632 ,fNdata(1) 632 ,fNdata(1) 633 {} 633 {} 634 634 635 virtual ~branch_element() { 635 virtual ~branch_element() { 636 _clear(); 636 _clear(); 637 if(m_obj) delete m_obj; 637 if(m_obj) delete m_obj; 638 } 638 } 639 protected: 639 protected: 640 branch_element(const branch_element& a_from) 640 branch_element(const branch_element& a_from):iro(a_from),parent(a_from){} 641 branch_element& operator=(const branch_eleme 641 branch_element& operator=(const branch_element&){return *this;} 642 public: 642 public: 643 const std::string& class_name() const {retur 643 const std::string& class_name() const {return fClassName;} 644 int type() const {return fType;} 644 int type() const {return fType;} 645 int streamer_type() const {return fStreamerT 645 int streamer_type() const {return fStreamerType;} 646 int id() const {return fID;} 646 int id() const {return fID;} 647 iro* object() {return m_obj;} 647 iro* object() {return m_obj;} 648 int get_ndata() const {return fNdata;} 648 int get_ndata() const {return fNdata;} 649 649 650 template <class T> 650 template <class T> 651 stl_vector<T>* object_to_stl_vector() const 651 stl_vector<T>* object_to_stl_vector() const { 652 if(!m_obj) { 652 if(!m_obj) { 653 m_out << "tools::rroot::branch_element:: 653 m_out << "tools::rroot::branch_element::object_to_stl_vector : there is no object." << std::endl; 654 return 0; 654 return 0; 655 } 655 } 656 stl_vector<T>* od = id_cast<iro, stl_vecto 656 stl_vector<T>* od = id_cast<iro, stl_vector<T> >(*m_obj); 657 if(!od) { 657 if(!od) { 658 m_out << "tools::rroot::branch_element:: 658 m_out << "tools::rroot::branch_element::object_to_stl_vector :" 659 << " object of class " << sout(m_o 659 << " object of class " << sout(m_obj->s_cls()) << " not a tools::rroot::stl_vector<T>." 660 << std::endl; 660 << std::endl; 661 return 0; 661 return 0; 662 } 662 } 663 return od; //WARNING : we are not owner. 663 return od; //WARNING : we are not owner. 664 } 664 } 665 665 666 obj_list* object_to_obj_list() const { 666 obj_list* object_to_obj_list() const { 667 if(!m_obj) { 667 if(!m_obj) { 668 m_out << "tools::rroot::branch_element:: 668 m_out << "tools::rroot::branch_element::object_to_obj_list : there is no object." << std::endl; 669 return 0; 669 return 0; 670 } 670 } 671 obj_list* od = id_cast<iro,obj_list>(*m_ob 671 obj_list* od = id_cast<iro,obj_list>(*m_obj); 672 if(!od) { 672 if(!od) { 673 m_out << "tools::rroot::branch_element:: 673 m_out << "tools::rroot::branch_element::object_to_obj_list :" 674 << " object of class " << sout(m_o 674 << " object of class " << sout(m_obj->s_cls()) << " not a tools::rroot::obj_list." 675 << std::endl; 675 << std::endl; 676 return 0; 676 return 0; 677 } 677 } 678 return od; //WARNING : we are not owner. 678 return od; //WARNING : we are not owner. 679 } 679 } 680 680 681 template <class T> 681 template <class T> 682 stl_vector<T>* find_entry_vec(ifile& a_file, 682 stl_vector<T>* find_entry_vec(ifile& a_file,uint64 a_event) { 683 unsigned int n; 683 unsigned int n; 684 if(!find_entry(a_file,a_event,n)) { 684 if(!find_entry(a_file,a_event,n)) { 685 m_out << "tools::rroot::branch_element:: 685 m_out << "tools::rroot::branch_element::find_entry_vec : find_entry() failed." << std::endl; 686 return 0; 686 return 0; 687 } 687 } 688 if(!m_obj) { 688 if(!m_obj) { 689 m_out << "tools::rroot::branch_element:: 689 m_out << "tools::rroot::branch_element::find_entry_vec : no object found." << std::endl; 690 return 0; 690 return 0; 691 } 691 } 692 stl_vector<T>* od = id_cast<iro, stl_vecto 692 stl_vector<T>* od = id_cast<iro, stl_vector<T> >(*m_obj); 693 if(!od) { 693 if(!od) { 694 m_out << "tools::rroot::branch_element:: 694 m_out << "tools::rroot::branch_element::find_entry_vec :" 695 << " object not a tools::rroot::st 695 << " object not a tools::rroot::stl_vector<T>." 696 << std::endl; 696 << std::endl; 697 return 0; 697 return 0; 698 } 698 } 699 return od; //WARNING : we are not owner. 699 return od; //WARNING : we are not owner. 700 } 700 } 701 701 702 protected: 702 protected: 703 void _clear() { 703 void _clear() { 704 if(fBranchCount_created) {delete fBranchCo 704 if(fBranchCount_created) {delete fBranchCount;fBranchCount = 0;fBranchCount_created = false;} 705 if(fBranchCount2_created) {delete fBranchC 705 if(fBranchCount2_created) {delete fBranchCount2;fBranchCount2 = 0;fBranchCount2_created = false;} 706 } 706 } 707 protected: 707 protected: 708 iro* m_obj; 708 iro* m_obj; 709 protected: 709 protected: 710 std::string fClassName; //Class name of refe 710 std::string fClassName; //Class name of referenced object 711 int fClassVersion; //Version number of clas 711 int fClassVersion; //Version number of class 712 int fID; //element serial number 712 int fID; //element serial number in fInfo 713 int fType; //branch type 713 int fType; //branch type 714 int fStreamerType; //branch streamer type 714 int fStreamerType; //branch streamer type 715 branch_element* fBranchCount; // pointer to 715 branch_element* fBranchCount; // pointer to primary branchcount branch 716 bool fBranchCount_created; 716 bool fBranchCount_created; 717 branch_element* fBranchCount2; // pointer to 717 branch_element* fBranchCount2; // pointer to secondary branchcount branch 718 bool fBranchCount2_created; 718 bool fBranchCount2_created; 719 int fNdata; // Number of data in thi 719 int fNdata; // Number of data in this branch 720 }; 720 }; 721 721 722 }} 722 }} 723 723 724 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 724 #ifdef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 725 #undef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 725 #undef TOOLS_RROOT_BRANCH_ELEMENT_DUMP 726 #endif 726 #endif 727 727 728 #endif 728 #endif 729 729 730 ////////////////////////////////////////////// 730 //////////////////////////////////////////////////////////// 731 ////////////////////////////////////////////// 731 //////////////////////////////////////////////////////////// 732 ////////////////////////////////////////////// 732 //////////////////////////////////////////////////////////// 733 /* In v4-00-01 version 8 : 733 /* In v4-00-01 version 8 : 734 case 1: {b.ReadFastArray((Char_t*) 734 case 1: {b.ReadFastArray((Char_t*) fAddress, n); break;} 735 case 2: {b.ReadFastArray((Short_t* 735 case 2: {b.ReadFastArray((Short_t*) fAddress, n); break;} 736 case 3: {b.ReadFastArray((Int_t*) 736 case 3: {b.ReadFastArray((Int_t*) fAddress, n); break;} 737 case 4: {b.ReadFastArray((Long_t*) 737 case 4: {b.ReadFastArray((Long_t*) fAddress, n); break;} 738 case 5: {b.ReadFastArray((Float_t* 738 case 5: {b.ReadFastArray((Float_t*) fAddress, n); break;} 739 case 6: {b.ReadFastArray((Int_t*) 739 case 6: {b.ReadFastArray((Int_t*) fAddress, n); break;} 740 case 8: {b.ReadFastArray((Double_t 740 case 8: {b.ReadFastArray((Double_t*)fAddress, n); break;} 741 case 11: {b.ReadFastArray((UChar_t* 741 case 11: {b.ReadFastArray((UChar_t*) fAddress, n); break;} 742 case 12: {b.ReadFastArray((UShort_t 742 case 12: {b.ReadFastArray((UShort_t*)fAddress, n); break;} 743 case 13: {b.ReadFastArray((UInt_t*) 743 case 13: {b.ReadFastArray((UInt_t*) fAddress, n); break;} 744 case 14: {b.ReadFastArray((ULong_t* 744 case 14: {b.ReadFastArray((ULong_t*) fAddress, n); break;} 745 case 15: {b.ReadFastArray((Long64_t 745 case 15: {b.ReadFastArray((Long64_t*)fAddress, n); break;} 746 case 16: {b.ReadFastArray((ULong64_ 746 case 16: {b.ReadFastArray((ULong64_t*)fAddress, n); break;} 747 case 9: {Double_t *xx = (Double_t*)fAd 747 case 9: {Double_t *xx = (Double_t*)fAddress; 748 Float_t afloat; 748 Float_t afloat; 749 for (Int_t ii=0;ii<n;ii++) { 749 for (Int_t ii=0;ii<n;ii++) { 750 b>> afloat; xx[ii] = Doubl 750 b>> afloat; xx[ii] = Double_t(afloat); 751 } break;} 751 } break;} 752 */ 752 */ 753 /* 6.12.06 version 10 : fStreamerType : from m 753 /* 6.12.06 version 10 : fStreamerType : from meta/inc/TVirtualStreamerInfo.h : 754 754 755 enum EReadWrite { 755 enum EReadWrite { 756 kBase = 0, kOffsetL = 20, kOff 756 kBase = 0, kOffsetL = 20, kOffsetP = 40, kCounter = 6, kCharStar = 7, 757 kChar = 1, kShort = 2, kInt 757 kChar = 1, kShort = 2, kInt = 3, kLong = 4, kFloat = 5, 758 kDouble = 8, kDouble32= 9, 758 kDouble = 8, kDouble32= 9, 759 kUChar = 11, kUShort = 12, kUIn 759 kUChar = 11, kUShort = 12, kUInt = 13, kULong = 14, kBits = 15, 760 kLong64 = 16, kULong64 = 17, kBoo 760 kLong64 = 16, kULong64 = 17, kBool = 18, kFloat16 = 19, 761 kObject = 61, kAny = 62, kObj 761 kObject = 61, kAny = 62, kObjectp = 63, kObjectP = 64, kTString = 65, 762 kTObject = 66, kTNamed = 67, kAny 762 kTObject = 66, kTNamed = 67, kAnyp = 68, kAnyP = 69, kAnyPnoVT = 70, 763 kSTLp = 71, 763 kSTLp = 71, 764 kSkip = 100, kSkipL = 120, kSkipP 764 kSkip = 100, kSkipL = 120, kSkipP = 140, 765 kConv = 200, kConvL = 220, kConvP 765 kConv = 200, kConvL = 220, kConvP = 240, 766 kSTL = ROOT::kSTLany, // 300 766 kSTL = ROOT::kSTLany, // 300 767 kSTLstring = ROOT::kSTLstring, // 365 767 kSTLstring = ROOT::kSTLstring, // 365 768 kStreamer = 500, kStreamLoop = 501, 768 kStreamer = 500, kStreamLoop = 501, 769 kCache = 600, // Cache the value 769 kCache = 600, // Cache the value in memory than is not part of the object but is accessible via a SchemaRule 770 kArtificial = 1000, 770 kArtificial = 1000, 771 kCacheNew = 1001, 771 kCacheNew = 1001, 772 kCacheDelete = 1002, 772 kCacheDelete = 1002, 773 kNeedObjectForVirtualBaseClass = 99997, 773 kNeedObjectForVirtualBaseClass = 99997, 774 kMissing = 99999 774 kMissing = 99999 775 }; 775 }; 776 776 777 // Some comments about EReadWrite 777 // Some comments about EReadWrite 778 // kBase : base class element 778 // kBase : base class element 779 // kOffsetL : fixed size array 779 // kOffsetL : fixed size array 780 // kOffsetP : pointer to object 780 // kOffsetP : pointer to object 781 // kCounter : counter for array size 781 // kCounter : counter for array size 782 // kCharStar: pointer to array of char 782 // kCharStar: pointer to array of char 783 // kBits : TObject::fBits in case of a refe 783 // kBits : TObject::fBits in case of a referenced object 784 // kObject : Class derived from TObject 784 // kObject : Class derived from TObject 785 // kObjectp : Class* derived from TObject and 785 // kObjectp : Class* derived from TObject and with comment field //->Class 786 // kObjectP : Class* derived from TObject and 786 // kObjectP : Class* derived from TObject and with NO comment field //->Class 787 // kAny : Class not derived from TObject 787 // kAny : Class not derived from TObject 788 // kAnyp : Class* not derived from TObject 788 // kAnyp : Class* not derived from TObject with comment field //->Class 789 // kAnyP : Class* not derived from TObject 789 // kAnyP : Class* not derived from TObject with NO comment field //->Class 790 // kAnyPnoVT: Class* not derived from TObject 790 // kAnyPnoVT: Class* not derived from TObject with NO comment field //->Class and Class has NO virtual table 791 // kSTLp : Pointer to STL container. 791 // kSTLp : Pointer to STL container. 792 // kTString : TString, special case 792 // kTString : TString, special case 793 // kTObject : TObject, special case 793 // kTObject : TObject, special case 794 // kTNamed : TNamed , special case 794 // kTNamed : TNamed , special case 795 795 796 */ 796 */