00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <DQM/DTMonitorClient/src/DTRunConditionVarClient.h>
00016 #include <DQMServices/Core/interface/MonitorElement.h>
00017 #include <DQMServices/Core/interface/DQMStore.h>
00018
00019 #include <FWCore/Framework/interface/EventSetup.h>
00020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00021
00022 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00023 #include "Geometry/DTGeometry/interface/DTGeometry.h"
00024 #include "CondFormats/DataRecord/interface/DTMtimeRcd.h"
00025
00026 #include <stdio.h>
00027 #include <sstream>
00028 #include <math.h>
00029
00030 using namespace edm;
00031 using namespace std;
00032
00033 DTRunConditionVarClient::DTRunConditionVarClient(const ParameterSet& pSet)
00034 {
00035
00036 LogVerbatim ("DTDQM|DTMonitorClient|DTRunConditionVarClient")
00037 << "DTRunConditionVarClient: Constructor called";
00038
00039
00040 minRangeVDrift = pSet.getUntrackedParameter<double>("minRangeVDrift");
00041 maxRangeVDrift = pSet.getUntrackedParameter<double>("maxRangeVDrift");
00042 minRangeT0 = pSet.getUntrackedParameter<double>("minRangeT0");
00043 maxRangeT0 = pSet.getUntrackedParameter<double>("maxRangeT0");
00044
00045 maxGoodVDriftDev = pSet.getUntrackedParameter<double>("maxGoodVDriftDev");
00046 minBadVDriftDev = pSet.getUntrackedParameter<double>("minBadVDriftDev");
00047 maxGoodT0 = pSet.getUntrackedParameter<double>("maxGoodT0");
00048 minBadT0 = pSet.getUntrackedParameter<double>("minBadT0");
00049
00050 maxGoodVDriftSigma = pSet.getUntrackedParameter<double>("maxGoodVDriftSigma");
00051 minBadVDriftSigma = pSet.getUntrackedParameter<double>("minBadVDriftSigma");
00052 maxGoodT0Sigma = pSet.getUntrackedParameter<double>("maxGoodT0Sigma");
00053 minBadT0Sigma = pSet.getUntrackedParameter<double>("minBadT0Sigma");
00054
00055 theDbe = Service<DQMStore>().operator->();
00056
00057 }
00058
00059 DTRunConditionVarClient::~DTRunConditionVarClient()
00060 {
00061 LogVerbatim ("DTDQM|DTMonitorClient|DTRunConditionVarClient")
00062 << "DTRunConditionVarClient: Destructor called";
00063 }
00064
00065 void DTRunConditionVarClient::beginJob()
00066 {
00067 LogVerbatim ("DTDQM|DTMonitorClient|DTRunConditionVarClient")
00068 << "DTRunConditionVarClient: BeginJob";
00069
00070 nevents = 0;
00071
00072 theDbe -> setCurrentFolder("DT/02-Segments");
00073
00074 glbVDriftSummary = theDbe->book2D("VDriftGlbSummary", "# of MBs with good mean and good sigma of vDrift",12,1,13,5,-2,3);
00075 glbT0Summary = theDbe->book2D("T0GlbSummary", "# of MBs with good mean and good sigma of t0",12,1,13,5,-2,3);
00076
00077 theDbe -> setCurrentFolder("DT/02-Segments/02-MeanVDrift");
00078
00079 summaryHistos["MeanVDriftGlbSummary"] = theDbe -> book2D("MeanVDriftGlbSummary","mean VDrift average per sector",12,1.,13.,5,-2.,3.);
00080 allwheelHistos["allMeanVDrift"] = theDbe -> book1D("VDriftMeanAllWheels","mean VDrift for all chambers",60,0.0048,0.006);
00081
00082 theDbe -> setCurrentFolder("DT/02-Segments/02-SigmaVDrift");
00083
00084 summaryHistos["SigmaVDriftGlbSummary"] = theDbe -> book2D("SigmaVDriftGlbSummary","# of Chambers with good sigma VDrift",12,1.,13.,5,-2.,3.);
00085 allwheelHistos["allSigmaVDrift"] = theDbe -> book1D("VDriftSigmaAllWheels","sigma VDrift for all chambers",30,0.,0.0006);
00086
00087 theDbe -> setCurrentFolder("DT/02-Segments/03-MeanT0");
00088
00089 summaryHistos["MeanT0GlbSummary"] = theDbe -> book2D("MeanT0GlbSummary","mean T0 average per sector",12,1.,13.,5,-2.,3.);
00090 allwheelHistos["allMeanT0"] = theDbe -> book1D("T0MeanAllWheels","mean T0 for all chambers",100,-25.,25.);
00091
00092 theDbe -> setCurrentFolder("DT/02-Segments/03-SigmaT0");
00093
00094 summaryHistos["SigmaT0GlbSummary"] = theDbe -> book2D("SigmaT0GlbSummary","# of Chambers with good sigma T0",12,1.,13.,5,-2.,3.);
00095 allwheelHistos["allSigmaT0"] = theDbe -> book1D("T0SigmaAllWheels","sigma T0 for alla chambers",50,0,25);
00096
00097 for(int wh=-2; wh<=2; wh++) {
00098 bookWheelHistos("MeanVDrift","02-MeanVDrift",wh,60,0.0048,0.006,true);
00099 bookWheelHistos("SigmaVDrift","02-SigmaVDrift",wh,30,0.,0.0006);
00100 bookWheelHistos("MeanT0","03-MeanT0",wh,100,-25.,25.);
00101 bookWheelHistos("SigmaT0","03-SigmaT0",wh,50,0,25);
00102 }
00103
00104 return;
00105 }
00106
00107 void DTRunConditionVarClient::beginLuminosityBlock(LuminosityBlock const& lumiSeg, EventSetup const& context)
00108 {
00109 LogVerbatim ("DTDQM|DTMonitorClient|DTRunConditionVarClient")
00110 << "[DTRunConditionVarClient]: Begin of LS transition";
00111
00112 return;
00113 }
00114
00115 void DTRunConditionVarClient::beginRun(const Run& run, const EventSetup& setup)
00116 {
00117 LogVerbatim ("DTDQM|DTMonitorClient|DTRunConditionVarClient")
00118 << "DTRunConditionVarClient: beginRun";
00119
00120 return;
00121 }
00122
00123 void DTRunConditionVarClient::analyze(const Event& e, const EventSetup& context)
00124 {
00125
00126 nevents++;
00127 LogVerbatim ("DTDQM|DTMonitorClient|DTRunConditionVarClient")
00128 << "[DTRunConditionVarClient]: " << nevents << " events";
00129 return;
00130 }
00131
00132 void DTRunConditionVarClient::endLuminosityBlock(LuminosityBlock const& lumiSeg, EventSetup const& context)
00133 {
00134 LogVerbatim ("DTDQM|DTMonitorClient|DTRunConditionVarClient")
00135 << "DTRunConditionVarClient: endluminosityBlock";
00136 }
00137
00138
00139 void DTRunConditionVarClient::endRun(Run const& run, EventSetup const& context)
00140 {
00141 LogVerbatim ("DTDQM|DTMonitorClient|DTRunConditionVarClient")
00142 << "DTRunConditionVarClient: endRun";
00143
00144
00145 context.get<DTMtimeRcd>().get(mTime);
00146 mTimeMap_ = &*mTime;
00147
00148 for(int wheel=-2;wheel<=2;wheel++){
00149 for(int sec=1; sec<=14; sec++) {
00150 for(int stat=1; stat<=4; stat++) {
00151
00152 if( (sec == 13 || sec == 14) && stat != 4 ) continue;
00153
00154
00155 MonitorElement* VDriftME = getChamberHistos(DTChamberId(wheel,stat,sec),"VDrift_FromSegm");
00156 MonitorElement* T0ME = getChamberHistos(DTChamberId(wheel,stat,sec),"T0_FromSegm");
00157
00158
00159 float vDriftMean = VDriftME->getMean();
00160 float t0Mean = T0ME->getMean();
00161
00162
00163 float vDriftSigma = VDriftME->getRMS();
00164 float t0Sigma = T0ME->getRMS();
00165
00166 allwheelHistos["allMeanVDrift"] -> Fill(vDriftMean);
00167 allwheelHistos["allMeanT0"] -> Fill(t0Mean);
00168
00169 allwheelHistos["allSigmaVDrift"] -> Fill(vDriftSigma);
00170 allwheelHistos["allSigmaT0"] -> Fill(t0Sigma);
00171
00172 (wheelHistos[wheel])["MeanVDrift"] -> Fill(vDriftMean);
00173 (wheelHistos[wheel])["MeanT0"] -> Fill(t0Mean);
00174
00175 (wheelHistos[wheel])["SigmaVDrift"] -> Fill(vDriftSigma);
00176 (wheelHistos[wheel])["SigmaT0"] -> Fill(t0Sigma);
00177
00178
00179 DTChamberId indexCh(wheel,stat,sec);
00180
00181 float vDriftDev(0.), errvDriftDev(0.);
00182 percDevVDrift(indexCh, vDriftMean, vDriftSigma, vDriftDev, errvDriftDev);
00183
00184 int sec_ = sec;
00185 if( sec == 13 || sec == 14 ) sec_ = ( sec == 13 ) ? 4 : 10;
00186
00187 float fillvDriftDev = max(min(vDriftDev,maxRangeVDrift),minRangeVDrift);
00188 float fillT0Mean = max(min(t0Mean,maxRangeT0),minRangeT0);
00189
00190 float vDriftDevQ = varQuality(fabs(vDriftDev),maxGoodVDriftDev,minBadVDriftDev);
00191 float t0MeanQ = varQuality(fabs(t0Mean),maxGoodT0,minBadT0);
00192
00193 float vDriftSigmQ = varQuality(vDriftSigma,maxGoodVDriftSigma,minBadVDriftSigma);
00194 float t0SigmQ = varQuality(t0Sigma,maxGoodT0Sigma,minBadT0Sigma);
00195
00196 if( sec == 13 || sec == 14 ) {
00197
00198 float binVDriftDev = (wheelHistos[wheel])["MeanVDriftSummary"]->getBinContent(sec_,stat);
00199 binVDriftDev = (fabs(binVDriftDev) > fabs(fillvDriftDev)) ? binVDriftDev : fillvDriftDev;
00200 (wheelHistos[wheel])["MeanVDriftSummary"] -> setBinContent(sec_,stat,binVDriftDev);
00201
00202 float binT0MeanVal = (wheelHistos[wheel])["MeanT0Summary"] -> getBinContent(sec_,stat);
00203 binT0MeanVal = (fabs(binT0MeanVal) > fabs(fillT0Mean)) ? binT0MeanVal : fillT0Mean;
00204 (wheelHistos[wheel])["MeanT0Summary"] -> setBinContent(sec_,stat,binT0MeanVal);
00205
00206 float binVDriftSigmVal = (wheelHistos[wheel])["SigmaVDriftSummary"] -> getBinContent(sec_,stat);
00207 binVDriftSigmVal = (binVDriftSigmVal > 0. && binVDriftSigmVal < vDriftSigmQ) ? binVDriftSigmVal : vDriftSigmQ;
00208 (wheelHistos[wheel])["SigmaVDriftSummary"] -> setBinContent(sec_,stat,binVDriftSigmVal);
00209
00210 float binT0SigmVal = (wheelHistos[wheel])["SigmaT0Summary"] -> getBinContent(sec_,stat);
00211 binT0SigmVal = (binT0SigmVal > 0. && binT0SigmVal < t0SigmQ) ? binT0SigmVal : t0SigmQ;
00212 (wheelHistos[wheel])["SigmaT0Summary"] -> setBinContent(sec_,stat,binT0SigmVal);
00213
00214 } else {
00215
00216 (wheelHistos[wheel])["MeanVDriftSummary"] -> setBinContent(sec_,stat,fillvDriftDev);
00217 (wheelHistos[wheel])["MeanT0Summary"] -> setBinContent(sec_,stat,fillT0Mean);
00218 (wheelHistos[wheel])["SigmaVDriftSummary"] -> setBinContent(sec_,stat,vDriftSigmQ);
00219 (wheelHistos[wheel])["SigmaT0Summary"] -> setBinContent(sec_,stat,t0SigmQ);
00220
00221 }
00222
00223 double weight = 1/4.;
00224 if(( sec_ == 4 || sec_ == 10) && stat == 4) weight = 1/8.;
00225
00226 if( vDriftDevQ > 0.85 && vDriftSigmQ > 0.85 ) {
00227 glbVDriftSummary -> Fill(sec_,wheel,weight);
00228 summaryHistos["MeanVDriftGlbSummary"] -> Fill(sec_,wheel,weight);
00229 summaryHistos["SigmaVDriftGlbSummary"] -> Fill(sec_,wheel,weight);
00230
00231 } else {
00232 if( vDriftDevQ > 0.85 && vDriftSigmQ < 0.85 ) {
00233 summaryHistos["MeanVDriftGlbSummary"] -> Fill(sec_,wheel,weight);
00234 }
00235 if( vDriftDevQ < 0.85 && vDriftSigmQ > 0.85 ) {
00236 summaryHistos["SigmaVDriftGlbSummary"] -> Fill(sec_,wheel,weight);
00237 }
00238 }
00239
00240 if( t0MeanQ > 0.85 && t0SigmQ > 0.85 ) {
00241 glbT0Summary -> Fill(sec_,wheel,weight);
00242 summaryHistos["MeanT0GlbSummary"] -> Fill(sec_,wheel,weight);
00243 summaryHistos["SigmaT0GlbSummary"] -> Fill(sec_,wheel,weight);
00244 } else {
00245 if( t0MeanQ > 0.85 && t0SigmQ < 0.85 ) {
00246 summaryHistos["MeanT0GlbSummary"] -> Fill(sec_,wheel,weight);
00247
00248 }
00249 if( t0MeanQ < 0.85 && t0SigmQ > 0.85 ) {
00250 summaryHistos["SigmaT0GlbSummary"] -> Fill(sec_,wheel,weight);
00251 }
00252 }
00253
00254
00255 }
00256 }
00257 }
00258
00259 return;
00260 }
00261
00262 void DTRunConditionVarClient::endJob()
00263 {
00264 LogVerbatim ("DTDQM|DTMonitorClient|DTRunConditionVarClient")
00265 << "DTRunConditionVarClient: endJob";
00266 return;
00267 }
00268
00269 float DTRunConditionVarClient::varQuality(float var, float maxGood, float minBad) {
00270
00271 float qual(0);
00272 if( var <= maxGood ) {qual = 1.;}
00273 else if( var > maxGood && var < minBad ) {qual = 0.9;}
00274 else if( var >= minBad ) {qual = 0.1;}
00275
00276 return qual;
00277 }
00278
00279 void DTRunConditionVarClient::percDevVDrift(DTChamberId indexCh, float meanVD, float sigmaVD, float& devVD, float& errdevVD) {
00280
00281 DTSuperLayerId indexSLPhi1(indexCh,1);
00282 DTSuperLayerId indexSLPhi2(indexCh,3);
00283
00284 float vDriftPhi1(0.), vDriftPhi2(0.);
00285 float ResPhi1(0.), ResPhi2(0.);
00286 int status1 = mTimeMap_->get(indexSLPhi1,vDriftPhi1,ResPhi1,DTVelocityUnits::cm_per_ns);
00287 int status2 = mTimeMap_->get(indexSLPhi2,vDriftPhi2,ResPhi2,DTVelocityUnits::cm_per_ns);
00288
00289 if(status1 != 0 || status2 != 0) {
00290 DTSuperLayerId sl = (status1 != 0) ? indexSLPhi1 : indexSLPhi2;
00291 throw cms::Exception("DTRunConditionVarClient") << "Could not find vDrift entry in DB for"
00292 << sl << endl;
00293 }
00294
00295 float vDriftMed = (vDriftPhi1 + vDriftPhi2) / 2.;
00296
00297 devVD = (meanVD - vDriftMed) / vDriftMed;
00298 devVD = devVD < 1. ? devVD : 1.;
00299
00300 errdevVD = sigmaVD/vDriftMed;
00301
00302 return;
00303 }
00304
00305 void DTRunConditionVarClient::bookWheelHistos(string histoType, string subfolder, int wh, int nbins, float min, float max, bool isVDCorr )
00306 {
00307 stringstream wheel; wheel << wh;
00308
00309 string folder = "DT/02-Segments/" + subfolder;
00310
00311 theDbe->setCurrentFolder(folder);
00312
00313 string histoName = histoType + "_W" + wheel.str();
00314 string histoLabel = histoType;
00315
00316 (wheelHistos[wh])[histoType] = theDbe -> book1D(histoName, histoLabel, nbins, min, max);
00317
00318
00319 if( isVDCorr ) {
00320 histoLabel = "Summary of corrections to VDrift DB values";
00321 histoName = "CorrTo" + histoType + "Summary_W" + wheel.str();
00322 } else {
00323 histoLabel = histoType + "Summary";
00324 histoName = histoType + "Summary_W" + wheel.str();
00325 }
00326
00327 MonitorElement* me = theDbe -> book2D(histoName, histoLabel,12,1,13,4,1,5);
00328
00329 me->setBinLabel(1,"MB1",2);
00330 me->setBinLabel(2,"MB2",2);
00331 me->setBinLabel(3,"MB3",2);
00332 me->setBinLabel(4,"MB4",2);
00333 me->setAxisTitle("Sector",1);
00334
00335 (wheelHistos[wh])[histoType + "Summary"] = me;
00336
00337 return;
00338 }
00339
00340 MonitorElement* DTRunConditionVarClient::getChamberHistos(const DTChamberId& dtCh, string histoType) {
00341
00342 int wh = dtCh.wheel();
00343 int sc = dtCh.sector();
00344 int st = dtCh.station();
00345 stringstream wheel; wheel << wh;
00346 stringstream station; station << st;
00347 stringstream sector; sector << sc;
00348
00349 string folder = "DT/02-Segments/Wheel" + wheel.str() + "/Sector" + sector.str() + "/Station" + station.str();
00350 string histoTag = "_W" + wheel.str() + "_Sec" + sector.str() + "_St" + station.str();
00351 string MEpath = folder + "/" + histoType + histoTag;
00352
00353 theDbe->setCurrentFolder(folder);
00354
00355 LogTrace ("DTDQM|DTMonitorModule|DTRunConditionVar")
00356 << "[DTRunConditionVar]: getting ME from " << folder << endl;
00357
00358 MonitorElement* ME = theDbe -> get(MEpath);
00359
00360 return ME;
00361 }