CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MixingModule.cc
Go to the documentation of this file.
1 // File: MixingModule.cc
2 // Description: see MixingModule.h
3 // Author: Ursula Berthon, LLR Palaiseau, Bill Tanenbaum
4 //
5 //--------------------------------------------
6 
7 #include "MixingModule.h"
8 #include "MixingWorker.h"
9 #include "Adjuster.h"
10 
32 
33 namespace edm {
34 
35  // Constructor
37  BMixingModule(ps_mix),
38  inputTagPlayback_(),
39  mixProdStep2_(ps_mix.getParameter<bool>("mixProdStep2")),
40  mixProdStep1_(ps_mix.getParameter<bool>("mixProdStep1")),
41  digiAccumulators_()
42  {
43  if (!mixProdStep1_ && !mixProdStep2_) LogInfo("MixingModule") << " The MixingModule was run in the Standard mode.";
44  if (mixProdStep1_) LogInfo("MixingModule") << " The MixingModule was run in the Step1 mode. It produces a mixed secondary source.";
45  if (mixProdStep2_) LogInfo("MixingModule") << " The MixingModule was run in the Step2 mode. It uses a mixed secondary source.";
46 
48  if (ps_mix.exists("useCurrentProcessOnly")) {
49  useCurrentProcessOnly_=ps_mix.getParameter<bool>("useCurrentProcessOnly");
50  LogInfo("MixingModule") <<" using given Parameter 'useCurrentProcessOnly' ="<<useCurrentProcessOnly_;
51  }
52  std::string labelPlayback;
53  if (ps_mix.exists("LabelPlayback")) {
54  labelPlayback = ps_mix.getParameter<std::string>("LabelPlayback");
55  }
56  if (labelPlayback.empty()) {
57  labelPlayback = ps_mix.getParameter<std::string>("@module_label");
58  }
59  if (playback_) {
61  consumes<CrossingFramePlaybackInfoExtended>(inputTagPlayback_);
62  }
63 
64  ParameterSet ps=ps_mix.getParameter<ParameterSet>("mixObjects");
65  std::vector<std::string> names = ps.getParameterNames();
66  for(std::vector<std::string>::iterator it=names.begin();it!= names.end();++it) {
67  ParameterSet pset=ps.getParameter<ParameterSet>((*it));
68  if (!pset.exists("type")) continue; //to allow replacement by empty pset
69  std::string object = pset.getParameter<std::string>("type");
70  std::vector<InputTag> tags=pset.getParameter<std::vector<InputTag> >("input");
71 
72  //if (!mixProdStep2_) {
73 
74  InputTag tagCF = InputTag();
75  std::string labelCF = " ";
76 
77  if (object=="SimTrack") {
78  InputTag tag;
79  if (tags.size()>0) tag=tags[0];
81 
82  branchesActivate(TypeID(typeid(std::vector<SimTrack>)).friendlyClassName(),std::string(""),tag,label);
83  adjustersObjects_.push_back(new Adjuster<SimTrack>(tag));
84  bool makeCrossingFrame = pset.getUntrackedParameter<bool>("makeCrossingFrame", false);
85  if(makeCrossingFrame) {
87  produces<CrossingFrame<SimTrack> >(label);
88  consumes<std::vector<SimTrack> >(tag);
89  }
90 
91  LogInfo("MixingModule") <<"Will mix "<<object<<"s with InputTag= "<<tag.encode()<<", label will be "<<label;
92  // std::cout <<"Will mix "<<object<<"s with InputTag= "<<tag.encode()<<", label will be "<<label<<std::endl;
93 
94  } else if (object=="RecoTrack") {
95  InputTag tag;
96  if (tags.size()>0) tag=tags[0];
98 
99  branchesActivate(TypeID(typeid(std::vector<reco::Track>)).friendlyClassName(),std::string(""),tag,label);
100  // note: no crossing frame is foreseen to be used for this object type
101 
102  LogInfo("MixingModule") <<"Will mix "<<object<<"s with InputTag= "<<tag.encode()<<", label will be "<<label;
103  //std::cout <<"Will mix "<<object<<"s with InputTag= "<<tag.encode()<<", label will be "<<label<<std::endl;
104 
105  } else if (object=="SimVertex") {
106  InputTag tag;
107  if (tags.size()>0) tag=tags[0];
109 
110  branchesActivate(TypeID(typeid(std::vector<SimVertex>)).friendlyClassName(),std::string(""),tag,label);
111  adjustersObjects_.push_back(new Adjuster<SimVertex>(tag));
112  bool makeCrossingFrame = pset.getUntrackedParameter<bool>("makeCrossingFrame", false);
113  if(makeCrossingFrame) {
115  produces<CrossingFrame<SimVertex> >(label);
116  consumes<std::vector<SimVertex> >(tag);
117  }
118 
119  LogInfo("MixingModule") <<"Will mix "<<object<<"s with InputTag "<<tag.encode()<<", label will be "<<label;
120  // std::cout <<"Will mix "<<object<<"s with InputTag "<<tag.encode()<<", label will be "<<label<<std::endl;
121 
122  } else if (object=="HepMCProduct") {
123  InputTag tag;
124  if (tags.size()>0) tag=tags[0];
126 
127  branchesActivate(TypeID(typeid(HepMCProduct)).friendlyClassName(),std::string(""),tag,label);
128  bool makeCrossingFrame = pset.getUntrackedParameter<bool>("makeCrossingFrame", false);
129  if(makeCrossingFrame) {
131  produces<CrossingFrame<HepMCProduct> >(label);
132  consumes<HepMCProduct>(tag);
133  }
134 
135  LogInfo("MixingModule") <<"Will mix "<<object<<"s with InputTag= "<<tag.encode()<<", label will be "<<label;
136  // std::cout <<"Will mix "<<object<<"s with InputTag= "<<tag.encode()<<", label will be "<<label<<std::endl;
137 
138  } else if (object=="PCaloHit") {
139  std::vector<std::string> subdets=pset.getParameter<std::vector<std::string> >("subdets");
140  std::vector<std::string> crossingFrames=pset.getUntrackedParameter<std::vector<std::string> >("crossingFrames", std::vector<std::string>());
141  sort_all(crossingFrames);
142  for (unsigned int ii=0;ii<subdets.size();++ii) {
143  InputTag tag;
144  if (tags.size()==1) tag=tags[0];
145  else if(tags.size()>1) tag=tags[ii];
147 
148  branchesActivate(TypeID(typeid(std::vector<PCaloHit>)).friendlyClassName(),subdets[ii],tag,label);
149  adjustersObjects_.push_back(new Adjuster<PCaloHit>(tag));
150  if(binary_search_all(crossingFrames, tag.instance())) {
151  workersObjects_.push_back(new MixingWorker<PCaloHit>(minBunch_,maxBunch_,bunchSpace_,subdets[ii],label,labelCF,maxNbSources_,tag,tagCF));
152  produces<CrossingFrame<PCaloHit> >(label);
153  consumes<std::vector<PCaloHit> >(tag);
154  }
155 
156  LogInfo("MixingModule") <<"Will mix "<<object<<"s with InputTag= "<<tag.encode()<<", label will be "<<label;
157  // std::cout <<"Will mix "<<object<<"s with InputTag= "<<tag.encode()<<", label will be "<<label<<std::endl;
158 
159  }
160 
161  } else if (object=="PSimHit") {
162  std::vector<std::string> subdets=pset.getParameter<std::vector<std::string> >("subdets");
163  std::vector<std::string> crossingFrames=pset.getUntrackedParameter<std::vector<std::string> >("crossingFrames", std::vector<std::string>());
164  sort_all(crossingFrames);
165  for (unsigned int ii=0;ii<subdets.size();++ii) {
166  InputTag tag;
167  if (tags.size()==1) tag=tags[0];
168  else if(tags.size()>1) tag=tags[ii];
170 
171  branchesActivate(TypeID(typeid(std::vector<PSimHit>)).friendlyClassName(),subdets[ii],tag,label);
172  adjustersObjects_.push_back(new Adjuster<PSimHit>(tag));
173  if(binary_search_all(crossingFrames, tag.instance())) {
174  workersObjects_.push_back(new MixingWorker<PSimHit>(minBunch_,maxBunch_,bunchSpace_,subdets[ii],label,labelCF,maxNbSources_,tag,tagCF));
175  produces<CrossingFrame<PSimHit> >(label);
176  consumes<std::vector<PSimHit> >(tag);
177  }
178 
179  LogInfo("MixingModule") <<"Will mix "<<object<<"s with InputTag= "<<tag.encode()<<", label will be "<<label;
180  // std::cout <<"Will mix "<<object<<"s with InputTag= "<<tag.encode()<<", label will be "<<label<<std::endl;
181  }
182  } else {
183  LogWarning("MixingModule") <<"You have asked to mix an unknown type of object("<<object<<").\n If you want to include it in mixing, please contact the authors of the MixingModule!";
184  }
185  //} //if for mixProdStep2
186  }//while over the mixObjects parameters
187 
189  for (unsigned int branch=0;branch<wantedBranches_.size();++branch) LogDebug("MixingModule")<<"Will keep branch "<<wantedBranches_[branch]<<" for mixing ";
190 
192 
193  produces<PileupMixingContent>();
194 
195  produces<CrossingFramePlaybackInfoExtended>();
196 
198  // Create and configure digitizers
199  createDigiAccumulators(ps_mix, iC);
200  }
201 
202 
204  ParameterSet const& digiPSet = mixingPSet.getParameterSet("digitizers");
205  std::vector<std::string> digiNames = digiPSet.getParameterNames();
206  for(auto const& digiName : digiNames) {
207  ParameterSet const& pset = digiPSet.getParameterSet(digiName);
208  std::auto_ptr<DigiAccumulatorMixMod> accumulator = std::auto_ptr<DigiAccumulatorMixMod>(DigiAccumulatorMixModFactory::get()->makeDigiAccumulator(pset, *this, iC));
209  // Create appropriate DigiAccumulator
210  if(accumulator.get() != 0) {
211  digiAccumulators_.push_back(accumulator.release());
212  }
213  }
214  }
215 
217  //change the basic parameters.
219  setup.get<MixingRcd>().get(config);
220  minBunch_=config->minBunch();
221  maxBunch_=config->maxBunch();
222  bunchSpace_=config->bunchSpace();
223  //propagate to change the workers
224  for (unsigned int ii=0;ii<workersObjects_.size();++ii){
225  workersObjects_[ii]->reload(setup);
226  }
227  }
228 
230 
231  label=tag.label()+tag.instance();
232  wantedBranches_.push_back(friendlyName + '_' +
233  tag.label() + '_' +
234  tag.instance());
235 
236  //if useCurrentProcessOnly, we have to change the input tag
239  tag = InputTag(tag.label(),tag.instance(),processName);
240  }
241  }
242 
244  if (adjusters_.empty()){
245  for (auto const& adjuster : adjustersObjects_) {
246  if (adjuster->checkSignal(e)){
247  adjusters_.push_back(adjuster);
248  }
249  }
250  }
251  if (workers_.empty()){
252  for (auto const& worker : workersObjects_) {
253  if (worker->checkSignal(e)){
254  workers_.push_back(worker);
255  }
256  }
257  }
258  }
259 
261  //create playback info
263  //and CrossingFrames
264  for (unsigned int ii=0;ii<workers_.size();++ii){
265  workers_[ii]->createnewEDProduct();
266  }
267  }
268 
269  // Virtual destructor needed.
271  for (auto& worker : workersObjects_) {
272  delete worker;
273  }
274 
275  for (auto& adjuster : adjustersObjects_) {
276  delete adjuster;
277  }
278 
279  for (auto& digiAccumulator : digiAccumulators_) {
280  delete digiAccumulator;
281  }
282  }
283 
285 
286  LogDebug("MixingModule")<<"===============> adding signals for "<<e.id();
287 
288  accumulateEvent(e, setup);
289  // fill in signal part of CrossingFrame
290  for (unsigned int ii=0;ii<workers_.size();++ii) {
291  workers_[ii]->addSignals(e);
292  }
293  }
294 
295  void MixingModule::pileAllWorkers(EventPrincipal const& eventPrincipal,
296  ModuleCallingContext const* mcc,
297  int bunchCrossing, int eventId,
298  int& vertexOffset,
299  const edm::EventSetup& setup,
300  StreamID const& streamID) {
301 
302  InternalContext internalContext(eventPrincipal.id(), mcc);
303  ParentContext parentContext(&internalContext);
304  ModuleCallingContext moduleCallingContext(&moduleDescription());
305  ModuleContextSentry moduleContextSentry(&moduleCallingContext, parentContext);
306 
307  for (auto const& adjuster : adjusters_) {
308  adjuster->doOffset(bunchSpace_, bunchCrossing, eventPrincipal, &moduleCallingContext, eventId, vertexOffset);
309  }
310  PileUpEventPrincipal pep(eventPrincipal, &moduleCallingContext, bunchCrossing);
311  accumulateEvent(pep, setup, streamID);
312 
313  for (auto const& worker : workers_) {
314  LogDebug("MixingModule") <<" merging Event: id " << eventPrincipal.id();
315  // std::cout <<"PILEALLWORKERS merging Event: id " << eventPrincipal.id() << std::endl;
316 
317  worker->addPileups(eventPrincipal, &moduleCallingContext, eventId);
318  }
319  }
320 
322  // Don't allocate because PileUp will do it for us.
323  std::vector<edm::EventID> recordEventID;
325  if (playback_) {
326  bool got = e.getByLabel(inputTagPlayback_, playbackInfo_H);
327  if (!got) {
328  throw cms::Exception("MixingProductNotFound") << " No "
329  "CrossingFramePlaybackInfoExtended on the input file, but playback "
330  "option set!!!!! Please change the input file if you really want "
331  "playback!!!!!!" << std::endl;
332  }
333  }
334 
335  // source[0] is "real" pileup. Check to see that this is what we are doing.
336 
337  std::vector<int> PileupList;
338  PileupList.clear();
339  TrueNumInteractions_.clear();
340 
341  boost::shared_ptr<PileUp> source0 = inputSources_[0];
342 
343  if((source0 && source0->doPileUp() ) && !playback_) {
344  // if((!inputSources_[0] || !inputSources_[0]->doPileUp()) && !playback_ )
345 
346  // Pre-calculate all pileup distributions before we go fishing for events
347 
348  source0->CalculatePileup(minBunch_, maxBunch_, PileupList, TrueNumInteractions_, e.streamID());
349 
350  }
351 
352  // for (int bunchIdx = minBunch_; bunchIdx <= maxBunch_; ++bunchIdx) {
353  // std::cout << " bunch ID, Pileup, True " << bunchIdx << " " << PileupList[bunchIdx-minBunch_] << " " << TrueNumInteractions_[bunchIdx-minBunch_] << std::endl;
354  //}
355 
356  int KeepTrackOfPileup = 0;
357 
358  for (int bunchIdx = minBunch_; bunchIdx <= maxBunch_; ++bunchIdx) {
359  for (size_t setBcrIdx=0; setBcrIdx<workers_.size(); ++setBcrIdx) {
360  workers_[setBcrIdx]->setBcrOffset();
361  }
362  for(Accumulators::const_iterator accItr = digiAccumulators_.begin(), accEnd = digiAccumulators_.end(); accItr != accEnd; ++accItr) {
363  (*accItr)->initializeBunchCrossing(e, setup, bunchIdx);
364  }
365 
366  for (size_t readSrcIdx=0; readSrcIdx<maxNbSources_; ++readSrcIdx) {
367  boost::shared_ptr<PileUp> source = inputSources_[readSrcIdx]; // this looks like we create
368  // new PileUp objects for each
369  // source for each event?
370  // Why?
371  for (size_t setSrcIdx=0; setSrcIdx<workers_.size(); ++setSrcIdx) {
372  workers_[setSrcIdx]->setSourceOffset(readSrcIdx);
373  }
374 
375  if (!source || !source->doPileUp()) continue;
376 
377  int NumPU_Events = 0;
378 
379  if(readSrcIdx ==0 && !playback_) {
380  NumPU_Events = PileupList[bunchIdx - minBunch_];
381  } else {
382  NumPU_Events = 1;
383  } // non-minbias pileup only gets one event for now. Fix later if desired.
384 
385  // int eventId = 0;
386  int vertexOffset = 0;
387 
388  ModuleCallingContext const* mcc = e.moduleCallingContext();
389  if (!playback_) {
390  inputSources_[readSrcIdx]->readPileUp(e.id(), recordEventID,
391  boost::bind(&MixingModule::pileAllWorkers, boost::ref(*this), _1, mcc, bunchIdx,
392  _2, vertexOffset, boost::ref(setup), boost::cref(e.streamID())), NumPU_Events, e.streamID()
393  );
394  playbackInfo_->setStartEventId(recordEventID, readSrcIdx, bunchIdx, KeepTrackOfPileup);
395  KeepTrackOfPileup+=NumPU_Events;
396  } else {
397  int dummyId = 0;
398  const std::vector<edm::EventID>& playEventID =
399  playbackInfo_H->getStartEventId(readSrcIdx, bunchIdx);
400  if(readSrcIdx == 0) {
401  PileupList.push_back(playEventID.size());
402  TrueNumInteractions_.push_back(playEventID.size());
403  }
404  inputSources_[readSrcIdx]->playPileUp(
405  playEventID,
406  boost::bind(&MixingModule::pileAllWorkers, boost::ref(*this), _1, mcc, bunchIdx,
407  dummyId, vertexOffset, boost::ref(setup), boost::cref(e.streamID()))
408  );
409  }
410  }
411  for(Accumulators::const_iterator accItr = digiAccumulators_.begin(), accEnd = digiAccumulators_.end(); accItr != accEnd; ++accItr) {
412  (*accItr)->finalizeBunchCrossing(e, setup, bunchIdx);
413  }
414  }
415 
416  // Keep track of pileup accounting...
417 
418  std::auto_ptr<PileupMixingContent> PileupMixing_;
419 
420  std::vector<int> numInteractionList;
421  std::vector<int> bunchCrossingList;
422  std::vector<float> TrueInteractionList;
423 
424  //Makin' a list: Basically, we don't care about the "other" sources at this point.
425  for (int bunchCrossing=minBunch_;bunchCrossing<=maxBunch_;++bunchCrossing) {
426  bunchCrossingList.push_back(bunchCrossing);
427  if(!inputSources_[0] || !inputSources_[0]->doPileUp()) {
428  numInteractionList.push_back(0);
429  TrueInteractionList.push_back(0);
430  }
431  else {
432  numInteractionList.push_back(PileupList[bunchCrossing-minBunch_]);
433  TrueInteractionList.push_back((TrueNumInteractions_)[bunchCrossing-minBunch_]);
434  }
435  }
436 
437  for(Accumulators::const_iterator accItr = digiAccumulators_.begin(), accEnd = digiAccumulators_.end(); accItr != accEnd; ++accItr) {
438  (*accItr)->StorePileupInformation( bunchCrossingList,
439  numInteractionList,
440  TrueInteractionList);
441  }
442 
443 
444  PileupMixing_ = std::auto_ptr<PileupMixingContent>(new PileupMixingContent(bunchCrossingList,
445  numInteractionList,
446  TrueInteractionList));
447 
448  e.put(PileupMixing_);
449 
450  // we have to do the ToF transformation for PSimHits once all pileup has been added
451  for (unsigned int ii=0;ii<workers_.size();++ii) {
452  workers_[ii]->setTof();
453  workers_[ii]->put(e);
454  }
455  }
456 
458 
459  if (playbackInfo_) {
460  std::auto_ptr<CrossingFramePlaybackInfoExtended> pOut(playbackInfo_);
461  e.put(pOut);
462  }
463  }
464 
466  for(Accumulators::const_iterator accItr = digiAccumulators_.begin(), accEnd = digiAccumulators_.end(); accItr != accEnd; ++accItr) {
467  (*accItr)->beginRun(run, setup);
468  }
469  BMixingModule::beginRun( run, setup);
470  }
471 
473  for(Accumulators::const_iterator accItr = digiAccumulators_.begin(), accEnd = digiAccumulators_.end(); accItr != accEnd; ++accItr) {
474  (*accItr)->endRun(run, setup);
475  }
476  BMixingModule::endRun( run, setup);
477  }
478 
480  for(Accumulators::const_iterator accItr = digiAccumulators_.begin(), accEnd = digiAccumulators_.end(); accItr != accEnd; ++accItr) {
481  (*accItr)->beginLuminosityBlock(lumi, setup);
482  }
484  }
485 
487  for(Accumulators::const_iterator accItr = digiAccumulators_.begin(), accEnd = digiAccumulators_.end(); accItr != accEnd; ++accItr) {
488  (*accItr)->endLuminosityBlock(lumi, setup);
489  }
491  }
492 
493  void
495  for(Accumulators::const_iterator accItr = digiAccumulators_.begin(), accEnd = digiAccumulators_.end(); accItr != accEnd; ++accItr) {
496  (*accItr)->initializeEvent(event, setup);
497  }
498  }
499 
500  void
502  for(Accumulators::const_iterator accItr = digiAccumulators_.begin(), accEnd = digiAccumulators_.end(); accItr != accEnd; ++accItr) {
503  (*accItr)->accumulate(event, setup);
504  }
505  }
506 
507  void
509  for(Accumulators::const_iterator accItr = digiAccumulators_.begin(), accEnd = digiAccumulators_.end(); accItr != accEnd; ++accItr) {
510  (*accItr)->accumulate(event, setup, streamID);
511  }
512  }
513 
514  void
516  for(Accumulators::const_iterator accItr = digiAccumulators_.begin(), accEnd = digiAccumulators_.end(); accItr != accEnd; ++accItr) {
517  (*accItr)->finalizeEvent(event, setup);
518  }
519  }
520 }//edm
#define LogDebug(id)
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
virtual void reload(const edm::EventSetup &)
virtual void beginRun(const edm::Run &r, const edm::EventSetup &setup) override
virtual ~MixingModule()
MixingModule(const edm::ParameterSet &ps)
Definition: MixingModule.cc:36
virtual void beginLuminosityBlock(LuminosityBlock const &l1, EventSetup const &c) override
static std::string const source("source")
static const HistoName names[]
virtual void createnewEDProduct()
tuple lumi
Definition: fjr2json.py:35
void createDigiAccumulators(const edm::ParameterSet &mixingPSet, edm::ConsumesCollector &iC)
std::vector< float > TrueNumInteractions_
Definition: BMixingModule.h:92
virtual void addSignals(const edm::Event &e, const edm::EventSetup &es)
EventID const & id() const
bool exists(std::string const &parameterName) const
checks if a parameter exists
int ii
Definition: cuy.py:588
std::auto_ptr< DigiAccumulatorMixMod > makeDigiAccumulator(ParameterSet const &, one::EDProducerBase &, ConsumesCollector &) const
ModuleDescription const & moduleDescription() const
std::string encode() const
Definition: InputTag.cc:164
virtual void endRun(const edm::Run &r, const edm::EventSetup &setup) override
virtual void put(edm::Event &e, const edm::EventSetup &es)
void setStartEventId(const std::vector< edm::EventID > &id, const unsigned int s, const int bcr, const int start)
ModuleCallingContext const * moduleCallingContext() const
Definition: Event.h:212
virtual void checkSignal(const edm::Event &e)
std::string friendlyName(std::string const &iFullName)
virtual void endLuminosityBlock(LuminosityBlock const &l1, EventSetup const &c) override
std::vector< MixingWorkerBase * > workers_
Definition: MixingModule.h:97
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:116
Accumulators digiAccumulators_
Definition: MixingModule.h:103
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
static const std::string kSkipCurrentProcess
Definition: InputTag.h:56
std::vector< AdjusterBase * > adjusters_
Definition: MixingModule.h:95
static const unsigned int maxNbSources_
Definition: BMixingModule.h:89
std::vector< MixingWorkerBase * > workersObjects_
Definition: MixingModule.h:98
virtual void beginRun(Run const &r1, EventSetup const &c) override
std::vector< std::string > getParameterNames() const
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
char const * subdets[11]
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:390
virtual void branchesActivate(const std::string &friendlyName, const std::string &subdet, InputTag &tag, std::string &label)
tuple tags
Definition: o2o.py:248
void finalizeEvent(Event &event, EventSetup const &setup)
void sort_all(RandomAccessSequence &s)
wrappers for std::sort
Definition: Algorithms.h:120
ParameterSet const & getParameterSet(std::string const &) const
const T & get() const
Definition: EventSetup.h:55
std::vector< std::string > wantedBranches_
Definition: MixingModule.h:99
std::vector< AdjusterBase * > adjustersObjects_
Definition: MixingModule.h:96
InputTag inputTagPlayback_
Definition: MixingModule.h:90
std::string const & label() const
Definition: InputTag.h:42
std::vector< boost::shared_ptr< PileUp > > inputSources_
Definition: BMixingModule.h:97
edm::EventID id() const
Definition: EventBase.h:56
void accumulateEvent(Event const &event, EventSetup const &setup)
StreamID streamID() const
Definition: Event.h:75
bool binary_search_all(ForwardSequence const &s, Datum const &d)
wrappers for std::binary_search
Definition: Algorithms.h:76
CrossingFramePlaybackInfoExtended * playbackInfo_
Definition: MixingModule.h:93
void dropUnwantedBranches(std::vector< std::string > const &wantedBranches)
virtual void beginLuminosityBlock(const edm::LuminosityBlock &l, const edm::EventSetup &setup) override
static DigiAccumulatorMixModFactory const * get()
void initializeEvent(Event const &event, EventSetup const &setup)
std::string const & instance() const
Definition: InputTag.h:43
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
virtual void endLuminosityBlock(const edm::LuminosityBlock &l, const edm::EventSetup &setup) override
virtual void doPileUp(edm::Event &e, const edm::EventSetup &es) override
Definition: Run.h:41
void pileAllWorkers(EventPrincipal const &ep, ModuleCallingContext const *, int bcr, int id, int &offset, const edm::EventSetup &setup, edm::StreamID const &)
virtual void endRun(Run const &r1, EventSetup const &c) override