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>
27 #include <AliAnalysisManager.h>
28 #include <AliInputEventHandler.h>
29 #include <AliPIDResponse.h>
31 #include "AliRDHFCutsLctopKpi.h"
32 #include "AliAODRecoDecayHF3Prong.h"
33 #include "AliRDHFCuts.h"
34 #include "AliAODTrack.h"
35 #include "AliESDtrack.h"
36 #include "AliKFParticle.h"
37 #include "AliESDVertex.h"
42 ClassImp(AliRDHFCutsLctopKpi)
44 //--------------------------------------------------------------------------
45 AliRDHFCutsLctopKpi::AliRDHFCutsLctopKpi(const char* name) :
49 fUseImpParProdCorrCut(kFALSE),
50 fPIDStrategy(kNSigma),
51 fCutsStrategy(kStandard),
52 fUseSpecialCut(kFALSE)
55 // Default Constructor
59 TString varNames[13]={"inv. mass [GeV]",
62 "d0K [cm] lower limit!",
63 "d0Pi [cm] lower limit!",
67 "pM=Max{pT1,pT2,pT3} (GeV/c)",
71 "cut on pTpion [GeV/c]"};
72 Bool_t isUpperCut[13]={kTRUE,
86 SetVarNames(nvars,varNames,isUpperCut);
87 Bool_t forOpt[13]={kFALSE,
100 SetVarsForOpt(4,forOpt);
101 Float_t limits[2]={0,999999999.};
103 for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies)
104 fPIDThreshold[ispecies]=0.;
106 //--------------------------------------------------------------------------
107 AliRDHFCutsLctopKpi::AliRDHFCutsLctopKpi(const AliRDHFCutsLctopKpi &source) :
111 fUseImpParProdCorrCut(source.fUseImpParProdCorrCut),
112 fPIDStrategy(source.fPIDStrategy),
113 fCutsStrategy(source.fCutsStrategy),
114 fUseSpecialCut(source.fUseSpecialCut)
119 if (source.fPidObjprot) fPidObjprot = new AliAODPidHF(*(source.fPidObjprot));
120 else fPidObjprot = new AliAODPidHF();
121 if (source.fPidObjpion) fPidObjpion = new AliAODPidHF(*(source.fPidObjpion));
122 else fPidObjpion = new AliAODPidHF();
123 memcpy(fPIDThreshold,source.fPIDThreshold,AliPID::kSPECIES*sizeof(Double_t));
125 //--------------------------------------------------------------------------
126 AliRDHFCutsLctopKpi &AliRDHFCutsLctopKpi::operator=(const AliRDHFCutsLctopKpi &source)
129 // assignment operator
131 if(this != &source) {
133 AliRDHFCuts::operator=(source);
135 fPidObjprot = new AliAODPidHF(*(source.fPidObjprot));
137 fPidObjpion = new AliAODPidHF(*(source.fPidObjpion));
138 fPIDStrategy=source.fPIDStrategy;
139 fCutsStrategy=source.fCutsStrategy;
140 memcpy(fPIDThreshold,source.fPIDThreshold,AliPID::kSPECIES*sizeof(Double_t));
145 //---------------------------------------------------------------------------
146 AliRDHFCutsLctopKpi::~AliRDHFCutsLctopKpi() {
148 // // Default Destructor
161 //---------------------------------------------------------------------------
162 void AliRDHFCutsLctopKpi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters, AliAODEvent *aod) {
164 // Fills in vars the values of the variables
167 if(nvars!=fnVarsForOpt) {
168 printf("AliRDHFCutsLctopKpi::GetCutsVarsForOpt: wrong number of variables\n");
172 AliAODRecoDecayHF3Prong *dd = (AliAODRecoDecayHF3Prong*)d;
177 vars[iter]=dd->InvMassLcpKpi();
181 for(Int_t iprong=0;iprong<3;iprong++){
182 if(TMath::Abs(pdgdaughters[iprong])==321) {
183 vars[iter]=dd->PtProng(iprong);
189 for(Int_t iprong=0;iprong<3;iprong++){
190 if(TMath::Abs(pdgdaughters[iprong])==2212) {
191 vars[iter]=dd->PtProng(iprong);
197 for(Int_t iprong=0;iprong<3;iprong++){
198 if(TMath::Abs(pdgdaughters[iprong])==2212) {
199 vars[iter]=dd->Getd0Prong(iprong);
205 for(Int_t iprong=0;iprong<3;iprong++){
206 if(TMath::Abs(pdgdaughters[iprong])==211) {
207 vars[iter]=dd->Getd0Prong(iprong);
213 vars[iter]=dd->GetDist12toPrim();
217 vars[iter]=dd->GetSigmaVert(aod);
221 vars[iter] = dd->DecayLength();
226 for(Int_t i=0;i<3;i++){
227 if(dd->PtProng(i)>ptmax)ptmax=dd->PtProng(i);
233 vars[iter]=dd->CosPointingAngle();
237 vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
241 vars[iter]=dd->GetDCA();
245 for(Int_t iprong=0;iprong<3;iprong++){
246 if(TMath::Abs(pdgdaughters[iprong])==211) {
247 vars[iter]=dd->PtProng(iprong);
254 //---------------------------------------------------------------------------
255 Int_t AliRDHFCutsLctopKpi::IsSelected(TObject* obj,Int_t selectionLevel,AliAODEvent *aod) {
261 cout<<"Cut matrice not inizialized. Exit..."<<endl;
265 AliAODRecoDecayHF3Prong* d=(AliAODRecoDecayHF3Prong*)obj;
268 cout<<"AliAODRecoDecayHF3Prong null"<<endl;
273 if(fKeepSignalMC) if(IsSignalMC(d,aod,4122)) return 3;
276 Int_t returnvaluePID=3;
278 if(d->Pt()<fMinPtCand) return 0;
279 if(d->Pt()>fMaxPtCand) return 0;
281 if(fUseTrackSelectionWithFilterBits && d->HasBadDaughters()) return 0;
283 if(selectionLevel==AliRDHFCuts::kAll ||
284 selectionLevel==AliRDHFCuts::kCandidate||
285 selectionLevel==AliRDHFCuts::kPID) {
286 switch (fPIDStrategy) {
288 returnvaluePID = IsSelectedPID(d);
292 returnvaluePID = IsSelectedCombinedPID(d);
295 returnvaluePID = IsSelectedCombinedPIDSoft(d);
298 returnvaluePID = IsSelectedPIDStrong(d);
300 fIsSelectedPID=returnvaluePID;
302 // if(fUsePID || selectionLevel==AliRDHFCuts::kPID) returnvaluePID = IsSelectedCombinedPID(d); // to test!!
303 if(returnvaluePID==0) return 0;
305 // selection on candidate
306 if(selectionLevel==AliRDHFCuts::kAll ||
307 selectionLevel==AliRDHFCuts::kCandidate) {
311 Int_t ptbin=PtBin(pt);
313 Double_t mLcpKpi,mLcpiKp;
314 Int_t okLcpKpi=1,okLcpiKp=1;
316 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
318 mLcpKpi=d->InvMassLcpKpi();
319 mLcpiKp=d->InvMassLcpiKp();
321 if(TMath::Abs(mLcpKpi-mLcPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okLcpKpi = 0;
322 if(TMath::Abs(mLcpiKp-mLcPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okLcpiKp = 0;
323 if(!okLcpKpi && !okLcpiKp) return 0;
325 switch (fCutsStrategy) {
328 if(TMath::Abs(d->PtProng(1)) < fCutsRD[GetGlobalIndex(1,ptbin)] || TMath::Abs(d->Getd0Prong(1))<fCutsRD[GetGlobalIndex(3,ptbin)]) return 0;//Kaon
329 if(d->Pt()>=3. && d->PProng(1)<0.55) return 0;
331 if(TMath::Abs(d->PtProng(0)) < TMath::Abs(d->PtProng(2)) )okLcpKpi=0;
332 if(TMath::Abs(d->PtProng(2)) < TMath::Abs(d->PtProng(0)) )okLcpiKp=0;
334 if((TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(2,ptbin)]) || (TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(12,ptbin)])) okLcpKpi=0;
335 if((TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(2,ptbin)]) || (TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(12,ptbin)]))okLcpiKp=0;
336 if(!okLcpKpi && !okLcpiKp) return 0;
338 if(d->GetDist12toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]|| d->GetDist23toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]) return 0;
339 if(d->GetDist12toPrim()>0.5) return 0;
340 if(d->GetDist23toPrim()>0.5) return 0;
341 if(fUseImpParProdCorrCut){
342 if(d->Getd0Prong(0)*d->Getd0Prong(1)<0. && d->Getd0Prong(2)*d->Getd0Prong(1)<0.) return 0;
345 if(d->DecayLength()<fCutsRD[GetGlobalIndex(7,ptbin)]) return 0;
346 if(d->DecayLength()>0.5) return 0;
348 // Double_t sumd0s=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
349 // if(sumd0s<fCutsRD[GetGlobalIndex(10,ptbin)]) return 0;
350 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;
352 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;
353 if(d->CosPointingAngle()< fCutsRD[GetGlobalIndex(9,ptbin)]) return 0;
354 if(d->GetSigmaVert(aod)>fCutsRD[GetGlobalIndex(6,ptbin)]) return 0;
357 for(Int_t i=0;i<3;i++) if(d->GetDCA(i)>fCutsRD[GetGlobalIndex(11,ptbin)]) return 0;
362 Int_t pdgs[3]={0,321,0};
363 Bool_t constraint=kFALSE;
364 if(fCutsRD[GetGlobalIndex(1,ptbin)]>0.) constraint=kTRUE;
365 Double_t field=aod->GetMagneticField();
366 if (returnvaluePID==1 || returnvaluePID==3){
368 pdgs[0]=2122;pdgs[2]=211;
369 AliKFParticle *lc1=ReconstructKF(d,pdgs,field,constraint);
373 if(lc1->GetChi2()/lc1->GetNDF()>fCutsRD[GetGlobalIndex(2,ptbin)]) okLcpKpi=0;
375 } else if(returnvaluePID>=2){
377 pdgs[0]=211;pdgs[2]=2212;
378 AliKFParticle *lc2=ReconstructKF(d,pdgs,field,constraint);
382 if(lc2->GetChi2()/lc2->GetNDF()>fCutsRD[GetGlobalIndex(2,ptbin)])okLcpiKp=0;
389 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
390 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
391 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
395 // selection on daughter tracks
396 if(selectionLevel==AliRDHFCuts::kAll ||
397 selectionLevel==AliRDHFCuts::kTracks) {
398 if(!AreDaughtersSelected(d)) return 0;
402 Int_t returnvalueTot=CombinePIDCuts(returnvalue,returnvaluePID);
403 return returnvalueTot;
405 //---------------------------------------------------------------------------
406 Int_t AliRDHFCutsLctopKpi::IsSelectedPID(AliAODRecoDecayHF* obj) {
409 if(!fUsePID || !obj) return 3;
410 Int_t okLcpKpi=0,okLcpiKp=0;
412 Bool_t isPeriodd=fPidHF->GetOnePad();
413 Bool_t isMC=fPidHF->GetMC();
414 Bool_t ispion0=kTRUE,ispion2=kTRUE;
415 Bool_t isproton0=kFALSE,isproton2=kFALSE;
416 Bool_t iskaon1=kFALSE;
418 fPidObjprot->SetOnePad(kTRUE);
419 fPidObjpion->SetOnePad(kTRUE);
422 fPidObjprot->SetMC(kTRUE);
423 fPidObjpion->SetMC(kTRUE);
426 if(fPidObjprot->GetPidResponse()==0x0){
427 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
428 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
429 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
430 fPidObjprot->SetPidResponse(pidResp);
432 if(fPidObjpion->GetPidResponse()==0x0){
433 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
434 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
435 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
436 fPidObjpion->SetPidResponse(pidResp);
438 if(fPidHF->GetPidResponse()==0x0){
439 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
440 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
441 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
442 fPidHF->SetPidResponse(pidResp);
445 for(Int_t i=0;i<3;i++){
446 AliAODTrack *track=(AliAODTrack*)obj->GetDaughter(i);
450 fPidHF->SetTOF(kFALSE);
451 fPidHF->SetTOFdecide(kFALSE);
454 Int_t isKaon=fPidHF->MakeRawPid(track,3);
455 if(isKaon>=1) iskaon1=kTRUE;
457 fPidHF->SetTOF(kTRUE);
458 fPidHF->SetTOFdecide(kTRUE);
461 if(!iskaon1) return 0;
466 fPidObjprot->SetTOF(kFALSE);
467 fPidObjprot->SetTOFdecide(kFALSE);
470 Int_t isProton=fPidObjprot->MakeRawPid(track,4);
473 Int_t isPion=fPidObjpion->MakeRawPid(track,2);
476 fPidObjprot->SetTOF(kTRUE);
477 fPidObjprot->SetTOFdecide(kTRUE);
482 if(isPion<0) ispion0=kFALSE;
483 if(isProton>=1) isproton0=kTRUE;
486 if(!ispion0 && !isproton0) return 0;
488 if(isPion<0) ispion2=kFALSE;
489 if(isProton>=1) isproton2=kTRUE;
495 if(ispion2 && isproton0 && iskaon1) okLcpKpi=1;
496 if(ispion0 && isproton2 && iskaon1) okLcpiKp=1;
497 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
498 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
499 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
503 //---------------------------------------------------------------------------
504 Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPID(AliAODRecoDecayHF* obj) {
506 // Printf(" -------- IsSelectedCombinedPID --------------");
509 if(!fUsePID || !obj) {return 3;}
510 Int_t okLcpKpi=0,okLcpiKp=0;
512 Bool_t isPeriodd=fPidHF->GetOnePad();
513 Bool_t isMC=fPidHF->GetMC();
516 fPidObjprot->SetOnePad(kTRUE);
517 fPidObjpion->SetOnePad(kTRUE);
520 fPidObjprot->SetMC(kTRUE);
521 fPidObjpion->SetMC(kTRUE);
524 AliVTrack *track0=dynamic_cast<AliVTrack*>(obj->GetDaughter(0));
525 AliVTrack *track1=dynamic_cast<AliVTrack*>(obj->GetDaughter(1));
526 AliVTrack *track2=dynamic_cast<AliVTrack*>(obj->GetDaughter(2));
527 if (!track0 || !track1 || !track2) return 0;
528 Double_t prob0[AliPID::kSPECIES];
529 Double_t prob1[AliPID::kSPECIES];
530 Double_t prob2[AliPID::kSPECIES];
531 if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
532 fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
533 if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
535 if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
536 fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
537 if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
539 if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
540 fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
541 if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
543 if(fPIDThreshold[AliPID::kPion]>0. && fPIDThreshold[AliPID::kKaon]>0. && fPIDThreshold[AliPID::kProton]>0.){
544 okLcpiKp= (prob0[AliPID::kPion ]>fPIDThreshold[AliPID::kPion ])
545 &&(prob1[AliPID::kKaon ]>fPIDThreshold[AliPID::kKaon ])
546 &&(prob2[AliPID::kProton]>fPIDThreshold[AliPID::kProton]);
547 okLcpKpi= (prob0[AliPID::kProton]>fPIDThreshold[AliPID::kProton])
548 &&(prob1[AliPID::kKaon ]>fPIDThreshold[AliPID::kKaon ])
549 &&(prob2[AliPID::kPion ]>fPIDThreshold[AliPID::kPion ]);
554 if(TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]){
555 if(TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) okLcpKpi = 1;
556 if(TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) okLcpiKp = 1;
560 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
561 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
562 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
566 //-----------------------
567 Int_t AliRDHFCutsLctopKpi::CombinePIDCuts(Int_t returnvalue, Int_t returnvaluePID) const {
569 Int_t returnvalueTot=0;
570 Int_t okLcpKpi=0,okLcpiKp=0;
571 if(returnvaluePID==1){
572 if(returnvalue==1 || returnvalue==3) okLcpKpi=1;
574 if(returnvaluePID==2){
575 if(returnvalue>=2) okLcpiKp=1;
577 if(returnvaluePID==3 && returnvalue>0){
578 if(returnvalue==1 || returnvalue==3) okLcpKpi=1;
579 if(returnvalue>=2) okLcpiKp=1;
582 if(okLcpKpi) returnvalueTot=1; //cuts passed as Lc->pKpi
583 if(okLcpiKp) returnvalueTot=2; //cuts passed as Lc->piKp
584 if(okLcpKpi && okLcpiKp) returnvalueTot=3; //cuts passed as both pKpi and piKp
585 return returnvalueTot;
587 //----------------------------------
588 void AliRDHFCutsLctopKpi::SetStandardCutsPP2010() {
590 SetName("LctopKpiProdCuts");
591 SetTitle("Production cuts for Lc analysis");
593 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
594 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
595 esdTrackCuts->SetRequireTPCRefit(kTRUE);
596 esdTrackCuts->SetMinNClustersTPC(70);
597 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
598 AliESDtrackCuts::kAny);
599 esdTrackCuts->SetRequireITSRefit(kTRUE);
600 esdTrackCuts->SetMinNClustersITS(4);
601 esdTrackCuts->SetMinDCAToVertexXY(0.);
602 esdTrackCuts->SetEtaRange(-0.8,0.8);
603 esdTrackCuts->SetPtRange(0.3,1.e10);
604 AddTrackCuts(esdTrackCuts);
606 const Int_t nptbins=4;
607 const Int_t nvars=13;
609 ptbins=new Float_t[nptbins+1];
617 SetGlobalIndex(nvars,nptbins);
618 SetPtBins(nptbins+1,ptbins);
620 Float_t** prodcutsval;
621 prodcutsval=new Float_t*[nvars];
622 for(Int_t iv=0;iv<nvars;iv++){
623 prodcutsval[iv]=new Float_t[nptbins];
626 for(Int_t ipt=0;ipt<nptbins;ipt++){
627 prodcutsval[0][ipt]=0.18;
628 prodcutsval[1][ipt]=0.4;
629 prodcutsval[2][ipt]=0.5;
630 prodcutsval[3][ipt]=0.;
631 prodcutsval[4][ipt]=0.;
632 prodcutsval[5][ipt]=0.01;
633 prodcutsval[6][ipt]=0.06;
634 prodcutsval[7][ipt]=0.005;
635 prodcutsval[8][ipt]=0.;
636 prodcutsval[9][ipt]=0.;
637 prodcutsval[10][ipt]=0.;
638 prodcutsval[11][ipt]=0.05;
639 prodcutsval[12][ipt]=0.4;
641 SetCuts(nvars,nptbins,prodcutsval);
643 AliAODPidHF* pidObjK=new AliAODPidHF();
644 Double_t sigmasK[5]={3.,1.,1.,3.,2.};
645 pidObjK->SetSigma(sigmasK);
646 pidObjK->SetAsym(kTRUE);
647 pidObjK->SetMatch(1);
648 pidObjK->SetTPC(kTRUE);
649 pidObjK->SetTOF(kTRUE);
650 pidObjK->SetITS(kTRUE);
651 Double_t plimK[2]={0.5,0.8};
652 pidObjK->SetPLimit(plimK,2);
653 pidObjK->SetTOFdecide(kTRUE);
657 AliAODPidHF* pidObjpi=new AliAODPidHF();
658 pidObjpi->SetTPC(kTRUE);
659 Double_t sigmaspi[5]={3.,0.,0.,0.,0.};
660 pidObjpi->SetSigma(sigmaspi);
661 pidObjpi->SetTOFdecide(kTRUE);
662 SetPidpion(pidObjpi);
664 AliAODPidHF* pidObjp=new AliAODPidHF();
665 Double_t sigmasp[5]={3.,1.,1.,3.,2.};
666 pidObjp->SetSigma(sigmasp);
667 pidObjp->SetAsym(kTRUE);
668 pidObjp->SetMatch(1);
669 pidObjp->SetTPC(kTRUE);
670 pidObjp->SetTOF(kTRUE);
671 pidObjp->SetITS(kTRUE);
672 Double_t plimp[2]={1.,2.};
673 pidObjp->SetPLimit(plimp,2);
674 pidObjp->SetTOFdecide(kTRUE);
682 for(Int_t iiv=0;iiv<nvars;iiv++){
683 delete [] prodcutsval[iiv];
685 delete [] prodcutsval;
696 void AliRDHFCutsLctopKpi::SetStandardCutsPbPb2010() {
698 SetName("LctopKpiProdCuts");
699 SetTitle("Production cuts for Lc analysis");
701 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
703 esdTrackCuts->SetRequireTPCRefit(kTRUE);
704 esdTrackCuts->SetMinNClustersTPC(70);
705 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
706 AliESDtrackCuts::kAny);
707 esdTrackCuts->SetRequireITSRefit(kTRUE);
708 esdTrackCuts->SetMinNClustersITS(4);
709 esdTrackCuts->SetMinDCAToVertexXYPtDep("0.0100*TMath::Max(0.,(1-TMath::Floor(TMath::Abs(pt)/2.)))");
710 esdTrackCuts->SetEtaRange(-0.8,0.8);
711 esdTrackCuts->SetMaxDCAToVertexXY(1.);
712 esdTrackCuts->SetMaxDCAToVertexZ(1.);
713 esdTrackCuts->SetPtRange(0.8,1.e10);
714 AddTrackCuts(esdTrackCuts);
716 const Int_t nptbins=4;
717 const Int_t nvars=13;
719 ptbins=new Float_t[nptbins+1];
727 SetGlobalIndex(nvars,nptbins);
728 SetPtBins(nptbins+1,ptbins);
730 Float_t** prodcutsval;
731 prodcutsval=new Float_t*[nvars];
732 for(Int_t iv=0;iv<nvars;iv++){
733 prodcutsval[iv]=new Float_t[nptbins];
736 for(Int_t ipt=0;ipt<nptbins;ipt++){
737 prodcutsval[0][ipt]=0.13;
738 prodcutsval[1][ipt]=0.5;
739 prodcutsval[2][ipt]=0.6;
740 prodcutsval[3][ipt]=0.;
741 prodcutsval[4][ipt]=0.;
742 prodcutsval[5][ipt]=0.01;
743 prodcutsval[6][ipt]=0.04;
744 prodcutsval[7][ipt]=0.006;
745 prodcutsval[8][ipt]=0.8;
746 prodcutsval[9][ipt]=0.3;
747 prodcutsval[10][ipt]=0.;
748 prodcutsval[11][ipt]=0.05;
749 prodcutsval[12][ipt]=0.4;
751 SetCuts(nvars,nptbins,prodcutsval);
753 AliAODPidHF* pidObjK=new AliAODPidHF();
754 Double_t sigmasK[5]={3.,1.,1.,3.,2.};
755 pidObjK->SetSigma(sigmasK);
756 pidObjK->SetAsym(kTRUE);
757 pidObjK->SetMatch(1);
758 pidObjK->SetTPC(kTRUE);
759 pidObjK->SetTOF(kTRUE);
760 pidObjK->SetITS(kTRUE);
761 Double_t plimK[2]={0.5,0.8};
762 pidObjK->SetPLimit(plimK,2);
766 AliAODPidHF* pidObjpi=new AliAODPidHF();
767 pidObjpi->SetTPC(kTRUE);
768 Double_t sigmaspi[5]={3.,0.,0.,0.,0.};
769 pidObjpi->SetSigma(sigmaspi);
770 SetPidpion(pidObjpi);
772 AliAODPidHF* pidObjp=new AliAODPidHF();
773 Double_t sigmasp[5]={3.,1.,1.,3.,2.};
774 pidObjp->SetSigma(sigmasp);
775 pidObjp->SetAsym(kTRUE);
776 pidObjp->SetMatch(1);
777 pidObjp->SetTPC(kTRUE);
778 pidObjp->SetTOF(kTRUE);
779 pidObjp->SetITS(kTRUE);
780 Double_t plimp[2]={1.,2.};
781 pidObjp->SetPLimit(plimp,2);
789 for(Int_t iiv=0;iiv<nvars;iiv++){
790 delete [] prodcutsval[iiv];
792 delete [] prodcutsval;
803 AliKFParticle* AliRDHFCutsLctopKpi::ReconstructKF(AliAODRecoDecayHF3Prong *d,Int_t *pdgs,Double_t field,Bool_t constraint) const{
804 // Method to construct the KF particle from the candidate
806 const Int_t nprongs=d->GetNProngs();
807 if(nprongs<=0) return 0x0;
809 Int_t iprongs[nprongs];
810 for(Int_t i=0;i<nprongs;i++) iprongs[i]=i;
812 Double_t mass[2]={0.,0.};
814 AliKFParticle *decay=d->ApplyVertexingKF(iprongs,nprongs,pdgs,constraint,field,mass);
815 if(!decay) return 0x0;
816 AliESDVertex *vertexESD = new AliESDVertex(decay->Parameters(),
817 decay->CovarianceMatrix(),
820 Double_t pos[3],cov[6],chi2perNDF;
821 vertexESD->GetXYZ(pos);
822 vertexESD->GetCovMatrix(cov);
823 chi2perNDF = vertexESD->GetChi2toNDF();
824 delete vertexESD; vertexESD=NULL;
825 AliAODVertex *vertexAOD = new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,nprongs);
826 d->SetSecondaryVtx(vertexAOD);
831 void AliRDHFCutsLctopKpi::SetStandardCutsPbPb2011() {
833 // Default 2010 PbPb cut object
834 SetStandardCutsPbPb2010();
837 // Enable all 2011 PbPb run triggers
840 ResetMaskAndEnableMBTrigger();
841 EnableCentralTrigger();
842 EnableSemiCentralTrigger();
846 Bool_t AliRDHFCutsLctopKpi::IsInFiducialAcceptance(Double_t pt, Double_t y) const
849 // // Checking if Dplus is in fiducial acceptance region
853 // applying cut for pt > 5 GeV
854 AliDebug(2,Form("pt of D+ = %f (> 5), cutting at |y| < 0.8",pt));
855 if (TMath::Abs(y) > 0.8) return kFALSE;
858 // appliying smooth cut for pt < 5 GeV
859 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
860 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
861 AliDebug(2,Form("pt of D+ = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
862 if (y < minFiducialY || y > maxFiducialY) return kFALSE;
867 //--------------------------------------------------------
868 Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPIDSoft(AliAODRecoDecayHF* obj) {
869 if(!fUsePID || !obj) {return 3;}
870 Int_t okLcpKpi=0,okLcpiKp=0;
873 AliVTrack *track0=dynamic_cast<AliVTrack*>(obj->GetDaughter(0));
874 AliVTrack *track1=dynamic_cast<AliVTrack*>(obj->GetDaughter(1));
875 AliVTrack *track2=dynamic_cast<AliVTrack*>(obj->GetDaughter(2));
876 if (!track0 || !track1 || !track2) return 0;
877 Double_t prob0[AliPID::kSPECIES];
878 Double_t prob1[AliPID::kSPECIES];
879 Double_t prob2[AliPID::kSPECIES];
881 Bool_t isTOF0=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(0));
882 Bool_t isTOF1=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(1));
883 Bool_t isTOF2=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(2));
887 if(track1->P()<1.8) {
888 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
889 if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
890 fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
893 AliAODTrack *trackaod1=(AliAODTrack*)(obj->GetDaughter(1));
894 if(trackaod1->P()<0.55){
895 fPidHF->SetTOF(kFALSE);
896 fPidHF->SetTOFdecide(kFALSE);
898 Int_t isKaon=fPidHF->MakeRawPid(trackaod1,3);
899 if(isKaon>=1) isK1=kTRUE;
900 if(trackaod1->P()<0.55){
901 fPidHF->SetTOF(kTRUE);
902 fPidHF->SetTOFdecide(kTRUE);
907 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
908 fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob0);
910 AliAODTrack *trackaod1=(AliAODTrack*)(obj->GetDaughter(1));
911 if(trackaod1->P()<0.55){
912 fPidHF->SetTOF(kFALSE);
913 fPidHF->SetTOFdecide(kFALSE);
915 Int_t isKaon=fPidHF->MakeRawPid(trackaod1,3);
916 if(isKaon>=1) isK1=kTRUE;
917 if(trackaod1->P()<0.55){
918 fPidHF->SetTOF(kTRUE);
919 fPidHF->SetTOFdecide(kTRUE);
930 if(track0->P()<2.2) {
931 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
932 if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
933 fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
935 AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(0));
936 if(trackaod0->P()<1.){
937 fPidObjprot->SetTOF(kFALSE);
938 fPidObjprot->SetTOFdecide(kFALSE);
940 Int_t isProton=fPidObjprot->MakeRawPid(trackaod0,4);
941 if(isProton>=1) isp0=kTRUE;
942 if(trackaod0->P()<1.){
943 fPidObjprot->SetTOF(kTRUE);
944 fPidObjprot->SetTOFdecide(kTRUE);
949 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
950 fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
952 AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(0));
953 if(trackaod0->P()<1.){
954 fPidObjprot->SetTOF(kFALSE);
955 fPidObjprot->SetTOFdecide(kFALSE);
957 Int_t isProton=fPidObjprot->MakeRawPid(trackaod0,4);
958 if(isProton>=1) isp0=kTRUE;
959 if(trackaod0->P()<1.){
960 fPidObjprot->SetTOF(kTRUE);
961 fPidObjprot->SetTOFdecide(kTRUE);
967 if(track2->P()<2.2) {
968 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
969 if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
970 fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
972 AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
973 if(trackaod2->P()<1.){
974 fPidObjprot->SetTOF(kFALSE);
975 fPidObjprot->SetTOFdecide(kFALSE);
977 Int_t isProton=fPidObjprot->MakeRawPid(trackaod2,4);
978 if(isProton>=1) isp2=kTRUE;
979 if(trackaod2->P()<1.){
980 fPidObjprot->SetTOF(kTRUE);
981 fPidObjprot->SetTOFdecide(kTRUE);
986 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
987 fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
989 AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
990 if(trackaod2->P()<1.){
991 fPidObjprot->SetTOF(kFALSE);
992 fPidObjprot->SetTOFdecide(kFALSE);
994 Int_t isProton=fPidObjprot->MakeRawPid(trackaod2,4);
995 if(isProton>=1) isp2=kTRUE;
996 if(trackaod2->P()<1.){
997 fPidObjprot->SetTOF(kTRUE);
998 fPidObjprot->SetTOFdecide(kTRUE);
1002 AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
1003 if(fPidObjpion->MakeRawPid(trackaod2,2)>=1)ispi2=kTRUE;
1004 AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(2));
1005 if(fPidObjpion->MakeRawPid(trackaod0,2)>=1)ispi0=kTRUE;
1007 if(TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]){
1009 if(TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) okLcpKpi = 1;
1010 if(TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) okLcpiKp = 1;
1013 if(!isK1 && TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]) isK1=kTRUE;
1014 if(!ispi0 && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) ispi0=kTRUE;
1015 if(!ispi2 && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) ispi2=kTRUE;
1016 if(!isp0 && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton]) isp0=kTRUE;
1017 if(!isp2 && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton]) isp2=kTRUE;
1018 if(isK1 && ispi0 && isp2) okLcpiKp = 1;
1019 if(isK1 && isp0 && ispi2) okLcpKpi = 1;
1021 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
1022 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
1023 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
1029 //----------------------------------------------------------
1030 Int_t AliRDHFCutsLctopKpi::IsSelectedPIDStrong(AliAODRecoDecayHF* obj) {
1033 if(!fUsePID || !obj) return 3;
1034 Int_t okLcpKpi=0,okLcpiKp=0;
1035 Int_t returnvalue=0;
1036 Bool_t isPeriodd=fPidHF->GetOnePad();
1037 Bool_t isMC=fPidHF->GetMC();
1038 Bool_t ispion0=kTRUE,ispion2=kTRUE;
1039 Bool_t isproton0=kFALSE,isproton2=kFALSE;
1040 Bool_t iskaon1=kFALSE;
1042 fPidObjprot->SetOnePad(kTRUE);
1043 fPidObjpion->SetOnePad(kTRUE);
1046 fPidObjprot->SetMC(kTRUE);
1047 fPidObjpion->SetMC(kTRUE);
1050 for(Int_t i=0;i<3;i++){
1051 AliAODTrack *track=(AliAODTrack*)obj->GetDaughter(i);
1052 if(!track) return 0;
1055 Int_t isKaon=fPidHF->MakeRawPid(track,3);
1058 if(fPidHF->MakeRawPid(track,2)>=1) iskaon1=kFALSE;
1060 if(!iskaon1) return 0;
1065 Int_t isProton=fPidObjprot->MakeRawPid(track,4);
1067 if(fPidHF->MakeRawPid(track,2)>=1) isProton=-1;
1068 if(fPidHF->MakeRawPid(track,3)>=1) isProton=-1;
1071 Int_t isPion=fPidObjpion->MakeRawPid(track,2);
1072 if(fPidHF->MakeRawPid(track,3)>=1) isPion=-1;
1073 if(fPidObjprot->MakeRawPid(track,4)>=1) isPion=-1;
1077 if(isPion<0) ispion0=kFALSE;
1078 if(isProton>=1) isproton0=kTRUE;
1081 if(!ispion0 && !isproton0) return 0;
1083 if(isPion<0) ispion2=kFALSE;
1084 if(isProton>=1) isproton2=kTRUE;
1090 if(ispion2 && isproton0 && iskaon1) okLcpKpi=1;
1091 if(ispion0 && isproton2 && iskaon1) okLcpiKp=1;
1092 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
1093 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
1094 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp