10#include <dqm/analysis/modules/DQMHistAnalysisKLM2.h>
13#include <klm/dataobjects/KLMChannelIndex.h>
32 setDescription(
"Module used to analyze KLM Efficiency DQM histograms (depends on tracking variables).");
35 std::string(
"KLMEfficiencyDQM"));
41 addParam(
"RatioPlot",
m_ratio,
"2D efficiency ratio or difference plot ",
bool(
true));
74 "Plane Efficiency in BKLM",
76 m_eff_bklm->GetXaxis()->SetTitle(
"Layer number");
81 "Plane Efficiency in EKLM",
83 m_eff_eklm->GetXaxis()->SetTitle(
"Plane number");
88 "Sector Efficiency in BKLM",
95 "Sector Efficiency in EKLM",
115 TString eff2d_hist_bklm_title;
116 TString eff2d_hist_eklm_title;
118 eff2d_hist_bklm_title =
"Plane Efficiency Ratios in BKLM";
119 eff2d_hist_eklm_title =
"Plane Efficiency Ratios in EKLM";
121 eff2d_hist_bklm_title =
"Plane Efficiency Diffs in BKLM";
122 eff2d_hist_eklm_title =
"Plane Efficiency Diffs in EKLM";
141 std::string BB_sec =
"BB" + std::to_string(sec_id);
142 m_eff2d_bklm->GetXaxis()->SetBinLabel(sec_id + 1, BB_sec.c_str());
144 std::string BF_sec =
"BF" + std::to_string(sec_id);
149 std::string B_lay = std::to_string(lay_id);
150 m_eff2d_bklm->GetYaxis()->SetBinLabel(lay_id + 1, B_lay.c_str());
157 n_sectors_eklm, 0.5, n_sectors_eklm + 0.5,
164 n_sectors_eklm, 0.5, n_sectors_eklm + 0.5,
172 for (
int layerGlobal = 1; layerGlobal <= maximalLayer; ++layerGlobal) {
175 layerGlobal, §ion, &layer);
180 name += std::to_string(layer);
181 m_eff2d_eklm->GetXaxis()->SetBinLabel(layerGlobal, name.c_str());
185 std::string E_lay = std::to_string(lay_id);
186 m_eff2d_eklm->GetYaxis()->SetBinLabel(lay_id + 1, E_lay.c_str());
199 B2INFO(
"DQMHistAnalysisKLM2: " + histName +
" histogram was found in reference");
200 hist->SetLineColor(2);
201 hist->SetOption(
"HIST");
202 hist->SetStats(
false);
204 B2WARNING(
"DQMHistAnalysisKLM2: " + histName +
" histogram not found in reference");
205 hist =
new TH1F(histName.c_str(), title.c_str(), maxLayer, 0.5, 0.5 + maxLayer);
206 for (
int lay_id = 0; lay_id < maxLayer; lay_id++) {
207 hist->SetBinContent(lay_id + 1,
m_ratio ? 1 : 0);
234 double valuesThr[] = { tempStop, tempAlarm, tempWarn };
237 std::sort(std::begin(valuesThr), std::end(valuesThr));
246 B2WARNING(
"DQMHistAnalysisKLM2Module: Found that alarmThr or alarmStop is greater than warnThr...");
269 if (bin < bklmMaxSector)
273 name += std::to_string(bin % bklmMaxSector);
279 if (bin < eklmLocalMaxSector)
283 name += std::to_string(bin % eklmLocalMaxSector);
288 for (
int layer = 0; layer <
m_eff_bklm->GetXaxis()->GetNbins(); layer++) {
291 if (layer / bklmMaxLayer < bklmMaxSector) {
296 name += std::to_string(
int(layer / bklmMaxLayer) % bklmMaxSector) +
"_layer" + std::to_string(1 + (layer % bklmMaxLayer));
299 for (
int layer = 0; layer <
m_eff_eklm->GetXaxis()->GetNbins(); layer++) {
301 if (layer / eklmGlobalMaxSector < eklmBLayerCount)
302 name +=
"B" + std::to_string(layer / eklmGlobalMaxSector + 1);
304 name +=
"F" + std::to_string(layer / eklmGlobalMaxSector - eklmBLayerCount + 1);
305 name += +
"_num" + std::to_string(((layer) % eklmGlobalMaxSector) + 1);
314 std::unique_ptr<TH1> effClone(
static_cast<TH1*
>
317 if (denominator !=
nullptr && numerator !=
nullptr) {
318 effHist->Divide(numerator, denominator, 1, 1,
"B");
323 if (ref) {ref->Draw(
"hist,same");}
329 auto deltaDenom =
getDelta(
"", denominator->GetName());
330 auto deltaNumer =
getDelta(
"", numerator->GetName());
336 if ((deltaNumer !=
nullptr) && (deltaDenom !=
nullptr)) {
337 B2INFO(
"DQMHistAnalysisKLM2: Eff Delta Num/Denom Entries is " << deltaNumer->GetEntries() <<
"/" << deltaDenom->GetEntries());
338 effClone->Divide(deltaNumer, deltaDenom, 1, 1,
"B");
339 effClone->SetLineColor(kOrange);
340 effClone->DrawCopy(
"SAME");
348 const std::string& histName, TH1* histogram)
352 if (canvas == NULL) {
357 histogram->SetStats(
false);
358 double histMin = gPad->GetUymin();
359 double histMax = gPad->GetUymax();
360 double histRange = histMax - histMin;
361 if (histName.find(
"bklm") != std::string::npos) {
365 int bin = maximalLayer * sector + 1;
366 double xLine = histogram->GetXaxis()->GetBinLowEdge(bin);
367 double xText = histogram->GetXaxis()->GetBinLowEdge(bin + maximalLayer / 2);
368 double yText = histMin + 0.98 * histRange;
370 m_PlaneLine.DrawLine(xLine, histMin, xLine, histMin + histRange);
384 for (
int layerGlobal = 1; layerGlobal <= maximalLayer; ++layerGlobal) {
385 int bin = maxPlane * layerGlobal + 1;
386 double xLine = histogram->GetXaxis()->GetBinLowEdge(bin);
387 double xText = histogram->GetXaxis()->GetBinLowEdge(bin - maxPlane / 2);
388 double yText = histMin + 0.98 * histRange;
389 if (layerGlobal < maximalLayer)
390 m_PlaneLine.DrawLine(xLine, histMin, xLine, histMin + histRange);
393 layerGlobal, §ion, &layer);
398 name += std::to_string(layer);
408 TH1* mainHist, TH1* refHist, TH2* eff2dHist, TH2* errHist,
int layers,
int sectors,
bool ratioPlot,
409 int& pvcount,
double layerLimit, TCanvas* eff2dCanv)
417 float maxVal =
m_max;
418 float minVal =
m_min;
423 bool setAlarm =
false;
424 bool setWarn =
false;
432 mainEntries = mainHist->GetEntries();
434 for (
int binx = 0; binx < sectors; binx++) {
436 for (
int biny = 0; biny < layers; biny++) {
438 mainEff = mainHist->GetBinContent(i + 1);
439 mainErr = mainHist->GetBinError(i + 1);
441 refEff = refHist->GetBinContent(i + 1);
442 refErr = refHist->GetBinError(i + 1);
448 if ((mainEff == 0.) and (refEff == 0.)) {
450 eff2dHist->SetBinContent(binx + 1, biny + 1, 0.);
451 }
else if ((refEff == 0.) and (ratioPlot)) {
453 eff2dHist->SetBinContent(binx + 1, biny + 1, maxVal);
454 }
else if (mainEff == 0.) {
456 eff2dHist->SetBinContent(binx + 1, biny + 1, 0.);
457 errHist->SetBinContent(binx + 1, biny + 1, 0.);
461 eff2dVal = mainEff / refEff;
463 if (eff2dVal < warnThr) {errHist->SetBinContent(binx + 1, biny + 1, eff2dVal);}
465 eff2dVal = (mainEff - refEff) / pow(pow(mainErr, 2) + pow(refErr, 2), 0.5);
469 if ((eff2dVal > minVal) and (eff2dVal < maxVal)) {
471 eff2dHist->SetBinContent(binx + 1, biny + 1, eff2dVal);
472 }
else if (eff2dVal > maxVal) {
474 eff2dHist->SetBinContent(binx + 1, biny + 1, maxVal);
475 }
else if (eff2dVal < minVal) {
477 eff2dHist->SetBinContent(binx + 1, biny + 1, minVal);
484 if (eff2dVal < warnThr) {
486 if ((eff2dVal <= alarmThr) && (eff2dVal >= stopThr)) {
489 }
else if (eff2dVal < stopThr) {
502 if ((pvcount - layercount) > (int) layerLimit) {
505 if (layercount > (
int) layerLimit) {
509 eff2dHist->SetMinimum(minVal);
510 eff2dHist->SetMaximum(maxVal);
513 eff2dHist->Draw(
"COLZ");
514 errHist->Draw(
"TEXT SAME");
517 }
else if (setAlarm) {
519 }
else if (setWarn) {
524 eff2dCanv->Modified();
531 TH1* daqInclusion =
findHist(
"KLM/daq_inclusion");
532 if (not(daqInclusion == NULL)) {
533 int isKlmIncluded = daqInclusion->GetBinContent(daqInclusion->GetXaxis()->FindBin(
"Yes"));
534 if (isKlmIncluded == 0)
554 if ((all_ext_bklm ==
nullptr || matched_hits_bklm ==
nullptr) && (
m_IsPhysicsRun)) {
555 B2INFO(
"Histograms needed for BKLM plane efficiency computation are not found");
558 if ((all_ext_eklm ==
nullptr || matched_hits_eklm ==
nullptr) && (
m_IsPhysicsRun)) {
559 B2INFO(
"Histograms needed for EKLM plane efficiency computation are not found");
561 if ((all_ext_bklm_sector ==
nullptr || matched_hits_bklm_sector ==
nullptr) && (
m_IsPhysicsRun)) {
562 B2INFO(
"Histograms needed for BKLM sector efficiency computation are not found");
564 if ((all_ext_eklm_sector ==
nullptr || matched_hits_eklm_sector ==
nullptr) && (
m_IsPhysicsRun)) {
565 B2INFO(
"Histograms needed for EKLM sector efficiency computation are not found");
589 B2DEBUG(20,
"DQMHistAnalysisKLM2: Updating EPICS PVs");
593 B2INFO(
"DQMHistAnalysisKLM2: Null run detected. No PV Update.");
596 auto* daqDataSize =
findHist(
"DAQ/KLMDataSize");
597 double meanDAQDataSize = 0.;
598 if (daqDataSize !=
nullptr) {
599 meanDAQDataSize = daqDataSize->GetMean();
600 B2INFO(
"DAQ/KLMDataSize's mean is " << meanDAQDataSize);
602 B2WARNING(
"DQMHistAnalysisKLM2: Cannot find KLMDataSize");
603 if ((daqDataSize !=
nullptr) and (meanDAQDataSize != 0.)) {
614 B2INFO(
"DQMHistAnalysisKLM2: KLM Not included. No PV Update. ");
static constexpr int getMaximalLayerGlobalNumber()
Get maximal layer global number.
static constexpr int getMaximalLayerNumber()
Get maximal layer number (1-based).
static constexpr int getMaximalSectorNumber()
Get maximal sector number (1-based).
static constexpr int getMaximalSectorGlobalNumber()
Get maximal sector global number.
TH1 * m_ref_efficiencies_bklm
BKLM efficiencies reference histogram.
TLine m_PlaneLine
TLine for boundary in plane histograms.
int m_nEffEKLMLayers
Number of inefficient EKLM Layers.
void initialize() override final
Initializer.
TCanvas * m_c_eff2d_bklm
BKLM efficiencies ratio canvas.
double m_EKLMLayerWarn
warn limits from inefficient EKLM layers PV
std::string m_refHistogramDirectoryName
Name of histogram directory for reference file.
TCanvas * m_c_eff2d_eklm
EKLM efficiencies ratio canvas.
TH1 * m_eff_bklm_sector
Histogram for BKLM sector efficiency.
void processPlaneHistogram(const std::string &histName, TH1 *histogram)
Process histogram containing the number of hits in plane.
bool m_IsPhysicsRun
Run type flag for null runs.
float m_stopThr
efficiency ratio (run-)stop threshold
double m_minEntries
Minimal number of entries for delta histogram and PV update.
TH1 * m_eff_eklm
Histogram for EKLM plane efficiency.
void processEfficiencyHistogram(TH1 *effHist, TH1 *denominator, TH1 *numerator, TCanvas *canvas)
Process histogram containing the efficiencies.
TCanvas * m_c_eff_eklm_sector
Histogram for EKLM sector efficiency.
const EKLMElementNumbers * m_EklmElementNumbers
EKLM element numbers.
TH1 * m_eff_eklm_sector
Histogram for EKLM sector efficiency.
float m_max
efficiency ratio max z scale
double m_BKLMLayerWarn
warn limits from inefficient BKLM layers PV
MonitoringObject * m_monObj
Monitoring object.
TH1 * m_ref_efficiencies_eklm
ELM efficiencies reference histogram.
float m_alarmThr
efficiency ratio alarm threshold
void event() override final
This method is called for each event.
void process2DEffHistogram(TH1 *mainHist, TH1 *refHist, TH2 *planeHist, TH2 *errHist, int layers, int sectors, bool ratioPlot, int &pvcount, double layerLimit, TCanvas *eff2dCanv)
Process 2D efficiency histograms.
TCanvas * m_c_eff_bklm_sector
Histogram for BKLM sector efficiency.
float m_warnThr
efficiency ratio warning threshold
std::string m_histogramDirectoryName
Name of histogram directory.
TH2 * m_err_bklm
BKLM efficiencies error histogram.
float m_min
efficiency ratio min z scale
TH2 * m_eff2d_bklm
BKLM efficiencies 2dim histogram.
TH1 * m_eff_bklm
Histogram for BKLM plane efficiency.
TCanvas * m_c_eff_bklm
BKLM plane efficiency canvas.
TText m_PlaneText
TText for names in plane histograms.
TCanvas * m_c_eff_eklm
EKLM plane efficiency canvas.
void endRun() override final
This method is called if the current run ends.
void beginRun() override final
Called when entering a new run.
void initialize2DRefHistogram(TH1 *&hist, const std::string &histName, const std::string &title, int maxLayer)
Initialize a histogram by either finding a reference histogram or creating a new one.
bool m_ratio
show efficiency ratio or difference
TH2 * m_err_eklm
EKLM efficiencies error histogram.
bool m_IsNullRun
Run type flag for null runs.
TH2 * m_eff2d_eklm
EKLM efficiencies 2dim histogram.
int m_nEffBKLMLayers
Number of inefficient BKLM layers.
DQMHistAnalysisKLM2Module()
Constructor.
The base class for the histogram analysis module.
TCanvas * findCanvas(TString cname)
Find canvas by name.
static TH1 * findRefHist(const std::string &histname, ERefScaling scaling=ERefScaling::c_RefScaleNone, const TH1 *hist=nullptr)
Get referencehistogram from list (no other search).
static MonitoringObject * getMonitoringObject(const std::string &name)
Get MonitoringObject with given name (new object is created if non-existing)
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).
static const std::string & getRunType(void)
Get the Run Type.
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.
@ c_StatusTooFew
Not enough entries/event to judge.
@ c_StatusError
Analysis result: Severe issue found.
@ c_StatusWarning
Analysis result: Warning, there may be minor issues.
@ c_StatusGood
Analysis result: Good.
@ c_RefScaleNone
no scaling
static int getEventProcessed(void)
Get the number of processed events.
int registerEpicsPV(std::string pvname, std::string keyname="")
EPICS related Functions.
void UpdateCanvas(std::string name, bool updated=true)
Mark canvas as updated (or not)
bool requestLimitsFromEpicsPVs(chid id, double &lowerAlarm, double &lowerWarn, double &upperWarn, double &upperAlarm)
Get Alarm Limits from EPICS PV.
static constexpr int getMaximalLayerGlobalNumber()
Get maximal detector layer global number.
int getMaximalDetectorLayerNumber(int section) const
Get maximal detector layer number.
void layerNumberToElementNumbers(int layerGlobal, int *section, int *layer) const
Get element numbers by detector layer global number.
static constexpr int getMaximalPlaneGlobalNumber()
Get maximal plane global number.
@ c_BackwardSection
Backward.
static constexpr int getMaximalSectorNumber()
Get maximal sector number.
static constexpr int getMaximalPlaneNumber()
Get maximal plane number.
static constexpr int getMaximalSectorGlobalNumberKLMOrder()
Get maximal sector global number with KLM ordering (section, sector).
void setDescription(const std::string &description)
Sets the description of the module.
void setVariable(const std::string &var, float val, float upErr=-1., float dwErr=-1)
set value to float variable (new variable is made if not yet existing)
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.
Abstract base class for different kinds of events.