CMS 3D CMS Logo

List of all members | Public Member Functions | Static Public Member Functions | Static Private Member Functions | Private Attributes
edm::RootOutputTree Class Reference

#include <RootOutputTree.h>

Public Member Functions

template<typename T >
void addAuxiliary (std::string const &branchName, T const *&pAux, int bufSize, bool allowCloning=true)
 
template<typename T >
void addAuxiliary (std::string const &branchName, T *&pAux, int bufSize, bool allowCloning=true)
 
void addBranch (std::string const &branchName, std::string const &className, void const *&pProd, int splitLevel, int basketSize, bool produced)
 
bool checkEntriesInReadBranches (Long64_t expectedNumberOfEntries) const
 
bool checkIfFastClonable (TTree *inputTree) const
 
bool checkSplitLevelsAndBasketSizes (TTree *inputTree) const
 
void close ()
 
void fastCloneTTree (TTree *in, std::string const &option)
 
void fillTree ()
 
bool isValid () const
 
void maybeFastCloneTree (bool canFastClone, bool canFastCloneAux, TTree *tree, std::string const &option)
 
RootOutputTreeoperator= (RootOutputTree const &)=delete
 
void optimizeBaskets (ULong64_t size)
 
 RootOutputTree (std::shared_ptr< TFile > filePtr, BranchType const &branchType, int splitLevel, int treeMaxVirtualSize)
 
 RootOutputTree (RootOutputTree const &)=delete
 
void setAutoFlush (Long64_t size)
 
void setEntries ()
 
TTree const * tree () const
 
TTree * tree ()
 
bool uncloned (std::string const &branchName) const
 
void writeTree ()
 
 ~RootOutputTree ()
 

Static Public Member Functions

static TTree * assignTTree (TFile *file, TTree *tree)
 
static TTree * makeTTree (TFile *filePtr, std::string const &name, int splitLevel)
 
static void writeTTree (TTree *tree)
 

Static Private Member Functions

static void fillTTree (std::vector< TBranch * > const &branches)
 

Private Attributes

std::vector< TBranch * > auxBranches_
 
std::set< std::string > clonedReadBranchNames_
 
bool currentlyFastCloning_
 
bool fastCloneAuxBranches_
 
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
 
std::vector< TBranch * > producedBranches_
 
std::vector< TBranch * > readBranches_
 
edm::propagate_const< TTree * > tree_
 
std::vector< TBranch * > unclonedAuxBranches_
 
std::vector< TBranch * > unclonedReadBranches_
 

Detailed Description

Definition at line 24 of file RootOutputTree.h.

Constructor & Destructor Documentation

edm::RootOutputTree::RootOutputTree ( std::shared_ptr< TFile >  filePtr,
BranchType const &  branchType,
int  splitLevel,
int  treeMaxVirtualSize 
)

Definition at line 87 of file RootOutputTree.cc.

References tree_.

Referenced by ~RootOutputTree().

91  :
92  filePtr_(filePtr),
95  readBranches_(),
96  auxBranches_(),
100  fastCloneAuxBranches_(false) {
101 
102  if(treeMaxVirtualSize >= 0) tree_->SetMaxVirtualSize(treeMaxVirtualSize);
103  }
std::set< std::string > clonedReadBranchNames_
edm::propagate_const< TTree * > tree_
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
std::vector< TBranch * > producedBranches_
std::vector< TBranch * > auxBranches_
std::vector< TBranch * > unclonedReadBranches_
std::string const & BranchTypeToProductTreeName(BranchType const &branchType)
Definition: BranchType.cc:103
static TTree * makeTTree(TFile *filePtr, std::string const &name, int splitLevel)
std::vector< TBranch * > readBranches_
def branchType(schema, name)
Definition: revisionDML.py:112
edm::RootOutputTree::~RootOutputTree ( )
inline

Definition at line 31 of file RootOutputTree.h.

References operator=(), and RootOutputTree().

31 {}
edm::RootOutputTree::RootOutputTree ( RootOutputTree const &  )
delete

Member Function Documentation

template<typename T >
void edm::RootOutputTree::addAuxiliary ( std::string const &  branchName,
T const *&  pAux,
int  bufSize,
bool  allowCloning = true 
)
inline

Definition at line 38 of file RootOutputTree.h.

References auxBranches_, edm::bufSize, tree_, and unclonedAuxBranches_.

Referenced by edm::RootOutputFile::RootOutputFile().

38  {
39  if(allowCloning) {
40  auxBranches_.push_back(tree_->Branch(branchName.c_str(), &pAux, bufSize, 0));
41  } else {
42  unclonedAuxBranches_.push_back(tree_->Branch(branchName.c_str(), &pAux, bufSize, 0));
43  }
44  }
edm::propagate_const< TTree * > tree_
std::vector< TBranch * > unclonedAuxBranches_
static int const bufSize
Definition: Guid.cc:24
std::vector< TBranch * > auxBranches_
template<typename T >
void edm::RootOutputTree::addAuxiliary ( std::string const &  branchName,
T *&  pAux,
int  bufSize,
bool  allowCloning = true 
)
inline

Definition at line 48 of file RootOutputTree.h.

References addBranch(), assignTTree(), auxBranches_, edm::bufSize, checkEntriesInReadBranches(), checkIfFastClonable(), checkSplitLevelsAndBasketSizes(), className(), fastCloneTTree(), FrontierConditions_GlobalTag_cff::file, fillTree(), recoMuon::in, isValid(), makeTTree(), maybeFastCloneTree(), dataset::name, TSGForRoadSearch_cfi::option, edm::es::produced, AlCaHLTBitMon_QueryRunRegistry::string, tree_, unclonedAuxBranches_, writeTree(), and writeTTree().

48  {
49  if(allowCloning) {
50  auxBranches_.push_back(tree_->Branch(branchName.c_str(), &pAux, bufSize, 0));
51  } else {
52  unclonedAuxBranches_.push_back(tree_->Branch(branchName.c_str(), &pAux, bufSize, 0));
53  }
54  }
edm::propagate_const< TTree * > tree_
std::vector< TBranch * > unclonedAuxBranches_
static int const bufSize
Definition: Guid.cc:24
std::vector< TBranch * > auxBranches_
void edm::RootOutputTree::addBranch ( std::string const &  branchName,
std::string const &  className,
void const *&  pProd,
int  splitLevel,
int  basketSize,
bool  produced 
)

Definition at line 325 of file RootOutputTree.cc.

References edm::BranchDescription::invalidBasketSize, edm::BranchDescription::invalidSplitLevel, producedBranches_, readBranches_, JustL1Validation_cff::splitLevel, and tree_.

Referenced by addAuxiliary(), and edm::RootOutputFile::RootOutputFile().

330  {
332  assert(basketSize != BranchDescription::invalidBasketSize);
333  TBranch* branch = tree_->Branch(branchName.c_str(),
334  className.c_str(),
335  &pProd,
336  basketSize,
337  splitLevel);
338  assert(branch != nullptr);
339 /*
340  if(pProd != nullptr) {
341  // Delete the product that ROOT has allocated.
342  WrapperBase const* edp = static_cast<WrapperBase const *>(pProd);
343  delete edp;
344  pProd = nullptr;
345  }
346 */
347  if(produced) {
348  producedBranches_.push_back(branch);
349  } else {
350  readBranches_.push_back(branch);
351  }
352  }
edm::propagate_const< TTree * > tree_
static int const invalidSplitLevel
static int const invalidBasketSize
std::vector< TBranch * > producedBranches_
std::vector< TBranch * > readBranches_
const eventsetup::produce::Produce produced
Definition: ESProducts.cc:20
std::string className(const T &t)
Definition: ClassName.h:30
TTree * edm::RootOutputTree::assignTTree ( TFile *  file,
TTree *  tree 
)
static

Definition at line 106 of file RootOutputTree.cc.

References hpstanc_transforms::max, and tree().

Referenced by addAuxiliary(), and makeTTree().

106  {
107  tree->SetDirectory(filePtr);
108  // Turn off autosaving because it is such a memory hog and we are not using
109  // this check-pointing feature anyway.
111  return tree;
112  }
TTree const * tree() const
Definition: tree.py:1
bool edm::RootOutputTree::checkEntriesInReadBranches ( Long64_t  expectedNumberOfEntries) const

Definition at line 198 of file RootOutputTree.cc.

References readBranches_.

Referenced by addAuxiliary(), and edm::RootOutputFile::writeIndexIntoFile().

198  {
199  for(auto const& readBranch : readBranches_) {
200  if(readBranch->GetEntries() != expectedNumberOfEntries) {
201  return false;
202  }
203  }
204  return true;
205  }
std::vector< TBranch * > readBranches_
bool edm::RootOutputTree::checkIfFastClonable ( TTree *  inputTree) const

Definition at line 176 of file RootOutputTree.cc.

References readBranches_.

Referenced by addAuxiliary(), and edm::RootOutputFile::beginInputFile().

176  {
177 
178  if(inputTree == nullptr) return false;
179 
180  // Do the sub-branches match in the input and output. Extra sub-branches in the input are OK for fast cloning, but not in the output.
181  for(auto const& outputBr : readBranches_) {
182  TBranchElement* outputBranch = dynamic_cast<TBranchElement*>(outputBr);
183  if(outputBranch != nullptr) {
184  TBranchElement* inputBranch = dynamic_cast<TBranchElement*>(inputTree->GetBranch(outputBranch->GetName()));
185  if(inputBranch != nullptr) {
186  // We have a matching top level branch. Do the recursive check on subbranches.
187  if(!checkMatchingBranches(inputBranch, outputBranch)) {
188  LogInfo("FastCloning")
189  << "Fast Cloning disabled because a data member has been added to split branch: " << inputBranch->GetName() << "\n.";
190  return false;
191  }
192  }
193  }
194  }
195  return true;
196  }
std::vector< TBranch * > readBranches_
bool edm::RootOutputTree::checkSplitLevelsAndBasketSizes ( TTree *  inputTree) const

Definition at line 127 of file RootOutputTree.cc.

References MuonAssociatorByHits_cfi::obj, and readBranches_.

Referenced by addAuxiliary(), and edm::RootOutputFile::beginInputFile().

127  {
128 
129  assert(inputTree != nullptr);
130 
131  // Do the split level and basket size match in the input and output?
132  for(auto const& outputBranch : readBranches_) {
133  if(outputBranch != nullptr) {
134  TBranch* inputBranch = inputTree->GetBranch(outputBranch->GetName());
135 
136  if(inputBranch != nullptr) {
137  if(inputBranch->GetSplitLevel() != outputBranch->GetSplitLevel() ||
138  inputBranch->GetBasketSize() != outputBranch->GetBasketSize()) {
139  return false;
140  }
141  }
142  }
143  }
144  return true;
145  }
std::vector< TBranch * > readBranches_
void edm::RootOutputTree::close ( void  )

Definition at line 355 of file RootOutputTree.cc.

References auxBranches_, filePtr_, producedBranches_, readBranches_, tree_, unclonedAuxBranches_, and unclonedReadBranches_.

Referenced by lumiQTWidget.ApplicationWindow::fileQuit(), esMonitoring.AsyncLineReaderMixin::handle_close(), esMonitoring.FDJsonServer::handle_close(), Vispa.Gui.BoxContentDialog.BoxContentDialog::keyPressEvent(), Vispa.Gui.FindDialog.FindDialog::keyPressEvent(), and uncloned().

355  {
356  // The TFile was just closed.
357  // Just to play it safe, zero all pointers to quantities in the file.
358  auxBranches_.clear();
359  unclonedAuxBranches_.clear();
360  producedBranches_.clear();
361  readBranches_.clear();
362  unclonedReadBranches_.clear();
363  tree_ = nullptr; // propagate_const<T> has no reset() function
364  filePtr_ = nullptr; // propagate_const<T> has no reset() function
365  }
edm::propagate_const< TTree * > tree_
std::vector< TBranch * > unclonedAuxBranches_
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
std::vector< TBranch * > producedBranches_
std::vector< TBranch * > auxBranches_
std::vector< TBranch * > unclonedReadBranches_
std::vector< TBranch * > readBranches_
void edm::RootOutputTree::fastCloneTTree ( TTree *  in,
std::string const &  option 
)

Definition at line 208 of file RootOutputTree.cc.

References auxBranches_, Exception, fastCloneAuxBranches_, edm::errors::FatalRootError, plotBeamSpotDB::last, edm::DuplicateTreeSentry::tree(), tree_, and unclonedAuxBranches_.

Referenced by addAuxiliary(), and maybeFastCloneTree().

208  {
209  if(in->GetEntries() != 0) {
210  TObjArray* branches = tree_->GetListOfBranches();
211  // If any products were produced (not just event products), the EventAuxiliary will be modified.
212  // In that case, don't fast copy auxiliary branches. Remove them, and add back after fast copying.
213  std::map<Int_t, TBranch *> auxIndexes;
214  bool mustRemoveSomeAuxs = false;
215  if(!fastCloneAuxBranches_) {
216  for(auto const& auxBranch : auxBranches_) {
217  int auxIndex = branches->IndexOf(auxBranch);
218  assert (auxIndex >= 0);
219  auxIndexes.insert(std::make_pair(auxIndex, auxBranch));
220  branches->RemoveAt(auxIndex);
221  }
222  mustRemoveSomeAuxs = true;
223  }
224 
225  //Deal with any aux branches which can never be cloned
226  for(auto const& auxBranch : unclonedAuxBranches_) {
227  int auxIndex = branches->IndexOf(auxBranch);
228  assert (auxIndex >= 0);
229  auxIndexes.insert(std::make_pair(auxIndex, auxBranch));
230  branches->RemoveAt(auxIndex);
231  mustRemoveSomeAuxs = true;
232  }
233 
234  if(mustRemoveSomeAuxs) {
235  branches->Compress();
236  }
237 
238  DuplicateTreeSentry dupTree(in);
239  TTreeCloner cloner(dupTree.tree(), tree_, option.c_str(), TTreeCloner::kNoWarnings|TTreeCloner::kIgnoreMissingTopLevel);
240 
241  if(!cloner.IsValid()) {
242  // Let's check why
243  static const char* okerror = "One of the export branch";
244  if(strncmp(cloner.GetWarning(), okerror, strlen(okerror)) == 0) {
245  // That's fine we will handle it;
246  } else {
248  << "invalid TTreeCloner (" << cloner.GetWarning() << ")\n";
249  }
250  }
251  tree_->SetEntries(tree_->GetEntries() + in->GetEntries());
252  Service<RootHandlers> rootHandler;
253  rootHandler->ignoreWarningsWhileDoing([&cloner] { cloner.Exec(); });
254 
255  if(mustRemoveSomeAuxs) {
256  for(auto const& auxIndex : auxIndexes) {
257  // Add the auxiliary branches back after fast copying the rest of the tree.
258  Int_t last = branches->GetLast();
259  if(last >= 0) {
260  branches->AddAtAndExpand(branches->At(last), last+1);
261  for(Int_t ind = last-1; ind >= auxIndex.first; --ind) {
262  branches->AddAt(branches->At(ind), ind+1);
263  };
264  branches->AddAt(auxIndex.second, auxIndex.first);
265  } else {
266  branches->Add(auxIndex.second);
267  }
268  }
269  }
270  }
271  }
edm::propagate_const< TTree * > tree_
std::vector< TBranch * > unclonedAuxBranches_
std::vector< TBranch * > auxBranches_
void edm::RootOutputTree::fillTree ( )

Definition at line 313 of file RootOutputTree.cc.

References auxBranches_, currentlyFastCloning_, fastCloneAuxBranches_, fillTTree(), producedBranches_, tree_, unclonedAuxBranches_, and unclonedReadBranches_.

Referenced by addAuxiliary(), and core.AutoFillTreeProducer.AutoFillTreeProducer::process().

313  {
319  } else {
320  tree_->Fill();
321  }
322  }
edm::propagate_const< TTree * > tree_
static void fillTTree(std::vector< TBranch * > const &branches)
std::vector< TBranch * > unclonedAuxBranches_
std::vector< TBranch * > producedBranches_
std::vector< TBranch * > auxBranches_
std::vector< TBranch * > unclonedReadBranches_
void edm::RootOutputTree::fillTTree ( std::vector< TBranch * > const &  branches)
staticprivate

Definition at line 283 of file RootOutputTree.cc.

References HcalObjRepresent::Fill(), and edm::for_all().

Referenced by fillTree(), and setAutoFlush().

283  {
284  for_all(branches, std::bind(&TBranch::Fill, std::placeholders::_1));
285  }
Func for_all(ForwardSequence &s, Func f)
wrapper for std::for_each
Definition: Algorithms.h:16
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
bool edm::RootOutputTree::isValid ( ) const
TTree * edm::RootOutputTree::makeTTree ( TFile *  filePtr,
std::string const &  name,
int  splitLevel 
)
static

Definition at line 115 of file RootOutputTree.cc.

References assignTTree(), Exception, edm::errors::FatalRootError, and JustL1Validation_cff::splitLevel.

Referenced by addAuxiliary(), and edm::RootOutputFile::RootOutputFile().

115  {
116  TTree* tree = new TTree(name.c_str(), "", splitLevel);
117  if(!tree) throw edm::Exception(errors::FatalRootError)
118  << "Failed to create the tree: " << name << "\n";
119  if(tree->IsZombie())
121  << "Tree: " << name << " is a zombie." << "\n";
122 
123  return assignTTree(filePtr, tree);
124  }
static TTree * assignTTree(TFile *file, TTree *tree)
Definition: tree.py:1
void edm::RootOutputTree::maybeFastCloneTree ( bool  canFastClone,
bool  canFastCloneAux,
TTree *  tree,
std::string const &  option 
)

Definition at line 293 of file RootOutputTree.cc.

References clonedReadBranchNames_, currentlyFastCloning_, fastCloneAuxBranches_, fastCloneTTree(), readBranches_, AlCaHLTBitMon_QueryRunRegistry::string, tree_, and unclonedReadBranches_.

Referenced by addAuxiliary(), and edm::RootOutputFile::beginInputFile().

293  {
294  unclonedReadBranches_.clear();
295  clonedReadBranchNames_.clear();
296  currentlyFastCloning_ = canFastClone && !readBranches_.empty();
298  fastCloneAuxBranches_ = canFastCloneAux;
300  for(auto const& branch : readBranches_) {
301  if(branch->GetEntries() == tree_->GetEntries()) {
302  clonedReadBranchNames_.insert(std::string(branch->GetName()));
303  } else {
304  unclonedReadBranches_.push_back(branch);
305  }
306  }
307  Service<JobReport> reportSvc;
308  reportSvc->reportFastClonedBranches(clonedReadBranchNames_, tree_->GetEntries());
309  }
310  }
std::set< std::string > clonedReadBranchNames_
edm::propagate_const< TTree * > tree_
std::vector< TBranch * > unclonedReadBranches_
std::vector< TBranch * > readBranches_
Definition: tree.py:1
void fastCloneTTree(TTree *in, std::string const &option)
RootOutputTree& edm::RootOutputTree::operator= ( RootOutputTree const &  )
delete

Referenced by ~RootOutputTree().

void edm::RootOutputTree::optimizeBaskets ( ULong64_t  size)
inline

Definition at line 104 of file RootOutputTree.h.

References tree_.

Referenced by edm::RootOutputFile::writeLuminosityBlock(), and edm::RootOutputFile::writeRun().

104  {
105  tree_->OptimizeBaskets(size);
106  }
size
Write out results.
edm::propagate_const< TTree * > tree_
void edm::RootOutputTree::setAutoFlush ( Long64_t  size)
inline

Definition at line 108 of file RootOutputTree.h.

References fillTTree(), and tree_.

Referenced by edm::RootOutputFile::RootOutputFile().

108  {
109  tree_->SetAutoFlush(size);
110  }
size
Write out results.
edm::propagate_const< TTree * > tree_
void edm::RootOutputTree::setEntries ( )
inline

Definition at line 93 of file RootOutputTree.h.

References tree_.

Referenced by edm::RootOutputFile::respondToCloseInputFile().

93  {
94  if(tree_->GetNbranches() != 0) tree_->SetEntries(-1);
95  }
edm::propagate_const< TTree * > tree_
TTree const* edm::RootOutputTree::tree ( ) const
inline
TTree* edm::RootOutputTree::tree ( )
inline
bool edm::RootOutputTree::uncloned ( std::string const &  branchName) const
inline

Definition at line 98 of file RootOutputTree.h.

References clonedReadBranchNames_, and close().

98  {
99  return clonedReadBranchNames_.find(branchName) == clonedReadBranchNames_.end();
100  }
std::set< std::string > clonedReadBranchNames_
void edm::RootOutputTree::writeTree ( )

Definition at line 288 of file RootOutputTree.cc.

References tree(), and writeTTree().

Referenced by addAuxiliary().

288  {
289  writeTTree(tree());
290  }
TTree const * tree() const
static void writeTTree(TTree *tree)
void edm::RootOutputTree::writeTTree ( TTree *  tree)
static

Definition at line 274 of file RootOutputTree.cc.

References edm::setRefCoreStreamer().

Referenced by addAuxiliary(), edm::RootOutputFile::finishEndFile(), and writeTree().

274  {
275  if(tree->GetNbranches() != 0) {
276  tree->SetEntries(-1);
277  }
278  setRefCoreStreamer(true);
279  tree->AutoSave("FlushBaskets");
280  }
void setRefCoreStreamer(bool resetAll=false)
Definition: tree.py:1

Member Data Documentation

std::vector<TBranch*> edm::RootOutputTree::auxBranches_
private

Definition at line 121 of file RootOutputTree.h.

Referenced by addAuxiliary(), close(), fastCloneTTree(), and fillTree().

std::set<std::string> edm::RootOutputTree::clonedReadBranchNames_
private

Definition at line 125 of file RootOutputTree.h.

Referenced by maybeFastCloneTree(), and uncloned().

bool edm::RootOutputTree::currentlyFastCloning_
private

Definition at line 126 of file RootOutputTree.h.

Referenced by fillTree(), and maybeFastCloneTree().

bool edm::RootOutputTree::fastCloneAuxBranches_
private

Definition at line 127 of file RootOutputTree.h.

Referenced by fastCloneTTree(), fillTree(), and maybeFastCloneTree().

edm::propagate_const<std::shared_ptr<TFile> > edm::RootOutputTree::filePtr_
private

Definition at line 116 of file RootOutputTree.h.

Referenced by close().

std::vector<TBranch*> edm::RootOutputTree::producedBranches_
private

Definition at line 119 of file RootOutputTree.h.

Referenced by addBranch(), close(), and fillTree().

std::vector<TBranch*> edm::RootOutputTree::readBranches_
private
edm::propagate_const<TTree*> edm::RootOutputTree::tree_
private
std::vector<TBranch*> edm::RootOutputTree::unclonedAuxBranches_
private

Definition at line 122 of file RootOutputTree.h.

Referenced by addAuxiliary(), close(), fastCloneTTree(), and fillTree().

std::vector<TBranch*> edm::RootOutputTree::unclonedReadBranches_
private

Definition at line 123 of file RootOutputTree.h.

Referenced by close(), fillTree(), and maybeFastCloneTree().