14 #include <dqm/analysis/modules/DQMHistAnalysisEventT0.h>
33 DQMHistAnalysisEventT0Module::DQMHistAnalysisEventT0Module()
36 setDescription(
"Determining and processing EventT0s from different subdetector (TOP and SVD for now) for different L1 trigger sources (ECL and CDC for now) to estimate trigger jitter information.");
40 addParam(
"prefixCanvas",
m_prefixCanvas,
"Prefix to be added to canvas filename when saved as pdf.", std::string(
"c"));
52 m_cTOPTimeForECLTRG =
new TCanvas(
"EventT0/c_TOPTimeECLTRGjitter",
"ECLTRG jitter based on TOP time", 1200, 400);
53 m_topPad1ECLTRG =
new TPad(
"topPad1ECLTRG",
"TOP pad1 ECLTRG", 0.03, 0.02, 0.33, 0.98);
54 m_topPad2ECLTRG =
new TPad(
"topPad2ECLTRG",
"TOP pad2 ECLTRG", 0.35, 0.02, 0.65, 0.98);
55 m_topPad3ECLTRG =
new TPad(
"topPad3ECLTRG",
"TOP pad3 ECLTRG", 0.67, 0.02, 0.97, 0.98);
58 m_cTOPTimeForCDCTRG =
new TCanvas(
"EventT0/c_TOPTimeCDCTRGjitter",
"CDCTRG jitter based on TOP time", 1200, 400);
59 m_topPad1CDCTRG =
new TPad(
"topPad1CDCTRG",
"TOP pad1 CDCTRG", 0.03, 0.02, 0.33, 0.98);
60 m_topPad2CDCTRG =
new TPad(
"topPad2CDCTRG",
"TOP pad2 CDCTRG", 0.35, 0.02, 0.65, 0.98);
61 m_topPad3CDCTRG =
new TPad(
"topPad3CDCTRG",
"TOP pad3 CDCTRG", 0.67, 0.02, 0.97, 0.98);
65 m_cSVDTimeForECLTRG =
new TCanvas(
"EventT0/c_SVDTimeECLTRGjitter",
"ECLTRG jitter based on SVD time", 1200, 400);
66 m_svdPad1ECLTRG =
new TPad(
"svdPad1ECLTRG",
"SVD pad1 ECLTRG", 0.03, 0.02, 0.33, 0.98);
67 m_svdPad2ECLTRG =
new TPad(
"svdPad2ECLTRG",
"SVD pad2 ECLTRG", 0.35, 0.02, 0.65, 0.98);
68 m_svdPad3ECLTRG =
new TPad(
"svdPad3ECLTRG",
"SVD pad3 ECLTRG", 0.67, 0.02, 0.97, 0.98);
71 m_cSVDTimeForCDCTRG =
new TCanvas(
"EventT0/c_SVDTimeCDCTRGjitter",
"CDCTRG jitter based on SVD time", 1200, 400);
72 m_svdPad1CDCTRG =
new TPad(
"svdPad1CDCTRG",
"SVD pad1 CDCTRG", 0.03, 0.02, 0.33, 0.98);
73 m_svdPad2CDCTRG =
new TPad(
"svdPad2CDCTRG",
"SVD pad2 CDCTRG", 0.35, 0.02, 0.65, 0.98);
74 m_svdPad3CDCTRG =
new TPad(
"svdPad3CDCTRG",
"SVD pad3 CDCTRG", 0.67, 0.02, 0.97, 0.98);
97 TH1* h =
findHist(
"EventT0DQMdir/m_histEventT0_TOP_hadron_L1_ECLTRG");
98 TString tag =
"hadronECLTRG";
105 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
111 h =
findHist(
"EventT0DQMdir/m_histEventT0_TOP_bhabha_L1_ECLTRG");
112 tag =
"bhabhaECLTRG";
119 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
125 h =
findHist(
"EventT0DQMdir/m_histEventT0_TOP_mumu_L1_ECLTRG");
133 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
150 h =
findHist(
"EventT0DQMdir/m_histEventT0_TOP_hadron_L1_CDCTRG");
151 tag =
"hadronCDCTRG";
160 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
168 h =
findHist(
"EventT0DQMdir/m_histEventT0_TOP_bhabha_L1_CDCTRG");
169 tag =
"bhabhaCDCTRG";
178 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
186 h =
findHist(
"EventT0DQMdir/m_histEventT0_TOP_mumu_L1_CDCTRG");
194 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
212 h =
findHist(
"EventT0DQMdir/m_histEventT0_SVD_hadron_L1_ECLTRG");
213 tag =
"hadronECLTRG";
220 B2WARNING(Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
226 h =
findHist(
"EventT0DQMdir/m_histEventT0_SVD_bhabha_L1_ECLTRG");
227 tag =
"bhabhaECLTRG";
234 B2WARNING(Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
240 h =
findHist(
"EventT0DQMdir/m_histEventT0_SVD_mumu_L1_ECLTRG");
248 B2WARNING(Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
265 h =
findHist(
"EventT0DQMdir/m_histEventT0_SVD_hadron_L1_CDCTRG");
266 tag =
"hadronCDCTRG";
275 B2WARNING(Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
283 h =
findHist(
"EventT0DQMdir/m_histEventT0_SVD_bhabha_L1_CDCTRG");
284 tag =
"bhabhaCDCTRG";
293 B2WARNING(Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
302 h =
findHist(
"EventT0DQMdir/m_histEventT0_SVD_mumu_L1_CDCTRG");
310 B2WARNING(Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
338 double frac = par[1];
339 double mean = par[2];
340 double sigma = par[3];
341 double mean2 = par[4];
342 double sigma2 = par[5];
344 return N * frac * TMath::Gaus(x[0], mean, sigma) + N * (1 - frac) * TMath::Gaus(x[0], mean2, sigma2);
351 B2DEBUG(20,
"h == nullptr");
359 auto nValidEntries = h->GetEntries() - h->GetBinContent(0) - h->GetBinContent(h->GetNbinsX() + 1);
361 B2DEBUG(20,
"not enough entries");
368 h->Scale(1. / nValidEntries);
369 h->GetXaxis()->SetRangeUser(-50, 50);
373 fitf.SetParNames(
"N",
"f_{1}",
"#mu_{1}",
"#sigma_{1}",
"#mu_{2}",
"#sigma_{2}");
374 fitf.SetParameters(0.1, 0.8, 0, 5, 0, 15);
375 fitf.SetParLimits(1, 0, 1);
376 fitf.SetParLimits(3, 0, 100);
377 fitf.SetParLimits(5, 0, 100);
379 if (h->Fit(&fitf,
"SR+") != 0) {
380 B2DEBUG(20,
"failed fit");
386 fitf.GetParameters(&par[0]);
388 for (
int i = 0; i < 6; i++)
389 parErr[i] = fitf.GetParError(i) ;
393 TF1 gauss1(
"gauss1",
"gaus", -100, 100);
394 TF1 gauss2(
"gauss2",
"gaus", -100, 100);
396 gauss1.SetLineColor(kBlue);
397 gauss1.SetLineStyle(kDashed);
398 gauss1.SetParameters(par[0]*par[1], par[2], par[3]);
400 gauss2.SetLineColor(kRed);
401 gauss2.SetLineStyle(kDashed);
402 gauss2.SetParameters(par[0] * (1 - par[1]), par[4], par[5]);
405 m_monObj->
setVariable(Form(
"N_%s", tag.Data()), nValidEntries, TMath::Sqrt(nValidEntries));
413 gStyle->SetOptFit(1111);
416 fitf.DrawClone(
"same");
417 gauss1.DrawClone(
"same");
418 gauss2.DrawClone(
"same");
TCanvas * m_cTOPTimeForECLTRG
TOP EventT0 for ECLTRG plots canvas.
TCanvas * m_cSVDTimeForECLTRG
SVD EventT0 for ECLTRG plots canvas.
void initialize() override final
create TCanvas and MonitoringObject
static double fDoubleGaus(double *x, double *par)
double gaussian fitting function for the jitter distribution
TPad * m_svdPad1CDCTRG
pad for SVD time CDCTRG hadrons
TPad * m_svdPad3CDCTRG
pad for SVD time CDCTRG mumu
std::string m_prefixCanvas
prefix to be added to canvas name when saved as pdf
TPad * m_svdPad2ECLTRG
pad for SVD time ECLTRG bhabhas
MonitoringObject * m_monObj
MonitoringObject to be produced by this module.
void terminate() override final
delete pointers
bool m_printCanvas
if true print the pdf of the canvases
TPad * m_svdPad2CDCTRG
pad for SVD time CDCTRG bhabhas
TPad * m_topPad1CDCTRG
pad for TOP time CDCTRG hadrons
uint m_nEntriesMin
minimum number of entries to process the histogram
void endRun() override final
fit the histograms
TPad * m_topPad3CDCTRG
pad for TOP time CDCTRG mumu
TPad * m_svdPad1ECLTRG
pad for SVD time ECLTRG hadrons
bool processHistogram(TH1 *h, TString tag)
process the EventT0 distribution fitting with two gaussians filling the MonitoringObject
void beginRun() override final
clear TCanvas
TPad * m_topPad2CDCTRG
pad for TOP time CDCTRG bhabhas
TPad * m_topPad3ECLTRG
pad for TOP time ECLTRG mumu
TPad * m_topPad2ECLTRG
pad for TOP time ECLTRG bhabhas
TCanvas * m_cTOPTimeForCDCTRG
TOP EventT0 for CDCTRG plots canvas.
TCanvas * m_cSVDTimeForCDCTRG
SVD EventT0 for CDCTRG plots canvas.
TPad * m_topPad1ECLTRG
pad for TOP time ECLTRG hadrons
~DQMHistAnalysisEventT0Module()
Destructor.
TPad * m_svdPad3ECLTRG
pad for SVD time ECLTRG mumu
The base class for the histogram analysis module.
static TH1 * findHist(const std::string &histname, bool onlyIfUpdated=false)
Get histogram from list (no other search).
static MonitoringObject * getMonitoringObject(const std::string &histname)
Get MonitoringObject with given name (new object is created if non-existing)
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 addCanvas(TCanvas *canv)
Add Canvas to monitoring object.
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.