51 Bool_t rejectIfNotFromQuark=kTRUE,
53 Bool_t isKeepDfromB = kFALSE,
Bool_t isKeepDfromBOnly = kFALSE,
57 TString usercomment =
"username",
59 Bool_t useFlatPtWeight = kFALSE,
60 Bool_t useZWeight = kFALSE,
61 Bool_t useNchWeight = kFALSE,
62 Bool_t useNtrkWeight = kFALSE,
68 Bool_t isFineNtrkBin = kFALSE)
71 if ( (isPPData && isPPbData) ||
72 (!isPPData && !isPPbData) ) {
73 printf(
"You have to choose the data kind; bad choise isPPData=%d isPPbData=%d\n",isPPData,isPPbData);
77 printf(
"Adding CF task using cuts from file %s\n",cutFile);
79 printf(
"The configuration is set to be SLOW --> all the variables will be used to fill the CF\n");
82 printf(
"The configuration is set to be FAST --> using only pt, y, ct, phi, zvtx, centrality, fake, multiplicity to fill the CF\n");
85 printf(
"The configuration is set to be FAST --> using only pt, y, centrality, multiplicity to fill the CF\n");
88 printf(
"The configuration is not defined! returning\n");
99 if (isSign == 0 && pdgCode < 0){
100 AliError(Form(
"Error setting PDG code (%d) and sign (0 --> Lc+ only): they are not compatible, returning",pdgCode));
103 else if (isSign == 1 && pdgCode > 0){
104 AliError(Form(
"Error setting PDG code (%d) and sign (1 --> Lc- only): they are not compatible, returning",pdgCode));
107 else if (isSign > 2 || isSign < 0){
108 AliError(Form(
"Sign not valid (%d, possible values are 0, 1, 2), returning",isSign));
112 TFile* fileCuts = TFile::Open(cutFile);
117 if (isKeepDfromBOnly) isKeepDfromB =
true;
121 if (lcToV0bachelorDecayMode==0) {
124 }
else if (lcToV0bachelorDecayMode==1) {
130 const Double_t phimax = 2.*TMath::Pi();
132 const Double_t phiV0max = 2.*TMath::Pi();
134 const Int_t nbinZvtx = 30;
135 const Int_t nbincent =19+1;
136 const Int_t nbinfake = 3;
138 const Int_t nbinmult = 49;
139 const Int_t nbinmult_0_20 = 20;
140 const Int_t nbinmult_20_50 = 15;
141 const Int_t nbinmult_50_80 = 10;
142 const Int_t nbinmult_80_100 = 4;
143 const Int_t nbinmult_100_400 = 3;
144 if(isPPbData) nbinmult += nbinmult_100_400;
147 const Int_t nbiny = 24;
148 const Int_t nbinphi = 18;
149 const Int_t nbinonFly = 2;
151 const Int_t nbinpBach = 300;
152 const Int_t nbinptV0 = 300;
153 const Int_t nbinyV0 = 24;
154 const Int_t nbinphiV0 = 18;
155 const Int_t nbindcaV0 = 150;
156 const Int_t nbininvMassV0 = 60;
157 const Int_t nbinpointingV0 = 42;
158 const Int_t nbinpointing = 42;
179 const UInt_t iinvMassV0= 12;
181 const UInt_t icosPAxV0 = 14;
191 const Int_t nvarTot = 16 ;
201 iBin[ionFly]=nbinonFly;
202 iBin[iZvtx]=nbinZvtx;
203 iBin[icent]=nbincent;
204 iBin[ifake]=nbinfake;
208 Int_t nbinmultTmp = nbinmult;
210 Int_t nbinLimmultFine = 100;
211 if (isPPbData) nbinLimmultFine = 200;
212 const UInt_t nbinMultFine = nbinLimmultFine;
213 binLimmultFine =
new Double_t[nbinMultFine+1];
214 for (
Int_t ibin0 = 0; ibin0 < nbinMultFine+1; ibin0++) {
215 binLimmultFine[ibin0] = ibin0;
217 nbinmultTmp = nbinLimmultFine;
219 const Int_t nbinmultTot = nbinmultTmp;
220 iBin[imult] = nbinmultTot;
223 iBin[ipbach]=nbinpBach;
224 iBin[ipTV0]=nbinptV0;
226 iBin[iphiV0]=nbinphiV0;
227 iBin[iinvMassV0]=nbininvMassV0;
228 iBin[idcaV0]=nbindcaV0;
229 iBin[icosPAxV0]=nbinpointingV0;
230 iBin[icosPA]=nbinpointing;
239 for (
Int_t ibinpT = 0 ; ibinpT<iBin[ipT]+1; ibinpT++){
240 binLimpT[ibinpT] = (
Double_t)floatbinLimpT[ibinpT];
241 printf(
"binLimpT[%d]=%f\n",ibinpT,binLimpT[ibinpT]);
274 Error(
"AliCFHeavyFlavourTaskMultiVarMultiStep",
"Calculated bin lim for mult - 1st range - differs from expected!\n");
277 if (binLimmult[nbinmult_0_20+nbinmult_20_50] !=
multmin_50_80) {
278 Error(
"AliCFHeavyFlavourTaskMultiVarMultiStep",
"Calculated bin lim for mult - 2nd range - differs from expected!\n");
281 if (binLimmult[nbinmult_0_20+nbinmult_20_50+nbinmult_50_80] !=
multmin_80_100) {
282 Error(
"AliCFHeavyFlavourTaskMultiVarMultiStep",
"Calculated bin lim for mult - 3rd range - differs from expected!\n");
285 if (binLimmult[nbinmult_0_20+nbinmult_20_50+nbinmult_50_80+nbinmult_80_100] !=
multmin_100_400) {
286 Error(
"AliCFHeavyFlavourTaskMultiVarMultiStep",
"Calculated bin lim for mult - 4th range - differs from expected!\n");
307 for(
Int_t i=0; i<=iBin[iphiV0]; i++) binLimphiV0[i]=(
Double_t)phiV0min + (phiV0max-phiV0min)/iBin[iphiV0]*(
Double_t)i ;
311 for(
Int_t i=0; i<=iBin[iinvMassV0]; i++) binLimInvMassV0[i]=(
Double_t)massV0min + (massV0max-massV0min)/iBin[iinvMassV0]*(
Double_t)i ;
339 nameContainer=
"CFHFccontainer0_CommonFramework_"+usercomment;
341 else if (isKeepDfromBOnly) {
342 nameContainer=
"CFHFccontainer0LcfromB_CommonFramework_"+usercomment;
345 nameContainer=
"CFHFccontainer0allLc_CommonFramework_"+usercomment;
351 Info(
"AliCFTaskVertexingHF",
"SETUP CONTAINER");
354 AliCFContainer* container;
356 container =
new AliCFContainer(nameContainer,
"container for tracks",nstep,nvarTot,iBin);
358 container -> SetBinLimits(ipT,binLimpT);
359 container -> SetBinLimits(iy,binLimy);
360 container -> SetBinLimits(iphi,binLimphi);
361 container -> SetBinLimits(ionFly,binLimonFlyV0);
362 container -> SetBinLimits(iZvtx,binLimzvtx);
363 container -> SetBinLimits(icent,binLimcent);
364 container -> SetBinLimits(ifake,binLimfake);
365 if (isFineNtrkBin) container->SetBinLimits(imult, binLimmultFine);
366 else container->SetBinLimits(imult, binLimmult);
368 container -> SetVarTitle(ipT,
"p_{T}(#Lambda_{c}) [GeV/c]");
369 container -> SetVarTitle(iy,
"y(#Lambda_{c})");
370 container -> SetVarTitle(iphi,
"#phi(#Lambda_{c}) [rad]");
371 container -> SetVarTitle(ionFly,
"onTheFlyStatusV0");
372 container -> SetVarTitle(iZvtx,
"z_{vtx} [cm]");
373 container -> SetVarTitle(icent,
"centrality");
374 container -> SetVarTitle(ifake,
"fake");
375 container -> SetVarTitle(imult,
"multiplicity");
377 container -> SetBinLimits(ipbach,binLimpbach);
378 container -> SetBinLimits(ipTV0,binLimpTV0);
379 container -> SetBinLimits(iyV0,binLimyV0);
380 container -> SetBinLimits(iphiV0,binLimphiV0);
381 container -> SetBinLimits(iinvMassV0,binLimInvMassV0);
382 container -> SetBinLimits(idcaV0,binLimdcaV0);
383 container -> SetBinLimits(icosPAxV0,binLimcosPAV0);
384 container -> SetBinLimits(icosPA,binLimcosPA);
388 container -> SetVarTitle(ipbach,
"p(bachelor) [GeV/c]");
389 container -> SetVarTitle(ipTV0,
"p_{T}(V0) [GeV/c]");
390 container -> SetVarTitle(iyV0,
"y(V0)");
391 container -> SetVarTitle(iphiV0,
"#varphi(V0) [rad]");
392 container -> SetVarTitle(iinvMassV0,
"m_{inv}(#pi^{+},#pi^{-}) [GeV/c^{2}]");
393 container -> SetVarTitle(idcaV0,
"DCA(V0) [n#sigma]");
394 container -> SetVarTitle(icosPAxV0,
"cosine pointing angle(V0)");
395 container -> SetVarTitle(icosPA,
"cosine pointing angle (#Lambda_{c})");
400 container =
new AliCFContainer(nameContainer,
"container for tracks",nstep,8,iBin);
402 container -> SetBinLimits(ipT,binLimpT);
403 container -> SetBinLimits(iy,binLimy);
404 container -> SetBinLimits(iphi,binLimphi);
405 container -> SetBinLimits(ionFly,binLimonFlyV0);
406 container -> SetBinLimits(iZvtx,binLimzvtx);
407 container -> SetBinLimits(icent,binLimcent);
408 container -> SetBinLimits(ifake,binLimfake);
409 if (isFineNtrkBin) container->SetBinLimits(imult, binLimmultFine);
410 else container->SetBinLimits(imult, binLimmult);
412 container -> SetVarTitle(ipT,
"p_{T}(#Lambda_{c}) [GeV/c]");
413 container -> SetVarTitle(iy,
"y(#Lambda_{c})");
414 container -> SetVarTitle(iphi,
"#phi(#Lambda_{c}) [rad]");
415 container -> SetVarTitle(ionFly,
"onTheFlyStatusV0");
416 container -> SetVarTitle(iZvtx,
"z_{vtx} [cm]");
417 container -> SetVarTitle(icent,
"centrality");
418 container -> SetVarTitle(ifake,
"fake");
419 container -> SetVarTitle(imult,
"multiplicity");
422 Int_t iBinSuperFast[4];
423 const UInt_t ipTSuperFast = 0;
424 const UInt_t iySuperFast = 1;
425 const UInt_t icentSuperFast = 2;
426 const UInt_t imultSuperFast = 3;
427 iBinSuperFast[ipTSuperFast]=iBin[ipT];
428 iBinSuperFast[iySuperFast]=iBin[iy];
429 iBinSuperFast[icentSuperFast]=iBin[icent];
430 iBinSuperFast[imultSuperFast]=iBin[imult];
431 container =
new AliCFContainer(nameContainer,
"container for tracks",nstep,4,iBinSuperFast);
433 container -> SetBinLimits(ipTSuperFast,binLimpT);
434 container -> SetBinLimits(iySuperFast,binLimy);
435 container -> SetBinLimits(icentSuperFast,binLimcent);
436 if (isFineNtrkBin) container->SetBinLimits(imultSuperFast, binLimmultFine);
437 else container->SetBinLimits(imultSuperFast, binLimmult);
439 container -> SetVarTitle(ipTSuperFast,
"p_{T}(#Lambda_{c}) [GeV/c]");
440 container -> SetVarTitle(iySuperFast,
"y(#Lambda_{c})");
441 container -> SetVarTitle(icentSuperFast,
"centrality");
442 container -> SetVarTitle(imultSuperFast,
"multiplicity");
445 container -> SetStepTitle(0,
"MCLimAcc");
446 container -> SetStepTitle(1,
"MC");
447 container -> SetStepTitle(2,
"MCAcc");
448 container -> SetStepTitle(3,
"RecoVertex");
449 container -> SetStepTitle(4,
"RecoRefit");
450 container -> SetStepTitle(5,
"Reco");
451 container -> SetStepTitle(6,
"RecoAcc");
452 container -> SetStepTitle(7,
"RecoITSCluster");
453 container -> SetStepTitle(8,
"RecoCuts");
454 container -> SetStepTitle(9,
"RecoPID");
461 AliCFTrackKineCuts *mcKineCuts =
new AliCFTrackKineCuts(
"mcKineCuts",
"MC-level kinematic cuts");
464 AliCFParticleGenCuts* mcGenCuts =
new AliCFParticleGenCuts(
"mcGenCuts",
"MC particle generation cuts");
465 Bool_t useAbsolute = kTRUE;
467 useAbsolute = kFALSE;
469 mcGenCuts->SetRequirePdgCode(pdgCode, useAbsolute);
470 mcGenCuts->SetAODMC(1);
473 AliCFAcceptanceCuts* accCuts =
new AliCFAcceptanceCuts(
"accCuts",
"Acceptance cuts");
474 AliCFTrackKineCuts * kineAccCuts =
new AliCFTrackKineCuts(
"kineAccCuts",
"Kine-Acceptance cuts");
479 AliCFTrackKineCuts *recKineCuts =
new AliCFTrackKineCuts(
"recKineCuts",
"rec-level kine cuts");
481 AliCFTrackQualityCuts *recQualityCuts =
new AliCFTrackQualityCuts(
"recQualityCuts",
"rec-level quality cuts");
483 AliCFTrackIsPrimaryCuts *recIsPrimaryCuts =
new AliCFTrackIsPrimaryCuts(
"recIsPrimaryCuts",
"rec-level isPrimary cuts");
485 printf(
"CREATE MC KINE CUTS\n");
487 mcList->AddLast(mcKineCuts);
488 mcList->AddLast(mcGenCuts);
490 printf(
"CREATE ACCEPTANCE CUTS\n");
492 accList->AddLast(kineAccCuts);
494 printf(
"CREATE RECONSTRUCTION CUTS\n");
496 recList->AddLast(recKineCuts);
497 recList->AddLast(recQualityCuts);
498 recList->AddLast(recIsPrimaryCuts);
503 printf(
"CREATE INTERFACE AND CUTS\n");
504 AliCFManager* man =
new AliCFManager() ;
505 man->SetParticleContainer(container);
506 man->SetParticleCutsList(0 , mcList);
507 man->SetParticleCutsList(1 , mcList);
508 man->SetParticleCutsList(2 , accList);
509 man->SetParticleCutsList(3 , emptyList);
510 man->SetParticleCutsList(4 , emptyList);
511 man->SetParticleCutsList(5 , emptyList);
512 man->SetParticleCutsList(6 , emptyList);
513 man->SetParticleCutsList(7 , emptyList);
514 man->SetParticleCutsList(8 , emptyList);
515 man->SetParticleCutsList(9 , emptyList);
521 ::Error(
"AddTaskCompareHF",
"No analysis manager to connect to.");
525 printf(
"CREATE TASK\n");
533 switch (lcToV0bachelorDecayMode) {
551 if (isKeepDfromB && !isKeepDfromBOnly) task->
SetDselection(2);
552 if (isKeepDfromB && isKeepDfromBOnly) task->
SetDselection(1);
554 TF1* funcWeight = 0x0;
556 funcWeight = (TF1*)fileCuts->Get(
"funcWeight");
557 if (funcWeight == 0x0){
558 Printf(
"FONLL Weights will be used");
562 Printf(
"User-defined Weights will be used. The function being:");
567 if (useNchWeight || useNtrkWeight){
570 if (isPPbData) hNchPrimaries = (TH1F*)fileCuts->Get(
"hNtrUnCorrEvWithCandWeight");
571 else hNchPrimaries = (TH1F*)fileCuts->Get(
"hGenPrimaryParticlesInelGt0");
572 hNchMeasured = (TH1F*)fileCuts->Get(
"hNchMeasured");
578 AliFatal(
"Histogram for multiplicity weights not found");
586 if(estimatorFilename.EqualTo(
"") ) {
587 printf(
"Estimator file not provided, multiplicity corrected histograms will not be filled\n");
590 TFile* fileEstimator=TFile::Open(estimatorFilename.Data());
592 AliFatal(
"File with multiplicity estimator not found");
603 const Char_t* periodNames[2] = {
"LHC13b",
"LHC13c"};
604 TProfile *multEstimatorAvg[2];
605 for (
Int_t ip=0; ip < 2; ip++) {
606 multEstimatorAvg[ip] = (TProfile*)(fileEstimator->Get(Form(
"SPDmult10_%s",periodNames[ip]))->Clone(Form(
"SPDmult10_%s_clone",periodNames[ip])));
607 if (!multEstimatorAvg[ip]) {
608 AliFatal(Form(
"Multiplicity estimator for %s not found! Please check your estimator file",periodNames[ip]));
616 const Char_t* periodNames[4] = {
"LHC10b",
"LHC10c",
"LHC10d",
"LHC10e"};
617 TProfile* multEstimatorAvg[4];
619 for(
Int_t ip=0; ip<4; ip++) {
620 multEstimatorAvg[ip] = (TProfile*)(fileEstimator->Get(Form(
"SPDmult10_%s",periodNames[ip]))->Clone(Form(
"SPDmult10_%s_clone",periodNames[ip])));
621 if (!multEstimatorAvg[ip]) {
622 AliFatal(Form(
"Multiplicity estimator for %s not found! Please check your estimator file",periodNames[ip]));
634 Printf(
"***************** CONTAINER SETTINGS *****************");
640 if(funcWeight) Printf(
"User-defined Weight function");
641 else Printf(
"FONLL will be used for the weights");
648 Printf(
"***************END CONTAINER SETTINGS *****************\n");
654 Bool_t AcceptanceUnf = kTRUE;
661 thnDim[0] = iBin[ipT];
662 thnDim[2] = iBin[ipT];
663 thnDim[1] = iBin[iy];
664 thnDim[3] = iBin[iy];
668 nameCorr=
"CFHFcorr0_CommonFramework_"+usercomment;
670 else if (isKeepDfromBOnly) {
671 nameCorr=
"CFHFcorr0KeepDfromBOnly_CommonFramework_"+usercomment;
674 nameCorr=
"CFHFcorr0allLc_CommonFramework_"+usercomment;
677 THnSparseD* correlation =
new THnSparseD(nameCorr,
"THnSparse with correlations",4,thnDim);
682 binEdges[0]= binLimpT;
683 binEdges[1]= binLimy;
685 correlation->SetBinEdges(0,binEdges[0]);
686 correlation->SetBinEdges(2,binEdges[0]);
688 correlation->SetBinEdges(1,binEdges[1]);
689 correlation->SetBinEdges(3,binEdges[1]);
691 correlation->Sumw2();
701 AliAnalysisDataContainer *cinput0 = mgr->GetCommonInputContainer();
705 TString outputfile = AliAnalysisManager::GetCommonFileName();
706 TString output1name=
"", output2name=
"", output3name=
"",output4name=
"";
707 output2name=nameContainer;
708 output3name=nameCorr;
710 outputfile +=
":PWG3_D2H_CFtaskLctoK0Sp_CommonFramework_"+usercomment;
711 output1name=
"CFHFchist0_CommonFramework_"+usercomment;
712 output4name=
"Cuts_CommonFramework_"+usercomment;
714 else if (isKeepDfromBOnly) {
715 outputfile +=
":PWG3_D2H_CFtaskLctoK0SpKeepDfromBOnly_CommonFramework_"+usercomment;
716 output1name=
"CFHFchist0DfromB_CommonFramework_"+usercomment;
717 output4name=
"Cuts_CommonFramework_DfromB_"+usercomment;
720 outputfile +=
":PWG3_D2H_CFtaskLctoK0SpKeepDfromB_CommonFramework_"+usercomment;
721 output1name=
"CFHFchist0allLc_CommonFramework_"+usercomment;
722 output4name=
"Cuts_CommonFramework_allLc_"+usercomment;
727 AliAnalysisDataContainer *coutput1 = mgr->CreateContainer(output1name, TH1I::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
729 AliAnalysisDataContainer *coutput2 = mgr->CreateContainer(output2name, AliCFContainer::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
731 AliAnalysisDataContainer *coutput3 = mgr->CreateContainer(output3name, THnSparseD::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
733 AliAnalysisDataContainer *coutput4 = mgr->CreateContainer(output4name, AliRDHFCuts::Class(),AliAnalysisManager::kOutputContainer, outputfile.Data());
737 mgr->ConnectInput(task,0,mgr->GetCommonInputContainer());
738 mgr->ConnectOutput(task,1,coutput1);
739 mgr->ConnectOutput(task,2,coutput2);
740 mgr->ConnectOutput(task,3,coutput3);
741 mgr->ConnectOutput(task,4,coutput4);
Bool_t GetCentralitySelection()
const Double_t cosPAV0min
void SetWeightFunction(TF1 *func)
const Float_t multmax_20_50
void SetRejectCandidateIfNotFromQuark(Bool_t opt)
void SetMultiplVsZProfileLHC10e(TProfile *hprof)
void SetCFManager(AliCFManager *io)
CORRECTION FRAMEWORK RELATED FUNCTIONS.
void SetDecayChannel(Int_t decayChannel)
Bool_t GetRejectCandidateIfNotFromQuark()
void SetFillFromGenerated(Bool_t flag)
get corr manager
void SetUseNchTrackletsWeight(Bool_t useWeight=kTRUE)
void SetUseMCVertex(Bool_t opt)
void SetMCNchHisto(TH1F *h)
const Float_t multmin_0_20
AliCFTaskVertexingHF * AddTaskCFVertexingHFLctoV0bachelor(const char *cutFile="./LctoV0bachelorCuts.root", Bool_t rejectIfNotFromQuark=kTRUE, Bool_t isKeepDfromB=kFALSE, Bool_t isKeepDfromBOnly=kFALSE, Int_t configuration=AliCFTaskVertexingHF::kCheetah, Int_t pdgCode=4122, Char_t isSign=2, Char_t lcToV0bachelorDecayMode=0, TString usercomment="username", Bool_t useWeight=kFALSE, Bool_t useFlatPtWeight=kFALSE, Bool_t useZWeight=kFALSE, Bool_t useNchWeight=kFALSE, Bool_t useNtrkWeight=kFALSE, TString estimatorFilename="", Int_t multiplicityEstimator=AliCFTaskVertexingHF::kNtrk10, Bool_t isPPData=kTRUE, Bool_t isPPbData=kFALSE, Double_t refMult=9.26, Bool_t isFineNtrkBin=kFALSE)
const Float_t multmin_50_80
void SetMeasuredNchHisto(TH1F *h)
void SetIsPPData(Bool_t flag)
const Float_t multmax_50_80
void SetIsPPbData(Bool_t flag)
void SetCentralitySelection(Bool_t centSelec=kTRUE)
const Float_t multmin_80_100
const Float_t multmax_80_100
void SetReferenceMultiplcity(Double_t rmu)
void SetUseWeight(Bool_t useWeight)
void SetUseZvtxCorrectedNtrkEstimator(Bool_t flag)
const Float_t multmin_20_50
void SetConfiguration(Int_t configuration)
void SetDselection(UShort_t originDselection)
void SetCountLctoLambdapi()
Float_t * GetPtBinLimits() const
const Float_t multmax_100_400
const Float_t multmax_0_20
TF1 * GetWeightFunction() const
void SetUseNchWeight(Bool_t useWeight)
void SetUseFlatPtWeight(Bool_t useWeight)
void SetCorrelationMatrix(THnSparse *h)
UNFOLDING.
void SetMultiplVsZProfileLHC10b(TProfile *hprof)
void SetMultiplVsZProfileLHC10d(TProfile *hprof)
void SetSign(Char_t isSign)
Bool_t GetUseWeight() const
const Double_t cosPAV0max
void SetMultiplicityEstimator(Int_t value)
slow configuration, all variables
void SetMultiplVsZProfileLHC13b(TProfile *hprof)
Bool_t GetFillFromGenerated() const
void SetMultiplVsZProfileLHC13c(TProfile *hprof)
void SetFakeSelection(Int_t fakeSel=0)
void SetUseZWeight(Bool_t useWeight)
fast configuration, only a subset of variables
void SetMultiplVsZProfileLHC10c(TProfile *hprof)
const Float_t multmin_100_400