Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003 
0004 #ifndef tools_rroot_branch_element
0005 #define tools_rroot_branch_element
0006 
0007 #include "branch"
0008 #include "stl_vector"
0009 
0010 #include "info"
0011 #include "obj_list"
0012 
0013 
0014 namespace tools {
0015 namespace rroot {
0016 
0017 class branch_element : public branch {
0018   typedef branch parent;
0019 public:
0020   static const std::string& s_class() {
0021     static const std::string s_v("tools::rroot::branch_element");
0022     return s_v;
0023   }
0024 public: //iro
0025   virtual void* cast(const std::string& a_class) const {
0026     if(void* p = cmp_cast<branch_element>(this,a_class)) return p;
0027     return parent::cast(a_class);
0028   }
0029   virtual const std::string& s_cls() const {return s_class();}
0030 public:
0031   static cid id_class() {return branch_element_cid();}
0032   virtual void* cast(cid a_class) const {
0033     if(void* p = cmp_cast<branch_element>(this,a_class)) {return p;}
0034     return parent::cast(a_class);
0035   }
0036 public:
0037   virtual bool stream(buffer& a_buffer) {
0038     _clear();
0039 
0040     short v;
0041     unsigned int _s,_c;
0042     if(!a_buffer.read_version(v,_s,_c)) return false;
0043 
0044     if(!parent::stream(a_buffer)) {
0045       m_out << "tools::rroot::branch_element::stream : parent::stream() failed." << std::endl;
0046       return false;
0047     }
0048 
0049     if(v<=7) {
0050       if(!a_buffer.read(fClassName)) return false;
0051       if(!a_buffer.read(fClassVersion)) return false;
0052       if(!a_buffer.read(fID)) return false;
0053       if(!a_buffer.read(fType)) return false;
0054       if(!a_buffer.read(fStreamerType)) return false;
0055     } else { //v>=8
0056       if(!a_buffer.read(fClassName)) return false;
0057       std::string fParentName;
0058       if(!a_buffer.read(fParentName)) return false;
0059       std::string fCloneName;
0060       if(!a_buffer.read(fCloneName)) return false;
0061       int dummy_int;
0062       if(!a_buffer.read(dummy_int)) return false; //fCheckSum
0063 
0064       if(v>=10) {
0065         short dummy_short;
0066         if(!a_buffer.read(dummy_short)) return false; //fClassVersion
0067       } else {
0068         if(!a_buffer.read(dummy_int)) return false; //fClassVersion
0069       }
0070 
0071       if(!a_buffer.read(fID)) return false;
0072       if(!a_buffer.read(fType)) return false;
0073       if(!a_buffer.read(fStreamerType)) return false;
0074 
0075       if(!a_buffer.read(dummy_int)) return false; //fMaximum
0076 
0077       ifac::args args;
0078       if(!pointer_stream(a_buffer,m_fac,args,fBranchCount,fBranchCount_created)) {
0079         m_out << "tools::rroot::branch_element::stream : "
0080               << "can't read fBranchCount."
0081               << std::endl;
0082         return false;
0083       }
0084 
0085       if(!pointer_stream(a_buffer,m_fac,args,fBranchCount2,fBranchCount2_created)) {
0086         m_out << "tools::rroot::branch_element::stream : "
0087               << "can't read fBranchCount2."
0088               << std::endl;
0089         _clear();
0090         return false;
0091       }
0092 
0093     }
0094 
0095     if(!a_buffer.check_byte_count(_s,_c,"TBranchElement")) {_clear();return false;}
0096     return true;
0097   }
0098 public: //branch
0099 
0100   virtual bool read_leaves(ifile& a_file,buffer& a_buffer){
0101 
0102     // For k<type> value, see the below commented enum EReadWrite from ROOT-6.12.06 code.
0103     static int kInt      = 3;
0104     static int kDouble   = 8;
0105     static int kDouble32 = 9;
0106     static int kUInt     = 13;
0107     static int kBits     = 15;  // In v4-00-01 version 8, it is Long64_t.
0108     static int kObject   = 61;
0109     static int kObjectP  = 64;
0110 
0111     if(fType==3) { // TClonesArray master branch (has only the number of elements).
0112       //from v4-00-01
0113       int n;
0114       if(!a_buffer.read(n)) return false;
0115 
0116       fNdata = n;
0117 
0118       return true;
0119 
0120     } else if(fType==31) { // TClonesArray sub-branch (contains the elements).
0121       if(fStreamerType==kObject) { //to read EsbRoot fgd_dig.root.
0122         int ndata = fBranchCount->get_ndata();
0123         streamer_info* _info = a_file.find_streamer_info(fClassName);
0124         if(!_info) {
0125           m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0126                 << " read(kObject) : streamer_infos for ref_cls " << fClassName << " not found."
0127                 << std::endl;
0128           return false;
0129         }
0130         streamer_element* _element = _info->find_streamer_element(fID);
0131         if(!_element) {
0132           m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0133                 << " read(kObject) : for ref_cls " << fClassName << ", fID " << fID << " streamer element not found."
0134                 << std::endl;
0135           return false;
0136         }
0137 
0138         obj_list* _list = 0;
0139         if(!m_obj) {
0140           _list = new obj_list(m_fac);
0141           m_obj = _list;
0142         } else {
0143           _list = id_cast<iro,obj_list>(*m_obj);
0144           if(!_list) {
0145             m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0146                   << " read(kObject) : m_obj is not an obj_list."
0147                   << std::endl;
0148             return false;
0149           }
0150         }
0151 
0152         _list->safe_clear();
0153 
0154         for(int index=0;index<ndata;index++) {
0155           ifac::args args;
0156           iro* _obj = m_fac.create(_element->type_name(),args);
0157           if(!_obj) {_list->safe_clear();return false;}
0158           if(!_obj->stream(a_buffer)){
0159             m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0160                   << " kObject : obj stream of class " << sout(_element->type_name())
0161                   << " failed at index " << index << " (" << ndata << ")." << std::endl;
0162             _list->safe_clear();
0163             return false;
0164           }
0165           _list->add_object(_obj); //give ownership.
0166         }
0167 
0168         return true;
0169       }
0170       if(fStreamerType==kObjectP) return true;
0171       //from v4-00-01
0172       if(fStreamerType==kDouble32) {
0173         int ndata = fBranchCount->get_ndata();
0174         stl_vector<double>* vec = 0;
0175         if(!m_obj) {
0176           vec = new stl_vector<double>;
0177           m_obj = vec;
0178         } else {
0179           vec = id_cast<iro, stl_vector<double> >(*m_obj);
0180           if(!vec) {
0181             m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0182                   << " read(kDouble32) : m_obj is not a stl_vector<double>."
0183                   << std::endl;
0184             return false;
0185           }
0186         }
0187 
0188         vec->resize(ndata);
0189         float afloat;
0190         for(int ii=0;ii<ndata;ii++) {
0191           if(!a_buffer.read(afloat)) {
0192             m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0193                   << " read(float) failed."
0194                   << std::endl;
0195             vec->clear();
0196             return false;
0197           }
0198           (*vec)[ii] = afloat;
0199         }
0200 
0201         return true;
0202 
0203       } else if(fStreamerType==kDouble) {
0204         int ndata = fBranchCount->get_ndata();
0205         stl_vector<double>* vec = 0;
0206         if(!m_obj) {
0207           vec = new stl_vector<double>;
0208           m_obj = vec;
0209         } else {
0210           vec = id_cast<iro, stl_vector<double> >(*m_obj);
0211           if(!vec) {
0212             m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0213                   << " read(kDouble) : m_obj is not a stl_vector<double>."
0214                   << std::endl;
0215             return false;
0216           }
0217         }
0218 
0219         vec->resize(ndata);
0220         double* _value = vec->data();
0221         if(!a_buffer.read_fast_array(_value,ndata)) {
0222           m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0223                 << " read_fast_array(double) failed."
0224                 << std::endl;
0225           vec->clear();
0226           return false;
0227         }
0228 
0229         return true;
0230 
0231       } else if(fStreamerType==kInt) {
0232         int ndata = fBranchCount->get_ndata();
0233         stl_vector<int>* vec = 0;
0234         if(!m_obj) {
0235           vec = new stl_vector<int>;
0236           m_obj = vec;
0237         } else {
0238           vec = id_cast<iro, stl_vector<int> >(*m_obj);
0239           if(!vec) {
0240             m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0241                   << " read(kInt) : m_obj is not a stl_vector<int>."
0242                   << std::endl;
0243             return false;
0244           }
0245         }
0246 
0247         vec->resize(ndata);
0248         int* _value = vec->data();
0249         if(!a_buffer.read_fast_array(_value,ndata)) {
0250           m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0251                 << " read_fast_array(int) failed."
0252                 << std::endl;
0253           vec->clear();
0254           return false;
0255         }
0256 
0257         return true;
0258 
0259       } else if((fStreamerType==kUInt)||(fStreamerType==kBits)) {
0260         int ndata = fBranchCount->get_ndata();
0261         stl_vector<uint32>* vec = 0;
0262         if(!m_obj) {
0263           vec = new stl_vector<uint32>;
0264           m_obj = vec;
0265         } else {
0266           vec = id_cast<iro, stl_vector<uint32> >(*m_obj);
0267           if(!vec) {
0268             m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0269                   << " read(kUInt) : m_obj is not a stl_vector<uint32>."
0270                   << std::endl;
0271             return false;
0272           }
0273         }
0274 
0275         vec->resize(ndata);
0276         uint32* _value = vec->data();
0277         if(!a_buffer.read_fast_array(_value,ndata)) {
0278           m_out << "tools::rroot::branch_element::read_leaves : " << sout(m_name) << " :"
0279                 << " read_fast_array(uint) failed."
0280                 << std::endl;
0281           vec->clear();
0282           return false;
0283         }
0284 
0285         return true;
0286 
0287       } else {
0288         m_out << "tools::rroot::branch_element::read_leaves :"
0289               << " name " << m_name << " ref_cls " << fClassName
0290               << " : for type " << fType << ", stream_type " << fStreamerType << " not treated."
0291               << std::endl;
0292         return false;
0293       }
0294 
0295     } else if(fType==0) { // to read wroot.root of examples/cpp/wroot.cpp.
0296 
0297 
0298        if((fID==-1)||
0299           (fID==1)     // for pmx to read LHCb files :
0300          ){
0301          if(fBranchCount) {
0302            fNdata = fBranchCount->get_ndata();
0303          } else {
0304            fNdata = 1;
0305          }
0306 
0307          // read object :
0308          bool created = false;
0309          if(!m_obj) {
0310            ifac::args args;
0311            m_obj = m_fac.create(fClassName,args);
0312            if(!m_obj) return false;
0313            created = true;
0314          }
0315 
0316          if(!m_obj->stream(a_buffer)){
0317            m_out << "tools::rroot::branch_element::read_leaves :"
0318                  << " name " << sout(m_name) << ", ref_cls " << sout(fClassName) << " :"
0319                  << " obj stream failed."
0320                  << std::endl;
0321            if(created) {delete m_obj;m_obj = 0;}
0322            return false;
0323          }
0324 
0325          return true;
0326 
0327        } else {
0328          m_out << "tools::rroot::branch_element::read_leaves :"
0329                << " name " << m_name << " ref_cls " << fClassName << " :"
0330                << " type 0 with ID " << fID << " not treated."
0331                << std::endl;
0332          return false;
0333        }
0334 
0335     }
0336 
0337     m_out << "tools::rroot::branch_element::read_leaves :"
0338           << " name " << m_name << " ref_cls " << fClassName
0339           << " : type " << fType << " not treated, stream_type is " << fStreamerType << "."
0340           << std::endl;
0341     return false;
0342   }
0343 
0344   virtual bool find_entry(ifile& a_file,uint64 a_entry,uint32& a_nbytes){
0345     //The below line will call the upper read_leaves.
0346     if(!parent::find_entry(a_file,a_entry,a_nbytes)) return false;
0347 
0348     if(m_branches.size()) {
0349       tools_vforcit(branch*,m_branches,it) {
0350         uint32 n;
0351         if(!(*it)->find_entry(a_file,a_entry,n)) return false;
0352         a_nbytes += n;
0353       }
0354     }
0355 
0356     return true;
0357   }
0358 
0359   virtual bool show(std::ostream& a_out,ifile& a_file,uint64 a_entry){
0360     uint32 n;
0361     if(!find_entry(a_file,a_entry,n)) return false;
0362 
0363    {std::string _s;
0364     uint32 len = uint32(name().size())+128;
0365     sprintf(_s,len," %-15s = ",name().c_str());
0366     a_out << _s;}
0367 
0368     a_out << m_obj << std::endl;
0369 
0370     return true;
0371   }
0372 public:
0373   branch_element(std::ostream& a_out,ifac& a_fac)
0374   :parent(a_out,a_fac)
0375   ,m_obj(0)
0376   ,fClassVersion(0)
0377   ,fID(0)
0378   ,fType(0)
0379   ,fStreamerType(-1)
0380   ,fBranchCount(0)   //not owner
0381   ,fBranchCount_created(false)
0382   ,fBranchCount2(0)  //not owner
0383   ,fBranchCount2_created(false)
0384   ,fNdata(1)
0385   {}
0386 
0387   virtual ~branch_element() {
0388     _clear();
0389     if(m_obj) delete m_obj;
0390   }
0391 protected:
0392   branch_element(const branch_element& a_from):iro(a_from),parent(a_from){}
0393   branch_element& operator=(const branch_element&){return *this;}
0394 public:
0395   const std::string& class_name() const {return fClassName;}
0396   int type() const {return fType;}
0397   int streamer_type() const {return fStreamerType;}
0398   int id() const {return fID;}
0399   iro* object() {return m_obj;}
0400   int get_ndata() const {return fNdata;}
0401 
0402   template <class T>
0403   stl_vector<T>* object_to_stl_vector() const {
0404     if(!m_obj) {
0405       m_out << "tools::rroot::branch_element::object_to_stl_vector : there is no object." << std::endl;
0406       return 0;
0407     }
0408     stl_vector<T>* od = id_cast<iro, stl_vector<T> >(*m_obj);
0409     if(!od) {
0410       m_out << "tools::rroot::branch_element::object_to_stl_vector :"
0411             << " object of class " << sout(m_obj->s_cls()) << " not a tools::rroot::stl_vector<T>."
0412             << std::endl;
0413       return 0;
0414     }
0415     return od; //WARNING : we are not owner.
0416   }
0417 
0418   obj_list* object_to_obj_list() const {
0419     if(!m_obj) {
0420       m_out << "tools::rroot::branch_element::object_to_obj_list : there is no object." << std::endl;
0421       return 0;
0422     }
0423     obj_list* od = id_cast<iro,obj_list>(*m_obj);
0424     if(!od) {
0425       m_out << "tools::rroot::branch_element::object_to_obj_list :"
0426             << " object of class " << sout(m_obj->s_cls()) << " not a tools::rroot::obj_list."
0427             << std::endl;
0428       return 0;
0429     }
0430     return od; //WARNING : we are not owner.
0431   }
0432 
0433   template <class T>
0434   stl_vector<T>* find_entry_vec(ifile& a_file,uint64 a_event) {
0435     unsigned int n;
0436     if(!find_entry(a_file,a_event,n)) {
0437       m_out << "tools::rroot::branch_element::find_entry_vec : find_entry() failed." << std::endl;
0438       return 0;
0439     }
0440     if(!m_obj) {
0441       m_out << "tools::rroot::branch_element::find_entry_vec : no object found." << std::endl;
0442       return 0;
0443     }
0444     stl_vector<T>* od = id_cast<iro, stl_vector<T> >(*m_obj);
0445     if(!od) {
0446       m_out << "tools::rroot::branch_element::find_entry_vec :"
0447             << " object not a tools::rroot::stl_vector<T>."
0448             << std::endl;
0449       return 0;
0450     }
0451     return od; //WARNING : we are not owner.
0452   }
0453 
0454 protected:
0455   void _clear() {
0456     if(fBranchCount_created) {delete fBranchCount;fBranchCount = 0;fBranchCount_created = false;}
0457     if(fBranchCount2_created) {delete fBranchCount2;fBranchCount2 = 0;fBranchCount2_created = false;}
0458   }
0459 protected:
0460   iro* m_obj;
0461 protected:
0462   std::string fClassName; //Class name of referenced object
0463   int fClassVersion;  //Version number of class
0464   int fID;            //element serial number in fInfo
0465   int fType;          //branch type
0466   int fStreamerType;  //branch streamer type
0467   branch_element* fBranchCount;  // pointer to primary branchcount branch
0468   bool fBranchCount_created;
0469   branch_element* fBranchCount2; // pointer to secondary branchcount branch
0470   bool fBranchCount2_created;
0471   int fNdata;         // Number of data in this branch
0472 };
0473 
0474 }}
0475 
0476 #endif
0477