00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "DQM/DTMonitorModule/interface/DTTimeEvolutionHisto.h"
00011
00012 #include "DQMServices/Core/interface/DQMStore.h"
00013 #include "DQMServices/Core/interface/MonitorElement.h"
00014 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00015
00016 using namespace std;
00017 using namespace edm;
00018
00019
00020 DTTimeEvolutionHisto::DTTimeEvolutionHisto(DQMStore *dbe, const string& name,
00021 const string& title,
00022 int nbins,
00023 int lsPrescale,
00024 bool sliding,
00025 int mode) : valueLastTimeSlot(0),
00026 theFirstLS(1),
00027 theLSPrescale(lsPrescale),
00028 doSlide(sliding),
00029 theMode(mode) {
00030
00031 DTTimeEvolutionHisto(dbe, name, title, nbins, theFirstLS, lsPrescale, sliding, mode);
00032 histo = dbe->get(dbe->pwd() + "/" + name);
00033 nBookedBins = histo->getNbinsX();
00034 }
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 DTTimeEvolutionHisto::DTTimeEvolutionHisto(DQMStore *dbe, const string& name,
00083 const string& title,
00084 int nbins,
00085 int firstLS,
00086 int lsPrescale,
00087 bool sliding,
00088 int mode) : valueLastTimeSlot(0),
00089 theFirstLS(firstLS),
00090 theLSPrescale(lsPrescale),
00091 doSlide(sliding),
00092 theMode(mode) {
00093
00094 nBookedBins = nbins;
00095 if(sliding) nBookedBins++;
00096 if(!sliding && theMode == 0)
00097 LogWarning("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
00098 << "[DTTimeEvolutionHisto]***Error: wrong configuration" << endl;
00099
00100
00101 stringstream realTitle; realTitle << title << "/" << theLSPrescale << " LS";
00102
00103
00104 histo = dbe->book1D(name, realTitle.str(), nBookedBins, (float)theFirstLS, nBookedBins+1.);
00105
00106
00107 if(sliding) {
00108 histo->setBinLabel(1,"avg. previous",1);
00109 } else {
00110
00111 for(int bin =1; bin != nBookedBins+1; ++bin) {
00112 stringstream label;
00113 if(theLSPrescale > 1) {
00114 label << "LS " << ((bin-1)*theLSPrescale)+theFirstLS << "-" << bin*theLSPrescale+theFirstLS;
00115 } else {
00116 label << "LS " << ((bin-1)*theLSPrescale)+theFirstLS;
00117 }
00118 histo->setBinLabel(bin, label.str(),1);
00119
00120 }
00121
00122 }
00123
00124 }
00125
00126
00127
00128 DTTimeEvolutionHisto::DTTimeEvolutionHisto(DQMStore *dbe, const string& name) : valueLastTimeSlot(0),
00129 theFirstLS(1),
00130 theLSPrescale(-1),
00131 doSlide(false),
00132 theMode(0) {
00133 LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
00134 << "[DTTimeEvolutionHisto] Retrieve ME with name: " << name << endl;
00135 histo = dbe->get(name);
00136 }
00137
00138
00139 DTTimeEvolutionHisto::~DTTimeEvolutionHisto(){}
00140
00141
00142
00143 void DTTimeEvolutionHisto::setTimeSlotValue(float value, int timeSlot) {
00144
00145
00146 if(!doSlide) {
00147
00148
00149 histo->Fill(timeSlot,value);
00150 } else {
00151 for(int bin = 1; bin != nBookedBins; ++bin) {
00152 float value = histo->getBinContent(bin);
00153
00154
00155 if(bin == 1) {
00156 histo->setBinContent(bin, (value + histo->getBinContent(bin+1))/2.);
00157 } else if(bin != nBookedBins) {
00158 histo->setBinContent(bin, histo->getBinContent(bin+1));
00159 histo->setBinError(bin, histo->getBinError(bin+1));
00160 histo->setBinLabel(bin, histo->getTH1F()->GetXaxis()->GetBinLabel(bin+1),1);
00161 }
00162 }
00163 histo->setBinContent(nBookedBins, value);
00164 }
00165 }
00166
00167
00168 void DTTimeEvolutionHisto::accumulateValueTimeSlot(float value) {
00169 valueLastTimeSlot += value;
00170 }
00171
00172
00173
00174 void DTTimeEvolutionHisto::updateTimeSlot(int ls, int nEventsInLS) {
00175
00176 if(doSlide) {
00177
00178 if (nEventsInLastTimeSlot.find(ls) != nEventsInLastTimeSlot.end()) {
00179 nEventsInLastTimeSlot[ls] += nEventsInLS;
00180 nLumiTrInLastTimeSlot[ls]++;
00181 } else {
00182 nEventsInLastTimeSlot[ls] = nEventsInLS;
00183 nLumiTrInLastTimeSlot[ls] = 1;
00184 }
00185
00186
00187 if(nEventsInLastTimeSlot.size() > 0 && nEventsInLastTimeSlot.size()%theLSPrescale==0) {
00188 int firstLSinTimeSlot = nEventsInLastTimeSlot.begin()->first;
00189 int lastLSinTimeSlot = nEventsInLastTimeSlot.rbegin()->first;
00190
00191 map<int,int>::const_iterator nEventsIt = nEventsInLastTimeSlot.begin();
00192 map<int,int>::const_iterator nEventsEnd = nEventsInLastTimeSlot.end();
00193
00194 int nEvents = 0;
00195 for (;nEventsIt!=nEventsEnd;++nEventsIt)
00196 nEvents+=nEventsIt->second;
00197
00198 LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
00199 << "[DTTimeEvolutionHisto] Update time-slot, # entries: " << valueLastTimeSlot
00200 << " # events: " << nEvents << endl;
00201
00202
00203 float value = 0;
00204 if(theMode == 0) {
00205 if(nEvents != 0) value = valueLastTimeSlot/(float)nEvents;
00206 } else if(theMode == 1) {
00207 value = valueLastTimeSlot;
00208 } else if(theMode == 2) {
00209 value = nEvents;
00210 } else if(theMode == 3) {
00211 map<int,int>::const_iterator nLumiTrIt = nLumiTrInLastTimeSlot.begin();
00212 map<int,int>::const_iterator nLumiTrEnd = nLumiTrInLastTimeSlot.end();
00213
00214 float nLumiTr = 0.;
00215 for (;nLumiTrIt!=nLumiTrEnd;++nLumiTrIt)
00216 nLumiTr+=nLumiTrIt->second;
00217
00218 value = valueLastTimeSlot/nLumiTr;
00219 }
00220 setTimeSlotValue(value, nBookedBins);
00221 LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
00222 << " updated value: " << histo->getBinContent(nBookedBins) << endl;
00223
00224
00225 stringstream binLabel;
00226 binLabel << "LS " << firstLSinTimeSlot;
00227 if(nEventsInLastTimeSlot.size() > 1)
00228 binLabel << "-" << lastLSinTimeSlot;
00229
00230 histo->setBinLabel(nBookedBins,binLabel.str(),1);
00231
00232
00233 nEventsInLastTimeSlot.clear();
00234 nLumiTrInLastTimeSlot.clear();
00235 valueLastTimeSlot = 0;
00236 }
00237
00238
00239 } else {
00240 int binN = (int)ls-(theFirstLS-1)/(int)theLSPrescale;
00241
00242 float value = 0;
00243 if(theMode == 1) {
00244 value = valueLastTimeSlot;
00245 } else if(theMode == 2) {
00246 value = nEventsInLS;
00247 } else if(theMode == 3) {
00248 value = valueLastTimeSlot/theLSPrescale;
00249 }
00250 LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
00251 << "[DTTimeEvolutionHisto] Update time-slot: "<< binN << " with value: " << value << endl;
00252 setTimeSlotValue(value,binN);
00253 }
00254 }
00255
00256
00257
00258
00259 void DTTimeEvolutionHisto::normalizeTo(const MonitorElement *histForNorm) {
00260 if(histo == 0) {
00261 LogWarning("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
00262 << "[DTTimeEvolutionHisto]***Error: pointer to ME is NULL" << endl;
00263 return;
00264 }
00265 int nBins = histo->getNbinsX();
00266 if(histForNorm->getNbinsX() != nBins) {
00267 LogWarning("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
00268 << "[DTTimeEvolutionHisto]***Error: normalizing histos with != # of bins" << endl;
00269 return;
00270 }
00271 for(int bin = 1; bin <= nBins; ++bin) {
00272 if(histForNorm->getBinContent(bin) != 0) {
00273 double normValue = histo->getBinContent(bin)/histForNorm->getBinContent(bin);
00274 LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
00275 << "[DTTimeEvolutionHisto] Normalizing bin: " << bin << " to: " << histo->getBinContent(bin) << " / " << histForNorm->getBinContent(bin)
00276 << " = " << normValue << endl;
00277 histo->setBinContent(bin, normValue);
00278 } else {
00279 histo->setBinContent(bin, 0);
00280 }
00281 }
00282 }