9 #include <dqm/analysis/modules/DQMHistAnalysisCDCDedx.h>
22 B2DEBUG(20,
"DQMHistAnalysisCDCDedx: Constructor done.");
23 addParam(
"mmode", mmode,
"default monitoring mode is basic", std::string(
"basic"));
27 DQMHistAnalysisCDCDedxModule::~DQMHistAnalysisCDCDedxModule()
33 void DQMHistAnalysisCDCDedxModule::initialize()
36 gStyle->SetOptStat(0);
39 B2DEBUG(20,
"DQMHistAnalysisCDCDedx: initialized.");
42 c_ir_dedx =
new TCanvas(
"CDCDedx/c_ir_dedx",
"", 1400, 500);
45 c_pr_dedx =
new TCanvas(
"CDCDedx/c_CDCdedxMean",
"", 800, 800);
47 f_gaus =
new TF1(
"f_gaus",
"gaus", 0.0, 2.5);
48 f_gaus->SetLineColor(kRed);
51 l_line->SetLineColor(kRed);
52 l_line->SetLineStyle(1);
53 l_line->SetLineWidth(2);
56 m_monObj = getMonitoringObject(
"cdcdedx");
57 m_monObj->addCanvas(c_ir_dedx);
58 m_monObj->addCanvas(c_pr_dedx);
64 void DQMHistAnalysisCDCDedxModule::beginRun()
66 B2DEBUG(20,
"DQMHistAnalysisCDCDedx: beginRun called.");
71 void DQMHistAnalysisCDCDedxModule::event()
74 B2DEBUG(20,
"DQMHistAnalysisCDCDedx: event called.");
81 if (mmode !=
"basic") {
82 c_pr_dedx->SetWindowSize(1400, 800);
83 c_pr_dedx->Divide(3, 2);
85 c_pr_dedx->SetWindowSize(1000, 800);
86 c_pr_dedx->Divide(2, 2);
97 c_pr_dedx->Modified();
103 if (mmode !=
"basic") {
104 c_ir_dedx->SetWindowSize(1400, 400);
105 c_ir_dedx->Divide(3, 1);
107 c_ir_dedx->SetWindowSize(900, 400);
108 c_ir_dedx->Divide(2, 1);
111 c_ir_dedx->Modified();
115 if (mmode !=
"basic")drawWireStatus();
120 void DQMHistAnalysisCDCDedxModule::endRun()
122 B2DEBUG(20,
"DQMHistAnalysisCDCDedx : endRun called");
126 void DQMHistAnalysisCDCDedxModule::terminate()
129 B2DEBUG(20,
"DQMHistAnalysisCDCDedx : terminate called");
137 void DQMHistAnalysisCDCDedxModule::getMetadata()
140 TH1D* h_Meta = (TH1D*)findHist(
"CDCDedx/hMeta");
142 if (h_Meta !=
nullptr) {
143 m_nallevt = int(h_Meta->GetBinContent(1));
144 m_nbhabhaevt = int(h_Meta->GetBinContent(2));
145 m_nhadevt = int(h_Meta->GetBinContent(3));
147 std::string m_title = h_Meta->GetTitle();
149 first = m_title.find(
"Exp:");
150 last = m_title.find(
", Run:");
151 std::string expN = m_title.substr(first + 4, last - first - 4);
153 first = m_title.find(
", Run:");
154 last = m_title.find(
", RG:");
155 std::string runN = m_title.substr(first + 6, last - first - 6);
157 first = m_title.find(
", RG:");
158 last = m_title.find(
")");
159 std::string runGain = m_title.substr(first + 5, last - first - 5);
161 m_exp = std::stoi(expN.c_str());
162 m_run = std::stoi(runN.c_str());
163 m_dbrg = std::stof(runGain.c_str());
169 void DQMHistAnalysisCDCDedxModule::drawDedxPR()
175 TH1* h_dEdx = findHist(
"CDCDedx/hdEdx");
176 if (h_dEdx !=
nullptr) {
178 double m_meanerr = 0.0;
179 double m_sigmaerr = 0.0;
184 m_status =
"LowStats";
186 TH1D* h_dEdxClone = (TH1D*)h_dEdx->Clone(
"hdEdx_clone");
187 if (h_dEdxClone !=
nullptr && h_dEdxClone->Integral() > 250) {
188 fitHistogram(h_dEdxClone, m_status);
189 if (m_status ==
"OK") {
190 m_mean = h_dEdxClone->GetFunction(
"f_gaus")->GetParameter(1);
191 m_sigma = h_dEdxClone->GetFunction(
"f_gaus")->GetParameter(2);
192 m_meanerr = h_dEdxClone->GetFunction(
"f_gaus")->GetParError(1);
193 m_sigmaerr = h_dEdxClone->GetFunction(
"f_gaus")->GetParError(2);
197 m_monObj->setVariable(
"CDCDedxMean", m_mean);
198 m_monObj->setVariable(
"CDCDedxReso", m_sigma);
199 m_monObj->setVariable(
"CDCDedxMeanErr", m_meanerr);
200 m_monObj->setVariable(
"CDCDedxResoErr", m_sigmaerr);
202 set_Hist_Style(h_dEdxClone);
203 h_dEdxClone->SetTitle(
"CDC-dEdx");
204 h_dEdxClone->DrawCopy(
"");
207 l_line->DrawLine(m_mean, 0, m_mean, h_dEdxClone->GetMaximum());
209 TF1* f_gausC = (TF1*)f_gaus->Clone(
"f_gausC");
210 f_gausC->SetLineColor(kRed);
211 f_gausC->DrawClone(
"same");
214 TPaveText* pinfo0 =
new TPaveText(0.12, 0.69, 0.37, 0.89,
"NBNDC");
215 set_Text_Style(pinfo0);
216 pinfo0->AddText(Form(
"CDC dE/dx (e^{-}e^{+})"));
217 pinfo0->AddText(Form(
"Exp/Run: %d/%d", m_exp, m_run));
218 pinfo0->AddText(Form(
"-------------"));
219 pinfo0->AddText(Form(
"Fit Status: %s", m_status.data()));
220 pinfo0->AddText(Form(
"Fit #mu^{dE/dx}: %0.3f ", m_mean));
221 pinfo0->AddText(Form(
"Fit #sigma^{dE/dx}: %0.3f ", m_sigma));
222 pinfo0->SetTextColor(kRed);
223 pinfo0->Draw(
"same");
226 TPaveText* pinfo1 =
new TPaveText(0.60, 0.77, 0.85, 0.89,
"NBNDC");
227 set_Text_Style(pinfo1);
228 pinfo1->AddText(Form(
"-- Expert info"));
229 pinfo1->AddText(Form(
"Prev Gain: %0.03f", m_dbrg));
230 if (m_nbhabhaevt > 1e5)
231 pinfo1->AddText(Form(
"Events: %0.02fM",
double(m_nbhabhaevt / 1e6)));
232 if (m_nbhabhaevt > 1e3)
233 pinfo1->AddText(Form(
"Events: %0.02fK",
double(m_nbhabhaevt / 1e3)));
235 pinfo1->AddText(Form(
"Events: %d", m_nbhabhaevt));
236 pinfo1->Draw(
"same");
244 void DQMHistAnalysisCDCDedxModule::drawDedxIR()
248 if (mmode !=
"basic") {
252 TH2D* hdEdxIRScat = (TH2D*)findHist(
"CDCDedx/hdEdxvsEvt");
253 if (hdEdxIRScat !=
nullptr) {
255 set_Pad_Style(0.143, 0.045, 0.077, 0.0);
257 if (hdEdxIRScat->GetEntries() > 0) {
258 hdEdxIRScat->GetXaxis()->SetRange(hdEdxIRScat->FindFirstBinAbove(0, 1), hdEdxIRScat->FindLastBinAbove(0, 1));
261 set_Hist_Style(hdEdxIRScat);
262 hdEdxIRScat->Draw(
"");
263 TPaveText* pinfo =
new TPaveText(0.609, 0.710, 0.942, 0.911,
"NBNDC");
264 set_Text_Style(pinfo);
265 pinfo->AddText(
"CDC-dE/dx Intra-run");
266 pinfo->AddText(
"Electrons (e^{+}e^{-})");
267 pinfo->AddText(Form(
"Exp/Run: %d/%d", m_exp, m_run));
268 if (m_nbhabhaevt > 1e5)
269 pinfo->AddText(Form(
"Events: %0.02fM",
double(m_nbhabhaevt / 1e6)));
270 if (m_nbhabhaevt > 1e3)
271 pinfo->AddText(Form(
"Events: %0.02fK",
double(m_nbhabhaevt / 1e3)));
273 pinfo->AddText(Form(
"Events: %d", m_nbhabhaevt));
280 TH2D* hdEdxIRScatC = (TH2D*)findHist(
"CDCDedx/hdEdxvsEvt");
281 if (hdEdxIRScatC !=
nullptr) {
286 int fbin = hdEdxIRScatC->FindFirstBinAbove(0, 1);
287 int lbin = hdEdxIRScatC->FindLastBinAbove(0, 1);
288 int nbin = lbin - fbin + 1;
290 TH1D* hdEdxIRInd[nbin];
291 for (
int ibin = 0; ibin < nbin; ibin++) {
292 int localbin = ibin + fbin;
293 hdEdxIRInd[ibin] = (TH1D*)hdEdxIRScatC->ProjectionY(Form(
"htemp_%d", localbin), localbin, localbin);
296 if (nbin <= 0)nbin = 1;
297 TH1F* hdEdxIRMean =
new TH1F(
"hdEdxIRMean",
"", nbin, 0.5, nbin + 0.5);
298 TH1F* hdEdxIRSigma =
new TH1F(
"hdEdxIRSigma",
"", nbin, 0.5, nbin + 0.5);
300 for (
int ibin = 0; ibin < nbin; ibin++) {
302 double m_imean = 0.0, m_imeanerr = 0.0;
303 double m_isigma = 0.0, m_isigmaerr = 0.0;
305 fitHistogram(hdEdxIRInd[ibin], m_status);
307 if (m_status ==
"OK") {
308 m_imean = hdEdxIRInd[ibin]->GetFunction(
"f_gaus")->GetParameter(1);
309 m_imeanerr = hdEdxIRInd[ibin]->GetFunction(
"f_gaus")->GetParError(1);
310 m_isigma = hdEdxIRInd[ibin]->GetFunction(
"f_gaus")->GetParameter(2);
311 m_isigmaerr = hdEdxIRInd[ibin]->GetFunction(
"f_gaus")->GetParError(2);
314 hdEdxIRMean->SetBinContent(ibin + 1, m_imean);
315 hdEdxIRMean->SetBinError(ibin + 1, m_imeanerr);
316 hdEdxIRSigma->SetBinContent(ibin + 1, m_isigma);
317 hdEdxIRSigma->SetBinError(ibin + 1, m_isigmaerr);
321 set_Pad_Style(0.143, 0.045, 0.077, 0.0);
322 set_Hist_Style(hdEdxIRMean);
323 hdEdxIRMean->SetMarkerColor(kRed);
324 hdEdxIRMean->SetMarkerStyle(20);
325 hdEdxIRMean->SetMarkerSize(1.10);
326 hdEdxIRMean->GetYaxis()->SetRangeUser(m_mean - 0.10, m_mean + 0.10);
327 hdEdxIRMean->GetYaxis()->SetTitle(
"dE/dx (#mu_{fit})");
328 hdEdxIRMean->GetXaxis()->SetTitle(
"Events(M)");
329 hdEdxIRMean->SetTitle(
"CDC-dE/dx gain(#mu): intra-run variation");
330 hdEdxIRMean->Draw(
"");
332 l_line->DrawLine(0.5, m_mean, hdEdxIRMean->GetXaxis()->GetBinUpEdge(nbin), m_mean);
334 TPaveText* pinfo0 =
new TPaveText(0.609, 0.680, 0.942, 0.911,
"NBNDC");
335 set_Text_Style(pinfo0);
336 pinfo0->AddText(
"Intra-run variation");
337 pinfo0->AddText(
"Electrons (e^{+}e^{-})");
338 pinfo0->AddText(Form(
"Exp/Run: %d/%d", m_exp, m_run));
339 pinfo0->AddText(Form(
"Avg #mu_{fit}: %0.3f", m_mean));
340 if (m_nbhabhaevt > 1e5)
341 pinfo0->AddText(Form(
"Events: %0.02fM",
double(m_nbhabhaevt / 1e6)));
342 if (m_nbhabhaevt > 1e3)
343 pinfo0->AddText(Form(
"Events: %0.02fK",
double(m_nbhabhaevt / 1e3)));
345 pinfo0->AddText(Form(
"Events: %d", m_nbhabhaevt));
346 pinfo0->Draw(
"same");
351 set_Pad_Style(0.143, 0.045, 0.077, 0.0);
352 set_Hist_Style(hdEdxIRSigma);
353 hdEdxIRSigma->SetMarkerColor(kRed);
354 hdEdxIRSigma->SetMarkerStyle(20);
355 hdEdxIRSigma->SetMarkerSize(1.10);
356 hdEdxIRSigma->GetYaxis()->SetRangeUser(m_sigma - 0.04, m_sigma + 0.04);
357 hdEdxIRSigma->GetYaxis()->SetTitle(
"dE/dx (#sigma_{fit})");
358 hdEdxIRSigma->GetXaxis()->SetTitle(
"Events(M)");
359 hdEdxIRSigma->SetTitle(
"CDC-dE/dx reso.(#sigma): intra-run variation");
360 hdEdxIRSigma->Draw(
"");
362 l_line->DrawLine(0.5, m_sigma, hdEdxIRSigma->GetXaxis()->GetBinUpEdge(nbin), m_sigma);
364 TPaveText* pinfo1 =
new TPaveText(0.609, 0.680, 0.942, 0.911,
"NBNDC");
365 set_Text_Style(pinfo1);
366 pinfo1->AddText(
"Intra-run variation");
367 pinfo1->AddText(
"Electrons (e^{+}e^{-})");
368 pinfo1->AddText(Form(
"Exp/Run: %d/%d", m_exp, m_run));
369 pinfo1->AddText(Form(
"Avg #sigma_{fit}: %0.3f", m_sigma));
370 if (m_nbhabhaevt > 1e5)
371 pinfo1->AddText(Form(
"Events: %0.02fM",
double(m_nbhabhaevt / 1e6)));
372 if (m_nbhabhaevt > 1e3)
373 pinfo1->AddText(Form(
"Events: %0.02fK",
double(m_nbhabhaevt / 1e3)));
375 pinfo1->AddText(Form(
"Events: %d", m_nbhabhaevt));
376 pinfo1->Draw(
"same");
379 for (
int ibin = 0; ibin < nbin; ibin++) hdEdxIRInd[ibin]->Reset();
384 void DQMHistAnalysisCDCDedxModule::drawWireStatus()
388 TH2D* hWires = (TH2D*)findHist(
"CDCDedx/hWires");
389 TH2D* hWireStatus = (TH2D*)findHist(
"CDCDedx/hWireStatus");
390 if (hWires !=
nullptr && hWireStatus !=
nullptr) {
393 set_Hist_Style(hWires);
394 hWires->SetMarkerColor(kGray + 1);
397 std::string s_ndead = hWireStatus->GetTitle();
398 int m_ndead = atof(s_ndead.c_str());
399 m_monObj->setVariable(
"CDCDedxDeadWires", m_ndead);
401 set_Hist_Style(hWireStatus);
402 hWireStatus->SetMarkerColor(kRed);
403 hWireStatus->SetMarkerStyle(7);
404 hWireStatus->Draw(
"same");
406 TPaveText* pinfo0 =
new TPaveText(0.117, 0.832, 0.148, 0.976,
"NBNDC");
407 set_Text_Style(pinfo0);
408 pinfo0->AddText(Form(
"CDC Wire Status"));
409 pinfo0->AddText(Form(
"Exp/Run: %d/%d", m_exp, m_run));
410 pinfo0->AddText(Form(
"Dead: %d (%0.02f%%)", m_ndead, (100.0 * m_ndead / 14336.0)));
412 pinfo0->AddText(Form(
"Events: %0.02fM",
double(m_nallevt / 1e6)));
414 pinfo0->AddText(Form(
"Events: %0.02fK",
double(m_nallevt / 1e3)));
416 pinfo0->AddText(Form(
"Events: %d", m_nallevt));
417 pinfo0->Draw(
"same");
422 void DQMHistAnalysisCDCDedxModule::drawBandPlot()
425 TH2D* hdEdxVsP = (TH2D*)findHist(
"CDCDedx/hdEdxVsP");
426 if (hdEdxVsP !=
nullptr) {
433 set_Hist_Style(hdEdxVsP);
434 hdEdxVsP->SetTitle(
"CDC-dEdx band plot");
435 hdEdxVsP->SetMinimum(0.10);
436 hdEdxVsP->Draw(
"col");
438 TPaveText* pinfo0 =
new TPaveText(0.60, 0.77, 0.85, 0.89,
"NBNDC");
439 set_Text_Style(pinfo0);
440 pinfo0->AddText(Form(
"IP tracks (hadron)"));
441 pinfo0->AddText(Form(
"Exp/Run: %d/%d", m_exp, m_run));
443 pinfo0->AddText(Form(
"Events: %0.02fM",
double(m_nhadevt / 1e6)));
445 pinfo0->AddText(Form(
"Events: %0.02fK",
double(m_nhadevt / 1e3)));
447 pinfo0->AddText(Form(
"Events: %d", m_nhadevt));
448 pinfo0->DrawClone(
"same");
454 void DQMHistAnalysisCDCDedxModule::drawDedxCosPhi()
457 TH2D* hdEdxvsPhi = (TH2D*)findHist(
"CDCDedx/hdEdxvsPhi");
458 if (hdEdxvsPhi !=
nullptr) {
462 set_Hist_Style(hdEdxvsPhi);
463 hdEdxvsPhi->SetTitle(
"CDC-dEdx vs Phi");
464 hdEdxvsPhi->Draw(
"col");
466 l_line->DrawLine(-3.20, m_mean, 3.20, m_mean);
468 TPaveText* pinfo0 =
new TPaveText(0.60, 0.77, 0.85, 0.89,
"NBNDC");
469 set_Text_Style(pinfo0);
470 pinfo0->AddText(Form(
"Electrons (e^{+}e^{-})"));
471 pinfo0->AddText(Form(
"Exp/Run: %d/%d", m_exp, m_run));
472 if (m_nbhabhaevt > 1e5)
473 pinfo0->AddText(Form(
"Events: %0.02fM",
double(m_nbhabhaevt / 1e6)));
474 if (m_nbhabhaevt > 1e3)
475 pinfo0->AddText(Form(
"Events: %0.02fK",
double(m_nbhabhaevt / 1e3)));
477 pinfo0->AddText(Form(
"Events: %d", m_nbhabhaevt));
478 pinfo0->DrawClone(
"same");
482 TH2D* hdEdxvsCosth = (TH2D*)findHist(
"CDCDedx/hdEdxvsCosth");
483 if (hdEdxvsCosth !=
nullptr) {
487 set_Hist_Style(hdEdxvsCosth);
488 hdEdxvsCosth->SetTitle(
"CDC-dEdx vs Costh");
489 hdEdxvsCosth->Draw(
"col");
491 l_line->DrawLine(-1.0, m_mean, 1.0, m_mean);
493 TPaveText* pinfo1 =
new TPaveText(0.60, 0.77, 0.85, 0.89,
"NBNDC");
494 set_Text_Style(pinfo1);
495 pinfo1->AddText(Form(
"Electrons (e^{+}e^{-})"));
496 pinfo1->AddText(Form(
"Exp/Run: %d/%d", m_exp, m_run));
497 if (m_nbhabhaevt > 1e5)
498 pinfo1->AddText(Form(
"Events: %0.02fM",
double(m_nbhabhaevt / 1e6)));
499 if (m_nbhabhaevt > 1e3)
500 pinfo1->AddText(Form(
"Events: %0.02fK",
double(m_nbhabhaevt / 1e3)));
502 pinfo1->AddText(Form(
"Events: %d", m_nbhabhaevt));
503 pinfo1->DrawClone(
"same");
509 void DQMHistAnalysisCDCDedxModule::fitHistogram(TH1D*& temphist, std::string& status)
512 if (temphist !=
nullptr) {
513 temphist->GetXaxis()->SetRange(temphist->FindFirstBinAbove(0, 1), temphist->FindLastBinAbove(0, 1));
514 int fs = temphist->Fit(f_gaus,
"QR");
518 double mean = temphist->GetFunction(
"f_gaus")->GetParameter(1);
519 double width = temphist->GetFunction(
"f_gaus")->GetParameter(2);
520 temphist->GetXaxis()->SetRangeUser(mean - 5.0 * width, mean + 5.0 * width);
521 fs = temphist->Fit(f_gaus,
"QR",
"", mean - 3.0 * width, mean + 3.0 * width);
522 if (fs != 0)status =
"Failed";
524 temphist->GetXaxis()->SetRangeUser(mean - 5.0 * width, mean + 5.0 * width);
533 void DQMHistAnalysisCDCDedxModule::set_Plot_Style()
536 const Int_t NRGBs = 6;
537 const Int_t NCont = 255;
538 Double_t stops[NRGBs] = { 0.00, 0.00, 0.34, 0.61, 0.84, 1.00 };
539 Double_t red[NRGBs] = { 0.00, 0.00, 0.00, 0.87, 1.00, 0.51 };
540 Double_t green[NRGBs] = { 0.00, 0.00, 0.81, 1.00, 0.20, 0.00 };
541 Double_t blue[NRGBs] = { 0.00, 0.51, 1.00, 0.12, 0.00, 0.00 };
542 TColor::CreateGradientColorTable(NRGBs, stops, red, green, blue, NCont);
543 gStyle->SetNumberContours(NCont);
549 void DQMHistAnalysisCDCDedxModule::set_Text_Style(TPaveText*& obj)
552 obj->SetFillColor(0);
553 obj->SetFillStyle(0);
555 obj->SetLineColor(TColor::GetColor(
"#000000"));
556 obj->SetLineWidth(0);
557 obj->SetTextAlign(12);
559 obj->SetTextColor(kGray + 3);
560 obj->SetTextFont(82);
561 obj->SetTextSize(0.03157895);
562 obj->SetTextAlign(12);
568 void DQMHistAnalysisCDCDedxModule::set_Hist_Style(TH1* obj)
573 obj->SetFillColor(kYellow);
575 obj->SetTitleOffset(1.15,
"x");
576 obj->SetTitleSize(.040,
"x");
577 obj->SetTitleOffset(1.15,
"y");
578 obj->SetTitleSize(.040,
"y");
580 obj->SetLabelOffset(0.015,
"x");
581 obj->SetLabelSize(.040,
"x");
582 obj->SetLabelOffset(0.015,
"y");
583 obj->SetLabelSize(.040,
"y");
585 obj->SetTickLength(0.03,
"x");
586 obj->SetTickLength(0.02,
"y");
592 void DQMHistAnalysisCDCDedxModule::set_Pad_Style(
double l,
double r,
double t,
double b)
595 if (l != 0)gPad->SetLeftMargin(l);
596 if (r != 0)gPad->SetRightMargin(r);
597 if (t != 0)gPad->SetTopMargin(t);
598 if (b != 0)gPad->SetBottomMargin(b);
DQM analysis module grab canvases from DQM module and perform higher level operation like histogram f...
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.