Belle II Software  release-05-02-19
DQMHistAnalysisSVDGeneral.cc
1 //+
2 // File : DQMHistAnalysisSVDGeneral.cc
3 // Description :
4 //
5 // Author : Giulia Casarosa (PI), Gaetano De Marino (PI), Luigi Corona (PI)
6 // Date : 20181127
7 //-
8 
9 
10 #include <dqm/analysis/modules/DQMHistAnalysisSVDGeneral.h>
11 #include <vxd/geometry/GeoCache.h>
12 
13 #include <TROOT.h>
14 #include <TStyle.h>
15 #include <TString.h>
16 #include <TAxis.h>
17 
18 #include <TMath.h>
19 #include <iostream>
20 
21 using namespace std;
22 using namespace Belle2;
23 
24 //-----------------------------------------------------------------
25 // Register the Module
26 //-----------------------------------------------------------------
27 REG_MODULE(DQMHistAnalysisSVDGeneral)
28 
29 //-----------------------------------------------------------------
30 // Implementation
31 //-----------------------------------------------------------------
32 
35 {
36  //Parameter definition
37  B2INFO("DQMHistAnalysisSVDGeneral: Constructor done.");
38 
39  addParam("RefHistoFile", m_refFileName, "Reference histrogram file name", std::string("SVDrefHisto.root"));
40  addParam("unpackerErrorLevel", m_unpackError, "Maximum bin_content/ # events allowed before throwing ERROR", double(0.00001));
41  addParam("occLevel_Error", m_occError, "Maximum Occupancy (%) allowed for safe operations (red)", float(5));
42  addParam("occLevel_Warning", m_occWarning, "Occupancy (%) at WARNING level (orange)", float(3));
43  addParam("occLevel_Empty", m_occEmpty, "Maximum Occupancy (%) for which the sensor is considered empty", float(0));
44  addParam("onlineOccLevel_Error", m_onlineOccError, "Maximum OnlineOccupancy (%) allowed for safe operations (red)", float(10));
45  addParam("onlineOccLevel_Warning", m_onlineOccWarning, "OnlineOccupancy (%) at WARNING level (orange)", float(5));
46  addParam("onlineOccLevel_Empty", m_onlineOccEmpty, "Maximum OnlineOccupancy (%) for which the sensor is considered empty",
47  float(0));
48  addParam("printCanvas", m_printCanvas, "if True prints pdf of the analysis canvas", bool(false));
49  addParam("statThreshold", m_statThreshold, "Minimal number of events to compare histograms", int(10000));
50  addParam("timeThreshold", m_timeThreshold, "Acceptable difference between mean of central peak for present and reference run",
51  float(4)); // 4 ns
52  addParam("refMCTP", m_refMeanP, "Mean of the signal time peak from Physics reference run", float(-1.226)); // e14r826
53  addParam("refMCTC", m_refMeanC, "Mean of the signal time peak from Cosmic reference run", float(4.938)); // e14r1182
54 }
55 
56 DQMHistAnalysisSVDGeneralModule::~DQMHistAnalysisSVDGeneralModule() { }
57 
58 void DQMHistAnalysisSVDGeneralModule::initialize()
59 {
60  B2INFO("DQMHistAnalysisSVDGeneral: initialized.");
61  B2DEBUG(10, " black = " << kBlack);
62  B2DEBUG(10, " green = " << kGreen);
63  B2DEBUG(10, " orange = " << kOrange);
64  B2DEBUG(10, " Red = " << kRed);
65 
66  m_refFile = NULL;
67  if (m_refFileName != "") {
68  m_refFile = new TFile(m_refFileName.data(), "READ");
69  }
70 
71  //search for reference
72  if (m_refFile && m_refFile->IsOpen()) {
73  B2INFO("SVD DQMHistAnalysis: reference root file (" << m_refFileName << ") FOUND, reading ref histograms");
74 
75  TH1F* ref_occ = (TH1F*)m_refFile->Get("refOccupancy");
76  if (!ref_occ)
77  B2WARNING("SVD DQMHistAnalysis: Occupancy Level Refence not found! using module parameters");
78  else {
79  m_occEmpty = ref_occ->GetBinContent(1);
80  m_occWarning = ref_occ->GetBinContent(2);
81  m_occError = ref_occ->GetBinContent(3);
82  }
83 
84  TH1F* ref_onlineOcc = (TH1F*)m_refFile->Get("refOnlineOccupancy");
85  if (!ref_onlineOcc)
86  B2WARNING("SVD DQMHistAnalysis: OnlineOccupancy Level Refence not found! using module parameters");
87  else {
88  m_onlineOccEmpty = ref_onlineOcc->GetBinContent(1);
89  m_onlineOccWarning = ref_onlineOcc->GetBinContent(2);
90  m_onlineOccError = ref_onlineOcc->GetBinContent(3);
91  }
92  } else
93  B2WARNING("SVD DQMHistAnalysis: reference root file (" << m_refFileName << ") not found, or closed, using module parameters");
94 
95  B2INFO(" SVD occupancy thresholds:");
96  B2INFO("ONLINE OCCUPANCY: empty < " << m_onlineOccEmpty << " normal < " << m_onlineOccWarning << "warning < " << m_onlineOccError <<
97  " < error");
98  B2INFO("OFFLINE OCCUPANCY: empty < " << m_occEmpty << " normal < " << m_occWarning << "warning < " << m_occError << " < error");
99 
100  m_legError = new TPaveText(-1, 54, 3, 57.5);
101  m_legError->AddText("ERROR!!");
102  m_legError->SetFillColor(kRed);
103  m_legError->SetTextColor(kWhite);
104 
105  const VXD::GeoCache& geo = VXD::GeoCache::getInstance();
106 
107  //collect the list of all SVD Modules in the geometry here
108  std::vector<VxdID> sensors = geo.getListOfSensors();
109  for (VxdID& aVxdID : sensors) {
110  VXD::SensorInfoBase info = geo.getSensorInfo(aVxdID);
111  // B2INFO("VXD " << aVxdID);
112  if (info.getType() != VXD::SensorInfoBase::SVD) continue;
113  m_SVDModules.push_back(aVxdID); // reorder, sort would be better
114  }
115  std::sort(m_SVDModules.begin(), m_SVDModules.end()); // back to natural order
116 
117  //occupancy chart chip
118  m_cOccupancyChartChip = new TCanvas("SVDOccupancy/c_OccupancyChartChip");
119 
120  //strip occupancy per sensor
121  m_cStripOccupancyU = new TCanvas*[nSensors];
122  m_cStripOccupancyV = new TCanvas*[nSensors];
123  for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
124  int tmp_layer = m_SVDModules[i].getLayerNumber();
125  int tmp_ladder = m_SVDModules[i].getLadderNumber();
126  int tmp_sensor = m_SVDModules[i].getSensorNumber();
127  m_cStripOccupancyU[i] = new TCanvas(Form("SVDOccupancy/c_StripOccupancyU_%d_%d_%d", tmp_layer, tmp_ladder, tmp_sensor));
128  m_cStripOccupancyV[i] = new TCanvas(Form("SVDOccupancy/c_StripOccupancyV_%d_%d_%d", tmp_layer, tmp_ladder, tmp_sensor));
129  }
130 
131 
132  //OFFLINE occupancy plots legend
133  m_legProblem = new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
134  m_legProblem->AddText("ERROR!");
135  m_legProblem->AddText("at least one sensor with:");
136  m_legProblem->AddText(Form("occupancy > %1.1f%%", m_occError));
137  m_legProblem->SetFillColor(kRed);
138  m_legWarning = new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
139  m_legWarning->AddText("WARNING!");
140  m_legWarning->AddText("at least one sensor with:");
141  m_legWarning->AddText(Form("%1.1f%% < occupancy < %1.1f%%", m_occWarning, m_occError));
142  m_legWarning->SetFillColor(kOrange);
143  m_legNormal = new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
144  m_legNormal->AddText("OCCUPANCY WITHIN LIMITS");
145  m_legNormal->AddText(Form("%1.1f%% < occupancy < %1.1f%%", m_occEmpty, m_occWarning));
146  m_legNormal->SetFillColor(kGreen);
147  m_legNormal->SetBorderSize(0.);
148  m_legNormal->SetLineColor(kBlack);
149  m_legEmpty = new TPaveText(11, findBinY(4, 3) - 2, 16, findBinY(4, 3));
150  m_legEmpty->AddText("NO DATA RECEIVED");
151  m_legEmpty->AddText("from at least one sensor");
152  m_legEmpty->SetFillColor(kBlack);
153  m_legEmpty->SetTextColor(kWhite);
154  m_legEmpty->SetBorderSize(0.);
155  m_legEmpty->SetLineColor(kBlack);
156 
157  //ONLINE occupancy plots legend
158  m_legOnProblem = new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
159  m_legOnProblem->AddText("ERROR!");
160  m_legOnProblem->AddText("at least one sensor with:");
161  m_legOnProblem->AddText(Form("online occupancy > %1.1f%%", m_onlineOccError));
162  m_legOnProblem->SetFillColor(kRed);
163  m_legOnWarning = new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
164  m_legOnWarning->AddText("WARNING!");
165  m_legOnWarning->AddText("at least one sensor with:");
166  m_legOnWarning->AddText(Form("%1.1f%% < online occupancy < %1.1f%%", m_onlineOccWarning, m_onlineOccError));
167  m_legOnWarning->SetFillColor(kOrange);
168  m_legOnNormal = new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
169  m_legOnNormal->AddText("OCCUPANCY WITHIN LIMITS");
170  m_legOnNormal->AddText(Form("%1.1f%% < online occupancy < %1.1f%%", m_onlineOccEmpty, m_onlineOccWarning));
171  m_legOnNormal->SetFillColor(kGreen);
172  m_legOnNormal->SetBorderSize(0.);
173  m_legOnNormal->SetLineColor(kBlack);
174  m_legOnEmpty = new TPaveText(11, findBinY(4, 3) - 2, 16, findBinY(4, 3));
175  m_legOnEmpty->AddText("NO DATA RECEIVED");
176  m_legOnEmpty->AddText("from at least one sensor");
177  m_legOnEmpty->SetFillColor(kBlack);
178  m_legOnEmpty->SetTextColor(kWhite);
179 
180 
181  //occupancy plot Y axis title
182  m_yTitle = new TText(-0.75, 13, "layer.ladder.sensor");
183  m_yTitle->SetTextAngle(90);
184  m_yTitle->SetTextSize(0.03);
185  m_yTitle->SetTextFont(42);
186 
187  gROOT->cd();
188  m_cUnpacker = new TCanvas("SVDAnalysis/c_SVDDataFormat");
189  m_cUnpacker->SetGrid(1);
190  m_cOccupancyU = new TCanvas("SVDAnalysis/c_SVDOccupancyU");
191  // m_cOccupancyU->SetGrid(1);
192  m_cOccupancyV = new TCanvas("SVDAnalysis/c_SVDOccupancyV");
193  // m_cOccupancyV->SetGrid(1);
194  m_cOnlineOccupancyU = new TCanvas("SVDAnalysis/c_SVDOnlineOccupancyU");
195  // m_cOnlineOccupancyU->SetGrid(1);
196  m_cOnlineOccupancyV = new TCanvas("SVDAnalysis/c_SVDOnlineOccupancyV");
197  // m_cOnlineOccupancyV->SetGrid(1);
198  m_cClusterOnTrackTime_L456V = new TCanvas("SVDAnalysis/c_ClusterOnTrackTime_L456V");
199 
200  const int nY = 19;
201  TString Ylabels[nY] = {"", "L3.x.1", "L3.x.2",
202  "", "L4.x.1", "L4.x.2", "L4.x.3",
203  "", "L5.x.1", "L5.x.2", "L5.x.3", "L5.x.4",
204  "", "L6.x.1", "L6.x.2", "L6.x.3", "L6.x.4", "L6.x.5", ""
205  };
206 
207 
208  m_hOccupancyV = new TH2F("hOccupancyV", "Average OFFLINE Sensor Occupancy (%), V side ", 16, 0.5, 16.5, 19, 0, 19);
209  m_hOccupancyV->SetMarkerSize(1.1);
210  m_hOccupancyV->GetXaxis()->SetTitle("ladder number");
211  m_hOccupancyV->GetXaxis()->SetLabelSize(0.04);
212  for (unsigned short i = 0; i < nY; i++) m_hOccupancyV->GetYaxis()->SetBinLabel(i + 1, Ylabels[i].Data());
213 
214  m_hOccupancyU = new TH2F("hOccupancyU", "Average OFFLINE Sensor Occupancy (%), U side ", 16, 0.5, 16.5, 19, 0, 19);
215  m_hOccupancyU->SetMarkerSize(1.1);
216  m_hOccupancyU->GetXaxis()->SetTitle("ladder number");
217  m_hOccupancyU->GetXaxis()->SetLabelSize(0.04);
218  for (unsigned short i = 0; i < nY; i++) m_hOccupancyU->GetYaxis()->SetBinLabel(i + 1, Ylabels[i].Data());
219 
220  m_hOnlineOccupancyV = new TH2F("hOnlineOccupancyV", "Average ONLINE Sensor Occupancy (%), V side ", 16, 0.5, 16.5, 19, 0, 19);
221  m_hOnlineOccupancyV->SetMarkerSize(1.1);
222  m_hOnlineOccupancyV->GetXaxis()->SetTitle("ladder number");
223  m_hOnlineOccupancyV->GetXaxis()->SetLabelSize(0.04);
224  for (unsigned short i = 0; i < nY; i++) m_hOnlineOccupancyV->GetYaxis()->SetBinLabel(i + 1, Ylabels[i].Data());
225 
226  m_hOnlineOccupancyU = new TH2F("hOnlineOccupancyU", "Average ONLINE Sensor Occupancy (%), U side ", 16, 0.5, 16.5, 19, 0, 19);
227  m_hOnlineOccupancyU->SetMarkerSize(1.1);
228  m_hOnlineOccupancyU->GetXaxis()->SetTitle("ladder number");
229  m_hOnlineOccupancyU->GetXaxis()->SetLabelSize(0.04);
230  for (unsigned short i = 0; i < nY; i++) m_hOnlineOccupancyU->GetYaxis()->SetBinLabel(i + 1, Ylabels[i].Data());
231 
232  rtype = findHist("DQMInfo/rtype");
233  runtype = rtype ? rtype->GetTitle() : "";
234 }
235 
236 
237 void DQMHistAnalysisSVDGeneralModule::beginRun()
238 {
239  B2INFO("DQMHistAnalysisSVDGeneral: beginRun called.");
240  m_cUnpacker->Clear();
241  m_cOccupancyU->Clear();
242  m_cOccupancyV->Clear();
243  m_cOnlineOccupancyU->Clear();
244  m_cOnlineOccupancyV->Clear();
245  m_cOccupancyChartChip->Clear();
246  for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
247  m_cStripOccupancyU[i]->Clear();
248  m_cStripOccupancyV[i]->Clear();
249  }
250  m_cClusterOnTrackTime_L456V->Clear();
251 }
252 
253 void DQMHistAnalysisSVDGeneralModule::event()
254 {
255 
256  //SETUP gSTYLE - all plots
257  // gStyle->SetOptStat(0);
258  // gStyle->SetTitleY(.97);
259 
260  //find nEvents
261  TH1* hnEvnts = findHist("SVDExpReco/SVDDQM_nEvents");
262  if (hnEvnts == NULL) {
263  B2INFO("no events, nothing to do here");
264  return;
265  }
266  TString runID = TString((hnEvnts->GetTitle())).Remove(0, 21);
267  B2INFO("runID = " << runID);
268  Float_t nEvents = hnEvnts->GetEntries();
269 
270  //check DATA FORMAT
271  TH1* h = findHist("SVDUnpacker/DQMUnpackerHisto");
272 
273  //test ERROR:
274  // h->SetBinContent(100,0.01);
275 
276  if (h != NULL) {
277  h->SetTitle("SVD Data Format Monitor " + runID);
278  //check if number of errors is above the allowed limit
279  bool hasError = false;
280  for (int un = 0; un < h->GetNcells(); un++)
281  if (h->GetBinContent(un) / nEvents > m_unpackError)
282  hasError = true;
283  if (! hasError) {
284  m_cUnpacker->SetFillColor(kGreen);
285  m_cUnpacker->SetFrameFillColor(10);
286  } else {
287  m_legError->Draw("same");
288  m_cUnpacker->SetFillColor(kRed);
289  m_cUnpacker->SetFrameFillColor(10);
290  }
291  } else {
292  B2INFO("Histogram SVDUnpacker/DQMUnpackerHisto from SVDUnpackerDQM not found!");
293  m_cUnpacker->SetFillColor(kRed);
294  }
295 
296  m_cUnpacker->cd();
297  h->Draw("colztext");
298  h->SetStats(0);
299 
300  m_cUnpacker->Modified();
301  m_cUnpacker->Update();
302 
303  if (m_printCanvas)
304  m_cUnpacker->Print("c_SVDDataFormat.pdf");
305 
306  //occupancy chart
307  TH1F* hChart = (TH1F*)findHist("SVDExpReco/SVDDQM_StripCountsChip");
308 
309  if (hChart != NULL) {
310  m_hOccupancyChartChip.Clear();
311  hChart->Copy(m_hOccupancyChartChip);
312  m_hOccupancyChartChip.SetName("SVDOccupancyChart");
313  m_hOccupancyChartChip.SetTitle("SVD OFFLINE Occupancy per chip " + runID);
314  m_hOccupancyChartChip.Scale(1 / nEvents / 128);
315  m_cOccupancyChartChip->cd();
316  // m_hOccupancyChartChip->SetStats(0);
317  m_hOccupancyChartChip.Draw();
318  }
319  m_cOccupancyChartChip->Modified();
320  m_cOccupancyChartChip->Update();
321 
322  if (m_printCanvas)
323  m_cOccupancyChartChip->Print("c_OccupancyChartChip.pdf");
324 
325  // cluster time for clusters of track
326  TH1* m_h = findHist("SVDClsTrk/SVDTRK_ClusterTimeV456");
327  if (m_h != NULL) {
328  m_hClusterOnTrackTime_L456V.Clear();
329  m_h->Copy(m_hClusterOnTrackTime_L456V);
330  m_hClusterOnTrackTime_L456V.GetXaxis()->SetRange(110, 190); // [-40 ns,40 ns]
331  Float_t mean_PeakInCenter = m_hClusterOnTrackTime_L456V.GetMean(); //
332  m_hClusterOnTrackTime_L456V.GetXaxis()->SetRange(); // back to [-150 ns,150 ns]
333  m_hClusterOnTrackTime_L456V.SetTitle("ClusterOnTrack Time L456V " + runID);
334  bool hasError = false;
335  if (nEvents > m_statThreshold) {
336  if (runtype == "physics") {
337  Float_t difference_physics = fabs(mean_PeakInCenter - m_refMeanP);
338  if (difference_physics > m_timeThreshold) {
339  hasError = true;
340  }
341  } else if (runtype == "cosmic") {
342  Float_t difference_cosmic = fabs(mean_PeakInCenter - m_refMeanC);
343  if (difference_cosmic > m_timeThreshold) {
344  hasError = true;
345  }
346  } else {
347  B2WARNING("Run type:" << runtype);
348  }
349  } else {
350  m_cClusterOnTrackTime_L456V->SetFillColor(kGray);
351  m_cClusterOnTrackTime_L456V->SetFrameFillColor(10);
352  }
353  if (! hasError) {
354  m_cClusterOnTrackTime_L456V->SetFillColor(kGreen);
355  m_cClusterOnTrackTime_L456V->SetFrameFillColor(10);
356  } else {
357  m_legError->Draw("same");
358  m_cClusterOnTrackTime_L456V->SetFillColor(kRed);
359  m_cClusterOnTrackTime_L456V->SetFrameFillColor(10);
360  }
361  } else {
362  B2INFO("Histogram SVDClsTrk/c_SVDTRK_ClusterTimeV456 from SVDDQMClustersOnTrack module not found!");
363  m_cClusterOnTrackTime_L456V->SetFillColor(kRed);
364  }
365 
366  m_cClusterOnTrackTime_L456V->cd();
367  m_hClusterOnTrackTime_L456V.Draw();
368 
369  m_cClusterOnTrackTime_L456V->Modified();
370  m_cClusterOnTrackTime_L456V->Update();
371 
372  if (m_printCanvas)
373  m_cClusterOnTrackTime_L456V->Print("c_SVDClusterOnTrackTime_L456V.pdf");
374 
375  //check MODULE OCCUPANCY online & offline
376 
377  //reset canvas color
378  m_occUstatus = 0;
379  m_occVstatus = 0;
380  m_onlineOccUstatus = 0;
381  m_onlineOccVstatus = 0;
382 
383  //update titles with exp and run number
384  m_hOccupancyU->SetTitle("Average OFFLINE Sensor Occupancy (%), U side " + runID);
385  m_hOccupancyU->SetStats(0);
386  m_hOccupancyV->SetTitle("Average OFFLINE Sensor Occupancy (%), V side " + runID);
387  m_hOccupancyV->SetStats(0);
388 
389  m_hOnlineOccupancyU->SetTitle("Average ONLINE Sensor Occupancy (%), U side " + runID);
390  m_hOnlineOccupancyU->SetStats(0);
391  m_hOnlineOccupancyV->SetTitle("Average ONLINE Sensor Occupancy (%), V side " + runID);
392  m_hOnlineOccupancyV->SetStats(0);
393 
394 
395  //set dedicate gStyle
396  const Int_t colNum = 4;
397  Int_t palette[colNum] {kBlack, kGreen, kOrange, kRed};
398  gStyle->SetPalette(colNum, palette);
399  gStyle->SetOptStat(0);
400  gStyle->SetPaintTextFormat("2.3f");
401 
402  TH1F* htmp = NULL;
403 
404  for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
405  int tmp_layer = m_SVDModules[i].getLayerNumber();
406  int tmp_ladder = m_SVDModules[i].getLadderNumber();
407  int tmp_sensor = m_SVDModules[i].getSensorNumber();
408 
409 
410  Int_t bin = m_hOccupancyU->FindBin(tmp_ladder, findBinY(tmp_layer, tmp_sensor));
411 
412  //look for U histogram - OFFLINE ZS
413  TString tmpname = Form("SVDExpReco/SVDDQM_%d_%d_%d_StripCountU", tmp_layer, tmp_ladder, tmp_sensor);
414 
415  htmp = (TH1F*)findHist(tmpname.Data());
416  if (htmp == NULL) {
417  B2INFO("Occupancy U histogram not found");
418  m_cOccupancyU->SetFillColor(kRed);
419  } else {
420 
421  Int_t nStrips = 768;
422 
423  Float_t occU = htmp->GetEntries() / nStrips / nEvents * 100;
424  m_hOccupancyU->SetBinContent(bin, occU);
425 
426  //test ERRORS
427  /*
428  if(bin == m_hOccupancyU->FindBin(2, findBinY(3, 1))){
429  occU = 0; //0,1,1.5,1.8,2,3
430  m_hOccupancyU->SetBinContent(bin, occU);
431  }
432  */
433 
434  if (occU <= m_occEmpty) {
435  if (m_occUstatus < 1) m_occUstatus = 1;
436  } else if (occU > m_occWarning) {
437  if (occU < m_occError) {
438  if (m_occUstatus < 2) m_occUstatus = 2;
439  } else {
440  if (m_occUstatus < 3) m_occUstatus = 3;
441  }
442  }
443 
444  // B2INFO(" x = " << tmp_ladder << ", y = " << tmp_layer * 10 + tmp_sensor << " U occ = " << occU << " status = " << m_occUstatus);
445 
446  //produce the occupancy plot
447  m_hStripOccupancyU[i].Clear();
448  htmp->Copy(m_hStripOccupancyU[i]);
449  m_hStripOccupancyU[i].Scale(1 / nEvents);
450  m_hStripOccupancyU[i].SetName(Form("%d_%d_%d_OccupancyU", tmp_layer, tmp_ladder, tmp_sensor));
451  m_hStripOccupancyU[i].SetTitle(Form("SVD Sensor %d_%d_%d U-Strip OFFLINE Occupancy vs Strip Number", tmp_layer, tmp_ladder,
452  tmp_sensor));
453  }
454  //look for V histogram - OFFLINE ZS
455  tmpname = Form("SVDExpReco/SVDDQM_%d_%d_%d_StripCountV", tmp_layer, tmp_ladder, tmp_sensor);
456 
457  htmp = (TH1F*)findHist(tmpname.Data());
458  if (htmp == NULL) {
459  B2INFO("Occupancy V histogram not found");
460  m_cOccupancyV->SetFillColor(kRed);
461  } else {
462 
463  Int_t nStrips = 768;
464  if (tmp_layer != 3)
465  nStrips = 512;
466 
467  Float_t occV = htmp->GetEntries() / nStrips / nEvents * 100;
468  m_hOccupancyV->SetBinContent(bin, occV);
469 
470  //test ERRORS
471  /*
472  if(bin == m_hOccupancyV->FindBin(3, findBinY(3, 1))){
473  occV = 1.8; //0,1,1.5,1.8,2,3
474  m_hOccupancyV->SetBinContent(bin, occV);
475  }
476  */
477 
478  if (occV <= m_occEmpty) {
479  if (m_occVstatus < 1) m_occVstatus = 1;
480  } else if (occV > m_occWarning) {
481  if (occV < m_occError) {
482  if (m_occVstatus < 2) m_occVstatus = 2;
483  } else {
484  if (m_occVstatus < 3) m_occVstatus = 3;
485  }
486  }
487  //produce the occupancy plot
488  m_hStripOccupancyV[i].Clear();
489  htmp->Copy(m_hStripOccupancyV[i]);
490  m_hStripOccupancyV[i].Scale(1 / nEvents);
491  m_hStripOccupancyV[i].SetName(Form("%d_%d_%d_OccupancyV", tmp_layer, tmp_ladder, tmp_sensor));
492  m_hStripOccupancyV[i].SetTitle(Form("SVD Sensor %d_%d_%d V-Strip OFFLINE Occupancy vs Strip Number", tmp_layer, tmp_ladder,
493  tmp_sensor));
494 
495  }
496  //look for V histogram - ONLINE ZS
497  tmpname = Form("SVDExpReco/SVDDQM_%d_%d_%d_OnlineZSStripCountV", tmp_layer, tmp_ladder, tmp_sensor);
498 
499  htmp = (TH1F*)findHist(tmpname.Data());
500  if (htmp == NULL) {
501  B2INFO("OnlineOccupancy V histogram not found");
502  m_cOnlineOccupancyV->SetFillColor(kRed);
503  } else {
504 
505  Int_t nStrips = 768;
506  if (tmp_layer != 3)
507  nStrips = 512;
508 
509  Float_t onlineOccV = htmp->GetEntries() / nStrips / nEvents * 100;
510  m_hOnlineOccupancyV->SetBinContent(bin, onlineOccV);
511 
512  for (int b = 1; b < htmp->GetNbinsX() + 1; b++) {
513  htmp->SetBinContent(b, htmp->GetBinContent(b) / nEvents * 100);
514  }
515  htmp->GetYaxis()->SetTitle("ZS3 ccupancy (%)");
516  //test ERRORS
517  /*
518  if(bin == m_hOnlineOccupancyV->FindBin(3, findBinY(3, 1))){
519  onlineOccV = 1.8; //0,1,1.5,1.8,2,3
520  m_hOnlineOccupancyV->SetBinContent(bin, onlineOccV);
521  }
522  */
523 
524  if (onlineOccV <= m_onlineOccEmpty) {
525  if (m_onlineOccVstatus < 1) m_onlineOccVstatus = 1;
526  } else if (onlineOccV > m_onlineOccWarning) {
527  if (onlineOccV < m_onlineOccError) {
528  if (m_onlineOccVstatus < 2) m_onlineOccVstatus = 2;
529  } else {
530  if (m_onlineOccVstatus < 3) m_onlineOccVstatus = 3;
531  }
532  }
533 
534 
535  }
536  //look for U histogram - ONLINE ZS
537  tmpname = Form("SVDExpReco/SVDDQM_%d_%d_%d_OnlineZSStripCountU", tmp_layer, tmp_ladder, tmp_sensor);
538 
539  htmp = (TH1F*)findHist(tmpname.Data());
540  if (htmp == NULL) {
541  B2INFO("OnlineOccupancy U histogram not found");
542  m_cOnlineOccupancyU->SetFillColor(kRed);
543  } else {
544 
545  Int_t nStrips = 768;
546 
547  Float_t onlineOccU = htmp->GetEntries() / nStrips / nEvents * 100;
548  m_hOnlineOccupancyU->SetBinContent(bin, onlineOccU);
549 
550  for (int b = 1; b < htmp->GetNbinsX() + 1; b++) {
551  htmp->SetBinContent(b, htmp->GetBinContent(b) / nEvents * 100);
552  }
553  htmp->GetYaxis()->SetTitle("ZS3 ccupancy (%)");
554  //test ERRORS
555  /*
556  if(bin == m_hOnlineOccupancyU->FindBin(3, findBinY(3, 1))){
557  onlineOccU = 1.8; //0,1,1.5,1.8,2,3
558  m_hOnlineOccupancyU->SetBinContent(bin, onlineOccU);
559  }
560  */
561 
562  if (onlineOccU <= m_onlineOccEmpty) {
563  if (m_onlineOccUstatus < 1) m_onlineOccUstatus = 1;
564  } else if (onlineOccU > m_onlineOccWarning) {
565  if (onlineOccU < m_onlineOccError) {
566  if (m_onlineOccUstatus < 2) m_onlineOccUstatus = 2;
567  } else {
568  if (m_onlineOccUstatus < 3) m_onlineOccUstatus = 3;
569  }
570  }
571 
572  //B2INFO(" x = " << tmp_ladder << ", y = " << tmp_layer * 10 + tmp_sensor << " V occ = " << occV << " status = " << m_occVstatus);
573  }
574 
575  //update sensor occupancy canvas U and V
576  m_cStripOccupancyU[i]->cd();
577  m_hStripOccupancyU[i].Draw("histo");
578  m_cStripOccupancyV[i]->cd();
579  m_hStripOccupancyV[i].Draw("histo");
580  }
581 
582  //update summary offline occupancy U canvas
583  m_cOccupancyU->cd();
584  m_hOccupancyU->Draw("text");
585  m_yTitle->Draw("same");
586 
587  if (m_occUstatus == 0) {
588  m_cOccupancyU->SetFillColor(kGreen);
589  m_cOccupancyU->SetFrameFillColor(10);
590  m_legNormal->Draw("same");
591  } else {
592  if (m_occUstatus == 3) {
593  m_cOccupancyU->SetFillColor(kRed);
594  m_cOccupancyU->SetFrameFillColor(10);
595  m_legProblem->Draw("same");
596  }
597  if (m_occUstatus == 2) {
598  m_cOccupancyU->SetFillColor(kOrange);
599  m_cOccupancyU->SetFrameFillColor(10);
600  m_legWarning->Draw("same");
601  }
602  if (m_occUstatus == 1) {
603  m_cOccupancyU->SetFillColor(kGray);
604  m_cOccupancyU->SetFrameFillColor(10);
605  m_legEmpty->Draw("same");
606  }
607  }
608  m_cOccupancyU->Draw();
609  m_cOccupancyU->Update();
610  m_cOccupancyU->Modified();
611  m_cOccupancyU->Update();
612 
613 
614  //update summary offline occupancy V canvas
615  m_cOccupancyV->cd();
616  m_hOccupancyV->Draw("text");
617  m_yTitle->Draw("same");
618 
619  if (m_occVstatus == 0) {
620  m_cOccupancyV->SetFillColor(kGreen);
621  m_cOccupancyV->SetFrameFillColor(10);
622  m_legNormal->Draw("same");
623  } else {
624  if (m_occVstatus == 3) {
625  m_cOccupancyV->SetFillColor(kRed);
626  m_cOccupancyV->SetFrameFillColor(10);
627  m_legProblem->Draw("same");
628  }
629  if (m_occVstatus == 2) {
630  m_cOccupancyV->SetFillColor(kOrange);
631  m_cOccupancyV->SetFrameFillColor(10);
632  m_legWarning->Draw("same");
633  }
634  if (m_occVstatus == 1) {
635  m_cOccupancyV->SetFillColor(kGray);
636  m_cOccupancyV->SetFrameFillColor(10);
637  m_legEmpty->Draw("same");
638  }
639  }
640 
641  m_cOccupancyV->Draw();
642  m_cOccupancyV->Update();
643  m_cOccupancyV->Modified();
644  m_cOccupancyV->Update();
645 
646  //update summary online occupancy U canvas
647  m_cOnlineOccupancyU->cd();
648  m_hOnlineOccupancyU->Draw("text");
649  m_yTitle->Draw("same");
650 
651  if (m_onlineOccUstatus == 0) {
652  m_cOnlineOccupancyU->SetFillColor(kGreen);
653  m_cOnlineOccupancyU->SetFrameFillColor(10);
654  m_legOnNormal->Draw("same");
655  } else {
656  if (m_onlineOccUstatus == 3) {
657  m_cOnlineOccupancyU->SetFillColor(kRed);
658  m_cOnlineOccupancyU->SetFrameFillColor(10);
659  m_legOnProblem->Draw("same");
660  }
661  if (m_onlineOccUstatus == 2) {
662  m_cOnlineOccupancyU->SetFillColor(kOrange);
663  m_cOnlineOccupancyU->SetFrameFillColor(10);
664  m_legOnWarning->Draw("same");
665  }
666  if (m_onlineOccUstatus == 1) {
667  m_cOnlineOccupancyU->SetFillColor(kGray);
668  m_cOnlineOccupancyU->SetFrameFillColor(10);
669  m_legOnEmpty->Draw("same");
670  }
671  }
672 
673  m_cOnlineOccupancyU->Draw();
674  m_cOnlineOccupancyU->Update();
675  m_cOnlineOccupancyU->Modified();
676  m_cOnlineOccupancyU->Update();
677 
678  //update summary online occupancy V canvas
679  m_cOnlineOccupancyV->cd();
680  m_hOnlineOccupancyV->Draw("text");
681  m_yTitle->Draw("same");
682 
683  if (m_onlineOccVstatus == 0) {
684  m_cOnlineOccupancyV->SetFillColor(kGreen);
685  m_cOnlineOccupancyV->SetFrameFillColor(10);
686  m_legOnNormal->Draw("same");
687  } else {
688  if (m_onlineOccVstatus == 3) {
689  m_cOnlineOccupancyV->SetFillColor(kRed);
690  m_cOnlineOccupancyV->SetFrameFillColor(10);
691  m_legOnProblem->Draw("same");
692  }
693  if (m_onlineOccVstatus == 2) {
694  m_cOnlineOccupancyV->SetFillColor(kOrange);
695  m_cOnlineOccupancyV->SetFrameFillColor(10);
696  m_legOnWarning->Draw("same");
697  }
698  if (m_onlineOccVstatus == 1) {
699  m_cOnlineOccupancyV->SetFillColor(kGray);
700  m_cOnlineOccupancyV->SetFrameFillColor(10);
701  m_legOnEmpty->Draw("same");
702  }
703  }
704 
705  m_cOnlineOccupancyV->Draw();
706  m_cOnlineOccupancyV->Update();
707  m_cOnlineOccupancyV->Modified();
708  m_cOnlineOccupancyV->Update();
709 
710  if (m_printCanvas) {
711  m_cOccupancyU->Print("c_SVDOccupancyU.pdf");
712  m_cOccupancyV->Print("c_SVDOccupancyV.pdf");
713  m_cOnlineOccupancyU->Print("c_SVDOnlineOccupancyU.pdf");
714  m_cOnlineOccupancyV->Print("c_SVDOnlineOccupancyV.pdf");
715  }
716 
717 }
718 
719 void DQMHistAnalysisSVDGeneralModule::endRun()
720 {
721  B2INFO("DQMHistAnalysisSVDGeneral: endRun called");
722 }
723 
724 
725 void DQMHistAnalysisSVDGeneralModule::terminate()
726 {
727  B2INFO("DQMHistAnalysisSVDGeneral: terminate called");
728 
729  delete m_refFile;
730  delete m_legProblem;
731  delete m_legWarning;
732  delete m_legNormal;
733  delete m_legEmpty;
734  delete m_legError;
735  delete m_legOnProblem;
736  delete m_legOnWarning;
737  delete m_legOnNormal;
738  delete m_legOnEmpty;
739  delete m_legOnError;
740  delete m_yTitle;
741 
742  delete m_cUnpacker;
743 
744  delete m_hOccupancyU;
745  delete m_cOccupancyU;
746  delete m_hOccupancyV;
747  delete m_cOccupancyV;
748 
749  delete m_hOnlineOccupancyU;
750  delete m_cOnlineOccupancyU;
751  delete m_hOnlineOccupancyV;
752  delete m_cOnlineOccupancyV;
753 
754  delete m_cOccupancyChartChip;
755 
756  for (int module = 0; module < nSensors; module++) {
757  delete m_cStripOccupancyU[module];
758  delete m_cStripOccupancyV[module];
759  }
760 
761  delete m_cStripOccupancyU;
762  delete m_cStripOccupancyV;
763 
764  delete m_cClusterOnTrackTime_L456V;
765 }
766 
767 Int_t DQMHistAnalysisSVDGeneralModule::findBinY(Int_t layer, Int_t sensor)
768 {
769  if (layer == 3)
770  return sensor; //2
771  if (layer == 4)
772  return 2 + 1 + sensor; //6
773  if (layer == 5)
774  return 6 + 1 + sensor; // 11
775  if (layer == 6)
776  return 11 + 1 + sensor; // 17
777  else
778  return -1;
779 }
780 
Belle2::VxdID
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:43
REG_MODULE
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:652
Belle2::VXD::SensorInfoBase
Base class to provide Sensor Information for PXD and SVD.
Definition: SensorInfoBase.h:40
Belle2::DQMHistAnalysisSVDGeneralModule
Class definition for the output module of Sequential ROOT I/O.
Definition: DQMHistAnalysisSVDGeneral.h:27
Belle2::VXD::GeoCache::getListOfSensors
const std::vector< VxdID > getListOfSensors() const
Get list of all sensors.
Definition: GeoCache.cc:60
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::VXD::GeoCache
Class to faciliate easy access to sensor information of the VXD like coordinate transformations or pi...
Definition: GeoCache.h:41
Belle2::VXD::GeoCache::getSensorInfo
const SensorInfoBase & getSensorInfo(Belle2::VxdID id) const
Return a referecne to the SensorInfo of a given SensorID.
Definition: GeoCache.cc:68
Belle2::DQMHistAnalysisModule
The base class for the histogram analysis module.
Definition: DQMHistAnalysis.h:27