9#include <dqm/analysis/modules/DQMHistAnalysisCDCEpics.h>
28 addParam(
"RefFilePhi",
m_refNamePhi,
"Reference histogram file name", std::string(
"CDCDQM_PhiRef.root"));
29 addParam(
"RefDirectory",
m_refDir,
"Reference histogram dir", std::string(
"ref/CDC/default"));
31 for (
int i = 0; i < 300; i++) {
35 B2DEBUG(20,
"DQMHistAnalysisCDCEpics: Constructor done.");
46 c_hist_adc =
new TCanvas(
"CDC/c_hist_adc",
"c_hist_adc", 500, 400);
47 m_hist_adc =
new TH1F(
"CDC/hist_adc",
"m_hist_adc", 300, 0, 300);
48 m_hist_adc->SetTitle(
"ADC Medians; CDC board index; ADC medians");
50 c_hist_tdc =
new TCanvas(
"CDC/c_hist_tdc",
"c_hist_tdc", 500, 400);
51 m_hist_tdc =
new TH1F(
"CDC/hist_tdc",
"m_hist_tdc", 300, 0, 300);
52 m_hist_tdc->SetTitle(
"TDC Medians; CDC board index; TDC medians");
55 c_hist_skimphi =
new TCanvas(
"CDC/c_hist_skimphi",
"c_hist_skimphi", 1600, 800);
57 c_hist_crphi =
new TCanvas(
"CDC/c_hist_crphi",
"c_hist_crphi", 500, 400);
63 B2INFO(
"DQMHistAnalysisCDCEpics: reference (" <<
m_refNamePhi <<
") found OK");
66 else B2INFO(
"\t ..and (cdcdqm_phiref) also exist");
70 c_hist_effphi =
new TCanvas(
"CDC/c_hist_effphi",
"c_hist_effphi", 500, 400);
71 m_hist_effphi =
new TH1D(
"CDC/hist_effphi",
"m_hist_effphi", 360, -180.0, 180.0);
93 B2DEBUG(20,
"DQMHistAnalysisCDCEpics: initialized.");
129 B2DEBUG(20,
"DQMHistAnalysisCDCEpics: beginRun run called");
140 double sumadcgood = 0;
141 for (
int ic = 0; ic < 300; ++ic) {
142 if (ic == 0)
continue;
144 m_hADCs[ic] = m_delta_adc->ProjectionY(Form(
"hADC%d", ic + 1), ic + 1, ic + 1,
"");
145 m_hADCs[ic]->SetTitle(Form(
"hADC%d", ic));
149 sumadcgood = sumadcgood + md_adc;
153 double adcfrac = cadcgood / 2.99;
158 if (cadcgood > 0)sumadcgood = sumadcgood * 1.0 / cadcgood;
160 m_hist_adc->SetTitle(Form(
"ADC Medians: Bad board count = %d (%0.01f%%)", cadcbad - 1, 100.0 - adcfrac));
173 double sumtdcgood = 0;
174 for (
int ic = 0; ic < 300; ++ic) {
175 if (ic == 0)
continue;
177 m_hTDCs[ic] = m_delta_tdc->ProjectionY(Form(
"hTDC%d", ic + 1), ic + 1, ic + 1,
"");
178 m_hTDCs[ic]->SetTitle(Form(
"hTDC%d", ic));
183 sumtdcgood = sumtdcgood + md_tdc;
187 double tdcfrac = ctdcgood / 2.99;
191 if (ctdcgood > 0)sumtdcgood = sumtdcgood * 1.0 / ctdcgood;
193 m_hist_tdc->SetTitle(Form(
"TDC Medians: Bad board count = %d (%0.01f%%)", ctdcbad - 1, 100.0 - tdcfrac));
205 if (m_delta_skimphi) {
206 TString sip[2] = {
"OffIP",
"IP"};
207 TString sname[4] = {
"all",
"bhabha",
"hadron",
"mumutrk"};
208 for (
int j = 0; j < 2; j++) {
209 for (
int i = 0; i < 4; i++) {
211 TString hname = TString::Format(
"histphi_%s_%sevt", sip[j].Data(), sname[i].Data());
212 m_hist_skimphi[k] = m_delta_skimphi->ProjectionX(hname, k + 1, k + 1,
"");
213 m_hist_skimphi[k]->SetTitle(TString::Format(
"cdc-track #phi (%s, %s-events);#phi;entries", sip[j].Data(), sname[i].Data()));
225 if (m_delta_skimphi) {
227 bool isFew =
false, isAlarm =
false, isWarn =
false;
228 m_hist_crphi = m_delta_skimphi->ProjectionX(
"histphi_ip_hadrons", 7, 7,
"");
229 m_hist_crphi->SetTitle(
"cdc-track #phi (IP + hadrons);cdc-track #phi;norm entries");
233 if (maxnow < 10000) isFew =
true;
239 if (nbinref == nbinnow) {
242 double maxphidiff = 0;
243 double maxphidiff_angle = 0;
244 for (
int iphi = 0; iphi < nbinnow; iphi++) {
247 double phidiff = fabs(icnow - icref);
250 if (phidiff > maxphidiff) {
251 maxphidiff = phidiff;
255 m_hist_crphi->SetTitle(Form(
"%s (diff = %0.03f at %0.1f)",
m_hist_crphi->GetTitle(), maxphidiff, maxphidiff_angle));
276 if (m_delta_effphi) {
278 const int all_phibins = m_delta_effphi->GetNbinsX();
279 const int all_hitbins = m_delta_effphi->GetNbinsY();
280 const int thr_hitbin = m_delta_effphi->GetYaxis()->FindBin(20);
281 for (
int iphi = 0; iphi < all_phibins; iphi++) {
282 TH1D* temp = (TH1D*)m_delta_effphi->ProjectionY(Form(
"hhits_bin_%d", iphi + 1), iphi + 1, iphi + 1,
"");
283 Double_t num = temp->Integral(thr_hitbin, all_hitbins);
284 Double_t den = temp->Integral();
285 if (den > 0)eff = num * 100.0 / den;
290 m_hist_effphi->SetTitle(
"Tracking efficiency via cdchits (>20/all); cdc-track #phi; efficiency");
300 B2DEBUG(20,
"DQMHistAnalysisCDCEpics: end event");
306 B2DEBUG(20,
"DQMHistAnalysisCDCEpics: end run");
312 TH1D* hist = (TH1D*)h->Clone();
313 hist->SetBinContent(1, 0.0);
315 if (hist->GetMean() != 0) {
317 double quantiles[1] = {0.0};
318 double probSums[1] = {0.5};
319 hist->GetQuantiles(1, quantiles, probSums);
320 median = quantiles[0];
329 B2DEBUG(20,
"DQMHistAnalysisCDCEpics: terminate called");
TCanvas * c_hist_adc
canvas for adc board median
std::string m_refDir
reference histogram dir of CDC DQMs
void initialize() override final
Initialize the Module.
double m_minadc
min adc median thershold accepted
TH1D * m_hist_crphi
for above
TH1D * m_hist_skimphi[8]
for above
TLine * m_line_hadc
line for higher ADC window
int m_minevt
min events for single intra-run point
TCanvas * c_hist_effphi
canvas for tracking efficiency
std::string m_histoADC
ADC histogram names of CDC DQMs.
std::string m_histoDir
histogram dir of CDC DQMs
std::string m_histoTDC
TDC histogram names of CDC DQMs.
~DQMHistAnalysisCDCEpicsModule()
Destructor.
double m_phiwarn
warn thershold for phi differences
std::string m_refNamePhi
reference histogram of phi
TFile * m_fileRefPhi
reference histogram file point
TLine * m_line_htdc
line for higher TDC window
double m_phialarm
alram thershold for phi differences
double m_maxadc
max adc median thershold accepted
TH1F * m_hist_adc
for above
TH1D * m_hTDCs[300]
TDC histograms with track associated hits for each board (0-299)
TH2F * m_histref_phiindex
for above
std::string m_pvPrefix
Prefix of PVs.
double m_maxtdc
max tdc median thershold accepted
TH1F * m_hist_tdc
for above
void getHistStyle(TH1F *&htemp, std::string label, double max) const
get histogram styles
TCanvas * c_hist_crphi
canvas for control shifter phi
void terminate() override final
Termination action.
void event() override final
intra-run actions (EPICC PVs).
std::string m_histoPhiEff
Phi Eff histogram names of CDC DQMs.
TCanvas * c_hist_tdc
canvas for tdc board median
TH1D * m_hADCs[300]
ADC histograms with track associated hits for each board (0-299)
TCanvas * c_hist_skimphi
canvas for various phi distribution
TH1D * m_hist_effphi
for above
void endRun() override final
End-of-run action.
TH1D * m_hist_refphi
for above
std::string m_histoPhiIndex
Phi Inedx histogram names of CDC DQMs.
TLine * m_line_ltdc
line for lower TDC window
TLine * m_line_ladc
line for lower ADC window
void beginRun() override final
Called when entering a new run.
float getHistMedian(TH1D *h) const
Get median of given histogram.
DQMHistAnalysisCDCEpicsModule()
Constructor.
double m_mintdc
min tdc median thershold accepted
The base class for the histogram analysis module.
bool hasDeltaPar(const std::string &dirname, const std::string &histname)
Check if Delta histogram parameters exist for histogram.
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.
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.
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.
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.