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 eventAutoFlushSize_(pset.getUntrackedParameter<
int>(
"eventAutoFlushCompressedSize")),
50 splitLevel_(
std::
min<
int>(pset.getUntrackedParameter<
int>(
"splitLevel") + 1, 99)),
51 basketOrder_(pset.getUntrackedParameter<
std::
string>(
"sortBaskets")),
52 treeMaxVirtualSize_(pset.getUntrackedParameter<
int>(
"treeMaxVirtualSize")),
53 whyNotFastClonable_(pset.getUntrackedParameter<
bool>(
"fastCloning") ?
FileBlock::CanFastClone
55 dropMetaData_(DropNone),
56 moduleLabel_(pset.getParameter<
std::
string>(
"@module_label")),
57 initializedFromInput_(
false),
61 numberOfDigitsInIndex_(0
U),
64 overrideInputFileSplitLevels_(pset.getUntrackedParameter<
bool>(
"overrideInputFileSplitLevels")),
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()) {
137 if (tree !=
nullptr) {
138 TObjArray* branches = tree->GetListOfBranches();
139 for (
int i = 0;
i < branches->GetEntries(); ++
i) {
140 TBranchElement*
br = (TBranchElement*)branches->At(
i);
153 std::map<std::string, int>::const_iterator lit =
treeMap_->find(lstring);
154 std::map<std::string, int>::const_iterator rit =
treeMap_->find(rstring);
155 bool lfound = (lit !=
treeMap_->end());
156 bool rfound = (rit !=
treeMap_->end());
157 if (lfound && rfound) {
158 return lit->second < rit->second;
168 return std::regex_match(iBranchName, branch_);
173 boost::replace_all(tmp,
"*",
".*");
174 boost::replace_all(tmp,
"?",
".");
175 return std::regex(tmp);
196 for (
auto const& kept : keptVector) {
202 ? theInputTree->GetBranch(prod.
branchName().c_str())
205 if (theBranch !=
nullptr) {
206 splitLevel = theBranch->GetSplitLevel();
207 basketSize = theBranch->GetBasketSize();
212 splitLevel =
b.splitLevel_;
217 outputItemList.emplace_back(&prod, kept.second, splitLevel, basketSize);
230 for (
auto const& parentToChildren : branchToChildMap) {
231 for (
auto const&
child : parentToChildren.second) {
250 TTree* theInputTree =
276 statusFile << e.
id() <<
" time: " << std::setprecision(3) <<
TimeOfDay() <<
'\n';
335 <<
"Please report this to the core framework developers.\n";
339 bool ext = (offset ==
fileName().size() - suffix.size());
343 std::ostringstream ofilename;
344 std::ostringstream lfilename;
345 ofilename << fileBase;
362 return std::make_pair(ofilename.str(), lfilename.str());
377 if (provenance !=
nullptr) {
380 it =
branchParents_.insert(std::make_pair(branchID, std::set<ParentageID>())).first;
403 auto const* ep =
dynamic_cast<EventPrincipal const*
>(&iPrincipal);
405 auto pr = ep->productProvenanceRetrieverPtr();
407 pr->readProvenanceAsync(iTask, &iModuleCallingContext);
416 std::set<ParentageID>
const& eIds = branchParent.second;
417 for (
auto const& eId : eIds) {
421 for (
auto const&
parent : parents) {
431 desc.
setComment(
"Writes runs, lumis, and events into EDM/ROOT files.");
434 ->setComment(
"Passed to job report. Otherwise unused by module.");
436 ->setComment(
"Passed to job report. Otherwise unused by module.");
439 "Maximum output file size, in kB.\n" 440 "If over maximum, new output file will be started at next input file transition.");
441 desc.
addUntracked<
int>(
"compressionLevel", 9)->setComment(
"ROOT compression level of output file.");
443 ->setComment(
"Algorithm used to compress data in the ROOT output file, allowed values are ZLIB and LZMA");
444 desc.
addUntracked<
int>(
"basketSize", 16384)->setComment(
"Default ROOT basket size in output file.");
445 desc.
addUntracked<
int>(
"eventAutoFlushCompressedSize", 20 * 1024 * 1024)
447 "Set ROOT auto flush stored data size (in bytes) for event TTree. The value sets how large the compressed " 448 "buffer is allowed to get. The uncompressed buffer can be quite a bit larger than this depending on the " 449 "average compression ratio. The value of -1 just uses ROOT's default value. The value of 0 turns off this " 451 desc.
addUntracked<
int>(
"splitLevel", 99)->setComment(
"Default ROOT branch split level in output file.");
454 "Legal values: 'sortbasketsbyoffset', 'sortbasketsbybranch', 'sortbasketsbyentry'.\n" 455 "Used by ROOT when fast copying. Affects performance.");
457 ->setComment(
"Size of ROOT TTree TBasket cache. Affects performance.");
460 "True: Allow fast copying, if possible.\n" 461 "False: Disable fast copying.");
462 desc.
addUntracked<
bool>(
"overrideInputFileSplitLevels",
false)
464 "False: Use branch split levels and basket sizes from input file, if possible.\n" 465 "True: Always use specified or default split levels and basket sizes.");
467 ->setComment(
"Write a status file. Intended for use by workflow management.");
470 "Determines handling of per product per event metadata. Options are:\n" 471 "'NONE': Keep all of it.\n" 472 "'DROPPED': Keep it for products produced in current process and all kept products. Drop it for dropped " 473 "products produced in prior processes.\n" 474 "'PRIOR': Keep it for products produced in current process. Drop it for products produced in prior " 476 "'ALL': Drop all of it.");
481 ->setComment(
"PSet is only used by Data Operations and not by this module.");
486 "Name of branch needing a special split level. The name can contain wildcards '*' and '?'");
487 specialSplit.
addUntracked<
int>(
"splitLevel")->setComment(
"The special split level for the branch");
488 desc.
addVPSetUntracked(
"overrideBranchesSplitLevel", specialSplit, std::vector<ParameterSet>());
496 descriptions.
add(
"edmOutput", desc);
void writeParentageRegistry()
void openFile(FileBlock const &fb) override
virtual std::pair< std::string, std::string > physicalAndLogicalNameForNewFile()
T getUntrackedParameter(std::string const &, T const &) const
bool shouldWeCloseFile() const override
allow inheriting classes to override but still be able to call this method in the overridden version ...
std::string const & branchName() const
SubProcessParentageHelper const * subProcessParentageHelper() const
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
BranchDescription const * branchDescription_
int const & basketSize() const
EventID const & id() const
bool wantAllEvents() const
BranchType const & branchType() const
void write(EventForOutput const &e) override
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
void setProcessesWithSelectedMergeableRunProducts(std::set< std::string > const &) override
void updateBranchParents(EventForOutput const &e)
DropMetaData const & dropMetaData() const
BranchChildren branchChildren_
std::vector< OutputItem > OutputItemList
std::string const & fileName() const
bool initializedFromInput_
void insertChild(BranchID parent, BranchID child)
BranchChildren const & branchChildren() const
std::string const moduleLabel_
BranchID branchID() const
ParameterSet getUntrackedParameterSet(std::string const &name, ParameterSet const &defaultValue) const
virtual void doExtrasAfterCloseFile()
const std::string names[nVars_]
std::string const & logicalFileName() const
void writeParameterSetRegistry()
std::vector< std::pair< BranchDescription const *, EDGetToken > > SelectedProducts
void fillSelectedItemList(BranchType branchtype, TTree *theInputTree)
std::vector< BranchID > const & parents() const
std::regex convert(std::string const &iGlobBranchExpression) const
PoolOutputModule(ParameterSet const &ps)
int remainingEvents() const
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
std::string const & currentFileName() const
bool getMapped(key_type const &k, value_type &result) const
void writeFileFormatVersion()
OutputItemListArray selectedOutputItemList_
map_t const & childLookup() const
std::vector< BranchID > producedBranches_
void preActionBeforeRunEventAsync(WaitingTask *iTask, ModuleCallingContext const &iModuleCallingContext, Principal const &iPrincipal) const override
static void fillDescription(ParameterSetDescription &desc, std::vector< std::string > const &iDefaultOutputCommands=ProductSelectorRules::defaultSelectionStrings())
ProductProvenanceRetriever const * productProvenanceRetrieverPtr() const
void writeStoredMergeableRunProductMetadata()
SelectedProductsForBranchType const & keptProducts() const
int const & splitLevel() const
BranchID const & branchID() const
EventID const & min(EventID const &lh, EventID const &rh)
void writeProductDependencies()
BranchParents branchParents_
void writeIndexIntoFile()
unsigned int numberOfDigitsInIndex_
void writeThinnedAssociationsHelper()
void writeRun(RunForOutput const &r) override
void sort_all(RandomAccessSequence &s)
wrappers for std::sort
bool isFileOpen() const override
void writeBranchIDListRegistry()
void writeProcessHistoryRegistry()
void fillDependencyGraph()
void respondToCloseInputFile(FileBlock const &fb) override
DropMetaData dropMetaData_
void reallyCloseFile() override
void add(std::string const &label, ParameterSetDescription const &psetDescription)
ProductProvenance const * branchIDToProvenanceForProducedOnly(BranchID const &bid) const
void writeFileIdentifier()
ParentageID const & parentageID() const
std::vector< std::vector< double > > tmp
std::shared_ptr< std::map< std::string, int > > treeMap_
VParameterSet getUntrackedParameterSetVector(std::string const &name, VParameterSet const &defaultValue) const
std::string statusFileName_
~PoolOutputModule() override
void beginInputFile(FileBlock const &fb)
void writeProductDescriptionRegistry()
void respondToOpenInputFile(FileBlock const &fb) override
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_
def branchType(schema, name)
void writeLuminosityBlock(LuminosityBlockForOutput const &lb) override