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 Int_t label = TMath::Abs(trk->GetLabel());
424 Short_t chargedau=trk->Charge();
425 if(chargedau==charge){
426 daughtSorted[tmpIndex]=label;
430 daughtSorted[1]=label;
435 if(nDauLS!=2 || nDauOS!=1){
436 AliError(
"Wrong decay channel: number of OS and LS tracks not OK");
437 return bFillRecoValues;
440 if(daughtSorted[0]>daughtSorted[2]){
441 Int_t tmp=daughtSorted[0];
442 daughtSorted[0]=daughtSorted[2];
446 Double_t d0prong0 = decay3->Getd0Prong(daughtSorted[0]);
447 Double_t d0prong1 = decay3->Getd0Prong(daughtSorted[1]);
448 Double_t d0prong2 = decay3->Getd0Prong(daughtSorted[2]);
455 vectorReco[3] = cT*1.E4;
456 vectorReco[4] = cosPointingAngle;
457 vectorReco[5] = decay3->PtProng(daughtSorted[0]);
458 vectorReco[6] = decay3->PtProng(daughtSorted[1]);
459 vectorReco[7] = decay3->PtProng(daughtSorted[2]);
462 vectorReco[10] =
fFake;
463 vectorReco[11] = cosPointingAngleXY;
464 vectorReco[12] = normDecayLengthXY;
468 Double_t sumd02 =(d0prong0*d0prong0 + d0prong1*d0prong1 + d0prong2*d0prong2);
469 vectorReco[11] = dist12*1.E4;
470 vectorReco[12] = dist23*1.E4;
471 vectorReco[13] = sigmVert*1.E4;
472 vectorReco[14] = sumd02*1.E8;
473 vectorReco[15] = cosPointingAngleXY;
474 vectorReco[16] = normDecayLengthXY;
481 vectorReco[2] = cT*1.E4;
485 vectorReco[6] =
fFake ;
490 bFillRecoValues = kTRUE;
491 return bFillRecoValues;
502 Int_t pdgDaughter[3]={-1,-1,-1};
522 AliError(
"WRONG DECAY SETTING");
539 AliDebug(3,
"Decay channel in direct KKpi, should be skipped");
542 for(
Int_t iDau=0; iDau<3; iDau++){
543 Int_t ind = labelFirstDau+iDau;
544 AliAODMCParticle* part =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(ind));
546 AliError(
"Daughter particle not found in MC array");
549 daughter[iDau]=TMath::Abs(part->GetPdgCode());
550 sumPxDau+=part->Px();
551 sumPyDau+=part->Py();
552 sumPzDau+=part->Pz();
557 for(
Int_t iDau=0; iDau<2; iDau++){
558 Int_t ind = labelFirstDau+iDau;
559 AliAODMCParticle* part =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(ind));
561 AliError(
"Daughter particle not found in MC array");
564 Int_t pdgCode=TMath::Abs(part->GetPdgCode());
565 if(pdgCode==211 || pdgCode==321 || pdgCode==2212){
566 if(nDauFound>=3)
return checkCD;
567 daughter[nDauFound]=pdgCode;
568 sumPxDau+=part->Px();
569 sumPyDau+=part->Py();
570 sumPzDau+=part->Pz();
574 Int_t pdgCodeRes=TMath::Abs(part->GetPdgCode());
578 Int_t nDauRes=part->GetNDaughters();
579 if(nDauRes!=2)
return checkCD;
580 Int_t labelFirstDauRes = part->GetDaughter(0);
581 for(
Int_t iDauRes=0; iDauRes<2; iDauRes++){
582 Int_t indDR = labelFirstDauRes+iDauRes;
583 AliAODMCParticle* partDR =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(indDR));
585 AliError(
"Daughter particle not found in MC array");
588 Int_t pdgCodeDR=TMath::Abs(partDR->GetPdgCode());
589 if(nDauFound>=3)
return checkCD;
590 daughter[nDauFound]=pdgCodeDR;
591 sumPxDau+=partDR->Px();
592 sumPyDau+=partDR->Py();
593 sumPzDau+=partDR->Pz();
601 for(
Int_t iDau1=0; iDau1<3; iDau1++){
602 for(
Int_t iDau2=iDau1; iDau2<3; iDau2++){
603 if(daughter[iDau1]<daughter[iDau2]){
604 Int_t tmp=daughter[iDau1];
605 daughter[iDau1]=daughter[iDau2];
610 for(
Int_t iDau=0; iDau<3; iDau++){
611 if(daughter[iDau]!=pdgDaughter[iDau]){
612 AliDebug(2,
"Wrong decay channel from MC, skipping!!");
620 if(TMath::Abs(pxMother-sumPxDau)/(TMath::Abs(pxMother)+1.e-13)>0.00001 ||
621 TMath::Abs(pyMother-sumPyDau)/(TMath::Abs(pyMother)+1.e-13)>0.00001 ||
622 TMath::Abs(pzMother-sumPzDau)/(TMath::Abs(pzMother)+1.e-13)>0.00001){
623 AliDebug(2,
"Momentum conservation violated, skipping!!");
634 Int_t numberOfLambdac=0;
637 if(nDaugh<2)
return kFALSE;
638 if(nDaugh>3)
return kFALSE;
640 if(!pdaugh1) {
return kFALSE;}
641 Int_t number1 = TMath::Abs(pdaugh1->GetPdgCode());
643 if(!pdaugh2) {
return kFALSE;}
644 Int_t number2 = TMath::Abs(pdaugh2->GetPdgCode());
648 AliAODMCParticle* pdaugh3 = (AliAODMCParticle*)
fmcArray->At(thirdDaugh);
649 if(!pdaugh3)
return kFALSE;
650 Int_t number3 = TMath::Abs(pdaugh3->GetPdgCode());
651 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++;
656 if((number1==2212 && number2==313)){
658 nfiglieK=pdaugh2->GetNDaughters();
659 if(nfiglieK!=2)
return kFALSE;
660 AliAODMCParticle* pdaughK1 = (AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
661 AliAODMCParticle* pdaughK2 = (AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
662 if(!pdaughK1)
return kFALSE;
663 if(!pdaughK2)
return kFALSE;
664 if((TMath::Abs(pdaughK1->GetPdgCode())==211 && TMath::Abs(pdaughK2->GetPdgCode())==321) || (TMath::Abs(pdaughK1->GetPdgCode())==321 && TMath::Abs(pdaughK2->GetPdgCode())==211)) numberOfLambdac++;
666 if((number1==313 && number2==2212)){
668 nfiglieK=pdaugh1->GetNDaughters();
669 if(nfiglieK!=2)
return kFALSE;
670 AliAODMCParticle* pdaughK1 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
671 AliAODMCParticle* pdaughK2 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
672 if(!pdaughK1)
return kFALSE;
673 if(!pdaughK2)
return kFALSE;
674 if((TMath::Abs(pdaughK1->GetPdgCode())==211 && TMath::Abs(pdaughK2->GetPdgCode())==321) || (TMath::Abs(pdaughK1->GetPdgCode())==321 && TMath::Abs(pdaughK2->GetPdgCode())==211)) numberOfLambdac++;
676 Int_t nfiglieDelta=0;
677 if(number1==321 && number2==2224){
679 nfiglieDelta=pdaugh2->GetNDaughters();
680 if(nfiglieDelta!=2)
return kFALSE;
681 AliAODMCParticle *pdaughD1=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
682 AliAODMCParticle *pdaughD2=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
683 if(!pdaughD1)
return kFALSE;
684 if(!pdaughD2)
return kFALSE;
685 if((TMath::Abs(pdaughD1->GetPdgCode())==211 && TMath::Abs(pdaughD2->GetPdgCode())==2212) || (TMath::Abs(pdaughD1->GetPdgCode())==2212 && TMath::Abs(pdaughD2->GetPdgCode())==211)) numberOfLambdac++;
687 if(number1==2224 && number2==321){
689 nfiglieDelta=pdaugh1->GetNDaughters();
690 if(nfiglieDelta!=2)
return kFALSE;
691 AliAODMCParticle* pdaughD1 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
692 AliAODMCParticle* pdaughD2 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
693 if(!pdaughD1)
return kFALSE;
694 if(!pdaughD2)
return kFALSE;
695 if((TMath::Abs(pdaughD1->GetPdgCode())==211 && TMath::Abs(pdaughD2->GetPdgCode())==2212) || (TMath::Abs(pdaughD1->GetPdgCode())==2212 && TMath::Abs(pdaughD2->GetPdgCode())==211)) numberOfLambdac++;
699 if(number1==3124 && number2==211){
701 nfiglieLa=pdaugh1->GetNDaughters();
702 if(nfiglieLa!=2)
return kFALSE;
703 AliAODMCParticle *pdaughL1=(AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
704 AliAODMCParticle *pdaughL2=(AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
705 if(!pdaughL1)
return kFALSE;
706 if(!pdaughL2)
return kFALSE;
707 if((TMath::Abs(pdaughL1->GetPdgCode())==321 && TMath::Abs(pdaughL2->GetPdgCode())==2212) || (TMath::Abs(pdaughL1->GetPdgCode())==2212 && TMath::Abs(pdaughL2->GetPdgCode())==321)) numberOfLambdac++;
709 if(number1==211 && number2==3124){
711 nfiglieLa=pdaugh2->GetNDaughters();
712 if(nfiglieLa!=2)
return kFALSE;
713 AliAODMCParticle *pdaughL1=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
714 AliAODMCParticle *pdaughL2=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
715 if(!pdaughL1)
return kFALSE;
716 if(!pdaughL2)
return kFALSE;
717 if((TMath::Abs(pdaughL1->GetPdgCode())==321 && TMath::Abs(pdaughL2->GetPdgCode())==2212) || (TMath::Abs(pdaughL1->GetPdgCode())==2212 && TMath::Abs(pdaughL2->GetPdgCode())==321)) numberOfLambdac++;
721 if(numberOfLambdac>0)
return kTRUE;
Double_t NormalizedDecayLengthXY() const
AliCFVertexingHF & operator=(const AliCFVertexingHF &c)
all decays (resonant + non-resonant)
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
Double_t GetSigmaVert(const AliAODEvent *aod=0x0)
UInt_t fResonantDecay
option for selection Ds (see enum)
Double_t GetDist23toPrim() const
Bool_t SetRecoCandidateParam(AliAODRecoDecayHF *recoCand)
AliAODRecoDecayHF * fRecoCandidate
mcArray candidate
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
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)
slow configuration, all variables
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.