10#include <dqm/analysis/modules/DQMHistAnalysisARICH.h>
36 setDescription(
"Modify and analyze the data quality histograms of ARICH");
41 addParam(
"badApdOccLimit",
m_badApdOccLimit,
"Occupancy limit for bad APDs (in fraction of average occupancy)", 0.3);
54 for (
int i = 0; i < 5; i++) {
64 m_apdPoly->SetTitle(
"# of hits/APD/event");
68 addDeltaPar(
"ARICH",
"bitsPerChannel", HistDelta::c_Events,
84 B2DEBUG(20,
"DQMHistAnalysisARICH: initialized.");
109 TH1* m_h_mergerHit =
findHist(
"ARICH/mergerHit");
114 m_h_mergerHit->SetMinimum(0);
115 m_h_mergerHit->Draw(
"hist");
119 double mean = m_h_mergerHit->Integral() / 72;
120 for (
int i = 0; i < 72; i++) {
121 int hit = m_h_mergerHit->GetBinContent(i + 1);
122 if ((
bool)hit ^ (
bool)m_h_mergerHit->GetEntries()) {
130 if (hit > mean * 100 && alertMerger < 1) alertMerger = 1;
135 for (
int i = 0; i < 5; i++) {
136 m_LineForMB[i]->DrawLine(12 * (i + 1) + 0.5, 0, 12 * (i + 1) + 0.5, gPad->GetUymax());
141 B2INFO(
"Histogram/canvas named mergerHit is not found.");
146 TH1* m_h_bits =
findHist(
"ARICH/bits");
148 if (m_h_bits != NULL &&
m_c_bits != NULL) {
151 m_h_bits->SetMinimum(0);
152 m_h_bits->Draw(
"hist");
155 double side = m_h_bits->GetBinContent(2) + m_h_bits->GetBinContent(5);
156 double center = m_h_bits->GetBinContent(3) + m_h_bits->GetBinContent(4);
164 B2INFO(
"Histogram/canvas named bits is not found.");
168 TH1* m_h_hitsPerEvent =
findHist(
"ARICH/hitsPerEvent");
174 m_h_hitsPerEvent->SetMinimum(0);
175 m_h_hitsPerEvent->Draw(
"hist");
177 nEvents = m_h_hitsPerEvent->GetEntries();
178 int alertHitsPerEvent = 0;
179 double mean = m_h_hitsPerEvent->GetMean();
180 if (mean < 1) alertHitsPerEvent = 1;
181 double entry = m_h_hitsPerEvent->GetEntries();
182 if (entry == 0) alertHitsPerEvent = 2;
187 B2INFO(
"Histogram/canvas named hitsPerEvent is not found.");
191 TH1* m_h_chHit =
findHist(
"ARICH/chipHit");
192 if (m_h_chHit != NULL) {
194 TH1* htmp =
findHist(
"ARICH/hitsPerEvent");
195 if (htmp) nevt = htmp->GetEntries();
197 if (nevt)
m_apdHist->Scale(1. /
float(nevt));
209 B2INFO(
"Histogram named chipHit is not found.");
212 TH1F* chDigit = (TH1F*)
findHist(
"ARICH/chDigit");
215 if (chDigit != NULL && nEvents != 0) {
216 avgOcc = chDigit->GetEntries() / 60480.;
218 for (
int i = 0; i < chDigit->GetNbinsX(); i++) {
219 int nhit = chDigit->GetBinContent(i + 1);
220 if ((nhit - 3. *
sqrt(nhit)) / float(nEvents) >
m_hotLimit) nhot++;
227 TH1F* hapdDigit = (TH1F*)
findHist(
"ARICH/hapdDigit");
228 if (hapdDigit != NULL && avgOcc * 144. > 100.) {
229 for (
int i = 0; i < hapdDigit->GetNbinsX(); i++) {
230 if (hapdDigit->GetBinContent(i + 1) == 0) ndeadHapd++;
235 auto h_theta =
getDelta(
"ARICH",
"theta", 0,
false);
237 auto h_thetaInt = (TH1F*)
findHist(
"ARICH/theta");
238 if (h_theta != NULL && c_theta != NULL && h_thetaInt != NULL) {
239 int binmax = h_theta->GetMaximumBin();
240 double x = h_theta->GetXaxis()->GetBinCenter(binmax);
245 h_theta->Scale(h_thetaInt->GetEntries() / double(h_theta->GetEntries()));
247 h_theta->Draw(
"same");
253 if (avgOcc * 36. < 100.) {
258 auto h_bitsPerChannel =
getDelta(
"ARICH",
"bitsPerChannel", 0,
true);
259 if (h_bitsPerChannel == NULL)
return;
260 TH1F* apdHits =
new TH1F(
"apdHits",
"nSigHits/nevt for all apds", 1680, -0.5, 1679.5);
262 for (
int i = 1; i < 60481; i++) {
263 int nnoise = h_bitsPerChannel->GetBinContent(1, i) + h_bitsPerChannel->GetBinContent(4, i);
264 int nsig = h_bitsPerChannel->GetBinContent(2, i) + h_bitsPerChannel->GetBinContent(3, i) - nnoise;
265 double sig2noise = float(nsig) / float(nsig + nnoise);
266 if (sig2noise > 0.2) avg += nsig;
267 if (i % 36 == 0 && i > 1) {
268 apdHits->SetBinContent(i / 36 + 1, avg);
274 double ringApdAvg[7] = {0.};
276 const int hapdInRing[7] = {42, 48, 54, 60, 66, 72, 78};
279 for (
int i = 1; i < 1681; i++) {
280 int hapd = (i - 1) / 4 + 1;
281 ringApdAvg[
getRing(
hapd)] += apdHits->GetBinContent(i);
284 for (
int i = 0; i < 7; i++) {
285 ringApdAvg[i] /= float(4.*hapdInRing[i]);
288 for (
int i = 0; i < 1680; i++) {
290 int nhits = apdHits->GetBinContent(i + 1);
302 if (modID <= 42)
return 0;
303 if (modID <= 90)
return 1;
304 if (modID <= 144)
return 2;
305 if (modID <= 204)
return 3;
306 if (modID <= 270)
return 4;
307 if (modID <= 342)
return 5;
308 if (modID <= 420)
return 6;
314 B2DEBUG(20,
"DQMHistAnalysisARICH : endRun called");
320 B2DEBUG(20,
"terminate called");
ARICH histogram with HAPD plane 3 options for bin segmentation are available type 0 - one bin per HAP...
void fillFromTH1(TH1 *hist)
Fill the channelHist from the histogram Type 0 channelHist has to be filled with 420*144bin TH1 (each...
void setPoly(TH2Poly *poly)
Fill pure TH2Poly from ARICHChannelHist, makes bins and fills content.
double m_hotLimit
Occupancy limit for hot channels.
double m_badApdOccLimit
Occupancy threshold for bad APDs, in units of average APD occupancy.
void initialize() override final
Initialize the Module.
TCanvas * m_c_apdHist
Canvas for 2D hit map of APDs.
TH2Poly * m_apdPoly
hit map for each APD
TLine * m_LineForMB[5]
Lines to divide the sectors on mergerHit histogram.
TCanvas * m_c_mergerHit
Canvas for modified mergerHit histogram.
int getRing(int modID)
Returns ring number of HAPD with given moduleID.
bool m_enableAlert
Enable alert by base color of canvases.
Belle2::ARICHChannelHist * m_apdHist
ARICH TObject to draw hit map for each APD.
void terminate() override final
Termination action.
void event() override final
Event processor.
double m_sigBitFracLowAlarm
Alarm limit for overall signal/background fraction.
void endRun() override final
End-of-run action.
TCanvas * m_c_bits
Canvas for modified bits histogram.
std::vector< int > maskedMergers
The id numbers of masked merger boards to avoid unnecessary alert.
void beginRun() override final
begin-of-run action.
TCanvas * m_c_hitsPerEvent
Canvas for modified hitsPerTrack histogram.
~DQMHistAnalysisARICHModule()
Destructor.
DQMHistAnalysisARICHModule()
Constructor.
double m_sigBitFracLowWarn
Warning limit for overall signal/background fraction.
int alertColor[3]
Alert color of canvases.
The base class for the histogram analysis module.
TCanvas * findCanvas(TString cname)
Find canvas by name.
void addDeltaPar(const std::string &dirname, const std::string &histname, HistDelta::EDeltaType t, int p, unsigned int a=1)
Add Delta histogram parameters.
void colorizeCanvas(TCanvas *canvas, EStatus status)
Helper function for Canvas colorization.
static TH1 * findHist(const std::string &histname, bool onlyIfUpdated=false)
Get histogram from list (no other search).
double getEpicsPV(std::string keyname)
Read value from a EPICS PV.
TH1 * getDelta(const std::string &fullname, int n=0, bool onlyIfUpdated=true)
Get Delta histogram.
void setEpicsPV(std::string keyname, double value)
Write value to a EPICS PV.
EStatus
Status flag of histogram/canvas.
@ c_StatusError
Analysis result: Severe issue found.
@ c_StatusWarning
Analysis result: Warning, there may be minor issues.
@ c_StatusGood
Analysis result: Good.
int registerEpicsPV(std::string pvname, std::string keyname="")
EPICS related Functions.
bool requestLimitsFromEpicsPVs(chid id, double &lowerAlarm, double &lowerWarn, double &upperWarn, double &upperAlarm)
Get Alarm Limits from EPICS PV.
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
TH1F * hapd[6]
histogram of hits for each hapd
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
double sqrt(double a)
sqrt for double
Abstract base class for different kinds of events.