CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RPCRecHitValid.cc
Go to the documentation of this file.
3 
6 
19 
20 #include <algorithm>
21 
22 using namespace std;
23 
25 
27 {
28  simHitToken_ = consumes<SimHits>(pset.getParameter<edm::InputTag>("simHit"));
29  recHitToken_ = consumes<RecHits>(pset.getParameter<edm::InputTag>("recHit"));
30  simParticleToken_ = consumes<SimParticles>(pset.getParameter<edm::InputTag>("simTrack"));
31  simHitAssocToken_ = consumes<SimHitAssoc>(pset.getParameter<edm::InputTag>("simHitAssoc"));
32  muonToken_ = consumes<reco::MuonCollection>(pset.getParameter<edm::InputTag>("muon"));
33 
34  subDir_ = pset.getParameter<std::string>("subDir");
35 }
36 
38  edm::Run const & run, edm::EventSetup const & eventSetup)
39 {
40  // Book MonitorElements
41  h_.bookHistograms(booker, subDir_);
42 
43  // SimHit plots, not compatible to RPCPoint-RPCRecHit comparison
44  booker.setCurrentFolder(subDir_+"/HitProperty");
45  h_simParticleType = booker.book1D("SimHitPType", "SimHit particle type", 11, 0, 11);
46  h_simParticleType->getTH1()->SetMinimum(0);
47  if ( TH1* h = h_simParticleType->getTH1() )
48  {
49  h->GetXaxis()->SetBinLabel(1 , "#mu^{-}");
50  h->GetXaxis()->SetBinLabel(2 , "#mu^{+}");
51  h->GetXaxis()->SetBinLabel(3 , "e^{-}" );
52  h->GetXaxis()->SetBinLabel(4 , "e^{+}" );
53  h->GetXaxis()->SetBinLabel(5 , "#pi^{+}");
54  h->GetXaxis()->SetBinLabel(6 , "#pi^{-}");
55  h->GetXaxis()->SetBinLabel(7 , "K^{+}" );
56  h->GetXaxis()->SetBinLabel(8 , "K^{-}" );
57  h->GetXaxis()->SetBinLabel(9 , "p^{+}" );
58  h->GetXaxis()->SetBinLabel(10, "p^{-}" );
59  h->GetXaxis()->SetBinLabel(11, "Other" );
60  }
61 
62  booker.setCurrentFolder(subDir_+"/Track");
63 
64  h_nRPCHitPerSimMuon = booker.book1D("NRPCHitPerSimMuon" , "Number of RPC SimHit per SimMuon", 11, -0.5, 10.5);
65  h_nRPCHitPerSimMuonBarrel = booker.book1D("NRPCHitPerSimMuonBarrel" , "Number of RPC SimHit per SimMuon", 11, -0.5, 10.5);
66  h_nRPCHitPerSimMuonOverlap = booker.book1D("NRPCHitPerSimMuonOverlap", "Number of RPC SimHit per SimMuon", 11, -0.5, 10.5);
67  h_nRPCHitPerSimMuonEndcap = booker.book1D("NRPCHitPerSimMuonEndcap" , "Number of RPC SimHit per SimMuon", 11, -0.5, 10.5);
68 
69  h_nRPCHitPerRecoMuon = booker.book1D("NRPCHitPerRecoMuon" , "Number of RPC RecHit per RecoMuon", 11, -0.5, 10.5);
70  h_nRPCHitPerRecoMuonBarrel = booker.book1D("NRPCHitPerRecoMuonBarrel" , "Number of RPC RecHit per RecoMuon", 11, -0.5, 10.5);
71  h_nRPCHitPerRecoMuonOverlap = booker.book1D("NRPCHitPerRecoMuonOverlap", "Number of RPC RecHit per RecoMuon", 11, -0.5, 10.5);
72  h_nRPCHitPerRecoMuonEndcap = booker.book1D("NRPCHitPerRecoMuonEndcap" , "Number of RPC RecHit per RecoMuon", 11, -0.5, 10.5);
73 
74  h_nRPCHitPerSimMuon ->getTH1()->SetMinimum(0);
75  h_nRPCHitPerSimMuonBarrel ->getTH1()->SetMinimum(0);
76  h_nRPCHitPerSimMuonOverlap ->getTH1()->SetMinimum(0);
77  h_nRPCHitPerSimMuonEndcap ->getTH1()->SetMinimum(0);
78 
79  h_nRPCHitPerRecoMuon ->getTH1()->SetMinimum(0);
80  h_nRPCHitPerRecoMuonBarrel ->getTH1()->SetMinimum(0);
81  h_nRPCHitPerRecoMuonOverlap->getTH1()->SetMinimum(0);
82  h_nRPCHitPerRecoMuonEndcap ->getTH1()->SetMinimum(0);
83 
84  float ptBins[] = {0, 1, 2, 5, 10, 20, 30, 50, 100, 200, 300, 500};
85  const int nPtBins = sizeof(ptBins)/sizeof(float)-1;
86  h_simMuonBarrel_pt = booker.book1D("SimMuonBarrel_pt" , "SimMuon RPCHit in Barrel p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
87  h_simMuonOverlap_pt = booker.book1D("SimMuonOverlap_pt" , "SimMuon RPCHit in Overlap p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
88  h_simMuonEndcap_pt = booker.book1D("SimMuonEndcap_pt" , "SimMuon RPCHit in Endcap p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
89  h_simMuonNoRPC_pt = booker.book1D("SimMuonNoRPC_pt" , "SimMuon without RPCHit p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
90  h_simMuonBarrel_eta = booker.book1D("SimMuonBarrel_eta" , "SimMuon RPCHit in Barrel #eta;#eta", 50, -2.5, 2.5);
91  h_simMuonOverlap_eta = booker.book1D("SimMuonOverlap_eta", "SimMuon RPCHit in Overlap #eta;#eta", 50, -2.5, 2.5);
92  h_simMuonEndcap_eta = booker.book1D("SimMuonEndcap_eta" , "SimMuon RPCHit in Endcap #eta;#eta", 50, -2.5, 2.5);
93  h_simMuonNoRPC_eta = booker.book1D("SimMuonNoRPC_eta", "SimMuon without RPCHit #eta;#eta", 50, -2.5, 2.5);
94  h_simMuonBarrel_phi = booker.book1D("SimMuonBarrel_phi" , "SimMuon RPCHit in Barrel #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
95  h_simMuonOverlap_phi = booker.book1D("SimMuonOverlap_phi", "SimMuon RPCHit in Overlap #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
96  h_simMuonEndcap_phi = booker.book1D("SimMuonEndcap_phi" , "SimMuon RPCHit in Endcap #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
97  h_simMuonNoRPC_phi = booker.book1D("SimMuonNoRPC_phi", "SimMuon without RPCHit #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
98 
99  h_recoMuonBarrel_pt = booker.book1D("RecoMuonBarrel_pt" , "RecoMuon RPCHit in Barrel p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
100  h_recoMuonOverlap_pt = booker.book1D("RecoMuonOverlap_pt" , "RecoMuon RPCHit in Overlap p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
101  h_recoMuonEndcap_pt = booker.book1D("RecoMuonEndcap_pt" , "RecoMuon RPCHit in Endcap p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
102  h_recoMuonNoRPC_pt = booker.book1D("RecoMuonNoRPC_pt" , "RecoMuon without RPCHit p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
103  h_recoMuonBarrel_eta = booker.book1D("RecoMuonBarrel_eta" , "RecoMuon RPCHit in Barrel #eta;#eta", 50, -2.5, 2.5);
104  h_recoMuonOverlap_eta = booker.book1D("RecoMuonOverlap_eta", "RecoMuon RPCHit in Overlap #eta;#eta", 50, -2.5, 2.5);
105  h_recoMuonEndcap_eta = booker.book1D("RecoMuonEndcap_eta" , "RecoMuon RPCHit in Endcap #eta;#eta", 50, -2.5, 2.5);
106  h_recoMuonNoRPC_eta = booker.book1D("RecoMuonNoRPC_eta", "RecoMuon without RPCHit #eta;#eta", 50, -2.5, 2.5);
107  h_recoMuonBarrel_phi = booker.book1D("RecoMuonBarrel_phi" , "RecoMuon RPCHit in Barrel #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
108  h_recoMuonOverlap_phi = booker.book1D("RecoMuonOverlap_phi", "RecoMuon RPCHit in Overlap #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
109  h_recoMuonEndcap_phi = booker.book1D("RecoMuonEndcap_phi" , "RecoMuon RPCHit in Endcap #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
110  h_recoMuonNoRPC_phi = booker.book1D("RecoMuonNoRPC_phi", "RecoMuon without RPCHit #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
111 
112  h_simMuonBarrel_pt ->getTH1()->SetMinimum(0);
113  h_simMuonOverlap_pt ->getTH1()->SetMinimum(0);
114  h_simMuonEndcap_pt ->getTH1()->SetMinimum(0);
115  h_simMuonNoRPC_pt ->getTH1()->SetMinimum(0);
116  h_simMuonBarrel_eta ->getTH1()->SetMinimum(0);
117  h_simMuonOverlap_eta ->getTH1()->SetMinimum(0);
118  h_simMuonEndcap_eta ->getTH1()->SetMinimum(0);
119  h_simMuonNoRPC_eta ->getTH1()->SetMinimum(0);
120  h_simMuonBarrel_phi ->getTH1()->SetMinimum(0);
121  h_simMuonOverlap_phi ->getTH1()->SetMinimum(0);
122  h_simMuonEndcap_phi ->getTH1()->SetMinimum(0);
123  h_simMuonNoRPC_phi ->getTH1()->SetMinimum(0);
124 
125  h_recoMuonBarrel_pt ->getTH1()->SetMinimum(0);
126  h_recoMuonOverlap_pt ->getTH1()->SetMinimum(0);
127  h_recoMuonEndcap_pt ->getTH1()->SetMinimum(0);
128  h_recoMuonNoRPC_pt ->getTH1()->SetMinimum(0);
129  h_recoMuonBarrel_eta ->getTH1()->SetMinimum(0);
130  h_recoMuonOverlap_eta->getTH1()->SetMinimum(0);
131  h_recoMuonEndcap_eta ->getTH1()->SetMinimum(0);
132  h_recoMuonNoRPC_eta ->getTH1()->SetMinimum(0);
133  h_recoMuonBarrel_phi ->getTH1()->SetMinimum(0);
134  h_recoMuonOverlap_phi->getTH1()->SetMinimum(0);
135  h_recoMuonEndcap_phi ->getTH1()->SetMinimum(0);
136  h_recoMuonNoRPC_phi ->getTH1()->SetMinimum(0);
137 
138  booker.setCurrentFolder(subDir_+"/Occupancy");
139 
140  h_eventCount = booker.book1D("EventCount", "Event count", 3, 1, 4);
141  h_eventCount->getTH1()->SetMinimum(0);
142  if ( h_eventCount )
143  {
144  TH1* h = h_eventCount->getTH1();
145  h->GetXaxis()->SetBinLabel(1, "eventBegin");
146  h->GetXaxis()->SetBinLabel(2, "eventEnd");
147  h->GetXaxis()->SetBinLabel(3, "run");
148  }
149  h_eventCount->Fill(3);
150 
151  h_refPunchOccupancyBarrel_wheel = booker.book1D("RefPunchOccupancyBarrel_wheel" , "RefPunchthrough occupancy", 5, -2.5, 2.5);
152  h_refPunchOccupancyEndcap_disk = booker.book1D("RefPunchOccupancyEndcap_disk" , "RefPunchthrough occupancy", 9, -4.5, 4.5);
153  h_refPunchOccupancyBarrel_station = booker.book1D("RefPunchOccupancyBarrel_station", "RefPunchthrough occupancy", 4, 0.5, 4.5);
154  h_recPunchOccupancyBarrel_wheel = booker.book1D("RecPunchOccupancyBarrel_wheel" , "Punchthrough recHit occupancy", 5, -2.5, 2.5);
155  h_recPunchOccupancyEndcap_disk = booker.book1D("RecPunchOccupancyEndcap_disk" , "Punchthrough recHit occupancy", 9, -4.5, 4.5);
156  h_recPunchOccupancyBarrel_station = booker.book1D("RecPunchOccupancyBarrel_station", "Punchthrough recHit occupancy", 4, 0.5, 4.5);
157 
158  h_refPunchOccupancyBarrel_wheel ->getTH1()->SetMinimum(0);
159  h_refPunchOccupancyEndcap_disk ->getTH1()->SetMinimum(0);
160  h_refPunchOccupancyBarrel_station ->getTH1()->SetMinimum(0);
161  h_recPunchOccupancyBarrel_wheel ->getTH1()->SetMinimum(0);
162  h_recPunchOccupancyEndcap_disk ->getTH1()->SetMinimum(0);
163  h_recPunchOccupancyBarrel_station ->getTH1()->SetMinimum(0);
164 
165  h_refPunchOccupancyBarrel_wheel_station = booker.book2D("RefPunchOccupancyBarrel_wheel_station", "RefPunchthrough occupancy", 5, -2.5, 2.5, 4, 0.5, 4.5);
166  h_refPunchOccupancyEndcap_disk_ring = booker.book2D("RefPunchOccupancyEndcap_disk_ring" , "RefPunchthrough occupancy", 9, -4.5, 4.5, 4, 0.5, 4.5);
167  h_recPunchOccupancyBarrel_wheel_station = booker.book2D("RecPunchOccupancyBarrel_wheel_station", "Punchthrough recHit occupancy", 5, -2.5, 2.5, 4, 0.5, 4.5);
168  h_recPunchOccupancyEndcap_disk_ring = booker.book2D("RecPunchOccupancyEndcap_disk_ring" , "Punchthrough recHit occupancy", 9, -4.5, 4.5, 4, 0.5, 4.5);
169 
170  h_refPunchOccupancyBarrel_wheel_station->getTH2F()->SetOption("COLZ");
171  h_refPunchOccupancyEndcap_disk_ring ->getTH2F()->SetOption("COLZ");
172  h_recPunchOccupancyBarrel_wheel_station->getTH2F()->SetOption("COLZ");
173  h_recPunchOccupancyEndcap_disk_ring ->getTH2F()->SetOption("COLZ");
174 
175  h_refPunchOccupancyBarrel_wheel_station->getTH2F()->SetContour(10);
176  h_refPunchOccupancyEndcap_disk_ring ->getTH2F()->SetContour(10);
177  h_recPunchOccupancyBarrel_wheel_station->getTH2F()->SetContour(10);
178  h_recPunchOccupancyEndcap_disk_ring ->getTH2F()->SetContour(10);
179 
180  h_refPunchOccupancyBarrel_wheel_station->getTH2F()->SetStats(0);
181  h_refPunchOccupancyEndcap_disk_ring ->getTH2F()->SetStats(0);
182  h_recPunchOccupancyBarrel_wheel_station->getTH2F()->SetStats(0);
183  h_recPunchOccupancyEndcap_disk_ring ->getTH2F()->SetStats(0);
184 
185  h_refPunchOccupancyBarrel_wheel_station->getTH2F()->SetMinimum(0);
186  h_refPunchOccupancyEndcap_disk_ring ->getTH2F()->SetMinimum(0);
187  h_recPunchOccupancyBarrel_wheel_station->getTH2F()->SetMinimum(0);
188  h_recPunchOccupancyEndcap_disk_ring ->getTH2F()->SetMinimum(0);
189 
190  for ( int i=1; i<=5; ++i )
191  {
192  TString binLabel = Form("Wheel %d", i-3);
193  h_refPunchOccupancyBarrel_wheel->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
194  h_refPunchOccupancyBarrel_wheel_station->getTH2F()->GetXaxis()->SetBinLabel(i, binLabel);
195  h_recPunchOccupancyBarrel_wheel->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
196  h_recPunchOccupancyBarrel_wheel_station->getTH2F()->GetXaxis()->SetBinLabel(i, binLabel);
197  }
198 
199  for ( int i=1; i<=9; ++i )
200  {
201  TString binLabel = Form("Disk %d", i-5);
202  h_refPunchOccupancyEndcap_disk ->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
203  h_refPunchOccupancyEndcap_disk_ring ->getTH2F()->GetXaxis()->SetBinLabel(i, binLabel);
204  h_recPunchOccupancyEndcap_disk ->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
205  h_recPunchOccupancyEndcap_disk_ring ->getTH2F()->GetXaxis()->SetBinLabel(i, binLabel);
206  }
207 
208  for ( int i=1; i<=4; ++i )
209  {
210  TString binLabel = Form("Station %d", i);
211  h_refPunchOccupancyBarrel_station ->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
212  h_refPunchOccupancyBarrel_wheel_station ->getTH2F()->GetYaxis()->SetBinLabel(i, binLabel);
213  h_recPunchOccupancyBarrel_station ->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
214  h_recPunchOccupancyBarrel_wheel_station ->getTH2F()->GetYaxis()->SetBinLabel(i, binLabel);
215  }
216 
217  for ( int i=1; i<=4; ++i )
218  {
219  TString binLabel = Form("Ring %d", i);
220  h_refPunchOccupancyEndcap_disk_ring ->getTH2F()->GetYaxis()->SetBinLabel(i, binLabel);
221  h_recPunchOccupancyEndcap_disk_ring ->getTH2F()->GetYaxis()->SetBinLabel(i, binLabel);
222  }
223 
224  // Book roll-by-roll histograms
226  eventSetup.get<MuonGeometryRecord>().get(rpcGeom);
227 
228  int nRPCRollBarrel = 0, nRPCRollEndcap = 0;
229 
230  TrackingGeometry::DetContainer rpcDets = rpcGeom->dets();
231  for ( auto det : rpcDets )
232  {
233  auto rpcCh = dynamic_cast<const RPCChamber*>(det);
234  if ( !rpcCh ) continue;
235 
236  std::vector<const RPCRoll*> rolls = rpcCh->rolls();
237  for ( auto roll : rolls )
238  {
239  if ( !roll ) continue;
240 
241  //RPCGeomServ rpcSrv(roll->id());
242  const int rawId = roll->geographicalId().rawId();
243  //if ( !roll->specs()->isRPC() ) { cout << "\nNoRPC : " << rpcSrv.name() << ' ' << rawId << endl; continue; }
244 
245  if ( roll->isBarrel() )
246  {
247  detIdToIndexMapBarrel_[rawId] = nRPCRollBarrel;
248  //rollIdToNameMapBarrel_[rawId] = rpcSrv.name();
249  ++nRPCRollBarrel;
250  }
251  else
252  {
253  detIdToIndexMapEndcap_[rawId] = nRPCRollEndcap;
254  //rollIdToNameMapEndcap_[rawId] = rpcSrv.name();
255  ++nRPCRollEndcap;
256  }
257  }
258  }
259 
260  booker.setCurrentFolder(subDir_+"/Occupancy");
261  h_matchOccupancyBarrel_detId = booker.book1D("MatchOccupancyBarrel_detId", "Matched hit occupancy;roll index (can be arbitrary)", nRPCRollBarrel, 0, nRPCRollBarrel);
262  h_matchOccupancyEndcap_detId = booker.book1D("MatchOccupancyEndcap_detId", "Matched hit occupancy;roll index (can be arbitrary)", nRPCRollEndcap, 0, nRPCRollEndcap);
263  h_refOccupancyBarrel_detId = booker.book1D("RefOccupancyBarrel_detId", "Reference hit occupancy;roll index (can be arbitrary)", nRPCRollBarrel, 0, nRPCRollBarrel);
264  h_refOccupancyEndcap_detId = booker.book1D("RefOccupancyEndcap_detId", "Reference hit occupancy;roll index (can be arbitrary)", nRPCRollEndcap, 0, nRPCRollEndcap);
265  h_noiseOccupancyBarrel_detId = booker.book1D("NoiseOccupancyBarrel_detId", "Noise occupancy;roll index (can be arbitrary)", nRPCRollBarrel, 0, nRPCRollBarrel);
266  h_noiseOccupancyEndcap_detId = booker.book1D("NoiseOccupancyEndcap_detId", "Noise occupancy;roll index (can be arbitrary)", nRPCRollEndcap, 0, nRPCRollEndcap);
267 
268  h_matchOccupancyBarrel_detId->getTH1()->SetMinimum(0);
269  h_matchOccupancyEndcap_detId->getTH1()->SetMinimum(0);
270  h_refOccupancyBarrel_detId ->getTH1()->SetMinimum(0);
271  h_refOccupancyEndcap_detId ->getTH1()->SetMinimum(0);
272  h_noiseOccupancyBarrel_detId->getTH1()->SetMinimum(0);
273  h_noiseOccupancyEndcap_detId->getTH1()->SetMinimum(0);
274 
275  h_rollAreaBarrel_detId = booker.bookProfile("RollAreaBarrel_detId", "Roll area;roll index;Area", nRPCRollBarrel, 0., 1.*nRPCRollBarrel, 0., 1e5);
276  h_rollAreaEndcap_detId = booker.bookProfile("RollAreaEndcap_detId", "Roll area;roll index;Area", nRPCRollEndcap, 0., 1.*nRPCRollEndcap, 0., 1e5);
277 
278  for ( auto detIdToIndex : detIdToIndexMapBarrel_ )
279  {
280  const int rawId = detIdToIndex.first;
281  const int index = detIdToIndex.second;
282 
283  const RPCDetId rpcDetId = static_cast<const RPCDetId>(rawId);
284  const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(rpcDetId));
285 
286  //RPCGeomServ rpcSrv(roll->id());
287  //if ( !roll->specs()->isRPC() ) { cout << "\nNoRPC : " << rpcSrv.name() << ' ' << rawId << endl; continue; }
288 
289  const StripTopology& topol = roll->specificTopology();
290  const double area = topol.stripLength()*topol.nstrips()*topol.pitch();
291 
292  h_rollAreaBarrel_detId->Fill(index, area);
293  }
294 
295  for ( auto detIdToIndex : detIdToIndexMapEndcap_ )
296  {
297  const int rawId = detIdToIndex.first;
298  const int index = detIdToIndex.second;
299 
300  const RPCDetId rpcDetId = static_cast<const RPCDetId>(rawId);
301  const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(rpcDetId));
302 
303  //RPCGeomServ rpcSrv(roll->id());
304  //if ( !roll->specs()->isRPC() ) { cout << "\nNoRPC : " << rpcSrv.name() << ' ' << rawId << endl; continue; }
305 
306  const StripTopology& topol = roll->specificTopology();
307  const double area = topol.stripLength()*topol.nstrips()*topol.pitch();
308 
309  h_rollAreaEndcap_detId->Fill(index, area);
310  }
311 
312 }
313 
315 {
316  h_eventCount->Fill(1);
317 
318  // Get the RPC Geometry
320  eventSetup.get<MuonGeometryRecord>().get(rpcGeom);
321 
322  // Retrieve SimHits from the event
324  if ( !event.getByToken(simHitToken_, simHitHandle) )
325  {
326  edm::LogInfo("RPCRecHitValid") << "Cannot find simHit collection\n";
327  return;
328  }
329 
330  // Retrieve RecHits from the event
332  if ( !event.getByToken(recHitToken_, recHitHandle) )
333  {
334  edm::LogInfo("RPCRecHitValid") << "Cannot find recHit collection\n";
335  return;
336  }
337 
338  // Get SimParticles
339  edm::Handle<TrackingParticleCollection> simParticleHandle;
340  if ( !event.getByToken(simParticleToken_, simParticleHandle) )
341  {
342  edm::LogInfo("RPCRecHitValid") << "Cannot find TrackingParticle collection\n";
343  return;
344  }
345 
346  // Get SimParticle to SimHit association map
348  if ( !event.getByToken(simHitAssocToken_, simHitsTPAssoc) )
349  {
350  edm::LogInfo("RPCRecHitValid") << "Cannot find TrackingParticle to SimHit association map\n";
351  return;
352  }
353 
354  // Get RecoMuons
356  if ( !event.getByToken(muonToken_, muonHandle) )
357  {
358  edm::LogInfo("RPCRecHitValid") << "Cannot find muon collection\n";
359  return;
360  }
361 
362  typedef edm::PSimHitContainer::const_iterator SimHitIter;
363  typedef RPCRecHitCollection::const_iterator RecHitIter;
364  typedef std::vector<TrackPSimHitRef> SimHitRefs;
365 
366  // TrackingParticles with (and without) RPC simHits
367  SimHitRefs muonSimHits, pthrSimHits;
368 
369  for ( int i=0, n=simParticleHandle->size(); i<n; ++i )
370  {
371  TrackingParticleRef simParticle(simParticleHandle, i);
372  if ( simParticle->pt() < 1.0 or simParticle->p() < 2.5 ) continue; // globalMuon acceptance
373 
374  // Collect SimHits from this Tracking Particle
375  SimHitRefs simHitsFromParticle;
376  auto range = std::equal_range(simHitsTPAssoc->begin(), simHitsTPAssoc->end(),
377  std::make_pair(simParticle, TrackPSimHitRef()),
379  for ( auto simParticleToHit = range.first; simParticleToHit != range.second; ++simParticleToHit )
380  {
381  auto simHit = simParticleToHit->second;
382  const DetId detId(simHit->detUnitId());
383  if ( detId.det() != DetId::Muon or detId.subdetId() != MuonSubdetId::RPC ) continue;
384 
385  simHitsFromParticle.push_back(simParticleToHit->second);
386  }
387  const int nRPCHit = simHitsFromParticle.size();
388  const bool hasRPCHit = nRPCHit > 0;
389 
390  if ( abs(simParticle->pdgId()) == 13 )
391  {
392  muonSimHits.insert(muonSimHits.end(), simHitsFromParticle.begin(), simHitsFromParticle.end());
393 
394  // Count number of Barrel hits and Endcap hits
395  int nRPCHitBarrel = 0;
396  int nRPCHitEndcap = 0;
397  for ( auto simHit : simHitsFromParticle )
398  {
399  const RPCDetId rpcDetId = static_cast<const RPCDetId>(simHit->detUnitId());
400  const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(rpcDetId));
401  if ( !roll ) continue;
402 
403  if ( rpcDetId.region() == 0 ) ++nRPCHitBarrel;
404  else ++nRPCHitEndcap;
405  }
406 
407  // Fill TrackingParticle related histograms
408  h_nRPCHitPerSimMuon->Fill(nRPCHit);
409  if ( nRPCHitBarrel and nRPCHitEndcap )
410  {
411  h_nRPCHitPerSimMuonOverlap->Fill(nRPCHit);
412  h_simMuonOverlap_pt->Fill(simParticle->pt());
413  h_simMuonOverlap_eta->Fill(simParticle->eta());
414  h_simMuonOverlap_phi->Fill(simParticle->phi());
415  }
416  else if ( nRPCHitBarrel )
417  {
418  h_nRPCHitPerSimMuonBarrel->Fill(nRPCHit);
419  h_simMuonBarrel_pt->Fill(simParticle->pt());
420  h_simMuonBarrel_eta->Fill(simParticle->eta());
421  h_simMuonBarrel_phi->Fill(simParticle->phi());
422  }
423  else if ( nRPCHitEndcap )
424  {
425  h_nRPCHitPerSimMuonEndcap->Fill(nRPCHit);
426  h_simMuonEndcap_pt->Fill(simParticle->pt());
427  h_simMuonEndcap_eta->Fill(simParticle->eta());
428  h_simMuonEndcap_phi->Fill(simParticle->phi());
429  }
430  else
431  {
432  h_simMuonNoRPC_pt->Fill(simParticle->pt());
433  h_simMuonNoRPC_eta->Fill(simParticle->eta());
434  h_simMuonNoRPC_phi->Fill(simParticle->phi());
435  }
436  }
437  else
438  {
439  pthrSimHits.insert(pthrSimHits.end(), simHitsFromParticle.begin(), simHitsFromParticle.end());
440  }
441 
442  if ( hasRPCHit )
443  {
444  switch ( simParticle->pdgId() )
445  {
446  case 13: h_simParticleType->Fill( 0); break;
447  case -13: h_simParticleType->Fill( 1); break;
448  case 11: h_simParticleType->Fill( 2); break;
449  case -11: h_simParticleType->Fill( 3); break;
450  case 211: h_simParticleType->Fill( 4); break;
451  case -211: h_simParticleType->Fill( 5); break;
452  case 321: h_simParticleType->Fill( 6); break;
453  case -321: h_simParticleType->Fill( 7); break;
454  case 2212: h_simParticleType->Fill( 8); break;
455  case -2212: h_simParticleType->Fill( 9); break;
456  default: h_simParticleType->Fill(10); break;
457  }
458  }
459  }
460 
461  // Loop over muon simHits, fill histograms which does not need associations
462  int nRefHitBarrel = 0, nRefHitEndcap = 0;
463  for ( auto simHit : muonSimHits )
464  {
465  const RPCDetId detId = static_cast<const RPCDetId>(simHit->detUnitId());
466  const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(detId));
467 
468  const int region = roll->id().region();
469  const int ring = roll->id().ring();
470  //const int sector = roll->id().sector();
471  const int station = roll->id().station();
472  //const int layer = roll->id().layer();
473  //const int subSector = roll->id().subsector();
474 
475  if ( region == 0 )
476  {
477  ++nRefHitBarrel;
478  h_.refHitOccupancyBarrel_wheel->Fill(ring);
479  h_.refHitOccupancyBarrel_station->Fill(station);
480  h_.refHitOccupancyBarrel_wheel_station->Fill(ring, station);
481 
482  h_refOccupancyBarrel_detId->Fill(detIdToIndexMapBarrel_[simHit->detUnitId()]);
483  }
484  else
485  {
486  ++nRefHitEndcap;
487  h_.refHitOccupancyEndcap_disk->Fill(region*station);
488  h_.refHitOccupancyEndcap_disk_ring->Fill(region*station, ring);
489 
490  h_refOccupancyEndcap_detId->Fill(detIdToIndexMapEndcap_[simHit->detUnitId()]);
491  }
492  }
493 
494  // Loop over punch-through simHits, fill histograms which does not need associations
495  for ( auto simHit : pthrSimHits )
496  {
497  const RPCDetId detId = static_cast<const RPCDetId>(simHit->detUnitId());
498  const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(detId()));
499 
500  const int region = roll->id().region();
501  const int ring = roll->id().ring();
502  //const int sector = roll->id().sector();
503  const int station = roll->id().station();
504  //const int layer = roll->id().layer();
505  //const int subSector = roll->id().subsector();
506 
507  if ( region == 0 )
508  {
509  ++nRefHitBarrel;
510  h_refPunchOccupancyBarrel_wheel->Fill(ring);
511  h_refPunchOccupancyBarrel_station->Fill(station);
512  h_refPunchOccupancyBarrel_wheel_station->Fill(ring, station);
513 
514  h_refOccupancyBarrel_detId->Fill(detIdToIndexMapBarrel_[simHit->detUnitId()]);
515  }
516  else
517  {
518  ++nRefHitEndcap;
519  h_refPunchOccupancyEndcap_disk->Fill(region*station);
520  h_refPunchOccupancyEndcap_disk_ring->Fill(region*station, ring);
521 
522  h_refOccupancyEndcap_detId->Fill(detIdToIndexMapEndcap_[simHit->detUnitId()]);
523  }
524  }
525  h_.nRefHitBarrel->Fill(nRefHitBarrel);
526  h_.nRefHitEndcap->Fill(nRefHitEndcap);
527 
528  // Loop over recHits, fill histograms which does not need associations
529  int sumClusterSizeBarrel = 0, sumClusterSizeEndcap = 0;
530  int nRecHitBarrel = 0, nRecHitEndcap = 0;
531  for ( RecHitIter recHitIter = recHitHandle->begin();
532  recHitIter != recHitHandle->end(); ++recHitIter )
533  {
534  const RPCDetId detId = static_cast<const RPCDetId>(recHitIter->rpcId());
535  const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(detId()));
536  if ( !roll ) continue;
537 
538  const int region = roll->id().region();
539  const int ring = roll->id().ring();
540  //const int sector = roll->id().sector();
541  const int station = roll->id().station();
542  //const int layer = roll->id().layer();
543  //const int subSector = roll->id().subsector();
544 
545  h_.clusterSize->Fill(recHitIter->clusterSize());
546 
547  if ( region == 0 )
548  {
549  ++nRecHitBarrel;
550  sumClusterSizeBarrel += recHitIter->clusterSize();
551  h_.clusterSizeBarrel->Fill(recHitIter->clusterSize());
552  h_.recHitOccupancyBarrel_wheel->Fill(ring);
553  h_.recHitOccupancyBarrel_station->Fill(station);
554  h_.recHitOccupancyBarrel_wheel_station->Fill(ring, station);
555  }
556  else
557  {
558  ++nRecHitEndcap;
559  sumClusterSizeEndcap += recHitIter->clusterSize();
560  h_.clusterSizeEndcap->Fill(recHitIter->clusterSize());
561  h_.recHitOccupancyEndcap_disk->Fill(region*station);
562  h_.recHitOccupancyEndcap_disk_ring->Fill(region*station, ring);
563  }
564 
565  }
566  const double nRecHit = nRecHitBarrel+nRecHitEndcap;
567  h_.nRecHitBarrel->Fill(nRecHitBarrel);
568  h_.nRecHitEndcap->Fill(nRecHitEndcap);
569  if ( nRecHit > 0 )
570  {
571  const int sumClusterSize = sumClusterSizeBarrel+sumClusterSizeEndcap;
572  h_.avgClusterSize->Fill(double(sumClusterSize)/nRecHit);
573 
574  if ( nRecHitBarrel > 0 )
575  {
576  h_.avgClusterSizeBarrel->Fill(double(sumClusterSizeBarrel)/nRecHitBarrel);
577  }
578  if ( nRecHitEndcap > 0 )
579  {
580  h_.avgClusterSizeEndcap->Fill(double(sumClusterSizeEndcap)/nRecHitEndcap);
581  }
582  }
583 
584  // Start matching SimHits to RecHits
585  typedef std::map<TrackPSimHitRef, RecHitIter> SimToRecHitMap;
586  SimToRecHitMap simToRecHitMap;
587 
588  for ( auto simHit : muonSimHits )
589  {
590  const RPCDetId simDetId = static_cast<const RPCDetId>(simHit->detUnitId());
591  //const RPCRoll* simRoll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(simDetId));
592 
593  const double simX = simHit->localPosition().x();
594 
595  for ( RecHitIter recHitIter = recHitHandle->begin();
596  recHitIter != recHitHandle->end(); ++recHitIter )
597  {
598  const RPCDetId recDetId = static_cast<const RPCDetId>(recHitIter->rpcId());
599  const RPCRoll* recRoll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(recDetId));
600  if ( !recRoll ) continue;
601 
602  if ( simDetId != recDetId ) continue;
603 
604  const double recX = recHitIter->localPosition().x();
605  const double newDx = fabs(recX - simX);
606 
607  // Associate SimHit to RecHit
608  SimToRecHitMap::const_iterator prevSimToReco = simToRecHitMap.find(simHit);
609  if ( prevSimToReco == simToRecHitMap.end() )
610  {
611  simToRecHitMap.insert(std::make_pair(simHit, recHitIter));
612  }
613  else
614  {
615  const double oldDx = fabs(prevSimToReco->second->localPosition().x() - simX);
616 
617  if ( newDx < oldDx )
618  {
619  simToRecHitMap[simHit] = recHitIter;
620  }
621  }
622  }
623  }
624 
625  // Now we have simHit-recHit mapping
626  // So we can fill up relavant histograms
627  int nMatchHitBarrel = 0, nMatchHitEndcap = 0;
628  for ( auto match : simToRecHitMap )
629  {
630  TrackPSimHitRef simHit = match.first;
631  RecHitIter recHitIter = match.second;
632 
633  const RPCDetId detId = static_cast<const RPCDetId>(simHit->detUnitId());
634  const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(detId));
635 
636  const int region = roll->id().region();
637  const int ring = roll->id().ring();
638  //const int sector = roll->id().sector();
639  const int station = roll->id().station();
640  //const int layer = roll->id().layer();
641  //const int subsector = roll->id().subsector();
642 
643  const double simX = simHit->localPosition().x();
644  const double recX = recHitIter->localPosition().x();
645  const double errX = sqrt(recHitIter->localPositionError().xx());
646  const double dX = recX - simX;
647  const double pull = errX == 0 ? -999 : dX/errX;
648 
649  //const GlobalPoint simPos = roll->toGlobal(simHitIter->localPosition());
650  //const GlobalPoint recPos = roll->toGlobal(recHitIter->localPosition());
651 
652  if ( region == 0 )
653  {
654  ++nMatchHitBarrel;
655  h_.resBarrel->Fill(dX);
656  h_.pullBarrel->Fill(pull);
657  h_.matchOccupancyBarrel_wheel->Fill(ring);
658  h_.matchOccupancyBarrel_station->Fill(station);
659  h_.matchOccupancyBarrel_wheel_station->Fill(ring, station);
660 
661  h_.res_wheel_res->Fill(ring, dX);
662  h_.res_station_res->Fill(station, dX);
663  h_.pull_wheel_pull->Fill(ring, pull);
664  h_.pull_station_pull->Fill(station, pull);
665 
666  h_matchOccupancyBarrel_detId->Fill(detIdToIndexMapBarrel_[detId.rawId()]);
667  }
668  else
669  {
670  ++nMatchHitEndcap;
671  h_.resEndcap->Fill(dX);
672  h_.pullEndcap->Fill(pull);
673  h_.matchOccupancyEndcap_disk->Fill(region*station);
674  h_.matchOccupancyEndcap_disk_ring->Fill(region*station, ring);
675 
676  h_.res_disk_res->Fill(region*station, dX);
677  h_.res_ring_res->Fill(ring, dX);
678  h_.pull_disk_pull->Fill(region*station, pull);
679  h_.pull_ring_pull->Fill(ring, pull);
680 
681  h_matchOccupancyEndcap_detId->Fill(detIdToIndexMapEndcap_[detId.rawId()]);
682  }
683 
684  }
685  h_.nMatchHitBarrel->Fill(nMatchHitBarrel);
686  h_.nMatchHitEndcap->Fill(nMatchHitEndcap);
687 
688  // Reco Muon hits
689  for ( reco::MuonCollection::const_iterator muon = muonHandle->begin();
690  muon != muonHandle->end(); ++muon )
691  {
692  if ( !muon->isGlobalMuon() ) continue;
693 
694  int nRPCHitBarrel = 0;
695  int nRPCHitEndcap = 0;
696 
697  const reco::TrackRef glbTrack = muon->globalTrack();
698  for ( trackingRecHit_iterator recHit = glbTrack->recHitsBegin();
699  recHit != glbTrack->recHitsEnd(); ++recHit )
700  {
701  if ( !(*recHit)->isValid() ) continue;
702  const DetId detId = (*recHit)->geographicalId();
703  if ( detId.det() != DetId::Muon or detId.subdetId() != MuonSubdetId::RPC ) continue;
704  const RPCDetId rpcDetId = static_cast<const RPCDetId>(detId);
705 
706  if ( rpcDetId.region() == 0 ) ++nRPCHitBarrel;
707  else ++nRPCHitEndcap;
708  }
709 
710  const int nRPCHit = nRPCHitBarrel + nRPCHitEndcap;
711  h_nRPCHitPerRecoMuon->Fill(nRPCHit);
712  if ( nRPCHitBarrel and nRPCHitEndcap )
713  {
714  h_nRPCHitPerRecoMuonOverlap->Fill(nRPCHit);
715  h_recoMuonOverlap_pt->Fill(muon->pt());
716  h_recoMuonOverlap_eta->Fill(muon->eta());
717  h_recoMuonOverlap_phi->Fill(muon->phi());
718  }
719  else if ( nRPCHitBarrel )
720  {
721  h_nRPCHitPerRecoMuonBarrel->Fill(nRPCHit);
722  h_recoMuonBarrel_pt->Fill(muon->pt());
723  h_recoMuonBarrel_eta->Fill(muon->eta());
724  h_recoMuonBarrel_phi->Fill(muon->phi());
725  }
726  else if ( nRPCHitEndcap )
727  {
728  h_nRPCHitPerRecoMuonEndcap->Fill(nRPCHit);
729  h_recoMuonEndcap_pt->Fill(muon->pt());
730  h_recoMuonEndcap_eta->Fill(muon->eta());
731  h_recoMuonEndcap_phi->Fill(muon->phi());
732  }
733  else
734  {
735  h_recoMuonNoRPC_pt->Fill(muon->pt());
736  h_recoMuonNoRPC_eta->Fill(muon->eta());
737  h_recoMuonNoRPC_phi->Fill(muon->phi());
738  }
739  }
740 
741  // Find Non-muon hits
742  for ( RecHitIter recHitIter = recHitHandle->begin();
743  recHitIter != recHitHandle->end(); ++recHitIter )
744  {
745  const RPCDetId detId = static_cast<const RPCDetId>(recHitIter->rpcId());
746  const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(detId));
747 
748  const int region = roll->id().region();
749  const int ring = roll->id().ring();
750  //const int sector = roll->id().sector();
751  const int station = roll->id().station();
752  //const int layer = roll->id().layer();
753  //const int subsector = roll->id().subsector();
754 
755  bool matched = false;
756  for ( auto match : simToRecHitMap )
757  {
758  if ( recHitIter == match.second )
759  {
760  matched = true;
761  break;
762  }
763  }
764 
765  if ( !matched )
766  {
767  // FIXME : kept for backward compatibility //
768  if ( region == 0 )
769  {
770  h_.umOccupancyBarrel_wheel->Fill(ring);
771  h_.umOccupancyBarrel_station->Fill(station);
772  h_.umOccupancyBarrel_wheel_station->Fill(ring, station);
773  }
774  else
775  {
776  h_.umOccupancyEndcap_disk->Fill(region*station);
777  h_.umOccupancyEndcap_disk_ring->Fill(region*station, ring);
778  }
779  // End of FIXME //
780 
781  int nPunchMatched = 0;
782  // Check if this recHit came from non-muon simHit
783  for ( auto simHit : pthrSimHits )
784  {
785  const int absSimHitPType = abs(simHit->particleType());
786  if ( absSimHitPType == 13 ) continue;
787 
788  const RPCDetId simDetId = static_cast<const RPCDetId>(simHit->detUnitId());
789  if ( simDetId == detId ) ++nPunchMatched;
790  }
791 
792  if ( nPunchMatched > 0 )
793  {
794  if ( region == 0 )
795  {
796  h_recPunchOccupancyBarrel_wheel->Fill(ring);
797  h_recPunchOccupancyBarrel_station->Fill(station);
798  h_recPunchOccupancyBarrel_wheel_station->Fill(ring, station);
799  }
800  else
801  {
802  h_recPunchOccupancyEndcap_disk->Fill(region*station);
803  h_recPunchOccupancyEndcap_disk_ring->Fill(region*station, ring);
804  }
805  }
806  }
807  }
808 
809  // Find noise recHits : RecHits without SimHit match
810  for ( RecHitIter recHitIter = recHitHandle->begin();
811  recHitIter != recHitHandle->end(); ++recHitIter )
812  {
813  const RPCDetId recDetId = static_cast<const RPCDetId>(recHitIter->rpcId());
814  const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(recDetId));
815 
816  const int region = roll->id().region();
817  // const int ring = roll->id().ring(); // UNUSED VARIABLE
818  //const int sector = roll->id().sector();
819  // const int station = roll->id().station(); // UNUSED VARIABLE
820  //const int layer = roll->id().layer();
821  //const int subsector = roll->id().subsector();
822 
823  const double recX = recHitIter->localPosition().x();
824  const double recErrX = sqrt(recHitIter->localPositionError().xx());
825 
826  bool matched = false;
827  for ( SimHitIter simHitIter = simHitHandle->begin();
828  simHitIter != simHitHandle->end(); ++simHitIter )
829  {
830  const RPCDetId simDetId = static_cast<const RPCDetId>(simHitIter->detUnitId());
831  const RPCRoll* simRoll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(simDetId));
832  if ( !simRoll ) continue;
833 
834  if ( simDetId != recDetId ) continue;
835 
836  const double simX = simHitIter->localPosition().x();
837  const double dX = fabs(recX-simX);
838 
839  if ( dX/recErrX < 5 )
840  {
841  matched = true;
842  break;
843  }
844  }
845 
846  if ( !matched )
847  {
848  if ( region == 0 )
849  {
850  h_noiseOccupancyBarrel_detId->Fill(detIdToIndexMapBarrel_[recDetId.rawId()]);
851  }
852  else
853  {
854  h_noiseOccupancyEndcap_detId->Fill(detIdToIndexMapEndcap_[recDetId.rawId()]);
855  }
856  }
857  }
858 
859  h_eventCount->Fill(2);
860 
861 }
862 
864 
const double Pi
T getParameter(std::string const &) const
virtual int nstrips() const =0
int i
Definition: DBlmapReader.cc:9
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
RPCRecHitValid(const edm::ParameterSet &pset)
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
static bool simHitTPAssociationListGreater(SimHitTPPair i, SimHitTPPair j)
MonitorElement * bookProfile(Args &&...args)
Definition: DQMStore.h:157
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:462
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
const StripTopology & specificTopology() const
Definition: RPCRoll.cc:107
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
virtual float stripLength() const =0
RPCDetId id() const
Definition: RPCRoll.cc:24
MonitorElement * MEP
int ring() const
Definition: RPCDetId.h:72
T sqrt(T t)
Definition: SSEVec.h:18
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
const std::vector< const RPCRoll * > & rolls() const
Return the Rolls.
Definition: RPCChamber.cc:68
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
TH1 * getTH1(void) 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
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
Definition: DetId.h:18
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:273
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:133
const T & get() const
Definition: EventSetup.h:56
static const int RPC
Definition: MuonSubdetId.h:14
virtual float pitch() const =0
void analyze(const edm::Event &event, const edm::EventSetup &eventSetup)
edm::Ref< edm::PSimHitContainer > TrackPSimHitRef
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
TH2F * getTH2F(void) const
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
std::vector< GeomDet const * > DetContainer
TrackingRecHitCollection::base::const_iterator trackingRecHit_iterator
iterator over a vector of reference to TrackingRecHit in the same collection
Definition: Run.h:43
int region() const
Region id: 0 for Barrel, +/-1 For +/- Endcap.
Definition: RPCDetId.h:63
int station() const
Definition: RPCDetId.h:96