38 #include <Riostream.h> 46 #include "TGraphAsymmErrors.h" 68 fhDirectMCptMax(NULL),
69 fhDirectMCptMin(NULL),
70 fhFeedDownMCptMax(NULL),
71 fhFeedDownMCptMin(NULL),
73 fhFeedDownEffpt(NULL),
75 fgRECSystematics(NULL),
79 fGlobalEfficiencyUncertainties(),
80 fGlobalEfficiencyPtDependent(false),
88 fgFcConservative(NULL),
94 fgYieldCorrExtreme(NULL),
95 fgYieldCorrConservative(NULL),
99 fhSigmaCorrDataSyst(NULL),
100 fhSigmaCorrRcb(NULL),
102 fgSigmaCorrExtreme(NULL),
103 fgSigmaCorrConservative(NULL),
107 fFeedDownOption(option),
108 fAsymUncertainties(kTRUE),
109 fPbPbElossHypothesis(kFALSE),
110 fIsStatUncEff(kTRUE),
111 fParticleAntiParticle(2),
112 fIsEventPlane(kFALSE),
116 fhStatUncEffcSigma(NULL),
117 fhStatUncEffbSigma(NULL),
118 fhStatUncEffcFD(NULL),
119 fhStatUncEffbFD(NULL)
194 for(
Int_t i=0; i<2; i++){
217 if (&source ==
this)
return *
this;
263 for(
Int_t i=0; i<2; i++){
334 AliError(
"Feed-down or reconstructed spectra don't exist");
340 Int_t nbinsMC = hTheory->GetNbinsX();
344 Double_t thbinwidth = hTheory->GetBinWidth(1);
347 AliInfo(
" Beware it seems that the reconstructed spectra has a smaller binning than the theoretical predictions !! ");
357 sum[ibin]=0.; items[ibin]=0.;
359 for (
Int_t ibin=0; ibin<=nbinsMC; ibin++){
362 if (hTheory->GetBinCenter(ibin)>
fPtBinLimits[ibinrec] &&
364 sum[ibinrec]+=hTheory->GetBinContent(ibin);
373 hTheoryRebin->SetBinContent(ibinrec+1,sum[ibinrec]/items[ibinrec]);
376 return (
TH1D*)hTheoryRebin;
386 if (!hDirect || !hFeedDown || !
fhRECpt) {
387 AliError(
"One or both (direct, feed-down) spectra or the reconstructed spectra don't exist");
391 Bool_t areconsistent = kTRUE;
393 if (!areconsistent) {
394 AliInfo(
"Histograms are not consistent (bin width, bounds)");
402 fhDirectMCpt->SetNameTitle(
"fhDirectMCpt",
" direct theoretical prediction");
404 fhFeedDownMCpt->SetNameTitle(
"fhFeedDownMCpt",
" feed-down theoretical prediction");
416 AliError(
"Feed-down or reconstructed spectra don't exist");
424 fhFeedDownMCpt->SetNameTitle(
"fhFeedDownMCpt",
" feed-down theoretical prediction");
436 if (!hDirectMax || !hDirectMin || !hFeedDownMax|| !hFeedDownMin || !
fhRECpt) {
437 AliError(
"One or all of the max/min direct/feed-down or the reconstructed spectra don't exist");
441 Bool_t areconsistent = kTRUE;
445 if (!areconsistent) {
446 AliInfo(
"Histograms are not consistent (bin width, bounds)");
455 fhDirectMCptMax->SetNameTitle(
"fhDirectMCptMax",
" maximum direct theoretical prediction");
457 fhDirectMCptMin->SetNameTitle(
"fhDirectMCptMin",
" minimum direct theoretical prediction");
459 fhFeedDownMCptMax->SetNameTitle(
"fhFeedDownMCptMax",
" maximum feed-down theoretical prediction");
461 fhFeedDownMCptMin->SetNameTitle(
"fhFeedDownMCptMin",
" minimum feed-down theoretical prediction");
473 if (!hFeedDownMax || !hFeedDownMin || !
fhRECpt) {
474 AliError(
"One or all of the max/min direct/feed-down spectra don't exist");
478 Bool_t areconsistent = kTRUE;
480 if (!areconsistent) {
481 AliInfo(
"Histograms are not consistent (bin width, bounds)");
490 fhFeedDownMCptMax->SetNameTitle(
"fhFeedDownMCptMax",
" maximum feed-down theoretical prediction");
492 fhFeedDownMCptMin->SetNameTitle(
"fhFeedDownMCptMin",
" minimum feed-down theoretical prediction");
504 AliError(
"The direct acceptance and efficiency corrections doesn't exist");
509 fhDirectEffpt->SetNameTitle(
"fhDirectEffpt",
" direct acceptance x efficiency correction");
519 if (!hDirectEff || !hFeedDownEff) {
520 AliError(
"One or both (direct, feed-down) acceptance and efficiency corrections don't exist");
524 Bool_t areconsistent=kTRUE;
526 if (!areconsistent) {
527 AliInfo(
"Histograms are not consistent (bin width, bounds)");
533 fhDirectEffpt->SetNameTitle(
"fhDirectEffpt",
" direct acceptance x efficiency correction");
534 fhFeedDownEffpt->SetNameTitle(
"fhFeedDownEffpt",
" feed-down acceptance x efficiency correction");
544 AliError(
"The reconstructed spectrum doesn't exist");
549 fhRECpt->SetNameTitle(
"fhRECpt",
" reconstructed spectrum");
559 binwidth =
fhRECpt->GetBinWidth(i);
560 xlow =
fhRECpt->GetBinLowEdge(i);
574 Double_t gbinwidth = gRec->GetErrorXlow(1) + gRec->GetErrorXhigh(1) ;
576 Double_t gxbincenter=0., gybincenter=0.;
577 gRec->GetPoint(1,gxbincenter,gybincenter);
579 if ( (gbinwidth != hbinwidth) || (gxbincenter!=hbincenter) ) {
580 AliError(
" The reconstructed spectrum and its systematics don't seem compatible");
609 AliInfo(
" Histos not properly initialized. Check : inconsistent binning ? missing histos ?");
634 AliInfo(
" Are you sure the feed-down correction option is right ?");
639 printf(
"\n\n Correcting the spectra with : \n luminosity = %2.2e +- %2.2e, trigger efficiency = %2.2e +- %2.2e, \n delta_y = %2.2f, BR_c = %2.2e, BR_b_decay = %2.2e \n %2.2f percent uncertainty on the efficiencies, and %2.2f percent uncertainty on the b/c efficiencies ratio \n usage of pt-dependent efficiency uncertainty for Nb uncertainy calculation? %1.0d \n\n",
fLuminosity[0],
fLuminosity[1],
fTrigEfficiency[0],
fTrigEfficiency[1],deltaY,branchingRatioC,branchingRatioBintoFinalDecay,
fGlobalEfficiencyUncertainties[0],
fGlobalEfficiencyUncertainties[1],
fGlobalEfficiencyPtDependent);
656 fnSigma =
new TNtuple(
"fnSigma",
" Sigma ntuple calculation",
"pt:Signal:Rcb:fc:Yield:Sigma:SigmaStatUnc:SigmaMax:SigmaMin");
660 fnSigma =
new TNtuple(
"fnSigma",
" Sigma ntuple calculation",
"pt:Signal:Rb:fc:Yield:Sigma:SigmaStatUnc:SigmaMax:SigmaMin");
673 AliError(
" Hey you ! Why luminosity or trigger-efficiency or the c-BR or delta_y are set to zero ?! ");
677 Double_t value=0, errValue=0, errvalueMax=0., errvalueMin=0.;
678 Double_t errvalueExtremeMax=0., errvalueExtremeMin=0.;
679 Double_t errvalueConservativeMax=0., errvalueConservativeMin=0.;
684 value=0.; errValue=0.; errvalueMax=0.; errvalueMin=0.;
685 errvalueExtremeMax=0.; errvalueExtremeMin=0.;
686 errvalueConservativeMax=0.; errvalueConservativeMin=0.;
687 errvalueStatUncEffc=0.;
717 fGlobalEfficiencyUncertainties[0]*fGlobalEfficiencyUncertainties[0] );
736 errvalueMax = (value!=0.) ?
742 errvalueMin = errvalueMax;
767 AliError(
"Error reading the fc hypothesis no ntuple, please check !!");
771 Float_t pt=0., Rhy=0., fc=0., fcMin=0., fcMax=0.;
779 for (
Int_t item=0; item<entriesHypo; item++) {
782 if ( TMath::Abs( pt -
fhDirectEffpt->GetBinCenter(ibin) ) > 0.15 )
continue;
785 yieldRcbvalue /=
fhRECpt->GetBinWidth(ibin) ;
787 yieldRcbvalueMax /=
fhRECpt->GetBinWidth(ibin) ;
789 yieldRcbvalueMin /=
fhRECpt->GetBinWidth(ibin) ;
796 Double_t sigmaRcbvalueMax = (sigmaRcbvalue!=0.) ?
799 Double_t sigmaRcbvalueMin = (sigmaRcbvalue!=0.) ?
804 Double_t sigmaRcbvalueStatUnc = (sigmaRcbvalue!=0.) ?
805 sigmaRcbvalue * (
fhRECpt->GetBinError(ibin) / ( yieldRcbvalue *
fhRECpt->GetBinWidth(ibin) ) ) : 0. ;
811 Rhy, fc, yieldRcbvalue, sigmaRcbvalue, sigmaRcbvalueStatUnc, sigmaRcbvalueMax, sigmaRcbvalueMin );
823 if(value>0.)
fhStatUncEffcSigma->SetBinError(ibin,((errvalueStatUncEffc/value)*100.));
843 AliInfo(
"Hey, the reconstructed histogram was not set yet !");
852 sumSimu[ibin]=0.; sumReco[ibin]=0.;
854 for (
Int_t ibin=0; ibin<=hSimu->GetNbinsX(); ibin++){
859 sumSimu[ibinrec]+=hSimu->GetBinContent(ibin);
863 sumReco[ibinrec]+=hReco->GetBinContent(ibin);
874 if (sumSimu[ibinrec]!= 0. && sumReco[ibinrec]!=0.) {
875 eff = sumReco[ibinrec] / sumSimu[ibinrec] ;
878 erreff = TMath::Sqrt( eff * TMath::Abs(1.0 - eff) ) / TMath::Sqrt( sumSimu[ibinrec] );
880 else { eff=0.0; erreff=0.; }
881 hEfficiency->SetBinContent(ibinrec+1,eff);
882 hEfficiency->SetBinError(ibinrec+1,erreff);
888 return (
TH1D*)hEfficiency;
901 if(!
fhRECpt || !hSimu || !hReco){
902 AliError(
"Hey, the reconstructed histogram was not set yet !");
907 fhDirectEffpt->SetNameTitle(
"fhDirectEffpt",
" direct acceptance #times efficiency");
921 if(!
fhRECpt || !hSimu || !hReco){
922 AliError(
"Hey, the reconstructed histogram was not set yet !");
927 fhFeedDownEffpt->SetNameTitle(
"fhFeedDownEffpt",
" feed-down acceptance #times efficiency");
938 AliInfo(
"Getting ready for the corrections without feed-down consideration");
940 AliInfo(
"Getting ready for the fc feed-down correction calculation");
942 AliInfo(
"Getting ready for the Nb feed-down correction calculation");
943 }
else { AliError(
"The calculation option must be <=2");
return kFALSE; }
946 Bool_t areconsistent=kTRUE;
950 AliError(
" Reconstructed spectra and/or the Nc efficiency distributions are not defined");
954 if (!areconsistent) {
955 AliInfo(
"Histograms required for Nb correction are not consistent (bin width, bounds)");
963 AliError(
" Theoretical Nb and/or the Nb efficiency distributions are not defined");
970 AliError(
" Max/Min theoretical Nb distributions are not defined");
975 if (!areconsistent) {
976 AliInfo(
"Histograms required for Nb correction are not consistent (bin width, bounds)");
984 AliError(
"Theoretical Nc distributions is not defined");
991 AliError(
" Max/Min theoretical Nc distributions are not defined");
996 if (!areconsistent) {
997 AliInfo(
"Histograms required for fc correction are not consistent (bin width, bounds)");
1011 AliError(
"One or both histograms don't exist");
1015 Double_t binwidth1 = h1->GetBinWidth(1);
1016 Double_t binwidth2 = h2->GetBinWidth(1);
1017 Double_t min1 = h1->GetBinCenter(1) - (binwidth1/2.) ;
1019 Double_t min2 = h2->GetBinCenter(1) - (binwidth2/2.) ;
1022 if (binwidth1!=binwidth2) {
1023 AliInfo(
" histograms with different bin width");
1027 AliInfo(
" histograms with different minimum");
1081 AliInfo(
"Calculating the feed-down correction factor (fc method)");
1087 Double_t correctionExtremeA=1., correctionExtremeB=1.;
1088 Double_t theoryRatioExtremeA=1., theoryRatioExtremeB=1.;
1089 Double_t correctionConservativeA=1., correctionConservativeB=1.;
1090 Double_t theoryRatioConservativeA=1., theoryRatioConservativeB=1.;
1092 Double_t correctionExtremeAUnc=0., correctionExtremeBUnc=0.;
1093 Double_t correctionConservativeAUnc=0., correctionConservativeBUnc=0.;
1100 fhFcRcb =
new TH2D(
"fhFcRcb",
"fc correction factor vs Rcb Eloss hypothesis; p_{T} [GeV/c] ; Rcb Eloss hypothesis ; fc correction",
fnPtBins,
fPtBinLimits,800,0.,4.);
1101 fnHypothesis =
new TNtuple(
"fnHypothesis",
" Feed-down correction vs hypothesis (fc)",
"pt:Rcb:fc:fcMax:fcMin");
1109 fgFcExtreme->SetNameTitle(
"fgFcExtreme",
"fgFcExtreme");
1116 Double_t correctionConservativeAUncStatEffc=0., correctionConservativeBUncStatEffc=0.;
1117 Double_t correctionConservativeAUncStatEffb=0., correctionConservativeBUncStatEffb=0.;
1125 correction=1.; theoryRatio=1.; effRatio=1.;
1126 correctionExtremeA=1.; correctionExtremeB=1.;
1127 theoryRatioExtremeA=1.; theoryRatioExtremeB=1.;
1128 correctionConservativeA=1.; correctionConservativeB=1.;
1129 theoryRatioConservativeA=1.; theoryRatioConservativeB=1.;
1131 correctionExtremeAUnc=0.; correctionExtremeBUnc=0.;
1132 correctionConservativeAUnc=0.; correctionConservativeBUnc=0.;
1133 correctionConservativeAUncStatEffc=0.; correctionConservativeBUncStatEffc=0.;
1134 correctionConservativeAUncStatEffb=0.; correctionConservativeBUncStatEffb=0.;
1161 if( TMath::Abs(effRatio - 1.0)<0.0001 || TMath::Abs(theoryRatio - 1.0)<0.0001 ) {
1163 correctionExtremeA = 1.0;
1164 correctionExtremeB = 1.0;
1165 correctionConservativeA = 1.0;
1166 correctionConservativeB = 1.0;
1169 correction = ( 1. / ( 1 + ( effRatio * theoryRatio ) ) );
1170 correctionExtremeA = ( 1. / ( 1 + ( effRatio * theoryRatioExtremeA ) ) );
1171 correctionExtremeB = ( 1. / ( 1 + ( effRatio * theoryRatioExtremeB ) ) );
1172 correctionConservativeA = ( 1. / ( 1 + ( effRatio * theoryRatioConservativeA ) ) );
1173 correctionConservativeB = ( 1. / ( 1 + ( effRatio * theoryRatioConservativeB ) ) );
1187 Double_t relEffUnc = TMath::Sqrt( efficiencyUnc*efficiencyUnc +
1193 correctionExtremeAUnc = correctionExtremeA*correctionExtremeA * theoryRatioExtremeA * effRatio * relEffUnc;
1194 correctionExtremeBUnc = correctionExtremeB*correctionExtremeB * theoryRatioExtremeB * effRatio * relEffUnc;
1196 correctionConservativeAUnc = correctionConservativeA*correctionConservativeA * theoryRatioConservativeA *effRatio * relEffUnc;
1198 correctionConservativeAUncStatEffc = correctionConservativeA*correctionConservativeA * theoryRatioConservativeA *effRatio *
1200 correctionConservativeAUncStatEffb = correctionConservativeA*correctionConservativeA * theoryRatioConservativeA *effRatio *
1203 correctionConservativeBUnc = correctionConservativeB*correctionConservativeB * theoryRatioConservativeB *effRatio * relEffUnc;
1205 correctionConservativeBUncStatEffb = correctionConservativeB*correctionConservativeB * theoryRatioConservativeB *effRatio *
1207 correctionConservativeBUncStatEffc = correctionConservativeB*correctionConservativeB * theoryRatioConservativeB *effRatio *
1212 hTheoryRatio->SetBinContent(ibin,theoryRatio);
1213 hEffRatio->SetBinContent(ibin,effRatio);
1214 fhFc->SetBinContent(ibin,correction);
1221 for (
Float_t rval=0.0025; rval<4.0; rval+=0.005){
1223 Double_t correctionRcb = ( 1. / ( 1 + ( effRatio * theoryRatio * (1/rval) ) ) );
1224 fhFcRcb->Fill(
fhFc->GetBinCenter(ibin) , rval, correctionRcb );
1230 Double_t correctionConservativeARcb = ( 1. / ( 1 + ( effRatio * theoryRatioConservativeA * (1/rval) ) ) );
1231 Double_t correctionConservativeBRcb = ( 1. / ( 1 + ( effRatio * theoryRatioConservativeB * (1/rval) ) ) );
1232 Double_t correctionConservativeARcbUnc = correctionConservativeARcb*correctionConservativeARcb * theoryRatioConservativeA * (1/rval) *effRatio * relEffUnc;
1233 Double_t correctionConservativeBRcbUnc = correctionConservativeBRcb*correctionConservativeBRcb * theoryRatioConservativeB * (1/rval) *effRatio * relEffUnc;
1234 Double_t consvalRcb[4] = { correctionConservativeARcb - correctionConservativeARcbUnc, correctionConservativeARcb + correctionConservativeARcbUnc,
1235 correctionConservativeBRcb - correctionConservativeBRcbUnc, correctionConservativeBRcb + correctionConservativeBRcbUnc};
1236 Double_t uncConservativeRcbMin = correctionRcb - TMath::MinElement(4,consvalRcb);
1237 Double_t uncConservativeRcbMax = TMath::MaxElement(4,consvalRcb) - correctionRcb;
1240 fnHypothesis->Fill(
fhDirectEffpt->GetBinCenter(ibin), rval, correctionRcb, correctionRcb+uncConservativeRcbMax, correctionRcb-uncConservativeRcbMin);
1248 Double_t val[4] = { correctionExtremeA + correctionExtremeAUnc, correctionExtremeA - correctionExtremeAUnc,
1249 correctionExtremeB + correctionExtremeBUnc, correctionExtremeB - correctionExtremeBUnc };
1250 Double_t uncExtremeMin = correction - TMath::MinElement(4,val);
1251 Double_t uncExtremeMax = TMath::MaxElement(4,val) - correction;
1254 fhFcMax->SetBinContent(ibin,correction+uncExtremeMax);
1255 fhFcMin->SetBinContent(ibin,correction-uncExtremeMin);
1256 Double_t consval[4] = { correctionConservativeA - correctionConservativeAUnc, correctionConservativeA + correctionConservativeAUnc,
1257 correctionConservativeB - correctionConservativeBUnc, correctionConservativeB + correctionConservativeBUnc};
1258 Double_t uncConservativeMin = correction - TMath::MinElement(4,consval);
1259 Double_t uncConservativeMax = TMath::MaxElement(4,consval) - correction;
1262 if( !(correction>0.) ){
1269 Double_t valStatEffc[2] = { correctionConservativeAUncStatEffc/correctionConservativeA,
1270 correctionConservativeBUncStatEffc/correctionConservativeB };
1271 Double_t valStatEffb[2] = { correctionConservativeAUncStatEffb/correctionConservativeA,
1272 correctionConservativeBUncStatEffb/correctionConservativeB };
1273 Double_t uncConservativeStatEffc = TMath::MaxElement(2,valStatEffc);
1274 Double_t uncConservativeStatEffb = TMath::MaxElement(2,valStatEffb);
1298 AliInfo(
" Calculating the feed-down corrected spectrum (fc method)");
1301 AliError(
" Reconstructed or fc distributions are not defined");
1305 Double_t value = 0., errvalue = 0., errvalueMax= 0., errvalueMin= 0.;
1306 Double_t valueExtremeMax= 0., valueExtremeMin= 0.;
1307 Double_t valueConservativeMax= 0., valueConservativeMin= 0.;
1327 value = 0.; errvalue = 0.; errvalueMax= 0.; errvalueMin= 0.;
1328 valueExtremeMax= 0.; valueExtremeMin= 0.;
1329 valueConservativeMax= 0.; valueConservativeMin= 0.;
1334 value = (
fhRECpt->GetBinContent(ibin) &&
fhFc->GetBinContent(ibin)) ?
1335 fhRECpt->GetBinContent(ibin) *
fhFc->GetBinContent(ibin) : 0. ;
1336 value /=
fhRECpt->GetBinWidth(ibin) ;
1340 errvalue = (value!=0. &&
fhRECpt->GetBinContent(ibin) &&
fhRECpt->GetBinContent(ibin)!=0.) ?
1341 value * (
fhRECpt->GetBinError(ibin)/
fhRECpt->GetBinContent(ibin)) : 0. ;
1348 if (
fhRECpt->GetBinContent(ibin) &&
fhRECpt->GetBinContent(ibin)!=0.) {
1357 else { errvalueMax = 0.; errvalueMin = 0.; }
1360 valueExtremeMax =
fhRECpt->GetBinContent(ibin) * (
fhFc->GetBinContent(ibin) +
fgFcExtreme->GetErrorYhigh(ibin) ) /
fhRECpt->GetBinWidth(ibin) ;
1361 valueExtremeMin =
fhRECpt->GetBinContent(ibin) * (
fhFc->GetBinContent(ibin) -
fgFcExtreme->GetErrorYlow(ibin) ) /
fhRECpt->GetBinWidth(ibin) ;
1370 else { errvalueMax = 0.; errvalueMin = 0.; }
1382 for (
Float_t rval=0.0025; rval<4.0; rval+=0.005){
1387 fhRECpt->GetBinContent(ibin) * fcRcbvalue : 0. ;
1388 Rcbvalue /=
fhRECpt->GetBinWidth(ibin) ;
1424 AliInfo(
"Calculating the feed-down correction factor and spectrum (Nb method)");
1426 Double_t value = 0., errvalue = 0., errvalueMax = 0., errvalueMin = 0., kfactor = 0.;
1427 Double_t errvalueExtremeMax = 0., errvalueExtremeMin = 0.;
1434 fhFcRcb =
new TH2D(
"fhFcRcb",
"fc correction factor (Nb method) vs Rb Eloss hypothesis; p_{T} [GeV/c] ; Rb Eloss hypothesis ; fc correction",
fnPtBins,
fPtBinLimits,800,0.,4.);
1436 fnHypothesis =
new TNtuple(
"fnHypothesis",
" Feed-down correction vs hypothesis (Nb)",
"pt:Rb:fc:fcMax:fcMin");
1445 AliInfo(
" Beware the conservative & extreme uncertainties are equal by definition !");
1449 double correction=0, correctionMax=0., correctionMin=0.;
1470 value = 0.; errvalue = 0.; errvalueMax = 0.; errvalueMin = 0.; kfactor = 0.;
1471 errvalueExtremeMax = 0.; errvalueExtremeMin = 0.;
1472 correction=0; correctionMax=0.; correctionMin=0.;
1473 correctionUncStatEffc=0.; correctionUncStatEffb=0.;
1483 errfrac = frac * TMath::Sqrt( (
fTab[1]/
fTab[0])*(
fTab[1]/
fTab[0]) + (1/fNevts) );
1489 value = (
fhRECpt->GetBinContent(ibin)>0. &&
fhRECpt->GetBinContent(ibin)!=0. &&
1494 value /=
fhRECpt->GetBinWidth(ibin);
1495 if (value<0.) value =0.;
1498 errvalue = (value!=0. &&
fhRECpt->GetBinError(ibin) &&
fhRECpt->GetBinError(ibin)!=0.) ?
1499 fhRECpt->GetBinError(ibin) : 0.;
1500 errvalue /=
fhRECpt->GetBinWidth(ibin);
1505 correction = (value>0.) ?
1507 if (correction<0.) correction = 0.;
1528 else { errvalueMax = 0.; errvalueMin = 0.; }
1532 Double_t errCom = ( (kfactor*errfrac/frac)*(kfactor*errfrac/frac) ) +
1535 ( (kfactor*efficiencyUnc)*(kfactor*efficiencyUnc) ) ;
1536 errvalueExtremeMin = TMath::Sqrt( errCom + ( (kfactor*nbDmax/nb)*(kfactor*nbDmax/nb) ) ) /
fhRECpt->GetBinWidth(ibin);
1538 errvalueExtremeMax = TMath::Sqrt( errCom + ( (kfactor*nbDmin/nb)*(kfactor*nbDmin/nb) ) ) /
fhRECpt->GetBinWidth(ibin);
1542 correctionMin = TMath::Sqrt( errCom + ( (kfactor*nbDmax/nb)*(kfactor*nbDmax/nb) ) ) /
fhRECpt->GetBinContent(ibin) ;
1544 correctionMax = TMath::Sqrt( errCom + ( (kfactor*nbDmin/nb)*(kfactor*nbDmin/nb) ) ) /
fhRECpt->GetBinContent(ibin) ;
1547 ) /
fhRECpt->GetBinContent(ibin) ;
1548 correctionUncStatEffc = 0.;
1551 errvalueExtremeMax = TMath::Sqrt( ( (kfactor*errfrac/frac)*(kfactor*errfrac/frac) ) +
1554 ( (kfactor*efficiencyUnc)*(kfactor*efficiencyUnc) )
1555 ) /
fhRECpt->GetBinWidth(ibin);
1556 errvalueExtremeMin = errvalueExtremeMax ;
1569 for (
Float_t rval=0.0025; rval<4.0; rval+=0.005){
1573 if(fcRcbvalue<1.e-16) fcRcbvalue=0.;
1577 fhRECpt->GetBinContent(ibin) * fcRcbvalue : 0. ;
1578 Rcbvalue /=
fhRECpt->GetBinWidth(ibin) ;
1585 Double_t correctionMaxRcb = correctionMax*rval;
1586 Double_t correctionMinRcb = correctionMin*rval;
1587 fnHypothesis->Fill(
fhYieldCorr->GetBinCenter(ibin), rval, fcRcbvalue, fcRcbvalue + correctionMaxRcb, fcRcbvalue - correctionMinRcb);
1635 uncertainty = TMath::Sqrt( trackingUnc*trackingUnc + cutVarUnc*cutVarUnc );
1636 cout<<
" cutVar="<<cutVarUnc<<
" trackUnc="<<trackingUnc<<endl;
1637 if(useOnlyCutVar) uncertainty = cutVarUnc;
1654 Double_t x=0., y=0., errx=0., erryl=0., erryh=0;
1658 for(
Int_t i=0; i<nentries; i++) {
1659 x=0.; y=0.; errx=0.; erryl=0.; erryh=0.;
1667 grErrFeeddown->SetPoint(i,x,0.);
1668 grErrFeeddown->SetPointError(i,errx,errx,erryl,erryh);
1679 Double_t errylcomb=0., erryhcomb=0;
1680 for(
Int_t i=0; i<nentries; i++) {
1685 errx = grErrFeeddown->GetErrorXlow(i) ;
1686 erryl = grErrFeeddown->GetErrorYlow(i);
1687 erryh = grErrFeeddown->GetErrorYhigh(i);
1696 fgSigmaCorr->SetPointError(i,errx,errx,errylcomb,erryhcomb);
1713 TCanvas *csigma =
new TCanvas(
"csigma",
"Draw the corrected cross-section & the prediction");
1714 csigma->SetFillColor(0);
1715 gPrediction->GetXaxis()->SetTitleSize(0.05);
1716 gPrediction->GetXaxis()->SetTitleOffset(0.95);
1717 gPrediction->GetYaxis()->SetTitleSize(0.05);
1718 gPrediction->GetYaxis()->SetTitleOffset(0.95);
1719 gPrediction->GetXaxis()->SetTitle(
"p_{T} [GeV]");
1720 gPrediction->GetYaxis()->SetTitle(
"BR #times #frac{d#sigma}{dp_{T}} |_{|y|<0.5} [pb/GeV]");
1721 gPrediction->SetLineColor(kGreen+2);
1722 gPrediction->SetLineWidth(3);
1723 gPrediction->SetFillColor(kGreen+1);
1724 gPrediction->Draw(
"3CA");
1733 TLegend * leg =
new TLegend(0.7,0.75,0.87,0.5);
1734 leg->SetBorderSize(0);
1735 leg->SetLineColor(0);
1736 leg->SetFillColor(0);
1737 leg->SetTextFont(42);
1738 leg->AddEntry(gPrediction,
"FONLL ",
"fl");
1739 leg->AddEntry(
fhSigmaCorr,
"data stat. unc.",
"pl");
1755 Bool_t areconsistent=kTRUE;
1757 if (!areconsistent) {
1758 AliInfo(
"the histograms to reweight are not consistent (bin width, bounds)");
1763 TH1D *hReweighted = (
TH1D*)hToReweight->Clone(
"hReweighted");
1764 hReweighted->Reset();
1767 Double_t integralRef = hReference->Integral();
1768 Double_t integralH = hToReweight->Integral();
1774 for (
Int_t i=0; i<=hToReweight->GetNbinsX(); i++) {
1775 weight = (hReference->GetBinContent(i)/integralRef) / (hToReweight->GetBinContent(i)/integralH) ;
1776 yvalue = hToReweight->GetBinContent(i);
1777 hReweighted->SetBinContent(i,yvalue*weight);
1780 return (
TH1D*)hReweighted;
1792 Bool_t areconsistent=kTRUE;
1795 if (!areconsistent) {
1796 AliInfo(
"the histograms to reweight are not consistent (bin width, bounds)");
1801 TH1D *hReweighted = (
TH1D*)hMCToReweight->Clone(
"hReweighted");
1802 hReweighted->Reset();
1803 TH1D *hRecReweighted = (
TH1D*)hRecToReweight->Clone(
"hRecReweighted");
1804 hRecReweighted->Reset();
1806 Double_t yvalue=1.0, yrecvalue=1.0;
1807 Double_t integralRef = hMCReference->Integral();
1808 Double_t integralH = hMCToReweight->Integral();
1815 for (
Int_t i=0; i<=hMCToReweight->GetNbinsX(); i++) {
1816 weight = (hMCReference->GetBinContent(i)/integralRef) / (hMCToReweight->GetBinContent(i)/integralH) ;
1817 yvalue = hMCToReweight->GetBinContent(i);
1818 hReweighted->SetBinContent(i,yvalue*weight);
1819 yrecvalue = hRecToReweight->GetBinContent(i);
1820 hRecReweighted->SetBinContent(i,yrecvalue*weight);
1823 return (
TH1D*)hRecReweighted;
1836 for (
int j=0; j<=
nbins; j++) {
1837 Float_t value = histo->GetYaxis()->GetBinCenter(j);
1838 Float_t width = histo->GetYaxis()->GetBinWidth(j);
1840 if( TMath::Abs(yvalue-value)<= width ) {
1854 for(
Int_t i=0; i<=entries; i++){
TH2D * fhSigmaCorrRcb
Corrected cross-section (syst. unc. from data only)
TGraphAsymmErrors * fgYieldCorr
Corrected yield (stat unc. only) vs the Ratio(c/b eloss)
void SetMCptDistributionsBounds(TH1D *hDirectMax, TH1D *hDirectMin, TH1D *hFeedDownMax, TH1D *hFeedDownMin)
Set the theoretical direct & feeddown pt spectrum upper and lower bounds.
TH1D * fhStatUncEffbFD
Uncertainty on the feed-down correction due to the prompt efficiency statistical uncertainty.
TH1D * fhStatUncEffcFD
Uncertainty on the cross-section due to the feed-down efficiency statistical uncertainty.
void CalculateFeedDownCorrectedSpectrumFc()
Correct the yield for feed-down correction via fc-method.
TGraphAsymmErrors * fgYieldCorrExtreme
Corrected yield as TGraphAsymmErrors (syst but feed-down)
void DrawSpectrum(TGraphAsymmErrors *gPrediction)
Drawing the corrected spectrum comparing to theoretical prediction.
Int_t fNevts
all reconstructed D Systematic uncertainties
TGraphAsymmErrors * fgYieldCorrConservative
Extreme corrected yield as TGraphAsymmErrors (syst from feed-down)
void CalculateFeedDownCorrectionFc()
Compute the feed-down correction via fc-method.
Double_t CalculateEfficiencyPtDepedentUncertainty(Double_t pt, Bool_t useOnlyCutVar)
Calculate the efficiency pt-dependent uncertainty.
TNtuple * fnHypothesis
Ntuple of the calculation vs the Ratio(c/b eloss)
void SetDirectAccEffCorrection(TH1D *hDirectEff)
Set the acceptance and efficiency corrections for direct.
void EstimateAndSetDirectEfficiencyRecoBin(TH1D *hSimu, TH1D *hReco)
TH1D * fhDirectMCptMin
Input MC maximum c–>D spectra.
TH1D * fhYieldCorrMax
Corrected yield (stat unc. only)
void EstimateAndSetFeedDownEfficiencyRecoBin(TH1D *hSimu, TH1D *hReco)
TH1D * fhSigmaCorrMin
Maximum corrected cross-section.
Double_t GetCutsEffErr(Double_t pt) const
TH2D * fhYieldCorrRcb
Minimum corrected yield.
void CalculateFeedDownCorrectedSpectrumNb(Double_t deltaY, Double_t branchingRatioBintoFinalDecay)
Correct the yield for feed-down correction via Nb-method.
void SetFeedDownMCptDistributionsBounds(TH1D *hFeedDownMax, TH1D *hFeedDownMin)
Set the theoretical feeddown pt spectrum upper and lower bounds.
Bool_t fPbPbElossHypothesis
flag: asymmetric uncertainties are (1) or not (0) considered
Bool_t fAsymUncertainties
feed-down correction flag: 0=none, 1=fc, 2=Nb
AliHFSystErr * fSystematics
Tab parameter and its uncertainty.
TH1D * ReweightRecHisto(TH1D *hRecToReweight, TH1D *hMCToReweight, TH1D *hMCReference)
to reweight the reco-histos: hRecToReweight is reweighted as hReference/hMCToReweight ...
TH1D * fhDirectMCptMax
Input MC b–>D spectra.
Int_t fnPtBins
flag : when the analysis is done for In/Out of plane, divide the B-prediction by two ...
TH2D * fhFcRcb
Minimum fc histo.
TH1D * fhFeedDownEffpt
c–>D Acceptance and efficiency correction
TH1D * fhDirectEffpt
Input MC minimum b–>D spectra.
void ResetStatUncEff()
Reset stat unc on the efficiencies.
Bool_t Initialize()
Initialization.
Double_t GetTrackingEffErr(Double_t pt) const
TH1D * fhFeedDownMCptMin
Input MC maximum b–>D spectra.
TGraphAsymmErrors * fgFcExtreme
Correction histo fc vs the Ratio(c/b eloss)
TH1D * fhSigmaCorrDataSyst
Minimum corrected cross-section.
TNtuple * fnSigma
Conservative corrected cross-section as TGraphAsymmErrors (syst from feed-down)
Int_t fFeedDownOption
0=pp, 1=Pb-Pb, 2=p-Pb
TH1D * fhFeedDownMCpt
Input MC c–>D spectra.
void SetReconstructedSpectrum(TH1D *hRec)
Set the reconstructed spectrum.
TGraphAsymmErrors * fgSigmaCorrConservative
Extreme corrected cross-section as TGraphAsymmErrors (syst from feed-down)
Double_t GetTotalSystErr(Double_t pt, Double_t feeddownErr=0) const
TH1D * fhFcMin
Maximum fc histo.
Int_t FindTH2YBin(TH2D *histo, Float_t yvalue)
Functionality to find the y-axis bin of a TH2 for a given y-value.
TH1D * fhFeedDownMCptMax
Input MC minimum c–>D spectra.
void SetReconstructedSpectrumSystematics(TGraphAsymmErrors *gRec)
Bool_t fGlobalEfficiencyPtDependent
uncertainties on the efficiency [0]=c, b, [1]=b/c
TH1D * fhStatUncEffcSigma
TH1D * fhSigmaCorr
Conservative corrected yield as TGraphAsymmErrors (syst from feed-down)
Double_t fTab[2]
use a pt-dependent efficiency uncertainty (Nb method unc.)
TGraphAsymmErrors * fgSigmaCorr
Corrected cross-section (stat unc. only) vs the Ratio(c/b eloss)
AliHFPtSpectrum & operator=(const AliHFPtSpectrum &source)
Assignment operator.
void ComputeSystUncertainties(Bool_t combineFeedDown)
TH1D * fhYieldCorrMin
Maximum corrected yield.
Int_t fCollisionType
Ntuple of the calculation vs the Ratio(c/b eloss)
void CalculateCorrectedSpectrumNoFeedDown()
TH1D * fhYieldCorr
Extreme correction as TGraphAsymmErrors.
void SetFeedDownMCptSpectra(TH1D *hFeedDown)
Set the theoretical feeddown pt spectrum.
virtual ~AliHFPtSpectrum()
Destructor.
TH1D * RebinTheoreticalSpectra(TH1D *hTheory, const char *name)
Function to rebin the theoretical spectra in the data-reconstructed spectra binning.
TGraphAsymmErrors * fgRECSystematics
all reconstructed D
Bool_t CheckHistosConsistency(TH1D *h1, TH1D *h2)
Check histograms consistency function.
TH1D * fhStatUncEffbSigma
Uncertainty on the cross-section due to the prompt efficiency statistical uncertainty.
void ComputeHFPtSpectrum(Double_t deltaY=1.0, Double_t branchingRatioC=1.0, Double_t branchingRatioBintoFinalDecay=1.0)
TGraphAsymmErrors * fgSigmaCorrExtreme
Corrected cross-section as TGraphAsymmErrors (syst but feed-down)
Double_t fTrigEfficiency[2]
analyzed luminosity & uncertainty
void SetAccEffCorrection(TH1D *hDirectEff, TH1D *hFeedDownEff)
Set the acceptance and efficiency corrections for direct & feeddown.
TH1D * fhRECpt
b–>D Acceptance and efficiency correction
TH1D * ReweightHisto(TH1D *hToReweight, TH1D *hReference)
TH1D * fhFcMax
Correction histo fc = 1 / ( 1 + (eff_b/eff_c)*(N_b/N_c) )
Double_t fGlobalEfficiencyUncertainties[2]
trigger efficiency & uncertainty
void DrawErrors(TGraphAsymmErrors *grErrFeeddown=0) const
TGraphAsymmErrors * fgFcConservative
Extreme correction as TGraphAsymmErrors.
Int_t fParticleAntiParticle
flag : consider (1) or not (0) the stat unc on the efficiencies
AliHFPtSpectrum(const char *name="AliHFPtSpectrum", const char *title="HF feed down correction class", Int_t option=1)
Constructor.
TH1D * EstimateEfficiencyRecoBin(TH1D *hSimu, TH1D *hReco, const char *name)
Function to estimate the efficiency in the data-reconstructed spectra binning.
Double_t fLuminosity[2]
nb of analyzed events
void SetMCptSpectra(TH1D *hDirect, TH1D *hFeedDown)
TH1D * fhFc
Systematic uncertainy on the raw yields.
Double_t * fPtBinLimits
number of pt bins
Bool_t fIsStatUncEff
flag: whether to do estimates vs Ratio(c/b eloss) hypothesis
TH1D * fhSigmaCorrMax
Corrected cross-section (stat unc. only)
Bool_t fIsEventPlane
1: only one sign, 2: yield is for particle+anti-particle