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 if( VDriftME->getEntries() != 0 ) {
00167
00168 allwheelHistos["allMeanVDrift"] -> Fill(vDriftMean);
00169 allwheelHistos["allSigmaVDrift"] -> Fill(vDriftSigma);
00170
00171 (wheelHistos[wheel])["MeanVDrift"] -> Fill(vDriftMean);
00172 (wheelHistos[wheel])["SigmaVDrift"] -> Fill(vDriftSigma);
00173
00174 }
00175
00176
00177 if( T0ME->getEntries() != 0 ) {
00178
00179 allwheelHistos["allMeanT0"] -> Fill(t0Mean);
00180 allwheelHistos["allSigmaT0"] -> Fill(t0Sigma);
00181
00182 (wheelHistos[wheel])["MeanT0"] -> Fill(t0Mean);
00183 (wheelHistos[wheel])["SigmaT0"] -> Fill(t0Sigma);
00184
00185 }
00186
00187
00188 DTChamberId indexCh(wheel,stat,sec);
00189
00190 float vDriftDev(0.), errvDriftDev(0.);
00191 percDevVDrift(indexCh, vDriftMean, vDriftSigma, vDriftDev, errvDriftDev);
00192
00193 int sec_ = sec;
00194 if( sec == 13 || sec == 14 ) sec_ = ( sec == 13 ) ? 4 : 10;
00195
00196 float fillvDriftDev = max(min(vDriftDev,maxRangeVDrift),minRangeVDrift);
00197 float fillT0Mean = max(min(t0Mean,maxRangeT0),minRangeT0);
00198
00199 float vDriftDevQ = varQuality(fabs(vDriftDev),maxGoodVDriftDev,minBadVDriftDev);
00200 float t0MeanQ = varQuality(fabs(t0Mean),maxGoodT0,minBadT0);
00201
00202 float vDriftSigmQ = varQuality(vDriftSigma,maxGoodVDriftSigma,minBadVDriftSigma);
00203 float t0SigmQ = varQuality(t0Sigma,maxGoodT0Sigma,minBadT0Sigma);
00204
00205 if( sec == 13 || sec == 14 ) {
00206
00207 float binVDriftDev = (wheelHistos[wheel])["MeanVDriftSummary"]->getBinContent(sec_,stat);
00208 binVDriftDev = (fabs(binVDriftDev) > fabs(fillvDriftDev)) ? binVDriftDev : fillvDriftDev;
00209 (wheelHistos[wheel])["MeanVDriftSummary"] -> setBinContent(sec_,stat,binVDriftDev);
00210
00211 float binT0MeanVal = (wheelHistos[wheel])["MeanT0Summary"] -> getBinContent(sec_,stat);
00212 binT0MeanVal = (fabs(binT0MeanVal) > fabs(fillT0Mean)) ? binT0MeanVal : fillT0Mean;
00213 (wheelHistos[wheel])["MeanT0Summary"] -> setBinContent(sec_,stat,binT0MeanVal);
00214
00215 float binVDriftSigmVal = (wheelHistos[wheel])["SigmaVDriftSummary"] -> getBinContent(sec_,stat);
00216 binVDriftSigmVal = (binVDriftSigmVal > 0. && binVDriftSigmVal < vDriftSigmQ) ? binVDriftSigmVal : vDriftSigmQ;
00217 (wheelHistos[wheel])["SigmaVDriftSummary"] -> setBinContent(sec_,stat,binVDriftSigmVal);
00218
00219 float binT0SigmVal = (wheelHistos[wheel])["SigmaT0Summary"] -> getBinContent(sec_,stat);
00220 binT0SigmVal = (binT0SigmVal > 0. && binT0SigmVal < t0SigmQ) ? binT0SigmVal : t0SigmQ;
00221 (wheelHistos[wheel])["SigmaT0Summary"] -> setBinContent(sec_,stat,binT0SigmVal);
00222
00223 } else {
00224
00225 (wheelHistos[wheel])["MeanVDriftSummary"] -> setBinContent(sec_,stat,fillvDriftDev);
00226 (wheelHistos[wheel])["MeanT0Summary"] -> setBinContent(sec_,stat,fillT0Mean);
00227 (wheelHistos[wheel])["SigmaVDriftSummary"] -> setBinContent(sec_,stat,vDriftSigmQ);
00228 (wheelHistos[wheel])["SigmaT0Summary"] -> setBinContent(sec_,stat,t0SigmQ);
00229
00230 }
00231
00232 double weight = 1/4.;
00233 if(( sec_ == 4 || sec_ == 10) && stat == 4) weight = 1/8.;
00234
00235 if( vDriftDevQ > 0.85 && vDriftSigmQ > 0.85 ) {
00236 glbVDriftSummary -> Fill(sec_,wheel,weight);
00237 summaryHistos["MeanVDriftGlbSummary"] -> Fill(sec_,wheel,weight);
00238 summaryHistos["SigmaVDriftGlbSummary"] -> Fill(sec_,wheel,weight);
00239
00240 } else {
00241 if( vDriftDevQ > 0.85 && vDriftSigmQ < 0.85 ) {
00242 summaryHistos["MeanVDriftGlbSummary"] -> Fill(sec_,wheel,weight);
00243 }
00244 if( vDriftDevQ < 0.85 && vDriftSigmQ > 0.85 ) {
00245 summaryHistos["SigmaVDriftGlbSummary"] -> Fill(sec_,wheel,weight);
00246 }
00247 }
00248
00249 if( t0MeanQ > 0.85 && t0SigmQ > 0.85 ) {
00250 glbT0Summary -> Fill(sec_,wheel,weight);
00251 summaryHistos["MeanT0GlbSummary"] -> Fill(sec_,wheel,weight);
00252 summaryHistos["SigmaT0GlbSummary"] -> Fill(sec_,wheel,weight);
00253 } else {
00254 if( t0MeanQ > 0.85 && t0SigmQ < 0.85 ) {
00255 summaryHistos["MeanT0GlbSummary"] -> Fill(sec_,wheel,weight);
00256
00257 }
00258 if( t0MeanQ < 0.85 && t0SigmQ > 0.85 ) {
00259 summaryHistos["SigmaT0GlbSummary"] -> Fill(sec_,wheel,weight);
00260 }
00261 }
00262
00263
00264 }
00265 }
00266 }
00267
00268 return;
00269 }
00270
00271 void DTRunConditionVarClient::endJob()
00272 {
00273 LogVerbatim ("DTDQM|DTMonitorClient|DTRunConditionVarClient")
00274 << "DTRunConditionVarClient: endJob";
00275 return;
00276 }
00277
00278 float DTRunConditionVarClient::varQuality(float var, float maxGood, float minBad) {
00279
00280 float qual(0);
00281 if( var <= maxGood ) {qual = 1.;}
00282 else if( var > maxGood && var < minBad ) {qual = 0.9;}
00283 else if( var >= minBad ) {qual = 0.1;}
00284
00285 return qual;
00286 }
00287
00288 void DTRunConditionVarClient::percDevVDrift(DTChamberId indexCh, float meanVD, float sigmaVD, float& devVD, float& errdevVD) {
00289
00290 DTSuperLayerId indexSLPhi1(indexCh,1);
00291 DTSuperLayerId indexSLPhi2(indexCh,3);
00292
00293 float vDriftPhi1(0.), vDriftPhi2(0.);
00294 float ResPhi1(0.), ResPhi2(0.);
00295 int status1 = mTimeMap_->get(indexSLPhi1,vDriftPhi1,ResPhi1,DTVelocityUnits::cm_per_ns);
00296 int status2 = mTimeMap_->get(indexSLPhi2,vDriftPhi2,ResPhi2,DTVelocityUnits::cm_per_ns);
00297
00298 if(status1 != 0 || status2 != 0) {
00299 DTSuperLayerId sl = (status1 != 0) ? indexSLPhi1 : indexSLPhi2;
00300 throw cms::Exception("DTRunConditionVarClient") << "Could not find vDrift entry in DB for"
00301 << sl << endl;
00302 }
00303
00304 float vDriftMed = (vDriftPhi1 + vDriftPhi2) / 2.;
00305
00306 devVD = (meanVD - vDriftMed) / vDriftMed;
00307 devVD = devVD < 1. ? devVD : 1.;
00308
00309 errdevVD = sigmaVD/vDriftMed;
00310
00311 return;
00312 }
00313
00314 void DTRunConditionVarClient::bookWheelHistos(string histoType, string subfolder, int wh, int nbins, float min, float max, bool isVDCorr )
00315 {
00316 stringstream wheel; wheel << wh;
00317
00318 string folder = "DT/02-Segments/" + subfolder;
00319
00320 theDbe->setCurrentFolder(folder);
00321
00322 string histoName = histoType + "_W" + wheel.str();
00323 string histoLabel = histoType;
00324
00325 (wheelHistos[wh])[histoType] = theDbe -> book1D(histoName, histoLabel, nbins, min, max);
00326
00327
00328 if( isVDCorr ) {
00329 histoLabel = "Summary of corrections to VDrift DB values";
00330 histoName = "CorrTo" + histoType + "Summary_W" + wheel.str();
00331 } else {
00332 histoLabel = histoType + "Summary";
00333 histoName = histoType + "Summary_W" + wheel.str();
00334 }
00335
00336 MonitorElement* me = theDbe -> book2D(histoName, histoLabel,12,1,13,4,1,5);
00337
00338 me->setBinLabel(1,"MB1",2);
00339 me->setBinLabel(2,"MB2",2);
00340 me->setBinLabel(3,"MB3",2);
00341 me->setBinLabel(4,"MB4",2);
00342 me->setAxisTitle("Sector",1);
00343
00344 (wheelHistos[wh])[histoType + "Summary"] = me;
00345
00346 return;
00347 }
00348
00349 MonitorElement* DTRunConditionVarClient::getChamberHistos(const DTChamberId& dtCh, string histoType) {
00350
00351 int wh = dtCh.wheel();
00352 int sc = dtCh.sector();
00353 int st = dtCh.station();
00354 stringstream wheel; wheel << wh;
00355 stringstream station; station << st;
00356 stringstream sector; sector << sc;
00357
00358 string folder = "DT/02-Segments/Wheel" + wheel.str() + "/Sector" + sector.str() + "/Station" + station.str();
00359 string histoTag = "_W" + wheel.str() + "_Sec" + sector.str() + "_St" + station.str();
00360 string MEpath = folder + "/" + histoType + histoTag;
00361
00362 theDbe->setCurrentFolder(folder);
00363
00364 LogTrace ("DTDQM|DTMonitorModule|DTRunConditionVar")
00365 << "[DTRunConditionVar]: getting ME from " << folder << endl;
00366
00367 MonitorElement* ME = theDbe -> get(MEpath);
00368
00369 return ME;
00370 }