Go to the documentation of this file.00001 #ifndef FWCore_Framework_OutputModule_h
00002 #define FWCore_Framework_OutputModule_h
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "DataFormats/Provenance/interface/BranchChildren.h"
00012 #include "DataFormats/Provenance/interface/ParentageID.h"
00013 #include "DataFormats/Provenance/interface/ModuleDescription.h"
00014 #include "DataFormats/Provenance/interface/Selections.h"
00015
00016 #include "FWCore/Framework/interface/CachedProducts.h"
00017 #include "FWCore/Framework/interface/Frameworkfwd.h"
00018 #include "FWCore/Framework/interface/GroupSelectorRules.h"
00019 #include "FWCore/Framework/interface/GroupSelector.h"
00020 #include "FWCore/ParameterSet/interface/ParameterSetfwd.h"
00021
00022 #include "boost/array.hpp"
00023 #include "boost/utility.hpp"
00024
00025 #include <string>
00026 #include <vector>
00027 #include <map>
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 static void prevalidate(ConfigurationDescriptions& );
00063
00064
00065
00066 BranchChildren const& branchChildren() const {return branchChildren_;}
00067
00068 bool wantAllEvents() const {return wantAllEvents_;}
00069
00070 protected:
00071
00072 Trig getTriggerResults(Event const& ep) const;
00073
00074
00075
00076
00077
00078 Trig getTriggerResults(EventPrincipal const& ep) const;
00079
00080
00081
00082 CurrentProcessingContext const* currentContext() const;
00083
00084 ModuleDescription const& description() const;
00085
00086 ParameterSetID selectorConfig() const { return selector_config_id_; }
00087
00088 void doBeginJob();
00089 void doEndJob();
00090 bool doEvent(EventPrincipal const& ep, EventSetup const& c,
00091 CurrentProcessingContext const* cpc);
00092 bool doBeginRun(RunPrincipal const& rp, EventSetup const& c,
00093 CurrentProcessingContext const* cpc);
00094 bool doEndRun(RunPrincipal const& rp, EventSetup const& c,
00095 CurrentProcessingContext const* cpc);
00096 bool doBeginLuminosityBlock(LuminosityBlockPrincipal const& lbp, EventSetup const& c,
00097 CurrentProcessingContext const* cpc);
00098 bool doEndLuminosityBlock(LuminosityBlockPrincipal const& lbp, EventSetup const& c,
00099 CurrentProcessingContext const* cpc);
00100
00101 void setEventSelectionInfo(std::map<std::string, std::vector<std::pair<std::string, int> > > const& outputModulePathPositions,
00102 bool anyProductProduced);
00103
00104 private:
00105
00106 int maxEvents_;
00107 int remainingEvents_;
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 SelectionsArray keptProducts_;
00125 boost::array<bool, NumBranchTypes> hasNewlyDroppedBranch_;
00126
00127 std::string process_name_;
00128 GroupSelectorRules groupSelectorRules_;
00129 GroupSelector groupSelector_;
00130 ModuleDescription moduleDescription_;
00131
00132
00133 CurrentProcessingContext const* current_context_;
00134
00135
00136
00137 mutable bool prodsValid_;
00138
00139 bool wantAllEvents_;
00140 mutable detail::CachedProducts selectors_;
00141
00142
00143 ParameterSetID selector_config_id_;
00144
00145 typedef std::map<BranchID, std::set<ParentageID> > BranchParents;
00146 BranchParents branchParents_;
00147
00148 BranchChildren branchChildren_;
00149
00150
00151
00152
00153 void configure(OutputModuleDescription const& desc);
00154 void doWriteRun(RunPrincipal const& rp);
00155 void doWriteLuminosityBlock(LuminosityBlockPrincipal const& lbp);
00156 void doOpenFile(FileBlock const& fb);
00157 void doRespondToOpenInputFile(FileBlock const& fb);
00158 void doRespondToCloseInputFile(FileBlock const& fb);
00159 void doRespondToOpenOutputFiles(FileBlock const& fb);
00160 void doRespondToCloseOutputFiles(FileBlock const& fb);
00161 void doPreForkReleaseResources();
00162 void doPostForkReacquireResources(unsigned int iChildIndex, unsigned int iNumberOfChildren);
00163
00164 std::string workerType() const {return "OutputWorker";}
00165
00167 void doCloseFile();
00168
00171 void maybeOpenFile();
00172
00173
00174
00175
00176 void reallyCloseFile();
00177
00178 void registerAnyProducts(OutputModule const*, ProductRegistry const*) {}
00179
00181 virtual bool shouldWeCloseFile() const {return false;}
00182
00183 virtual void write(EventPrincipal const& e) = 0;
00184 virtual void beginJob(){}
00185 virtual void endJob(){}
00186 virtual void beginRun(RunPrincipal const&){}
00187 virtual void endRun(RunPrincipal const&){}
00188 virtual void writeRun(RunPrincipal const&) = 0;
00189 virtual void beginLuminosityBlock(LuminosityBlockPrincipal const&){}
00190 virtual void endLuminosityBlock(LuminosityBlockPrincipal const&){}
00191 virtual void writeLuminosityBlock(LuminosityBlockPrincipal const&) = 0;
00192 virtual void openFile(FileBlock const&) {}
00193 virtual void respondToOpenInputFile(FileBlock const&) {}
00194 virtual void respondToCloseInputFile(FileBlock const&) {}
00195 virtual void respondToOpenOutputFiles(FileBlock const&) {}
00196 virtual void respondToCloseOutputFiles(FileBlock const&) {}
00197 virtual void preForkReleaseResources() {}
00198 virtual void postForkReacquireResources(unsigned int , unsigned int ) {}
00199
00200 virtual bool isFileOpen() const { return true; }
00201
00202 virtual void doOpenFile() { }
00203
00204 void setModuleDescription(ModuleDescription const& md) {
00205 moduleDescription_ = md;
00206 }
00207
00208 void updateBranchParents(EventPrincipal const& ep);
00209 void fillDependencyGraph();
00210
00211 bool limitReached() const {return remainingEvents_ == 0;}
00212
00213
00214
00215
00216 virtual void startEndFile() {}
00217 virtual void writeFileFormatVersion() {}
00218 virtual void writeFileIdentifier() {}
00219 virtual void writeIndexIntoFile() {}
00220 virtual void writeProcessConfigurationRegistry() {}
00221 virtual void writeProcessHistoryRegistry() {}
00222 virtual void writeParameterSetRegistry() {}
00223 virtual void writeBranchIDListRegistry() {}
00224 virtual void writeParentageRegistry() {}
00225 virtual void writeProductDescriptionRegistry() {}
00226 virtual void writeProductDependencies() {}
00227 virtual void writeBranchMapper() {}
00228 virtual void finishEndFile() {}
00229 };
00230 }
00231
00232
00233
00234 #include "FWCore/Framework/src/OutputWorker.h"
00235
00236 #endif