CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DTDCSByLumiSummary.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * \author C. Battilana - CIEMAT
5  * \author P. Bellan - INFN PD
6  * \author A. Branca = INFN PD
7  */
8 
9 
12 
17 
20 
21 #include<string>
22 
23 
24 using namespace std;
25 using namespace edm;
26 
27 
29 
30 
32 
33 
35 
36  theDQMStore = Service<DQMStore>().operator->();
37 
38  // book the ME
39  theDQMStore->setCurrentFolder("DT/EventInfo/DCSContents");
40 
41  totalDCSFraction = theDQMStore->bookFloat("DTDCSSummary");
42  totalDCSFraction->setLumiFlag(); // set LumiFlag to DCS content value (save it by lumi)
43 
44  globalHVSummary = theDQMStore->book2D("HVGlbSummary","HV Status Summary",1,1,13,5,-2,3);
45  globalHVSummary->setAxisTitle("Sectors",1);
46  globalHVSummary->setAxisTitle("Wheel",2);
47 
48  for(int wh=-2;wh<=2;wh++){
49 
50  stringstream wheel_str; wheel_str << wh;
51 
52  MonitorElement* FractionWh = theDQMStore->bookFloat("DT_Wheel"+wheel_str.str());
53  FractionWh->setLumiFlag(); // set LumiFlag to DCS content value (save it by lumi)
54 
55  totalDCSFractionWh.push_back(FractionWh);
56  }
57 
58  globalHVSummary->Reset();
59 
60 }
61 
62 
64 
65  // CB LumiFlag marked products are reset on LS boundaries
66  totalDCSFraction->Reset();
67 
68  for(int wh=-2;wh<=2;wh++){
69  totalDCSFractionWh[wh+2]->Reset();
70  }
71 
72 }
73 
74 
76 
77  // Get the by lumi product plot from the task
78  int lumiNumber = lumi.id().luminosityBlock();
79 
80  bool null_pointer_histo(0);
81 
82  std::vector<float> wh_activeFrac;
83 
84  for(int wh=-2;wh<=2;wh++){
85 
86  stringstream wheel_str; wheel_str << wh;
87 
88  string hActiveUnitsPath = "DT/EventInfo/DCSContents/hActiveUnits"+wheel_str.str();
89  MonitorElement *hActiveUnits = theDQMStore->get(hActiveUnitsPath);
90 
91  if (hActiveUnits) {
92  float activeFrac = static_cast<float>(hActiveUnits->getBinContent(2)) / // CB 2nd bin is # of active channels
93  hActiveUnits->getBinContent(1); // first bin is overall number of channels
94 
95  if(activeFrac < 0.) activeFrac=-1;
96 
97  wh_activeFrac.push_back(activeFrac);
98 
99  // Fill by lumi Certification ME
100  totalDCSFraction->Fill(activeFrac);
101  totalDCSFractionWh[wh+2]->Fill(activeFrac);
102 
103  } else {
104  LogTrace("DTDQM|DTMonitorClient|DTDCSByLumiSummary")
105  << "[DTDCSByLumiSummary]: got null pointer retrieving histo at :"
106  << hActiveUnitsPath << " for lumi # " << lumiNumber
107  << "client operation not performed." << endl;
108 
109  null_pointer_histo=true;
110  }
111 
112  } // end loop on wheels
113 
114  if(!null_pointer_histo) dcsFracPerLumi[lumiNumber] = wh_activeFrac; // Fill map to be used to compute trend plots
115 
116 }
117 
118 
120 
121 
122  // Book trend plots ME & loop on map to fill it with by lumi info
123  map<int,std::vector<float> >::const_iterator fracPerLumiIt = dcsFracPerLumi.begin();
124  map<int,std::vector<float> >::const_iterator fracPerLumiEnd = dcsFracPerLumi.end();
125 
126  int fLumi = dcsFracPerLumi.begin()->first;
127  int lLumi = dcsFracPerLumi.rbegin()->first;
128  theDQMStore->setCurrentFolder("DT/EventInfo/DCSContents");
129 
130  int nLumis = lLumi-fLumi + 1.;
131 
132  // trend plots
133  for(int wh=-2; wh<=2; wh++) {
134 
135  stringstream wheel_str; wheel_str << wh;
136 
137  DTTimeEvolutionHisto* trend;
138 
139  trend = new DTTimeEvolutionHisto(theDQMStore, "hDCSFracTrendWh" + wheel_str.str(), "Fraction of DT-HV ON Wh" + wheel_str.str(),
140  nLumis, fLumi, 1, false, 2);
141 
142  hDCSFracTrend.push_back(trend);
143 
144  }
145 
146  float goodLSperWh[5] = {0,0,0,0,0};
147  float badLSperWh[5] = {0,0,0,0,0};
148 
149  // fill trend plots and save infos for summaryPlot
150  for(;fracPerLumiIt!=fracPerLumiEnd;++fracPerLumiIt) {
151 
152  for(int wh=-2; wh<=2; wh++) {
153 
154  std::vector<float> activeFracPerWh;
155  activeFracPerWh = fracPerLumiIt->second;
156 
157  hDCSFracTrend[wh+2]->setTimeSlotValue(activeFracPerWh[wh+2],fracPerLumiIt->first);
158 
159  if( activeFracPerWh[wh+2] > 0 ) { // we do not count the lumi were the DTs are off (no real problem),
160  // even if this can happen in the middle of a run (real problem: to be fixed)
161  if( activeFracPerWh[wh+2] > 0.9 ) goodLSperWh[wh+2]++;
162  else {
163  badLSperWh[wh+2]++;
164  }
165  } else { // there is no HV value OR all channels OFF
166  if( activeFracPerWh[wh+2] < 0 ) badLSperWh[wh+2]=-1; // if there were no HV values, activeFrac returning -1
167  }
168 
169  }
170 
171  }
172 
173  // fill summaryPlot
174  for(int wh=-2; wh<=2; wh++) {
175 
176  if( goodLSperWh[wh+2] != 0 || badLSperWh[wh+2] == -1 ) {
177 
178  float r = badLSperWh[wh+2]/fabs(goodLSperWh[wh+2] + badLSperWh[wh+2]);
179  if( r > 0.5 ) globalHVSummary->Fill(1,wh,0);
180  else globalHVSummary->Fill(1,wh,1);
181  if( r == -1 ) globalHVSummary->Fill(1,wh,-1);
182 
183  } else {
184 
185  globalHVSummary->Fill(1,wh,0);
186 
187  }
188 
189  }
190 
191 }
192 
193 
195 
196 }
197 
198 
200 
201 }
202 
LuminosityBlockID id() const
virtual void endRun(const edm::Run &run, const edm::EventSetup &setup)
tuple lumi
Definition: fjr2json.py:35
void setTimeSlotValue(float value, int timeSlot)
virtual void beginLuminosityBlock(const edm::LuminosityBlock &lumi, const edm::EventSetup &setup)
virtual void beginJob()
DTDCSByLumiSummary(const edm::ParameterSet &pset)
Constructor.
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
#define LogTrace(id)
virtual void endLuminosityBlock(const edm::LuminosityBlock &lumi, const edm::EventSetup &setup)
virtual void analyze(const edm::Event &event, const edm::EventSetup &setup)
LuminosityBlockNumber_t luminosityBlock() const
virtual ~DTDCSByLumiSummary()
Destructor.
double getBinContent(int binx) const
get content of bin (1-D)
void setLumiFlag(void)
this ME is meant to be stored for each luminosity section
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
Definition: Run.h:41