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  float y;
2199  int channel=0,mult,wire,layer,idlayer,idchamber,ring;
2200  int wire_strip_rechit_present;
2201  std::string name,title,endcapstr;
2202  ostringstream ss;
2203  CSCIndexer indexer;
2204  std::map<int,int>::iterator intIt;
2205 
2206  m_single_wire_layer.clear();
2207 
2208  if(firstEvent) {
2209 
2210  // HV segments, their # and location in terms of wire groups
2211 
2212  m_wire_hvsegm.clear();
2213  std::map<int,std::vector<int> >::iterator intvecIt;
2214  // ME1a ME1b ME1/2 ME1/3 ME2/1 ME2/2 ME3/1 ME3/2 ME4/1 ME4/2
2215  int csctype[10]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
2216  int hvsegm_layer[10]={1, 1, 3, 3, 3, 5, 3, 5, 3, 5};
2217  int id;
2218  nmbhvsegm.clear();
2219  for(int i=0;i<10;i++) nmbhvsegm.push_back(hvsegm_layer[i]);
2220  // For ME1/1a
2221  std::vector<int> zer_1_1a(49,0);
2222  id=csctype[0];
2223  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_1a;
2224  intvecIt=m_wire_hvsegm.find(id);
2225  for(int wire=1;wire<=48;wire++) intvecIt->second[wire]=1; // Segment 1
2226 
2227  // For ME1/1b
2228  std::vector<int> zer_1_1b(49,0);
2229  id=csctype[1];
2230  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_1b;
2231  intvecIt=m_wire_hvsegm.find(id);
2232  for(int wire=1;wire<=48;wire++) intvecIt->second[wire]=1; // Segment 1
2233 
2234  // For ME1/2
2235  std::vector<int> zer_1_2(65,0);
2236  id=csctype[2];
2237  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_2;
2238  intvecIt=m_wire_hvsegm.find(id);
2239  for(int wire=1;wire<=24;wire++) intvecIt->second[wire]=1; // Segment 1
2240  for(int wire=25;wire<=48;wire++) intvecIt->second[wire]=2; // Segment 2
2241  for(int wire=49;wire<=64;wire++) intvecIt->second[wire]=3; // Segment 3
2242 
2243  // For ME1/3
2244  std::vector<int> zer_1_3(33,0);
2245  id=csctype[3];
2246  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_3;
2247  intvecIt=m_wire_hvsegm.find(id);
2248  for(int wire=1;wire<=12;wire++) intvecIt->second[wire]=1; // Segment 1
2249  for(int wire=13;wire<=22;wire++) intvecIt->second[wire]=2; // Segment 2
2250  for(int wire=23;wire<=32;wire++) intvecIt->second[wire]=3; // Segment 3
2251 
2252  // For ME2/1
2253  std::vector<int> zer_2_1(113,0);
2254  id=csctype[4];
2255  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_2_1;
2256  intvecIt=m_wire_hvsegm.find(id);
2257  for(int wire=1;wire<=44;wire++) intvecIt->second[wire]=1; // Segment 1
2258  for(int wire=45;wire<=80;wire++) intvecIt->second[wire]=2; // Segment 2
2259  for(int wire=81;wire<=112;wire++) intvecIt->second[wire]=3; // Segment 3
2260 
2261  // For ME2/2
2262  std::vector<int> zer_2_2(65,0);
2263  id=csctype[5];
2264  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_2_2;
2265  intvecIt=m_wire_hvsegm.find(id);
2266  for(int wire=1;wire<=16;wire++) intvecIt->second[wire]=1; // Segment 1
2267  for(int wire=17;wire<=28;wire++) intvecIt->second[wire]=2; // Segment 2
2268  for(int wire=29;wire<=40;wire++) intvecIt->second[wire]=3; // Segment 3
2269  for(int wire=41;wire<=52;wire++) intvecIt->second[wire]=4; // Segment 4
2270  for(int wire=53;wire<=64;wire++) intvecIt->second[wire]=5; // Segment 5
2271 
2272  // For ME3/1
2273  std::vector<int> zer_3_1(97,0);
2274  id=csctype[6];
2275  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_3_1;
2276  intvecIt=m_wire_hvsegm.find(id);
2277  for(int wire=1;wire<=32;wire++) intvecIt->second[wire]=1; // Segment 1
2278  for(int wire=33;wire<=64;wire++) intvecIt->second[wire]=2; // Segment 2
2279  for(int wire=65;wire<=96;wire++) intvecIt->second[wire]=3; // Segment 3
2280 
2281  // For ME3/2
2282  std::vector<int> zer_3_2(65,0);
2283  id=csctype[7];
2284  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_3_2;
2285  intvecIt=m_wire_hvsegm.find(id);
2286  for(int wire=1;wire<=16;wire++) intvecIt->second[wire]=1; // Segment 1
2287  for(int wire=17;wire<=28;wire++) intvecIt->second[wire]=2; // Segment 2
2288  for(int wire=29;wire<=40;wire++) intvecIt->second[wire]=3; // Segment 3
2289  for(int wire=41;wire<=52;wire++) intvecIt->second[wire]=4; // Segment 4
2290  for(int wire=53;wire<=64;wire++) intvecIt->second[wire]=5; // Segment 5
2291 
2292  // For ME4/1
2293  std::vector<int> zer_4_1(97,0);
2294  id=csctype[8];
2295  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_4_1;
2296  intvecIt=m_wire_hvsegm.find(id);
2297  for(int wire=1;wire<=32;wire++) intvecIt->second[wire]=1; // Segment 1
2298  for(int wire=33;wire<=64;wire++) intvecIt->second[wire]=2; // Segment 2
2299  for(int wire=65;wire<=96;wire++) intvecIt->second[wire]=3; // Segment 3
2300 
2301  // For ME4/2
2302  std::vector<int> zer_4_2(65,0);
2303  id=csctype[9];
2304  if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_4_2;
2305  intvecIt=m_wire_hvsegm.find(id);
2306  for(int wire=1;wire<=16;wire++) intvecIt->second[wire]=1; // Segment 1
2307  for(int wire=17;wire<=28;wire++) intvecIt->second[wire]=2; // Segment 2
2308  for(int wire=29;wire<=40;wire++) intvecIt->second[wire]=3; // Segment 3
2309  for(int wire=41;wire<=52;wire++) intvecIt->second[wire]=4; // Segment 4
2310  for(int wire=53;wire<=64;wire++) intvecIt->second[wire]=5; // Segment 5
2311 
2312  } // end of if(nEventsAnalyzed==1)
2313 
2314 
2315  // do wires, strips and rechits present?
2316  wire_strip_rechit_present=0;
2317  if(wirecltn.begin() != wirecltn.end())
2318  wire_strip_rechit_present= wire_strip_rechit_present+1;
2319  if(strpcltn.begin() != strpcltn.end())
2320  wire_strip_rechit_present= wire_strip_rechit_present+2;
2321  if(rechitcltn.begin() != rechitcltn.end())
2322  wire_strip_rechit_present= wire_strip_rechit_present+4;
2323 
2324  if(wire_strip_rechit_present==7) {
2325 
2326 // std::cout<<"Event "<<nEventsAnalyzed<<std::endl;
2327 // std::cout<<std::endl;
2328 
2329  // cycle on wire collection for all CSC to select single wire hit layers
2331 
2332  for(wiredetUnitIt=wirecltn.begin();wiredetUnitIt!=wirecltn.end();
2333  ++wiredetUnitIt) {
2334  const CSCDetId id = (*wiredetUnitIt).first;
2335  idlayer=indexer.dbIndex(id, channel);
2336  idchamber=idlayer/10;
2337  layer=id.layer();
2338  // looping in the layer of given CSC
2339  mult=0; wire=0;
2340  const CSCWireDigiCollection::Range& range = (*wiredetUnitIt).second;
2342  range.first; digiIt!=range.second; ++digiIt){
2343  wire=(*digiIt).getWireGroup();
2344  mult++;
2345  } // end of digis loop in layer
2346 
2347  // select layers with single wire hit
2348  if(mult==1) {
2349  if(m_single_wire_layer.find(idlayer) == m_single_wire_layer.end())
2350  m_single_wire_layer[idlayer]=wire;
2351  } // end of if(mult==1)
2352  } // end of cycle on detUnit
2353 
2354  // Looping thru rechit collection
2357 
2358  for(recIt = rechitcltn.begin(); recIt != rechitcltn.end(); ++recIt) {
2359  CSCDetId id = (CSCDetId)(*recIt).cscDetId();
2360  idlayer=indexer.dbIndex(id, channel);
2361  idchamber=idlayer/10;
2362  layer=id.layer();
2363  // select layer with single wire rechit
2364  if(m_single_wire_layer.find(idlayer) != m_single_wire_layer.end()) {
2365 
2366  if(recIt->nStrips()==3) {
2367  // get 3X3 ADC Sum
2368  unsigned int binmx=0;
2369  float adcmax=0.0;
2370 
2371  for(unsigned int i=0;i<recIt->nStrips();i++)
2372  for(unsigned int j=0;j<recIt->nTimeBins();j++)
2373  if(recIt->adcs(i,j)>adcmax) {
2374  adcmax=recIt->adcs(i,j);
2375  binmx=j;
2376  }
2377 
2378  float adc_3_3_sum=0.0;
2379  //well, this really only works for 3 strips in readout - not sure the right fix for general case
2380  for(unsigned int i=0;i<recIt->nStrips();i++)
2381  for(unsigned int j=binmx-1;j<=binmx+1;j++)
2382  adc_3_3_sum+=recIt->adcs(i,j);
2383 
2384 
2385  if(adc_3_3_sum > 0.0 && adc_3_3_sum < 2000.0) {
2386 
2387  // temporary fix for ME1/1a to avoid triple entries
2388  int flag=0;
2389  if(id.station()==1 && id.ring()==4 && recIt->channels(1)>16) flag=1;
2390  // end of temporary fix
2391  if(flag==0) {
2392 
2393  wire= m_single_wire_layer[idlayer];
2394  int chambertype=id.iChamberType(id.station(),id.ring());
2395  int hvsgmtnmb=m_wire_hvsegm[chambertype][wire];
2396  int nmbofhvsegm=nmbhvsegm[chambertype-1];
2397  int location= (layer-1)*nmbofhvsegm+hvsgmtnmb;
2398  float x=location;
2399 
2400  ss<<"gas_gain_rechit_adc_3_3_sum_location_ME_"<<idchamber;
2401  name=ss.str(); ss.str("");
2402  if(id.endcap()==1) endcapstr = "+";
2403  ring=id.ring();
2404  if(id.station()==1 && id.ring()==4) ring=1;
2405  if(id.endcap()==2) endcapstr = "-";
2406  ss<<"Gas Gain Rechit ADC3X3 Sum ME"<<endcapstr<<
2407  id.station()<<"/"<<ring<<"/"<<id.chamber();
2408  title=ss.str(); ss.str("");
2409  x=location;
2410  y=adc_3_3_sum;
2411  histos->fill2DHist(x,y,name,title,30,1.0,31.0,50,0.0,2000.0,"GasGain");
2412 
2413  /*
2414  std::cout<<idchamber<<" "<<id.station()<<" "<<id.ring()<<" "
2415  <<id.chamber()<<" "<<layer<<" "<< wire<<" "<<m_strip[1]<<" "<<
2416  chambertype<<" "<< hvsgmtnmb<<" "<< nmbofhvsegm<<" "<<
2417  location<<" "<<adc_3_3_sum<<std::endl;
2418  */
2419  } // end of if flag==0
2420  } // end if(adcsum>0.0 && adcsum<2000.0)
2421  } // end of if if(m_strip.size()==3
2422  } // end of if single wire
2423  } // end of looping thru rechit collection
2424  } // end of if wire and strip and rechit present
2425 }
2426 
2427 //---------------------------------------------------------------------------
2428 // Module for looking at AFEB Timing
2429 // Author N. Terentiev
2430 //---------------------------------------------------------------------------
2431 
2433  ostringstream ss;
2434  std::string name,title,endcapstr;
2435  float x,y;
2436  int wire,wiretbin,nmbwiretbin,layer,afeb,idlayer,idchamber;
2437  int channel=0; // for CSCIndexer::dbIndex(id, channel); irrelevant here
2438  CSCIndexer indexer;
2439 
2440  if(wirecltn.begin() != wirecltn.end()) {
2441 
2442  //std::cout<<std::endl;
2443  //std::cout<<"Event "<<nEventsAnalyzed<<std::endl;
2444  //std::cout<<std::endl;
2445 
2446  // cycle on wire collection for all CSC
2448  for(wiredetUnitIt=wirecltn.begin();wiredetUnitIt!=wirecltn.end();
2449  ++wiredetUnitIt) {
2450  const CSCDetId id = (*wiredetUnitIt).first;
2451  idlayer=indexer.dbIndex(id, channel);
2452  idchamber=idlayer/10;
2453  layer=id.layer();
2454 
2455  if (id.endcap() == 1) endcapstr = "+";
2456  if (id.endcap() == 2) endcapstr = "-";
2457 
2458  // looping in the layer of given CSC
2459 
2460  const CSCWireDigiCollection::Range& range = (*wiredetUnitIt).second;
2462  range.first; digiIt!=range.second; ++digiIt){
2463  wire=(*digiIt).getWireGroup();
2464  wiretbin=(*digiIt).getTimeBin();
2465  nmbwiretbin=(*digiIt).getTimeBinsOn().size();
2466  afeb=3*((wire-1)/8)+(layer+1)/2;
2467 
2468  // Anode wire group time bin vs afeb for each CSC
2469  x=afeb;
2470  y=wiretbin;
2471  ss<<"afeb_time_bin_vs_afeb_occupancy_ME_"<<idchamber;
2472  name=ss.str(); ss.str("");
2473  ss<<"Time Bin vs AFEB Occupancy ME"<<endcapstr<<id.station()<<"/"<<id.ring()<<"/"<< id.chamber();
2474  title=ss.str(); ss.str("");
2475  histos->fill2DHist(x,y,name,title,42,1.,43.,16,0.,16.,"AFEBTiming");
2476 
2477  // Number of anode wire group time bin vs afeb for each CSC
2478  x=afeb;
2479  y=nmbwiretbin;
2480  ss<<"nmb_afeb_time_bins_vs_afeb_ME_"<<idchamber;
2481  name=ss.str(); ss.str("");
2482  ss<<"Number of Time Bins vs AFEB ME"<<endcapstr<<id.station()<<"/"<<id.ring()<<"/"<< id.chamber();
2483  title=ss.str();
2484  ss.str("");
2485  histos->fill2DHist(x,y,name,title,42,1.,43.,16,0.,16.,"AFEBTiming");
2486 
2487  } // end of digis loop in layer
2488  } // end of wire collection loop
2489  } // end of if(wirecltn.begin() != wirecltn.end())
2490 }
2491 
2492 //---------------------------------------------------------------------------
2493 // Module for looking at Comparitor Timing
2494 // Author N. Terentiev
2495 //---------------------------------------------------------------------------
2496 
2498 
2499  ostringstream ss; std::string name,title,endcap;
2500  float x,y;
2501  int strip,tbin,cfeb,idlayer,idchamber;
2502  int channel=0; // for CSCIndexer::dbIndex(id, channel); irrelevant here
2503  CSCIndexer indexer;
2504 
2505  if(compars.begin() != compars.end()) {
2506 
2507  //std::cout<<std::endl;
2508  //std::cout<<"Event "<<nEventsAnalyzed<<std::endl;
2509  //std::cout<<std::endl;
2510 
2511  // cycle on comparators collection for all CSC
2513  for(compdetUnitIt=compars.begin();compdetUnitIt!=compars.end();
2514  ++compdetUnitIt) {
2515  const CSCDetId id = (*compdetUnitIt).first;
2516  idlayer=indexer.dbIndex(id, channel); // channel irrelevant here
2517  idchamber=idlayer/10;
2518 
2519  if (id.endcap() == 1) endcap = "+";
2520  if (id.endcap() == 2) endcap = "-";
2521  // looping in the layer of given CSC
2522  const CSCComparatorDigiCollection::Range& range =
2523  (*compdetUnitIt).second;
2525  range.first; digiIt!=range.second; ++digiIt){
2526  strip=(*digiIt).getStrip();
2527  /*
2528  if(id.station()==1 && (id.ring()==1 || id.ring()==4))
2529  std::cout<<idchamber<<" "<<id.station()<<" "<<id.ring()<<" "
2530  <<strip <<std::endl;
2531  */
2532  indexer.dbIndex(id, strip); // strips 1-16 of ME1/1a
2533  // become strips 65-80 of ME1/1
2534  tbin=(*digiIt).getTimeBin();
2535  cfeb=(strip-1)/16+1;
2536 
2537  // time bin vs cfeb for each CSC
2538 
2539  x=cfeb;
2540  y=tbin;
2541  ss<<"comp_time_bin_vs_cfeb_occupancy_ME_"<<idchamber;
2542  name=ss.str(); ss.str("");
2543  ss<<"Comparator Time Bin vs CFEB Occupancy ME"<<endcap<<
2544  id.station()<<"/"<< id.ring()<<"/"<< id.chamber();
2545  title=ss.str(); ss.str("");
2546  histos->fill2DHist(x,y,name,title,5,1.,6.,16,0.,16.,"CompTiming");
2547 
2548  } // end of digis loop in layer
2549  } // end of collection loop
2550  } // end of if(compars.begin() !=compars.end())
2551 }
2552 
2553 //---------------------------------------------------------------------------
2554 // Module for looking at Strip Timing
2555 // Author N. Terentiev
2556 //---------------------------------------------------------------------------
2557 
2559  float adc_3_3_sum,adc_3_3_wtbin,x,y;
2560  int cfeb,idchamber,ring;
2561 
2562  std::string name,title,endcapstr;
2563  ostringstream ss;
2564  std::vector<float> zer(6,0.0);
2565 
2566  CSCIndexer indexer;
2567  std::map<int,int>::iterator intIt;
2568 
2569  if(rechitcltn.begin() != rechitcltn.end()) {
2570 
2571  // std::cout<<"Event "<<nEventsAnalyzed <<std::endl;
2572 
2573  // Looping thru rechit collection
2576  for(recIt = rechitcltn.begin(); recIt != rechitcltn.end(); ++recIt) {
2577  CSCDetId id = (CSCDetId)(*recIt).cscDetId();
2578  // getting strips comprising rechit
2579  if(recIt->nStrips()==3) {
2580  // get 3X3 ADC Sum
2581  // get 3X3 ADC Sum
2582  unsigned int binmx=0;
2583  float adcmax=0.0;
2584 
2585  for(unsigned int i=0;i<recIt->nStrips();i++)
2586  for(unsigned int j=0;j<recIt->nTimeBins();j++)
2587  if(recIt->adcs(i,j)>adcmax) {
2588  adcmax=recIt->adcs(i,j);
2589  binmx=j;
2590  }
2591 
2592  adc_3_3_sum=0.0;
2593  //well, this really only works for 3 strips in readout - not sure the right fix for general case
2594  for(unsigned int i=0;i<recIt->nStrips();i++)
2595  for(unsigned int j=binmx-1;j<=binmx+1;j++)
2596  adc_3_3_sum+=recIt->adcs(i,j);
2597 
2598 
2599  // ADC weighted time bin
2600  if(adc_3_3_sum > 100.0) {
2601 
2602 
2603  int centerStrip=recIt->channels(1); //take central from 3 strips;
2604  // temporary fix
2605  int flag=0;
2606  if(id.station()==1 && id.ring()==4 && centerStrip>16) flag=1;
2607  // end of temporary fix
2608  if(flag==0) {
2609  adc_3_3_wtbin=(*recIt).tpeak()/50; //getTiming(strpcltn, id, centerStrip);
2610  idchamber=indexer.dbIndex(id, centerStrip)/10; //strips 1-16 ME1/1a
2611  // become strips 65-80 ME1/1 !!!
2612  /*
2613  if(id.station()==1 && (id.ring()==1 || id.ring()==4))
2614  std::cout<<idchamber<<" "<<id.station()<<" "<<id.ring()<<" "<<m_strip[1]<<" "<<
2615  " "<<centerStrip<<
2616  " "<<adc_3_3_wtbin<<" "<<adc_3_3_sum<<std::endl;
2617  */
2618  ss<<"adc_3_3_weight_time_bin_vs_cfeb_occupancy_ME_"<<idchamber;
2619  name=ss.str(); ss.str("");
2620 
2621  std::string endcapstr;
2622  if(id.endcap() == 1) endcapstr = "+";
2623  if(id.endcap() == 2) endcapstr = "-";
2624  ring=id.ring(); if(id.ring()==4) ring=1;
2625  ss<<"ADC 3X3 Weighted Time Bin vs CFEB Occupancy ME"
2626  <<endcapstr<<id.station()<<"/"<<ring<<"/"<<id.chamber();
2627  title=ss.str(); ss.str("");
2628 
2629  cfeb=(centerStrip-1)/16+1;
2630  x=cfeb; y=adc_3_3_wtbin;
2631  histos->fill2DHist(x,y,name,title,5,1.,6.,80,-8.,8.,"ADCTiming");
2632  } // end of if flag==0
2633  } // end of if (adc_3_3_sum > 100.0)
2634  } // end of if if(m_strip.size()==3
2635  } // end of the pass thru CSCRecHit2DCollection
2636  } // end of if (rechitcltn.begin() != rechitcltn.end())
2637 }
2638 
2639 //---------------------------------------------------------------------------------------
2640 // Construct histograms for monitoring the trigger and offline timing
2641 // Author: A. Deisher
2642 //---------------------------------------------------------------------------------------
2643 
2648  const edm::EventSetup& eventSetup, const edm::Event &event){
2649 
2650  map<CSCDetId, float > segment_median_map; //structure for storing the median time for segments in a chamber
2651  map<CSCDetId, GlobalPoint > segment_position_map; //structure for storing the global position for segments in a chamber
2652 
2653  // -----------------------
2654  // loop over segments
2655  // -----------------------
2656  int iSegment = 0;
2657  for(CSCSegmentCollection::const_iterator dSiter=cscSegments->begin(); dSiter != cscSegments->end(); dSiter++) {
2658  iSegment++;
2659 
2660  CSCDetId id = (CSCDetId)(*dSiter).cscDetId();
2661  LocalPoint localPos = (*dSiter).localPosition();
2662  GlobalPoint globalPosition = GlobalPoint(0.0, 0.0, 0.0);
2663  const CSCChamber* cscchamber = cscGeom->chamber(id);
2664  if (cscchamber) {
2665  globalPosition = cscchamber->toGlobal(localPos);
2666  }
2667 
2668  // try to get the CSC recHits that contribute to this segment.
2669  std::vector<CSCRecHit2D> theseRecHits = (*dSiter).specificRecHits();
2670  int nRH = (*dSiter).nRecHits();
2671  if (nRH < 4 ) continue;
2672 
2673  //Store the recHit times of a segment in a vector for later sorting
2674  vector<float> non_zero;
2675 
2676  for ( vector<CSCRecHit2D>::const_iterator iRH = theseRecHits.begin(); iRH != theseRecHits.end(); iRH++) {
2677  non_zero.push_back( iRH->tpeak());
2678 
2679  }// end rechit loop
2680 
2681  //Sort the vector of hit times for this segment and average the center two
2682  sort(non_zero.begin(),non_zero.end());
2683  int middle_index = non_zero.size()/2;
2684  float average_two = (non_zero.at(middle_index-1) + non_zero.at(middle_index))/2.;
2685  if(non_zero.size()%2)
2686  average_two = non_zero.at(middle_index);
2687 
2688  //If we've vetoed events with multiple segments per chamber, this should never overwrite informations
2689  segment_median_map[id]=average_two;
2690  segment_position_map[id]=globalPosition;
2691 
2692  double distToIP = sqrt(globalPosition.x()*globalPosition.x()+globalPosition.y()*globalPosition.y()+globalPosition.z()*globalPosition.z());
2693 
2694  histos->fillProfile(chamberSerial(id),average_two,"timeChamber","Segment mean time",601,-0.5,600.5,-400.,400.,"TimeMonitoring");
2695  histos->fillProfileByType(id.chamber(),average_two,"timeChamberByType","Segment mean time by chamber",id,36,0.5,36.5,-400,400.,"TimeMonitoring");
2696  histos->fill2DHist(distToIP,average_two,"seg_time_vs_distToIP","Segment time vs. Distance to IP",80,600.,1400.,800,-400,400.,"TimeMonitoring");
2697  histos->fill2DHist(globalPosition.z(),average_two,"seg_time_vs_globZ","Segment time vs. z position",240,-1200,1200,800,-400.,400.,"TimeMonitoring");
2698  histos->fill2DHist(fabs(globalPosition.z()),average_two,"seg_time_vs_absglobZ","Segment time vs. abs(z position)",120,0.,1200.,800,-400.,400.,"TimeMonitoring");
2699 
2700  }//end segment loop
2701 
2702  //Now that the information for each segment we're interest in is stored, it is time to go through the pairs and make plots
2703  map<CSCDetId, float >::const_iterator it_outer; //for the outer loop
2704  map<CSCDetId, float >::const_iterator it_inner; //for the nested inner loop
2705  for (it_outer = segment_median_map.begin(); it_outer != segment_median_map.end(); it_outer++){
2706 
2707  CSCDetId id_outer = it_outer->first;
2708  float t_outer = it_outer->second;
2709 
2710  //begin the inner loop
2711  for (it_inner = segment_median_map.begin(); it_inner != segment_median_map.end(); it_inner++){
2712 
2713  CSCDetId id_inner = it_inner->first;
2714  float t_inner = it_inner->second;
2715 
2716  // we're looking at ordered pairs, so combinations will be double counted
2717  // (chamber a, chamber b) will be counted as well as (chamber b, chamber a)
2718  // We will avoid (chamber a, chamber a) with the following line
2719  if (chamberSerial(id_outer) == chamberSerial(id_inner)) continue;
2720 
2721  // Calculate expected TOF (in ns units)
2722  // GlobalPoint gp_outer = segment_position_map.find(id_outer)->second;
2723  // GlobalPoint gp_inner = segment_position_map.find(id_inner)->second;
2724  // GlobalVector flight = gp_outer - gp_inner; //in cm
2725  // float TOF = flight.mag()/30.0; //to ns
2726 
2727  //Plot t(ME+) - t(ME-) for chamber pairs in the same stations and rings but opposite endcaps
2728  if (id_outer.endcap() ==1 && id_inner.endcap() == 2 && id_outer.station() == id_inner.station() && id_outer.ring() == id_inner.ring() ){
2729  histos->fill1DHist(t_outer-t_inner,"diff_opposite_endcaps","#Delta t [ME+]-[ME-] for chambers in same station and ring",800,-400.,400.,"TimeMonitoring");
2730  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");
2731  }
2732 
2733  }//end inner loop of segment pairs
2734  }//end outer loop of segment pairs
2735 
2736  //if the digis, return here
2737  if( !useDigis ) return;
2738 
2739  //looking for the global trigger number
2740  vector<L1MuGMTReadoutRecord> L1Mrec = pCollection->getRecords();
2741  vector<L1MuGMTReadoutRecord>::const_iterator igmtrr;
2742  int L1GMT_BXN = -100;
2743  bool has_CSCTrigger = false;
2744  bool has_beamHaloTrigger = false;
2745  for(igmtrr=L1Mrec.begin(); igmtrr!=L1Mrec.end(); igmtrr++) {
2746  std::vector<L1MuRegionalCand>::const_iterator iter1;
2747  std::vector<L1MuRegionalCand> rmc;
2748  // CSC
2749  int icsc = 0;
2750  rmc = igmtrr->getCSCCands();
2751  for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
2752  if ( !(*iter1).empty() ) {
2753  icsc++;
2754  int kQuality = (*iter1).quality(); // kQuality = 1 means beam halo
2755  if (kQuality == 1) has_beamHaloTrigger = true;
2756  }
2757  }
2758  if (igmtrr->getBxInEvent() == 0 && icsc>0){
2759  //printf("L1 CSCCands exist. L1MuGMTReadoutRecord BXN = %d \n", igmtrr->getBxNr());
2760  L1GMT_BXN = igmtrr->getBxNr();
2761  has_CSCTrigger = true;
2762  }
2763  else if (igmtrr->getBxInEvent() == 0 ) {
2764  //printf("L1 CSCCands do not exist. L1MuGMTReadoutRecord BXN = %d \n", igmtrr->getBxNr());
2765  L1GMT_BXN = igmtrr->getBxNr();
2766  }
2767  }
2768 
2769  // *************************************************
2770  // *** ALCT Digis **********************************
2771  // *************************************************
2772 
2773  int n_alcts = 0;
2774  map<CSCDetId, int > ALCT_KeyWG_map; //structure for storing the key wire group for the first ALCT for each chamber
2775  for (CSCALCTDigiCollection::DigiRangeIterator j=alcts->begin(); j!=alcts->end(); j++) {
2776  const CSCALCTDigiCollection::Range& range =(*j).second;
2777  const CSCDetId& idALCT = (*j).first;
2778  for (CSCALCTDigiCollection::const_iterator digiIt = range.first; digiIt!=range.second; ++digiIt){
2779  // Valid digi in the chamber (or in neighbouring chamber)
2780  if((*digiIt).isValid()){
2781  n_alcts++;
2782  histos->fill1DHist( (*digiIt).getBX(), "ALCT_getBX","ALCT.getBX()",11,-0.5,10.5,"TimeMonitoring");
2783  histos->fill1DHist( (*digiIt).getFullBX(), "ALCT_getFullBX","ALCT.getFullBX()",3601,-0.5,3600.5,"TimeMonitoring");
2784  //if we don't already have digi information stored for this chamber, then we fill it
2785  if (ALCT_KeyWG_map.find(idALCT.chamberId()) == ALCT_KeyWG_map.end()){
2786  ALCT_KeyWG_map[idALCT.chamberId()] = (*digiIt).getKeyWG();
2787  //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());
2788  }
2789 
2790  }
2791  }
2792  }
2793 
2794  // *************************************************
2795  // *** CLCT Digis **********************************
2796  // *************************************************
2797  int n_clcts = 0;
2798  map<CSCDetId, int > CLCT_getFullBx_map; //structure for storing the pretrigger bxn for the first CLCT for each chamber
2799  for (CSCCLCTDigiCollection::DigiRangeIterator j=clcts->begin(); j!=clcts->end(); j++) {
2800  const CSCCLCTDigiCollection::Range& range =(*j).second;
2801  const CSCDetId& idCLCT = (*j).first;
2802  for (CSCCLCTDigiCollection::const_iterator digiIt = range.first; digiIt!=range.second; ++digiIt){
2803  // Valid digi in the chamber (or in neighbouring chamber)
2804  if((*digiIt).isValid()){
2805  n_clcts++;
2806  histos->fill1DHist( (*digiIt).getBX(), "CLCT_getBX","CLCT.getBX()",11,-0.5,10.5,"TimeMonitoring");
2807  histos->fill1DHist( (*digiIt).getFullBX(), "CLCT_getFullBX","CLCT.getFullBX()",3601,-0.5,3600.5,"TimeMonitoring");
2808  //if we don't already have digi information stored for this chamber, then we fill it
2809  if (CLCT_getFullBx_map.find(idCLCT.chamberId()) == CLCT_getFullBx_map.end()){
2810  CLCT_getFullBx_map[idCLCT.chamberId()] = (*digiIt).getFullBX();
2811  //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());
2812  }
2813  }
2814  }
2815  }
2816 
2817  // *************************************************
2818  // *** CorrelatedLCT Digis *************************
2819  // *************************************************
2820  int n_correlatedlcts = 0;
2821  for (CSCCorrelatedLCTDigiCollection::DigiRangeIterator j=correlatedlcts->begin(); j!=correlatedlcts->end(); j++) {
2822  const CSCCorrelatedLCTDigiCollection::Range& range =(*j).second;
2823  for (CSCCorrelatedLCTDigiCollection::const_iterator digiIt = range.first; digiIt!=range.second; ++digiIt){
2824  if((*digiIt).isValid()){
2825  n_correlatedlcts++;
2826  histos->fill1DHist( (*digiIt).getBX(), "CorrelatedLCTS_getBX","CorrelatedLCT.getBX()",11,-0.5,10.5,"TimeMonitoring");
2827  }
2828  }
2829  }
2830 
2831 
2832  int nRecHits = recHits->size();
2833  int nSegments = cscSegments->size();
2834  if (has_CSCTrigger){
2835  histos->fill1DHist(L1GMT_BXN,"BX_L1CSCCand","BX of L1 CSC Cand",4001,-0.5,4000.5,"TimeMonitoring");
2836  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");
2837  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");
2838  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");
2839  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");
2840  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");
2841  }
2842  if (has_CSCTrigger && has_beamHaloTrigger){
2843  histos->fill1DHist(L1GMT_BXN,"BX_L1CSCCand_w_beamHalo","BX of L1 CSC (w beamHalo bit)",4001,-0.5,4000.5,"TimeMonitoring");
2844  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");
2845  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");
2846  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");
2847  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");
2848  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");
2849  }
2850 
2851  // *******************************************************************
2852  // Get information from the TMB header.
2853  // Can this eventually come out of the digis?
2854  // Taking code from EventFilter/CSCRawToDigis/CSCDCCUnpacker.cc
2855  // *******************************************************************
2856 
2858  eventSetup.get<CSCCrateMapRcd>().get(hcrate);
2859  const CSCCrateMap* pcrate = hcrate.product();
2860 
2863  event.getByToken( rd_token, rawdata);
2864  bool goodEvent = false;
2865  // If set selective unpacking mode
2866  // hardcoded examiner mask below to check for DCC and DDU level errors will be used first
2867  // then examinerMask for CSC level errors will be used during unpacking of each CSC block
2868  unsigned long dccBinCheckMask = 0x06080016;
2869  unsigned int examinerMask = 0x1FEBF3F6;
2870  unsigned int errorMask = 0x0;
2871 
2873  // loop over DCCs
2876 
2878  const FEDRawData& fedData = rawdata->FEDData(id);
2879  unsigned long length = fedData.size();
2880 
2881  if (length>=32){
2882  CSCDCCExaminer* examiner = nullptr;
2883  std::stringstream examiner_out, examiner_err;
2884  goodEvent = true;
2886  //CSCDCCExaminer examiner;
2887  examiner = new CSCDCCExaminer();
2888  if( examinerMask&0x40000 ) examiner->crcCFEB(true);
2889  if( examinerMask&0x8000 ) examiner->crcTMB (true);
2890  if( examinerMask&0x0400 ) examiner->crcALCT(true);
2891  examiner->setMask(examinerMask);
2892  const short unsigned int *data = (short unsigned int *)fedData.data();
2893 
2894  if( examiner->check(data,long(fedData.size()/2)) < 0 ) {
2895  goodEvent=false;
2896  }
2897  else {
2898  goodEvent=!(examiner->errors()&dccBinCheckMask);
2899  }
2900 
2901  if (goodEvent) {
2903  CSCDCCExaminer * ptrExaminer = examiner;
2904  CSCDCCEventData dccData((short unsigned int *) fedData.data(),ptrExaminer);
2905 
2907  const std::vector<CSCDDUEventData> & dduData = dccData.dduData();
2908 
2910  CSCDetId layer(1, 1, 1, 1, 1);
2911 
2912  for (unsigned int iDDU=0; iDDU<dduData.size(); ++iDDU) { // loop over DDUs
2915  if (dduData[iDDU].trailer().errorstat()&errorMask) {
2916  LogTrace("CSCDCCUnpacker|CSCRawToDigi") << "DDU# " << iDDU << " has serious error - no digis unpacked! " <<
2917  std::hex << dduData[iDDU].trailer().errorstat();
2918  continue; // to next iteration of DDU loop
2919  }
2920 
2922  const std::vector<CSCEventData> & cscData = dduData[iDDU].cscData();
2923  for (unsigned int iCSC=0; iCSC<cscData.size(); ++iCSC) { // loop over CSCs
2924 
2925  int vmecrate = cscData[iCSC].dmbHeader()->crateID();
2926  int dmb = cscData[iCSC].dmbHeader()->dmbID();
2927 
2929  // SKIPPING MTCC redefinition of vmecrate
2930 
2931  int icfeb = 0;
2932  int ilayer = 0;
2933 
2934  if ((vmecrate>=1)&&(vmecrate<=60) && (dmb>=1)&&(dmb<=10)&&(dmb!=6)) {
2935  layer = pcrate->detId(vmecrate, dmb,icfeb,ilayer );
2936  }
2937  else{
2938  LogTrace ("CSCTimingAlignment|CSCDCCUnpacker|CSCRawToDigi") << " detID input out of range!!! ";
2939  LogTrace ("CSCTimingAlignment|CSCDCCUnpacker|CSCRawToDigi")
2940  << " skipping chamber vme= " << vmecrate << " dmb= " << dmb;
2941  continue; // to next iteration of iCSC loop
2942  }
2943 
2945  int nalct = cscData[iCSC].dmbHeader()->nalct();
2946  bool goodALCT=false;
2947  //if (nalct&&(cscData[iCSC].dataPresent>>6&0x1)==1) {
2948  if (nalct&&cscData[iCSC].alctHeader()) {
2949  if (cscData[iCSC].alctHeader()->check()){
2950  goodALCT=true;
2951  }
2952  }
2953 
2955  int nclct = cscData[iCSC].dmbHeader()->nclct();
2956  bool goodTMB=false;
2957  if (nclct&&cscData[iCSC].tmbData()) {
2958  if (cscData[iCSC].tmbHeader()->check()){
2959  if (cscData[iCSC].clctData()->check()) goodTMB=true;
2960  }
2961  }
2962 
2963  if (goodTMB && goodALCT) {
2964 
2965  if (ALCT_KeyWG_map.find(layer) == ALCT_KeyWG_map.end()) {
2966  printf("no ALCT info for Chamber %d %d %d %d \n",layer.endcap(), layer.station(), layer.ring(), layer.chamber());
2967  continue;
2968  }
2969  if (CLCT_getFullBx_map.find(layer) == CLCT_getFullBx_map.end()) {
2970  printf("no CLCT info for Chamber %d %d %d %d \n",layer.endcap(), layer.station(), layer.ring(), layer.chamber());
2971  continue;
2972  }
2973  int ALCT0Key = ALCT_KeyWG_map.find(layer)->second;
2974  int CLCTPretrigger = CLCT_getFullBx_map.find(layer)->second;
2975 
2976 
2977 
2978  const CSCTMBHeader *tmbHead = cscData[iCSC].tmbHeader();
2979 
2980  histos->fill1DHistByStation(tmbHead->BXNCount(), "TMB_BXNCount" ,"TMB_BXNCount" , layer.chamberId(),3601,-0.5,3600.5,"TimeMonitoring");
2981  histos->fill1DHistByStation(tmbHead->ALCTMatchTime(),"TMB_ALCTMatchTime","TMB_ALCTMatchTime", layer.chamberId(),7,-0.5,6.5,"TimeMonitoring");
2982 
2983  histos->fill1DHist(tmbHead->BXNCount(), "TMB_BXNCount" ,"TMB_BXNCount" , 3601,-0.5,3600.5,"TimeMonitoring");
2984  histos->fill1DHist(tmbHead->ALCTMatchTime(),"TMB_ALCTMatchTime","TMB_ALCTMatchTime", 7,-0.5,6.5,"TimeMonitoring");
2985 
2986  histos->fill1DHistByType(tmbHead->ALCTMatchTime(),"TMB_ALCTMatchTime","TMB_ALCTMatchTime",layer.chamberId(), 7,-0.5,6.5,"TimeMonitoring");
2987 
2988  histos->fillProfile( chamberSerial(layer.chamberId()),tmbHead->ALCTMatchTime(),"prof_TMB_ALCTMatchTime","prof_TMB_ALCTMatchTime", 601,-0.5,600.5,-0.5,7.5,"TimeMonitoring");
2989  histos->fillProfile(ALCT0Key,tmbHead->ALCTMatchTime(),"prof_TMB_ALCTMatchTime_v_ALCT0KeyWG","prof_TMB_ALCTMatchTime_v_ALCT0KeyWG",128,-0.5,127.5,0,7,"TimeMonitoring");
2990  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");
2991 
2992  //Attempt to make a few sum plots
2993 
2994  int TMB_ALCT_rel_L1A = tmbHead->BXNCount()-(CLCTPretrigger+2+tmbHead->ALCTMatchTime());
2995  if (TMB_ALCT_rel_L1A > 3563)
2996  TMB_ALCT_rel_L1A = TMB_ALCT_rel_L1A - 3564;
2997  if (TMB_ALCT_rel_L1A < 0)
2998  TMB_ALCT_rel_L1A = TMB_ALCT_rel_L1A + 3564;
2999 
3000  //Plot TMB_ALCT_rel_L1A
3001  histos->fill1DHist(TMB_ALCT_rel_L1A,"h1D_TMB_ALCT_rel_L1A","h1D_TMB_ALCT_rel_L1A",11,144.5,155.5,"TimeMonitoring");
3002  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");
3003  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");
3004  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");
3005  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");
3006 
3007  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");
3008  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");
3009  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");
3010  }
3011 
3012  } // end CSCData loop
3013  } // end ddu data loop
3014  } // end if goodEvent
3015  if (examiner!=nullptr) delete examiner;
3016  }// end if non-zero fed data
3017  } // end DCC loop for NON-REFERENCE
3018 
3019 }
3020 
3021 
3023 
3024  std::cout<<"Events in "<<nEventsAnalyzed<<std::endl;
3025 }
3026 
3028 
#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
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
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:106
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
void doCompTiming(const CSCComparatorDigiCollection &)
float xy() const
Definition: LocalError.h:25
static const int CSC
Definition: MuonSubdetId.h:13
void doPedestalNoise(edm::Handle< CSCStripDigiCollection > strips)
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 T & get() const
Definition: EventSetup.h:55
const CSCChamber * chamber(CSCDetId id) const
Return the chamber corresponding to given DetId.
Definition: CSCGeometry.cc:118
std::vector< CSCWireDigi >::const_iterator const_iterator
double S(const TLorentzVector &, const TLorentzVector &)
Definition: Particle.cc:99
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
if(dp >Float(M_PI)) dp-
void doStandalone(edm::Handle< reco::TrackCollection > saMuons)
static const int RPC
Definition: MuonSubdetId.h:14
int chamberSerial(CSCDetId id)
const CSCLayer * layer(CSCDetId id) const
Return the layer corresponding to given DetId.
Definition: CSCGeometry.cc:124
std::vector< L1MuGMTReadoutRecord > const & getRecords() const
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
static const int DT
Definition: MuonSubdetId.h:12
Definition: errors.py:1
void doADCTiming(const CSCRecHit2DCollection &)
CrosstalkContainer crosstalk
NoiseMatrixContainer matrix
CSCValidation(const edm::ParameterSet &pset)
Constructor.
void doSegments(edm::Handle< CSCSegmentCollection > cscSegments, edm::ESHandle< CSCGeometry > cscGeom)
def check(config)
Definition: trackerTree.py:14
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
TrackingRecHitCollection::base::const_iterator trackingRecHit_iterator
iterator over a vector of reference to TrackingRecHit in the same collection
Definition: event.py:1
void doCalibrations(const edm::EventSetup &eventSetup)
Definition: vlib.h:39