14 #include <dqm/analysis/modules/DQMHistAnalysisEventT0.h>
19 #include <TFitResult.h>
40 addParam(
"min_nEntries", m_nEntriesMin,
"minimum numeber of entries to process the histogram", m_nEntriesMin);
41 addParam(
"prefixCanvas", m_prefixCanvas,
"prefix to be added to canvas filename when saved as pdf", std::string(
"c"));
42 addParam(
"printCanvas", m_printCanvas,
"if True prints pdf of the analysis canvas",
bool(
false));
46 DQMHistAnalysisEventT0Module::~DQMHistAnalysisEventT0Module() { }
48 void DQMHistAnalysisEventT0Module::initialize()
53 m_cECLTRG =
new TCanvas(
"EventT0/c_ECLTRGjitter",
"ECLTRG jitter", 1200, 400);
54 m_pad1ECLTRG =
new TPad(
"pad1ECLTRG",
"pad1 ECLTRG", 0.03, 0.02, 0.33, 0.98);
55 m_pad2ECLTRG =
new TPad(
"pad2ECLTRG",
"pad2 ECLTRG", 0.35, 0.02, 0.65, 0.98);
56 m_pad3ECLTRG =
new TPad(
"pad3ECLTRG",
"pad3 ECLTRG", 0.67, 0.02, 0.97, 0.98);
59 m_cCDCTRG =
new TCanvas(
"EventT0/c_CDCTRGjitter",
"CDCTRG jitter", 1200, 400);
60 m_pad1CDCTRG =
new TPad(
"pad1CDCTRG",
"pad1 CDCTRG", 0.03, 0.02, 0.33, 0.98);
61 m_pad2CDCTRG =
new TPad(
"pad2CDCTRG",
"pad2 CDCTRG", 0.35, 0.02, 0.65, 0.98);
62 m_pad3CDCTRG =
new TPad(
"pad3CDCTRG",
"pad3 CDCTRG", 0.67, 0.02, 0.97, 0.98);
64 m_monObj = getMonitoringObject(
"eventT0");
65 m_monObj->addCanvas(m_cECLTRG);
66 m_monObj->addCanvas(m_cCDCTRG);
70 void DQMHistAnalysisEventT0Module::beginRun()
76 void DQMHistAnalysisEventT0Module::endRun()
83 TH1* h = findHist(
"EventT0DQMdir/m_histEventT0_TOP_hadron_L1_ECLTRG");
84 TString tag =
"hadronECLTRG";
86 if (processHistogram(h, tag)) {
87 m_pad1ECLTRG->SetFillColor(0);
88 m_pad1ECLTRG->Modified();
89 m_pad1ECLTRG->Update();
90 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
92 m_pad1ECLTRG->SetFillColor(kGray);
96 h = findHist(
"EventT0DQMdir/m_histEventT0_TOP_bhabha_L1_ECLTRG");
99 if (processHistogram(h, tag)) {
100 m_pad2ECLTRG->SetFillColor(0);
101 m_pad2ECLTRG->Modified();
102 m_pad2ECLTRG->Update();
104 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
106 m_pad2ECLTRG->SetFillColor(kGray);
111 h = findHist(
"EventT0DQMdir/m_histEventT0_TOP_mumu_L1_ECLTRG");
114 if (processHistogram(h, tag)) {
115 m_pad3ECLTRG->SetFillColor(0);
116 m_pad3ECLTRG->Modified();
117 m_pad3ECLTRG->Update();
119 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
121 m_pad3ECLTRG->SetFillColor(kGray);
125 m_pad1ECLTRG->Draw();
126 m_pad2ECLTRG->Draw();
127 m_pad3ECLTRG->Draw();
130 m_cECLTRG->Print(Form(
"%s_ECLTRG.pdf", m_prefixCanvas.c_str()));
136 h = findHist(
"EventT0DQMdir/m_histEventT0_TOP_hadron_L1_CDCTRG");
137 tag =
"hadronCDCTRG";
139 if (processHistogram(h, tag)) {
140 m_pad1CDCTRG->SetFillColor(0);
141 m_pad1CDCTRG->Modified();
142 m_pad1CDCTRG->Update();
144 m_pad1CDCTRG->Draw();
146 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
148 m_pad1CDCTRG->SetFillColor(kGray);
150 m_pad1CDCTRG->Draw();
154 h = findHist(
"EventT0DQMdir/m_histEventT0_TOP_bhabha_L1_CDCTRG");
155 tag =
"bhabhaCDCTRG";
157 if (processHistogram(h, tag)) {
158 m_pad2CDCTRG->SetFillColor(0);
159 m_pad2CDCTRG->Modified();
160 m_pad2CDCTRG->Update();
162 m_pad2CDCTRG->Draw();
164 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
166 m_pad2CDCTRG->SetFillColor(kGray);
168 m_pad2CDCTRG->Draw();
173 h = findHist(
"EventT0DQMdir/m_histEventT0_TOP_mumu_L1_CDCTRG");
176 if (processHistogram(h, tag)) {
177 m_pad3CDCTRG->SetFillColor(0);
178 m_pad3CDCTRG->Modified();
179 m_pad3CDCTRG->Update();
181 B2WARNING(Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
183 m_pad3CDCTRG->SetFillColor(kGray);
187 m_pad1CDCTRG->Draw();
188 m_pad2CDCTRG->Draw();
189 m_pad3CDCTRG->Draw();
192 m_cCDCTRG->Print(Form(
"%s_CDCTRG.pdf", m_prefixCanvas.c_str()));
197 void DQMHistAnalysisEventT0Module::terminate()
206 double DQMHistAnalysisEventT0Module::fDoubleGaus(
double* x,
double* par)
209 double frac = par[1];
210 double mean = par[2];
211 double sigma = par[3];
212 double mean2 = par[4];
213 double sigma2 = par[5];
215 return N * frac * TMath::Gaus(x[0], mean, sigma) + N * (1 - frac) * TMath::Gaus(x[0], mean2, sigma2);
218 bool DQMHistAnalysisEventT0Module::processHistogram(TH1* h, TString tag)
222 B2DEBUG(20,
"h == nullptr");
223 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
227 int nToFit = h->GetEntries();
228 if (nToFit < m_nEntriesMin) {
229 B2DEBUG(20,
"not enough entries");
230 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
236 h->Scale(1. / h->GetEntries());
237 h->GetXaxis()->SetRangeUser(-50, 50);
240 TF1 fitf(
"fit", DQMHistAnalysisEventT0Module::fDoubleGaus, -50, 50, 6);
241 fitf.SetParNames(
"N",
"f_{1}",
"#mu_{1}",
"#sigma_{1}",
"#mu_{2}",
"#sigma_{2}");
242 fitf.SetParameters(0.1, 0.8, 0, 5, 0, 15);
243 fitf.SetParLimits(1, 0, 1);
244 fitf.SetParLimits(3, 0, 100);
245 fitf.SetParLimits(5, 0, 100);
247 if (h->Fit(&fitf,
"SR+") != 0) {
248 B2DEBUG(20,
"failed fit");
249 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
254 fitf.GetParameters(&par[0]);
256 for (
int i = 0; i < 6; i++)
257 parErr[i] = fitf.GetParError(i) ;
261 TF1 gauss1(
"gauss1",
"gaus", -100, 100);
262 TF1 gauss2(
"gauss2",
"gaus", -100, 100);
264 gauss1.SetLineColor(kBlue);
265 gauss1.SetLineStyle(kDashed);
266 gauss1.SetParameters(par[0]*par[1], par[2], par[3]);
268 gauss2.SetLineColor(kBlue);
269 gauss2.SetLineStyle(kDashed);
270 gauss2.SetParameters(par[0] * (1 - par[1]), par[4], par[5]);
272 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 1);
273 m_monObj->setVariable(Form(
"N_%s", tag.Data()), h->GetEntries(), TMath::Sqrt(h->GetEntries()));
274 m_monObj->setVariable(Form(
"f_%s", tag.Data()), par[1], parErr[1]);
275 m_monObj->setVariable(Form(
"mean1_%s", tag.Data()), par[2], parErr[2]);
276 m_monObj->setVariable(Form(
"sigma1_%s", tag.Data()), par[3], parErr[3]);
277 m_monObj->setVariable(Form(
"mean2_%s", tag.Data()), par[4], parErr[4]);
278 m_monObj->setVariable(Form(
"sigma2_%s", tag.Data()), par[5], parErr[5]);
281 gStyle->SetOptFit(1111);
284 fitf.DrawClone(
"same");
285 gauss1.DrawClone(
"same");
286 gauss2.DrawClone(
"same");
Class definition for the output module of Sequential ROOT I/O.
The base class for the histogram analysis module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.