26 #include "TBranchElement.h" 27 #include "TObjArray.h" 38 rootServiceChecker_(),
40 selectedOutputItemList_(),
41 fileName_(pset.getUntrackedParameter<
std::
string>(
"fileName")),
42 logicalFileName_(pset.getUntrackedParameter<
std::
string>(
"logicalFileName")),
43 catalog_(pset.getUntrackedParameter<
std::
string>(
"catalog")),
44 maxFileSize_(pset.getUntrackedParameter<
int>(
"maxSize")),
45 compressionLevel_(pset.getUntrackedParameter<
int>(
"compressionLevel")),
46 compressionAlgorithm_(pset.getUntrackedParameter<
std::
string>(
"compressionAlgorithm")),
47 basketSize_(pset.getUntrackedParameter<
int>(
"basketSize")),
48 eventAutoFlushSize_(pset.getUntrackedParameter<
int>(
"eventAutoFlushCompressedSize")),
49 splitLevel_(
std::
min<
int>(pset.getUntrackedParameter<
int>(
"splitLevel") + 1, 99)),
50 basketOrder_(pset.getUntrackedParameter<
std::
string>(
"sortBaskets")),
51 treeMaxVirtualSize_(pset.getUntrackedParameter<
int>(
"treeMaxVirtualSize")),
52 whyNotFastClonable_(pset.getUntrackedParameter<bool>(
"fastCloning") ?
FileBlock::CanFastClone :
FileBlock::DisabledInConfigFile),
53 dropMetaData_(DropNone),
54 moduleLabel_(pset.getParameter<
std::
string>(
"@module_label")),
55 initializedFromInput_(
false),
59 numberOfDigitsInIndex_(0
U),
62 overrideInputFileSplitLevels_(pset.getUntrackedParameter<bool>(
"overrideInputFileSplitLevels")),
67 std::ostringstream statusfilename;
80 << dropMetaData <<
".\n" 81 <<
"Legal values are 'NONE', 'DROPPED', 'PRIOR', and 'ALL'.\n";
96 for(
auto const&
prod : reg->productList()) {
112 branchDescription_(0),
128 if(tree !=
nullptr) {
129 TObjArray* branches = tree->GetListOfBranches();
130 for(
int i = 0;
i < branches->GetEntries(); ++
i) {
131 TBranchElement*
br = (TBranchElement*)branches->At(
i);
141 if(
treeMap_->empty())
return lh < rh;
144 std::map<std::string, int>::const_iterator lit =
treeMap_->find(lstring);
145 std::map<std::string, int>::const_iterator rit =
treeMap_->find(rstring);
146 bool lfound = (lit !=
treeMap_->end());
147 bool rfound = (rit !=
treeMap_->end());
148 if(lfound && rfound) {
149 return lit->second < rit->second;
177 for(
auto const& kept : keptVector) {
184 if(theBranch !=
nullptr) {
185 splitLevel = theBranch->GetSplitLevel();
186 basketSize = theBranch->GetBasketSize();
191 outputItemList.emplace_back(&prod, kept.second, splitLevel, basketSize);
204 for (
auto const& parentToChildren : branchToChildMap) {
205 for (
auto const&
child : parentToChildren.second) {
224 TTree* theInputTree = (branchType ==
InEvent ? fb.
tree() :
241 while (iNumberOfChildren != 0) {
243 iNumberOfChildren /= 10;
258 statusFile << e.
id() <<
" time: " << std::setprecision(3) <<
TimeOfDay() <<
'\n';
310 std::pair<std::string, std::string>
314 <<
"Attempt to open output file before input file. " 315 <<
"Please report this to the core framework developers.\n";
319 bool ext = (offset ==
fileName().size() - suffix.size());
320 if(!ext) suffix.clear();
322 std::ostringstream ofilename;
323 std::ostringstream lfilename;
324 ofilename << fileBase;
341 return std::make_pair(ofilename.str(), lfilename.str());
355 if (provenance !=
nullptr) {
359 std::set<ParentageID>())).first;
383 auto const* ep =
dynamic_cast<EventPrincipal const*
>(&iPrincipal);
398 std::set<ParentageID>
const& eIds = branchParent.second;
399 for(
auto const& eId : eIds) {
403 for(
auto const&
parent : parents) {
414 desc.
setComment(
"Writes runs, lumis, and events into EDM/ROOT files.");
416 ->setComment(
"Name of output file.");
418 ->setComment(
"Passed to job report. Otherwise unused by module.");
420 ->setComment(
"Passed to job report. Otherwise unused by module.");
422 ->setComment(
"Maximum output file size, in kB.\n" 423 "If over maximum, new output file will be started at next input file transition.");
425 ->setComment(
"ROOT compression level of output file.");
427 ->setComment(
"Algorithm used to compress data in the ROOT output file, allowed values are ZLIB and LZMA");
429 ->setComment(
"Default ROOT basket size in output file.");
430 desc.
addUntracked<
int>(
"eventAutoFlushCompressedSize",-1)->setComment(
"Set ROOT auto flush stored data size (in bytes) for event TTree. The value sets how large the compressed buffer is allowed to get. The uncompressed buffer can be quite a bit larger than this depending on the average compression ratio. The value of -1 just uses ROOT's default value. The value of 0 turns off this feature.");
432 ->setComment(
"Default ROOT branch split level in output file.");
434 ->setComment(
"Legal values: 'sortbasketsbyoffset', 'sortbasketsbybranch', 'sortbasketsbyentry'.\n" 435 "Used by ROOT when fast copying. Affects performance.");
437 ->setComment(
"Size of ROOT TTree TBasket cache. Affects performance.");
439 ->setComment(
"True: Allow fast copying, if possible.\n" 440 "False: Disable fast copying.");
441 desc.
addUntracked<
bool>(
"overrideInputFileSplitLevels",
false)
442 ->setComment(
"False: Use branch split levels and basket sizes from input file, if possible.\n" 443 "True: Always use specified or default split levels and basket sizes.");
445 ->setComment(
"Write a status file. Intended for use by workflow management.");
447 ->setComment(
"Determines handling of per product per event metadata. Options are:\n" 448 "'NONE': Keep all of it.\n" 449 "'DROPPED': Keep it for products produced in current process and all kept products. Drop it for dropped products produced in prior processes.\n" 450 "'PRIOR': Keep it for products produced in current process. Drop it for products produced in prior processes.\n" 451 "'ALL': Drop all of it.");
455 ->setComment(
"PSet is only used by Data Operations and not by this module.");
464 descriptions.
add(
"edmOutput", desc);
void writeParentageRegistry()
virtual void openFile(FileBlock const &fb) override
virtual std::pair< std::string, std::string > physicalAndLogicalNameForNewFile()
T getUntrackedParameter(std::string const &, T const &) const
virtual 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
virtual void write(EventForOutput const &e) override
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
static const HistoName names[]
edm::propagate_const< std::unique_ptr< RootOutputFile > > rootOutputFile_
static int const invalidSplitLevel
void setAllowAnything()
allow any parameter label/value pairs
static int const invalidBasketSize
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()
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
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_
virtual void preActionBeforeRunEventAsync(WaitingTask *iTask, ModuleCallingContext const &iModuleCallingContext, Principal const &iPrincipal) const override
void readProvenanceAsync(WaitingTask *task, ModuleCallingContext const *moduleCallingContext) const
static void fillDescription(ParameterSetDescription &desc, std::vector< std::string > const &iDefaultOutputCommands=ProductSelectorRules::defaultSelectionStrings())
ProductProvenanceRetriever const * productProvenanceRetrieverPtr() const
SelectedProductsForBranchType const & keptProducts() const
int const & splitLevel() const
BranchID const & branchID() const
EventID const & min(EventID const &lh, EventID const &rh)
void writeProductDependencies()
virtual void reallyOpenFile() override
BranchParents branchParents_
ProductProvenanceRetriever const * productProvenanceRetrieverPtr() const
void writeIndexIntoFile()
unsigned int numberOfDigitsInIndex_
void writeThinnedAssociationsHelper()
virtual void writeRun(RunForOutput const &r) override
void sort_all(RandomAccessSequence &s)
wrappers for std::sort
virtual bool isFileOpen() const override
void writeBranchIDListRegistry()
void writeProcessHistoryRegistry()
void fillDependencyGraph()
virtual void respondToCloseInputFile(FileBlock const &fb) override
DropMetaData dropMetaData_
virtual void beginJob() override
virtual 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
virtual ~PoolOutputModule()
virtual void postForkReacquireResources(unsigned int iChildIndex, unsigned int iNumberOfChildren) override
std::shared_ptr< std::map< std::string, int > > treeMap_
std::string statusFileName_
void beginInputFile(FileBlock const &fb)
void writeProductDescriptionRegistry()
virtual void respondToOpenInputFile(FileBlock const &fb) override
static void fillDescriptions(ConfigurationDescriptions &descriptions)
static void fillDescription(ParameterSetDescription &desc)
static ParentageRegistry * instance()
def branchType(schema, name)
virtual void writeLuminosityBlock(LuminosityBlockForOutput const &lb) override