From 279954be4bd3730b61ffb940580b1e0d449062a5 Mon Sep 17 00:00:00 2001 From: mmusich Date: Thu, 29 Aug 2019 18:49:22 +0200 Subject: [PATCH] fix simulation of the pixel bad components on the FED channel basis for PreMixing --- .../plugins/PreMixingSiPixelWorker.cc | 19 +++++-- .../plugins/SiPixelDigitizerAlgorithm.cc | 51 ++++++++++++++++++- .../plugins/SiPixelDigitizerAlgorithm.h | 7 ++- 3 files changed, 69 insertions(+), 8 deletions(-) diff --git a/SimTracker/SiPixelDigitizer/plugins/PreMixingSiPixelWorker.cc b/SimTracker/SiPixelDigitizer/plugins/PreMixingSiPixelWorker.cc index e34c7a55c732b..139989755dd6f 100644 --- a/SimTracker/SiPixelDigitizer/plugins/PreMixingSiPixelWorker.cc +++ b/SimTracker/SiPixelDigitizer/plugins/PreMixingSiPixelWorker.cc @@ -92,7 +92,9 @@ PreMixingSiPixelWorker::PreMixingSiPixelWorker(const edm::ParameterSet& ps, edm: PixelDigiToken_ = iC.consumes >(pixeldigi_collectionSig_); PixelDigiPToken_ = iC.consumes >(pixeldigi_collectionPile_); + producer.produces< edm::DetSetVector > (PixelDigiCollectionDM_); + producer.produces(PixelDigiCollectionDM_); // clear local storage for this event SiHitStorage_.clear(); @@ -290,10 +292,19 @@ void PreMixingSiPixelWorker::put(edm::Event &e, edm::EventSetup const& iSetup, s edm::ESHandle tTopoHand; iSetup.get().get(tTopoHand); - const TrackerTopology *tTopo=tTopoHand.product(); - - for(const auto& iu : pDD->detUnits()) { - if(iu->type().isTrackerPixel()) { + + const TrackerTopology* tTopo = tTopoHand.product(); + + if (digitizer_.killBadFEDChannels()) { + std::unique_ptr PixelFEDChannelCollection_ = digitizer_.chooseScenario(ps, engine); + if (PixelFEDChannelCollection_ == nullptr) { + throw cms::Exception("NullPointerError") << "PixelFEDChannelCollection not set in chooseScenario function.\n"; + } + e.put(std::move(PixelFEDChannelCollection_), PixelDigiCollectionDM_); + } + + for (const auto& iu : pDD->detUnits()) { + if (iu->type().isTrackerPixel()) { edm::DetSet collector(iu->geographicalId().rawId()); edm::DetSet linkcollector(iu->geographicalId().rawId()); // ignored as DigiSimLinks are combined separately diff --git a/SimTracker/SiPixelDigitizer/plugins/SiPixelDigitizerAlgorithm.cc b/SimTracker/SiPixelDigitizer/plugins/SiPixelDigitizerAlgorithm.cc index 69cb5b5417400..bb295d22c75f2 100644 --- a/SimTracker/SiPixelDigitizer/plugins/SiPixelDigitizerAlgorithm.cc +++ b/SimTracker/SiPixelDigitizer/plugins/SiPixelDigitizerAlgorithm.cc @@ -826,8 +826,55 @@ void SiPixelDigitizerAlgorithm::calculateInstlumiFactor(const std::vector SiPixelDigitizerAlgorithm::chooseScenario(PileupMixingContent* puInfo, CLHEP::HepRandomEngine *engine){ - +std::unique_ptr SiPixelDigitizerAlgorithm::chooseScenario( + const std::vector& ps, CLHEP::HepRandomEngine* engine) { + std::unique_ptr PixelFEDChannelCollection_ = nullptr; + pixelEfficiencies_.PixelFEDChannelCollection_ = nullptr; + + std::vector bunchCrossing; + std::vector TrueInteractionList; + + for (unsigned int i = 0; i < ps.size(); i++) { + bunchCrossing.push_back(ps[i].getBunchCrossing()); + TrueInteractionList.push_back(ps[i].getTrueNumInteractions()); + } + + int pui = 0, p = 0; + std::vector::const_iterator pu; + std::vector::const_iterator pu0 = bunchCrossing.end(); + + for (pu = bunchCrossing.begin(); pu != bunchCrossing.end(); ++pu) { + if (*pu == 0) { + pu0 = pu; + p = pui; + } + pui++; + } + + if (pu0 != bunchCrossing.end()) { + unsigned int PUBin = TrueInteractionList.at(p); // case delta PU=1, fix me + const auto& theProbabilitiesPerScenario = scenarioProbabilityHandle->getProbabilities(PUBin); + std::vector probabilities; + probabilities.reserve(theProbabilitiesPerScenario.size()); + for (auto it = theProbabilitiesPerScenario.begin(); it != theProbabilitiesPerScenario.end(); it++) { + probabilities.push_back(it->second); + } + + CLHEP::RandGeneral randGeneral(*engine, &(probabilities.front()), probabilities.size()); + double x = randGeneral.shoot(); + unsigned int index = x * probabilities.size() - 1; + const std::string& scenario = theProbabilitiesPerScenario.at(index).first; + + PixelFEDChannelCollection_ = std::make_unique(quality_map->at(scenario)); + pixelEfficiencies_.PixelFEDChannelCollection_ = + std::make_unique(quality_map->at(scenario)); + } + + return PixelFEDChannelCollection_; +} + +std::unique_ptr SiPixelDigitizerAlgorithm::chooseScenario(PileupMixingContent* puInfo, + CLHEP::HepRandomEngine* engine) { //Determine scenario to use for the current event based on pileup information std::unique_ptr PixelFEDChannelCollection_ = nullptr; diff --git a/SimTracker/SiPixelDigitizer/plugins/SiPixelDigitizerAlgorithm.h b/SimTracker/SiPixelDigitizer/plugins/SiPixelDigitizerAlgorithm.h index 55b549ed6aedf..9f65820289c25 100644 --- a/SimTracker/SiPixelDigitizer/plugins/SiPixelDigitizerAlgorithm.h +++ b/SimTracker/SiPixelDigitizer/plugins/SiPixelDigitizerAlgorithm.h @@ -80,12 +80,15 @@ class SiPixelDigitizerAlgorithm { CLHEP::HepRandomEngine*); void calculateInstlumiFactor(PileupMixingContent* puInfo); void init_DynIneffDB(const edm::EventSetup&, const unsigned int&); + std::unique_ptr chooseScenario(PileupMixingContent* puInfo, CLHEP::HepRandomEngine*); // for premixing void calculateInstlumiFactor(const std::vector &ps, int bunchSpacing); // TODO: try to remove the duplication of logic... void setSimAccumulator(const std::map >& signalMap); - - std::unique_ptr chooseScenario(PileupMixingContent* puInfo, CLHEP::HepRandomEngine *); + + std::unique_ptr chooseScenario(const std::vector& ps, + CLHEP::HepRandomEngine* engine); + bool killBadFEDChannels() const; typedef std::unordered_map PixelFEDChannelCollectionMap; const PixelFEDChannelCollectionMap* quality_map;