44 #include "TGraphErrors.h"
45 #include "TGraphAsymmErrors.h"
52 #include "TVirtualFitter.h"
57 #include "TVirtualFitter.h"
58 #include "TFitResultPtr.h"
59 #include "Minuit2/Minuit2Minimizer.h"
60 #include "Math/Functor.h"
62 #include "AliUnfolding.h"
63 #include "AliAnaChargedJetResponseMaker.h"
67 #include "RooUnfold.h"
68 #include "RooUnfoldResponse.h"
69 #include "RooUnfoldSvd.h"
70 #include "RooUnfoldBayes.h"
71 #include "TSVDUnfold.h"
77 fResponseMaker (new AliAnaChargedJetResponseMaker()),
83 fPower (new TF1(
"fPower",
"[0]*TMath::Power(x,-([1]))",0.,300.)),
88 fRefreshInput (kTRUE),
89 fOutputFileName (
"UnfoldedSpectra.root"),
91 fCentralityArray (0x0),
92 fMergeBinsArray (0x0),
93 fCentralityWeights (0x0),
96 fMergeWithWeight (1.),
97 fDetectorResponse (0x0),
102 fBayesianIterOut (4),
103 fBayesianSmoothIn (0.),
104 fBayesianSmoothOut (0.),
105 fAvoidRoundingError (kFALSE),
106 fUnfoldingAlgorithm (kChi2),
107 fPrior (kPriorMeasured),
111 fBinsTruePrior (0x0),
118 fNormalizeSpectra (kFALSE),
119 fSmoothenPrior (kFALSE),
123 fSmoothenCounts (kTRUE),
125 fRawInputProvided (kFALSE),
126 fEventPlaneRes (.63),
127 fUseDetectorResponse(kTRUE),
128 fUseDptResponse (kTRUE),
130 fDphiUnfolding (kTRUE),
131 fDphiDptUnfolding (kFALSE),
133 fTitleFontSize (-999.),
134 fRMSSpectrumIn (0x0),
135 fRMSSpectrumOut (0x0),
138 fDeltaPtDeltaPhi (0x0),
139 fJetPtDeltaPhi (0x0),
146 fFullResponseIn (0x0),
147 fFullResponseOut (0x0),
149 fSubdueError (kTRUE),
150 fUnfoldedSpectrumIn (0x0),
151 fUnfoldedSpectrumOut(0x0),
153 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
154 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
156 fResponseMaker->SetRMMergeWeightFunction(
new TF1(
"weightFunction",
"x*TMath::Power(1.+(1./(8.*0.9))*x, -8.)", 0, 200));
162 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
163 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
179 printf(
" AliJetFlowTools::Make() Fatal error \n - couldn't prepare for unfolding ! \n");
200 measuredJetSpectrumIn =
reinterpret_cast<TH1D*
>(
Bootstrap(measuredJetSpectrumIn, kFALSE));
201 measuredJetSpectrumOut =
reinterpret_cast<TH1D*
>(
Bootstrap(measuredJetSpectrumOut, kFALSE));
226 printf(
" > No response, exiting ! < \n" );
240 TH1D* kinematicEfficiencyIn = resizedResponseIn->ProjectionX();
241 kinematicEfficiencyIn->SetNameTitle(
"kin_eff_IN",
"kin_eff_IN");
242 TH1D* kinematicEfficiencyOut = resizedResponseOut->ProjectionX();
243 kinematicEfficiencyOut->SetNameTitle(
"kin_eff_OUT",
"kin_eff_OUT");
245 for(
Int_t i(0); i < kinematicEfficiencyOut->GetXaxis()->GetNbins(); i++) {
246 kinematicEfficiencyIn->SetBinError(1+i, 0.);
247 kinematicEfficiencyOut->SetBinError(1+i, 0.);
249 TH1D* jetFindingEfficiency(0x0);
252 jetFindingEfficiency->SetNameTitle(Form(
"%s_coarse", jetFindingEfficiency->GetName()), Form(
"%s_coarse", jetFindingEfficiency->GetName()));
256 TH1D* unfoldedJetSpectrumIn(0x0);
257 TH1D* unfoldedJetSpectrumOut(0x0);
259 TDirectoryFile* dirIn =
new TDirectoryFile(Form(
"InPlane___%s",
fActiveString.Data()), Form(
"InPlane___%s",
fActiveString.Data()));
263 measuredJetSpectrumIn,
265 kinematicEfficiencyIn,
266 measuredJetSpectrumTrueBinsIn,
268 jetFindingEfficiency);
269 resizedResponseIn->SetNameTitle(
"ResponseMatrixIn",
"response matrix in plane");
270 resizedResponseIn->SetXTitle(
"p_{T, jet}^{true} (GeV/#it{c})");
271 resizedResponseIn->SetYTitle(
"p_{T, jet}^{rec} (GeV/#it{c})");
272 resizedResponseIn =
ProtectHeap(resizedResponseIn);
273 resizedResponseIn->Write();
274 kinematicEfficiencyIn->SetNameTitle(
"KinematicEfficiencyIn",
"Kinematic efficiency, in plane");
275 kinematicEfficiencyIn =
ProtectHeap(kinematicEfficiencyIn);
276 kinematicEfficiencyIn->Write();
282 fSpectrumIn->SetNameTitle(
"[ORIG]JetSpectrum",
"[INPUT] Jet spectrum, in plane");
284 fDptInDist->SetNameTitle(
"[ORIG]DeltaPt",
"#delta p_{T} distribution, in plane");
286 fDptIn->SetNameTitle(
"[ORIG]DeltaPtMatrix",
"#delta p_{T} matrix, in plane");
288 fFullResponseIn->SetNameTitle(
"ResponseMatrix",
"Response matrix, in plane");
293 TDirectoryFile* dirOut =
new TDirectoryFile(Form(
"OutOfPlane___%s",
fActiveString.Data()), Form(
"OutOfPlane___%s",
fActiveString.Data()));
297 measuredJetSpectrumOut,
299 kinematicEfficiencyOut,
300 measuredJetSpectrumTrueBinsOut,
302 jetFindingEfficiency);
303 resizedResponseOut->SetNameTitle(
"ResponseMatrixOut",
"response matrix in plane");
304 resizedResponseOut->SetXTitle(
"p_{T, jet}^{true} (GeV/#it{c})");
305 resizedResponseOut->SetYTitle(
"p_{T, jet}^{rec} (GeV/#it{c})");
306 resizedResponseOut =
ProtectHeap(resizedResponseOut);
307 resizedResponseOut->Write();
308 kinematicEfficiencyOut->SetNameTitle(
"KinematicEfficiencyOut",
"Kinematic efficiency, Out plane");
309 kinematicEfficiencyOut =
ProtectHeap(kinematicEfficiencyOut);
310 kinematicEfficiencyOut->Write();
314 if(jetFindingEfficiency) jetFindingEfficiency->Write();
317 fSpectrumOut->SetNameTitle(
"[ORIG]JetSpectrum",
"[INPUT]Jet spectrum, Out plane");
319 fDptOutDist->SetNameTitle(
"[ORIG]DeltaPt",
"#delta p_{T} distribution, Out plane");
321 fDptOut->SetNameTitle(
"[ORIG]DeltaPtMatrix",
"#delta p_{T} matrix, Out plane");
323 fFullResponseOut->SetNameTitle(
"[ORIG]ResponseMatrix",
"Response matrix, Out plane");
329 if(unfoldedJetSpectrumIn && unfoldedJetSpectrumOut && unfoldedJetSpectrumIn && unfoldedJetSpectrumOut) {
330 TGraphErrors* ratio(
GetRatio((
TH1D*)unfoldedJetSpectrumIn->Clone(
"unfoldedLocal_in"), (
TH1D*)unfoldedJetSpectrumOut->Clone(
"unfoldedLocal_out")));
332 ratio->SetNameTitle(
"RatioInOutPlane",
"Ratio in plane, out of plane jet spectrum");
333 ratio->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
334 ratio->GetYaxis()->SetTitle(
"yield IN / yield OUT");
339 for(
Int_t i(0); i < ratio->GetXaxis()->GetNbins(); i++) {
340 if(unfoldedJetSpectrumIn->GetBinError(i+1) > 0)
fRMSSpectrumIn->Fill(
fRMSSpectrumIn->GetBinCenter(i+1), unfoldedJetSpectrumIn->GetBinContent(i+1), 1./TMath::Power(unfoldedJetSpectrumIn->GetBinError(i+1), 2.));
341 if(unfoldedJetSpectrumOut->GetBinError(i+1) > 0)
fRMSSpectrumOut->Fill(
fRMSSpectrumOut->GetBinCenter(i+1), unfoldedJetSpectrumOut->GetBinContent(i+1), 1./TMath::Power(unfoldedJetSpectrumOut->GetBinError(i+1), 2.));
342 if(unfoldedJetSpectrumOut->GetBinContent(i+1) > 0)
fRMSRatio->Fill(
fRMSSpectrumIn->GetBinCenter(i+1), unfoldedJetSpectrumIn->GetBinContent(i+1) / unfoldedJetSpectrumOut->GetBinContent(i+1));
347 v2->SetNameTitle(
"v2",
"v_{2} from different in, out of plane yield");
348 v2->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
349 v2->GetYaxis()->SetTitle(
"v_{2}");
353 }
else if (unfoldedJetSpectrumOut && unfoldedJetSpectrumIn) {
356 ratio->SetNameTitle(
"[NC]RatioInOutPlane",
"[NC]Ratio in plane, out of plane jet spectrum");
357 ratio->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
358 ratio->GetYaxis()->SetTitle(
"yield IN / yield OUT");
364 v2->SetNameTitle(
"v2",
"v_{2} from different in, out of plane yield");
365 v2->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
366 v2->GetYaxis()->SetTitle(
"v_{2}");
373 unfoldedJetSpectrumIn->Sumw2();
375 unfoldedJetSpectrumIn->Write();
376 unfoldedJetSpectrumOut->Sumw2();
378 unfoldedJetSpectrumOut->Write();
381 SaveConfiguration(unfoldedJetSpectrumIn ? kTRUE : kFALSE, unfoldedJetSpectrumOut ? kTRUE : kFALSE);
382 TH1D* unfoldedJetSpectrumInForSub((
TH1D*)unfoldedJetSpectrumIn->Clone(
"forSubIn"));
383 TH1D* unfoldedJetSpectrumOutForSub((
TH1D*)unfoldedJetSpectrumOut->Clone(
"forSubOut"));
384 unfoldedJetSpectrumInForSub->Add(unfoldedJetSpectrumOutForSub, -1.);
385 unfoldedJetSpectrumInForSub=
ProtectHeap(unfoldedJetSpectrumInForSub);
386 unfoldedJetSpectrumInForSub->Write();
391 const TH1D* measuredJetSpectrum,
392 const TH2D* resizedResponse,
393 const TH1D* kinematicEfficiency,
394 const TH1D* measuredJetSpectrumTrueBins,
396 const TH1D* jetFindingEfficiency)
398 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
399 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
410 TH1D* clone((
TH1D*)measuredJetSpectrum->Clone(
"clone"));
411 clone->SetNameTitle(Form(
"MeasuredJetSpectrum%s", suffix.Data()), Form(
"measuredJetSpectrum %s", suffix.Data()));
416 return (this->*myFunction)( measuredJetSpectrum, resizedResponse, kinematicEfficiency, measuredJetSpectrumTrueBins,
suffix, jetFindingEfficiency);
420 const TH1D* measuredJetSpectrum,
421 const TH2D* resizedResponse,
422 const TH1D* kinematicEfficiency,
423 const TH1D* measuredJetSpectrumTrueBins,
425 const TH1D* jetFindingEfficiency)
427 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
428 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
435 AliUnfolding::SetUnfoldingMethod(AliUnfolding::kChi2Minimization);
436 if(!strcmp(
"in", suffix.Data())) AliUnfolding::SetChi2Regularization(AliUnfolding::kLogLog,
fBetaIn);
437 else if(!strcmp(
"out", suffix.Data())) AliUnfolding::SetChi2Regularization(AliUnfolding::kLogLog,
fBetaOut);
438 if(!strcmp(
"prior_in", suffix.Data())) AliUnfolding::SetChi2Regularization(AliUnfolding::kLogLog,
fBetaIn);
439 else if(!strcmp(
"prior_out", suffix.Data())) AliUnfolding::SetChi2Regularization(AliUnfolding::kLogLog,
fBetaOut);
447 TH1D *measuredJetSpectrumLocal = (
TH1D*)measuredJetSpectrum->Clone(Form(
"measuredJetSpectrumLocal_%s", suffix.Data()));
449 TH1D *unfoldedLocal(
new TH1D(Form(
"unfoldedLocal_%s", suffix.Data()), Form(
"unfoldedLocal_%s", suffix.Data()),
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
452 TH2D* resizedResponseLocal = (
TH2D*)resizedResponse->Clone(Form(
"resizedResponseLocal_%s", suffix.Data()));
453 TH1D* kinematicEfficiencyLocal = (
TH1D*)kinematicEfficiency->Clone(Form(
"kinematicEfficiencyLocal_%s", suffix.Data()));
456 TH1D *priorLocal = (
TH1D*)measuredJetSpectrumTrueBins->Clone(Form(
"priorLocal_%s", suffix.Data()));
461 Int_t status(-1), i(0);
462 while(status < 0 && i < 100) {
465 if (i > 0) priorLocal = (
TH1D*)unfoldedLocal->Clone(Form(
"priorLocal_%s_%i", suffix.Data(), i));
466 status = AliUnfolding::Unfold(
467 resizedResponseLocal,
468 kinematicEfficiencyLocal,
469 measuredJetSpectrumLocal,
477 if(status == 0 && gMinuit->fISW[1] == 3) {
479 TVirtualFitter *
fitter(TVirtualFitter::GetFitter());
480 if(gMinuit) gMinuit->Command(
"SET COV");
481 TMatrixD covarianceMatrix(
fBinsTrue->GetSize()-1,
fBinsTrue->GetSize()-1, fitter->GetCovarianceMatrix());
484 hPearson =
new TH2D(*pearson);
485 hPearson->SetNameTitle(Form(
"PearsonCoefficients_%s", suffix.Data()), Form(
"Pearson coefficients, %s plane", suffix.Data()));
492 TH1D *foldedLocal(
fResponseMaker->MultiplyResponseGenerated(unfoldedLocal, resizedResponseLocal,kinematicEfficiencyLocal));
493 foldedLocal->SetNameTitle(Form(
"RefoldedSpectrum_%s", suffix.Data()), Form(
"Refolded jet spectrum, %s plane", suffix.Data()));
494 unfoldedLocal->SetNameTitle(Form(
"UnfoldedSpectrum_%s", suffix.Data()), Form(
"Unfolded jet spectrum, %s plane", suffix.Data()));
497 ratio->SetNameTitle(
"RatioRefoldedMeasured", Form(
"Ratio measured, re-folded %s ", suffix.Data()));
498 ratio->GetYaxis()->SetTitle(
"ratio measured / re-folded");
505 measuredJetSpectrumLocal->SetNameTitle(Form(
"InputSpectrum_%s", suffix.Data()), Form(
"InputSpectrum_%s", suffix.Data()));
506 measuredJetSpectrumLocal =
ProtectHeap(measuredJetSpectrumLocal);
507 measuredJetSpectrumLocal->Write();
509 resizedResponseLocal =
ProtectHeap(resizedResponseLocal);
510 resizedResponseLocal->Write();
513 if(jetFindingEfficiency) unfoldedLocal->Divide(jetFindingEfficiency);
514 unfoldedLocal->Write();
517 foldedLocal->Write();
523 TH1F* fitStatus(
new TH1F(Form(
"fitStatus_%s_%s",
fActiveString.Data(), suffix.Data()), Form(
"fitStatus_%s_%s",
fActiveString.Data(), suffix.Data()), 4, -0.5, 3.5));
524 fitStatus->SetBinContent(1, AliUnfolding::fChi2FromFit);
525 fitStatus->GetXaxis()->SetBinLabel(1,
"fChi2FromFit");
526 fitStatus->SetBinContent(2, AliUnfolding::fPenaltyVal);
527 fitStatus->GetXaxis()->SetBinLabel(2,
"fPenaltyVal");
529 fitStatus->GetXaxis()->SetBinLabel(3,
"DOF");
530 fitStatus->SetBinContent(4, (!strcmp(suffix.Data(),
"in")) ?
fBetaIn :
fBetaOut);
531 fitStatus->GetXaxis()->SetBinLabel(4, (!strcmp(suffix.Data(),
"in")) ?
"fBetaIn" :
"fBetaOut");
534 return unfoldedLocal;
538 const TH1D* measuredJetSpectrum,
539 const TH2D* resizedResponse,
540 const TH1D* kinematicEfficiency,
541 const TH1D* measuredJetSpectrumTrueBins,
543 const TH1D* jetFindingEfficiency)
545 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
546 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
552 measuredJetSpectrumTrueBins,
554 jetFindingEfficiency));
556 printf(
" > couldn't find prior ! < \n");
558 }
else printf(
" 1) retrieved prior \n");
565 TH1D *measuredJetSpectrumLocal((
TH1D*)measuredJetSpectrum->Clone(Form(
"jets_%s", suffix.Data())));
567 TH2D *resizedResponseLocal((
TH2D*)resizedResponse->Clone(Form(
"resizedResponseLocal_%s", suffix.Data())));
570 TH2D *resizedResponseLocalNorm((
TH2D*)resizedResponse->Clone(Form(
"resizedResponseLocalNorm_%s", suffix.Data())));
571 resizedResponseLocalNorm =
NormalizeTH2D(resizedResponseLocalNorm);
573 TH1D *kinematicEfficiencyLocal((
TH1D*)kinematicEfficiency->Clone(Form(
"kinematicEfficiency_%s", suffix.Data())));
575 TH1D *unfoldedLocalSVD(0x0);
576 TH1D *foldedLocalSVD(0x0);
577 cout <<
" 2) setup necessary input " << endl;
579 RooUnfold::ErrorTreatment errorTreatment = (
fSVDToy) ? RooUnfold::kCovToy : RooUnfold::kCovariance;
580 cout <<
" step 3) configured routine " << endl;
584 TH2* responseMatrixLocalTransposePrior(
fResponseMaker->GetTransposeResponsMatrix(resizedResponseLocal));
585 responseMatrixLocalTransposePrior->SetNameTitle(Form(
"prior_%s_%s", responseMatrixLocalTransposePrior->GetName(), suffix.Data()),Form(
"prior_%s_%s", responseMatrixLocalTransposePrior->GetName(), suffix.Data()));
588 responseMatrixLocalTransposePrior =
fResponseMaker->NormalizeResponsMatrixYaxisWithPrior(responseMatrixLocalTransposePrior, priorLocal);
589 cout <<
" 4) retrieved first transpose matrix " << endl;
592 RooUnfoldResponse responseSVD(0, 0, responseMatrixLocalTransposePrior, Form(
"respCombinedSVD_%s", suffix.Data()), Form(
"respCombinedSVD_%s", suffix.Data()));
593 cout <<
" 5) retrieved roo unfold response object " << endl;
596 RooUnfoldSvd unfoldSVD(&responseSVD, measuredJetSpectrumLocal, (!strcmp(suffix.Data(),
"in")) ?
fSVDRegIn :
fSVDRegOut);
597 unfoldedLocalSVD = (
TH1D*)unfoldSVD.Hreco(errorTreatment);
599 unfoldedLocalSVD->Divide(kinematicEfficiencyLocal);
602 TMatrixD covarianceMatrix = unfoldSVD.Ereco(errorTreatment);
606 hPearson =
new TH2D(*pearson);
608 hPearson->SetNameTitle(Form(
"PearsonCoefficients_%s", suffix.Data()), Form(
"Pearson coefficients_%s", suffix.Data()));
615 TSVDUnfold* svdUnfold(unfoldSVD.Impl());
616 TH1* hSVal(svdUnfold->GetSV());
617 TH1D* hdi(svdUnfold->GetD());
618 hSVal->SetNameTitle(
"SingularValuesOfAC",
"Singular values of AC^{-1}");
619 hSVal->SetXTitle(
"singular values");
621 hdi->SetNameTitle(
"dVector",
"d vector after orthogonal transformation");
622 hdi->SetXTitle(
"|d_{i}^{kreg}|");
624 cout <<
" plotted singular values and d_i vector " << endl;
627 foldedLocalSVD =
fResponseMaker->MultiplyResponseGenerated(unfoldedLocalSVD, resizedResponseLocalNorm, kinematicEfficiencyLocal);
628 TGraphErrors* ratio(
GetRatio(measuredJetSpectrumLocal, foldedLocalSVD,
"ratio measured / re-folded", kTRUE));
629 ratio->SetNameTitle(Form(
"RatioRefoldedMeasured_%s",
fActiveString.Data()), Form(
"Ratio measured / re-folded %s",
fActiveString.Data()));
630 ratio->GetXaxis()->SetTitle(
"p_{t}^{rec, rec} [GeV/ c]");
631 ratio->GetYaxis()->SetTitle(
"ratio measured / re-folded");
633 cout <<
" 7) refolded the unfolded spectrum " << endl;
636 measuredJetSpectrumLocal->SetNameTitle(Form(
"InputSpectrum_%s", suffix.Data()), Form(
"input spectrum (measured) %s", suffix.Data()));
637 measuredJetSpectrumLocal =
ProtectHeap(measuredJetSpectrumLocal);
638 measuredJetSpectrumLocal->SetXTitle(
"p_{t}^{rec} [GeV/c]");
639 measuredJetSpectrumLocal->Write();
640 unfoldedLocalSVD->SetNameTitle(Form(
"UnfoldedSpectrum_%s",suffix.Data()), Form(
"unfolded spectrum %s", suffix.Data()));
642 if(jetFindingEfficiency) unfoldedLocalSVD->Divide(jetFindingEfficiency);
643 unfoldedLocalSVD->Write();
644 foldedLocalSVD->SetNameTitle(Form(
"RefoldedSpectrum_%s", suffix.Data()), Form(
"refoldedSpectrum_%s", suffix.Data()));
646 foldedLocalSVD->Write();
649 responseMatrixLocalTransposePrior->SetNameTitle(
"TransposeResponseMatrix",
"Transpose of response matrix, normalize with prior");
650 responseMatrixLocalTransposePrior->SetXTitle(
"p_{T, jet}^{true} [GeV/c]");
651 responseMatrixLocalTransposePrior->SetYTitle(
"p_{T, jet}^{rec} [GeV/c]");
652 responseMatrixLocalTransposePrior->Write();
653 priorLocal->SetNameTitle(
"PriorOriginal",
"Prior, original");
654 priorLocal->SetXTitle(
"p_{t} [GeV/c]");
657 resizedResponseLocalNorm =
ProtectHeap(resizedResponseLocalNorm);
658 resizedResponseLocalNorm->Write();
661 TH1F* fitStatus(
new TH1F(Form(
"fitStatus_%s_%s",
fActiveString.Data(), suffix.Data()), Form(
"fitStatus_%s_%s",
fActiveString.Data(), suffix.Data()), 1, -0.5, 0.5));
663 fitStatus->GetXaxis()->SetBinLabel(1, (!strcmp(suffix.Data(),
"in")) ?
"fSVDRegIn" :
"fSVDRegOut");
666 return unfoldedLocalSVD;
670 const TH1D* measuredJetSpectrum,
671 const TH2D* resizedResponse,
672 const TH1D* kinematicEfficiency,
673 const TH1D* measuredJetSpectrumTrueBins,
675 const TH1D* jetFindingEfficiency)
677 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
678 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
686 AliUnfolding::SetUnfoldingMethod(AliUnfolding::kBayesian);
698 measuredJetSpectrumTrueBins,
700 jetFindingEfficiency));
702 printf(
" > couldn't find prior ! < \n");
704 }
else printf(
" 1) retrieved prior \n");
709 TH1D *measuredJetSpectrumLocal = (
TH1D*)measuredJetSpectrum->Clone(Form(
"measuredJetSpectrumLocal_%s", suffix.Data()));
711 TH1D *unfoldedLocal(
new TH1D(Form(
"unfoldedLocal_%s", suffix.Data()), Form(
"unfoldedLocal_%s", suffix.Data()),
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
714 TH2D* resizedResponseLocal = (
TH2D*)resizedResponse->Clone(Form(
"resizedResponseLocal_%s", suffix.Data()));
715 TH1D* kinematicEfficiencyLocal = (
TH1D*)kinematicEfficiency->Clone(Form(
"kinematicEfficiencyLocal_%s", suffix.Data()));
718 Int_t status(-1), i(0);
719 while(status < 0 && i < 100) {
722 if (i > 0) priorLocal = (
TH1D*)unfoldedLocal->Clone(Form(
"priorLocal_%s_%i", suffix.Data(), i));
723 status = AliUnfolding::Unfold(
724 resizedResponseLocal,
725 kinematicEfficiencyLocal,
726 measuredJetSpectrumLocal,
734 if(status == 0 && gMinuit->fISW[1] == 3) {
736 TVirtualFitter *
fitter(TVirtualFitter::GetFitter());
737 if(gMinuit) gMinuit->Command(
"SET COV");
738 TMatrixD covarianceMatrix(
fBinsTrue->GetSize()-1,
fBinsTrue->GetSize()-1, fitter->GetCovarianceMatrix());
741 hPearson=
new TH2D(*pearson);
742 hPearson->SetNameTitle(Form(
"PearsonCoefficients_%s", suffix.Data()), Form(
"Pearson coefficients, %s plane", suffix.Data()));
749 TH1D *foldedLocal(
fResponseMaker->MultiplyResponseGenerated(unfoldedLocal, resizedResponseLocal,kinematicEfficiencyLocal));
750 foldedLocal->SetNameTitle(Form(
"RefoldedSpectrum_%s", suffix.Data()), Form(
"Refolded jet spectrum, %s plane", suffix.Data()));
751 unfoldedLocal->SetNameTitle(Form(
"UnfoldedSpectrum_%s", suffix.Data()), Form(
"Unfolded jet spectrum, %s plane", suffix.Data()));
754 ratio->SetNameTitle(
"RatioRefoldedMeasured", Form(
"Ratio measured, re-folded %s ", suffix.Data()));
755 ratio->GetYaxis()->SetTitle(
"ratio measured / re-folded");
762 measuredJetSpectrumLocal->SetNameTitle(Form(
"InputSpectrum_%s", suffix.Data()), Form(
"InputSpectrum_%s", suffix.Data()));
763 measuredJetSpectrumLocal =
ProtectHeap(measuredJetSpectrumLocal);
764 measuredJetSpectrumLocal->Write();
766 resizedResponseLocal =
ProtectHeap(resizedResponseLocal);
767 resizedResponseLocal->Write();
770 if(jetFindingEfficiency) unfoldedLocal->Divide(jetFindingEfficiency);
771 unfoldedLocal->Write();
774 foldedLocal->Write();
780 TH1F* fitStatus(
new TH1F(Form(
"fitStatus_%s_%s",
fActiveString.Data(), suffix.Data()), Form(
"fitStatus_%s_%s",
fActiveString.Data(), suffix.Data()), 4, -0.5, 3.5));
781 fitStatus->SetBinContent(1, AliUnfolding::fChi2FromFit);
782 fitStatus->GetXaxis()->SetBinLabel(1,
"fChi2FromFit");
783 fitStatus->SetBinContent(2, AliUnfolding::fPenaltyVal);
784 fitStatus->GetXaxis()->SetBinLabel(2,
"fPenaltyVal");
786 fitStatus->GetXaxis()->SetBinLabel(3,
"DOF");
787 fitStatus->SetBinContent(4, (!strcmp(suffix.Data(),
"in")) ?
fBetaIn :
fBetaOut);
788 fitStatus->GetXaxis()->SetBinLabel(4, (!strcmp(suffix.Data(),
"in")) ?
"fBetaIn" :
"fBetaOut");
791 return unfoldedLocal;
795 const TH1D* measuredJetSpectrum,
796 const TH2D* resizedResponse,
797 const TH1D* kinematicEfficiency,
798 const TH1D* measuredJetSpectrumTrueBins,
800 const TH1D* jetFindingEfficiency)
802 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
803 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
812 measuredJetSpectrumTrueBins,
814 jetFindingEfficiency));
816 printf(
" > couldn't find prior ! < \n");
818 }
else printf(
" 1) retrieved prior \n");
823 TH1D *measuredJetSpectrumLocal((
TH1D*)measuredJetSpectrum->Clone(Form(
"jets_%s", suffix.Data())));
825 TH2D *resizedResponseLocal((
TH2D*)resizedResponse->Clone(Form(
"resizedResponseLocal_%s", suffix.Data())));
828 TH2D *resizedResponseLocalNorm((
TH2D*)resizedResponse->Clone(Form(
"resizedResponseLocalNorm_%s", suffix.Data())));
829 resizedResponseLocalNorm =
NormalizeTH2D(resizedResponseLocalNorm);
831 TH1D *kinematicEfficiencyLocal((
TH1D*)kinematicEfficiency->Clone(Form(
"kinematicEfficiency_%s", suffix.Data())));
833 TH1D *unfoldedLocalBayes(0x0);
834 TH1D *foldedLocalBayes(0x0);
835 cout <<
" 2) setup necessary input " << endl;
838 TH2* responseMatrixLocalTransposePrior(
fResponseMaker->GetTransposeResponsMatrix(resizedResponseLocal));
839 responseMatrixLocalTransposePrior->SetNameTitle(Form(
"prior_%s_%s", responseMatrixLocalTransposePrior->GetName(), suffix.Data()),Form(
"prior_%s_%s", responseMatrixLocalTransposePrior->GetName(), suffix.Data()));
842 responseMatrixLocalTransposePrior =
fResponseMaker->NormalizeResponsMatrixYaxisWithPrior(responseMatrixLocalTransposePrior, priorLocal);
844 RooUnfoldResponse responseBayes(0, 0, responseMatrixLocalTransposePrior, Form(
"respCombinedBayes_%s", suffix.Data()), Form(
"respCombinedBayes_%s", suffix.Data()));
848 RooUnfold::ErrorTreatment errorTreatment = (
fSVDToy) ? RooUnfold::kCovToy : RooUnfold::kCovariance;
849 unfoldedLocalBayes = (
TH1D*)unfoldBayes.Hreco(errorTreatment);
851 unfoldedLocalBayes->Divide(kinematicEfficiencyLocal);
853 TMatrixD covarianceMatrix = unfoldBayes.Ereco(errorTreatment);
857 hPearson =
new TH2D(*pearson);
859 hPearson->SetNameTitle(Form(
"PearsonCoefficients_%s", suffix.Data()), Form(
"Pearson coefficients_%s", suffix.Data()));
866 foldedLocalBayes =
fResponseMaker->MultiplyResponseGenerated(unfoldedLocalBayes, resizedResponseLocalNorm, kinematicEfficiencyLocal);
867 TGraphErrors* ratio(
GetRatio(measuredJetSpectrumLocal, foldedLocalBayes,
"ratio measured / re-folded", kTRUE));
868 ratio->SetNameTitle(Form(
"RatioRefoldedMeasured_%s",
fActiveString.Data()), Form(
"Ratio measured / re-folded %s",
fActiveString.Data()));
869 ratio->GetXaxis()->SetTitle(
"p_{t}^{rec, rec} [GeV/ c]");
870 ratio->GetYaxis()->SetTitle(
"ratio measured / re-folded");
872 cout <<
" 7) refolded the unfolded spectrum " << endl;
875 measuredJetSpectrumLocal->SetNameTitle(Form(
"InputSpectrum_%s", suffix.Data()), Form(
"input spectrum (measured) %s", suffix.Data()));
876 measuredJetSpectrumLocal =
ProtectHeap(measuredJetSpectrumLocal);
877 measuredJetSpectrumLocal->SetXTitle(
"p_{t}^{rec} [GeV/c]");
878 measuredJetSpectrumLocal->Write();
879 unfoldedLocalBayes->SetNameTitle(Form(
"UnfoldedSpectrum_%s",suffix.Data()), Form(
"unfolded spectrum %s", suffix.Data()));
880 unfoldedLocalBayes =
ProtectHeap(unfoldedLocalBayes);
881 if(jetFindingEfficiency) unfoldedLocalBayes->Divide(jetFindingEfficiency);
882 unfoldedLocalBayes->Write();
883 foldedLocalBayes->SetNameTitle(Form(
"RefoldedSpectrum_%s", suffix.Data()), Form(
"refoldedSpectrum_%s", suffix.Data()));
885 foldedLocalBayes->Write();
888 responseMatrixLocalTransposePrior->SetNameTitle(
"TransposeResponseMatrix",
"Transpose of response matrix, normalize with prior");
889 responseMatrixLocalTransposePrior->SetXTitle(
"p_{T, jet}^{true} [GeV/c]");
890 responseMatrixLocalTransposePrior->SetYTitle(
"p_{T, jet}^{rec} [GeV/c]");
891 responseMatrixLocalTransposePrior->Write();
892 priorLocal->SetNameTitle(
"PriorOriginal",
"Prior, original");
893 priorLocal->SetXTitle(
"p_{t} [GeV/c]");
896 resizedResponseLocalNorm =
ProtectHeap(resizedResponseLocalNorm);
897 resizedResponseLocalNorm->Write();
900 TH1F* fitStatus(
new TH1F(Form(
"fitStatus_%s_%s",
fActiveString.Data(), suffix.Data()), Form(
"fitStatus_%s_%s",
fActiveString.Data(), suffix.Data()), 1, -0.5, 0.5));
902 fitStatus->GetXaxis()->SetBinLabel(1, (!strcmp(suffix.Data(),
"in")) ?
"fBayesianIterIn" :
"fBayesianIterOut");
905 return unfoldedLocalBayes;
909 const TH1D* measuredJetSpectrum,
910 const TH2D* resizedResponse,
911 const TH1D* kinematicEfficiency,
912 const TH1D* measuredJetSpectrumTrueBins,
914 const TH1D* jetFindingEfficiency)
916 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
917 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
924 TH1D* unfoldedLocal((
TH1D*)measuredJetSpectrum->Clone(Form(
"unfoldedLocal_%s", suffix.Data())));
927 TH2D* resizedResponseLocal = (
TH2D*)resizedResponse->Clone(Form(
"resizedResponseLocal_%s", suffix.Data()));
928 TH1D* kinematicEfficiencyLocal = (
TH1D*)kinematicEfficiency->Clone(Form(
"kinematicEfficiencyLocal_%s", suffix.Data()));
931 TH1D *foldedLocal(
fResponseMaker->MultiplyResponseGenerated(unfoldedLocal, resizedResponseLocal,kinematicEfficiencyLocal));
932 foldedLocal->SetNameTitle(Form(
"RefoldedSpectrum_%s", suffix.Data()), Form(
"Refolded jet spectrum, %s plane", suffix.Data()));
933 unfoldedLocal->SetNameTitle(Form(
"UnfoldedSpectrum_%s", suffix.Data()), Form(
"Unfolded jet spectrum, %s plane", suffix.Data()));
937 TH1D* measuredJetSpectrumLocal((
TH1D*)(measuredJetSpectrum->Clone(
"tempObject")));
938 measuredJetSpectrumLocal->SetNameTitle(Form(
"InputSpectrum_%s", suffix.Data()), Form(
"InputSpectrum_%s", suffix.Data()));
939 measuredJetSpectrumLocal =
ProtectHeap(measuredJetSpectrumLocal);
940 measuredJetSpectrumLocal->Write();
942 resizedResponseLocal =
ProtectHeap(resizedResponseLocal);
943 resizedResponseLocal->Write();
946 if(jetFindingEfficiency) unfoldedLocal->Divide(jetFindingEfficiency);
947 unfoldedLocal->Write();
950 foldedLocal->Write();
958 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
959 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
964 printf(
" AliJetFlowTools::PrepareForUnfolding() fInputList not found \n - Set a list using AliJetFlowTools::SetInputList() \n");
967 if(!
fDetectorResponse) printf(
" WARNING, no detector response supplied ! May be ok (depending on what you want to do) \n ");
970 printf(
" AliJetFlowTools::PrepareForUnfolding() no true or rec bins set, aborting ! \n");
986 if(!
fInputList->FindObject(spectrumName.Data())) {
987 printf(
" Couldn't find spectrum %s ! \n", spectrumName.Data());
997 printf(
"Extracted %s wight weight %.2f \n", spectrumName.Data(),
fCentralityWeights->At(0));
1001 printf(
" Merging with %s with weight %.4f \n", spectrumName.Data(),
fCentralityWeights->At(i));
1007 printf(
" Adding additional output %s \n", spectrumName.Data());
1034 if(!rho)
return 0x0;
1036 if (normalizeToFullSpectrum)
fEventCount = rho->GetEntries();
1047 if(error > 0)
fSpectrumIn->SetBinError(1+i, error);
1048 else fSpectrumIn->SetBinError(1+i, TMath::Sqrt(pt));
1070 printf(
" Couldn't find delta pt matrix %s ! \n", deltaptName.Data());
1071 printf(
" > may be ok, depending no what you want to do < \n");
1079 printf(
"Extracted %s with weight %.2f \n", deltaptName.Data(),
fCentralityWeights->At(0));
1082 printf(
" Merging with %s with weight %.4f \n", deltaptName.Data(),
fCentralityWeights->At(i));
1088 printf(
" Adding additional data %s \n", deltaptName.Data());
1107 TMatrixD* rfIn =
new TMatrixD(-50, 249, -50, 249);
1108 for(
Int_t j(-50); j < 250; j++) {
1110 for(
Int_t k(-50); k < 250; k++) {
1115 TMatrixD* rfOut =
new TMatrixD(-50, 249, -50, 249);
1116 for(
Int_t j(-50); j < 250; j++) {
1118 for(
Int_t k(-50); k < 250; k++) {
1125 fDptIn->GetXaxis()->SetTitle(
"p_{T, jet}^{gen} [GeV/c]");
1126 fDptIn->GetYaxis()->SetTitle(
"p_{T, jet}^{rec} [GeV/c]");
1130 fDptOut->GetXaxis()->SetTitle(
"p_{T, jet}^{gen} [GeV/c]");
1131 fDptOut->GetYaxis()->SetTitle(
"p_{T, jet}^{rec} [GeV/c]");
1141 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1142 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1145 printf(
" AliJetFlowTools::PrepareForUnfolding() fInputList not found \n - Set a list using AliJetFlowTools::SetInputList() \n");
1148 if(!
fDetectorResponse) printf(
" WARNING, no detector response supplied ! May be ok (depending on what you want to do) \n ");
1151 printf(
" AliJetFlowTools::PrepareForUnfolding() no true or rec bins set, aborting ! \n");
1162 if(!fJetPtDeltaPhi) {
1163 printf(
" Couldn't find spectrum %s ! \n", spectrumName.Data());
1169 fJetPtDeltaPhi->Add(((
TH2D*)
fInputList->FindObject(spectrumName.Data())));
1172 fJetPtDeltaPhi =
ProtectHeap(fJetPtDeltaPhi, kFALSE);
1174 fSpectrumIn = fJetPtDeltaPhi->ProjectionY(Form(
"_py_in_%s", spectrumName.Data()), low, up,
"e");
1184 printf(
" Couldn't find delta pt matrix %s ! \n", deltaptName.Data());
1185 printf(
" > may be ok, depending no what you want to do < \n");
1200 TMatrixD* rfIn =
new TMatrixD(-50, 249, -50, 249);
1201 for(
Int_t j(-50); j < 250; j++) {
1203 for(
Int_t k(-50); k < 250; k++) {
1210 fDptIn->GetXaxis()->SetTitle(
"p_{T, jet}^{gen} [GeV/c]");
1211 fDptIn->GetYaxis()->SetTitle(
"p_{T, jet}^{rec} [GeV/c]");
1218 const TH1D* measuredJetSpectrum,
1219 const TH2D* resizedResponse,
1220 const TH1D* kinematicEfficiency,
1221 const TH1D* measuredJetSpectrumTrueBins,
1223 const TH1D* jetFindingEfficiency)
1225 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1226 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1230 TH1D* unfolded(0x0);
1231 TDirectoryFile* dirOut =
new TDirectoryFile(Form(
"Prior_%s___%s", suffix.Data(),
fActiveString.Data()), Form(
"Prior_%s___%s", suffix.Data(),
fActiveString.Data()));
1236 printf(
"> GetPrior:: FATAL ERROR! TF1 prior requested but prior has not been set ! < \n");
1243 printf(
"> GetPrior:: FATAL ERROR! pythia prior requested but prior has not been set ! < \n");
1264 TH1D* kinematicEfficiencyChi2(resizedResponseChi2->ProjectionX());
1265 kinematicEfficiencyChi2->SetNameTitle(
"kin_eff_chi2",
"kin_eff_chi2");
1266 for(
Int_t i(0); i < kinematicEfficiencyChi2->GetXaxis()->GetNbins(); i++) kinematicEfficiencyChi2->SetBinError(1+i, 0.);
1268 measuredJetSpectrumChi2,
1269 resizedResponseChi2,
1270 kinematicEfficiencyChi2,
1271 measuredJetSpectrumTrueBinsChi2,
1272 TString(Form(
"prior_%s", suffix.Data())));
1274 printf(
" > GetPrior:: panic, couldn't get prior from Chi2 unfolding! \n");
1275 printf(
" probably Chi2 unfolding did not converge < \n");
1280 fBinsRec = tempArrayRec;
1285 measuredJetSpectrum,
1287 kinematicEfficiency,
1288 measuredJetSpectrumTrueBins,
1289 TString(Form(
"prior_%s", suffix.Data())));
1291 printf(
" > GetPrior:: panic, couldn't get prior from Chi2 unfolding! \n");
1292 printf(
" probably Chi2 unfolding did not converge < \n");
1302 unfolded = (
TH1D*)measuredJetSpectrumTrueBins->Clone(Form(
"kPriorMeasured_%s", suffix.Data()));
1308 if(jetFindingEfficiency) unfolded->Divide(jetFindingEfficiency);
1309 TH1D *priorLocal((
TH1D*)unfolded->Clone(Form(
"priorUnfolded_%s", suffix.Data())));
1316 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1317 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1320 printf(
" > ResizeXaxisTH!D:: fatal error, NULL pointer passed < \n");
1324 TH1D* resized =
new TH1D(Form(
"%s_resized_%s", histo->GetName(), suffix.Data()), Form(
"%s_resized_%s", histo->GetName(), suffix.Data()), up-low, (
double)low, (double)up);
1326 Int_t l = histo->GetXaxis()->FindBin(low);
1329 for(
Int_t i(0); i < up-low; i++) {
1330 _x = histo->GetBinContent(l+i);
1331 _xx=histo->GetBinError(l+i);
1332 resized->SetBinContent(i+1, _x);
1333 resized->SetBinError(i+1, _xx);
1340 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1341 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1344 printf(
" > ResizeYaxisTH2D:: fatal error, NULL pointer passed < \n");
1348 TH2D* resized =
new TH2D(Form(
"%s_resized_%s", histo->GetName(), suffix.Data()), Form(
"%s_resized_%s", histo->GetName(), suffix.Data()), x->GetSize()-1, x->GetArray(), y->GetSize()-1, y->GetArray());
1351 Int_t low = histo->GetYaxis()->FindBin(y->At(0));
1354 for(
Int_t i(0); i < x->GetSize(); i++) {
1355 for(
Int_t j(0); j < y->GetSize(); j++) {
1356 _x = histo->GetBinContent(i, low+j);
1357 _xx=histo->GetBinError(i, low+1+j);
1358 resized->SetBinContent(i, j, _x);
1359 resized->SetBinError(i, j, _xx);
1368 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1369 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1372 printf(
" > NormalizeTH2D:: NULL pointer passed, returning NULL < \n");
1375 Int_t binsX = histo->GetXaxis()->GetNbins();
1376 Int_t binsY = histo->GetYaxis()->GetNbins();
1379 for(
Int_t i(0); i < binsX; i++) {
1381 for(
Int_t j(0); j < binsY; j++) {
1382 weight+=histo->GetBinContent(i+1, j+1);
1384 for(
Int_t j(0); j < binsY; j++) {
1385 if (weight <= 0 )
continue;
1386 histo->SetBinContent(1+i, j+1, histo->GetBinContent(1+i, j+1)/weight);
1387 if(noError) histo->SetBinError( 1+i, j+1, 0.);
1388 else histo->SetBinError( 1+i, j+1, histo->GetBinError( 1+i, j+1)/weight);
1395 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1396 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1401 printf(
" > Bootstrap:: fatal error,NULL pointer passed! \n");
1404 else printf(
" > Bootstrap:: resampling, may take some time \n");
1406 TH1* bootstrapped((
TH1*)(hist->Clone(Form(
"%s_bootstrapped", hist->GetName()))));
1407 bootstrapped->Reset();
1417 Int_t sampledMean(0), entries(0);
1419 for(
Int_t i(0); i < hist->GetXaxis()->GetNbins(); i++) {
1421 mean = hist->GetBinContent(i+1);
1422 sigma = hist->GetBinError(i+1);
1424 sampledMean = TMath::Nint(
gRandom->Gaus(mean, sigma));
1425 printf(
" sampled %i from original number %.2f \n", sampledMean, mean);
1427 bootstrapped->SetBinContent(i+1, sampledMean);
1428 if(sampledMean > 0) bootstrapped->SetBinError(i+1, TMath::Sqrt(sampledMean));
1429 entries += sampledMean;
1431 printf(
" Done bootstrapping, setting number of entries to %i \n", entries);
1432 bootstrapped->SetEntries((
double)entries);
1436 if(kill)
delete hist;
1438 return bootstrapped;
1442 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1443 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1447 if(!histo || !bins) {
1448 printf(
" > RebinTH1D:: fatal error, NULL pointer passed < \n");
1452 TString name = histo->GetName();
1455 TH1D* rebinned = 0x0;
1458 if(histo->GetBinContent(1) > 1 ) {
1459 rebinned =
new TH1D(name.Data(), name.Data(), bins->GetSize()-1, bins->GetArray());
1460 for(
Int_t i(0); i < histo->GetXaxis()->GetNbins(); i++) {
1462 rebinned->Fill(histo->GetBinCenter(i+1), histo->GetBinContent(i+1));
1464 }
else rebinned =
reinterpret_cast<TH1D*
>(histo->Rebin(bins->GetSize()-1, name.Data(), bins->GetArray()));
1465 if(kill)
delete histo;
1470 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1471 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1476 printf(
" > RebinTH2D:: function called with NULL arguments < \n");
1479 TString name(Form(
"%s_%s", rebinMe->GetName(), suffix.Data()));
1480 return (
TH2D*)
fResponseMaker->MakeResponseMatrixRebin(rebinMe, (
TH2*)(
new TH2D(name.Data(), name.Data(), binsTrue->GetSize()-1, binsTrue->GetArray(), binsRec->GetSize()-1, binsRec->GetArray())), kTRUE);
1485 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1486 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1489 if (a->GetNbinsX() != b->GetNbinsY())
return 0x0;
1491 for (
Int_t y1 = 1; y1 <= a->GetNbinsY(); y1++) {
1492 for (
Int_t x2 = 1; x2 <= b->GetNbinsX(); x2++) {
1494 for (
Int_t x1 = 1; x1 <= a->GetNbinsX(); x1++) {
1496 val += a->GetBinContent(x1, y1) * b->GetBinContent(x2, y2);
1498 c->SetBinContent(x2, y1, val);
1499 c->SetBinError(x2, y1, 0.);
1502 if(strcmp(name.Data(),
"")) c->SetNameTitle(name.Data(), name.Data());
1508 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1509 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1513 Double_t integral = histo->Integral()*scale;
1514 if (integral > 0 && scale == 1.) histo->Scale(1./integral,
"width");
1515 else if (scale != 1.) histo->Scale(1./scale,
"width");
1516 else printf(
" > Histogram integral < 0, cannot normalize \n");
1522 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1523 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1526 if(!(bins&&spectrum)) {
1527 printf(
" > NULL pointer passed as argument in MergeSpectrumBins ! < \n");
1530 Double_t sum(0), error(0), pearson(0);
1532 sum += spectrum->GetBinContent(bins->At(0));
1533 sum += spectrum->GetBinContent(bins->At(1));
1535 error += TMath::Power(spectrum->GetBinError(bins->At(0)), 2);
1536 error += TMath::Power(spectrum->GetBinError(bins->At(1)), 2);
1538 pearson = corr->GetBinContent(bins->At(0), bins->At(1));
1540 printf(
" > PANIC ! something is wrong with the covariance matrix, assuming full correlation ! < \n ");
1543 error += 2.*spectrum->GetBinError(bins->At(0))*spectrum->GetBinError(bins->At(1))*pearson;
1544 spectrum->SetBinContent(1, sum);
1545 if(error <= 0)
return spectrum;
1546 spectrum->SetBinError(1, TMath::Sqrt(error));
1547 printf(
" > sum is %.2f \t error is %.8f < \n", sum, error);
1548 printf(
" > REPLACING BIN CONTENT OF FIRST BIN (%i) WITH MERGED BINS (%i) and (%i) < \n", 1, bins->At(0), bins->At(1));
1554 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1555 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1558 TMatrixD *pearsonCoefficients((TMatrixD*)covarianceMatrix->Clone(
"pearsonCoefficients"));
1559 Int_t nrows(covarianceMatrix->GetNrows()), ncols(covarianceMatrix->GetNcols());
1561 if(nrows==0 && ncols==0)
return 0x0;
1562 for(
Int_t row = 0; row < nrows; row++) {
1563 for(
Int_t col = 0; col<ncols; col++) {
1564 if((*covarianceMatrix)(row,row)!=0. && (*covarianceMatrix)(col,col)!=0.) pearson = (*covarianceMatrix)(row,col)/TMath::Sqrt((*covarianceMatrix)(row,row)*(*covarianceMatrix)(col,col));
1565 (*pearsonCoefficients)(row,col) = pearson;
1568 return pearsonCoefficients;
1572 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1573 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1580 if(!spectrum || !
function)
return 0x0;
1581 if(start > max) printf(
" > cannot extrapolate fit beyond fit range ! < " );
1582 TH1D* temp = (
TH1D*)spectrum->Clone(Form(
"%s_smoothened", spectrum->GetName()));
1584 TFitResultPtr r = temp->Fit(
function,
"",
"", min, max);
1586 for(
Int_t i(0); i < temp->GetNbinsX() + 1; i++) {
1587 if(temp->GetBinCenter(i) > start) {
1588 (counts) ? temp->SetBinContent(i, (
int)(function->Integral(temp->GetXaxis()->GetBinLowEdge(i),temp->GetXaxis()->GetBinUpEdge(i))/temp->GetXaxis()->GetBinWidth(i))) : temp->SetBinContent(i, function->Integral(temp->GetXaxis()->GetBinLowEdge(i),temp->GetXaxis()->GetBinUpEdge(i))/temp->GetXaxis()->GetBinWidth(i));
1589 if(temp->GetBinContent(i) > 0) temp->SetBinError(i, TMath::Sqrt(temp->GetBinContent(i)));
1593 if(kill)
delete spectrum;
1599 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1600 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1606 gStyle->SetCanvasColor(-1);
1607 gStyle->SetPadColor(-1);
1608 gStyle->SetFrameFillColor(-1);
1609 gStyle->SetHistFillColor(-1);
1610 gStyle->SetTitleFillColor(-1);
1611 gStyle->SetFillColor(-1);
1612 gStyle->SetFillStyle(4000);
1613 gStyle->SetStatStyle(0);
1614 gStyle->SetTitleStyle(0);
1615 gStyle->SetCanvasBorderSize(0);
1616 gStyle->SetFrameBorderSize(0);
1617 gStyle->SetLegendBorderSize(0);
1618 gStyle->SetStatBorderSize(0);
1619 gStyle->SetTitleBorderSize(0);
1621 gStyle->Reset(
"Plain");
1622 gStyle->SetOptTitle(0);
1623 gStyle->SetOptStat(0);
1624 gStyle->SetPalette(1);
1625 gStyle->SetCanvasColor(10);
1626 gStyle->SetCanvasBorderMode(0);
1627 gStyle->SetFrameLineWidth(1);
1628 gStyle->SetFrameFillColor(kWhite);
1629 gStyle->SetPadColor(10);
1630 gStyle->SetPadTickX(1);
1631 gStyle->SetPadTickY(1);
1632 gStyle->SetPadBottomMargin(0.17);
1633 gStyle->SetPadLeftMargin(0.15);
1634 gStyle->SetHistLineWidth(1);
1635 gStyle->SetHistLineColor(kRed);
1636 gStyle->SetFuncWidth(2);
1637 gStyle->SetFuncColor(kGreen);
1638 gStyle->SetLineWidth(2);
1639 gStyle->SetLabelSize(0.045,
"xyz");
1640 gStyle->SetLabelOffset(0.01,
"y");
1641 gStyle->SetLabelOffset(0.01,
"x");
1642 gStyle->SetLabelColor(kBlack,
"xyz");
1643 gStyle->SetTitleSize(0.05,
"xyz");
1644 gStyle->SetTitleOffset(1.25,
"y");
1645 gStyle->SetTitleOffset(1.2,
"x");
1646 gStyle->SetTitleFillColor(kWhite);
1647 gStyle->SetTextSizePixels(26);
1648 gStyle->SetTextFont(42);
1649 gStyle->SetLegendBorderSize(0);
1650 gStyle->SetLegendFillColor(kWhite);
1651 gStyle->SetLegendFont(42);
1657 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1658 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1662 if(!strcmp(style.Data(),
"PEARSON")) {
1663 printf(
" > style PEARSON canvas < \n");
1664 gStyle->SetOptStat(0);
1669 }
else if(!strcmp(style.Data(),
"SPECTRUM")) {
1670 printf(
" > style SPECTRUM canvas < \n");
1671 gStyle->SetOptStat(0);
1677 }
else printf(
" > Style called with unknown option %s \n returning < \n", style.Data());
1682 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1683 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1688 c->SetLeftMargin(.25);
1689 c->SetBottomMargin(.25);
1692 if(!strcmp(style.Data(),
"PEARSON")) {
1693 printf(
" > style PEARSON pad < \n");
1694 gStyle->SetOptStat(0);
1699 }
else if(!strcmp(style.Data(),
"SPECTRUM")) {
1700 printf(
" > style SPECTRUM pad < \n");
1701 gStyle->SetOptStat(0);
1707 }
else if (!strcmp(style.Data(),
"GRID")) {
1708 printf(
" > style GRID pad < \n");
1709 gStyle->SetOptStat(0);
1713 }
else printf(
" > Style called with unknown option %s \n returning < \n", style.Data());
1718 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1719 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1724 l->SetBorderSize(0);
1725 if(gStyle) l->SetTextSize(gStyle->GetTextSize()*.08);
1730 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1731 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1735 h->GetYaxis()->SetNdivisions(505);
1736 h->SetLineColor(col);
1737 h->SetMarkerColor(col);
1739 h->SetMarkerSize(1.5);
1742 h->GetYaxis()->SetLabelSize(0.05);
1743 h->GetXaxis()->SetLabelSize(0.05);
1744 h->GetYaxis()->SetTitleOffset(1.5);
1745 h->GetXaxis()->SetTitleOffset(1.5);
1746 h->GetYaxis()->SetTitleSize(.05);
1747 h->GetXaxis()->SetTitleSize(.05);
1751 h->SetTitle(
"IN PLANE");
1752 h->GetXaxis()->SetTitle(
"#it{p}_{T}^{ch, jet} (GeV/#it{c})");
1753 h->GetYaxis()->SetTitle(
"#frac{d#it{N}}{d#it{p}_{T}}");
1756 h->SetTitle(
"OUT OF PLANE");
1757 h->GetYaxis()->SetTitle(
"#frac{d#it{N}}{d#it{p}_{T}}");
1758 h->GetXaxis()->SetTitle(
"#it{p}_{T, jet}^{ch} (GeV/#it{c})");
1761 h->SetTitle(
"UNFOLDED");
1762 h->GetYaxis()->SetTitle(
"#frac{d#it{N}}{d#it{p}_{T}}");
1763 h->GetXaxis()->SetTitle(
"#it{p}_{T, jet}^{ch} (GeV/#it{c})");
1766 h->SetTitle(
"FOLDED");
1767 h->GetYaxis()->SetTitle(
"#frac{d#it{N}}{d#it{p}_{T}}");
1768 h->GetXaxis()->SetTitle(
"#it{p}_{T, jet}^{ch} (GeV/#it{c})");
1771 h->SetTitle(
"MEASURED");
1772 h->GetYaxis()->SetTitle(
"#frac{d#it{N}}{d#it{p}_{T}}");
1773 h->GetXaxis()->SetTitle(
"#it{p}_{T, jet}^{cht} (GeV/#it{c})");
1776 h->SetFillColor(col);
1778 h->GetXaxis()->SetTitle(
"#it{p}_{T, jet}^{ch} (GeV/#it{c})");
1779 h->SetBarOffset(0.2);
1782 h->SetMarkerStyle(8);
1783 h->SetMarkerSize(1.5);
1786 h->GetYaxis()->SetTitle(
"[counts]");
1787 h->GetXaxis()->SetTitle(
"#Delta #phi");
1795 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1796 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1800 h->GetYaxis()->SetNdivisions(505);
1801 h->SetLineColor(col);
1802 h->SetMarkerColor(col);
1804 h->SetMarkerSize(1.5);
1806 h->SetFillColor(kCyan);
1808 h->GetYaxis()->SetLabelSize(0.05);
1809 h->GetXaxis()->SetLabelSize(0.05);
1810 h->GetYaxis()->SetTitleOffset(1.6);
1811 h->GetXaxis()->SetTitleOffset(1.6);
1812 h->GetYaxis()->SetTitleSize(.05);
1813 h->GetXaxis()->SetTitleSize(.05);
1815 h->GetXaxis()->SetTitle(
"#it{p}_{T, jet}^{ch} (GeV/#it{c})");
1818 h->SetTitle(
"IN PLANE");
1819 h->GetYaxis()->SetTitle(
"#frac{d#it{N}}{d#it{p}_{T}}");
1822 h->SetTitle(
"OUT OF PLANE");
1823 h->GetYaxis()->SetTitle(
"#frac{d#it{N}}{d#it{p}_{T}}");
1826 h->SetTitle(
"UNFOLDED");
1827 h->GetYaxis()->SetTitle(
"#frac{d#it{N}}{d#it{p}_{T}}");
1830 h->SetTitle(
"FOLDED");
1831 h->GetYaxis()->SetTitle(
"#frac{d#it{N}}{d#it{p}_{T}}");
1834 h->SetTitle(
"MEASURED");
1835 h->GetYaxis()->SetTitle(
"#frac{d#it{N}}{d#it{p}_{T}}");
1838 h->GetYaxis()->SetTitle(
"(d#it{N}^{ch, jet}_{in plane}/(d#it{p}_{T}d#eta))/(d#it{N}^{ch,jet}_{out of plane}/(d#it{p}_{T}d#eta))");
1841 h->GetYaxis()->SetTitle(
"#it{v}_{2}^{ch, jet} {EP, |#Delta#eta|>0.9 } ");
1842 h->GetYaxis()->SetRangeUser(-.5, 1.);
1843 h->SetMarkerStyle(8);
1844 h->SetMarkerSize(1.5);
1858 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1859 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1863 TFile* readMe(
new TFile(inFile.Data(),
"READ"));
1864 if(readMe->IsZombie()) {
1865 printf(
" > Fatal error, couldn't read %s for post processing ! < \n", inFile.Data());
1868 printf(
"\n\n\n\t\t GetNominalValues \n > Recovered the following file structure : \n <");
1870 TFile* output(
new TFile(outFile.Data(),
"RECREATE"));
1876 Int_t iIn[] = {in->At(0), in->At(0)};
1877 Int_t iOut[] = {out->At(0), out->At(0)};
1884 dud, dud, dud, dud, dud, dud,
1896 ratio->SetDirectory(0);
1919 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
1920 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
1924 TFile* readMe(
new TFile(in.Data(),
"READ"));
1925 if(readMe->IsZombie()) {
1926 printf(
" > Fatal error, couldn't read %s for post processing ! < \n", in.Data());
1929 printf(
"\n\n\n\t\t GetCorrelatedUncertainty \n > Recovered the following file structure : \n <");
1931 TFile* output(
new TFile(out.Data(),
"RECREATE"));
1936 TH1D* relativeErrorVariationInLow(0x0);
1937 TH1D* relativeErrorVariationInUp(0x0);
1938 TH1D* relativeErrorVariationOutLow(0x0);
1939 TH1D* relativeErrorVariationOutUp(0x0);
1940 TH1D* relativeError2ndVariationInLow(0x0);
1941 TH1D* relativeError2ndVariationInUp(0x0);
1942 TH1D* relativeError2ndVariationOutLow(0x0);
1943 TH1D* relativeError2ndVariationOutUp(0x0);
1944 TH1D* relativeStatisticalErrorIn(0x0);
1945 TH1D* relativeStatisticalErrorOut(0x0);
1947 TH1D* nominal(
new TH1D(
"ratio in plane, out of plane",
"ratio in plane, out of plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
1949 TH1D* nominalOut(
new TH1D(
"out of plane jet yield",
"out of plane jet yield",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
1952 if(variationsIn && variationsOut) {
1956 relativeErrorVariationInUp,
1957 relativeErrorVariationInLow,
1958 relativeErrorVariationOutUp,
1959 relativeErrorVariationOutLow,
1960 relativeStatisticalErrorIn,
1961 relativeStatisticalErrorOut,
1972 if(relativeErrorVariationInUp) {
1974 TCanvas* relativeErrorVariation(
new TCanvas(Form(
"relativeError_%s", type.Data()), Form(
"relativeError_%s", type.Data())));
1975 relativeErrorVariation->Divide(2);
1976 relativeErrorVariation->cd(1);
1977 Style(gPad,
"GRID");
1978 relativeErrorVariationInUp->DrawCopy(
"b");
1979 relativeErrorVariationInLow->DrawCopy(
"same b");
1981 relativeErrorVariation->cd(2);
1982 Style(gPad,
"GRID");
1983 relativeErrorVariationOutUp->DrawCopy(
"b");
1984 relativeErrorVariationOutLow->DrawCopy(
"same b");
1987 relativeErrorVariation->Write();
1992 TF1* lin =
new TF1(
"lin",
"[0]", rangeLow, rangeUp);
1993 relativeErrorVariationInUp->Fit(lin,
"L",
"", rangeLow, rangeUp);
1994 if(gMinuit->fISW[1] != 3) printf(
" fit is NOT ok ! " );
1995 for(
Int_t i(0); i < relativeErrorVariationInUp->GetNbinsX(); i++) {
1996 relativeErrorVariationInUp->SetBinContent(i+1, lin->GetParameter(0));
1998 relativeErrorVariationInLow->Fit(lin,
"L",
"", rangeLow, rangeUp);
1999 printf(
" > Fit over diced resonse, new value for all bins is %.4f < \n ", lin->GetParameter(0));
2000 for(
Int_t i(0); i < relativeErrorVariationInUp->GetNbinsX(); i++) {
2001 relativeErrorVariationInLow->SetBinContent(i+1, 0);
2003 relativeErrorVariationOutUp->Fit(lin,
"L",
"", rangeLow, rangeUp);
2004 printf(
" > Fit over diced resonse, new value for all bins is %.4f < \n ", lin->GetParameter(0));
2005 for(
Int_t i(0); i < relativeErrorVariationInUp->GetNbinsX(); i++) {
2006 relativeErrorVariationOutUp->SetBinContent(i+1, lin->GetParameter(0));
2008 relativeErrorVariationOutLow->Fit(lin,
"L",
"", rangeLow, rangeUp);
2009 printf(
" > Fit over diced resonse, new value for all bins is %.4f < \n ", lin->GetParameter(0));
2010 for(
Int_t i(0); i < relativeErrorVariationInUp->GetNbinsX(); i++) {
2011 relativeErrorVariationOutLow->SetBinContent(i+1, 0);
2016 if(variations2ndIn && variations2ndOut) {
2020 relativeError2ndVariationInUp,
2021 relativeError2ndVariationInLow,
2022 relativeError2ndVariationOutUp,
2023 relativeError2ndVariationOutLow,
2024 relativeStatisticalErrorIn,
2025 relativeStatisticalErrorOut,
2036 if(relativeError2ndVariationInUp) {
2038 TCanvas* relativeError2ndVariation(
new TCanvas(Form(
"relativeError2nd_%s", type2.Data()), Form(
"relativeError2nd_%s", type2.Data())));
2039 relativeError2ndVariation->Divide(2);
2040 relativeError2ndVariation->cd(1);
2041 Style(gPad,
"GRID");
2042 relativeError2ndVariationInUp->DrawCopy(
"b");
2043 relativeError2ndVariationInLow->DrawCopy(
"same b");
2045 relativeError2ndVariation->cd(2);
2046 Style(gPad,
"GRID");
2047 relativeError2ndVariationOutUp->DrawCopy(
"b");
2048 relativeError2ndVariationOutLow->DrawCopy(
"same b");
2051 relativeError2ndVariation->Write();
2057 TH1D* relativeErrorInUp(
new TH1D(
"max correlated uncertainty in plane",
"max correlated uncertainty in plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2058 TH1D* relativeErrorOutUp(
new TH1D(
"max correlated uncertainty out of plane",
"max correlated uncertainty out of plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2059 TH1D* relativeErrorInLow(
new TH1D(
"min correlated uncertainty in plane",
"min correlated uncertainty in plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2060 TH1D* relativeErrorOutLow(
new TH1D(
"min correlated uncertainty out of plane",
"min correlated uncertainty out of plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2061 relativeErrorInUp->SetYTitle(
"relative uncertainty");
2062 relativeErrorOutUp->SetYTitle(
"relative uncertainty");
2063 relativeErrorInLow->SetYTitle(
"relative uncertainty");
2064 relativeErrorOutLow->SetYTitle(
"relative uncertainty");
2067 Double_t aInUp(0.), bInUp(0.), cInUp(0.), dInUp(0.);
2068 Double_t aOutUp(0.), bOutUp(0.), cOutUp(0.), dOutUp(0.);
2069 Double_t aInLow(0.), bInLow(0.), cInLow(0.), dInLow(0.);
2070 Double_t aOutLow(0.), bOutLow(0.), cOutLow(0.), dOutLow(0.);
2074 if(relativeErrorVariationInUp) aInUp = relativeErrorVariationInUp->GetBinContent(b+1);
2075 if(relativeErrorVariationOutUp) aOutUp = relativeErrorVariationOutUp->GetBinContent(b+1);
2076 if(relativeError2ndVariationInUp) bInUp = relativeError2ndVariationInUp->GetBinContent(b+1);
2077 if(relativeError2ndVariationOutUp) bInLow = relativeError2ndVariationOutUp->GetBinContent(b+1);
2078 dInUp = aInUp*aInUp + bInUp*bInUp + cInUp*cInUp;
2080 if(sym) dInUp += aInLow*aInLow;
2081 if(dInUp > 0) relativeErrorInUp->SetBinContent(b+1, TMath::Sqrt(dInUp));
2082 dOutUp = aOutUp*aOutUp + bOutUp*bOutUp + cOutUp*cOutUp;
2083 if(sym) dOutUp += aOutLow*aOutLow;
2084 if(dOutUp > 0) relativeErrorOutUp->SetBinContent(b+1, TMath::Sqrt(dOutUp));
2086 if(relativeErrorVariationInLow) aInLow = relativeErrorVariationInLow->GetBinContent(b+1);
2087 if(relativeErrorVariationOutLow) aOutLow = relativeErrorVariationOutLow->GetBinContent(b+1);
2088 if(relativeError2ndVariationInLow) bInLow = relativeError2ndVariationInLow->GetBinContent(b+1);
2089 if(relativeError2ndVariationOutLow) bOutLow = relativeError2ndVariationOutLow->GetBinContent(b+1);
2090 dInLow = aInLow*aInLow + bInLow*bInLow + cInLow*cInLow;
2091 if(sym) dInLow += aInUp*aInUp;
2092 if(dInLow > 0) relativeErrorInLow->SetBinContent(b+1, -1*TMath::Sqrt(dInLow));
2093 dOutLow = aOutLow*aOutLow + bOutLow*bOutLow + cOutLow*cOutLow;
2094 if(sym) dOutLow += aOutUp*aOutUp;
2095 if(dOutLow > 0) relativeErrorOutLow->SetBinContent(b+1, -1.*TMath::Sqrt(dOutLow));
2113 lowErr = relativeErrorInLow->GetBinContent(i+1)*relativeErrorInLow->GetBinContent(i+1)+relativeErrorOutUp->GetBinContent(1+i)*relativeErrorOutUp->GetBinContent(i+1);
2114 upErr = relativeErrorInUp->GetBinContent(i+1)*relativeErrorInUp->GetBinContent(i+1)+relativeErrorOutLow->GetBinContent(i+1)*relativeErrorOutLow->GetBinContent(i+1);
2116 lowErr = relativeErrorInLow->GetBinContent(i+1)*relativeErrorInLow->GetBinContent(i+1)+relativeErrorOutLow->GetBinContent(1+i)*relativeErrorOutLow->GetBinContent(i+1) -2.*corr*relativeErrorInLow->GetBinContent(i+1)*relativeErrorOutLow->GetBinContent(i+1);
2117 upErr = relativeErrorInUp->GetBinContent(i+1)*relativeErrorInUp->GetBinContent(i+1)+relativeErrorOutUp->GetBinContent(i+1)*relativeErrorOutUp->GetBinContent(i+1) - 2.*corr*relativeErrorInUp->GetBinContent(i+1)*relativeErrorOutUp->GetBinContent(i+1);
2119 ayl[i] = TMath::Sqrt(TMath::Abs(lowErr))*nominal->GetBinContent(i+1);
2120 ayh[i] = TMath::Sqrt(TMath::Abs(upErr))*nominal->GetBinContent(i+1);
2122 Double_t binWidth(nominal->GetBinWidth(i+1));
2123 axl[i] = binWidth/2.;
2124 axh[i] = binWidth/2.;
2126 ax[i] = nominal->GetBinCenter(i+1);
2127 ay[i] = nominal->GetBinContent(i+1);
2132 nominalError->SetName(
"correlated uncertainty");
2133 TCanvas* nominalCanvas(
new TCanvas(
"nominalCanvas",
"nominalCanvas"));
2134 nominalCanvas->Divide(2);
2135 nominalCanvas->cd(1);
2136 Style(nominal, kBlack);
2138 nominalError->SetLineColor(kCyan);
2139 nominalError->SetMarkerColor(kCyan);
2140 nominalError->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
2141 nominalError->GetYaxis()->SetRangeUser(.7, 2.2);
2142 nominalError->DrawClone(
"a2");
2143 nominal->DrawCopy(
"same E1");
2145 Style(gPad,
"GRID");
2146 Style(nominalCanvas);
2152 "v_{2} with shape uncertainty",
2156 relativeErrorOutLow,
2161 nominalCanvas->cd(2);
2162 Style(nominalV2, kBlack);
2164 nominalV2Error->SetLineColor(kCyan);
2165 nominalV2Error->SetMarkerColor(kCyan);
2166 nominalV2Error->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
2167 nominalV2Error->DrawClone(
"a2");
2168 nominalV2->DrawClone(
"same E1");
2170 Style(gPad,
"GRID");
2171 Style(nominalCanvas);
2173 nominalCanvas->Write();
2176 TCanvas* relativeError(
new TCanvas(
"relativeCorrelatedError",
" relativeCorrelatedError"));
2177 relativeError->Divide(2);
2178 relativeError->cd(1);
2179 Style(gPad,
"GRID");
2180 relativeErrorInUp->GetYaxis()->SetRangeUser(-1.5, 3.);
2182 Style(relativeErrorInLow, kGreen,
kBar);
2183 relativeErrorInUp->DrawCopy(
"b");
2184 relativeErrorInLow->DrawCopy(
"same b");
2185 Style(relativeStatisticalErrorIn, kRed);
2186 relativeStatisticalErrorIn->DrawCopy(
"same");
2188 relativeError->cd(2);
2189 Style(gPad,
"GRID");
2190 relativeErrorOutUp->GetYaxis()->SetRangeUser(-1.5, 3.);
2192 Style(relativeErrorOutLow, kGreen,
kBar);
2193 relativeErrorOutUp->DrawCopy(
"b");
2194 relativeErrorOutLow->DrawCopy(
"same b");
2195 Style(relativeStatisticalErrorOut, kRed);
2196 relativeStatisticalErrorOut->DrawCopy(
"same");
2201 relativeError->Write();
2220 Bool_t regularizationOnV2
2223 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
2224 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
2228 TFile* readMe(
new TFile(in.Data(),
"READ"));
2229 if(readMe->IsZombie()) {
2230 printf(
" > Fatal error, couldn't read %s for post processing ! < \n", in.Data());
2233 printf(
"\n\n\n\t\t DOSYSTEMATICS \n > Recovered the following file structure : \n <");
2235 TFile* output(
new TFile(out.Data(),
"RECREATE"));
2237 TH1D* relativeErrorRegularizationInLow(0x0);
2238 TH1D* relativeErrorRegularizationInUp(0x0);
2239 TH1D* relativeErrorRecBinInLow(0x0);
2240 TH1D* relativeErrorRecBinInUp(0x0);
2241 TH1D* relativeErrorMethodInLow(0x0);
2242 TH1D* relativeErrorMethodInUp(0x0);
2243 TH1D* relativeErrorRegularizationOutLow(0x0);
2244 TH1D* relativeErrorRegularizationOutUp(0x0);
2245 TH1D* relativeErrorRecBinOutLow(0x0);
2246 TH1D* relativeErrorRecBinOutUp(0x0);
2247 TH1D* relativeStatisticalErrorIn(0x0);
2248 TH1D* relativeStatisticalErrorOut(0x0);
2249 TH1D* relativeErrorMethodOutLow(0x0);
2250 TH1D* relativeErrorMethodOutUp(0x0);
2252 TH1D* nominal(
new TH1D(
"ratio in plane, out of plane",
"ratio in plane, out of plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2254 TH1D* nominalOut(
new TH1D(
"out of plane jet yield",
"out of plane jet yield",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2257 if(regularizationIn && regularizationOut) {
2261 relativeErrorRegularizationInUp,
2262 relativeErrorRegularizationInLow,
2263 relativeErrorRegularizationOutUp,
2264 relativeErrorRegularizationOutLow,
2265 relativeStatisticalErrorIn,
2266 relativeStatisticalErrorOut,
2276 !regularizationOnV2);
2277 if(relativeErrorRegularizationInUp && !regularizationOnV2 ) {
2279 TCanvas* relativeErrorRegularization(
new TCanvas(
"relativeErrorRegularization",
"relativeErrorRegularization"));
2280 relativeErrorRegularization->Divide(2);
2281 relativeErrorRegularization->cd(1);
2282 Style(gPad,
"GRID");
2283 relativeErrorRegularizationInUp->DrawCopy(
"b");
2284 relativeErrorRegularizationInLow->DrawCopy(
"same b");
2286 relativeErrorRegularization->cd(2);
2287 Style(gPad,
"GRID");
2288 relativeErrorRegularizationOutUp->DrawCopy(
"b");
2289 relativeErrorRegularizationOutLow->DrawCopy(
"same b");
2292 relativeErrorRegularization->Write();
2293 }
else if(relativeErrorRegularizationInUp && regularizationOnV2 ) {
2295 TCanvas* relativeErrorRegularization(
new TCanvas(
"relativeErrorRegularization",
"relativeErrorRegularization"));
2296 Style(gPad,
"GRID");
2297 relativeErrorRegularization->cd(1);
2298 TH1F* relativeErrorRegularizationInUpErrors = (TH1F*)relativeErrorRegularizationInUp->Clone();
2299 for(
Int_t i(1); i < relativeErrorRegularizationInUp->GetNbinsX() + 1; i++) {
2300 relativeErrorRegularizationInUpErrors->SetBinContent(i, relativeErrorRegularizationInUp->GetBinError(i));
2301 relativeErrorRegularizationInUpErrors->SetBinError(i, 0);
2303 relativeErrorRegularizationInUpErrors->GetYaxis()->SetTitle(
"absolute error on v_{2} from unfolding");
2304 relativeErrorRegularizationInUpErrors->GetXaxis()->SetTitle(
"#it{p}_{T, jet}^{ch} (GeV/#it{c})");
2305 relativeErrorRegularizationInUpErrors->DrawCopy(
"b");
2306 Style(gPad,
"GRID");
2307 relativeErrorRegularization->Write();
2310 if(recBinIn && recBinOut) {
2314 relativeErrorRecBinInUp,
2315 relativeErrorRecBinInLow,
2316 relativeErrorRecBinOutUp,
2317 relativeErrorRecBinOutLow,
2318 relativeStatisticalErrorIn,
2319 relativeStatisticalErrorOut,
2330 if(relativeErrorRecBinOutUp) {
2332 TCanvas* relativeErrorRecBin(
new TCanvas(
"relativeErrorRecBin",
" relativeErrorRecBin"));
2333 relativeErrorRecBin->Divide(2);
2334 relativeErrorRecBin->cd(1);
2335 Style(gPad,
"GRID");
2336 relativeErrorRecBinInUp->DrawCopy(
"b");
2337 relativeErrorRecBinInLow->DrawCopy(
"same b");
2339 relativeErrorRecBin->cd(2);
2340 Style(gPad,
"GRID");
2341 relativeErrorRecBinOutUp->DrawCopy(
"b");
2342 relativeErrorRecBinOutLow->DrawCopy(
"same b");
2345 relativeErrorRecBin->Write();
2348 if(methodIn && methodOut) {
2352 relativeErrorMethodInUp,
2353 relativeErrorMethodInLow,
2354 relativeErrorMethodOutUp,
2355 relativeErrorMethodOutLow,
2356 relativeStatisticalErrorIn,
2357 relativeStatisticalErrorOut,
2368 if(relativeErrorMethodInUp) {
2369 TCanvas* relativeErrorMethod(
new TCanvas(
"relativeErrorMethod",
"relativeErrorMethod"));
2370 relativeErrorMethod->Divide(2);
2371 relativeErrorMethod->cd(1);
2372 Style(gPad,
"GRID");
2373 relativeErrorMethodInUp->DrawCopy(
"b");
2374 relativeErrorMethodInLow->DrawCopy(
"same b");
2376 relativeErrorMethod->cd(2);
2377 Style(gPad,
"GRID");
2378 relativeErrorMethodOutUp->DrawCopy(
"b");
2379 relativeErrorMethodOutLow->DrawCopy(
"same b");
2382 relativeErrorMethod->Write();
2387 TH1D* relativeErrorInUp(
new TH1D(
"max shape uncertainty in plane",
"max shape uncertainty in plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2388 TH1D* relativeErrorOutUp(
new TH1D(
"max shape uncertainty out of plane",
"max shape uncertainty out of plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2389 TH1D* relativeErrorInLow(
new TH1D(
"min shape uncertainty in plane",
"min shape uncertainty in plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2390 TH1D* relativeErrorOutLow(
new TH1D(
"min shape uncertainty out of plane",
"min shape uncertainty out of plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2391 relativeErrorInUp->SetYTitle(
"relative uncertainty");
2392 relativeErrorOutUp->SetYTitle(
"relative uncertainty");
2393 relativeErrorInLow->SetYTitle(
"relative uncertainty");
2394 relativeErrorOutLow->SetYTitle(
"relative uncertainty");
2397 Double_t aInUp(0.), cInUp(0.), dInUp(0.), eInUp(0.);
2398 Double_t aOutUp(0.), cOutUp(0.), dOutUp(0.), eOutUp(0.);
2399 Double_t aInLow(0.), cInLow(0.), dInLow(0.), eInLow(0.);
2400 Double_t aOutLow(0.), cOutLow(0.), dOutLow(0.), eOutLow(0.);
2409 if(relativeErrorRegularizationInUp && !regularizationOnV2) aInUp = relativeErrorRegularizationInUp->GetBinContent(b+1);
2410 if(relativeErrorRegularizationOutUp && !regularizationOnV2) aOutUp = relativeErrorRegularizationOutUp->GetBinContent(b+1);
2411 if(relativeErrorRecBinInUp) cInUp = relativeErrorRecBinInUp->GetBinContent(b+1);
2412 if(relativeErrorRecBinOutUp) cOutUp = relativeErrorRecBinOutUp->GetBinContent(b+1);
2413 if(relativeErrorMethodInUp) dInUp = relativeErrorMethodInUp->GetBinContent(b+1);
2414 if(relativeErrorMethodOutUp) dOutUp = relativeErrorMethodOutUp->GetBinContent(b+1);
2416 if(relativeErrorRegularizationInLow) aInLow = relativeErrorRegularizationInLow->GetBinContent(b+1);
2417 if(relativeErrorRegularizationOutLow) aOutLow = relativeErrorRegularizationOutLow->GetBinContent(b+1);
2418 if(relativeErrorRecBinInLow) cInLow = relativeErrorRecBinInLow->GetBinContent(b+1);
2419 if(relativeErrorRecBinOutLow) cOutLow = relativeErrorRecBinOutLow->GetBinContent(b+1);
2420 if(relativeErrorMethodInLow) dInLow = relativeErrorMethodInLow->GetBinContent(b+1);
2421 if(relativeErrorMethodOutLow) dOutLow = relativeErrorMethodOutLow->GetBinContent(b+1);
2430 if(aInLow > aInUp) { aInUp = aInLow;
2431 }
else {aInLow = aInUp;}
2432 if(aOutLow > aOutUp) { aOutUp = aOutLow;
2433 }
else { aOutLow = aOutUp;}
2434 if(cInLow > cInUp) { cInUp = cInLow;
2435 }
else {cInLow = cInUp; };
2436 if(cOutLow > cOutUp ) { cOutUp = cOutLow;
2437 }
else { cOutLow = cOutUp; }
2439 if(dInLow < dInUp) {dInLow = dInUp;
2440 }
else { dInUp = dInLow;}
2441 if(dOutLow < dOutUp) { dOutLow = dOutUp;
2442 }
else { dOutUp = dOutLow; }
2445 eInUp = aInUp*aInUp + cInUp*cInUp + dInUp*dInUp;
2446 if(eInUp > 0) relativeErrorInUp->SetBinContent(b+1, 1.*TMath::Sqrt(eInUp));
2447 eOutUp = aOutUp*aOutUp + cOutUp*cOutUp + dOutUp*dOutUp;
2448 if(eOutUp > 0) relativeErrorOutUp->SetBinContent(b+1, 1.*TMath::Sqrt(eOutUp));
2450 eInLow = aInLow*aInLow + cInLow*cInLow + dInLow*dInLow;
2451 if(eInLow > 0) relativeErrorInLow->SetBinContent(b+1, -1.*TMath::Sqrt(eInLow));
2452 eOutLow = aOutLow*aOutLow + cOutLow*cOutLow + dOutLow*dOutLow;
2453 if(eOutLow > 0) relativeErrorOutLow->SetBinContent(b+1, -1.*TMath::Sqrt(eOutLow));
2455 printf(
"%i) \teInUp %.4f \t eInLow %.4f \t eOutUp %4.f \t eOutLow %4.f \n", b, eInUp, eInLow, eOutUp, eOutLow);
2471 lowErr = relativeErrorInLow->GetBinContent(i+1)*relativeErrorInLow->GetBinContent(i+1)+relativeErrorOutUp->GetBinContent(1+i)*relativeErrorOutUp->GetBinContent(i+1);
2472 upErr = relativeErrorInUp->GetBinContent(i+1)*relativeErrorInUp->GetBinContent(i+1)+relativeErrorOutLow->GetBinContent(i+1)*relativeErrorOutLow->GetBinContent(i+1);
2474 ayl[i] = TMath::Sqrt(lowErr)*nominal->GetBinContent(i+1);
2475 ayh[i] = TMath::Sqrt(upErr)*nominal->GetBinContent(i+1);
2477 Double_t binWidth(nominal->GetBinWidth(i+1));
2478 axl[i] = binWidth/2.;
2479 axh[i] = binWidth/2.;
2481 ax[i] = nominal->GetBinCenter(i+1);
2482 ay[i] = nominal->GetBinContent(i+1);
2488 nominalError->SetName(
"shape uncertainty");
2489 TCanvas* nominalCanvas(
new TCanvas(
"nominalCanvas",
"nominalCanvas"));
2490 nominalCanvas->Divide(2);
2491 nominalCanvas->cd(1);
2492 Style(nominal, kBlack);
2494 nominalError->SetLineColor(kCyan);
2495 nominalError->SetMarkerColor(kCyan);
2496 nominalError->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
2497 nominalError->GetYaxis()->SetRangeUser(.7, 2.2);
2498 nominalError->DrawClone(
"a2");
2499 nominal->DrawCopy(
"same E1");
2501 Style(gPad,
"GRID");
2502 Style(nominalCanvas);
2508 "v_{2} with shape uncertainty",
2512 relativeErrorOutLow,
2519 nominalCanvas->cd(2);
2520 Style(nominalV2, kBlack);
2522 nominalV2Error->SetLineColor(kCyan);
2523 nominalV2Error->SetMarkerColor(kCyan);
2524 nominalV2Error->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
2525 nominalV2Error->DrawClone(
"a2");
2526 nominalV2->DrawClone(
"same E1");
2528 Style(gPad,
"GRID");
2529 Style(nominalCanvas);
2531 nominalCanvas->Write();
2533 TCanvas* relativeError(
new TCanvas(
"relativeError",
" relativeError"));
2534 relativeError->Divide(2);
2535 relativeError->cd(1);
2536 Style(gPad,
"GRID");
2537 relativeErrorInUp->GetYaxis()->SetRangeUser(-1.5, 3.);
2539 Style(relativeErrorInLow, kGreen,
kBar);
2540 relativeErrorInUp->DrawCopy(
"b");
2541 relativeErrorInLow->DrawCopy(
"same b");
2542 Style(relativeStatisticalErrorIn, kRed);
2543 relativeStatisticalErrorIn->DrawCopy(
"same");
2545 relativeError->cd(2);
2546 Style(gPad,
"GRID");
2548 Style(relativeErrorOutLow, kGreen,
kBar);
2549 relativeErrorOutUp->DrawCopy(
"b");
2550 if(relativeErrorOutLow) relativeErrorOutLow->DrawCopy(
"same b");
2551 if(relativeStatisticalErrorOut)
Style(relativeStatisticalErrorOut, kRed);
2552 if(relativeStatisticalErrorOut) relativeStatisticalErrorOut->DrawCopy(
"same");
2557 relativeError->Write();
2564 TH1D*& relativeErrorInUp,
2565 TH1D*& relativeErrorInLow,
2566 TH1D*& relativeErrorOutUp,
2567 TH1D*& relativeErrorOutLow,
2568 TH1D*& relativeStatisticalErrorIn,
2569 TH1D*& relativeStatisticalErrorOut,
2582 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
2583 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
2589 printf(
" >>> systematic wrapper called for %s <<< \n", source.Data());
2595 return (this->*myFunction)(
2601 relativeErrorOutLow,
2602 relativeStatisticalErrorIn,
2603 relativeStatisticalErrorOut,
2618 TH1D*& relativeErrorInUp,
2619 TH1D*& relativeErrorInLow,
2620 TH1D*& relativeErrorOutUp,
2621 TH1D*& relativeErrorOutLow,
2622 TH1D*& relativeStatisticalErrorIn,
2623 TH1D*& relativeStatisticalErrorOut,
2635 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
2636 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
2639 TList* listOfKeys((
TList*)readMe->GetListOfKeys());
2641 printf(
" > Fatal error, couldn't retrieve list of keys. Input file might have been corrupted ! < \n");
2645 if(variationsIn->GetSize() != variationsOut->GetSize()) {
2646 printf(
" > DoSystematics: fatal error, input arrays have different sizes ! < \n ");
2649 TDirectoryFile* defRootDirIn(dynamic_cast<TDirectoryFile*>(readMe->Get(listOfKeys->At(variationsIn->At(0))->GetName())));
2650 TDirectoryFile* defRootDirOut(dynamic_cast<TDirectoryFile*>(readMe->Get(listOfKeys->At(variationsOut->At(0))->GetName())));
2651 if(!(defRootDirIn && defRootDirOut)) {
2652 printf(
" > DoSystematics: fatal error, couldn't retrieve nominal values ! < \n ");
2655 TString defIn(defRootDirIn->GetName());
2656 TString defOut(defRootDirOut->GetName());
2659 TLine* lineLow(
new TLine(rangeLow, 0., rangeLow, 2.));
2660 TLine* lineUp(
new TLine(rangeUp, 0., rangeUp, 2.));
2661 lineLow->SetLineColor(11);
2662 lineUp->SetLineColor(11);
2663 lineLow->SetLineWidth(3);
2664 lineUp->SetLineWidth(3);
2671 relativeErrorInUp =
new TH1D(Form(
"relative error (up) from %s", source.Data()), Form(
"relative error (up) from %s", source.Data()),
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray());
2672 relativeErrorInLow =
new TH1D(Form(
"relative error (low) from %s", source.Data()), Form(
"relative error (low) from %s", source.Data()),
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray());
2673 relativeErrorOutUp =
new TH1D(Form(
"relative error (up) from %s", source.Data()), Form(
"relative error (up) from %s", source.Data()),
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray());
2674 relativeErrorOutLow =
new TH1D(Form(
"relative error (low) from %s", source.Data()), Form(
"relative error (low) from %s", source.Data()),
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray());
2677 relativeErrorInUp->SetBinContent(b+1, 1.);
2678 relativeErrorInUp->SetBinError(b+1, 0.);
2679 relativeErrorOutUp->SetBinContent(b+1, 1.);
2680 relativeErrorOutUp->SetBinError(b+1, .0);
2681 relativeErrorInLow->SetBinContent(b+1, 1.);
2682 relativeErrorInLow->SetBinError(b+1, 0.);
2683 relativeErrorOutLow->SetBinContent(b+1, 1.);
2684 relativeErrorOutLow->SetBinError(b+1, .0);
2686 relativeErrorInUp->SetBinContent(b+1, 0.);
2687 relativeErrorInUp->SetBinError(b+1, 0.);
2688 relativeErrorOutUp->SetBinContent(b+1, 0.);
2689 relativeErrorOutUp->SetBinError(b+1, 0.);
2690 relativeErrorInLow->SetBinContent(b+1, 0.);
2691 relativeErrorInLow->SetBinError(b+1, 0.);
2692 relativeErrorOutLow->SetBinContent(b+1, 0.);
2693 relativeErrorOutLow->SetBinError(b+1, 0.);
2696 Int_t relativeErrorInUpN[100] = {0};
2697 Int_t relativeErrorOutUpN[100] = {0};
2698 Int_t relativeErrorInLowN[100] = {0};
2699 Int_t relativeErrorOutLowN[100] = {0};
2702 if(!relativeStatisticalErrorIn || !relativeStatisticalErrorOut) {
2703 relativeStatisticalErrorIn =
new TH1D(
"relative statistical error, in plane",
"relative statistical error, in plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray());
2704 relativeStatisticalErrorOut =
new TH1D(
"relative statistical error, out of plane",
"relative statistital error, out of plane",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray());
2708 TCanvas* canvasIn(
new TCanvas(Form(
"SYST_%s_PearsonIn", source.Data()), Form(
"SYST_%s_PearsonIn", source.Data())));
2709 TCanvas* canvasOut(0x0);
2710 if(
fDphiUnfolding) canvasOut =
new TCanvas(Form(
"SYST_%s_PearsonOut", source.Data()), Form(
"SYST_%s_PearsonOut", source.Data()));
2711 TCanvas* canvasRatioMeasuredRefoldedIn(
new TCanvas(Form(
"SYST_%s_RefoldedIn", source.Data()), Form(
"SYST_%s_RefoldedIn", source.Data())));
2712 TCanvas* canvasRatioMeasuredRefoldedOut(0x0);
2713 if(
fDphiUnfolding) canvasRatioMeasuredRefoldedOut =
new TCanvas(Form(
"SYST_%s_RefoldedOut", source.Data()), Form(
"SYST_%s_RefoldedOut", source.Data()));
2714 TCanvas* canvasSpectraIn(
new TCanvas(Form(
"SYST_%s_SpectraIn", source.Data()), Form(
"SYST_%s_SpectraIn", source.Data())));
2715 TCanvas* canvasSpectraOut(0x0);
2716 if(
fDphiUnfolding) canvasSpectraOut =
new TCanvas(Form(
"SYST_%s_SpectraOut", source.Data()), Form(
"SYST_%s_SpectraOut", source.Data()));
2717 TCanvas* canvasRatio(0x0);
2718 if(
fDphiUnfolding) canvasRatio =
new TCanvas(Form(
"SYST_%s_Ratio", source.Data()), Form(
"SYST_%s_Ratio", source.Data()));
2719 TCanvas* canvasV2(0x0);
2720 if(
fDphiUnfolding) canvasV2 =
new TCanvas(Form(
"SYST_%s_V2", source.Data()), Form(
"SYST_%s_V2", source.Data()));
2721 TCanvas* canvasMISC(
new TCanvas(Form(
"SYST_%s_MISC", source.Data()), Form(
"SYST_%s_MISC", source.Data())));
2722 TCanvas* canvasMasterIn(
new TCanvas(Form(
"SYST_%s_defaultIn", source.Data()), Form(
"SYST_%s_defaultIn", source.Data())));
2723 TCanvas* canvasMasterOut(0x0);
2724 if(
fDphiUnfolding) canvasMasterOut =
new TCanvas(Form(
"SYST_%s_defaultOut", source.Data()), Form(
"SYST_%s_defaultOut", source.Data()));
2725 (
fDphiUnfolding) ? canvasMISC->Divide(4, 2) : canvasMISC->Divide(4, 1);
2727 TCanvas* canvasProfiles(
new TCanvas(Form(
"SYST_%s_canvasProfiles", source.Data()), Form(
"SYST_%s_canvasProfiles", source.Data())));
2728 canvasProfiles->Divide(2);
2729 TProfile* ratioProfile(
new TProfile(Form(
"SYST_%s_ratioProfile", source.Data()), Form(
"SYST_%s_ratioProfile", source.Data()),
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2730 TProfile* v2Profile(
new TProfile(Form(
"SYST_%s_v2Profile", source.Data()), Form(
"SYST_%s_v2Profile", source.Data()),
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
2734 columns = variationsIn->GetSize()-1;
2735 (TMath::Floor(variationsIn->GetSize()/(float)columns)+((variationsIn->GetSize()%columns)>0));
2736 canvasIn->Divide(columns, rows);
2737 if(canvasOut) canvasOut->Divide(columns, rows);
2738 canvasRatioMeasuredRefoldedIn->Divide(columns, rows);
2739 if(canvasRatioMeasuredRefoldedOut) canvasRatioMeasuredRefoldedOut->Divide(columns, rows);
2740 canvasSpectraIn->Divide(columns, rows);
2741 if(canvasSpectraOut) canvasSpectraOut->Divide(columns, rows);
2742 if(canvasRatio) canvasRatio->Divide(columns, rows);
2743 if(canvasV2) canvasV2->Divide(columns, rows);
2744 canvasMasterIn->Divide(columns, rows);
2745 if(canvasMasterOut) canvasMasterOut->Divide(columns, rows);
2748 TCanvas* canvasNominalIn(
new TCanvas(Form(
"Nominal_%s_PearsonIn", source.Data()), Form(
"Nominal_%s_PearsonIn", source.Data())));
2749 TCanvas* canvasNominalOut(0x0);
2750 if(
fDphiUnfolding) canvasNominalOut =
new TCanvas(Form(
"Nominal_%s_PearsonOut", source.Data()), Form(
"Nominal_%s_PearsonOut", source.Data()));
2751 TCanvas* canvasNominalRatioMeasuredRefoldedIn(
new TCanvas(Form(
"Nominal_%s_RefoldedIn", source.Data()), Form(
"Nominal_%s_RefoldedIn", source.Data())));
2752 TCanvas* canvasNominalRatioMeasuredRefoldedOut(0x0);
2753 if(
fDphiUnfolding) canvasNominalRatioMeasuredRefoldedOut =
new TCanvas(Form(
"Nominal_%s_RefoldedOut", source.Data()), Form(
"Nominal_%s_RefoldedOut", source.Data()));
2754 TCanvas* canvasNominalSpectraIn(
new TCanvas(Form(
"Nominal_%s_SpectraIn", source.Data()), Form(
"Nominal_%s_SpectraIn", source.Data())));
2755 TCanvas* canvasNominalSpectraOut(0x0);
2756 if(
fDphiUnfolding) canvasNominalSpectraOut =
new TCanvas(Form(
"Nominal_%s_SpectraOut", source.Data()), Form(
"Nominal_%s_SpectraOut", source.Data()));
2757 TCanvas* canvasNominalRatio(0x0);
2758 if(
fDphiUnfolding) canvasNominalRatio =
new TCanvas(Form(
"Nominal_%s_Ratio", source.Data()), Form(
"Nominal_%s_Ratio", source.Data()));
2759 TCanvas* canvasNominalV2(0x0);
2760 if(
fDphiUnfolding) canvasNominalV2 =
new TCanvas(Form(
"Nominal_%s_V2", source.Data()), Form(
"Nominal_%s_V2", source.Data()));
2761 TCanvas* canvasNominalMISC(
new TCanvas(Form(
"Nominal_%s_MISC", source.Data()), Form(
"Nominal_%s_MISC", source.Data())));
2762 TCanvas* canvasNominalMasterIn(
new TCanvas(Form(
"Nominal_%s_defaultIn", source.Data()), Form(
"Nominal_%s_defaultIn", source.Data())));
2763 TCanvas* canvasNominalMasterOut(0x0);
2764 if(
fDphiUnfolding) canvasNominalMasterOut =
new TCanvas(Form(
"Nominal_%s_defaultOut", source.Data()), Form(
"Nominal_%s_defaultOut", source.Data()));
2765 (
fDphiUnfolding) ? canvasNominalMISC->Divide(4, 2) : canvasNominalMISC->Divide(4, 1);
2767 canvasNominalSpectraIn->Divide(2);
2768 if(canvasNominalSpectraOut) canvasNominalSpectraOut->Divide(2);
2770 canvasNominalMasterIn->Divide(2);
2771 if(canvasNominalMasterOut) canvasNominalMasterOut->Divide(2);
2774 TH1D* defaultUnfoldedJetSpectrumIn(0x0);
2775 TH1D* defaultUnfoldedJetSpectrumOut(0x0);
2776 TDirectoryFile* defDirIn = (TDirectoryFile*)defRootDirIn->Get(Form(
"InPlane___%s", defIn.Data()));
2777 TDirectoryFile* defDirOut = (TDirectoryFile*)defRootDirOut->Get(Form(
"OutOfPlane___%s", defOut.Data()));
2778 if(defDirIn) defaultUnfoldedJetSpectrumIn = (
TH1D*)defDirIn->Get(Form(
"UnfoldedSpectrum_in_%s", defIn.Data()));
2779 if(defDirOut) defaultUnfoldedJetSpectrumOut = (
TH1D*)defDirOut->Get(Form(
"UnfoldedSpectrum_out_%s", defOut.Data()));
2780 printf(
" > succesfully extracted default results < \n");
2783 TDirectoryFile* tempDirIn(0x0);
2784 TDirectoryFile* tempDirOut(0x0);
2785 TDirectoryFile* tempIn(0x0);
2786 TDirectoryFile* tempOut(0x0);
2787 TH1D* unfoldedSpectrumInForRatio(0x0);
2788 TH1D* unfoldedSpectrumOutForRatio(0x0);
2789 for(
Int_t i(0), j(-1); i < variationsIn->GetSize(); i++) {
2790 tempDirIn = (
dynamic_cast<TDirectoryFile*
>(readMe->Get(listOfKeys->At(variationsIn->At(i))->GetName())));
2791 tempDirOut = (
dynamic_cast<TDirectoryFile*
>(readMe->Get(listOfKeys->At(variationsOut->At(i))->GetName())));
2792 if(!(tempDirIn && tempDirOut)) {
2793 printf(
" > DoSystematics: couldn't get a set of variations < \n");
2796 TString dirNameIn(tempDirIn->GetName());
2797 TString dirNameOut(tempDirOut->GetName());
2799 tempIn = (TDirectoryFile*)tempDirIn->Get(Form(
"InPlane___%s", dirNameIn.Data()));
2800 tempOut = (TDirectoryFile*)tempDirOut->Get(Form(
"OutOfPlane___%s", dirNameOut.Data()));
2804 TH2D* pIn((
TH2D*)tempIn->Get(Form(
"PearsonCoefficients_in_%s", dirNameIn.Data())));
2806 printf(
" - %s in plane converged \n", dirNameIn.Data());
2808 if(i==0) canvasNominalIn->cd(j);
2809 Style(gPad,
"PEARSON");
2810 pIn->DrawCopy(
"colz");
2814 printf(
" > found RatioRefoldedMeasured < \n");
2815 canvasRatioMeasuredRefoldedIn->cd(j);
2816 if(i==0) canvasNominalRatioMeasuredRefoldedIn->cd(j);
2817 Style(gPad,
"GRID");
2818 rIn->SetFillColor(kRed);
2821 TH1D* dvector((
TH1D*)tempIn->Get(
"dVector"));
2822 TH1D* avalue((
TH1D*)tempIn->Get(
"SingularValuesOfAC"));
2823 TH2D* rm((
TH2D*)tempIn->Get(Form(
"ResponseMatrixIn_%s", dirNameIn.Data())));
2824 TH1D* eff((
TH1D*)tempIn->Get(Form(
"KinematicEfficiencyIn_%s", dirNameIn.Data())));
2825 if(dvector && avalue && rm && eff) {
2831 if(i==0) canvasNominalMISC->cd(1);
2832 Style(gPad,
"SPECTRUM");
2833 dvector->DrawCopy();
2835 if(i==0) canvasNominalMISC->cd(2);
2836 Style(gPad,
"SPECTRUM");
2839 if(i==0) canvasNominalMISC->cd(3);
2840 Style(gPad,
"PEARSON");
2841 rm->DrawCopy(
"colz");
2843 if(i==0) canvasNominalMISC->cd(4);
2844 Style(gPad,
"GRID");
2846 }
else if(rm && eff) {
2850 if(i==0) canvasNominalMISC->cd(3);
2851 Style(gPad,
"PEARSON");
2852 rm->DrawCopy(
"colz");
2854 if(i==0) canvasNominalMISC->cd(4);
2855 Style(gPad,
"GRID");
2859 TH1D* inputSpectrum((
TH1D*)tempIn->Get(Form(
"InputSpectrum_in_%s", dirNameIn.Data())));
2860 TH1D* unfoldedSpectrum((
TH1D*)tempIn->Get(Form(
"UnfoldedSpectrum_in_%s", dirNameIn.Data())));
2861 unfoldedSpectrumInForRatio =
ProtectHeap(unfoldedSpectrum, kFALSE,
TString(
"ForRatio"));
2862 TH1D* refoldedSpectrum((
TH1D*)tempIn->Get(Form(
"RefoldedSpectrum_in_%s", dirNameIn.Data())));
2863 if(inputSpectrum && unfoldedSpectrum && refoldedSpectrum) {
2864 if(defaultUnfoldedJetSpectrumIn) {
2866 TH1D* temp((
TH1D*)defaultUnfoldedJetSpectrumIn->Clone(Form(
"defaultUnfoldedJetSpectrumIn_%s", dirNameIn.Data())));
2867 temp->Divide(unfoldedSpectrum);
2872 if( temp->GetBinContent(b+1) < 1 && temp->GetBinContent(b+1) < relativeErrorInUp->GetBinContent(b+1)) {
2873 relativeErrorInUp->SetBinContent(b+1, temp->GetBinContent(b+1));
2874 relativeErrorInUp->SetBinError(b+1, temp->GetBinError(b+1));
2877 else if(temp->GetBinContent(b+1) > 1 && temp->GetBinContent(b+1) > relativeErrorInLow->GetBinContent(b+1)) {
2878 relativeErrorInLow->SetBinContent(b+1, temp->GetBinContent(b+1));
2879 relativeErrorInLow->SetBinError(b+1, temp->GetBinError(b+1));
2882 printf(
" oops shouldnt be here \n " );
2883 if(temp->GetBinContent(b+1) < 1) {
2884 relativeErrorInUp->SetBinContent(b+1, relativeErrorInUp->GetBinContent(b+1)+TMath::Power(1.-temp->GetBinContent(b+1), 2));
2885 relativeErrorInUpN[b]++;
2888 else if(temp->GetBinContent(b+1) > 1) {
2889 relativeErrorInLow->SetBinContent(b+1, relativeErrorInLow->GetBinContent(b+1)+TMath::Power(1.-temp->GetBinContent(b+1), 2));
2890 relativeErrorInLowN[b]++;
2894 relativeErrorInUp->SetBinContent(b+1, relativeErrorInUp->GetBinContent(b+1)+TMath::Power(temp->GetBinContent(b+1)-1., 2));
2895 relativeErrorInUpN[b]++;
2897 if(temp->GetBinError(b+1) > 0) relativeStatisticalErrorIn->SetBinContent(b+1, temp->GetBinError(b+1)/temp->GetBinContent(b+1));
2899 temp->SetTitle(Form(
"[%s] / [%s]", defIn.Data(), dirNameIn.Data()));
2900 temp->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
2901 temp->GetYaxis()->SetTitle(
"ratio");
2902 canvasMasterIn->cd(j);
2903 temp->GetYaxis()->SetRangeUser(0., 2);
2904 Style(gPad,
"GRID");
2906 canvasNominalMasterIn->cd(1);
2907 Style(gPad,
"GRID");
2909 TH1D* tempSyst((
TH1D*)temp->Clone(Form(
"%s_syst", temp->GetName())));
2910 tempSyst->SetTitle(Form(
"[%s] / [%s]", defIn.Data(), dirNameIn.Data()));
2911 Style(tempSyst, (EColor)(i+2));
2912 if(i==1) tempSyst->DrawCopy();
2913 else tempSyst->DrawCopy(
"same");
2916 TH1F* fitStatus((TH1F*)tempIn->Get(Form(
"fitStatus_%s_in", dirNameIn.Data())));
2917 canvasSpectraIn->cd(j);
2918 if(i==0) canvasNominalSpectraIn->cd(1);
2921 unfoldedSpectrum->DrawCopy();
2923 inputSpectrum->DrawCopy(
"same");
2925 refoldedSpectrum->DrawCopy(
"same");
2928 if(fitStatus && fitStatus->GetNbinsX() == 4) {
2929 Float_t chi(fitStatus->GetBinContent(1));
2930 Float_t pen(fitStatus->GetBinContent(2));
2931 Int_t dof((
int)fitStatus->GetBinContent(3));
2932 Float_t beta(fitStatus->GetBinContent(4));
2933 l->AddEntry((
TObject*)0, Form(
"#chi %.2f \tP %.2f \tDOF %i, #beta %.2f", chi, pen, dof, beta),
"");
2934 }
else if (fitStatus) {
2935 Int_t reg((
int)fitStatus->GetBinContent(1));
2936 l->AddEntry((
TObject*)0, Form(
"REG %i", reg),
"");
2938 canvasNominalSpectraIn->cd(2);
2939 TH1D* tempSyst((
TH1D*)unfoldedSpectrum->Clone(Form(
"%s_syst", unfoldedSpectrum->GetName())));
2940 tempSyst->SetTitle(Form(
"[%s]", dirNameIn.Data()));
2941 Style(tempSyst, (EColor)(i+2));
2942 Style(gPad,
"SPECTRUM");
2943 if(i==0) tempSyst->DrawCopy();
2944 else tempSyst->DrawCopy(
"same");
2948 TH2D* pOut((
TH2D*)tempOut->Get(Form(
"PearsonCoefficients_out_%s", dirNameOut.Data())));
2950 printf(
" - %s out of plane converged \n", dirNameOut.Data());
2952 if(i==0) canvasNominalOut->cd(j);
2953 Style(gPad,
"PEARSON");
2954 pOut->DrawCopy(
"colz");
2958 printf(
" > found RatioRefoldedMeasured < \n");
2959 canvasRatioMeasuredRefoldedOut->cd(j);
2960 if(i==0) canvasNominalRatioMeasuredRefoldedOut->cd(j);
2961 Style(gPad,
"GRID");
2962 rOut->SetFillColor(kRed);
2965 TH1D* dvector((
TH1D*)tempOut->Get(
"dVector"));
2966 TH1D* avalue((
TH1D*)tempOut->Get(
"SingularValuesOfAC"));
2967 TH2D* rm((
TH2D*)tempOut->Get(Form(
"ResponseMatrixOut_%s", dirNameOut.Data())));
2968 TH1D* eff((
TH1D*)tempOut->Get(Form(
"KinematicEfficiencyOut_%s", dirNameOut.Data())));
2969 if(dvector && avalue && rm && eff) {
2975 if(i==0) canvasNominalMISC->cd(5);
2976 Style(gPad,
"SPECTRUM");
2977 dvector->DrawCopy();
2979 if(i==0) canvasNominalMISC->cd(6);
2980 Style(gPad,
"SPECTRUM");
2983 if(i==0) canvasNominalMISC->cd(7);
2984 Style(gPad,
"PEARSON");
2985 rm->DrawCopy(
"colz");
2987 if(i==0) canvasNominalMISC->cd(8);
2988 Style(gPad,
"GRID");
2990 }
else if(rm && eff) {
2994 if(i==0) canvasNominalMISC->cd(7);
2995 Style(gPad,
"PEARSON");
2996 rm->DrawCopy(
"colz");
2998 if(i==0) canvasNominalMISC->cd(8);
2999 Style(gPad,
"GRID");
3003 TH1D* inputSpectrum((
TH1D*)tempOut->Get(Form(
"InputSpectrum_out_%s", dirNameOut.Data())));
3004 TH1D* unfoldedSpectrum((
TH1D*)tempOut->Get(Form(
"UnfoldedSpectrum_out_%s", dirNameOut.Data())));
3005 unfoldedSpectrumOutForRatio =
ProtectHeap(unfoldedSpectrum, kFALSE,
TString(
"ForRatio"));
3006 TH1D* refoldedSpectrum((
TH1D*)tempOut->Get(Form(
"RefoldedSpectrum_out_%s", dirNameOut.Data())));
3007 if(inputSpectrum && unfoldedSpectrum && refoldedSpectrum) {
3008 if(defaultUnfoldedJetSpectrumOut) {
3010 TH1D* temp((
TH1D*)defaultUnfoldedJetSpectrumOut->Clone(Form(
"defaultUnfoldedJetSpectrumOut_%s", dirNameOut.Data())));
3011 temp->Divide(unfoldedSpectrum);
3016 if(temp->GetBinContent(b+1) < 1 && temp->GetBinContent(b+1) < relativeErrorOutUp->GetBinContent(b+1)) {
3017 relativeErrorOutUp->SetBinContent(b+1, temp->GetBinContent(b+1));
3018 relativeErrorOutUp->SetBinError(b+1, temp->GetBinError(b+1));
3021 else if(temp->GetBinContent(b+1) > 1 && temp->GetBinContent(b+1) > relativeErrorOutLow->GetBinContent(b+1)) {
3022 relativeErrorOutLow->SetBinContent(b+1, temp->GetBinContent(b+1));
3023 relativeErrorOutLow->SetBinError(b+1, temp->GetBinError(b+1));
3026 printf(
" OOps \n ");
3027 if(temp->GetBinContent(b+1) < 1) {
3028 relativeErrorOutUp->SetBinContent(b+1, relativeErrorOutUp->GetBinContent(b+1)+TMath::Power(1.-temp->GetBinContent(b+1), 2));
3029 relativeErrorOutUpN[b]++;
3031 else if(temp->GetBinContent(b+1) > 1) {
3032 relativeErrorOutLow->SetBinContent(b+1, relativeErrorOutLow->GetBinContent(b+1)+TMath::Power(1.-temp->GetBinContent(b+1), 2));
3033 relativeErrorOutLowN[b]++;
3037 relativeErrorOutUp->SetBinContent(b+1, relativeErrorOutUp->GetBinContent(b+1)+TMath::Power(temp->GetBinContent(b+1)-1., 2));
3038 relativeErrorOutUpN[b]++;
3040 if(temp->GetBinError(b+1) > 0) relativeStatisticalErrorOut->SetBinContent(b+1, temp->GetBinError(b+1)/temp->GetBinContent(b+1));
3042 temp->SetTitle(Form(
"[%s] / [%s]", defOut.Data(), dirNameOut.Data()));
3043 temp->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
3044 temp->GetYaxis()->SetTitle(
"ratio");
3045 canvasMasterOut->cd(j);
3046 temp->GetYaxis()->SetRangeUser(0., 2);
3047 Style(gPad,
"GRID");
3049 canvasNominalMasterOut->cd(1);
3050 Style(gPad,
"GRID");
3052 TH1D* tempSyst((
TH1D*)temp->Clone(Form(
"%s_syst", temp->GetName())));
3053 tempSyst->SetTitle(Form(
"[%s] / [%s]", defOut.Data(), dirNameOut.Data()));
3054 Style(tempSyst, (EColor)(i+2));
3055 if(i==1) tempSyst->DrawCopy();
3056 else tempSyst->DrawCopy(
"same");
3059 TH1F* fitStatus((TH1F*)tempOut->Get(Form(
"fitStatus_%s_out", dirNameOut.Data())));
3060 canvasSpectraOut->cd(j);
3061 if(i==0) canvasNominalSpectraOut->cd(1);
3064 unfoldedSpectrum->DrawCopy();
3066 inputSpectrum->DrawCopy(
"same");
3068 refoldedSpectrum->DrawCopy(
"same");
3071 if(fitStatus && fitStatus->GetNbinsX() == 4) {
3072 Float_t chi(fitStatus->GetBinContent(1));
3073 Float_t pen(fitStatus->GetBinContent(2));
3074 Int_t dof((
int)fitStatus->GetBinContent(3));
3075 Float_t beta(fitStatus->GetBinContent(4));
3076 l->AddEntry((
TObject*)0, Form(
"#chi %.2f \tP %.2f \tDOF %i, #beta %.2f", chi, pen, dof, beta),
"");
3077 }
else if (fitStatus) {
3078 Int_t reg((
int)fitStatus->GetBinContent(1));
3079 l->AddEntry((
TObject*)0, Form(
"REG %i", reg),
"");
3081 canvasNominalSpectraOut->cd(2);
3082 TH1D* tempSyst((
TH1D*)unfoldedSpectrum->Clone(Form(
"%s_syst", unfoldedSpectrum->GetName())));
3083 tempSyst->SetTitle(Form(
"[%s]", dirNameOut.Data()));
3084 Style(tempSyst, (EColor)(i+2));
3085 Style(gPad,
"SPECTRUM");
3086 if(i==0) tempSyst->DrawCopy();
3087 else tempSyst->DrawCopy(
"same");
3090 if(canvasRatio && canvasV2) {
3093 canvasNominalRatio->cd(j);
3094 if(nominal && nominalIn && nominalOut) {
3099 nominalIn = (
TH1D*)unfoldedSpectrumInForRatio->Clone(
"in plane jet yield");
3100 nominalOut = (
TH1D*)unfoldedSpectrumOutForRatio->Clone(
"out of plane jet yield");
3101 nominal = (
TH1D*)unfoldedSpectrumInForRatio->Clone(
"ratio in plane out of plane");
3102 nominal->Divide(nominal, unfoldedSpectrumOutForRatio);
3105 TGraphErrors* ratioYield(
GetRatio(unfoldedSpectrumInForRatio, unfoldedSpectrumOutForRatio,
TString(Form(
"ratio [in=%s, out=%s]", dirNameIn.Data(), dirNameOut.Data()))));
3110 ratioYield->GetPoint(b, _tempx, _tempy);
3111 ratioProfile->Fill(_tempx, _tempy);
3113 ratioProfile->GetYaxis()->SetRangeUser(-0., 2.);
3114 ratioProfile->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
3115 ratioYield->GetYaxis()->SetRangeUser(-0., 2.);
3116 ratioYield->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
3117 ratioYield->SetFillColor(kRed);
3118 ratioYield->Draw(
"ap");
3121 if(i==0) canvasNominalV2->cd(j);
3126 ratioV2->GetPoint(b, _tempx, _tempy);
3127 v2Profile->Fill(_tempx, _tempy);
3130 v2Profile->GetYaxis()->SetRangeUser(-0., 2.);
3131 v2Profile->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
3132 ratioV2->GetYaxis()->SetRangeUser(-.25, .75);
3133 ratioV2->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
3134 ratioV2->SetFillColor(kRed);
3135 ratioV2->Draw(
"ap");
3138 delete unfoldedSpectrumInForRatio;
3139 delete unfoldedSpectrumOutForRatio;
3142 canvasProfiles->cd(1);
3143 Style(ratioProfile);
3144 ratioProfile->DrawCopy();
3145 canvasProfiles->cd(2);
3147 v2Profile->DrawCopy();
3149 canvasProfiles->Write();
3157 canvasRatioMeasuredRefoldedIn->Write();
3158 if(canvasRatioMeasuredRefoldedOut) {
3160 canvasRatioMeasuredRefoldedOut->Write();
3163 canvasSpectraIn->Write();
3164 if(canvasSpectraOut) {
3166 canvasSpectraOut->Write();
3168 canvasRatio->Write();
3173 canvasMasterIn->Write();
3174 if(canvasMasterOut) {
3176 canvasMasterOut->Write();
3179 canvasMISC->Write();
3182 canvasNominalIn->Write();
3183 if(canvasNominalOut) {
3185 canvasNominalOut->Write();
3188 canvasNominalRatioMeasuredRefoldedIn->Write();
3189 if(canvasNominalRatioMeasuredRefoldedOut) {
3191 canvasNominalRatioMeasuredRefoldedOut->Write();
3193 canvasNominalSpectraIn->cd(2);
3196 canvasNominalSpectraIn->Write();
3197 if(canvasNominalSpectraOut) {
3198 canvasNominalSpectraOut->cd(2);
3201 canvasNominalSpectraOut->Write();
3203 canvasNominalRatio->Write();
3205 canvasNominalV2->Write();
3207 canvasNominalMasterIn->cd(1);
3209 lineUp->DrawClone(
"same");
3210 lineLow->DrawClone(
"same");
3212 canvasNominalMasterIn->Write();
3213 if(canvasNominalMasterOut) {
3214 canvasNominalMasterOut->cd(1);
3216 lineUp->DrawClone(
"same");
3217 lineLow->DrawClone(
"same");
3219 canvasNominalMasterOut->Write();
3222 canvasNominalMISC->Write();
3228 relativeErrorInUp->SetBinContent(b+1, -1.*(relativeErrorInUp->GetBinContent(b+1)-1));
3230 relativeErrorOutUp->SetBinContent(b+1, -1.*(relativeErrorOutUp->GetBinContent(b+1)-1));
3232 relativeErrorInLow->SetBinContent(b+1, -1.*(relativeErrorInLow->GetBinContent(b+1)-1));
3234 relativeErrorOutLow->SetBinContent(b+1, -1.*(relativeErrorOutLow->GetBinContent(b+1)-1));
3241 if(relativeErrorInUpN[b] < 1) relativeErrorInUpN[b] = 1;
3242 if(relativeErrorInLowN[b] < 1) relativeErrorInLowN[b] = 1;
3243 if(relativeErrorOutUpN[b] < 1) relativeErrorOutUpN[b] = 1;
3244 if(relativeErrorOutLowN[b] < 1) relativeErrorOutLowN[b] = 1;
3245 relativeErrorInUp->SetBinContent(b+1, TMath::Sqrt(relativeErrorInUp->GetBinContent(b+1)/relativeErrorInUpN[b]));
3247 relativeErrorOutUp->SetBinContent(b+1, TMath::Sqrt(relativeErrorOutUp->GetBinContent(b+1)/relativeErrorOutUpN[b]));
3249 relativeErrorInLow->SetBinContent(b+1, -1.*TMath::Sqrt(relativeErrorInLow->GetBinContent(b+1)/relativeErrorInLowN[b]));
3251 relativeErrorOutLow->SetBinContent(b+1, -1.*TMath::Sqrt(relativeErrorOutLow->GetBinContent(b+1)/relativeErrorOutLowN[b]));
3254 if(relativeErrorInUpN[b] < 1) relativeErrorInUpN[b] = 1;
3255 if(relativeErrorOutUpN[b] < 1) relativeErrorOutUpN[b] = 1;
3256 relativeErrorInUp->SetBinContent(b+1, TMath::Sqrt(relativeErrorInUp->GetBinContent(b+1)/relativeErrorInUpN[b]));
3257 relativeErrorOutUp->SetBinContent(b+1, TMath::Sqrt(relativeErrorOutUp->GetBinContent(b+1)/relativeErrorOutUpN[b]));
3261 relativeErrorInUp->SetYTitle(
"relative uncertainty");
3262 relativeErrorOutUp->SetYTitle(
"relative uncertainty");
3263 relativeErrorInLow->SetYTitle(
"relative uncertainty");
3264 relativeErrorOutLow->SetYTitle(
"relative uncertainty");
3265 relativeErrorInUp->GetYaxis()->SetRangeUser(-1.5, 3.);
3266 relativeErrorInLow->GetYaxis()->SetRangeUser(-1.5, 3.);
3267 relativeErrorOutUp->GetYaxis()->SetRangeUser(-1.5, 3.);
3268 relativeErrorOutLow->GetYaxis()->SetRangeUser(-1.5, 3.);
3270 canvasNominalMasterIn->cd(2);
3271 Style(gPad,
"GRID");
3273 Style(relativeErrorInLow, kGreen,
kBar);
3274 relativeErrorInUp->DrawCopy(
"b");
3275 relativeErrorInLow->DrawCopy(
"same b");
3278 canvasNominalMasterIn->Write();
3279 canvasNominalMasterOut->cd(2);
3280 Style(gPad,
"GRID");
3282 Style(relativeErrorOutLow, kGreen,
kBar);
3283 relativeErrorOutUp->DrawCopy(
"b");
3284 relativeErrorOutLow->DrawCopy(
"same b");
3287 canvasNominalMasterOut->Write();
3293 TH1D*& relativeErrorInUp,
3294 TH1D*& relativeErrorInLow,
3295 TH1D*& relativeErrorOutUp,
3296 TH1D*& relativeErrorOutLow,
3297 TH1D*& relativeStatisticalErrorIn,
3298 TH1D*& relativeStatisticalErrorOut,
3310 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
3311 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
3314 if(relativeErrorInUp)
delete relativeErrorInUp;
3315 relativeErrorInUp =
new TH1D(Form(
"absolute_systematic_uncertainty_%s", source.Data()), Form(
"absolute_systematic_uncertainty_%s", source.Data()),
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray());
3318 for(
Int_t i(0); i < variationsIn->GetSize(); i++) {
3319 printf(
" variation %i of %i \n", i, variationsIn->GetSize());
3321 Int_t iIn[] = {variationsIn->At(i), variationsIn->At(i)};
3322 Int_t iOut[] = {variationsOut->At(i), variationsOut->At(i)};
3329 dud, dud, dud, dud, dud, dud, dud,
3336 Form(
"error_on_v2_variation_%i", i));
3338 printf(
" nominal in %i binsX \n", nominalIn->GetNbinsX());
3339 printf(
" nominal out %i binsX \n", nominalOut->GetNbinsX());
3344 printf(
" v2 in %i binsX \n", v2->GetNbinsX());
3349 for(
Int_t k(0); k < nominal->GetNbinsX(); k++) {
3351 relativeErrorInUp->SetBinContent(k+1, relativeErrorInUp->GetBinContent(k+1) + TMath::Power(v2->GetBinContent(k+1)-nominal->GetBinContent(k+1), 2));
3352 printf(
" nominal bin %i is %.4f \n", k+1, nominal->GetBinContent(k+1));
3353 printf(
" variati bin %i is %.4f \n", k+1, v2->GetBinContent(k+1));
3354 printf(
" sum of squared difference is %.4f \n", relativeErrorInUp->GetBinContent(k+1));
3362 for(
Int_t k(0); k < nominal->GetNbinsX(); k++) {
3363 relativeErrorInUp->SetBinError(k+1, TMath::Sqrt(relativeErrorInUp->GetBinContent(k+1)/((double)variationsIn->GetSize())));
3364 printf(
" total absolute error in bin %i is %.4f \n", k+1, relativeErrorInUp->GetBinError(k+1));
3365 relativeErrorInUp->SetBinContent(k+1, relativeErrorInUp->GetBinError(k+1)/nominal->GetBinContent(k+1));
3370 for(
Int_t k(3); k < 8; k++) {
3371 av+=relativeErrorInUp->GetBinError(k+1);
3372 avct+=relativeErrorInUp->GetBinContent(k+1);
3376 avct/=((double)ctr);
3377 for(
Int_t k(8); k < nominal->GetNbinsX(); k++) {
3378 relativeErrorInUp->SetBinError(k+1, av);
3379 relativeErrorInUp->SetBinContent(k+1, avct);
3386 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
3387 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
3392 TFile readMe(in.Data(),
"READ");
3393 if(readMe.IsZombie()) {
3394 printf(
" > Fatal error, couldn't read %s for post processing ! < \n", in.Data());
3397 printf(
"\n\n\n\t\t POSTPROCESSING \n > Recovered the following file structure : \n <");
3399 TList* listOfKeys((
TList*)readMe.GetListOfKeys());
3401 printf(
" > Fatal error, couldn't retrieve list of keys. Input file might have been corrupted ! < \n");
3405 TCanvas* canvasIn(
new TCanvas(
"PearsonIn",
"PearsonIn"));
3406 TCanvas* canvasOut(0x0);
3407 if(
fDphiUnfolding) canvasOut =
new TCanvas(
"PearsonOut",
"PearsonOut");
3408 TCanvas* canvasRatioMeasuredRefoldedIn(
new TCanvas(
"RefoldedIn",
"RefoldedIn"));
3409 TCanvas* canvasRatioMeasuredRefoldedOut(0x0);
3410 if(
fDphiUnfolding) canvasRatioMeasuredRefoldedOut =
new TCanvas(
"RefoldedOut",
"RefoldedOut");
3411 TCanvas* canvasSpectraIn(
new TCanvas(
"SpectraIn",
"SpectraIn"));
3412 TCanvas* canvasSpectraOut(0x0);
3413 if(
fDphiUnfolding) canvasSpectraOut =
new TCanvas(
"SpectraOut",
"SpectraOut");
3414 TCanvas* canvasRatio(0x0);
3416 TCanvas* canvasV2(0x0);
3418 TCanvas* canvasMISC(
new TCanvas(
"MISC",
"MISC"));
3419 TCanvas* canvasMasterIn(
new TCanvas(
"defaultIn",
"defaultIn"));
3420 TCanvas* canvasMasterOut(0x0);
3421 if(
fDphiUnfolding) canvasMasterOut =
new TCanvas(
"defaultOut",
"defaultOut");
3422 (
fDphiUnfolding) ? canvasMISC->Divide(4, 2) : canvasMISC->Divide(4, 1);
3423 TDirectoryFile* defDir(0x0);
3424 TCanvas* canvasProfiles(
new TCanvas(
"canvasProfiles",
"canvasProfiles"));
3425 canvasProfiles->Divide(2);
3426 TProfile* ratioProfile(
new TProfile(
"ratioProfile",
"ratioProfile",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
3427 TProfile* v2Profile(
new TProfile(
"v2Profile",
"v2Profile",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
3430 for(
Int_t i(0); i < listOfKeys->GetSize(); i++) {
3431 if(dynamic_cast<TDirectoryFile*>(readMe.Get(listOfKeys->At(i)->GetName()))) {
3432 if(!strcmp(listOfKeys->At(i)->GetName(), def.Data())) defDir =
dynamic_cast<TDirectoryFile*
>(readMe.Get(listOfKeys->At(i)->GetName()));
3436 Int_t rows(TMath::Floor(cacheMe/(
float)columns)+((cacheMe%columns)>0));
3437 canvasIn->Divide(columns, rows);
3438 if(canvasOut) canvasOut->Divide(columns, rows);
3439 canvasRatioMeasuredRefoldedIn->Divide(columns, rows);
3440 if(canvasRatioMeasuredRefoldedOut) canvasRatioMeasuredRefoldedOut->Divide(columns, rows);
3441 canvasSpectraIn->Divide(columns, rows);
3442 if(canvasSpectraOut) canvasSpectraOut->Divide(columns, rows);
3443 if(canvasRatio) canvasRatio->Divide(columns, rows);
3444 if(canvasV2) canvasV2->Divide(columns, rows);
3446 canvasMasterIn->Divide(columns, rows);
3447 if(canvasMasterOut) canvasMasterOut->Divide(columns, rows);
3449 TH1D* defaultUnfoldedJetSpectrumIn(0x0);
3450 TH1D* defaultUnfoldedJetSpectrumOut(0x0);
3452 TDirectoryFile* defDirIn = (TDirectoryFile*)defDir->Get(Form(
"InPlane___%s", def.Data()));
3453 TDirectoryFile* defDirOut = (TDirectoryFile*)defDir->Get(Form(
"OutOfPlane___%s", def.Data()));
3454 if(defDirIn) defaultUnfoldedJetSpectrumIn = (
TH1D*)defDirIn->Get(Form(
"UnfoldedSpectrum_in_%s", def.Data()));
3455 if(defDirOut) defaultUnfoldedJetSpectrumOut = (
TH1D*)defDirOut->Get(Form(
"UnfoldedSpectrum_out_%s", def.Data()));
3456 printf(
" > succesfully extracted default results < \n");
3460 TDirectoryFile* tempDir(0x0);
3461 TDirectoryFile* tempIn(0x0);
3462 TDirectoryFile* tempOut(0x0);
3463 for(
Int_t i(0), j(0); i < listOfKeys->GetSize(); i++) {
3465 tempDir =
dynamic_cast<TDirectoryFile*
>(readMe.Get(listOfKeys->At(i)->GetName()));
3466 if(!tempDir)
continue;
3467 TString dirName(tempDir->GetName());
3469 tempIn = (TDirectoryFile*)tempDir->Get(Form(
"InPlane___%s", dirName.Data()));
3470 tempOut = (TDirectoryFile*)tempDir->Get(Form(
"OutOfPlane___%s", dirName.Data()));
3473 TString stringArray[] = {
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h"};
3474 TCanvas* tempPearson(
new TCanvas(Form(
"pearson_%s", dirName.Data()), Form(
"pearson_%s", dirName.Data())));
3475 tempPearson->Divide(4,2);
3476 TCanvas* tempRatio(
new TCanvas(Form(
"ratio_%s", dirName.Data()), Form(
"ratio_%s", dirName.Data())));
3477 tempRatio->Divide(4,2);
3478 TCanvas* tempResult(
new TCanvas(Form(
"result_%s", dirName.Data()), Form(
"result_%s", dirName.Data())));
3479 tempResult->Divide(4,2);
3480 for(
Int_t q(0); q < 8; q++) {
3481 tempIn = (TDirectoryFile*)tempDir->Get(Form(
"%s___%s", stringArray[q].
Data(), dirName.Data()));
3484 TH2D* pIn((
TH2D*)tempIn->Get(Form(
"PearsonCoefficients_in_%s", dirName.Data())));
3486 printf(
" - %s in plane converged \n", dirName.Data());
3487 tempPearson->cd(1+q);
3488 Style(gPad,
"PEARSON");
3489 pIn->DrawCopy(
"colz");
3493 printf(
" > found RatioRefoldedMeasured < \n");
3495 rIn->SetFillColor(kRed);
3498 TH1D* dvector((
TH1D*)tempIn->Get(
"dVector"));
3499 TH1D* avalue((
TH1D*)tempIn->Get(
"SingularValuesOfAC"));
3500 TH2D* rm((
TH2D*)tempIn->Get(Form(
"ResponseMatrixIn_%s", dirName.Data())));
3501 TH1D* eff((
TH1D*)tempIn->Get(Form(
"KinematicEfficiencyIn_%s", dirName.Data())));
3502 if(dvector && avalue && rm && eff) {
3508 Style(gPad,
"SPECTRUM");
3509 dvector->DrawCopy();
3511 Style(gPad,
"SPECTRUM");
3514 Style(gPad,
"PEARSON");
3515 rm->DrawCopy(
"colz");
3517 Style(gPad,
"GRID");
3519 }
else if(rm && eff) {
3523 Style(gPad,
"PEARSON");
3524 rm->DrawCopy(
"colz");
3526 Style(gPad,
"GRID");
3530 TH1D* inputSpectrum((
TH1D*)tempIn->Get(Form(
"InputSpectrum_in_%s", dirName.Data())));
3531 TH1D* unfoldedSpectrum((
TH1D*)tempIn->Get(Form(
"UnfoldedSpectrum_in_%s", dirName.Data())));
3532 TH1D* refoldedSpectrum((
TH1D*)tempIn->Get(Form(
"RefoldedSpectrum_in_%s", dirName.Data())));
3533 if(inputSpectrum && unfoldedSpectrum && refoldedSpectrum) {
3534 if(defaultUnfoldedJetSpectrumIn) {
3536 TH1D* temp((
TH1D*)defaultUnfoldedJetSpectrumIn->Clone(Form(
"defaultUnfoldedJetSpectrumIn_%s", dirName.Data())));
3537 temp->Divide(unfoldedSpectrum);
3538 temp->SetTitle(Form(
"ratio default unfolded / %s", dirName.Data()));
3539 temp->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
3540 temp->GetYaxis()->SetTitle(Form(
"%s / %s", def.Data(), dirName.Data()));
3541 canvasMasterIn->cd(j);
3542 temp->GetYaxis()->SetRangeUser(0., 2);
3545 TH1F* fitStatus((TH1F*)tempIn->Get(Form(
"fitStatus_%s_in", dirName.Data())));
3546 tempResult->cd(q+1);
3549 unfoldedSpectrum->DrawCopy();
3551 inputSpectrum->DrawCopy(
"same");
3553 refoldedSpectrum->DrawCopy(
"same");
3556 if(fitStatus && fitStatus->GetNbinsX() == 4) {
3557 Float_t chi(fitStatus->GetBinContent(1));
3558 Float_t pen(fitStatus->GetBinContent(2));
3559 Int_t dof((
int)fitStatus->GetBinContent(3));
3560 Float_t beta(fitStatus->GetBinContent(4));
3561 l->AddEntry((
TObject*)0, Form(
"#chi %.2f \tP %.2f \tDOF %i, #beta %.2f", chi, pen, dof, beta),
"");
3562 }
else if (fitStatus) {
3563 Int_t reg((
int)fitStatus->GetBinContent(1));
3564 l->AddEntry((
TObject*)0, Form(
"REG %i", reg),
"");
3572 TH2D* pIn((
TH2D*)tempIn->Get(Form(
"PearsonCoefficients_in_%s", dirName.Data())));
3574 printf(
" - %s in plane converged \n", dirName.Data());
3576 Style(gPad,
"PEARSON");
3577 pIn->DrawCopy(
"colz");
3581 printf(
" > found RatioRefoldedMeasured < \n");
3582 canvasRatioMeasuredRefoldedIn->cd(j);
3583 rIn->SetFillColor(kRed);
3586 TH1D* dvector((
TH1D*)tempIn->Get(
"dVector"));
3587 TH1D* avalue((
TH1D*)tempIn->Get(
"SingularValuesOfAC"));
3588 TH2D* rm((
TH2D*)tempIn->Get(Form(
"ResponseMatrixIn_%s", dirName.Data())));
3589 TH1D* eff((
TH1D*)tempIn->Get(Form(
"KinematicEfficiencyIn_%s", dirName.Data())));
3590 if(dvector && avalue && rm && eff) {
3596 Style(gPad,
"SPECTRUM");
3597 dvector->DrawCopy();
3599 Style(gPad,
"SPECTRUM");
3602 Style(gPad,
"PEARSON");
3603 rm->DrawCopy(
"colz");
3605 Style(gPad,
"GRID");
3607 }
else if(rm && eff) {
3611 Style(gPad,
"PEARSON");
3612 rm->DrawCopy(
"colz");
3614 Style(gPad,
"GRID");
3618 TH1D* inputSpectrum((
TH1D*)tempIn->Get(Form(
"InputSpectrum_in_%s", dirName.Data())));
3619 TH1D* unfoldedSpectrum((
TH1D*)tempIn->Get(Form(
"UnfoldedSpectrum_in_%s", dirName.Data())));
3620 TH1D* refoldedSpectrum((
TH1D*)tempIn->Get(Form(
"RefoldedSpectrum_in_%s", dirName.Data())));
3621 if(inputSpectrum && unfoldedSpectrum && refoldedSpectrum) {
3622 if(defaultUnfoldedJetSpectrumIn) {
3624 TH1D* temp((
TH1D*)defaultUnfoldedJetSpectrumIn->Clone(Form(
"defaultUnfoldedJetSpectrumIn_%s", dirName.Data())));
3625 temp->Divide(unfoldedSpectrum);
3626 temp->SetTitle(Form(
"ratio default unfolded / %s", dirName.Data()));
3627 temp->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
3628 temp->GetYaxis()->SetTitle(Form(
"%s / %s", def.Data(), dirName.Data()));
3629 canvasMasterIn->cd(j);
3630 temp->GetYaxis()->SetRangeUser(0., 2);
3633 TH1F* fitStatus((TH1F*)tempIn->Get(Form(
"fitStatus_%s_in", dirName.Data())));
3634 canvasSpectraIn->cd(j);
3637 unfoldedSpectrum->DrawCopy();
3639 inputSpectrum->DrawCopy(
"same");
3641 refoldedSpectrum->DrawCopy(
"same");
3644 if(fitStatus && fitStatus->GetNbinsX() == 4) {
3645 Float_t chi(fitStatus->GetBinContent(1));
3646 Float_t pen(fitStatus->GetBinContent(2));
3647 Int_t dof((
int)fitStatus->GetBinContent(3));
3648 Float_t beta(fitStatus->GetBinContent(4));
3649 l->AddEntry((
TObject*)0, Form(
"#chi %.2f \tP %.2f \tDOF %i, #beta %.2f", chi, pen, dof, beta),
"");
3650 }
else if (fitStatus) {
3651 Int_t reg((
int)fitStatus->GetBinContent(1));
3652 l->AddEntry((
TObject*)0, Form(
"REG %i", reg),
"");
3657 TH2D* pOut((
TH2D*)tempOut->Get(Form(
"PearsonCoefficients_out_%s", dirName.Data())));
3659 printf(
" - %s out of plane converged \n", dirName.Data());
3661 Style(gPad,
"PEARSON");
3662 pOut->DrawCopy(
"colz");
3666 printf(
" > found RatioRefoldedMeasured < \n");
3667 canvasRatioMeasuredRefoldedOut->cd(j);
3668 rOut->SetFillColor(kRed);
3671 TH1D* dvector((
TH1D*)tempOut->Get(
"dVector"));
3672 TH1D* avalue((
TH1D*)tempOut->Get(
"SingularValuesOfAC"));
3673 TH2D* rm((
TH2D*)tempOut->Get(Form(
"ResponseMatrixOut_%s", dirName.Data())));
3674 TH1D* eff((
TH1D*)tempOut->Get(Form(
"KinematicEfficiencyOut_%s", dirName.Data())));
3675 if(dvector && avalue && rm && eff) {
3681 Style(gPad,
"SPECTRUM");
3682 dvector->DrawCopy();
3684 Style(gPad,
"SPECTRUM");
3687 Style(gPad,
"PEARSON");
3688 rm->DrawCopy(
"colz");
3690 Style(gPad,
"GRID");
3692 }
else if(rm && eff) {
3696 Style(gPad,
"PEARSON");
3697 rm->DrawCopy(
"colz");
3699 Style(gPad,
"GRID");
3703 TH1D* inputSpectrum((
TH1D*)tempOut->Get(Form(
"InputSpectrum_out_%s", dirName.Data())));
3704 TH1D* unfoldedSpectrum((
TH1D*)tempOut->Get(Form(
"UnfoldedSpectrum_out_%s", dirName.Data())));
3705 TH1D* refoldedSpectrum((
TH1D*)tempOut->Get(Form(
"RefoldedSpectrum_out_%s", dirName.Data())));
3706 if(inputSpectrum && unfoldedSpectrum && refoldedSpectrum) {
3707 if(defaultUnfoldedJetSpectrumOut) {
3709 TH1D* temp((
TH1D*)defaultUnfoldedJetSpectrumOut->Clone(Form(
"defaultUnfoldedJetSpectrumOut_%s", dirName.Data())));
3710 temp->Divide(unfoldedSpectrum);
3711 temp->SetTitle(Form(
"ratio default unfolded / %s", dirName.Data()));
3712 temp->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
3713 temp->GetYaxis()->SetTitle(Form(
"%s / %s", def.Data(), dirName.Data()));
3714 canvasMasterOut->cd(j);
3715 temp->GetYaxis()->SetRangeUser(0., 2.);
3718 TH1F* fitStatus((TH1F*)tempOut->Get(Form(
"fitStatus_%s_out", dirName.Data())));
3719 canvasSpectraOut->cd(j);
3722 unfoldedSpectrum->DrawCopy();
3724 inputSpectrum->DrawCopy(
"same");
3726 refoldedSpectrum->DrawCopy(
"same");
3729 if(fitStatus && fitStatus->GetNbinsX() == 4) {
3730 Float_t chi(fitStatus->GetBinContent(1));
3731 Float_t pen(fitStatus->GetBinContent(2));
3732 Int_t dof((
int)fitStatus->GetBinContent(3));
3733 Float_t beta(fitStatus->GetBinContent(4));
3734 l->AddEntry((
TObject*)0, Form(
"#chi %.2f \tP %.2f \tDOF %i, #beta %.2f", chi, pen, dof, beta),
"");
3735 }
else if (fitStatus) {
3736 Int_t reg((
int)fitStatus->GetBinContent(1));
3737 l->AddEntry((
TObject*)0, Form(
"REG %i", reg),
"");
3741 if(canvasRatio && canvasV2) {
3748 ratioYield->GetPoint(b, _tempx, _tempy);
3749 ratioProfile->Fill(_tempx, _tempy);
3751 ratioProfile->GetYaxis()->SetRangeUser(-0., 2.);
3752 ratioProfile->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
3753 ratioYield->GetYaxis()->SetRangeUser(-0., 2.);
3754 ratioYield->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
3755 ratioYield->SetFillColor(kRed);
3756 ratioYield->Draw(
"ap");
3763 ratioV2->GetPoint(b, _tempx, _tempy);
3764 v2Profile->Fill(_tempx, _tempy);
3767 v2Profile->GetYaxis()->SetRangeUser(-0., 2.);
3768 v2Profile->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
3769 ratioV2->GetYaxis()->SetRangeUser(-.25, .75);
3770 ratioV2->GetXaxis()->SetRangeUser(rangeLow, rangeUp);
3771 ratioV2->SetFillColor(kRed);
3772 ratioV2->Draw(
"ap");
3776 TFile output(out.Data(),
"RECREATE");
3777 canvasProfiles->cd(1);
3778 Style(ratioProfile);
3779 ratioProfile->DrawCopy();
3780 canvasProfiles->cd(2);
3782 v2Profile->DrawCopy();
3784 canvasProfiles->Write();
3792 canvasRatioMeasuredRefoldedIn->Write();
3793 if(canvasRatioMeasuredRefoldedOut) {
3795 canvasRatioMeasuredRefoldedOut->Write();
3798 canvasSpectraIn->Write();
3799 if(canvasSpectraOut) {
3801 canvasSpectraOut->Write();
3803 canvasRatio->Write();
3808 canvasMasterIn->Write();
3809 if(canvasMasterOut) {
3811 canvasMasterOut->Write();
3814 canvasMISC->Write();
3821 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
3822 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
3827 TFile readMe(in.Data(),
"READ");
3828 if(readMe.IsZombie()) {
3829 printf(
" > Fatal error, couldn't read %s for post processing ! < \n", in.Data());
3832 printf(
"\n\n\n\t\t BootstrapSpectra \n > Recovered the following file structure : \n <");
3834 TList* listOfKeys((
TList*)readMe.GetListOfKeys());
3836 printf(
" > Fatal error, couldn't retrieve list of keys. Input file might have been corrupted ! < \n");
3840 TDirectoryFile* defDir(0x0);
3841 for(
Int_t i(0); i < listOfKeys->GetSize(); i++) {
3842 if(dynamic_cast<TDirectoryFile*>(readMe.Get(listOfKeys->At(i)->GetName()))) {
3843 if(!strcmp(listOfKeys->At(i)->GetName(), def.Data())) defDir =
dynamic_cast<TDirectoryFile*
>(readMe.Get(listOfKeys->At(i)->GetName()));
3849 TH1D* defaultUnfoldedJetSpectrumIn(0x0);
3850 TH1D* defaultUnfoldedJetSpectrumOut(0x0);
3851 TH1D* defaultInputSpectrumIn(0x0);
3852 TH1D* defaultInputSpectrumOut(0x0);
3855 TDirectoryFile* defDirIn = (TDirectoryFile*)defDir->Get(Form(
"InPlane___%s", def.Data()));
3856 TDirectoryFile* defDirOut = (TDirectoryFile*)defDir->Get(Form(
"OutOfPlane___%s", def.Data()));
3858 defaultUnfoldedJetSpectrumIn = (
TH1D*)defDirIn->Get(Form(
"UnfoldedSpectrum_in_%s", def.Data()));
3859 defaultInputSpectrumIn = (
TH1D*)defDirIn->Get(Form(
"InputSpectrum_in_%s", def.Data()));
3862 defaultUnfoldedJetSpectrumOut = (
TH1D*)defDirOut->Get(Form(
"UnfoldedSpectrum_out_%s", def.Data()));
3863 defaultInputSpectrumOut = (
TH1D*)defDirOut->Get(Form(
"InputSpectrum_out_%s", def.Data()));
3866 if((!defaultUnfoldedJetSpectrumIn && defaultUnfoldedJetSpectrumOut)) {
3867 printf(
" BootstrapSpectra: couldn't extract default spectra, aborting! \n");
3870 else v2Emperical =
GetV2(defaultUnfoldedJetSpectrumIn, defaultUnfoldedJetSpectrumOut,
fEventPlaneRes);
3875 delta0[i] =
new TH1F(Form(
"delta%i_%.2f-%.2f_gev", i,
fBinsTrue->At(i),
fBinsTrue->At(i+1)), Form(
"#Delta_{0, %i} p_{T} %.2f-%.2f GeV/c", i,
fBinsTrue->At(i),
fBinsTrue->At(i+1)), 30, -1., 1.);
3879 TCanvas* spectraIn(
new TCanvas(
"spectraIn",
"spectraIn"));
3880 TCanvas* spectraOut(
new TCanvas(
"spectraOut",
"spectraOut"));
3882 TF1* commonReference =
new TF1(
"v2_strong_bkg_comb",
"(x<=3)*.07+(x>3&&x<5)*(.07-(x-3)*.035)+(x>30&&x<40)*(x-30)*.005+(x>40)*.05", 0, 200);
3885 TDirectoryFile* tempDir(0x0);
3886 TDirectoryFile* tempIn(0x0);
3887 TDirectoryFile* tempOut(0x0);
3888 TH1D* unfoldedSpectrumIn(0x0);
3889 TH1D* unfoldedSpectrumOut(0x0);
3890 TH1D* measuredSpectrumIn(0x0);
3891 TH1D* measuredSpectrumOut(0x0);
3892 for(
Int_t i(0), j(0); i < listOfKeys->GetSize(); i++) {
3894 tempDir =
dynamic_cast<TDirectoryFile*
>(readMe.Get(listOfKeys->At(i)->GetName()));
3895 if(!tempDir)
continue;
3896 TString dirName(tempDir->GetName());
3898 if(!dirName.Contains(
"bootstrap"))
continue;
3900 tempIn = (TDirectoryFile*)tempDir->Get(Form(
"InPlane___%s", dirName.Data()));
3901 tempOut = (TDirectoryFile*)tempDir->Get(Form(
"OutOfPlane___%s", dirName.Data()));
3905 if(!(
TH2D*)tempIn->Get(Form(
"PearsonCoefficients_in_%s", dirName.Data())))
continue;
3906 unfoldedSpectrumIn = (
TH1D*)tempIn->Get(Form(
"UnfoldedSpectrum_in_%s", dirName.Data()));
3907 measuredSpectrumIn = (
TH1D*)tempIn->Get(Form(
"InputSpectrum_in_%s", dirName.Data()));
3909 (j==1) ? measuredSpectrumIn->DrawCopy() : measuredSpectrumIn->DrawCopy(
"same");
3912 if(!(
TH2D*)tempOut->Get(Form(
"PearsonCoefficients_out_%s", dirName.Data())))
continue;
3913 unfoldedSpectrumOut = (
TH1D*)tempOut->Get(Form(
"UnfoldedSpectrum_out_%s", dirName.Data()));
3914 measuredSpectrumOut = (
TH1D*)tempOut->Get(Form(
"InputSpectrum_out_%s", dirName.Data()));
3916 (j==1) ? measuredSpectrumOut->DrawCopy() : measuredSpectrumOut->DrawCopy(
"same");
3921 Double_t yBoot(0), yEmp(0), xDud(0);
3925 v2Bootstrapped->GetPoint(k, xDud, yBoot);
3926 v2Emperical->GetPoint(k, xDud, yEmp);
3927 if(commonReference) {
3928 if(!commonReference->Eval(xDud)<1e-10) {
3929 yEmp/=commonReference->Eval(xDud);
3930 yBoot/=commonReference->Eval(xDud);
3936 cout <<
" yEmp " << yEmp <<
" yBoot " << yBoot << endl;
3938 if(TMath::Abs(yBoot)>1e-10) delta0[k]->Fill(yEmp - yBoot);
3944 TFile output(out.Data(),
"RECREATE");
3945 defaultInputSpectrumIn->SetLineColor(kRed);
3947 defaultInputSpectrumIn->DrawCopy(
"same");
3948 defaultInputSpectrumOut->SetLineColor(kRed);
3950 defaultInputSpectrumOut->DrawCopy(
"same");
3952 spectraOut->Write();
3954 TH1F* delta0spread(
new TH1F(
"delta0spread",
"#sigma(#Delta_{0})",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
3955 TH1F* unfoldingError(
new TH1F(
"unfoldingError",
"error from unfolding algorithm",
fBinsTrue->GetSize()-1,
fBinsTrue->GetArray()));
3956 TF1* gaus(
new TF1(
"gaus",
"gaus", -1., 1.));
3959 delta0[i]->Fit(gaus);
3960 delta0[i]->GetYaxis()->SetTitle(
"counts");
3961 delta0[i]->GetXaxis()->SetTitle(
"(v_{2, jet}^{measured} - v_{2, jet}^{generated}) / input v_{2}");
3962 delta0spread->SetBinContent(i+1, gaus->GetParameter(1));
3963 delta0spread->SetBinError(i+1, gaus->GetParameter(2));
3964 cout <<
" mean " << gaus->GetParameter(1) << endl;
3965 cout <<
" sigm " << gaus->GetParameter(2) << endl;
3967 v2Emperical->GetPoint(i, xDud, yDud);
3968 unfoldingError->SetBinContent(i+1, 1e-10);
3969 if(commonReference && !commonReference->Eval(xDud)<1e-10) unfoldingError->SetBinError(i+1, v2Emperical->GetErrorY(i)/(commonReference->Eval(xDud)));
3970 else if(yDud>10e-10) unfoldingError->SetBinError(i+1, v2Emperical->GetErrorY(i)/yDud);
3971 else unfoldingError->SetBinError(i+1, 0.);
3973 delta0spread->GetXaxis()->SetTitle(
"p_{T}^{jet} (GeV/c)");
3974 delta0spread->GetYaxis()->SetTitle(
"(mean v_{2, jet}^{measured} - v_{2, jet}^{generated}) / input v_{2}");
3975 delta0spread->Write();
3976 unfoldingError->GetXaxis()->SetTitle(
"p_{T}^{jet} (GeV/c)");
3977 unfoldingError->GetYaxis()->SetTitle(
"(mean v_{2, jet}^{measured} - v_{2, jet}^{generated}) / input v_{2}");
3978 unfoldingError->Write();
3985 TH2D* detectorResponse,
3991 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
3992 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4002 printf(
" fDetectorResponse not found \n ");
4007 printf(
" No true or rec bins set, please set binning ! \n");
4034 fDptIn->GetXaxis()->SetTitle(
"p_{T, jet}^{gen} [GeV/c]");
4035 fDptIn->GetYaxis()->SetTitle(
"p_{T, jet}^{rec} [GeV/c]");
4038 fDptOut->GetXaxis()->SetTitle(
"p_{T, jet}^{gen} [GeV/c]");
4039 fDptOut->GetYaxis()->SetTitle(
"p_{T, jet}^{rec} [GeV/c]");
4049 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4050 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4055 printf(
" GetRatio called with NULL argument(s) \n ");
4060 gr->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
4061 Double_t binCent(0.), ratio(0.), error2(0.), binWidth(0.);
4062 TH1* dud((
TH1*)h1->Clone(
"dud"));
4066 if(!dud->Divide(h1, h2)) {
4067 printf(
" > ROOT failed to divide two histogams, dividing manually \n < ");
4068 for(
Int_t i(1); i <= h1->GetNbinsX(); i++) {
4069 binCent = h1->GetXaxis()->GetBinCenter(i);
4070 if(xmax > 0. && binCent > xmax)
continue;
4071 j = h2->FindBin(binCent);
4072 binWidth = h1->GetXaxis()->GetBinWidth(i);
4073 if(h2->GetBinContent(j) > 0.) {
4074 ratio = h1->GetBinContent(i)/h2->GetBinContent(j);
4075 Double_t A = h1->GetBinError(i)/h1->GetBinContent(i);
4076 Double_t B = h2->GetBinError(i)/h2->GetBinContent(i);
4077 error2 = ratio*ratio*A*A+ratio*ratio*B*B;
4078 if(error2 > 0 ) error2 = TMath::Sqrt(error2);
4079 gr->SetPoint(i-1, binCent, ratio);
4080 gr->SetPointError(i-1, 0.5*binWidth, error2);
4084 printf(
" > using ROOT to divide two histograms < \n");
4085 for(
Int_t i(1); i <= h1->GetNbinsX(); i++) {
4086 binCent = dud->GetXaxis()->GetBinCenter(i);
4087 if(xmax > 0. && binCent > xmax)
continue;
4088 binWidth = dud->GetXaxis()->GetBinWidth(i);
4089 gr->SetPoint(i-1,binCent,dud->GetBinContent(i));
4090 gr->SetPointError(i-1, 0.5*binWidth,dud->GetBinError(i));
4095 TF1* fit(
new TF1(
"lin",
"pol0", 10, 100));
4098 if(strcmp(name,
"")) gr->SetNameTitle(name.Data(), name.Data());
4105 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4106 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4112 printf(
" GetV2 called with NULL argument(s) \n ");
4116 gr->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
4117 Float_t binCent(0.), ratio(0.), error2(0.), binWidth(0.);
4118 Double_t pre(TMath::Pi()/(4.*r)), in(0.), out(0.), ein(0.), eout(0.);
4120 for(
Int_t i(1); i <= h1->GetNbinsX(); i++) {
4121 binCent = h1->GetXaxis()->GetBinCenter(i);
4122 binWidth = h1->GetXaxis()->GetBinWidth(i);
4123 if(h2->GetBinContent(i) > 0.) {
4124 in = h1->GetBinContent(i);
4125 ein = h1->GetBinError(i);
4126 out = h2->GetBinContent(i);
4127 eout = h2->GetBinError(i);
4128 ratio = pre*((in-out)/(in+out));
4129 error2 = (4.*out*out/(TMath::Power(in+out, 4)))*ein*ein+(4.*in*in/(TMath::Power(in+out, 4)))*eout*eout;
4130 error2 = error2*pre*pre;
4131 if(error2 > 0) error2 = TMath::Sqrt(error2);
4132 gr->SetPoint(i-1,binCent,ratio);
4133 gr->SetPointError(i-1,0.5*binWidth,error2);
4136 if(strcmp(name,
"")) gr->SetNameTitle(name.Data(), name.Data());
4142 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4143 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4149 printf(
" GetV2 called with NULL argument(s) \n ");
4152 TH1D* gr((
TH1D*)h1->Clone(name.Data()));
4153 gr->GetXaxis()->SetTitle(
"p_{T, jet} [GeV/c]");
4154 Float_t ratio(0.), error2(0.);
4155 Double_t pre(TMath::Pi()/(4.*r)), in(0.), out(0.), ein(0.), eout(0.);
4157 for(
Int_t i(1); i <= h1->GetNbinsX(); i++) {
4158 if(h2->GetBinContent(i) > 0.) {
4159 in = h1->GetBinContent(i);
4160 ein = h1->GetBinError(i);
4161 out = h2->GetBinContent(i);
4162 eout = h2->GetBinError(i);
4163 ratio = pre*((in-out)/(in+out));
4164 error2 = (4.*out*out/(TMath::Power(in+out, 4)))*ein*ein+(4.*in*in/(TMath::Power(in+out, 4)))*eout*eout;
4165 error2 = error2*pre*pre;
4166 if(error2 > 0) error2 = TMath::Sqrt(error2);
4167 gr->SetBinContent(i,ratio);
4168 gr->SetBinError(i,error2);
4171 if(strcmp(name,
"")) gr->SetNameTitle(name.Data(), name.Data());
4177 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4178 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4182 printf(
" > ConvertGraphToHistogram recevied a NULL pointer > \n");
4186 TH1F* hist(g->GetHistogram());
4187 Double_t xref(0), yref(0), yerr(0);
4189 for(
Int_t i(0); i < hist->GetNbinsX(); i++) {
4190 g->GetPoint(i, xref, yref);
4191 yerr = g->GetErrorY(i);
4192 hist->SetBinContent(i+1, yref);
4193 hist->SetBinError(i+1, yerr);
4200 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4201 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4206 printf(
" > ConvertGraphToHistogram recevied a NULL pointer > \n");
4210 printf(
"\n\n\n adding histo error to graph error \n\n\n\n");
4213 Double_t yerrL(0), yerrH(0), herr(0);
4215 for(
Int_t i(0); i < h->GetNbinsX(); i++) {
4216 yerrH = g->GetErrorY(i);
4217 yerrL = g->GetErrorY(i);
4218 herr = h->GetBinError(i+1);
4219 cout <<
" graph error H " << yerrH <<
"\t histo error " << herr << endl;
4220 cout <<
" graph error L " << yerrL <<
"\t histo error " << herr << endl;
4221 yerrH = TMath::Sqrt(yerrH*yerrH+herr*herr);
4222 yerrL = TMath::Sqrt(yerrL*yerrL+herr*herr);
4223 g->SetPointError(i, g->GetErrorX(i), g->GetErrorX(i), yerrL, yerrH);
4230 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4231 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4234 if(!h || b < a )
return 0.;
4237 Int_t binA(h->GetXaxis()->FindBin(a+.1));
4238 Int_t binB(h->GetXaxis()->FindBin(b+.1));
4241 for(
Int_t i(binA); i < binB; i++) {
4243 mean += h->GetBinContent(i);
4247 for(
Int_t i(binA); i < binB; i++) RMS += (mean-h->GetBinContent(i))*(mean-h->GetBinContent(i));
4248 return TMath::Sqrt(RMS/c);
4256 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4257 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4260 TF1* lin =
new TF1(
"lin", Form(
"(x<%i)*(pol1)+(x>%i)*[2]", (
int)pivot, (
int)pivot), a, b);
4262 TF1* fit_pol0 =
new TF1(
"fit_pol0",
"pol0", pivot, b);
4263 TF1* fit_pol1 =
new TF1(
"fit_pol1",
"pol1", a, pivot);
4265 TH1* h((
TH1*)h1->Clone(str.Data()));
4269 for(
Int_t i(1); i < h->GetNbinsX() + 1; i++) {
4270 _a = TMath::Abs(h1->GetBinContent(i));
4271 _b = TMath::Abs(h2->GetBinContent(i));
4273 h->SetBinContent(i, _a);
4274 h->SetBinError(i, h1->GetBinError(i));
4276 h->SetBinContent(i, _b);
4277 h->SetBinError(i, h2->GetBinError(i));
4285 h->Fit(fit_pol0,
"",
"", pivot, b);
4286 lin->SetParameter(2, (subdueError) ? 0. : fit_pol0->GetParameter(0));
4288 h->Fit(fit_pol1,
"",
"", a, pivot);
4291 if(fit_pol1->GetParameter(1) > 0) {
4292 fit_pol1 =
new TF1(
"fit_pol2",
"pol0", a, pivot);
4293 h->Fit(fit_pol1,
"",
"", a, pivot);
4294 lin->SetParameter(0, fit_pol1->GetParameter(0));
4295 lin->SetParameter(1, 0);
4297 lin->SetParameter(0, fit_pol1->GetParameter(0));
4298 lin->SetParameter(1, fit_pol1->GetParameter(1));
4303 h->GetListOfFunctions()->Add(lin);
4307 for(
Int_t i(1); i < h->GetNbinsX() + 1; i++) {
4309 Double_t dud(lin->Integral(h->GetXaxis()->GetBinLowEdge(i),h->GetXaxis()->GetBinUpEdge(i))/h->GetXaxis()->GetBinWidth(i));
4311 h1->SetBinContent(i, 0);
4312 h2->SetBinContent(i, 0);
4313 h1->SetBinError(i, 0);
4314 h2->SetBinError(i, 0);
4316 if(a > h->GetXaxis()->GetBinLowEdge(i) || b < h->GetXaxis()->GetBinUpEdge(i))
continue;
4319 h1->SetBinContent(i, dud);
4321 h2->SetBinContent(i, dud);
4331 TH1* relativeErrorInUp,
4332 TH1* relativeErrorInLow,
4333 TH1* relativeErrorOutUp,
4334 TH1* relativeErrorOutLow,
4337 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4338 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4350 Double_t in(0.), out(0.), einUp(0.), einLow(0.), eoutUp(0.), eoutLow(0.), error2Up(0.), error2Low(0.);
4354 in = h1->GetBinContent(i+1);
4355 einUp = TMath::Abs(in*relativeErrorInUp->GetBinContent(i+1));
4356 einLow = TMath::Abs(in*relativeErrorInLow->GetBinContent(1+i));
4357 out = h2->GetBinContent(i+1);
4358 eoutUp = TMath::Abs(out*relativeErrorOutUp->GetBinContent(1+i));
4359 eoutLow = TMath::Abs(out*relativeErrorOutLow->GetBinContent(1+i));
4362 error2Up = TMath::Power(((r*4.)/(TMath::Pi())),-2.)*((4.*out*out/(TMath::Power(in+out, 4)))*einUp*einUp+(4.*in*in/(TMath::Power(in+out, 4)))*eoutLow*eoutLow);
4363 error2Low =TMath::Power(((r*4.)/(TMath::Pi())),-2.)*((4.*out*out/(TMath::Power(in+out, 4)))*einLow*einLow+(4.*in*in/(TMath::Power(in+out, 4)))*eoutUp*eoutUp);
4365 error2Up = TMath::Power(((r*4.)/(TMath::Pi())),-2.)*((4.*out*out/(TMath::Power(in+out, 4)))*einUp*einUp+(4.*in*in/(TMath::Power(in+out, 4)))*eoutUp*eoutUp-((8.*out*in)/(TMath::Power(in+out, 4)))*rho*einUp*eoutUp);
4366 error2Low =TMath::Power(((r*4.)/(TMath::Pi())),-2.)*((4.*out*out/(TMath::Power(in+out, 4)))*einLow*einLow+(4.*in*in/(TMath::Power(in+out, 4)))*eoutLow*eoutLow-((8.*out*in)/(TMath::Power(in+out, 4)))*rho*einLow*eoutLow);
4368 if(error2Up > 0) error2Up = TMath::Sqrt(error2Up);
4369 if(error2Low > 0) error2Low = TMath::Sqrt(error2Low);
4374 Double_t binWidth(h1->GetBinWidth(i+1));
4375 axl[i] = binWidth/2.;
4376 axh[i] = binWidth/2.;
4378 tempV2->GetPoint(i, ax[i], ay[i]);
4389 nominalError->SetName(
"v_{2} with shape uncertainty");
4399 return nominalError;
4403 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4404 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4409 printf(
" > WriteObject:: called with NULL arguments \n ");
4411 }
else if(!strcmp(
"", suffix.Data()))
object->Write();
4413 TObject* newObject(object->Clone(Form(
"%s_%s", object->GetName(), suffix.Data())));
4416 if(kill)
delete object;
4420 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4421 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4431 Int_t bins(dpt->GetXaxis()->GetNbins());
4433 for(
Int_t i(0); i < bins; i++) _bins[i] = dpt->GetBinLowEdge(i+1);
4434 _bins[bins] = dpt->GetBinLowEdge(bins)+dpt->GetBinWidth(bins+1);
4435 TH2D* res(
new TH2D(Form(
"Response_from_%s", dpt->GetName()), Form(
"Response_from_%s", dpt->GetName()), bins, _bins, bins, _bins));
4436 for(
Int_t j(0); j < bins+1; j++) {
4438 for(
Int_t k(0); k < bins+1; k++) {
4439 (skip) ? res->SetBinContent(j, k, 0.) : res->SetBinContent(j, k, dpt->GetBinContent(dpt->GetXaxis()->FindBin(k-j)));
4440 if(AvoidRoundingError && k > j && TMath::AreEqualAbs(dpt->GetBinContent(dpt->GetBinContent(k-j)), 0, 1e-8)) skip = kTRUE;
4447 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4448 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4450 if(!binsTrue || !binsRec) {
4451 printf(
" > GetUnityResponse:: function called with NULL arguments < \n");
4454 TString name(Form(
"unityResponse_%s", suffix.Data()));
4455 TH2D* unity(
new TH2D(name.Data(), name.Data(), binsTrue->GetSize()-1, binsTrue->GetArray(), binsRec->GetSize()-1, binsRec->GetArray()));
4456 for(
Int_t i(0); i < binsTrue->GetSize(); i++) {
4457 for(
Int_t j(0); j < binsRec->GetSize(); j++) {
4458 if(i==j) unity->SetBinContent(1+i, 1+j, 1.);
4465 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4466 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4469 TH1F* summary =
new TH1F(
"UnfoldingConfiguration",
"UnfoldingConfiguration", 20, -.5, 19.5);
4470 summary->SetBinContent(1,
fBetaIn);
4471 summary->GetXaxis()->SetBinLabel(1,
"fBetaIn");
4472 summary->SetBinContent(2,
fBetaOut);
4473 summary->GetXaxis()->SetBinLabel(2,
"fBetaOut");
4475 summary->GetXaxis()->SetBinLabel(3,
"fCentralityArray[0]");
4476 summary->SetBinContent(4, (
int)convergedIn);
4477 summary->GetXaxis()->SetBinLabel(4,
"convergedIn");
4478 summary->SetBinContent(5, (
int)convergedOut);
4479 summary->GetXaxis()->SetBinLabel(5,
"convergedOut");
4481 summary->GetXaxis()->SetBinLabel(6,
"fAvoidRoundingError");
4483 summary->GetXaxis()->SetBinLabel(7,
"fUnfoldingAlgorithm");
4484 summary->SetBinContent(8, (
int)
fPrior);
4485 summary->GetXaxis()->SetBinLabel(8,
"fPrior");
4487 summary->GetXaxis()->SetBinLabel(9,
"fSVDRegIn");
4489 summary->GetXaxis()->SetBinLabel(10,
"fSVDRegOut");
4490 summary->SetBinContent(11, (
int)
fSVDToy);
4491 summary->GetXaxis()->SetBinLabel(11,
"fSVDToy");
4493 summary->GetXaxis()->SetBinLabel(12,
"fJetRadius");
4495 summary->GetXaxis()->SetBinLabel(13,
"fNormalizeSpectra");
4497 summary->GetXaxis()->SetBinLabel(14,
"fSmoothenPrior");
4498 summary->SetBinContent(15, (
int)
fTestMode);
4499 summary->GetXaxis()->SetBinLabel(15,
"fTestMode");
4501 summary->GetXaxis()->SetBinLabel(16,
"fUseDetectorResponse");
4503 summary->GetXaxis()->SetBinLabel(17,
"fBayesianIterIn");
4505 summary->GetXaxis()->SetBinLabel(18,
"fBayesianIterOut");
4507 summary->GetXaxis()->SetBinLabel(19,
"fBayesianSmoothIn");
4509 summary->GetXaxis()->SetBinLabel(20,
"fBayesianSmoothOut");
4513 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4514 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4517 TVirtualFitter*
fitter(TVirtualFitter::GetFitter());
4519 printf(
" > Found fitter, will delete it < \n");
4523 printf(
" > Found gMinuit, will re-create it < \n");
4525 gMinuit =
new TMinuit;
4527 AliUnfolding::fgCorrelationMatrix = 0;
4528 AliUnfolding::fgCorrelationMatrixSquared = 0;
4529 AliUnfolding::fgCorrelationCovarianceMatrix = 0;
4530 AliUnfolding::fgCurrentESDVector = 0;
4531 AliUnfolding::fgEntropyAPriori = 0;
4532 AliUnfolding::fgEfficiency = 0;
4533 AliUnfolding::fgUnfoldedAxis = 0;
4534 AliUnfolding::fgMeasuredAxis = 0;
4535 AliUnfolding::fgFitFunction = 0;
4536 AliUnfolding::fgMaxInput = -1;
4537 AliUnfolding::fgMaxParams = -1;
4538 AliUnfolding::fgOverflowBinLimit = -1;
4539 AliUnfolding::fgRegularizationWeight = 10000;
4540 AliUnfolding::fgSkipBinsBegin = 0;
4541 AliUnfolding::fgMinuitStepSize = 0.1;
4542 AliUnfolding::fgMinuitPrecision = 1e-6;
4543 AliUnfolding::fgMinuitMaxIterations = 1000000;
4544 AliUnfolding::fgMinuitStrategy = 1.;
4545 AliUnfolding::fgMinimumInitialValue = kFALSE;
4546 AliUnfolding::fgMinimumInitialValueFix = -1;
4547 AliUnfolding::fgNormalizeInput = kFALSE;
4548 AliUnfolding::fgNotFoundEvents = 0;
4549 AliUnfolding::fgSkipBin0InChi2 = kFALSE;
4550 AliUnfolding::fgBayesianSmoothing = 1;
4551 AliUnfolding::fgBayesianIterations = 10;
4553 AliUnfolding::fgCallCount = 0;
4554 AliUnfolding::fgPowern = 5;
4555 AliUnfolding::fChi2FromFit = 0.;
4556 AliUnfolding::fPenaltyVal = 0.;
4557 AliUnfolding::fAvgResidual = 0.;
4558 AliUnfolding::fgPrintChi2Details = 0;
4559 AliUnfolding::fgCanvas = 0;
4560 AliUnfolding::fghUnfolded = 0;
4561 AliUnfolding::fghCorrelation = 0;
4562 AliUnfolding::fghEfficiency = 0;
4563 AliUnfolding::fghMeasured = 0;
4564 AliUnfolding::SetMinuitStepSize(1.);
4565 AliUnfolding::SetMinuitPrecision(1e-6);
4566 AliUnfolding::SetMinuitMaxIterations(100000);
4567 AliUnfolding::SetMinuitStrategy(2.);
4568 AliUnfolding::SetDebug(1);
4572 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4573 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4576 if(!protect)
return 0x0;
4580 p->SetName(Form(
"%s_%s", protect->GetName(), tempString.Data()));
4581 p->SetTitle(Form(
"%s_%s", protect->GetTitle(), tempString.Data()));
4582 if(kill)
delete protect;
4587 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4588 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4591 if(!protect)
return 0x0;
4595 p->SetName(Form(
"%s_%s", protect->GetName(), tempString.Data()));
4596 p->SetTitle(Form(
"%s_%s", protect->GetTitle(), tempString.Data()));
4597 if(kill)
delete protect;
4602 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4603 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4606 if(!protect)
return 0x0;
4610 p->SetName(Form(
"%s_%s", protect->GetName(), tempString.Data()));
4611 p->SetTitle(Form(
"%s_%s", protect->GetTitle(), tempString.Data()));
4612 if(kill)
delete protect;
4617 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4618 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4632 Int_t low[] = {1, 6, 11, 16, 21, 26, 31, 36};
4633 Int_t up[] = {5, 10, 15, 20, 25, 30, 35, 40};
4634 TString stringArray[] = {
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h"};
4636 const Int_t dPhiBins(8);
4638 for(
Int_t i(0); i < ptBins; i++) dPtdPhi[i] =
new TH1D(Form(
"dPtdPhi_%i", i), Form(
"dPtdPhi_%i", i), dPhiBins, 0, TMath::Pi());
4640 for(
Int_t i(0); i < dPhiBins; i++) {
4665 TH1D* kinematicEfficiencyIn = resizedResponseIn->ProjectionX();
4666 kinematicEfficiencyIn->SetNameTitle(Form(
"kin_eff_%s", stringArray[i].
Data()), Form(
"kin_eff_%s", stringArray[i].
Data()));
4668 for(
Int_t j(0); j < kinematicEfficiencyIn->GetXaxis()->GetNbins(); j++) kinematicEfficiencyIn->SetBinError(1+j, 0.);
4669 TH1D* jetFindingEfficiency(0x0);
4672 jetFindingEfficiency->SetNameTitle(Form(
"%s_coarse", jetFindingEfficiency->GetName()), Form(
"%s_coarse", jetFindingEfficiency->GetName()));
4676 TH1D* unfoldedJetSpectrumIn(0x0);
4678 TDirectoryFile* dirIn =
new TDirectoryFile(Form(
"%s___%s", stringArray[i].
Data(),
fActiveString.Data()), Form(
"%s___%s", stringArray[i].
Data(),
fActiveString.Data()));
4682 measuredJetSpectrumIn,
4684 kinematicEfficiencyIn,
4685 measuredJetSpectrumTrueBinsIn,
4687 jetFindingEfficiency);
4690 resizedResponseIn->SetNameTitle(Form(
"ResponseMatrix_%s", stringArray[i].
Data()), Form(
"response matrix %s", stringArray[i].
Data()));
4691 resizedResponseIn->SetXTitle(
"p_{T, jet}^{true} [GeV/c]");
4692 resizedResponseIn->SetYTitle(
"p_{T, jet}^{rec} [GeV/c]");
4693 resizedResponseIn =
ProtectHeap(resizedResponseIn);
4694 resizedResponseIn->Write();
4695 kinematicEfficiencyIn->SetNameTitle(Form(
"KinematicEfficiency_%s", stringArray[i].
Data()), Form(
"Kinematic efficiency, %s", stringArray[i].
Data()));
4696 kinematicEfficiencyIn =
ProtectHeap(kinematicEfficiencyIn);
4697 kinematicEfficiencyIn->Write();
4698 fDetectorResponse->SetNameTitle(
"DetectorResponse",
"Detector response matrix");
4703 fSpectrumIn->SetNameTitle(
"[ORIG]JetSpectrum", Form(
"[INPUT] Jet spectrum, %s", stringArray[i].
Data()));
4705 fDptInDist->SetNameTitle(
"[ORIG]DeltaPt", Form(
"#delta p_{T} distribution, %s", stringArray[i].
Data()));
4707 fDptIn->SetNameTitle(
"[ORIG]DeltaPtMatrix", Form(
"#delta p_{T} matrix, %s", stringArray[i].
Data()));
4709 fFullResponseIn->SetNameTitle(
"ResponseMatrix", Form(
"Response matrix, %s", stringArray[i].
Data()));
4717 TH1D* dud(
ProtectHeap(unfoldedJetSpectrumIn, kTRUE, stringArray[i]));;
4721 for(
Int_t j(0); j < ptBins; j++) {
4723 Double_t integral(dud->IntegralAndError(j+1, j+2, integralError));
4724 dPtdPhi[j]->SetBinContent(i+1, integral);
4725 dPtdPhi[j]->SetBinError(i+1, integralError);
4731 TF1* fourier =
new TF1(
"fourier",
"[0]*(1.+0.5*[1]*(TMath::Cos(2.*x)))", 0, TMath::Pi());
4733 for(
Int_t i(0); i < ptBins; i++) {
4734 dPtdPhi[i]->Fit(fourier,
"VI");
4735 Style(gPad,
"PEARSON");
4737 dPtdPhi[i]->DrawCopy();
4746 v2->SetBinContent(1+i, fourier->GetParameter(1));
4747 v2->SetBinError(1+i, fourier->GetParError(1));
4748 Style(gPad,
"PEARSON");
4751 dPtdPhi[i]->Write();
4757 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4758 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4761 graph->GetPoint(0, x, y);
4762 graph->SetPoint(array->At(0)-1,
fBinsTrue->At(array->At(0)), y);
4763 graph->SetPointError(array->At(0)-1, 10, graph->GetErrorY(0));
4764 graph->SetPoint(array->At(1)-1, -5, -5);
4768 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4769 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4773 graph->GetPoint(0, x, y);
4774 graph->SetPoint(array->At(0)-1,
fBinsTrue->At(array->At(0)), y);
4775 Double_t yl = graph->GetErrorYlow(0);
4776 Double_t yh = graph->GetErrorYhigh(0);
4777 graph->SetPointError(array->At(0)-1, 10, 10, yl, yh);
4778 graph->SetPoint(array->At(1)-1, -5, -5);
4789 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4790 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4793 Double_t statE(0), shapeE(0), corrE(0), y(0), x(0);
4796 printf(
" double v2[] = {\n");
4798 for(
Int_t i(low); i < up+1; i++) {
4799 n->GetPoint(i, x, y);
4800 if(i==up) printf(
"%.4f}; \n\n", y);
4801 else printf(
"%.4f, \n", y);
4802 gV2->SetAt(y, iterator);
4806 printf(
" double stat[] = {\n");
4807 for(
Int_t i(low); i < up+1; i++) {
4808 y = n->GetErrorYlow(i);
4809 if(i==up) printf(
"%.4f}; \n\n", y);
4810 else printf(
"%.4f, \n", y);
4811 gStat->SetAt(y, iterator);
4815 printf(
" double shape[] = {\n");
4816 for(
Int_t i(low); i < up+1; i++) {
4817 y = shape->GetErrorYhigh(i);
4818 if (y < 0.0001) y = 0.0001;
4820 shape->SetPointEYhigh(i, y);
4821 y = shape->GetErrorYlow(i);
4822 if ( y < 0.0001) y = 0.0001;
4824 shape->SetPointEYlow(i, y);
4825 if(i==up) printf(
"%.4f}; \n\n", y);
4826 else printf(
"%.4f, \n", y);
4827 gShape->SetAt(y, iterator);
4831 printf(
" double corr[] = {\n");
4832 for(
Int_t i(low); i < up+1; i++) {
4834 corr->SetPointEYhigh(i, y);
4836 corr->SetPointEYlow(i, y);
4837 if(i==up) printf(
"%.4f}; \n\n", y);
4838 else printf(
"%.4f, \n", y);
4839 gCorr->SetAt(y, iterator);
4845 for(
Int_t i(low); i < up+1; i++) {
4851 n->GetPoint(i, x, y);
4852 statE += n->GetErrorY(i);
4853 shapeE += shape->GetErrorY(i);
4854 corrE += corr->GetErrorY(i);
4857 printf(
" ======================================\n");
4858 printf(
" > between %i and %i GeV/c \n", low, up);
4859 cout <<
" AVERAGE_SHAPE " << shapeE/ctr << endl;
4860 cout <<
" AVERAGE_CORR " << corrE/ctr << endl;
4861 cout <<
" AVERAGE_STAT " << statE/ctr << endl;
4866 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4867 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4872 ROOT::Minuit2::Minuit2Minimizer min ( ROOT::Minuit2::kMigrad );
4873 min.SetMaxFunctionCalls(1000000);
4874 min.SetMaxIterations(100000);
4875 min.SetTolerance(0.001);
4878 double step[] = {0.0000001, 0.0000001};
4879 double variable[] = {-1., -1.};
4883 min.SetVariable(0,
"epsilon_c",variable[0], step[0]);
4884 min.SetVariable(1,
"epsilon_b",variable[1], step[1]);
4892 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4893 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4919 chi2 += numerator/denominator;
4925 chi2 += epsc*epsc + sumEpsb/((float)counts);
4941 chi2 += numerator/denominator;
4947 chi2 += epsc*epsc + sumEpsb/((float)counts);
4954 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4955 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4964 #ifdef ALIJETFLOWTOOLS_DEBUG_FLAG
4965 printf(
"__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
4968 const Int_t DOF(7-2);
4970 printf(
" > locating minima < \n");
4972 f1->GetMinimumXY(x, y);
4973 f1->GetXaxis()->SetTitle(
"#epsilon{c}");
4974 f1->GetXaxis()->SetTitle(
"#epsilon_{b}");
4975 f1->GetZaxis()->SetTitle(
"#chi^{2}");
4977 printf(
" ===============================================================================\n");
4978 printf(
" > minimal chi2 f(%.8f, %.8f) = %.8f (i should be ok ... ) \n", x, y, f1->Eval(x, y));
4979 cout <<
" so the probability of finding data at least as imcompatible with " <<
gPwrtTo <<
" as the actually" << endl;
4980 cout <<
" observed data is " << TMath::Prob(f1->Eval(x, y), DOF) << endl;
4981 cout <<
" minimization parameters: EPSILON_B " << y << endl;
4982 cout <<
" EPSILON_C " << x << endl;
4983 printf(
" ===============================================================================\n");
4986 p = TMath::Prob(f1->Eval(x, y), DOF);
return jsonbuilder str().c_str()