1 /**************************************************************************
2 * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 /////////////////////////////////////////////////////////////
20 // Class for cuts on AOD reconstructed Lc->p+K0s
22 // Modified by Y.S Watanabe - wyosuke@cns.s.u-tokyo.ac.jp
24 /////////////////////////////////////////////////////////////
26 #include <Riostream.h>
28 #include <TDatabasePDG.h>
31 #include "AliAnalysisManager.h"
32 #include "AliInputEventHandler.h"
33 #include "AliPIDResponse.h"
34 #include "AliRDHFCutsXicPlustoXiPiPifromAODtracks.h"
35 #include "AliAODRecoCascadeHF3Prong.h"
36 #include "AliAODTrack.h"
37 #include "AliESDtrack.h"
38 #include "AliESDVertex.h"
39 #include "AliAODVertex.h"
41 #include "AliAODcascade.h"
47 ClassImp(AliRDHFCutsXicPlustoXiPiPifromAODtracks)
49 //--------------------------------------------------------------------------
50 AliRDHFCutsXicPlustoXiPiPifromAODtracks::AliRDHFCutsXicPlustoXiPiPifromAODtracks(const char* name) :
52 fPIDStrategy(kNSigmaCuts),
53 fCombinedPIDThreshold(0.),
55 fProdTrackEtaRange(9999.),
56 fProdUseAODFilterBit(kTRUE),
57 fProdMassTolLambda(0.010),
58 fProdMassTolXi(0.008),
60 fProdRfidMaxV0(100.0),
62 fProdRfidMaxXi(100.0),
63 fProdLikeSignDcaMax(2.0),
64 fProdRoughMassTol(0.25),
71 // Default Constructor
76 TString varNames[nvars]={"Xic inv. mass [GeV/c2]", // 0
78 "Xi mass Tolrelance [GeV/c2]", //2
79 "Lambda mass Tolrelance [GeV/c2]", //3
80 "Max DCA pi-pi [cm]", //4
81 "Max DCA pi-casc [cm]",//5
84 "Min d0 Xi-Bach [cm]",//8
85 "Min d0 Xi-V0 [cm]",//9
87 "Min DecayLengthXY ",//11
91 Bool_t isUpperCut[nvars]={kTRUE, // 0
105 SetVarNames(nvars,varNames,isUpperCut);
106 Bool_t forOpt[nvars]={kFALSE, // 0
120 SetVarsForOpt(nvars,forOpt);
122 Float_t limits[2]={0,999999999.};
126 //--------------------------------------------------------------------------
127 AliRDHFCutsXicPlustoXiPiPifromAODtracks::AliRDHFCutsXicPlustoXiPiPifromAODtracks(const AliRDHFCutsXicPlustoXiPiPifromAODtracks &source) :
129 fPIDStrategy(source.fPIDStrategy),
130 fCombinedPIDThreshold(source.fCombinedPIDThreshold),
131 fProdTrackPtMin(source.fProdTrackPtMin),
132 fProdTrackEtaRange(source.fProdTrackEtaRange),
133 fProdUseAODFilterBit(source.fProdUseAODFilterBit),
134 fProdMassTolLambda(source.fProdMassTolLambda),
135 fProdMassTolXi(source.fProdMassTolXi),
136 fProdRfidMinV0(source.fProdRfidMinV0),
137 fProdRfidMaxV0(source.fProdRfidMaxV0),
138 fProdRfidMinXi(source.fProdRfidMinXi),
139 fProdRfidMaxXi(source.fProdRfidMaxXi),
140 fProdLikeSignDcaMax(source.fProdLikeSignDcaMax),
141 fProdRoughMassTol(source.fProdRoughMassTol),
142 fProdRoughPtMin(source.fProdRoughPtMin),
143 fnCuts(source.fnCuts),
144 fnTotalCutBins(source.fnTotalCutBins),
150 if(source.fCutsArray) SetCutsArray(source.fnTotalCutBins,source.fCutsArray);
153 //--------------------------------------------------------------------------
154 AliRDHFCutsXicPlustoXiPiPifromAODtracks &AliRDHFCutsXicPlustoXiPiPifromAODtracks::operator=(const AliRDHFCutsXicPlustoXiPiPifromAODtracks &source)
157 // assignment operator
160 if (this != &source) {
161 AliRDHFCuts::operator=(source);
164 fPIDStrategy = source.fPIDStrategy;
165 fCombinedPIDThreshold = source.fCombinedPIDThreshold;
166 fProdUseAODFilterBit = source.fProdUseAODFilterBit;
167 fProdTrackPtMin = source.fProdTrackPtMin;
168 fProdTrackEtaRange = source.fProdTrackEtaRange;
169 fProdMassTolLambda = source.fProdMassTolLambda;
170 fProdMassTolXi = source.fProdMassTolXi;
171 fProdRfidMinV0 = source.fProdRfidMinV0;
172 fProdRfidMaxV0 = source.fProdRfidMaxV0;
173 fProdRfidMinXi = source.fProdRfidMinXi;
174 fProdRfidMaxXi = source.fProdRfidMaxXi;
175 fProdLikeSignDcaMax = source.fProdLikeSignDcaMax;
176 fProdRoughMassTol = source.fProdRoughMassTol;
177 fProdRoughPtMin = source.fProdRoughPtMin;
178 fnCuts = source.fnCuts;
179 fnTotalCutBins = source.fnCuts;
180 if(source.fCutsArray) SetCutsArray(source.fnTotalCutBins,source.fCutsArray);
185 //---------------------------------------------------------------------------
186 AliRDHFCutsXicPlustoXiPiPifromAODtracks::~AliRDHFCutsXicPlustoXiPiPifromAODtracks() {
188 // Default Destructor
190 if(fCutsArray) delete[] fCutsArray;
193 //---------------------------------------------------------------------------
194 void AliRDHFCutsXicPlustoXiPiPifromAODtracks::GetCutVarsForOpt(AliAODRecoDecayHF *d, Float_t *vars, Int_t nvars, Int_t *pdgdaughters) {
196 // Fills in vars the values of the variables
199 if (pdgdaughters[0]==-9999) return; // dummy
201 AliAODRecoCascadeHF3Prong* dd=(AliAODRecoCascadeHF3Prong*)d;
203 AliDebug(2," No AliAODRecoCascadeHF3Prong object found\n");
207 if (nvars!=fnVarsForOpt) {
208 AliError("AliRDHFCutsXicPlustoXiPiPifromAODtracks wrong number of variables\n");
212 //Double_t ptD=d->Pt();
213 //Int_t ptbin=PtBin(ptD);
218 Double_t mxicPDG = TDatabasePDG::Instance()->GetParticle(4232)->Mass();
219 vars[iter]= TMath::Abs(dd->InvMassPiXiPi()-mxicPDG) ;
223 vars[iter]= dd->Pt();
227 Double_t mxiPDG = TDatabasePDG::Instance()->GetParticle(3312)->Mass();
228 vars[iter]= TMath::Abs(dd->CascMassXi()-mxiPDG);
232 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
233 vars[iter]= TMath::Abs(dd->CascMassLambda()-mLPDG);
247 vars[iter]= dd->Getd0Prong(0);
251 vars[iter]= dd->Getd0Prong(1);
255 vars[iter]= dd->CascDcaBachToPrimVertex();
259 vars[iter]= dd->CascDcaV0ToPrimVertex();
263 vars[iter]= dd->XicCosPointingAngle();
267 vars[iter]= dd->DecayLengthXY();
271 vars[iter]= dd->PtProng(0);
276 //---------------------------------------------------------------------------
277 Int_t AliRDHFCutsXicPlustoXiPiPifromAODtracks::IsSelected(TObject* obj,Int_t selectionLevel)
284 AliFatal("Cut matrice not inizialized. Exit...");
288 AliAODRecoCascadeHF3Prong* d=(AliAODRecoCascadeHF3Prong*)obj;
290 AliDebug(2," No AliAODRecoCascadeHF3Prong object found\n");
294 Double_t ptD=d->Pt();
295 if(ptD<fMinPtCand) return 0;
296 if(ptD>fMaxPtCand) return 0;
298 if (selectionLevel==AliRDHFCuts::kAll ||
299 selectionLevel==AliRDHFCuts::kTracks) {
300 //Performed in production stage
303 Int_t returnvalueCuts=1;
304 // selection on candidate
305 if (selectionLevel==AliRDHFCuts::kAll ||
306 selectionLevel==AliRDHFCuts::kCandidate) {
309 Int_t ptbin=PtBin(pt);
315 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
316 Double_t mxiPDG = TDatabasePDG::Instance()->GetParticle(3312)->Mass();
317 Double_t mxicPDG = TDatabasePDG::Instance()->GetParticle(4232)->Mass();
318 if(TMath::Abs(d->InvMassPiXiPi()-mxicPDG) > fCutsRD[GetGlobalIndex(0,ptbin)])
322 if(d->Pt()< fCutsRD[GetGlobalIndex(1,ptbin)])
326 if(TMath::Abs(d->CascMassXi()-mxiPDG) > fCutsRD[GetGlobalIndex(2,ptbin)])
330 if((TMath::Abs(d->CascMassLambda()-mLPDG) > fCutsRD[GetGlobalIndex(3,ptbin)]) &&(TMath::Abs(d->CascMassAntiLambda()-mLPDG) > fCutsRD[GetGlobalIndex(3,ptbin)]) )
336 if(TMath::Abs(dca[2]) > fCutsRD[GetGlobalIndex(4,ptbin)])
340 if((TMath::Abs(dca[0]) > fCutsRD[GetGlobalIndex(5,ptbin)]) && (TMath::Abs(dca[1]) > fCutsRD[GetGlobalIndex(5,ptbin)]) )
344 if((TMath::Abs(d->Getd0Prong(0)) > fCutsRD[GetGlobalIndex(6,ptbin)]) && (TMath::Abs(d->Getd0Prong(2)) > fCutsRD[GetGlobalIndex(6,ptbin)]) )
348 if((TMath::Abs(d->Getd0Prong(1)) > fCutsRD[GetGlobalIndex(7,ptbin)]))
352 if((TMath::Abs(d->CascDcaBachToPrimVertex()) < fCutsRD[GetGlobalIndex(8,ptbin)]))
356 if((TMath::Abs(d->CascDcaV0ToPrimVertex()) < fCutsRD[GetGlobalIndex(9,ptbin)]))
360 if( d->XicCosPointingAngle() < fCutsRD[GetGlobalIndex(10,ptbin)])
364 if( d->DecayLengthXY() < fCutsRD[GetGlobalIndex(11,ptbin)])
368 if( d->PtProng(0) < fCutsRD[GetGlobalIndex(12,ptbin)] || d->PtProng(2) < fCutsRD[GetGlobalIndex(12,ptbin)] )
373 if(!okcand) return 0;
377 Int_t returnvaluePID=1;
378 if(selectionLevel==AliRDHFCuts::kAll ||
379 selectionLevel==AliRDHFCuts::kCandidate||
380 selectionLevel==AliRDHFCuts::kPID) {
382 switch(fPIDStrategy){
384 returnvaluePID = IsSelectedPID(d);
387 returnvaluePID = IsSelectedCombinedPID(d);
392 Int_t returnvalue = 0;
393 if(returnvalueCuts==1 && returnvaluePID==1) returnvalue=1;
398 //---------------------------------------------------------------------------
399 Int_t AliRDHFCutsXicPlustoXiPiPifromAODtracks::IsSelectedPID(AliAODRecoDecayHF* obj)
405 if(!fUsePID || !obj) return 1;
407 AliAODRecoCascadeHF3Prong* dd=(AliAODRecoCascadeHF3Prong*)obj;
408 AliAODTrack *part1 = dd->GetBachelor1();
409 AliAODTrack *part2 = dd->GetBachelor2();
413 if(fPidHF->GetPidResponse()==0x0){
414 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
415 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
416 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
417 fPidHF->SetPidResponse(pidResp);
420 Int_t isPion1=fPidHF->MakeRawPid(part1,2);
421 Int_t isPion2=fPidHF->MakeRawPid(part2,2);
423 if(isPion1<1) returnvalue = 0;
424 if(isPion2<1) returnvalue = 0;
429 //---------------------------------------------------------------------------
430 Int_t AliRDHFCutsXicPlustoXiPiPifromAODtracks::IsSelectedCombinedPID(AliAODRecoDecayHF* obj) {
432 // Combined PID selection
435 if(!fUsePID || !obj) {return 1;}
437 AliAODRecoCascadeHF3Prong* dd=(AliAODRecoCascadeHF3Prong*)obj;
438 AliAODTrack *part1 = dd->GetBachelor1();
439 AliAODTrack *part2 = dd->GetBachelor2();
440 if(!part1||!part2) return 0;
443 Double_t probPion1 = GetPionProbabilityTPCTOF(part1);
444 Double_t probPion2 = GetPionProbabilityTPCTOF(part2);
445 if(probPion1<fCombinedPIDThreshold) returnvalue = 0;
446 if(probPion2<fCombinedPIDThreshold) returnvalue = 0;
450 //________________________________________________________________________
451 Double_t AliRDHFCutsXicPlustoXiPiPifromAODtracks::GetPionProbabilityTPCTOF(AliAODTrack* trk)
454 // Get Pion Probablility
456 //fPidHF->GetPidCombined()->SetDefaultTPCPriors();
457 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
458 Double_t prob1[AliPID::kSPECIES];
459 UInt_t detUsed1 = fPidHF->GetPidCombined()->ComputeProbabilities(trk, fPidHF->GetPidResponse(), prob1);
460 if (detUsed1 != (UInt_t)fPidHF->GetPidCombined()->GetDetectorMask() )
462 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
463 detUsed1 = fPidHF->GetPidCombined()->ComputeProbabilities(trk, fPidHF->GetPidResponse(), prob1);
465 return prob1[AliPID::kPion];
468 //________________________________________________________________________
469 Bool_t AliRDHFCutsXicPlustoXiPiPifromAODtracks::SingleTrkCuts(AliAODTrack *trk)
475 if(trk->GetStatus()&AliESDtrack::kITSpureSA) return kFALSE;
476 if(!(trk->GetStatus()&AliESDtrack::kITSin)) return kFALSE;
478 if(fProdUseAODFilterBit && !trk->TestFilterMask(BIT(4))) return kFALSE;
479 // if(!fAnalCuts->IsDaughterSelected(trk,fV1,esdTrackCuts)) return kFALSE;
480 if(fabs(trk->Eta())>fProdTrackEtaRange) return kFALSE;
481 if(trk->Pt()<fProdTrackPtMin) return kFALSE;
486 //________________________________________________________________________
487 Bool_t AliRDHFCutsXicPlustoXiPiPifromAODtracks::SingleCascadeCuts(AliAODcascade *casc)
490 // Single Cascade Cut
493 if(!casc) return kFALSE;
495 AliAODTrack *ptrack = (AliAODTrack*) (casc->GetDaughter(0));
496 AliAODTrack *ntrack = (AliAODTrack*) (casc->GetDaughter(1));
497 AliAODTrack *btrack = (AliAODTrack*) (casc->GetDecayVertexXi()->GetDaughter(0));
499 if(!ptrack||!ntrack||!btrack) return kFALSE;
501 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
502 Double_t mxiPDG = TDatabasePDG::Instance()->GetParticle(3312)->Mass();
504 Double_t massLambda = casc->MassLambda();
505 Double_t massAntiLambda = casc->MassAntiLambda();
506 if(TMath::Abs(massLambda-mLPDG)>fProdMassTolLambda && TMath::Abs(massAntiLambda-mLPDG)>fProdMassTolLambda)
509 Double_t massXi = casc->MassXi();
510 if(TMath::Abs(massXi-mxiPDG)>fProdMassTolXi)
514 lPosXi[0] = casc->DecayVertexXiX();
515 lPosXi[1] = casc->DecayVertexXiY();
516 lPosXi[2] = casc->DecayVertexXiZ();
517 Double_t decayvertXi = TMath::Sqrt(lPosXi[0]*lPosXi[0]+lPosXi[1]*lPosXi[1]);
519 lPosV0[0] = casc->DecayVertexV0X();
520 lPosV0[1] = casc->DecayVertexV0Y();
521 lPosV0[2] = casc->DecayVertexV0Z();
522 Double_t decayvertV0 = TMath::Sqrt(lPosV0[0]*lPosV0[0]+lPosV0[1]*lPosV0[1]);
524 if(decayvertV0<fProdRfidMinV0 || decayvertV0>fProdRfidMaxV0) return kFALSE;
525 if(decayvertXi<fProdRfidMinXi || decayvertXi>fProdRfidMaxXi) return kFALSE;
530 //________________________________________________________________________
531 Bool_t AliRDHFCutsXicPlustoXiPiPifromAODtracks::SelectWithRoughCuts(AliAODcascade *casc, AliAODTrack *part1, AliAODTrack *part2)
534 // Select With Rough mass and pT cut before object creation
538 Double_t mpiPDG = TDatabasePDG::Instance()->GetParticle(211)->Mass();
539 Double_t mxiPDG = TDatabasePDG::Instance()->GetParticle(3312)->Mass();
540 Double_t mxicPDG = TDatabasePDG::Instance()->GetParticle(4232)->Mass();
542 Double_t pxpi1_init = part1->Px();
543 Double_t pypi1_init = part1->Py();
544 Double_t pzpi1_init = part1->Pz();
545 Double_t Epi1_init = sqrt(pxpi1_init*pxpi1_init+pypi1_init*pypi1_init+pzpi1_init*pzpi1_init+mpiPDG*mpiPDG);
546 Double_t pxpi2_init = part2->Px();
547 Double_t pypi2_init = part2->Py();
548 Double_t pzpi2_init = part2->Pz();
549 Double_t Epi2_init = sqrt(pxpi2_init*pxpi2_init+pypi2_init*pypi2_init+pzpi2_init*pzpi2_init+mpiPDG*mpiPDG);
550 Double_t pxcasc_init = casc->MomXiX();
551 Double_t pycasc_init = casc->MomXiY();
552 Double_t pzcasc_init = casc->MomXiZ();
553 Double_t Ecasc_init = sqrt(pxcasc_init*pxcasc_init+pycasc_init*pycasc_init+pzcasc_init*pzcasc_init+mxiPDG*mxiPDG);
554 Double_t pxxic_init = pxpi1_init+pxpi2_init+pxcasc_init;
555 Double_t pyxic_init = pypi1_init+pypi2_init+pycasc_init;
556 Double_t pzxic_init = pzpi1_init+pzpi2_init+pzcasc_init;
557 Double_t Exic_init = Epi1_init+Epi2_init+Ecasc_init;
558 Double_t xicmass_init = sqrt(Exic_init*Exic_init-pxxic_init*pxxic_init-pyxic_init*pyxic_init-pzxic_init*pzxic_init);
560 if(xicmass_init<mxicPDG-fProdRoughMassTol || xicmass_init>mxicPDG+fProdRoughMassTol) return kFALSE;
561 if(sqrt(pxxic_init*pxxic_init+pyxic_init*pyxic_init)<fProdRoughPtMin) return kFALSE;
566 //________________________________________________________________________
567 void AliRDHFCutsXicPlustoXiPiPifromAODtracks::SetCutsArray(Int_t nCuts, Int_t nVars, Int_t nPtBins, Float_t ***cutsArray)
573 AliError(" wrong number of variables\n");
577 AliError(" wrong number of cuts\n");
580 if (nPtBins!=fnPtBins) {
581 AliError(" wrong number of pT bins\n");
587 fnTotalCutBins = nCuts * nVars * nPtBins;
588 fCutsArray = new Float_t[fnTotalCutBins];
591 for(Int_t icuts=0;icuts<nCuts;icuts++){
592 for(Int_t iv=0;iv<nVars;iv++){
593 for(Int_t ip=0;ip<nPtBins;ip++){
594 Int_t gid = GetCutArrayID(icuts,iv,ip);
595 fCutsArray[gid] = cutsArray[icuts][iv][ip];
602 //________________________________________________________________________
603 void AliRDHFCutsXicPlustoXiPiPifromAODtracks::SetCutsArray(Int_t nTotBins, Float_t *cutsArray)
608 if (nTotBins!=fnVars*fnPtBins*fnCuts) {
609 AliError(" wrong number of variables\n");
615 fnTotalCutBins = fnCuts * fnVars * fnPtBins;
616 fCutsArray = new Float_t[fnTotalCutBins];
619 for(Int_t i=0;i<nTotBins;i++){
620 fCutsArray[i] = cutsArray[i];
626 //________________________________________________________________________
627 void AliRDHFCutsXicPlustoXiPiPifromAODtracks::SetCutsFromArray(Int_t iCuts)
634 cutsarray=new Float_t*[fnVars];
635 for(Int_t ic=0;ic<fnVars;ic++){cutsarray[ic]=new Float_t[fnPtBins];}
637 for(Int_t i=0;i<fnVars;i++){
638 for(Int_t j=0;j<fnPtBins;j++){
639 Int_t gid = GetCutArrayID(iCuts,i,j);
640 cutsarray[i][j] = fCutsArray[gid];
643 SetCuts(fnVars,fnPtBins,cutsarray);
645 for(Int_t ic=0;ic<fnVars;ic++){
646 delete[] cutsarray[ic];
651 //________________________________________________________________________
652 Int_t AliRDHFCutsXicPlustoXiPiPifromAODtracks::GetCutArrayID(Int_t ic, Int_t iv, Int_t ip)
655 // Get GlobalIndex of fCutsArray
657 return ic*fnVars*fnPtBins+iv*fnPtBins+ip;