CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
PoolOutputModule.cc
Go to the documentation of this file.
2 
4 
24 
25 #include "TTree.h"
26 #include "TBranchElement.h"
27 #include "TObjArray.h"
28 #include "RVersion.h"
29 
30 #include <fstream>
31 #include <iomanip>
32 #include <sstream>
33 #include "boost/algorithm/string.hpp"
34 
35 namespace edm {
37  : edm::one::OutputModuleBase::OutputModuleBase(pset),
38  one::OutputModule<WatchInputFiles>(pset),
39  rootServiceChecker_(),
40  auxItems_(),
41  selectedOutputItemList_(),
42  fileName_(pset.getUntrackedParameter<std::string>("fileName")),
43  logicalFileName_(pset.getUntrackedParameter<std::string>("logicalFileName")),
44  catalog_(pset.getUntrackedParameter<std::string>("catalog")),
45  maxFileSize_(pset.getUntrackedParameter<int>("maxSize")),
46  compressionLevel_(pset.getUntrackedParameter<int>("compressionLevel")),
47  compressionAlgorithm_(pset.getUntrackedParameter<std::string>("compressionAlgorithm")),
48  basketSize_(pset.getUntrackedParameter<int>("basketSize")),
49  eventAuxBasketSize_(pset.getUntrackedParameter<int>("eventAuxiliaryBasketSize")),
50  eventAutoFlushSize_(pset.getUntrackedParameter<int>("eventAutoFlushCompressedSize")),
51  splitLevel_(std::min<int>(pset.getUntrackedParameter<int>("splitLevel") + 1, 99)),
52  basketOrder_(pset.getUntrackedParameter<std::string>("sortBaskets")),
53  treeMaxVirtualSize_(pset.getUntrackedParameter<int>("treeMaxVirtualSize")),
54  whyNotFastClonable_(pset.getUntrackedParameter<bool>("fastCloning") ? FileBlock::CanFastClone
55  : FileBlock::DisabledInConfigFile),
56  dropMetaData_(DropNone),
57  moduleLabel_(pset.getParameter<std::string>("@module_label")),
58  initializedFromInput_(false),
59  outputFileCount_(0),
60  inputFileCount_(0),
61  branchParents_(),
62  branchChildren_(),
63  overrideInputFileSplitLevels_(pset.getUntrackedParameter<bool>("overrideInputFileSplitLevels")),
64  compactEventAuxiliary_(pset.getUntrackedParameter<bool>("compactEventAuxiliary")),
65  mergeJob_(pset.getUntrackedParameter<bool>("mergeJob")),
66  rootOutputFile_(),
67  statusFileName_() {
68  if (pset.getUntrackedParameter<bool>("writeStatusFile")) {
69  std::ostringstream statusfilename;
70  statusfilename << moduleLabel_ << '_' << getpid();
71  statusFileName_ = statusfilename.str();
72  }
73 
75  if (dropMetaData.empty())
77  else if (dropMetaData == std::string("NONE"))
79  else if (dropMetaData == std::string("DROPPED"))
81  else if (dropMetaData == std::string("PRIOR"))
83  else if (dropMetaData == std::string("ALL"))
85  else {
86  throw edm::Exception(errors::Configuration, "Illegal dropMetaData parameter value: ")
87  << dropMetaData << ".\n"
88  << "Legal values are 'NONE', 'DROPPED', 'PRIOR', and 'ALL'.\n";
89  }
90 
91  if (!wantAllEvents()) {
93  }
94 
95  auto const& specialSplit{pset.getUntrackedParameterSetVector("overrideBranchesSplitLevel")};
96 
97  specialSplitLevelForBranches_.reserve(specialSplit.size());
98  for (auto const& s : specialSplit) {
99  specialSplitLevelForBranches_.emplace_back(s.getUntrackedParameter<std::string>("branch"),
100  s.getUntrackedParameter<int>("splitLevel"));
101  }
102 
103  // We don't use this next parameter, but we read it anyway because it is part
104  // of the configuration of this module. An external parser creates the
105  // configuration by reading this source code.
106  pset.getUntrackedParameterSet("dataset");
107  }
108 
111  for (auto const& prod : reg->productList()) {
112  BranchDescription const& desc = prod.second;
113  if (desc.produced() && desc.branchType() == InEvent && !desc.isAlias()) {
114  producedBranches_.emplace_back(desc.branchID());
115  }
116  }
117  }
118 
119  std::string const& PoolOutputModule::currentFileName() const { return rootOutputFile_->fileName(); }
120 
121  PoolOutputModule::AuxItem::AuxItem() : basketSize_(BranchDescription::invalidBasketSize) {}
122 
124  EDGetToken const& token,
125  int splitLevel,
126  int basketSize)
127  : branchDescription_(bd), token_(token), product_(nullptr), splitLevel_(splitLevel), basketSize_(basketSize) {}
128 
129  PoolOutputModule::OutputItem::Sorter::Sorter(TTree* tree) : treeMap_(new std::map<std::string, int>) {
130  // Fill a map mapping branch names to an index specifying the order in the tree.
131  if (tree != nullptr) {
132  TObjArray* branches = tree->GetListOfBranches();
133  for (int i = 0; i < branches->GetEntries(); ++i) {
134  TBranchElement* br = (TBranchElement*)branches->At(i);
135  treeMap_->insert(std::make_pair(std::string(br->GetName()), i));
136  }
137  }
138  }
139 
141  // Provides a comparison for sorting branches according to the index values in treeMap_.
142  // Branches not found are always put at the end (i.e. not found > found).
143  if (treeMap_->empty())
144  return lh < rh;
145  std::string const& lstring = lh.branchDescription_->branchName();
146  std::string const& rstring = rh.branchDescription_->branchName();
147  std::map<std::string, int>::const_iterator lit = treeMap_->find(lstring);
148  std::map<std::string, int>::const_iterator rit = treeMap_->find(rstring);
149  bool lfound = (lit != treeMap_->end());
150  bool rfound = (rit != treeMap_->end());
151  if (lfound && rfound) {
152  return lit->second < rit->second;
153  } else if (lfound) {
154  return true;
155  } else if (rfound) {
156  return false;
157  }
158  return lh < rh;
159  }
160 
161  inline bool PoolOutputModule::SpecialSplitLevelForBranch::match(std::string const& iBranchName) const {
162  return std::regex_match(iBranchName, branch_);
163  }
164 
165  std::regex PoolOutputModule::SpecialSplitLevelForBranch::convert(std::string const& iGlobBranchExpression) const {
166  std::string tmp(iGlobBranchExpression);
167  boost::replace_all(tmp, "*", ".*");
168  boost::replace_all(tmp, "?", ".");
169  return std::regex(tmp);
170  }
171 
173  std::string const& processName,
174  TTree* theInputTree,
175  OutputItemList& outputItemList) {
176  SelectedProducts const& keptVector = keptProducts()[branchType];
177 
178  if (branchType != InProcess) {
179  AuxItem& auxItem = auxItems_[branchType];
180 
181  auto basketSize = (InEvent == branchType) ? eventAuxBasketSize_ : basketSize_;
182 
183  // Fill AuxItem
184  if (theInputTree != nullptr && !overrideInputFileSplitLevels_) {
185  TBranch* auxBranch = theInputTree->GetBranch(BranchTypeToAuxiliaryBranchName(branchType).c_str());
186  if (auxBranch) {
187  auxItem.basketSize_ = auxBranch->GetBasketSize();
188  } else {
189  auxItem.basketSize_ = basketSize;
190  }
191  } else {
192  auxItem.basketSize_ = basketSize;
193  }
194  }
195 
196  // Fill outputItemList with an entry for each branch.
197  for (auto const& kept : keptVector) {
200 
201  BranchDescription const& prod = *kept.first;
202  if (branchType == InProcess && processName != prod.processName()) {
203  continue;
204  }
205  TBranch* theBranch = ((!prod.produced() && theInputTree != nullptr && !overrideInputFileSplitLevels_)
206  ? theInputTree->GetBranch(prod.branchName().c_str())
207  : nullptr);
208 
209  if (theBranch != nullptr) {
210  splitLevel = theBranch->GetSplitLevel();
211  basketSize = theBranch->GetBasketSize();
212  } else {
213  splitLevel = (prod.splitLevel() == BranchDescription::invalidSplitLevel ? splitLevel_ : prod.splitLevel());
214  for (auto const& b : specialSplitLevelForBranches_) {
215  if (b.match(prod.branchName())) {
216  splitLevel = b.splitLevel_;
217  }
218  }
219  basketSize = (prod.basketSize() == BranchDescription::invalidBasketSize ? basketSize_ : prod.basketSize());
220  }
221  outputItemList.emplace_back(&prod, kept.second, splitLevel, basketSize);
222  }
223 
224  // Sort outputItemList to allow fast copying.
225  // The branches in outputItemList must be in the same order as in the input tree, with all new branches at the end.
226  sort_all(outputItemList, OutputItem::Sorter(theInputTree));
227  }
228 
230  if (isFileOpen()) {
231  //Faster to read ChildrenBranches directly from input
232  // file than to build it every event
233  auto const& branchToChildMap = fb.branchChildren().childLookup();
234  for (auto const& parentToChildren : branchToChildMap) {
235  for (auto const& child : parentToChildren.second) {
236  branchChildren_.insertChild(parentToChildren.first, child);
237  }
238  }
239  rootOutputFile_->beginInputFile(fb, remainingEvents());
240  }
241  }
242 
244  if (!isFileOpen()) {
245  reallyOpenFile();
246  beginInputFile(fb);
247  }
248  }
249 
251  if (!initializedFromInput_) {
252  std::vector<std::string> const& processesWithProcessBlockProducts =
254  unsigned int numberOfProcessesWithProcessBlockProducts = processesWithProcessBlockProducts.size();
255  unsigned int numberOfTTrees = numberOfRunLumiEventProductTrees + numberOfProcessesWithProcessBlockProducts;
256  selectedOutputItemList_.resize(numberOfTTrees);
257 
258  for (unsigned int i = InEvent; i < NumBranchTypes; ++i) {
259  BranchType branchType = static_cast<BranchType>(i);
260  if (branchType != InProcess) {
262  TTree* theInputTree =
263  (branchType == InEvent ? fb.tree() : (branchType == InLumi ? fb.lumiTree() : fb.runTree()));
264  OutputItemList& outputItemList = selectedOutputItemList_[branchType];
265  fillSelectedItemList(branchType, processName, theInputTree, outputItemList);
266  } else {
267  // Handle output items in ProcessBlocks
268  for (unsigned int k = InProcess; k < numberOfTTrees; ++k) {
269  OutputItemList& outputItemList = selectedOutputItemList_[k];
270  std::string const& processName = processesWithProcessBlockProducts[k - InProcess];
271  TTree* theInputTree = fb.processBlockTree(processName);
272  fillSelectedItemList(branchType, processName, theInputTree, outputItemList);
273  }
274  }
275  }
276  initializedFromInput_ = true;
277  }
278  ++inputFileCount_;
279  beginInputFile(fb);
280  }
281 
283  if (rootOutputFile_)
284  rootOutputFile_->respondToCloseInputFile(fb);
285  }
286 
288  processesWithSelectedMergeableRunProducts_.assign(processes.begin(), processes.end());
289  }
290 
292 
295  rootOutputFile_->writeOne(e);
296  if (!statusFileName_.empty()) {
297  std::ofstream statusFile(statusFileName_.c_str());
298  statusFile << e.id() << " time: " << std::setprecision(3) << TimeOfDay() << '\n';
299  statusFile.close();
300  }
301  }
302 
304  rootOutputFile_->writeLuminosityBlock(lb);
305  }
306 
308 
310 
314  branchParents_.clear();
315  startEndFile();
326  writeProductDependencies(); //branchChildren used here
329  finishEndFile();
330 
332  }
333 
334  // At some later date, we may move functionality from finishEndFile() to here.
336 
337  void PoolOutputModule::writeFileFormatVersion() { rootOutputFile_->writeFileFormatVersion(); }
338  void PoolOutputModule::writeFileIdentifier() { rootOutputFile_->writeFileIdentifier(); }
339  void PoolOutputModule::writeIndexIntoFile() { rootOutputFile_->writeIndexIntoFile(); }
341  rootOutputFile_->writeStoredMergeableRunProductMetadata();
342  }
343  void PoolOutputModule::writeProcessHistoryRegistry() { rootOutputFile_->writeProcessHistoryRegistry(); }
344  void PoolOutputModule::writeParameterSetRegistry() { rootOutputFile_->writeParameterSetRegistry(); }
345  void PoolOutputModule::writeProductDescriptionRegistry() { rootOutputFile_->writeProductDescriptionRegistry(); }
346  void PoolOutputModule::writeParentageRegistry() { rootOutputFile_->writeParentageRegistry(); }
347  void PoolOutputModule::writeBranchIDListRegistry() { rootOutputFile_->writeBranchIDListRegistry(); }
348  void PoolOutputModule::writeThinnedAssociationsHelper() { rootOutputFile_->writeThinnedAssociationsHelper(); }
349  void PoolOutputModule::writeProductDependencies() { rootOutputFile_->writeProductDependencies(); }
350  void PoolOutputModule::writeEventAuxiliary() { rootOutputFile_->writeEventAuxiliary(); }
351  void PoolOutputModule::writeProcessBlockHelper() { rootOutputFile_->writeProcessBlockHelper(); }
353  rootOutputFile_->finishEndFile();
354  rootOutputFile_ = nullptr;
355  } // propagate_const<T> has no reset() function
357  bool PoolOutputModule::isFileOpen() const { return rootOutputFile_.get() != nullptr; }
358  bool PoolOutputModule::shouldWeCloseFile() const { return rootOutputFile_->shouldWeCloseFile(); }
359 
360  std::pair<std::string, std::string> PoolOutputModule::physicalAndLogicalNameForNewFile() {
361  if (inputFileCount_ == 0) {
362  throw edm::Exception(errors::LogicError) << "Attempt to open output file before input file. "
363  << "Please report this to the core framework developers.\n";
364  }
365  std::string suffix(".root");
366  std::string::size_type offset = fileName().rfind(suffix);
367  bool ext = (offset == fileName().size() - suffix.size());
368  if (!ext)
369  suffix.clear();
370  std::string fileBase(ext ? fileName().substr(0, offset) : fileName());
371  std::ostringstream ofilename;
372  std::ostringstream lfilename;
373  ofilename << fileBase;
374  lfilename << logicalFileName();
375  if (outputFileCount_) {
376  ofilename << std::setw(3) << std::setfill('0') << outputFileCount_;
377  if (!logicalFileName().empty()) {
378  lfilename << std::setw(3) << std::setfill('0') << outputFileCount_;
379  }
380  }
381  ofilename << suffix;
383 
384  return std::make_pair(ofilename.str(), lfilename.str());
385  }
386 
389  rootOutputFile_ = std::make_unique<RootOutputFile>(
390  this,
391  names.first,
392  names.second,
393  processesWithSelectedMergeableRunProducts_); // propagate_const<T> has no reset() function
394  }
395 
397  BranchID const& branchID) {
398  ProductProvenance const* provenance = provRetriever->branchIDToProvenanceForProducedOnly(branchID);
399  if (provenance != nullptr) {
400  BranchParents::iterator it = branchParents_.find(branchID);
401  if (it == branchParents_.end()) {
402  it = branchParents_.insert(std::make_pair(branchID, std::set<ParentageID>())).first;
403  }
404  it->second.insert(provenance->parentageID());
405  }
406  }
407 
410  for (auto const& bid : producedBranches_) {
411  updateBranchParentsForOneBranch(provRetriever, bid);
412  }
414  if (helper) {
415  for (auto const& bid : subProcessParentageHelper()->producedProducts()) {
416  updateBranchParentsForOneBranch(provRetriever, bid);
417  }
418  }
419  }
420 
422  ModuleCallingContext const& iModuleCallingContext,
423  Principal const& iPrincipal) const {
424  if (DropAll != dropMetaData_) {
425  auto const* ep = dynamic_cast<EventPrincipal const*>(&iPrincipal);
426  if (ep) {
427  auto pr = ep->productProvenanceRetrieverPtr();
428  if (pr) {
429  pr->readProvenanceAsync(iTask, &iModuleCallingContext);
430  }
431  }
432  }
433  }
434 
436  for (auto const& branchParent : branchParents_) {
437  BranchID const& child = branchParent.first;
438  std::set<ParentageID> const& eIds = branchParent.second;
439  for (auto const& eId : eIds) {
440  Parentage entryDesc;
441  ParentageRegistry::instance()->getMapped(eId, entryDesc);
442  std::vector<BranchID> const& parents = entryDesc.parents();
443  for (auto const& parent : parents) {
445  }
446  }
447  }
448  }
449 
451  std::string defaultString;
452 
453  desc.setComment("Writes runs, lumis, and events into EDM/ROOT files.");
454  desc.addUntracked<std::string>("fileName")->setComment("Name of output file.");
455  desc.addUntracked<std::string>("logicalFileName", defaultString)
456  ->setComment("Passed to job report. Otherwise unused by module.");
457  desc.addUntracked<std::string>("catalog", defaultString)
458  ->setComment("Passed to job report. Otherwise unused by module.");
459  desc.addUntracked<int>("maxSize", 0x7f000000)
460  ->setComment(
461  "Maximum output file size, in kB.\n"
462  "If over maximum, new output file will be started at next input file transition.");
463  desc.addUntracked<int>("compressionLevel", 4)->setComment("ROOT compression level of output file.");
464  desc.addUntracked<std::string>("compressionAlgorithm", "ZSTD")
465  ->setComment(
466  "Algorithm used to compress data in the ROOT output file, allowed values are ZLIB, LZMA, LZ4, and ZSTD");
467  desc.addUntracked<int>("basketSize", 16384)->setComment("Default ROOT basket size in output file.");
468  desc.addUntracked<int>("eventAuxiliaryBasketSize", 16384)
469  ->setComment("Default ROOT basket size in output file for EventAuxiliary branch.");
470  desc.addUntracked<int>("eventAutoFlushCompressedSize", 20 * 1024 * 1024)
471  ->setComment(
472  "Set ROOT auto flush stored data size (in bytes) for event TTree. The value sets how large the compressed "
473  "buffer is allowed to get. The uncompressed buffer can be quite a bit larger than this depending on the "
474  "average compression ratio. The value of -1 just uses ROOT's default value. The value of 0 turns off this "
475  "feature.");
476  desc.addUntracked<int>("splitLevel", 99)->setComment("Default ROOT branch split level in output file.");
477  desc.addUntracked<std::string>("sortBaskets", std::string("sortbasketsbyoffset"))
478  ->setComment(
479  "Legal values: 'sortbasketsbyoffset', 'sortbasketsbybranch', 'sortbasketsbyentry'.\n"
480  "Used by ROOT when fast copying. Affects performance.");
481  desc.addUntracked<int>("treeMaxVirtualSize", -1)
482  ->setComment("Size of ROOT TTree TBasket cache. Affects performance.");
483  desc.addUntracked<bool>("fastCloning", true)
484  ->setComment(
485  "True: Allow fast copying, if possible.\n"
486  "False: Disable fast copying.");
487  desc.addUntracked("mergeJob", false)
488  ->setComment(
489  "If set to true and fast copying is disabled, copy input file compression and basket sizes to the output "
490  "file.");
491  desc.addUntracked<bool>("compactEventAuxiliary", false)
492  ->setComment(
493  "False: Write EventAuxiliary as we go like any other event metadata branch.\n"
494  "True: Optimize the file layout by deferring writing the EventAuxiliary branch until the output file is "
495  "closed.");
496  desc.addUntracked<bool>("overrideInputFileSplitLevels", false)
497  ->setComment(
498  "False: Use branch split levels and basket sizes from input file, if possible.\n"
499  "True: Always use specified or default split levels and basket sizes.");
500  desc.addUntracked<bool>("writeStatusFile", false)
501  ->setComment("Write a status file. Intended for use by workflow management.");
502  desc.addUntracked<std::string>("dropMetaData", defaultString)
503  ->setComment(
504  "Determines handling of per product per event metadata. Options are:\n"
505  "'NONE': Keep all of it.\n"
506  "'DROPPED': Keep it for products produced in current process and all kept products. Drop it for dropped "
507  "products produced in prior processes.\n"
508  "'PRIOR': Keep it for products produced in current process. Drop it for products produced in prior "
509  "processes.\n"
510  "'ALL': Drop all of it.");
511  {
512  ParameterSetDescription dataSet;
513  dataSet.setAllowAnything();
514  desc.addUntracked<ParameterSetDescription>("dataset", dataSet)
515  ->setComment("PSet is only used by Data Operations and not by this module.");
516  }
517  {
518  ParameterSetDescription specialSplit;
519  specialSplit.addUntracked<std::string>("branch")->setComment(
520  "Name of branch needing a special split level. The name can contain wildcards '*' and '?'");
521  specialSplit.addUntracked<int>("splitLevel")->setComment("The special split level for the branch");
522  desc.addVPSetUntracked("overrideBranchesSplitLevel", specialSplit, std::vector<ParameterSet>());
523  }
524  OutputModule::fillDescription(desc);
525  }
526 
530  descriptions.add("edmOutput", desc);
531  }
532 } // namespace edm
void openFile(FileBlock const &fb) override
list processes
Run mode ##.
void setComment(std::string const &value)
virtual std::pair< std::string, std::string > physicalAndLogicalNameForNewFile()
T getUntrackedParameter(std::string const &, T const &) const
std::string const & branchName() const
SubProcessParentageHelper const * subProcessParentageHelper() const
ProductProvenance const * branchIDToProvenanceForProducedOnly(BranchID const &bid) const
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
Definition: BranchType.cc:116
BranchDescription const * branchDescription_
EventID const & id() const
TPRegexp parents
Definition: eve_filter.cc:21
BranchType const & branchType() const
void write(EventForOutput const &e) override
OutputProcessBlockHelper const & outputProcessBlockHelper() const
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
edm::propagate_const< std::unique_ptr< RootOutputFile > > rootOutputFile_
static int const invalidSplitLevel
void setAllowAnything()
allow any parameter label/value pairs
std::vector< SpecialSplitLevelForBranch > specialSplitLevelForBranches_
static int const invalidBasketSize
TTree * processBlockTree(std::string const &processName) const
Definition: FileBlock.cc:24
void setProcessesWithSelectedMergeableRunProducts(std::set< std::string > const &) override
void updateBranchParents(EventForOutput const &e)
constexpr unsigned int numberOfRunLumiEventProductTrees
Definition: BranchType.h:15
DropMetaData const & dropMetaData() const
BranchChildren branchChildren_
void writeRun(RunForOutput const &) override
std::string const & fileName() const
void insertChild(BranchID parent, BranchID child)
BranchChildren const & branchChildren() const
Definition: FileBlock.h:135
std::string const moduleLabel_
std::string const & processName() const
ParameterSet getUntrackedParameterSet(std::string const &name, ParameterSet const &defaultValue) const
bool int lh
Definition: SIMDVec.h:20
uint16_t size_type
virtual void doExtrasAfterCloseFile()
std::string const & logicalFileName() const
BranchType
Definition: BranchType.h:11
std::vector< std::pair< BranchDescription const *, EDGetToken > > SelectedProducts
std::vector< std::string > const & processesWithProcessBlockProducts() const
std::vector< BranchID > const & parents() const
Definition: Parentage.h:44
std::regex convert(std::string const &iGlobBranchExpression) const
PoolOutputModule(ParameterSet const &ps)
void setComment(std::string const &value)
void updateBranchParentsForOneBranch(ProductProvenanceRetriever const *provRetriever, BranchID const &branchID)
bool operator()(OutputItem const &lh, OutputItem const &rh) const
void preActionBeforeRunEventAsync(WaitingTaskHolder iTask, ModuleCallingContext const &iModuleCallingContext, Principal const &iPrincipal) const override
std::string const & currentFileName() const
bool getMapped(key_type const &k, value_type &result) const
map_t const & childLookup() const
std::vector< BranchID > producedBranches_
std::vector< OutputItemList > selectedOutputItemList_
OutputItem(BranchDescription const *bd, EDGetToken const &token, int splitLevel, int basketSize)
ProductProvenanceRetriever const * productProvenanceRetrieverPtr() const
void writeStoredMergeableRunProductMetadata()
std::vector< std::string > names
BranchID const & branchID() const
EventID const & min(EventID const &lh, EventID const &rh)
Definition: EventID.h:116
BranchParents branchParents_
void sort_all(RandomAccessSequence &s)
wrappers for std::sort
Definition: Algorithms.h:92
std::string const & processName() const
TTree * lumiTree() const
Definition: FileBlock.h:119
bool shouldWeCloseFile() const override
allow inheriting classes to override but still be able to call this method in the overridden version ...
void respondToCloseInputFile(FileBlock const &fb) override
bool isFileOpen() const override
void beginJob() override
void reallyCloseFile() override
double b
Definition: hdecay.h:118
void add(std::string const &label, ParameterSetDescription const &psetDescription)
ParentageID const & parentageID() const
std::shared_ptr< std::map< std::string, int > > treeMap_
VParameterSet getUntrackedParameterSetVector(std::string const &name, VParameterSet const &defaultValue) const
SelectedProductsForBranchType const & keptProducts() const
void beginInputFile(FileBlock const &fb)
std::vector< OutputItem > OutputItemList
void respondToOpenInputFile(FileBlock const &fb) override
void writeProcessBlock(ProcessBlockForOutput const &) override
void fillSelectedItemList(BranchType branchtype, std::string const &processName, TTree *theInputTree, OutputItemList &)
static void fillDescriptions(ConfigurationDescriptions &descriptions)
tmp
align.sh
Definition: createJobs.py:716
bool match(std::string const &iBranchName) const
static void fillDescription(ParameterSetDescription &desc)
moduleLabel_(iConfig.getParameter< string >("@module_label"))
static ParentageRegistry * instance()
TTree * runTree() const
Definition: FileBlock.h:121
TTree * tree() const
Definition: FileBlock.h:117
ParameterDescriptionBase * addVPSetUntracked(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
std::vector< std::string > processesWithSelectedMergeableRunProducts_
void writeLuminosityBlock(LuminosityBlockForOutput const &) override