CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RootInputFileSequence.cc
Go to the documentation of this file.
1 /*----------------------------------------------------------------------
2 ----------------------------------------------------------------------*/
3 #include "DuplicateChecker.h"
4 #include "PoolSource.h"
5 #include "RootFile.h"
7 #include "RootTree.h"
8 
22 
23 #include "CLHEP/Random/RandFlat.h"
24 #include "InputFile.h"
25 #include "TSystem.h"
26 
27 namespace edm {
29  ParameterSet const& pset,
32  unsigned int nStreams,
33  InputType inputType) :
34  input_(input),
35  inputType_(inputType),
36  catalog_(catalog),
37  firstFile_(true),
38  lfn_("unknown"),
39  fileIterBegin_(fileCatalogItems().begin()),
40  fileIterEnd_(fileCatalogItems().end()),
41  fileIter_(fileIterEnd_),
42  fileIterLastOpened_(fileIterEnd_),
43  rootFile_(),
44  branchesMustMatch_(BranchDescription::Permissive),
45  flatDistribution_(),
46  indexesIntoFiles_(fileCatalogItems().size()),
47  orderedProcessHistoryIDs_(),
48  nStreams_(nStreams),
49  eventSkipperByID_(inputType == InputType::Primary ? EventSkipperByID::create(pset).release() : 0),
50  eventsRemainingInFile_(0),
51  // The default value provided as the second argument to the getUntrackedParameter function call
52  // is not used when the ParameterSet has been validated and the parameters are not optional
53  // in the description. This is currently true when PoolSource is the primary input source.
54  // The modules that use PoolSource as a SecSource have not defined their fillDescriptions function
55  // yet, so the ParameterSet does not get validated yet. As soon as all the modules with a SecSource
56  // have defined descriptions, the defaults in the getUntrackedParameterSet function calls can
57  // and should be deleted from the code.
58  initialNumberOfEventsToSkip_(inputType == InputType::Primary ? pset.getUntrackedParameter<unsigned int>("skipEvents", 0U) : 0U),
59  noEventSort_(inputType == InputType::Primary ? pset.getUntrackedParameter<bool>("noEventSort", true) : false),
60  skipBadFiles_(pset.getUntrackedParameter<bool>("skipBadFiles", false)),
61  bypassVersionCheck_(pset.getUntrackedParameter<bool>("bypassVersionCheck", false)),
62  treeCacheSize_(noEventSort_ ? pset.getUntrackedParameter<unsigned int>("cacheSize", roottree::defaultCacheSize) : 0U),
63  treeMaxVirtualSize_(pset.getUntrackedParameter<int>("treeMaxVirtualSize", -1)),
64  setRun_(pset.getUntrackedParameter<unsigned int>("setRunNumber", 0U)),
65  productSelectorRules_(pset, "inputCommands", "InputSource"),
66  duplicateChecker_(inputType == InputType::Primary ? new DuplicateChecker(pset) : 0),
67  dropDescendants_(pset.getUntrackedParameter<bool>("dropDescendantsOfDroppedBranches", inputType != InputType::SecondarySource)),
68  labelRawDataLikeMC_(pset.getUntrackedParameter<bool>("labelRawDataLikeMC", true)),
69  usingGoToEvent_(false),
70  enablePrefetching_(false),
71  usedFallback_(false) {
72 
73  // The SiteLocalConfig controls the TTreeCache size and the prefetching settings.
75  if(pSLC.isAvailable()) {
76  if(treeCacheSize_ != 0U && pSLC->sourceTTreeCacheSize()) {
77  treeCacheSize_ = *(pSLC->sourceTTreeCacheSize());
78  }
79  enablePrefetching_ = pSLC->enablePrefetching();
80  }
81 
84  factory->activateTimeout(fileIter_->fileName());
85  factory->stagein(fileIter_->fileName());
86  //NOTE: we do not want to stage in all secondary files since we can be given a list of
87  // thousands of files and prestaging all those files can cause a site to fail.
88  // So, we stage in the first secondary file only.
90  break;
91  }
92  }
93 
94  std::string branchesMustMatch = pset.getUntrackedParameter<std::string>("branchesMustMatch", std::string("permissive"));
95  if(branchesMustMatch == std::string("strict")) branchesMustMatch_ = BranchDescription::Strict;
96 
99  if(rootFile_) break;
100  }
101  if(rootFile_) {
102  productRegistryUpdate().updateFromInput(rootFile_->productRegistry()->productList());
105  }
106  }
107  }
108 
109  std::vector<FileCatalogItem> const&
111  return catalog_.fileCatalogItems();
112  }
113 
114  void
116  closeFile_();
117  }
118 
119  std::unique_ptr<FileBlock>
121  if(firstFile_) {
122  // The first input file has already been opened.
123  firstFile_ = false;
124  if(!rootFile_) {
126  }
127  } else {
128  if(!nextFile()) {
129  assert(0);
130  }
131  }
132  if(!rootFile_) {
133  return std::unique_ptr<FileBlock>(new FileBlock);
134  }
135  return rootFile_->createFileBlock();
136  }
137 
139  // close the currently open file, if any, and delete the RootFile object.
140  if(rootFile_) {
142  std::unique_ptr<InputSource::FileCloseSentry>
144  rootFile_->close();
145  if(duplicateChecker_) duplicateChecker_->inputFileClosed();
146  }
147  rootFile_.reset();
148  }
149  }
150 
152  // We are really going to close the open file.
153 
154  // If this is the primary sequence, we are not duplicate checking across files
155  // and we are not using random access to find events, then we can delete the
156  // IndexIntoFile for the file we are closing. If we can't delete all of it,
157  // then we can delete the parts we do not need.
159  size_t currentIndexIntoFile = fileIterLastOpened_ - fileIterBegin_;
160  bool needIndexesForDuplicateChecker = duplicateChecker_ && duplicateChecker_->checkingAllFiles() && !duplicateChecker_->checkDisabled();
161  bool deleteIndexIntoFile = inputType_ == InputType::Primary &&
162  !needIndexesForDuplicateChecker &&
164  if(deleteIndexIntoFile) {
165  indexesIntoFiles_[currentIndexIntoFile].reset();
166  } else {
167  if(indexesIntoFiles_[currentIndexIntoFile]) indexesIntoFiles_[currentIndexIntoFile]->inputFileClosed();
168  }
170  }
171  closeFile_();
172 
173  if(fileIter_ == fileIterEnd_) {
174  // No files specified
175  return;
176  }
177 
178  // Check if the logical file name was found.
179  if(fileIter_->fileName().empty()) {
180  // LFN not found in catalog.
181  InputFile::reportSkippedFile(fileIter_->fileName(), fileIter_->logicalFileName());
182  if(!skipBadFiles) {
183  throw cms::Exception("LogicalFileNameNotFound", "RootInputFileSequence::initFile()\n")
184  << "Logical file name '" << fileIter_->logicalFileName() << "' was not found in the file catalog.\n"
185  << "If you wanted a local file, you forgot the 'file:' prefix\n"
186  << "before the file name in your configuration file.\n";
187  }
188  LogWarning("") << "Input logical file: " << fileIter_->logicalFileName() << " was not found in the catalog, and will be skipped.\n";
189  return;
190  }
191 
192  lfn_ = fileIter_->logicalFileName().empty() ? fileIter_->fileName() : fileIter_->logicalFileName();
193  usedFallback_ = false;
194 
195  // Determine whether we have a fallback URL specified; if so, prepare it;
196  // Only valid if it is non-empty and differs from the original filename.
197  std::string fallbackName = fileIter_->fallbackFileName();
198  bool hasFallbackUrl = !fallbackName.empty() && fallbackName != fileIter_->fileName();
199 
200  boost::shared_ptr<InputFile> filePtr;
201  try {
202  std::unique_ptr<InputSource::FileOpenSentry>
204  filePtr.reset(new InputFile(gSystem->ExpandPathName(fileIter_->fileName().c_str()), " Initiating request to open file ", inputType_));
205  }
206  catch (cms::Exception const& e) {
207  if(!skipBadFiles) {
208  if(hasFallbackUrl) {
209  std::ostringstream out;
210  out << e.explainSelf();
211  std::string pfn(gSystem->ExpandPathName(fallbackName.c_str()));
212  InputFile::reportFallbackAttempt(pfn, fileIter_->logicalFileName(), out.str());
213  } else {
214  InputFile::reportSkippedFile(fileIter_->fileName(), fileIter_->logicalFileName());
215  Exception ex(errors::FileOpenError, "", e);
216  ex.addContext("Calling RootInputFileSequence::initFile()");
217  std::ostringstream out;
218  out << "Input file " << fileIter_->fileName() << " could not be opened.";
219  ex.addAdditionalInfo(out.str());
220  throw ex;
221  }
222  }
223  }
224  if(!filePtr && (hasFallbackUrl)) {
225  try {
226  usedFallback_ = true;
227  std::unique_ptr<InputSource::FileOpenSentry>
229  filePtr.reset(new InputFile(gSystem->ExpandPathName(fallbackName.c_str()), " Fallback request to file ", inputType_));
230  }
231  catch (cms::Exception const& e) {
232  if(!skipBadFiles) {
233  InputFile::reportSkippedFile(fileIter_->fileName(), fileIter_->logicalFileName());
235  ex.addContext("Calling RootInputFileSequence::initFile()");
236  std::ostringstream out;
237  out << "Input file " << fileIter_->fileName() << " could not be opened.\n";
238  out << "Fallback Input file " << fallbackName << " also could not be opened.";
239  ex.addAdditionalInfo(out.str());
240  throw ex;
241  }
242  }
243  }
244  if(filePtr) {
245  std::vector<boost::shared_ptr<IndexIntoFile> >::size_type currentIndexIntoFile = fileIter_ - fileIterBegin_;
247  fileIter_->fileName(),
249  fileIter_->logicalFileName(),
250  filePtr,
253  remainingEvents(),
255  nStreams_,
259  setRun_,
260  noEventSort_,
262  inputType_,
263  (inputType_ == InputType::SecondarySource ? boost::shared_ptr<BranchIDListHelper>(new BranchIDListHelper()) : input_.branchIDListHelper()),
268  currentIndexIntoFile,
274 
276  indexesIntoFiles_[currentIndexIntoFile] = rootFile_->indexIntoFileSharedPtr();
277  char const* inputType = 0;
278  switch(inputType_) {
279  case InputType::Primary: inputType = "primaryFiles"; break;
280  case InputType::SecondaryFile: inputType = "secondaryFiles"; break;
281  case InputType::SecondarySource: inputType = "mixingFiles"; break;
282  }
283  rootFile_->reportOpened(inputType);
284  } else {
285  InputFile::reportSkippedFile(fileIter_->fileName(), fileIter_->logicalFileName());
286  if(!skipBadFiles) {
288  "RootInputFileSequence::initFile(): Input file " << fileIter_->fileName() << " was not found or could not be opened.\n";
289  }
290  LogWarning("") << "Input file: " << fileIter_->fileName() << " was not found or could not be opened, and will be skipped.\n";
291  }
292  }
293 
294  boost::shared_ptr<ProductRegistry const>
296  assert(rootFile_);
297  return rootFile_->productRegistry();
298  }
299 
300  boost::shared_ptr<BranchIDListHelper const>
302  assert(rootFile_);
303  return rootFile_->branchIDListHelper();
304  }
305 
308  if(fileIter_ == fileIterEnd_) {
310  return false;
311  } else {
313  }
314  }
315 
317 
319  // make sure the new product registry is compatible with the main one
320  std::string mergeInfo = productRegistryUpdate().merge(*rootFile_->productRegistry(),
321  fileIter_->fileName(),
323  if(!mergeInfo.empty()) {
324  throw Exception(errors::MismatchedInputFiles,"RootInputFileSequence::nextFile()") << mergeInfo;
325  }
326  }
327  return true;
328  }
329 
331  if(fileIter_ == fileIterBegin_) {
333  return false;
334  } else {
336  }
337  }
338  --fileIter_;
339 
340  initFile(false);
341 
343  // make sure the new product registry is compatible to the main one
344  std::string mergeInfo = productRegistryUpdate().merge(*rootFile_->productRegistry(),
345  fileIter_->fileName(),
347  if(!mergeInfo.empty()) {
348  throw Exception(errors::MismatchedInputFiles,"RootInputFileSequence::previousEvent()") << mergeInfo;
349  }
350  }
351  if(rootFile_) rootFile_->setToLastEntry();
352  return true;
353  }
354 
356  }
357 
358  boost::shared_ptr<RunAuxiliary>
360  return rootFile_->readRunAuxiliary_();
361  }
362 
363  boost::shared_ptr<LuminosityBlockAuxiliary>
365  return rootFile_->readLuminosityBlockAuxiliary_();
366  }
367 
368  void
370  rootFile_->readRun_(runPrincipal);
371  }
372 
373  void
375  rootFile_->readLuminosityBlock_(lumiPrincipal);
376  }
377 
378  // readEvent() is responsible for setting up the EventPrincipal.
379  //
380  // 1. fill an EventPrincipal with a unique EventID
381  // 2. For each entry in the provenance, put in one ProductHolder,
382  // holding the Provenance for the corresponding EDProduct.
383  // 3. set up the caches in the EventPrincipal to know about this
384  // ProductHolder.
385  //
386  // We do *not* create the EDProduct instance (the equivalent of reading
387  // the branch containing this EDProduct. That will be done by the Delayed Reader,
388  // when it is asked to do so.
389  //
390 
391  void
393  rootFile_->readEvent(eventPrincipal);
394  }
395 
398  if(fileIter_ == fileIterEnd_) {
399  return InputSource::IsStop;
400  }
401  if(firstFile_) {
402  return InputSource::IsFile;
403  }
404  if(rootFile_) {
405  IndexIntoFile::EntryType entryType = rootFile_->getNextItemType(run, lumi, event);
406  if(entryType == IndexIntoFile::kEvent) {
407  return InputSource::IsEvent;
408  } else if(entryType == IndexIntoFile::kLumi) {
409  return InputSource::IsLumi;
410  } else if(entryType == IndexIntoFile::kRun) {
411  return InputSource::IsRun;
412  }
413  assert(entryType == IndexIntoFile::kEnd);
414  }
415  if(fileIter_ + 1 == fileIterEnd_) {
416  return InputSource::IsStop;
417  }
418  return InputSource::IsFile;
419  }
420 
421  bool
423  if(!rootFile_) return false;
424  return rootFile_->containsItem(run, lumi, event);
425  }
426 
427  // Rewind to before the first event that was read.
428  void
430  if(fileIter_ != fileIterBegin_) {
431  closeFile_();
433  }
434  if(!rootFile_) {
435  initFile(false);
436  }
437  rewindFile();
438  firstFile_ = true;
439  if(rootFile_) {
442  }
443  }
444  }
445 
446  // Rewind to the beginning of the current file
447  void
449  if(rootFile_) rootFile_->rewind();
450  }
451 
452  // Advance "offset" events. Offset can be positive or negative (or zero).
453  bool
455  // We never call skipEvents for secondary input files. If we did,
456  // we would have to implement synchronization if a new file is opened.
457  // To avoid this, just assert.
459  while(offset != 0) {
460  bool atEnd = rootFile_->skipEvents(offset);
461  if((offset > 0 || atEnd) && !nextFile()) {
462  return false;
463  }
464  if(offset < 0 && !previousFile()) {
466  return false;
467  }
468  }
469  return true;
470  }
471 
472  bool
474  usingGoToEvent_ = true;
475  if(rootFile_) {
476  if(rootFile_->goToEvent(eventID)) {
477  return true;
478  }
479  // If only one input file, give up now, to save time.
480  if(rootFile_ && indexesIntoFiles_.size() == 1) {
481  return false;
482  }
483  // Save the current file and position so that we can restore them
484  // if we fail to restore the desired event
485  bool closedOriginalFile = false;
486  std::vector<FileCatalogItem>::const_iterator originalFile = fileIter_;
487  IndexIntoFile::IndexIntoFileItr originalPosition = rootFile_->indexIntoFileIter();
488 
489  // Look for item (run/lumi/event) in files previously opened without reopening unnecessary files.
490  typedef std::vector<boost::shared_ptr<IndexIntoFile> >::const_iterator Iter;
491  for(Iter it = indexesIntoFiles_.begin(), itEnd = indexesIntoFiles_.end(); it != itEnd; ++it) {
492  if(*it && (*it)->containsItem(eventID.run(), eventID.luminosityBlock(), eventID.event())) {
493  // We found it. Close the currently open file, and open the correct one.
494  fileIter_ = fileIterBegin_ + (it - indexesIntoFiles_.begin());
495  initFile(false);
496  // Now get the item from the correct file.
497  bool found = rootFile_->goToEvent(eventID);
498  assert(found);
499  return true;
500  }
501  }
502  // Look for item in files not yet opened.
503  for(Iter it = indexesIntoFiles_.begin(), itEnd = indexesIntoFiles_.end(); it != itEnd; ++it) {
504  if(!*it) {
505  fileIter_ = fileIterBegin_ + (it - indexesIntoFiles_.begin());
506  initFile(false);
507  closedOriginalFile = true;
508  if((*it)->containsItem(eventID.run(), eventID.luminosityBlock(), eventID.event())) {
509  if (rootFile_->goToEvent(eventID)) {
510  return true;
511  }
512  }
513  }
514  }
515  if(closedOriginalFile) {
516  fileIter_ = originalFile;
517  initFile(false);
518  rootFile_->setPosition(originalPosition);
519  }
520  }
521  return false;
522  }
523 
524  bool
526  // Look for item in files not yet opened.
527  typedef std::vector<boost::shared_ptr<IndexIntoFile> >::const_iterator Iter;
528  for(Iter it = indexesIntoFiles_.begin(), itEnd = indexesIntoFiles_.end(); it != itEnd; ++it) {
529  if(!*it) {
530  fileIter_ = fileIterBegin_ + (it - indexesIntoFiles_.begin());
531  initFile(false);
532  bool found = rootFile_->setEntryAtItem(run, lumi, event);
533  if(found) {
534  return true;
535  }
536  }
537  }
538  // Not found
539  return false;
540  }
541 
542  bool
544  // Attempt to find item in currently open input file.
545  bool found = currentFileFirst && rootFile_ && rootFile_->setEntryAtItem(run, lumi, event);
546  if(!found) {
547  // If only one input file, give up now, to save time.
548  if(currentFileFirst && rootFile_ && indexesIntoFiles_.size() == 1) {
549  return false;
550  }
551  // Look for item (run/lumi/event) in files previously opened without reopening unnecessary files.
552  typedef std::vector<boost::shared_ptr<IndexIntoFile> >::const_iterator Iter;
553  for(Iter it = indexesIntoFiles_.begin(), itEnd = indexesIntoFiles_.end(); it != itEnd; ++it) {
554  if(*it && (*it)->containsItem(run, lumi, event)) {
555  // We found it. Close the currently open file, and open the correct one.
556  std::vector<FileCatalogItem>::const_iterator currentIter = fileIter_;
557  fileIter_ = fileIterBegin_ + (it - indexesIntoFiles_.begin());
558  if(fileIter_ != currentIter) {
559  initFile(false);
560  }
561  // Now get the item from the correct file.
562  found = rootFile_->setEntryAtItem(run, lumi, event);
563  assert(found);
564  return true;
565  }
566  }
567  // Look for item in files not yet opened.
568  return skipToItemInNewFile(run, lumi, event);
569  }
570  return true;
571  }
572 
576  }
577 
581  }
582 
583  ProcessConfiguration const&
585  return input_.processConfiguration();
586  }
587 
588  int
590  return input_.remainingEvents();
591  }
592 
593  int
596  }
597 
600  return input_.productRegistryUpdate();
601  }
602 
603  boost::shared_ptr<ProductRegistry const>
605  return input_.productRegistry();
606  }
607 
608  void
609  RootInputFileSequence::dropUnwantedBranches_(std::vector<std::string> const& wantedBranches) {
610  std::vector<std::string> rules;
611  rules.reserve(wantedBranches.size() + 1);
612  rules.emplace_back("drop *");
613  for(std::vector<std::string>::const_iterator it = wantedBranches.begin(), itEnd = wantedBranches.end();
614  it != itEnd; ++it) {
615  rules.push_back("keep " + *it + "_*");
616  }
617  ParameterSet pset;
618  pset.addUntrackedParameter("inputCommands", rules);
619  productSelectorRules_ = ProductSelectorRules(pset, "inputCommands", "InputSource");
620  }
621 
622  bool
624  skipBadFiles_ = false;
625  if(fileIter_ == fileIterEnd_ || !rootFile_) {
627  throw Exception(errors::Configuration) << "RootInputFileSequence::readOneSequential(): no input files specified for secondary input source.\n";
628  }
630  initFile(false);
631  rootFile_->setAtEventEntry(IndexIntoFile::invalidEntry);
632  }
633  rootFile_->nextEventEntry();
634  bool found = rootFile_->readCurrentEvent(cache);
635  if(!found) {
636  ++fileIter_;
637  if(fileIter_ == fileIterEnd_) {
638  return false;
639  }
640  initFile(false);
641  rootFile_->setAtEventEntry(IndexIntoFile::invalidEntry);
642  return readOneSequential(cache);
643  }
644  return true;
645  }
646 
647  bool
650  throw Exception(errors::Configuration) << "RootInputFileSequence::readOneSequentialWithID(): no input files specified for secondary input source.\n";
651  }
652  skipBadFiles_ = false;
653  if(fileIter_ == fileIterEnd_ || !rootFile_ ||
654  rootFile_->indexIntoFileIter().run() != id.run() ||
655  rootFile_->indexIntoFileIter().lumi() != id.luminosityBlock()) {
656  bool found = skipToItem(id.run(), id.luminosityBlock(), 0, false);
657  if(!found) {
658  return false;
659  }
660  }
661  bool found = rootFile_->setEntryAtNextEventInLumi(id.run(), id.luminosityBlock());
662  if(found) {
663  found = rootFile_->readCurrentEvent(cache);
664  }
665  if(!found) {
666  found = skipToItemInNewFile(id.run(), id.luminosityBlock(), 0);
667  if(!found) {
668  return false;
669  }
670  return readOneSequentialWithID(cache, id);
671  }
672  return true;
673  }
674 
675  void
678  throw Exception(errors::Configuration) << "RootInputFileSequence::readOneSpecified(): no input files specified for secondary input source.\n";
679  }
680  skipBadFiles_ = false;
681  bool found = skipToItem(id.run(), id.luminosityBlock(), id.event());
682  if(!found) {
683  throw Exception(errors::NotFound) <<
684  "RootInputFileSequence::readOneSpecified(): Secondary Input files" <<
685  " do not contain specified event:\n" << id << "\n";
686  }
687  found = rootFile_->readCurrentEvent(cache);
688  assert(found);
689  }
690 
691  void
694  throw Exception(errors::Configuration) << "RootInputFileSequence::readOneRandom(): no input files specified for secondary input source.\n";
695  }
696  if(!flatDistribution_) {
698  CLHEP::HepRandomEngine& engine = rng->getEngine();
699  flatDistribution_.reset(new CLHEP::RandFlat(engine));
700  }
701  skipBadFiles_ = false;
702  unsigned int currentSeqNumber = fileIter_ - fileIterBegin_;
703  while(eventsRemainingInFile_ == 0) {
704  fileIter_ = fileIterBegin_ + flatDistribution_->fireInt(fileCatalogItems().size());
705  unsigned int newSeqNumber = fileIter_ - fileIterBegin_;
706  if(newSeqNumber != currentSeqNumber) {
707  initFile(false);
708  currentSeqNumber = newSeqNumber;
709  }
710  eventsRemainingInFile_ = rootFile_->eventTree().entries();
711  if(eventsRemainingInFile_ == 0) {
712  throw Exception(errors::NotFound) <<
713  "RootInputFileSequence::readOneRandom(): Secondary Input file " << fileIter_->fileName() << " contains no events.\n";
714  }
715  rootFile_->setAtEventEntry(flatDistribution_->fireInt(eventsRemainingInFile_) - 1);
716  }
717  rootFile_->nextEventEntry();
718 
719  bool found = rootFile_->readCurrentEvent(cache);
720  if(!found) {
721  rootFile_->setAtEventEntry(0);
722  bool found = rootFile_->readCurrentEvent(cache);
723  assert(found);
724  }
726  }
727 
728  // bool RootFile::setEntryAtNextEventInLumi(RunNumber_t run, LuminosityBlockNumber_t lumi) {
729 
730  bool
733  throw Exception(errors::Configuration) << "RootInputFileSequence::readOneRandomWithID(): no input files specified for secondary input source.\n";
734  }
735  if(!flatDistribution_) {
737  CLHEP::HepRandomEngine& engine = rng->getEngine();
738  flatDistribution_.reset(new CLHEP::RandFlat(engine));
739  }
740  skipBadFiles_ = false;
741  if(fileIter_ == fileIterEnd_ || !rootFile_ ||
742  rootFile_->indexIntoFileIter().run() != id.run() ||
743  rootFile_->indexIntoFileIter().lumi() != id.luminosityBlock()) {
744  bool found = skipToItem(id.run(), id.luminosityBlock(), 0);
745  if(!found) {
746  return false;
747  }
748  int eventsInLumi = 0;
749  while(rootFile_->setEntryAtNextEventInLumi(id.run(), id.luminosityBlock())) ++eventsInLumi;
750  found = skipToItem(id.run(), id.luminosityBlock(), 0);
751  assert(found);
752  int eventInLumi = flatDistribution_->fireInt(eventsInLumi);
753  for(int i = 0; i < eventInLumi; ++i) {
754  bool found = rootFile_->setEntryAtNextEventInLumi(id.run(), id.luminosityBlock());
755  assert(found);
756  }
757  }
758  bool found = rootFile_->setEntryAtNextEventInLumi(id.run(), id.luminosityBlock());
759  if(found) {
760  found = rootFile_->readCurrentEvent(cache);
761  }
762  if(!found) {
763  bool found = rootFile_->setEntryAtItem(id.run(), id.luminosityBlock(), 0);
764  if(!found) {
765  return false;
766  }
767  return readOneRandomWithID(cache, id);
768  }
769  return true;
770  }
771 
772  void
774  desc.addUntracked<unsigned int>("skipEvents", 0U)
775  ->setComment("Skip the first 'skipEvents' events that otherwise would have been processed.");
776  desc.addUntracked<bool>("noEventSort", true)
777  ->setComment("True: Process runs, lumis and events in the order they appear in the file (but see notes 1 and 2).\n"
778  "False: Process runs, lumis and events in each file in numerical order (run#, lumi#, event#) (but see note 3).\n"
779  "Note 1: Events within the same lumi will always be processed contiguously.\n"
780  "Note 2: Lumis within the same run will always be processed contiguously.\n"
781  "Note 3: Any sorting occurs independently in each input file (no sorting across input files).");
782  desc.addUntracked<bool>("skipBadFiles", false)
783  ->setComment("True: Ignore any missing or unopenable input file.\n"
784  "False: Throw exception if missing or unopenable input file.");
785  desc.addUntracked<bool>("bypassVersionCheck", false)
786  ->setComment("True: Bypass release version check.\n"
787  "False: Throw exception if reading file in a release prior to the release in which the file was written.");
788  desc.addUntracked<unsigned int>("cacheSize", roottree::defaultCacheSize)
789  ->setComment("Size of ROOT TTree prefetch cache. Affects performance.");
790  desc.addUntracked<int>("treeMaxVirtualSize", -1)
791  ->setComment("Size of ROOT TTree TBasket cache. Affects performance.");
792  desc.addUntracked<unsigned int>("setRunNumber", 0U)
793  ->setComment("If non-zero, change number of first run to this number. Apply same offset to all runs. Allowed only for simulation.");
794  desc.addUntracked<bool>("dropDescendantsOfDroppedBranches", true)
795  ->setComment("If True, also drop on input any descendent of any branch dropped on input.");
796  std::string defaultString("permissive");
797  desc.addUntracked<std::string>("branchesMustMatch", defaultString)
798  ->setComment("'strict': Branches in each input file must match those in the first file.\n"
799  "'permissive': Branches in each input file may be any subset of those in the first file.");
800  desc.addUntracked<bool>("labelRawDataLikeMC", true)
801  ->setComment("If True: replace module label for raw data to match MC. Also use 'LHC' as process.");
802 
803  ProductSelectorRules::fillDescription(desc, "inputCommands");
806  }
807 
810  if(rootFile_) {
811  if(!rootFile_->wasLastEventJustRead()) {
813  }
814  std::vector<FileCatalogItem>::const_iterator itr(fileIter_);
815  if(itr != fileIterEnd_) ++itr;
816  if(itr != fileIterEnd_) {
818  }
820  }
822  }
823 
826  if(rootFile_) {
827  if(!rootFile_->wasFirstEventJustRead()) {
829  }
830  if(fileIter_ != fileIterBegin_) {
832  }
834  }
836  }
837 }
RunNumber_t run() const
Definition: EventID.h:42
void readOneSpecified(EventPrincipal &cache, EventID const &id)
ProcessingController::ForwardState forwardState() const
EventNumber_t event() const
Definition: EventID.h:44
ProcessHistoryRegistry const & processHistoryRegistry() const
Const accessor for process history registry.
Definition: InputSource.h:170
T getUntrackedParameter(std::string const &, T const &) const
boost::shared_ptr< ProductRegistry const > fileProductRegistry() const
int i
Definition: DBlmapReader.cc:9
std::vector< boost::shared_ptr< IndexIntoFile > > indexesIntoFiles_
void stagein(const std::string &url)
static void fillDescription(ParameterSetDescription &desc, char const *parameterName)
InputType
Definition: InputType.h:5
list pfn
Definition: dbtoconf.py:76
void initFile(bool skipBadFiles)
bool goToEvent(EventID const &eventID)
ProductSelectorRules productSelectorRules_
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
boost::shared_ptr< BranchIDListHelper const > fileBranchIDListHelper() const
ProcessConfiguration const & processConfiguration() const
unsigned int EventNumber_t
Definition: EventID.h:30
virtual std::string explainSelf() const
Definition: Exception.cc:146
boost::shared_ptr< RunAuxiliary > readRunAuxiliary_()
std::vector< FileCatalogItem >::const_iterator fileIter_
tuple lumi
Definition: fjr2json.py:35
ProductRegistry & productRegistryUpdate() const
boost::shared_ptr< LuminosityBlockAuxiliary > readLuminosityBlockAuxiliary_()
ProcessingMode processingMode() const
RunsLumisAndEvents (default), RunsAndLumis, or Runs.
Definition: InputSource.h:249
static void fillDescription(ParameterSetDescription &desc)
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:43
static void reportSkippedFile(std::string const &fileName, std::string const &logicalFileName)
Definition: InputFile.cc:69
unsigned int const defaultCacheSize
Definition: RootTree.h:37
uint16_t size_type
unsigned int LuminosityBlockNumber_t
Definition: EventID.h:31
static void fillDescription(ParameterSetDescription &desc)
bool skipToItem(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, bool currentFileFirst=true)
static std::string const input
Definition: EdmProvDump.cc:44
bool readOneSequentialWithID(EventPrincipal &cache, LuminosityBlockID const &id)
static StorageFactory * get(void)
tuple InputFile
Open Root file and provide MEs ############.
void readOneRandom(EventPrincipal &cache)
static void reportFallbackAttempt(std::string const &pfn, std::string const &logicalFileName, std::string const &errorMessage)
Definition: InputFile.cc:75
int remainingEvents() const
Definition: InputSource.h:190
std::vector< FileCatalogItem >::const_iterator fileIterLastOpened_
boost::shared_ptr< BranchIDListHelper > branchIDListHelper() const
Accessor for branchIDListHelper.
Definition: InputSource.h:176
std::vector< FileCatalogItem > const & fileCatalogItems() const
bool isAvailable() const
Definition: Service.h:46
ProcessHistoryRegistry const & processHistoryRegistry() const
boost::shared_ptr< DuplicateChecker > duplicateChecker_
std::string merge(ProductRegistry const &other, std::string const &fileName, BranchDescription::MatchMode branchesMustMatch=BranchDescription::Permissive)
bool readOneSequential(EventPrincipal &cache)
#define end
Definition: vmac.h:37
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
void dropUnwantedBranches_(std::vector< std::string > const &wantedBranches)
void readRun_(RunPrincipal &runPrincipal)
void readLuminosityBlock_(LuminosityBlockPrincipal &lumiPrincipal)
tuple out
Definition: dbtoconf.py:99
std::unique_ptr< CLHEP::RandFlat > flatDistribution_
static EntryNumber_t const invalidEntry
std::vector< ProcessHistoryID > orderedProcessHistoryIDs_
void addUntrackedParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:206
ProductRegistry & productRegistryUpdate() const
Definition: InputSource.h:343
bool containedInCurrentFile(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const
bool skipToItemInNewFile(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event)
std::unique_ptr< FileBlock > readFile_()
bool readOneRandomWithID(EventPrincipal &cache, LuminosityBlockID const &id)
InputSource::ItemType getNextItemType(RunNumber_t &run, LuminosityBlockNumber_t &lumi, EventNumber_t &event)
RootInputFileSequence(ParameterSet const &pset, PoolSource &input, InputFileCatalog const &catalog, unsigned int nStreams, InputType inputType)
ProcessHistoryRegistry & processHistoryRegistryForUpdate()
Non-const accessor for process history registry.
Definition: InputSource.h:173
std::vector< FileCatalogItem >::const_iterator fileIterBegin_
boost::shared_ptr< ProductRegistry const > productRegistry() const
Accessor for product registry.
Definition: InputSource.h:167
tuple skipBadFiles
Definition: example_cfg.py:64
static void fillDescription(ParameterSetDescription &desc)
#define begin
Definition: vmac.h:30
boost::shared_ptr< EventSkipperByID > eventSkipperByID_
void updateFromInput(ProductList const &other)
ProcessHistoryRegistry & processHistoryRegistryForUpdate()
void activateTimeout(const std::string &url)
std::vector< FileCatalogItem >::const_iterator fileIterEnd_
int remainingLuminosityBlocks() const
Definition: InputSource.h:198
unsigned int RunNumber_t
Definition: EventRange.h:32
BranchDescription::MatchMode branchesMustMatch_
volatile std::atomic< bool > shutdown_flag false
void readEvent(EventPrincipal &cache)
ProcessConfiguration const & processConfiguration() const
Accessor for Process Configuration.
Definition: InputSource.h:204
ProcessingController::ReverseState reverseState() const
SurfaceDeformation * create(int type, const std::vector< double > &params)
tuple size
Write out results.
boost::shared_ptr< RootFile > RootFileSharedPtr
std::vector< FileCatalogItem > const & fileCatalogItems() const
boost::shared_ptr< ProductRegistry const > productRegistry() const
InputFileCatalog const & catalog_