39 mixProdStep2_(ps_mix.getParameter<bool>(
"mixProdStep2")),
40 mixProdStep1_(ps_mix.getParameter<bool>(
"mixProdStep1")),
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.";
48 if (ps_mix.
exists(
"useCurrentProcessOnly")) {
53 if (ps_mix.
exists(
"LabelPlayback")) {
56 if (labelPlayback.empty()) {
66 for(std::vector<std::string>::iterator it=names.begin();it!= names.end();++it) {
68 if (!pset.
exists(
"type"))
continue;
70 std::vector<InputTag>
tags=pset.
getParameter<std::vector<InputTag> >(
"input");
77 if (
object==
"SimTrack") {
79 if (tags.size()>0) tag=tags[0];
85 if(makeCrossingFrame) {
87 produces<CrossingFrame<SimTrack> >(
label);
88 consumes<std::vector<SimTrack> >(
tag);
91 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag= "<<tag.
encode()<<
", label will be "<<
label;
94 }
else if (
object==
"RecoTrack") {
96 if (tags.size()>0) tag=tags[0];
102 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag= "<<tag.
encode()<<
", label will be "<<
label;
105 }
else if (
object==
"SimVertex") {
107 if (tags.size()>0) tag=tags[0];
113 if(makeCrossingFrame) {
115 produces<CrossingFrame<SimVertex> >(
label);
116 consumes<std::vector<SimVertex> >(
tag);
119 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag "<<tag.
encode()<<
", label will be "<<
label;
122 }
else if (
object==
"HepMCProduct") {
124 if (tags.size()>0) tag=tags[0];
129 if(makeCrossingFrame) {
131 produces<CrossingFrame<HepMCProduct> >(
label);
132 consumes<HepMCProduct>(
tag);
135 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag= "<<tag.
encode()<<
", label will be "<<
label;
138 }
else if (
object==
"PCaloHit") {
140 std::vector<std::string> crossingFrames=pset.
getUntrackedParameter<std::vector<std::string> >(
"crossingFrames", std::vector<std::string>());
142 for (
unsigned int ii=0;
ii<subdets.size();++
ii) {
144 if (tags.size()==1) tag=tags[0];
145 else if(tags.size()>1) tag=tags[
ii];
152 produces<CrossingFrame<PCaloHit> >(
label);
153 consumes<std::vector<PCaloHit> >(
tag);
156 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag= "<<tag.
encode()<<
", label will be "<<
label;
161 }
else if (
object==
"PSimHit") {
163 std::vector<std::string> crossingFrames=pset.
getUntrackedParameter<std::vector<std::string> >(
"crossingFrames", std::vector<std::string>());
165 for (
unsigned int ii=0;
ii<subdets.size();++
ii) {
167 if (tags.size()==1) tag=tags[0];
168 else if(tags.size()>1) tag=tags[
ii];
175 produces<CrossingFrame<PSimHit> >(
label);
176 consumes<std::vector<PSimHit> >(
tag);
179 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag= "<<tag.
encode()<<
", label will be "<<
label;
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!";
193 produces<PileupMixingContent>();
195 produces<CrossingFramePlaybackInfoExtended>();
206 for(
auto const& digiName : digiNames) {
210 if(accumulator.get() != 0) {
246 if (adjuster->checkSignal(e)){
253 if (worker->checkSignal(e)){
280 delete digiAccumulator;
286 LogDebug(
"MixingModule")<<
"===============> adding signals for "<<e.
id();
297 int bunchCrossing,
int eventId,
307 adjuster->doOffset(
bunchSpace_, bunchCrossing, eventPrincipal, &moduleCallingContext, eventId, vertexOffset);
312 for (
auto const& worker :
workers_) {
313 LogDebug(
"MixingModule") <<
" merging Event: id " << eventPrincipal.
id();
316 worker->addPileups(eventPrincipal, &moduleCallingContext, eventId);
322 std::vector<edm::EventID> recordEventID;
328 "CrossingFramePlaybackInfoExtended on the input file, but playback "
329 "option set!!!!! Please change the input file if you really want "
330 "playback!!!!!!" << std::endl;
336 std::vector<int> PileupList;
342 if((source0 && source0->doPileUp() ) && !
playback_) {
355 int KeepTrackOfPileup = 0;
358 for (
size_t setBcrIdx=0; setBcrIdx<
workers_.size(); ++setBcrIdx) {
359 workers_[setBcrIdx]->setBcrOffset();
362 (*accItr)->initializeBunchCrossing(e, setup, bunchIdx);
365 for (
size_t readSrcIdx=0; readSrcIdx<
maxNbSources_; ++readSrcIdx) {
370 for (
size_t setSrcIdx=0; setSrcIdx<
workers_.size(); ++setSrcIdx) {
371 workers_[setSrcIdx]->setSourceOffset(readSrcIdx);
374 if (!source || !source->doPileUp())
continue;
376 int NumPU_Events = 0;
379 NumPU_Events = PileupList[bunchIdx -
minBunch_];
385 int vertexOffset = 0;
391 _2, vertexOffset, boost::ref(setup)), NumPU_Events
394 KeepTrackOfPileup+=NumPU_Events;
397 const std::vector<edm::EventID>& playEventID =
398 playbackInfo_H->getStartEventId(readSrcIdx, bunchIdx);
399 if(readSrcIdx == 0) {
400 PileupList.push_back(playEventID.size());
406 dummyId, vertexOffset, boost::ref(setup))
411 (*accItr)->finalizeBunchCrossing(e, setup, bunchIdx);
417 std::auto_ptr<PileupMixingContent> PileupMixing_;
419 std::vector<int> numInteractionList;
420 std::vector<int> bunchCrossingList;
421 std::vector<float> TrueInteractionList;
425 bunchCrossingList.push_back(bunchCrossing);
427 numInteractionList.push_back(0);
428 TrueInteractionList.push_back(0);
431 numInteractionList.push_back(PileupList[bunchCrossing-
minBunch_]);
437 PileupMixing_ = std::auto_ptr<PileupMixingContent>(
new PileupMixingContent(bunchCrossingList,
439 TrueInteractionList));
441 e.
put(PileupMixing_);
453 std::auto_ptr<CrossingFramePlaybackInfoExtended> pOut(
playbackInfo_);
460 (*accItr)->beginRun(run, setup);
466 (*accItr)->endRun(run, setup);
472 (*accItr)->beginLuminosityBlock(lumi, setup);
478 (*accItr)->endLuminosityBlock(lumi, setup);
485 (*accItr)->initializeEvent(event, setup);
492 (*accItr)->accumulate(event, setup);
499 (*accItr)->accumulate(event, setup);
506 (*accItr)->finalizeEvent(event, setup);
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
virtual void reload(const edm::EventSetup &)
MixingModule(const edm::ParameterSet &ps)
virtual void beginLuminosityBlock(LuminosityBlock const &l1, EventSetup const &c) override
static std::string const source("source")
static const HistoName names[]
virtual void createnewEDProduct()
void createDigiAccumulators(const edm::ParameterSet &mixingPSet, edm::ConsumesCollector &iC)
std::vector< float > TrueNumInteractions_
virtual void addSignals(const edm::Event &e, const edm::EventSetup &es)
EventID const & id() const
bool exists(std::string const ¶meterName) const
checks if a parameter exists
std::auto_ptr< DigiAccumulatorMixMod > makeDigiAccumulator(ParameterSet const &, one::EDProducerBase &, ConsumesCollector &) const
ModuleDescription const & moduleDescription() const
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
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_
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Accumulators digiAccumulators_
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
std::vector< AdjusterBase * > adjusters_
static const unsigned int maxNbSources_
std::vector< MixingWorkerBase * > workersObjects_
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
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
bool useCurrentProcessOnly_
virtual void branchesActivate(const std::string &friendlyName, const std::string &subdet, InputTag &tag, std::string &label)
void finalizeEvent(Event &event, EventSetup const &setup)
void sort_all(RandomAccessSequence &s)
wrappers for std::sort
ParameterSet const & getParameterSet(std::string const &) const
constexpr char const * subdets[11]
std::vector< std::string > wantedBranches_
std::vector< AdjusterBase * > adjustersObjects_
InputTag inputTagPlayback_
std::vector< boost::shared_ptr< PileUp > > inputSources_
void accumulateEvent(Event const &event, EventSetup const &setup)
bool binary_search_all(ForwardSequence const &s, Datum const &d)
wrappers for std::binary_search
CrossingFramePlaybackInfoExtended * playbackInfo_
void dropUnwantedBranches(std::vector< std::string > const &wantedBranches)
static DigiAccumulatorMixModFactory const * get()
void pileAllWorkers(EventPrincipal const &ep, ModuleCallingContext const *, int bcr, int id, int &offset, const edm::EventSetup &setup)
void initializeEvent(Event const &event, EventSetup const &setup)
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
virtual void doPileUp(edm::Event &e, const edm::EventSetup &es)
virtual void endRun(Run const &r1, EventSetup const &c) override