21 #include "TBranchElement.h"
22 #include "TObjArray.h"
33 rootServiceChecker_(),
35 selectedOutputItemList_(),
36 fileName_(pset.getUntrackedParameter<std::
string>(
"fileName")),
37 logicalFileName_(pset.getUntrackedParameter<std::
string>(
"logicalFileName")),
38 catalog_(pset.getUntrackedParameter<std::
string>(
"catalog")),
39 maxFileSize_(pset.getUntrackedParameter<int>(
"maxSize")),
40 compressionLevel_(pset.getUntrackedParameter<int>(
"compressionLevel")),
41 #
if ROOT_VERSION_CODE >= ROOT_VERSION(5,30,0)
42 compressionAlgorithm_(pset.getUntrackedParameter<std::
string>(
"compressionAlgorithm")),
44 compressionAlgorithm_(
"ZLIB"),
46 basketSize_(pset.getUntrackedParameter<int>(
"basketSize")),
47 eventAutoFlushSize_(pset.getUntrackedParameter<int>(
"eventAutoFlushCompressedSize")),
48 splitLevel_(std::
min<int>(pset.getUntrackedParameter<int>(
"splitLevel") + 1, 99)),
49 basketOrder_(pset.getUntrackedParameter<std::
string>(
"sortBaskets")),
50 treeMaxVirtualSize_(pset.getUntrackedParameter<int>(
"treeMaxVirtualSize")),
51 whyNotFastClonable_(pset.getUntrackedParameter<bool>(
"fastCloning") ?
FileBlock::CanFastClone :
FileBlock::DisabledInConfigFile),
52 dropMetaData_(DropNone),
54 initializedFromInput_(
false),
58 numberOfDigitsInIndex_(0U),
59 overrideInputFileSplitLevels_(pset.getUntrackedParameter<bool>(
"overrideInputFileSplitLevels")),
64 std::ostringstream statusfilename;
77 << dropMetaData <<
".\n"
78 <<
"Legal values are 'NONE', 'DROPPED', 'PRIOR', and 'ALL'.\n";
95 for(
auto const&
prod : keptVector) {
109 branchDescription_(0),
115 branchDescription_(bd),
124 TObjArray* branches = tree->GetListOfBranches();
125 for(
int i = 0;
i < branches->GetEntries(); ++
i) {
126 TBranchElement*
br = (TBranchElement*)branches->At(
i);
136 if(treeMap_->empty())
return lh < rh;
139 std::map<std::string, int>::const_iterator lit = treeMap_->find(lstring);
140 std::map<std::string, int>::const_iterator rit = treeMap_->find(rstring);
141 bool lfound = (lit != treeMap_->end());
142 bool rfound = (rit != treeMap_->end());
143 if(lfound && rfound) {
144 return lit->second < rit->second;
172 for(SelectedProducts::const_iterator it = keptVector.begin(), itEnd = keptVector.end(); it != itEnd; ++it) {
180 splitLevel = theBranch->GetSplitLevel();
181 basketSize = theBranch->GetBasketSize();
186 outputItemList.emplace_back(&prod, splitLevel, basketSize);
211 TTree* theInputTree = (branchType ==
InEvent ? fb.
tree() :
228 while (iNumberOfChildren != 0) {
230 iNumberOfChildren /= 10;
244 statusFile << e.
id() <<
" time: " << std::setprecision(3) <<
TimeOfDay() <<
'\n';
293 std::pair<std::string, std::string>
297 <<
"Attempt to open output file before input file. "
298 <<
"Please report this to the core framework developers.\n";
302 bool ext = (offset ==
fileName().size() - suffix.size());
303 if(!ext) suffix.clear();
305 std::ostringstream ofilename;
306 std::ostringstream lfilename;
307 ofilename << fileBase;
324 return std::make_pair(ofilename.str(), lfilename.str());
336 desc.
setComment(
"Writes runs, lumis, and events into EDM/ROOT files.");
338 ->setComment(
"Name of output file.");
340 ->setComment(
"Passed to job report. Otherwise unused by module.");
342 ->setComment(
"Passed to job report. Otherwise unused by module.");
344 ->setComment(
"Maximum output file size, in kB.\n"
345 "If over maximum, new output file will be started at next input file transition.");
347 ->setComment(
"ROOT compression level of output file.");
348 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,30,0)
350 ->setComment(
"Algorithm used to compress data in the ROOT output file, allowed values are ZLIB and LZMA");
353 ->setComment(
"Default ROOT basket size in output file.");
354 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.");
356 ->setComment(
"Default ROOT branch split level in output file.");
358 ->setComment(
"Legal values: 'sortbasketsbyoffset', 'sortbasketsbybranch', 'sortbasketsbyentry'.\n"
359 "Used by ROOT when fast copying. Affects performance.");
361 ->setComment(
"Size of ROOT TTree TBasket cache. Affects performance.");
363 ->setComment(
"True: Allow fast copying, if possible.\n"
364 "False: Disable fast copying.");
365 desc.
addUntracked<
bool>(
"overrideInputFileSplitLevels",
false)
366 ->setComment(
"False: Use branch split levels and basket sizes from input file, if possible.\n"
367 "True: Always use specified or default split levels and basket sizes.");
369 ->setComment(
"Write a status file. Intended for use by workflow management.");
371 ->setComment(
"Determines handling of per product per event metadata. Options are:\n"
372 "'NONE': Keep all of it.\n"
373 "'DROPPED': Keep it for products produced in current process and all kept products. Drop it for dropped products produced in prior processes.\n"
374 "'PRIOR': Keep it for products produced in current process. Drop it for products produced in prior processes.\n"
375 "'ALL': Drop all of it.");
379 ->setComment(
"PSet is only used by Data Operations and not by this module.");
388 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
std::string const & branchName() const
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
virtual void writeRun(RunPrincipal const &r, ModuleCallingContext const *) override
BranchDescription const * branchDescription_
int const & basketSize() const
bool wantAllEvents() const
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
static const HistoName names[]
static int const invalidSplitLevel
void setAllowAnything()
allow any parameter label/value pairs
static int const invalidBasketSize
void checkClassDictionaries(TypeID const &type, bool recursive=true)
DropMetaData const & dropMetaData() const
EventID const & id() const
std::vector< OutputItem > OutputItemList
std::string const & fileName() const
bool initializedFromInput_
std::string const moduleLabel_
ParameterSet getUntrackedParameterSet(std::string const &name, ParameterSet const &defaultValue) const
virtual void doExtrasAfterCloseFile()
std::string const & logicalFileName() const
void writeParameterSetRegistry()
void fillSelectedItemList(BranchType branchtype, TTree *theInputTree)
PoolOutputModule(ParameterSet const &ps)
int remainingEvents() const
void setComment(std::string const &value)
bool overrideInputFileSplitLevels_
bool operator()(OutputItem const &lh, OutputItem const &rh) const
std::string const & currentFileName() const
void writeFileFormatVersion()
OutputItemListArray selectedOutputItemList_
SelectedProductsForBranchType const & keptProducts() const
int const & splitLevel() const
EventID const & min(EventID const &lh, EventID const &rh)
void writeProductDependencies()
virtual void reallyOpenFile() override
std::unique_ptr< RootOutputFile > rootOutputFile_
void writeIndexIntoFile()
unsigned int numberOfDigitsInIndex_
void writeThinnedAssociationsHelper()
void sort_all(RandomAccessSequence &s)
wrappers for std::sort
void writeBranchIDListRegistry()
void writeProcessHistoryRegistry()
virtual bool shouldWeCloseFile() const override
allow inheriting classes to override but still be able to call this method in the overridden version ...
virtual void respondToCloseInputFile(FileBlock const &fb) override
DropMetaData dropMetaData_
virtual bool isFileOpen() const override
virtual void write(EventPrincipal const &e, ModuleCallingContext const *) override
virtual void beginJob() override
virtual void reallyCloseFile() override
void add(std::string const &label, ParameterSetDescription const &psetDescription)
virtual void writeLuminosityBlock(LuminosityBlockPrincipal const &lb, ModuleCallingContext const *) override
static void fillDescription(ParameterSetDescription &desc)
void writeFileIdentifier()
virtual ~PoolOutputModule()
virtual void postForkReacquireResources(unsigned int iChildIndex, unsigned int iNumberOfChildren) override
std::shared_ptr< std::map< std::string, int > > treeMap_
std::vector< BranchDescription const * > SelectedProducts
std::string statusFileName_
void beginInputFile(FileBlock const &fb)
void writeProductDescriptionRegistry()
volatile std::atomic< bool > shutdown_flag false
virtual void respondToOpenInputFile(FileBlock const &fb) override
if(conf.exists("allCellsPositionCalc"))
static void fillDescriptions(ConfigurationDescriptions &descriptions)
static void fillDescription(ParameterSetDescription &desc)