CMS 3D CMS Logo

OutputModuleBase.h
Go to the documentation of this file.
1 #ifndef FWCore_Framework_one_OutputModuleBase_h
2 #define FWCore_Framework_one_OutputModuleBase_h
3 // -*- C++ -*-
4 //
5 // Package: FWCore/Framework
6 // Class : OutputModuleBase
7 //
16 //
17 // Original Author: Chris Jones
18 // Created: Wed, 31 Jul 2013 15:37:16 GMT
19 //
20 
21 // system include files
22 #include <array>
23 #include <memory>
24 #include <string>
25 #include <vector>
26 #include <map>
27 #include <atomic>
28 
29 // user include files
34 
44 
45 // forward declarations
46 namespace edm {
47 
48  class ModuleCallingContext;
49  class PreallocationConfiguration;
50  class ActivityRegistry;
51  class ProductRegistry;
52  class ThinnedAssociationsHelper;
53  class SubProcessParentageHelper;
54  class WaitingTask;
55 
56  template <typename T> class OutputModuleCommunicatorT;
57 
58  namespace maker {
59  template<typename T> class ModuleHolderT;
60  }
61 
62  namespace one {
63 
65  public:
66  template <typename U> friend class edm::maker::ModuleHolderT;
67  template <typename T> friend class ::edm::WorkerT;
68  template <typename T> friend class ::edm::OutputModuleCommunicatorT;
70 
71  explicit OutputModuleBase(ParameterSet const& pset);
72  virtual ~OutputModuleBase();
73 
74  OutputModuleBase(OutputModuleBase const&) = delete; // Disallow copying and moving
75  OutputModuleBase& operator=(OutputModuleBase const&) = delete; // Disallow copying and moving
76 
79  int maxEvents() const {return maxEvents_;}
80 
83  int remainingEvents() const {return remainingEvents_;}
84 
85  bool selected(BranchDescription const& desc) const;
86 
87  void selectProducts(ProductRegistry const& preg, ThinnedAssociationsHelper const&);
88  std::string const& processName() const {return process_name_;}
89  SelectedProductsForBranchType const& keptProducts() const {return keptProducts_;}
90  std::array<bool, NumBranchTypes> const& hasNewlyDroppedBranch() const {return hasNewlyDroppedBranch_;}
91 
92  static void fillDescription(ParameterSetDescription & desc);
93  static void fillDescriptions(ConfigurationDescriptions& descriptions);
94  static const std::string& baseType();
95  static void prevalidate(ConfigurationDescriptions& );
96 
97  bool wantAllEvents() const {return wantAllEvents_;}
98 
99  BranchIDLists const* branchIDLists();
100 
101  ThinnedAssociationsHelper const* thinnedAssociationsHelper() const;
102 
104  return subProcessParentageHelper_;
105  }
106 
108  return moduleDescription_;
109  }
110  protected:
111 
112  ModuleDescription const& description() const;
113 
114  ParameterSetID selectorConfig() const { return selector_config_id_; }
115 
116  void doPreallocate(PreallocationConfiguration const&);
117 
118  void doBeginJob();
119  void doEndJob();
120  bool doEvent(EventPrincipal const& ep, EventSetup const& c,
122  ModuleCallingContext const*);
123  bool doBeginRun(RunPrincipal const& rp, EventSetup const& c,
124  ModuleCallingContext const*);
125  bool doEndRun(RunPrincipal const& rp, EventSetup const& c,
126  ModuleCallingContext const*);
127  bool doBeginLuminosityBlock(LuminosityBlockPrincipal const& lbp, EventSetup const& c,
128  ModuleCallingContext const*);
129  bool doEndLuminosityBlock(LuminosityBlockPrincipal const& lbp, EventSetup const& c,
130  ModuleCallingContext const*);
131 
132  void setEventSelectionInfo(std::map<std::string, std::vector<std::pair<std::string, int> > > const& outputModulePathPositions,
133  bool anyProductProduced);
134 
135  void configure(OutputModuleDescription const& desc);
136 
137  std::map<BranchID::value_type, BranchID::value_type> const& droppedBranchIDToKeptBranchID() {
138  return droppedBranchIDToKeptBranchID_;
139  }
140 
141  private:
142 
144  std::atomic<int> remainingEvents_;
145 
146  // TODO: Give OutputModule
147  // an interface (protected?) that supplies client code with the
148  // needed functionality *without* giving away implementation
149  // details ... don't just return a reference to keptProducts_, because
150  // we are looking to have the flexibility to change the
151  // implementation of keptProducts_ without modifying clients. When this
152  // change is made, we'll have a one-time-only task of modifying
153  // clients (classes derived from OutputModule) to use the
154  // newly-introduced interface.
155  // TODO: Consider using shared pointers here?
156 
157  // keptProducts_ are pointers to the BranchDescription objects describing
158  // the branches we are to write.
159  //
160  // We do not own the BranchDescriptions to which we point.
162  std::array<bool, NumBranchTypes> hasNewlyDroppedBranch_;
163 
168 
170  std::vector<detail::TriggerResultsBasedEventSelector> selectors_;
172  // ID of the ParameterSet that configured the event selector
173  // subsystem.
175 
176  // needed because of possible EDAliases.
177  // filled in only if key and value are different.
178  std::map<BranchID::value_type, BranchID::value_type> droppedBranchIDToKeptBranchID_;
181 
183 
185  std::map<BranchID, bool> keepAssociation_;
186 
188 
189  //------------------------------------------------------------------
190  // private member functions
191  //------------------------------------------------------------------
192 
193  virtual SharedResourcesAcquirer createAcquirer();
194 
195  void doWriteRun(RunPrincipal const& rp, ModuleCallingContext const*);
196  void doWriteLuminosityBlock(LuminosityBlockPrincipal const& lbp, ModuleCallingContext const*);
197  void doOpenFile(FileBlock const& fb);
198  void doRespondToOpenInputFile(FileBlock const& fb);
199  void doRespondToCloseInputFile(FileBlock const& fb);
200  void doPreForkReleaseResources();
201  void doPostForkReacquireResources(unsigned int iChildIndex, unsigned int iNumberOfChildren);
204 
205  std::string workerType() const {return "WorkerT<edm::one::OutputModuleBase>";}
206 
208  return resourcesAcquirer_;
209  }
210 
212  void doCloseFile();
213 
216  void maybeOpenFile();
217 
219 
220  bool prePrefetchSelection(StreamID id, EventPrincipal const&, ModuleCallingContext const*);
221 
222  // Do the end-of-file tasks; this is only called internally, after
223  // the appropriate tests have been done.
224  virtual void reallyCloseFile();
225 
226 
228  virtual bool shouldWeCloseFile() const {return false;}
229 
230  virtual void write(EventForOutput const&) = 0;
231  virtual void preActionBeforeRunEventAsync(WaitingTask* iTask, ModuleCallingContext const& iModuleCallingContext, Principal const& iPrincipal) const {}
232 
233  virtual void beginJob(){}
234  virtual void endJob(){}
235  virtual void writeLuminosityBlock(LuminosityBlockForOutput const&) = 0;
236  virtual void writeRun(RunForOutput const&) = 0;
237  virtual void openFile(FileBlock const&) {}
238  virtual bool isFileOpen() const { return true; }
239  virtual void reallyOpenFile() {}
240 
241  virtual void preForkReleaseResources();
242  virtual void postForkReacquireResources(unsigned int /*iChildIndex*/, unsigned int /*iNumberOfChildren*/);
243 
244  virtual void doBeginRun_(RunForOutput const&){}
245  virtual void doEndRun_(RunForOutput const& ){}
248  virtual void doRespondToOpenInputFile_(FileBlock const&) {}
249  virtual void doRespondToCloseInputFile_(FileBlock const&) {}
250 
251  void keepThisBranch(BranchDescription const& desc,
252  std::map<BranchID, BranchDescription const*>& trueBranchIDToKeptBranchDesc,
253  std::set<BranchID>& keptProductsInEvent);
254 
256  moduleDescription_ = md;
257  }
258 
259  bool limitReached() const {return remainingEvents_ == 0;}
260  };
261  }
262 }
263 #endif
SubProcessParentageHelper const * subProcessParentageHelper() const
SharedResourcesAcquirer & sharedResourcesAcquirer()
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
SelectedProductsForBranchType keptProducts_
ModuleDescription moduleDescription_
std::array< SelectedProducts, NumBranchTypes > SelectedProductsForBranchType
SubProcessParentageHelper const * subProcessParentageHelper_
virtual void preActionBeforeRunEventAsync(WaitingTask *iTask, ModuleCallingContext const &iModuleCallingContext, Principal const &iPrincipal) const
void registerProductsAndCallbacks(OutputModuleBase const *, ProductRegistry const *)
ParameterSetID selectorConfig() const
virtual void doBeginLuminosityBlock_(LuminosityBlockForOutput const &)
ProductSelectorRules productSelectorRules_
virtual void doRespondToCloseInputFile_(FileBlock const &)
virtual void doRespondToOpenInputFile_(FileBlock const &)
virtual void openFile(FileBlock const &)
virtual void doEndRun_(RunForOutput const &)
std::atomic< int > remainingEvents_
std::map< BranchID::value_type, BranchID::value_type > const & droppedBranchIDToKeptBranchID()
SelectedProductsForBranchType const & keptProducts() const
std::string workerType() const
edm::propagate_const< std::unique_ptr< ThinnedAssociationsHelper > > thinnedAssociationsHelper_
std::array< bool, NumBranchTypes > const & hasNewlyDroppedBranch() const
SharedResourcesAcquirer resourcesAcquirer_
std::array< bool, NumBranchTypes > hasNewlyDroppedBranch_
std::vector< detail::TriggerResultsBasedEventSelector > selectors_
void setModuleDescription(ModuleDescription const &md)
const ModuleDescription & moduleDescription() const
virtual void doEndLuminosityBlock_(LuminosityBlockForOutput const &)
void doRegisterThinnedAssociations(ProductRegistry const &, ThinnedAssociationsHelper &)
std::string const & processName() const
virtual void doBeginRun_(RunForOutput const &)
HLT enums.
BranchIDLists const * origBranchIDLists_
virtual bool shouldWeCloseFile() const
Ask the OutputModule if we should end the current file.
def write(self, setup)
virtual bool isFileOpen() const
std::map< BranchID::value_type, BranchID::value_type > droppedBranchIDToKeptBranchID_
ProductSelector productSelector_
ParameterSetID selector_config_id_
edm::propagate_const< std::unique_ptr< BranchIDLists > > branchIDLists_
std::map< BranchID, bool > keepAssociation_