31 #include <TDatabasePDG.h> 32 #include <Riostream.h> 35 #include "AliAODTrack.h" 36 #include "AliESDtrack.h" 37 #include "AliAODPid.h" 38 #include "AliTPCPIDResponse.h" 39 #include "AliAODVertex.h" 40 #include "AliESDVertex.h" 59 fnVarsD0forD0ptbin(0),
60 fnPtBinsD0forD0ptbin(1),
61 fGlobalIndexD0forD0ptbin(0),
62 fCutsRDD0forD0ptbin(0x0),
63 fnPtBinLimitsD0forD0ptbin(1),
64 fPtBinLimitsD0forD0ptbin(0x0),
65 fIsUpperCutD0forD0ptbin(0x0),
66 fIsCutUsedD0forD0ptbin(0x0),
67 fVarNamesD0forD0ptbin(0x0),
68 fMinITSNclsD0FirstDaughter(0),
69 fMinTPCNclsD0FirstDaughter(0),
70 fUseITSRefitD0FirstDaughter(0),
71 fUseTPCRefitD0FirstDaughter(0),
72 fUseFilterBitD0FirstDaughter(0),
73 fFilterBitD0FirstDaughter(0),
74 fMinPtD0FirstDaughter(0),
75 fMinITSNclsD0SecondDaughter(0),
76 fMinTPCNclsD0SecondDaughter(0),
77 fUseITSRefitD0SecondDaughter(0),
78 fUseTPCRefitD0SecondDaughter(0),
79 fUseFilterBitD0SecondDaughter(0),
80 fFilterBitD0SecondDaughter(0),
81 fMinPtD0SecondDaughter(0),
82 fMinITSNclsBPlusPion(0),
83 fMinTPCNclsBPlusPion(0),
84 fUseITSRefitBPlusPion(0),
85 fUseTPCRefitBPlusPion(0),
86 fUseFilterBitBPlusPion(0),
87 fFilterBitBPlusPion(0),
89 fMaxAbsEtaD0FirstDaughter(999.),
90 fHardSelectionArrayITSD0FirstDaughter(),
91 fSoftSelectionArrayITSD0FirstDaughter(),
92 fNSoftITSCutD0FirstDaughter(0),
93 fMaxAbsEtaD0SecondDaughter(999.),
94 fHardSelectionArrayITSD0SecondDaughter(),
95 fSoftSelectionArrayITSD0SecondDaughter(),
96 fNSoftITSCutD0SecondDaughter(0),
97 fMaxAbsEtaBPlusPion(999.),
98 fHardSelectionArrayITSBPlusPion(),
99 fSoftSelectionArrayITSBPlusPion(),
100 fNSoftITSCutBPlusPion(0),
101 fMind0D0FirstDaughter(0),
102 fMind0D0SecondDaughter(0),
110 const Int_t nvars=68;
117 varNames[iterator++]=
"inv. mass width[GeV]";
118 varNames[iterator++]=
"delta mass width [GeV]";
119 varNames[iterator++]=
"pointing angle [Cos(theta)]";
120 varNames[iterator++]=
"dca [cm]";
121 varNames[iterator++]=
"Pt D0 [GeV/c]";
122 varNames[iterator++]=
"Pt first daughter [GeV/c]";
123 varNames[iterator++]=
"Pt second daughter [GeV/c]";
124 varNames[iterator++]=
"d0 D0 [cm]";
125 varNames[iterator++]=
"d0 first daughter [cm]";
126 varNames[iterator++]=
"d0 second daughter [cm]";
127 varNames[iterator++]=
"d0d0 [cm^2]";
128 varNames[iterator++]=
"d0d0 XY [cm^2]";
130 varNames[iterator++]=
"angle between both daughters";
131 varNames[iterator++]=
"angle mother with first daughter";
132 varNames[iterator++]=
"angle mother with second daughter";
133 varNames[iterator++]=
"cosThetaStar";
134 varNames[iterator++]=
"vertexDistance";
135 varNames[iterator++]=
"pseudoProperDecayTime";
136 varNames[iterator++]=
"DecayTime";
137 varNames[iterator++]=
"normalizedDecayTime";
138 varNames[iterator++]=
"normDecayLength";
139 varNames[iterator++]=
"topomatic first daughter";
140 varNames[iterator++]=
"topomatic second daughter";
141 varNames[iterator++]=
"topomatic max";
142 varNames[iterator++]=
"topomatic min";
144 varNames[iterator++]=
"pointing angle XY [Cos(theta)]";
145 varNames[iterator++]=
"vertex distance XY [cm]";
146 varNames[iterator++]=
"normDecayLength XY";
147 varNames[iterator++]=
"Chi2 per NDF vertex";
149 varNames[iterator++]=
"pointingAngleToBPlus";
150 varNames[iterator++]=
"d0MotherToBPlus";
151 varNames[iterator++]=
"d0FirstDaughterToBPlus";
152 varNames[iterator++]=
"d0SecondDaughterToBPlus";
153 varNames[iterator++]=
"impactProductToBPlus";
154 varNames[iterator++]=
"impactProductXYToBPlus";
155 varNames[iterator++]=
"normDecayLengthToBPlus";
156 varNames[iterator++]=
"pseudoProperDecayTimeToBPlus";
157 varNames[iterator++]=
"DecayTimeToBPlus";
158 varNames[iterator++]=
"normalizedDecayTimeToBPlus";
161 varNames[iterator++]=
"inv. mass width[GeV]";
162 varNames[iterator++]=
"delta mass width [GeV]";
163 varNames[iterator++]=
"pointing angle [Cos(theta)]";
164 varNames[iterator++]=
"dca [cm]";
165 varNames[iterator++]=
"Pt BPlus [GeV/c]";
166 varNames[iterator++]=
"Pt D0 [GeV/c]";
167 varNames[iterator++]=
"Pt Pion [GeV/c]";
168 varNames[iterator++]=
"d0 BPlus [cm]";
169 varNames[iterator++]=
"d0 D0 [cm]";
170 varNames[iterator++]=
"d0 Pion [cm]";
171 varNames[iterator++]=
"d0d0 [cm^2]";
172 varNames[iterator++]=
"d0d0 XY [cm^2]";
174 varNames[iterator++]=
"angle between both daughters";
175 varNames[iterator++]=
"angle mother with first daughter";
176 varNames[iterator++]=
"angle mother with second daughter";
177 varNames[iterator++]=
"cosThetaStar";
178 varNames[iterator++]=
"vertexDistance";
179 varNames[iterator++]=
"pseudoProperDecayTime";
180 varNames[iterator++]=
"DecayTime";
181 varNames[iterator++]=
"normalizedDecayTime";
182 varNames[iterator++]=
"normDecayLength";
183 varNames[iterator++]=
"topomatic first daughter";
184 varNames[iterator++]=
"topomatic second daughter";
185 varNames[iterator++]=
"topomatic max";
186 varNames[iterator++]=
"topomatic min";
188 varNames[iterator++]=
"pointing angle XY [Cos(theta)]";
189 varNames[iterator++]=
"vertex distance XY [cm]";
190 varNames[iterator++]=
"normDecayLength XY";
191 varNames[iterator++]=
"Chi2 per NDF vertex";
193 Bool_t isUpperCut[nvars]={0};
197 Float_t limits[2]={0,999999999.};
205 const Int_t nvarsD0forD0ptbin=29;
208 TString varNamesD0forD0ptbin[nvarsD0forD0ptbin];
212 varNamesD0forD0ptbin[iterator++]=
"inv. mass width[GeV]";
213 varNamesD0forD0ptbin[iterator++]=
"delta mass width [GeV]";
214 varNamesD0forD0ptbin[iterator++]=
"pointing angle [Cos(theta)]";
215 varNamesD0forD0ptbin[iterator++]=
"dca [cm]";
216 varNamesD0forD0ptbin[iterator++]=
"Pt D0 [GeV/c]";
217 varNamesD0forD0ptbin[iterator++]=
"Pt first daughter [GeV/c]";
218 varNamesD0forD0ptbin[iterator++]=
"Pt second daughter [GeV/c]";
219 varNamesD0forD0ptbin[iterator++]=
"d0 D0 [cm]";
220 varNamesD0forD0ptbin[iterator++]=
"d0 first daughter [cm]";
221 varNamesD0forD0ptbin[iterator++]=
"d0 second daughter [cm]";
222 varNamesD0forD0ptbin[iterator++]=
"d0d0 [cm^2]";
223 varNamesD0forD0ptbin[iterator++]=
"d0d0 XY [cm^2]";
225 varNamesD0forD0ptbin[iterator++]=
"angle between both daughters";
226 varNamesD0forD0ptbin[iterator++]=
"angle mother with first daughter";
227 varNamesD0forD0ptbin[iterator++]=
"angle mother with second daughter";
228 varNamesD0forD0ptbin[iterator++]=
"cosThetaStar";
229 varNamesD0forD0ptbin[iterator++]=
"vertexDistance";
230 varNamesD0forD0ptbin[iterator++]=
"pseudoProperDecayTime";
231 varNamesD0forD0ptbin[iterator++]=
"DecayTime";
232 varNamesD0forD0ptbin[iterator++]=
"normalizedDecayTime";
233 varNamesD0forD0ptbin[iterator++]=
"normDecayLength";
234 varNamesD0forD0ptbin[iterator++]=
"topomatic first daughter";
235 varNamesD0forD0ptbin[iterator++]=
"topomatic second daughter";
236 varNamesD0forD0ptbin[iterator++]=
"topomatic max";
237 varNamesD0forD0ptbin[iterator++]=
"topomatic min";
239 varNamesD0forD0ptbin[iterator++]=
"pointing angle XY [Cos(theta)]";
240 varNamesD0forD0ptbin[iterator++]=
"vertex distance XY [cm]";
241 varNamesD0forD0ptbin[iterator++]=
"normDecayLength XY";
242 varNamesD0forD0ptbin[iterator++]=
"Chi2 per NDF vertex";
244 Bool_t isUpperCutD0forD0ptbin[nvarsD0forD0ptbin]={0};
248 Float_t limitsD0forD0ptbin[2]={0,999999999.};
376 if(&source ==
this)
return *
this;
483 cout<<
"Cut matrice not inizialized. Exit..."<<endl;
489 cout<<
"candidateBPlus null"<<endl;
495 cout<<
"candidateD0 null"<<endl;
499 AliAODTrack *candidatePion = (AliAODTrack*)candidateBPlus->GetDaughter(0);
501 cout<<
"candidatePion null 1"<<endl;
505 AliAODVertex * vertexBPlus = candidateBPlus->GetSecondaryVtx();
507 cout<<
"vertexBPlus null"<<endl;
511 AliAODVertex * primaryVertex = aod->GetPrimaryVertex();
513 cout<<
"primaryVertex null"<<endl;
518 Bool_t bPassedCut = kFALSE;
529 if(ptbin==-1)
return -1;
533 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
534 Double_t mBPlusPDG = TDatabasePDG::Instance()->GetParticle(521)->Mass();
537 Double_t deltaPDG = mBPlusPDG - mD0PDG;
541 prongs[0] = 211; prongs[1] = 421;
542 Double_t invMassBPlus = candidateBPlus->InvMass(2,prongs);
543 Double_t invMassDifference = TMath::Abs(mBPlusPDG - invMassBPlus);
547 Double_t dcaMother = candidateBPlus->GetDCA();
548 Double_t ptMother = candidateBPlus->Pt();
549 Double_t momentumMother = candidateBPlus->P();
551 Double_t ptPion = candidatePion->Pt();
553 AliExternalTrackParam motherTrack;
554 motherTrack.CopyFromVTrack(candidateBPlus);
556 motherTrack.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
558 Double_t d0Mother = TMath::Abs(d0[0]);
559 Double_t d0firstTrack = TMath::Abs(candidateBPlus->Getd0Prong(0));
560 Double_t d0secondTrack = TMath::Abs(candidateBPlus->Getd0Prong(1));
565 Double_t angleBetweenBothDaughters = (candidateD0->Px() * candidatePion->Px() + candidateD0->Py() * candidatePion->Py() + candidateD0->Pz() * candidatePion->Pz()) /(candidateD0->P() * candidatePion->P());
566 Double_t angleMotherFirstDaughter = (candidateBPlus->Px() * candidatePion->Px() + candidateBPlus->Py() * candidatePion->Py() + candidateBPlus->Pz() * candidatePion->Pz()) /(candidateBPlus->P() * candidatePion->P());
567 Double_t angleMotherSecondDaughter = (candidateBPlus->Px() * candidateD0->Px() + candidateBPlus->Py() * candidateD0->Py() + candidateBPlus->Pz() * candidateD0->Pz()) /(candidateBPlus->P() * candidateD0->P());
569 Double_t cosThetaStar = candidateBPlus->CosThetaStar(0,521,211,421);
570 Double_t vertexDistance = vertexBPlus->DistanceToVertex(primaryVertex);
572 Double_t pdgMassMother = TDatabasePDG::Instance()->GetParticle(521)->Mass();
573 Double_t pseudoProperDecayLength = ((vertexBPlus->GetX() - primaryVertex->GetX()) * candidateBPlus->Px() / TMath::Abs(candidateBPlus->Pt())) + ((vertexBPlus->GetY() - primaryVertex->GetY()) * candidateBPlus->Py() / TMath::Abs(candidateBPlus->Pt()));
574 Double_t pseudoProperDecayTime = pseudoProperDecayLength * pdgMassMother/ptMother;
575 Double_t decayTime = vertexDistance / (299792458 * TMath::Sqrt(1/((pdgMassMother*pdgMassMother/(momentumMother*momentumMother)) + 1)));
577 Double_t phi = candidateBPlus->Phi();
578 Double_t theta = candidateBPlus->Theta();
580 candidateBPlus->GetCovarianceXYZPxPyPz(covMatrix);
587 Double_t errorMomentum = covMatrix[9]*cp*cp*ct*ct
588 +covMatrix[13]*2.*cp*sp*ct*ct
589 +covMatrix[18]*2.*cp*ct*st
590 +covMatrix[14]*sp*sp*ct*ct
591 +covMatrix[19]*2.*sp*ct*st
592 +covMatrix[20]*st*st;
593 Double_t normalizedDecayTime = candidateBPlus->
NormalizedDecayLength() / (299792458 * TMath::Sqrt(1/((pdgMassMother*pdgMassMother*errorMomentum*errorMomentum/(momentumMother*momentumMother)) + 1)));
596 Double_t distanceXYToVertex = vertexBPlus->DistanceXYToVertex(primaryVertex);
598 Double_t chi2Vertex = vertexBPlus->GetChi2perNDF();
605 for(
Int_t ipr=0; ipr<2; ipr++)
610 if(errdiffIP>0.) normdd0=diffIP/errdiffIP;
611 if(ipr==0) dd0pr1=normdd0;
612 if(ipr==1) dd0pr2=normdd0;
614 if(TMath::Abs(dd0pr1)>TMath::Abs(dd0pr2)) {dd0max=dd0pr1; dd0min=dd0pr2;}
615 else {dd0max=dd0pr2; dd0min=dd0pr1;}
624 cutVariableValue = invMassDifference;
631 cutVariableValue = invMassDelta;
638 cutVariableValue = pointingAngle;
645 cutVariableValue = dcaMother;
652 cutVariableValue = ptMother;
659 cutVariableValue = ptD0;
666 cutVariableValue = ptPion;
673 cutVariableValue = d0Mother;
680 cutVariableValue = d0firstTrack;
687 cutVariableValue = d0secondTrack;
694 cutVariableValue = impactProduct;
701 cutVariableValue = impactProductXY;
708 cutVariableValue = angleBetweenBothDaughters;
715 cutVariableValue = angleMotherFirstDaughter;
722 cutVariableValue = angleMotherSecondDaughter;
729 cutVariableValue = cosThetaStar;
736 cutVariableValue = vertexDistance;
743 cutVariableValue = pseudoProperDecayTime;
750 cutVariableValue = decayTime;
757 cutVariableValue = normalizedDecayTime;
764 cutVariableValue = normDecayLength;
771 cutVariableValue = dd0pr1;
778 cutVariableValue = dd0pr2;
785 cutVariableValue = dd0max;
792 cutVariableValue = dd0min;
799 cutVariableValue = cosPointingAngleXY;
806 cutVariableValue = distanceXYToVertex;
813 cutVariableValue = normalizedDecayLengthXY;
820 cutVariableValue = chi2Vertex;
830 if(bPassedCut==kFALSE)
835 for (
Int_t i = 39; i < 68; ++i)
837 if(bCutArray[i]==kTRUE){
855 cout<<
"Cut matrice not inizialized. Exit..."<<endl;
861 cout<<
"candidateBPlus null"<<endl;
867 cout<<
"candidateD0 null"<<endl;
871 AliAODTrack *candidatePion = (AliAODTrack*)candidateD0->GetDaughter(0);
873 cout<<
"candidatePion null 2"<<endl;
877 AliAODTrack *candidateKaon = (AliAODTrack*)candidateD0->GetDaughter(1);
879 cout<<
"candidateKaon null"<<endl;
883 AliAODVertex * vertexBPlus = candidateBPlus->GetSecondaryVtx();
885 cout<<
"vertexBPlus null"<<endl;
889 AliAODVertex * vertexD0 = candidateD0->GetSecondaryVtx();
891 cout<<
"vertexD0 null"<<endl;
895 AliAODVertex * primaryVertex = aod->GetPrimaryVertex();
897 cout<<
"primaryVertex null"<<endl;
902 Bool_t bPassedCut = kFALSE;
915 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
918 Int_t chargeBPlus = candidateBPlus->Charge();
925 else if (chargeBPlus==-1)
932 cout <<
"Wrong charge BPlus." << endl;
935 Double_t invMassD0 = candidateD0->InvMass(2,prongs);
936 Double_t invMassDifference = TMath::Abs(mD0PDG - invMassD0);
939 Double_t dcaMother = candidateD0->GetDCA();
940 Double_t ptMother = candidateD0->Pt();
941 Double_t momentumMother = candidateD0->P();
942 Double_t ptPion = candidatePion->Pt();
943 Double_t ptKaon = candidateKaon->Pt();
945 AliExternalTrackParam motherTrack;
946 motherTrack.CopyFromVTrack(candidateD0);
948 motherTrack.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
950 Double_t d0Mother = TMath::Abs(d0[0]);
951 Double_t d0firstTrack = TMath::Abs(candidateD0->Getd0Prong(0));
952 Double_t d0secondTrack = TMath::Abs(candidateD0->Getd0Prong(1));
957 Double_t angleBetweenBothDaughters = (candidateKaon->Px() * candidatePion->Px() + candidateKaon->Py() * candidatePion->Py() + candidateKaon->Pz() * candidatePion->Pz()) /(candidateKaon->P() * candidatePion->P());
958 Double_t angleMotherFirstDaughter = (candidateD0->Px() * candidatePion->Px() + candidateD0->Py() * candidatePion->Py() + candidateD0->Pz() * candidatePion->Pz()) /(candidateD0->P() * candidatePion->P());
959 Double_t angleMotherSecondDaughter = (candidateD0->Px() * candidateKaon->Px() + candidateD0->Py() * candidateKaon->Py() + candidateD0->Pz() * candidateKaon->Pz()) /(candidateD0->P() * candidateKaon->P());
961 Double_t cosThetaStar = candidateD0->CosThetaStar(0,421,211,321);
962 Double_t vertexDistance = vertexD0->DistanceToVertex(primaryVertex);
964 Double_t pdgMassMother = TDatabasePDG::Instance()->GetParticle(421)->Mass();
965 Double_t pseudoProperDecayLength = ((vertexD0->GetX() - primaryVertex->GetX()) * candidateD0->Px() / TMath::Abs(candidateD0->Pt())) + ((vertexD0->GetY() - primaryVertex->GetY()) * candidateD0->Py() / TMath::Abs(candidateD0->Pt()));
966 Double_t pseudoProperDecayTime = pseudoProperDecayLength * pdgMassMother/ptMother;
967 Double_t decayTime = vertexDistance / (299792458 * TMath::Sqrt(1/((pdgMassMother*pdgMassMother/(momentumMother*momentumMother)) + 1)));
970 Double_t theta = candidateD0->Theta();
972 candidateD0->GetCovarianceXYZPxPyPz(covMatrix);
979 Double_t errorMomentum = covMatrix[9]*cp*cp*ct*ct
980 +covMatrix[13]*2.*cp*sp*ct*ct
981 +covMatrix[18]*2.*cp*ct*st
982 +covMatrix[14]*sp*sp*ct*ct
983 +covMatrix[19]*2.*sp*ct*st
984 +covMatrix[20]*st*st;
985 Double_t normalizedDecayTime = candidateD0->
NormalizedDecayLength() / (299792458 * TMath::Sqrt(1/((pdgMassMother*pdgMassMother*errorMomentum*errorMomentum/(momentumMother*momentumMother)) + 1)));
988 Double_t distanceXYToVertex = vertexD0->DistanceXYToVertex(primaryVertex);
990 Double_t chi2Vertex = vertexD0->GetChi2perNDF();
998 for(
Int_t ipr=0; ipr<2; ipr++)
1003 if(errdiffIP>0.) normdd0=diffIP/errdiffIP;
1004 if(ipr==0) dd0pr1=normdd0;
1005 if(ipr==1) dd0pr2=normdd0;
1007 if(TMath::Abs(dd0pr1)>TMath::Abs(dd0pr2)) {dd0max=dd0pr1; dd0min=dd0pr2;}
1008 else {dd0max=dd0pr2; dd0min=dd0pr1;}
1012 Int_t nCutIndex = 0;
1017 cutVariableValue = invMassDifference;
1031 cutVariableValue = pointingAngle;
1038 cutVariableValue = dcaMother;
1045 cutVariableValue = ptMother;
1052 cutVariableValue = ptKaon;
1059 cutVariableValue = ptPion;
1066 cutVariableValue = d0Mother;
1073 cutVariableValue = d0firstTrack;
1080 cutVariableValue = d0secondTrack;
1087 cutVariableValue = impactProduct;
1094 cutVariableValue = impactProductXY;
1101 cutVariableValue = angleBetweenBothDaughters;
1108 cutVariableValue = angleMotherFirstDaughter;
1115 cutVariableValue = angleMotherSecondDaughter;
1122 cutVariableValue = cosThetaStar;
1129 cutVariableValue = vertexDistance;
1136 cutVariableValue = pseudoProperDecayTime;
1143 cutVariableValue = decayTime;
1150 cutVariableValue = normalizedDecayTime;
1157 cutVariableValue = normDecayLength;
1164 cutVariableValue = dd0pr1;
1171 cutVariableValue = dd0pr2;
1178 cutVariableValue = dd0max;
1185 cutVariableValue = dd0min;
1192 cutVariableValue = cosPointingAngleXY;
1199 cutVariableValue = distanceXYToVertex;
1206 cutVariableValue = normalizedDecayLengthXY;
1213 cutVariableValue = chi2Vertex;
1220 AliAODRecoDecay* candidateD0toBPlus = (AliAODRecoDecay*)candidateD0;
1221 AliExternalTrackParam pionD0Track;
1222 AliExternalTrackParam kaonD0Track;
1224 Double_t d0z0DSVert[2],covd0z0DSVert[3],d0DSVert[2];
1226 pionD0Track.CopyFromVTrack(candidatePion);
1227 pionD0Track.PropagateToDCA(vertexBPlus,bz,100.,d0z0DSVert,covd0z0DSVert);
1228 d0DSVert[0] = d0z0DSVert[0];
1230 kaonD0Track.CopyFromVTrack(candidateKaon);
1231 kaonD0Track.PropagateToDCA(vertexBPlus,bz,100.,d0z0DSVert,covd0z0DSVert);
1232 d0DSVert[1] = d0z0DSVert[0];
1234 AliExternalTrackParam D0Track;
1235 D0Track.CopyFromVTrack(candidateD0);
1236 Double_t d0z0D0DSVert[2],covd0z0D0DSVert[3],d0D0DSVert;
1237 motherTrack.PropagateToDCA(vertexBPlus,bz,100.,d0z0D0DSVert,covd0z0D0DSVert);
1238 d0D0DSVert = TMath::Abs(d0z0D0DSVert[0]);
1240 Double_t impactProductToBPlus = d0DSVert[0]*d0DSVert[1];
1241 Double_t impactProductXYToBPlus = candidateD0toBPlus->ImpParXY(vertexBPlus);
1243 Double_t pointingAngleToBPlus = candidateD0toBPlus->CosPointingAngle(vertexBPlus);
1244 Double_t d0FirstDaughterToBPlus = TMath::Abs(d0DSVert[0]);
1245 Double_t d0SecondDaughterToBPlus = TMath::Abs(d0DSVert[1]);
1246 Double_t normDecayLengthToBPlus = candidateD0toBPlus->NormalizedDecayLength(vertexBPlus);
1248 Double_t pseudoProperDecayLengthDSVert = ((vertexD0->GetX() - vertexBPlus->GetX()) * candidateD0->Px() / TMath::Abs(candidateD0->Pt())) + ((vertexD0->GetY() - vertexBPlus->GetY()) * candidateD0->Py() / TMath::Abs(candidateD0->Pt()));
1249 Double_t pseudoProperDecayTimeToBPlus = pseudoProperDecayLengthDSVert * pdgMassMother/ptMother;
1250 Double_t DecayTimeToBPlus = vertexDistance / (299792458 * TMath::Sqrt(1/((pdgMassMother*pdgMassMother/(momentumMother*momentumMother)) + 1)));
1252 Double_t phiDSVert = candidateD0->Phi();
1253 Double_t thetaDSVert = candidateD0->Theta();
1255 candidateD0->GetCovarianceXYZPxPyPz(covMatrixDSVert);
1257 cp = TMath::Cos(phiDSVert);
1258 sp = TMath::Sin(phiDSVert);
1259 ct = TMath::Cos(thetaDSVert);
1260 st = TMath::Sin(thetaDSVert);
1262 errorMomentum = covMatrix[9]*cp*cp*ct*ct
1263 +covMatrix[13]*2.*cp*sp*ct*ct
1264 +covMatrix[18]*2.*cp*ct*st
1265 +covMatrix[14]*sp*sp*ct*ct
1266 +covMatrix[19]*2.*sp*ct*st
1267 +covMatrix[20]*st*st;
1268 Double_t normalizedDecayTimeToBPlus = candidateD0toBPlus->NormalizedDecayLength(vertexBPlus) / (299792458 * TMath::Sqrt(1/((pdgMassMother*pdgMassMother*errorMomentum*errorMomentum/(momentumMother*momentumMother)) + 1)));
1272 cutVariableValue = pointingAngleToBPlus;
1279 cutVariableValue = d0D0DSVert;
1286 cutVariableValue = d0FirstDaughterToBPlus;
1293 cutVariableValue = d0SecondDaughterToBPlus;
1300 cutVariableValue = impactProductToBPlus;
1307 cutVariableValue = impactProductXYToBPlus;
1314 cutVariableValue = normDecayLengthToBPlus;
1321 cutVariableValue = pseudoProperDecayTimeToBPlus;
1328 cutVariableValue = DecayTimeToBPlus;
1335 cutVariableValue = normalizedDecayTimeToBPlus;
1341 for (
Int_t i = 0; i < 39; ++i)
1343 if(bCutArray[i]==kTRUE){
1358 cout<<
"Cut matrice not inizialized. Exit..."<<endl;
1364 cout<<
"candidateD0 null"<<endl;
1368 AliAODTrack *candidatePion = (AliAODTrack*)candidateD0->GetDaughter(0);
1370 cout<<
"candidatePion null 3"<<endl;
1374 AliAODTrack *candidateKaon = (AliAODTrack*)candidateD0->GetDaughter(1);
1376 cout<<
"candidateKaon null"<<endl;
1380 AliAODVertex * vertexD0 = candidateD0->GetSecondaryVtx();
1382 cout<<
"vertexD0 null"<<endl;
1386 AliAODVertex * primaryVertex = aod->GetPrimaryVertex();
1388 cout<<
"primaryVertex null"<<endl;
1392 Int_t returnvalue=1;
1393 Bool_t bPassedCut = kFALSE;
1404 if(ptbin==-1)
return -1;
1407 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
1411 prongs[0] = 211; prongs[1] = 321;
1412 Double_t invMassD0 = candidateD0->InvMass(2,prongs);
1413 Double_t invMassDifference = TMath::Abs(mD0PDG - invMassD0);
1416 prongs2[1] = 211; prongs2[0] = 321;
1417 Double_t invMassD02 = candidateD0->InvMass(2,prongs2);
1418 Double_t invMassDifference2 = TMath::Abs(mD0PDG - invMassD02);
1420 if(invMassDifference > invMassDifference2) invMassDifference = invMassDifference2;
1423 Double_t dcaMother = candidateD0->GetDCA();
1424 Double_t ptMother = candidateD0->Pt();
1425 Double_t momentumMother = candidateD0->P();
1426 Double_t ptPion = candidatePion->Pt();
1427 Double_t ptKaon = candidateKaon->Pt();
1429 AliExternalTrackParam motherTrack;
1430 motherTrack.CopyFromVTrack(candidateD0);
1432 motherTrack.PropagateToDCA(primaryVertex,bz,100.,d0z0,covd0z0);
1434 Double_t d0Mother = TMath::Abs(d0[0]);
1435 Double_t d0firstTrack = TMath::Abs(candidateD0->Getd0Prong(0));
1436 Double_t d0secondTrack = TMath::Abs(candidateD0->Getd0Prong(1));
1441 Double_t angleBetweenBothDaughters = (candidateKaon->Px() * candidatePion->Px() + candidateKaon->Py() * candidatePion->Py() + candidateKaon->Pz() * candidatePion->Pz()) /(candidateKaon->P() * candidatePion->P());
1442 Double_t angleMotherFirstDaughter = (candidateD0->Px() * candidatePion->Px() + candidateD0->Py() * candidatePion->Py() + candidateD0->Pz() * candidatePion->Pz()) /(candidateD0->P() * candidatePion->P());
1443 Double_t angleMotherSecondDaughter = (candidateD0->Px() * candidateKaon->Px() + candidateD0->Py() * candidateKaon->Py() + candidateD0->Pz() * candidateKaon->Pz()) /(candidateD0->P() * candidateKaon->P());
1445 Double_t cosThetaStar = candidateD0->CosThetaStar(0,421,211,321);
1446 Double_t vertexDistance = vertexD0->DistanceToVertex(primaryVertex);
1448 Double_t pdgMassMother = TDatabasePDG::Instance()->GetParticle(421)->Mass();
1449 Double_t pseudoProperDecayLength = ((vertexD0->GetX() - primaryVertex->GetX()) * candidateD0->Px() / TMath::Abs(candidateD0->Pt())) + ((vertexD0->GetY() - primaryVertex->GetY()) * candidateD0->Py() / TMath::Abs(candidateD0->Pt()));
1450 Double_t pseudoProperDecayTime = pseudoProperDecayLength * pdgMassMother/ptMother;
1451 Double_t decayTime = vertexDistance / (299792458 * TMath::Sqrt(1/((pdgMassMother*pdgMassMother/(momentumMother*momentumMother)) + 1)));
1454 Double_t theta = candidateD0->Theta();
1456 candidateD0->GetCovarianceXYZPxPyPz(covMatrix);
1463 Double_t errorMomentum = covMatrix[9]*cp*cp*ct*ct
1464 +covMatrix[13]*2.*cp*sp*ct*ct
1465 +covMatrix[18]*2.*cp*ct*st
1466 +covMatrix[14]*sp*sp*ct*ct
1467 +covMatrix[19]*2.*sp*ct*st
1468 +covMatrix[20]*st*st;
1469 Double_t normalizedDecayTime = candidateD0->
NormalizedDecayLength() / (299792458 * TMath::Sqrt(1/((pdgMassMother*pdgMassMother*errorMomentum*errorMomentum/(momentumMother*momentumMother)) + 1)));
1472 Double_t distanceXYToVertex = vertexD0->DistanceXYToVertex(primaryVertex);
1474 Double_t chi2Vertex = vertexD0->GetChi2perNDF();
1481 for(
Int_t ipr=0; ipr<2; ipr++)
1486 if(errdiffIP>0.) normdd0=diffIP/errdiffIP;
1487 if(ipr==0) dd0pr1=normdd0;
1488 if(ipr==1) dd0pr2=normdd0;
1490 if(TMath::Abs(dd0pr1)>TMath::Abs(dd0pr2)) {dd0max=dd0pr1; dd0min=dd0pr2;}
1491 else {dd0max=dd0pr2; dd0min=dd0pr1;}
1495 Int_t nCutIndex = 0;
1500 cutVariableValue = invMassDifference;
1514 cutVariableValue = pointingAngle;
1521 cutVariableValue = dcaMother;
1528 cutVariableValue = ptMother;
1535 cutVariableValue = ptKaon;
1542 cutVariableValue = ptPion;
1549 cutVariableValue = d0Mother;
1556 cutVariableValue = d0firstTrack;
1563 cutVariableValue = d0secondTrack;
1570 cutVariableValue = impactProduct;
1577 cutVariableValue = impactProductXY;
1584 cutVariableValue = angleBetweenBothDaughters;
1591 cutVariableValue = angleMotherFirstDaughter;
1598 cutVariableValue = angleMotherSecondDaughter;
1605 cutVariableValue = cosThetaStar;
1612 cutVariableValue = vertexDistance;
1619 cutVariableValue = pseudoProperDecayTime;
1626 cutVariableValue = decayTime;
1633 cutVariableValue = normalizedDecayTime;
1640 cutVariableValue = normDecayLength;
1647 cutVariableValue = dd0pr1;
1654 cutVariableValue = dd0pr2;
1661 cutVariableValue = dd0max;
1668 cutVariableValue = dd0min;
1675 cutVariableValue = cosPointingAngleXY;
1682 cutVariableValue = distanceXYToVertex;
1689 cutVariableValue = normalizedDecayLengthXY;
1696 cutVariableValue = chi2Vertex;
1703 for (
Int_t i = 0; i < 29; ++i)
1705 if(bCutArray[i]==kTRUE){
1793 if(!
fUsePID)
return isParticle;
1797 Bool_t TPCon=TMath::Abs(2)>1e-4?kTRUE:kFALSE;
1798 Bool_t TOFon=TMath::Abs(3)>1e-4?kTRUE:kFALSE;
1822 isParticle = isTPC&&isTOF;
1834 for (
Int_t i=0; i<5; i++) {
1835 if (prob[i]>max) {k=i; max=prob[i];}
1837 isParticle =
Bool_t(k==type);
1840 if (match == 10 || match == 11) {
1844 isParticle = checkTPC >= 0 && checkTOF >= 0 ? kTRUE : kFALSE;
1846 isParticle = isParticle && checkTPC+checkTOF >= 1 ? kTRUE : kFALSE;
1860 if (TPCok != -1 && TOFok != -1) {
1862 isParticle = TMath::Sqrt(nSigmaTPC*nSigmaTPC + nSigmaTOF*nSigmaTOF) <= radius ? kTRUE : kFALSE;
1867 isParticle = nSigmaTPC <= radius ? kTRUE : kFALSE;
1870 isParticle = nSigmaTOF <= radius ? kTRUE : kFALSE;
1889 if (BPlus->Charge() == -1)
1891 e[0] = D0->EProng(0, 211);
1892 e[1] = D0->EProng(1, 321);
1893 }
else if (BPlus->Charge() == 1) {
1894 e[0] = D0->EProng(0, 321);
1895 e[1] = D0->EProng(1, 211);
1897 e[2] = BPlus->EProng(0, 211);
1899 Double_t esum = e[0] + e[1] + e[2];
1900 Double_t invMassBPlus = TMath::Sqrt(esum * esum - BPlus->P2());
1904 if (BPlus->Charge() == -1) {invMassD0 = D0->
InvMassD0();}
1906 if (invMassD0 == -1) {cout <<
"wrong invmass delta D0 BPlus" << endl;}
1908 return invMassBPlus - invMassD0;
1925 AliFatal(
"exiting");
1929 AliFatal(
"exiting");
1943 cout<<
"Overflow, exit..."<<endl;
1961 AliFatal(
"exiting");
1992 printf(
"Changing the pt bins\n");
1996 cout<<
"Warning: ptBinLimits dimension "<<nPtBinLimits<<
" != nPtBins+1 ("<<
fnPtBinsD0forD0ptbin+1<<
")\nSetting nPtBins to "<<nPtBinLimits-1<<endl;
2022 if(bCut == kTRUE) {bCutArray[nCutIndex] = 1;
return 0;}
2040 if(bCut == kTRUE) {bCutArray[nCutIndex] = 1;
return 0;}
2060 for(
Int_t iv=0; iv<nVars; iv++) {
2090 cout<<
"Overflow, exit..."<<endl;
2122 cout<<
"Overflow, exit..."<<endl;
Bool_t GetIsCutUsed(Int_t nCutIndex, Int_t ptbin) const
Double_t NormalizedDecayLengthXY() const
Int_t fIsSelectedCuts
fix the daughter track references
Double_t fMaxAbsEtaBPlusPion
Int_t IsD0FromBPlusSelected(Double_t ptBPlus, TObject *obj, Int_t selectionLevel, AliAODEvent *aod, Bool_t bCutArray[68])
Double_t NormalizedDecayLength() const
Bool_t fUseTPCRefitD0FirstDaughter
Bool_t fUseFilterBitD0FirstDaughter
Int_t fFilterBitBPlusPion
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel, AliAODEvent *aod, Bool_t *bCutArray)
Bool_t GetIsCutUsedD0forD0ptbin(Int_t nCutIndex, Int_t ptbin) const
virtual ~AliRDHFCutsBPlustoD0Pi()
Bool_t GetIsUpperCutD0forD0ptbin(Int_t nCutIndex)
void SetHardSelectionArrayITSD0SecondDaughter(const Bool_t array[7]=0)
void Getd0MeasMinusExpProng(Int_t ip, Double_t magf, Double_t &d0diff, Double_t &errd0diff) const
Int_t GetnSigmaTOF(AliAODTrack *track, Int_t species, Double_t &sigma) const
Int_t GetGlobalIndexD0forD0ptbin(Int_t iVar, Int_t iPtBin) const
Bool_t fUseITSRefitD0SecondDaughter
Bool_t IsKaonRaw(AliAODTrack *track, TString detector) const
virtual Bool_t IsInFiducialAcceptance(Double_t pt, Double_t y) const
Bool_t fUseITSRefitD0FirstDaughter
Int_t fNSoftITSCutD0SecondDaughter
Float_t * fPtBinLimitsD0forD0ptbin
Int_t GetnSigmaTPC(AliAODTrack *track, Int_t species, Double_t &sigma) const
Bool_t fUseFilterBitBPlusPion
Double_t DeltaInvMassBPlusKpipi(AliAODRecoDecayHF2Prong *BPlus) const
Int_t fMinTPCNclsD0FirstDaughter
Double_t ImpParXY() const
void SetVarNamesD0forD0ptbin(Int_t nVars, TString *varNames, Bool_t *isUpperCut)
Int_t fFilterBitD0FirstDaughter
Bool_t fHardSelectionArrayITSD0SecondDaughter[7]
Bool_t fUseITSRefitBPlusPion
void SetNVars(Int_t nVars)
Bool_t fUseTPCRefitBPlusPion
Int_t fMinTPCNclsBPlusPion
Double_t CosPointingAngleXY() const
Bool_t * fIsUpperCutD0forD0ptbin
void SetIsCutUsedD0forD0ptbin(Int_t nCutIndex, Int_t ptbin, Bool_t isCutUsed)
Double_t InvMassD0() const
Int_t IsD0forD0ptbinSelected(TObject *obj, Int_t selectionLevel, AliAODEvent *aod, Bool_t *bCutArray)
Double_t Prodd0d0() const
Int_t fMinITSNclsD0FirstDaughter
AliRDHFCuts & operator=(const AliRDHFCuts &source)
Int_t fFilterBitD0SecondDaughter
Int_t fGlobalIndexD0forD0ptbin
Bool_t fHardSelectionArrayITSD0FirstDaughter[7]
Int_t fnPtBinLimitsD0forD0ptbin
virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d, Float_t *vars, Int_t nvars, Int_t *pdgdaughters)
Int_t ApplyCutOnVariableD0forD0ptbin(Int_t nCutIndex, Int_t ptbin, Float_t cutVariableValue, Bool_t bCutArray[29])
Int_t CheckBands(AliPID::EParticleType specie, AliPIDResponse::EDetector detector, AliAODTrack *track)
void SetNPtBinsD0forD0ptbin(Int_t nptBins)
Int_t fMinITSNclsBPlusPion
Int_t PtBinD0forD0ptbin(Double_t pt) const
Bool_t * GetIsUpperCut() const
Int_t fNSoftITSCutD0FirstDaughter
virtual Int_t IsSelectedPID(AliAODRecoDecayHF *rd)
Int_t fMinTPCNclsD0SecondDaughter
void SetSoftSelectionArrayITSD0SecondDaughter(const Bool_t array[7]=0)
Int_t fnPtBinsD0forD0ptbin
void SetGlobalIndexD0forD0ptbin()
Bool_t fHardSelectionArrayITSBPlusPion[7]
void SetCut(Int_t nCutIndex, Int_t ptBin, AliRDHFCutsBPlustoD0Pi::EUpperCut cutDirection, Float_t cutValue)
Bool_t CheckStatus(AliAODTrack *track, TString detectors) const
Bool_t fSoftSelectionArrayITSD0FirstDaughter[7]
void SetIsCutUsed(Int_t nCutIndex, Int_t ptbin, Bool_t isCutUsed)
AliRDHFCutsBPlustoD0Pi(const char *name="BPlustoD0PiCuts")
virtual Int_t SelectPID(AliAODTrack *track, Int_t type)
Int_t fNSoftITSCutBPlusPion
Bool_t * fIsCutUsedD0forD0ptbin
void SetSoftSelectionArrayITSBPlusPion(const Bool_t array[7]=0)
Int_t fIsSelectedPID
outcome of cuts selection
Bool_t fUseFilterBitD0SecondDaughter
Double_t fMaxAbsEtaD0FirstDaughter
Double_t InvMassD0bar() const
Double_t fMind0D0SecondDaughter
Bool_t fUseTPCRefitD0SecondDaughter
Float_t * fCutsRD
fnVars*fnPtBins
void SetHardSelectionArrayITSD0FirstDaughter(const Bool_t array[7]=0)
void SetVarsForOpt(Int_t nVars, Bool_t *forOpt)
Double_t fMinPtD0FirstDaughter
void SetVarNames(Int_t nVars, TString *varNames, Bool_t *isUpperCut)
Int_t GetNVarsD0forD0ptbin() const
Bool_t IsPionRaw(AliAODTrack *track, TString detector) const
Bool_t fSoftSelectionArrayITSBPlusPion[7]
Int_t fMinITSNclsD0SecondDaughter
void SetPtBins(Int_t nPtBinLimits, Float_t *ptBinLimits)
void SetHardSelectionArrayITSBPlusPion(const Bool_t array[7]=0)
void SetSoftSelectionArrayITSD0FirstDaughter(const Bool_t array[7]=0)
Double_t fMaxAbsEtaD0SecondDaughter
Double_t fMinPtD0SecondDaughter
void SetNVarsD0forD0ptbin(Int_t nVars)
void SetPtBinsD0forD0ptbin(Int_t nPtBinLimits, Float_t *ptBinLimits)
AliRDHFCutsBPlustoD0Pi & operator=(const AliRDHFCutsBPlustoD0Pi &source)
Double_t CosPointingAngle() const
Int_t fnPtBins
cuts on the candidate
TString * fVarNamesD0forD0ptbin
Double_t fMind0D0FirstDaughter
AliAODPidHF * fPidHF
enable AOD049 centrality cleanup
Int_t GetNPtBinsD0forD0ptbin() const
Float_t * fCutsRDD0forD0ptbin
Int_t PtBin(Double_t pt) const
Bool_t fSoftSelectionArrayITSD0SecondDaughter[7]
void SetCutD0forD0ptbin(Int_t nCutIndex, Int_t ptBin, AliRDHFCutsBPlustoD0Pi::EUpperCut cutDirection, Float_t cutValue)
Int_t GetGlobalIndex(Int_t iVar, Int_t iPtBin) const
Int_t ApplyCutOnVariable(Int_t nCutIndex, Int_t ptbin, Float_t cutVariableValue, Bool_t bCutArray[68])
void SetCutsD0forD0ptbin(Int_t nVars, Int_t nPtBins, Float_t **cutsRDD0forD0ptbin)
Bool_t fGetCutInfo
Radius for circular PID nsigma cut.