00001
00002
00003
00004
00005
00006
00007
00008 #include "CalibMuon/DTCalibration/plugins/DTTTrigCalibration.h"
00009 #include "CalibMuon/DTCalibration/interface/DTTimeBoxFitter.h"
00010 #include "CalibMuon/DTDigiSync/interface/DTTTrigSyncFactory.h"
00011 #include "CalibMuon/DTDigiSync/interface/DTTTrigBaseSync.h"
00012
00013 #include "FWCore/Framework/interface/EventSetup.h"
00014 #include "FWCore/Framework/interface/Event.h"
00015 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00016 #include "FWCore/Framework/interface/ESHandle.h"
00017
00018 #include "DataFormats/DTDigi/interface/DTDigiCollection.h"
00019 #include "DataFormats/MuonDetId/interface/DTWireId.h"
00020
00021 #include "CondFormats/DTObjects/interface/DTTtrig.h"
00022
00023 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00024
00025 #include "CalibMuon/DTCalibration/interface/DTCalibDBUtils.h"
00026
00027
00028 #include "CondFormats/DataRecord/interface/DTStatusFlagRcd.h"
00029 #include "CondFormats/DTObjects/interface/DTStatusFlag.h"
00030
00031
00032 #include "TFile.h"
00033 #include "TH1F.h"
00034 #include "TGraph.h"
00035
00036 class DTLayer;
00037
00038 using namespace std;
00039 using namespace edm;
00040
00041
00042
00043
00044
00045 DTTTrigCalibration::DTTTrigCalibration(const edm::ParameterSet& pset) {
00046
00047 debug = pset.getUntrackedParameter<bool>("debug");
00048
00049
00050 digiLabel = pset.getUntrackedParameter<string>("digiLabel");
00051
00052
00053 findTMeanAndSigma = pset.getUntrackedParameter<bool>("fitAndWrite", false);
00054
00055
00056 maxTDCCounts = 5000 * pset.getUntrackedParameter<int>("tdcRescale", 1);
00057
00058 maxDigiPerLayer = pset.getUntrackedParameter<int>("maxDigiPerLayer", 10);
00059
00060
00061 string rootFileName = pset.getUntrackedParameter<string>("rootFileName");
00062 theFile = new TFile(rootFileName.c_str(), "RECREATE");
00063 theFile->cd();
00064 theFitter = new DTTimeBoxFitter();
00065 if(debug)
00066 theFitter->setVerbosity(1);
00067
00068 double sigmaFit = pset.getUntrackedParameter<double>("sigmaTTrigFit",10.);
00069 theFitter->setFitSigma(sigmaFit);
00070
00071 doSubtractT0 = pset.getUntrackedParameter<bool>("doSubtractT0","false");
00072
00073 if(doSubtractT0) {
00074 theSync = DTTTrigSyncFactory::get()->create(pset.getUntrackedParameter<string>("tTrigMode"),
00075 pset.getUntrackedParameter<ParameterSet>("tTrigModeConfig"));
00076 } else {
00077 theSync = 0;
00078 }
00079
00080 checkNoisyChannels = pset.getUntrackedParameter<bool>("checkNoisyChannels","false");
00081
00082
00083 kFactor = pset.getUntrackedParameter<double>("kFactor",-0.7);
00084
00085 if(debug)
00086 cout << "[DTTTrigCalibration]Constructor called!" << endl;
00087 }
00088
00089
00090
00091
00092 DTTTrigCalibration::~DTTTrigCalibration(){
00093 if(debug)
00094 cout << "[DTTTrigCalibration]Destructor called!" << endl;
00095
00096
00097
00098
00099
00100
00101
00102
00103 theFile->Close();
00104 delete theFitter;
00105 }
00106
00107
00108
00110 void DTTTrigCalibration::analyze(const edm::Event & event, const edm::EventSetup& eventSetup) {
00111
00112 if(debug)
00113 cout << "[DTTTrigCalibration] #Event: " << event.id().event() << endl;
00114
00115
00116 Handle<DTDigiCollection> digis;
00117 event.getByLabel(digiLabel, digis);
00118
00119 ESHandle<DTStatusFlag> statusMap;
00120 if(checkNoisyChannels) {
00121
00122 eventSetup.get<DTStatusFlagRcd>().get(statusMap);
00123 }
00124
00125 if(doSubtractT0)
00126 theSync->setES(eventSetup);
00127
00128
00129 vector<DTChamberId> badChambers;
00130
00131
00132 DTDigiCollection::DigiRangeIterator dtLayerIt;
00133 for (dtLayerIt = digis->begin();
00134 dtLayerIt != digis->end();
00135 ++dtLayerIt){
00136
00137 const DTDigiCollection::Range& digiRange = (*dtLayerIt).second;
00138
00139 const DTLayerId layerId = (*dtLayerIt).first;
00140 const DTSuperLayerId slId = layerId.superlayerId();
00141 const DTChamberId chId = slId.chamberId();
00142 bool badChamber=false;
00143
00144 if(debug)
00145 cout<<"----------- Layer "<<layerId<<" -------------"<<endl;
00146
00147
00148 for(vector<DTChamberId>::const_iterator chamber = badChambers.begin(); chamber != badChambers.end(); chamber++){
00149 if((*chamber) == chId){
00150 badChamber=true;
00151 break;
00152 }
00153 }
00154 if(badChamber) continue;
00155
00156
00157 if((digiRange.second - digiRange.first) > maxDigiPerLayer){
00158 if(debug)
00159 cout<<"Layer "<<layerId<<"has too many digis ("<<(digiRange.second - digiRange.first)<<")"<<endl;
00160 badChambers.push_back(chId);
00161 continue;
00162 }
00163
00164
00165 TH1F *hTBox = theHistoMap[slId];
00166 if(hTBox == 0) {
00167
00168 theFile->cd();
00169 hTBox = new TH1F(getTBoxName(slId).c_str(), "Time box (ns)", int(0.25*32.0*maxTDCCounts/25.0), 0, maxTDCCounts);
00170 if(debug)
00171 cout << " New Time Box: " << hTBox->GetName() << endl;
00172 theHistoMap[slId] = hTBox;
00173 }
00174 TH1F *hO = theOccupancyMap[layerId];
00175 if(hO == 0) {
00176
00177 theFile->cd();
00178 hO = new TH1F(getOccupancyName(layerId).c_str(), "Occupancy", 100, 0, 100);
00179 if(debug)
00180 cout << " New Time Box: " << hO->GetName() << endl;
00181 theOccupancyMap[layerId] = hO;
00182 }
00183
00184
00185 for (DTDigiCollection::const_iterator digi = digiRange.first;
00186 digi != digiRange.second;
00187 digi++) {
00188 const DTWireId wireId(layerId, (*digi).wire());
00189
00190
00191 if(checkNoisyChannels) {
00192 bool isNoisy = false;
00193 bool isFEMasked = false;
00194 bool isTDCMasked = false;
00195 bool isTrigMask = false;
00196 bool isDead = false;
00197 bool isNohv = false;
00198 statusMap->cellStatus(wireId, isNoisy, isFEMasked, isTDCMasked, isTrigMask, isDead, isNohv);
00199 if(isNoisy) {
00200 if(debug)
00201 cout << "Wire: " << wireId << " is noisy, skipping!" << endl;
00202 continue;
00203 }
00204 }
00205 theFile->cd();
00206 double offset = 0;
00207 if(doSubtractT0) {
00208 const DTLayer* layer = 0;
00209 const GlobalPoint glPt;
00210 offset = theSync->offset(layer, wireId, glPt);
00211 }
00212 hTBox->Fill((*digi).time()-offset);
00213 if(debug) {
00214 cout << " Filling Time Box: " << hTBox->GetName() << endl;
00215 cout << " offset (ns): " << offset << endl;
00216 cout << " time(ns): " << (*digi).time()-offset<< endl;
00217 }
00218 hO->Fill((*digi).wire());
00219 }
00220 }
00221 }
00222
00223
00224 void DTTTrigCalibration::endJob() {
00225 if(debug)
00226 cout << "[DTTTrigCalibration]Writing histos to file!" << endl;
00227
00228
00229 theFile->cd();
00230 for(map<DTSuperLayerId, TH1F*>::const_iterator slHisto = theHistoMap.begin();
00231 slHisto != theHistoMap.end();
00232 slHisto++) {
00233 (*slHisto).second->Write();
00234 }
00235 for(map<DTLayerId, TH1F*>::const_iterator slHisto = theOccupancyMap.begin();
00236 slHisto != theOccupancyMap.end();
00237 slHisto++) {
00238 (*slHisto).second->Write();
00239 }
00240
00241 if(findTMeanAndSigma) {
00242
00243 DTTtrig* tTrig = new DTTtrig();
00244
00245
00246 for(map<DTSuperLayerId, TH1F*>::const_iterator slHisto = theHistoMap.begin();
00247 slHisto != theHistoMap.end();
00248 slHisto++) {
00249 pair<double, double> meanAndSigma = theFitter->fitTimeBox((*slHisto).second);
00250 tTrig->set((*slHisto).first,
00251 meanAndSigma.first,
00252 meanAndSigma.second,
00253 kFactor,
00254 DTTimeUnits::ns);
00255
00256 if(debug) {
00257 cout << " SL: " << (*slHisto).first
00258 << " mean = " << meanAndSigma.first
00259 << " sigma = " << meanAndSigma.second << endl;
00260 }
00261 }
00262
00263
00264 dumpTTrigMap(tTrig);
00265
00266
00267 plotTTrig(tTrig);
00268
00269 if(debug)
00270 cout << "[DTTTrigCalibration]Writing ttrig object to DB!" << endl;
00271
00272
00273
00274 string tTrigRecord = "DTTtrigRcd";
00275
00276
00277 DTCalibDBUtils::writeToDB(tTrigRecord, tTrig);
00278 }
00279
00280 }
00281
00282
00283
00284
00285 string DTTTrigCalibration::getTBoxName(const DTSuperLayerId& slId) const {
00286 string histoName;
00287 stringstream theStream;
00288 theStream << "Ch_" << slId.wheel() << "_" << slId.station() << "_" << slId.sector()
00289 << "_SL" << slId.superlayer() << "_hTimeBox";
00290 theStream >> histoName;
00291 return histoName;
00292 }
00293
00294 string DTTTrigCalibration::getOccupancyName(const DTLayerId& slId) const {
00295 string histoName;
00296 stringstream theStream;
00297 theStream << "Ch_" << slId.wheel() << "_" << slId.station() << "_" << slId.sector()
00298 << "_SL" << slId.superlayer() << "_L"<< slId.layer() <<"_Occupancy";
00299 theStream >> histoName;
00300 return histoName;
00301 }
00302
00303
00304 void DTTTrigCalibration::dumpTTrigMap(const DTTtrig* tTrig) const {
00305 static const double convToNs = 25./32.;
00306 for(DTTtrig::const_iterator ttrig = tTrig->begin();
00307 ttrig != tTrig->end(); ttrig++) {
00308 cout << "Wh: " << (*ttrig).first.wheelId
00309 << " St: " << (*ttrig).first.stationId
00310 << " Sc: " << (*ttrig).first.sectorId
00311 << " Sl: " << (*ttrig).first.slId
00312 << " TTrig mean (ns): " << (*ttrig).second.tTrig * convToNs
00313 << " TTrig sigma (ns): " << (*ttrig).second.tTrms * convToNs<< endl;
00314 }
00315 }
00316
00317
00318 void DTTTrigCalibration::plotTTrig(const DTTtrig* tTrig) const {
00319
00320 TH1F* tTrig_YB1_Se10 = new TH1F("tTrig_YB1_Se10","tTrig YB1_Se10",15,1,16);
00321 TH1F* tTrig_YB2_Se10 = new TH1F("tTrig_YB2_Se10","tTrig YB2_Se10",15,1,16);
00322 TH1F* tTrig_YB2_Se11 = new TH1F("tTrig_YB2_Se11","tTrig YB2_Se11",12,1,13);
00323
00324 static const double convToNs = 25./32.;
00325 for(DTTtrig::const_iterator ttrig = tTrig->begin();
00326 ttrig != tTrig->end(); ttrig++) {
00327
00328
00329 float tTrigValue=0;
00330 float tTrmsValue=0;
00331 if ((*ttrig).second.tTrig * convToNs > 0 &&
00332 (*ttrig).second.tTrig * convToNs < 32000 ) {
00333 tTrigValue = (*ttrig).second.tTrig * convToNs;
00334 tTrmsValue = (*ttrig).second.tTrms * convToNs;
00335 }
00336
00337 int binx;
00338 string binLabel;
00339 stringstream binLabelStream;
00340 if ((*ttrig).first.sectorId != 14) {
00341 binx = ((*ttrig).first.stationId-1)*3 + (*ttrig).first.slId;
00342 binLabelStream << "MB"<<(*ttrig).first.stationId<<"_SL"<<(*ttrig).first.slId;
00343 }
00344 else {
00345 binx = 12 + (*ttrig).first.slId;
00346 binLabelStream << "MB14_SL"<<(*ttrig).first.slId;
00347 }
00348 binLabelStream >> binLabel;
00349
00350 if ((*ttrig).first.wheelId == 2) {
00351 if ((*ttrig).first.sectorId == 10 || (*ttrig).first.sectorId == 14) {
00352 tTrig_YB2_Se10->Fill( binx,tTrigValue);
00353 tTrig_YB2_Se10->SetBinError( binx, tTrmsValue);
00354 tTrig_YB2_Se10->GetXaxis()->SetBinLabel(binx,binLabel.c_str());
00355 tTrig_YB2_Se10->GetYaxis()->SetTitle("ns");
00356 }
00357 else {
00358 tTrig_YB2_Se11->Fill( binx,tTrigValue);
00359 tTrig_YB2_Se11->SetBinError( binx,tTrmsValue);
00360 tTrig_YB2_Se11->GetXaxis()->SetBinLabel(binx,binLabel.c_str());
00361 tTrig_YB2_Se11->GetYaxis()->SetTitle("ns");
00362 }
00363 }
00364 else {
00365 tTrig_YB1_Se10->Fill( binx,tTrigValue);
00366 tTrig_YB1_Se10->SetBinError( binx,tTrmsValue);
00367 tTrig_YB1_Se10->GetXaxis()->SetBinLabel(binx,binLabel.c_str());
00368 tTrig_YB1_Se10->GetYaxis()->SetTitle("ns");
00369 }
00370 }
00371
00372 tTrig_YB1_Se10->Write();
00373 tTrig_YB2_Se10->Write();
00374 tTrig_YB2_Se11->Write();
00375
00376 }