43 mixProdStep2_(ps_mix.getParameter<bool>(
"mixProdStep2")),
44 mixProdStep1_(ps_mix.getParameter<bool>(
"mixProdStep1")),
48 if (
mixProdStep1_)
LogInfo(
"MixingModule") <<
" The MixingModule was run in the Step1 mode. It produces a mixed secondary source.";
49 if (
mixProdStep2_)
LogInfo(
"MixingModule") <<
" The MixingModule was run in the Step2 mode. It uses a mixed secondary source.";
52 if (ps_mix.
exists(
"useCurrentProcessOnly")) {
57 if (ps_mix.
exists(
"LabelPlayback")) {
60 if (labelPlayback.empty()) {
70 for(std::vector<std::string>::iterator it=names.begin();it!= names.end();++it) {
72 if (!pset.
exists(
"type"))
continue;
74 std::vector<InputTag>
tags=pset.
getParameter<std::vector<InputTag> >(
"input");
81 if (
object==
"SimTrack") {
83 if (tags.size()>0) tag=tags[0];
89 if(makeCrossingFrame) {
91 produces<CrossingFrame<SimTrack> >(
label);
92 consumes<std::vector<SimTrack> >(
tag);
95 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag= "<<tag.
encode()<<
", label will be "<<
label;
98 }
else if (
object==
"RecoTrack") {
100 if (tags.size()>0) tag=tags[0];
108 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag= "<<tag.
encode()<<
", label will be "<<
label;
111 }
else if (
object==
"SimVertex") {
113 if (tags.size()>0) tag=tags[0];
119 if(makeCrossingFrame) {
121 produces<CrossingFrame<SimVertex> >(
label);
122 consumes<std::vector<SimVertex> >(
tag);
125 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag "<<tag.
encode()<<
", label will be "<<
label;
128 }
else if (
object==
"HepMCProduct") {
130 if (tags.size()>0) tag=tags[0];
135 if(makeCrossingFrame) {
137 produces<CrossingFrame<HepMCProduct> >(
label);
139 consumes<HepMCProduct>(
tag);
141 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag= "<<tag.
encode()<<
", label will be "<<
label;
144 }
else if (
object==
"PCaloHit") {
146 std::vector<std::string> crossingFrames=pset.
getUntrackedParameter<std::vector<std::string> >(
"crossingFrames", std::vector<std::string>());
148 for (
unsigned int ii=0;
ii<subdets.size();++
ii) {
150 if (tags.size()==1) tag=tags[0];
151 else if(tags.size()>1) tag=tags[
ii];
158 produces<CrossingFrame<PCaloHit> >(
label);
159 consumes<std::vector<PCaloHit> >(
tag);
162 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag= "<<tag.
encode()<<
", label will be "<<
label;
167 }
else if (
object==
"PSimHit") {
169 std::vector<std::string> crossingFrames=pset.
getUntrackedParameter<std::vector<std::string> >(
"crossingFrames", std::vector<std::string>());
171 for (
unsigned int ii=0;
ii<subdets.size();++
ii) {
173 if (tags.size()==1) tag=tags[0];
174 else if(tags.size()>1) tag=tags[
ii];
181 produces<CrossingFrame<PSimHit> >(
label);
182 consumes<std::vector<PSimHit> >(
tag);
185 LogInfo(
"MixingModule") <<
"Will mix "<<
object<<
"s with InputTag= "<<tag.
encode()<<
", label will be "<<
label;
189 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!";
199 produces<PileupMixingContent>();
201 produces<CrossingFramePlaybackInfoNew>();
212 for(
auto const& digiName : digiNames) {
216 if(accumulator.get() != 0) {
252 if (adjuster->checkSignal(e)){
259 if (worker->checkSignal(e)){
286 delete digiAccumulator;
292 LogDebug(
"MixingModule")<<
"===============> adding signals for "<<e.
id();
303 int bunchCrossing,
int eventId,
314 adjuster->doOffset(
bunchSpace_, bunchCrossing, eventPrincipal, &moduleCallingContext, eventId, vertexOffset);
319 for (
auto const& worker :
workers_) {
320 LogDebug(
"MixingModule") <<
" merging Event: id " << eventPrincipal.
id();
323 worker->addPileups(eventPrincipal, &moduleCallingContext, eventId);
328 using namespace std::placeholders;
331 std::vector<edm::SecondaryEventIDAndFileInfo> recordEventID;
332 std::vector<size_t> sizes;
334 size_t playbackCounter = 0U;
337 bool oldFormatPlayback =
false;
344 "CrossingFramePlaybackInfoNew on the input file, but playback "
345 "option set!!!!! Please change the input file if you really want "
346 "playback!!!!!!" << std::endl;
348 oldFormatPlayback =
true;
354 std::vector<int> PileupList;
360 if((source0 && source0->doPileUp(0) ) && !
playback_) {
374 for (
size_t setBcrIdx=0; setBcrIdx<
workers_.size(); ++setBcrIdx) {
375 workers_[setBcrIdx]->setBcrOffset();
378 (*accItr)->initializeBunchCrossing(e, setup, bunchIdx);
381 for (
size_t readSrcIdx=0; readSrcIdx<
maxNbSources_; ++readSrcIdx) {
386 for (
size_t setSrcIdx=0; setSrcIdx<
workers_.size(); ++setSrcIdx) {
387 workers_[setSrcIdx]->setSourceOffset(readSrcIdx);
390 if (!source || !source->doPileUp(bunchIdx)) {
393 playbackCounter += playbackInfo_H->getNumberOfEvents(bunchIdx, readSrcIdx);
399 int vertexOffset = 0;
404 int numberOfEvents = (readSrcIdx == 0 ? PileupList[bunchIdx -
minBunch_] : 1);
405 sizes.push_back(numberOfEvents);
408 _2, vertexOffset, std::ref(setup), e.
streamID()), numberOfEvents, e.
streamID());
409 }
else if(oldFormatPlayback) {
410 std::vector<edm::EventID>
const& playEventID = oldFormatPlaybackInfo_H->getStartEventId(readSrcIdx, bunchIdx);
411 size_t numberOfEvents = playEventID.size();
412 if(readSrcIdx == 0) {
413 PileupList.push_back(numberOfEvents);
416 sizes.push_back(numberOfEvents);
417 std::vector<EventID>::const_iterator
begin = playEventID.begin();
418 std::vector<EventID>::const_iterator
end = playEventID.end();
420 begin, end, recordEventID,
422 _2, vertexOffset, std::ref(setup), e.
streamID()));
424 size_t numberOfEvents = playbackInfo_H->getNumberOfEvents(bunchIdx, readSrcIdx);
425 if(readSrcIdx == 0) {
426 PileupList.push_back(numberOfEvents);
429 sizes.push_back(numberOfEvents);
430 std::vector<SecondaryEventIDAndFileInfo>::const_iterator
begin = playbackInfo_H->getEventId(playbackCounter);
431 playbackCounter += numberOfEvents;
432 std::vector<SecondaryEventIDAndFileInfo>::const_iterator
end = playbackInfo_H->getEventId(playbackCounter);
434 begin, end, recordEventID,
436 _2, vertexOffset, std::ref(setup), e.
streamID()));
440 (*accItr)->finalizeBunchCrossing(e, setup, bunchIdx);
445 std::vector<edm::EventID> eventInfoList;
446 for (
auto const item : recordEventID) {
447 eventInfoList.emplace_back(item.eventID());
455 std::auto_ptr<PileupMixingContent> PileupMixing_;
457 std::vector<int> numInteractionList;
458 std::vector<int> bunchCrossingList;
459 std::vector<float> TrueInteractionList;
463 bunchCrossingList.push_back(bunchCrossing);
465 numInteractionList.push_back(0);
466 TrueInteractionList.push_back(0);
469 numInteractionList.push_back(PileupList[bunchCrossing-
minBunch_]);
475 (*accItr)->StorePileupInformation( bunchCrossingList,
483 PileupMixing_ = std::auto_ptr<PileupMixingContent>(
new PileupMixingContent(bunchCrossingList,
489 e.
put(PileupMixing_);
501 std::auto_ptr<CrossingFramePlaybackInfoNew> pOut(
playbackInfo_);
508 (*accItr)->beginRun(run, setup);
515 (*accItr)->endRun(run, setup);
522 (*accItr)->beginLuminosityBlock(lumi, setup);
529 (*accItr)->endLuminosityBlock(lumi, setup);
537 (*accItr)->initializeEvent(event, setup);
544 (*accItr)->accumulate(event, setup);
551 (*accItr)->accumulate(event, setup, streamID);
558 (*accItr)->finalizeEvent(event, setup);
void setInfo(std::vector< edm::SecondaryEventIDAndFileInfo > &eventInfo, std::vector< size_t > &sizes)
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
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 endRun(const edm::Run &r, const edm::EventSetup &setup) override
virtual void put(edm::Event &e, const edm::EventSetup &es)
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
CrossingFramePlaybackInfoNew * playbackInfo_
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
std::vector< std::string > wantedBranches_
std::vector< AdjusterBase * > adjustersObjects_
InputTag inputTagPlayback_
void accumulateEvent(Event const &event, EventSetup const &setup)
std::vector< std::shared_ptr< PileUp > > inputSources_
StreamID streamID() const
bool binary_search_all(ForwardSequence const &s, Datum const &d)
wrappers for std::binary_search
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)
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
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