CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/FWCore/Framework/interface/InputSource.h

Go to the documentation of this file.
00001 #ifndef FWCore_Framework_InputSource_h
00002 #define FWCore_Framework_InputSource_h
00003 
00004 /*----------------------------------------------------------------------
00005 
00006 InputSource: Abstract interface for all input sources. Input
00007 sources are responsible for creating an EventPrincipal, using data
00008 controlled by the source, and external to the EventPrincipal itself.
00009 
00010 The InputSource is also responsible for dealing with the "process
00011 name list" contained within the EventPrincipal. Each InputSource has
00012 to know what "process" (HLT, PROD, USER, USER1, etc.) the program is
00013 part of. The InputSource is repsonsible for pushing this process name
00014 onto the end of the process name list.
00015 
00016 For now, we specify this process name to the constructor of the
00017 InputSource. This should be improved.
00018 
00019  Some questions about this remain:
00020 
00021    1. What should happen if we "rerun" a process? i.e., if "USER1" is
00022    already last in our input file, and we run again a job which claims
00023    to be "USER1", what should happen? For now, we just quietly add
00024    this to the history.
00025 
00026    2. Do we need to detect a problem with a history like:
00027          HLT PROD USER1 PROD
00028    or is it up to the user not to do something silly? Right now, there
00029    is no protection against such sillyness.
00030 
00031 Some examples of InputSource subclasses may be:
00032 
00033  1) EmptySource: creates EventPrincipals which contain no EDProducts.
00034  2) PoolSource: creates EventPrincipals which "contain" the data
00035     read from a EDM/ROOT file. This source should provide for delayed loading
00036     of data, thus the quotation marks around contain.
00037  3) DAQSource: creats EventPrincipals which contain raw data, as
00038     delivered by the L1 trigger and event builder.
00039 
00040 ----------------------------------------------------------------------*/
00041 
00042 #include "DataFormats/Provenance/interface/LuminosityBlockAuxiliary.h"
00043 #include "DataFormats/Provenance/interface/LuminosityBlockID.h"
00044 #include "DataFormats/Provenance/interface/ModuleDescription.h"
00045 #include "DataFormats/Provenance/interface/RunAuxiliary.h"
00046 #include "DataFormats/Provenance/interface/RunID.h"
00047 #include "DataFormats/Provenance/interface/Timestamp.h"
00048 #include "FWCore/Framework/interface/Frameworkfwd.h"
00049 #include "FWCore/Framework/interface/ProcessingController.h"
00050 #include "FWCore/Framework/interface/ProductRegistryHelper.h"
00051 
00052 #include "boost/shared_ptr.hpp"
00053 #include "boost/utility.hpp"
00054 #include "sigc++/signal.h"
00055 
00056 #include <string>
00057 
00058 namespace edm {
00059   class ActivityRegistry;
00060   class ConfigurationDescriptions;
00061   class ParameterSet;
00062   class ParameterSetDescription;
00063   namespace multicore {
00064     class MessageReceiverForSource;
00065   }
00066 
00067   class InputSource : private ProductRegistryHelper, private boost::noncopyable {
00068   public:
00069     enum ItemType {
00070       IsInvalid,
00071       IsStop,
00072       IsFile,
00073       IsRun,
00074       IsLumi,
00075       IsEvent,
00076       IsRepeat
00077     };
00078 
00079     enum ProcessingMode {
00080       Runs,
00081       RunsAndLumis,
00082       RunsLumisAndEvents
00083     };
00084 
00085     typedef ProductRegistryHelper::TypeLabelList TypeLabelList;
00087     explicit InputSource(ParameterSet const&, InputSourceDescription const&);
00088 
00090     virtual ~InputSource();
00091 
00092     static void fillDescriptions(ConfigurationDescriptions& descriptions);
00093     static const std::string& baseType();
00094     static void fillDescription(ParameterSetDescription& desc);
00095 
00096     ItemType nextItemType();
00097 
00100     EventPrincipal* readEvent(boost::shared_ptr<LuminosityBlockPrincipal> lbCache);
00101 
00103     EventPrincipal* readEvent(EventID const&);
00104 
00106     boost::shared_ptr<LuminosityBlockAuxiliary> readLuminosityBlockAuxiliary() {
00107       return readLuminosityBlockAuxiliary_();
00108     }
00109 
00111     boost::shared_ptr<RunAuxiliary> readRunAuxiliary() {return readRunAuxiliary_();}
00112 
00114     void readAndCacheRun();
00115 
00117     int markRun();
00118 
00120     void readAndCacheLumi();
00121 
00123     int markLumi();
00124 
00126     boost::shared_ptr<FileBlock> readFile();
00127 
00129     void closeFile(boost::shared_ptr<FileBlock>);
00130 
00133     void skipEvents(int offset);
00134 
00135     bool goToEvent(EventID const& eventID);
00136 
00138     void rewind() {
00139       doneReadAhead_ = false;
00140       state_ = IsInvalid;
00141       remainingEvents_ = maxEvents_;
00142       rewind_();
00143     }
00144 
00146     void wakeUp() {wakeUp_();}
00147 
00149     void setRunNumber(RunNumber_t r) {setRun(r);}
00150 
00152     void setLuminosityBlockNumber_t(LuminosityBlockNumber_t lb) {setLumi(lb);}
00153 
00155     void issueReports(EventID const& eventID);
00156 
00158     void registerProducts();
00159 
00161     boost::shared_ptr<ProductRegistry const> productRegistry() const {return productRegistry_;}
00162 
00164     void repeat() {
00165       remainingEvents_ = maxEvents_;
00166       remainingLumis_ = maxLumis_;
00167       doneReadAhead_ = false;
00168     }
00169 
00172     int maxEvents() const {return maxEvents_;}
00173 
00176     int remainingEvents() const {return remainingEvents_;}
00177 
00180     int maxLuminosityBlocks() const {return maxLumis_;}
00181 
00184     int remainingLuminosityBlocks() const {return remainingLumis_;}
00185 
00187     ModuleDescription const& moduleDescription() const {return moduleDescription_;}
00188 
00190     ProcessConfiguration const& processConfiguration() const {return moduleDescription().processConfiguration();}
00191 
00193     bool const primary() const {return primary_;}
00194 
00196     std::string const& processGUID() const {return processGUID_;}
00197 
00199     void doBeginJob();
00200 
00202     void doEndJob();
00203 
00205     void doBeginLumi(LuminosityBlockPrincipal& lbp);
00206 
00208     void doEndLumi(LuminosityBlockPrincipal& lbp);
00209 
00211     void doBeginRun(RunPrincipal& rp);
00212 
00214     void doEndRun(RunPrincipal& rp);
00215 
00217     void doPreForkReleaseResources();
00218     void doPostForkReacquireResources(boost::shared_ptr<multicore::MessageReceiverForSource>);
00219 
00221     Timestamp const& timestamp() const {return time_;}
00222 
00224     ProcessHistoryID const&  processHistoryID() const;
00225 
00227     RunNumber_t run() const;
00228 
00230     LuminosityBlockNumber_t luminosityBlock() const;
00231 
00233     ProcessingMode processingMode() const {return processingMode_;}
00234 
00236     boost::shared_ptr<ActivityRegistry> actReg() const {return actReg_;}
00237 
00239     boost::shared_ptr<RunAuxiliary> runAuxiliary() const {return runAuxiliary_;}
00240 
00242     boost::shared_ptr<LuminosityBlockAuxiliary> luminosityBlockAuxiliary() const {return lumiAuxiliary_;}
00243 
00244     bool randomAccess() const { return randomAccess_(); }
00245     ProcessingController::ForwardState forwardState() const { return forwardState_(); }
00246     ProcessingController::ReverseState reverseState() const { return reverseState_(); }
00247 
00248     using ProductRegistryHelper::produces;
00249     using ProductRegistryHelper::typeLabelList;
00250 
00251     class SourceSentry : private boost::noncopyable {
00252     public:
00253       typedef sigc::signal<void> Sig;
00254       SourceSentry(Sig& pre, Sig& post);
00255       ~SourceSentry();
00256     private:
00257       Sig& post_;
00258     };
00259 
00260     class EventSourceSentry {
00261     public:
00262       explicit EventSourceSentry(InputSource const& source);
00263     private:
00264       SourceSentry sentry_;
00265     };
00266 
00267     class LumiSourceSentry {
00268     public:
00269       explicit LumiSourceSentry(InputSource const& source);
00270     private:
00271       SourceSentry sentry_;
00272     };
00273 
00274     class RunSourceSentry {
00275     public:
00276       explicit RunSourceSentry(InputSource const& source);
00277     private:
00278       SourceSentry sentry_;
00279     };
00280 
00281     class FileOpenSentry {
00282     public:
00283       explicit FileOpenSentry(InputSource const& source);
00284     private:
00285       SourceSentry sentry_;
00286     };
00287 
00288     class FileCloseSentry {
00289     public:
00290       explicit FileCloseSentry(InputSource const& source);
00291     private:
00292       SourceSentry sentry_;
00293     };
00294 
00295   protected:
00297     void setTimestamp(Timestamp const& theTime) {time_ = theTime;}
00298 
00299     ProductRegistry& productRegistryUpdate() const {return const_cast<ProductRegistry&>(*productRegistry_);}
00300     ItemType state() const{return state_;}
00301     void setRunAuxiliary(RunAuxiliary* rp) {runAuxiliary_.reset(rp);}
00302     void setLuminosityBlockAuxiliary(LuminosityBlockAuxiliary* lbp) {lumiAuxiliary_.reset(lbp);}
00303     void resetRunAuxiliary() const {
00304       runAuxiliary_.reset();
00305     }
00306     void resetLuminosityBlockAuxiliary() const {
00307       lumiAuxiliary_.reset();
00308     }
00309     void reset() const {
00310       resetLuminosityBlockAuxiliary();
00311       resetRunAuxiliary();
00312       doneReadAhead_ = false;
00313       state_ = IsInvalid;
00314     }
00315     EventPrincipal* const eventPrincipalCache();
00316     PrincipalCache const& principalCache() const {return *principalCache_;}
00317     PrincipalCache& principalCache() {return *principalCache_;}
00318     boost::shared_ptr<LuminosityBlockPrincipal> const luminosityBlockPrincipal() const;
00319     boost::shared_ptr<RunPrincipal> const runPrincipal() const;
00320 
00321     void setRunPrematurelyRead() {runPrematurelyRead_ = true;}
00322     void setLumiPrematurelyRead() {lumiPrematurelyRead_ = true;}
00323 
00326     void decreaseRemainingEventsBy(int iSkipped);
00327 
00328   private:
00329     bool eventLimitReached() const {return remainingEvents_ == 0;}
00330     bool lumiLimitReached() const {return remainingLumis_ == 0;}
00331     bool limitReached() const {return eventLimitReached() || lumiLimitReached();}
00332     virtual ItemType getNextItemType() = 0;
00333     ItemType nextItemType_();
00334     virtual boost::shared_ptr<RunAuxiliary> readRunAuxiliary_() = 0;
00335     virtual boost::shared_ptr<LuminosityBlockAuxiliary> readLuminosityBlockAuxiliary_() = 0;
00336     virtual boost::shared_ptr<RunPrincipal> readRun_(boost::shared_ptr<RunPrincipal> rpCache);
00337     virtual boost::shared_ptr<LuminosityBlockPrincipal> readLuminosityBlock_(
00338         boost::shared_ptr<LuminosityBlockPrincipal> lbCache);
00339     virtual EventPrincipal* readEvent_() = 0;
00340     virtual EventPrincipal* readIt(EventID const&);
00341     virtual boost::shared_ptr<FileBlock> readFile_();
00342     virtual void closeFile_() {}
00343     virtual void skip(int);
00344     virtual bool goToEvent_(EventID const& eventID);
00345     virtual void setRun(RunNumber_t r);
00346     virtual void setLumi(LuminosityBlockNumber_t lb);
00347     virtual void rewind_();
00348     virtual void wakeUp_();
00349     void postRead(Event& event);
00350     virtual void beginLuminosityBlock(LuminosityBlock&);
00351     virtual void endLuminosityBlock(LuminosityBlock&);
00352     virtual void beginRun(Run&);
00353     virtual void endRun(Run&);
00354     virtual void beginJob();
00355     virtual void endJob();
00356     virtual void preForkReleaseResources();
00357      virtual void postForkReacquireResources(boost::shared_ptr<multicore::MessageReceiverForSource>);
00358     virtual bool randomAccess_() const;
00359     virtual ProcessingController::ForwardState forwardState_() const;
00360     virtual ProcessingController::ReverseState reverseState_() const;
00361 
00362   private:
00363 
00364     boost::shared_ptr<ActivityRegistry> actReg_;
00365     PrincipalCache* principalCache_;
00366     int maxEvents_;
00367     int remainingEvents_;
00368     int maxLumis_;
00369     int remainingLumis_;
00370     int readCount_;
00371     ProcessingMode processingMode_;
00372     ModuleDescription const moduleDescription_;
00373     boost::shared_ptr<ProductRegistry const> productRegistry_;
00374     bool const primary_;
00375     std::string processGUID_;
00376     Timestamp time_;
00377     mutable bool doneReadAhead_;
00378     mutable ItemType state_;
00379     mutable boost::shared_ptr<RunAuxiliary> runAuxiliary_;
00380     mutable boost::shared_ptr<LuminosityBlockAuxiliary>  lumiAuxiliary_;
00381     bool runPrematurelyRead_;
00382     bool lumiPrematurelyRead_;
00383     std::string statusFileName_;
00384   };
00385 }
00386 
00387 #endif