CMS 3D CMS Logo

CSCChamberMasker.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SimMuon/CSCDigitizer
4 // Class: CSCChamberMasker
5 //
12 //
13 // Original Author: Nick J. Amin
14 // Created: Mon, 27 Feb 2017 15:12:51 GMT
15 //
16 //
17 
18 // system include files
19 #include <algorithm>
20 #include <iostream>
21 #include <map>
22 #include <memory>
23 #include <string>
24 
25 // user include files
30 
34 
37 
39 
42 
45 
56 
59 
60 #include "CLHEP/Random/RandomEngine.h"
63 
64 //
65 // class declaration
66 //
67 
69 public:
70  explicit CSCChamberMasker(const edm::ParameterSet &);
71  ~CSCChamberMasker() override;
72 
74 
75 private:
76  void produce(edm::Event &, const edm::EventSetup &) override;
77 
78  void beginRun(edm::Run const &, edm::EventSetup const &) override;
79 
81 
82  template <typename T, typename C = MuonDigiCollection<CSCDetId, T>>
84  edm::EDGetTokenT<C> &digiToken,
85  CLHEP::HepRandomEngine &randGen,
86  std::unique_ptr<C> &filteredDigis);
87 
88  template <typename T, typename C = MuonDigiCollection<CSCDetId, T>>
89  void copyDigis(edm::Event &event, edm::EDGetTokenT<C> &digiToken, std::unique_ptr<C> &filteredDigis);
90 
91  // ----------member data ---------------------------
92 
97  std::map<CSCDetId, std::pair<unsigned int, float>> m_CSCEffs;
98 };
99 
100 //
101 // constants, enums and typedefs
102 //
103 
104 //
105 // static data member definitions
106 //
107 
108 //
109 // constructors and destructor
110 //
112  : m_stripDigiToken(consumes<CSCStripDigiCollection>(iConfig.getParameter<edm::InputTag>("stripDigiTag"))),
113  m_wireDigiToken(consumes<CSCWireDigiCollection>(iConfig.getParameter<edm::InputTag>("wireDigiTag"))),
114  m_clctDigiToken(consumes<CSCCLCTDigiCollection>(iConfig.getParameter<edm::InputTag>("clctDigiTag"))),
115  m_alctDigiToken(consumes<CSCALCTDigiCollection>(iConfig.getParameter<edm::InputTag>("alctDigiTag"))) {
116  produces<CSCStripDigiCollection>("MuonCSCStripDigi");
117  produces<CSCWireDigiCollection>("MuonCSCWireDigi");
118  produces<CSCCLCTDigiCollection>("MuonCSCCLCTDigi");
119  produces<CSCALCTDigiCollection>("MuonCSCALCTDigi");
120 }
121 
123 
124 //
125 // member functions
126 //
127 
128 // ------------ method called to produce the data ------------
131  CLHEP::HepRandomEngine &randGen = randGenService->getEngine(event.streamID());
132 
133  std::unique_ptr<CSCStripDigiCollection> filteredStripDigis(new CSCStripDigiCollection());
134  std::unique_ptr<CSCWireDigiCollection> filteredWireDigis(new CSCWireDigiCollection());
135  std::unique_ptr<CSCCLCTDigiCollection> filteredCLCTDigis(new CSCCLCTDigiCollection());
136  std::unique_ptr<CSCALCTDigiCollection> filteredALCTDigis(new CSCALCTDigiCollection());
137 
138  // Handle wire and strip digis
139  ageDigis<CSCStripDigi>(event, m_stripDigiToken, randGen, filteredStripDigis);
140  ageDigis<CSCWireDigi>(event, m_wireDigiToken, randGen, filteredWireDigis);
141 
142  // Don't touch CLCT or ALCT digis
143  copyDigis<CSCCLCTDigi>(event, m_clctDigiToken, filteredCLCTDigis);
144  copyDigis<CSCALCTDigi>(event, m_alctDigiToken, filteredALCTDigis);
145 
146  event.put(std::move(filteredStripDigis), "MuonCSCStripDigi");
147  event.put(std::move(filteredWireDigis), "MuonCSCWireDigi");
148  event.put(std::move(filteredCLCTDigis), "MuonCSCCLCTDigi");
149  event.put(std::move(filteredALCTDigis), "MuonCSCALCTDigi");
150 }
151 
152 // ------------ method called to copy digis into aged collection ------------
153 template <typename T, typename C>
154 void CSCChamberMasker::copyDigis(edm::Event &event, edm::EDGetTokenT<C> &digiToken, std::unique_ptr<C> &filteredDigis) {
155  if (!digiToken.isUninitialized()) {
156  edm::Handle<C> digis;
157  event.getByToken(digiToken, digis);
158  for (const auto &j : (*digis)) {
159  auto digiItr = j.second.first;
160  auto last = j.second.second;
161 
162  CSCDetId const cscDetId = j.first;
163 
164  for (; digiItr != last; ++digiItr) {
165  filteredDigis->insertDigi(cscDetId, *digiItr);
166  }
167  }
168  }
169 }
170 
171 // ------------ method aging digis------------
172 template <typename T, typename C>
174  edm::EDGetTokenT<C> &digiToken,
175  CLHEP::HepRandomEngine &randGen,
176  std::unique_ptr<C> &filteredDigis) {
177  if (!digiToken.isUninitialized()) {
178  edm::Handle<C> digis;
179  event.getByToken(digiToken, digis);
180 
181  for (const auto &j : (*digis)) {
182  auto digiItr = j.second.first;
183  auto last = j.second.second;
184 
185  CSCDetId const cscDetId = j.first;
186 
187  // Since lookups are chamber-centric, make new DetId with layer=0
188  CSCDetId chId = CSCDetId(cscDetId.endcap(), cscDetId.station(), cscDetId.ring(), cscDetId.chamber(), 0);
189 
190  for (; digiItr != last; ++digiItr) {
191  auto chEffIt = m_CSCEffs.find(chId);
192 
193  if (chEffIt != m_CSCEffs.end()) {
194  std::pair<unsigned int, float> typeEff = chEffIt->second;
195  int type = typeEff.first % 10; // second digit gives type of inefficiency
196  int layer = typeEff.first / 10; // first digit gives layer (0 = chamber level)
197 
198  bool doRandomize = false;
201  (layer == 0 || cscDetId.layer() == layer))
202  doRandomize = true;
203 
204  if (!doRandomize || (randGen.flat() <= typeEff.second)) {
205  filteredDigis->insertDigi(cscDetId, *digiItr);
206  }
207  }
208  }
209  }
210  }
211 }
212 
213 // ------------ method called when starting to processes a run ------------
215  m_CSCEffs.clear();
216 
218  iSetup.get<MuonGeometryRecord>().get(cscGeom);
219 
221  iSetup.get<MuonSystemAgingRcd>().get(agingObj);
222 
223  const auto chambers = cscGeom->chambers();
224 
225  for (const auto *ch : chambers) {
226  CSCDetId chId = ch->id();
227  unsigned int rawId = chId.rawIdMaker(chId.endcap(), chId.station(), chId.ring(), chId.chamber(), 0);
228  float eff = 1.;
229  int type = 0;
230  for (auto &agingPair : agingObj->m_CSCChambEffs) {
231  if (agingPair.first != rawId)
232  continue;
233 
234  type = agingPair.second.first;
235  eff = agingPair.second.second;
236  m_CSCEffs[chId] = std::make_pair(type, eff);
237  break;
238  }
239  }
240 }
241 
242 // ------------ method fills 'descriptions' with the allowed parameters for the
243 // module ------------
246  desc.add<edm::InputTag>("stripDigiTag", edm::InputTag("simMuonCSCDigis:MuonCSCStripDigi"));
247  desc.add<edm::InputTag>("wireDigiTag", edm::InputTag("simMuonCSCDigis:MuonCSCWireDigi"));
248  desc.add<edm::InputTag>("comparatorDigiTag", edm::InputTag("simMuonCSCDigis:MuonCSCComparatorDigi"));
249  desc.add<edm::InputTag>("rpcDigiTag", edm::InputTag("simMuonCSCDigis:MuonCSCRPCDigi"));
250  desc.add<edm::InputTag>("alctDigiTag", edm::InputTag("simMuonCSCDigis:MuonCSCALCTDigi"));
251  desc.add<edm::InputTag>("clctDigiTag", edm::InputTag("simMuonCSCDigis:MuonCSCCLCTDigi"));
252  descriptions.add("cscChamberMasker", desc);
253 }
254 
255 // define this as a plug-in
int chamber() const
Definition: CSCDetId.h:68
type
Definition: HCALResponse.h:21
void copyDigis(edm::Event &event, edm::EDGetTokenT< C > &digiToken, std::unique_ptr< C > &filteredDigis)
void ageDigis(edm::Event &event, edm::EDGetTokenT< C > &digiToken, CLHEP::HepRandomEngine &randGen, std::unique_ptr< C > &filteredDigis)
edm::EDGetTokenT< CSCWireDigiCollection > m_wireDigiToken
static int rawIdMaker(int iendcap, int istation, int iring, int ichamber, int ilayer)
Definition: CSCDetId.h:144
MuonDigiCollection< CSCDetId, CSCStripDigi > CSCStripDigiCollection
edm::EDGetTokenT< CSCStripDigiCollection > m_stripDigiToken
MuonDigiCollection< CSCDetId, CSCCLCTDigi > CSCCLCTDigiCollection
const ChamberContainer & chambers() const
Return a vector of all chambers.
Definition: CSCGeometry.cc:121
edm::EDGetTokenT< CSCCLCTDigiCollection > m_clctDigiToken
int layer() const
Definition: CSCDetId.h:61
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
void createMaskedChamberCollection(edm::ESHandle< CSCGeometry > &)
int endcap() const
Definition: CSCDetId.h:93
std::map< CSCDetId, std::pair< unsigned int, float > > m_CSCEffs
std::map< unsigned int, std::pair< unsigned int, float > > m_CSCChambEffs
~CSCChamberMasker() override
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void beginRun(edm::Run const &, edm::EventSetup const &) override
ParameterDescriptionBase * add(U const &iLabel, T const &value)
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
void produce(edm::Event &, const edm::EventSetup &) override
edm::EDGetTokenT< CSCALCTDigiCollection > m_alctDigiToken
MuonDigiCollection< CSCDetId, CSCWireDigi > CSCWireDigiCollection
int ring() const
Definition: CSCDetId.h:75
CSCChamberMasker(const edm::ParameterSet &)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
HLT enums.
T get() const
Definition: EventSetup.h:71
StreamID streamID() const
Definition: Event.h:95
bool isUninitialized() const
Definition: EDGetToken.h:70
int station() const
Definition: CSCDetId.h:86
static char chambers[264][20]
Definition: ReadPGInfo.cc:243
static void fillDescriptions(edm::ConfigurationDescriptions &)
MuonDigiCollection< CSCDetId, CSCALCTDigi > CSCALCTDigiCollection
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1
Definition: Run.h:45