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->pKpi
22 // Author: A.Dainese, andrea.dainese@pd.infn.it
23 /////////////////////////////////////////////////////////////
25 #include <TDatabasePDG.h>
26 #include <Riostream.h>
28 #include "AliRDHFCutsLctopKpi.h"
29 #include "AliAODRecoDecayHF3Prong.h"
30 #include "AliRDHFCuts.h"
31 #include "AliAODTrack.h"
32 #include "AliESDtrack.h"
33 #include "AliKFParticle.h"
34 #include "AliESDVertex.h"
39 ClassImp(AliRDHFCutsLctopKpi)
41 //--------------------------------------------------------------------------
42 AliRDHFCutsLctopKpi::AliRDHFCutsLctopKpi(const char* name) :
46 fUseImpParProdCorrCut(kFALSE),
47 fPIDStrategy(kNSigma),
48 fCutsStrategy(kStandard),
49 fUseSpecialCut(kFALSE)
52 // Default Constructor
56 TString varNames[13]={"inv. mass [GeV]",
59 "d0K [cm] lower limit!",
60 "d0Pi [cm] lower limit!",
64 "pM=Max{pT1,pT2,pT3} (GeV/c)",
68 "cut on pTpion [GeV/c]"};
69 Bool_t isUpperCut[13]={kTRUE,
83 SetVarNames(nvars,varNames,isUpperCut);
84 Bool_t forOpt[13]={kFALSE,
97 SetVarsForOpt(4,forOpt);
98 Float_t limits[2]={0,999999999.};
100 for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies)
101 fPIDThreshold[ispecies]=0.;
103 //--------------------------------------------------------------------------
104 AliRDHFCutsLctopKpi::AliRDHFCutsLctopKpi(const AliRDHFCutsLctopKpi &source) :
108 fUseImpParProdCorrCut(source.fUseImpParProdCorrCut),
109 fPIDStrategy(source.fPIDStrategy),
110 fCutsStrategy(source.fCutsStrategy),
111 fUseSpecialCut(source.fUseSpecialCut)
116 if (source.fPidObjprot) fPidObjprot = new AliAODPidHF(*(source.fPidObjprot));
117 else fPidObjprot = new AliAODPidHF();
118 if (source.fPidObjpion) fPidObjpion = new AliAODPidHF(*(source.fPidObjpion));
119 else fPidObjpion = new AliAODPidHF();
120 memcpy(fPIDThreshold,source.fPIDThreshold,AliPID::kSPECIES*sizeof(Double_t));
122 //--------------------------------------------------------------------------
123 AliRDHFCutsLctopKpi &AliRDHFCutsLctopKpi::operator=(const AliRDHFCutsLctopKpi &source)
126 // assignment operator
128 if(this != &source) {
130 AliRDHFCuts::operator=(source);
132 fPidObjprot = new AliAODPidHF(*(source.fPidObjprot));
134 fPidObjpion = new AliAODPidHF(*(source.fPidObjpion));
135 fPIDStrategy=source.fPIDStrategy;
136 fCutsStrategy=source.fCutsStrategy;
137 memcpy(fPIDThreshold,source.fPIDThreshold,AliPID::kSPECIES*sizeof(Double_t));
142 //---------------------------------------------------------------------------
143 AliRDHFCutsLctopKpi::~AliRDHFCutsLctopKpi() {
145 // // Default Destructor
158 //---------------------------------------------------------------------------
159 void AliRDHFCutsLctopKpi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters, AliAODEvent *aod) {
161 // Fills in vars the values of the variables
164 if(nvars!=fnVarsForOpt) {
165 printf("AliRDHFCutsLctopKpi::GetCutsVarsForOpt: wrong number of variables\n");
169 AliAODRecoDecayHF3Prong *dd = (AliAODRecoDecayHF3Prong*)d;
174 vars[iter]=dd->InvMassLcpKpi();
178 for(Int_t iprong=0;iprong<3;iprong++){
179 if(TMath::Abs(pdgdaughters[iprong])==321) {
180 vars[iter]=dd->PtProng(iprong);
186 for(Int_t iprong=0;iprong<3;iprong++){
187 if(TMath::Abs(pdgdaughters[iprong])==2212) {
188 vars[iter]=dd->PtProng(iprong);
194 for(Int_t iprong=0;iprong<3;iprong++){
195 if(TMath::Abs(pdgdaughters[iprong])==2212) {
196 vars[iter]=dd->Getd0Prong(iprong);
202 for(Int_t iprong=0;iprong<3;iprong++){
203 if(TMath::Abs(pdgdaughters[iprong])==211) {
204 vars[iter]=dd->Getd0Prong(iprong);
210 vars[iter]=dd->GetDist12toPrim();
214 vars[iter]=dd->GetSigmaVert(aod);
218 vars[iter] = dd->DecayLength();
223 for(Int_t i=0;i<3;i++){
224 if(dd->PtProng(i)>ptmax)ptmax=dd->PtProng(i);
230 vars[iter]=dd->CosPointingAngle();
234 vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
238 vars[iter]=dd->GetDCA();
242 for(Int_t iprong=0;iprong<3;iprong++){
243 if(TMath::Abs(pdgdaughters[iprong])==211) {
244 vars[iter]=dd->PtProng(iprong);
251 //---------------------------------------------------------------------------
252 Int_t AliRDHFCutsLctopKpi::IsSelected(TObject* obj,Int_t selectionLevel,AliAODEvent *aod) {
258 cout<<"Cut matrice not inizialized. Exit..."<<endl;
262 AliAODRecoDecayHF3Prong* d=(AliAODRecoDecayHF3Prong*)obj;
265 cout<<"AliAODRecoDecayHF3Prong null"<<endl;
270 if(fKeepSignalMC) if(IsSignalMC(d,aod,4122)) return 3;
273 Int_t returnvaluePID=3;
275 if(d->Pt()<fMinPtCand) return 0;
276 if(d->Pt()>fMaxPtCand) return 0;
278 if(fUseTrackSelectionWithFilterBits && d->HasBadDaughters()) return 0;
280 if(selectionLevel==AliRDHFCuts::kAll ||
281 selectionLevel==AliRDHFCuts::kCandidate||
282 selectionLevel==AliRDHFCuts::kPID) {
283 switch (fPIDStrategy) {
285 returnvaluePID = IsSelectedPID(d);
289 returnvaluePID = IsSelectedCombinedPID(d);
292 returnvaluePID = IsSelectedCombinedPIDSoft(d);
295 fIsSelectedPID=returnvaluePID;
297 // if(fUsePID || selectionLevel==AliRDHFCuts::kPID) returnvaluePID = IsSelectedCombinedPID(d); // to test!!
298 if(returnvaluePID==0) return 0;
300 // selection on candidate
301 if(selectionLevel==AliRDHFCuts::kAll ||
302 selectionLevel==AliRDHFCuts::kCandidate) {
306 Int_t ptbin=PtBin(pt);
308 Double_t mLcpKpi,mLcpiKp;
309 Int_t okLcpKpi=1,okLcpiKp=1;
311 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
313 mLcpKpi=d->InvMassLcpKpi();
314 mLcpiKp=d->InvMassLcpiKp();
316 if(TMath::Abs(mLcpKpi-mLcPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okLcpKpi = 0;
317 if(TMath::Abs(mLcpiKp-mLcPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okLcpiKp = 0;
318 if(!okLcpKpi && !okLcpiKp) return 0;
320 switch (fCutsStrategy) {
323 if(TMath::Abs(d->PtProng(1)) < fCutsRD[GetGlobalIndex(1,ptbin)] || TMath::Abs(d->Getd0Prong(1))<fCutsRD[GetGlobalIndex(3,ptbin)]) return 0;//Kaon
324 if(d->Pt()>=3. && d->PProng(1)<0.55) return 0;
326 if(TMath::Abs(d->PtProng(0)) < TMath::Abs(d->PtProng(2)) )okLcpKpi=0;
327 if(TMath::Abs(d->PtProng(2)) < TMath::Abs(d->PtProng(0)) )okLcpiKp=0;
329 if((TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(2,ptbin)]) || (TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(12,ptbin)])) okLcpKpi=0;
330 if((TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(2,ptbin)]) || (TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(12,ptbin)]))okLcpiKp=0;
331 if(!okLcpKpi && !okLcpiKp) return 0;
333 if(d->GetDist12toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]|| d->GetDist23toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]) return 0;
334 if(d->GetDist12toPrim()>0.5) return 0;
335 if(d->GetDist23toPrim()>0.5) return 0;
336 if(fUseImpParProdCorrCut){
337 if(d->Getd0Prong(0)*d->Getd0Prong(1)<0. && d->Getd0Prong(2)*d->Getd0Prong(1)<0.) return 0;
340 if(d->DecayLength()<fCutsRD[GetGlobalIndex(7,ptbin)]) return 0;
341 if(d->DecayLength()>0.5) return 0;
343 // Double_t sumd0s=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
344 // if(sumd0s<fCutsRD[GetGlobalIndex(10,ptbin)]) return 0;
345 if((d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(10,ptbin)]) return 0;
347 if(TMath::Abs(d->PtProng(0))<fCutsRD[GetGlobalIndex(8,ptbin)] && TMath::Abs(d->PtProng(1))<fCutsRD[GetGlobalIndex(8,ptbin)] && TMath::Abs(d->PtProng(2))<fCutsRD[GetGlobalIndex(8,ptbin)]) return 0;
348 if(d->CosPointingAngle()< fCutsRD[GetGlobalIndex(9,ptbin)]) return 0;
349 if(d->GetSigmaVert(aod)>fCutsRD[GetGlobalIndex(6,ptbin)]) return 0;
352 for(Int_t i=0;i<3;i++) if(d->GetDCA(i)>fCutsRD[GetGlobalIndex(11,ptbin)]) return 0;
357 Int_t pdgs[3]={0,321,0};
358 Bool_t constraint=kFALSE;
359 if(fCutsRD[GetGlobalIndex(1,ptbin)]>0.) constraint=kTRUE;
360 Double_t field=aod->GetMagneticField();
361 if (returnvaluePID==1 || returnvaluePID==3){
363 pdgs[0]=2122;pdgs[2]=211;
364 AliKFParticle *lc1=ReconstructKF(d,pdgs,field,constraint);
368 if(lc1->GetChi2()/lc1->GetNDF()>fCutsRD[GetGlobalIndex(2,ptbin)]) okLcpKpi=0;
370 } else if(returnvaluePID>=2){
372 pdgs[0]=211;pdgs[2]=2212;
373 AliKFParticle *lc2=ReconstructKF(d,pdgs,field,constraint);
377 if(lc2->GetChi2()/lc2->GetNDF()>fCutsRD[GetGlobalIndex(2,ptbin)])okLcpiKp=0;
384 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
385 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
386 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
390 // selection on daughter tracks
391 if(selectionLevel==AliRDHFCuts::kAll ||
392 selectionLevel==AliRDHFCuts::kTracks) {
393 if(!AreDaughtersSelected(d)) return 0;
397 Int_t returnvalueTot=CombinePIDCuts(returnvalue,returnvaluePID);
398 return returnvalueTot;
400 //---------------------------------------------------------------------------
401 Int_t AliRDHFCutsLctopKpi::IsSelectedPID(AliAODRecoDecayHF* obj) {
404 if(!fUsePID || !obj) return 3;
405 Int_t okLcpKpi=0,okLcpiKp=0;
407 Bool_t isPeriodd=fPidHF->GetOnePad();
408 Bool_t isMC=fPidHF->GetMC();
409 Bool_t ispion0=kTRUE,ispion2=kTRUE;
410 Bool_t isproton0=kFALSE,isproton2=kFALSE;
411 Bool_t iskaon1=kFALSE;
413 fPidObjprot->SetOnePad(kTRUE);
414 fPidObjpion->SetOnePad(kTRUE);
417 fPidObjprot->SetMC(kTRUE);
418 fPidObjpion->SetMC(kTRUE);
421 for(Int_t i=0;i<3;i++){
422 AliAODTrack *track=(AliAODTrack*)obj->GetDaughter(i);
426 fPidHF->SetTOF(kFALSE);
427 fPidHF->SetTOFdecide(kFALSE);
430 Int_t isKaon=fPidHF->MakeRawPid(track,3);
431 if(isKaon>=1) iskaon1=kTRUE;
433 fPidHF->SetTOF(kTRUE);
434 fPidHF->SetTOFdecide(kTRUE);
437 if(!iskaon1) return 0;
442 fPidObjprot->SetTOF(kFALSE);
443 fPidObjprot->SetTOFdecide(kFALSE);
446 Int_t isProton=fPidObjprot->MakeRawPid(track,4);
449 Int_t isPion=fPidObjpion->MakeRawPid(track,2);
452 fPidObjprot->SetTOF(kTRUE);
453 fPidObjprot->SetTOFdecide(kTRUE);
458 if(isPion<0) ispion0=kFALSE;
459 if(isProton>=1) isproton0=kTRUE;
462 if(!ispion0 && !isproton0) return 0;
464 if(isPion<0) ispion2=kFALSE;
465 if(isProton>=1) isproton2=kTRUE;
471 if(ispion2 && isproton0 && iskaon1) okLcpKpi=1;
472 if(ispion0 && isproton2 && iskaon1) okLcpiKp=1;
473 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
474 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
475 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
479 //---------------------------------------------------------------------------
480 Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPID(AliAODRecoDecayHF* obj) {
482 // Printf(" -------- IsSelectedCombinedPID --------------");
485 if(!fUsePID || !obj) {return 3;}
486 Int_t okLcpKpi=0,okLcpiKp=0;
488 Bool_t isPeriodd=fPidHF->GetOnePad();
489 Bool_t isMC=fPidHF->GetMC();
492 fPidObjprot->SetOnePad(kTRUE);
493 fPidObjpion->SetOnePad(kTRUE);
496 fPidObjprot->SetMC(kTRUE);
497 fPidObjpion->SetMC(kTRUE);
500 AliVTrack *track0=dynamic_cast<AliVTrack*>(obj->GetDaughter(0));
501 AliVTrack *track1=dynamic_cast<AliVTrack*>(obj->GetDaughter(1));
502 AliVTrack *track2=dynamic_cast<AliVTrack*>(obj->GetDaughter(2));
503 if (!track0 || !track1 || !track2) return 0;
504 Double_t prob0[AliPID::kSPECIES];
505 Double_t prob1[AliPID::kSPECIES];
506 Double_t prob2[AliPID::kSPECIES];
507 if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
508 fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
509 if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
511 if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
512 fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
513 if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
515 if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
516 fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
517 if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
519 if(fPIDThreshold[AliPID::kPion]>0. && fPIDThreshold[AliPID::kKaon]>0. && fPIDThreshold[AliPID::kProton]>0.){
520 okLcpiKp= (prob0[AliPID::kPion ]>fPIDThreshold[AliPID::kPion ])
521 &&(prob1[AliPID::kKaon ]>fPIDThreshold[AliPID::kKaon ])
522 &&(prob2[AliPID::kProton]>fPIDThreshold[AliPID::kProton]);
523 okLcpKpi= (prob0[AliPID::kProton]>fPIDThreshold[AliPID::kProton])
524 &&(prob1[AliPID::kKaon ]>fPIDThreshold[AliPID::kKaon ])
525 &&(prob2[AliPID::kPion ]>fPIDThreshold[AliPID::kPion ]);
530 if(TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]){
531 if(TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) okLcpKpi = 1;
532 if(TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) okLcpiKp = 1;
536 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
537 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
538 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
542 //-----------------------
543 Int_t AliRDHFCutsLctopKpi::CombinePIDCuts(Int_t returnvalue, Int_t returnvaluePID) const {
545 Int_t returnvalueTot=0;
546 Int_t okLcpKpi=0,okLcpiKp=0;
547 if(returnvaluePID==1){
548 if(returnvalue==1 || returnvalue==3) okLcpKpi=1;
550 if(returnvaluePID==2){
551 if(returnvalue>=2) okLcpiKp=1;
553 if(returnvaluePID==3 && returnvalue>0){
554 if(returnvalue==1 || returnvalue==3) okLcpKpi=1;
555 if(returnvalue>=2) okLcpiKp=1;
558 if(okLcpKpi) returnvalueTot=1; //cuts passed as Lc->pKpi
559 if(okLcpiKp) returnvalueTot=2; //cuts passed as Lc->piKp
560 if(okLcpKpi && okLcpiKp) returnvalueTot=3; //cuts passed as both pKpi and piKp
561 return returnvalueTot;
563 //----------------------------------
564 void AliRDHFCutsLctopKpi::SetStandardCutsPP2010() {
566 SetName("LctopKpiProdCuts");
567 SetTitle("Production cuts for Lc analysis");
569 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
570 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
571 esdTrackCuts->SetRequireTPCRefit(kTRUE);
572 esdTrackCuts->SetMinNClustersTPC(70);
573 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
574 AliESDtrackCuts::kAny);
575 esdTrackCuts->SetRequireITSRefit(kTRUE);
576 esdTrackCuts->SetMinNClustersITS(4);
577 esdTrackCuts->SetMinDCAToVertexXY(0.);
578 esdTrackCuts->SetEtaRange(-0.8,0.8);
579 esdTrackCuts->SetPtRange(0.3,1.e10);
580 AddTrackCuts(esdTrackCuts);
582 const Int_t nptbins=4;
583 const Int_t nvars=13;
585 ptbins=new Float_t[nptbins+1];
593 SetGlobalIndex(nvars,nptbins);
594 SetPtBins(nptbins+1,ptbins);
596 Float_t** prodcutsval;
597 prodcutsval=new Float_t*[nvars];
598 for(Int_t iv=0;iv<nvars;iv++){
599 prodcutsval[iv]=new Float_t[nptbins];
602 for(Int_t ipt=0;ipt<nptbins;ipt++){
603 prodcutsval[0][ipt]=0.18;
604 prodcutsval[1][ipt]=0.4;
605 prodcutsval[2][ipt]=0.5;
606 prodcutsval[3][ipt]=0.;
607 prodcutsval[4][ipt]=0.;
608 prodcutsval[5][ipt]=0.01;
609 prodcutsval[6][ipt]=0.06;
610 prodcutsval[7][ipt]=0.005;
611 prodcutsval[8][ipt]=0.;
612 prodcutsval[9][ipt]=0.;
613 prodcutsval[10][ipt]=0.;
614 prodcutsval[11][ipt]=0.05;
615 prodcutsval[12][ipt]=0.4;
617 SetCuts(nvars,nptbins,prodcutsval);
619 AliAODPidHF* pidObjK=new AliAODPidHF();
620 Double_t sigmasK[5]={3.,1.,1.,3.,2.};
621 pidObjK->SetSigma(sigmasK);
622 pidObjK->SetAsym(kTRUE);
623 pidObjK->SetMatch(1);
624 pidObjK->SetTPC(kTRUE);
625 pidObjK->SetTOF(kTRUE);
626 pidObjK->SetITS(kTRUE);
627 Double_t plimK[2]={0.5,0.8};
628 pidObjK->SetPLimit(plimK,2);
629 pidObjK->SetTOFdecide(kTRUE);
633 AliAODPidHF* pidObjpi=new AliAODPidHF();
634 pidObjpi->SetTPC(kTRUE);
635 Double_t sigmaspi[5]={3.,0.,0.,0.,0.};
636 pidObjpi->SetSigma(sigmaspi);
637 pidObjpi->SetTOFdecide(kTRUE);
638 SetPidpion(pidObjpi);
640 AliAODPidHF* pidObjp=new AliAODPidHF();
641 Double_t sigmasp[5]={3.,1.,1.,3.,2.};
642 pidObjp->SetSigma(sigmasp);
643 pidObjp->SetAsym(kTRUE);
644 pidObjp->SetMatch(1);
645 pidObjp->SetTPC(kTRUE);
646 pidObjp->SetTOF(kTRUE);
647 pidObjp->SetITS(kTRUE);
648 Double_t plimp[2]={1.,2.};
649 pidObjp->SetPLimit(plimp,2);
650 pidObjp->SetTOFdecide(kTRUE);
658 for(Int_t iiv=0;iiv<nvars;iiv++){
659 delete [] prodcutsval[iiv];
661 delete [] prodcutsval;
672 void AliRDHFCutsLctopKpi::SetStandardCutsPbPb2010() {
674 SetName("LctopKpiProdCuts");
675 SetTitle("Production cuts for Lc analysis");
677 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
679 esdTrackCuts->SetRequireTPCRefit(kTRUE);
680 esdTrackCuts->SetMinNClustersTPC(70);
681 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
682 AliESDtrackCuts::kAny);
683 esdTrackCuts->SetRequireITSRefit(kTRUE);
684 esdTrackCuts->SetMinNClustersITS(4);
685 esdTrackCuts->SetMinDCAToVertexXYPtDep("0.0100*TMath::Max(0.,(1-TMath::Floor(TMath::Abs(pt)/2.)))");
686 esdTrackCuts->SetEtaRange(-0.8,0.8);
687 esdTrackCuts->SetMaxDCAToVertexXY(1.);
688 esdTrackCuts->SetMaxDCAToVertexZ(1.);
689 esdTrackCuts->SetPtRange(0.8,1.e10);
690 AddTrackCuts(esdTrackCuts);
692 const Int_t nptbins=4;
693 const Int_t nvars=13;
695 ptbins=new Float_t[nptbins+1];
703 SetGlobalIndex(nvars,nptbins);
704 SetPtBins(nptbins+1,ptbins);
706 Float_t** prodcutsval;
707 prodcutsval=new Float_t*[nvars];
708 for(Int_t iv=0;iv<nvars;iv++){
709 prodcutsval[iv]=new Float_t[nptbins];
712 for(Int_t ipt=0;ipt<nptbins;ipt++){
713 prodcutsval[0][ipt]=0.13;
714 prodcutsval[1][ipt]=0.5;
715 prodcutsval[2][ipt]=0.6;
716 prodcutsval[3][ipt]=0.;
717 prodcutsval[4][ipt]=0.;
718 prodcutsval[5][ipt]=0.01;
719 prodcutsval[6][ipt]=0.04;
720 prodcutsval[7][ipt]=0.006;
721 prodcutsval[8][ipt]=0.8;
722 prodcutsval[9][ipt]=0.3;
723 prodcutsval[10][ipt]=0.;
724 prodcutsval[11][ipt]=0.05;
725 prodcutsval[12][ipt]=0.4;
727 SetCuts(nvars,nptbins,prodcutsval);
729 AliAODPidHF* pidObjK=new AliAODPidHF();
730 Double_t sigmasK[5]={3.,1.,1.,3.,2.};
731 pidObjK->SetSigma(sigmasK);
732 pidObjK->SetAsym(kTRUE);
733 pidObjK->SetMatch(1);
734 pidObjK->SetTPC(kTRUE);
735 pidObjK->SetTOF(kTRUE);
736 pidObjK->SetITS(kTRUE);
737 Double_t plimK[2]={0.5,0.8};
738 pidObjK->SetPLimit(plimK,2);
742 AliAODPidHF* pidObjpi=new AliAODPidHF();
743 pidObjpi->SetTPC(kTRUE);
744 Double_t sigmaspi[5]={3.,0.,0.,0.,0.};
745 pidObjpi->SetSigma(sigmaspi);
746 SetPidpion(pidObjpi);
748 AliAODPidHF* pidObjp=new AliAODPidHF();
749 Double_t sigmasp[5]={3.,1.,1.,3.,2.};
750 pidObjp->SetSigma(sigmasp);
751 pidObjp->SetAsym(kTRUE);
752 pidObjp->SetMatch(1);
753 pidObjp->SetTPC(kTRUE);
754 pidObjp->SetTOF(kTRUE);
755 pidObjp->SetITS(kTRUE);
756 Double_t plimp[2]={1.,2.};
757 pidObjp->SetPLimit(plimp,2);
765 for(Int_t iiv=0;iiv<nvars;iiv++){
766 delete [] prodcutsval[iiv];
768 delete [] prodcutsval;
779 AliKFParticle* AliRDHFCutsLctopKpi::ReconstructKF(AliAODRecoDecayHF3Prong *d,Int_t *pdgs,Double_t field,Bool_t constraint) const{
780 // Method to construct the KF particle from the candidate
782 const Int_t nprongs=d->GetNProngs();
783 if(nprongs<=0) return 0x0;
785 Int_t iprongs[nprongs];
786 for(Int_t i=0;i<nprongs;i++) iprongs[i]=i;
788 Double_t mass[2]={0.,0.};
790 AliKFParticle *decay=d->ApplyVertexingKF(iprongs,nprongs,pdgs,constraint,field,mass);
791 if(!decay) return 0x0;
792 AliESDVertex *vertexESD = new AliESDVertex(decay->Parameters(),
793 decay->CovarianceMatrix(),
796 Double_t pos[3],cov[6],chi2perNDF;
797 vertexESD->GetXYZ(pos);
798 vertexESD->GetCovMatrix(cov);
799 chi2perNDF = vertexESD->GetChi2toNDF();
800 delete vertexESD; vertexESD=NULL;
801 AliAODVertex *vertexAOD = new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,nprongs);
802 d->SetSecondaryVtx(vertexAOD);
807 void AliRDHFCutsLctopKpi::SetStandardCutsPbPb2011() {
809 // Default 2010 PbPb cut object
810 SetStandardCutsPbPb2010();
813 // Enable all 2011 PbPb run triggers
816 ResetMaskAndEnableMBTrigger();
817 EnableCentralTrigger();
818 EnableSemiCentralTrigger();
822 Bool_t AliRDHFCutsLctopKpi::IsInFiducialAcceptance(Double_t pt, Double_t y) const
825 // // Checking if Dplus is in fiducial acceptance region
829 // applying cut for pt > 5 GeV
830 AliDebug(2,Form("pt of D+ = %f (> 5), cutting at |y| < 0.8",pt));
831 if (TMath::Abs(y) > 0.8) return kFALSE;
834 // appliying smooth cut for pt < 5 GeV
835 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
836 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
837 AliDebug(2,Form("pt of D+ = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
838 if (y < minFiducialY || y > maxFiducialY) return kFALSE;
843 //--------------------------------------------------------
844 Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPIDSoft(AliAODRecoDecayHF* obj) {
845 if(!fUsePID || !obj) {return 3;}
846 Int_t okLcpKpi=0,okLcpiKp=0;
849 AliVTrack *track0=dynamic_cast<AliVTrack*>(obj->GetDaughter(0));
850 AliVTrack *track1=dynamic_cast<AliVTrack*>(obj->GetDaughter(1));
851 AliVTrack *track2=dynamic_cast<AliVTrack*>(obj->GetDaughter(2));
852 if (!track0 || !track1 || !track2) return 0;
853 Double_t prob0[AliPID::kSPECIES];
854 Double_t prob1[AliPID::kSPECIES];
855 Double_t prob2[AliPID::kSPECIES];
857 Bool_t isTOF0=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(0));
858 Bool_t isTOF1=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(1));
859 Bool_t isTOF2=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(2));
863 if(track1->P()<1.8) {
864 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
865 if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
866 fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
869 AliAODTrack *trackaod1=(AliAODTrack*)(obj->GetDaughter(1));
870 if(trackaod1->P()<0.55){
871 fPidHF->SetTOF(kFALSE);
872 fPidHF->SetTOFdecide(kFALSE);
874 Int_t isKaon=fPidHF->MakeRawPid(trackaod1,3);
875 if(isKaon>=1) isK1=kTRUE;
876 if(trackaod1->P()<0.55){
877 fPidHF->SetTOF(kTRUE);
878 fPidHF->SetTOFdecide(kTRUE);
883 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
884 fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob0);
886 AliAODTrack *trackaod1=(AliAODTrack*)(obj->GetDaughter(1));
887 if(trackaod1->P()<0.55){
888 fPidHF->SetTOF(kFALSE);
889 fPidHF->SetTOFdecide(kFALSE);
891 Int_t isKaon=fPidHF->MakeRawPid(trackaod1,3);
892 if(isKaon>=1) isK1=kTRUE;
893 if(trackaod1->P()<0.55){
894 fPidHF->SetTOF(kTRUE);
895 fPidHF->SetTOFdecide(kTRUE);
906 if(track0->P()<2.2) {
907 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
908 if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
909 fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
911 AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(0));
912 if(trackaod0->P()<1.){
913 fPidObjprot->SetTOF(kFALSE);
914 fPidObjprot->SetTOFdecide(kFALSE);
916 Int_t isProton=fPidObjprot->MakeRawPid(trackaod0,4);
917 if(isProton>=1) isp0=kTRUE;
918 if(trackaod0->P()<1.){
919 fPidObjprot->SetTOF(kTRUE);
920 fPidObjprot->SetTOFdecide(kTRUE);
925 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
926 fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
928 AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(0));
929 if(trackaod0->P()<1.){
930 fPidObjprot->SetTOF(kFALSE);
931 fPidObjprot->SetTOFdecide(kFALSE);
933 Int_t isProton=fPidObjprot->MakeRawPid(trackaod0,4);
934 if(isProton>=1) isp0=kTRUE;
935 if(trackaod0->P()<1.){
936 fPidObjprot->SetTOF(kTRUE);
937 fPidObjprot->SetTOFdecide(kTRUE);
943 if(track2->P()<2.2) {
944 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
945 if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
946 fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
948 AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
949 if(trackaod2->P()<1.){
950 fPidObjprot->SetTOF(kFALSE);
951 fPidObjprot->SetTOFdecide(kFALSE);
953 Int_t isProton=fPidObjprot->MakeRawPid(trackaod2,4);
954 if(isProton>=1) isp2=kTRUE;
955 if(trackaod2->P()<1.){
956 fPidObjprot->SetTOF(kTRUE);
957 fPidObjprot->SetTOFdecide(kTRUE);
962 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
963 fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
965 AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
966 if(trackaod2->P()<1.){
967 fPidObjprot->SetTOF(kFALSE);
968 fPidObjprot->SetTOFdecide(kFALSE);
970 Int_t isProton=fPidObjprot->MakeRawPid(trackaod2,4);
971 if(isProton>=1) isp2=kTRUE;
972 if(trackaod2->P()<1.){
973 fPidObjprot->SetTOF(kTRUE);
974 fPidObjprot->SetTOFdecide(kTRUE);
978 AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
979 if(fPidObjpion->MakeRawPid(trackaod2,2)>=1)ispi2=kTRUE;
980 AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(2));
981 if(fPidObjpion->MakeRawPid(trackaod0,2)>=1)ispi0=kTRUE;
983 if(TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]){
985 if(TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) okLcpKpi = 1;
986 if(TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) okLcpiKp = 1;
989 if(!isK1 && TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]) isK1=kTRUE;
990 if(!ispi0 && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) ispi0=kTRUE;
991 if(!ispi2 && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) ispi2=kTRUE;
992 if(!isp0 && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton]) isp0=kTRUE;
993 if(!isp2 && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton]) isp2=kTRUE;
994 if(isK1 && ispi0 && isp2) okLcpiKp = 1;
995 if(isK1 && isp0 && ispi2) okLcpKpi = 1;
997 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
998 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
999 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp