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)
65 fGenDsOption(kCountResonant),
83 fGenDsOption(kCountResonant),
84 fResonantDecay(resonantDecay)
100 fGenDsOption(kCountResonant),
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);
344 vectorMC[3] = cT*1.E4 ;
370 vectorMC[2] = cT*1.E4;
388 Bool_t bFillRecoValues=kFALSE;
400 AliError(
"WRONG DECAY SETTING");
401 return bFillRecoValues;
417 Int_t daughtSorted[3];
421 for(
Int_t iDau=0; iDau<3; iDau++){
422 AliAODTrack *trk = (AliAODTrack*)decay3->GetDaughter(iDau);
423 Short_t chargedau=trk->Charge();
424 if(chargedau==charge){
425 daughtSorted[tmpIndex]=iDau;
429 daughtSorted[1]=iDau;
434 if(nDauLS!=2 || nDauOS!=1){
435 AliError(
"Wrong decay channel: number of OS and LS tracks not OK");
436 return bFillRecoValues;
439 if(daughtSorted[0]>daughtSorted[2]){
440 Int_t tmp=daughtSorted[0];
441 daughtSorted[0]=daughtSorted[2];
451 vectorReco[3] = cT*1.E4;
452 vectorReco[4] = cosPointingAngle;
453 vectorReco[5] = decay3->PtProng(daughtSorted[0]);
454 vectorReco[6] = decay3->PtProng(daughtSorted[1]);
455 vectorReco[7] = decay3->PtProng(daughtSorted[2]);
458 vectorReco[10] =
fFake;
459 vectorReco[11] = cosPointingAngleXY;
460 vectorReco[12] = normDecayLengthXY;
464 Double_t d0prong0 = decay3->Getd0Prong(daughtSorted[0]);
465 Double_t d0prong1 = decay3->Getd0Prong(daughtSorted[1]);
466 Double_t d0prong2 = decay3->Getd0Prong(daughtSorted[2]);
467 Double_t sumd02 =(d0prong0*d0prong0 + d0prong1*d0prong1 + d0prong2*d0prong2);
468 vectorReco[11] = dist12*1.E4;
469 vectorReco[12] = dist23*1.E4;
470 vectorReco[13] = sigmVert*1.E4;
471 vectorReco[14] = sumd02*1.E8;
472 vectorReco[15] = cosPointingAngleXY;
473 vectorReco[16] = normDecayLengthXY;
480 vectorReco[2] = cT*1.E4;
484 vectorReco[6] =
fFake ;
489 bFillRecoValues = kTRUE;
490 return bFillRecoValues;
501 Int_t pdgDaughter[3]={-1,-1,-1};
521 AliError(
"WRONG DECAY SETTING");
538 AliDebug(3,
"Decay channel in direct KKpi, should be skipped");
541 for(
Int_t iDau=0; iDau<3; iDau++){
542 Int_t ind = labelFirstDau+iDau;
543 AliAODMCParticle* part =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(ind));
545 AliError(
"Daughter particle not found in MC array");
548 daughter[iDau]=TMath::Abs(part->GetPdgCode());
549 sumPxDau+=part->Px();
550 sumPyDau+=part->Py();
551 sumPzDau+=part->Pz();
556 for(
Int_t iDau=0; iDau<2; iDau++){
557 Int_t ind = labelFirstDau+iDau;
558 AliAODMCParticle* part =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(ind));
560 AliError(
"Daughter particle not found in MC array");
563 Int_t pdgCode=TMath::Abs(part->GetPdgCode());
564 if(pdgCode==211 || pdgCode==321 || pdgCode==2212){
565 if(nDauFound>=3)
return checkCD;
566 daughter[nDauFound]=pdgCode;
567 sumPxDau+=part->Px();
568 sumPyDau+=part->Py();
569 sumPzDau+=part->Pz();
573 Int_t pdgCodeRes=TMath::Abs(part->GetPdgCode());
577 Int_t nDauRes=part->GetNDaughters();
578 if(nDauRes!=2)
return checkCD;
579 Int_t labelFirstDauRes = part->GetDaughter(0);
580 for(
Int_t iDauRes=0; iDauRes<2; iDauRes++){
581 Int_t indDR = labelFirstDauRes+iDauRes;
582 AliAODMCParticle* partDR =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(indDR));
584 AliError(
"Daughter particle not found in MC array");
587 Int_t pdgCodeDR=TMath::Abs(partDR->GetPdgCode());
588 if(nDauFound>=3)
return checkCD;
589 daughter[nDauFound]=pdgCodeDR;
590 sumPxDau+=partDR->Px();
591 sumPyDau+=partDR->Py();
592 sumPzDau+=partDR->Pz();
600 for(
Int_t iDau1=0; iDau1<3; iDau1++){
601 for(
Int_t iDau2=iDau1; iDau2<3; iDau2++){
602 if(daughter[iDau1]<daughter[iDau2]){
603 Int_t tmp=daughter[iDau1];
604 daughter[iDau1]=daughter[iDau2];
609 for(
Int_t iDau=0; iDau<3; iDau++){
610 if(daughter[iDau]!=pdgDaughter[iDau]){
611 AliDebug(2,
"Wrong decay channel from MC, skipping!!");
619 if(TMath::Abs(pxMother-sumPxDau)/(TMath::Abs(pxMother)+1.e-13)>0.00001 ||
620 TMath::Abs(pyMother-sumPyDau)/(TMath::Abs(pyMother)+1.e-13)>0.00001 ||
621 TMath::Abs(pzMother-sumPzDau)/(TMath::Abs(pzMother)+1.e-13)>0.00001){
622 AliDebug(2,
"Momentum conservation violated, skipping!!");
633 Int_t numberOfLambdac=0;
636 if(nDaugh<2)
return kFALSE;
637 if(nDaugh>3)
return kFALSE;
639 if(!pdaugh1) {
return kFALSE;}
640 Int_t number1 = TMath::Abs(pdaugh1->GetPdgCode());
642 if(!pdaugh2) {
return kFALSE;}
643 Int_t number2 = TMath::Abs(pdaugh2->GetPdgCode());
647 AliAODMCParticle* pdaugh3 = (AliAODMCParticle*)
fmcArray->At(thirdDaugh);
648 if(!pdaugh3)
return kFALSE;
649 Int_t number3 = TMath::Abs(pdaugh3->GetPdgCode());
650 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++;
655 if((number1==2212 && number2==313)){
657 nfiglieK=pdaugh2->GetNDaughters();
658 if(nfiglieK!=2)
return kFALSE;
659 AliAODMCParticle* pdaughK1 = (AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
660 AliAODMCParticle* pdaughK2 = (AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
661 if(!pdaughK1)
return kFALSE;
662 if(!pdaughK2)
return kFALSE;
663 if((TMath::Abs(pdaughK1->GetPdgCode())==211 && TMath::Abs(pdaughK2->GetPdgCode())==321) || (TMath::Abs(pdaughK1->GetPdgCode())==321 && TMath::Abs(pdaughK2->GetPdgCode())==211)) numberOfLambdac++;
665 if((number1==313 && number2==2212)){
667 nfiglieK=pdaugh1->GetNDaughters();
668 if(nfiglieK!=2)
return kFALSE;
669 AliAODMCParticle* pdaughK1 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
670 AliAODMCParticle* pdaughK2 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
671 if(!pdaughK1)
return kFALSE;
672 if(!pdaughK2)
return kFALSE;
673 if((TMath::Abs(pdaughK1->GetPdgCode())==211 && TMath::Abs(pdaughK2->GetPdgCode())==321) || (TMath::Abs(pdaughK1->GetPdgCode())==321 && TMath::Abs(pdaughK2->GetPdgCode())==211)) numberOfLambdac++;
675 Int_t nfiglieDelta=0;
676 if(number1==321 && number2==2224){
678 nfiglieDelta=pdaugh2->GetNDaughters();
679 if(nfiglieDelta!=2)
return kFALSE;
680 AliAODMCParticle *pdaughD1=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
681 AliAODMCParticle *pdaughD2=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
682 if(!pdaughD1)
return kFALSE;
683 if(!pdaughD2)
return kFALSE;
684 if((TMath::Abs(pdaughD1->GetPdgCode())==211 && TMath::Abs(pdaughD2->GetPdgCode())==2212) || (TMath::Abs(pdaughD1->GetPdgCode())==2212 && TMath::Abs(pdaughD2->GetPdgCode())==211)) numberOfLambdac++;
686 if(number1==2224 && number2==321){
688 nfiglieDelta=pdaugh1->GetNDaughters();
689 if(nfiglieDelta!=2)
return kFALSE;
690 AliAODMCParticle* pdaughD1 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
691 AliAODMCParticle* pdaughD2 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
692 if(!pdaughD1)
return kFALSE;
693 if(!pdaughD2)
return kFALSE;
694 if((TMath::Abs(pdaughD1->GetPdgCode())==211 && TMath::Abs(pdaughD2->GetPdgCode())==2212) || (TMath::Abs(pdaughD1->GetPdgCode())==2212 && TMath::Abs(pdaughD2->GetPdgCode())==211)) numberOfLambdac++;
698 if(number1==3124 && number2==211){
700 nfiglieLa=pdaugh1->GetNDaughters();
701 if(nfiglieLa!=2)
return kFALSE;
702 AliAODMCParticle *pdaughL1=(AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
703 AliAODMCParticle *pdaughL2=(AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
704 if(!pdaughL1)
return kFALSE;
705 if(!pdaughL2)
return kFALSE;
706 if((TMath::Abs(pdaughL1->GetPdgCode())==321 && TMath::Abs(pdaughL2->GetPdgCode())==2212) || (TMath::Abs(pdaughL1->GetPdgCode())==2212 && TMath::Abs(pdaughL2->GetPdgCode())==321)) numberOfLambdac++;
708 if(number1==211 && number2==3124){
710 nfiglieLa=pdaugh2->GetNDaughters();
711 if(nfiglieLa!=2)
return kFALSE;
712 AliAODMCParticle *pdaughL1=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
713 AliAODMCParticle *pdaughL2=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
714 if(!pdaughL1)
return kFALSE;
715 if(!pdaughL2)
return kFALSE;
716 if((TMath::Abs(pdaughL1->GetPdgCode())==321 && TMath::Abs(pdaughL2->GetPdgCode())==2212) || (TMath::Abs(pdaughL1->GetPdgCode())==2212 && TMath::Abs(pdaughL2->GetPdgCode())==321)) numberOfLambdac++;
720 if(numberOfLambdac>0)
return kTRUE;
Double_t NormalizedDecayLengthXY() const
AliCFVertexingHF & operator=(const AliCFVertexingHF &c)
Int_t fGenDsOption
decay mode id
Double_t Ct(UInt_t pdg) const
Bool_t CheckMCChannelDecay() const
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
multiplicity of the event
all decays (resonant + non-resonant)
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 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.