Gaudi Framework, version v23r0

Home   Generated: Mon Jan 30 2012

RootDataConnection.h

Go to the documentation of this file.
00001 // $Id: RootDataConnection.h,v 1.9 2010-09-17 09:00:12 frankb Exp $
00002 #ifndef GAUDIROOT_ROOTDATACONNECTION_H
00003 #define GAUDIROOT_ROOTDATACONNECTION_H
00004 
00005 // Framework include files
00006 #include "GaudiKernel/ClassID.h"
00007 #include "GaudiUtils/IIODataManager.h"
00008 #include <string>
00009 #include <vector>
00010 #include <map>
00011 #include <set>
00012 
00013 #include "TFile.h"
00014 #include "RootCnv/RootRefs.h"
00015 
00016 // Forward declarations
00017 class TTree;
00018 class TClass;
00019 class TBranch;
00020 class TTreePerfStats;
00021 
00022 class MsgStream;
00023 class IRegistry;
00024 class DataObject;
00025 
00026 /*
00027  *  Gaudi namespace declaration
00028  */
00029 namespace Gaudi  {
00030 
00041   class GAUDI_API RootConnectionSetup {
00042   public:
00044     typedef std::vector<std::string> StringVec;
00045   protected:
00047     virtual ~RootConnectionSetup();
00049     int refCount;
00051     MsgStream* m_msgSvc;
00052 
00053   public:
00055     StringVec    cacheBranches;
00057     StringVec    vetoBranches;
00059     std::string  loadSection;
00061     int          cacheSize;
00063     int          learnEntries;
00065     int          autoFlush;
00067     int          basketSize;
00068 
00070     RootConnectionSetup();
00072     void addRef();
00074     void release();
00076     void setMessageSvc(MsgStream* m);
00078     MsgStream& msgSvc() const {  return *m_msgSvc; }
00079   };
00080 
00089   class GAUDI_API RootDataConnection : virtual public Gaudi::IDataConnection  {
00090   public:
00091 
00102     struct ContainerSection {
00104       ContainerSection() : start(-1), length(0) {}
00106       ContainerSection(int s, int l) : start(s), length(l) {}
00108       ContainerSection(const ContainerSection& s) : start(s.start), length(s.length) {}
00110       ContainerSection& operator=(const ContainerSection& s) { start=s.start;length=s.length; return *this;}
00112       int start;
00114       int length;
00115     };
00116 
00118     typedef std::vector<std::string>                                 StringVec;
00120     typedef std::vector<std::pair<std::string,std::string> >         ParamMap;
00122     typedef std::map<std::string,TTree*>                             Sections;
00124     typedef std::vector<ContainerSection>                            ContainerSections;
00126     typedef std::map<std::string,ContainerSections>                  MergeSections;
00128     typedef std::vector<RootRef>                                     LinkSections;
00130     typedef std::set<const IInterface*>                              Clients;
00131 
00133     MsgStream& msgSvc() const {  return m_setup->msgSvc(); }
00134 
00135 
00136   protected:
00138     RootConnectionSetup* m_setup;
00140     TTreePerfStats*      m_statistics;
00142     TFile*               m_file;
00144     TTree               *m_refs;
00146     Sections             m_sections;
00148     StringVec            m_dbs;
00150     StringVec            m_conts;
00152     StringVec            m_links;
00154     StringVec            m_mergeFIDs;
00156     ParamMap             m_params;
00158     MergeSections        m_mergeSects;
00160     LinkSections         m_linkSects;
00162     Clients              m_clients;
00164     std::string          m_empty;
00165 
00167     const std::string& empty() const;
00168 
00170     StatusCode saveRefs();
00171 
00172   public:
00182     class Tool {
00183     protected:
00184       typedef RootDataConnection::StringVec          StringVec;
00185       typedef RootDataConnection::ParamMap           ParamMap;
00186       typedef RootDataConnection::Sections           Sections;
00187       typedef RootDataConnection::MergeSections      MergeSections;
00188       typedef RootDataConnection::LinkSections       LinkSections;
00189       typedef RootDataConnection::ContainerSection   ContainerSection;
00190       typedef RootDataConnection::ContainerSections  ContainerSections;
00191 
00193       RootDataConnection* c;
00194     public:
00195       TTree*             refs()               const { return c->m_refs;       }
00196       StringVec&         dbs()                const { return c->m_dbs;        }
00197       StringVec&         conts()              const { return c->m_conts;      }
00198       StringVec&         links()              const { return c->m_links;      }
00199       ParamMap&          params()             const { return c->m_params;     }
00200       MsgStream&         msgSvc()             const { return c->msgSvc();     }
00201       const std::string& name()               const { return c->m_name;       }
00202       Sections&          sections()           const { return c->m_sections;   }
00203       LinkSections&      linkSections()       const { return c->m_linkSects;  }
00204       MergeSections&     mergeSections()      const { return c->m_mergeSects; }
00205 
00207       virtual ~Tool() {}
00209       virtual void release() { delete this; }
00211       virtual TBranch* getBranch(const std::string&  section, const std::string& n) = 0;
00213       virtual RootRef poolRef(size_t /* which */) const { return RootRef(); }
00214         
00216       virtual StatusCode readRefs() = 0;
00218       virtual StatusCode saveRefs() = 0;
00220       virtual int loadRefs(const std::string& section, const std::string& cnt, unsigned long entry, RootObjectRefs& refs) = 0;
00221     } *m_tool;
00222     friend class Tool;
00223 
00225     Tool* makeTool();
00226 
00227   public:
00228 
00230     RootDataConnection(const IInterface* own, const std::string& nam, RootConnectionSetup* setup);
00232     virtual ~RootDataConnection();
00233 
00235     TFile* file() const                         {  return m_file;                              }
00237     virtual bool isConnected() const            {  return m_file != 0;                         }
00239     bool isWritable() const                     {  return m_file != 0 && m_file->IsWritable(); }
00241     Tool* tool() const                          {  return m_tool;                              }
00243     const MergeSections& mergeSections() const  {  return m_mergeSects;                        }
00245     const StringVec& mergeFIDs() const          {  return m_mergeFIDs;                         }
00246 
00247 
00249     void addClient(const IInterface* client);
00251     size_t removeClient(const IInterface* client);
00253     bool lookupClient(const IInterface* client) const;
00254 
00256     std::pair<const RootRef*,const ContainerSection*>  getMergeSection(const std::string& container, int entry) const;
00257 
00259     void enableStatistics(const std::string& section);
00261     void saveStatistics(const std::string& statisticsFile);
00262 
00264     int loadObj(const std::string& section, const std::string& cnt, unsigned long entry, DataObject*& pObj);
00265 
00267     int loadRefs(const std::string& section, const std::string& cnt, unsigned long entry, RootObjectRefs& refs)
00268     { return m_tool->loadRefs(section,cnt,entry,refs); }
00269 
00271     std::pair<int,unsigned long> saveObj(const std::string& section,const std::string& cnt, TClass* cl, DataObject* pObj,bool fill_missing=false);
00273     std::pair<int,unsigned long> save(const std::string& section,const std::string& cnt, TClass* cl, void* pObj,bool fill_missing=false);
00274 
00275 
00277     virtual StatusCode connectRead();
00279     virtual StatusCode connectWrite(IoType typ);
00281     virtual StatusCode disconnect();
00283     virtual StatusCode read(void* const, size_t)   { return StatusCode::FAILURE; }
00285     virtual StatusCode write(const void*, int)     { return StatusCode::FAILURE; }
00287     virtual long long int seek(long long int, int) { return -1; }
00288 
00290     TTree* getSection(const std::string& sect, bool create=false);
00291 
00293     TBranch* getBranch(const std::string& section,const std::string& branch_name) 
00294     { return m_tool->getBranch(section,branch_name); }
00296     TBranch* getBranch(const std::string& section, const std::string& branch_name, TClass* cl, void* ptr);
00297 
00299     void makeRef(IRegistry* pA, RootRef& ref);
00301     void makeRef(const std::string& name, long clid, int tech, const std::string& db, const std::string& cnt, int entry, RootRef& ref);
00302 
00304     int makeLink(const std::string& p);
00305 
00307     const std::string& getDb(int which) const;
00308     
00310     const std::string& getCont(int which) const 
00311       { return (which>=0)&&(size_t(which)<m_conts.size()) ? *(m_conts.begin()+which) : empty();    }
00312     
00314     const std::string& getLink(int which) const 
00315       { return (which>=0)&&(size_t(which)<m_links.size()) ? *(m_links.begin()+which) : empty();    }
00316   };
00317 }         // End namespace Gaudi
00318 #endif    // GAUDIROOT_ROOTDATACONNECTION_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Mon Jan 30 2012 13:53:04 for Gaudi Framework, version v23r0 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004