00001
00002
00003
00004
00005
00006
00007
00008 #include "RecoLocalMuon/CSCValidation/src/CSCValidation.h"
00009
00010 using namespace std;
00011 using namespace edm;
00012
00013
00015
00017 CSCValidation::CSCValidation(const ParameterSet& pset){
00018
00019
00020 rootFileName = pset.getUntrackedParameter<std::string>("rootFileName","valHists.root");
00021 isSimulation = pset.getUntrackedParameter<bool>("isSimulation",false);
00022 writeTreeToFile = pset.getUntrackedParameter<bool>("writeTreeToFile",true);
00023 detailedAnalysis = pset.getUntrackedParameter<bool>("detailedAnalysis",false);
00024 useDigis = pset.getUntrackedParameter<bool>("useDigis",true);
00025
00026
00027 useQualityFilter = pset.getUntrackedParameter<bool>("useQualityFilter",false);
00028 pMin = pset.getUntrackedParameter<double>("pMin",4.);
00029 chisqMax = pset.getUntrackedParameter<double>("chisqMax",20.);
00030 nCSCHitsMin = pset.getUntrackedParameter<int>("nCSCHitsMin",10);
00031 nCSCHitsMax = pset.getUntrackedParameter<int>("nCSCHitsMax",25);
00032 lengthMin = pset.getUntrackedParameter<double>("lengthMin",140.);
00033 lengthMax = pset.getUntrackedParameter<double>("lengthMax",600.);
00034 deltaPhiMax = pset.getUntrackedParameter<double>("deltaPhiMax",0.2);
00035 polarMax = pset.getUntrackedParameter<double>("polarMax",0.7);
00036 polarMin = pset.getUntrackedParameter<double>("polarMin",0.3);
00037
00038
00039 useTriggerFilter = pset.getUntrackedParameter<bool>("useTriggerFilter",false);
00040
00041
00042 stripDigiTag = pset.getParameter<edm::InputTag>("stripDigiTag");
00043 wireDigiTag = pset.getParameter<edm::InputTag>("wireDigiTag");
00044 compDigiTag = pset.getParameter<edm::InputTag>("compDigiTag");
00045 alctDigiTag = pset.getParameter<edm::InputTag>("alctDigiTag") ;
00046 clctDigiTag = pset.getParameter<edm::InputTag>("clctDigiTag") ;
00047 corrlctDigiTag= pset.getParameter<edm::InputTag>("corrlctDigiTag") ;
00048 cscRecHitTag = pset.getParameter<edm::InputTag>("cscRecHitTag");
00049 cscSegTag = pset.getParameter<edm::InputTag>("cscSegTag");
00050 saMuonTag = pset.getParameter<edm::InputTag>("saMuonTag");
00051 l1aTag = pset.getParameter<edm::InputTag>("l1aTag");
00052 simHitTag = pset.getParameter<edm::InputTag>("simHitTag");
00053 hltTag = pset.getParameter<edm::InputTag>("hltTag");
00054
00055
00056 makeOccupancyPlots = pset.getUntrackedParameter<bool>("makeOccupancyPlots",true);
00057 makeTriggerPlots = pset.getUntrackedParameter<bool>("makeTriggerPlots",false);
00058 makeStripPlots = pset.getUntrackedParameter<bool>("makeStripPlots",true);
00059 makeWirePlots = pset.getUntrackedParameter<bool>("makeWirePlots",true);
00060 makeRecHitPlots = pset.getUntrackedParameter<bool>("makeRecHitPlots",true);
00061 makeSimHitPlots = pset.getUntrackedParameter<bool>("makeSimHitPlots",true);
00062 makeSegmentPlots = pset.getUntrackedParameter<bool>("makeSegmentPlots",true);
00063 makeResolutionPlots = pset.getUntrackedParameter<bool>("makeResolutionPlots",true);
00064 makePedNoisePlots = pset.getUntrackedParameter<bool>("makePedNoisePlots",true);
00065 makeEfficiencyPlots = pset.getUntrackedParameter<bool>("makeEfficiencyPlots",true);
00066 makeGasGainPlots = pset.getUntrackedParameter<bool>("makeGasGainPlots",true);
00067 makeAFEBTimingPlots = pset.getUntrackedParameter<bool>("makeAFEBTimingPlots",true);
00068 makeCompTimingPlots = pset.getUntrackedParameter<bool>("makeCompTimingPlots",true);
00069 makeADCTimingPlots = pset.getUntrackedParameter<bool>("makeADCTimingPlots",true);
00070 makeRHNoisePlots = pset.getUntrackedParameter<bool>("makeRHNoisePlots",false);
00071 makeCalibPlots = pset.getUntrackedParameter<bool>("makeCalibPlots",false);
00072 makeStandalonePlots = pset.getUntrackedParameter<bool>("makeStandalonePlots",false);
00073 makeTimeMonitorPlots = pset.getUntrackedParameter<bool>("makeTimeMonitorPlots",false);
00074 makeHLTPlots = pset.getUntrackedParameter<bool>("makeHLTPlots",false);
00075
00076
00077 nEventsAnalyzed = 0;
00078 rhTreeCount = 0;
00079 segTreeCount = 0;
00080 firstEvent = true;
00081
00082
00083 theFile = new TFile(rootFileName.c_str(), "RECREATE");
00084 theFile->cd();
00085
00086
00087 histos = new CSCValHists();
00088
00089
00090 hOWires = new TH2I("hOWires","Wire Digi Occupancy",36,0.5,36.5,20,0.5,20.5);
00091 hOStrips = new TH2I("hOStrips","Strip Digi Occupancy",36,0.5,36.5,20,0.5,20.5);
00092 hORecHits = new TH2I("hORecHits","RecHit Occupancy",36,0.5,36.5,20,0.5,20.5);
00093 hOSegments = new TH2I("hOSegments","Segments Occupancy",36,0.5,36.5,20,0.5,20.5);
00094
00095
00096 hSSTE = new TH1F("hSSTE","hSSTE",40,0,40);
00097 hRHSTE = new TH1F("hRHSTE","hRHSTE",40,0,40);
00098 hSEff = new TH1F("hSEff","Segment Efficiency",20,0.5,20.5);
00099 hRHEff = new TH1F("hRHEff","recHit Efficiency",20,0.5,20.5);
00100
00101 const int nChambers = 36;
00102 const int nTypes = 18;
00103 float nCH_min = 0.5;
00104 float nCh_max = float(nChambers) + 0.5;
00105 float nT_min = 0.5;
00106 float nT_max = float(nTypes) + 0.5;
00107
00108 hSSTE2 = new TH2F("hSSTE2","hSSTE2",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
00109 hRHSTE2 = new TH2F("hRHSTE2","hRHSTE2",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
00110 hStripSTE2 = new TH2F("hStripSTE2","hStripSTE2",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
00111 hWireSTE2 = new TH2F("hWireSTE2","hWireSTE2",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
00112
00113
00114 hEffDenominator = new TH2F("hEffDenominator","hEffDenominator",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
00115 hSEff2 = new TH2F("hSEff2","Segment Efficiency 2D",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
00116 hRHEff2 = new TH2F("hRHEff2","recHit Efficiency 2D",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
00117
00118 hStripEff2 = new TH2F("hStripEff2","strip Efficiency 2D",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
00119 hWireEff2 = new TH2F("hWireEff2","wire Efficiency 2D",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
00120
00121 hSensitiveAreaEvt = new TH2F("hSensitiveAreaEvt","events in sensitive area",nChambers,nCH_min,nCh_max, nTypes, nT_min, nT_max);
00122
00123
00124 if (writeTreeToFile) histos->setupTrees();
00125
00126
00127 }
00128
00130
00132 CSCValidation::~CSCValidation(){
00133
00134
00135 histoEfficiency(hRHSTE,hRHEff);
00136 histoEfficiency(hSSTE,hSEff);
00137 hSEff2->Divide(hSSTE2,hEffDenominator,1.,1.,"B");
00138 hRHEff2->Divide(hRHSTE2,hEffDenominator,1.,1.,"B");
00139 hStripEff2->Divide(hStripSTE2,hEffDenominator,1.,1.,"B");
00140 hWireEff2->Divide(hWireSTE2,hEffDenominator,1.,1.,"B");
00141
00142 histos->insertPlot(hRHSTE,"hRHSTE","Efficiency");
00143 histos->insertPlot(hSSTE,"hSSTE","Efficiency");
00144 histos->insertPlot(hSSTE2,"hSSTE2","Efficiency");
00145 histos->insertPlot(hEffDenominator,"hEffDenominator","Efficiency");
00146 histos->insertPlot(hRHSTE2,"hRHSTE2","Efficiency");
00147 histos->insertPlot(hStripSTE2,"hStripSTE2","Efficiency");
00148 histos->insertPlot(hWireSTE2,"hWireSTE2","Efficiency");
00149
00150
00151 histos->insertPlot(hSEff,"hSEff","Efficiency");
00152 histos->insertPlot(hRHEff,"hRHEff","Efficiency");
00153
00154 histos->insertPlot(hSEff2,"hSEff2","Efficiency");
00155 histos->insertPlot(hRHEff2,"hRHEff2","Efficiency");
00156 histos->insertPlot(hStripEff2,"hStripff2","Efficiency");
00157 histos->insertPlot(hWireEff2,"hWireff2","Efficiency");
00158
00159 histos->insertPlot(hSensitiveAreaEvt,"","Efficiency");
00160
00161
00162 histos->insertPlot(hOWires,"hOWires","Digis");
00163 histos->insertPlot(hOStrips,"hOStrips","Digis");
00164 histos->insertPlot(hORecHits,"hORecHits","recHits");
00165 histos->insertPlot(hOSegments,"hOSegments","Segments");
00166
00167
00168
00169 histos->writeHists(theFile);
00170 if (writeTreeToFile) histos->writeTrees(theFile);
00171 theFile->Close();
00172
00173 }
00174
00176
00178 void CSCValidation::analyze(const Event & event, const EventSetup& eventSetup){
00179
00180 nEventsAnalyzed++;
00181
00182
00183
00184
00185
00186 edm::Handle<CSCWireDigiCollection> wires;
00187 edm::Handle<CSCStripDigiCollection> strips;
00188 edm::Handle<CSCComparatorDigiCollection> compars;
00189 edm::Handle<CSCALCTDigiCollection> alcts;
00190 edm::Handle<CSCCLCTDigiCollection> clcts;
00191 edm::Handle<CSCCorrelatedLCTDigiCollection> correlatedlcts;
00192 if (useDigis){
00193 event.getByLabel(stripDigiTag,strips);
00194 event.getByLabel(wireDigiTag,wires);
00195 event.getByLabel(compDigiTag,compars);
00196 event.getByLabel(alctDigiTag, alcts);
00197 event.getByLabel(clctDigiTag, clcts);
00198 event.getByLabel(corrlctDigiTag, correlatedlcts);
00199 }
00200
00201
00202 ESHandle<CSCGeometry> cscGeom;
00203 eventSetup.get<MuonGeometryRecord>().get(cscGeom);
00204
00205
00206 Handle<CSCRecHit2DCollection> recHits;
00207 event.getByLabel(cscRecHitTag,recHits);
00208
00209
00210
00211
00212
00213
00214
00215
00216 Handle<PSimHitContainer> simHits;
00217 if (isSimulation) event.getByLabel(simHitTag, simHits);
00218
00219
00220 Handle<CSCSegmentCollection> cscSegments;
00221 event.getByLabel(cscSegTag, cscSegments);
00222
00223
00224 edm::Handle<L1MuGMTReadoutCollection> pCollection;
00225 if (makeTriggerPlots || useTriggerFilter || (useDigis && makeTimeMonitorPlots)){
00226 event.getByLabel(l1aTag,pCollection);
00227 }
00228 edm::Handle<TriggerResults> hlt;
00229 if (makeHLTPlots) event.getByLabel(hltTag,hlt);
00230
00231
00232 Handle<reco::TrackCollection> saMuons;
00233 if (makeStandalonePlots || useQualityFilter) event.getByLabel(saMuonTag,saMuons);
00234
00235
00236
00238
00240
00241
00242
00243 if (nEventsAnalyzed == 1 && makeCalibPlots) doCalibrations(eventSetup);
00244
00245
00246
00247 bool CSCL1A = false;
00248 if (makeTriggerPlots || useTriggerFilter) CSCL1A = doTrigger(pCollection);
00249 if (!useTriggerFilter) CSCL1A = true;
00250
00251
00252 cleanEvent = false;
00253 if (makeStandalonePlots || useQualityFilter) cleanEvent = filterEvents(recHits,cscSegments,saMuons);
00254 if (!useQualityFilter) cleanEvent = true;
00255
00256
00257
00258
00259 if (makeOccupancyPlots && CSCL1A) doOccupancies(strips,wires,recHits,cscSegments);
00260
00261
00262 if (makeHLTPlots) doHLT(hlt);
00263
00264
00265 if (cleanEvent && CSCL1A){
00266
00267
00268 if (makeStripPlots && useDigis) doStripDigis(strips);
00269
00270
00271 if (makeWirePlots && useDigis) doWireDigis(wires);
00272
00273
00274
00275 if (makeRecHitPlots) doRecHits(recHits,cscGeom);
00276
00277
00278 if (isSimulation && makeSimHitPlots) doSimHits(recHits,simHits);
00279
00280
00281 if (makeSegmentPlots) doSegments(cscSegments,cscGeom);
00282
00283
00284 if (makeResolutionPlots) doResolution(cscSegments,cscGeom);
00285
00286
00287
00288 if (makePedNoisePlots && useDigis) doPedestalNoise(strips);
00289
00290
00291 if (makeEfficiencyPlots) doEfficiencies(wires,strips, recHits, cscSegments,cscGeom);
00292
00293
00294 if (makeGasGainPlots && useDigis) doGasGain(*wires,*strips,*recHits);
00295
00296
00297
00298 if (makeAFEBTimingPlots && useDigis) doAFEBTiming(*wires);
00299
00300
00301 if (makeCompTimingPlots && useDigis) doCompTiming(*compars);
00302
00303
00304 if (makeADCTimingPlots) doADCTiming(*recHits);
00305
00306
00307
00308
00309 if (makeRHNoisePlots && useDigis) doNoiseHits(recHits,cscSegments,cscGeom,strips);
00310
00311
00312 if (makeStandalonePlots) doStandalone(saMuons);
00313
00314
00315 if (makeTimeMonitorPlots) doTimeMonitoring(recHits,cscSegments, alcts, clcts, correlatedlcts, pCollection,cscGeom, eventSetup, event);
00316
00317 firstEvent = false;
00318
00319 }
00320
00321 }
00322
00323
00324
00325
00326
00327
00328
00329 bool CSCValidation::filterEvents(edm::Handle<CSCRecHit2DCollection> recHits, edm::Handle<CSCSegmentCollection> cscSegments,
00330 edm::Handle<reco::TrackCollection> saMuons){
00331
00332
00333
00334 if (recHits->size() < 4 || recHits->size() > 100) return false;
00335 if (cscSegments->size() < 1 || cscSegments->size() > 15) return false;
00336 return true;
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400 }
00401
00402
00403
00404
00405
00406
00407
00408 void CSCValidation::doOccupancies(edm::Handle<CSCStripDigiCollection> strips, edm::Handle<CSCWireDigiCollection> wires,
00409 edm::Handle<CSCRecHit2DCollection> recHits, edm::Handle<CSCSegmentCollection> cscSegments){
00410
00411 bool wireo[2][4][4][36];
00412 bool stripo[2][4][4][36];
00413 bool rechito[2][4][4][36];
00414 bool segmento[2][4][4][36];
00415
00416 bool hasWires = false;
00417 bool hasStrips = false;
00418 bool hasRecHits = false;
00419 bool hasSegments = false;
00420
00421 for (int e = 0; e < 2; e++){
00422 for (int s = 0; s < 4; s++){
00423 for (int r = 0; r < 4; r++){
00424 for (int c = 0; c < 36; c++){
00425 wireo[e][s][r][c] = false;
00426 stripo[e][s][r][c] = false;
00427 rechito[e][s][r][c] = false;
00428 segmento[e][s][r][c] = false;
00429 }
00430 }
00431 }
00432 }
00433
00434 if (useDigis){
00435
00436 for (CSCWireDigiCollection::DigiRangeIterator wi=wires->begin(); wi!=wires->end(); wi++) {
00437 CSCDetId id = (CSCDetId)(*wi).first;
00438 int kEndcap = id.endcap();
00439 int kRing = id.ring();
00440 int kStation = id.station();
00441 int kChamber = id.chamber();
00442 std::vector<CSCWireDigi>::const_iterator wireIt = (*wi).second.first;
00443 std::vector<CSCWireDigi>::const_iterator lastWire = (*wi).second.second;
00444 for( ; wireIt != lastWire; ++wireIt){
00445 if (!wireo[kEndcap-1][kStation-1][kRing-1][kChamber-1]){
00446 wireo[kEndcap-1][kStation-1][kRing-1][kChamber-1] = true;
00447 hOWires->Fill(kChamber,typeIndex(id));
00448 histos->fill1DHist(chamberSerial(id),"hOWireSerial","Wire Occupancy by Chamber Serial",601,-0.5,600.5,"Digis");
00449 hasWires = true;
00450 }
00451 }
00452 }
00453
00454
00455 for (CSCStripDigiCollection::DigiRangeIterator si=strips->begin(); si!=strips->end(); si++) {
00456 CSCDetId id = (CSCDetId)(*si).first;
00457 int kEndcap = id.endcap();
00458 int kRing = id.ring();
00459 int kStation = id.station();
00460 int kChamber = id.chamber();
00461 std::vector<CSCStripDigi>::const_iterator stripIt = (*si).second.first;
00462 std::vector<CSCStripDigi>::const_iterator lastStrip = (*si).second.second;
00463 for( ; stripIt != lastStrip; ++stripIt) {
00464 std::vector<int> myADCVals = stripIt->getADCCounts();
00465 bool thisStripFired = false;
00466 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
00467 float threshold = 13.3 ;
00468 float diff = 0.;
00469 for (unsigned int iCount = 0; iCount < myADCVals.size(); iCount++) {
00470 diff = (float)myADCVals[iCount]-thisPedestal;
00471 if (diff > threshold) { thisStripFired = true; }
00472 }
00473 if (thisStripFired) {
00474 if (!stripo[kEndcap-1][kStation-1][kRing-1][kChamber-1]){
00475 stripo[kEndcap-1][kStation-1][kRing-1][kChamber-1] = true;
00476 hOStrips->Fill(kChamber,typeIndex(id));
00477 histos->fill1DHist(chamberSerial(id),"hOStripSerial","Strip Occupancy by Chamber Serial",601,-0.5,600.5,"Digis");
00478 hasStrips = true;
00479 }
00480 }
00481 }
00482 }
00483 }
00484
00485
00486 CSCRecHit2DCollection::const_iterator recIt;
00487 for (recIt = recHits->begin(); recIt != recHits->end(); recIt++) {
00488 CSCDetId idrec = (CSCDetId)(*recIt).cscDetId();
00489 int kEndcap = idrec.endcap();
00490 int kRing = idrec.ring();
00491 int kStation = idrec.station();
00492 int kChamber = idrec.chamber();
00493 if (!rechito[kEndcap-1][kStation-1][kRing-1][kChamber-1]){
00494 rechito[kEndcap-1][kStation-1][kRing-1][kChamber-1] = true;
00495 histos->fill1DHist(chamberSerial(idrec),"hORecHitsSerial","RecHit Occupancy by Chamber Serial",601,-0.5,600.5,"recHits");
00496 hORecHits->Fill(kChamber,typeIndex(idrec));
00497 hasRecHits = true;
00498 }
00499 }
00500
00501
00502 for(CSCSegmentCollection::const_iterator segIt=cscSegments->begin(); segIt != cscSegments->end(); segIt++) {
00503 CSCDetId id = (CSCDetId)(*segIt).cscDetId();
00504 int kEndcap = id.endcap();
00505 int kRing = id.ring();
00506 int kStation = id.station();
00507 int kChamber = id.chamber();
00508 if (!segmento[kEndcap-1][kStation-1][kRing-1][kChamber-1]){
00509 segmento[kEndcap-1][kStation-1][kRing-1][kChamber-1] = true;
00510 histos->fill1DHist(chamberSerial(id),"hOSegmentsSerial","Segment Occupancy by Chamber Serial",601,-0.5,600.5,"Segments");
00511 hOSegments->Fill(kChamber,typeIndex(id));
00512 hasSegments = true;
00513 }
00514 }
00515
00516
00517 histos->fill1DHist(1,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
00518 if (hasWires) histos->fill1DHist(3,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
00519 if (hasStrips) histos->fill1DHist(5,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
00520 if (hasWires && hasStrips) histos->fill1DHist(7,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
00521 if (hasRecHits) histos->fill1DHist(9,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
00522 if (hasSegments) histos->fill1DHist(11,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
00523 if (!cleanEvent) histos->fill1DHist(13,"hCSCOccupancy","overall CSC occupancy",15,-0.5,14.5,"GeneralHists");
00524
00525 }
00526
00527
00528
00529
00530
00531
00532
00533 bool CSCValidation::doTrigger(edm::Handle<L1MuGMTReadoutCollection> pCollection){
00534
00535 std::vector<L1MuGMTReadoutRecord> L1Mrec = pCollection->getRecords();
00536 std::vector<L1MuGMTReadoutRecord>::const_iterator igmtrr;
00537
00538 bool csc_l1a = false;
00539 bool dt_l1a = false;
00540 bool rpcf_l1a = false;
00541 bool rpcb_l1a = false;
00542 bool beamHaloTrigger = false;
00543
00544 int myBXNumber = -1000;
00545
00546 for(igmtrr=L1Mrec.begin(); igmtrr!=L1Mrec.end(); igmtrr++) {
00547 std::vector<L1MuRegionalCand>::const_iterator iter1;
00548 std::vector<L1MuRegionalCand> rmc;
00549
00550
00551 int icsc = 0;
00552 rmc = igmtrr->getCSCCands();
00553 for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
00554 if ( !(*iter1).empty() ) {
00555 icsc++;
00556 int kQuality = (*iter1).quality();
00557 if (kQuality == 1) beamHaloTrigger = true;
00558 }
00559 }
00560 if (igmtrr->getBxInEvent() == 0 && icsc>0) csc_l1a = true;
00561 if (igmtrr->getBxInEvent() == 0 ) { myBXNumber = igmtrr->getBxNr(); }
00562
00563
00564 int idt = 0;
00565 rmc = igmtrr->getDTBXCands();
00566 for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
00567 if ( !(*iter1).empty() ) {
00568 idt++;
00569 }
00570 }
00571 if(igmtrr->getBxInEvent()==0 && idt>0) dt_l1a = true;
00572
00573
00574 int irpcb = 0;
00575 rmc = igmtrr->getBrlRPCCands();
00576 for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
00577 if ( !(*iter1).empty() ) {
00578 irpcb++;
00579 }
00580 }
00581 if(igmtrr->getBxInEvent()==0 && irpcb>0) rpcb_l1a = true;
00582
00583
00584 int irpcf = 0;
00585 rmc = igmtrr->getFwdRPCCands();
00586 for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
00587 if ( !(*iter1).empty() ) {
00588 irpcf++;
00589 }
00590 }
00591 if(igmtrr->getBxInEvent()==0 && irpcf>0) rpcf_l1a = true;
00592
00593 }
00594
00595
00596 if (csc_l1a) histos->fill1DHist(myBXNumber,"vtBXNumber","BX Number",4001,-0.5,4000.5,"Trigger");
00597 if (csc_l1a) histos->fill1DHist(1,"vtBits","trigger bits",11,-0.5,10.5,"Trigger");
00598 if (dt_l1a) histos->fill1DHist(2,"vtBits","trigger bits",11,-0.5,10.5,"Trigger");
00599 if (rpcb_l1a) histos->fill1DHist(3,"vtBits","trigger bits",11,-0.5,10.5,"Trigger");
00600 if (rpcf_l1a) histos->fill1DHist(4,"vtBits","trigger bits",11,-0.5,10.5,"Trigger");
00601 if (beamHaloTrigger) histos->fill1DHist(8,"vtBits","trigger bits",11,-0.5,10.5,"Trigger");
00602
00603 if (csc_l1a) {
00604 histos->fill1DHist(1,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
00605 if (dt_l1a) histos->fill1DHist(2,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
00606 if (rpcb_l1a) histos->fill1DHist(3,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
00607 if (rpcf_l1a) histos->fill1DHist(4,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
00608 if ( dt_l1a || rpcb_l1a || rpcf_l1a) histos->fill1DHist(5,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
00609 if (!(dt_l1a || rpcb_l1a || rpcf_l1a)) histos->fill1DHist(6,"vtCSCY","trigger bits",11,-0.5,10.5,"Trigger");
00610 } else {
00611 histos->fill1DHist(1,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
00612 if (dt_l1a) histos->fill1DHist(2,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
00613 if (rpcb_l1a) histos->fill1DHist(3,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
00614 if (rpcf_l1a) histos->fill1DHist(4,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
00615 if ( dt_l1a || rpcb_l1a || rpcf_l1a) histos->fill1DHist(5,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
00616 if (!(dt_l1a || rpcb_l1a || rpcf_l1a)) histos->fill1DHist(6,"vtCSCN","trigger bits",11,-0.5,10.5,"Trigger");
00617 }
00618
00619
00620
00621 if (csc_l1a) return true;
00622
00623 return false;
00624
00625 }
00626
00627
00628
00629
00630
00631
00632
00633 bool CSCValidation::doHLT(Handle<TriggerResults> hlt){
00634
00635
00636 int hltSize = hlt->size();
00637 for (int i = 0; i < hltSize; ++i){
00638 if (hlt->accept(i)) histos->fill1DHist(i,"hltBits","HLT Trigger Bits",hltSize+1,-0.5,(float)hltSize+0.5,"Trigger");
00639 }
00640
00641 return true;
00642 }
00643
00644
00645
00646
00647
00648
00649
00650
00651 void CSCValidation::doCalibrations(const edm::EventSetup& eventSetup){
00652
00653
00654 if (nEventsAnalyzed == 1){
00655
00656 LogDebug("Calibrations") << "Loading Calibrations...";
00657
00658
00659 edm::ESHandle<CSCDBGains> hGains;
00660 eventSetup.get<CSCDBGainsRcd>().get( hGains );
00661 const CSCDBGains* pGains = hGains.product();
00662
00663 edm::ESHandle<CSCDBCrosstalk> hCrosstalk;
00664 eventSetup.get<CSCDBCrosstalkRcd>().get( hCrosstalk );
00665 const CSCDBCrosstalk* pCrosstalk = hCrosstalk.product();
00666
00667 edm::ESHandle<CSCDBNoiseMatrix> hNoiseMatrix;
00668 eventSetup.get<CSCDBNoiseMatrixRcd>().get( hNoiseMatrix );
00669 const CSCDBNoiseMatrix* pNoiseMatrix = hNoiseMatrix.product();
00670
00671 edm::ESHandle<CSCDBPedestals> hPedestals;
00672 eventSetup.get<CSCDBPedestalsRcd>().get( hPedestals );
00673 const CSCDBPedestals* pPedestals = hPedestals.product();
00674
00675 LogDebug("Calibrations") << "Calibrations Loaded!";
00676
00677 for (int i = 0; i < 400; i++){
00678 int bin = i+1;
00679 histos->fillCalibHist(pGains->gains[i].gain_slope,"hCalibGainsS","Gains Slope",400,0,400,bin,"Calib");
00680 histos->fillCalibHist(pCrosstalk->crosstalk[i].xtalk_slope_left,"hCalibXtalkSL","Xtalk Slope Left",400,0,400,bin,"Calib");
00681 histos->fillCalibHist(pCrosstalk->crosstalk[i].xtalk_slope_right,"hCalibXtalkSR","Xtalk Slope Right",400,0,400,bin,"Calib");
00682 histos->fillCalibHist(pCrosstalk->crosstalk[i].xtalk_intercept_left,"hCalibXtalkIL","Xtalk Intercept Left",400,0,400,bin,"Calib");
00683 histos->fillCalibHist(pCrosstalk->crosstalk[i].xtalk_intercept_right,"hCalibXtalkIR","Xtalk Intercept Right",400,0,400,bin,"Calib");
00684 histos->fillCalibHist(pPedestals->pedestals[i].ped,"hCalibPedsP","Peds",400,0,400,bin,"Calib");
00685 histos->fillCalibHist(pPedestals->pedestals[i].rms,"hCalibPedsR","Peds RMS",400,0,400,bin,"Calib");
00686 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem33,"hCalibNoise33","Noise Matrix 33",400,0,400,bin,"Calib");
00687 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem34,"hCalibNoise34","Noise Matrix 34",400,0,400,bin,"Calib");
00688 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem35,"hCalibNoise35","Noise Matrix 35",400,0,400,bin,"Calib");
00689 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem44,"hCalibNoise44","Noise Matrix 44",400,0,400,bin,"Calib");
00690 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem45,"hCalibNoise45","Noise Matrix 45",400,0,400,bin,"Calib");
00691 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem46,"hCalibNoise46","Noise Matrix 46",400,0,400,bin,"Calib");
00692 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem55,"hCalibNoise55","Noise Matrix 55",400,0,400,bin,"Calib");
00693 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem56,"hCalibNoise56","Noise Matrix 56",400,0,400,bin,"Calib");
00694 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem57,"hCalibNoise57","Noise Matrix 57",400,0,400,bin,"Calib");
00695 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem66,"hCalibNoise66","Noise Matrix 66",400,0,400,bin,"Calib");
00696 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem67,"hCalibNoise67","Noise Matrix 67",400,0,400,bin,"Calib");
00697 histos->fillCalibHist(pNoiseMatrix->matrix[i].elem77,"hCalibNoise77","Noise Matrix 77",400,0,400,bin,"Calib");
00698
00699
00700 }
00701
00702 }
00703
00704
00705 }
00706
00707
00708
00709
00710
00711
00712
00713
00714 void CSCValidation::doWireDigis(edm::Handle<CSCWireDigiCollection> wires){
00715
00716 int nWireGroupsTotal = 0;
00717 for (CSCWireDigiCollection::DigiRangeIterator dWDiter=wires->begin(); dWDiter!=wires->end(); dWDiter++) {
00718 CSCDetId id = (CSCDetId)(*dWDiter).first;
00719 std::vector<CSCWireDigi>::const_iterator wireIter = (*dWDiter).second.first;
00720 std::vector<CSCWireDigi>::const_iterator lWire = (*dWDiter).second.second;
00721 for( ; wireIter != lWire; ++wireIter) {
00722 int myWire = wireIter->getWireGroup();
00723 int myTBin = wireIter->getTimeBin();
00724 nWireGroupsTotal++;
00725 histos->fill1DHistByType(myWire,"hWireWire","Wiregroup Numbers Fired",id,113,-0.5,112.5,"Digis");
00726 histos->fill1DHistByType(myTBin,"hWireTBin","Wire TimeBin Fired",id,17,-0.5,16.5,"Digis");
00727 histos->fillProfile(chamberSerial(id),myTBin,"hWireTBinProfile","Wire TimeBin Fired",601,-0.5,600.5,-0.5,16.5,"Digis");
00728 if (detailedAnalysis){
00729 histos->fill1DHistByLayer(myWire,"hWireWire","Wiregroup Numbers Fired",id,113,-0.5,112.5,"WireNumberByLayer");
00730 histos->fill1DHistByLayer(myTBin,"hWireTBin","Wire TimeBin Fired",id,17,-0.5,16.5,"WireTimeByLayer");
00731 }
00732 }
00733 }
00734
00735
00736 if (nWireGroupsTotal == 0) nWireGroupsTotal = -1;
00737
00738 histos->fill1DHist(nWireGroupsTotal,"hWirenGroupsTotal","Wires Fired Per Event",151,-0.5,150.5,"Digis");
00739
00740 }
00741
00742
00743
00744
00745
00746
00747
00748 void CSCValidation::doStripDigis(edm::Handle<CSCStripDigiCollection> strips){
00749
00750 int nStripsFired = 0;
00751 for (CSCStripDigiCollection::DigiRangeIterator dSDiter=strips->begin(); dSDiter!=strips->end(); dSDiter++) {
00752 CSCDetId id = (CSCDetId)(*dSDiter).first;
00753 std::vector<CSCStripDigi>::const_iterator stripIter = (*dSDiter).second.first;
00754 std::vector<CSCStripDigi>::const_iterator lStrip = (*dSDiter).second.second;
00755 for( ; stripIter != lStrip; ++stripIter) {
00756 int myStrip = stripIter->getStrip();
00757 std::vector<int> myADCVals = stripIter->getADCCounts();
00758 bool thisStripFired = false;
00759 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
00760 float threshold = 13.3 ;
00761 float diff = 0.;
00762 for (unsigned int iCount = 0; iCount < myADCVals.size(); iCount++) {
00763 diff = (float)myADCVals[iCount]-thisPedestal;
00764 if (diff > threshold) { thisStripFired = true; }
00765 }
00766 if (thisStripFired) {
00767 nStripsFired++;
00768
00769 histos->fill1DHistByType(myStrip,"hStripStrip","Strip Number",id,81,-0.5,80.5,"Digis");
00770 if (detailedAnalysis){
00771 histos->fill1DHistByLayer(myStrip,"hStripStrip","Strip Number",id,81,-0.5,80.5,"StripNumberByLayer");
00772 }
00773 }
00774 }
00775 }
00776
00777 if (nStripsFired == 0) nStripsFired = -1;
00778
00779 histos->fill1DHist(nStripsFired,"hStripNFired","Fired Strips per Event",251,-0.5,250.5,"Digis");
00780
00781 }
00782
00783
00784
00785
00786
00787
00788
00789 void CSCValidation::doPedestalNoise(edm::Handle<CSCStripDigiCollection> strips){
00790
00791 for (CSCStripDigiCollection::DigiRangeIterator dPNiter=strips->begin(); dPNiter!=strips->end(); dPNiter++) {
00792 CSCDetId id = (CSCDetId)(*dPNiter).first;
00793 std::vector<CSCStripDigi>::const_iterator pedIt = (*dPNiter).second.first;
00794 std::vector<CSCStripDigi>::const_iterator lStrip = (*dPNiter).second.second;
00795 for( ; pedIt != lStrip; ++pedIt) {
00796 int myStrip = pedIt->getStrip();
00797 std::vector<int> myADCVals = pedIt->getADCCounts();
00798 float TotalADC = getSignal(*strips, id, myStrip);
00799 bool thisStripFired = false;
00800 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
00801 float thisSignal = (1./6)*(myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
00802 float threshold = 13.3;
00803 if(id.station() == 1 && id.ring() == 4)
00804 {
00805 if(myStrip <= 16) myStrip += 64;
00806 }
00807 if (TotalADC > threshold) { thisStripFired = true;}
00808 if (!thisStripFired){
00809 float ADC = thisSignal - thisPedestal;
00810 histos->fill1DHist(ADC,"hStripPed","Pedestal Noise Distribution",50,-25.,25.,"PedestalNoise");
00811 histos->fill1DHistByType(ADC,"hStripPedME","Pedestal Noise Distribution",id,50,-25.,25.,"PedestalNoise");
00812 histos->fillProfile(chamberSerial(id),ADC,"hStripPedMEProfile","Wire TimeBin Fired",601,-0.5,600.5,-25,25,"PedestalNoise");
00813 if (detailedAnalysis){
00814 histos->fill1DHistByLayer(ADC,"hStripPedME","Pedestal Noise Distribution",id,50,-25.,25.,"PedestalNoiseByLayer");
00815 }
00816 }
00817 }
00818 }
00819
00820 }
00821
00822
00823
00824
00825
00826
00827
00828
00829 void CSCValidation::doRecHits(edm::Handle<CSCRecHit2DCollection> recHits, edm::ESHandle<CSCGeometry> cscGeom){
00830
00831
00832 int nRecHits = recHits->size();
00833
00834
00835
00836
00837 int iHit = 0;
00838
00839
00840 CSCRecHit2DCollection::const_iterator dRHIter;
00841 for (dRHIter = recHits->begin(); dRHIter != recHits->end(); dRHIter++) {
00842 iHit++;
00843
00844
00845 CSCDetId idrec = (CSCDetId)(*dRHIter).cscDetId();
00846 int kEndcap = idrec.endcap();
00847 int kRing = idrec.ring();
00848 int kStation = idrec.station();
00849 int kChamber = idrec.chamber();
00850 int kLayer = idrec.layer();
00851
00852
00853 LocalPoint rhitlocal = (*dRHIter).localPosition();
00854 float xreco = rhitlocal.x();
00855 float yreco = rhitlocal.y();
00856 LocalError rerrlocal = (*dRHIter).localPositionError();
00857
00858 float xxerr = rerrlocal.xx();
00859 float yyerr = rerrlocal.yy();
00860 float xyerr = rerrlocal.xy();
00861
00862 float stpos = (*dRHIter).positionWithinStrip();
00863 float sterr = (*dRHIter).errorWithinStrip();
00864
00865
00866 float rHSumQ = 0;
00867 float sumsides=0.;
00868 int adcsize=dRHIter->nStrips()*dRHIter->nTimeBins();
00869 for ( unsigned int i=0; i< dRHIter->nStrips(); i++) {
00870 for ( unsigned int j=0; j< dRHIter->nTimeBins()-1; j++) {
00871 rHSumQ+=dRHIter->adcs(i,j);
00872 if (i!=1) sumsides+=dRHIter->adcs(i,j);
00873 }
00874 }
00875
00876 float rHratioQ = sumsides/rHSumQ;
00877 if (adcsize != 12) rHratioQ = -99;
00878
00879
00880 float rHtime = 0;
00881 rHtime = (*dRHIter).tpeak()/50.;
00882
00883
00884 const CSCLayer* csclayer = cscGeom->layer( idrec );
00885
00886
00887 GlobalPoint rhitglobal= csclayer->toGlobal(rhitlocal);
00888 float grecx = rhitglobal.x();
00889 float grecy = rhitglobal.y();
00890
00891
00892 if (writeTreeToFile && rhTreeCount < 1500000){
00893 histos->fillRechitTree(xreco, yreco, grecx, grecy, kEndcap, kStation, kRing, kChamber, kLayer);
00894 rhTreeCount++;
00895 }
00896
00897
00898
00899 histos->fill2DHistByStation(grecx,grecy,"hRHGlobal","recHit Global Position",idrec,100,-800.,800.,100,-800.,800.,"recHits");
00900 if (kStation == 1 && (kRing == 1 || kRing == 4)) histos->fill1DHistByType(rHSumQ,"hRHSumQ","Sum 3x3 recHit Charge",idrec,125,0,4000,"recHits");
00901 else histos->fill1DHistByType(rHSumQ,"hRHSumQ","Sum 3x3 recHit Charge",idrec,125,0,2000,"recHits");
00902 histos->fill1DHistByType(rHratioQ,"hRHRatioQ","Charge Ratio (Ql+Qr)/Qt",idrec,120,-0.1,1.1,"recHits");
00903 histos->fill1DHistByType(rHtime,"hRHTiming","recHit Timing",idrec,200,-10,10,"recHits");
00904 histos->fill1DHistByType(sqrt(xxerr),"hRHxerr","RecHit Error on Local X",idrec,100,-0.1,2,"recHits");
00905 histos->fill1DHistByType(sqrt(yyerr),"hRHyerr","RecHit Error on Local Y",idrec,100,-0.1,2,"recHits");
00906 histos->fill1DHistByType(xyerr,"hRHxyerr","Corr. RecHit XY Error",idrec,100,-1,2,"recHits");
00907 if (adcsize == 12) histos->fill1DHistByType(stpos,"hRHstpos","Reconstructed Position on Strip",idrec,120,-0.6,0.6,"recHits");
00908 histos->fill1DHistByType(sterr,"hRHsterr","Estimated Error on Strip Measurement",idrec,120,-0.05,0.25,"recHits");
00909 histos->fillProfile(chamberSerial(idrec),rHSumQ,"hRHSumQProfile","Sum 3x3 recHit Charge",601,-0.5,600.5,0,4000,"recHits");
00910 histos->fillProfile(chamberSerial(idrec),rHtime,"hRHTimingProfile","recHit Timing",601,-0.5,600.5,-11,11,"recHits");
00911 if (detailedAnalysis){
00912 if (kStation == 1 && (kRing == 1 || kRing == 4)) histos->fill1DHistByLayer(rHSumQ,"hRHSumQ","Sum 3x3 recHit Charge",idrec,125,0,4000,"RHQByLayer");
00913 else histos->fill1DHistByLayer(rHSumQ,"hRHSumQ","Sum 3x3 recHit Charge",idrec,125,0,2000,"RHQByLayer");
00914 histos->fill1DHistByLayer(rHratioQ,"hRHRatioQ","Charge Ratio (Ql+Qr)/Qt",idrec,120,-0.1,1.1,"RHQByLayer");
00915 histos->fill1DHistByLayer(rHtime,"hRHTiming","recHit Timing",idrec,200,-10,10,"RHTimingByLayer");
00916 histos->fill2DHistByLayer(xreco,yreco,"hRHLocalXY","recHit Local Position",idrec,50,-100.,100.,75,-150.,150.,"RHLocalXYByLayer");
00917 histos->fill1DHistByLayer(sqrt(xxerr),"hRHxerr","RecHit Error on Local X",idrec,100,-0.1,2,"RHErrorsByLayer");
00918 histos->fill1DHistByLayer(sqrt(yyerr),"hRHyerr","RecHit Error on Local Y",idrec,100,-0.1,2,"RHErrorsByLayer");
00919 histos->fill1DHistByType(stpos,"hRHstpos","Reconstructed Position on Strip",idrec,120,-0.6,0.6,"RHStripPosByLayer");
00920 histos->fill1DHistByType(sterr,"hRHsterr","Estimated Error on Strip Measurement",idrec,120,-0.05,0.25,"RHStripPosByLayer");
00921 }
00922
00923 }
00924
00925 if (nRecHits == 0) nRecHits = -1;
00926
00927 histos->fill1DHist(nRecHits,"hRHnrechits","recHits per Event (all chambers)",151,-0.5,150.5,"recHits");
00928
00929 }
00930
00931
00932
00933
00934
00935
00936
00937 void CSCValidation::doSimHits(edm::Handle<CSCRecHit2DCollection> recHits, edm::Handle<PSimHitContainer> simHits){
00938
00939 CSCRecHit2DCollection::const_iterator dSHrecIter;
00940 for (dSHrecIter = recHits->begin(); dSHrecIter != recHits->end(); dSHrecIter++) {
00941
00942 CSCDetId idrec = (CSCDetId)(*dSHrecIter).cscDetId();
00943 LocalPoint rhitlocal = (*dSHrecIter).localPosition();
00944 float xreco = rhitlocal.x();
00945 float yreco = rhitlocal.y();
00946 float xError = sqrt((*dSHrecIter).localPositionError().xx());
00947 float yError = sqrt((*dSHrecIter).localPositionError().yy());
00948 float simHitXres = -99;
00949 float simHitYres = -99;
00950 float xPull = -99;
00951 float yPull = -99;
00952 float mindiffX = 99;
00953 float mindiffY = 10;
00954
00955 PSimHitContainer::const_iterator dSHsimIter;
00956 for (dSHsimIter = simHits->begin(); dSHsimIter != simHits->end(); dSHsimIter++){
00957
00958 CSCDetId sId = (CSCDetId)(*dSHsimIter).detUnitId();
00959
00960
00961 if (sId == idrec && abs((*dSHsimIter).particleType()) == 13){
00962
00963 LocalPoint sHitlocal = (*dSHsimIter).localPosition();
00964
00965
00966 if ((sHitlocal.x() - xreco) < mindiffX && (sHitlocal.y() - yreco) < mindiffY){
00967 simHitXres = (sHitlocal.x() - xreco);
00968 simHitYres = (sHitlocal.y() - yreco);
00969 mindiffX = (sHitlocal.x() - xreco);
00970 xPull = simHitXres/xError;
00971 yPull = simHitYres/yError;
00972 }
00973 }
00974 }
00975
00976 histos->fill1DHistByType(simHitXres,"hSimXResid","SimHitX - Reconstructed X",idrec,100,-1.0,1.0,"Resolution");
00977 histos->fill1DHistByType(simHitYres,"hSimYResid","SimHitY - Reconstructed Y",idrec,100,-5.0,5.0,"Resolution");
00978 histos->fill1DHistByType(xPull,"hSimXPull","Local X Pulls",idrec,100,-5.0,5.0,"Resolution");
00979 histos->fill1DHistByType(yPull,"hSimYPull","Local Y Pulls",idrec,100,-5.0,5.0,"Resolution");
00980
00981 }
00982
00983 }
00984
00985
00986
00987
00988
00989
00990
00991 void CSCValidation::doSegments(edm::Handle<CSCSegmentCollection> cscSegments, edm::ESHandle<CSCGeometry> cscGeom){
00992
00993
00994 int nSegments = cscSegments->size();
00995
00996
00997
00998
00999 int iSegment = 0;
01000 for(CSCSegmentCollection::const_iterator dSiter=cscSegments->begin(); dSiter != cscSegments->end(); dSiter++) {
01001 iSegment++;
01002
01003 CSCDetId id = (CSCDetId)(*dSiter).cscDetId();
01004 int kEndcap = id.endcap();
01005 int kRing = id.ring();
01006 int kStation = id.station();
01007 int kChamber = id.chamber();
01008
01009
01010 float chisq = (*dSiter).chi2();
01011 int nhits = (*dSiter).nRecHits();
01012 int nDOF = 2*nhits-4;
01013 double chisqProb = ChiSquaredProbability( (double)chisq, nDOF );
01014 LocalPoint localPos = (*dSiter).localPosition();
01015 float segX = localPos.x();
01016 float segY = localPos.y();
01017 LocalVector segDir = (*dSiter).localDirection();
01018 double theta = segDir.theta();
01019
01020
01021 float globX = 0.;
01022 float globY = 0.;
01023 float globTheta = 0.;
01024 float globPhi = 0.;
01025 const CSCChamber* cscchamber = cscGeom->chamber(id);
01026 if (cscchamber) {
01027 GlobalPoint globalPosition = cscchamber->toGlobal(localPos);
01028 globX = globalPosition.x();
01029 globY = globalPosition.y();
01030 GlobalVector globalDirection = cscchamber->toGlobal(segDir);
01031 globTheta = globalDirection.theta();
01032 globPhi = globalDirection.phi();
01033 }
01034
01035
01036
01037 if (writeTreeToFile && segTreeCount < 1500000){
01038 histos->fillSegmentTree(segX, segY, globX, globY, kEndcap, kStation, kRing, kChamber);
01039 segTreeCount++;
01040 }
01041
01042
01043 histos->fill2DHistByStation(globX,globY,"hSGlobal","Segment Global Positions;global x (cm)",id,100,-800.,800.,100,-800.,800.,"Segments");
01044 histos->fill1DHistByType(nhits,"hSnHits","N hits on Segments",id,8,-0.5,7.5,"Segments");
01045 histos->fill1DHistByType(theta,"hSTheta","local theta segments",id,128,-3.2,3.2,"Segments");
01046 histos->fill1DHistByType((chisq/nDOF),"hSChiSq","segments chi-squared/ndof",id,110,-0.05,10.5,"Segments");
01047 histos->fill1DHistByType(chisqProb,"hSChiSqProb","segments chi-squared probability",id,110,-0.05,1.05,"Segments");
01048 histos->fill1DHist(globTheta,"hSGlobalTheta","segment global theta",128,0,3.2,"Segments");
01049 histos->fill1DHist(globPhi,"hSGlobalPhi","segment global phi",128,-3.2,3.2,"Segments");
01050 histos->fillProfile(chamberSerial(id),nhits,"hSnHitsProfile","N hits on Segments",601,-0.5,600.5,-0.5,7.5,"Segments");
01051 if (detailedAnalysis){
01052 histos->fill1DHistByChamber(nhits,"hSnHits","N hits on Segments",id,8,-0.5,7.5,"HitsOnSegmentByChamber");
01053 histos->fill1DHistByChamber(theta,"hSTheta","local theta segments",id,128,-3.2,3.2,"DetailedSegments");
01054 histos->fill1DHistByChamber((chisq/nDOF),"hSChiSq","segments chi-squared/ndof",id,110,-0.05,10.5,"SegChi2ByChamber");
01055 histos->fill1DHistByChamber(chisqProb,"hSChiSqProb","segments chi-squared probability",id,110,-0.05,1.05,"SegChi2ByChamber");
01056 }
01057
01058 }
01059
01060 if (nSegments == 0) nSegments = -1;
01061
01062 histos->fill1DHist(nSegments,"hSnSegments","Segments per Event",31,-0.5,30.5,"Segments");
01063
01064 }
01065
01066
01067
01068
01069
01070
01071
01072 void CSCValidation::doResolution(edm::Handle<CSCSegmentCollection> cscSegments, edm::ESHandle<CSCGeometry> cscGeom){
01073
01074
01075 for(CSCSegmentCollection::const_iterator dSiter=cscSegments->begin(); dSiter != cscSegments->end(); dSiter++) {
01076
01077 CSCDetId id = (CSCDetId)(*dSiter).cscDetId();
01078
01079
01080
01081 std::vector<CSCRecHit2D> theseRecHits = (*dSiter).specificRecHits();
01082 int nRH = (*dSiter).nRecHits();
01083 int jRH = 0;
01084 CLHEP::HepMatrix sp(6,1);
01085 CLHEP::HepMatrix se(6,1);
01086 for ( std::vector<CSCRecHit2D>::const_iterator iRH = theseRecHits.begin(); iRH != theseRecHits.end(); iRH++) {
01087 jRH++;
01088 CSCDetId idRH = (CSCDetId)(*iRH).cscDetId();
01089 int kRing = idRH.ring();
01090 int kStation = idRH.station();
01091 int kLayer = idRH.layer();
01092
01093
01094 int centerid = iRH->nStrips()/2;
01095 int centerStrip = iRH->channels(centerid);
01096
01097
01098 if (nRH == 6){
01099 float stpos = (*iRH).positionWithinStrip();
01100 se(kLayer,1) = (*iRH).errorWithinStrip();
01101
01102 if (kStation == 1 && (kRing == 1 || kRing == 4)) sp(kLayer,1) = stpos + centerStrip;
01103 else{
01104 if (kLayer == 1 || kLayer == 3 || kLayer == 5) sp(kLayer,1) = stpos + centerStrip;
01105 if (kLayer == 2 || kLayer == 4 || kLayer == 6) sp(kLayer,1) = stpos - 0.5 + centerStrip;
01106 }
01107 }
01108
01109 }
01110
01111 float residual = -99;
01112 float pull = -99;
01113
01114 if (nRH == 6){
01115 float expected = fitX(sp,se);
01116 residual = expected - sp(3,1);
01117 pull = residual/se(3,1);
01118 }
01119
01120
01121 histos->fill1DHistByType(residual,"hSResid","Fitted Position on Strip - Reconstructed for Layer 3",id,100,-0.5,0.5,"Resolution");
01122 histos->fill1DHistByType(pull,"hSStripPosPull","Strip Measurement Pulls",id,100,-5.0,5.0,"Resolution");
01123 histos->fillProfile(chamberSerial(id),residual,"hSResidProfile","Fitted Position on Strip - Reconstructed for Layer 3",601,-0.5,600.5,-0.5,0.5,"Resolution");
01124 if (detailedAnalysis){
01125 histos->fill1DHistByChamber(residual,"hSResid","Fitted Position on Strip - Reconstructed for Layer 3",id,100,-0.5,0.5,"DetailedResolution");
01126 histos->fill1DHistByChamber(pull,"hSStripPosPull","Strip Measurement Pulls",id,100,-5.0,5.0,"Resolution");
01127 }
01128
01129
01130 }
01131
01132 }
01133
01134
01135
01136
01137
01138
01139
01140 void CSCValidation::doStandalone(Handle<reco::TrackCollection> saMuons){
01141
01142 int nSAMuons = saMuons->size();
01143 histos->fill1DHist(nSAMuons,"trNSAMuons","N Standalone Muons per Event",6,-0.5,5.5,"STAMuons");
01144
01145 for(reco::TrackCollection::const_iterator muon = saMuons->begin(); muon != saMuons->end(); ++ muon ) {
01146 float preco = muon->p();
01147 float ptreco = muon->pt();
01148 int n = muon->recHitsSize();
01149 float chi2 = muon->chi2();
01150 float normchi2 = muon->normalizedChi2();
01151
01152
01153 int nDTHits = 0;
01154 int nCSCHits = 0;
01155 int nCSCHitsp = 0;
01156 int nCSCHitsm = 0;
01157 int nRPCHits = 0;
01158 int nRPCHitsp = 0;
01159 int nRPCHitsm = 0;
01160 int np = 0;
01161 int nm = 0;
01162 std::vector<CSCDetId> staChambers;
01163 for (trackingRecHit_iterator hit = muon->recHitsBegin(); hit != muon->recHitsEnd(); ++hit ) {
01164 const DetId detId( (*hit)->geographicalId() );
01165 if (detId.det() == DetId::Muon) {
01166 if (detId.subdetId() == MuonSubdetId::RPC) {
01167 RPCDetId rpcId(detId.rawId());
01168 nRPCHits++;
01169 if (rpcId.region() == 1){ nRPCHitsp++; np++;}
01170 if (rpcId.region() == -1){ nRPCHitsm++; nm++;}
01171 }
01172 if (detId.subdetId() == MuonSubdetId::DT) {
01173 nDTHits++;
01174 }
01175 else if (detId.subdetId() == MuonSubdetId::CSC) {
01176 CSCDetId cscId(detId.rawId());
01177 staChambers.push_back(detId.rawId());
01178 nCSCHits++;
01179 if (cscId.endcap() == 1){ nCSCHitsp++; np++;}
01180 if (cscId.endcap() == 2){ nCSCHitsm++; nm++;}
01181 }
01182 }
01183 }
01184
01185 GlobalPoint innerPnt(muon->innerPosition().x(),muon->innerPosition().y(),muon->innerPosition().z());
01186 GlobalPoint outerPnt(muon->outerPosition().x(),muon->outerPosition().y(),muon->outerPosition().z());
01187 GlobalVector innerKin(muon->innerMomentum().x(),muon->innerMomentum().y(),muon->innerMomentum().z());
01188 GlobalVector outerKin(muon->outerMomentum().x(),muon->outerMomentum().y(),muon->outerMomentum().z());
01189 GlobalVector deltaPnt = innerPnt - outerPnt;
01190 double crudeLength = deltaPnt.mag();
01191 double deltaPhi = innerPnt.phi() - outerPnt.phi();
01192 double innerGlobalPolarAngle = innerKin.theta();
01193 double outerGlobalPolarAngle = outerKin.theta();
01194
01195
01196
01197 histos->fill1DHist(n,"trN","N hits on a STA Muon Track",51,-0.5,50.5,"STAMuons");
01198 if (np != 0) histos->fill1DHist(np,"trNp","N hits on a STA Muon Track (plus endcap)",51,-0.5,50.5,"STAMuons");
01199 if (nm != 0) histos->fill1DHist(nm,"trNm","N hits on a STA Muon Track (minus endcap)",51,-0.5,50.5,"STAMuons");
01200 histos->fill1DHist(nDTHits,"trNDT","N DT hits on a STA Muon Track",51,-0.5,50.5,"STAMuons");
01201 histos->fill1DHist(nCSCHits,"trNCSC","N CSC hits on a STA Muon Track",51,-0.5,50.5,"STAMuons");
01202 if (nCSCHitsp != 0) histos->fill1DHist(nCSCHitsp,"trNCSCp","N CSC hits on a STA Muon Track (+ endcap)",51,-0.5,50.5,"STAMuons");
01203 if (nCSCHitsm != 0) histos->fill1DHist(nCSCHitsm,"trNCSCm","N CSC hits on a STA Muon Track (- endcap)",51,-0.5,50.5,"STAMuons");
01204 histos->fill1DHist(nRPCHits,"trNRPC","N RPC hits on a STA Muon Track",51,-0.5,50.5,"STAMuons");
01205 if (nRPCHitsp != 0) histos->fill1DHist(nRPCHitsp,"trNRPCp","N RPC hits on a STA Muon Track (+ endcap)",51,-0.5,50.5,"STAMuons");
01206 if (nRPCHitsm != 0) histos->fill1DHist(nRPCHitsm,"trNRPCm","N RPC hits on a STA Muon Track (- endcap)",51,-0.5,50.5,"STAMuons");
01207 histos->fill1DHist(preco,"trP","STA Muon Momentum",100,0,300,"STAMuons");
01208 histos->fill1DHist(ptreco,"trPT","STA Muon pT",100,0,40,"STAMuons");
01209 histos->fill1DHist(chi2,"trChi2","STA Muon Chi2",100,0,200,"STAMuons");
01210 histos->fill1DHist(normchi2,"trNormChi2","STA Muon Normalized Chi2",100,0,10,"STAMuons");
01211 histos->fill1DHist(crudeLength,"trLength","Straight Line Length of STA Muon",120,0.,2400.,"STAMuons");
01212 histos->fill1DHist(deltaPhi,"trDeltaPhi","Delta-Phi Between Inner and Outer STA Muon Pos.",100,-0.5,0.5,"STAMuons");
01213 histos->fill1DHist(innerGlobalPolarAngle,"trInnerPolar","Polar Angle of Inner P Vector (STA muons)",128,0,3.2,"STAMuons");
01214 histos->fill1DHist(outerGlobalPolarAngle,"trOuterPolar","Polar Angle of Outer P Vector (STA muons)",128,0,3.2,"STAMuons");
01215 histos->fill1DHist(innerPnt.phi(),"trInnerPhi","Phi of Inner Position (STA muons)",256,-3.2,3.2,"STAMuons");
01216 histos->fill1DHist(outerPnt.phi(),"trOuterPhi","Phi of Outer Position (STA muons)",256,-3.2,3.2,"STAMuons");
01217
01218 }
01219
01220 }
01221
01222
01223
01224
01225
01226
01227 int CSCValidation::chamberSerial( CSCDetId id ) {
01228 int st = id.station();
01229 int ri = id.ring();
01230 int ch = id.chamber();
01231 int ec = id.endcap();
01232 int kSerial = ch;
01233 if (st == 1 && ri == 1) kSerial = ch;
01234 if (st == 1 && ri == 2) kSerial = ch + 36;
01235 if (st == 1 && ri == 3) kSerial = ch + 72;
01236 if (st == 1 && ri == 4) kSerial = ch;
01237 if (st == 2 && ri == 1) kSerial = ch + 108;
01238 if (st == 2 && ri == 2) kSerial = ch + 126;
01239 if (st == 3 && ri == 1) kSerial = ch + 162;
01240 if (st == 3 && ri == 2) kSerial = ch + 180;
01241 if (st == 4 && ri == 1) kSerial = ch + 216;
01242 if (st == 4 && ri == 2) kSerial = ch + 234;
01243 if (ec == 2) kSerial = kSerial + 300;
01244 return kSerial;
01245 }
01246
01247
01248
01249
01250
01251 int CSCValidation::ringSerial( CSCDetId id ) {
01252 int st = id.station();
01253 int ri = id.ring();
01254 int ec = id.endcap();
01255 int kSerial = 0 ;
01256 if (st == 1 && ri == 1) kSerial = ri;
01257 if (st == 1 && ri == 2) kSerial = ri ;
01258 if (st == 1 && ri == 3) kSerial = ri ;
01259 if (st == 1 && ri == 4) kSerial = 1;
01260 if (st == 2 ) kSerial = ri + 3;
01261 if (st == 3 ) kSerial = ri + 5;
01262 if (st == 4 ) kSerial = ri + 7;
01263 if (ec == 2) kSerial = kSerial * (-1);
01264 return kSerial;
01265 }
01266
01267
01268
01269
01270
01271
01272 float CSCValidation::fitX(CLHEP::HepMatrix points, CLHEP::HepMatrix errors){
01273
01274 float S = 0;
01275 float Sx = 0;
01276 float Sy = 0;
01277 float Sxx = 0;
01278 float Sxy = 0;
01279 float sigma2 = 0;
01280
01281 for (int i=1;i<7;i++){
01282 if (i != 3){
01283 sigma2 = errors(i,1)*errors(i,1);
01284 S = S + (1/sigma2);
01285 Sy = Sy + (points(i,1)/sigma2);
01286 Sx = Sx + ((i)/sigma2);
01287 Sxx = Sxx + (i*i)/sigma2;
01288 Sxy = Sxy + (((i)*points(i,1))/sigma2);
01289 }
01290 }
01291
01292 float delta = S*Sxx - Sx*Sx;
01293 float intercept = (Sxx*Sy - Sx*Sxy)/delta;
01294 float slope = (S*Sxy - Sx*Sy)/delta;
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305 return (intercept + slope*3);
01306
01307 }
01308
01309
01310
01311
01312
01313
01314
01315 void CSCValidation::doEfficiencies(edm::Handle<CSCWireDigiCollection> wires, edm::Handle<CSCStripDigiCollection> strips,
01316 edm::Handle<CSCRecHit2DCollection> recHits, edm::Handle<CSCSegmentCollection> cscSegments,
01317 edm::ESHandle<CSCGeometry> cscGeom){
01318
01319 bool allWires[2][4][4][36][6];
01320 bool allStrips[2][4][4][36][6];
01321 bool AllRecHits[2][4][4][36][6];
01322 bool AllSegments[2][4][4][36];
01323
01324
01325 for(int iE = 0;iE<2;iE++){
01326 for(int iS = 0;iS<4;iS++){
01327 for(int iR = 0; iR<4;iR++){
01328 for(int iC =0;iC<36;iC++){
01329 AllSegments[iE][iS][iR][iC] = false;
01330
01331 for(int iL=0;iL<6;iL++){
01332 allWires[iE][iS][iR][iC][iL] = false;
01333 allStrips[iE][iS][iR][iC][iL] = false;
01334 AllRecHits[iE][iS][iR][iC][iL] = false;
01335 }
01336 }
01337 }
01338 }
01339 }
01340
01341 if (useDigis){
01342
01343 for (CSCWireDigiCollection::DigiRangeIterator dWDiter=wires->begin(); dWDiter!=wires->end(); dWDiter++) {
01344 CSCDetId idrec = (CSCDetId)(*dWDiter).first;
01345 std::vector<CSCWireDigi>::const_iterator wireIter = (*dWDiter).second.first;
01346 std::vector<CSCWireDigi>::const_iterator lWire = (*dWDiter).second.second;
01347 for( ; wireIter != lWire; ++wireIter) {
01348 allWires[idrec.endcap() -1][idrec.station() -1][idrec.ring() -1][idrec.chamber() -1][idrec.layer() -1] = true;
01349 break;
01350 }
01351 }
01352
01353
01354 for (CSCStripDigiCollection::DigiRangeIterator dSDiter=strips->begin(); dSDiter!=strips->end(); dSDiter++) {
01355 CSCDetId idrec = (CSCDetId)(*dSDiter).first;
01356 std::vector<CSCStripDigi>::const_iterator stripIter = (*dSDiter).second.first;
01357 std::vector<CSCStripDigi>::const_iterator lStrip = (*dSDiter).second.second;
01358 for( ; stripIter != lStrip; ++stripIter) {
01359 std::vector<int> myADCVals = stripIter->getADCCounts();
01360 bool thisStripFired = false;
01361 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
01362 float threshold = 13.3 ;
01363 float diff = 0.;
01364 for (unsigned int iCount = 0; iCount < myADCVals.size(); iCount++) {
01365 diff = (float)myADCVals[iCount]-thisPedestal;
01366 if (diff > threshold) {
01367 thisStripFired = true;
01368 break;
01369 }
01370 }
01371 if(thisStripFired){
01372 allStrips[idrec.endcap() -1][idrec.station() -1][idrec.ring() -1][idrec.chamber() -1][idrec.layer() -1] = true;
01373 break;
01374 }
01375 }
01376 }
01377 }
01378
01379
01380 for (CSCRecHit2DCollection::const_iterator recEffIt = recHits->begin(); recEffIt != recHits->end(); recEffIt++) {
01381
01382 CSCDetId idrec = (CSCDetId)(*recEffIt).cscDetId();
01383 AllRecHits[idrec.endcap() -1][idrec.station() -1][idrec.ring() -1][idrec.chamber() -1][idrec.layer() -1] = true;
01384
01385 }
01386
01387 std::vector <unsigned int> seg_ME2(2,0) ;
01388 std::vector <unsigned int> seg_ME3(2,0) ;
01389 std::vector < std::pair <CSCDetId, CSCSegment> > theSegments(4);
01390
01391 for(CSCSegmentCollection::const_iterator segEffIt=cscSegments->begin(); segEffIt != cscSegments->end(); segEffIt++) {
01392 CSCDetId idseg = (CSCDetId)(*segEffIt).cscDetId();
01393
01394
01395
01396 AllSegments[idseg.endcap() -1][idseg.station() -1][idseg.ring() -1][idseg.chamber() -1] = true;
01397
01398
01399
01400 if(2==idseg.station() || 3==idseg.station()){
01401 unsigned int seg_tmp ;
01402 if(2==idseg.station()){
01403 ++seg_ME2[idseg.endcap() -1];
01404 seg_tmp = seg_ME2[idseg.endcap() -1];
01405 }
01406 else{
01407 ++seg_ME3[idseg.endcap() -1];
01408 seg_tmp = seg_ME3[idseg.endcap() -1];
01409 }
01410
01411 if(1== seg_tmp&& 6==(*segEffIt).nRecHits() && (*segEffIt).chi2()/(*segEffIt).degreesOfFreedom()<3.){
01412 std::pair <CSCDetId, CSCSegment> specSeg = make_pair( (CSCDetId)(*segEffIt).cscDetId(),*segEffIt);
01413 theSegments[2*(idseg.endcap()-1)+(idseg.station() -2)] = specSeg;
01414 }
01415 }
01416
01417
01418
01419
01420
01421
01422
01423
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433 }
01434
01435 for(int iE = 0;iE<2;iE++){
01436 for(int iS = 0;iS<4;iS++){
01437 for(int iR = 0; iR<4;iR++){
01438 for(int iC =0;iC<36;iC++){
01439 int NumberOfLayers = 0;
01440 for(int iL=0;iL<6;iL++){
01441 if(AllRecHits[iE][iS][iR][iC][iL]){
01442 NumberOfLayers++;
01443 }
01444 }
01445 int bin = 0;
01446 if (iS==0) bin = iR+1+(iE*10);
01447 else bin = (iS+1)*2 + (iR+1) + (iE*10);
01448 if(NumberOfLayers>1){
01449
01450 if(AllSegments[iE][iS][iR][iC]){
01451
01452 hSSTE->AddBinContent(bin);
01453 }
01454
01455 hSSTE->AddBinContent(20+bin);
01456
01457 }
01458 if(AllSegments[iE][iS][iR][iC]){
01459 if(NumberOfLayers==6){
01460
01461 hRHSTE->AddBinContent(bin);;
01462 }
01463
01464 hRHSTE->AddBinContent(20+bin);;
01465 }
01466 }
01467 }
01468 }
01469 }
01470
01471
01472 std::vector < std::pair <CSCDetId, CSCSegment> * > theSeg;
01473 if(1==seg_ME2[0]) theSeg.push_back(&theSegments[0]);
01474 if(1==seg_ME3[0]) theSeg.push_back(&theSegments[1]);
01475 if(1==seg_ME2[1]) theSeg.push_back(&theSegments[2]);
01476 if(1==seg_ME3[1]) theSeg.push_back(&theSegments[3]);
01477
01478
01479
01480
01481 std::map <std::string, float> chamberTypes;
01482 chamberTypes["ME1/a"] = 0.5;
01483 chamberTypes["ME1/b"] = 1.5;
01484 chamberTypes["ME1/2"] = 2.5;
01485 chamberTypes["ME1/3"] = 3.5;
01486 chamberTypes["ME2/1"] = 4.5;
01487 chamberTypes["ME2/2"] = 5.5;
01488 chamberTypes["ME3/1"] = 6.5;
01489 chamberTypes["ME3/2"] = 7.5;
01490 chamberTypes["ME4/1"] = 8.5;
01491
01492 if(theSeg.size()){
01493 std::map <int , GlobalPoint> extrapolatedPoint;
01494 std::map <int , GlobalPoint>::iterator it;
01495 const std::vector<CSCChamber*> ChamberContainer = cscGeom->chambers();
01496
01497 for(size_t nCh=0;nCh<ChamberContainer.size();nCh++){
01498 const CSCChamber *cscchamber = ChamberContainer[nCh];
01499 std::pair <CSCDetId, CSCSegment> * thisSegment = 0;
01500 for(size_t iSeg =0;iSeg<theSeg.size();++iSeg ){
01501 if(cscchamber->id().endcap() == theSeg[iSeg]->first.endcap()){
01502 if(1==cscchamber->id().station() || 3==cscchamber->id().station() ){
01503 if(2==theSeg[iSeg]->first.station()){
01504 thisSegment = theSeg[iSeg];
01505 }
01506 }
01507 else if (2==cscchamber->id().station() || 4==cscchamber->id().station()){
01508 if(3==theSeg[iSeg]->first.station()){
01509 thisSegment = theSeg[iSeg];
01510 }
01511 }
01512 }
01513 }
01514
01515 if(thisSegment){
01516 CSCSegment * seg = &(thisSegment->second);
01517 const CSCChamber *segChamber = cscGeom->chamber(thisSegment->first);
01518 LocalPoint localCenter(0.,0.,0);
01519 GlobalPoint cscchamberCenter = cscchamber->toGlobal(localCenter);
01520
01521 it = extrapolatedPoint.find(int(cscchamberCenter.z()));
01522 if(it==extrapolatedPoint.end()){
01523 GlobalPoint segPos = segChamber->toGlobal(seg->localPosition());
01524 GlobalVector segDir = segChamber->toGlobal(seg->localDirection());
01525 double paramaterLine = lineParametrization(segPos.z(),cscchamberCenter.z() , segDir.z());
01526 double xExtrapolated = extrapolate1D(segPos.x(),segDir.x(), paramaterLine);
01527 double yExtrapolated = extrapolate1D(segPos.y(),segDir.y(), paramaterLine);
01528 GlobalPoint globP (xExtrapolated, yExtrapolated, cscchamberCenter.z());
01529 extrapolatedPoint[int(cscchamberCenter.z())] = globP;
01530 }
01531
01532 LocalPoint extrapolatedPointLocal = cscchamber->toLocal(extrapolatedPoint[int(cscchamberCenter.z())]);
01533 const CSCLayer *layer_p = cscchamber->layer(1);
01534 const CSCLayerGeometry *layerGeom = layer_p->geometry ();
01535 const std::vector<float> layerBounds = layerGeom->parameters ();
01536 float shiftFromEdge = 15.;
01537 float shiftFromDeadZone = 10.;
01538
01539 bool pass = withinSensitiveRegion(extrapolatedPointLocal, layerBounds,
01540 cscchamber->id().station(), cscchamber->id().ring(),
01541 shiftFromEdge, shiftFromDeadZone);
01542 if(pass){
01543
01544
01545
01546
01547
01548 int nRHLayers = 0;
01549 for(int iL =0;iL<6;++iL){
01550 if(AllRecHits[cscchamber->id().endcap()-1]
01551 [cscchamber->id().station()-1]
01552 [cscchamber->id().ring()-1][cscchamber->id().chamber()-1][iL]){
01553 ++nRHLayers;
01554 }
01555 }
01556
01557 float verticalScale = chamberTypes[cscchamber->specs()->chamberTypeName()];
01558 if(cscchamberCenter.z()<0){
01559 verticalScale = - verticalScale;
01560 }
01561 verticalScale +=9.5;
01562 hSensitiveAreaEvt->Fill(float(cscchamber->id().chamber()),verticalScale);
01563 if(nRHLayers>1){
01564
01565
01566
01567
01568 hEffDenominator->Fill(float(cscchamber->id().chamber()),verticalScale);
01569
01570 if(AllSegments[cscchamber->id().endcap()-1]
01571 [cscchamber->id().station()-1]
01572 [cscchamber->id().ring()-1][cscchamber->id().chamber()-1]){
01573 hSSTE2->Fill(float(cscchamber->id().chamber()),float(verticalScale));
01574 }
01575
01576 for(int iL =0;iL<6;++iL){
01577 float weight = 1./6.;
01578
01579
01580 if(AllRecHits[cscchamber->id().endcap()-1]
01581 [cscchamber->id().station()-1]
01582 [cscchamber->id().ring()-1][cscchamber->id().chamber()-1][iL]){
01583 hRHSTE2->Fill(float(cscchamber->id().chamber()),float(verticalScale),weight);
01584 }
01585 if (useDigis){
01586
01587 if(allWires[cscchamber->id().endcap()-1]
01588 [cscchamber->id().station()-1]
01589 [cscchamber->id().ring()-1][cscchamber->id().chamber()-1][iL]){
01590
01591 hWireSTE2->Fill(float(cscchamber->id().chamber()),float(verticalScale),weight);
01592 }
01593
01594 if(allStrips[cscchamber->id().endcap()-1]
01595 [cscchamber->id().station()-1]
01596 [cscchamber->id().ring()-1][cscchamber->id().chamber()-1][iL]){
01597
01598 hStripSTE2->Fill(float(cscchamber->id().chamber()),float(verticalScale),weight);
01599 }
01600 }
01601 }
01602 }
01603 }
01604 }
01605 }
01606 }
01607
01608
01609
01610 }
01611
01612 void CSCValidation::getEfficiency(float bin, float Norm, std::vector<float> &eff){
01613
01614 float Efficiency = 0.;
01615 float EffError = 0.;
01616 if(fabs(Norm)>0.000000001){
01617 Efficiency = bin/Norm;
01618 if(bin<Norm){
01619 EffError = sqrt( (1.-Efficiency)*Efficiency/Norm );
01620 }
01621 }
01622 eff[0] = Efficiency;
01623 eff[1] = EffError;
01624 }
01625
01626 void CSCValidation::histoEfficiency(TH1F *readHisto, TH1F *writeHisto){
01627 std::vector<float> eff(2);
01628 int Nbins = readHisto->GetSize()-2;
01629 std::vector<float> bins(Nbins);
01630 std::vector<float> Efficiency(Nbins);
01631 std::vector<float> EffError(Nbins);
01632 float Num = 1;
01633 float Den = 1;
01634 for (int i=0;i<20;i++){
01635 Num = readHisto->GetBinContent(i+1);
01636 Den = readHisto->GetBinContent(i+21);
01637 getEfficiency(Num, Den, eff);
01638 Efficiency[i] = eff[0];
01639 EffError[i] = eff[1];
01640 writeHisto->SetBinContent(i+1, Efficiency[i]);
01641 writeHisto->SetBinError(i+1, EffError[i]);
01642 }
01643 }
01644
01645 bool CSCValidation::withinSensitiveRegion(LocalPoint localPos, const std::vector<float> layerBounds, int station, int ring, float shiftFromEdge, float shiftFromDeadZone){
01646
01647 bool pass = false;
01648
01649 float y_center = 0.;
01650 double yUp = layerBounds[3] + y_center;
01651 double yDown = - layerBounds[3] + y_center;
01652 double xBound1Shifted = layerBounds[0] - shiftFromEdge;
01653 double xBound2Shifted = layerBounds[1] - shiftFromEdge;
01654 double lineSlope = (yUp - yDown)/(xBound2Shifted-xBound1Shifted);
01655 double lineConst = yUp - lineSlope*xBound2Shifted;
01656 double yBorder = lineSlope*abs(localPos.x()) + lineConst;
01657
01658
01659 std::vector <float> deadZoneCenter(6);
01660 float cutZone = shiftFromDeadZone;
01661
01662 if(station>1 && station<5){
01663 if(2==ring){
01664 deadZoneCenter[0]= -162.48 ;
01665 deadZoneCenter[1] = -81.8744;
01666 deadZoneCenter[2] = -21.18165;
01667 deadZoneCenter[3] = 39.51105;
01668 deadZoneCenter[4] = 100.2939;
01669 deadZoneCenter[5] = 160.58;
01670
01671 if(localPos.y() >yBorder &&
01672 ((localPos.y()> deadZoneCenter[0] + cutZone && localPos.y()< deadZoneCenter[1] - cutZone) ||
01673 (localPos.y()> deadZoneCenter[1] + cutZone && localPos.y()< deadZoneCenter[2] - cutZone) ||
01674 (localPos.y()> deadZoneCenter[2] + cutZone && localPos.y()< deadZoneCenter[3] - cutZone) ||
01675 (localPos.y()> deadZoneCenter[3] + cutZone && localPos.y()< deadZoneCenter[4] - cutZone) ||
01676 (localPos.y()> deadZoneCenter[4] + cutZone && localPos.y()< deadZoneCenter[5] - cutZone))){
01677 pass = true;
01678 }
01679 }
01680 else if(1==ring){
01681 if(2==station){
01682 deadZoneCenter[0]= -95.80 ;
01683 deadZoneCenter[1] = -27.47;
01684 deadZoneCenter[2] = 33.67;
01685 deadZoneCenter[3] = 90.85;
01686 }
01687 else if(3==station){
01688 deadZoneCenter[0]= -89.305 ;
01689 deadZoneCenter[1] = -39.705;
01690 deadZoneCenter[2] = 20.195;
01691 deadZoneCenter[3] = 77.395;
01692 }
01693 else if(4==station){
01694 deadZoneCenter[0]= -75.645;
01695 deadZoneCenter[1] = -26.055;
01696 deadZoneCenter[2] = 23.855;
01697 deadZoneCenter[3] = 70.575;
01698 }
01699 if(localPos.y() >yBorder &&
01700 ((localPos.y()> deadZoneCenter[0] + cutZone && localPos.y()< deadZoneCenter[1] - cutZone) ||
01701 (localPos.y()> deadZoneCenter[1] + cutZone && localPos.y()< deadZoneCenter[2] - cutZone) ||
01702 (localPos.y()> deadZoneCenter[2] + cutZone && localPos.y()< deadZoneCenter[3] - cutZone))){
01703 pass = true;
01704 }
01705 }
01706 }
01707 else if(1==station){
01708 if(3==ring){
01709 deadZoneCenter[0]= -83.155 ;
01710 deadZoneCenter[1] = -22.7401;
01711 deadZoneCenter[2] = 27.86665;
01712 deadZoneCenter[3] = 81.005;
01713 if(localPos.y() > yBorder &&
01714 ((localPos.y()> deadZoneCenter[0] + cutZone && localPos.y()< deadZoneCenter[1] - cutZone) ||
01715 (localPos.y()> deadZoneCenter[1] + cutZone && localPos.y()< deadZoneCenter[2] - cutZone) ||
01716 (localPos.y()> deadZoneCenter[2] + cutZone && localPos.y()< deadZoneCenter[3] - cutZone))){
01717 pass = true;
01718 }
01719 }
01720 else if(2==ring){
01721 deadZoneCenter[0]= -86.285 ;
01722 deadZoneCenter[1] = -32.88305;
01723 deadZoneCenter[2] = 32.867423;
01724 deadZoneCenter[3] = 88.205;
01725 if(localPos.y() > (yBorder) &&
01726 ((localPos.y()> deadZoneCenter[0] + cutZone && localPos.y()< deadZoneCenter[1] - cutZone) ||
01727 (localPos.y()> deadZoneCenter[1] + cutZone && localPos.y()< deadZoneCenter[2] - cutZone) ||
01728 (localPos.y()> deadZoneCenter[2] + cutZone && localPos.y()< deadZoneCenter[3] - cutZone))){
01729 pass = true;
01730 }
01731 }
01732 else{
01733 deadZoneCenter[0]= -81.0;
01734 deadZoneCenter[1] = 81.0;
01735 if(localPos.y() > (yBorder) &&
01736 (localPos.y()> deadZoneCenter[0] + cutZone && localPos.y()< deadZoneCenter[1] - cutZone )){
01737 pass = true;
01738 }
01739 }
01740 }
01741 return pass;
01742 }
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753 float CSCValidation::getSignal(const CSCStripDigiCollection& stripdigis, CSCDetId idCS, int centerStrip){
01754
01755 float SigADC[5];
01756 float TotalADC = 0;
01757 SigADC[0] = 0;
01758 SigADC[1] = 0;
01759 SigADC[2] = 0;
01760 SigADC[3] = 0;
01761 SigADC[4] = 0;
01762
01763
01764
01765 CSCStripDigiCollection::DigiRangeIterator sIt;
01766
01767 for (sIt = stripdigis.begin(); sIt != stripdigis.end(); sIt++){
01768 CSCDetId id = (CSCDetId)(*sIt).first;
01769 if (id == idCS){
01770
01771
01772 std::vector<CSCStripDigi>::const_iterator digiItr = (*sIt).second.first;
01773 std::vector<CSCStripDigi>::const_iterator last = (*sIt).second.second;
01774 for ( ; digiItr != last; ++digiItr ) {
01775 int thisStrip = digiItr->getStrip();
01776 if (thisStrip == (centerStrip)){
01777 std::vector<int> myADCVals = digiItr->getADCCounts();
01778 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
01779 float thisSignal = (myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
01780 SigADC[0] = thisSignal - 6*thisPedestal;
01781 }
01782
01783 if (thisStrip == (centerStrip+1)){
01784 std::vector<int> myADCVals = digiItr->getADCCounts();
01785 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
01786 float thisSignal = (myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
01787 SigADC[1] = thisSignal - 6*thisPedestal;
01788 }
01789 if (thisStrip == (centerStrip+2)){
01790 std::vector<int> myADCVals = digiItr->getADCCounts();
01791 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
01792 float thisSignal = (myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
01793 SigADC[2] = thisSignal - 6*thisPedestal;
01794 }
01795 if (thisStrip == (centerStrip-1)){
01796 std::vector<int> myADCVals = digiItr->getADCCounts();
01797 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
01798 float thisSignal = (myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
01799 SigADC[3] = thisSignal - 6*thisPedestal;
01800 }
01801 if (thisStrip == (centerStrip-2)){
01802 std::vector<int> myADCVals = digiItr->getADCCounts();
01803 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
01804 float thisSignal = (myADCVals[2]+myADCVals[3]+myADCVals[4]+myADCVals[5]+myADCVals[6]+myADCVals[7]);
01805 SigADC[4] = thisSignal - 6*thisPedestal;
01806 }
01807 }
01808 TotalADC = 0.2*(SigADC[0]+SigADC[1]+SigADC[2]+SigADC[3]+SigADC[4]);
01809 }
01810 }
01811 return TotalADC;
01812 }
01813
01814
01815
01816
01817
01818
01819 void CSCValidation::doNoiseHits(edm::Handle<CSCRecHit2DCollection> recHits, edm::Handle<CSCSegmentCollection> cscSegments,
01820 edm::ESHandle<CSCGeometry> cscGeom, edm::Handle<CSCStripDigiCollection> strips){
01821
01822 CSCRecHit2DCollection::const_iterator recIt;
01823 for (recIt = recHits->begin(); recIt != recHits->end(); recIt++) {
01824
01825 CSCDetId idrec = (CSCDetId)(*recIt).cscDetId();
01826
01827
01828 AllRechits.insert(std::pair<CSCDetId , CSCRecHit2D>(idrec,*recIt));
01829
01830
01831 int centerid = recIt->nStrips()/2;
01832 int centerStrip = recIt->channels(centerid);
01833
01834 float rHsignal = getthisSignal(*strips, idrec, centerStrip);
01835 histos->fill1DHist(rHsignal,"hrHSignal", "Signal in the 4th time bin for centre strip",1100,-99,1000,"recHits");
01836
01837 }
01838
01839 for(CSCSegmentCollection::const_iterator it=cscSegments->begin(); it != cscSegments->end(); it++) {
01840
01841 std::vector<CSCRecHit2D> theseRecHits = (*it).specificRecHits();
01842 for ( std::vector<CSCRecHit2D>::const_iterator iRH = theseRecHits.begin(); iRH != theseRecHits.end(); iRH++) {
01843 CSCDetId idRH = (CSCDetId)(*iRH).cscDetId();
01844 LocalPoint lpRH = (*iRH).localPosition();
01845 float xrec = lpRH.x();
01846 float yrec = lpRH.y();
01847 float zrec = lpRH.z();
01848 bool RHalreadyinMap = false;
01849
01850 multimap<CSCDetId , CSCRecHit2D>::iterator segRHit;
01851 segRHit = SegRechits.find(idRH);
01852 if (segRHit != SegRechits.end()){
01853 for( ; segRHit != SegRechits.upper_bound(idRH); ++segRHit){
01854
01855 LocalPoint lposRH = (segRHit->second).localPosition();
01856 float xpos = lposRH.x();
01857 float ypos = lposRH.y();
01858 float zpos = lposRH.z();
01859 if ( xrec == xpos && yrec == ypos && zrec == zpos){
01860 RHalreadyinMap = true;
01861
01862 break;}
01863 }
01864 }
01865 if(!RHalreadyinMap){ SegRechits.insert(std::pair<CSCDetId , CSCRecHit2D>(idRH,*iRH));}
01866 }
01867 }
01868
01869 findNonAssociatedRecHits(cscGeom,strips);
01870
01871 }
01872
01873
01874
01875
01876
01877
01878
01879 void CSCValidation::findNonAssociatedRecHits(edm::ESHandle<CSCGeometry> cscGeom, edm::Handle<CSCStripDigiCollection> strips){
01880
01881 for(std::multimap<CSCDetId , CSCRecHit2D>::iterator allRHiter = AllRechits.begin();allRHiter != AllRechits.end(); ++allRHiter){
01882 CSCDetId idRH = allRHiter->first;
01883 LocalPoint lpRH = (allRHiter->second).localPosition();
01884 float xrec = lpRH.x();
01885 float yrec = lpRH.y();
01886 float zrec = lpRH.z();
01887
01888 bool foundmatch = false;
01889 multimap<CSCDetId , CSCRecHit2D>::iterator segRHit;
01890 segRHit = SegRechits.find(idRH);
01891 if (segRHit != SegRechits.end()){
01892 for( ; segRHit != SegRechits.upper_bound(idRH); ++segRHit){
01893
01894 LocalPoint lposRH = (segRHit->second).localPosition();
01895 float xpos = lposRH.x();
01896 float ypos = lposRH.y();
01897 float zpos = lposRH.z();
01898
01899 if ( xrec == xpos && yrec == ypos && zrec == zpos){
01900 foundmatch = true;}
01901
01902 float d = 0.;
01903 float dclose =1000.;
01904
01905 if ( !foundmatch) {
01906
01907 d = sqrt(pow(xrec-xpos,2)+pow(yrec-ypos,2)+pow(zrec-zpos,2));
01908 if (d < dclose) {
01909 dclose = d;
01910 if( distRHmap.find((allRHiter->second)) == distRHmap.end() ) {
01911 distRHmap.insert(make_pair(allRHiter->second,dclose) );
01912 }
01913 else {
01914
01915 distRHmap.erase(allRHiter->second);
01916 distRHmap.insert(make_pair(allRHiter->second,dclose));
01917 }
01918 }
01919 }
01920 }
01921 }
01922 if(!foundmatch){NonAssociatedRechits.insert(std::pair<CSCDetId , CSCRecHit2D>(idRH,allRHiter->second));}
01923 }
01924
01925 for(std::map<CSCRecHit2D,float,ltrh>::iterator iter = distRHmap.begin();iter != distRHmap.end(); ++iter){
01926 histos->fill1DHist(iter->second,"hdistRH","Distance of Non Associated RecHit from closest Segment RecHit",500,0.,100.,"NonAssociatedRechits");
01927 }
01928
01929 for(std::multimap<CSCDetId , CSCRecHit2D>::iterator iter = NonAssociatedRechits.begin();iter != NonAssociatedRechits.end(); ++iter){
01930 CSCDetId idrec = iter->first;
01931 int kEndcap = idrec.endcap();
01932 int cEndcap = idrec.endcap();
01933 if (kEndcap == 2)cEndcap = -1;
01934 int kRing = idrec.ring();
01935 int kStation = idrec.station();
01936 int kChamber = idrec.chamber();
01937 int kLayer = idrec.layer();
01938
01939
01940 LocalPoint rhitlocal = (iter->second).localPosition();
01941 float xreco = rhitlocal.x();
01942 float yreco = rhitlocal.y();
01943
01944
01945 int centerid = (iter->second).nStrips()/2;
01946 int centerStrip = (iter->second).channels(centerid);
01947
01948
01949 float rHSumQ = 0;
01950 float sumsides=0.;
01951 int adcsize=(iter->second).nStrips()*(iter->second).nTimeBins();
01952 for ( unsigned int i=0; i< (iter->second).nStrips(); i++) {
01953 for ( unsigned int j=0; j< (iter->second).nTimeBins()-1; j++) {
01954 rHSumQ+=(iter->second).adcs(i,j);
01955 if (i!=1) sumsides+=(iter->second).adcs(i,j);
01956 }
01957 }
01958
01959 float rHratioQ = sumsides/rHSumQ;
01960 if (adcsize != 12) rHratioQ = -99;
01961
01962
01963 float rHtime = (iter->second).tpeak()/50;
01964
01965
01966 int rHwidth = getWidth(*strips, idrec, centerStrip);
01967
01968
01969
01970 const CSCLayer* csclayer = cscGeom->layer( idrec );
01971
01972
01973 GlobalPoint rhitglobal= csclayer->toGlobal(rhitlocal);
01974 float grecx = rhitglobal.x();
01975 float grecy = rhitglobal.y();
01976
01977
01978
01979
01980 int kCodeBroad = cEndcap * ( 4*(kStation-1) + kRing) ;
01981 int kCodeNarrow = cEndcap * ( 100*(kRing-1) + kChamber) ;
01982
01983
01984 histos->fill1DHist(kCodeBroad,"hNARHCodeBroad","broad scope code for recHits",33,-16.5,16.5,"NonAssociatedRechits");
01985 if (kStation == 1) histos->fill1DHist(kCodeNarrow,"hNARHCodeNarrow1","narrow scope recHit code station 1",801,-400.5,400.5,"NonAssociatedRechits");
01986 if (kStation == 2) histos->fill1DHist(kCodeNarrow,"hNARHCodeNarrow2","narrow scope recHit code station 2",801,-400.5,400.5,"NonAssociatedRechits");
01987 if (kStation == 3) histos->fill1DHist(kCodeNarrow,"hNARHCodeNarrow3","narrow scope recHit code station 3",801,-400.5,400.5,"NonAssociatedRechits");
01988 if (kStation == 4) histos->fill1DHist(kCodeNarrow,"hNARHCodeNarrow4","narrow scope recHit code station 4",801,-400.5,400.5,"NonAssociatedRechits");
01989 histos->fill1DHistByType(kLayer,"hNARHLayer","RecHits per Layer",idrec,8,-0.5,7.5,"NonAssociatedRechits");
01990 histos->fill1DHistByType(xreco,"hNARHX","Local X of recHit",idrec,160,-80.,80.,"NonAssociatedRechits");
01991 histos->fill1DHistByType(yreco,"hNARHY","Local Y of recHit",idrec,60,-180.,180.,"NonAssociatedRechits");
01992 if (kStation == 1 && (kRing == 1 || kRing == 4)) histos->fill1DHistByType(rHSumQ,"hNARHSumQ","Sum 3x3 recHit Charge",idrec,250,0,4000,"NonAssociatedRechits");
01993 else histos->fill1DHistByType(rHSumQ,"hNARHSumQ","Sum 3x3 recHit Charge",idrec,250,0,2000,"NonAssociatedRechits");
01994 histos->fill1DHistByType(rHratioQ,"hNARHRatioQ","Ratio (Ql+Qr)/Qt)",idrec,120,-0.1,1.1,"NonAssociatedRechits");
01995 histos->fill1DHistByType(rHtime,"hNARHTiming","recHit Timing",idrec,200,-10,10,"NonAssociatedRechits");
01996 histos->fill2DHistByStation(grecx,grecy,"hNARHGlobal","recHit Global Position",idrec,400,-800.,800.,400,-800.,800.,"NonAssociatedRechits");
01997 histos->fill1DHistByType(rHwidth,"hNARHwidth","width for Non associated recHit",idrec,21,-0.5,20.5,"NonAssociatedRechits");
01998
01999 }
02000
02001 for(std::multimap<CSCDetId , CSCRecHit2D>::iterator iter = SegRechits.begin();iter != SegRechits.end(); ++iter){
02002 CSCDetId idrec = iter->first;
02003 int kEndcap = idrec.endcap();
02004 int cEndcap = idrec.endcap();
02005 if (kEndcap == 2)cEndcap = -1;
02006 int kRing = idrec.ring();
02007 int kStation = idrec.station();
02008 int kChamber = idrec.chamber();
02009 int kLayer = idrec.layer();
02010
02011
02012 LocalPoint rhitlocal = (iter->second).localPosition();
02013 float xreco = rhitlocal.x();
02014 float yreco = rhitlocal.y();
02015
02016
02017 int centerid = (iter->second).nStrips()/2;
02018 int centerStrip = (iter->second).channels(centerid);
02019
02020
02021
02022 float rHSumQ = 0;
02023 float sumsides=0.;
02024 int adcsize=(iter->second).nStrips()*(iter->second).nTimeBins();
02025 for ( unsigned int i=0; i< (iter->second).nStrips(); i++) {
02026 for ( unsigned int j=0; j< (iter->second).nTimeBins()-1; j++) {
02027 rHSumQ+=(iter->second).adcs(i,j);
02028 if (i!=1) sumsides+=(iter->second).adcs(i,j);
02029 }
02030 }
02031
02032 float rHratioQ = sumsides/rHSumQ;
02033 if (adcsize != 12) rHratioQ = -99;
02034
02035
02036 float rHtime = (iter->second).tpeak()/50;
02037
02038
02039 int rHwidth = getWidth(*strips, idrec, centerStrip);
02040
02041
02042
02043 const CSCLayer* csclayer = cscGeom->layer( idrec );
02044
02045
02046 GlobalPoint rhitglobal= csclayer->toGlobal(rhitlocal);
02047 float grecx = rhitglobal.x();
02048 float grecy = rhitglobal.y();
02049
02050
02051 int kCodeBroad = cEndcap * ( 4*(kStation-1) + kRing) ;
02052 int kCodeNarrow = cEndcap * ( 100*(kRing-1) + kChamber) ;
02053
02054
02055 histos->fill1DHist(kCodeBroad,"hSegRHCodeBroad","broad scope code for recHits",33,-16.5,16.5,"AssociatedRechits");
02056 if (kStation == 1) histos->fill1DHist(kCodeNarrow,"hSegRHCodeNarrow1","narrow scope recHit code station 1",801,-400.5,400.5,"AssociatedRechits");
02057 if (kStation == 2) histos->fill1DHist(kCodeNarrow,"hSegRHCodeNarrow2","narrow scope recHit code station 2",801,-400.5,400.5,"AssociatedRechits");
02058 if (kStation == 3) histos->fill1DHist(kCodeNarrow,"hSegRHCodeNarrow3","narrow scope recHit code station 3",801,-400.5,400.5,"AssociatedRechits");
02059 if (kStation == 4) histos->fill1DHist(kCodeNarrow,"hSegRHCodeNarrow4","narrow scope recHit code station 4",801,-400.5,400.5,"AssociatedRechits");
02060 histos->fill1DHistByType(kLayer,"hSegRHLayer","RecHits per Layer",idrec,8,-0.5,7.5,"AssociatedRechits");
02061 histos->fill1DHistByType(xreco,"hSegRHX","Local X of recHit",idrec,160,-80.,80.,"AssociatedRechits");
02062 histos->fill1DHistByType(yreco,"hSegRHY","Local Y of recHit",idrec,60,-180.,180.,"AssociatedRechits");
02063 if (kStation == 1 && (kRing == 1 || kRing == 4)) histos->fill1DHistByType(rHSumQ,"hSegRHSumQ","Sum 3x3 recHit Charge",idrec,250,0,4000,"AssociatedRechits");
02064 else histos->fill1DHistByType(rHSumQ,"hSegRHSumQ","Sum 3x3 recHit Charge",idrec,250,0,2000,"AssociatedRechits");
02065 histos->fill1DHistByType(rHratioQ,"hSegRHRatioQ","Ratio (Ql+Qr)/Qt)",idrec,120,-0.1,1.1,"AssociatedRechits");
02066 histos->fill1DHistByType(rHtime,"hSegRHTiming","recHit Timing",idrec,200,-10,10,"AssociatedRechits");
02067 histos->fill2DHistByStation(grecx,grecy,"hSegRHGlobal","recHit Global Position",idrec,400,-800.,800.,400,-800.,800.,"AssociatedRechits");
02068 histos->fill1DHistByType(rHwidth,"hSegRHwidth","width for Non associated recHit",idrec,21,-0.5,20.5,"AssociatedRechits");
02069
02070 }
02071
02072 distRHmap.clear();
02073 AllRechits.clear();
02074 SegRechits.clear();
02075 NonAssociatedRechits.clear();
02076 }
02077
02078
02079
02080 float CSCValidation::getthisSignal(const CSCStripDigiCollection& stripdigis, CSCDetId idRH, int centerStrip){
02081
02082 CSCStripDigiCollection::DigiRangeIterator sIt;
02083 float thisADC = 0.;
02084
02085
02086 for (sIt = stripdigis.begin(); sIt != stripdigis.end(); sIt++){
02087 CSCDetId id = (CSCDetId)(*sIt).first;
02088
02089 if (id == idRH){
02090
02091 vector<CSCStripDigi>::const_iterator digiItr = (*sIt).second.first;
02092 vector<CSCStripDigi>::const_iterator last = (*sIt).second.second;
02093
02094 int St = idRH.station();
02095 int Rg = idRH.ring();
02096 if (St == 1 && Rg == 4){
02097 while(centerStrip> 16) centerStrip -= 16;
02098 }
02099 for ( ; digiItr != last; ++digiItr ) {
02100 int thisStrip = digiItr->getStrip();
02101
02102 std::vector<int> myADCVals = digiItr->getADCCounts();
02103 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
02104 float Signal = (float) myADCVals[3];
02105 if (thisStrip == (centerStrip)){
02106 thisADC = Signal-thisPedestal;
02107
02108
02109
02110
02111 }
02112 if (thisStrip == (centerStrip+1)){
02113 std::vector<int> myADCVals = digiItr->getADCCounts();
02114 }
02115 if (thisStrip == (centerStrip-1)){
02116 std::vector<int> myADCVals = digiItr->getADCCounts();
02117 }
02118 }
02119 }
02120 }
02121
02122 return thisADC;
02123 }
02124
02125
02126
02127
02128
02129
02130
02131 int CSCValidation::getWidth(const CSCStripDigiCollection& stripdigis, CSCDetId idRH, int centerStrip){
02132
02133 int width = 1;
02134 int widthpos = 0;
02135 int widthneg = 0;
02136
02137
02138 CSCStripDigiCollection::DigiRangeIterator sIt;
02139
02140 for (sIt = stripdigis.begin(); sIt != stripdigis.end(); sIt++){
02141 CSCDetId id = (CSCDetId)(*sIt).first;
02142 if (id == idRH){
02143 std::vector<CSCStripDigi>::const_iterator digiItr = (*sIt).second.first;
02144 std::vector<CSCStripDigi>::const_iterator first = (*sIt).second.first;
02145 std::vector<CSCStripDigi>::const_iterator last = (*sIt).second.second;
02146 std::vector<CSCStripDigi>::const_iterator it = (*sIt).second.first;
02147 std::vector<CSCStripDigi>::const_iterator itr = (*sIt).second.first;
02148
02149 int St = idRH.station();
02150 int Rg = idRH.ring();
02151 if (St == 1 && Rg == 4){
02152 while(centerStrip> 16) centerStrip -= 16;
02153 }
02154 for ( ; digiItr != last; ++digiItr ) {
02155 int thisStrip = digiItr->getStrip();
02156 if (thisStrip == (centerStrip)){
02157 it = digiItr;
02158 for( ; it != last; ++it ) {
02159 int strip = it->getStrip();
02160 std::vector<int> myADCVals = it->getADCCounts();
02161 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
02162 if(((float)myADCVals[3]-thisPedestal) < 6 || widthpos == 10 || it==last){break;}
02163 if(strip != centerStrip){ widthpos += 1;
02164 }
02165 }
02166 itr = digiItr;
02167 for( ; itr != first; --itr) {
02168 int strip = itr->getStrip();
02169 std::vector<int> myADCVals = itr->getADCCounts();
02170 float thisPedestal = 0.5*(float)(myADCVals[0]+myADCVals[1]);
02171 if(((float)myADCVals[3]-thisPedestal) < 6 || widthneg == 10 || itr==first){break;}
02172 if(strip != centerStrip) {widthneg += 1 ;
02173 }
02174 }
02175 }
02176 }
02177 }
02178 }
02179
02180 width = width + widthneg + widthpos ;
02181
02182 return width;
02183 }
02184
02185
02186
02187
02188
02189
02190
02191 void CSCValidation::doGasGain(const CSCWireDigiCollection& wirecltn,
02192 const CSCStripDigiCollection& strpcltn,
02193 const CSCRecHit2DCollection& rechitcltn) {
02194 float y;
02195 int channel=0,mult,wire,layer,idlayer,idchamber,ring;
02196 int wire_strip_rechit_present;
02197 std::string name,title,endcapstr;
02198 ostringstream ss;
02199 CSCIndexer indexer;
02200 std::map<int,int>::iterator intIt;
02201
02202 m_single_wire_layer.clear();
02203
02204 if(firstEvent) {
02205
02206
02207
02208 m_wire_hvsegm.clear();
02209 std::map<int,std::vector<int> >::iterator intvecIt;
02210
02211 int csctype[10]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
02212 int hvsegm_layer[10]={1, 1, 3, 3, 3, 5, 3, 5, 3, 5};
02213 int id;
02214 nmbhvsegm.clear();
02215 for(int i=0;i<10;i++) nmbhvsegm.push_back(hvsegm_layer[i]);
02216
02217 std::vector<int> zer_1_1a(49,0);
02218 id=csctype[0];
02219 if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_1a;
02220 intvecIt=m_wire_hvsegm.find(id);
02221 for(int wire=1;wire<=48;wire++) intvecIt->second[wire]=1;
02222
02223
02224 std::vector<int> zer_1_1b(49,0);
02225 id=csctype[1];
02226 if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_1b;
02227 intvecIt=m_wire_hvsegm.find(id);
02228 for(int wire=1;wire<=48;wire++) intvecIt->second[wire]=1;
02229
02230
02231 std::vector<int> zer_1_2(65,0);
02232 id=csctype[2];
02233 if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_2;
02234 intvecIt=m_wire_hvsegm.find(id);
02235 for(int wire=1;wire<=24;wire++) intvecIt->second[wire]=1;
02236 for(int wire=25;wire<=48;wire++) intvecIt->second[wire]=2;
02237 for(int wire=49;wire<=64;wire++) intvecIt->second[wire]=3;
02238
02239
02240 std::vector<int> zer_1_3(33,0);
02241 id=csctype[3];
02242 if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_1_3;
02243 intvecIt=m_wire_hvsegm.find(id);
02244 for(int wire=1;wire<=12;wire++) intvecIt->second[wire]=1;
02245 for(int wire=13;wire<=22;wire++) intvecIt->second[wire]=2;
02246 for(int wire=23;wire<=32;wire++) intvecIt->second[wire]=3;
02247
02248
02249 std::vector<int> zer_2_1(113,0);
02250 id=csctype[4];
02251 if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_2_1;
02252 intvecIt=m_wire_hvsegm.find(id);
02253 for(int wire=1;wire<=44;wire++) intvecIt->second[wire]=1;
02254 for(int wire=45;wire<=80;wire++) intvecIt->second[wire]=2;
02255 for(int wire=81;wire<=112;wire++) intvecIt->second[wire]=3;
02256
02257
02258 std::vector<int> zer_2_2(65,0);
02259 id=csctype[5];
02260 if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_2_2;
02261 intvecIt=m_wire_hvsegm.find(id);
02262 for(int wire=1;wire<=16;wire++) intvecIt->second[wire]=1;
02263 for(int wire=17;wire<=28;wire++) intvecIt->second[wire]=2;
02264 for(int wire=29;wire<=40;wire++) intvecIt->second[wire]=3;
02265 for(int wire=41;wire<=52;wire++) intvecIt->second[wire]=4;
02266 for(int wire=53;wire<=64;wire++) intvecIt->second[wire]=5;
02267
02268
02269 std::vector<int> zer_3_1(97,0);
02270 id=csctype[6];
02271 if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_3_1;
02272 intvecIt=m_wire_hvsegm.find(id);
02273 for(int wire=1;wire<=32;wire++) intvecIt->second[wire]=1;
02274 for(int wire=33;wire<=64;wire++) intvecIt->second[wire]=2;
02275 for(int wire=65;wire<=96;wire++) intvecIt->second[wire]=3;
02276
02277
02278 std::vector<int> zer_3_2(65,0);
02279 id=csctype[7];
02280 if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_3_2;
02281 intvecIt=m_wire_hvsegm.find(id);
02282 for(int wire=1;wire<=16;wire++) intvecIt->second[wire]=1;
02283 for(int wire=17;wire<=28;wire++) intvecIt->second[wire]=2;
02284 for(int wire=29;wire<=40;wire++) intvecIt->second[wire]=3;
02285 for(int wire=41;wire<=52;wire++) intvecIt->second[wire]=4;
02286 for(int wire=53;wire<=64;wire++) intvecIt->second[wire]=5;
02287
02288
02289 std::vector<int> zer_4_1(97,0);
02290 id=csctype[8];
02291 if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_4_1;
02292 intvecIt=m_wire_hvsegm.find(id);
02293 for(int wire=1;wire<=32;wire++) intvecIt->second[wire]=1;
02294 for(int wire=33;wire<=64;wire++) intvecIt->second[wire]=2;
02295 for(int wire=65;wire<=96;wire++) intvecIt->second[wire]=3;
02296
02297
02298 std::vector<int> zer_4_2(65,0);
02299 id=csctype[9];
02300 if(m_wire_hvsegm.find(id) == m_wire_hvsegm.end()) m_wire_hvsegm[id]=zer_4_2;
02301 intvecIt=m_wire_hvsegm.find(id);
02302 for(int wire=1;wire<=16;wire++) intvecIt->second[wire]=1;
02303 for(int wire=17;wire<=28;wire++) intvecIt->second[wire]=2;
02304 for(int wire=29;wire<=40;wire++) intvecIt->second[wire]=3;
02305 for(int wire=41;wire<=52;wire++) intvecIt->second[wire]=4;
02306 for(int wire=53;wire<=64;wire++) intvecIt->second[wire]=5;
02307
02308 }
02309
02310
02311
02312 wire_strip_rechit_present=0;
02313 if(wirecltn.begin() != wirecltn.end())
02314 wire_strip_rechit_present= wire_strip_rechit_present+1;
02315 if(strpcltn.begin() != strpcltn.end())
02316 wire_strip_rechit_present= wire_strip_rechit_present+2;
02317 if(rechitcltn.begin() != rechitcltn.end())
02318 wire_strip_rechit_present= wire_strip_rechit_present+4;
02319
02320 if(wire_strip_rechit_present==7) {
02321
02322
02323
02324
02325
02326 CSCWireDigiCollection::DigiRangeIterator wiredetUnitIt;
02327
02328 for(wiredetUnitIt=wirecltn.begin();wiredetUnitIt!=wirecltn.end();
02329 ++wiredetUnitIt) {
02330 const CSCDetId id = (*wiredetUnitIt).first;
02331 idlayer=indexer.dbIndex(id, channel);
02332 idchamber=idlayer/10;
02333 layer=id.layer();
02334
02335 mult=0; wire=0;
02336 const CSCWireDigiCollection::Range& range = (*wiredetUnitIt).second;
02337 for(CSCWireDigiCollection::const_iterator digiIt =
02338 range.first; digiIt!=range.second; ++digiIt){
02339 wire=(*digiIt).getWireGroup();
02340 mult++;
02341 }
02342
02343
02344 if(mult==1) {
02345 if(m_single_wire_layer.find(idlayer) == m_single_wire_layer.end())
02346 m_single_wire_layer[idlayer]=wire;
02347 }
02348 }
02349
02350
02351 CSCRecHit2DCollection::const_iterator recIt;
02352 CSCRecHit2D::ADCContainer m_adc;
02353
02354 for(recIt = rechitcltn.begin(); recIt != rechitcltn.end(); ++recIt) {
02355 CSCDetId id = (CSCDetId)(*recIt).cscDetId();
02356 idlayer=indexer.dbIndex(id, channel);
02357 idchamber=idlayer/10;
02358 layer=id.layer();
02359
02360 if(m_single_wire_layer.find(idlayer) != m_single_wire_layer.end()) {
02361
02362 if(recIt->nStrips()==3) {
02363
02364 unsigned int binmx=0;
02365 float adcmax=0.0;
02366
02367 for(unsigned int i=0;i<recIt->nStrips();i++)
02368 for(unsigned int j=0;j<recIt->nTimeBins();j++)
02369 if(recIt->adcs(i,j)>adcmax) {
02370 adcmax=recIt->adcs(i,j);
02371 binmx=j;
02372 }
02373
02374 float adc_3_3_sum=0.0;
02375
02376 for(unsigned int i=0;i<recIt->nStrips();i++)
02377 for(unsigned int j=binmx-1;j<=binmx+1;j++)
02378 adc_3_3_sum+=recIt->adcs(i,j);
02379
02380
02381 if(adc_3_3_sum > 0.0 && adc_3_3_sum < 2000.0) {
02382
02383
02384 int flag=0;
02385 if(id.station()==1 && id.ring()==4 && recIt->channels(1)>16) flag=1;
02386
02387 if(flag==0) {
02388
02389 wire= m_single_wire_layer[idlayer];
02390 int chambertype=id.iChamberType(id.station(),id.ring());
02391 int hvsgmtnmb=m_wire_hvsegm[chambertype][wire];
02392 int nmbofhvsegm=nmbhvsegm[chambertype-1];
02393 int location= (layer-1)*nmbofhvsegm+hvsgmtnmb;
02394 float x=location;
02395
02396 ss<<"gas_gain_rechit_adc_3_3_sum_location_ME_"<<idchamber;
02397 name=ss.str(); ss.str("");
02398 if(id.endcap()==1) endcapstr = "+";
02399 ring=id.ring();
02400 if(id.station()==1 && id.ring()==4) ring=1;
02401 if(id.endcap()==2) endcapstr = "-";
02402 ss<<"Gas Gain Rechit ADC3X3 Sum ME"<<endcapstr<<
02403 id.station()<<"/"<<ring<<"/"<<id.chamber();
02404 title=ss.str(); ss.str("");
02405 x=location;
02406 y=adc_3_3_sum;
02407 histos->fill2DHist(x,y,name.c_str(),title.c_str(),30,1.0,31.0,50,0.0,2000.0,"GasGain");
02408
02409
02410
02411
02412
02413
02414
02415 }
02416 }
02417 }
02418 }
02419 }
02420 }
02421 }
02422
02423
02424
02425
02426
02427
02428 void CSCValidation::doAFEBTiming(const CSCWireDigiCollection& wirecltn) {
02429 ostringstream ss;
02430 std::string name,title,endcapstr;
02431 float x,y;
02432 int wire,wiretbin,nmbwiretbin,layer,afeb,idlayer,idchamber;
02433 int channel=0;
02434 CSCIndexer indexer;
02435
02436 if(wirecltn.begin() != wirecltn.end()) {
02437
02438
02439
02440
02441
02442
02443 CSCWireDigiCollection::DigiRangeIterator wiredetUnitIt;
02444 for(wiredetUnitIt=wirecltn.begin();wiredetUnitIt!=wirecltn.end();
02445 ++wiredetUnitIt) {
02446 const CSCDetId id = (*wiredetUnitIt).first;
02447 idlayer=indexer.dbIndex(id, channel);
02448 idchamber=idlayer/10;
02449 layer=id.layer();
02450
02451 if (id.endcap() == 1) endcapstr = "+";
02452 if (id.endcap() == 2) endcapstr = "-";
02453
02454
02455
02456 const CSCWireDigiCollection::Range& range = (*wiredetUnitIt).second;
02457 for(CSCWireDigiCollection::const_iterator digiIt =
02458 range.first; digiIt!=range.second; ++digiIt){
02459 wire=(*digiIt).getWireGroup();
02460 wiretbin=(*digiIt).getTimeBin();
02461 nmbwiretbin=(*digiIt).getTimeBinsOn().size();
02462 afeb=3*((wire-1)/8)+(layer+1)/2;
02463
02464
02465 x=afeb;
02466 y=wiretbin;
02467 ss<<"afeb_time_bin_vs_afeb_occupancy_ME_"<<idchamber;
02468 name=ss.str(); ss.str("");
02469 ss<<"Time Bin vs AFEB Occupancy ME"<<endcapstr<<id.station()<<"/"<<id.ring()<<"/"<< id.chamber();
02470 title=ss.str(); ss.str("");
02471 histos->fill2DHist(x,y,name.c_str(),title.c_str(),42,1.,43.,16,0.,16.,"AFEBTiming");
02472
02473
02474 x=afeb;
02475 y=nmbwiretbin;
02476 ss<<"nmb_afeb_time_bins_vs_afeb_ME_"<<idchamber;
02477 name=ss.str(); ss.str("");
02478 ss<<"Number of Time Bins vs AFEB ME"<<endcapstr<<id.station()<<"/"<<id.ring()<<"/"<< id.chamber();
02479 title=ss.str();
02480 ss.str("");
02481 histos->fill2DHist(x,y,name.c_str(),title.c_str(),42,1.,43.,16,0.,16.,"AFEBTiming");
02482
02483 }
02484 }
02485 }
02486 }
02487
02488
02489
02490
02491
02492
02493 void CSCValidation::doCompTiming(const CSCComparatorDigiCollection& compars) {
02494
02495 ostringstream ss; std::string name,title,endcap;
02496 float x,y;
02497 int strip,tbin,cfeb,idlayer,idchamber;
02498 int channel=0;
02499 CSCIndexer indexer;
02500
02501 if(compars.begin() != compars.end()) {
02502
02503
02504
02505
02506
02507
02508 CSCComparatorDigiCollection::DigiRangeIterator compdetUnitIt;
02509 for(compdetUnitIt=compars.begin();compdetUnitIt!=compars.end();
02510 ++compdetUnitIt) {
02511 const CSCDetId id = (*compdetUnitIt).first;
02512 idlayer=indexer.dbIndex(id, channel);
02513 idchamber=idlayer/10;
02514
02515 if (id.endcap() == 1) endcap = "+";
02516 if (id.endcap() == 2) endcap = "-";
02517
02518 const CSCComparatorDigiCollection::Range& range =
02519 (*compdetUnitIt).second;
02520 for(CSCComparatorDigiCollection::const_iterator digiIt =
02521 range.first; digiIt!=range.second; ++digiIt){
02522 strip=(*digiIt).getStrip();
02523
02524
02525
02526
02527
02528 indexer.dbIndex(id, strip);
02529
02530 tbin=(*digiIt).getTimeBin();
02531 cfeb=(strip-1)/16+1;
02532
02533
02534
02535 x=cfeb;
02536 y=tbin;
02537 ss<<"comp_time_bin_vs_cfeb_occupancy_ME_"<<idchamber;
02538 name=ss.str(); ss.str("");
02539 ss<<"Comparator Time Bin vs CFEB Occupancy ME"<<endcap<<
02540 id.station()<<"/"<< id.ring()<<"/"<< id.chamber();
02541 title=ss.str(); ss.str("");
02542 histos->fill2DHist(x,y,name.c_str(),title.c_str(),5,1.,6.,16,0.,16.,"CompTiming");
02543
02544 }
02545 }
02546 }
02547 }
02548
02549
02550
02551
02552
02553
02554 void CSCValidation::doADCTiming(const CSCRecHit2DCollection& rechitcltn) {
02555 float adc_3_3_sum,adc_3_3_wtbin,x,y;
02556 int cfeb,idchamber,ring;
02557
02558 std::string name,title,endcapstr;
02559 ostringstream ss;
02560 std::vector<float> zer(6,0.0);
02561
02562 CSCIndexer indexer;
02563 std::map<int,int>::iterator intIt;
02564
02565 if(rechitcltn.begin() != rechitcltn.end()) {
02566
02567
02568
02569
02570 CSCRecHit2DCollection::const_iterator recIt;
02571 CSCRecHit2D::ADCContainer m_adc;
02572 for(recIt = rechitcltn.begin(); recIt != rechitcltn.end(); ++recIt) {
02573 CSCDetId id = (CSCDetId)(*recIt).cscDetId();
02574
02575 if(recIt->nStrips()==3) {
02576
02577
02578 unsigned int binmx=0;
02579 float adcmax=0.0;
02580
02581 for(unsigned int i=0;i<recIt->nStrips();i++)
02582 for(unsigned int j=0;j<recIt->nTimeBins();j++)
02583 if(recIt->adcs(i,j)>adcmax) {
02584 adcmax=recIt->adcs(i,j);
02585 binmx=j;
02586 }
02587
02588 adc_3_3_sum=0.0;
02589
02590 for(unsigned int i=0;i<recIt->nStrips();i++)
02591 for(unsigned int j=binmx-1;j<=binmx+1;j++)
02592 adc_3_3_sum+=recIt->adcs(i,j);
02593
02594
02595
02596 if(adc_3_3_sum > 100.0) {
02597
02598
02599 int centerStrip=recIt->channels(1);
02600
02601 int flag=0;
02602 if(id.station()==1 && id.ring()==4 && centerStrip>16) flag=1;
02603
02604 if(flag==0) {
02605 adc_3_3_wtbin=(*recIt).tpeak()/50;
02606 idchamber=indexer.dbIndex(id, centerStrip)/10;
02607
02608
02609
02610
02611
02612
02613
02614 ss<<"adc_3_3_weight_time_bin_vs_cfeb_occupancy_ME_"<<idchamber;
02615 name=ss.str(); ss.str("");
02616
02617 std::string endcapstr;
02618 if(id.endcap() == 1) endcapstr = "+";
02619 if(id.endcap() == 2) endcapstr = "-";
02620 ring=id.ring(); if(id.ring()==4) ring=1;
02621 ss<<"ADC 3X3 Weighted Time Bin vs CFEB Occupancy ME"
02622 <<endcapstr<<id.station()<<"/"<<ring<<"/"<<id.chamber();
02623 title=ss.str(); ss.str("");
02624
02625 cfeb=(centerStrip-1)/16+1;
02626 x=cfeb; y=adc_3_3_wtbin;
02627 histos->fill2DHist(x,y,name.c_str(),title.c_str(),5,1.,6.,80,-8.,8.,"ADCTiming");
02628 }
02629 }
02630 }
02631 }
02632 }
02633 }
02634
02635
02636
02637
02638
02639
02640 void CSCValidation::doTimeMonitoring(edm::Handle<CSCRecHit2DCollection> recHits, edm::Handle<CSCSegmentCollection> cscSegments,
02641 edm::Handle<CSCALCTDigiCollection> alcts, edm::Handle<CSCCLCTDigiCollection> clcts,
02642 edm::Handle<CSCCorrelatedLCTDigiCollection> correlatedlcts,
02643 edm::Handle<L1MuGMTReadoutCollection> pCollection, edm::ESHandle<CSCGeometry> cscGeom,
02644 const edm::EventSetup& eventSetup, const edm::Event &event){
02645
02646 map<CSCDetId, float > segment_median_map;
02647 map<CSCDetId, GlobalPoint > segment_position_map;
02648
02649
02650
02651
02652 int iSegment = 0;
02653 for(CSCSegmentCollection::const_iterator dSiter=cscSegments->begin(); dSiter != cscSegments->end(); dSiter++) {
02654 iSegment++;
02655
02656 CSCDetId id = (CSCDetId)(*dSiter).cscDetId();
02657 LocalPoint localPos = (*dSiter).localPosition();
02658 GlobalPoint globalPosition = GlobalPoint(0.0, 0.0, 0.0);
02659 const CSCChamber* cscchamber = cscGeom->chamber(id);
02660 if (cscchamber) {
02661 globalPosition = cscchamber->toGlobal(localPos);
02662 }
02663
02664
02665 std::vector<CSCRecHit2D> theseRecHits = (*dSiter).specificRecHits();
02666 int nRH = (*dSiter).nRecHits();
02667 if (nRH < 4 ) continue;
02668
02669
02670 vector<float> non_zero;
02671
02672 for ( vector<CSCRecHit2D>::const_iterator iRH = theseRecHits.begin(); iRH != theseRecHits.end(); iRH++) {
02673 non_zero.push_back( iRH->tpeak());
02674
02675 }
02676
02677
02678 sort(non_zero.begin(),non_zero.end());
02679 int middle_index = non_zero.size()/2;
02680 float average_two = (non_zero.at(middle_index-1) + non_zero.at(middle_index))/2.;
02681 if(non_zero.size()%2)
02682 average_two = non_zero.at(middle_index);
02683
02684
02685 segment_median_map[id]=average_two;
02686 segment_position_map[id]=globalPosition;
02687
02688 double distToIP = sqrt(globalPosition.x()*globalPosition.x()+globalPosition.y()*globalPosition.y()+globalPosition.z()*globalPosition.z());
02689
02690 histos->fillProfile(chamberSerial(id),average_two,"timeChamber","Segment mean time",601,-0.5,600.5,-400.,400.,"TimeMonitoring");
02691 histos->fillProfileByType(id.chamber(),average_two,"timeChamberByType","Segment mean time by chamber",id,36,0.5,36.5,-400,400.,"TimeMonitoring");
02692 histos->fill2DHist(distToIP,average_two,"seg_time_vs_distToIP","Segment time vs. Distance to IP",80,600.,1400.,800,-400,400.,"TimeMonitoring");
02693 histos->fill2DHist(globalPosition.z(),average_two,"seg_time_vs_globZ","Segment time vs. z position",240,-1200,1200,800,-400.,400.,"TimeMonitoring");
02694 histos->fill2DHist(fabs(globalPosition.z()),average_two,"seg_time_vs_absglobZ","Segment time vs. abs(z position)",120,0.,1200.,800,-400.,400.,"TimeMonitoring");
02695
02696 }
02697
02698
02699 map<CSCDetId, float >::const_iterator it_outer;
02700 map<CSCDetId, float >::const_iterator it_inner;
02701 for (it_outer = segment_median_map.begin(); it_outer != segment_median_map.end(); it_outer++){
02702
02703 CSCDetId id_outer = it_outer->first;
02704 float t_outer = it_outer->second;
02705
02706
02707 for (it_inner = segment_median_map.begin(); it_inner != segment_median_map.end(); it_inner++){
02708
02709 CSCDetId id_inner = it_inner->first;
02710 float t_inner = it_inner->second;
02711
02712
02713
02714
02715 if (chamberSerial(id_outer) == chamberSerial(id_inner)) continue;
02716
02717
02718
02719
02720
02721
02722
02723
02724 if (id_outer.endcap() ==1 && id_inner.endcap() == 2 && id_outer.station() == id_inner.station() && id_outer.ring() == id_inner.ring() ){
02725 histos->fill1DHist(t_outer-t_inner,"diff_opposite_endcaps","#Delta t [ME+]-[ME-] for chambers in same station and ring",800,-400.,400.,"TimeMonitoring");
02726 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");
02727 }
02728
02729 }
02730 }
02731
02732
02733 if( !useDigis ) return;
02734
02735
02736 vector<L1MuGMTReadoutRecord> L1Mrec = pCollection->getRecords();
02737 vector<L1MuGMTReadoutRecord>::const_iterator igmtrr;
02738 int L1GMT_BXN = -100;
02739 bool has_CSCTrigger = false;
02740 bool has_beamHaloTrigger = false;
02741 for(igmtrr=L1Mrec.begin(); igmtrr!=L1Mrec.end(); igmtrr++) {
02742 std::vector<L1MuRegionalCand>::const_iterator iter1;
02743 std::vector<L1MuRegionalCand> rmc;
02744
02745 int icsc = 0;
02746 rmc = igmtrr->getCSCCands();
02747 for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
02748 if ( !(*iter1).empty() ) {
02749 icsc++;
02750 int kQuality = (*iter1).quality();
02751 if (kQuality == 1) has_beamHaloTrigger = true;
02752 }
02753 }
02754 if (igmtrr->getBxInEvent() == 0 && icsc>0){
02755
02756 L1GMT_BXN = igmtrr->getBxNr();
02757 has_CSCTrigger = true;
02758 }
02759 else if (igmtrr->getBxInEvent() == 0 ) {
02760
02761 L1GMT_BXN = igmtrr->getBxNr();
02762 }
02763 }
02764
02765
02766
02767
02768
02769 int n_alcts = 0;
02770 map<CSCDetId, int > ALCT_KeyWG_map;
02771 for (CSCALCTDigiCollection::DigiRangeIterator j=alcts->begin(); j!=alcts->end(); j++) {
02772 const CSCALCTDigiCollection::Range& range =(*j).second;
02773 const CSCDetId& idALCT = (*j).first;
02774 for (CSCALCTDigiCollection::const_iterator digiIt = range.first; digiIt!=range.second; ++digiIt){
02775
02776 if((*digiIt).isValid()){
02777 n_alcts++;
02778 histos->fill1DHist( (*digiIt).getBX(), "ALCT_getBX","ALCT.getBX()",11,-0.5,10.5,"TimeMonitoring");
02779 histos->fill1DHist( (*digiIt).getFullBX(), "ALCT_getFullBX","ALCT.getFullBX()",3601,-0.5,3600.5,"TimeMonitoring");
02780
02781 if (ALCT_KeyWG_map.find(idALCT.chamberId()) == ALCT_KeyWG_map.end()){
02782 ALCT_KeyWG_map[idALCT.chamberId()] = (*digiIt).getKeyWG();
02783
02784 }
02785
02786 }
02787 }
02788 }
02789
02790
02791
02792
02793 int n_clcts = 0;
02794 map<CSCDetId, int > CLCT_getFullBx_map;
02795 for (CSCCLCTDigiCollection::DigiRangeIterator j=clcts->begin(); j!=clcts->end(); j++) {
02796 const CSCCLCTDigiCollection::Range& range =(*j).second;
02797 const CSCDetId& idCLCT = (*j).first;
02798 for (CSCCLCTDigiCollection::const_iterator digiIt = range.first; digiIt!=range.second; ++digiIt){
02799
02800 if((*digiIt).isValid()){
02801 n_clcts++;
02802 histos->fill1DHist( (*digiIt).getBX(), "CLCT_getBX","CLCT.getBX()",11,-0.5,10.5,"TimeMonitoring");
02803 histos->fill1DHist( (*digiIt).getFullBX(), "CLCT_getFullBX","CLCT.getFullBX()",3601,-0.5,3600.5,"TimeMonitoring");
02804
02805 if (CLCT_getFullBx_map.find(idCLCT.chamberId()) == CLCT_getFullBx_map.end()){
02806 CLCT_getFullBx_map[idCLCT.chamberId()] = (*digiIt).getFullBX();
02807
02808 }
02809 }
02810 }
02811 }
02812
02813
02814
02815
02816 int n_correlatedlcts = 0;
02817 for (CSCCorrelatedLCTDigiCollection::DigiRangeIterator j=correlatedlcts->begin(); j!=correlatedlcts->end(); j++) {
02818 const CSCCorrelatedLCTDigiCollection::Range& range =(*j).second;
02819 for (CSCCorrelatedLCTDigiCollection::const_iterator digiIt = range.first; digiIt!=range.second; ++digiIt){
02820 if((*digiIt).isValid()){
02821 n_correlatedlcts++;
02822 histos->fill1DHist( (*digiIt).getBX(), "CorrelatedLCTS_getBX","CorrelatedLCT.getBX()",11,-0.5,10.5,"TimeMonitoring");
02823 }
02824 }
02825 }
02826
02827
02828 int nRecHits = recHits->size();
02829 int nSegments = cscSegments->size();
02830 if (has_CSCTrigger){
02831 histos->fill1DHist(L1GMT_BXN,"BX_L1CSCCand","BX of L1 CSC Cand",4001,-0.5,4000.5,"TimeMonitoring");
02832 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");
02833 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");
02834 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");
02835 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");
02836 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");
02837 }
02838 if (has_CSCTrigger && has_beamHaloTrigger){
02839 histos->fill1DHist(L1GMT_BXN,"BX_L1CSCCand_w_beamHalo","BX of L1 CSC (w beamHalo bit)",4001,-0.5,4000.5,"TimeMonitoring");
02840 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");
02841 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");
02842 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");
02843 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");
02844 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");
02845 }
02846
02847
02848
02849
02850
02851
02852
02853 edm::ESHandle<CSCCrateMap> hcrate;
02854 eventSetup.get<CSCCrateMapRcd>().get(hcrate);
02855 const CSCCrateMap* pcrate = hcrate.product();
02856
02858 edm::Handle<FEDRawDataCollection> rawdata;
02859 event.getByLabel("source", rawdata);
02860 bool goodEvent = false;
02861
02862
02863
02864 unsigned long dccBinCheckMask = 0x06080016;
02865 unsigned int examinerMask = 0x1FEBF3F6;
02866 unsigned int errorMask = 0x0;
02867
02868 for (int id=FEDNumbering::MINCSCFEDID; id<=FEDNumbering::MAXCSCFEDID; ++id) {
02869
02872
02874 const FEDRawData& fedData = rawdata->FEDData(id);
02875 unsigned long length = fedData.size();
02876
02877 if (length>=32){
02878 CSCDCCExaminer* examiner = NULL;
02879 std::stringstream examiner_out, examiner_err;
02880 goodEvent = true;
02882
02883 examiner = new CSCDCCExaminer();
02884 examiner->output1().redirect(examiner_out);
02885 examiner->output2().redirect(examiner_err);
02886 if( examinerMask&0x40000 ) examiner->crcCFEB(1);
02887 if( examinerMask&0x8000 ) examiner->crcTMB (1);
02888 if( examinerMask&0x0400 ) examiner->crcALCT(1);
02889 examiner->output1().show();
02890 examiner->output2().show();
02891 examiner->setMask(examinerMask);
02892 const short unsigned int *data = (short unsigned int *)fedData.data();
02893
02894 if( examiner->check(data,long(fedData.size()/2)) < 0 ) {
02895 goodEvent=false;
02896 }
02897 else {
02898 goodEvent=!(examiner->errors()&dccBinCheckMask);
02899 }
02900
02901 if (goodEvent) {
02903 CSCDCCExaminer * ptrExaminer = examiner;
02904 CSCDCCEventData dccData((short unsigned int *) fedData.data(),ptrExaminer);
02905
02907 const std::vector<CSCDDUEventData> & dduData = dccData.dduData();
02908
02910 CSCDetId layer(1, 1, 1, 1, 1);
02911
02912 for (unsigned int iDDU=0; iDDU<dduData.size(); ++iDDU) {
02915 if (dduData[iDDU].trailer().errorstat()&errorMask) {
02916 LogTrace("CSCDCCUnpacker|CSCRawToDigi") << "DDU# " << iDDU << " has serious error - no digis unpacked! " <<
02917 std::hex << dduData[iDDU].trailer().errorstat();
02918 continue;
02919 }
02920
02922 const std::vector<CSCEventData> & cscData = dduData[iDDU].cscData();
02923 for (unsigned int iCSC=0; iCSC<cscData.size(); ++iCSC) {
02924
02925 int vmecrate = cscData[iCSC].dmbHeader()->crateID();
02926 int dmb = cscData[iCSC].dmbHeader()->dmbID();
02927
02929
02930
02931 int icfeb = 0;
02932 int ilayer = 0;
02933
02934 if ((vmecrate>=1)&&(vmecrate<=60) && (dmb>=1)&&(dmb<=10)&&(dmb!=6)) {
02935 layer = pcrate->detId(vmecrate, dmb,icfeb,ilayer );
02936 }
02937 else{
02938 LogTrace ("CSCTimingAlignment|CSCDCCUnpacker|CSCRawToDigi") << " detID input out of range!!! ";
02939 LogTrace ("CSCTimingAlignment|CSCDCCUnpacker|CSCRawToDigi")
02940 << " skipping chamber vme= " << vmecrate << " dmb= " << dmb;
02941 continue;
02942 }
02943
02945 int nalct = cscData[iCSC].dmbHeader()->nalct();
02946 bool goodALCT=false;
02947
02948 if (nalct&&cscData[iCSC].alctHeader()) {
02949 if (cscData[iCSC].alctHeader()->check()){
02950 goodALCT=true;
02951 }
02952 }
02953
02955 int nclct = cscData[iCSC].dmbHeader()->nclct();
02956 bool goodTMB=false;
02957 if (nclct&&cscData[iCSC].tmbData()) {
02958 if (cscData[iCSC].tmbHeader()->check()){
02959 if (cscData[iCSC].clctData()->check()) goodTMB=true;
02960 }
02961 }
02962
02963 if (goodTMB && goodALCT) {
02964
02965 if (ALCT_KeyWG_map.find(layer) == ALCT_KeyWG_map.end()) {
02966 printf("no ALCT info for Chamber %d %d %d %d \n",layer.endcap(), layer.station(), layer.ring(), layer.chamber());
02967 continue;
02968 }
02969 if (CLCT_getFullBx_map.find(layer) == CLCT_getFullBx_map.end()) {
02970 printf("no CLCT info for Chamber %d %d %d %d \n",layer.endcap(), layer.station(), layer.ring(), layer.chamber());
02971 continue;
02972 }
02973 int ALCT0Key = ALCT_KeyWG_map.find(layer)->second;
02974 int CLCTPretrigger = CLCT_getFullBx_map.find(layer)->second;
02975
02976
02977
02978 const CSCTMBHeader *tmbHead = cscData[iCSC].tmbHeader();
02979
02980 histos->fill1DHistByStation(tmbHead->BXNCount(), "TMB_BXNCount" ,"TMB_BXNCount" , layer.chamberId(),3601,-0.5,3600.5,"TimeMonitoring");
02981 histos->fill1DHistByStation(tmbHead->ALCTMatchTime(),"TMB_ALCTMatchTime","TMB_ALCTMatchTime", layer.chamberId(),7,-0.5,6.5,"TimeMonitoring");
02982
02983 histos->fill1DHist(tmbHead->BXNCount(), "TMB_BXNCount" ,"TMB_BXNCount" , 3601,-0.5,3600.5,"TimeMonitoring");
02984 histos->fill1DHist(tmbHead->ALCTMatchTime(),"TMB_ALCTMatchTime","TMB_ALCTMatchTime", 7,-0.5,6.5,"TimeMonitoring");
02985
02986 histos->fill1DHistByType(tmbHead->ALCTMatchTime(),"TMB_ALCTMatchTime","TMB_ALCTMatchTime",layer.chamberId(), 7,-0.5,6.5,"TimeMonitoring");
02987
02988 histos->fillProfile( chamberSerial(layer.chamberId()),tmbHead->ALCTMatchTime(),"prof_TMB_ALCTMatchTime","prof_TMB_ALCTMatchTime", 601,-0.5,600.5,-0.5,7.5,"TimeMonitoring");
02989 histos->fillProfile(ALCT0Key,tmbHead->ALCTMatchTime(),"prof_TMB_ALCTMatchTime_v_ALCT0KeyWG","prof_TMB_ALCTMatchTime_v_ALCT0KeyWG",128,-0.5,127.5,0,7,"TimeMonitoring");
02990 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");
02991
02992
02993
02994 int TMB_ALCT_rel_L1A = tmbHead->BXNCount()-(CLCTPretrigger+2+tmbHead->ALCTMatchTime());
02995 if (TMB_ALCT_rel_L1A > 3563)
02996 TMB_ALCT_rel_L1A = TMB_ALCT_rel_L1A - 3564;
02997 if (TMB_ALCT_rel_L1A < 0)
02998 TMB_ALCT_rel_L1A = TMB_ALCT_rel_L1A + 3564;
02999
03000
03001 histos->fill1DHist(TMB_ALCT_rel_L1A,"h1D_TMB_ALCT_rel_L1A","h1D_TMB_ALCT_rel_L1A",11,144.5,155.5,"TimeMonitoring");
03002 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");
03003 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");
03004 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");
03005 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");
03006
03007 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");
03008 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");
03009 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");
03010 }
03011
03012 }
03013 }
03014 }
03015 if (examiner!=NULL) delete examiner;
03016 }
03017 }
03018
03019 }
03020
03021
03022 void CSCValidation::endJob() {
03023
03024 std::cout<<"Events in "<<nEventsAnalyzed<<std::endl;
03025 }
03026
03027 DEFINE_FWK_MODULE(CSCValidation);
03028