CMS 3D CMS Logo

CSCValidation.cc
Go to the documentation of this file.
1 /*
2  * validation package for CSC DIGIs, RECHITs and SEGMENTs + more.
3  *
4  * Michael Schmitt
5  * Andy Kubik
6  * Northwestern University
7  */
9 
10 using namespace std;
11 using namespace edm;
12 
13 
15 // CONSTRUCTOR //
18 
19  // Get the various input parameters
20  rootFileName = pset.getUntrackedParameter<std::string>("rootFileName","valHists.root");
21  isSimulation = pset.getUntrackedParameter<bool>("isSimulation",false);
22  writeTreeToFile = pset.getUntrackedParameter<bool>("writeTreeToFile",true);
23  detailedAnalysis = pset.getUntrackedParameter<bool>("detailedAnalysis",false);
24  useDigis = pset.getUntrackedParameter<bool>("useDigis",true);
25 
26  // event quality filter
27  useQualityFilter = pset.getUntrackedParameter<bool>("useQualityFilter",false);
28  pMin = pset.getUntrackedParameter<double>("pMin",4.);
29  chisqMax = pset.getUntrackedParameter<double>("chisqMax",20.);
30  nCSCHitsMin = pset.getUntrackedParameter<int>("nCSCHitsMin",10);
31  nCSCHitsMax = pset.getUntrackedParameter<int>("nCSCHitsMax",25);
32  lengthMin = pset.getUntrackedParameter<double>("lengthMin",140.);
33  lengthMax = pset.getUntrackedParameter<double>("lengthMax",600.);
34  deltaPhiMax = pset.getUntrackedParameter<double>("deltaPhiMax",0.2);
35  polarMax = pset.getUntrackedParameter<double>("polarMax",0.7);
36  polarMin = pset.getUntrackedParameter<double>("polarMin",0.3);
37 
38  // trigger filter
39  useTriggerFilter = pset.getUntrackedParameter<bool>("useTriggerFilter",false);
40 
41  // input tags for collections
42  rd_token = consumes<FEDRawDataCollection>( pset.getParameter<edm::InputTag>("rawDataTag") );
43  sd_token = consumes<CSCStripDigiCollection>( pset.getParameter<edm::InputTag>("stripDigiTag") );
44  wd_token = consumes<CSCWireDigiCollection>( pset.getParameter<edm::InputTag>("wireDigiTag") );
45  cd_token = consumes<CSCComparatorDigiCollection>( pset.getParameter<edm::InputTag>("compDigiTag") );
46  al_token = consumes<CSCALCTDigiCollection>( pset.getParameter<edm::InputTag>("alctDigiTag") );
47  cl_token = consumes<CSCCLCTDigiCollection>( pset.getParameter<edm::InputTag>("clctDigiTag") );
48  co_token = consumes<CSCCorrelatedLCTDigiCollection>( pset.getParameter<edm::InputTag>("corrlctDigiTag") );
49  rh_token = consumes<CSCRecHit2DCollection>( pset.getParameter<edm::InputTag>("cscRecHitTag") );
50  se_token = consumes<CSCSegmentCollection>( pset.getParameter<edm::InputTag>("cscSegTag") );
51  sa_token = consumes<reco::TrackCollection>( pset.getParameter<edm::InputTag>("saMuonTag") );
52  l1_token = consumes<L1MuGMTReadoutCollection>( pset.getParameter<edm::InputTag>("l1aTag") );
53  tr_token = consumes<TriggerResults>( pset.getParameter<edm::InputTag>("hltTag") );
54  sh_token = consumes<PSimHitContainer>( pset.getParameter<edm::InputTag>("simHitTag") );
55 
56  // flags to switch on/off individual modules
57  makeOccupancyPlots = pset.getUntrackedParameter<bool>("makeOccupancyPlots",true);
58  makeTriggerPlots = pset.getUntrackedParameter<bool>("makeTriggerPlots",false);
59  makeStripPlots = pset.getUntrackedParameter<bool>("makeStripPlots",true);
60  makeWirePlots = pset.getUntrackedParameter<bool>("makeWirePlots",true);
61  makeRecHitPlots = pset.getUntrackedParameter<bool>("makeRecHitPlots",true);
62  makeSimHitPlots = pset.getUntrackedParameter<bool>("makeSimHitPlots",true);
63  makeSegmentPlots = pset.getUntrackedParameter<bool>("makeSegmentPlots",true);
64  makeResolutionPlots = pset.getUntrackedParameter<bool>("makeResolutionPlots",true);
65  makePedNoisePlots = pset.getUntrackedParameter<bool>("makePedNoisePlots",true);
66  makeEfficiencyPlots = pset.getUntrackedParameter<bool>("makeEfficiencyPlots",true);
67  makeGasGainPlots = pset.getUntrackedParameter<bool>("makeGasGainPlots",true);
68  makeAFEBTimingPlots = pset.getUntrackedParameter<bool>("makeAFEBTimingPlots",true);
69  makeCompTimingPlots = pset.getUntrackedParameter<bool>("makeCompTimingPlots",true);
70  makeADCTimingPlots = pset.getUntrackedParameter<bool>("makeADCTimingPlots",true);
71  makeRHNoisePlots = pset.getUntrackedParameter<bool>("makeRHNoisePlots",false);
72  makeCalibPlots = pset.getUntrackedParameter<bool>("makeCalibPlots",false);
73  makeStandalonePlots = pset.getUntrackedParameter<bool>("makeStandalonePlots",false);
74  makeTimeMonitorPlots = pset.getUntrackedParameter<bool>("makeTimeMonitorPlots",false);
75  makeHLTPlots = pset.getUntrackedParameter<bool>("makeHLTPlots",false);
76 
77  // set counters to zero
78  nEventsAnalyzed = 0;
79  rhTreeCount = 0;
80  segTreeCount = 0;
81  firstEvent = true;
82 
83  // Create the root file for the histograms
84  theFile = new TFile(rootFileName.c_str(), "RECREATE");
85  theFile->cd();
86 
87  // Create object of class CSCValHists to manage histograms
88  histos = new CSCValHists();
89 
90  // book Occupancy Histos
91  hOWires = new TH2I("hOWires","Wire Digi Occupancy",36,0.5,36.5,20,0.5,20.5);
92  hOStrips = new TH2I("hOStrips","Strip Digi Occupancy",36,0.5,36.5,20,0.5,20.5);
93  hORecHits = new TH2I("hORecHits","RecHit Occupancy",36,0.5,36.5,20,0.5,20.5);
94  hOSegments = new TH2I("hOSegments","Segments Occupancy",36,0.5,36.5,20,0.5,20.5);
95 
96  // book Eff histos
97  hSSTE = new TH1F("hSSTE","hSSTE",40,0,40);
98  hRHSTE = new TH1F("hRHSTE","hRHSTE",40,0,40);
99  hSEff = new TH1F("hSEff","Segment Efficiency",20,0.5,20.5);
100  hRHEff = new TH1F("hRHEff","recHit Efficiency",20,0.5,20.5);
101 
102  const int nChambers = 36;
103  const int nTypes = 18;
104  float nCH_min = 0.5;
105  float nCh_max = float(nChambers) + 0.5;
106  float nT_min = 0.5;
107  float nT_max = float(nTypes) + 0.5;
108 
109  hSSTE2 = new TH2F("hSSTE2","hSSTE2",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
110  hRHSTE2 = new TH2F("hRHSTE2","hRHSTE2",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
111  hStripSTE2 = new TH2F("hStripSTE2","hStripSTE2",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
112  hWireSTE2 = new TH2F("hWireSTE2","hWireSTE2",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
113 
114 
115  hEffDenominator = new TH2F("hEffDenominator","hEffDenominator",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
116  hSEff2 = new TH2F("hSEff2","Segment Efficiency 2D",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
117  hRHEff2 = new TH2F("hRHEff2","recHit Efficiency 2D",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
118 
119  hStripEff2 = new TH2F("hStripEff2","strip Efficiency 2D",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
120  hWireEff2 = new TH2F("hWireEff2","wire Efficiency 2D",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
121 
122  hSensitiveAreaEvt = new TH2F("hSensitiveAreaEvt","events in sensitive area",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
123 
124  // setup trees to hold global position data for rechits and segments
125  if (writeTreeToFile) histos->setupTrees();
126 
127 
128 }
129 
131 // DESTRUCTOR //
134 
135  // produce final efficiency histograms
136  histoEfficiency(hRHSTE,hRHEff);
137  histoEfficiency(hSSTE,hSEff);
138  hSEff2->Divide(hSSTE2,hEffDenominator,1.,1.,"B");
139  hRHEff2->Divide(hRHSTE2,hEffDenominator,1.,1.,"B");
140  hStripEff2->Divide(hStripSTE2,hEffDenominator,1.,1.,"B");
141  hWireEff2->Divide(hWireSTE2,hEffDenominator,1.,1.,"B");
142 
143  histos->insertPlot(hRHSTE,"hRHSTE","Efficiency");
144  histos->insertPlot(hSSTE,"hSSTE","Efficiency");
145  histos->insertPlot(hSSTE2,"hSSTE2","Efficiency");
146  histos->insertPlot(hEffDenominator,"hEffDenominator","Efficiency");
147  histos->insertPlot(hRHSTE2,"hRHSTE2","Efficiency");
148  histos->insertPlot(hStripSTE2,"hStripSTE2","Efficiency");
149  histos->insertPlot(hWireSTE2,"hWireSTE2","Efficiency");
150 
151  //moving this to post job macros
152  histos->insertPlot(hSEff,"hSEff","Efficiency");
153  histos->insertPlot(hRHEff,"hRHEff","Efficiency");
154 
155  histos->insertPlot(hSEff2,"hSEff2","Efficiency");
156  histos->insertPlot(hRHEff2,"hRHEff2","Efficiency");
157  histos->insertPlot(hStripEff2,"hStripff2","Efficiency");
158  histos->insertPlot(hWireEff2,"hWireff2","Efficiency");
159 
160  histos->insertPlot(hSensitiveAreaEvt,"","Efficiency");
161 
162  // throw in occupancy plots so they're saved
163  histos->insertPlot(hOWires,"hOWires","Digis");
164  histos->insertPlot(hOStrips,"hOStrips","Digis");
165  histos->insertPlot(hORecHits,"hORecHits","recHits");
166  histos->insertPlot(hOSegments,"hOSegments","Segments");
167 
168 
169  // write histos to the specified file
170  histos->writeHists(theFile);
171  if (writeTreeToFile) histos->writeTrees(theFile);
172  theFile->Close();
173 
174 }
175 
177 // Analysis //
179 void CSCValidation::analyze(const Event & event, const EventSetup& eventSetup){
180  // increment counter
181  nEventsAnalyzed++;
182 
183  //int iRun = event.id().run();
184  //int iEvent = event.id().event();
185 
186  // Get the Digis
193  if (useDigis){
194  event.getByToken( sd_token, strips );
195  event.getByToken( wd_token, wires );
196  event.getByToken( cd_token, compars );
197  event.getByToken( al_token, alcts );
198  event.getByToken( cl_token, clcts );
199  event.getByToken( co_token, correlatedlcts );
200  }
201 
202  // Get the CSC Geometry :
204  eventSetup.get<MuonGeometryRecord>().get(cscGeom);
205 
206  // Get the RecHits collection :
208  event.getByToken( rh_token, recHits );
209 
210  //CSCRecHit2DCollection::const_iterator recIt;
211  //for (recIt = recHits->begin(); recIt != recHits->end(); recIt++) {
212  // recIt->print();
213  // }
214 
215 
216  // Get the SimHits (if applicable)
218  if ( isSimulation ) event.getByToken( sh_token, simHits );
219 
220  // get CSC segment collection
222  event.getByToken( se_token, cscSegments );
223 
224  // get the trigger collection
226  if (makeTriggerPlots || useTriggerFilter || (useDigis && makeTimeMonitorPlots)){
227  event.getByToken( l1_token, pCollection );
228  }
230  if (makeHLTPlots) {
231  event.getByToken( tr_token, hlt );
232  }
233 
234  // get the standalone muon collection
236  if (makeStandalonePlots || useQualityFilter) {
237  event.getByToken( sa_token, saMuons );
238  }
239 
240 
242  // Run the modules //
244 
245  // Only do this for the first event
246  // this is probably outdated and needs to be looked at
247  if (nEventsAnalyzed == 1 && makeCalibPlots) doCalibrations(eventSetup);
248 
249 
250  // Look at the l1a trigger info (returns true if csc L1A present)
251  bool CSCL1A = false;
252  if (makeTriggerPlots || useTriggerFilter) CSCL1A = doTrigger(pCollection);
253  if (!useTriggerFilter) CSCL1A = true; // always true if not filtering on trigger
254 
255 
256  cleanEvent = false;
257  if (makeStandalonePlots || useQualityFilter) cleanEvent = filterEvents(recHits,cscSegments,saMuons);
258  if (!useQualityFilter) cleanEvent = true; // always true if not filtering on event quality
259 
260 
261  // look at various chamber occupancies
262  // keep this outside of filter for diagnostics???
263  if (makeOccupancyPlots && CSCL1A) doOccupancies(strips,wires,recHits,cscSegments);
264 
265 
266  if (makeHLTPlots) doHLT(hlt);
267 
268 
269  if (cleanEvent && CSCL1A){
270 
271  // general look at strip digis
272  if (makeStripPlots && useDigis) doStripDigis(strips);
273 
274  // general look at wire digis
275  if (makeWirePlots && useDigis) doWireDigis(wires);
276 
277 
278  // general look at rechits
279  if (makeRecHitPlots) doRecHits(recHits,cscGeom);
280 
281  // look at simHits
282  if (isSimulation && makeSimHitPlots) doSimHits(recHits,simHits);
283 
284  // general look at Segments
285  if (makeSegmentPlots) doSegments(cscSegments,cscGeom);
286 
287  // look at hit resolution
288  if (makeResolutionPlots) doResolution(cscSegments,cscGeom);
289 
290 
291  // look at Pedestal Noise
292  if (makePedNoisePlots && useDigis) doPedestalNoise(strips);
293 
294  // look at recHit and segment efficiencies
295  if (makeEfficiencyPlots) doEfficiencies(wires,strips, recHits, cscSegments,cscGeom);
296 
297  // gas gain
298  if (makeGasGainPlots && useDigis) doGasGain(*wires,*strips,*recHits);
299 
300 
301  // AFEB timing
302  if (makeAFEBTimingPlots && useDigis) doAFEBTiming(*wires);
303 
304  // Comparators timing
305  if (makeCompTimingPlots && useDigis) doCompTiming(*compars);
306 
307  // strip ADC timing
308  if (makeADCTimingPlots) doADCTiming(*recHits);
309 
310 
311 
312  // recHit Noise
313  if (makeRHNoisePlots && useDigis) doNoiseHits(recHits,cscSegments,cscGeom,strips);
314 
315  // look at standalone muons (not implemented yet)
316  if (makeStandalonePlots) doStandalone(saMuons);
317 
318  // make plots for monitoring the trigger and offline timing
319  if (makeTimeMonitorPlots) doTimeMonitoring(recHits,cscSegments, alcts, clcts, correlatedlcts, pCollection,cscGeom, eventSetup, event);
320 
321  firstEvent = false;
322 
323  }
324 
325 }
326 
327 // ==============================================
328 //
329 // event filter, returns true only for events with "good" standalone muon
330 //
331 // ==============================================
332 
335 
336  //int nGoodSAMuons = 0;
337 
338  if (recHits->size() < 4 || recHits->size() > 100) return false;
339  if (cscSegments->size() < 1 || cscSegments->size() > 15) return false;
340  return true;
341  //if (saMuons->size() != 1) return false;
342  /*
343  for(reco::TrackCollection::const_iterator muon = saMuons->begin(); muon != saMuons->end(); ++ muon ) {
344  double p = muon->p();
345  double reducedChisq = muon->normalizedChi2();
346 
347  GlobalPoint innerPnt(muon->innerPosition().x(),muon->innerPosition().y(),muon->innerPosition().z());
348  GlobalPoint outerPnt(muon->outerPosition().x(),muon->outerPosition().y(),muon->outerPosition().z());
349  GlobalVector innerKin(muon->innerMomentum().x(),muon->innerMomentum().y(),muon->innerMomentum().z());
350  GlobalVector outerKin(muon->outerMomentum().x(),muon->outerMomentum().y(),muon->outerMomentum().z());
351  GlobalVector deltaPnt = innerPnt - outerPnt;
352  double crudeLength = deltaPnt.mag();
353  double deltaPhi = innerPnt.phi() - outerPnt.phi();
354  double innerGlobalPolarAngle = innerKin.theta();
355  double outerGlobalPolarAngle = outerKin.theta();
356 
357  int nCSCHits = 0;
358  for (trackingRecHit_iterator hit = muon->recHitsBegin(); hit != muon->recHitsEnd(); ++hit ) {
359  if ( (*hit)->isValid() ) {
360  const DetId detId( (*hit)->geographicalId() );
361  if (detId.det() == DetId::Muon) {
362  if (detId.subdetId() == MuonSubdetId::CSC) {
363  nCSCHits++;
364  } // this is a CSC hit
365  } // this is a muon hit
366  } // hit is valid
367  } // end loop over rechits
368 
369  bool goodSAMuon = (p > pMin)
370  && ( reducedChisq < chisqMax )
371  && ( nCSCHits >= nCSCHitsMin )
372  && ( nCSCHits <= nCSCHitsMax )
373  && ( crudeLength > lengthMin )
374  && ( crudeLength < lengthMax );
375 
376 
377  goodSAMuon = goodSAMuon && ( fabs(deltaPhi) < deltaPhiMax );
378  goodSAMuon = goodSAMuon &&
379  (
380  ( ( innerGlobalPolarAngle > polarMin) && ( innerGlobalPolarAngle < polarMax) ) ||
381  ( (M_PI-innerGlobalPolarAngle > polarMin) && (M_PI-innerGlobalPolarAngle < polarMax) )
382  );
383  goodSAMuon = goodSAMuon &&
384  (
385  ( ( outerGlobalPolarAngle > polarMin) && ( outerGlobalPolarAngle < polarMax) ) ||
386  ( (M_PI-outerGlobalPolarAngle > polarMin) && (M_PI-outerGlobalPolarAngle < polarMax) )
387  );
388 
389  //goodSAMuon = goodSAMuon && (nCSCHits > nCSCHitsMin) && (nCSCHits < 13);
390  //goodSAMuon = goodSAMuon && (nCSCHits > 13) && (nCSCHits < 19);
391  //goodSAMuon = goodSAMuon && (nCSCHits > 19) && (nCSCHits < nCSCHitsMax);
392 
393 
394  if (goodSAMuon) nGoodSAMuons++;
395 
396  } // end loop over stand-alone muon collection
397 
398 
399  histos->fill1DHist(nGoodSAMuons,"hNGoodMuons", "Number of Good STA Muons per Event",11,-0.5,10.5,"STAMuons");
400 
401  if (nGoodSAMuons == 1) return true;
402  return false;
403  */
404 }
405 
406 // ==============================================
407 //
408 // look at Occupancies
409 //
410 // ==============================================
411 
414 
415  bool wireo[2][4][4][36];
416  bool stripo[2][4][4][36];
417  bool rechito[2][4][4][36];
418  bool segmento[2][4][4][36];
419 
420  bool hasWires = false;
421  bool hasStrips = false;
422  bool hasRecHits = false;
423  bool hasSegments = false;
424 
425  for (int e = 0; e < 2; e++){
426  for (int s = 0; s < 4; s++){
427  for (int r = 0; r < 4; r++){
428  for (int c = 0; c < 36; c++){
429  wireo[e][s][r][c] = false;
430  stripo[e][s][r][c] = false;
431  rechito[e][s][r][c] = false;
432  segmento[e][s][r][c] = false;
433  }
434  }
435  }
436  }
437 
438  if (useDigis){
439  //wires
440  for (CSCWireDigiCollection::DigiRangeIterator wi=wires->begin(); wi!=wires->end(); wi++) {
441  CSCDetId id = (CSCDetId)(*wi).first;
442  int kEndcap = id.endcap();
443  int kRing = id.ring();
444  int kStation = id.station();
445  int kChamber = id.chamber();
446  std::vector<CSCWireDigi>::const_iterator wireIt = (*wi).second.first;
447  std::vector<CSCWireDigi>::const_iterator lastWire = (*wi).second.second;
448  for( ; wireIt != lastWire; ++wireIt){
449  if (!wireo[kEndcap-1][kStation-1][kRing-1][kChamber-1]){
450  wireo[kEndcap-1][kStation-1][kRing-1][kChamber-1] = true;
451  hOWires->Fill(kChamber,typeIndex(id));
452  histos->fill1DHist(chamberSerial(id),"hOWireSerial","Wire Occupancy by Chamber Serial",601,-0.5,600.5,"Digis");
453  hasWires = true;
454  }
455  }
456  }
457 
458  //strips
459  for (CSCStripDigiCollection::DigiRangeIterator si=strips->begin(); si!=strips->end(); si++) {
460  CSCDetId id = (CSCDetId)(*si).first;
461  int kEndcap = id.endcap();
462  int kRing = id.ring();
463  int kStation = id.station();
464  int kChamber = id.chamber();
465  std::vector<CSCStripDigi>::const_iterator stripIt = (*si).second.first;
466  std::vector<CSCStripDigi>::const_iterator lastStrip = (*si).second.second;
467  for( ; stripIt != lastStrip; ++stripIt) {
468  std::vector<int> myADCVals = stripIt->getADCCounts();
469  bool thisStripFired = false;
470  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
471  float threshold = 13.3 ;
472  float diff = 0.;
473  for (unsigned int iCount = 0; iCount < myADCVals.size(); iCount++) {
474  diff = (float)myADCVals[iCount]-thisPedestal;
475  if (diff > threshold) { thisStripFired = true; }
476  }
477  if (thisStripFired) {
478  if (!stripo[kEndcap-1][kStation-1][kRing-1][kChamber-1]){
479  stripo[kEndcap-1][kStation-1][kRing-1][kChamber-1] = true;
480  hOStrips->Fill(kChamber,typeIndex(id));
481  histos->fill1DHist(chamberSerial(id),"hOStripSerial","Strip Occupancy by Chamber Serial",601,-0.5,600.5,"Digis");
482  hasStrips = true;
483  }
484  }
485  }
486  }
487  }
488 
489  //rechits
491  for (recIt = recHits->begin(); recIt != recHits->end(); recIt++) {
492  CSCDetId idrec = (CSCDetId)(*recIt).cscDetId();
493  int kEndcap = idrec.endcap();
494  int kRing = idrec.ring();
495  int kStation = idrec.station();
496  int kChamber = idrec.chamber();
497  if (!rechito[kEndcap-1][kStation-1][kRing-1][kChamber-1]){
498  rechito[kEndcap-1][kStation-1][kRing-1][kChamber-1] = true;
499  histos->fill1DHist(chamberSerial(idrec),"hORecHitsSerial","RecHit Occupancy by Chamber Serial",601,-0.5,600.5,"recHits");
500  hORecHits->Fill(kChamber,typeIndex(idrec));
501  hasRecHits = true;
502  }
503  }
504 
505  //segments
506  for(CSCSegmentCollection::const_iterator segIt=cscSegments->begin(); segIt != cscSegments->end(); segIt++) {
507  CSCDetId id = (CSCDetId)(*segIt).cscDetId();
508  int kEndcap = id.endcap();
509  int kRing = id.ring();
510  int kStation = id.station();
511  int kChamber = id.chamber();
512  if (!segmento[kEndcap-1][kStation-1][kRing-1][kChamber-1]){
513  segmento[kEndcap-1][kStation-1][kRing-1][kChamber-1] = true;
514  histos->fill1DHist(chamberSerial(id),"hOSegmentsSerial","Segment Occupancy by Chamber Serial",601,-0.5,600.5,"Segments");
515  hOSegments->Fill(kChamber,typeIndex(id));
516  hasSegments = true;
517  }
518  }
519 
520  // overall CSC occupancy (events with CSC data compared to total)
521  histos->fill1DHist(1,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
522  if (hasWires) histos->fill1DHist(3,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
523  if (hasStrips) histos->fill1DHist(5,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
524  if (hasWires && hasStrips) histos->fill1DHist(7,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
525  if (hasRecHits) histos->fill1DHist(9,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
526  if (hasSegments) histos->fill1DHist(11,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
527  if (!cleanEvent) histos->fill1DHist(13,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
528 
529 }
530 
531 // ==============================================
532 //
533 // look at Trigger info
534 //
535 // ==============================================
536 
538 
539  std::vector<L1MuGMTReadoutRecord> L1Mrec = pCollection->getRecords();
540  std::vector<L1MuGMTReadoutRecord>::const_iterator igmtrr;
541 
542  bool csc_l1a = false;
543  bool dt_l1a = false;
544  bool rpcf_l1a = false;
545  bool rpcb_l1a = false;
546  bool beamHaloTrigger = false;
547 
548  int myBXNumber = -1000;
549 
550  for(igmtrr=L1Mrec.begin(); igmtrr!=L1Mrec.end(); igmtrr++) {
551  std::vector<L1MuRegionalCand>::const_iterator iter1;
552  std::vector<L1MuRegionalCand> rmc;
553 
554  // CSC
555  int icsc = 0;
556  rmc = igmtrr->getCSCCands();
557  for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
558  if ( !(*iter1).empty() ) {
559  icsc++;
560  int kQuality = (*iter1).quality(); // kQuality = 1 means beam halo
561  if (kQuality == 1) beamHaloTrigger = true;
562  }
563  }
564  if (igmtrr->getBxInEvent() == 0 && icsc>0) csc_l1a = true;
565  if (igmtrr->getBxInEvent() == 0 ) { myBXNumber = igmtrr->getBxNr(); }
566 
567  // DT
568  int idt = 0;
569  rmc = igmtrr->getDTBXCands();
570  for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
571  if ( !(*iter1).empty() ) {
572  idt++;
573  }
574  }
575  if(igmtrr->getBxInEvent()==0 && idt>0) dt_l1a = true;
576 
577  // RPC Barrel
578  int irpcb = 0;
579  rmc = igmtrr->getBrlRPCCands();
580  for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
581  if ( !(*iter1).empty() ) {
582  irpcb++;
583  }
584  }
585  if(igmtrr->getBxInEvent()==0 && irpcb>0) rpcb_l1a = true;
586 
587  // RPC Forward
588  int irpcf = 0;
589  rmc = igmtrr->getFwdRPCCands();
590  for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
591  if ( !(*iter1).empty() ) {
592  irpcf++;
593  }
594  }
595  if(igmtrr->getBxInEvent()==0 && irpcf>0) rpcf_l1a = true;
596 
597  }
598 
599  // Fill some histograms with L1A info
600  if (csc_l1a) histos->fill1DHist(myBXNumber,"vtBXNumber","BX Number",4001,-0.5,4000.5,"Trigger");
601  if (csc_l1a) histos->fill1DHist(1,"vtBits","trigger bits",11,-0.5,10.5,"Trigger");
602  if (dt_l1a) histos->fill1DHist(2,"vtBits","trigger bits",11,-0.5,10.5,"Trigger");
603  if (rpcb_l1a) histos->fill1DHist(3,"vtBits","trigger bits",11,-0.5,10.5,"Trigger");
604  if (rpcf_l1a) histos->fill1DHist(4,"vtBits","trigger bits",11,-0.5,10.5,"Trigger");
605  if (beamHaloTrigger) histos->fill1DHist(8,"vtBits","trigger bits",11,-0.5,10.5,"Trigger");
606 
607  if (csc_l1a) {
608  histos->fill1DHist(1,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
609  if (dt_l1a) histos->fill1DHist(2,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
610  if (rpcb_l1a) histos->fill1DHist(3,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
611  if (rpcf_l1a) histos->fill1DHist(4,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
612  if ( dt_l1a || rpcb_l1a || rpcf_l1a) histos->fill1DHist(5,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
613  if (!(dt_l1a || rpcb_l1a || rpcf_l1a)) histos->fill1DHist(6,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
614  } else {
615  histos->fill1DHist(1,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
616  if (dt_l1a) histos->fill1DHist(2,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
617  if (rpcb_l1a) histos->fill1DHist(3,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
618  if (rpcf_l1a) histos->fill1DHist(4,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
619  if ( dt_l1a || rpcb_l1a || rpcf_l1a) histos->fill1DHist(5,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
620  if (!(dt_l1a || rpcb_l1a || rpcf_l1a)) histos->fill1DHist(6,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
621  }
622 
623  // if valid CSC L1A then return true for possible use elsewhere
624 
625  if (csc_l1a) return true;
626 
627  return false;
628 
629 }
630 
631 // ==============================================
632 //
633 // look at HLT Trigger
634 //
635 // ==============================================
636 
638 
639  // HLT stuff
640  int hltSize = hlt->size();
641  for (int i = 0; i < hltSize; ++i){
642  if (hlt->accept(i)) histos->fill1DHist(i,"hltBits","HLT Trigger Bits",hltSize+1,-0.5,(float)hltSize+0.5,"Trigger");
643  }
644 
645  return true;
646 }
647 
648 
649 // ==============================================
650 //
651 // look at Calibrations
652 //
653 // ==============================================
654 
656 
657  // Only do this for the first event
658  if (nEventsAnalyzed == 1){
659 
660  LogDebug("Calibrations") << "Loading Calibrations...";
661 
662  // get the gains
664  eventSetup.get<CSCDBGainsRcd>().get( hGains );
665  const CSCDBGains* pGains = hGains.product();
666  // get the crosstalks
668  eventSetup.get<CSCDBCrosstalkRcd>().get( hCrosstalk );
669  const CSCDBCrosstalk* pCrosstalk = hCrosstalk.product();
670  // get the noise matrix
671  edm::ESHandle<CSCDBNoiseMatrix> hNoiseMatrix;
672  eventSetup.get<CSCDBNoiseMatrixRcd>().get( hNoiseMatrix );
673  const CSCDBNoiseMatrix* pNoiseMatrix = hNoiseMatrix.product();
674  // get pedestals
676  eventSetup.get<CSCDBPedestalsRcd>().get( hPedestals );
677  const CSCDBPedestals* pPedestals = hPedestals.product();
678 
679  LogDebug("Calibrations") << "Calibrations Loaded!";
680 
681  for (int i = 0; i < 400; i++){
682  int bin = i+1;
683  histos->fillCalibHist(pGains->gains[i].gain_slope,"hCalibGainsS","Gains Slope",400,0,400,bin,"Calib");
684  histos->fillCalibHist(pCrosstalk->crosstalk[i].xtalk_slope_left,"hCalibXtalkSL","Xtalk Slope Left",400,0,400,bin,"Calib");
685  histos->fillCalibHist(pCrosstalk->crosstalk[i].xtalk_slope_right,"hCalibXtalkSR","Xtalk Slope Right",400,0,400,bin,"Calib");
686  histos->fillCalibHist(pCrosstalk->crosstalk[i].xtalk_intercept_left,"hCalibXtalkIL","Xtalk Intercept Left",400,0,400,bin,"Calib");
687  histos->fillCalibHist(pCrosstalk->crosstalk[i].xtalk_intercept_right,"hCalibXtalkIR","Xtalk Intercept Right",400,0,400,bin,"Calib");
688  histos->fillCalibHist(pPedestals->pedestals[i].ped,"hCalibPedsP","Peds",400,0,400,bin,"Calib");
689  histos->fillCalibHist(pPedestals->pedestals[i].rms,"hCalibPedsR","Peds RMS",400,0,400,bin,"Calib");
690  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem33,"hCalibNoise33","Noise Matrix 33",400,0,400,bin,"Calib");
691  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem34,"hCalibNoise34","Noise Matrix 34",400,0,400,bin,"Calib");
692  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem35,"hCalibNoise35","Noise Matrix 35",400,0,400,bin,"Calib");
693  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem44,"hCalibNoise44","Noise Matrix 44",400,0,400,bin,"Calib");
694  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem45,"hCalibNoise45","Noise Matrix 45",400,0,400,bin,"Calib");
695  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem46,"hCalibNoise46","Noise Matrix 46",400,0,400,bin,"Calib");
696  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem55,"hCalibNoise55","Noise Matrix 55",400,0,400,bin,"Calib");
697  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem56,"hCalibNoise56","Noise Matrix 56",400,0,400,bin,"Calib");
698  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem57,"hCalibNoise57","Noise Matrix 57",400,0,400,bin,"Calib");
699  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem66,"hCalibNoise66","Noise Matrix 66",400,0,400,bin,"Calib");
700  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem67,"hCalibNoise67","Noise Matrix 67",400,0,400,bin,"Calib");
701  histos->fillCalibHist(pNoiseMatrix->matrix[i].elem77,"hCalibNoise77","Noise Matrix 77",400,0,400,bin,"Calib");
702 
703 
704  }
705 
706  }
707 
708 
709 }
710 
711 
712 // ==============================================
713 //
714 // look at WIRE DIGIs
715 //
716 // ==============================================
717 
719 
720  int nWireGroupsTotal = 0;
721  for (CSCWireDigiCollection::DigiRangeIterator dWDiter=wires->begin(); dWDiter!=wires->end(); dWDiter++) {
722  CSCDetId id = (CSCDetId)(*dWDiter).first;
723  std::vector<CSCWireDigi>::const_iterator wireIter = (*dWDiter).second.first;
724  std::vector<CSCWireDigi>::const_iterator lWire = (*dWDiter).second.second;
725  for( ; wireIter != lWire; ++wireIter) {
726  int myWire = wireIter->getWireGroup();
727  int myTBin = wireIter->getTimeBin();
728  nWireGroupsTotal++;
729  histos->fill1DHistByType(myWire,"hWireWire","Wiregroup Numbers Fired",id,113,-0.5,112.5,"Digis");
730  histos->fill1DHistByType(myTBin,"hWireTBin","Wire TimeBin Fired",id,17,-0.5,16.5,"Digis");
731  histos->fillProfile(chamberSerial(id),myTBin,"hWireTBinProfile","Wire TimeBin Fired",601,-0.5,600.5,-0.5,16.5,"Digis");
732  if (detailedAnalysis){
733  histos->fill1DHistByLayer(myWire,"hWireWire","Wiregroup Numbers Fired",id,113,-0.5,112.5,"WireNumberByLayer");
734  histos->fill1DHistByLayer(myTBin,"hWireTBin","Wire TimeBin Fired",id,17,-0.5,16.5,"WireTimeByLayer");
735  }
736  }
737  } // end wire loop
738 
739  // this way you can zero suppress but still store info on # events with no digis
740  if (nWireGroupsTotal == 0) nWireGroupsTotal = -1;
741 
742  histos->fill1DHist(nWireGroupsTotal,"hWirenGroupsTotal","Wires Fired Per Event",151,-0.5,150.5,"Digis");
743 
744 }
745 
746 // ==============================================
747 //
748 // look at STRIP DIGIs
749 //
750 // ==============================================
751 
753 
754  int nStripsFired = 0;
755  for (CSCStripDigiCollection::DigiRangeIterator dSDiter=strips->begin(); dSDiter!=strips->end(); dSDiter++) {
756  CSCDetId id = (CSCDetId)(*dSDiter).first;
757  std::vector<CSCStripDigi>::const_iterator stripIter = (*dSDiter).second.first;
758  std::vector<CSCStripDigi>::const_iterator lStrip = (*dSDiter).second.second;
759  for( ; stripIter != lStrip; ++stripIter) {
760  int myStrip = stripIter->getStrip();
761  std::vector<int> myADCVals = stripIter->getADCCounts();
762  bool thisStripFired = false;
763  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
764  float threshold = 13.3 ;
765  float diff = 0.;
766  for (unsigned int iCount = 0; iCount < myADCVals.size(); iCount++) {
767  diff = (float)myADCVals[iCount]-thisPedestal;
768  if (diff > threshold) { thisStripFired = true; }
769  }
770  if (thisStripFired) {
771  nStripsFired++;
772  // fill strip histos
773  histos->fill1DHistByType(myStrip,"hStripStrip","Strip Number",id,81,-0.5,80.5,"Digis");
774  if (detailedAnalysis){
775  histos->fill1DHistByLayer(myStrip,"hStripStrip","Strip Number",id,81,-0.5,80.5,"StripNumberByLayer");
776  }
777  }
778  }
779  } // end strip loop
780 
781  if (nStripsFired == 0) nStripsFired = -1;
782 
783  histos->fill1DHist(nStripsFired,"hStripNFired","Fired Strips per Event",251,-0.5,250.5,"Digis");
784 
785 }
786 
787 //=======================================================
788 //
789 // Look at the Pedestal Noise Distributions
790 //
791 //=======================================================
792 
794 
795  for (CSCStripDigiCollection::DigiRangeIterator dPNiter=strips->begin(); dPNiter!=strips->end(); dPNiter++) {
796  CSCDetId id = (CSCDetId)(*dPNiter).first;
797  std::vector<CSCStripDigi>::const_iterator pedIt = (*dPNiter).second.first;
798  std::vector<CSCStripDigi>::const_iterator lStrip = (*dPNiter).second.second;
799  for( ; pedIt != lStrip; ++pedIt) {
800  int myStrip = pedIt->getStrip();
801  std::vector<int> myADCVals = pedIt->getADCCounts();
802  float TotalADC = getSignal(*strips, id, myStrip);
803  bool thisStripFired = false;
804  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
805  float thisSignal = (1./6)*(myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
806  float threshold = 13.3;
807  if(id.station() == 1 && id.ring() == 4)
808  {
809  if(myStrip <= 16) myStrip += 64; // no trapping for any bizarreness
810  }
811  if (TotalADC > threshold) { thisStripFired = true;}
812  if (!thisStripFired){
813  float ADC = thisSignal - thisPedestal;
814  histos->fill1DHist(ADC,"hStripPed","Pedestal Noise Distribution",50,-25.,25.,"PedestalNoise");
815  histos->fill1DHistByType(ADC,"hStripPedME","Pedestal Noise Distribution",id,50,-25.,25.,"PedestalNoise");
816  histos->fillProfile(chamberSerial(id),ADC,"hStripPedMEProfile","Wire TimeBin Fired",601,-0.5,600.5,-25,25,"PedestalNoise");
817  if (detailedAnalysis){
818  histos->fill1DHistByLayer(ADC,"hStripPedME","Pedestal Noise Distribution",id,50,-25.,25.,"PedestalNoiseByLayer");
819  }
820  }
821  }
822  }
823 
824 }
825 
826 
827 // ==============================================
828 //
829 // look at RECHITs
830 //
831 // ==============================================
832 
834 
835  // Get the RecHits collection :
836  int nRecHits = recHits->size();
837 
838  // ---------------------
839  // Loop over rechits
840  // ---------------------
841  int iHit = 0;
842 
843  // Build iterator for rechits and loop :
845  for (dRHIter = recHits->begin(); dRHIter != recHits->end(); dRHIter++) {
846  iHit++;
847 
848  // Find chamber with rechits in CSC
849  CSCDetId idrec = (CSCDetId)(*dRHIter).cscDetId();
850  int kEndcap = idrec.endcap();
851  int kRing = idrec.ring();
852  int kStation = idrec.station();
853  int kChamber = idrec.chamber();
854  int kLayer = idrec.layer();
855 
856  // Store rechit as a Local Point:
857  LocalPoint rhitlocal = (*dRHIter).localPosition();
858  float xreco = rhitlocal.x();
859  float yreco = rhitlocal.y();
860  LocalError rerrlocal = (*dRHIter).localPositionError();
861  //these errors are squared!
862  float xxerr = rerrlocal.xx();
863  float yyerr = rerrlocal.yy();
864  float xyerr = rerrlocal.xy();
865  // errors in strip units
866  float stpos = (*dRHIter).positionWithinStrip();
867  float sterr = (*dRHIter).errorWithinStrip();
868 
869  // Find the charge associated with this hit
870  float rHSumQ = 0;
871  float sumsides=0.;
872  int adcsize=dRHIter->nStrips()*dRHIter->nTimeBins();
873  for ( unsigned int i=0; i< dRHIter->nStrips(); i++) {
874  for ( unsigned int j=0; j< dRHIter->nTimeBins()-1; j++) {
875  rHSumQ+=dRHIter->adcs(i,j);
876  if (i!=1) sumsides+=dRHIter->adcs(i,j);
877  }
878  }
879 
880  float rHratioQ = sumsides/rHSumQ;
881  if (adcsize != 12) rHratioQ = -99;
882 
883  // Get the signal timing of this hit
884  float rHtime = 0;
885  rHtime = (*dRHIter).tpeak()/50.;
886 
887  // Get pointer to the layer:
888  const CSCLayer* csclayer = cscGeom->layer( idrec );
889 
890  // Transform hit position from local chamber geometry to global CMS geom
891  GlobalPoint rhitglobal= csclayer->toGlobal(rhitlocal);
892  float grecx = rhitglobal.x();
893  float grecy = rhitglobal.y();
894 
895  // Fill the rechit position branch
896  if (writeTreeToFile && rhTreeCount < 1500000){
897  histos->fillRechitTree(xreco, yreco, grecx, grecy, kEndcap, kStation, kRing, kChamber, kLayer);
898  rhTreeCount++;
899  }
900 
901  // Fill some histograms
902  // only fill if 3 strips were used in the hit
903  histos->fill2DHistByStation(grecx,grecy,"hRHGlobal","recHit Global Position",idrec,100,-800.,800.,100,-800.,800.,"recHits");
904  if (kStation == 1 && (kRing == 1 || kRing == 4)) histos->fill1DHistByType(rHSumQ,"hRHSumQ","Sum 3x3 recHit Charge",idrec,125,0,4000,"recHits");
905  else histos->fill1DHistByType(rHSumQ,"hRHSumQ","Sum 3x3 recHit Charge",idrec,125,0,2000,"recHits");
906  histos->fill1DHistByType(rHratioQ,"hRHRatioQ","Charge Ratio (Ql+Qr)/Qt",idrec,120,-0.1,1.1,"recHits");
907  histos->fill1DHistByType(rHtime,"hRHTiming","recHit Timing",idrec,200,-10,10,"recHits");
908  histos->fill1DHistByType(sqrt(xxerr),"hRHxerr","RecHit Error on Local X",idrec,100,-0.1,2,"recHits");
909  histos->fill1DHistByType(sqrt(yyerr),"hRHyerr","RecHit Error on Local Y",idrec,100,-0.1,2,"recHits");
910  histos->fill1DHistByType(xyerr,"hRHxyerr","Corr. RecHit XY Error",idrec,100,-1,2,"recHits");
911  if (adcsize == 12) histos->fill1DHistByType(stpos,"hRHstpos","Reconstructed Position on Strip",idrec,120,-0.6,0.6,"recHits");
912  histos->fill1DHistByType(sterr,"hRHsterr","Estimated Error on Strip Measurement",idrec,120,-0.05,0.25,"recHits");
913  histos->fillProfile(chamberSerial(idrec),rHSumQ,"hRHSumQProfile","Sum 3x3 recHit Charge",601,-0.5,600.5,0,4000,"recHits");
914  histos->fillProfile(chamberSerial(idrec),rHtime,"hRHTimingProfile","recHit Timing",601,-0.5,600.5,-11,11,"recHits");
915  if (detailedAnalysis){
916  if (kStation == 1 && (kRing == 1 || kRing == 4)) histos->fill1DHistByLayer(rHSumQ,"hRHSumQ","Sum 3x3 recHit Charge",idrec,125,0,4000,"RHQByLayer");
917  else histos->fill1DHistByLayer(rHSumQ,"hRHSumQ","Sum 3x3 recHit Charge",idrec,125,0,2000,"RHQByLayer");
918  histos->fill1DHistByLayer(rHratioQ,"hRHRatioQ","Charge Ratio (Ql+Qr)/Qt",idrec,120,-0.1,1.1,"RHQByLayer");
919  histos->fill1DHistByLayer(rHtime,"hRHTiming","recHit Timing",idrec,200,-10,10,"RHTimingByLayer");
920  histos->fill2DHistByLayer(xreco,yreco,"hRHLocalXY","recHit Local Position",idrec,50,-100.,100.,75,-150.,150.,"RHLocalXYByLayer");
921  histos->fill1DHistByLayer(sqrt(xxerr),"hRHxerr","RecHit Error on Local X",idrec,100,-0.1,2,"RHErrorsByLayer");
922  histos->fill1DHistByLayer(sqrt(yyerr),"hRHyerr","RecHit Error on Local Y",idrec,100,-0.1,2,"RHErrorsByLayer");
923  histos->fill1DHistByType(stpos,"hRHstpos","Reconstructed Position on Strip",idrec,120,-0.6,0.6,"RHStripPosByLayer");
924  histos->fill1DHistByType(sterr,"hRHsterr","Estimated Error on Strip Measurement",idrec,120,-0.05,0.25,"RHStripPosByLayer");
925  }
926 
927  } //end rechit loop
928 
929  if (nRecHits == 0) nRecHits = -1;
930 
931  histos->fill1DHist(nRecHits,"hRHnrechits","recHits per Event (all chambers)",151,-0.5,150.5,"recHits");
932 
933 }
934 
935 // ==============================================
936 //
937 // look at SIMHITS
938 //
939 // ==============================================
940 
942 
944  for (dSHrecIter = recHits->begin(); dSHrecIter != recHits->end(); dSHrecIter++) {
945 
946  CSCDetId idrec = (CSCDetId)(*dSHrecIter).cscDetId();
947  LocalPoint rhitlocal = (*dSHrecIter).localPosition();
948  float xreco = rhitlocal.x();
949  float yreco = rhitlocal.y();
950  float xError = sqrt((*dSHrecIter).localPositionError().xx());
951  float yError = sqrt((*dSHrecIter).localPositionError().yy());
952  float simHitXres = -99;
953  float simHitYres = -99;
954  float xPull = -99;
955  float yPull = -99;
956  float mindiffX = 99;
957  float mindiffY = 10;
958  // If MC, find closest muon simHit to check resolution:
959  PSimHitContainer::const_iterator dSHsimIter;
960  for (dSHsimIter = simHits->begin(); dSHsimIter != simHits->end(); dSHsimIter++){
961  // Get DetID for this simHit:
962  CSCDetId sId = (CSCDetId)(*dSHsimIter).detUnitId();
963  // Check if the simHit detID matches that of current recHit
964  // and make sure it is a muon hit:
965  if (sId == idrec && abs((*dSHsimIter).particleType()) == 13){
966  // Get the position of this simHit in local coordinate system:
967  LocalPoint sHitlocal = (*dSHsimIter).localPosition();
968  // Now we need to make reasonably sure that this simHit is
969  // responsible for this recHit:
970  if ((sHitlocal.x() - xreco) < mindiffX && (sHitlocal.y() - yreco) < mindiffY){
971  simHitXres = (sHitlocal.x() - xreco);
972  simHitYres = (sHitlocal.y() - yreco);
973  mindiffX = (sHitlocal.x() - xreco);
974  xPull = simHitXres/xError;
975  yPull = simHitYres/yError;
976  }
977  }
978  }
979 
980  histos->fill1DHistByType(simHitXres,"hSimXResid","SimHitX - Reconstructed X",idrec,100,-1.0,1.0,"Resolution");
981  histos->fill1DHistByType(simHitYres,"hSimYResid","SimHitY - Reconstructed Y",idrec,100,-5.0,5.0,"Resolution");
982  histos->fill1DHistByType(xPull,"hSimXPull","Local X Pulls",idrec,100,-5.0,5.0,"Resolution");
983  histos->fill1DHistByType(yPull,"hSimYPull","Local Y Pulls",idrec,100,-5.0,5.0,"Resolution");
984 
985  }
986 
987 }
988 
989 // ==============================================
990 //
991 // look at SEGMENTs
992 //
993 // ===============================================
994 
996 
997  // get CSC segment collection
998  int nSegments = cscSegments->size();
999 
1000  // -----------------------
1001  // loop over segments
1002  // -----------------------
1003  int iSegment = 0;
1004  for(CSCSegmentCollection::const_iterator dSiter=cscSegments->begin(); dSiter != cscSegments->end(); dSiter++) {
1005  iSegment++;
1006  //
1007  CSCDetId id = (CSCDetId)(*dSiter).cscDetId();
1008  int kEndcap = id.endcap();
1009  int kRing = id.ring();
1010  int kStation = id.station();
1011  int kChamber = id.chamber();
1012 
1013  //
1014  float chisq = (*dSiter).chi2();
1015  int nhits = (*dSiter).nRecHits();
1016  int nDOF = 2*nhits-4;
1017  double chisqProb = ChiSquaredProbability( (double)chisq, nDOF );
1018  LocalPoint localPos = (*dSiter).localPosition();
1019  float segX = localPos.x();
1020  float segY = localPos.y();
1021  LocalVector segDir = (*dSiter).localDirection();
1022  double theta = segDir.theta();
1023 
1024  // global transformation
1025  float globX = 0.;
1026  float globY = 0.;
1027  float globTheta = 0.;
1028  float globPhi = 0.;
1029  const CSCChamber* cscchamber = cscGeom->chamber(id);
1030  if (cscchamber) {
1031  GlobalPoint globalPosition = cscchamber->toGlobal(localPos);
1032  globX = globalPosition.x();
1033  globY = globalPosition.y();
1034  GlobalVector globalDirection = cscchamber->toGlobal(segDir);
1035  globTheta = globalDirection.theta();
1036  globPhi = globalDirection.phi();
1037  }
1038 
1039 
1040  // Fill segment position branch
1041  if (writeTreeToFile && segTreeCount < 1500000){
1042  histos->fillSegmentTree(segX, segY, globX, globY, kEndcap, kStation, kRing, kChamber);
1043  segTreeCount++;
1044  }
1045 
1046  // Fill histos
1047  histos->fill2DHistByStation(globX,globY,"hSGlobal","Segment Global Positions;global x (cm)",id,100,-800.,800.,100,-800.,800.,"Segments");
1048  histos->fill1DHistByType(nhits,"hSnHits","N hits on Segments",id,8,-0.5,7.5,"Segments");
1049  histos->fill1DHistByType(theta,"hSTheta","local theta segments",id,128,-3.2,3.2,"Segments");
1050  histos->fill1DHistByType((chisq/nDOF),"hSChiSq","segments chi-squared/ndof",id,110,-0.05,10.5,"Segments");
1051  histos->fill1DHistByType(chisqProb,"hSChiSqProb","segments chi-squared probability",id,110,-0.05,1.05,"Segments");
1052  histos->fill1DHist(globTheta,"hSGlobalTheta","segment global theta",128,0,3.2,"Segments");
1053  histos->fill1DHist(globPhi,"hSGlobalPhi","segment global phi",128,-3.2,3.2,"Segments");
1054  histos->fillProfile(chamberSerial(id),nhits,"hSnHitsProfile","N hits on Segments",601,-0.5,600.5,-0.5,7.5,"Segments");
1055  if (detailedAnalysis){
1056  histos->fill1DHistByChamber(nhits,"hSnHits","N hits on Segments",id,8,-0.5,7.5,"HitsOnSegmentByChamber");
1057  histos->fill1DHistByChamber(theta,"hSTheta","local theta segments",id,128,-3.2,3.2,"DetailedSegments");
1058  histos->fill1DHistByChamber((chisq/nDOF),"hSChiSq","segments chi-squared/ndof",id,110,-0.05,10.5,"SegChi2ByChamber");
1059  histos->fill1DHistByChamber(chisqProb,"hSChiSqProb","segments chi-squared probability",id,110,-0.05,1.05,"SegChi2ByChamber");
1060  }
1061 
1062  } // end segment loop
1063 
1064  if (nSegments == 0) nSegments = -1;
1065 
1066  histos->fill1DHist(nSegments,"hSnSegments","Segments per Event",31,-0.5,30.5,"Segments");
1067 
1068 }
1069 
1070 // ==============================================
1071 //
1072 // look at hit Resolution
1073 //
1074 // ===============================================
1075 
1077 
1078 
1079  for(CSCSegmentCollection::const_iterator dSiter=cscSegments->begin(); dSiter != cscSegments->end(); dSiter++) {
1080 
1081  CSCDetId id = (CSCDetId)(*dSiter).cscDetId();
1082 
1083  //
1084  // try to get the CSC recHits that contribute to this segment.
1085  std::vector<CSCRecHit2D> theseRecHits = (*dSiter).specificRecHits();
1086  int nRH = (*dSiter).nRecHits();
1087  int jRH = 0;
1088  CLHEP::HepMatrix sp(6,1);
1089  CLHEP::HepMatrix se(6,1);
1090  for ( std::vector<CSCRecHit2D>::const_iterator iRH = theseRecHits.begin(); iRH != theseRecHits.end(); iRH++) {
1091  jRH++;
1092  CSCDetId idRH = (CSCDetId)(*iRH).cscDetId();
1093  int kRing = idRH.ring();
1094  int kStation = idRH.station();
1095  int kLayer = idRH.layer();
1096 
1097  // Find the strip containing this hit
1098  int centerid = iRH->nStrips()/2;
1099  int centerStrip = iRH->channels(centerid);
1100 
1101  // If this segment has 6 hits, find the position of each hit on the strip in units of stripwidth and store values
1102  if (nRH == 6){
1103  float stpos = (*iRH).positionWithinStrip();
1104  se(kLayer,1) = (*iRH).errorWithinStrip();
1105  // Take into account half-strip staggering of layers (ME1/1 has no staggering)
1106  if (kStation == 1 && (kRing == 1 || kRing == 4)) sp(kLayer,1) = stpos + centerStrip;
1107  else{
1108  if (kLayer == 1 || kLayer == 3 || kLayer == 5) sp(kLayer,1) = stpos + centerStrip;
1109  if (kLayer == 2 || kLayer == 4 || kLayer == 6) sp(kLayer,1) = stpos - 0.5 + centerStrip;
1110  }
1111  }
1112 
1113  }
1114 
1115  float residual = -99;
1116  float pull = -99;
1117  // Fit all points except layer 3, then compare expected value for layer 3 to reconstructed value
1118  if (nRH == 6){
1119  float expected = fitX(sp,se);
1120  residual = expected - sp(3,1);
1121  pull = residual/se(3,1);
1122  }
1123 
1124  // Fill histos
1125  histos->fill1DHistByType(residual,"hSResid","Fitted Position on Strip - Reconstructed for Layer 3",id,100,-0.5,0.5,"Resolution");
1126  histos->fill1DHistByType(pull,"hSStripPosPull","Strip Measurement Pulls",id,100,-5.0,5.0,"Resolution");
1127  histos->fillProfile(chamberSerial(id),residual,"hSResidProfile","Fitted Position on Strip - Reconstructed for Layer 3",601,-0.5,600.5,-0.5,0.5,"Resolution");
1128  if (detailedAnalysis){
1129  histos->fill1DHistByChamber(residual,"hSResid","Fitted Position on Strip - Reconstructed for Layer 3",id,100,-0.5,0.5,"DetailedResolution");
1130  histos->fill1DHistByChamber(pull,"hSStripPosPull","Strip Measurement Pulls",id,100,-5.0,5.0,"Resolution");
1131  }
1132 
1133 
1134  }
1135 
1136 }
1137 
1138 // ==============================================
1139 //
1140 // look at Standalone Muons
1141 //
1142 // ==============================================
1143 
1145 
1146  int nSAMuons = saMuons->size();
1147  histos->fill1DHist(nSAMuons,"trNSAMuons","N Standalone Muons per Event",6,-0.5,5.5,"STAMuons");
1148 
1149  for(reco::TrackCollection::const_iterator muon = saMuons->begin(); muon != saMuons->end(); ++ muon ) {
1150  float preco = muon->p();
1151  float ptreco = muon->pt();
1152  int n = muon->recHitsSize();
1153  float chi2 = muon->chi2();
1154  float normchi2 = muon->normalizedChi2();
1155 
1156  // loop over hits
1157  int nDTHits = 0;
1158  int nCSCHits = 0;
1159  int nCSCHitsp = 0;
1160  int nCSCHitsm = 0;
1161  int nRPCHits = 0;
1162  int nRPCHitsp = 0;
1163  int nRPCHitsm = 0;
1164  int np = 0;
1165  int nm = 0;
1166  std::vector<CSCDetId> staChambers;
1167  for (trackingRecHit_iterator hit = muon->recHitsBegin(); hit != muon->recHitsEnd(); ++hit ) {
1168  const DetId detId( (*hit)->geographicalId() );
1169  if (detId.det() == DetId::Muon) {
1170  if (detId.subdetId() == MuonSubdetId::RPC) {
1171  RPCDetId rpcId(detId.rawId());
1172  nRPCHits++;
1173  if (rpcId.region() == 1){ nRPCHitsp++; np++;}
1174  if (rpcId.region() == -1){ nRPCHitsm++; nm++;}
1175  }
1176  if (detId.subdetId() == MuonSubdetId::DT) {
1177  nDTHits++;
1178  }
1179  else if (detId.subdetId() == MuonSubdetId::CSC) {
1180  CSCDetId cscId(detId.rawId());
1181  staChambers.push_back(detId.rawId());
1182  nCSCHits++;
1183  if (cscId.endcap() == 1){ nCSCHitsp++; np++;}
1184  if (cscId.endcap() == 2){ nCSCHitsm++; nm++;}
1185  }
1186  }
1187  }
1188 
1189  GlobalPoint innerPnt(muon->innerPosition().x(),muon->innerPosition().y(),muon->innerPosition().z());
1190  GlobalPoint outerPnt(muon->outerPosition().x(),muon->outerPosition().y(),muon->outerPosition().z());
1191  GlobalVector innerKin(muon->innerMomentum().x(),muon->innerMomentum().y(),muon->innerMomentum().z());
1192  GlobalVector outerKin(muon->outerMomentum().x(),muon->outerMomentum().y(),muon->outerMomentum().z());
1193  GlobalVector deltaPnt = innerPnt - outerPnt;
1194  double crudeLength = deltaPnt.mag();
1195  double deltaPhi = innerPnt.phi() - outerPnt.phi();
1196  double innerGlobalPolarAngle = innerKin.theta();
1197  double outerGlobalPolarAngle = outerKin.theta();
1198 
1199 
1200  // fill histograms
1201  histos->fill1DHist(n,"trN","N hits on a STA Muon Track",51,-0.5,50.5,"STAMuons");
1202  if (np != 0) histos->fill1DHist(np,"trNp","N hits on a STA Muon Track (plus endcap)",51,-0.5,50.5,"STAMuons");
1203  if (nm != 0) histos->fill1DHist(nm,"trNm","N hits on a STA Muon Track (minus endcap)",51,-0.5,50.5,"STAMuons");
1204  histos->fill1DHist(nDTHits,"trNDT","N DT hits on a STA Muon Track",51,-0.5,50.5,"STAMuons");
1205  histos->fill1DHist(nCSCHits,"trNCSC","N CSC hits on a STA Muon Track",51,-0.5,50.5,"STAMuons");
1206  if (nCSCHitsp != 0) histos->fill1DHist(nCSCHitsp,"trNCSCp","N CSC hits on a STA Muon Track (+ endcap)",51,-0.5,50.5,"STAMuons");
1207  if (nCSCHitsm != 0) histos->fill1DHist(nCSCHitsm,"trNCSCm","N CSC hits on a STA Muon Track (- endcap)",51,-0.5,50.5,"STAMuons");
1208  histos->fill1DHist(nRPCHits,"trNRPC","N RPC hits on a STA Muon Track",51,-0.5,50.5,"STAMuons");
1209  if (nRPCHitsp != 0) histos->fill1DHist(nRPCHitsp,"trNRPCp","N RPC hits on a STA Muon Track (+ endcap)",51,-0.5,50.5,"STAMuons");
1210  if (nRPCHitsm != 0) histos->fill1DHist(nRPCHitsm,"trNRPCm","N RPC hits on a STA Muon Track (- endcap)",51,-0.5,50.5,"STAMuons");
1211  histos->fill1DHist(preco,"trP","STA Muon Momentum",100,0,300,"STAMuons");
1212  histos->fill1DHist(ptreco,"trPT","STA Muon pT",100,0,40,"STAMuons");
1213  histos->fill1DHist(chi2,"trChi2","STA Muon Chi2",100,0,200,"STAMuons");
1214  histos->fill1DHist(normchi2,"trNormChi2","STA Muon Normalized Chi2",100,0,10,"STAMuons");
1215  histos->fill1DHist(crudeLength,"trLength","Straight Line Length of STA Muon",120,0.,2400.,"STAMuons");
1216  histos->fill1DHist(deltaPhi,"trDeltaPhi","Delta-Phi Between Inner and Outer STA Muon Pos.",100,-0.5,0.5,"STAMuons");
1217  histos->fill1DHist(innerGlobalPolarAngle,"trInnerPolar","Polar Angle of Inner P Vector (STA muons)",128,0,3.2,"STAMuons");
1218  histos->fill1DHist(outerGlobalPolarAngle,"trOuterPolar","Polar Angle of Outer P Vector (STA muons)",128,0,3.2,"STAMuons");
1219  histos->fill1DHist(innerPnt.phi(),"trInnerPhi","Phi of Inner Position (STA muons)",256,-3.2,3.2,"STAMuons");
1220  histos->fill1DHist(outerPnt.phi(),"trOuterPhi","Phi of Outer Position (STA muons)",256,-3.2,3.2,"STAMuons");
1221 
1222  }
1223 
1224 }
1225 
1226 
1227 //--------------------------------------------------------------
1228 // Compute a serial number for the chamber.
1229 // This is useful when filling histograms and working with arrays.
1230 //--------------------------------------------------------------
1232  int st = id.station();
1233  int ri = id.ring();
1234  int ch = id.chamber();
1235  int ec = id.endcap();
1236  int kSerial = ch;
1237  if (st == 1 && ri == 1) kSerial = ch;
1238  if (st == 1 && ri == 2) kSerial = ch + 36;
1239  if (st == 1 && ri == 3) kSerial = ch + 72;
1240  if (st == 1 && ri == 4) kSerial = ch;
1241  if (st == 2 && ri == 1) kSerial = ch + 108;
1242  if (st == 2 && ri == 2) kSerial = ch + 126;
1243  if (st == 3 && ri == 1) kSerial = ch + 162;
1244  if (st == 3 && ri == 2) kSerial = ch + 180;
1245  if (st == 4 && ri == 1) kSerial = ch + 216;
1246  if (st == 4 && ri == 2) kSerial = ch + 234; // one day...
1247  if (ec == 2) kSerial = kSerial + 300;
1248  return kSerial;
1249 }
1250 
1251 //--------------------------------------------------------------
1252 // Compute a serial number for the ring.
1253 // This is useful when filling histograms and working with arrays.
1254 //--------------------------------------------------------------
1256  int st = id.station();
1257  int ri = id.ring();
1258  int ec = id.endcap();
1259  int kSerial = 0 ;
1260  if (st == 1 && ri == 1) kSerial = ri;
1261  if (st == 1 && ri == 2) kSerial = ri ;
1262  if (st == 1 && ri == 3) kSerial = ri ;
1263  if (st == 1 && ri == 4) kSerial = 1;
1264  if (st == 2 ) kSerial = ri + 3;
1265  if (st == 3 ) kSerial = ri + 5;
1266  if (st == 4 ) kSerial = ri + 7;
1267  if (ec == 2) kSerial = kSerial * (-1);
1268  return kSerial;
1269 }
1270 
1271 //-------------------------------------------------------------------------------------
1272 // Fits a straight line to a set of 5 points with errors. Functions assumes 6 points
1273 // and removes hit in layer 3. It then returns the expected position value in layer 3
1274 // based on the fit.
1275 //-------------------------------------------------------------------------------------
1276 float CSCValidation::fitX(const CLHEP::HepMatrix& points, const CLHEP::HepMatrix& errors){
1277 
1278  float S = 0;
1279  float Sx = 0;
1280  float Sy = 0;
1281  float Sxx = 0;
1282  float Sxy = 0;
1283  float sigma2 = 0;
1284 
1285  for (int i=1;i<7;i++){
1286  if (i != 3){
1287  sigma2 = errors(i,1)*errors(i,1);
1288  S = S + (1/sigma2);
1289  Sy = Sy + (points(i,1)/sigma2);
1290  Sx = Sx + ((i)/sigma2);
1291  Sxx = Sxx + (i*i)/sigma2;
1292  Sxy = Sxy + (((i)*points(i,1))/sigma2);
1293  }
1294  }
1295 
1296  float delta = S*Sxx - Sx*Sx;
1297  float intercept = (Sxx*Sy - Sx*Sxy)/delta;
1298  float slope = (S*Sxy - Sx*Sy)/delta;
1299 
1300  //float chi = 0;
1301  //float chi2 = 0;
1302 
1303  // calculate chi2 (not currently used)
1304  //for (int i=1;i<7;i++){
1305  // chi = (points(i,1) - intercept - slope*i)/(errors(i,1));
1306  // chi2 = chi2 + chi*chi;
1307  //}
1308 
1309  return (intercept + slope*3);
1310 
1311 }
1312 
1313 
1314 //----------------------------------------------------------------------------
1315 // Calculate basic efficiencies for recHits and Segments
1316 // Author: S. Stoynev
1317 //----------------------------------------------------------------------------
1318 
1321  edm::ESHandle<CSCGeometry> cscGeom){
1322 
1323  bool allWires[2][4][4][36][6];
1324  bool allStrips[2][4][4][36][6];
1325  bool AllRecHits[2][4][4][36][6];
1326  bool AllSegments[2][4][4][36];
1327 
1328  //bool MultiSegments[2][4][4][36];
1329  for(int iE = 0;iE<2;iE++){
1330  for(int iS = 0;iS<4;iS++){
1331  for(int iR = 0; iR<4;iR++){
1332  for(int iC =0;iC<36;iC++){
1333  AllSegments[iE][iS][iR][iC] = false;
1334  //MultiSegments[iE][iS][iR][iC] = false;
1335  for(int iL=0;iL<6;iL++){
1336  allWires[iE][iS][iR][iC][iL] = false;
1337  allStrips[iE][iS][iR][iC][iL] = false;
1338  AllRecHits[iE][iS][iR][iC][iL] = false;
1339  }
1340  }
1341  }
1342  }
1343  }
1344 
1345  if (useDigis){
1346  // Wires
1347  for (CSCWireDigiCollection::DigiRangeIterator dWDiter=wires->begin(); dWDiter!=wires->end(); dWDiter++) {
1348  CSCDetId idrec = (CSCDetId)(*dWDiter).first;
1349  std::vector<CSCWireDigi>::const_iterator wireIter = (*dWDiter).second.first;
1350  std::vector<CSCWireDigi>::const_iterator lWire = (*dWDiter).second.second;
1351  for( ; wireIter != lWire; ++wireIter) {
1352  allWires[idrec.endcap() -1][idrec.station() -1][idrec.ring() -1][idrec.chamber() -1][idrec.layer() -1] = true;
1353  break;
1354  }
1355  }
1356 
1357  //---- STRIPS
1358  for (CSCStripDigiCollection::DigiRangeIterator dSDiter=strips->begin(); dSDiter!=strips->end(); dSDiter++) {
1359  CSCDetId idrec = (CSCDetId)(*dSDiter).first;
1360  std::vector<CSCStripDigi>::const_iterator stripIter = (*dSDiter).second.first;
1361  std::vector<CSCStripDigi>::const_iterator lStrip = (*dSDiter).second.second;
1362  for( ; stripIter != lStrip; ++stripIter) {
1363  std::vector<int> myADCVals = stripIter->getADCCounts();
1364  bool thisStripFired = false;
1365  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
1366  float threshold = 13.3 ;
1367  float diff = 0.;
1368  for (unsigned int iCount = 0; iCount < myADCVals.size(); iCount++) {
1369  diff = (float)myADCVals[iCount]-thisPedestal;
1370  if (diff > threshold) {
1371  thisStripFired = true;
1372  break;
1373  }
1374  }
1375  if(thisStripFired){
1376  allStrips[idrec.endcap() -1][idrec.station() -1][idrec.ring() -1][idrec.chamber() -1][idrec.layer() -1] = true;
1377  break;
1378  }
1379  }
1380  }
1381  }
1382 
1383  // Rechits
1384  for (CSCRecHit2DCollection::const_iterator recEffIt = recHits->begin(); recEffIt != recHits->end(); recEffIt++) {
1385  //CSCDetId idrec = (CSCDetId)(*recIt).cscDetId();
1386  CSCDetId idrec = (CSCDetId)(*recEffIt).cscDetId();
1387  AllRecHits[idrec.endcap() -1][idrec.station() -1][idrec.ring() -1][idrec.chamber() -1][idrec.layer() -1] = true;
1388 
1389  }
1390 
1391  std::vector <unsigned int> seg_ME2(2,0) ;
1392  std::vector <unsigned int> seg_ME3(2,0) ;
1393  std::vector < std::pair <CSCDetId, CSCSegment> > theSegments(4);
1394  // Segments
1395  for(CSCSegmentCollection::const_iterator segEffIt=cscSegments->begin(); segEffIt != cscSegments->end(); segEffIt++) {
1396  CSCDetId idseg = (CSCDetId)(*segEffIt).cscDetId();
1397  //if(AllSegments[idrec.endcap() -1][idrec.station() -1][idrec.ring() -1][idrec.chamber()]){
1398  //MultiSegments[idrec.endcap() -1][idrec.station() -1][idrec.ring() -1][idrec.chamber()] = true;
1399  //}
1400  AllSegments[idseg.endcap() -1][idseg.station() -1][idseg.ring() -1][idseg.chamber() -1] = true;
1401  // "Intrinsic" efficiency measurement relies on "good" segment extrapolation - we need the pre-selection below
1402  // station 2 "good" segment will be used for testing efficiencies in ME1 and ME3
1403  // station 3 "good" segment will be used for testing efficiencies in ME2 and ME4
1404  if(2==idseg.station() || 3==idseg.station()){
1405  unsigned int seg_tmp ;
1406  if(2==idseg.station()){
1407  ++seg_ME2[idseg.endcap() -1];
1408  seg_tmp = seg_ME2[idseg.endcap() -1];
1409  }
1410  else{
1411  ++seg_ME3[idseg.endcap() -1];
1412  seg_tmp = seg_ME3[idseg.endcap() -1];
1413  }
1414  // is the segment good
1415  if(1== seg_tmp&& 6==(*segEffIt).nRecHits() && (*segEffIt).chi2()/(*segEffIt).degreesOfFreedom()<3.){
1416  std::pair <CSCDetId, CSCSegment> specSeg = make_pair( (CSCDetId)(*segEffIt).cscDetId(),*segEffIt);
1417  theSegments[2*(idseg.endcap()-1)+(idseg.station() -2)] = specSeg;
1418  }
1419  }
1420  /*
1421  if(2==idseg.station()){
1422  ++seg_ME2[idseg.endcap() -1];
1423  if(1==seg_ME2[idseg.endcap() -1] && 6==(*segEffIt).nRecHits() && (*segEffIt).chi2()/(*segEffIt).degreesOfFreedom()<3.){
1424  std::pair <CSCDetId, CSCSegment> specSeg = make_pair( (CSCDetId)(*segEffIt).cscDetId(),*segEffIt);
1425  theSegments[2*(idseg.endcap()-1)+(idseg.station() -2)] = specSeg;
1426  }
1427  }
1428  else if(3==idseg.station()){
1429  ++seg_ME3[idseg.endcap() -1];
1430  if(1==seg_ME3[idseg.endcap() -1] && 6==(*segEffIt).nRecHits() && (*segEffIt).chi2()/(*segEffIt).degreesOfFreedom()<3.){
1431  std::pair <CSCDetId, CSCSegment> specSeg = make_pair( (CSCDetId)(*segEffIt).cscDetId(),*segEffIt);
1432  theSegments[2*(idseg.endcap()-1)+(idseg.station() -2)] = specSeg;
1433  }
1434  }
1435  */
1436 
1437  }
1438  // Simple efficiency calculations
1439  for(int iE = 0;iE<2;iE++){
1440  for(int iS = 0;iS<4;iS++){
1441  for(int iR = 0; iR<4;iR++){
1442  for(int iC =0;iC<36;iC++){
1443  int NumberOfLayers = 0;
1444  for(int iL=0;iL<6;iL++){
1445  if(AllRecHits[iE][iS][iR][iC][iL]){
1446  NumberOfLayers++;
1447  }
1448  }
1449  int bin = 0;
1450  if (iS==0) bin = iR+1+(iE*10);
1451  else bin = (iS+1)*2 + (iR+1) + (iE*10);
1452  if(NumberOfLayers>1){
1453  //if(!(MultiSegments[iE][iS][iR][iC])){
1454  if(AllSegments[iE][iS][iR][iC]){
1455  //---- Efficient segment evenents
1456  hSSTE->AddBinContent(bin);
1457  }
1458  //---- All segment events (normalization)
1459  hSSTE->AddBinContent(20+bin);
1460  //}
1461  }
1462  if(AllSegments[iE][iS][iR][iC]){
1463  if(NumberOfLayers==6){
1464  //---- Efficient rechit events
1465  hRHSTE->AddBinContent(bin);;
1466  }
1467  //---- All rechit events (normalization)
1468  hRHSTE->AddBinContent(20+bin);;
1469  }
1470  }
1471  }
1472  }
1473  }
1474 
1475 // pick a segment only if there are no others in the station
1476  std::vector < std::pair <CSCDetId, CSCSegment> * > theSeg;
1477  if(1==seg_ME2[0]) theSeg.push_back(&theSegments[0]);
1478  if(1==seg_ME3[0]) theSeg.push_back(&theSegments[1]);
1479  if(1==seg_ME2[1]) theSeg.push_back(&theSegments[2]);
1480  if(1==seg_ME3[1]) theSeg.push_back(&theSegments[3]);
1481 
1482  // Needed for plots
1483  // at the end the chamber types will be numbered as 1 to 18
1484  // (ME-4/1, -ME3/2, -ME3/1, ..., +ME3/1, +ME3/2, ME+4/1 )
1485  std::map <std::string, float> chamberTypes;
1486  chamberTypes["ME1/a"] = 0.5;
1487  chamberTypes["ME1/b"] = 1.5;
1488  chamberTypes["ME1/2"] = 2.5;
1489  chamberTypes["ME1/3"] = 3.5;
1490  chamberTypes["ME2/1"] = 4.5;
1491  chamberTypes["ME2/2"] = 5.5;
1492  chamberTypes["ME3/1"] = 6.5;
1493  chamberTypes["ME3/2"] = 7.5;
1494  chamberTypes["ME4/1"] = 8.5;
1495 
1496  if(!theSeg.empty()){
1497  std::map <int , GlobalPoint> extrapolatedPoint;
1498  std::map <int , GlobalPoint>::iterator it;
1499  const CSCGeometry::ChamberContainer& ChamberContainer = cscGeom->chambers();
1500  // Pick which chamber with which segment to test
1501  for(size_t nCh=0;nCh<ChamberContainer.size();nCh++){
1502  const CSCChamber *cscchamber = ChamberContainer[nCh];
1503  std::pair <CSCDetId, CSCSegment> * thisSegment = nullptr;
1504  for(size_t iSeg =0;iSeg<theSeg.size();++iSeg ){
1505  if(cscchamber->id().endcap() == theSeg[iSeg]->first.endcap()){
1506  if(1==cscchamber->id().station() || 3==cscchamber->id().station() ){
1507  if(2==theSeg[iSeg]->first.station()){
1508  thisSegment = theSeg[iSeg];
1509  }
1510  }
1511  else if (2==cscchamber->id().station() || 4==cscchamber->id().station()){
1512  if(3==theSeg[iSeg]->first.station()){
1513  thisSegment = theSeg[iSeg];
1514  }
1515  }
1516  }
1517  }
1518  // this chamber is to be tested with thisSegment
1519  if(thisSegment){
1520  CSCSegment * seg = &(thisSegment->second);
1521  const CSCChamber *segChamber = cscGeom->chamber(thisSegment->first);
1522  LocalPoint localCenter(0.,0.,0);
1523  GlobalPoint cscchamberCenter = cscchamber->toGlobal(localCenter);
1524  // try to save some time (extrapolate a segment to a certain position only once)
1525  it = extrapolatedPoint.find(int(cscchamberCenter.z()));
1526  if(it==extrapolatedPoint.end()){
1527  GlobalPoint segPos = segChamber->toGlobal(seg->localPosition());
1528  GlobalVector segDir = segChamber->toGlobal(seg->localDirection());
1529  double paramaterLine = lineParametrization(segPos.z(),cscchamberCenter.z() , segDir.z());
1530  double xExtrapolated = extrapolate1D(segPos.x(),segDir.x(), paramaterLine);
1531  double yExtrapolated = extrapolate1D(segPos.y(),segDir.y(), paramaterLine);
1532  GlobalPoint globP (xExtrapolated, yExtrapolated, cscchamberCenter.z());
1533  extrapolatedPoint[int(cscchamberCenter.z())] = globP;
1534  }
1535  // Where does the extrapolated point lie in the (tested) chamber local frame? Here:
1536  LocalPoint extrapolatedPointLocal = cscchamber->toLocal(extrapolatedPoint[int(cscchamberCenter.z())]);
1537  const CSCLayer *layer_p = cscchamber->layer(1);//layer 1
1538  const CSCLayerGeometry *layerGeom = layer_p->geometry ();
1539  const std::array<const float, 4> & layerBounds = layerGeom->parameters ();
1540  float shiftFromEdge = 15.;//cm
1541  float shiftFromDeadZone = 10.;
1542  // is the extrapolated point within a sensitive region
1543  bool pass = withinSensitiveRegion(extrapolatedPointLocal, layerBounds,
1544  cscchamber->id().station(), cscchamber->id().ring(),
1545  shiftFromEdge, shiftFromDeadZone);
1546  if(pass){// the extrapolation point of the segment lies within sensitive region of that chamber
1547  // how many rechit layers are there in the chamber?
1548  // 0 - maybe the muon died or is deflected at large angle? do not use that case
1549  // 1 - could be noise...
1550  // 2 or more - this is promissing; this is our definition of a reliable signal; use it below
1551  // is other definition better?
1552  int nRHLayers = 0;
1553  for(int iL =0;iL<6;++iL){
1554  if(AllRecHits[cscchamber->id().endcap()-1]
1555  [cscchamber->id().station()-1]
1556  [cscchamber->id().ring()-1][cscchamber->id().chamber()-1][iL]){
1557  ++nRHLayers;
1558  }
1559  }
1560  //std::cout<<" nRHLayers = "<<nRHLayers<<std::endl;
1561  float verticalScale = chamberTypes[cscchamber->specs()->chamberTypeName()];
1562  if(cscchamberCenter.z()<0){
1563  verticalScale = - verticalScale;
1564  }
1565  verticalScale +=9.5;
1566  hSensitiveAreaEvt->Fill(float(cscchamber->id().chamber()),verticalScale);
1567  if(nRHLayers>1){// this chamber contains a reliable signal
1568  //chamberTypes[cscchamber->specs()->chamberTypeName()];
1569  // "intrinsic" efficiencies
1570  //std::cout<<" verticalScale = "<<verticalScale<<" chType = "<<cscchamber->specs()->chamberTypeName()<<std::endl;
1571  // this is the denominator forr all efficiencies
1572  hEffDenominator->Fill(float(cscchamber->id().chamber()),verticalScale);
1573  // Segment efficiency
1574  if(AllSegments[cscchamber->id().endcap()-1]
1575  [cscchamber->id().station()-1]
1576  [cscchamber->id().ring()-1][cscchamber->id().chamber()-1]){
1577  hSSTE2->Fill(float(cscchamber->id().chamber()),float(verticalScale));
1578  }
1579 
1580  for(int iL =0;iL<6;++iL){
1581  float weight = 1./6.;
1582  // one shold account for the weight in the efficiency...
1583  // Rechit efficiency
1584  if(AllRecHits[cscchamber->id().endcap()-1]
1585  [cscchamber->id().station()-1]
1586  [cscchamber->id().ring()-1][cscchamber->id().chamber()-1][iL]){
1587  hRHSTE2->Fill(float(cscchamber->id().chamber()),float(verticalScale),weight);
1588  }
1589  if (useDigis){
1590  // Wire efficiency
1591  if(allWires[cscchamber->id().endcap()-1]
1592  [cscchamber->id().station()-1]
1593  [cscchamber->id().ring()-1][cscchamber->id().chamber()-1][iL]){
1594  // one shold account for the weight in the efficiency...
1595  hWireSTE2->Fill(float(cscchamber->id().chamber()),float(verticalScale),weight);
1596  }
1597  // Strip efficiency
1598  if(allStrips[cscchamber->id().endcap()-1]
1599  [cscchamber->id().station()-1]
1600  [cscchamber->id().ring()-1][cscchamber->id().chamber()-1][iL]){
1601  // one shold account for the weight in the efficiency...
1602  hStripSTE2->Fill(float(cscchamber->id().chamber()),float(verticalScale),weight);
1603  }
1604  }
1605  }
1606  }
1607  }
1608  }
1609  }
1610  }
1611  //
1612 
1613 
1614 }
1615 
1616 void CSCValidation::getEfficiency(float bin, float Norm, std::vector<float> &eff){
1617  //---- Efficiency with binomial error
1618  float Efficiency = 0.;
1619  float EffError = 0.;
1620  if(fabs(Norm)>0.000000001){
1621  Efficiency = bin/Norm;
1622  if(bin<Norm){
1623  EffError = sqrt( (1.-Efficiency)*Efficiency/Norm );
1624  }
1625  }
1626  eff[0] = Efficiency;
1627  eff[1] = EffError;
1628 }
1629 
1630 void CSCValidation::histoEfficiency(TH1F *readHisto, TH1F *writeHisto){
1631  std::vector<float> eff(2);
1632  int Nbins = readHisto->GetSize()-2;//without underflows and overflows
1633  std::vector<float> bins(Nbins);
1634  std::vector<float> Efficiency(Nbins);
1635  std::vector<float> EffError(Nbins);
1636  float Num = 1;
1637  float Den = 1;
1638  for (int i=0;i<20;i++){
1639  Num = readHisto->GetBinContent(i+1);
1640  Den = readHisto->GetBinContent(i+21);
1641  getEfficiency(Num, Den, eff);
1642  Efficiency[i] = eff[0];
1643  EffError[i] = eff[1];
1644  writeHisto->SetBinContent(i+1, Efficiency[i]);
1645  writeHisto->SetBinError(i+1, EffError[i]);
1646  }
1647 }
1648 
1649 bool CSCValidation::withinSensitiveRegion(LocalPoint localPos, const std::array<const float, 4> & layerBounds, int station, int ring, float shiftFromEdge, float shiftFromDeadZone){
1650 //---- check if it is in a good local region (sensitive area - geometrical and HV boundaries excluded)
1651  bool pass = false;
1652 
1653  float y_center = 0.;
1654  double yUp = layerBounds[3] + y_center;
1655  double yDown = - layerBounds[3] + y_center;
1656  double xBound1Shifted = layerBounds[0] - shiftFromEdge;//
1657  double xBound2Shifted = layerBounds[1] - shiftFromEdge;//
1658  double lineSlope = (yUp - yDown)/(xBound2Shifted-xBound1Shifted);
1659  double lineConst = yUp - lineSlope*xBound2Shifted;
1660  double yBorder = lineSlope*abs(localPos.x()) + lineConst;
1661 
1662  //bool withinChamberOnly = false;// false = "good region"; true - boundaries only
1663  std::vector <float> deadZoneCenter(6);
1664  float cutZone = shiftFromDeadZone;//cm
1665  //---- hardcoded... not good
1666  if(station>1 && station<5){
1667  if(2==ring){
1668  deadZoneCenter[0]= -162.48 ;
1669  deadZoneCenter[1] = -81.8744;
1670  deadZoneCenter[2] = -21.18165;
1671  deadZoneCenter[3] = 39.51105;
1672  deadZoneCenter[4] = 100.2939;
1673  deadZoneCenter[5] = 160.58;
1674 
1675  if(localPos.y() >yBorder &&
1676  ((localPos.y()> deadZoneCenter[0] + cutZone && localPos.y()< deadZoneCenter[1] - cutZone) ||
1677  (localPos.y()> deadZoneCenter[1] + cutZone && localPos.y()< deadZoneCenter[2] - cutZone) ||
1678  (localPos.y()> deadZoneCenter[2] + cutZone && localPos.y()< deadZoneCenter[3] - cutZone) ||
1679  (localPos.y()> deadZoneCenter[3] + cutZone && localPos.y()< deadZoneCenter[4] - cutZone) ||
1680  (localPos.y()> deadZoneCenter[4] + cutZone && localPos.y()< deadZoneCenter[5] - cutZone))){
1681  pass = true;
1682  }
1683  }
1684  else if(1==ring){
1685  if(2==station){
1686  deadZoneCenter[0]= -95.80 ;
1687  deadZoneCenter[1] = -27.47;
1688  deadZoneCenter[2] = 33.67;
1689  deadZoneCenter[3] = 90.85;
1690  }
1691  else if(3==station){
1692  deadZoneCenter[0]= -89.305 ;
1693  deadZoneCenter[1] = -39.705;
1694  deadZoneCenter[2] = 20.195;
1695  deadZoneCenter[3] = 77.395;
1696  }
1697  else if(4==station){
1698  deadZoneCenter[0]= -75.645;
1699  deadZoneCenter[1] = -26.055;
1700  deadZoneCenter[2] = 23.855;
1701  deadZoneCenter[3] = 70.575;
1702  }
1703  if(localPos.y() >yBorder &&
1704  ((localPos.y()> deadZoneCenter[0] + cutZone && localPos.y()< deadZoneCenter[1] - cutZone) ||
1705  (localPos.y()> deadZoneCenter[1] + cutZone && localPos.y()< deadZoneCenter[2] - cutZone) ||
1706  (localPos.y()> deadZoneCenter[2] + cutZone && localPos.y()< deadZoneCenter[3] - cutZone))){
1707  pass = true;
1708  }
1709  }
1710  }
1711  else if(1==station){
1712  if(3==ring){
1713  deadZoneCenter[0]= -83.155 ;
1714  deadZoneCenter[1] = -22.7401;
1715  deadZoneCenter[2] = 27.86665;
1716  deadZoneCenter[3] = 81.005;
1717  if(localPos.y() > yBorder &&
1718  ((localPos.y()> deadZoneCenter[0] + cutZone && localPos.y()< deadZoneCenter[1] - cutZone) ||
1719  (localPos.y()> deadZoneCenter[1] + cutZone && localPos.y()< deadZoneCenter[2] - cutZone) ||
1720  (localPos.y()> deadZoneCenter[2] + cutZone && localPos.y()< deadZoneCenter[3] - cutZone))){
1721  pass = true;
1722  }
1723  }
1724  else if(2==ring){
1725  deadZoneCenter[0]= -86.285 ;
1726  deadZoneCenter[1] = -32.88305;
1727  deadZoneCenter[2] = 32.867423;
1728  deadZoneCenter[3] = 88.205;
1729  if(localPos.y() > (yBorder) &&
1730  ((localPos.y()> deadZoneCenter[0] + cutZone && localPos.y()< deadZoneCenter[1] - cutZone) ||
1731  (localPos.y()> deadZoneCenter[1] + cutZone && localPos.y()< deadZoneCenter[2] - cutZone) ||
1732  (localPos.y()> deadZoneCenter[2] + cutZone && localPos.y()< deadZoneCenter[3] - cutZone))){
1733  pass = true;
1734  }
1735  }
1736  else{
1737  deadZoneCenter[0]= -81.0;
1738  deadZoneCenter[1] = 81.0;
1739  if(localPos.y() > (yBorder) &&
1740  (localPos.y()> deadZoneCenter[0] + cutZone && localPos.y()< deadZoneCenter[1] - cutZone )){
1741  pass = true;
1742  }
1743  }
1744  }
1745  return pass;
1746 }
1747 
1748 
1749 
1750 //---------------------------------------------------------------------------------------
1751 // Given a set of digis, the CSCDetId, and the central strip of your choosing, returns
1752 // the avg. Signal-Pedestal for 6 time bin x 5 strip .
1753 //
1754 // Author: P. Jindal
1755 //---------------------------------------------------------------------------------------
1756 
1757 float CSCValidation::getSignal(const CSCStripDigiCollection& stripdigis, CSCDetId idCS, int centerStrip){
1758 
1759  float SigADC[5];
1760  float TotalADC = 0;
1761  SigADC[0] = 0;
1762  SigADC[1] = 0;
1763  SigADC[2] = 0;
1764  SigADC[3] = 0;
1765  SigADC[4] = 0;
1766 
1767 
1768  // Loop over strip digis
1770 
1771  for (sIt = stripdigis.begin(); sIt != stripdigis.end(); sIt++){
1772  CSCDetId id = (CSCDetId)(*sIt).first;
1773  if (id == idCS){
1774 
1775  // First, find the Signal-Pedestal for center strip
1776  std::vector<CSCStripDigi>::const_iterator digiItr = (*sIt).second.first;
1777  std::vector<CSCStripDigi>::const_iterator last = (*sIt).second.second;
1778  for ( ; digiItr != last; ++digiItr ) {
1779  int thisStrip = digiItr->getStrip();
1780  if (thisStrip == (centerStrip)){
1781  std::vector<int> myADCVals = digiItr->getADCCounts();
1782  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
1783  float thisSignal = (myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
1784  SigADC[0] = thisSignal - 6*thisPedestal;
1785  }
1786  // Now,find the Signal-Pedestal for neighbouring 4 strips
1787  if (thisStrip == (centerStrip+1)){
1788  std::vector<int> myADCVals = digiItr->getADCCounts();
1789  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
1790  float thisSignal = (myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
1791  SigADC[1] = thisSignal - 6*thisPedestal;
1792  }
1793  if (thisStrip == (centerStrip+2)){
1794  std::vector<int> myADCVals = digiItr->getADCCounts();
1795  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
1796  float thisSignal = (myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
1797  SigADC[2] = thisSignal - 6*thisPedestal;
1798  }
1799  if (thisStrip == (centerStrip-1)){
1800  std::vector<int> myADCVals = digiItr->getADCCounts();
1801  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
1802  float thisSignal = (myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
1803  SigADC[3] = thisSignal - 6*thisPedestal;
1804  }
1805  if (thisStrip == (centerStrip-2)){
1806  std::vector<int> myADCVals = digiItr->getADCCounts();
1807  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
1808  float thisSignal = (myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
1809  SigADC[4] = thisSignal - 6*thisPedestal;
1810  }
1811  }
1812  TotalADC = 0.2*(SigADC[0]+SigADC[1]+SigADC[2]+SigADC[3]+SigADC[4]);
1813  }
1814  }
1815  return TotalADC;
1816 }
1817 
1818 //---------------------------------------------------------------------------------------
1819 // Look at non-associated recHits
1820 // Author: P. Jindal
1821 //---------------------------------------------------------------------------------------
1822 
1825 
1827  for (recIt = recHits->begin(); recIt != recHits->end(); recIt++) {
1828 
1829  CSCDetId idrec = (CSCDetId)(*recIt).cscDetId();
1830 
1831  //Store the Rechits into a Map
1832  AllRechits.insert(std::pair<CSCDetId , CSCRecHit2D>(idrec,*recIt));
1833 
1834  // Find the strip containing this hit
1835  int centerid = recIt->nStrips()/2;
1836  int centerStrip = recIt->channels(centerid);
1837 
1838  float rHsignal = getthisSignal(*strips, idrec, centerStrip);
1839  histos->fill1DHist(rHsignal,"hrHSignal", "Signal in the 4th time bin for centre strip",1100,-99,1000,"recHits");
1840 
1841  }
1842 
1843  for(CSCSegmentCollection::const_iterator it=cscSegments->begin(); it != cscSegments->end(); it++) {
1844 
1845  std::vector<CSCRecHit2D> theseRecHits = (*it).specificRecHits();
1846  for ( std::vector<CSCRecHit2D>::const_iterator iRH = theseRecHits.begin(); iRH != theseRecHits.end(); iRH++) {
1847  CSCDetId idRH = (CSCDetId)(*iRH).cscDetId();
1848  LocalPoint lpRH = (*iRH).localPosition();
1849  float xrec = lpRH.x();
1850  float yrec = lpRH.y();
1851  float zrec = lpRH.z();
1852  bool RHalreadyinMap = false;
1853  //Store the rechits associated with segments into a Map
1854  multimap<CSCDetId , CSCRecHit2D>::iterator segRHit;
1855  segRHit = SegRechits.find(idRH);
1856  if (segRHit != SegRechits.end()){
1857  for( ; segRHit != SegRechits.upper_bound(idRH); ++segRHit){
1858  //for( segRHit = SegRechits.begin(); segRHit != SegRechits.end() ;++segRHit){
1859  LocalPoint lposRH = (segRHit->second).localPosition();
1860  float xpos = lposRH.x();
1861  float ypos = lposRH.y();
1862  float zpos = lposRH.z();
1863  if ( xrec == xpos && yrec == ypos && zrec == zpos){
1864  RHalreadyinMap = true;
1865  //std::cout << " Already exists " <<std ::endl;
1866  break;}
1867  }
1868  }
1869  if(!RHalreadyinMap){ SegRechits.insert(std::pair<CSCDetId , CSCRecHit2D>(idRH,*iRH));}
1870  }
1871  }
1872 
1873  findNonAssociatedRecHits(cscGeom,strips);
1874 
1875 }
1876 
1877 //---------------------------------------------------------------------------------------
1878 // Given the list of all rechits and the rechits on a segment finds the rechits
1879 // not associated to a segment and stores in a list
1880 //
1881 //---------------------------------------------------------------------------------------
1882 
1884 
1885  for(std::multimap<CSCDetId , CSCRecHit2D>::iterator allRHiter = AllRechits.begin();allRHiter != AllRechits.end(); ++allRHiter){
1886  CSCDetId idRH = allRHiter->first;
1887  LocalPoint lpRH = (allRHiter->second).localPosition();
1888  float xrec = lpRH.x();
1889  float yrec = lpRH.y();
1890  float zrec = lpRH.z();
1891 
1892  bool foundmatch = false;
1893  multimap<CSCDetId , CSCRecHit2D>::iterator segRHit;
1894  segRHit = SegRechits.find(idRH);
1895  if (segRHit != SegRechits.end()){
1896  for( ; segRHit != SegRechits.upper_bound(idRH); ++segRHit){
1897 
1898  LocalPoint lposRH = (segRHit->second).localPosition();
1899  float xpos = lposRH.x();
1900  float ypos = lposRH.y();
1901  float zpos = lposRH.z();
1902 
1903  if ( xrec == xpos && yrec == ypos && zrec == zpos){
1904  foundmatch = true;}
1905 
1906  float d = 0.;
1907  float dclose =1000.;
1908 
1909  if ( !foundmatch) {
1910 
1911  d = sqrt(pow(xrec-xpos,2)+pow(yrec-ypos,2)+pow(zrec-zpos,2));
1912  if (d < dclose) {
1913  dclose = d;
1914  if( distRHmap.find((allRHiter->second)) == distRHmap.end() ) { // entry for rechit does not yet exist, create one
1915  distRHmap.insert(make_pair(allRHiter->second,dclose) );
1916  }
1917  else {
1918  // we already have an entry for the detid.
1919  distRHmap.erase(allRHiter->second);
1920  distRHmap.insert(make_pair(allRHiter->second,dclose)); // fill rechits for the segment with the given detid
1921  }
1922  }
1923  }
1924  }
1925  }
1926  if(!foundmatch){NonAssociatedRechits.insert(std::pair<CSCDetId , CSCRecHit2D>(idRH,allRHiter->second));}
1927  }
1928 
1929  for(std::map<CSCRecHit2D,float,ltrh>::iterator iter = distRHmap.begin();iter != distRHmap.end(); ++iter){
1930  histos->fill1DHist(iter->second,"hdistRH","Distance of Non Associated RecHit from closest Segment RecHit",500,0.,100.,"NonAssociatedRechits");
1931  }
1932 
1933  for(std::multimap<CSCDetId , CSCRecHit2D>::iterator iter = NonAssociatedRechits.begin();iter != NonAssociatedRechits.end(); ++iter){
1934  CSCDetId idrec = iter->first;
1935  int kEndcap = idrec.endcap();
1936  int cEndcap = idrec.endcap();
1937  if (kEndcap == 2)cEndcap = -1;
1938  int kRing = idrec.ring();
1939  int kStation = idrec.station();
1940  int kChamber = idrec.chamber();
1941  int kLayer = idrec.layer();
1942 
1943  // Store rechit as a Local Point:
1944  LocalPoint rhitlocal = (iter->second).localPosition();
1945  float xreco = rhitlocal.x();
1946  float yreco = rhitlocal.y();
1947 
1948  // Find the strip containing this hit
1949  int centerid = (iter->second).nStrips()/2;
1950  int centerStrip = (iter->second).channels(centerid);
1951 
1952  // Find the charge associated with this hit
1953  float rHSumQ = 0;
1954  float sumsides=0.;
1955  int adcsize=(iter->second).nStrips()*(iter->second).nTimeBins();
1956  for ( unsigned int i=0; i< (iter->second).nStrips(); i++) {
1957  for ( unsigned int j=0; j< (iter->second).nTimeBins()-1; j++) {
1958  rHSumQ+=(iter->second).adcs(i,j);
1959  if (i!=1) sumsides+=(iter->second).adcs(i,j);
1960  }
1961  }
1962 
1963  float rHratioQ = sumsides/rHSumQ;
1964  if (adcsize != 12) rHratioQ = -99;
1965 
1966  // Get the signal timing of this hit
1967  float rHtime = (iter->second).tpeak()/50;
1968 
1969  // Get the width of this hit
1970  int rHwidth = getWidth(*strips, idrec, centerStrip);
1971 
1972 
1973  // Get pointer to the layer:
1974  const CSCLayer* csclayer = cscGeom->layer( idrec );
1975 
1976  // Transform hit position from local chamber geometry to global CMS geom
1977  GlobalPoint rhitglobal= csclayer->toGlobal(rhitlocal);
1978  float grecx = rhitglobal.x();
1979  float grecy = rhitglobal.y();
1980 
1981 
1982 
1983  // Simple occupancy variables
1984  int kCodeBroad = cEndcap * ( 4*(kStation-1) + kRing) ;
1985  int kCodeNarrow = cEndcap * ( 100*(kRing-1) + kChamber) ;
1986 
1987  //Fill the non-associated rechits parameters in histogram
1988  histos->fill1DHist(kCodeBroad,"hNARHCodeBroad","broad scope code for recHits",33,-16.5,16.5,"NonAssociatedRechits");
1989  if (kStation == 1) histos->fill1DHist(kCodeNarrow,"hNARHCodeNarrow1","narrow scope recHit code station 1",801,-400.5,400.5,"NonAssociatedRechits");
1990  if (kStation == 2) histos->fill1DHist(kCodeNarrow,"hNARHCodeNarrow2","narrow scope recHit code station 2",801,-400.5,400.5,"NonAssociatedRechits");
1991  if (kStation == 3) histos->fill1DHist(kCodeNarrow,"hNARHCodeNarrow3","narrow scope recHit code station 3",801,-400.5,400.5,"NonAssociatedRechits");
1992  if (kStation == 4) histos->fill1DHist(kCodeNarrow,"hNARHCodeNarrow4","narrow scope recHit code station 4",801,-400.5,400.5,"NonAssociatedRechits");
1993  histos->fill1DHistByType(kLayer,"hNARHLayer","RecHits per Layer",idrec,8,-0.5,7.5,"NonAssociatedRechits");
1994  histos->fill1DHistByType(xreco,"hNARHX","Local X of recHit",idrec,160,-80.,80.,"NonAssociatedRechits");
1995  histos->fill1DHistByType(yreco,"hNARHY","Local Y of recHit",idrec,60,-180.,180.,"NonAssociatedRechits");
1996  if (kStation == 1 && (kRing == 1 || kRing == 4)) histos->fill1DHistByType(rHSumQ,"hNARHSumQ","Sum 3x3 recHit Charge",idrec,250,0,4000,"NonAssociatedRechits");
1997  else histos->fill1DHistByType(rHSumQ,"hNARHSumQ","Sum 3x3 recHit Charge",idrec,250,0,2000,"NonAssociatedRechits");
1998  histos->fill1DHistByType(rHratioQ,"hNARHRatioQ","Ratio (Ql+Qr)/Qt)",idrec,120,-0.1,1.1,"NonAssociatedRechits");
1999  histos->fill1DHistByType(rHtime,"hNARHTiming","recHit Timing",idrec,200,-10,10,"NonAssociatedRechits");
2000  histos->fill2DHistByStation(grecx,grecy,"hNARHGlobal","recHit Global Position",idrec,400,-800.,800.,400,-800.,800.,"NonAssociatedRechits");
2001  histos->fill1DHistByType(rHwidth,"hNARHwidth","width for Non associated recHit",idrec,21,-0.5,20.5,"NonAssociatedRechits");
2002 
2003  }
2004 
2005  for(std::multimap<CSCDetId , CSCRecHit2D>::iterator iter = SegRechits.begin();iter != SegRechits.end(); ++iter){
2006  CSCDetId idrec = iter->first;
2007  int kEndcap = idrec.endcap();
2008  int cEndcap = idrec.endcap();
2009  if (kEndcap == 2)cEndcap = -1;
2010  int kRing = idrec.ring();
2011  int kStation = idrec.station();
2012  int kChamber = idrec.chamber();
2013  int kLayer = idrec.layer();
2014 
2015  // Store rechit as a Local Point:
2016  LocalPoint rhitlocal = (iter->second).localPosition();
2017  float xreco = rhitlocal.x();
2018  float yreco = rhitlocal.y();
2019 
2020  // Find the strip containing this hit
2021  int centerid = (iter->second).nStrips()/2;
2022  int centerStrip = (iter->second).channels(centerid);
2023 
2024  // Find the charge associated with this hit
2025 
2026  float rHSumQ = 0;
2027  float sumsides=0.;
2028  int adcsize=(iter->second).nStrips()*(iter->second).nTimeBins();
2029  for ( unsigned int i=0; i< (iter->second).nStrips(); i++) {
2030  for ( unsigned int j=0; j< (iter->second).nTimeBins()-1; j++) {
2031  rHSumQ+=(iter->second).adcs(i,j);
2032  if (i!=1) sumsides+=(iter->second).adcs(i,j);
2033  }
2034  }
2035 
2036  float rHratioQ = sumsides/rHSumQ;
2037  if (adcsize != 12) rHratioQ = -99;
2038 
2039  // Get the signal timing of this hit
2040  float rHtime = (iter->second).tpeak()/50;
2041 
2042  // Get the width of this hit
2043  int rHwidth = getWidth(*strips, idrec, centerStrip);
2044 
2045 
2046  // Get pointer to the layer:
2047  const CSCLayer* csclayer = cscGeom->layer( idrec );
2048 
2049  // Transform hit position from local chamber geometry to global CMS geom
2050  GlobalPoint rhitglobal= csclayer->toGlobal(rhitlocal);
2051  float grecx = rhitglobal.x();
2052  float grecy = rhitglobal.y();
2053 
2054  // Simple occupancy variables
2055  int kCodeBroad = cEndcap * ( 4*(kStation-1) + kRing) ;
2056  int kCodeNarrow = cEndcap * ( 100*(kRing-1) + kChamber) ;
2057 
2058  //Fill the non-associated rechits global position in histogram
2059  histos->fill1DHist(kCodeBroad,"hSegRHCodeBroad","broad scope code for recHits",33,-16.5,16.5,"AssociatedRechits");
2060  if (kStation == 1) histos->fill1DHist(kCodeNarrow,"hSegRHCodeNarrow1","narrow scope recHit code station 1",801,-400.5,400.5,"AssociatedRechits");
2061  if (kStation == 2) histos->fill1DHist(kCodeNarrow,"hSegRHCodeNarrow2","narrow scope recHit code station 2",801,-400.5,400.5,"AssociatedRechits");
2062  if (kStation == 3) histos->fill1DHist(kCodeNarrow,"hSegRHCodeNarrow3","narrow scope recHit code station 3",801,-400.5,400.5,"AssociatedRechits");
2063  if (kStation == 4) histos->fill1DHist(kCodeNarrow,"hSegRHCodeNarrow4","narrow scope recHit code station 4",801,-400.5,400.5,"AssociatedRechits");
2064  histos->fill1DHistByType(kLayer,"hSegRHLayer","RecHits per Layer",idrec,8,-0.5,7.5,"AssociatedRechits");
2065  histos->fill1DHistByType(xreco,"hSegRHX","Local X of recHit",idrec,160,-80.,80.,"AssociatedRechits");
2066  histos->fill1DHistByType(yreco,"hSegRHY","Local Y of recHit",idrec,60,-180.,180.,"AssociatedRechits");
2067  if (kStation == 1 && (kRing == 1 || kRing == 4)) histos->fill1DHistByType(rHSumQ,"hSegRHSumQ","Sum 3x3 recHit Charge",idrec,250,0,4000,"AssociatedRechits");
2068  else histos->fill1DHistByType(rHSumQ,"hSegRHSumQ","Sum 3x3 recHit Charge",idrec,250,0,2000,"AssociatedRechits");
2069  histos->fill1DHistByType(rHratioQ,"hSegRHRatioQ","Ratio (Ql+Qr)/Qt)",idrec,120,-0.1,1.1,"AssociatedRechits");
2070  histos->fill1DHistByType(rHtime,"hSegRHTiming","recHit Timing",idrec,200,-10,10,"AssociatedRechits");
2071  histos->fill2DHistByStation(grecx,grecy,"hSegRHGlobal","recHit Global Position",idrec,400,-800.,800.,400,-800.,800.,"AssociatedRechits");
2072  histos->fill1DHistByType(rHwidth,"hSegRHwidth","width for Non associated recHit",idrec,21,-0.5,20.5,"AssociatedRechits");
2073 
2074  }
2075 
2076  distRHmap.clear();
2077  AllRechits.clear();
2078  SegRechits.clear();
2079  NonAssociatedRechits.clear();
2080 }
2081 
2082 
2083 
2084 float CSCValidation::getthisSignal(const CSCStripDigiCollection& stripdigis, CSCDetId idRH, int centerStrip){
2085  // Loop over strip digis responsible for this recHit
2087  float thisADC = 0.;
2088  //bool foundRHid = false;
2089  // std::cout<<"iD S/R/C/L = "<<idRH<<" "<<idRH.station()<<"/"<<idRH.ring()<<"/"<<idRH.chamber()<<"/"<<idRH.layer()<<std::endl;
2090  for (sIt = stripdigis.begin(); sIt != stripdigis.end(); sIt++){
2091  CSCDetId id = (CSCDetId)(*sIt).first;
2092  //std::cout<<"STRIPS: id S/R/C/L = "<<id<<" "<<id.station()<<"/"<<id.ring()<<"/"<<id.chamber()<<"/"<<id.layer()<<std::endl;
2093  if (id == idRH){
2094  //foundRHid = true;
2095  vector<CSCStripDigi>::const_iterator digiItr = (*sIt).second.first;
2096  vector<CSCStripDigi>::const_iterator last = (*sIt).second.second;
2097  //if(digiItr == last ) {std::cout << " Attention1 :: Size of digi collection is zero " << std::endl;}
2098  int St = idRH.station();
2099  int Rg = idRH.ring();
2100  if (St == 1 && Rg == 4){
2101  while(centerStrip> 16) centerStrip -= 16;
2102  }
2103  for ( ; digiItr != last; ++digiItr ) {
2104  int thisStrip = digiItr->getStrip();
2105  //std::cout<<" thisStrip = "<<thisStrip<<" centerStrip = "<<centerStrip<<std::endl;
2106  std::vector<int> myADCVals = digiItr->getADCCounts();
2107  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
2108  float Signal = (float) myADCVals[3];
2109  if (thisStrip == (centerStrip)){
2110  thisADC = Signal-thisPedestal;
2111  //if(thisADC >= 0. && thisADC <2.) {std::cout << " Attention2 :: The Signal is equal to the pedestal " << std::endl;
2112  //}
2113  //if(thisADC < 0.) {std::cout << " Attention3 :: The Signal is less than the pedestal " << std::endl;
2114  //}
2115  }
2116  if (thisStrip == (centerStrip+1)){
2117  std::vector<int> myADCVals = digiItr->getADCCounts();
2118  }
2119  if (thisStrip == (centerStrip-1)){
2120  std::vector<int> myADCVals = digiItr->getADCCounts();
2121  }
2122  }
2123  }
2124  }
2125  //if(!foundRHid){std::cout << " Attention4 :: Did not find a matching RH id in the Strip Digi collection " << std::endl;}
2126  return thisADC;
2127 }
2128 
2129 //---------------------------------------------------------------------------------------
2130 //
2131 // Function is meant to take the DetId and center strip number of a recHit and return
2132 // the width in terms of strips
2133 //---------------------------------------------------------------------------------------
2134 
2135 int CSCValidation::getWidth(const CSCStripDigiCollection& stripdigis, CSCDetId idRH, int centerStrip){
2136 
2137  int width = 1;
2138  int widthpos = 0;
2139  int widthneg = 0;
2140 
2141  // Loop over strip digis responsible for this recHit and sum charge
2143 
2144  for (sIt = stripdigis.begin(); sIt != stripdigis.end(); sIt++){
2145  CSCDetId id = (CSCDetId)(*sIt).first;
2146  if (id == idRH){
2147  std::vector<CSCStripDigi>::const_iterator digiItr = (*sIt).second.first;
2148  std::vector<CSCStripDigi>::const_iterator first = (*sIt).second.first;
2149  std::vector<CSCStripDigi>::const_iterator last = (*sIt).second.second;
2150  std::vector<CSCStripDigi>::const_iterator it = (*sIt).second.first;
2151  std::vector<CSCStripDigi>::const_iterator itr = (*sIt).second.first;
2152  //std::cout << " IDRH " << id <<std::endl;
2153  int St = idRH.station();
2154  int Rg = idRH.ring();
2155  if (St == 1 && Rg == 4){
2156  while(centerStrip> 16) centerStrip -= 16;
2157  }
2158  for ( ; digiItr != last; ++digiItr ) {
2159  int thisStrip = digiItr->getStrip();
2160  if (thisStrip == (centerStrip)){
2161  it = digiItr;
2162  for( ; it != last; ++it ) {
2163  int strip = it->getStrip();
2164  std::vector<int> myADCVals = it->getADCCounts();
2165  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
2166  if(((float)myADCVals[3]-thisPedestal) < 6 || widthpos == 10 || it==last){break;}
2167  if(strip != centerStrip){ widthpos += 1;
2168  }
2169  }
2170  itr = digiItr;
2171  for( ; itr != first; --itr) {
2172  int strip = itr->getStrip();
2173  std::vector<int> myADCVals = itr->getADCCounts();
2174  float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
2175  if(((float)myADCVals[3]-thisPedestal) < 6 || widthneg == 10 || itr==first){break;}
2176  if(strip != centerStrip) {widthneg += 1 ;
2177  }
2178  }
2179  }
2180  }
2181  }
2182  }
2183  //std::cout << "Widthneg - " << widthneg << "Widthpos + " << widthpos << std::endl;
2184  width = width + widthneg + widthpos ;
2185  //std::cout << "Width " << width << std::endl;
2186  return width;
2187 }
2188 
2189 
2190 //---------------------------------------------------------------------------
2191 // Module for looking at gas gains
2192 // Author N. Terentiev
2193 //---------------------------------------------------------------------------
2194 
2196  const CSCStripDigiCollection& strpcltn,
2197  const CSCRecHit2DCollection& rechitcltn) {
2198  int channel=0,mult,wire,layer,idlayer,idchamber,ring;
2199  int wire_strip_rechit_present;
2200  std::string name,title,endcapstr;
2201  ostringstream ss;
2202  CSCIndexer indexer;
2203  std::map<int,int>::iterator intIt;
2204 
2205  m_single_wire_layer.clear();
2206 
2207  if(firstEvent) {
2208 
2209  // HV segments, their # and location in terms of wire groups
2210 
2211  m_wire_hvsegm.clear();
2212  std::map<int,std::vector<int> >::iterator intvecIt;
2213  // ME1a ME1b ME1/2 ME1/3 ME2/1 ME2/2 ME3/1 ME3/2 ME4/1 ME4/2
2214  int csctype[10]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
2215  int hvsegm_layer[10]={1, 1, 3, 3, 3, 5, 3, 5, 3, 5};
2216  int id;
2217  nmbhvsegm.clear();
2218  for(int i=0;i<10;i++) nmbhvsegm.push_back(hvsegm_layer[i]);
2219  // For ME1/1a
2220  std::vector<int> zer_1_1a(49,0);
2221  id=csctype[0];
2222  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_1a;
2223  intvecIt=m_wire_hvsegm.find(id);
2224  for(int wire=1;wire<=48;wire++) intvecIt->second[wire]=1; // Segment 1
2225 
2226  // For ME1/1b
2227  std::vector<int> zer_1_1b(49,0);
2228  id=csctype[1];
2229  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_1b;
2230  intvecIt=m_wire_hvsegm.find(id);
2231  for(int wire=1;wire<=48;wire++) intvecIt->second[wire]=1; // Segment 1
2232 
2233  // For ME1/2
2234  std::vector<int> zer_1_2(65,0);
2235  id=csctype[2];
2236  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_2;
2237  intvecIt=m_wire_hvsegm.find(id);
2238  for(int wire=1;wire<=24;wire++) intvecIt->second[wire]=1; // Segment 1
2239  for(int wire=25;wire<=48;wire++) intvecIt->second[wire]=2; // Segment 2
2240  for(int wire=49;wire<=64;wire++) intvecIt->second[wire]=3; // Segment 3
2241 
2242  // For ME1/3
2243  std::vector<int> zer_1_3(33,0);
2244  id=csctype[3];
2245  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_3;
2246  intvecIt=m_wire_hvsegm.find(id);
2247  for(int wire=1;wire<=12;wire++) intvecIt->second[wire]=1; // Segment 1
2248  for(int wire=13;wire<=22;wire++) intvecIt->second[wire]=2; // Segment 2
2249  for(int wire=23;wire<=32;wire++) intvecIt->second[wire]=3; // Segment 3
2250 
2251  // For ME2/1
2252  std::vector<int> zer_2_1(113,0);
2253  id=csctype[4];
2254  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_2_1;
2255  intvecIt=m_wire_hvsegm.find(id);
2256  for(int wire=1;wire<=44;wire++) intvecIt->second[wire]=1; // Segment 1
2257  for(int wire=45;wire<=80;wire++) intvecIt->second[wire]=2; // Segment 2
2258  for(int wire=81;wire<=112;wire++) intvecIt->second[wire]=3; // Segment 3
2259 
2260  // For ME2/2
2261  std::vector<int> zer_2_2(65,0);
2262  id=csctype[5];
2263  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_2_2;
2264  intvecIt=m_wire_hvsegm.find(id);
2265  for(int wire=1;wire<=16;wire++) intvecIt->second[wire]=1; // Segment 1
2266  for(int wire=17;wire<=28;wire++) intvecIt->second[wire]=2; // Segment 2
2267  for(int wire=29;wire<=40;wire++) intvecIt->second[wire]=3; // Segment 3
2268  for(int wire=41;wire<=52;wire++) intvecIt->second[wire]=4; // Segment 4
2269  for(int wire=53;wire<=64;wire++) intvecIt->second[wire]=5; // Segment 5
2270 
2271  // For ME3/1
2272  std::vector<int> zer_3_1(97,0);
2273  id=csctype[6];
2274  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_3_1;
2275  intvecIt=m_wire_hvsegm.find(id);
2276  for(int wire=1;wire<=32;wire++) intvecIt->second[wire]=1; // Segment 1
2277  for(int wire=33;wire<=64;wire++) intvecIt->second[wire]=2; // Segment 2
2278  for(int wire=65;wire<=96;wire++) intvecIt->second[wire]=3; // Segment 3
2279 
2280  // For ME3/2
2281  std::vector<int> zer_3_2(65,0);
2282  id=csctype[7];
2283  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_3_2;
2284  intvecIt=m_wire_hvsegm.find(id);
2285  for(int wire=1;wire<=16;wire++) intvecIt->second[wire]=1; // Segment 1
2286  for(int wire=17;wire<=28;wire++) intvecIt->second[wire]=2; // Segment 2
2287  for(int wire=29;wire<=40;wire++) intvecIt->second[wire]=3; // Segment 3
2288  for(int wire=41;wire<=52;wire++) intvecIt->second[wire]=4; // Segment 4
2289  for(int wire=53;wire<=64;wire++) intvecIt->second[wire]=5; // Segment 5
2290 
2291  // For ME4/1
2292  std::vector<int> zer_4_1(97,0);
2293  id=csctype[8];
2294  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_4_1;
2295  intvecIt=m_wire_hvsegm.find(id);
2296  for(int wire=1;wire<=32;wire++) intvecIt->second[wire]=1; // Segment 1
2297  for(int wire=33;wire<=64;wire++) intvecIt->second[wire]=2; // Segment 2
2298  for(int wire=65;wire<=96;wire++) intvecIt->second[wire]=3; // Segment 3
2299 
2300  // For ME4/2
2301  std::vector<int> zer_4_2(65,0);
2302  id=csctype[9];
2303  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_4_2;
2304  intvecIt=m_wire_hvsegm.find(id);
2305  for(int wire=1;wire<=16;wire++) intvecIt->second[wire]=1; // Segment 1
2306  for(int wire=17;wire<=28;wire++) intvecIt->second[wire]=2; // Segment 2
2307  for(int wire=29;wire<=40;wire++) intvecIt->second[wire]=3; // Segment 3
2308  for(int wire=41;wire<=52;wire++) intvecIt->second[wire]=4; // Segment 4
2309  for(int wire=53;wire<=64;wire++) intvecIt->second[wire]=5; // Segment 5
2310 
2311  } // end of if(nEventsAnalyzed==1)
2312 
2313 
2314  // do wires, strips and rechits present?
2315  wire_strip_rechit_present=0;
2316  if(wirecltn.begin() != wirecltn.end())
2317  wire_strip_rechit_present= wire_strip_rechit_present+1;
2318  if(strpcltn.begin() != strpcltn.end())
2319  wire_strip_rechit_present= wire_strip_rechit_present+2;
2320  if(rechitcltn.begin() != rechitcltn.end())
2321  wire_strip_rechit_present= wire_strip_rechit_present+4;
2322 
2323  if(wire_strip_rechit_present==7) {
2324 
2325 // std::cout<<"Event "<<nEventsAnalyzed<<std::endl;
2326 // std::cout<<std::endl;
2327 
2328  // cycle on wire collection for all CSC to select single wire hit layers
2330 
2331  for(wiredetUnitIt=wirecltn.begin();wiredetUnitIt!=wirecltn.end();
2332  ++wiredetUnitIt) {
2333  const CSCDetId id = (*wiredetUnitIt).first;
2334  idlayer=indexer.dbIndex(id, channel);
2335  idchamber=idlayer/10;
2336  layer=id.layer();
2337  // looping in the layer of given CSC
2338  mult=0; wire=0;
2339  const CSCWireDigiCollection::Range& range = (*wiredetUnitIt).second;
2341  range.first; digiIt!=range.second; ++digiIt){
2342  wire=(*digiIt).getWireGroup();
2343  mult++;
2344  } // end of digis loop in layer
2345 
2346  // select layers with single wire hit
2347  if(mult==1) {
2348  if(m_single_wire_layer.find(idlayer) == m_single_wire_layer.end())
2349  m_single_wire_layer[idlayer]=wire;
2350  } // end of if(mult==1)
2351  } // end of cycle on detUnit
2352 
2353  // Looping thru rechit collection
2356 
2357  for(recIt = rechitcltn.begin(); recIt != rechitcltn.end(); ++recIt) {
2358  CSCDetId id = (CSCDetId)(*recIt).cscDetId();
2359  idlayer=indexer.dbIndex(id, channel);
2360  idchamber=idlayer/10;
2361  layer=id.layer();
2362  // select layer with single wire rechit
2363  if(m_single_wire_layer.find(idlayer) != m_single_wire_layer.end()) {
2364 
2365  if(recIt->nStrips()==3) {
2366  // get 3X3 ADC Sum
2367  unsigned int binmx=0;
2368  float adcmax=0.0;
2369 
2370  for(unsigned int i=0;i<recIt->nStrips();i++)
2371  for(unsigned int j=0;j<recIt->nTimeBins();j++)
2372  if(recIt->adcs(i,j)>adcmax) {
2373  adcmax=recIt->adcs(i,j);
2374  binmx=j;
2375  }
2376 
2377  float adc_3_3_sum=0.0;
2378  //well, this really only works for 3 strips in readout - not sure the right fix for general case
2379  for(unsigned int i=0;i<recIt->nStrips();i++)
2380  for(unsigned int j=binmx-1;j<=binmx+1;j++)
2381  adc_3_3_sum+=recIt->adcs(i,j);
2382 
2383 
2384  if(adc_3_3_sum > 0.0 && adc_3_3_sum < 2000.0) {
2385 
2386  // temporary fix for ME1/1a to avoid triple entries
2387  int flag=0;
2388  if(id.station()==1 && id.ring()==4 && recIt->channels(1)>16) flag=1;
2389  // end of temporary fix
2390  if(flag==0) {
2391 
2392  wire= m_single_wire_layer[idlayer];
2393  int chambertype=id.iChamberType(id.station(),id.ring());
2394  int hvsgmtnmb=m_wire_hvsegm[chambertype][wire];
2395  int nmbofhvsegm=nmbhvsegm[chambertype-1];
2396  int location= (layer-1)*nmbofhvsegm+hvsgmtnmb;
2397 
2398  ss<<"gas_gain_rechit_adc_3_3_sum_location_ME_"<<idchamber;
2399  name=ss.str(); ss.str("");
2400  if(id.endcap()==1) endcapstr = "+";
2401  ring=id.ring();
2402  if(id.station()==1 && id.ring()==4) ring=1;
2403  if(id.endcap()==2) endcapstr = "-";
2404  ss<<"Gas Gain Rechit ADC3X3 Sum ME"<<endcapstr<<
2405  id.station()<<"/"<<ring<<"/"<<id.chamber();
2406  title=ss.str(); ss.str("");
2407  float x=location;
2408  float y=adc_3_3_sum;
2409  histos->fill2DHist(x,y,name,title,30,1.0,31.0,50,0.0,2000.0,"GasGain");
2410 
2411  /*
2412  std::cout<<idchamber<<" "<<id.station()<<" "<<id.ring()<<" "
2413  <<id.chamber()<<" "<<layer<<" "<< wire<<" "<<m_strip[1]<<" "<<
2414  chambertype<<" "<< hvsgmtnmb<<" "<< nmbofhvsegm<<" "<<
2415  location<<" "<<adc_3_3_sum<<std::endl;
2416  */
2417  } // end of if flag==0
2418  } // end if(adcsum>0.0 && adcsum<2000.0)
2419  } // end of if if(m_strip.size()==3
2420  } // end of if single wire
2421  } // end of looping thru rechit collection
2422  } // end of if wire and strip and rechit present
2423 }
2424 
2425 //---------------------------------------------------------------------------
2426 // Module for looking at AFEB Timing
2427 // Author N. Terentiev
2428 //---------------------------------------------------------------------------
2429 
2431  ostringstream ss;
2432  std::string name,title,endcapstr;
2433  float x,y;
2434  int wire,wiretbin,nmbwiretbin,layer,afeb,idlayer,idchamber;
2435  int channel=0; // for CSCIndexer::dbIndex(id, channel); irrelevant here
2436  CSCIndexer indexer;
2437 
2438  if(wirecltn.begin() != wirecltn.end()) {
2439 
2440  //std::cout<<std::endl;
2441  //std::cout<<"Event "<<nEventsAnalyzed<<std::endl;
2442  //std::cout<<std::endl;
2443 
2444  // cycle on wire collection for all CSC
2446  for(wiredetUnitIt=wirecltn.begin();wiredetUnitIt!=wirecltn.end();
2447  ++wiredetUnitIt) {
2448  const CSCDetId id = (*wiredetUnitIt).first;
2449  idlayer=indexer.dbIndex(id, channel);
2450  idchamber=idlayer/10;
2451  layer=id.layer();
2452 
2453  if (id.endcap() == 1) endcapstr = "+";
2454  if (id.endcap() == 2) endcapstr = "-";
2455 
2456  // looping in the layer of given CSC
2457 
2458  const CSCWireDigiCollection::Range& range = (*wiredetUnitIt).second;
2460  range.first; digiIt!=range.second; ++digiIt){
2461  wire=(*digiIt).getWireGroup();
2462  wiretbin=(*digiIt).getTimeBin();
2463  nmbwiretbin=(*digiIt).getTimeBinsOn().size();
2464  afeb=3*((wire-1)/8)+(layer+1)/2;
2465 
2466  // Anode wire group time bin vs afeb for each CSC
2467  x=afeb;
2468  y=wiretbin;
2469  ss<<"afeb_time_bin_vs_afeb_occupancy_ME_"<<idchamber;
2470  name=ss.str(); ss.str("");
2471  ss<<"Time Bin vs AFEB Occupancy ME"<<endcapstr<<id.station()<<"/"<<id.ring()<<"/"<< id.chamber();
2472  title=ss.str(); ss.str("");
2473  histos->fill2DHist(x,y,name,title,42,1.,43.,16,0.,16.,"AFEBTiming");
2474 
2475  // Number of anode wire group time bin vs afeb for each CSC
2476  x=afeb;
2477  y=nmbwiretbin;
2478  ss<<"nmb_afeb_time_bins_vs_afeb_ME_"<<idchamber;
2479  name=ss.str(); ss.str("");
2480  ss<<"Number of Time Bins vs AFEB ME"<<endcapstr<<id.station()<<"/"<<id.ring()<<"/"<< id.chamber();
2481  title=ss.str();
2482  ss.str("");
2483  histos->fill2DHist(x,y,name,title,42,1.,43.,16,0.,16.,"AFEBTiming");
2484 
2485  } // end of digis loop in layer
2486  } // end of wire collection loop
2487  } // end of if(wirecltn.begin() != wirecltn.end())
2488 }
2489 
2490 //---------------------------------------------------------------------------
2491 // Module for looking at Comparitor Timing
2492 // Author N. Terentiev
2493 //---------------------------------------------------------------------------
2494 
2496 
2497  ostringstream ss; std::string name,title,endcap;
2498  float x,y;
2499  int strip,tbin,cfeb,idlayer,idchamber;
2500  int channel=0; // for CSCIndexer::dbIndex(id, channel); irrelevant here
2501  CSCIndexer indexer;
2502 
2503  if(compars.begin() != compars.end()) {
2504 
2505  //std::cout<<std::endl;
2506  //std::cout<<"Event "<<nEventsAnalyzed<<std::endl;
2507  //std::cout<<std::endl;
2508 
2509  // cycle on comparators collection for all CSC
2511  for(compdetUnitIt=compars.begin();compdetUnitIt!=compars.end();
2512  ++compdetUnitIt) {
2513  const CSCDetId id = (*compdetUnitIt).first;
2514  idlayer=indexer.dbIndex(id, channel); // channel irrelevant here
2515  idchamber=idlayer/10;
2516 
2517  if (id.endcap() == 1) endcap = "+";
2518  if (id.endcap() == 2) endcap = "-";
2519  // looping in the layer of given CSC
2520  const CSCComparatorDigiCollection::Range& range =
2521  (*compdetUnitIt).second;
2523  range.first; digiIt!=range.second; ++digiIt){
2524  strip=(*digiIt).getStrip();
2525  /*
2526  if(id.station()==1 && (id.ring()==1 || id.ring()==4))
2527  std::cout<<idchamber<<" "<<id.station()<<" "<<id.ring()<<" "
2528  <<strip <<std::endl;
2529  */
2530  indexer.dbIndex(id, strip); // strips 1-16 of ME1/1a
2531  // become strips 65-80 of ME1/1
2532  tbin=(*digiIt).getTimeBin();
2533  cfeb=(strip-1)/16+1;
2534 
2535  // time bin vs cfeb for each CSC
2536 
2537  x=cfeb;
2538  y=tbin;
2539  ss<<"comp_time_bin_vs_cfeb_occupancy_ME_"<<idchamber;
2540  name=ss.str(); ss.str("");
2541  ss<<"Comparator Time Bin vs CFEB Occupancy ME"<<endcap<<
2542  id.station()<<"/"<< id.ring()<<"/"<< id.chamber();
2543  title=ss.str(); ss.str("");
2544  histos->fill2DHist(x,y,name,title,5,1.,6.,16,0.,16.,"CompTiming");
2545 
2546  } // end of digis loop in layer
2547  } // end of collection loop
2548  } // end of if(compars.begin() !=compars.end())
2549 }
2550 
2551 //---------------------------------------------------------------------------
2552 // Module for looking at Strip Timing
2553 // Author N. Terentiev
2554 //---------------------------------------------------------------------------
2555 
2557  float adc_3_3_sum,adc_3_3_wtbin,x,y;
2558  int cfeb,idchamber,ring;
2559 
2560  std::string name,title,endcapstr;
2561  ostringstream ss;
2562  std::vector<float> zer(6,0.0);
2563 
2564  CSCIndexer indexer;
2565  std::map<int,int>::iterator intIt;
2566 
2567  if(rechitcltn.begin() != rechitcltn.end()) {
2568 
2569  // std::cout<<"Event "<<nEventsAnalyzed <<std::endl;
2570 
2571  // Looping thru rechit collection
2574  for(recIt = rechitcltn.begin(); recIt != rechitcltn.end(); ++recIt) {
2575  CSCDetId id = (CSCDetId)(*recIt).cscDetId();
2576  // getting strips comprising rechit
2577  if(recIt->nStrips()==3) {
2578  // get 3X3 ADC Sum
2579  // get 3X3 ADC Sum
2580  unsigned int binmx=0;
2581  float adcmax=0.0;
2582 
2583  for(unsigned int i=0;i<recIt->nStrips();i++)
2584  for(unsigned int j=0;j<recIt->nTimeBins();j++)
2585  if(recIt->adcs(i,j)>adcmax) {
2586  adcmax=recIt->adcs(i,j);
2587  binmx=j;
2588  }
2589 
2590  adc_3_3_sum=0.0;
2591  //well, this really only works for 3 strips in readout - not sure the right fix for general case
2592  for(unsigned int i=0;i<recIt->nStrips();i++)
2593  for(unsigned int j=binmx-1;j<=binmx+1;j++)
2594  adc_3_3_sum+=recIt->adcs(i,j);
2595 
2596 
2597  // ADC weighted time bin
2598  if(adc_3_3_sum > 100.0) {
2599 
2600 
2601  int centerStrip=recIt->channels(1); //take central from 3 strips;
2602  // temporary fix
2603  int flag=0;
2604  if(id.station()==1 && id.ring()==4 && centerStrip>16) flag=1;
2605  // end of temporary fix
2606  if(flag==0) {
2607  adc_3_3_wtbin=(*recIt).tpeak()/50; //getTiming(strpcltn, id, centerStrip);
2608  idchamber=indexer.dbIndex(id, centerStrip)/10; //strips 1-16 ME1/1a
2609  // become strips 65-80 ME1/1 !!!
2610  /*
2611  if(id.station()==1 && (id.ring()==1 || id.ring()==4))
2612  std::cout<<idchamber<<" "<<id.station()<<" "<<id.ring()<<" "<<m_strip[1]<<" "<<
2613  " "<<centerStrip<<
2614  " "<<adc_3_3_wtbin<<" "<<adc_3_3_sum<<std::endl;
2615  */
2616  ss<<"adc_3_3_weight_time_bin_vs_cfeb_occupancy_ME_"<<idchamber;
2617  name=ss.str(); ss.str("");
2618 
2619  std::string endcapstr;
2620  if(id.endcap() == 1) endcapstr = "+";
2621  if(id.endcap() == 2) endcapstr = "-";
2622  ring=id.ring(); if(id.ring()==4) ring=1;
2623  ss<<"ADC 3X3 Weighted Time Bin vs CFEB Occupancy ME"
2624  <<endcapstr<<id.station()<<"/"<<ring<<"/"<<id.chamber();
2625  title=ss.str(); ss.str("");
2626 
2627  cfeb=(centerStrip-1)/16+1;
2628  x=cfeb; y=adc_3_3_wtbin;
2629  histos->fill2DHist(x,y,name,title,5,1.,6.,80,-8.,8.,"ADCTiming");
2630  } // end of if flag==0
2631  } // end of if (adc_3_3_sum > 100.0)
2632  } // end of if if(m_strip.size()==3
2633  } // end of the pass thru CSCRecHit2DCollection
2634  } // end of if (rechitcltn.begin() != rechitcltn.end())
2635 }
2636 
2637 //---------------------------------------------------------------------------------------
2638 // Construct histograms for monitoring the trigger and offline timing
2639 // Author: A. Deisher
2640 //---------------------------------------------------------------------------------------
2641 
2646  const edm::EventSetup& eventSetup, const edm::Event &event){
2647 
2648  map<CSCDetId, float > segment_median_map; //structure for storing the median time for segments in a chamber
2649  map<CSCDetId, GlobalPoint > segment_position_map; //structure for storing the global position for segments in a chamber
2650 
2651  // -----------------------
2652  // loop over segments
2653  // -----------------------
2654  int iSegment = 0;
2655  for(CSCSegmentCollection::const_iterator dSiter=cscSegments->begin(); dSiter != cscSegments->end(); dSiter++) {
2656  iSegment++;
2657 
2658  CSCDetId id = (CSCDetId)(*dSiter).cscDetId();
2659  LocalPoint localPos = (*dSiter).localPosition();
2660  GlobalPoint globalPosition = GlobalPoint(0.0, 0.0, 0.0);
2661  const CSCChamber* cscchamber = cscGeom->chamber(id);
2662  if (cscchamber) {
2663  globalPosition = cscchamber->toGlobal(localPos);
2664  }
2665 
2666  // try to get the CSC recHits that contribute to this segment.
2667  std::vector<CSCRecHit2D> theseRecHits = (*dSiter).specificRecHits();
2668  int nRH = (*dSiter).nRecHits();
2669  if (nRH < 4 ) continue;
2670 
2671  //Store the recHit times of a segment in a vector for later sorting
2672  vector<float> non_zero;
2673 
2674  for ( vector<CSCRecHit2D>::const_iterator iRH = theseRecHits.begin(); iRH != theseRecHits.end(); iRH++) {
2675  non_zero.push_back( iRH->tpeak());
2676 
2677  }// end rechit loop
2678 
2679  //Sort the vector of hit times for this segment and average the center two
2680  sort(non_zero.begin(),non_zero.end());
2681  int middle_index = non_zero.size()/2;
2682  float average_two = (non_zero.at(middle_index-1) + non_zero.at(middle_index))/2.;
2683  if(non_zero.size()%2)
2684  average_two = non_zero.at(middle_index);
2685 
2686  //If we've vetoed events with multiple segments per chamber, this should never overwrite informations
2687  segment_median_map[id]=average_two;
2688  segment_position_map[id]=globalPosition;
2689 
2690  double distToIP = sqrt(globalPosition.x()*globalPosition.x()+globalPosition.y()*globalPosition.y()+globalPosition.z()*globalPosition.z());
2691 
2692  histos->fillProfile(chamberSerial(id),average_two,"timeChamber","Segment mean time",601,-0.5,600.5,-400.,400.,"TimeMonitoring");
2693  histos->fillProfileByType(id.chamber(),average_two,"timeChamberByType","Segment mean time by chamber",id,36,0.5,36.5,-400,400.,"TimeMonitoring");
2694  histos->fill2DHist(distToIP,average_two,"seg_time_vs_distToIP","Segment time vs. Distance to IP",80,600.,1400.,800,-400,400.,"TimeMonitoring");
2695  histos->fill2DHist(globalPosition.z(),average_two,"seg_time_vs_globZ","Segment time vs. z position",240,-1200,1200,800,-400.,400.,"TimeMonitoring");
2696  histos->fill2DHist(fabs(globalPosition.z()),average_two,"seg_time_vs_absglobZ","Segment time vs. abs(z position)",120,0.,1200.,800,-400.,400.,"TimeMonitoring");
2697 
2698  }//end segment loop
2699 
2700  //Now that the information for each segment we're interest in is stored, it is time to go through the pairs and make plots
2701  map<CSCDetId, float >::const_iterator it_outer; //for the outer loop
2702  map<CSCDetId, float >::const_iterator it_inner; //for the nested inner loop
2703  for (it_outer = segment_median_map.begin(); it_outer != segment_median_map.end(); it_outer++){
2704 
2705  CSCDetId id_outer = it_outer->first;
2706  float t_outer = it_outer->second;
2707 
2708  //begin the inner loop
2709  for (it_inner = segment_median_map.begin(); it_inner != segment_median_map.end(); it_inner++){
2710 
2711  CSCDetId id_inner = it_inner->first;
2712  float t_inner = it_inner->second;
2713 
2714  // we're looking at ordered pairs, so combinations will be double counted
2715  // (chamber a, chamber b) will be counted as well as (chamber b, chamber a)
2716  // We will avoid (chamber a, chamber a) with the following line
2717  if (chamberSerial(id_outer) == chamberSerial(id_inner)) continue;
2718 
2719  // Calculate expected TOF (in ns units)
2720  // GlobalPoint gp_outer = segment_position_map.find(id_outer)->second;
2721  // GlobalPoint gp_inner = segment_position_map.find(id_inner)->second;
2722  // GlobalVector flight = gp_outer - gp_inner; //in cm
2723  // float TOF = flight.mag()/30.0; //to ns
2724 
2725  //Plot t(ME+) - t(ME-) for chamber pairs in the same stations and rings but opposite endcaps
2726  if (id_outer.endcap() ==1 && id_inner.endcap() == 2 && id_outer.station() == id_inner.station() && id_outer.ring() == id_inner.ring() ){
2727  histos->fill1DHist(t_outer-t_inner,"diff_opposite_endcaps","#Delta t [ME+]-[ME-] for chambers in same station and ring",800,-400.,400.,"TimeMonitoring");
2728  histos->fill1DHistByType(t_outer-t_inner,"diff_opposite_endcaps_byType","#Delta t [ME+]-[ME-] for chambers in same station and ring",id_outer,800,-400.,400.,"TimeMonitoring");
2729  }
2730 
2731  }//end inner loop of segment pairs
2732  }//end outer loop of segment pairs
2733 
2734  //if the digis, return here
2735  if( !useDigis ) return;
2736 
2737  //looking for the global trigger number
2738  vector<L1MuGMTReadoutRecord> L1Mrec = pCollection->getRecords();
2739  vector<L1MuGMTReadoutRecord>::const_iterator igmtrr;
2740  int L1GMT_BXN = -100;
2741  bool has_CSCTrigger = false;
2742  bool has_beamHaloTrigger = false;
2743  for(igmtrr=L1Mrec.begin(); igmtrr!=L1Mrec.end(); igmtrr++) {
2744  std::vector<L1MuRegionalCand>::const_iterator iter1;
2745  std::vector<L1MuRegionalCand> rmc;
2746  // CSC
2747  int icsc = 0;
2748  rmc = igmtrr->getCSCCands();
2749  for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
2750  if ( !(*iter1).empty() ) {
2751  icsc++;
2752  int kQuality = (*iter1).quality(); // kQuality = 1 means beam halo
2753  if (kQuality == 1) has_beamHaloTrigger = true;
2754  }
2755  }
2756  if (igmtrr->getBxInEvent() == 0 && icsc>0){
2757  //printf("L1 CSCCands exist. L1MuGMTReadoutRecord BXN = %d \n", igmtrr->getBxNr());
2758  L1GMT_BXN = igmtrr->getBxNr();
2759  has_CSCTrigger = true;
2760  }
2761  else if (igmtrr->getBxInEvent() == 0 ) {
2762  //printf("L1 CSCCands do not exist. L1MuGMTReadoutRecord BXN = %d \n", igmtrr->getBxNr());
2763  L1GMT_BXN = igmtrr->getBxNr();
2764  }
2765  }
2766 
2767  // *************************************************
2768  // *** ALCT Digis **********************************
2769  // *************************************************
2770 
2771  int n_alcts = 0;
2772  map<CSCDetId, int > ALCT_KeyWG_map; //structure for storing the key wire group for the first ALCT for each chamber
2773  for (CSCALCTDigiCollection::DigiRangeIterator j=alcts->begin(); j!=alcts->end(); j++) {
2774  const CSCALCTDigiCollection::Range& range =(*j).second;
2775  const CSCDetId& idALCT = (*j).first;
2776  for (CSCALCTDigiCollection::const_iterator digiIt = range.first; digiIt!=range.second; ++digiIt){
2777  // Valid digi in the chamber (or in neighbouring chamber)
2778  if((*digiIt).isValid()){
2779  n_alcts++;
2780  histos->fill1DHist( (*digiIt).getBX(), "ALCT_getBX","ALCT.getBX()",11,-0.5,10.5,"TimeMonitoring");
2781  histos->fill1DHist( (*digiIt).getFullBX(), "ALCT_getFullBX","ALCT.getFullBX()",3601,-0.5,3600.5,"TimeMonitoring");
2782  //if we don't already have digi information stored for this chamber, then we fill it
2783  if (ALCT_KeyWG_map.find(idALCT.chamberId()) == ALCT_KeyWG_map.end()){
2784  ALCT_KeyWG_map[idALCT.chamberId()] = (*digiIt).getKeyWG();
2785  //printf("I did fill ALCT info for Chamber %d %d %d %d \n",idALCT.chamberId().endcap(), idALCT.chamberId().station(), idALCT.chamberId().ring(), idALCT.chamberId().chamber());
2786  }
2787 
2788  }
2789  }
2790  }
2791 
2792  // *************************************************
2793  // *** CLCT Digis **********************************
2794  // *************************************************
2795  int n_clcts = 0;
2796  map<CSCDetId, int > CLCT_getFullBx_map; //structure for storing the pretrigger bxn for the first CLCT for each chamber
2797  for (CSCCLCTDigiCollection::DigiRangeIterator j=clcts->begin(); j!=clcts->end(); j++) {
2798  const CSCCLCTDigiCollection::Range& range =(*j).second;
2799  const CSCDetId& idCLCT = (*j).first;
2800  for (CSCCLCTDigiCollection::const_iterator digiIt = range.first; digiIt!=range.second; ++digiIt){
2801  // Valid digi in the chamber (or in neighbouring chamber)
2802  if((*digiIt).isValid()){
2803  n_clcts++;
2804  histos->fill1DHist( (*digiIt).getBX(), "CLCT_getBX","CLCT.getBX()",11,-0.5,10.5,"TimeMonitoring");
2805  histos->fill1DHist( (*digiIt).getFullBX(), "CLCT_getFullBX","CLCT.getFullBX()",3601,-0.5,3600.5,"TimeMonitoring");
2806  //if we don't already have digi information stored for this chamber, then we fill it
2807  if (CLCT_getFullBx_map.find(idCLCT.chamberId()) == CLCT_getFullBx_map.end()){
2808  CLCT_getFullBx_map[idCLCT.chamberId()] = (*digiIt).getFullBX();
2809  //printf("I did fill CLCT info for Chamber %d %d %d %d \n",idCLCT.chamberId().endcap(), idCLCT.chamberId().station(), idCLCT.chamberId().ring(), idCLCT.chamberId().chamber());
2810  }
2811  }
2812  }
2813  }
2814 
2815  // *************************************************
2816  // *** CorrelatedLCT Digis *************************
2817  // *************************************************
2818  int n_correlatedlcts = 0;
2819  for (CSCCorrelatedLCTDigiCollection::DigiRangeIterator j=correlatedlcts->begin(); j!=correlatedlcts->end(); j++) {
2820  const CSCCorrelatedLCTDigiCollection::Range& range =(*j).second;
2821  for (CSCCorrelatedLCTDigiCollection::const_iterator digiIt = range.first; digiIt!=range.second; ++digiIt){
2822  if((*digiIt).isValid()){
2823  n_correlatedlcts++;
2824  histos->fill1DHist( (*digiIt).getBX(), "CorrelatedLCTS_getBX","CorrelatedLCT.getBX()",11,-0.5,10.5,"TimeMonitoring");
2825  }
2826  }
2827  }
2828 
2829 
2830  int nRecHits = recHits->size();
2831  int nSegments = cscSegments->size();
2832  if (has_CSCTrigger){
2833  histos->fill1DHist(L1GMT_BXN,"BX_L1CSCCand","BX of L1 CSC Cand",4001,-0.5,4000.5,"TimeMonitoring");
2834  histos->fill2DHist(L1GMT_BXN,n_alcts,"n_ALCTs_v_BX_L1CSCCand","Number of ALCTs vs. BX of L1 CSC Cand",4001,-0.5,4000.5,51,-0.5,50.5,"TimeMonitoring");
2835  histos->fill2DHist(L1GMT_BXN,n_clcts,"n_CLCTs_v_BX_L1CSCCand","Number of CLCTs vs. BX of L1 CSC Cand",4001,-0.5,4000.5,51,-0.5,50.5,"TimeMonitoring");
2836  histos->fill2DHist(L1GMT_BXN,n_correlatedlcts,"n_CorrelatedLCTs_v_BX_L1CSCCand","Number of CorrelatedLCTs vs. BX of L1 CSC Cand",4001,-0.5,4000.5,51,-0.5,50.5,"TimeMonitoring");
2837  histos->fill2DHist(L1GMT_BXN,nRecHits,"n_RecHits_v_BX_L1CSCCand","Number of RecHits vs. BX of L1 CSC Cand",4001,-0.5,4000.5,101,-0.5,100.5,"TimeMonitoring");
2838  histos->fill2DHist(L1GMT_BXN,nSegments,"n_Segments_v_BX_L1CSCCand","Number of Segments vs. BX of L1 CSC Cand",4001,-0.5,4000.5,51,-0.5,50.5,"TimeMonitoring");
2839  }
2840  if (has_CSCTrigger && has_beamHaloTrigger){
2841  histos->fill1DHist(L1GMT_BXN,"BX_L1CSCCand_w_beamHalo","BX of L1 CSC (w beamHalo bit)",4001,-0.5,4000.5,"TimeMonitoring");
2842  histos->fill2DHist(L1GMT_BXN,n_alcts,"n_ALCTs_v_BX_L1CSCCand_w_beamHalo","Number of ALCTs vs. BX of L1 CSC Cand (w beamHalo bit)",4001,-0.5,4000.5,51,-0.5,50.5,"TimeMonitoring");
2843  histos->fill2DHist(L1GMT_BXN,n_clcts,"n_CLCTs_v_BX_L1CSCCand_w_beamHalo","Number of CLCTs vs. BX of L1 CSC Cand (w beamHalo bit)",4001,-0.5,4000.5,51,-0.5,50.5,"TimeMonitoring");
2844  histos->fill2DHist(L1GMT_BXN,n_correlatedlcts,"n_CorrelatedLCTs_v_BX_L1CSCCand_w_beamHalo","Number of CorrelatedLCTs vs. BX of L1 CSC Cand (w beamHalo bit)",4001,-0.5,4000.5,51,-0.5,50.5,"TimeMonitoring");
2845  histos->fill2DHist(L1GMT_BXN,nRecHits,"n_RecHits_v_BX_L1CSCCand_w_beamHalo","Number of RecHits vs. BX of L1 CSC Cand (w beamHalo bit)",4001,-0.5,4000.5,101,-0.5,100.5,"TimeMonitoring");
2846  histos->fill2DHist(L1GMT_BXN,nSegments,"n_Segments_v_BX_L1CSCCand_w_beamHalo","Number of Segments vs. BX of L1 CSC Cand (w beamHalo bit)",4001,-0.5,4000.5,51,-0.5,50.5,"TimeMonitoring");
2847  }
2848 
2849  // *******************************************************************
2850  // Get information from the TMB header.
2851  // Can this eventually come out of the digis?
2852  // Taking code from EventFilter/CSCRawToDigis/CSCDCCUnpacker.cc
2853  // *******************************************************************
2854 
2856  eventSetup.get<CSCCrateMapRcd>().get(hcrate);
2857  const CSCCrateMap* pcrate = hcrate.product();
2858 
2861  event.getByToken( rd_token, rawdata);
2862  bool goodEvent = false;
2863  // If set selective unpacking mode
2864  // hardcoded examiner mask below to check for DCC and DDU level errors will be used first
2865  // then examinerMask for CSC level errors will be used during unpacking of each CSC block
2866  unsigned long dccBinCheckMask = 0x06080016;
2867  unsigned int examinerMask = 0x1FEBF3F6;
2868  unsigned int errorMask = 0x0;
2869 
2871  // loop over DCCs
2874 
2876  const FEDRawData& fedData = rawdata->FEDData(id);
2877  unsigned long length = fedData.size();
2878 
2879  if (length>=32){
2880  CSCDCCExaminer* examiner = nullptr;
2881  std::stringstream examiner_out, examiner_err;
2882  goodEvent = true;
2884  //CSCDCCExaminer examiner;
2885  examiner = new CSCDCCExaminer();
2886  if( examinerMask&0x40000 ) examiner->crcCFEB(true);
2887  if( examinerMask&0x8000 ) examiner->crcTMB (true);
2888  if( examinerMask&0x0400 ) examiner->crcALCT(true);
2889  examiner->setMask(examinerMask);
2890  const short unsigned int *data = (short unsigned int *)fedData.data();
2891 
2892  if( examiner->check(data,long(fedData.size()/2)) < 0 ) {
2893  goodEvent=false;
2894  }
2895  else {
2896  goodEvent=!(examiner->errors()&dccBinCheckMask);
2897  }
2898 
2899  if (goodEvent) {
2901  CSCDCCExaminer * ptrExaminer = examiner;
2902  CSCDCCEventData dccData((short unsigned int *) fedData.data(),ptrExaminer);
2903 
2905  const std::vector<CSCDDUEventData> & dduData = dccData.dduData();
2906 
2908  CSCDetId layer(1, 1, 1, 1, 1);
2909 
2910  for (unsigned int iDDU=0; iDDU<dduData.size(); ++iDDU) { // loop over DDUs
2913  if (dduData[iDDU].trailer().errorstat()&errorMask) {
2914  LogTrace("CSCDCCUnpacker|CSCRawToDigi") << "DDU# " << iDDU << " has serious error - no digis unpacked! " <<
2915  std::hex << dduData[iDDU].trailer().errorstat();
2916  continue; // to next iteration of DDU loop
2917  }
2918 
2920  const std::vector<CSCEventData> & cscData = dduData[iDDU].cscData();
2921  for (unsigned int iCSC=0; iCSC<cscData.size(); ++iCSC) { // loop over CSCs
2922 
2923  int vmecrate = cscData[iCSC].dmbHeader()->crateID();
2924  int dmb = cscData[iCSC].dmbHeader()->dmbID();
2925 
2927  // SKIPPING MTCC redefinition of vmecrate
2928 
2929  int icfeb = 0;
2930  int ilayer = 0;
2931 
2932  if ((vmecrate>=1)&&(vmecrate<=60) && (dmb>=1)&&(dmb<=10)&&(dmb!=6)) {
2933  layer = pcrate->detId(vmecrate, dmb,icfeb,ilayer );
2934  }
2935  else{
2936  LogTrace ("CSCTimingAlignment|CSCDCCUnpacker|CSCRawToDigi") << " detID input out of range!!! ";
2937  LogTrace ("CSCTimingAlignment|CSCDCCUnpacker|CSCRawToDigi")
2938  << " skipping chamber vme= " << vmecrate << " dmb= " << dmb;
2939  continue; // to next iteration of iCSC loop
2940  }
2941 
2943  int nalct = cscData[iCSC].dmbHeader()->nalct();
2944  bool goodALCT=false;
2945  //if (nalct&&(cscData[iCSC].dataPresent>>6&0x1)==1) {
2946  if (nalct&&cscData[iCSC].alctHeader()) {
2947  if (cscData[iCSC].alctHeader()->check()){
2948  goodALCT=true;
2949  }
2950  }
2951 
2953  int nclct = cscData[iCSC].dmbHeader()->nclct();
2954  bool goodTMB=false;
2955  if (nclct&&cscData[iCSC].tmbData()) {
2956  if (cscData[iCSC].tmbHeader()->check()){
2957  if (cscData[iCSC].clctData()->check()) goodTMB=true;
2958  }
2959  }
2960 
2961  if (goodTMB && goodALCT) {
2962 
2963  if (ALCT_KeyWG_map.find(layer) == ALCT_KeyWG_map.end()) {
2964  printf("no ALCT info for Chamber %d %d %d %d \n",layer.endcap(), layer.station(), layer.ring(), layer.chamber());
2965  continue;
2966  }
2967  if (CLCT_getFullBx_map.find(layer) == CLCT_getFullBx_map.end()) {
2968  printf("no CLCT info for Chamber %d %d %d %d \n",layer.endcap(), layer.station(), layer.ring(), layer.chamber());
2969  continue;
2970  }
2971  int ALCT0Key = ALCT_KeyWG_map.find(layer)->second;
2972  int CLCTPretrigger = CLCT_getFullBx_map.find(layer)->second;
2973 
2974 
2975 
2976  const CSCTMBHeader *tmbHead = cscData[iCSC].tmbHeader();
2977 
2978  histos->fill1DHistByStation(tmbHead->BXNCount(), "TMB_BXNCount" ,"TMB_BXNCount" , layer.chamberId(),3601,-0.5,3600.5,"TimeMonitoring");
2979  histos->fill1DHistByStation(tmbHead->ALCTMatchTime(),"TMB_ALCTMatchTime","TMB_ALCTMatchTime", layer.chamberId(),7,-0.5,6.5,"TimeMonitoring");
2980 
2981  histos->fill1DHist(tmbHead->BXNCount(), "TMB_BXNCount" ,"TMB_BXNCount" , 3601,-0.5,3600.5,"TimeMonitoring");
2982  histos->fill1DHist(tmbHead->ALCTMatchTime(),"TMB_ALCTMatchTime","TMB_ALCTMatchTime", 7,-0.5,6.5,"TimeMonitoring");
2983 
2984  histos->fill1DHistByType(tmbHead->ALCTMatchTime(),"TMB_ALCTMatchTime","TMB_ALCTMatchTime",layer.chamberId(), 7,-0.5,6.5,"TimeMonitoring");
2985 
2986  histos->fillProfile( chamberSerial(layer.chamberId()),tmbHead->ALCTMatchTime(),"prof_TMB_ALCTMatchTime","prof_TMB_ALCTMatchTime", 601,-0.5,600.5,-0.5,7.5,"TimeMonitoring");
2987  histos->fillProfile(ALCT0Key,tmbHead->ALCTMatchTime(),"prof_TMB_ALCTMatchTime_v_ALCT0KeyWG","prof_TMB_ALCTMatchTime_v_ALCT0KeyWG",128,-0.5,127.5,0,7,"TimeMonitoring");
2988  histos->fillProfileByType(ALCT0Key,tmbHead->ALCTMatchTime(),"prf_TMB_ALCTMatchTime_v_ALCT0KeyWG","prf_TMB_ALCTMatchTime_v_ALCT0KeyWG",layer.chamberId(),128,-0.5,127.5,0,7,"TimeMonitoring");
2989 
2990  //Attempt to make a few sum plots
2991 
2992  int TMB_ALCT_rel_L1A = tmbHead->BXNCount()-(CLCTPretrigger+2+tmbHead->ALCTMatchTime());
2993  if (TMB_ALCT_rel_L1A > 3563)
2994  TMB_ALCT_rel_L1A = TMB_ALCT_rel_L1A - 3564;
2995  if (TMB_ALCT_rel_L1A < 0)
2996  TMB_ALCT_rel_L1A = TMB_ALCT_rel_L1A + 3564;
2997 
2998  //Plot TMB_ALCT_rel_L1A
2999  histos->fill1DHist(TMB_ALCT_rel_L1A,"h1D_TMB_ALCT_rel_L1A","h1D_TMB_ALCT_rel_L1A",11,144.5,155.5,"TimeMonitoring");
3000  histos->fill2DHist( chamberSerial(layer.chamberId()),TMB_ALCT_rel_L1A,"h2D_TMB_ALCT_rel_L1A","h2D_TMB_ALCT_rel_L1A", 601,-0.5,600.5,11,144.5,155.5,"TimeMonitoring");
3001  histos->fill2DHist( ringSerial(layer.chamberId()),TMB_ALCT_rel_L1A,"h2D_TMB_ALCT_rel_L1A_by_ring","h2D_TMB_ALCT_rel_L1A_by_ring",19,-9.5,9.5,11,144.5,155.5,"TimeMonitoring");
3002  histos->fillProfile( chamberSerial(layer.chamberId()),TMB_ALCT_rel_L1A,"prof_TMB_ALCT_rel_L1A","prof_TMB_ALCT_rel_L1A", 601,-0.5,600.5,145,155,"TimeMonitoring");
3003  histos->fillProfile( ringSerial(layer.chamberId()),TMB_ALCT_rel_L1A,"prof_TMB_ALCT_rel_L1A_by_ring","prof_TMB_ALCT_rel_L1A_by_ring",19,-9.5,9.5,145,155,"TimeMonitoring");
3004 
3005  histos->fill2DHist (ALCT0Key,TMB_ALCT_rel_L1A,"h2D_TMB_ALCT_rel_L1A_v_ALCT0KeyWG","h2D_TMB_ALCT_rel_L1A_v_ALCT0KeyWG", 128,-0.5,127.5,11,144.5,155.5,"TimeMonitoring");
3006  histos->fillProfile(ALCT0Key,TMB_ALCT_rel_L1A,"prof_TMB_ALCT_rel_L1A_v_ALCT0KeyWG","prof_TMB_ALCT_rel_L1A_v_ALCT0KeyWG",128,-0.5,127.5,145,155,"TimeMonitoring");
3007  histos->fillProfileByType(ALCT0Key,TMB_ALCT_rel_L1A,"prf_TMB_ALCT_rel_L1A_v_ALCT0KeyWG","prf_TMB_ALCT_rel_L1A_v_ALCT0KeyWG",layer.chamberId(),128,-0.5,127.5,145,155,"TimeMonitoring");
3008  }
3009 
3010  } // end CSCData loop
3011  } // end ddu data loop
3012  } // end if goodEvent
3013  if (examiner!=nullptr) delete examiner;
3014  }// end if non-zero fed data
3015  } // end DCC loop for NON-REFERENCE
3016 
3017 }
3018 
3019 
3021 
3022  std::cout<<"Events in "<<nEventsAnalyzed<<std::endl;
3023 }
3024 
3026 
#define LogDebug(id)
uint16_t BXNCount() const
Definition: CSCTMBHeader.h:42
01/20/05 A.Tumanov
float getthisSignal(const CSCStripDigiCollection &stripdigis, CSCDetId idRH, int centerStrip)
dbl * delta
Definition: mlp_gen.cc:36
int chamber() const
Definition: CSCDetId.h:68
T getParameter(std::string const &) const
void crcCFEB(bool enable)
T getUntrackedParameter(std::string const &, T const &) const
float xx() const
Definition: LocalError.h:24
float fitX(const CLHEP::HepMatrix &sp, const CLHEP::HepMatrix &ep)
LocalVector localDirection() const override
Local direction.
Definition: CSCSegment.h:41
virtual const std::array< const float, 4 > parameters() const
CSCDetId id() const
Get the (concrete) DetId.
Definition: CSCChamber.h:37
static const double slope[3]
CSCDetId detId(int vme, int dmb, int cfeb, int layer=0) const
Definition: CSCCrateMap.cc:11
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:54
bool accept() const
Has at least one path accepted the event?
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
const std::vector< CSCDDUEventData > & dduData() const
accessor to dduData
Geom::Theta< T > theta() const
T y() const
Definition: PV3DBase.h:63
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:69
void doNoiseHits(edm::Handle< CSCRecHit2DCollection > recHits, edm::Handle< CSCSegmentCollection > cscSegments, edm::ESHandle< CSCGeometry > cscGeom, edm::Handle< CSCStripDigiCollection > strips)
Definition: weight.py:1
const ChamberContainer & chambers() const
Return a vector of all chambers.
Definition: CSCGeometry.cc:121
void endJob() override
GainContainer gains
Definition: CSCDBGains.h:24
ExaminerStatusType errors(void) const
void crcALCT(bool enable)
void doRecHits(edm::Handle< CSCRecHit2DCollection > recHits, edm::ESHandle< CSCGeometry > cscGeom)
int layer() const
Definition: CSCDetId.h:61
void doEfficiencies(edm::Handle< CSCWireDigiCollection > wires, edm::Handle< CSCStripDigiCollection > strips, edm::Handle< CSCRecHit2DCollection > recHits, edm::Handle< CSCSegmentCollection > cscSegments, edm::ESHandle< CSCGeometry > cscGeom)
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
bool withinSensitiveRegion(LocalPoint localPos, const std::array< const float, 4 > &layerBounds, int station, int ring, float shiftFromEdge, float shiftFromDeadZone)
bool doTrigger(edm::Handle< L1MuGMTReadoutCollection > pCollection)
Geom::Theta< T > theta() const
Definition: PV3DBase.h:75
std::string chamberTypeName() const
int endcap() const
Definition: CSCDetId.h:93
C::const_iterator const_iterator
constant access iterator type
Definition: RangeMap.h:43
void doCompTiming(const CSCComparatorDigiCollection &)
float xy() const
Definition: LocalError.h:25
void doPedestalNoise(edm::Handle< CSCStripDigiCollection > strips)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
T mag() const
Definition: PV3DBase.h:67
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
int np
Definition: AMPTWrapper.h:33
int dbIndex(const CSCDetId &id, int &channel)
Definition: CSCIndexer.cc:240
const CSCChamberSpecs * specs() const
Definition: CSCChamber.h:42
float yy() const
Definition: LocalError.h:26
void doStripDigis(edm::Handle< CSCStripDigiCollection > strips)
T sqrt(T t)
Definition: SSEVec.h:18
unsigned int size() const
Get number of paths stored.
int getWidth(const CSCStripDigiCollection &stripdigis, CSCDetId idRH, int centerStrip)
void histoEfficiency(TH1F *readHisto, TH1F *writeHisto)
int ringSerial(CSCDetId id)
T z() const
Definition: PV3DBase.h:64
void crcTMB(bool enable)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
LocalPoint localPosition() const override
Definition: CSCSegment.h:38
~CSCValidation() override
Destructor.
CSCDetId chamberId() const
Definition: CSCDetId.h:53
const CSCLayer * layer(CSCDetId id) const
Return the layer corresponding to the given id.
Definition: CSCChamber.cc:39
bool filterEvents(edm::Handle< CSCRecHit2DCollection > recHits, edm::Handle< CSCSegmentCollection > cscSegments, edm::Handle< reco::TrackCollection > saMuons)
bool doHLT(edm::Handle< edm::TriggerResults > hltResults)
float ChiSquaredProbability(double chiSquared, double nrDOF)
static const std::string kLayer("layer")
void analyze(const edm::Event &event, const edm::EventSetup &eventSetup) override
Perform the analysis.
void doSimHits(edm::Handle< CSCRecHit2DCollection > recHits, edm::Handle< edm::PSimHitContainer > simHits)
#define LogTrace(id)
uint16_t ALCTMatchTime() const
Definition: CSCTMBHeader.h:45
bin
set the eta bin as selection string.
void doGasGain(const CSCWireDigiCollection &, const CSCStripDigiCollection &, const CSCRecHit2DCollection &)
int ring() const
Definition: CSCDetId.h:75
Definition: DetId.h:18
void getEfficiency(float bin, float Norm, std::vector< float > &eff)
void doResolution(edm::Handle< CSCSegmentCollection > cscSegments, edm::ESHandle< CSCGeometry > cscGeom)
void findNonAssociatedRecHits(edm::ESHandle< CSCGeometry > cscGeom, edm::Handle< CSCStripDigiCollection > strips)
const CSCChamber * chamber(CSCDetId id) const
Return the chamber corresponding to given DetId.
Definition: CSCGeometry.cc:133
static constexpr int RPC
Definition: MuonSubdetId.h:14
std::vector< DigiType >::const_iterator const_iterator
int32_t check(const uint16_t *&buffer, int32_t length)
void doAFEBTiming(const CSCWireDigiCollection &)
void doTimeMonitoring(edm::Handle< CSCRecHit2DCollection > recHits, edm::Handle< CSCSegmentCollection > cscSegments, edm::Handle< CSCALCTDigiCollection > alcts, edm::Handle< CSCCLCTDigiCollection > clcts, edm::Handle< CSCCorrelatedLCTDigiCollection > correlatedlcts, edm::Handle< L1MuGMTReadoutCollection > pCollection, edm::ESHandle< CSCGeometry > cscGeom, const edm::EventSetup &eventSetup, const edm::Event &event)
std::vector< const CSCChamber * > ChamberContainer
Definition: CSCGeometry.h:32
float getSignal(const CSCStripDigiCollection &stripdigis, CSCDetId idRH, int centerStrip)
PedestalContainer pedestals
HLT enums.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
void doStandalone(edm::Handle< reco::TrackCollection > saMuons)
int chamberSerial(CSCDetId id)
const CSCLayer * layer(CSCDetId id) const
Return the layer corresponding to given DetId.
Definition: CSCGeometry.cc:139
std::vector< L1MuGMTReadoutRecord > const & getRecords() const
T get() const
Definition: EventSetup.h:71
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
void doWireDigis(edm::Handle< CSCWireDigiCollection > wires)
int station() const
Definition: CSCDetId.h:86
std::pair< const_iterator, const_iterator > Range
Definition: errors.py:1
void doADCTiming(const CSCRecHit2DCollection &)
CrosstalkContainer crosstalk
NoiseMatrixContainer matrix
static constexpr int DT
Definition: MuonSubdetId.h:12
CSCValidation(const edm::ParameterSet &pset)
Constructor.
void doSegments(edm::Handle< CSCSegmentCollection > cscSegments, edm::ESHandle< CSCGeometry > cscGeom)
def check(config)
Definition: trackerTree.py:14
static constexpr int CSC
Definition: MuonSubdetId.h:13
T x() const
Definition: PV3DBase.h:62
T const * product() const
Definition: ESHandle.h:86
void doOccupancies(edm::Handle< CSCStripDigiCollection > strips, edm::Handle< CSCWireDigiCollection > wires, edm::Handle< CSCRecHit2DCollection > recHits, edm::Handle< CSCSegmentCollection > cscSegments)
const CSCLayerGeometry * geometry() const
Definition: CSCLayer.h:47
void setMask(ExaminerMaskType mask)
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
Definition: event.py:1
void doCalibrations(const edm::EventSetup &eventSetup)
Definition: vlib.h:39