22 #include "CLHEP/Random/RandFlat.h"
31 unsigned int nStreams,
34 inputType_(inputType),
38 fileIterBegin_(fileCatalogItems().
begin()),
39 fileIterEnd_(fileCatalogItems().
end()),
40 fileIter_(fileIterEnd_),
41 fileIterLastOpened_(fileIterEnd_),
44 indexesIntoFiles_(fileCatalogItems().
size()),
45 orderedProcessHistoryIDs_(),
48 eventsRemainingInFile_(0),
56 initialNumberOfEventsToSkip_(inputType ==
InputType::
Primary ? pset.getUntrackedParameter<unsigned int>(
"skipEvents", 0U) : 0U),
58 skipBadFiles_(pset.getUntrackedParameter<bool>(
"skipBadFiles",
false)),
59 treeCacheSize_(noEventSort_ ? pset.getUntrackedParameter<unsigned int>(
"cacheSize", roottree::
defaultCacheSize) : 0U),
60 treeMaxVirtualSize_(pset.getUntrackedParameter<int>(
"treeMaxVirtualSize", -1)),
61 setRun_(pset.getUntrackedParameter<unsigned int>(
"setRunNumber", 0U)),
62 productSelectorRules_(pset,
"inputCommands",
"InputSource"),
64 dropDescendants_(pset.getUntrackedParameter<bool>(
"dropDescendantsOfDroppedBranches", inputType !=
InputType::
SecondarySource)),
65 labelRawDataLikeMC_(pset.getUntrackedParameter<bool>(
"labelRawDataLikeMC",
true)),
66 usingGoToEvent_(
false),
67 enablePrefetching_(
false),
68 usedFallback_(
false) {
106 std::vector<FileCatalogItem>
const&
116 std::unique_ptr<FileBlock>
130 return std::unique_ptr<FileBlock>(
new FileBlock);
139 std::unique_ptr<InputSource::FileCloseSentry>
159 !needIndexesForDuplicateChecker &&
161 if(deleteIndexIntoFile) {
180 throw cms::Exception(
"LogicalFileNameNotFound",
"RootInputFileSequence::initFile()\n")
181 <<
"Logical file name '" <<
fileIter_->logicalFileName() <<
"' was not found in the file catalog.\n"
182 <<
"If you wanted a local file, you forgot the 'file:' prefix\n"
183 <<
"before the file name in your configuration file.\n";
185 LogWarning(
"") <<
"Input logical file: " <<
fileIter_->logicalFileName() <<
" was not found in the catalog, and will be skipped.\n";
195 bool hasFallbackUrl = !fallbackName.empty() && fallbackName !=
fileIter_->fileName();
197 boost::shared_ptr<InputFile> filePtr;
199 std::unique_ptr<InputSource::FileOpenSentry>
206 std::ostringstream
out;
213 ex.addContext(
"Calling RootInputFileSequence::initFile()");
214 std::ostringstream
out;
215 out <<
"Input file " <<
fileIter_->fileName() <<
" could not be opened.";
216 ex.addAdditionalInfo(out.str());
221 if(!filePtr && (hasFallbackUrl)) {
224 std::unique_ptr<InputSource::FileOpenSentry>
226 filePtr.reset(
new InputFile(gSystem->ExpandPathName(fallbackName.c_str()),
" Fallback request to file ",
inputType_));
232 ex.addContext(
"Calling RootInputFileSequence::initFile()");
233 std::ostringstream
out;
234 out <<
"Input file " <<
fileIter_->fileName() <<
" could not be opened.\n";
235 out <<
"Fallback Input file " << fallbackName <<
" also could not be opened.";
236 ex.addAdditionalInfo(out.str());
265 currentIndexIntoFile,
273 indexesIntoFiles_[currentIndexIntoFile] =
rootFile_->indexIntoFileSharedPtr();
274 char const* inputType = 0;
285 "RootInputFileSequence::initFile(): Input file " <<
fileIter_->fileName() <<
" was not found or could not be opened.\n";
287 LogWarning(
"") <<
"Input file: " <<
fileIter_->fileName() <<
" was not found or could not be opened, and will be skipped.\n";
291 boost::shared_ptr<ProductRegistry const>
297 boost::shared_ptr<BranchIDListHelper const>
320 if(!mergeInfo.empty()) {
344 if(!mergeInfo.empty()) {
355 boost::shared_ptr<RunAuxiliary>
361 boost::shared_ptr<LuminosityBlockAuxiliary>
364 return rootFile_->readLuminosityBlockAuxiliary_();
376 rootFile_->readLuminosityBlock_(lumiPrincipal);
426 return rootFile_->containsItem(run, lumi, event);
463 bool atEnd =
rootFile_->skipEvents(offset);
464 if((offset > 0 || atEnd) && !
nextFile()) {
488 bool closedOriginalFile =
false;
489 std::vector<FileCatalogItem>::const_iterator originalFile =
fileIter_;
493 typedef std::vector<boost::shared_ptr<IndexIntoFile> >::const_iterator Iter;
511 closedOriginalFile =
true;
520 if(closedOriginalFile) {
524 rootFile_->setPosition(originalPosition);
533 typedef std::vector<boost::shared_ptr<IndexIntoFile> >::const_iterator Iter;
559 typedef std::vector<boost::shared_ptr<IndexIntoFile> >::const_iterator Iter;
561 if(*it && (*it)->containsItem(run, lumi, event)) {
563 std::vector<FileCatalogItem>::const_iterator currentIter =
fileIter_;
570 found =
rootFile_->setEntryAtItem(run, lumi, event);
611 boost::shared_ptr<ProductRegistry const>
618 std::vector<std::string>
rules;
619 rules.reserve(wantedBranches.size() + 1);
620 rules.emplace_back(
"drop *");
622 rules.push_back(
"keep " + branch +
"_*");
660 throw Exception(
errors::Configuration) <<
"RootInputFileSequence::readOneSequentialWithID(): no input files specified for secondary input source.\n";
664 rootFile_->indexIntoFileIter().run() !=
id.run() ||
665 rootFile_->indexIntoFileIter().lumi() !=
id.luminosityBlock()) {
672 bool found =
rootFile_->setEntryAtNextEventInLumi(
id.
run(),
id.luminosityBlock());
674 found =
rootFile_->readCurrentEvent(cache);
695 "RootInputFileSequence::readOneSpecified(): Secondary Input files" <<
696 " do not contain specified event:\n" <<
id <<
"\n";
699 found =
rootFile_->readCurrentEvent(cache);
715 if(newSeqNumber != currentSeqNumber) {
717 currentSeqNumber = newSeqNumber;
722 "RootInputFileSequence::readOneRandom(): Secondary Input file " <<
fileIter_->fileName() <<
" contains no events.\n";
731 bool found =
rootFile_->readCurrentEvent(cache);
746 rootFile_->indexIntoFileIter().run() !=
id.run() ||
747 rootFile_->indexIntoFileIter().lumi() !=
id.luminosityBlock()) {
752 int eventsInLumi = 0;
754 while(
rootFile_->setEntryAtNextEventInLumi(
id.run(),
id.luminosityBlock())) ++eventsInLumi;
757 int eventInLumi = CLHEP::RandFlat::shootInt(engine, eventsInLumi);
758 for(
int i = 0;
i < eventInLumi; ++
i) {
759 bool found =
rootFile_->setEntryAtNextEventInLumi(
id.
run(),
id.luminosityBlock());
764 bool found =
rootFile_->setEntryAtNextEventInLumi(
id.
run(),
id.luminosityBlock());
766 found =
rootFile_->readCurrentEvent(cache);
769 bool found =
rootFile_->setEntryAtItem(
id.
run(),
id.luminosityBlock(), 0);
781 ->setComment(
"Skip the first 'skipEvents' events that otherwise would have been processed.");
783 ->setComment(
"True: Process runs, lumis and events in the order they appear in the file (but see notes 1 and 2).\n"
784 "False: Process runs, lumis and events in each file in numerical order (run#, lumi#, event#) (but see note 3).\n"
785 "Note 1: Events within the same lumi will always be processed contiguously.\n"
786 "Note 2: Lumis within the same run will always be processed contiguously.\n"
787 "Note 3: Any sorting occurs independently in each input file (no sorting across input files).");
789 ->setComment(
"True: Ignore any missing or unopenable input file.\n"
790 "False: Throw exception if missing or unopenable input file.");
792 ->setComment(
"Size of ROOT TTree prefetch cache. Affects performance.");
794 ->setComment(
"Size of ROOT TTree TBasket cache. Affects performance.");
796 ->setComment(
"If non-zero, change number of first run to this number. Apply same offset to all runs. Allowed only for simulation.");
797 desc.
addUntracked<
bool>(
"dropDescendantsOfDroppedBranches",
true)
798 ->setComment(
"If True, also drop on input any descendent of any branch dropped on input.");
801 ->setComment(
"'strict': Branches in each input file must match those in the first file.\n"
802 "'permissive': Branches in each input file may be any subset of those in the first file.");
804 ->setComment(
"If True: replace module label for raw data to match MC. Also use 'LHC' as process.");
817 std::vector<FileCatalogItem>::const_iterator itr(
fileIter_);
830 if(!
rootFile_->wasFirstEventJustRead()) {
EventNumber_t event() const
T getUntrackedParameter(std::string const &, T const &) const
void stagein(const std::string &url)
static void fillDescription(ParameterSetDescription &desc, char const *parameterName)
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
unsigned int EventNumber_t
virtual std::string explainSelf() const
static void fillDescription(ParameterSetDescription &desc)
LuminosityBlockNumber_t luminosityBlock() const
unsigned int const defaultCacheSize
unsigned int LuminosityBlockNumber_t
static std::string const input
static StorageFactory * get(void)
tuple InputFile
Open Root file and provide MEs ############.
std::string merge(ProductRegistry const &other, std::string const &fileName, BranchDescription::MatchMode branchesMustMatch=BranchDescription::Permissive)
unsigned int offset(bool)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
static EntryNumber_t const invalidEntry
void addUntrackedParameter(std::string const &name, T const &value)
static void fillDescription(ParameterSetDescription &desc)
void updateFromInput(ProductList const &other)
void activateTimeout(const std::string &url)
volatile std::atomic< bool > shutdown_flag false
tuple size
Write out results.