CMS 3D CMS Logo

CMSSW_4_4_3_patch1/src/FWCore/Sources/src/RawInputSource.cc

Go to the documentation of this file.
00001 /*----------------------------------------------------------------------
00002 ----------------------------------------------------------------------*/
00003 
00004 #include "FWCore/Sources/interface/RawInputSource.h"
00005 
00006 #include "DataFormats/Provenance/interface/EventAuxiliary.h"
00007 #include "DataFormats/Provenance/interface/LuminosityBlockAuxiliary.h"
00008 #include "DataFormats/Provenance/interface/RunAuxiliary.h"
00009 #include "DataFormats/Provenance/interface/Timestamp.h"
00010 #include "FWCore/Framework/interface/Event.h"
00011 #include "FWCore/Framework/interface/EventPrincipal.h"
00012 
00013 namespace edm {
00014   RawInputSource::RawInputSource(ParameterSet const& pset, InputSourceDescription const& desc) :
00015     InputSource(pset, desc),
00016     runNumber_(RunNumber_t()),
00017     luminosityBlockNumber_(),
00018     newRun_(false),
00019     newLumi_(false),
00020     eventCached_(false) {
00021       setTimestamp(Timestamp::beginOfTime());
00022   }
00023 
00024   RawInputSource::~RawInputSource() {
00025   }
00026 
00027   boost::shared_ptr<RunAuxiliary>
00028   RawInputSource::readRunAuxiliary_() {
00029     newRun_ = false;
00030     return boost::shared_ptr<RunAuxiliary>(new RunAuxiliary(runNumber_, timestamp(), Timestamp::invalidTimestamp()));
00031   }
00032 
00033   boost::shared_ptr<LuminosityBlockAuxiliary>
00034   RawInputSource::readLuminosityBlockAuxiliary_() {
00035     newLumi_ = false;
00036     return boost::shared_ptr<LuminosityBlockAuxiliary>(new LuminosityBlockAuxiliary(
00037         runNumber_, luminosityBlockNumber_, timestamp(), Timestamp::invalidTimestamp()));
00038   }
00039 
00040   EventPrincipal*
00041   RawInputSource::readEvent_() {
00042     assert(eventCached_);
00043     eventCached_ = false;
00044     return eventPrincipalCache();
00045   }
00046 
00047   std::auto_ptr<Event>
00048   RawInputSource::makeEvent(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, Timestamp const& tstamp) {
00049     if(!runAuxiliary()) {
00050       newRun_ = newLumi_ = true;
00051       setRunAuxiliary(new RunAuxiliary(run, tstamp, Timestamp::invalidTimestamp()));
00052       readAndCacheRun();
00053       setRunPrematurelyRead();
00054     }
00055     if(!luminosityBlockAuxiliary()) {
00056       setLuminosityBlockAuxiliary(new LuminosityBlockAuxiliary(run, lumi, tstamp, Timestamp::invalidTimestamp()));
00057       newLumi_ = true;
00058       readAndCacheLumi();
00059       setLumiPrematurelyRead();
00060     }
00061     EventSourceSentry sentry(*this);
00062     EventAuxiliary aux(EventID(run, lumi, event), processGUID(), tstamp, true, EventAuxiliary::PhysicsTrigger);
00063     eventPrincipalCache()->fillEventPrincipal(aux, luminosityBlockPrincipal());
00064     eventCached_ = true;
00065     std::auto_ptr<Event> e(new Event(*eventPrincipalCache(), moduleDescription()));
00066     return e;
00067   }
00068 
00069   InputSource::ItemType
00070   RawInputSource::getNextItemType() {
00071     if(state() == IsInvalid) {
00072       return IsFile;
00073     }
00074     if(newRun_) {
00075       return IsRun;
00076     }
00077     if(newLumi_) {
00078       return IsLumi;
00079     }
00080     if(eventCached_) {
00081       return IsEvent;
00082     }
00083     std::auto_ptr<Event> e(readOneEvent());
00084     if(e.get() == 0) {
00085       return IsStop;
00086     } else {
00087       e->commit_();
00088     }
00089     if(e->run() != runNumber_) {
00090       newRun_ = newLumi_ = true;
00091       runNumber_ = e->run();
00092       luminosityBlockNumber_ = e->luminosityBlock();
00093       return IsRun;
00094     } else if(e->luminosityBlock() != luminosityBlockNumber_) {
00095       luminosityBlockNumber_ = e->luminosityBlock();
00096       newLumi_ = true;
00097       return IsLumi;
00098     }
00099     return IsEvent;
00100   }
00101 
00102   EventPrincipal*
00103   RawInputSource::readIt(EventID const&) {
00104       throw Exception(errors::LogicError, "RawInputSource::readEvent_(EventID const& eventID)")
00105         << "Random access read cannot be used for RawInputSource.\n"
00106         << "Contact a Framework developer.\n";
00107   }
00108 
00109   // Not yet implemented
00110   void
00111   RawInputSource::skip(int) {
00112       throw Exception(errors::LogicError, "RawInputSource::skip(int offset)")
00113         << "Random access skip cannot be used for RawInputSource\n"
00114         << "Contact a Framework developer.\n";
00115   }
00116 }