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,
30  PoolSource const& input,
32  InputType::InputType inputType) :
33  input_(input),
34  inputType_(inputType),
35  catalog_(catalog),
36  firstFile_(true),
37  lfn_("unknown"),
38  fileIterBegin_(fileCatalogItems().begin()),
39  fileIterEnd_(fileCatalogItems().end()),
40  fileIter_(fileIterEnd_),
41  fileIterLastOpened_(fileIterEnd_),
42  rootFile_(),
43  parametersMustMatch_(BranchDescription::Permissive),
44  branchesMustMatch_(BranchDescription::Permissive),
45  flatDistribution_(),
46  indexesIntoFiles_(fileCatalogItems().size()),
47  orderedProcessHistoryIDs_(),
48  eventSkipperByID_(inputType == InputType::Primary ? EventSkipperByID::create(pset).release() : 0),
49  eventsRemainingInFile_(0),
50  // The default value provided as the second argument to the getUntrackedParameter function call
51  // is not used when the ParameterSet has been validated and the parameters are not optional
52  // in the description. This is currently true when PoolSource is the primary input source.
53  // The modules that use PoolSource as a SecSource have not defined their fillDescriptions function
54  // yet, so the ParameterSet does not get validated yet. As soon as all the modules with a SecSource
55  // have defined descriptions, the defaults in the getUntrackedParameterSet function calls can
56  // and should be deleted from the code.
57  initialNumberOfEventsToSkip_(inputType == InputType::Primary ? pset.getUntrackedParameter<unsigned int>("skipEvents", 0U) : 0U),
58  noEventSort_(inputType == InputType::Primary ? pset.getUntrackedParameter<bool>("noEventSort", true) : false),
59  skipBadFiles_(pset.getUntrackedParameter<bool>("skipBadFiles", false)),
60  treeCacheSize_(noEventSort_ ? pset.getUntrackedParameter<unsigned int>("cacheSize", roottree::defaultCacheSize) : 0U),
61  treeMaxVirtualSize_(pset.getUntrackedParameter<int>("treeMaxVirtualSize", -1)),
62  setRun_(pset.getUntrackedParameter<unsigned int>("setRunNumber", 0U)),
63  productSelectorRules_(pset, "inputCommands", "InputSource"),
64  duplicateChecker_(inputType == InputType::Primary ? new DuplicateChecker(pset) : 0),
65  dropDescendants_(pset.getUntrackedParameter<bool>("dropDescendantsOfDroppedBranches", inputType != InputType::SecondarySource)),
66  labelRawDataLikeMC_(pset.getUntrackedParameter<bool>("labelRawDataLikeMC", true)),
67  usingGoToEvent_(false),
68  enablePrefetching_(false),
69  usedFallback_(false) {
70 
71  // The SiteLocalConfig controls the TTreeCache size and the prefetching settings.
73  if(pSLC.isAvailable()) {
74  if(treeCacheSize_ != 0U && pSLC->sourceTTreeCacheSize()) {
75  treeCacheSize_ = *(pSLC->sourceTTreeCacheSize());
76  }
77  enablePrefetching_ = pSLC->enablePrefetching();
78  }
79 
82  factory->activateTimeout(fileIter_->fileName());
83  factory->stagein(fileIter_->fileName());
84  //NOTE: we do not want to stage in all secondary files since we can be given a list of
85  // thousands of files and prestaging all those files can cause a site to fail.
86  // So, we stage in the first secondary file only.
88  break;
89  }
90  }
91 
92  std::string parametersMustMatch = pset.getUntrackedParameter<std::string>("parametersMustMatch", std::string("permissive"));
93  if(parametersMustMatch == std::string("strict")) parametersMustMatch_ = BranchDescription::Strict;
94 
95  std::string branchesMustMatch = pset.getUntrackedParameter<std::string>("branchesMustMatch", std::string("permissive"));
96  if(branchesMustMatch == std::string("strict")) branchesMustMatch_ = BranchDescription::Strict;
97 
100  if(rootFile_) break;
101  }
102  if(rootFile_) {
103  productRegistryUpdate().updateFromInput(rootFile_->productRegistry()->productList());
106  }
107  }
108  }
109 
110  std::vector<FileCatalogItem> const&
112  return catalog_.fileCatalogItems();
113  }
114 
115  void
117  closeFile_();
118  }
119 
120  std::unique_ptr<FileBlock>
122  if(firstFile_) {
123  // The first input file has already been opened.
124  firstFile_ = false;
125  if(!rootFile_) {
127  }
128  } else {
129  if(!nextFile()) {
130  assert(0);
131  }
132  }
133  if(!rootFile_) {
134  return std::unique_ptr<FileBlock>(new FileBlock);
135  }
136  return rootFile_->createFileBlock();
137  }
138 
140  // close the currently open file, if any, and delete the RootFile object.
141  if(rootFile_) {
143  std::unique_ptr<InputSource::FileCloseSentry>
145  rootFile_->close();
146  if(duplicateChecker_) duplicateChecker_->inputFileClosed();
147  }
148  rootFile_.reset();
149  }
150  }
151 
153  // We are really going to close the open file.
154 
155  // If this is the primary sequence, we are not duplicate checking across files
156  // and we are not using random access to find events, then we can delete the
157  // IndexIntoFile for the file we are closing. If we can't delete all of it,
158  // then we can delete the parts we do not need.
160  size_t currentIndexIntoFile = fileIterLastOpened_ - fileIterBegin_;
161  bool needIndexesForDuplicateChecker = duplicateChecker_ && duplicateChecker_->checkingAllFiles() && !duplicateChecker_->checkDisabled();
162  bool deleteIndexIntoFile = inputType_ == InputType::Primary &&
163  !needIndexesForDuplicateChecker &&
165  if(deleteIndexIntoFile) {
166  indexesIntoFiles_[currentIndexIntoFile].reset();
167  } else {
168  if(indexesIntoFiles_[currentIndexIntoFile]) indexesIntoFiles_[currentIndexIntoFile]->inputFileClosed();
169  }
171  }
172  closeFile_();
173 
174  if(fileIter_ == fileIterEnd_) {
175  // No files specified
176  return;
177  }
178 
179  // Check if the logical file name was found.
180  if(fileIter_->fileName().empty()) {
181  // LFN not found in catalog.
182  InputFile::reportSkippedFile(fileIter_->fileName(), fileIter_->logicalFileName());
183  if(!skipBadFiles) {
184  throw cms::Exception("LogicalFileNameNotFound", "RootInputFileSequence::initFile()\n")
185  << "Logical file name '" << fileIter_->logicalFileName() << "' was not found in the file catalog.\n"
186  << "If you wanted a local file, you forgot the 'file:' prefix\n"
187  << "before the file name in your configuration file.\n";
188  }
189  LogWarning("") << "Input logical file: " << fileIter_->logicalFileName() << " was not found in the catalog, and will be skipped.\n";
190  return;
191  }
192 
193  lfn_ = fileIter_->logicalFileName().empty() ? fileIter_->fileName() : fileIter_->logicalFileName();
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 "));
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  std::unique_ptr<InputSource::FileOpenSentry>
228  filePtr.reset(new InputFile(gSystem->ExpandPathName(fallbackName.c_str()), " Fallback request to file "));
229  usedFallback_ = true;
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_;
246  rootFile_ = RootFileSharedPtr(new RootFile(fileIter_->fileName(),
247  processConfiguration(), fileIter_->logicalFileName(), filePtr,
251  setRun_,
252  noEventSort_,
254  inputType_,
255  (inputType_ == InputType::SecondarySource ? boost::shared_ptr<BranchIDListHelper>(new BranchIDListHelper()) : input_.branchIDListHelper()),
259  currentIndexIntoFile,
264 
266  indexesIntoFiles_[currentIndexIntoFile] = rootFile_->indexIntoFileSharedPtr();
267  char const* inputType = 0;
268  switch(inputType_) {
269  case InputType::Primary: inputType = "primaryFiles"; break;
270  case InputType::SecondaryFile: inputType = "secondaryFiles"; break;
271  case InputType::SecondarySource: inputType = "mixingFiles"; break;
272  }
273  rootFile_->reportOpened(inputType);
274  } else {
275  InputFile::reportSkippedFile(fileIter_->fileName(), fileIter_->logicalFileName());
276  if(!skipBadFiles) {
278  "RootInputFileSequence::initFile(): Input file " << fileIter_->fileName() << " was not found or could not be opened.\n";
279  }
280  LogWarning("") << "Input file: " << fileIter_->fileName() << " was not found or could not be opened, and will be skipped.\n";
281  }
282  }
283 
284  boost::shared_ptr<ProductRegistry const>
286  assert(rootFile_);
287  return rootFile_->productRegistry();
288  }
289 
290  boost::shared_ptr<BranchIDListHelper const>
292  assert(rootFile_);
293  return rootFile_->branchIDListHelper();
294  }
295 
298  if(fileIter_ == fileIterEnd_) {
300  return false;
301  } else {
303  }
304  }
305 
307 
309  // make sure the new product registry is compatible with the main one
310  std::string mergeInfo = productRegistryUpdate().merge(*rootFile_->productRegistry(),
311  fileIter_->fileName(),
314  if(!mergeInfo.empty()) {
315  throw Exception(errors::MismatchedInputFiles,"RootInputFileSequence::nextFile()") << mergeInfo;
316  }
317  }
318  return true;
319  }
320 
322  if(fileIter_ == fileIterBegin_) {
324  return false;
325  } else {
327  }
328  }
329  --fileIter_;
330 
331  initFile(false);
332 
334  // make sure the new product registry is compatible to the main one
335  std::string mergeInfo = productRegistryUpdate().merge(*rootFile_->productRegistry(),
336  fileIter_->fileName(),
339  if(!mergeInfo.empty()) {
340  throw Exception(errors::MismatchedInputFiles,"RootInputFileSequence::previousEvent()") << mergeInfo;
341  }
342  }
343  if(rootFile_) rootFile_->setToLastEntry();
344  return true;
345  }
346 
348  }
349 
350  boost::shared_ptr<RunAuxiliary>
352  return rootFile_->readRunAuxiliary_();
353  }
354 
355  boost::shared_ptr<LuminosityBlockAuxiliary>
357  return rootFile_->readLuminosityBlockAuxiliary_();
358  }
359 
360  boost::shared_ptr<RunPrincipal>
361  RootInputFileSequence::readRun_(boost::shared_ptr<RunPrincipal> runPrincipal) {
362  return rootFile_->readRun_(runPrincipal);
363  }
364 
365  boost::shared_ptr<LuminosityBlockPrincipal>
366  RootInputFileSequence::readLuminosityBlock_(boost::shared_ptr<LuminosityBlockPrincipal> lumiPrincipal) {
367  return rootFile_->readLumi(lumiPrincipal);
368  }
369 
370  // readEvent() is responsible for setting up the EventPrincipal.
371  //
372  // 1. fill an EventPrincipal with a unique EventID
373  // 2. For each entry in the provenance, put in one ProductHolder,
374  // holding the Provenance for the corresponding EDProduct.
375  // 3. set up the caches in the EventPrincipal to know about this
376  // ProductHolder.
377  //
378  // We do *not* create the EDProduct instance (the equivalent of reading
379  // the branch containing this EDProduct. That will be done by the Delayed Reader,
380  // when it is asked to do so.
381  //
382 
385  return rootFile_->readEvent(eventPrincipal);
386  }
387 
390  if(fileIter_ == fileIterEnd_) {
391  return InputSource::IsStop;
392  }
393  if(firstFile_) {
394  return InputSource::IsFile;
395  }
396  if(rootFile_) {
397  IndexIntoFile::EntryType entryType = rootFile_->getNextEntryTypeWanted();
398  if(entryType == IndexIntoFile::kEvent) {
399  return InputSource::IsEvent;
400  } else if(entryType == IndexIntoFile::kLumi) {
401  return InputSource::IsLumi;
402  } else if(entryType == IndexIntoFile::kRun) {
403  return InputSource::IsRun;
404  }
405  assert(entryType == IndexIntoFile::kEnd);
406  }
407  if(fileIter_ + 1 == fileIterEnd_) {
408  return InputSource::IsStop;
409  }
410  return InputSource::IsFile;
411  }
412 
413  // Rewind to before the first event that was read.
414  void
416  if(fileIter_ != fileIterBegin_) {
417  closeFile_();
419  }
420  if(!rootFile_) {
421  initFile(false);
422  }
423  rewindFile();
424  firstFile_ = true;
425  if(rootFile_) {
428  }
429  }
430  }
431 
432  // Rewind to the beginning of the current file
433  void
435  if(rootFile_) rootFile_->rewind();
436  }
437 
438  // Advance "offset" events. Offset can be positive or negative (or zero).
439  bool
441  while(offset != 0) {
442  bool atEnd = rootFile_->skipEvents(offset);
443  if((offset > 0 || atEnd) && !nextFile()) {
444  return false;
445  }
446  if(offset < 0 && !previousFile()) {
448  return false;
449  }
450  }
451  return true;
452  }
453 
454  bool
456  usingGoToEvent_ = true;
457  if(rootFile_) {
458  if(rootFile_->goToEvent(eventID)) {
459  return true;
460  }
461  // If only one input file, give up now, to save time.
462  if(rootFile_ && indexesIntoFiles_.size() == 1) {
463  return false;
464  }
465  // Save the current file and position so that we can restore them
466  // if we fail to restore the desired event
467  bool closedOriginalFile = false;
468  std::vector<FileCatalogItem>::const_iterator originalFile = fileIter_;
469  IndexIntoFile::IndexIntoFileItr originalPosition = rootFile_->indexIntoFileIter();
470 
471  // Look for item (run/lumi/event) in files previously opened without reopening unnecessary files.
472  typedef std::vector<boost::shared_ptr<IndexIntoFile> >::const_iterator Iter;
473  for(Iter it = indexesIntoFiles_.begin(), itEnd = indexesIntoFiles_.end(); it != itEnd; ++it) {
474  if(*it && (*it)->containsItem(eventID.run(), eventID.luminosityBlock(), eventID.event())) {
475  // We found it. Close the currently open file, and open the correct one.
476  fileIter_ = fileIterBegin_ + (it - indexesIntoFiles_.begin());
477  initFile(false);
478  // Now get the item from the correct file.
479  bool found = rootFile_->goToEvent(eventID);
480  assert (found);
481  return true;
482  }
483  }
484  // Look for item in files not yet opened.
485  for(Iter it = indexesIntoFiles_.begin(), itEnd = indexesIntoFiles_.end(); it != itEnd; ++it) {
486  if(!*it) {
487  fileIter_ = fileIterBegin_ + (it - indexesIntoFiles_.begin());
488  initFile(false);
489  closedOriginalFile = true;
490  if((*it)->containsItem(eventID.run(), eventID.luminosityBlock(), eventID.event())) {
491  if (rootFile_->goToEvent(eventID)) {
492  return true;
493  }
494  }
495  }
496  }
497  if(closedOriginalFile) {
498  fileIter_ = originalFile;
499  initFile(false);
500  rootFile_->setPosition(originalPosition);
501  }
502  }
503  return false;
504  }
505 
506  bool
508  // Look for item in files not yet opened.
509  typedef std::vector<boost::shared_ptr<IndexIntoFile> >::const_iterator Iter;
510  for(Iter it = indexesIntoFiles_.begin(), itEnd = indexesIntoFiles_.end(); it != itEnd; ++it) {
511  if(!*it) {
512  fileIter_ = fileIterBegin_ + (it - indexesIntoFiles_.begin());
513  initFile(false);
514  bool found = rootFile_->setEntryAtItem(run, lumi, event);
515  if(found) {
516  return true;
517  }
518  }
519  }
520  // Not found
521  return false;
522  }
523 
524  bool
526  // Attempt to find item in currently open input file.
527  bool found = currentFileFirst && rootFile_ && rootFile_->setEntryAtItem(run, lumi, event);
528  if(!found) {
529  // If only one input file, give up now, to save time.
530  if(currentFileFirst && rootFile_ && indexesIntoFiles_.size() == 1) {
531  return false;
532  }
533  // Look for item (run/lumi/event) in files previously opened without reopening unnecessary files.
534  typedef std::vector<boost::shared_ptr<IndexIntoFile> >::const_iterator Iter;
535  for(Iter it = indexesIntoFiles_.begin(), itEnd = indexesIntoFiles_.end(); it != itEnd; ++it) {
536  if(*it && (*it)->containsItem(run, lumi, event)) {
537  // We found it. Close the currently open file, and open the correct one.
538  std::vector<FileCatalogItem>::const_iterator currentIter = fileIter_;
539  fileIter_ = fileIterBegin_ + (it - indexesIntoFiles_.begin());
540  if(fileIter_ != currentIter) {
541  initFile(false);
542  }
543  // Now get the item from the correct file.
544  found = rootFile_->setEntryAtItem(run, lumi, event);
545  assert (found);
546  return true;
547  }
548  }
549  // Look for item in files not yet opened.
550  return skipToItemInNewFile(run, lumi, event);
551  }
552  return true;
553  }
554 
555  ProcessConfiguration const&
557  return input_.processConfiguration();
558  }
559 
560  int
562  return input_.remainingEvents();
563  }
564 
565  int
568  }
569 
572  return input_.productRegistryUpdate();
573  }
574 
575  boost::shared_ptr<ProductRegistry const>
577  return input_.productRegistry();
578  }
579 
580  void
581  RootInputFileSequence::dropUnwantedBranches_(std::vector<std::string> const& wantedBranches) {
582  std::vector<std::string> rules;
583  rules.reserve(wantedBranches.size() + 1);
584  rules.emplace_back("drop *");
585  for(std::vector<std::string>::const_iterator it = wantedBranches.begin(), itEnd = wantedBranches.end();
586  it != itEnd; ++it) {
587  rules.push_back("keep " + *it + "_*");
588  }
589  ParameterSet pset;
590  pset.addUntrackedParameter("inputCommands", rules);
591  productSelectorRules_ = ProductSelectorRules(pset, "inputCommands", "InputSource");
592  }
593 
596  skipBadFiles_ = false;
597  if(fileIter_ == fileIterEnd_ || !rootFile_) {
599  throw Exception(errors::Configuration) << "RootInputFileSequence::readOneSequential(): no input files specified for secondary input source.\n";
600  }
602  initFile(false);
603  rootFile_->setAtEventEntry(-1);
604  }
605  rootFile_->nextEventEntry();
606  EventPrincipal* ep = rootFile_->readCurrentEvent(cache);
607  if(ep == 0) {
608  ++fileIter_;
609  if(fileIter_ == fileIterEnd_) {
610  return 0;
611  }
612  initFile(false);
613  rootFile_->setAtEventEntry(-1);
614  return readOneSequential(cache);
615  }
616  return ep;
617  }
618 
622  throw Exception(errors::Configuration) << "RootInputFileSequence::readOneSequentialWithID(): no input files specified for secondary input source.\n";
623  }
624  skipBadFiles_ = false;
625  if(fileIter_ == fileIterEnd_ || !rootFile_ ||
626  rootFile_->indexIntoFileIter().run() != id.run() ||
627  rootFile_->indexIntoFileIter().lumi() != id.luminosityBlock()) {
628  bool found = skipToItem(id.run(), id.luminosityBlock(), 0, false);
629  if(!found) {
630  return 0;
631  }
632  }
633  bool nextFound = rootFile_->setEntryAtNextEventInLumi(id.run(), id.luminosityBlock());
634  EventPrincipal* ep = (nextFound ? rootFile_->readCurrentEvent(cache) : 0);
635  if(ep == 0) {
636  bool found = skipToItemInNewFile(id.run(), id.luminosityBlock(), 0);
637  if(found) {
638  return readOneSequentialWithID(cache, id);
639  }
640  }
641  return ep;
642  }
643 
647  throw Exception(errors::Configuration) << "RootInputFileSequence::readOneSpecified(): no input files specified for secondary input source.\n";
648  }
649  skipBadFiles_ = false;
650  bool found = skipToItem(id.run(), id.luminosityBlock(), id.event());
651  if(!found) {
652  throw Exception(errors::NotFound) <<
653  "RootInputFileSequence::readOneSpecified(): Secondary Input files" <<
654  " do not contain specified event:\n" << id << "\n";
655  }
656  EventPrincipal* ep = rootFile_->readCurrentEvent(cache);
657  assert(ep != 0);
658  return ep;
659  }
660 
664  throw Exception(errors::Configuration) << "RootInputFileSequence::readOneRandom(): no input files specified for secondary input source.\n";
665  }
666  if(!flatDistribution_) {
668  CLHEP::HepRandomEngine& engine = rng->getEngine();
669  flatDistribution_.reset(new CLHEP::RandFlat(engine));
670  }
671  skipBadFiles_ = false;
672  unsigned int currentSeqNumber = fileIter_ - fileIterBegin_;
673  while(eventsRemainingInFile_ == 0) {
674  fileIter_ = fileIterBegin_ + flatDistribution_->fireInt(fileCatalogItems().size());
675  unsigned int newSeqNumber = fileIter_ - fileIterBegin_;
676  if(newSeqNumber != currentSeqNumber) {
677  initFile(false);
678  currentSeqNumber = newSeqNumber;
679  }
680  eventsRemainingInFile_ = rootFile_->eventTree().entries();
681  if(eventsRemainingInFile_ == 0) {
682  throw Exception(errors::NotFound) <<
683  "RootInputFileSequence::readOneRandom(): Secondary Input file " << fileIter_->fileName() << " contains no events.\n";
684  }
685  rootFile_->setAtEventEntry(flatDistribution_->fireInt(eventsRemainingInFile_) - 1);
686  }
687  rootFile_->nextEventEntry();
688 
689  EventPrincipal* ep = rootFile_->readCurrentEvent(cache);
690  if(ep == 0) {
691  rootFile_->setAtEventEntry(0);
692  ep = rootFile_->readCurrentEvent(cache);
693  assert(ep != 0);
694  }
696  return ep;
697  }
698 
699  // bool RootFile::setEntryAtNextEventInLumi(RunNumber_t run, LuminosityBlockNumber_t lumi) {
700 
704  throw Exception(errors::Configuration) << "RootInputFileSequence::readOneRandomWithID(): no input files specified for secondary input source.\n";
705  }
706  if(!flatDistribution_) {
708  CLHEP::HepRandomEngine& engine = rng->getEngine();
709  flatDistribution_.reset(new CLHEP::RandFlat(engine));
710  }
711  skipBadFiles_ = false;
712  if(fileIter_ == fileIterEnd_ || !rootFile_ ||
713  rootFile_->indexIntoFileIter().run() != id.run() ||
714  rootFile_->indexIntoFileIter().lumi() != id.luminosityBlock()) {
715  bool found = skipToItem(id.run(), id.luminosityBlock(), 0);
716  if(!found) {
717  return 0;
718  }
719  int eventsInLumi = 0;
720  while(rootFile_->setEntryAtNextEventInLumi(id.run(), id.luminosityBlock())) ++eventsInLumi;
721  found = skipToItem(id.run(), id.luminosityBlock(), 0);
722  assert(found);
723  int eventInLumi = flatDistribution_->fireInt(eventsInLumi);
724  for(int i = 0; i < eventInLumi; ++i) {
725  bool found = rootFile_->setEntryAtNextEventInLumi(id.run(), id.luminosityBlock());
726  assert(found);
727  }
728  }
729  bool nextFound = rootFile_->setEntryAtNextEventInLumi(id.run(), id.luminosityBlock());
730  EventPrincipal* ep = (nextFound ? rootFile_->readCurrentEvent(cache) : 0);
731  if(ep == 0) {
732  bool found = rootFile_->setEntryAtItem(id.run(), id.luminosityBlock(), 0);
733  if(found) {
734  return readOneRandomWithID(cache, id);
735  }
736  }
737  return ep;
738  }
739 
740  void
742  desc.addUntracked<unsigned int>("skipEvents", 0U)
743  ->setComment("Skip the first 'skipEvents' events that otherwise would have been processed.");
744  desc.addUntracked<bool>("noEventSort", true)
745  ->setComment("True: Process runs, lumis and events in the order they appear in the file (but see notes 1 and 2).\n"
746  "False: Process runs, lumis and events in each file in numerical order (run#, lumi#, event#) (but see note 3).\n"
747  "Note 1: Events within the same lumi will always be processed contiguously.\n"
748  "Note 2: Lumis within the same run will always be processed contiguously.\n"
749  "Note 3: Any sorting occurs independently in each input file (no sorting across input files).");
750  desc.addUntracked<bool>("skipBadFiles", false)
751  ->setComment("True: Ignore any missing or unopenable input file.\n"
752  "False: Throw exception if missing or unopenable input file.");
753  desc.addUntracked<unsigned int>("cacheSize", roottree::defaultCacheSize)
754  ->setComment("Size of ROOT TTree prefetch cache. Affects performance.");
755  desc.addUntracked<int>("treeMaxVirtualSize", -1)
756  ->setComment("Size of ROOT TTree TBasket cache. Affects performance.");
757  desc.addUntracked<unsigned int>("setRunNumber", 0U)
758  ->setComment("If non-zero, change number of first run to this number. Apply same offset to all runs. Allowed only for simulation.");
759  desc.addUntracked<bool>("dropDescendantsOfDroppedBranches", true)
760  ->setComment("If True, also drop on input any descendent of any branch dropped on input.");
761  std::string defaultString("permissive");
762  desc.addUntracked<std::string>("parametersMustMatch", defaultString)
763  ->setComment("'strict': Values of tracked parameters must be unique across all input files.\n"
764  "'permissive': Values of tracked parameters may differ across or within files.");
765  desc.addUntracked<std::string>("branchesMustMatch", defaultString)
766  ->setComment("'strict': Branches in each input file must match those in the first file.\n"
767  "'permissive': Branches in each input file may be any subset of those in the first file.");
768  desc.addUntracked<bool>("labelRawDataLikeMC", true)
769  ->setComment("If True: replace module label for raw data to match MC. Also use 'LHC' as process.");
770 
771  ProductSelectorRules::fillDescription(desc, "inputCommands");
774  }
775 
778  if(rootFile_) {
779  if(!rootFile_->wasLastEventJustRead()) {
781  }
782  std::vector<FileCatalogItem>::const_iterator itr(fileIter_);
783  if(itr != fileIterEnd_) ++itr;
784  if(itr != fileIterEnd_) {
786  }
788  }
790  }
791 
794  if(rootFile_) {
795  if(!rootFile_->wasFirstEventJustRead()) {
797  }
798  if(fileIter_ != fileIterBegin_) {
800  }
802  }
804  }
805 }
RunNumber_t run() const
Definition: EventID.h:42
ProcessingController::ForwardState forwardState() const
EventNumber_t event() const
Definition: EventID.h:44
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)
EventPrincipal * readOneSpecified(EventPrincipal &cache, EventID const &id)
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
EventPrincipal * readEvent(EventPrincipal &cache)
unsigned int EventNumber_t
Definition: EventID.h:30
boost::shared_ptr< LuminosityBlockPrincipal > readLuminosityBlock_(boost::shared_ptr< LuminosityBlockPrincipal > lumiPrincipal)
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:238
static void fillDescription(ParameterSetDescription &desc)
std::string merge(ProductRegistry const &other, std::string const &fileName, BranchDescription::MatchMode parametersMustMatch=BranchDescription::Permissive, BranchDescription::MatchMode branchesMustMatch=BranchDescription::Permissive)
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:43
static void reportSkippedFile(std::string const &fileName, std::string const &logicalFileName)
Definition: InputFile.cc:67
unsigned int const defaultCacheSize
Definition: RootTree.h:35
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 StorageFactory * get(void)
EventPrincipal * readOneSequentialWithID(EventPrincipal &cache, LuminosityBlockID const &id)
tuple InputFile
Open Root file and provide MEs ############.
static void reportFallbackAttempt(std::string const &pfn, std::string const &logicalFileName, std::string const &errorMessage)
Definition: InputFile.cc:73
int remainingEvents() const
Definition: InputSource.h:179
std::vector< FileCatalogItem >::const_iterator fileIterLastOpened_
boost::shared_ptr< BranchIDListHelper > branchIDListHelper() const
Accessor for branchIDListHelper.
Definition: InputSource.h:165
EventPrincipal * readOneRandomWithID(EventPrincipal &cache, LuminosityBlockID const &id)
std::vector< FileCatalogItem > const & fileCatalogItems() const
RootInputFileSequence(ParameterSet const &pset, PoolSource const &input, InputFileCatalog const &catalog, InputType::InputType inputType)
bool isAvailable() const
Definition: Service.h:47
boost::shared_ptr< DuplicateChecker > duplicateChecker_
EventPrincipal * readOneRandom(EventPrincipal &cache)
#define end
Definition: vmac.h:38
EventPrincipal * readOneSequential(EventPrincipal &cache)
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)
tuple out
Definition: dbtoconf.py:99
std::unique_ptr< CLHEP::RandFlat > flatDistribution_
std::vector< ProcessHistoryID > orderedProcessHistoryIDs_
void addUntrackedParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:209
ProductRegistry & productRegistryUpdate() const
Definition: InputSource.h:316
bool skipToItemInNewFile(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event)
std::unique_ptr< FileBlock > readFile_()
std::vector< FileCatalogItem >::const_iterator fileIterBegin_
boost::shared_ptr< ProductRegistry const > productRegistry() const
Accessor for product registry.
Definition: InputSource.h:162
tuple skipBadFiles
Definition: example_cfg.py:64
static void fillDescription(ParameterSetDescription &desc)
#define begin
Definition: vmac.h:31
InputSource::ItemType getNextItemType()
boost::shared_ptr< EventSkipperByID > eventSkipperByID_
void updateFromInput(ProductList const &other)
void activateTimeout(const std::string &url)
std::vector< FileCatalogItem >::const_iterator fileIterEnd_
int remainingLuminosityBlocks() const
Definition: InputSource.h:187
unsigned int RunNumber_t
Definition: EventRange.h:32
BranchDescription::MatchMode branchesMustMatch_
ProcessConfiguration const & processConfiguration() const
Accessor for Process Configuration.
Definition: InputSource.h:193
ProcessingController::ReverseState reverseState() const
BranchDescription::MatchMode parametersMustMatch_
boost::shared_ptr< RunPrincipal > readRun_(boost::shared_ptr< RunPrincipal > runPrincipal)
InputType::InputType inputType_
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_