Belle II Software development
DQMHistAnalysisSVDClustersOnTrack.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8//+
9// File : DQMHistAnalysisSVDClustersOnTrack.cc
10// Description : module for DQM histogram analysis of SVD sensors occupancies
11//-
12
13
14#include <dqm/analysis/modules/DQMHistAnalysisSVDClustersOnTrack.h>
15#include <vxd/geometry/GeoCache.h>
16
17#include <TROOT.h>
18#include <TStyle.h>
19#include <TString.h>
20#include <TAxis.h>
21
22#include <TMath.h>
23#include <iostream>
24#include <cmath>
25
26using namespace std;
27using namespace Belle2;
28
29//-----------------------------------------------------------------
30// Register the Module
31//-----------------------------------------------------------------
32REG_MODULE(DQMHistAnalysisSVDClustersOnTrack);
33
34//-----------------------------------------------------------------
35// Implementation
36//-----------------------------------------------------------------
37
40{
41 //Parameter definition
42 B2DEBUG(10, "DQMHistAnalysisSVDClustersOnTrack: Constructor done.");
43
44 setDescription("DQM Analysis Module that produces colored canvas for a straightforward interpretation of the SVD Data Quality.");
45
46 addParam("printCanvas", m_printCanvas, "if True prints pdf of the analysis canvas", bool(false));
47 addParam("statThreshold", m_statThreshold, "Minimal number of events to compare histograms", double(10000.));
48 addParam("timeThreshold", m_timeThreshold, "Acceptable difference between mean of central peak for present and reference run",
49 double(8)); // 8 ns
50 addParam("refMode", m_refMode, "Mode reference of the signal time peak", double(0.0));
51 addParam("samples3", m_3Samples, "if True 3 samples histograms analysis is performed", bool(false));
52 addParam("PVPrefix", m_pvPrefix, "PV Prefix", std::string("SVD:"));
53}
54
56{
57 B2DEBUG(10, "DQMHistAnalysisSVDClustersOnTrack: initialized.");
58
59 m_cClusterOnTrackTime_L456V = new TCanvas("SVDAnalysis/c_ClusterOnTrackTime_L456V");
60
61 if (m_3Samples)
62 m_cClusterOnTrackTimeL456V3Samples = new TCanvas("SVDAnalysis/c_ClusterOnTrackTime_L456V3Samples");
63
64 //register limits for EPICS
65 registerEpicsPV(m_pvPrefix + "clusterTimeOnTrackMode", "clusterTimeOnTrackMode");
66 registerEpicsPV(m_pvPrefix + "ratio3_6", "ratio3_6");
67 registerEpicsPV(m_pvPrefix + "clusterTimeOnTrackLimits", "clusTimeOnTrkLimits");
68}
69
70
72{
73 B2DEBUG(10, "DQMHistAnalysisSVDClustersOnTrack: beginRun called.");
74
76
77 if (m_3Samples)
79
80 //Retrieve limits from EPICS
81 double timeWarnUp = 0.;
82 double timeErrorLo = 0.;
83 double timeWarnLo = 0.;
84 requestLimitsFromEpicsPVs("clusTimeOnTrkLimits", timeErrorLo, timeWarnLo, timeWarnUp, m_timeThreshold);
85
86 //Retrieve mode value for cluster time on track
87 double ref = getEpicsPV("clusterTimeOnTrackMode");
88 if (!std::isnan(ref))
89 m_refMode = ref;
90
91 B2DEBUG(10, " SVD cluster time on track threshold taken from EPICS configuration file:");
92 B2DEBUG(10, " CLUSTER TIME ON TRACK: error > " << m_timeThreshold - m_refMode << " ns with minimum statistics of " <<
94
95 // cluster time on tracks legend
96 m_legProblem->Clear();
97 m_legProblem->AddText("ERROR!");
98 m_legProblem->AddText(Form("abs(Mode - Ref) > %3.1f ns", m_timeThreshold));
99 m_legProblem->AddText("Mode: 0.0 ns");
100
101
102 m_legWarning->Clear();
103 m_legWarning->AddText("WARNING!");
104
105 m_legNormal->Clear();
106 m_legNormal->AddText("TIME SHIFT UNDER LIMIT");
107 m_legNormal->AddText(Form("abs(Mode - Ref) < %3.1f ns", m_timeThreshold));
108 m_legNormal->AddText("Mode: 0.0 ns");
109
110 m_legLowStat->Clear();
111 m_legLowStat->AddText("Not enough statistics");
112
113 m_legEmpty->Clear();
114 m_legEmpty->AddText("No data recieved");
115}
116
118{
119 B2DEBUG(10, "DQMHistAnalysisSVDClustersOnTrack: event called.");
120
121 //find nEvents
122 TH1* hnEvnts = findHist("SVDExpReco/SVDDQM_nEvents", true);
123 if (hnEvnts == NULL) {
124 B2INFO("no events, nothing to do here");
125 return;
126 } else {
127 B2DEBUG(10, "SVDExpReco/SVDDQM_nEvents found");
128 }
129
130 string rtype = getRunType();
131 m_runtype = !rtype.empty() ? rtype.c_str() : "physics"; // per default
132
133 if (rtype.empty())
134 B2INFO("no run type found, put defaultwise physics");
135
136 TString tmp = hnEvnts->GetTitle();
137 Int_t pos = tmp.Last('~');
138 if (pos == -1) pos = 0;
139
140 TString runID = tmp(pos, tmp.Length() - pos);
141 B2INFO("DQMHistAnalysisSVDClustersOnTrackModule::runID = " << runID);
142 Float_t nEvents = hnEvnts->GetEntries();
143
144 // cluster time for clusters of track
145 double ratio3_6 = 0.;
146 TH1* m_h = findHist("SVDClsTrk/SVDTRK_ClusterTimeV456");
147
148 int status;
149 if (m_h != NULL) {
150
153 TString hName = getHistoNameFromCanvas(m_cClusterOnTrackTime_L456V->GetName());
154 m_hClusterOnTrackTime_L456V.SetName(hName.Data());
155 m_hClusterOnTrackTime_L456V.SetTitle(Form("ClusterOnTrack Time L456V %s", runID.Data()));
156 m_hClusterOnTrackTime_L456V.SetStats(false);
157
158 Int_t binMax = m_hClusterOnTrackTime_L456V.GetMaximumBin();
159 double mode = m_hClusterOnTrackTime_L456V.GetXaxis()->GetBinCenter(binMax);
160
161 if (nEvents > m_statThreshold)
162 status = getCanvasStatus(mode);
163 else
164 status = lowStat;
165
169
170 } else {
171 B2INFO("Histogram SVDClsTrk/c_SVDTRK_ClusterTimeV456 from SVDDQMClustersOnTrack module not found!");
175 }
176
177 if (m_printCanvas)
178 m_cClusterOnTrackTime_L456V->Print("c_SVDClusterOnTrackTime_L456V.pdf");
179
180
181 // cluster time for clusters of track for 3 samples
182 if (m_3Samples) {
183 m_h = findHist("SVDClsTrk/SVDTRK_Cluster3TimeV456");
184
185 if (m_h != NULL) {
189 m_hClusterOnTrackTimeL456V3Samples.SetName(hName.Data());
190 m_hClusterOnTrackTimeL456V3Samples.SetTitle(Form("ClusterOnTrack Time L456V 3 samples %s", runID.Data()));
191
192 Int_t binMax = m_hClusterOnTrackTime_L456V.GetMaximumBin();
193 double mode = m_hClusterOnTrackTime_L456V.GetXaxis()->GetBinCenter(binMax);
194
195
196 if (nEvents > m_statThreshold)
197 status = getCanvasStatus(mode);
198 else
199 status = lowStat;
200
204
205 } else {
206 B2INFO("Histogram SVDClsTrk/c_SVDTRK_Cluster3TimeV456 from SVDDQMClustersOnTrack module not found!");
210 }
211
212 if (m_printCanvas)
213 m_cClusterOnTrackTimeL456V3Samples->Print("c_SVDClusterOnTrack3Time_L456V.pdf");
214
215 ratio3_6 = m_hClusterOnTrackTimeL456V3Samples.GetEntries() / m_hClusterOnTrackTime_L456V.GetEntries();
216 }
217
218 setEpicsPV("ratio3_6", ratio3_6);
219}
220
222{
223 B2DEBUG(10, "DQMHistAnalysisSVDClustersOnTrack: endRun called");
224}
225
226
228{
229 B2DEBUG(10, "DQMHistAnalysisSVDClustersOnTrack: terminate called");
230
233}
234
236{
237 int status = good;
238
239 if (fabs(mode - m_refMode) > m_timeThreshold) {
240 status = error;
241 TText* text = m_legProblem->GetLine(m_legProblem->GetSize() - 1);
242 text->SetText(text->GetX(), text->GetY(), Form("Mode - Ref: %3.1f ns", mode - m_refMode));
243 } else {
244 status = good;
245 TText* text = m_legNormal->GetLine(m_legNormal->GetSize() - 1);
246 text->SetText(text->GetX(), text->GetY(), Form("Mode - Ref: %3.1f ns", mode - m_refMode));
247 }
248
249 return status;
250}
int registerEpicsPV(const std::string &pvname, const std::string &keyname="")
EPICS related Functions.
static TH1 * findHist(const std::string &histname, bool onlyIfUpdated=false)
Get histogram from list (no other search).
static const std::string & getRunType(void)
Get the list of the reference histograms.
double getEpicsPV(const std::string &keyname)
Read value from a EPICS PV.
bool requestLimitsFromEpicsPVs(chid id, double &lowerAlarm, double &lowerWarn, double &upperWarn, double &upperAlarm)
Get Alarm Limits from EPICS PV.
void setEpicsPV(const std::string &keyname, double value)
Write value to a EPICS PV.
TCanvas * m_cClusterOnTrackTimeL456V3Samples
time for clusters on Track for L456V canvas for 3 sampples
double m_statThreshold
minimal number of events to compare histograms
double m_timeThreshold
difference between mean of cluster time for present and reference run
TString m_runtype
string with runtype: physics or cosmic
double m_refMode
reference mode of the signal time peak
void terminate() override final
This method is called at the end of the event processing.
void event() override final
This method is called for each event.
bool m_printCanvas
Parameters accesible from basf2 scripts.
bool m_3Samples
if true enable 3 samples histograms analysis
TH1F m_hClusterOnTrackTime_L456V
time for clusters on Track for L456V histo
void endRun() override final
This method is called if the current run ends.
TCanvas * m_cClusterOnTrackTime_L456V
time for clusters on Track for L456V canvas
void beginRun() override final
Called when entering a new run.
TH1F m_hClusterOnTrackTimeL456V3Samples
time for clusters on Track for L456V histo for 3 samples
static TString getHistoNameFromCanvas(TString cName, TString view="", TString cPrefix="c_", TString hPrefix="")
get histogram name from Canvas name
TPaveText * m_legEmpty
plot legend, empty
TPaveText * m_legLowStat
plot legend, low stats
TPaveText * m_legWarning
plot legend, warning
TPaveText * m_legNormal
plot legend, normal
TPaveText * m_legProblem
plot legend, problem
DQMHistAnalysisSVDModule(bool panelTop=false, bool online=false, bool groupIDs=false)
Constructor.
void setStatusOfCanvas(int status, TCanvas *canvas, bool plotLeg=true, int histoType=kOffline)
set status of Canvas
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
Abstract base class for different kinds of events.
STL namespace.