73 m_minimPars.emplace_back(
"PreSamplerB", 1.0, 0.5, 0.99, 20.0 );
74 m_minimPars.emplace_back(
"EMB1", 1.0, 0.5, 0.99, 20.0 );
75 m_minimPars.emplace_back(
"EMB2", 1.0, 0.5, 0.99, 20.0 );
76 m_minimPars.emplace_back(
"EMB3", 1.0, 0.5, 0.99, 20.0 );
77 m_minimPars.emplace_back(
"PreSamplerE", 1.0, 0.5, 0.99, 20.0 );
78 m_minimPars.emplace_back(
"EME1", 1.0, 0.5, 0.99, 20.0 );
79 m_minimPars.emplace_back(
"EME2", 1.0, 0.5, 0.99, 2000.0 );
80 m_minimPars.emplace_back(
"EME3", 1.0, 0.5, 0.99, 2000.0 );
81 m_minimPars.emplace_back(
"HEC0", 1.0, 0.5, 0.99, 2000.0 );
82 m_minimPars.emplace_back(
"HEC1", 1.0, 0.5, 0.99, 2000.0 );
83 m_minimPars.emplace_back(
"HEC2", 1.0, 0.5, 0.99, 20.0 );
84 m_minimPars.emplace_back(
"HEC3", 1.0, 0.5, 0.99, 20.0 );
85 m_minimPars.emplace_back(
"TileBar0", 1.0, 0.5, 0.99, 20.0 );
86 m_minimPars.emplace_back(
"TileBar1", 1.0, 0.5, 0.99, 20.0 );
87 m_minimPars.emplace_back(
"TileBar2", 1.0, 0.5, 0.99, 20.0 );
88 m_minimPars.emplace_back(
"TileGap1", 1.0, 0.5, 0.99, 20.0 );
89 m_minimPars.emplace_back(
"TileGap2", 1.0, 0.5, 0.99, 20.0 );
90 m_minimPars.emplace_back(
"TileGap3", 1.0, 0.5, 0.99, 20.0 );
91 m_minimPars.emplace_back(
"TileExt0", 1.0, 0.5, 0.99, 20.0 );
92 m_minimPars.emplace_back(
"TileExt1", 1.0, 0.5, 0.99, 20.0 );
93 m_minimPars.emplace_back(
"TileExt2", 1.0, 0.5, 0.99, 20.0 );
94 m_minimPars.emplace_back(
"FCAL0", 1.0, 0.01, 0.99, 3.0 );
95 m_minimPars.emplace_back(
"FCAL1", 1.0, 0.01, 0.99, 3.0 );
96 m_minimPars.emplace_back(
"FCAL2", 1.0, 0.5, 0.99, 20.0 );
97 m_minimPars.emplace_back(
"MINIFCAL0", 1.0, 0.5, 0.99, 20.0 );
98 m_minimPars.emplace_back(
"MINIFCAL1", 1.0, 0.5, 0.99, 20.0 );
99 m_minimPars.emplace_back(
"MINIFCAL2", 1.0, 0.5, 0.99, 20.0 );
100 m_minimPars.emplace_back(
"MINIFCAL3", 1.0, 0.5, 0.99, 20.0 );
101 m_minimPars.emplace_back(
"CONST", 0.0, 10., 0.0, 5000. );
122 std::cout << std::endl;
123 std::cout << std::endl;
124 std::cout <<
"--- CaloHadDMCoeffMinim::process() --- " << std::endl;
126 if(
m_isTestbeam) std::cout <<
"Processing TESTBEAM data" << std::endl;
129 std::cout <<
"Using weighting proportional to E_calib" << std::endl;
132 std::cout <<
"Using weighting proportional to log(E_calib)" << std::endl;
135 std::cout <<
"Using weighting proportional to 1/N_Clus_E_calib>0" << std::endl;
138 std::cout <<
"Using constant weighting" << std::endl;
145 m_data->fChain->SetBranchStatus(
"*",0);
146 m_data->fChain->SetBranchStatus(
"mc_ener",1);
147 m_data->fChain->SetBranchStatus(
"mc_eta",1);
148 m_data->fChain->SetBranchStatus(
"mc_phi",1);
149 m_data->fChain->SetBranchStatus(
"mc_pdg",1);
150 m_data->fChain->SetBranchStatus(
"ncls",1);
151 m_data->fChain->SetBranchStatus(
"cls_eta",1);
152 m_data->fChain->SetBranchStatus(
"cls_phi",1);
153 m_data->fChain->SetBranchStatus(
"cls_lambda",1);
154 m_data->fChain->SetBranchStatus(
"cls_calib_emfrac",1);
155 m_data->fChain->SetBranchStatus(
"cls_engcalib",1);
156 m_data->fChain->SetBranchStatus(
"engClusSumCalib",1);
157 m_data->fChain->SetBranchStatus(
"cls_ener_unw",1);
158 m_data->fChain->SetBranchStatus(
"narea",1);
160 m_data->fChain->SetBranchStatus(
"cls_dmener",1);
161 m_data->fChain->SetBranchStatus(
"cls_smpener_unw",1);
165 if( !
m_data->GetEntries() ) {
166 std::cout <<
"CaloHadDMCoeffMinim::process -> Error! No entries in DeadMaterialTree." << std::endl;
172 std::cout <<
"CaloHadDMCoeffFit::process -> Error! Different numbers of areas for DM definition" << std::endl;
173 std::cout <<
"m_data->m_narea:" <<
m_data->m_narea <<
" m_HadDMCoeff->getSizeAreaSet():" <<
m_HadDMCoeff->getSizeAreaSet() << std::endl;
180 std::cout <<
"CaloHadDMCoeffMinim::process() -> Info. Preparing for '" << dmArea->
getTitle() <<
" index:" <<
m_area_index
181 <<
" npars:" << dmArea->
getNpars() <<
", for minimization:" <<
m_validNames.size() << std::endl;
183 std::cout <<
"CaloHadDMCoeffMinim::process() -> FATAL! Number of parameters for dead material area is different from number of mininuit pars." << std::endl;
192 std::cout <<
"CaloHadDMCoeffMinim::process() -> Info. Step 2 - making cluster set..." << std::endl;
196 for(
int i_ev=0;
m_data->GetEntry(i_ev)>0;i_ev++) {
200 if(i_ev%20000==0) std::cout <<
" i_ev: " << i_ev <<
" (" << nGoodEvents <<
") '" <<
static_cast<TChain *
>(
m_data->fChain)->GetFile()->GetName() <<
"'" << std::endl;
202 double EnergyResolution;
203 if( abs(
m_data->m_mc_pdg) == 211) {
204 EnergyResolution = sqrt((0.5*0.5/
GeV)*
m_data->m_mc_ener+pow((0.03/
GeV*
m_data->m_mc_ener),2));
207 EnergyResolution = sqrt((0.5*0.5/
GeV)*
m_data->m_mc_ener+pow((0.03/
GeV*
m_data->m_mc_ener),2));
211 if(isSingleParticle) {
212 bool GoodClusterFound(
false);
214 HepLorentzVector hlv_pion(1,0,0,1);
216 for(
int i_cls=0; i_cls<
m_data->m_ncls; i_cls++){
217 HepLorentzVector hlv_cls(1,0,0,1);
218 hlv_cls.setREtaPhi(1./cosh( (*
m_data->m_cls_eta)[i_cls] ), (*
m_data->m_cls_eta)[i_cls], (*
m_data->m_cls_phi)[i_cls]);
219 double r = hlv_pion.angle(hlv_cls.vect());
221 && (*
m_data->m_cls_engcalib)[i_cls] > 20.0*
MeV
224 GoodClusterFound =
true;
229 if(!GoodClusterFound)
continue;
232 if(
m_data->m_engClusSumCalib <=0.0)
continue;
234 for(
int i_cls=0; i_cls<
m_data->m_ncls; i_cls++){
236 || (*
m_data->m_cls_engcalib)[i_cls] < 20.0*
MeV
238 std::vector<float> vars;
239 m_data->PackClusterVars(i_cls, vars);
243 auto ev = std::make_unique<MinimSample>();
247 if(
ev->edmtrue<0)
ev->edmtrue=0.0;
248 if(
m_data->m_cls_smpener_unw) {
249 ev->clsm_smp_energy_unw.resize((*
m_data->m_cls_smpener_unw)[i_cls].size());
250 for(
unsigned int i_smp=0; i_smp<(*
m_data->m_cls_smpener_unw)[i_cls].size(); i_smp++){
251 ev->clsm_smp_energy_unw[i_smp] = (*
m_data->m_cls_smpener_unw)[i_cls][i_smp];
255 double clus_weight = 1.0;
257 clus_weight = (*
m_data->m_cls_engcalib)[i_cls]/
m_data->m_engClusSumCalib;
259 ev->weight = clus_weight;
262 ev->sigma2 = EnergyResolution*EnergyResolution;
275 std::cout <<
"CaloHadDMCoeffMinim::process() -> Info. Starting minimization, m_minimSample.size(): " <<
m_minimSample.size() <<
"( " << float(
m_minimSample.size())*(26.0/1e+06) <<
" Mb)"<< std::endl;
276 for(
int i_data=0; i_data<dmArea->
getLength(); i_data++) {
278 mb.Start(
"minuitperf");
288 std::vector<int > indexes;
290 std::cout <<
"==============================================================================" << std::endl;
291 std::cout <<
"run " << i_data
327 if(name == par.name) {
335 for(
unsigned int i_par=0; i_par<
m_minimPars.size(); i_par++){
343 TVirtualFitter::SetDefaultFitter(
"Minuit");
344 TVirtualFitter * minuit = TVirtualFitter::Fitter(
nullptr,
m_minimPars.size());
345 for(
unsigned int i_par=0; i_par<
m_minimPars.size(); i_par++){
347 minuit->SetParameter(i_par,par->name.c_str(), par->initVal, par->initErr, par->lowerLim, par->upperLim);
348 if( par->fixIt ) minuit->FixParameter(i_par);
355 minuit->ExecuteCommand(
"SET PRINT",arglist,2);
360 minuit->ExecuteCommand(
"MIGRAD",arglist,2);
363 std::cout <<
"Minuit results:" << std::endl;
364 for(
unsigned int i_par=0; i_par<
m_minimPars.size(); i_par++){
365 m_minimPars[i_par].value = minuit->GetParameter(i_par);
366 m_minimPars[i_par].error = minuit->GetParError(i_par);
367 std::cout <<
" i_par:" << i_par <<
" '" <<
m_minimPars[i_par].name <<
"' val:" << minuit->GetParameter(i_par) <<
" err:" << minuit->GetParError(i_par) << std::endl;
373 mb.Stop(
"minuitperf");
374 std::cout <<
"CPU: " << mb.GetCpuTime(
"minuitperf") << std::endl;
381 std::cout <<
"CaloHadDMCoeffMinim::process() -> Info. Making output coefficients set " << std::endl;
383 for (std::pair<
const int, std::vector<MinimPar > >& p :
m_minimResults) {
389 std::cout << std::format(
"{:.3f} ",
static_cast<double>(iBin));
390 for(
unsigned int i_par = 0; i_par<
m_minimPars.size(); i_par++){
393 std::cout << std::format(
"({} {:.3f} {:.3f}) ",
398 std::cout << std::endl;
401 std::vector<int > indexes;
406 if( (fabs(
eta)>2.9 && fabs(
eta)<3.15)) {
409 pars[CaloSampling::EME2] *= 0.98;
411 if( fabs(
eta) > 3.25) {
414 pars[CaloSampling::FCAL0] *= 0.95;
419 newHadDMCoeff->
setCoeff(iBin, pars);
422 return newHadDMCoeff;
432 std::cout <<
"CaloHadDMCoeffMinim::make_report() -> Info. Making report..." << std::endl;
433 gStyle->SetCanvasColor(10);
434 gStyle->SetCanvasBorderMode(0);
435 gStyle->SetPadColor(10);
436 gStyle->SetPadBorderMode(0);
437 gStyle->SetPalette(1);
438 gStyle->SetTitleBorderSize(1);
439 gStyle->SetTitleFillColor(10);
440 int cc_xx = 768, cc_yy = 1024;
441 gROOT->SetBatch(kTRUE);
443 std::string sfname = sreport;
444 TCanvas *ctmp =
new TCanvas(
"ctmp",
"ctmp", cc_xx, cc_yy);
446 ctmp->Print(sfname.c_str());
451 TLatex *tex =
new TLatex(); tex->SetNDC();
460 for(
int i_frac=0; i_frac<dimFrac->
getNbins(); i_frac++){
461 for(
int i_ener=0; i_ener<dimEner->
getNbins(); i_ener++){
462 for(
int i_lambda=0; i_lambda<dimLambda->
getNbins(); i_lambda++){
463 for(
int i_side=0; i_side<dimSide->
getNbins(); i_side++){
464 for(
int i_phi=0; i_phi<dimPhi->
getNbins(); i_phi++){
465 const std::string cname = std::format(
"c1_dmfcal_minuit_weights_frac{}_ener{}_lambda{}_phi{}_side{}",
466 i_frac, i_ener, i_lambda, i_phi, i_side);
467 TCanvas *c1_weights =
new TCanvas(cname.c_str(), cname.c_str(), cc_xx, cc_yy);
469 TPad *pad1=
nullptr, *pad2=
nullptr;
471 pad1 =
new TPad(
"p1ps",
"p1ps",0.0, y_edge, 1.0, 1.0); pad1->Draw();
472 pad2 =
new TPad(
"p2ps",
"p2ps",0.0, 0.0, 1.0, y_edge); pad2->Draw();
474 pad1->cd(); gPad->SetGrid(); gPad->SetLeftMargin(0.07); gPad->SetTopMargin(0.05); gPad->SetRightMargin(0.05); gPad->SetBottomMargin(0.08);
475 std::string
str = std::format(
"frac:{} ener:{} lambda:{} phi:{} side:{}",
476 i_frac, i_ener, i_lambda, i_phi, i_side);
477 tex->SetTextColor(1); tex->SetTextSize(0.20); tex->DrawLatex(0.1,0.4,
str.c_str());
481 pad2->cd(i_canvas+1);
484 for(
int i_eta=0; i_eta<dimEta->
getNbins(); i_eta++){
485 std::vector<int > v_indx;
494 if (iBin >= 0 && iBin >= dmArea->
getOffset()) {
498 gr->SetPoint(i_eta, xx, w);
501 str = std::format(
"Sample size {}",
int(smpsize));
502 gr->SetTitle(
str.c_str());
505 for(
unsigned int i_par=0; i_par<
m_minimPars.size(); i_par++){
506 std::vector<float> vx;
507 std::vector<float> vy;
508 std::vector<float> vye;
509 for(
int i_eta=0; i_eta<dimEta->
getNbins(); i_eta++){
510 std::vector<int > v_indx;
520 vx.push_back(dimEta->
getXmin() + dimEta->
getDx()*i_eta);
526 TGraphErrors *
gr =
new TGraphErrors(dimEta->
getNbins());
527 for(
unsigned int i_p=0; i_p<vx.size(); i_p++){
528 gr->SetPoint(i_p, vx[i_p], vy[i_p]);
529 gr->SetPointError(i_p, 0.0, vye[i_p]);
531 pad2->cd(i_canvas+1);
540 c1_weights->Print(sfname.c_str());
549 ctmp->Print(sfname.c_str());
564 double sum_edm_rec = 0.0;
565 double sum_edm_true = 0.0;
567 double edm_rec = 0.0;
568 double edm_true =
event->edmtrue;
569 for(
int i_smp=0; i_smp<CaloSampling::Unknown; i_smp++){
570 edm_rec += (par[i_smp] - 1.0) * (
double)(
event->clsm_smp_energy_unw[i_smp]);
572 edm_rec += par[CaloSampling::Unknown];
576 edm_rec = edm_rec/
GeV;
577 edm_true = edm_true/
GeV;
579 sum_edm_rec += edm_rec/(
event->sigma2 );
580 sum_edm_true += edm_true/(
event->sigma2 );
581 hi2 += (
event->weight*(edm_rec - edm_true)*(edm_rec - edm_true)/(
event->sigma2 ) );
586 std::cout <<
"nsel == 0 ! PANIC!" << std::endl;
592 <<
") sum_edm_rec:" << sum_edm_rec/float(nsel)
593 <<
" sum_edm_true:" << sum_edm_true/float(nsel)
597 for(
unsigned int i_par=0; i_par<
m_minimPars.size(); i_par++){
598 if( !
m_minimPars[i_par].fixIt ) std::cout <<
"( " << i_par <<
" " <<
m_minimPars[i_par].name <<
" " << par[i_par] <<
")";
600 std::cout << std::endl;