28 #include "AliAODMCParticle.h" 29 #include "AliAODEvent.h" 30 #include "TClonesArray.h" 32 #include "AliESDtrack.h" 33 #include "TDatabasePDG.h" 36 #include "AliCFContainer.h" 47 fGenDsOption(kCountResonant),
48 fResonantDecay(resonantDecay)
127 Bool_t bSignAssoc = kFALSE;
131 AliError(
"fRecoCandidate not found, problem in assignement\n");
136 Int_t pdgDaughter[3]={-1,-1,-1};
153 AliError(
"WRONG DECAY SETTING");
158 if (mcLabel == -1)
return bSignAssoc;
173 AliDebug(3,
"No part candidate");
179 AliDebug(3,
"Ds not from the selected resonant channel");
210 Bool_t bGenValues = kFALSE;
220 AliError(
"WRONG DECAY SETTING");
241 for(
Int_t iDau=0; iDau<3; iDau++){
242 Int_t ind = labelFirstDau+iDau;
243 AliAODMCParticle* part =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(ind));
245 AliError(
"Daughter particle not found in MC array");
248 Short_t signDau=part->Charge();
251 daughter[index] = ind;
259 for(
Int_t iDau=0; iDau<2; iDau++){
260 Int_t ind = labelFirstDau+iDau;
261 AliAODMCParticle* part =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(ind));
263 AliError(
"Daughter particle not found in MC array");
266 Int_t pdgCode=TMath::Abs(part->GetPdgCode());
267 if(pdgCode==211 || pdgCode==321 || pdgCode==2212){
268 Short_t signDau=part->Charge();
271 daughter[index] = ind;
278 Int_t nDauRes=part->GetNDaughters();
280 AliError(
"Wrong resonant decay");
283 Int_t labelFirstDauRes = part->GetDaughter(0);
284 for(
Int_t iDauRes=0; iDauRes<2; iDauRes++){
285 Int_t indDR = labelFirstDauRes+iDauRes;
286 AliAODMCParticle* partDR =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(indDR));
288 AliError(
"Daughter particle not found in MC array");
291 Short_t signDau=partDR->Charge();
294 daughter[index] = ind;
304 AliError(Form(
"Wrong number of daughters %d",nDau));
308 if(nDauLS!=2 || nDauOS!=1){
309 AliError(Form(
"Wrong decay channel: LS and OS daughters not OK: %d %d",nDauLS,nDauOS));
312 if(daughter[0]>daughter[2]){
313 Int_t tmp=daughter[0];
314 daughter[0]=daughter[2];
321 for(
Int_t iDau=0; iDau<3; iDau++){
322 AliAODMCParticle* part=
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(daughter[iDau]));
324 AliError(
"Daughter particle not found in MC array");
331 if(iDau==0) part->XvYvZv(vertDec);
339 Int_t localmult = -1;
349 vectorMC[3] = cT*1.E4 ;
375 vectorMC[2] = cT*1.E4;
393 vectorMC[4] = localmult;
407 Bool_t bFillRecoValues=kFALSE;
419 AliError(
"WRONG DECAY SETTING");
420 return bFillRecoValues;
436 Int_t daughtSorted[3];
440 for(
Int_t iDau=0; iDau<3; iDau++){
441 AliAODTrack *trk = (AliAODTrack*)decay3->GetDaughter(iDau);
442 Short_t chargedau=trk->Charge();
443 if(chargedau==charge){
444 daughtSorted[tmpIndex]=iDau;
448 daughtSorted[1]=iDau;
453 if(nDauLS!=2 || nDauOS!=1){
454 AliError(
"Wrong decay channel: number of OS and LS tracks not OK");
455 return bFillRecoValues;
458 if(daughtSorted[0]>daughtSorted[2]){
459 Int_t tmp=daughtSorted[0];
460 daughtSorted[0]=daughtSorted[2];
465 Int_t localmult = -1;
475 vectorReco[3] = cT*1.E4;
476 vectorReco[4] = cosPointingAngle;
477 vectorReco[5] = decay3->PtProng(daughtSorted[0]);
478 vectorReco[6] = decay3->PtProng(daughtSorted[1]);
479 vectorReco[7] = decay3->PtProng(daughtSorted[2]);
482 vectorReco[10] =
fFake;
483 vectorReco[11] = cosPointingAngleXY;
484 vectorReco[12] = normDecayLengthXY;
488 Double_t d0prong0 = decay3->Getd0Prong(daughtSorted[0]);
489 Double_t d0prong1 = decay3->Getd0Prong(daughtSorted[1]);
490 Double_t d0prong2 = decay3->Getd0Prong(daughtSorted[2]);
491 Double_t sumd02 =(d0prong0*d0prong0 + d0prong1*d0prong1 + d0prong2*d0prong2);
492 vectorReco[11] = dist12*1.E4;
493 vectorReco[12] = dist23*1.E4;
494 vectorReco[13] = sigmVert*1.E4;
495 vectorReco[14] = sumd02*1.E8;
496 vectorReco[15] = cosPointingAngleXY;
497 vectorReco[16] = normDecayLengthXY;
504 vectorReco[2] = cT*1.E4;
508 vectorReco[6] =
fFake ;
522 vectorReco[4] = localmult;
527 bFillRecoValues = kTRUE;
528 return bFillRecoValues;
539 Int_t pdgDaughter[3]={-1,-1,-1};
559 AliError(
"WRONG DECAY SETTING");
576 AliDebug(3,
"Decay channel in direct KKpi, should be skipped");
579 for(
Int_t iDau=0; iDau<3; iDau++){
580 Int_t ind = labelFirstDau+iDau;
581 AliAODMCParticle* part =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(ind));
583 AliError(
"Daughter particle not found in MC array");
586 daughter[iDau]=TMath::Abs(part->GetPdgCode());
587 sumPxDau+=part->Px();
588 sumPyDau+=part->Py();
589 sumPzDau+=part->Pz();
594 for(
Int_t iDau=0; iDau<2; iDau++){
595 Int_t ind = labelFirstDau+iDau;
596 AliAODMCParticle* part =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(ind));
598 AliError(
"Daughter particle not found in MC array");
601 Int_t pdgCode=TMath::Abs(part->GetPdgCode());
602 if(pdgCode==211 || pdgCode==321 || pdgCode==2212){
603 if(nDauFound>=3)
return checkCD;
604 daughter[nDauFound]=pdgCode;
605 sumPxDau+=part->Px();
606 sumPyDau+=part->Py();
607 sumPzDau+=part->Pz();
611 Int_t pdgCodeRes=TMath::Abs(part->GetPdgCode());
615 Int_t nDauRes=part->GetNDaughters();
616 if(nDauRes!=2)
return checkCD;
617 Int_t labelFirstDauRes = part->GetDaughter(0);
618 for(
Int_t iDauRes=0; iDauRes<2; iDauRes++){
619 Int_t indDR = labelFirstDauRes+iDauRes;
620 AliAODMCParticle* partDR =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(indDR));
622 AliError(
"Daughter particle not found in MC array");
625 Int_t pdgCodeDR=TMath::Abs(partDR->GetPdgCode());
626 if(nDauFound>=3)
return checkCD;
627 daughter[nDauFound]=pdgCodeDR;
628 sumPxDau+=partDR->Px();
629 sumPyDau+=partDR->Py();
630 sumPzDau+=partDR->Pz();
638 for(
Int_t iDau1=0; iDau1<3; iDau1++){
639 for(
Int_t iDau2=iDau1; iDau2<3; iDau2++){
640 if(daughter[iDau1]<daughter[iDau2]){
641 Int_t tmp=daughter[iDau1];
642 daughter[iDau1]=daughter[iDau2];
647 for(
Int_t iDau=0; iDau<3; iDau++){
648 if(daughter[iDau]!=pdgDaughter[iDau]){
649 AliDebug(2,
"Wrong decay channel from MC, skipping!!");
657 if(TMath::Abs(pxMother-sumPxDau)/(TMath::Abs(pxMother)+1.e-13)>0.00001 ||
658 TMath::Abs(pyMother-sumPyDau)/(TMath::Abs(pyMother)+1.e-13)>0.00001 ||
659 TMath::Abs(pzMother-sumPzDau)/(TMath::Abs(pzMother)+1.e-13)>0.00001){
660 AliDebug(2,
"Momentum conservation violated, skipping!!");
671 Int_t numberOfLambdac=0;
674 if(nDaugh<2)
return kFALSE;
675 if(nDaugh>3)
return kFALSE;
677 if(!pdaugh1) {
return kFALSE;}
678 Int_t number1 = TMath::Abs(pdaugh1->GetPdgCode());
680 if(!pdaugh2) {
return kFALSE;}
681 Int_t number2 = TMath::Abs(pdaugh2->GetPdgCode());
685 AliAODMCParticle* pdaugh3 = (AliAODMCParticle*)
fmcArray->At(thirdDaugh);
686 if(!pdaugh3)
return kFALSE;
687 Int_t number3 = TMath::Abs(pdaugh3->GetPdgCode());
688 if((number1==321 && number2==211 && number3==2212) || (number1==211 && number2==321 && number3==2212) || (number1==211 && number2==2212 && number3==321) || (number1==321 && number2==2212 && number3==211) || (number1==2212 && number2==321 && number3==211) || (number1==2212 && number2==211 && number3==321)) numberOfLambdac++;
693 if((number1==2212 && number2==313)){
695 nfiglieK=pdaugh2->GetNDaughters();
696 if(nfiglieK!=2)
return kFALSE;
697 AliAODMCParticle* pdaughK1 = (AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
698 AliAODMCParticle* pdaughK2 = (AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
699 if(!pdaughK1)
return kFALSE;
700 if(!pdaughK2)
return kFALSE;
701 if((TMath::Abs(pdaughK1->GetPdgCode())==211 && TMath::Abs(pdaughK2->GetPdgCode())==321) || (TMath::Abs(pdaughK1->GetPdgCode())==321 && TMath::Abs(pdaughK2->GetPdgCode())==211)) numberOfLambdac++;
703 if((number1==313 && number2==2212)){
705 nfiglieK=pdaugh1->GetNDaughters();
706 if(nfiglieK!=2)
return kFALSE;
707 AliAODMCParticle* pdaughK1 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
708 AliAODMCParticle* pdaughK2 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
709 if(!pdaughK1)
return kFALSE;
710 if(!pdaughK2)
return kFALSE;
711 if((TMath::Abs(pdaughK1->GetPdgCode())==211 && TMath::Abs(pdaughK2->GetPdgCode())==321) || (TMath::Abs(pdaughK1->GetPdgCode())==321 && TMath::Abs(pdaughK2->GetPdgCode())==211)) numberOfLambdac++;
713 Int_t nfiglieDelta=0;
714 if(number1==321 && number2==2224){
716 nfiglieDelta=pdaugh2->GetNDaughters();
717 if(nfiglieDelta!=2)
return kFALSE;
718 AliAODMCParticle *pdaughD1=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
719 AliAODMCParticle *pdaughD2=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
720 if(!pdaughD1)
return kFALSE;
721 if(!pdaughD2)
return kFALSE;
722 if((TMath::Abs(pdaughD1->GetPdgCode())==211 && TMath::Abs(pdaughD2->GetPdgCode())==2212) || (TMath::Abs(pdaughD1->GetPdgCode())==2212 && TMath::Abs(pdaughD2->GetPdgCode())==211)) numberOfLambdac++;
724 if(number1==2224 && number2==321){
726 nfiglieDelta=pdaugh1->GetNDaughters();
727 if(nfiglieDelta!=2)
return kFALSE;
728 AliAODMCParticle* pdaughD1 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
729 AliAODMCParticle* pdaughD2 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
730 if(!pdaughD1)
return kFALSE;
731 if(!pdaughD2)
return kFALSE;
732 if((TMath::Abs(pdaughD1->GetPdgCode())==211 && TMath::Abs(pdaughD2->GetPdgCode())==2212) || (TMath::Abs(pdaughD1->GetPdgCode())==2212 && TMath::Abs(pdaughD2->GetPdgCode())==211)) numberOfLambdac++;
736 if(number1==3124 && number2==211){
738 nfiglieLa=pdaugh1->GetNDaughters();
739 if(nfiglieLa!=2)
return kFALSE;
740 AliAODMCParticle *pdaughL1=(AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
741 AliAODMCParticle *pdaughL2=(AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
742 if(!pdaughL1)
return kFALSE;
743 if(!pdaughL2)
return kFALSE;
744 if((TMath::Abs(pdaughL1->GetPdgCode())==321 && TMath::Abs(pdaughL2->GetPdgCode())==2212) || (TMath::Abs(pdaughL1->GetPdgCode())==2212 && TMath::Abs(pdaughL2->GetPdgCode())==321)) numberOfLambdac++;
746 if(number1==211 && number2==3124){
748 nfiglieLa=pdaugh2->GetNDaughters();
749 if(nfiglieLa!=2)
return kFALSE;
750 AliAODMCParticle *pdaughL1=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
751 AliAODMCParticle *pdaughL2=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
752 if(!pdaughL1)
return kFALSE;
753 if(!pdaughL2)
return kFALSE;
754 if((TMath::Abs(pdaughL1->GetPdgCode())==321 && TMath::Abs(pdaughL2->GetPdgCode())==2212) || (TMath::Abs(pdaughL1->GetPdgCode())==2212 && TMath::Abs(pdaughL2->GetPdgCode())==321)) numberOfLambdac++;
758 if(numberOfLambdac>0)
return kTRUE;
Double_t NormalizedDecayLengthXY() const
fast configuration, only a subset of variables
AliCFVertexingHF & operator=(const AliCFVertexingHF &c)
Int_t fGenDsOption
decay mode id
Double_t Ct(UInt_t pdg) const
Int_t ComputeLocalMultiplicity(Double_t etaD, Double_t phiD, Double_t R) const
Bool_t CheckMCChannelDecay() const
all decays (resonant + non-resonant)
Double_t GetDist12toPrim() const
Bool_t CheckLc3Prong() const
AliAODMCParticle * fmcPartCandidate
Reconstructed HF candidate.
Double_t CosPointingAngleXY() const
AliCFVertexingHF3Prong(Int_t decay, UInt_t resonantDecay)
void SetNProngs(Int_t nProngs)
Float_t * fPtAccCut
centrality value
Float_t fFake
fakes selection: 0 –> all, 1 –> non-fake, 2 –> fake
Int_t fConfiguration
array of tracks
Double_t GetSigmaVert(const AliAODEvent *aod=0x0)
slow configuration, all variables
UInt_t fResonantDecay
option for selection Ds (see enum)
Double_t GetDist23toPrim() const
Bool_t SetRecoCandidateParam(AliAODRecoDecayHF *recoCand)
AliAODRecoDecayHF * fRecoCandidate
mcArray candidate
Int_t fmcLabel
flag to keep only the charm particles that comes from beauty decays
Double_t fzPrimVertex
get Number of variables for the container from the channel decay
Int_t NumberOfFakeDaughters() const
Bool_t GetGeneratedValuesFromMCParticle(Double_t *)
Int_t fProngs
results of the MatchToMC()
AliCFVertexingHF3Prong & operator=(const AliCFVertexingHF3Prong &other)
Double_t fq2
multiplicity of the event
Double_t CosPointingAngle() const
void SetMCLabel(Int_t mcLabel)
Double_t fzMCVertex
Reco z primary vertex.
Class to compute variables for correction framework // for 3-body decays of D mesons (D+...
Double_t fMultiplicity
flag to remove events not geenrated with PYTHIA
Bool_t GetRecoValuesFromCandidate(Double_t *) const
Class for HF corrections as a function of many variables and step.
super fast configuration, only (pt,y,centrality)