CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
OutputModule.cc
Go to the documentation of this file.
1 /*----------------------------------------------------------------------
2 
3 ----------------------------------------------------------------------*/
4 
6 
23 
24 #include <cassert>
25 
26 namespace edm {
27 
28  std::vector<std::string> const& getAllTriggerNames() {
30  return tns->getTrigPaths();
31  }
32 }
33 
34 namespace {
35  //--------------------------------------------------------
36  // Remove whitespace (spaces and tabs) from a std::string.
37  void remove_whitespace(std::string& s) {
38  s.erase(std::remove(s.begin(), s.end(), ' '), s.end());
39  s.erase(std::remove(s.begin(), s.end(), '\t'), s.end());
40  }
41 
42  void test_remove_whitespace() {
43  std::string a("noblanks");
44  std::string b("\t no blanks \t");
45 
46  remove_whitespace(b);
47  assert(a == b);
48  }
49 
50  //--------------------------------------------------------
51  // Given a path-spec (std::string of the form "a:b", where the ":b" is
52  // optional), return a parsed_path_spec_t containing "a" and "b".
53 
54  typedef std::pair<std::string, std::string> parsed_path_spec_t;
55  void parse_path_spec(std::string const& path_spec,
56  parsed_path_spec_t& output) {
57  std::string trimmed_path_spec(path_spec);
58  remove_whitespace(trimmed_path_spec);
59 
60  std::string::size_type colon = trimmed_path_spec.find(":");
61  if(colon == std::string::npos) {
62  output.first = trimmed_path_spec;
63  } else {
64  output.first = trimmed_path_spec.substr(0, colon);
65  output.second = trimmed_path_spec.substr(colon + 1,
66  trimmed_path_spec.size());
67  }
68  }
69 
70  void test_parse_path_spec() {
71  std::vector<std::string> paths;
72  paths.push_back("a:p1");
73  paths.push_back("b:p2");
74  paths.push_back(" c");
75  paths.push_back("ddd\t:p3");
76  paths.push_back("eee: p4 ");
77 
78  std::vector<parsed_path_spec_t> parsed(paths.size());
79  for(size_t i = 0; i < paths.size(); ++i) {
80  parse_path_spec(paths[i], parsed[i]);
81  }
82 
83  assert(parsed[0].first == "a");
84  assert(parsed[0].second == "p1");
85  assert(parsed[1].first == "b");
86  assert(parsed[1].second == "p2");
87  assert(parsed[2].first == "c");
88  assert(parsed[2].second == "");
89  assert(parsed[3].first == "ddd");
90  assert(parsed[3].second == "p3");
91  assert(parsed[4].first == "eee");
92  assert(parsed[4].second == "p4");
93  }
94 }
95 
96 namespace edm {
97  namespace test {
99  test_remove_whitespace();
100  test_parse_path_spec();
101  }
102  }
103 
104  // -------------------------------------------------------
106  maxEvents_(-1),
107  remainingEvents_(maxEvents_),
108  keptProducts_(),
109  hasNewlyDroppedBranch_(),
110  process_name_(),
111  productSelectorRules_(pset, "outputCommands", "OutputModule"),
112  productSelector_(),
113  moduleDescription_(),
114  current_context_(nullptr),
115  prodsValid_(false),
116  wantAllEvents_(false),
117  selectors_(),
118  selector_config_id_(),
119  droppedBranchIDToKeptBranchID_(),
120  branchIDLists_(new BranchIDLists),
121  origBranchIDLists_(nullptr),
122  branchParents_(),
123  branchChildren_() {
124 
125  hasNewlyDroppedBranch_.fill(false);
126 
128  process_name_ = tns->getProcessName();
129 
130  ParameterSet selectevents =
131  pset.getUntrackedParameterSet("SelectEvents", ParameterSet());
132 
133  selectevents.registerIt(); // Just in case this PSet is not registered
134 
135  selector_config_id_ = selectevents.id();
136  // If selectevents is an emtpy ParameterSet, then we are to write
137  // all events, or one which contains a vstrig 'SelectEvents' that
138  // is empty, we are to write all events. We have no need for any
139  // EventSelectors.
140  if(selectevents.empty()) {
141  wantAllEvents_ = true;
143  return;
144  }
145 
146  std::vector<std::string> path_specs =
147  selectevents.getParameter<std::vector<std::string> >("SelectEvents");
148 
149  if(path_specs.empty()) {
150  wantAllEvents_ = true;
152  return;
153  }
154 
155  // If we get here, we have the possibility of having to deal with
156  // path_specs that look at more than one process.
157  std::vector<parsed_path_spec_t> parsed_paths(path_specs.size());
158  for(size_t i = 0; i < path_specs.size(); ++i) {
159  parse_path_spec(path_specs[i], parsed_paths[i]);
160  }
162  }
163 
167  }
168 
170  if(productSelector_.initialized()) return;
172 
173  // TODO: See if we can collapse keptProducts_ and productSelector_ into a
174  // single object. See the notes in the header for ProductSelector
175  // for more information.
176 
177  std::map<BranchID, BranchDescription const*> trueBranchIDToKeptBranchDesc;
178 
179  for(auto const& it : preg.productList()) {
180  BranchDescription const& desc = it.second;
181  if(desc.transient()) {
182  // if the class of the branch is marked transient, output nothing
183  } else if(!desc.present() && !desc.produced()) {
184  // else if the branch containing the product has been previously dropped,
185  // output nothing
186  } else if(selected(desc)) {
187  // else if the branch has been selected, put it in the list of selected branches.
188  if(desc.produced()) {
189  // First we check if an equivalent branch has already been selected due to an EDAlias.
190  // We only need the check for products produced in this process.
191  BranchID const& trueBranchID = desc.originalBranchID();
192  std::map<BranchID, BranchDescription const*>::const_iterator iter = trueBranchIDToKeptBranchDesc.find(trueBranchID);
193  if(iter != trueBranchIDToKeptBranchDesc.end()) {
194  throw edm::Exception(errors::Configuration, "Duplicate Output Selection")
195  << "Two (or more) equivalent branches have been selected for output.\n"
196  << "#1: " << BranchKey(desc) << "\n"
197  << "#2: " << BranchKey(*iter->second) << "\n"
198  << "Please drop at least one of them.\n";
199  }
200  trueBranchIDToKeptBranchDesc.insert(std::make_pair(trueBranchID, &desc));
201  }
202  switch (desc.branchType()) {
203  case InEvent:
204  {
206  InputTag{desc.moduleLabel(),
207  desc.productInstanceName(),
208  desc.processName()});
209  break;
210  }
211  case InLumi:
212  {
213  consumes<InLumi>(TypeToGet{desc.unwrappedTypeID(),PRODUCT_TYPE},
214  InputTag(desc.moduleLabel(),
215  desc.productInstanceName(),
216  desc.processName()));
217  break;
218  }
219  case InRun:
220  {
221  consumes<InRun>(TypeToGet{desc.unwrappedTypeID(),PRODUCT_TYPE},
222  InputTag(desc.moduleLabel(),
223  desc.productInstanceName(),
224  desc.processName()));
225  break;
226  }
227  default:
228  assert(false);
229  break;
230  }
231  // Now put it in the list of selected branches.
232  keptProducts_[desc.branchType()].push_back(&desc);
233  } else {
234  // otherwise, output nothing,
235  // and mark the fact that there is a newly dropped branch of this type.
236  hasNewlyDroppedBranch_[desc.branchType()] = true;
237  }
238  }
239  // Now fill in a mapping needed in the case that a branch was dropped while its EDAlias was kept.
240  for(auto const& it : preg.productList()) {
241  BranchDescription const& desc = it.second;
242  if(!desc.produced() || desc.isAlias()) continue;
243  BranchID const& branchID = desc.branchID();
244  std::map<BranchID, BranchDescription const*>::const_iterator iter = trueBranchIDToKeptBranchDesc.find(branchID);
245  if(iter != trueBranchIDToKeptBranchDesc.end()) {
246  // This branch, produced in this process, or an alias of it, was persisted.
247  BranchID const& keptBranchID = iter->second->branchID();
248  if(keptBranchID != branchID) {
249  // An EDAlias branch was persisted.
250  droppedBranchIDToKeptBranchID_.insert(std::make_pair(branchID.id(), keptBranchID.id()));
251  }
252  }
253  }
254  }
255 
257 
259  this->beginJob();
260  }
261 
263  endJob();
264  }
265 
266 
268  return selectors_.getOneTriggerResults(ev);
269  }
270 
272  // This is bad, because we're returning handles into an Event that
273  // is destructed before the return. It might not fail, because the
274  // actual EventPrincipal is not destroyed, but it still needs to
275  // be cleaned up.
276  Event ev(const_cast<EventPrincipal&>(ep),
278  return getTriggerResults(ev);
279  }
280 
281  namespace {
282  class PVSentry {
283  public:
284  PVSentry(detail::CachedProducts& prods, bool& valid) : p(prods), v(valid) {}
285  ~PVSentry() {
286  p.clear();
287  v = false;
288  }
289  private:
290  detail::CachedProducts& p;
291  bool& v;
292 
293  PVSentry(PVSentry const&); // not implemented
294  PVSentry& operator=(PVSentry const&); // not implemented
295  };
296  }
297 
298  bool
300  EventSetup const&,
301  CurrentProcessingContext const* cpc) {
302  detail::CPCSentry sentry(current_context_, cpc);
303  PVSentry products_sentry(selectors_, prodsValid_);
304 
305  FDEBUG(2) << "writeEvent called\n";
306 
307  if(!wantAllEvents_) {
308  // use module description and const_cast unless interface to
309  // event is changed to just take a const EventPrincipal
310  Event e(const_cast<EventPrincipal&>(ep), moduleDescription_);
311  if(!selectors_.wantEvent(e)) {
312  return true;
313  }
314  }
315  write(ep);
317  if(remainingEvents_ > 0) {
319  }
320  return true;
321  }
322 
323 // bool OutputModule::wantEvent(Event const& ev)
324 // {
325 // getTriggerResults(ev);
326 // bool eventAccepted = false;
327 
328 // typedef std::vector<NamedEventSelector>::const_iterator iter;
329 // for(iter i = selectResult_.begin(), e = selectResult_.end();
330 // !eventAccepted && i != e; ++i)
331 // {
332 // eventAccepted = i->acceptEvent(*prods_);
333 // }
334 
335 // FDEBUG(2) << "Accept event " << ep.id() << " " << eventAccepted << "\n";
336 // return eventAccepted;
337 // }
338 
339  bool
341  EventSetup const&,
342  CurrentProcessingContext const* cpc) {
343  detail::CPCSentry sentry(current_context_, cpc);
344  FDEBUG(2) << "beginRun called\n";
345  beginRun(rp);
346  return true;
347  }
348 
349  bool
351  EventSetup const&,
352  CurrentProcessingContext const* cpc) {
353  detail::CPCSentry sentry(current_context_, cpc);
354  FDEBUG(2) << "endRun called\n";
355  endRun(rp);
356  return true;
357  }
358 
359  void
361  FDEBUG(2) << "writeRun called\n";
362  writeRun(rp);
363  }
364 
365  bool
367  EventSetup const&,
368  CurrentProcessingContext const* cpc) {
369  detail::CPCSentry sentry(current_context_, cpc);
370  FDEBUG(2) << "beginLuminosityBlock called\n";
372  return true;
373  }
374 
375  bool
377  EventSetup const&,
378  CurrentProcessingContext const* cpc) {
379  detail::CPCSentry sentry(current_context_, cpc);
380  FDEBUG(2) << "endLuminosityBlock called\n";
381  endLuminosityBlock(lbp);
382  return true;
383  }
384 
386  FDEBUG(2) << "writeLuminosityBlock called\n";
388  }
389 
391  openFile(fb);
392  }
393 
396  }
397 
400  }
401 
404  }
405 
408  }
409 
410  void
413  }
414 
415  void
416  OutputModule::doPostForkReacquireResources(unsigned int iChildIndex, unsigned int iNumberOfChildren) {
417  postForkReacquireResources(iChildIndex, iNumberOfChildren);
418  }
419 
421  if(!isFileOpen()) doOpenFile();
422  }
423 
425  if(isFileOpen()) reallyCloseFile();
426  }
427 
430  startEndFile();
442  finishEndFile();
443  branchParents_.clear();
445  }
446 
447  BranchIDLists const*
449  if(!droppedBranchIDToKeptBranchID_.empty()) {
450  // Make a private copy of the BranchIDLists.
452  // Check for branches dropped while an EDAlias was kept.
453  for(BranchIDList& branchIDList : *branchIDLists_) {
454  for(BranchID::value_type& branchID : branchIDList) {
455  // Replace BranchID of each dropped branch with that of the kept alias, so the alias branch will have the product ID of the original branch.
456  std::map<BranchID::value_type, BranchID::value_type>::const_iterator iter = droppedBranchIDToKeptBranchID_.find(branchID);
457  if(iter != droppedBranchIDToKeptBranchID_.end()) {
458  branchID = iter->second;
459  }
460  }
461  }
462  return branchIDLists_.get();
463  }
464  return origBranchIDLists_;
465  }
466 
469  return current_context_;
470  }
471 
472  ModuleDescription const&
474  return moduleDescription_;
475  }
476 
477  bool
479  return productSelector_.selected(desc);
480  }
481 
482  void
485  desc.setUnknown();
486  descriptions.addDefault(desc);
487  }
488 
489  void
491  ProductSelectorRules::fillDescription(desc, "outputCommands");
493  }
494 
495  void
497  }
498 
499 
500  static const std::string kBaseType("OutputModule");
501  const std::string&
503  return kBaseType;
504  }
505 
506  void
507  OutputModule::setEventSelectionInfo(std::map<std::string, std::vector<std::pair<std::string, int> > > const& outputModulePathPositions,
508  bool anyProductProduced) {
509 
510  ParameterSet selectEventsInfo;
512  selectEventsInfo.addParameter<bool>("InProcessHistory", anyProductProduced);
514  std::vector<std::string> endPaths;
515  std::vector<int> endPathPositions;
516 
517  // The label will be empty if and only if this is a SubProcess
518  // SubProcess's do not appear on any end path
519  if (!label.empty()) {
520  std::map<std::string, std::vector<std::pair<std::string, int> > >::const_iterator iter = outputModulePathPositions.find(label);
521  assert(iter != outputModulePathPositions.end());
522  for (std::vector<std::pair<std::string, int> >::const_iterator i = iter->second.begin(), e = iter->second.end();
523  i != e; ++i) {
524  endPaths.push_back(i->first);
525  endPathPositions.push_back(i->second);
526  }
527  }
528  selectEventsInfo.addParameter<std::vector<std::string> >("EndPaths", endPaths);
529  selectEventsInfo.addParameter<std::vector<int> >("EndPathPositions", endPathPositions);
530  if (!selectEventsInfo.exists("SelectEvents")) {
531  selectEventsInfo.addParameter<std::vector<std::string> >("SelectEvents", std::vector<std::string>());
532  }
533  selectEventsInfo.registerIt();
534 
535  selector_config_id_ = selectEventsInfo.id();
536  }
537 
538  void
540  for(EventPrincipal::const_iterator i = ep.begin(), iEnd = ep.end(); i != iEnd; ++i) {
541  if((*i) && (*i)->productProvenancePtr() != 0) {
542  BranchID const& bid = (*i)->branchDescription().branchID();
543  BranchParents::iterator it = branchParents_.find(bid);
544  if(it == branchParents_.end()) {
545  it = branchParents_.insert(std::make_pair(bid, std::set<ParentageID>())).first;
546  }
547  it->second.insert((*i)->productProvenancePtr()->parentageID());
549  }
550  }
551  }
552 
553  void
555  for(BranchParents::const_iterator i = branchParents_.begin(), iEnd = branchParents_.end();
556  i != iEnd; ++i) {
557  BranchID const& child = i->first;
558  std::set<ParentageID> const& eIds = i->second;
559  for(std::set<ParentageID>::const_iterator it = eIds.begin(), itEnd = eIds.end();
560  it != itEnd; ++it) {
561  Parentage entryDesc;
562  ParentageRegistry::instance()->getMapped(*it, entryDesc);
563  std::vector<BranchID> const& parents = entryDesc.parents();
564  for(std::vector<BranchID>::const_iterator j = parents.begin(), jEnd = parents.end();
565  j != jEnd; ++j) {
566  branchChildren_.insertChild(*j, child);
567  }
568  }
569  }
570  }
571 }
std::array< bool, NumBranchTypes > hasNewlyDroppedBranch_
Definition: OutputModule.h:137
void doPostForkReacquireResources(unsigned int iChildIndex, unsigned int iNumberOfChildren)
T getParameter(std::string const &) const
virtual void doOpenFile()
Definition: OutputModule.h:219
bool empty() const
Definition: ParameterSet.h:219
std::map< BranchID::value_type, BranchID::value_type > droppedBranchIDToKeptBranchID_
Definition: OutputModule.h:159
virtual void writeProductDependencies()
Definition: OutputModule.h:243
int i
Definition: DBlmapReader.cc:9
bool selected(BranchDescription const &desc) const
virtual void respondToCloseOutputFiles(FileBlock const &)
Definition: OutputModule.h:213
static void fillDescription(ParameterSetDescription &desc, char const *parameterName)
TPRegexp parents
Definition: eve_filter.cc:24
BranchType const & branchType() const
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
void selectProducts(ProductRegistry const &preg)
ModuleDescription moduleDescription_
Definition: OutputModule.h:142
virtual void writeFileFormatVersion()
Definition: OutputModule.h:234
bool doEndLuminosityBlock(LuminosityBlockPrincipal const &lbp, EventSetup const &c, CurrentProcessingContext const *cpc)
const_iterator end() const
Definition: Principal.h:146
ModuleDescription const * moduleDescription() const
handle_t getOneTriggerResults(Event const &e)
ParameterSetID id() const
static ThreadSafeRegistry * instance()
CurrentProcessingContext const * current_context_
Definition: OutputModule.h:145
virtual void respondToOpenOutputFiles(FileBlock const &)
Definition: OutputModule.h:212
detail::CachedProducts selectors_
Definition: OutputModule.h:152
ParameterSet const & getParameterSet(ParameterSetID const &id)
virtual void writeIndexIntoFile()
Definition: OutputModule.h:236
bool & produced() const
#define nullptr
virtual void endRun(RunPrincipal const &)
Definition: OutputModule.h:204
bool exists(std::string const &parameterName) const
checks if a parameter exists
void insertEmpty(BranchID parent)
bool getMapped(key_type const &k, value_type &result) const
void insertChild(BranchID parent, BranchID child)
static const std::string & baseType()
void updateBranchParents(EventPrincipal const &ep)
virtual void beginRun(RunPrincipal const &)
Definition: OutputModule.h:203
std::string const & processName() const
virtual void finishEndFile()
Definition: OutputModule.h:245
bool selected(BranchDescription const &desc) const
BranchIDLists const * origBranchIDLists_
Definition: OutputModule.h:161
#define FDEBUG(lev)
Definition: DebugMacros.h:18
virtual void writeParentageRegistry()
Definition: OutputModule.h:241
std::string const & moduleLabel() const
uint16_t size_type
unsigned int id() const
Definition: BranchID.h:23
dictionary map
Definition: Association.py:205
void doCloseFile()
Tell the OutputModule that is must end the current file.
BranchIDLists const * branchIDLists_
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
std::vector< BranchID > const & parents() const
Definition: Parentage.h:38
ProductList const & productList() const
U second(std::pair< T, U > const &p)
void setEventSelectionInfo(std::map< std::string, std::vector< std::pair< std::string, int > > > const &outputModulePathPositions, bool anyProductProduced)
void run_all_output_module_tests()
Definition: OutputModule.cc:98
std::string process_name_
Definition: OutputModule.h:139
virtual void endLuminosityBlock(LuminosityBlockPrincipal const &)
Definition: OutputModule.h:207
virtual void writeProcessConfigurationRegistry()
Definition: OutputModule.h:237
void addDefault(ParameterSetDescription const &psetDescription)
static void fillDescriptions(ConfigurationDescriptions &descriptions)
bool doEvent(EventPrincipal const &ep, EventSetup const &c, CurrentProcessingContext const *cpc)
std::string const & moduleLabel() const
unsigned int value_type
Definition: BranchID.h:16
std::string const & productInstanceName() const
ParameterSet const & getUntrackedParameterSet(std::string const &name, ParameterSet const &defaultValue) const
SelectionsArray keptProducts_
Definition: OutputModule.h:136
void addParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:145
TypeID unwrappedTypeID() const
void doWriteLuminosityBlock(LuminosityBlockPrincipal const &lbp)
void doPreForkReleaseResources()
std::unique_ptr< BranchIDLists > branchIDLists_
Definition: OutputModule.h:160
virtual void beginLuminosityBlock(LuminosityBlockPrincipal const &)
Definition: OutputModule.h:206
int j
Definition: DBlmapReader.cc:9
std::vector< BranchDescription const * > allBranchDescriptions() const
void doRespondToCloseOutputFiles(FileBlock const &fb)
BranchID const & branchID() const
static void fillDescription(ParameterSetDescription &desc)
void copyForModify(ParameterSet const &other)
bool first
Definition: L1TdeRCT.cc:94
virtual void write(EventPrincipal const &e)=0
virtual bool isFileOpen() const
Definition: OutputModule.h:217
bool & transient() const
void doRespondToCloseInputFile(FileBlock const &fb)
virtual void writeFileIdentifier()
Definition: OutputModule.h:235
void fillDependencyGraph()
void setup(std::vector< parsed_path_spec_t > const &path_specs, std::vector< std::string > const &triggernames, const std::string &process_name)
virtual void postForkReacquireResources(unsigned int, unsigned int)
Definition: OutputModule.h:215
static void prevalidate(ConfigurationDescriptions &)
CurrentProcessingContext const * currentContext() const
virtual void writeRun(RunPrincipal const &)=0
const_iterator begin() const
Definition: Principal.h:145
double b
Definition: hdecay.h:120
void doWriteRun(RunPrincipal const &rp)
virtual void respondToOpenInputFile(FileBlock const &)
Definition: OutputModule.h:210
static void fillDescription(ParameterSetDescription &desc)
static const std::string kBaseType("EDAnalyzer")
std::vector< BranchID::value_type > BranchIDList
Definition: BranchIDList.h:18
bool doBeginLuminosityBlock(LuminosityBlockPrincipal const &lbp, EventSetup const &c, CurrentProcessingContext const *cpc)
ProductSelector productSelector_
Definition: OutputModule.h:141
bool initialized() const
std::vector< std::string > const & getAllTriggerNames()
Definition: OutputModule.cc:28
BranchChildren branchChildren_
Definition: OutputModule.h:166
Trig getTriggerResults(Event const &ep) const
virtual void writeParameterSetRegistry()
Definition: OutputModule.h:239
boost::filter_iterator< FilledProductPtr, ProductHolderCollection::const_iterator > const_iterator
Definition: Principal.h:55
double a
Definition: hdecay.h:121
void initialize(ProductSelectorRules const &rules, std::vector< BranchDescription const * > const &branchDescriptions)
Strings const & getTrigPaths() const
BranchIDLists const * branchIDLists() const
virtual void endJob()
Definition: OutputModule.h:202
ProductSelectorRules productSelectorRules_
Definition: OutputModule.h:140
virtual void beginJob()
Definition: OutputModule.h:201
BranchID const & originalBranchID() const
void doRespondToOpenInputFile(FileBlock const &fb)
virtual void respondToCloseInputFile(FileBlock const &)
Definition: OutputModule.h:211
virtual ~OutputModule()
bool doEndRun(RunPrincipal const &rp, EventSetup const &c, CurrentProcessingContext const *cpc)
void configure(OutputModuleDescription const &desc)
virtual void openFile(FileBlock const &)
Definition: OutputModule.h:209
void setupDefault(std::vector< std::string > const &triggernames)
bool doBeginRun(RunPrincipal const &rp, EventSetup const &c, CurrentProcessingContext const *cpc)
virtual void startEndFile()
Definition: OutputModule.h:233
ParameterSet const & registerIt()
virtual void writeBranchMapper()
Definition: OutputModule.h:244
virtual void writeLuminosityBlock(LuminosityBlockPrincipal const &)=0
ModuleDescription const & description() const
BranchParents branchParents_
Definition: OutputModule.h:164
virtual void preForkReleaseResources()
Definition: OutputModule.h:214
OutputModule(ParameterSet const &pset)
bool wantEvent(Event const &e)
virtual void writeBranchIDListRegistry()
Definition: OutputModule.h:240
virtual void writeProcessHistoryRegistry()
Definition: OutputModule.h:238
void doRespondToOpenOutputFiles(FileBlock const &fb)
virtual void writeProductDescriptionRegistry()
Definition: OutputModule.h:242
ParameterSetID selector_config_id_
Definition: OutputModule.h:155