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);
344 vectorMC[3] = cT*1.E4 ;
370 vectorMC[2] = cT*1.E4;
394 Bool_t bFillRecoValues=kFALSE;
406 AliError(
"WRONG DECAY SETTING");
407 return bFillRecoValues;
423 Int_t daughtSorted[3];
427 for(
Int_t iDau=0; iDau<3; iDau++){
428 AliAODTrack *trk = (AliAODTrack*)decay3->GetDaughter(iDau);
429 Short_t chargedau=trk->Charge();
430 if(chargedau==charge){
431 daughtSorted[tmpIndex]=iDau;
435 daughtSorted[1]=iDau;
440 if(nDauLS!=2 || nDauOS!=1){
441 AliError(
"Wrong decay channel: number of OS and LS tracks not OK");
442 return bFillRecoValues;
445 if(daughtSorted[0]>daughtSorted[2]){
446 Int_t tmp=daughtSorted[0];
447 daughtSorted[0]=daughtSorted[2];
457 vectorReco[3] = cT*1.E4;
458 vectorReco[4] = cosPointingAngle;
459 vectorReco[5] = decay3->PtProng(daughtSorted[0]);
460 vectorReco[6] = decay3->PtProng(daughtSorted[1]);
461 vectorReco[7] = decay3->PtProng(daughtSorted[2]);
464 vectorReco[10] =
fFake;
465 vectorReco[11] = cosPointingAngleXY;
466 vectorReco[12] = normDecayLengthXY;
470 Double_t d0prong0 = decay3->Getd0Prong(daughtSorted[0]);
471 Double_t d0prong1 = decay3->Getd0Prong(daughtSorted[1]);
472 Double_t d0prong2 = decay3->Getd0Prong(daughtSorted[2]);
473 Double_t sumd02 =(d0prong0*d0prong0 + d0prong1*d0prong1 + d0prong2*d0prong2);
474 vectorReco[11] = dist12*1.E4;
475 vectorReco[12] = dist23*1.E4;
476 vectorReco[13] = sigmVert*1.E4;
477 vectorReco[14] = sumd02*1.E8;
478 vectorReco[15] = cosPointingAngleXY;
479 vectorReco[16] = normDecayLengthXY;
486 vectorReco[2] = cT*1.E4;
490 vectorReco[6] =
fFake ;
501 bFillRecoValues = kTRUE;
502 return bFillRecoValues;
513 Int_t pdgDaughter[3]={-1,-1,-1};
533 AliError(
"WRONG DECAY SETTING");
550 AliDebug(3,
"Decay channel in direct KKpi, should be skipped");
553 for(
Int_t iDau=0; iDau<3; iDau++){
554 Int_t ind = labelFirstDau+iDau;
555 AliAODMCParticle*
part =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(ind));
557 AliError(
"Daughter particle not found in MC array");
560 daughter[iDau]=TMath::Abs(part->GetPdgCode());
561 sumPxDau+=part->Px();
562 sumPyDau+=part->Py();
563 sumPzDau+=part->Pz();
568 for(
Int_t iDau=0; iDau<2; iDau++){
569 Int_t ind = labelFirstDau+iDau;
570 AliAODMCParticle*
part =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(ind));
572 AliError(
"Daughter particle not found in MC array");
575 Int_t pdgCode=TMath::Abs(part->GetPdgCode());
576 if(pdgCode==211 || pdgCode==321 || pdgCode==2212){
577 if(nDauFound>=3)
return checkCD;
578 daughter[nDauFound]=pdgCode;
579 sumPxDau+=part->Px();
580 sumPyDau+=part->Py();
581 sumPzDau+=part->Pz();
585 Int_t pdgCodeRes=TMath::Abs(part->GetPdgCode());
589 Int_t nDauRes=part->GetNDaughters();
590 if(nDauRes!=2)
return checkCD;
591 Int_t labelFirstDauRes = part->GetDaughter(0);
592 for(
Int_t iDauRes=0; iDauRes<2; iDauRes++){
593 Int_t indDR = labelFirstDauRes+iDauRes;
594 AliAODMCParticle* partDR =
dynamic_cast<AliAODMCParticle*
>(
fmcArray->At(indDR));
596 AliError(
"Daughter particle not found in MC array");
599 Int_t pdgCodeDR=TMath::Abs(partDR->GetPdgCode());
600 if(nDauFound>=3)
return checkCD;
601 daughter[nDauFound]=pdgCodeDR;
602 sumPxDau+=partDR->Px();
603 sumPyDau+=partDR->Py();
604 sumPzDau+=partDR->Pz();
612 for(
Int_t iDau1=0; iDau1<3; iDau1++){
613 for(
Int_t iDau2=iDau1; iDau2<3; iDau2++){
614 if(daughter[iDau1]<daughter[iDau2]){
615 Int_t tmp=daughter[iDau1];
616 daughter[iDau1]=daughter[iDau2];
621 for(
Int_t iDau=0; iDau<3; iDau++){
622 if(daughter[iDau]!=pdgDaughter[iDau]){
623 AliDebug(2,
"Wrong decay channel from MC, skipping!!");
631 if(TMath::Abs(pxMother-sumPxDau)/(TMath::Abs(pxMother)+1.e-13)>0.00001 ||
632 TMath::Abs(pyMother-sumPyDau)/(TMath::Abs(pyMother)+1.e-13)>0.00001 ||
633 TMath::Abs(pzMother-sumPzDau)/(TMath::Abs(pzMother)+1.e-13)>0.00001){
634 AliDebug(2,
"Momentum conservation violated, skipping!!");
645 Int_t numberOfLambdac=0;
648 if(nDaugh<2)
return kFALSE;
649 if(nDaugh>3)
return kFALSE;
651 if(!pdaugh1) {
return kFALSE;}
652 Int_t number1 = TMath::Abs(pdaugh1->GetPdgCode());
654 if(!pdaugh2) {
return kFALSE;}
655 Int_t number2 = TMath::Abs(pdaugh2->GetPdgCode());
659 AliAODMCParticle* pdaugh3 = (AliAODMCParticle*)
fmcArray->At(thirdDaugh);
660 if(!pdaugh3)
return kFALSE;
661 Int_t number3 = TMath::Abs(pdaugh3->GetPdgCode());
662 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++;
667 if((number1==2212 && number2==313)){
669 nfiglieK=pdaugh2->GetNDaughters();
670 if(nfiglieK!=2)
return kFALSE;
671 AliAODMCParticle* pdaughK1 = (AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
672 AliAODMCParticle* pdaughK2 = (AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
673 if(!pdaughK1)
return kFALSE;
674 if(!pdaughK2)
return kFALSE;
675 if((TMath::Abs(pdaughK1->GetPdgCode())==211 && TMath::Abs(pdaughK2->GetPdgCode())==321) || (TMath::Abs(pdaughK1->GetPdgCode())==321 && TMath::Abs(pdaughK2->GetPdgCode())==211)) numberOfLambdac++;
677 if((number1==313 && number2==2212)){
679 nfiglieK=pdaugh1->GetNDaughters();
680 if(nfiglieK!=2)
return kFALSE;
681 AliAODMCParticle* pdaughK1 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
682 AliAODMCParticle* pdaughK2 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
683 if(!pdaughK1)
return kFALSE;
684 if(!pdaughK2)
return kFALSE;
685 if((TMath::Abs(pdaughK1->GetPdgCode())==211 && TMath::Abs(pdaughK2->GetPdgCode())==321) || (TMath::Abs(pdaughK1->GetPdgCode())==321 && TMath::Abs(pdaughK2->GetPdgCode())==211)) numberOfLambdac++;
687 Int_t nfiglieDelta=0;
688 if(number1==321 && number2==2224){
690 nfiglieDelta=pdaugh2->GetNDaughters();
691 if(nfiglieDelta!=2)
return kFALSE;
692 AliAODMCParticle *pdaughD1=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
693 AliAODMCParticle *pdaughD2=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
694 if(!pdaughD1)
return kFALSE;
695 if(!pdaughD2)
return kFALSE;
696 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==2224 && number2==321){
700 nfiglieDelta=pdaugh1->GetNDaughters();
701 if(nfiglieDelta!=2)
return kFALSE;
702 AliAODMCParticle* pdaughD1 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
703 AliAODMCParticle* pdaughD2 = (AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
704 if(!pdaughD1)
return kFALSE;
705 if(!pdaughD2)
return kFALSE;
706 if((TMath::Abs(pdaughD1->GetPdgCode())==211 && TMath::Abs(pdaughD2->GetPdgCode())==2212) || (TMath::Abs(pdaughD1->GetPdgCode())==2212 && TMath::Abs(pdaughD2->GetPdgCode())==211)) numberOfLambdac++;
710 if(number1==3124 && number2==211){
712 nfiglieLa=pdaugh1->GetNDaughters();
713 if(nfiglieLa!=2)
return kFALSE;
714 AliAODMCParticle *pdaughL1=(AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(0));
715 AliAODMCParticle *pdaughL2=(AliAODMCParticle*)
fmcArray->At(pdaugh1->GetDaughter(1));
716 if(!pdaughL1)
return kFALSE;
717 if(!pdaughL2)
return kFALSE;
718 if((TMath::Abs(pdaughL1->GetPdgCode())==321 && TMath::Abs(pdaughL2->GetPdgCode())==2212) || (TMath::Abs(pdaughL1->GetPdgCode())==2212 && TMath::Abs(pdaughL2->GetPdgCode())==321)) numberOfLambdac++;
720 if(number1==211 && number2==3124){
722 nfiglieLa=pdaugh2->GetNDaughters();
723 if(nfiglieLa!=2)
return kFALSE;
724 AliAODMCParticle *pdaughL1=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(0));
725 AliAODMCParticle *pdaughL2=(AliAODMCParticle*)
fmcArray->At(pdaugh2->GetDaughter(1));
726 if(!pdaughL1)
return kFALSE;
727 if(!pdaughL2)
return kFALSE;
728 if((TMath::Abs(pdaughL1->GetPdgCode())==321 && TMath::Abs(pdaughL2->GetPdgCode())==2212) || (TMath::Abs(pdaughL1->GetPdgCode())==2212 && TMath::Abs(pdaughL2->GetPdgCode())==321)) numberOfLambdac++;
732 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)
all decays (resonant + non-resonant)
TString part
use mixed event to constrain combinatorial background
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
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.
fast configuration, only a subset of variables