26 #include "TBranchElement.h"
27 #include "TObjArray.h"
33 #include "boost/algorithm/string.hpp"
39 rootServiceChecker_(),
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
56 dropMetaData_(DropNone),
58 initializedFromInput_(
false),
63 overrideInputFileSplitLevels_(pset.getUntrackedParameter<bool>(
"overrideInputFileSplitLevels")),
64 compactEventAuxiliary_(pset.getUntrackedParameter<bool>(
"compactEventAuxiliary")),
68 std::ostringstream statusfilename;
74 if (dropMetaData.empty())
86 << dropMetaData <<
".\n"
87 <<
"Legal values are 'NONE', 'DROPPED', 'PRIOR', and 'ALL'.\n";
97 for (
auto const&
s : specialSplit) {
99 s.getUntrackedParameter<
int>(
"splitLevel"));
110 for (
auto const& prod : reg->productList()) {
126 : branchDescription_(bd), token_(token), product_(nullptr),
splitLevel_(splitLevel),
basketSize_(basketSize) {}
130 if (tree !=
nullptr) {
131 TObjArray* branches = tree->GetListOfBranches();
132 for (
int i = 0;
i < branches->GetEntries(); ++
i) {
133 TBranchElement*
br = (TBranchElement*)branches->At(
i);
142 if (treeMap_->empty())
146 std::map<std::string, int>::const_iterator lit = treeMap_->find(lstring);
147 std::map<std::string, int>::const_iterator rit = treeMap_->find(rstring);
148 bool lfound = (lit != treeMap_->end());
149 bool rfound = (rit != treeMap_->end());
150 if (lfound && rfound) {
151 return lit->second < rit->second;
161 return std::regex_match(iBranchName, branch_);
166 boost::replace_all(tmp,
"*",
".*");
167 boost::replace_all(tmp,
"?",
".");
168 return std::regex(tmp);
196 for (
auto const& kept : keptVector) {
205 ? theInputTree->GetBranch(prod.
branchName().c_str())
208 if (theBranch !=
nullptr) {
209 splitLevel = theBranch->GetSplitLevel();
210 basketSize = theBranch->GetBasketSize();
215 splitLevel =
b.splitLevel_;
220 outputItemList.emplace_back(&prod, kept.second, splitLevel, basketSize);
233 for (
auto const& parentToChildren : branchToChildMap) {
234 for (
auto const&
child : parentToChildren.second) {
251 std::vector<std::string>
const& processesWithProcessBlockProducts =
253 unsigned int numberOfProcessesWithProcessBlockProducts = processesWithProcessBlockProducts.size();
261 TTree* theInputTree =
267 for (
unsigned int k =
InProcess;
k < numberOfTTrees; ++
k) {
297 statusFile << e.
id() <<
" time: " << std::setprecision(3) <<
TimeOfDay() <<
'\n';
362 <<
"Please report this to the core framework developers.\n";
366 bool ext = (offset ==
fileName().size() - suffix.size());
370 std::ostringstream ofilename;
371 std::ostringstream lfilename;
372 ofilename << fileBase;
383 return std::make_pair(ofilename.str(), lfilename.str());
398 if (provenance !=
nullptr) {
401 it =
branchParents_.insert(std::make_pair(branchID, std::set<ParentageID>())).first;
426 auto pr = ep->productProvenanceRetrieverPtr();
428 pr->readProvenanceAsync(iTask, &iModuleCallingContext);
437 std::set<ParentageID>
const& eIds = branchParent.second;
438 for (
auto const& eId : eIds) {
442 for (
auto const&
parent : parents) {
452 desc.
setComment(
"Writes runs, lumis, and events into EDM/ROOT files.");
455 ->setComment(
"Passed to job report. Otherwise unused by module.");
457 ->setComment(
"Passed to job report. Otherwise unused by module.");
460 "Maximum output file size, in kB.\n"
461 "If over maximum, new output file will be started at next input file transition.");
462 desc.
addUntracked<
int>(
"compressionLevel", 9)->setComment(
"ROOT compression level of output file.");
465 "Algorithm used to compress data in the ROOT output file, allowed values are ZLIB, LZMA, and ZSTD");
466 desc.
addUntracked<
int>(
"basketSize", 16384)->setComment(
"Default ROOT basket size in output file.");
467 desc.
addUntracked<
int>(
"eventAuxiliaryBasketSize", 16384)
468 ->setComment(
"Default ROOT basket size in output file for EventAuxiliary branch.");
469 desc.
addUntracked<
int>(
"eventAutoFlushCompressedSize", 20 * 1024 * 1024)
471 "Set ROOT auto flush stored data size (in bytes) for event TTree. The value sets how large the compressed "
472 "buffer is allowed to get. The uncompressed buffer can be quite a bit larger than this depending on the "
473 "average compression ratio. The value of -1 just uses ROOT's default value. The value of 0 turns off this "
475 desc.
addUntracked<
int>(
"splitLevel", 99)->setComment(
"Default ROOT branch split level in output file.");
478 "Legal values: 'sortbasketsbyoffset', 'sortbasketsbybranch', 'sortbasketsbyentry'.\n"
479 "Used by ROOT when fast copying. Affects performance.");
481 ->setComment(
"Size of ROOT TTree TBasket cache. Affects performance.");
484 "True: Allow fast copying, if possible.\n"
485 "False: Disable fast copying.");
488 "False: Write EventAuxiliary as we go like any other event metadata branch.\n"
489 "True: Optimize the file layout be deferring writing the EventAuxiliary branch until the output file is "
491 desc.
addUntracked<
bool>(
"overrideInputFileSplitLevels",
false)
493 "False: Use branch split levels and basket sizes from input file, if possible.\n"
494 "True: Always use specified or default split levels and basket sizes.");
496 ->setComment(
"Write a status file. Intended for use by workflow management.");
499 "Determines handling of per product per event metadata. Options are:\n"
500 "'NONE': Keep all of it.\n"
501 "'DROPPED': Keep it for products produced in current process and all kept products. Drop it for dropped "
502 "products produced in prior processes.\n"
503 "'PRIOR': Keep it for products produced in current process. Drop it for products produced in prior "
505 "'ALL': Drop all of it.");
510 ->setComment(
"PSet is only used by Data Operations and not by this module.");
515 "Name of branch needing a special split level. The name can contain wildcards '*' and '?'");
516 specialSplit.
addUntracked<
int>(
"splitLevel")->setComment(
"The special split level for the branch");
517 desc.
addVPSetUntracked(
"overrideBranchesSplitLevel", specialSplit, std::vector<ParameterSet>());
519 OutputModule::fillDescription(desc);
525 descriptions.
add(
"edmOutput", desc);
void writeParentageRegistry()
void openFile(FileBlock const &fb) override
list processes
Run mode ##.
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)
BranchDescription const * branchDescription_
EventID const & id() const
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
void setProcessesWithSelectedMergeableRunProducts(std::set< std::string > const &) override
void updateBranchParents(EventForOutput const &e)
constexpr unsigned int numberOfRunLumiEventProductTrees
DropMetaData const & dropMetaData() const
BranchChildren branchChildren_
void writeRun(RunForOutput const &) override
std::string const & fileName() const
bool initializedFromInput_
void insertChild(BranchID parent, BranchID child)
BranchChildren const & branchChildren() const
std::string const moduleLabel_
std::string const & processName() const
BranchID branchID() const
ParameterSet getUntrackedParameterSet(std::string const &name, ParameterSet const &defaultValue) const
virtual void doExtrasAfterCloseFile()
std::string const & logicalFileName() const
void writeParameterSetRegistry()
std::vector< std::pair< BranchDescription const *, EDGetToken > > SelectedProducts
std::vector< std::string > const & processesWithProcessBlockProducts() const
void writeProcessBlockHelper()
std::vector< BranchID > const & parents() const
std::regex convert(std::string const &iGlobBranchExpression) const
bool wantAllEvents() const
int remainingEvents() const
PoolOutputModule(ParameterSet const &ps)
void setComment(std::string const &value)
void updateBranchParentsForOneBranch(ProductProvenanceRetriever const *provRetriever, BranchID const &branchID)
bool overrideInputFileSplitLevels_
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
void writeFileFormatVersion()
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()
void writeEventAuxiliary()
std::vector< std::string > names
BranchID const & branchID() const
EventID const & min(EventID const &lh, EventID const &rh)
void writeProductDependencies()
BranchParents branchParents_
void writeIndexIntoFile()
void writeThinnedAssociationsHelper()
void sort_all(RandomAccessSequence &s)
wrappers for std::sort
std::string const & processName() const
void writeBranchIDListRegistry()
void writeProcessHistoryRegistry()
void fillDependencyGraph()
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
DropMetaData dropMetaData_
bool isFileOpen() const override
void reallyCloseFile() override
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void writeFileIdentifier()
ParentageID const & parentageID() const
std::shared_ptr< std::map< std::string, int > > treeMap_
VParameterSet getUntrackedParameterSetVector(std::string const &name, VParameterSet const &defaultValue) const
std::string statusFileName_
SelectedProductsForBranchType const & keptProducts() const
~PoolOutputModule() override
void beginInputFile(FileBlock const &fb)
void writeProductDescriptionRegistry()
int const eventAuxBasketSize_
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)
bool match(std::string const &iBranchName) const
static void fillDescription(ParameterSetDescription &desc)
static ParentageRegistry * instance()
ParameterDescriptionBase * addVPSetUntracked(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
std::vector< std::string > processesWithSelectedMergeableRunProducts_
void writeLuminosityBlock(LuminosityBlockForOutput const &) override