Go to the documentation of this file.00001 #ifndef IOPool_Input_RootTree_h
00002 #define IOPool_Input_RootTree_h
00003
00004
00005
00006
00007
00008
00009
00010 #include "DataFormats/Provenance/interface/ConstBranchDescription.h"
00011 #include "DataFormats/Provenance/interface/ProvenanceFwd.h"
00012 #include "FWCore/Framework/interface/Frameworkfwd.h"
00013
00014 #include "Rtypes.h"
00015 #include "TBranch.h"
00016
00017 #include <map>
00018 #include <memory>
00019 #include <string>
00020 #include <vector>
00021
00022 class TBranch;
00023 class TClass;
00024 class TTree;
00025 class TTreeCache;
00026
00027 namespace edm {
00028 struct BranchKey;
00029 class DelayedReader;
00030 class InputFile;
00031 class RootTree;
00032
00033 namespace roottree {
00034 unsigned int const defaultCacheSize = 20U * 1024 * 1024;
00035 unsigned int const defaultNonEventCacheSize = 1U * 1024 * 1024;
00036 unsigned int const defaultLearningEntries = 20U;
00037 unsigned int const defaultNonEventLearningEntries = 1U;
00038 typedef Long64_t EntryNumber;
00039 struct BranchInfo {
00040 BranchInfo(ConstBranchDescription const& prod) :
00041 branchDescription_(prod),
00042 productBranch_(0),
00043 provenanceBranch_(0),
00044 classCache_(0) {}
00045 ConstBranchDescription branchDescription_;
00046 TBranch* productBranch_;
00047 TBranch* provenanceBranch_;
00048 mutable TClass* classCache_;
00049 };
00050 typedef std::map<BranchKey const, BranchInfo> BranchMap;
00051 Int_t getEntry(TBranch* branch, EntryNumber entryNumber);
00052 Int_t getEntry(TTree* tree, EntryNumber entryNumber);
00053 std::unique_ptr<TTreeCache> trainCache(TTree* tree, InputFile& file, unsigned int cacheSize, char const* branchNames);
00054 }
00055
00056 class RootTree {
00057 public:
00058 typedef roottree::BranchMap BranchMap;
00059 typedef roottree::EntryNumber EntryNumber;
00060 RootTree(boost::shared_ptr<InputFile> filePtr,
00061 BranchType const& branchType,
00062 unsigned int maxVirtualSize,
00063 unsigned int cacheSize,
00064 unsigned int learningEntries);
00065 ~RootTree();
00066
00067 RootTree(RootTree const&) = delete;
00068 RootTree& operator=(RootTree const&) = delete;
00069
00070 bool isValid() const;
00071 void addBranch(BranchKey const& key,
00072 BranchDescription const& prod,
00073 std::string const& oldBranchName);
00074 void dropBranch(std::string const& oldBranchName);
00075 void getEntry(TBranch *branch, EntryNumber entry) const;
00076 void setPresence(BranchDescription const& prod,
00077 std::string const& oldBranchName);
00078
00079 bool next() {return ++entryNumber_ < entries_;}
00080 bool previous() {return --entryNumber_ >= 0;}
00081 bool current() {return entryNumber_ < entries_ && entryNumber_ >= 0;}
00082 void rewind() {entryNumber_ = 0;}
00083 void close();
00084 EntryNumber const& entryNumber() const {return entryNumber_;}
00085 EntryNumber const& entries() const {return entries_;}
00086 void setEntryNumber(EntryNumber theEntryNumber);
00087 std::vector<std::string> const& branchNames() const {return branchNames_;}
00088 DelayedReader* rootDelayedReader() const;
00089 template <typename T>
00090 void fillAux(T*& pAux) {
00091 auxBranch_->SetAddress(&pAux);
00092 getEntry(auxBranch_, entryNumber_);
00093 }
00094 template <typename T>
00095 void fillBranchEntryMeta(TBranch* branch, T*& pbuf) {
00096 if (metaTree_ != 0) {
00097
00098 branch->SetAddress(&pbuf);
00099 roottree::getEntry(branch, entryNumber_);
00100 } else {
00101 fillBranchEntry<T>(branch, pbuf);
00102 }
00103 }
00104
00105 template <typename T>
00106 void fillBranchEntry(TBranch* branch, T*& pbuf) {
00107 branch->SetAddress(&pbuf);
00108 getEntry(branch, entryNumber_);
00109 }
00110
00111 TTree const* tree() const {return tree_;}
00112 TTree* tree() {return tree_;}
00113 TTree const* metaTree() const {return metaTree_;}
00114 BranchMap const& branches() const;
00115
00116
00117 TBranch* branchEntryInfoBranch() const {return branchEntryInfoBranch_;}
00118
00119 void trainCache(char const* branchNames);
00120 void resetTraining() {trainNow_ = true;}
00121
00122 BranchType branchType() const {return branchType_;}
00123 private:
00124 void setCacheSize(unsigned int cacheSize);
00125 void setTreeMaxVirtualSize(int treeMaxVirtualSize);
00126 void startTraining();
00127 void stopTraining();
00128
00129 boost::shared_ptr<InputFile> filePtr_;
00130
00131
00132
00133 TTree* tree_;
00134 TTree* metaTree_;
00135 BranchType branchType_;
00136 TBranch* auxBranch_;
00137
00138
00139
00140 boost::shared_ptr<TTreeCache> treeCache_;
00141 boost::shared_ptr<TTreeCache> rawTreeCache_;
00142 EntryNumber entries_;
00143 EntryNumber entryNumber_;
00144 std::vector<std::string> branchNames_;
00145 boost::shared_ptr<BranchMap> branches_;
00146 bool trainNow_;
00147 EntryNumber switchOverEntry_;
00148 unsigned int learningEntries_;
00149 unsigned int cacheSize_;
00150 std::unique_ptr<DelayedReader> rootDelayedReader_;
00151
00152 TBranch* branchEntryInfoBranch_;
00153
00154 TTree* infoTree_;
00155 TBranch* statusBranch_;
00156 };
00157 }
00158 #endif