CMS 3D CMS Logo

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

Go to the documentation of this file.
00001 #ifndef FWCore_Framework_OutputModule_h
00002 #define FWCore_Framework_OutputModule_h
00003 
00004 /*----------------------------------------------------------------------
00005 
00006 OutputModule: The base class of all "modules" that write Events to an
00007 output stream.
00008 
00009 ----------------------------------------------------------------------*/
00010 
00011 #include <vector>
00012 
00013 #include "boost/array.hpp"
00014 #include "boost/utility.hpp"
00015 
00016 #include "DataFormats/Provenance/interface/BranchChildren.h"
00017 #include "DataFormats/Provenance/interface/ParentageID.h"
00018 #include "DataFormats/Provenance/interface/ModuleDescription.h"
00019 #include "DataFormats/Provenance/interface/Selections.h"
00020 
00021 #include "FWCore/Framework/interface/CachedProducts.h"
00022 #include "FWCore/Framework/interface/Frameworkfwd.h"
00023 #include "FWCore/Framework/interface/GroupSelectorRules.h"
00024 #include "FWCore/Framework/interface/GroupSelector.h"
00025 #include "FWCore/ParameterSet/interface/ParameterSetfwd.h"
00026 
00027 #include <string>
00028 
00029 namespace edm {
00030 
00031   typedef detail::CachedProducts::handle_t Trig;
00032 
00033   std::vector<std::string> const& getAllTriggerNames();
00034 
00035   class OutputModule : private boost::noncopyable {
00036   public:
00037     template <typename T> friend class WorkerT;
00038     friend class OutputWorker;
00039     typedef OutputModule ModuleType;
00040     typedef OutputWorker WorkerType;
00041 
00042     explicit OutputModule(ParameterSet const& pset);
00043     virtual ~OutputModule();
00046     int maxEvents() const {return maxEvents_;}
00047 
00050     int remainingEvents() const {return remainingEvents_;}
00051 
00052     bool selected(BranchDescription const& desc) const;
00053 
00054     void selectProducts();
00055     std::string const& processName() const {return process_name_;}
00056     SelectionsArray const& keptProducts() const {return keptProducts_;}
00057     boost::array<bool, NumBranchTypes> const& hasNewlyDroppedBranch() const {return hasNewlyDroppedBranch_;}
00058 
00059     static void fillDescription(ParameterSetDescription & desc);
00060     static void fillDescriptions(ConfigurationDescriptions& descriptions);
00061     static const std::string& baseType();
00062 
00063     BranchChildren const& branchChildren() const {return branchChildren_;}
00064 
00065     bool wantAllEvents() const {return wantAllEvents_;}
00066 
00067   protected:
00068     //Trig const& getTriggerResults(Event const& ep) const;
00069     Trig getTriggerResults(Event const& ep) const;
00070 
00071     // This function is needed for compatibility with older code. We
00072     // need to clean up the use of Event and EventPrincipal, to avoid
00073     // creation of multiple Event objects when handling a single
00074     // event.
00075     Trig getTriggerResults(EventPrincipal const& ep) const;
00076 
00077     // The returned pointer will be null unless the this is currently
00078     // executing its event loop function ('write').
00079     CurrentProcessingContext const* currentContext() const;
00080 
00081     ModuleDescription const& description() const;
00082 
00083     ParameterSetID selectorConfig() const { return selector_config_id_; }
00084 
00085     void doBeginJob();
00086     void doEndJob();
00087     bool doEvent(EventPrincipal const& ep, EventSetup const& c,
00088                  CurrentProcessingContext const* cpc);
00089     bool doBeginRun(RunPrincipal const& rp, EventSetup const& c,
00090                  CurrentProcessingContext const* cpc);
00091     bool doEndRun(RunPrincipal const& rp, EventSetup const& c,
00092                  CurrentProcessingContext const* cpc);
00093     bool doBeginLuminosityBlock(LuminosityBlockPrincipal const& lbp, EventSetup const& c,
00094                  CurrentProcessingContext const* cpc);
00095     bool doEndLuminosityBlock(LuminosityBlockPrincipal const& lbp, EventSetup const& c,
00096                  CurrentProcessingContext const* cpc);
00097 
00098   private:
00099 
00100     int maxEvents_;
00101     int remainingEvents_;
00102 
00103     // TODO: Give OutputModule
00104     // an interface (protected?) that supplies client code with the
00105     // needed functionality *without* giving away implementation
00106     // details ... don't just return a reference to keptProducts_, because
00107     // we are looking to have the flexibility to change the
00108     // implementation of keptProducts_ without modifying clients. When this
00109     // change is made, we'll have a one-time-only task of modifying
00110     // clients (classes derived from OutputModule) to use the
00111     // newly-introduced interface.
00112     // TODO: Consider using shared pointers here?
00113 
00114     // keptProducts_ are pointers to the BranchDescription objects describing
00115     // the branches we are to write.
00116     //
00117     // We do not own the BranchDescriptions to which we point.
00118     SelectionsArray keptProducts_;
00119     boost::array<bool, NumBranchTypes> hasNewlyDroppedBranch_;
00120 
00121     std::string process_name_;
00122     GroupSelectorRules groupSelectorRules_;
00123     GroupSelector groupSelector_;
00124     ModuleDescription moduleDescription_;
00125 
00126     // We do not own the pointed-to CurrentProcessingContext.
00127     CurrentProcessingContext const* current_context_;
00128 
00129     //This will store TriggerResults objects for the current event.
00130     // mutable std::vector<Trig> prods_;
00131     mutable bool prodsValid_;
00132 
00133     bool wantAllEvents_;
00134     mutable detail::CachedProducts selectors_;
00135     // ID of the ParameterSet that configured the event selector
00136     // subsystem.
00137     ParameterSetID selector_config_id_;
00138 
00139     typedef std::map<BranchID, std::set<ParentageID> > BranchParents;
00140     BranchParents branchParents_;
00141 
00142     BranchChildren branchChildren_;
00143 
00144     //------------------------------------------------------------------
00145     // private member functions
00146     //------------------------------------------------------------------
00147     void configure(OutputModuleDescription const& desc);
00148     void doWriteRun(RunPrincipal const& rp);
00149     void doWriteLuminosityBlock(LuminosityBlockPrincipal const& lbp);
00150     void doOpenFile(FileBlock const& fb);
00151     void doRespondToOpenInputFile(FileBlock const& fb);
00152     void doRespondToCloseInputFile(FileBlock const& fb);
00153     void doRespondToOpenOutputFiles(FileBlock const& fb);
00154     void doRespondToCloseOutputFiles(FileBlock const& fb);
00155     void doPreForkReleaseResources();
00156     void doPostForkReacquireResources(unsigned int iChildIndex, unsigned int iNumberOfChildren);
00157 
00158     std::string workerType() const {return "OutputWorker";}
00159 
00161     void doCloseFile();
00162 
00165     void maybeOpenFile();
00166 
00167 
00168     // Do the end-of-file tasks; this is only called internally, after
00169     // the appropriate tests have been done.
00170     void reallyCloseFile();
00171 
00172     void registerAnyProducts(OutputModule const*, ProductRegistry const*) {}
00173 
00175     virtual bool shouldWeCloseFile() const {return false;}
00176 
00177     virtual void write(EventPrincipal const& e) = 0;
00178     virtual void beginJob(){}
00179     virtual void endJob(){}
00180     virtual void beginRun(RunPrincipal const& r){}
00181     virtual void endRun(RunPrincipal const& r){}
00182     virtual void writeRun(RunPrincipal const& r) = 0;
00183     virtual void beginLuminosityBlock(LuminosityBlockPrincipal const& lb){}
00184     virtual void endLuminosityBlock(LuminosityBlockPrincipal const& lb){}
00185     virtual void writeLuminosityBlock(LuminosityBlockPrincipal const& lb) = 0;
00186     virtual void openFile(FileBlock const& fb) {}
00187     virtual void respondToOpenInputFile(FileBlock const& fb) {}
00188     virtual void respondToCloseInputFile(FileBlock const& fb) {}
00189     virtual void respondToOpenOutputFiles(FileBlock const& fb) {}
00190     virtual void respondToCloseOutputFiles(FileBlock const& fb) {}
00191     virtual void preForkReleaseResources() {}
00192     virtual void postForkReacquireResources(unsigned int iChildIndex, unsigned int iNumberOfChildren) {}
00193 
00194     virtual bool isFileOpen() const { return true; }
00195 
00196     virtual void doOpenFile() { }
00197 
00198     void setModuleDescription(ModuleDescription const& md) {
00199       moduleDescription_ = md;
00200     }
00201 
00202     void updateBranchParents(EventPrincipal const& ep);
00203     void fillDependencyGraph();
00204 
00205     bool limitReached() const {return remainingEvents_ == 0;}
00206 
00207     // The following member functions are part of the Template Method
00208     // pattern, used for implementing doCloseFile() and maybeEndFile().
00209 
00210     virtual void startEndFile() {}
00211     virtual void writeFileFormatVersion() {}
00212     virtual void writeFileIdentifier() {}
00213     virtual void writeIndexIntoFile() {}
00214     virtual void writeProcessConfigurationRegistry() {}
00215     virtual void writeProcessHistoryRegistry() {}
00216     virtual void writeParameterSetRegistry() {}
00217     virtual void writeBranchIDListRegistry() {}
00218     virtual void writeParentageRegistry() {}
00219     virtual void writeProductDescriptionRegistry() {}
00220     virtual void writeProductDependencies() {}
00221     virtual void writeBranchMapper() {}
00222     virtual void finishEndFile() {}
00223   };
00224 }
00225 
00226 //this is included after the class definition since this header also needs to know about OutputModule
00227 // we put this here since all OutputModules need this header to create their plugin
00228 #include "FWCore/Framework/src/OutputWorker.h"
00229 
00230 #endif