25 #include <framework/datastore/StoreObjPtr.h>
26 #include <framework/datastore/StoreArray.h>
27 #include <framework/dataobjects/EventMetaData.h>
30 #include <trg/ecl/modules/trgeclQAM/TRGECLQAMModule.h>
40 #include <RooRealVar.h>
41 #include <RooDataHist.h>
42 #include <RooGaussian.h>
43 #include <RooAddModel.h>
45 #include <RooArgList.h>
46 #include <RooNovosibirsk.h>
64 TRGECLQAMModule::version()
const
66 return string(
"TRGECLQAMModule 1.00");
71 TRGECLQAMModule::TRGECLQAMModule()
73 m_nevent(1), m_outputfile(
"")
76 string desc =
"TRGECLQAMModule(" +
version() +
")";
115 B2DEBUG(100,
"TRGECLQAMModule ... created");
123 B2DEBUG(100,
"TRGECLQAMModule ... destructed ");
132 B2DEBUG(100,
"TRGECLQAMModule::initialize ... options");
150 B2DEBUG(200,
"TRGECLQAMModule ... beginRun called ");
160 B2DEBUG(200,
"TRGECLFAMMoudle ... event called");
171 int TCId = (m_TRGECLUnpacker->
getTCId());
175 if (TCId < 1 || TCId > 576 || HitEnergy == 0) {
continue;}
193 const int* clE = m_TRGECLUnpackerEvt->
getCLEnergy();
197 for (
int i = 0; i < 6; i++) {
201 sort(clER, clER + 6);
224 for (
int TCId = 1; TCId < 577; TCId++) {
226 mean_FWD +=
TCID[TCId - 1];
227 }
else if (TCId > 80 && TCId < 513) {
228 mean_BAR +=
TCID[TCId - 1];
229 }
else if (TCId > 512) {
230 mean_BWD +=
TCID[TCId - 1];
234 mean_BAR /= (512 - 80);
235 mean_BWD /= (576 - 512);
237 for (
int TCId = 1; TCId < 577; TCId++) {
239 if (
TCID[TCId - 1] < mean_FWD * 0.1)
m_FWD++;
240 }
else if (TCId > 80 && TCId < 513) {
241 if (
TCID[TCId - 1] < mean_BAR * 0.1)
m_BAR++;
242 }
else if (TCId > 512) {
243 if (
TCID[TCId - 1] < mean_BWD * 0.1)
m_BWD++;
248 const int etot_size =
etot.size();
249 for (
int i = 0; i < etot_size; i++) {
254 RooRealVar* E_tot =
new RooRealVar(
"E_tot",
"E_tot", 0, 4000);
255 RooDataHist* data_E_tot =
new RooDataHist(
"data_E_tot",
"dataset with E_tot", *E_tot,
h_etot);
256 RooRealVar* mean_check =
new RooRealVar(
"mean_check",
"Mean for checking", 2000, 1000, 3000);
257 RooRealVar* sigma_check =
new RooRealVar(
"sigma_check",
"Sigma for checking", 100, 0, 300);
258 RooGaussian* gauss_check =
new RooGaussian(
"gauss_check",
"Gaussian for checking", *E_tot, *mean_check, *sigma_check);
259 gauss_check->fitTo(*data_E_tot);
260 double mean_ch = mean_check->getVal();
262 RooRealVar* mean_E_tot =
new RooRealVar(
"mean_E_tot",
"Mean of Gaussian", mean_ch, mean_ch - 200, mean_ch + 200);
265 RooRealVar* sigma1_E_tot =
new RooRealVar(
"sigma1_E_tot",
"Width of Gaussian", 30, 0, 60);
266 RooGaussian* gauss1_E_tot =
new RooGaussian(
"gauss1_E_tot",
"gauss(x,mean,sigma)", *E_tot, *mean_E_tot, *sigma1_E_tot);
267 RooRealVar* sigma2_E_tot =
new RooRealVar(
"sigma2_E_tot",
"Width of Gaussian", 100, 30, 250);
268 RooGaussian* gauss2_E_tot =
new RooGaussian(
"gauss2_E_tot",
"gauss(x,mean,sigma)", *E_tot, *mean_E_tot, *sigma2_E_tot);
270 RooRealVar* frac_core_E_tot =
new RooRealVar(
"frac_core",
"core fraction", 0.85, 0.0, 1.0);
271 RooAddModel* gaussm_E_tot =
new RooAddModel(
"gaussm",
"core+tail gauss", RooArgList(*gauss1_E_tot, *gauss2_E_tot),
272 RooArgList(*frac_core_E_tot));
276 gaussm_E_tot->fitTo(*data_E_tot, RooFit::Range(mean_ch - 300, mean_ch + 300));
278 RooPlot* xframe_E_tot = E_tot->frame(RooFit::Title(
"energy_tot"));
280 data_E_tot->plotOn(xframe_E_tot, RooFit::MarkerStyle(7));
282 gaussm_E_tot->plotOn(xframe_E_tot, RooFit::Name(
"Cal_energy"), RooFit::LineColor(2));
283 double v_m_E_tot = mean_E_tot->getVal();
284 double e_m_E_tot = mean_E_tot->getError();
286 double v1_s1_E_tot = sigma1_E_tot->getVal();
288 double v2_s1_E_tot = sigma2_E_tot->getVal();
291 double frac_E_tot = frac_core_E_tot->getVal();
292 double v_s1_E_tot = v1_s1_E_tot * (frac_E_tot) + v2_s1_E_tot * (1 - frac_E_tot);
296 for (
long unsigned int ii = 0; ii <
caltime.size(); ii++) {
302 RooRealVar T_c(
"T_c",
"T_c", -100, 100);
303 RooDataHist data_T_c(
"data_T_c",
"dataset with T_c", T_c,
h_caltime);
305 RooRealVar mean_T_c(
"mean_T_c",
"Mean of Gaussian", 0, -100, 100);
306 RooRealVar sigma1_T_c(
"sigma1_T_c",
"Width of Gaussian", 10, 0, 50);
307 RooGaussian gauss1_T_c(
"gauss1_T_c",
"gauss(x,mean,sigma)", T_c, mean_T_c, sigma1_T_c);
308 RooRealVar sigma2_T_c(
"sigma2_T_c",
"Width of Gaussian", 30, 10, 100);
309 RooGaussian gauss2_T_c(
"gauss2_T_c",
"gauss(x,mean,sigma)", T_c, mean_T_c, sigma2_T_c);
311 RooRealVar frac_core_T_c(
"frac_core",
"core fraction", 0.85, 0.0, 1.0);
312 RooAddModel gaussm_T_c(
"gaussm",
"core+tail gauss", RooArgList(gauss1_T_c, gauss2_T_c), RooArgList(frac_core_T_c));
314 gaussm_T_c.fitTo(data_T_c, RooFit::Range(-45, 45));
315 RooPlot* xframe_T_c = T_c.frame(RooFit::Title(
"Caltime"));
316 data_T_c.plotOn(xframe_T_c, RooFit::MarkerStyle(7));
317 gaussm_T_c.plotOn(xframe_T_c, RooFit::Name(
"Caltime"), RooFit::LineColor(2));
318 gaussm_T_c.plotOn(xframe_T_c, RooFit::Components(
"gauss1_T_c"), RooFit::LineColor(kGreen));
319 gaussm_T_c.plotOn(xframe_T_c, RooFit::Components(
"gauss2_T_c"), RooFit::LineColor(kMagenta));
321 xframe_T_c->GetXaxis()->SetTitle(
"Caltime[ns]");
322 xframe_T_c->GetYaxis()->SetTitle(
"Entries");
324 double v_m_T_c = mean_T_c.getVal();
325 double e_m_T_c = mean_T_c.getError();
327 double v1_s1_T_c = sigma1_T_c.getVal();
329 double v2_s1_T_c = sigma2_T_c.getVal();
332 double frac_T_c = frac_core_T_c.getVal();
333 double v_s1_T_c = v1_s1_T_c * (frac_T_c) + v2_s1_T_c * (1 - frac_T_c);
338 const int cluster_size =
cluster.size();
339 for (
int ii = 0; ii < cluster_size; ii++) {
343 RooRealVar x(
"x",
"esum", 0, 4000);
344 RooDataHist dh(
"dh",
"ecltrg", x,
h_clusterE);
346 RooRealVar mean(
"mean",
"mean", 2000, 1000, 2500);
347 RooRealVar sigma(
"sigma",
"sigma", 150 , 0, 300);
348 RooRealVar tail(
"tail",
"tail", 0.45, 0, 1);
349 RooNovosibirsk novo(
"novo",
"", x, mean, sigma, tail);
350 novo.fitTo(dh, RooFit::Extended(0), RooFit::Range(1500, 2200));
353 double clusterE_vm, clusterE_em, clusterE_vs;
355 clusterE_vm = mean.getVal();
356 clusterE_em = mean.getError();
357 clusterE_vs = sigma.getVal();
361 TFile file(outputfile,
"RECREATE");
362 TTree* tree =
new TTree(
"tree",
"tree");
383 tree->Branch(
"m_nRun", &
m_nRun,
"m_nRun/I");
384 tree->Branch(
"m_nevent", &nevent,
"m_nevent/I");
385 tree->Branch(
"m_FWD", &FWD,
"m_FWD/D");
386 tree->Branch(
"m_BAR", &BAR,
"m_BAR/D");
387 tree->Branch(
"m_BWD", &BWD,
"m_BWD/D");
388 tree->Branch(
"m_ALL", &ALL,
"m_ALL/D");
389 tree->Branch(
"m_etot_mean", &
m_etot_mean,
"m_etot_mean/D");
390 tree->Branch(
"m_etot_error", &
m_etot_error,
"m_etot_error/D");
391 tree->Branch(
"m_etot_sigma", &
m_etot_sigma,
"m_etot_sigma/D");
392 tree->Branch(
"m_caltime_mean", &
m_caltime_mean,
"m_caltime_mean/D");
393 tree->Branch(
"m_caltime_error", &
m_caltime_error,
"m_caltime_error/D");
394 tree->Branch(
"m_caltime_sigma", &
m_caltime_sigma,
"m_caltime_sigma/D");
395 tree->Branch(
"m_clusterE_mean", &clusterE_vm,
"m_clusterE_mean/D");
396 tree->Branch(
"m_clusterE_error", &clusterE_em,
"m_clusterE_error/D");
397 tree->Branch(
"m_clusterE_sigma", &clusterE_vs,
"m_clusterE_sigma/D");
405 B2INFO(
"ECL Trigger QAM result "
407 <<
LogVar(
"Total Event", nevent)
408 <<
LogVar(
"The # of Low Hit TC in Forward Endcap", FWD)
409 <<
LogVar(
"The # of Low Hit TC in Barrel", BAR)
410 <<
LogVar(
"The # of Low Hit TC in Backward Endcap", BWD)
415 <<
LogVar(
"Cluster Energy Peak", clusterE_vm)
416 <<
LogVar(
"Cluster Energy Peak width", clusterE_vs));
419 B2DEBUG(100,
"TRGECLQAMModule ... endRun called ");
427 B2DEBUG(100,
"TRGECLQAMModule ... terminate called ");