21 #include "CaloGeoHelpers/CaloSampling.h"
32 #include <CLHEP/Vector/LorentzVector.h>
33 #include <CLHEP/Units/SystemOfUnits.h>
49 #include "TGraphErrors.h"
52 using CLHEP::HepLorentzVector;
59 m_netabin(25), m_etamin(0.0), m_etamax(5.0),
61 m_nphibin(1), m_phimin(-
M_PI), m_phimax(
M_PI),
63 m_nlogenerbin(22), m_logenermin(2.0), m_logenermax(6.4),
65 m_nrecobin(3), m_npdg(2), m_doTailRejection(true)
84 std::cout << std::endl;
85 std::cout << std::endl;
86 std::cout <<
"--- CaloHadDMCoeffCheck::process() --- " << std::endl;
128 std::cout <<
"CaloHadDMCoeffCheck::process -> Error! No entries in DeadMaterialTree." << std::endl;
132 std::vector<std::vector<std::vector<CaloHadDMCoeffFit::PrepData *> > > ereco;
133 std::vector<std::vector<std::vector<CaloHadDMCoeffFit::PrepData *> > > etrue;
137 for(
int i_area=0; i_area<nArea; i_area++){
140 for(
int i_eta=0; i_eta<
m_netabin; i_eta++){
154 std::cout <<
"CaloHadDMCoeffCheck::process() -> Info. First loop to find histogram limits " << std::endl;
156 if(i_ev%10000==0) std::cout <<
" i_ev: " << i_ev <<
" '" << ((TChain *)
m_data->
fChain)->GetFile()->GetName() <<
"'" << std::endl;
158 std::cout <<
"CaloHadDMCoeffCheck::process() -> Warning! Unknown particle energy " <<
m_data->
m_mc_ener << std::endl;
164 bool GoodClusterFound(
false);
166 HepLorentzVector hlv_pion(1,0,0,1);
169 HepLorentzVector hlv_cls(1,0,0,1);
171 double r = hlv_pion.angle(hlv_cls.vect());
176 GoodClusterFound =
true;
181 if(!GoodClusterFound)
continue;
188 if(mc_etabin <0 || mc_etabin >=
m_netabin || mc_enerbin <0 || mc_enerbin >=
m_nlogenerbin || mc_phibin!=0)
continue;
191 std::vector<std::vector<double > > engDmReco;
193 std::vector<double > engDmRecSumClus;
194 std::vector<double > engDmTrueSumClus;
195 engDmRecSumClus.resize(nArea, 0.0);
196 engDmTrueSumClus.resize(nArea, 0.0);
199 engDmRecSumClus[i_area] += engDmReco[i_cls][i_area];
206 ereco[i_area][mc_etabin][mc_enerbin]->add(engDmRecSumClus[i_area]);
207 etrue[i_area][mc_etabin][mc_enerbin] ->
add(engDmTrueSumClus[i_area]);
218 for(
int i_area=0; i_area<nArea; i_area++){
221 for(
int i_eta=0; i_eta<
m_netabin; i_eta++){
225 float elimreco = ereco[i_area][i_eta][i_ener]->m_aver + 5.*sqrt(ereco[i_area][i_eta][i_ener]->m_rms);
226 float elimtrue = etrue[i_area][i_eta][i_ener]->m_aver + 5.*sqrt(etrue[i_area][i_eta][i_ener]->m_rms);
227 if(elimreco <=0.0) elimreco = 1.0;
228 if(elimtrue <=0.0) elimtrue = 1.0;
230 sprintf(
hname,
"h2_etrue_vs_ereco_dm%d_eta%d_ener%d",i_area, i_eta, i_ener);
232 sprintf(
hname,
"hp_etrue_vs_ereco_dm%d_eta%d_ener%d",i_area, i_eta, i_ener);
242 for(
int i_pdg=0; i_pdg<
m_npdg; i_pdg++){
244 for(
int i_area=0; i_area<nArea; i_area++){
246 for(
int i_reco=0; i_reco<
m_nrecobin; i_reco++){
249 sprintf(
hname,
"m_hp_engRecoOverTruth_vs_eta_pdg%d_dm%d_reco%d_ener%d",i_pdg,i_area, i_reco, i_ener);
258 for(
int i_pdg=0; i_pdg<
m_npdg; i_pdg++){
260 for(
int i_area=0; i_area<nArea; i_area++){
262 for(
int i_reco=0; i_reco<
m_nrecobin; i_reco++){
266 for(
int i_eta=0; i_eta<
m_netabin; i_eta++){
267 sprintf(
hname,
"m_engRecSpect_pdg%d_dm%d_reco%d_ener%d_eta%d",i_pdg,i_area, i_reco, i_ener, i_eta);
279 std::cout <<
"CaloHadDMCoeffCheck::process() -> Info. Second loop to fill histogram " << std::endl;
281 if(i_ev%10000==0) std::cout <<
" i_ev: " << i_ev <<
" '" << ((TChain *)
m_data->
fChain)->GetFile()->GetName() <<
"'" << std::endl;
286 if(mc_etabin <0 || mc_etabin >=
m_netabin || mc_enerbin <0 || mc_enerbin >=
m_nlogenerbin || mc_phibin!=0)
continue;
296 std::vector<std::vector<double > > engDmReco;
298 std::vector<double > engDmRecSumClus;
299 std::vector<double > engDmTrueSumClus;
300 engDmRecSumClus.resize(nArea, 0.0);
301 engDmTrueSumClus.resize(nArea, 0.0);
302 double engClusSumCalib = 0.0;
303 double engClusSumOOC = 0.0;
304 double engClusSumDM = 0.0;
305 double engClusSumCalibInPresampler = 0.0;
312 engDmRecSumClus[i_area] += engDmReco[i_cls][i_area];
321 m_h2_etrue_vs_ereco[i_area][mc_etabin][mc_enerbin]->Fill(engDmTrueSumClus[i_area], engDmRecSumClus[i_area]);
322 m_hp_etrue_vs_ereco[i_area][mc_etabin][mc_enerbin]->Fill(engDmTrueSumClus[i_area], engDmRecSumClus[i_area]);
326 double sum = engClusSumCalib + engClusSumOOC + engClusSumDM - engClusSumCalibInPresampler;
328 for(
int i_reco=0; i_reco<
m_nrecobin; i_reco++){
329 double engReco = 0.0;
331 engReco =
sum - engDmTrueSumClus[i_area] + engDmRecSumClus[i_area];
335 engReco =
sum - engDmTrueSumClus[i_area];
337 std::cout <<
"panic" << std::endl;
349 TF1 *fun_p1 =
new TF1(
"fun_udeg3",
"[0]+[1]*x",1.,200000.);
350 for(
int i_area=0; i_area<nArea; i_area++){
351 for(
int i_eta=0; i_eta<
m_netabin; i_eta++){
354 if(hp->GetEntries() < 100)
continue;
355 float fitlim1 = hp->GetBinCenter(2);
356 float fitlim2 = hp->GetBinCenter(30);
357 hp->Fit(fun_p1,
"0Q",
"",fitlim1,fitlim2);
358 TF1 *
f=hp->GetFunction(fun_p1->GetName());
360 f->ResetBit(TF1::kNotDraw);
380 const char *a_title[
sDM] = {
392 int a_enerbin_sel[] = {12, 15};
393 int a_etabin_sel[] = {2, 7, 10, 18};
407 std::cout <<
"CaloHadDMCoeffCheck::make_report() -> Info. Making report..." << std::endl;
408 gStyle->SetCanvasColor(10);
409 gStyle->SetCanvasBorderMode(0);
410 gStyle->SetPadColor(10);
411 gStyle->SetPadBorderMode(0);
412 gStyle->SetPalette(1);
413 gStyle->SetTitleBorderSize(1);
414 gStyle->SetTitleFillColor(10);
415 int cc_xx = 768, cc_yy = 1024;
417 gROOT->SetBatch(kTRUE);
419 std::string sfname = sreport;
420 TCanvas *ctmp =
new TCanvas(
"ctmp",
"ctmp", cc_xx, cc_yy);
422 ctmp->Print(sfname.c_str());
427 tex.SetTextSize(0.05);
429 TCanvas *c1ps =
new TCanvas(
"c1ps",
"c1ps", cc_xx, cc_yy);
430 for(
int i_ener=0; i_ener<
int(
sizeof(a_enerbin_sel)/
sizeof(
int)); i_ener++){
431 int i_ener_sel = a_enerbin_sel[i_ener];
432 for(
int i_eta=0; i_eta<
int(
sizeof(a_etabin_sel)/
sizeof(
int)); i_eta++){
433 int i_eta_sel = a_etabin_sel[i_eta];
436 for(
int i_area=0; i_area<
int(
sizeof(a_area_sel)/
sizeof(
int)); i_area++){
437 int i_area_sel = a_area_sel[i_area];
439 gPad->SetLeftMargin(0.12);
440 gPad->SetTopMargin(0.20);
441 sprintf(
str,
"%s ener%d eta%d dm%d",a_title[i_area_sel], i_ener_sel, i_eta_sel, i_area);
444 h->GetXaxis()->SetTitle(
"E_{DM} True");
445 h->GetYaxis()->SetTitle(
"E_{DM} Reco");
446 h->GetYaxis()->SetTitleOffset(1.6);
447 h->GetYaxis()->SetNdivisions(508);
448 h->GetXaxis()->SetNdivisions(508);
451 h->SetLineColor(kRed);
452 h->SetMarkerColor(kRed);
454 sprintf(
str,
"E = %3.1f-%3.1f GeV",
457 tex.SetTextSize(0.05);
458 tex.DrawLatex(0.2,0.85,
str);
460 tex.DrawLatex(0.2,0.78,
str);
462 c1ps->Print(sfname.c_str());
467 int a_color[] = {kRed, kBlue, kGreen};
468 for(
int i_pdg=0; i_pdg<
m_npdg; i_pdg++){
469 for(
int i_ener=0; i_ener<
int(
sizeof(a_enerbin_sel)/
sizeof(
int)); i_ener++){
470 int i_ener_sel = a_enerbin_sel[i_ener];
473 sprintf(cname,
"c2ps_engRecoOverTruth_%d_%d",i_pdg, i_ener);
474 TCanvas *
c1 =
new TCanvas(cname, cname, cc_xx, cc_yy);
476 sprintf(cname,
"c2ps_engRecoOverTruth_%d_%d_pad1",i_pdg, i_ener);
477 TPad *c1_pad1 =
new TPad(cname, cname, 0.0, 0.9, 1.0, 1.0); c1_pad1->Draw();
478 sprintf(cname,
"c2ps_engRecoOverTruth_%d_%d_pad2",i_pdg, i_ener);
479 TPad *c1_pad2 =
new TPad(cname, cname, 0.0, 0.0, 1.0, 0.9); c1_pad2->Draw();
482 sprintf(
str,
"pdg:%d E = %3.1f-%3.1f GeV",i_pdg,
485 tex.SetTextSize(0.12);
486 tex.DrawLatex(0.1, 0.5,
str);
488 c1_pad2->Divide(3,3);
489 for(
int i_area=0; i_area<
int(
sizeof(a_area_sel)/
sizeof(
int)); i_area++){
490 int i_area_sel = a_area_sel[i_area];
491 c1_pad2->cd(i_area+1); gPad->SetGrid();
492 for(
int i_reco=0; i_reco<
m_nrecobin; i_reco++){
494 hp->SetLineColor(a_color[i_reco]);
497 hp->GetXaxis()->SetTitle(
"mc_eta");
498 hp->GetYaxis()->SetTitle(
"engReco / engTruth");
499 hp->SetTitle(a_title[i_area_sel]);
507 std::cout <<
"adding " << i_pdg <<
" " << i_ener << std::endl;
508 c1->Print(sfname.c_str());
510 sprintf(cname,
"c2ps_engResolution_%d_%d",i_pdg, i_ener);
511 TCanvas *
c2 =
new TCanvas(cname, cname, cc_xx, cc_yy);
513 sprintf(cname,
"c2ps_engResolution_%d_%d_pad1",i_pdg, i_ener);
514 TPad *c2_pad1 =
new TPad(cname, cname, 0.0, 0.9, 1.0, 1.0); c2_pad1->Draw();
515 sprintf(cname,
"c2ps_engResolution_%d_%d_pad2",i_pdg, i_ener);
516 TPad *c2_pad2 =
new TPad(cname, cname, 0.0, 0.0, 1.0, 0.9); c2_pad2->Draw();
519 sprintf(
str,
"pdg:%d E = %3.1f-%3.1f GeV (resolution)",i_pdg,
522 tex.SetTextSize(0.12);
523 tex.DrawLatex(0.1, 0.5,
str);
525 c2_pad2->Divide(3,3);
527 h1ref->SetMaximum(0.25);
528 h1ref->SetMinimum(0.0);
529 h1ref->GetXaxis()->SetTitle(
"#eta");
530 h1ref->GetYaxis()->SetTitle(
"#sigma_{E}/E");
532 for(
int i_area=0; i_area<
int(
sizeof(a_area_sel)/
sizeof(
int)); i_area++){
533 int i_area_sel = a_area_sel[i_area];
534 c2_pad2->cd(i_area+1); gPad->SetGrid();
535 h1ref->SetTitle(a_title[i_area_sel]);
538 for(
int i_reco=0; i_reco<
m_nrecobin; i_reco++){
540 for(
int i_eta=0; i_eta<
m_netabin; i_eta++){
541 std::cout <<
" i_pdg:" << i_pdg
542 <<
" i_area_sel:" << i_area_sel
543 <<
" i_reco:" << i_reco
544 <<
" i_ener_sel:" << i_ener_sel
545 <<
" i_eta:" << i_eta
549 std::cout <<
" panic, h1==0" << std::endl;
552 if(
h1->GetMean() == 0.0) {
553 std::cout <<
" Resolution() -> Warning! Skipping point, no energy i_ener:" << i_ener_sel
555 <<
" mean2:" <<
h1->GetMean()
556 <<
" nent2:" <<
h1->GetEntries() << std::endl;
561 float mean3(0), rms3(0);
568 gr->SetLineColor(a_color[i_reco]);
569 gr->SetMarkerColor(a_color[i_reco]);
570 gr->SetMarkerSize(1.0);
574 c2->Print(sfname.c_str());
581 ctmp->Print(sfname.c_str());
603 if( clusEner > emax) clusEner = emax-0.001;
606 std::vector<float> vars;
612 if(
pars==
nullptr)
continue;
614 double engDmRec = 0.0;
616 if(eprep > 0.0) engDmRec = (*pars)[0] + (*pars)[1]*
pow(eprep, (*
pars)[2]);
618 if( (*
pars)[1] > 40) {
624 double ecalonew = 0.0;
625 double ecaloold = 0.0;
629 ecalonew += smpener * (*pars)[i_smp];
632 engDmRec = ecalonew - ecaloold;
634 std::cout <<
"Panic! Unknown DM area type" << std::endl;
647 if(engDmRec >0.0) engDmReco[i_cls][i_dma] = engDmRec;
659 mean = pH->GetMean();
668 for(
int i=1;
i<=(
int)pH->GetNbinsX();
i++){
669 if( pH->GetBinCenter(
i)>=lim1 && pH->GetBinCenter(
i)<= lim2 ){
670 float xx = pH->GetBinCenter(
i);
671 float w = pH->GetBinContent(
i);
674 d_rms = (d_sw/(d_sw+
w))*(d_rms+(
w/(d_sw+
w))*(xx-d_aver)*(xx-d_aver));
675 d_aver = d_aver+(xx-d_aver)*
w/(d_sw+
w);
680 d_rms = pH->GetRMS();
686 d_aver = pH->GetMean();