38 #include <Riostream.h>
46 #include "TGraphAsymmErrors.h"
65 fhDirectMCptMax(NULL),
66 fhDirectMCptMin(NULL),
67 fhFeedDownMCptMax(NULL),
68 fhFeedDownMCptMin(NULL),
70 fhFeedDownEffpt(NULL),
72 fgRECSystematics(NULL),
76 fGlobalEfficiencyUncertainties(),
83 fgFcConservative(NULL),
89 fgYieldCorrExtreme(NULL),
90 fgYieldCorrConservative(NULL),
94 fhSigmaCorrDataSyst(NULL),
97 fgSigmaCorrExtreme(NULL),
98 fgSigmaCorrConservative(NULL),
102 fFeedDownOption(option),
103 fAsymUncertainties(kTRUE),
104 fPbPbElossHypothesis(kFALSE),
105 fIsStatUncEff(kTRUE),
106 fParticleAntiParticle(2),
107 fIsEventPlane(kFALSE),
111 fhStatUncEffcSigma(NULL),
112 fhStatUncEffbSigma(NULL),
113 fhStatUncEffcFD(NULL),
114 fhStatUncEffbFD(NULL)
130 fhDirectMCpt(rhs.fhDirectMCpt),
131 fhFeedDownMCpt(rhs.fhFeedDownMCpt),
132 fhDirectMCptMax(rhs.fhDirectMCptMax),
133 fhDirectMCptMin(rhs.fhDirectMCptMin),
134 fhFeedDownMCptMax(rhs.fhFeedDownMCptMax),
135 fhFeedDownMCptMin(rhs.fhFeedDownMCptMin),
136 fhDirectEffpt(rhs.fhDirectEffpt),
137 fhFeedDownEffpt(rhs.fhFeedDownEffpt),
138 fhRECpt(rhs.fhRECpt),
139 fgRECSystematics(rhs.fgRECSystematics),
143 fGlobalEfficiencyUncertainties(),
146 fhFcMax(rhs.fhFcMax),
147 fhFcMin(rhs.fhFcMin),
148 fhFcRcb(rhs.fhFcRcb),
149 fgFcExtreme(rhs.fgFcExtreme),
150 fgFcConservative(rhs.fgFcConservative),
151 fhYieldCorr(rhs.fhYieldCorr),
152 fhYieldCorrMax(rhs.fhYieldCorrMax),
153 fhYieldCorrMin(rhs.fhYieldCorrMin),
154 fhYieldCorrRcb(rhs.fhYieldCorrRcb),
155 fgYieldCorr(rhs.fgYieldCorr),
156 fgYieldCorrExtreme(rhs.fgYieldCorrExtreme),
157 fgYieldCorrConservative(rhs.fgYieldCorrConservative),
158 fhSigmaCorr(rhs.fhSigmaCorr),
159 fhSigmaCorrMax(rhs.fhSigmaCorrMax),
160 fhSigmaCorrMin(rhs.fhSigmaCorrMin),
161 fhSigmaCorrDataSyst(rhs.fhSigmaCorrDataSyst),
162 fhSigmaCorrRcb(rhs.fhSigmaCorrRcb),
163 fgSigmaCorr(rhs.fgSigmaCorr),
164 fgSigmaCorrExtreme(rhs.fgSigmaCorrExtreme),
165 fgSigmaCorrConservative(rhs.fgSigmaCorrConservative),
166 fnSigma(rhs.fnSigma),
167 fnHypothesis(rhs.fnHypothesis),
168 fCollisionType(rhs.fCollisionType),
169 fFeedDownOption(rhs.fFeedDownOption),
170 fAsymUncertainties(rhs.fAsymUncertainties),
171 fPbPbElossHypothesis(rhs.fPbPbElossHypothesis),
172 fIsStatUncEff(rhs.fIsStatUncEff),
173 fParticleAntiParticle(rhs.fParticleAntiParticle),
174 fIsEventPlane(rhs.fIsEventPlane),
175 fnPtBins(rhs.fnPtBins),
178 fhStatUncEffcSigma(NULL),
179 fhStatUncEffbSigma(NULL),
180 fhStatUncEffcFD(NULL),
181 fhStatUncEffbFD(NULL)
187 for(Int_t i=0; i<2; i++){
210 if (&source ==
this)
return *
this;
254 for(Int_t i=0; i<2; i++){
325 AliError(
"Feed-down or reconstructed spectra don't exist");
331 Int_t nbinsMC = hTheory->GetNbinsX();
335 Double_t thbinwidth = hTheory->GetBinWidth(1);
338 AliInfo(
" Beware it seems that the reconstructed spectra has a smaller binning than the theoretical predictions !! ");
347 for (Int_t ibin=0; ibin<
fnPtBins; ibin++) {
348 sum[ibin]=0.; items[ibin]=0.;
350 for (Int_t ibin=0; ibin<=nbinsMC; ibin++){
352 for (Int_t ibinrec=0; ibinrec<
fnPtBins; ibinrec++){
353 if (hTheory->GetBinCenter(ibin)>
fPtBinLimits[ibinrec] &&
355 sum[ibinrec]+=hTheory->GetBinContent(ibin);
363 for (Int_t ibinrec=0; ibinrec<
fnPtBins; ibinrec++) {
364 hTheoryRebin->SetBinContent(ibinrec+1,sum[ibinrec]/items[ibinrec]);
367 return (TH1D*)hTheoryRebin;
377 if (!hDirect || !hFeedDown || !
fhRECpt) {
378 AliError(
"One or both (direct, feed-down) spectra or the reconstructed spectra don't exist");
382 Bool_t areconsistent = kTRUE;
384 if (!areconsistent) {
385 AliInfo(
"Histograms are not consistent (bin width, bounds)");
393 fhDirectMCpt->SetNameTitle(
"fhDirectMCpt",
" direct theoretical prediction");
395 fhFeedDownMCpt->SetNameTitle(
"fhFeedDownMCpt",
" feed-down theoretical prediction");
407 AliError(
"Feed-down or reconstructed spectra don't exist");
415 fhFeedDownMCpt->SetNameTitle(
"fhFeedDownMCpt",
" feed-down theoretical prediction");
427 if (!hDirectMax || !hDirectMin || !hFeedDownMax|| !hFeedDownMin || !
fhRECpt) {
428 AliError(
"One or all of the max/min direct/feed-down or the reconstructed spectra don't exist");
432 Bool_t areconsistent = kTRUE;
436 if (!areconsistent) {
437 AliInfo(
"Histograms are not consistent (bin width, bounds)");
446 fhDirectMCptMax->SetNameTitle(
"fhDirectMCptMax",
" maximum direct theoretical prediction");
448 fhDirectMCptMin->SetNameTitle(
"fhDirectMCptMin",
" minimum direct theoretical prediction");
450 fhFeedDownMCptMax->SetNameTitle(
"fhFeedDownMCptMax",
" maximum feed-down theoretical prediction");
452 fhFeedDownMCptMin->SetNameTitle(
"fhFeedDownMCptMin",
" minimum feed-down theoretical prediction");
464 if (!hFeedDownMax || !hFeedDownMin || !
fhRECpt) {
465 AliError(
"One or all of the max/min direct/feed-down spectra don't exist");
469 Bool_t areconsistent = kTRUE;
471 if (!areconsistent) {
472 AliInfo(
"Histograms are not consistent (bin width, bounds)");
481 fhFeedDownMCptMax->SetNameTitle(
"fhFeedDownMCptMax",
" maximum feed-down theoretical prediction");
483 fhFeedDownMCptMin->SetNameTitle(
"fhFeedDownMCptMin",
" minimum feed-down theoretical prediction");
495 AliError(
"The direct acceptance and efficiency corrections doesn't exist");
500 fhDirectEffpt->SetNameTitle(
"fhDirectEffpt",
" direct acceptance x efficiency correction");
510 if (!hDirectEff || !hFeedDownEff) {
511 AliError(
"One or both (direct, feed-down) acceptance and efficiency corrections don't exist");
515 Bool_t areconsistent=kTRUE;
517 if (!areconsistent) {
518 AliInfo(
"Histograms are not consistent (bin width, bounds)");
524 fhDirectEffpt->SetNameTitle(
"fhDirectEffpt",
" direct acceptance x efficiency correction");
525 fhFeedDownEffpt->SetNameTitle(
"fhFeedDownEffpt",
" feed-down acceptance x efficiency correction");
535 AliError(
"The reconstructed spectrum doesn't exist");
539 fhRECpt = (TH1D*)hRec->Clone();
540 fhRECpt->SetNameTitle(
"fhRECpt",
" reconstructed spectrum");
548 Double_t xlow=0., binwidth=0.;
550 binwidth =
fhRECpt->GetBinWidth(i);
551 xlow =
fhRECpt->GetBinLowEdge(i);
565 Double_t gbinwidth = gRec->GetErrorXlow(1) + gRec->GetErrorXhigh(1) ;
566 Double_t hbinwidth =
fhRECpt->GetBinWidth(1);
567 Double_t gxbincenter=0., gybincenter=0.;
568 gRec->GetPoint(1,gxbincenter,gybincenter);
569 Double_t hbincenter =
fhRECpt->GetBinCenter(1);
570 if ( (gbinwidth != hbinwidth) || (gxbincenter!=hbincenter) ) {
571 AliError(
" The reconstructed spectrum and its systematics don't seem compatible");
600 AliInfo(
" Histos not properly initialized. Check : inconsistent binning ? missing histos ?");
625 AliInfo(
" Are you sure the feed-down correction option is right ?");
630 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\n",
fLuminosity[0],
fLuminosity[1],
fTrigEfficiency[0],
fTrigEfficiency[1],deltaY,branchingRatioC,branchingRatioBintoFinalDecay,
fGlobalEfficiencyUncertainties[0],
fGlobalEfficiencyUncertainties[1]);
647 fnSigma =
new TNtuple(
"fnSigma",
" Sigma ntuple calculation",
"pt:Signal:Rcb:fc:Yield:Sigma:SigmaStatUnc:SigmaMax:SigmaMin");
651 fnSigma =
new TNtuple(
"fnSigma",
" Sigma ntuple calculation",
"pt:Signal:Rb:fc:Yield:Sigma:SigmaStatUnc:SigmaMax:SigmaMin");
664 AliError(
" Hey you ! Why luminosity or trigger-efficiency or the c-BR or delta_y are set to zero ?! ");
668 Double_t value=0, errValue=0, errvalueMax=0., errvalueMin=0.;
669 Double_t errvalueExtremeMax=0., errvalueExtremeMin=0.;
670 Double_t errvalueConservativeMax=0., errvalueConservativeMin=0.;
671 Double_t errvalueStatUncEffc=0.;
672 for(Int_t ibin=1; ibin<=
fnPtBins; ibin++){
675 value=0.; errValue=0.; errvalueMax=0.; errvalueMin=0.;
676 errvalueExtremeMax=0.; errvalueExtremeMin=0.;
677 errvalueConservativeMax=0.; errvalueConservativeMin=0.;
678 errvalueStatUncEffc=0.;
708 fGlobalEfficiencyUncertainties[0]*fGlobalEfficiencyUncertainties[0] );
727 errvalueMax = (value!=0.) ?
733 errvalueMin = errvalueMax;
755 AliError(
"Error reading the fc hypothesis no ntuple, please check !!");
759 Float_t pt=0., Rhy=0., fc=0., fcMin=0., fcMax=0.;
767 for (Int_t item=0; item<entriesHypo; item++) {
770 if ( TMath::Abs( pt -
fhDirectEffpt->GetBinCenter(ibin) ) > 0.15 )
continue;
772 Double_t yieldRcbvalue = (
fhRECpt->GetBinContent(ibin) ) ?
fhRECpt->GetBinContent(ibin) * fc : 0. ;
773 yieldRcbvalue /=
fhRECpt->GetBinWidth(ibin) ;
774 Double_t yieldRcbvalueMax = (
fhRECpt->GetBinContent(ibin) ) ?
fhRECpt->GetBinContent(ibin) * fcMax : 0. ;
775 yieldRcbvalueMax /=
fhRECpt->GetBinWidth(ibin) ;
776 Double_t yieldRcbvalueMin = (
fhRECpt->GetBinContent(ibin) ) ?
fhRECpt->GetBinContent(ibin) * fcMin : 0. ;
777 yieldRcbvalueMin /=
fhRECpt->GetBinWidth(ibin) ;
784 Double_t sigmaRcbvalueMax = (sigmaRcbvalue!=0.) ?
787 Double_t sigmaRcbvalueMin = (sigmaRcbvalue!=0.) ?
792 Double_t sigmaRcbvalueStatUnc = (sigmaRcbvalue!=0.) ?
793 sigmaRcbvalue * (
fhRECpt->GetBinError(ibin) / ( yieldRcbvalue *
fhRECpt->GetBinWidth(ibin) ) ) : 0. ;
799 Rhy, fc, yieldRcbvalue, sigmaRcbvalue, sigmaRcbvalueStatUnc, sigmaRcbvalueMax, sigmaRcbvalueMin );
811 if(value>0.)
fhStatUncEffcSigma->SetBinError(ibin,((errvalueStatUncEffc/value)*100.));
831 AliInfo(
"Hey, the reconstructed histogram was not set yet !");
837 Double_t *sumSimu=
new Double_t[
fnPtBins];
838 Double_t *sumReco=
new Double_t[
fnPtBins];
839 for (Int_t ibin=0; ibin<
fnPtBins; ibin++){
840 sumSimu[ibin]=0.; sumReco[ibin]=0.;
842 for (Int_t ibin=0; ibin<=hSimu->GetNbinsX(); ibin++){
844 for (Int_t ibinrec=0; ibinrec<
fnPtBins; ibinrec++){
847 sumSimu[ibinrec]+=hSimu->GetBinContent(ibin);
851 sumReco[ibinrec]+=hReco->GetBinContent(ibin);
860 Double_t eff=0., erreff=0.;
861 for (Int_t ibinrec=0; ibinrec<
fnPtBins; ibinrec++) {
862 if (sumSimu[ibinrec]!= 0. && sumReco[ibinrec]!=0.) {
863 eff = sumReco[ibinrec] / sumSimu[ibinrec] ;
866 erreff = TMath::Sqrt( eff * TMath::Abs(1.0 - eff) ) / TMath::Sqrt( sumSimu[ibinrec] );
868 else { eff=0.0; erreff=0.; }
869 hEfficiency->SetBinContent(ibinrec+1,eff);
870 hEfficiency->SetBinError(ibinrec+1,erreff);
876 return (TH1D*)hEfficiency;
889 if(!
fhRECpt || !hSimu || !hReco){
890 AliError(
"Hey, the reconstructed histogram was not set yet !");
895 fhDirectEffpt->SetNameTitle(
"fhDirectEffpt",
" direct acceptance #times efficiency");
909 if(!
fhRECpt || !hSimu || !hReco){
910 AliError(
"Hey, the reconstructed histogram was not set yet !");
915 fhFeedDownEffpt->SetNameTitle(
"fhFeedDownEffpt",
" feed-down acceptance #times efficiency");
926 AliInfo(
"Getting ready for the corrections without feed-down consideration");
928 AliInfo(
"Getting ready for the fc feed-down correction calculation");
930 AliInfo(
"Getting ready for the Nb feed-down correction calculation");
931 }
else { AliError(
"The calculation option must be <=2");
return kFALSE; }
934 Bool_t areconsistent=kTRUE;
938 AliError(
" Reconstructed spectra and/or the Nc efficiency distributions are not defined");
942 if (!areconsistent) {
943 AliInfo(
"Histograms required for Nb correction are not consistent (bin width, bounds)");
951 AliError(
" Theoretical Nb and/or the Nb efficiency distributions are not defined");
958 AliError(
" Max/Min theoretical Nb distributions are not defined");
963 if (!areconsistent) {
964 AliInfo(
"Histograms required for Nb correction are not consistent (bin width, bounds)");
972 AliError(
"Theoretical Nc distributions is not defined");
979 AliError(
" Max/Min theoretical Nc distributions are not defined");
984 if (!areconsistent) {
985 AliInfo(
"Histograms required for fc correction are not consistent (bin width, bounds)");
999 AliError(
"One or both histograms don't exist");
1003 Double_t binwidth1 = h1->GetBinWidth(1);
1004 Double_t binwidth2 = h2->GetBinWidth(1);
1005 Double_t min1 = h1->GetBinCenter(1) - (binwidth1/2.) ;
1007 Double_t min2 = h2->GetBinCenter(1) - (binwidth2/2.) ;
1010 if (binwidth1!=binwidth2) {
1011 AliInfo(
" histograms with different bin width");
1015 AliInfo(
" histograms with different minimum");
1042 for (Int_t ibin=1; ibin<=
fnPtBins; ibin++) {
1043 Double_t value =
fhRECpt->GetBinContent(ibin) /
fhRECpt->GetBinWidth(ibin);
1044 Double_t errvalue =
fhRECpt->GetBinError(ibin) /
fhRECpt->GetBinWidth(ibin);
1069 AliInfo(
"Calculating the feed-down correction factor (fc method)");
1072 Double_t correction=1.;
1073 Double_t theoryRatio=1.;
1074 Double_t effRatio=1.;
1075 Double_t correctionExtremeA=1., correctionExtremeB=1.;
1076 Double_t theoryRatioExtremeA=1., theoryRatioExtremeB=1.;
1077 Double_t correctionConservativeA=1., correctionConservativeB=1.;
1078 Double_t theoryRatioConservativeA=1., theoryRatioConservativeB=1.;
1080 Double_t correctionExtremeAUnc=0., correctionExtremeBUnc=0.;
1081 Double_t correctionConservativeAUnc=0., correctionConservativeBUnc=0.;
1088 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.);
1089 fnHypothesis =
new TNtuple(
"fnHypothesis",
" Feed-down correction vs hypothesis (fc)",
"pt:Rcb:fc:fcMax:fcMin");
1092 TH1D *hTheoryRatio =
new TH1D(
"hTheoryRatio",
"Theoretical B-->D over c-->D (feed-down/direct) ratio",
fnPtBins,
fPtBinLimits);
1093 TH1D *hEffRatio =
new TH1D(
"hEffRatio",
"Efficiency B-->D over c-->D (feed-down/direct) ratio",
fnPtBins,
fPtBinLimits);
1097 fgFcExtreme->SetNameTitle(
"fgFcExtreme",
"fgFcExtreme");
1104 Double_t correctionConservativeAUncStatEffc=0., correctionConservativeBUncStatEffc=0.;
1105 Double_t correctionConservativeAUncStatEffb=0., correctionConservativeBUncStatEffb=0.;
1110 for (Int_t ibin=1; ibin<=
fnPtBins; ibin++) {
1113 correction=1.; theoryRatio=1.; effRatio=1.;
1114 correctionExtremeA=1.; correctionExtremeB=1.;
1115 theoryRatioExtremeA=1.; theoryRatioExtremeB=1.;
1116 correctionConservativeA=1.; correctionConservativeB=1.;
1117 theoryRatioConservativeA=1.; theoryRatioConservativeB=1.;
1119 correctionExtremeAUnc=0.; correctionExtremeBUnc=0.;
1120 correctionConservativeAUnc=0.; correctionConservativeBUnc=0.;
1121 correctionConservativeAUncStatEffc=0.; correctionConservativeBUncStatEffc=0.;
1122 correctionConservativeAUncStatEffb=0.; correctionConservativeBUncStatEffb=0.;
1149 if( TMath::Abs(effRatio - 1.0)<0.0001 || TMath::Abs(theoryRatio - 1.0)<0.0001 ) {
1151 correctionExtremeA = 1.0;
1152 correctionExtremeB = 1.0;
1153 correctionConservativeA = 1.0;
1154 correctionConservativeB = 1.0;
1157 correction = ( 1. / ( 1 + ( effRatio * theoryRatio ) ) );
1158 correctionExtremeA = ( 1. / ( 1 + ( effRatio * theoryRatioExtremeA ) ) );
1159 correctionExtremeB = ( 1. / ( 1 + ( effRatio * theoryRatioExtremeB ) ) );
1160 correctionConservativeA = ( 1. / ( 1 + ( effRatio * theoryRatioConservativeA ) ) );
1161 correctionConservativeB = ( 1. / ( 1 + ( effRatio * theoryRatioConservativeB ) ) );
1173 correctionExtremeAUnc = correctionExtremeA*correctionExtremeA * theoryRatioExtremeA * effRatio * relEffUnc;
1174 correctionExtremeBUnc = correctionExtremeB*correctionExtremeB * theoryRatioExtremeB * effRatio * relEffUnc;
1176 correctionConservativeAUnc = correctionConservativeA*correctionConservativeA * theoryRatioConservativeA *effRatio * relEffUnc;
1178 correctionConservativeAUncStatEffc = correctionConservativeA*correctionConservativeA * theoryRatioConservativeA *effRatio *
1180 correctionConservativeAUncStatEffb = correctionConservativeA*correctionConservativeA * theoryRatioConservativeA *effRatio *
1183 correctionConservativeBUnc = correctionConservativeB*correctionConservativeB * theoryRatioConservativeB *effRatio * relEffUnc;
1185 correctionConservativeBUncStatEffb = correctionConservativeB*correctionConservativeB * theoryRatioConservativeB *effRatio *
1187 correctionConservativeBUncStatEffc = correctionConservativeB*correctionConservativeB * theoryRatioConservativeB *effRatio *
1192 hTheoryRatio->SetBinContent(ibin,theoryRatio);
1193 hEffRatio->SetBinContent(ibin,effRatio);
1194 fhFc->SetBinContent(ibin,correction);
1201 for (Float_t rval=0.0025; rval<4.0; rval+=0.005){
1203 Double_t correctionRcb = ( 1. / ( 1 + ( effRatio * theoryRatio * (1/rval) ) ) );
1204 fhFcRcb->Fill(
fhFc->GetBinCenter(ibin) , rval, correctionRcb );
1210 Double_t correctionConservativeARcb = ( 1. / ( 1 + ( effRatio * theoryRatioConservativeA * (1/rval) ) ) );
1211 Double_t correctionConservativeBRcb = ( 1. / ( 1 + ( effRatio * theoryRatioConservativeB * (1/rval) ) ) );
1212 Double_t correctionConservativeARcbUnc = correctionConservativeARcb*correctionConservativeARcb * theoryRatioConservativeA * (1/rval) *effRatio * relEffUnc;
1213 Double_t correctionConservativeBRcbUnc = correctionConservativeBRcb*correctionConservativeBRcb * theoryRatioConservativeB * (1/rval) *effRatio * relEffUnc;
1214 Double_t consvalRcb[4] = { correctionConservativeARcb - correctionConservativeARcbUnc, correctionConservativeARcb + correctionConservativeARcbUnc,
1215 correctionConservativeBRcb - correctionConservativeBRcbUnc, correctionConservativeBRcb + correctionConservativeBRcbUnc};
1216 Double_t uncConservativeRcbMin = correctionRcb - TMath::MinElement(4,consvalRcb);
1217 Double_t uncConservativeRcbMax = TMath::MaxElement(4,consvalRcb) - correctionRcb;
1220 fnHypothesis->Fill(
fhDirectEffpt->GetBinCenter(ibin), rval, correctionRcb, correctionRcb+uncConservativeRcbMax, correctionRcb-uncConservativeRcbMin);
1228 Double_t val[4] = { correctionExtremeA + correctionExtremeAUnc, correctionExtremeA - correctionExtremeAUnc,
1229 correctionExtremeB + correctionExtremeBUnc, correctionExtremeB - correctionExtremeBUnc };
1230 Double_t uncExtremeMin = correction - TMath::MinElement(4,val);
1231 Double_t uncExtremeMax = TMath::MaxElement(4,val) - correction;
1234 fhFcMax->SetBinContent(ibin,correction+uncExtremeMax);
1235 fhFcMin->SetBinContent(ibin,correction-uncExtremeMin);
1236 Double_t consval[4] = { correctionConservativeA - correctionConservativeAUnc, correctionConservativeA + correctionConservativeAUnc,
1237 correctionConservativeB - correctionConservativeBUnc, correctionConservativeB + correctionConservativeBUnc};
1238 Double_t uncConservativeMin = correction - TMath::MinElement(4,consval);
1239 Double_t uncConservativeMax = TMath::MaxElement(4,consval) - correction;
1242 if( !(correction>0.) ){
1249 Double_t valStatEffc[2] = { correctionConservativeAUncStatEffc/correctionConservativeA,
1250 correctionConservativeBUncStatEffc/correctionConservativeB };
1251 Double_t valStatEffb[2] = { correctionConservativeAUncStatEffb/correctionConservativeA,
1252 correctionConservativeBUncStatEffb/correctionConservativeB };
1253 Double_t uncConservativeStatEffc = TMath::MaxElement(2,valStatEffc);
1254 Double_t uncConservativeStatEffb = TMath::MaxElement(2,valStatEffb);
1278 AliInfo(
" Calculating the feed-down corrected spectrum (fc method)");
1281 AliError(
" Reconstructed or fc distributions are not defined");
1285 Double_t value = 0., errvalue = 0., errvalueMax= 0., errvalueMin= 0.;
1286 Double_t valueExtremeMax= 0., valueExtremeMin= 0.;
1287 Double_t valueConservativeMax= 0., valueConservativeMin= 0.;
1304 for (Int_t ibin=1; ibin<=
fnPtBins; ibin++) {
1307 value = 0.; errvalue = 0.; errvalueMax= 0.; errvalueMin= 0.;
1308 valueExtremeMax= 0.; valueExtremeMin= 0.;
1309 valueConservativeMax= 0.; valueConservativeMin= 0.;
1314 value = (
fhRECpt->GetBinContent(ibin) &&
fhFc->GetBinContent(ibin)) ?
1315 fhRECpt->GetBinContent(ibin) *
fhFc->GetBinContent(ibin) : 0. ;
1316 value /=
fhRECpt->GetBinWidth(ibin) ;
1320 errvalue = (value!=0. &&
fhRECpt->GetBinContent(ibin) &&
fhRECpt->GetBinContent(ibin)!=0.) ?
1321 value * (
fhRECpt->GetBinError(ibin)/
fhRECpt->GetBinContent(ibin)) : 0. ;
1328 if (
fhRECpt->GetBinContent(ibin) &&
fhRECpt->GetBinContent(ibin)!=0.) {
1337 else { errvalueMax = 0.; errvalueMin = 0.; }
1340 valueExtremeMax =
fhRECpt->GetBinContent(ibin) * (
fhFc->GetBinContent(ibin) +
fgFcExtreme->GetErrorYhigh(ibin) ) /
fhRECpt->GetBinWidth(ibin) ;
1341 valueExtremeMin =
fhRECpt->GetBinContent(ibin) * (
fhFc->GetBinContent(ibin) -
fgFcExtreme->GetErrorYlow(ibin) ) /
fhRECpt->GetBinWidth(ibin) ;
1350 else { errvalueMax = 0.; errvalueMin = 0.; }
1362 for (Float_t rval=0.0025; rval<4.0; rval+=0.005){
1364 Double_t fcRcbvalue =
fhFcRcb->GetBinContent(ibin,rbin);
1366 Double_t Rcbvalue = (
fhRECpt->GetBinContent(ibin) && fcRcbvalue) ?
1367 fhRECpt->GetBinContent(ibin) * fcRcbvalue : 0. ;
1368 Rcbvalue /=
fhRECpt->GetBinWidth(ibin) ;
1374 Double_t center =
fhYieldCorr->GetBinCenter(ibin);
1404 AliInfo(
"Calculating the feed-down correction factor and spectrum (Nb method)");
1406 Double_t value = 0., errvalue = 0., errvalueMax = 0., errvalueMin = 0., kfactor = 0.;
1407 Double_t errvalueExtremeMax = 0., errvalueExtremeMin = 0.;
1414 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.);
1415 fhYieldCorrRcb =
new TH2D(
"fhYieldCorrRcb",
"corrected yield (by Nb) vs Rb Eloss hypothesis; p_{T} [GeV/c] ; Rb Eloss hypothesis ; corrected yield",
fnPtBins,
fPtBinLimits,800,0.,4.);
1416 fnHypothesis =
new TNtuple(
"fnHypothesis",
" Feed-down correction vs hypothesis (Nb)",
"pt:Rb:fc:fcMax:fcMin");
1425 AliInfo(
" Beware the conservative & extreme uncertainties are equal by definition !");
1429 double correction=0, correctionMax=0., correctionMin=0.;
1433 Double_t correctionUncStatEffc=0.;
1434 Double_t correctionUncStatEffb=0.;
1440 for (Int_t ibin=1; ibin<=
fnPtBins; ibin++) {
1447 Double_t frac = 1.0, errfrac =0.;
1450 value = 0.; errvalue = 0.; errvalueMax = 0.; errvalueMin = 0.; kfactor = 0.;
1451 errvalueExtremeMax = 0.; errvalueExtremeMin = 0.;
1452 correction=0; correctionMax=0.; correctionMin=0.;
1453 correctionUncStatEffc=0.; correctionUncStatEffb=0.;
1458 errfrac = frac * TMath::Sqrt( (
fTab[1]/
fTab[0])*(
fTab[1]/
fTab[0]) + (1/fNevts) );
1463 printf(
"Tab=%e events=%d frac=%f\n",
fTab[0],(Int_t)
fNevts,frac);
1464 value = (
fhRECpt->GetBinContent(ibin)>0. &&
fhRECpt->GetBinContent(ibin)!=0. &&
1468 printf(
"%d raw=%f after=%f \n",ibin,
fhRECpt->GetBinContent(ibin),value);
1469 value /=
fhRECpt->GetBinWidth(ibin);
1470 if (value<0.) value =0.;
1473 errvalue = (value!=0. &&
fhRECpt->GetBinError(ibin) &&
fhRECpt->GetBinError(ibin)!=0.) ?
1474 fhRECpt->GetBinError(ibin) : 0.;
1475 errvalue /=
fhRECpt->GetBinWidth(ibin);
1480 correction = (value>0.) ?
1482 if (correction<0.) correction = 0.;
1503 else { errvalueMax = 0.; errvalueMin = 0.; }
1507 Double_t errCom = ( (kfactor*errfrac/frac)*(kfactor*errfrac/frac) ) +
1511 errvalueExtremeMin = TMath::Sqrt( errCom + ( (kfactor*nbDmax/nb)*(kfactor*nbDmax/nb) ) ) /
fhRECpt->GetBinWidth(ibin);
1513 errvalueExtremeMax = TMath::Sqrt( errCom + ( (kfactor*nbDmin/nb)*(kfactor*nbDmin/nb) ) ) /
fhRECpt->GetBinWidth(ibin);
1517 correctionMin = TMath::Sqrt( errCom + ( (kfactor*nbDmax/nb)*(kfactor*nbDmax/nb) ) ) /
fhRECpt->GetBinContent(ibin) ;
1519 correctionMax = TMath::Sqrt( errCom + ( (kfactor*nbDmin/nb)*(kfactor*nbDmin/nb) ) ) /
fhRECpt->GetBinContent(ibin) ;
1522 ) /
fhRECpt->GetBinContent(ibin) ;
1523 correctionUncStatEffc = 0.;
1526 errvalueExtremeMax = TMath::Sqrt( ( (kfactor*errfrac/frac)*(kfactor*errfrac/frac) ) +
1530 ) /
fhRECpt->GetBinWidth(ibin);
1531 errvalueExtremeMin = errvalueExtremeMax ;
1544 for (Float_t rval=0.0025; rval<4.0; rval+=0.005){
1548 if(fcRcbvalue<1.e-16) fcRcbvalue=0.;
1551 Double_t Rcbvalue = (
fhRECpt->GetBinContent(ibin) && fcRcbvalue) ?
1552 fhRECpt->GetBinContent(ibin) * fcRcbvalue : 0. ;
1553 Rcbvalue /=
fhRECpt->GetBinWidth(ibin) ;
1560 Double_t correctionMaxRcb = correctionMax*rval;
1561 Double_t correctionMinRcb = correctionMin*rval;
1562 fnHypothesis->Fill(
fhYieldCorr->GetBinCenter(ibin), rval, fcRcbvalue, fcRcbvalue + correctionMaxRcb, fcRcbvalue - correctionMinRcb);
1610 TGraphAsymmErrors *grErrFeeddown = 0;
1611 Double_t x=0., y=0., errx=0., erryl=0., erryh=0;
1614 grErrFeeddown =
new TGraphAsymmErrors(nentries);
1615 for(Int_t i=0; i<nentries; i++) {
1616 x=0.; y=0.; errx=0.; erryl=0.; erryh=0.;
1624 grErrFeeddown->SetPoint(i,x,0.);
1625 grErrFeeddown->SetPointError(i,errx,errx,erryl,erryh);
1634 Double_t errylcomb=0., erryhcomb=0;
1635 for(Int_t i=1; i<nentries; i++) {
1637 errx = grErrFeeddown->GetErrorXlow(i) ;
1638 erryl = grErrFeeddown->GetErrorYlow(i);
1639 erryh = grErrFeeddown->GetErrorYhigh(i);
1640 if (combineFeedDown) {
1647 fgSigmaCorr->SetPointError(i,errx,errx,errylcomb,erryhcomb);
1663 TCanvas *csigma =
new TCanvas(
"csigma",
"Draw the corrected cross-section & the prediction");
1664 csigma->SetFillColor(0);
1665 gPrediction->GetXaxis()->SetTitleSize(0.05);
1666 gPrediction->GetXaxis()->SetTitleOffset(0.95);
1667 gPrediction->GetYaxis()->SetTitleSize(0.05);
1668 gPrediction->GetYaxis()->SetTitleOffset(0.95);
1669 gPrediction->GetXaxis()->SetTitle(
"p_{T} [GeV]");
1670 gPrediction->GetYaxis()->SetTitle(
"BR #times #frac{d#sigma}{dp_{T}} |_{|y|<0.5} [pb/GeV]");
1671 gPrediction->SetLineColor(kGreen+2);
1672 gPrediction->SetLineWidth(3);
1673 gPrediction->SetFillColor(kGreen+1);
1674 gPrediction->Draw(
"3CA");
1683 TLegend * leg =
new TLegend(0.7,0.75,0.87,0.5);
1684 leg->SetBorderSize(0);
1685 leg->SetLineColor(0);
1686 leg->SetFillColor(0);
1687 leg->SetTextFont(42);
1688 leg->AddEntry(gPrediction,
"FONLL ",
"fl");
1689 leg->AddEntry(
fhSigmaCorr,
"data stat. unc.",
"pl");
1705 Bool_t areconsistent=kTRUE;
1707 if (!areconsistent) {
1708 AliInfo(
"the histograms to reweight are not consistent (bin width, bounds)");
1713 TH1D *hReweighted = (TH1D*)hToReweight->Clone(
"hReweighted");
1714 hReweighted->Reset();
1715 Double_t weight=1.0;
1716 Double_t yvalue=1.0;
1717 Double_t integralRef = hReference->Integral();
1718 Double_t integralH = hToReweight->Integral();
1724 for (Int_t i=0; i<=hToReweight->GetNbinsX(); i++) {
1725 weight = (hReference->GetBinContent(i)/integralRef) / (hToReweight->GetBinContent(i)/integralH) ;
1726 yvalue = hToReweight->GetBinContent(i);
1727 hReweighted->SetBinContent(i,yvalue*weight);
1730 return (TH1D*)hReweighted;
1742 Bool_t areconsistent=kTRUE;
1745 if (!areconsistent) {
1746 AliInfo(
"the histograms to reweight are not consistent (bin width, bounds)");
1751 TH1D *hReweighted = (TH1D*)hMCToReweight->Clone(
"hReweighted");
1752 hReweighted->Reset();
1753 TH1D *hRecReweighted = (TH1D*)hRecToReweight->Clone(
"hRecReweighted");
1754 hRecReweighted->Reset();
1755 Double_t weight=1.0;
1756 Double_t yvalue=1.0, yrecvalue=1.0;
1757 Double_t integralRef = hMCReference->Integral();
1758 Double_t integralH = hMCToReweight->Integral();
1765 for (Int_t i=0; i<=hMCToReweight->GetNbinsX(); i++) {
1766 weight = (hMCReference->GetBinContent(i)/integralRef) / (hMCToReweight->GetBinContent(i)/integralH) ;
1767 yvalue = hMCToReweight->GetBinContent(i);
1768 hReweighted->SetBinContent(i,yvalue*weight);
1769 yrecvalue = hRecToReweight->GetBinContent(i);
1770 hRecReweighted->SetBinContent(i,yrecvalue*weight);
1773 return (TH1D*)hRecReweighted;
1784 Int_t
nbins = histo->GetNbinsY();
1786 for (
int j=0; j<=
nbins; j++) {
1787 Float_t value = histo->GetYaxis()->GetBinCenter(j);
1788 Float_t width = histo->GetYaxis()->GetBinWidth(j);
1790 if( TMath::Abs(yvalue-value)<= width ) {
1804 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.
ClassImp(AliAnalysisTaskTriggerRates) AliAnalysisTaskTriggerRates
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.
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.
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
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.
TH1D * fhFeedDownMCptMin
Input MC maximum b–>D spectra.
void ComputeSystUncertainties(AliHFSystErr *systematics, Bool_t combineFeedDown)
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)
TH1D * fhStatUncEffcSigma
TH1D * fhSigmaCorr
Conservative corrected yield as TGraphAsymmErrors (syst from feed-down)
Double_t fTab[2]
uncertainties on the efficiency [0]=c, b, [1]=b/c
TGraphAsymmErrors * fgSigmaCorr
Corrected cross-section (stat unc. only) vs the Ratio(c/b eloss)
AliHFPtSpectrum & operator=(const AliHFPtSpectrum &source)
Assignment operator.
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
Tab parameter and its uncertainty.
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