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"));
44 addParam(
"RatioPlot",
m_ratio,
"2D efficiency ratio or difference plot ",
bool(
true));
65 registerEpicsPV(
"KLM:Eff:uncertaintyThreshold",
"uncertaintyThreshold");
68 registerEpicsPV(
"KLM:Eff:deltaEffStopThreshold",
"deltaEffStopThreshold");
80 "Plane Efficiency in BKLM",
82 m_eff_bklm->GetXaxis()->SetTitle(
"Layer number");
87 "Plane Efficiency in EKLM",
89 m_eff_eklm->GetXaxis()->SetTitle(
"Plane number");
94 "Sector Efficiency in BKLM",
101 "Sector Efficiency in EKLM",
121 TString eff2d_hist_bklm_title;
122 TString eff2d_hist_eklm_title;
124 eff2d_hist_bklm_title =
"Plane Efficiency Ratios in BKLM";
125 eff2d_hist_eklm_title =
"Plane Efficiency Ratios in EKLM";
127 eff2d_hist_bklm_title =
"Plane Efficiency Diffs in BKLM";
128 eff2d_hist_eklm_title =
"Plane Efficiency Diffs in EKLM";
147 std::string BB_sec =
"BB" + std::to_string(sec_id);
148 m_eff2d_bklm->GetXaxis()->SetBinLabel(sec_id + 1, BB_sec.c_str());
150 std::string BF_sec =
"BF" + std::to_string(sec_id);
155 std::string B_lay = std::to_string(lay_id);
156 m_eff2d_bklm->GetYaxis()->SetBinLabel(lay_id + 1, B_lay.c_str());
163 n_sectors_eklm, 0.5, n_sectors_eklm + 0.5,
170 n_sectors_eklm, 0.5, n_sectors_eklm + 0.5,
178 for (
int layerGlobal = 1; layerGlobal <= maximalLayer; ++layerGlobal) {
181 layerGlobal, §ion, &layer);
186 name += std::to_string(layer);
187 m_eff2d_eklm->GetXaxis()->SetBinLabel(layerGlobal, name.c_str());
191 std::string E_lay = std::to_string(lay_id);
192 m_eff2d_eklm->GetYaxis()->SetBinLabel(lay_id + 1, E_lay.c_str());
204 B2INFO(
"DQMHistAnalysisKLM2: " + histName +
" histogram was found in reference");
205 hist->SetLineColor(2);
206 hist->SetOption(
"HIST");
207 hist->SetStats(
false);
209 B2WARNING(
"DQMHistAnalysisKLM2: " + histName +
" histogram not found in reference");
210 hist =
new TH1F(histName.c_str(), title.c_str(), maxLayer, 0.5, 0.5 + maxLayer);
211 for (
int lay_id = 0; lay_id < maxLayer; lay_id++) {
212 hist->SetBinContent(lay_id + 1,
m_ratio ? 1 : 0);
262 if (bin < bklmMaxSector)
266 name += std::to_string(bin % bklmMaxSector);
272 if (bin < eklmLocalMaxSector)
276 name += std::to_string(bin % eklmLocalMaxSector);
281 for (
int layer = 0; layer <
m_eff_bklm->GetXaxis()->GetNbins(); layer++) {
284 if (layer / bklmMaxLayer < bklmMaxSector) {
289 name += std::to_string(
int(layer / bklmMaxLayer) % bklmMaxSector) +
"_layer" + std::to_string(1 + (layer % bklmMaxLayer));
292 for (
int layer = 0; layer <
m_eff_eklm->GetXaxis()->GetNbins(); layer++) {
294 if (layer / eklmGlobalMaxSector < eklmBLayerCount)
295 name +=
"B" + std::to_string(layer / eklmGlobalMaxSector + 1);
297 name +=
"F" + std::to_string(layer / eklmGlobalMaxSector - eklmBLayerCount + 1);
298 name += +
"_num" + std::to_string(((layer) % eklmGlobalMaxSector) + 1);
307 std::unique_ptr<TH1> effClone(
static_cast<TH1*
>
310 if (denominator !=
nullptr && numerator !=
nullptr) {
311 effHist->Divide(numerator, denominator, 1, 1,
"B");
316 if (ref) {ref->Draw(
"hist,same");}
322 auto deltaDenom =
getDelta(
"", denominator->GetName());
323 auto deltaNumer =
getDelta(
"", numerator->GetName());
329 if ((deltaNumer !=
nullptr) && (deltaDenom !=
nullptr)) {
330 B2INFO(
"DQMHistAnalysisKLM2: Eff Delta Num/Denom Entries is " << deltaNumer->GetEntries() <<
"/" << deltaDenom->GetEntries());
331 effClone->Divide(deltaNumer, deltaDenom, 1, 1,
"B");
332 effClone->SetLineColor(kOrange);
333 effClone->DrawCopy(
"SAME");
341 const std::string& histName, TH1* histogram)
345 if (canvas == NULL) {
350 histogram->SetStats(
false);
351 double histMin = gPad->GetUymin();
352 double histMax = gPad->GetUymax();
353 double histRange = histMax - histMin;
354 if (histName.find(
"bklm") != std::string::npos) {
358 int bin = maximalLayer * sector + 1;
359 double xLine = histogram->GetXaxis()->GetBinLowEdge(bin);
360 double xText = histogram->GetXaxis()->GetBinLowEdge(bin + maximalLayer / 2);
361 double yText = histMin + 0.98 * histRange;
363 m_PlaneLine.DrawLine(xLine, histMin, xLine, histMin + histRange);
377 for (
int layerGlobal = 1; layerGlobal <= maximalLayer; ++layerGlobal) {
378 int bin = maxPlane * layerGlobal + 1;
379 double xLine = histogram->GetXaxis()->GetBinLowEdge(bin);
380 double xText = histogram->GetXaxis()->GetBinLowEdge(bin - maxPlane / 2);
381 double yText = histMin + 0.98 * histRange;
382 if (layerGlobal < maximalLayer)
383 m_PlaneLine.DrawLine(xLine, histMin, xLine, histMin + histRange);
386 layerGlobal, §ion, &layer);
391 name += std::to_string(layer);
401 TH1* mainHist, TH1* refHist, TH2* eff2dHist, TH2* errHist,
int layers,
int sectors,
bool ratioPlot,
402 int& pvcount,
double layerLimit, TCanvas* eff2dCanv)
410 float maxVal =
m_max;
411 float minVal =
m_min;
413 bool setAlarm =
false;
414 bool setWarn =
false;
422 mainEntries = mainHist->GetEntries();
424 for (
int binx = 0; binx < sectors; binx++) {
426 for (
int biny = 0; biny < layers; biny++) {
428 mainEff = mainHist->GetBinContent(i + 1);
429 mainErr = mainHist->GetBinError(i + 1);
431 refEff = refHist->GetBinContent(i + 1);
432 refErr = refHist->GetBinError(i + 1);
438 if ((mainEff == 0.) and (refEff == 0.)) {
440 eff2dHist->SetBinContent(binx + 1, biny + 1, 0.);
441 }
else if ((refEff == 0.) and (ratioPlot)) {
443 eff2dHist->SetBinContent(binx + 1, biny + 1, maxVal);
444 }
else if (mainEff == 0.) {
446 eff2dHist->SetBinContent(binx + 1, biny + 1, 0.);
447 errHist->SetBinContent(binx + 1, biny + 1, 0.);
453 eff2dVal = mainEff / refEff;
455 sigmaR = eff2dVal *
sqrt(pow(mainErr / mainEff, 2) + pow(refErr / refEff, 2));
463 sigmaR = pow(pow(mainErr, 2) + pow(refErr, 2), 0.5);
464 eff2dVal = (mainEff - refEff);
466 Z = eff2dVal / sigmaR;
470 if ((eff2dVal > minVal) and (eff2dVal < maxVal)) {
472 eff2dHist->SetBinContent(binx + 1, biny + 1, eff2dVal);
473 }
else if (eff2dVal > maxVal) {
475 eff2dHist->SetBinContent(binx + 1, biny + 1, maxVal);
476 }
else if (eff2dVal < minVal) {
478 eff2dHist->SetBinContent(binx + 1, biny + 1, minVal);
487 errHist->SetBinContent(binx + 1, biny + 1, sigmaR);
491 errHist->SetBinContent(binx + 1, biny + 1, sigmaR);
495 errHist->SetBinContent(binx + 1, biny + 1, sigmaR);
512 if ((pvcount - layercount) > (
int) layerLimit) {
515 if (layercount > (
int) layerLimit) {
519 eff2dHist->SetMinimum(minVal);
520 eff2dHist->SetMaximum(maxVal);
523 eff2dHist->Draw(
"COLZ");
524 errHist->Draw(
"TEXT SAME");
527 }
else if (setAlarm) {
529 }
else if (setWarn) {
534 eff2dCanv->Modified();
541 TH1* daqInclusion =
findHist(
"KLM/daq_inclusion");
542 if (not(daqInclusion == NULL)) {
543 int isKlmIncluded = daqInclusion->GetBinContent(daqInclusion->GetXaxis()->FindBin(
"Yes"));
544 if (isKlmIncluded == 0)
564 if ((all_ext_bklm ==
nullptr || matched_hits_bklm ==
nullptr) && (
m_IsPhysicsRun)) {
565 B2INFO(
"Histograms needed for BKLM plane efficiency computation are not found");
568 if ((all_ext_eklm ==
nullptr || matched_hits_eklm ==
nullptr) && (
m_IsPhysicsRun)) {
569 B2INFO(
"Histograms needed for EKLM plane efficiency computation are not found");
571 if ((all_ext_bklm_sector ==
nullptr || matched_hits_bklm_sector ==
nullptr) && (
m_IsPhysicsRun)) {
572 B2INFO(
"Histograms needed for BKLM sector efficiency computation are not found");
574 if ((all_ext_eklm_sector ==
nullptr || matched_hits_eklm_sector ==
nullptr) && (
m_IsPhysicsRun)) {
575 B2INFO(
"Histograms needed for EKLM sector efficiency computation are not found");
599 B2DEBUG(20,
"DQMHistAnalysisKLM2: Updating EPICS PVs");
603 B2INFO(
"DQMHistAnalysisKLM2: Null run detected. No PV Update.");
606 auto* daqDataSize =
findHist(
"DAQ/KLMDataSize");
607 double meanDAQDataSize = 0.;
608 if (daqDataSize !=
nullptr) {
609 meanDAQDataSize = daqDataSize->GetMean();
610 B2INFO(
"DAQ/KLMDataSize's mean is " << meanDAQDataSize);
612 B2WARNING(
"DQMHistAnalysisKLM2: Cannot find KLMDataSize");
613 if ((daqDataSize !=
nullptr) and (meanDAQDataSize != 0.)) {
624 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.
double m_stopThr
efficiency ratio (run-)stop threshold
TCanvas * m_c_eff2d_bklm
BKLM efficiencies ratio canvas.
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.
double m_minEntries
Minimal number of entries for delta histogram and PV update.
double m_alarmThr
efficiency ratio alarm threshold
double m_zEffThreshold
efficiency threshold for z-score calculation
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
MonitoringObject * m_monObj
Monitoring object.
TH1 * m_ref_efficiencies_eklm
ELM efficiencies reference histogram.
double m_errorThreshold
uncertainty threshold for low statistics
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.
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.
double m_BKLMLayerAlarm
alarm limits from inefficient BKLM layers PV
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.
double m_zThreshold
z-score threshold for inefficient layers
bool m_ratio
show efficiency ratio or difference
double m_EKLMLayerAlarm
alarm limits from inefficient EKLM layers PV
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.
double m_warnThr
efficiency ratio warning threshold
DQMHistAnalysisKLM2Module()
Constructor.
static 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).
int registerEpicsPV(const std::string &pvname, const std::string &keyname="")
EPICS related Functions.
static MonitoringObject * getMonitoringObject(const std::string &name)
Get MonitoringObject with given name (new object is created if non-existing)
static void addDeltaPar(const std::string &dirname, const std::string &histname, HistDelta::EDeltaType t, int p, unsigned int a=1)
Add Delta histogram parameters.
static 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 void UpdateCanvas(const std::string &name, bool updated=true)
Mark canvas as updated (or not)
static const std::string & getRunType(void)
Get the list of the reference histograms.
TH1 * getDelta(const std::string &fullname, int n=0, bool onlyIfUpdated=true)
Get Delta histogram.
DQMHistAnalysisModule()
Constructor / Destructor.
@ 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.
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.
static constexpr int getMaximalLayerGlobalNumber()
Get maximal 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 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.