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 AliError("Cut matrice not inizialized. Exit...\n");
265 AliAODRecoDecayHF3Prong* d=(AliAODRecoDecayHF3Prong*)obj;
268 AliError("AliAODRecoDecayHF3Prong null \n");
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;
284 // selection on daughter tracks
285 if(selectionLevel==AliRDHFCuts::kAll ||
286 selectionLevel==AliRDHFCuts::kTracks) {
287 if(!AreDaughtersSelected(d)) return 0;
292 if(selectionLevel==AliRDHFCuts::kAll ||
293 selectionLevel==AliRDHFCuts::kCandidate||
294 selectionLevel==AliRDHFCuts::kPID) {
295 switch (fPIDStrategy) {
297 returnvaluePID = IsSelectedPID(d);
300 returnvaluePID = IsSelectedNSigmaPbPb(d);
303 returnvaluePID = IsSelectedCombinedPID(d);
306 returnvaluePID = IsSelectedCombinedPIDSoft(d);
309 returnvaluePID = IsSelectedPIDStrong(d);
312 returnvaluePID = IsSelectedCombinedPIDpPb(d);
315 returnvaluePID = IsSelectedCombinedPIDpPb2(d);
318 fIsSelectedPID=returnvaluePID;
320 // if(fUsePID || selectionLevel==AliRDHFCuts::kPID) returnvaluePID = IsSelectedCombinedPID(d); // to test!!
321 if(returnvaluePID==0) return 0;
326 // selection on candidate
327 if(selectionLevel==AliRDHFCuts::kAll ||
328 selectionLevel==AliRDHFCuts::kCandidate) {
332 Int_t ptbin=PtBin(pt);
334 Double_t mLcpKpi=0.,mLcpiKp=0.;
335 Int_t okLcpKpi=1,okLcpiKp=1;
337 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
339 mLcpKpi=d->InvMassLcpKpi();
340 mLcpiKp=d->InvMassLcpiKp();
342 if(TMath::Abs(mLcpKpi-mLcPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okLcpKpi = 0;
343 if(TMath::Abs(mLcpiKp-mLcPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okLcpiKp = 0;
344 if(!okLcpKpi && !okLcpiKp) return 0;
346 switch (fCutsStrategy) {
349 if(TMath::Abs(d->PtProng(1)) < fCutsRD[GetGlobalIndex(1,ptbin)] || TMath::Abs(d->Getd0Prong(1))<fCutsRD[GetGlobalIndex(3,ptbin)]) return 0;//Kaon
350 if(d->Pt()>=3. && d->PProng(1)<0.55) return 0;
352 if(TMath::Abs(d->PtProng(0)) < TMath::Abs(d->PtProng(2)) )okLcpKpi=0;
353 if(TMath::Abs(d->PtProng(2)) < TMath::Abs(d->PtProng(0)) )okLcpiKp=0;
355 if((TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(2,ptbin)]) || (TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(12,ptbin)])) okLcpKpi=0;
356 if((TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(2,ptbin)]) || (TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(12,ptbin)]))okLcpiKp=0;
357 if(!okLcpKpi && !okLcpiKp) return 0;
359 if(d->GetDist12toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]|| d->GetDist23toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]) return 0;
360 if(d->GetDist12toPrim()>0.5) return 0;
361 if(d->GetDist23toPrim()>0.5) return 0;
362 if(fUseImpParProdCorrCut){
363 if(d->Getd0Prong(0)*d->Getd0Prong(1)<0. && d->Getd0Prong(2)*d->Getd0Prong(1)<0.) return 0;
366 if(d->DecayLength()<fCutsRD[GetGlobalIndex(7,ptbin)]) return 0;
367 if(d->DecayLength()>0.5) return 0;
369 // Double_t sumd0s=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
370 // if(sumd0s<fCutsRD[GetGlobalIndex(10,ptbin)]) return 0;
371 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;
373 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;
374 if(d->CosPointingAngle()< fCutsRD[GetGlobalIndex(9,ptbin)]) return 0;
375 if(d->GetSigmaVert(aod)>fCutsRD[GetGlobalIndex(6,ptbin)]) return 0;
378 for(Int_t i=0;i<3;i++) if(d->GetDCA(i)>fCutsRD[GetGlobalIndex(11,ptbin)]) return 0;
383 Int_t pdgs[3]={0,321,0};
384 Bool_t constraint=kFALSE;
385 if(fCutsRD[GetGlobalIndex(1,ptbin)]>0.) constraint=kTRUE;
386 Double_t field=aod->GetMagneticField();
387 if (returnvaluePID==1 || returnvaluePID==3){
389 pdgs[0]=2122;pdgs[2]=211;
390 AliKFParticle *lc1=ReconstructKF(d,pdgs,field,constraint);
394 if(lc1->GetChi2()/lc1->GetNDF()>fCutsRD[GetGlobalIndex(2,ptbin)]) okLcpKpi=0;
396 } else if(returnvaluePID>=2){
398 pdgs[0]=211;pdgs[2]=2212;
399 AliKFParticle *lc2=ReconstructKF(d,pdgs,field,constraint);
403 if(lc2->GetChi2()/lc2->GetNDF()>fCutsRD[GetGlobalIndex(2,ptbin)])okLcpiKp=0;
410 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
411 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
412 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
417 Int_t returnvalueTot=CombinePIDCuts(returnvalue,returnvaluePID);
418 return returnvalueTot;
420 //---------------------------------------------------------------------------
421 Int_t AliRDHFCutsLctopKpi::IsSelectedPID(AliAODRecoDecayHF* obj) {
424 if(!fUsePID || !obj) return 3;
425 Int_t okLcpKpi=0,okLcpiKp=0;
427 Bool_t isPeriodd=fPidHF->GetOnePad();
428 Bool_t isMC=fPidHF->GetMC();
429 Bool_t ispion0=kTRUE,ispion2=kTRUE;
430 Bool_t isproton0=kFALSE,isproton2=kFALSE;
431 Bool_t iskaon1=kFALSE;
433 fPidObjprot->SetOnePad(kTRUE);
434 fPidObjpion->SetOnePad(kTRUE);
437 fPidObjprot->SetMC(kTRUE);
438 fPidObjpion->SetMC(kTRUE);
441 if(fPidObjprot->GetPidResponse()==0x0){
442 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
443 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
444 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
445 fPidObjprot->SetPidResponse(pidResp);
447 if(fPidObjpion->GetPidResponse()==0x0){
448 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
449 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
450 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
451 fPidObjpion->SetPidResponse(pidResp);
453 if(fPidHF->GetPidResponse()==0x0){
454 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
455 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
456 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
457 fPidHF->SetPidResponse(pidResp);
460 for(Int_t i=0;i<3;i++){
461 AliAODTrack *track=(AliAODTrack*)obj->GetDaughter(i);
465 fPidHF->SetTOF(kFALSE);
466 fPidHF->SetTOFdecide(kFALSE);
469 Int_t isKaon=fPidHF->MakeRawPid(track,3);
470 if(isKaon>=1) iskaon1=kTRUE;
472 fPidHF->SetTOF(kTRUE);
473 fPidHF->SetTOFdecide(kTRUE);
476 if(!iskaon1) return 0;
481 fPidObjprot->SetTOF(kFALSE);
482 fPidObjprot->SetTOFdecide(kFALSE);
485 Int_t isProton=fPidObjprot->MakeRawPid(track,4);
488 Int_t isPion=fPidObjpion->MakeRawPid(track,2);
491 fPidObjprot->SetTOF(kTRUE);
492 fPidObjprot->SetTOFdecide(kTRUE);
497 if(isPion<0) ispion0=kFALSE;
498 if(isProton>=1) isproton0=kTRUE;
501 if(!ispion0 && !isproton0) return 0;
503 if(isPion<0) ispion2=kFALSE;
504 if(isProton>=1) isproton2=kTRUE;
510 if(ispion2 && isproton0 && iskaon1) okLcpKpi=1;
511 if(ispion0 && isproton2 && iskaon1) okLcpiKp=1;
512 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
513 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
514 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
519 //--------------------------------------------------------------------------
521 Int_t AliRDHFCutsLctopKpi::IsSelectedNSigmaPbPb(AliAODRecoDecayHF* obj) {
524 if(!fUsePID || !obj) return 3;
525 Int_t okLcpKpi=0,okLcpiKp=0;
527 Bool_t isPeriodd=fPidHF->GetOnePad();
528 Bool_t isMC=fPidHF->GetMC();
529 Bool_t ispion0=kTRUE,ispion2=kTRUE;
530 Bool_t isproton0=kFALSE,isproton2=kFALSE;
531 Bool_t iskaon1=kFALSE;
533 fPidObjprot->SetOnePad(kTRUE);
534 fPidObjpion->SetOnePad(kTRUE);
537 fPidObjprot->SetMC(kTRUE);
538 fPidObjpion->SetMC(kTRUE);
541 if(fPidObjprot->GetPidResponse()==0x0){
542 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
543 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
544 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
545 fPidObjprot->SetPidResponse(pidResp);
547 if(fPidObjpion->GetPidResponse()==0x0){
548 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
549 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
550 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
551 fPidObjpion->SetPidResponse(pidResp);
553 if(fPidHF->GetPidResponse()==0x0){
554 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
555 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
556 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
557 fPidHF->SetPidResponse(pidResp);
560 for(Int_t i=0;i<3;i++){
561 AliAODTrack *track=(AliAODTrack*)obj->GetDaughter(i);
566 Int_t isKaon=fPidHF->MakeRawPid(track,3);
567 if(isKaon>=1) iskaon1=kTRUE;
568 if(!iskaon1) return 0;
573 Int_t isProton=fPidObjprot->MakeRawPid(track,4);
574 Int_t isPion=fPidObjpion->MakeRawPid(track,2);
577 if(isPion<0) ispion0=kFALSE;
578 if(isProton>=1) isproton0=kTRUE;
580 if(!ispion0 && !isproton0) return 0;
583 if(isPion<0) ispion2=kFALSE;
584 if(isProton>=1) isproton2=kTRUE;
589 if(ispion2 && isproton0 && iskaon1) okLcpKpi=1;
590 if(ispion0 && isproton2 && iskaon1) okLcpiKp=1;
591 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
592 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
593 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
601 //---------------------------------------------------------------------------
602 Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPID(AliAODRecoDecayHF* obj) {
604 if(!fUsePID || !obj) {return 3;}
605 Int_t okLcpKpi=0,okLcpiKp=0;
607 Bool_t isPeriodd=fPidHF->GetOnePad();
608 Bool_t isMC=fPidHF->GetMC();
611 fPidObjprot->SetOnePad(kTRUE);
612 fPidObjpion->SetOnePad(kTRUE);
615 fPidObjprot->SetMC(kTRUE);
616 fPidObjpion->SetMC(kTRUE);
619 AliVTrack *track0=dynamic_cast<AliVTrack*>(obj->GetDaughter(0));
620 AliVTrack *track1=dynamic_cast<AliVTrack*>(obj->GetDaughter(1));
621 AliVTrack *track2=dynamic_cast<AliVTrack*>(obj->GetDaughter(2));
622 if (!track0 || !track1 || !track2) return 0;
623 Double_t prob0[AliPID::kSPECIES];
624 Double_t prob1[AliPID::kSPECIES];
625 Double_t prob2[AliPID::kSPECIES];
626 if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
627 fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
628 if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
630 if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
631 fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
632 if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
634 if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
635 fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
636 if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
638 if(fPIDThreshold[AliPID::kPion]>0. && fPIDThreshold[AliPID::kKaon]>0. && fPIDThreshold[AliPID::kProton]>0.){
639 okLcpiKp= (prob0[AliPID::kPion ]>fPIDThreshold[AliPID::kPion ])
640 &&(prob1[AliPID::kKaon ]>fPIDThreshold[AliPID::kKaon ])
641 &&(prob2[AliPID::kProton]>fPIDThreshold[AliPID::kProton]);
642 okLcpKpi= (prob0[AliPID::kProton]>fPIDThreshold[AliPID::kProton])
643 &&(prob1[AliPID::kKaon ]>fPIDThreshold[AliPID::kKaon ])
644 &&(prob2[AliPID::kPion ]>fPIDThreshold[AliPID::kPion ]);
649 if(TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]){
650 if(TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) okLcpKpi = 1;
651 if(TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) okLcpiKp = 1;
655 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
656 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
657 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
661 //-----------------------
662 Int_t AliRDHFCutsLctopKpi::CombinePIDCuts(Int_t returnvalue, Int_t returnvaluePID) const {
664 Int_t returnvalueTot=0;
665 Int_t okLcpKpi=0,okLcpiKp=0;
666 if(returnvaluePID==1){
667 if(returnvalue==1 || returnvalue==3) okLcpKpi=1;
669 if(returnvaluePID==2){
670 if(returnvalue>=2) okLcpiKp=1;
672 if(returnvaluePID==3 && returnvalue>0){
673 if(returnvalue==1 || returnvalue==3) okLcpKpi=1;
674 if(returnvalue>=2) okLcpiKp=1;
677 if(okLcpKpi) returnvalueTot=1; //cuts passed as Lc->pKpi
678 if(okLcpiKp) returnvalueTot=2; //cuts passed as Lc->piKp
679 if(okLcpKpi && okLcpiKp) returnvalueTot=3; //cuts passed as both pKpi and piKp
680 return returnvalueTot;
682 //----------------------------------
683 void AliRDHFCutsLctopKpi::SetStandardCutsPP2010() {
685 SetName("LctopKpiProdCuts");
686 SetTitle("Production cuts for Lc analysis");
688 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
689 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
690 esdTrackCuts->SetRequireTPCRefit(kTRUE);
691 esdTrackCuts->SetMinNClustersTPC(70);
692 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
693 AliESDtrackCuts::kAny);
694 esdTrackCuts->SetRequireITSRefit(kTRUE);
695 esdTrackCuts->SetMinNClustersITS(4);
696 esdTrackCuts->SetMinDCAToVertexXY(0.);
697 esdTrackCuts->SetEtaRange(-0.8,0.8);
698 esdTrackCuts->SetPtRange(0.3,1.e10);
699 AddTrackCuts(esdTrackCuts);
701 const Int_t nptbins=8;
702 const Int_t nvars=13;
704 ptbins=new Float_t[nptbins+1];
716 SetGlobalIndex(nvars,nptbins);
717 SetPtBins(nptbins+1,ptbins);
719 Float_t** prodcutsval;
720 prodcutsval=new Float_t*[nvars];
721 for(Int_t iv=0;iv<nvars;iv++){
722 prodcutsval[iv]=new Float_t[nptbins];
725 for(Int_t ipt=0;ipt<nptbins;ipt++){
726 prodcutsval[0][ipt]=0.13;
727 prodcutsval[1][ipt]=0.4;
728 prodcutsval[2][ipt]=0.4;
729 prodcutsval[3][ipt]=0.;
730 prodcutsval[4][ipt]=0.;
731 prodcutsval[5][ipt]=0.;
732 prodcutsval[6][ipt]=0.06;
733 prodcutsval[7][ipt]=0.005;
734 prodcutsval[8][ipt]=0.;
735 prodcutsval[9][ipt]=0.;
736 prodcutsval[10][ipt]=0.;
737 prodcutsval[11][ipt]=0.05;
738 prodcutsval[12][ipt]=0.4;
740 SetCuts(nvars,nptbins,prodcutsval);
742 AliAODPidHF* pidObjK=new AliAODPidHF();
743 Double_t sigmasK[5]={3.,1.,1.,3.,2.};
744 pidObjK->SetSigma(sigmasK);
745 pidObjK->SetAsym(kTRUE);
746 pidObjK->SetMatch(1);
747 pidObjK->SetTPC(kTRUE);
748 pidObjK->SetTOF(kTRUE);
749 pidObjK->SetITS(kTRUE);
750 Double_t plimK[2]={0.5,0.8};
751 pidObjK->SetPLimit(plimK,2);
752 pidObjK->SetTOFdecide(kTRUE);
756 AliAODPidHF* pidObjpi=new AliAODPidHF();
757 pidObjpi->SetTPC(kTRUE);
758 Double_t sigmaspi[5]={3.,0.,0.,0.,0.};
759 pidObjpi->SetSigma(sigmaspi);
760 pidObjpi->SetTOFdecide(kTRUE);
761 SetPidpion(pidObjpi);
763 AliAODPidHF* pidObjp=new AliAODPidHF();
764 Double_t sigmasp[5]={3.,1.,1.,3.,2.};
765 pidObjp->SetSigma(sigmasp);
766 pidObjp->SetAsym(kTRUE);
767 pidObjp->SetMatch(1);
768 pidObjp->SetTPC(kTRUE);
769 pidObjp->SetTOF(kTRUE);
770 pidObjp->SetITS(kTRUE);
771 Double_t plimp[2]={1.,2.};
772 pidObjp->SetPLimit(plimp,2);
773 pidObjp->SetTOFdecide(kTRUE);
782 for(Int_t iiv=0;iiv<nvars;iiv++){
783 delete [] prodcutsval[iiv];
785 delete [] prodcutsval;
800 void AliRDHFCutsLctopKpi::SetStandardCutsPbPb2010() {
802 SetName("LctopKpiProdCuts");
803 SetTitle("Production cuts for Lc analysis");
805 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
807 esdTrackCuts->SetRequireTPCRefit(kTRUE);
808 esdTrackCuts->SetMinNClustersTPC(70);
809 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
810 AliESDtrackCuts::kAny);
811 esdTrackCuts->SetRequireITSRefit(kTRUE);
812 esdTrackCuts->SetMinNClustersITS(4);
813 esdTrackCuts->SetMinDCAToVertexXYPtDep("0.0100*TMath::Max(0.,(1-TMath::Floor(TMath::Abs(pt)/2.)))");
814 esdTrackCuts->SetEtaRange(-0.8,0.8);
815 esdTrackCuts->SetMaxDCAToVertexXY(1.);
816 esdTrackCuts->SetMaxDCAToVertexZ(1.);
817 esdTrackCuts->SetPtRange(0.49,1.e10);
818 AddTrackCuts(esdTrackCuts);
820 const Int_t nptbins=8;
821 const Int_t nvars=13;
823 ptbins=new Float_t[nptbins+1];
836 SetGlobalIndex(nvars,nptbins);
837 SetPtBins(nptbins+1,ptbins);
839 Float_t** prodcutsval;
840 prodcutsval=new Float_t*[nvars];
841 for(Int_t iv=0;iv<nvars;iv++){
842 prodcutsval[iv]=new Float_t[nptbins];
845 for(Int_t ipt=0;ipt<nptbins;ipt++){
846 prodcutsval[0][ipt]=0.13;
847 prodcutsval[1][ipt]=0.5;
848 prodcutsval[2][ipt]=0.6;
849 prodcutsval[3][ipt]=0.;
850 prodcutsval[4][ipt]=0.;
851 prodcutsval[5][ipt]=0.01;
852 prodcutsval[6][ipt]=0.04;
853 prodcutsval[7][ipt]=0.006;
854 prodcutsval[8][ipt]=0.8;
855 prodcutsval[9][ipt]=0.3;
856 prodcutsval[10][ipt]=0.;
857 prodcutsval[11][ipt]=0.05;
858 prodcutsval[12][ipt]=0.4;
860 SetCuts(nvars,nptbins,prodcutsval);
862 AliAODPidHF* pidObj=new AliAODPidHF();
863 pidObj->SetTPC(kTRUE);
864 pidObj->SetTOF(kTRUE);
871 GetPidHF()->SetUseCombined(kTRUE);
872 GetPidHF()->SetUseDefaultPriors(kTRUE);
873 GetPidHF()->SetCombDetectors(AliAODPidHF::kTPCTOF);
874 for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies){
875 SetPIDThreshold(static_cast<AliPID::EParticleType>(ispecies),0);
877 SetPIDStrategy(AliRDHFCutsLctopKpi::kCombinedpPb);
883 for(Int_t iiv=0;iiv<nvars;iiv++){
884 delete [] prodcutsval[iiv];
886 delete [] prodcutsval;
897 AliKFParticle* AliRDHFCutsLctopKpi::ReconstructKF(AliAODRecoDecayHF3Prong *d,Int_t *pdgs,Double_t field,Bool_t constraint) const{
898 // Method to construct the KF particle from the candidate
900 const Int_t nprongs=d->GetNProngs();
901 if(nprongs<=0) return 0x0;
903 Int_t iprongs[nprongs];
904 for(Int_t i=0;i<nprongs;i++) iprongs[i]=i;
906 Double_t mass[2]={0.,0.};
908 AliKFParticle *decay=d->ApplyVertexingKF(iprongs,nprongs,pdgs,constraint,field,mass);
909 if(!decay) return 0x0;
910 AliESDVertex *vertexESD = new AliESDVertex(decay->Parameters(),
911 decay->CovarianceMatrix(),
914 Double_t pos[3],cov[6],chi2perNDF;
915 vertexESD->GetXYZ(pos);
916 vertexESD->GetCovMatrix(cov);
917 chi2perNDF = vertexESD->GetChi2toNDF();
918 delete vertexESD; vertexESD=NULL;
919 AliAODVertex *vertexAOD = new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,nprongs);
920 d->SetSecondaryVtx(vertexAOD);
925 void AliRDHFCutsLctopKpi::SetStandardCutsPbPb2011() {
927 // Default 2010 PbPb cut object
928 SetStandardCutsPbPb2010();
931 // Enable all 2011 PbPb run triggers
934 ResetMaskAndEnableMBTrigger();
935 EnableCentralTrigger();
936 EnableSemiCentralTrigger();
940 Bool_t AliRDHFCutsLctopKpi::IsInFiducialAcceptance(Double_t pt, Double_t y) const
943 // // Checking if Lc is in fiducial acceptance region
946 if(fMaxRapidityCand>-998.){
947 if(TMath::Abs(y) > fMaxRapidityCand) return kFALSE;
952 // applying cut for pt > 5 GeV
953 AliDebug(2,Form("pt of Lc = %f (> 5), cutting at |y| < 0.8",pt));
954 if (TMath::Abs(y) > 0.8) return kFALSE;
957 // appliying smooth cut for pt < 5 GeV
958 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
959 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
960 AliDebug(2,Form("pt of Lc = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
961 if (y < minFiducialY || y > maxFiducialY) return kFALSE;
966 //--------------------------------------------------------
967 Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPIDSoft(AliAODRecoDecayHF* obj) {
968 if(!fUsePID || !obj) {return 3;}
969 Int_t okLcpKpi=0,okLcpiKp=0;
972 AliVTrack *track0=dynamic_cast<AliVTrack*>(obj->GetDaughter(0));
973 AliVTrack *track1=dynamic_cast<AliVTrack*>(obj->GetDaughter(1));
974 AliVTrack *track2=dynamic_cast<AliVTrack*>(obj->GetDaughter(2));
975 if (!track0 || !track1 || !track2) return 0;
976 Double_t prob0[AliPID::kSPECIES];
977 Double_t prob1[AliPID::kSPECIES];
978 Double_t prob2[AliPID::kSPECIES];
980 Bool_t isTOF0=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(0));
981 Bool_t isTOF1=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(1));
982 Bool_t isTOF2=fPidHF->CheckTOFPIDStatus((AliAODTrack*)obj->GetDaughter(2));
986 if(track1->P()<1.8) {
987 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
988 if(obj->Pt()<3. && track1->P()<0.55) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
989 fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
992 AliAODTrack *trackaod1=(AliAODTrack*)(obj->GetDaughter(1));
993 if(trackaod1->P()<0.55){
994 fPidHF->SetTOF(kFALSE);
995 fPidHF->SetTOFdecide(kFALSE);
997 Int_t isKaon=fPidHF->MakeRawPid(trackaod1,3);
998 if(isKaon>=1) isK1=kTRUE;
999 if(trackaod1->P()<0.55){
1000 fPidHF->SetTOF(kTRUE);
1001 fPidHF->SetTOFdecide(kTRUE);
1005 if(track1->P()<0.8){
1006 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
1007 fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob0);
1009 AliAODTrack *trackaod1=(AliAODTrack*)(obj->GetDaughter(1));
1010 if(trackaod1->P()<0.55){
1011 fPidHF->SetTOF(kFALSE);
1012 fPidHF->SetTOFdecide(kFALSE);
1014 Int_t isKaon=fPidHF->MakeRawPid(trackaod1,3);
1015 if(isKaon>=1) isK1=kTRUE;
1016 if(trackaod1->P()<0.55){
1017 fPidHF->SetTOF(kTRUE);
1018 fPidHF->SetTOFdecide(kTRUE);
1023 Bool_t ispi0=kFALSE;
1025 Bool_t ispi2=kFALSE;
1028 if(isTOF0){ //proton
1029 if(track0->P()<2.2) {
1030 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
1031 if(obj->Pt()<3. && track0->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
1032 fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
1034 AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(0));
1035 if(trackaod0->P()<1.){
1036 fPidObjprot->SetTOF(kFALSE);
1037 fPidObjprot->SetTOFdecide(kFALSE);
1039 Int_t isProton=fPidObjprot->MakeRawPid(trackaod0,4);
1040 if(isProton>=1) isp0=kTRUE;
1041 if(trackaod0->P()<1.){
1042 fPidObjprot->SetTOF(kTRUE);
1043 fPidObjprot->SetTOFdecide(kTRUE);
1047 if(track0->P()<1.2){
1048 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
1049 fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
1051 AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(0));
1052 if(trackaod0->P()<1.){
1053 fPidObjprot->SetTOF(kFALSE);
1054 fPidObjprot->SetTOFdecide(kFALSE);
1056 Int_t isProton=fPidObjprot->MakeRawPid(trackaod0,4);
1057 if(isProton>=1) isp0=kTRUE;
1058 if(trackaod0->P()<1.){
1059 fPidObjprot->SetTOF(kTRUE);
1060 fPidObjprot->SetTOFdecide(kTRUE);
1065 if(isTOF2){ //proton
1066 if(track2->P()<2.2) {
1067 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
1068 if(obj->Pt()<3. && track2->P()<1.) fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
1069 fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
1071 AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
1072 if(trackaod2->P()<1.){
1073 fPidObjprot->SetTOF(kFALSE);
1074 fPidObjprot->SetTOFdecide(kFALSE);
1076 Int_t isProton=fPidObjprot->MakeRawPid(trackaod2,4);
1077 if(isProton>=1) isp2=kTRUE;
1078 if(trackaod2->P()<1.){
1079 fPidObjprot->SetTOF(kTRUE);
1080 fPidObjprot->SetTOFdecide(kTRUE);
1084 if(track2->P()<1.2){
1085 fPidHF->GetPidCombined()->SetDetectorMask(AliPIDResponse::kDetTPC);
1086 fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
1088 AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
1089 if(trackaod2->P()<1.){
1090 fPidObjprot->SetTOF(kFALSE);
1091 fPidObjprot->SetTOFdecide(kFALSE);
1093 Int_t isProton=fPidObjprot->MakeRawPid(trackaod2,4);
1094 if(isProton>=1) isp2=kTRUE;
1095 if(trackaod2->P()<1.){
1096 fPidObjprot->SetTOF(kTRUE);
1097 fPidObjprot->SetTOFdecide(kTRUE);
1101 AliAODTrack *trackaod2=(AliAODTrack*)(obj->GetDaughter(2));
1102 if(fPidObjpion->MakeRawPid(trackaod2,2)>=1)ispi2=kTRUE;
1103 AliAODTrack *trackaod0=(AliAODTrack*)(obj->GetDaughter(2));
1104 if(fPidObjpion->MakeRawPid(trackaod0,2)>=1)ispi0=kTRUE;
1106 if(TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]){
1108 if(TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) okLcpKpi = 1;
1109 if(TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) okLcpiKp = 1;
1112 if(!isK1 && TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]) isK1=kTRUE;
1113 if(!ispi0 && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) ispi0=kTRUE;
1114 if(!ispi2 && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) ispi2=kTRUE;
1115 if(!isp0 && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton]) isp0=kTRUE;
1116 if(!isp2 && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton]) isp2=kTRUE;
1117 if(isK1 && ispi0 && isp2) okLcpiKp = 1;
1118 if(isK1 && isp0 && ispi2) okLcpKpi = 1;
1120 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
1121 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
1122 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
1128 //----------------------------------------------------------
1129 Int_t AliRDHFCutsLctopKpi::IsSelectedPIDStrong(AliAODRecoDecayHF* obj) {
1132 if(!fUsePID || !obj) return 3;
1133 Int_t okLcpKpi=0,okLcpiKp=0;
1134 Int_t returnvalue=0;
1135 Bool_t isPeriodd=fPidHF->GetOnePad();
1136 Bool_t isMC=fPidHF->GetMC();
1137 Bool_t ispion0=kTRUE,ispion2=kTRUE;
1138 Bool_t isproton0=kFALSE,isproton2=kFALSE;
1139 Bool_t iskaon1=kFALSE;
1141 fPidObjprot->SetOnePad(kTRUE);
1142 fPidObjpion->SetOnePad(kTRUE);
1145 fPidObjprot->SetMC(kTRUE);
1146 fPidObjpion->SetMC(kTRUE);
1149 for(Int_t i=0;i<3;i++){
1150 AliAODTrack *track=(AliAODTrack*)obj->GetDaughter(i);
1151 if(!track) return 0;
1154 Int_t isKaon=fPidHF->MakeRawPid(track,3);
1157 if(fPidHF->MakeRawPid(track,2)>=1) iskaon1=kFALSE;
1159 if(!iskaon1) return 0;
1164 Int_t isProton=fPidObjprot->MakeRawPid(track,4);
1166 if(fPidHF->MakeRawPid(track,2)>=1) isProton=-1;
1167 if(fPidHF->MakeRawPid(track,3)>=1) isProton=-1;
1170 Int_t isPion=fPidObjpion->MakeRawPid(track,2);
1171 if(fPidHF->MakeRawPid(track,3)>=1) isPion=-1;
1172 if(fPidObjprot->MakeRawPid(track,4)>=1) isPion=-1;
1176 if(isPion<0) ispion0=kFALSE;
1177 if(isProton>=1) isproton0=kTRUE;
1180 if(!ispion0 && !isproton0) return 0;
1182 if(isPion<0) ispion2=kFALSE;
1183 if(isProton>=1) isproton2=kTRUE;
1189 if(ispion2 && isproton0 && iskaon1) okLcpKpi=1;
1190 if(ispion0 && isproton2 && iskaon1) okLcpiKp=1;
1191 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
1192 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
1193 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
1197 //--------------------
1198 Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPIDpPb(AliAODRecoDecayHF* obj) {
1200 if(!fUsePID || !obj) {return 3;}
1201 Int_t okLcpKpi=0,okLcpiKp=0;
1202 Int_t returnvalue=0;
1204 Bool_t isMC=fPidHF->GetMC();
1208 fPidObjprot->SetMC(kTRUE);
1209 fPidObjpion->SetMC(kTRUE);
1212 AliVTrack *track0=dynamic_cast<AliVTrack*>(obj->GetDaughter(0));
1213 AliVTrack *track1=dynamic_cast<AliVTrack*>(obj->GetDaughter(1));
1214 AliVTrack *track2=dynamic_cast<AliVTrack*>(obj->GetDaughter(2));
1215 if (!track0 || !track1 || !track2) return 0;
1216 Double_t prob0[AliPID::kSPECIES];
1217 Double_t prob1[AliPID::kSPECIES];
1218 Double_t prob2[AliPID::kSPECIES];
1220 fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
1221 fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
1222 fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
1225 if(fPIDThreshold[AliPID::kPion]>0. && fPIDThreshold[AliPID::kKaon]>0. && fPIDThreshold[AliPID::kProton]>0.){
1226 okLcpiKp= (prob0[AliPID::kPion ]>fPIDThreshold[AliPID::kPion ])
1227 &&(prob1[AliPID::kKaon ]>fPIDThreshold[AliPID::kKaon ])
1228 &&(prob2[AliPID::kProton]>fPIDThreshold[AliPID::kProton]);
1229 okLcpKpi= (prob0[AliPID::kProton]>fPIDThreshold[AliPID::kProton])
1230 &&(prob1[AliPID::kKaon ]>fPIDThreshold[AliPID::kKaon ])
1231 &&(prob2[AliPID::kPion ]>fPIDThreshold[AliPID::kPion ]);
1236 if(TMath::MaxElement(AliPID::kSPECIES,prob1) == prob1[AliPID::kKaon]){
1237 if(TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kPion]) okLcpKpi = 1;
1238 if(TMath::MaxElement(AliPID::kSPECIES,prob2) == prob2[AliPID::kProton] && TMath::MaxElement(AliPID::kSPECIES,prob0) == prob0[AliPID::kPion]) okLcpiKp = 1;
1242 if(okLcpKpi) returnvalue=1; //cuts passed as Lc->pKpi
1243 if(okLcpiKp) returnvalue=2; //cuts passed as Lc->piKp
1244 if(okLcpKpi && okLcpiKp) returnvalue=3; //cuts passed as both pKpi and piKp
1248 //-----------------------
1249 Int_t AliRDHFCutsLctopKpi::IsSelectedCombinedPIDpPb2(AliAODRecoDecayHF* obj) {
1251 Int_t returnvalue =0;
1252 Double_t thresholdK =0.7;
1253 Double_t thresholdPi =0.3; //!
1254 Double_t thresholdPr =0.7;
1256 AliVTrack *track0=dynamic_cast<AliVTrack*>(obj->GetDaughter(0));
1257 AliVTrack *track1=dynamic_cast<AliVTrack*>(obj->GetDaughter(1));
1258 AliVTrack *track2=dynamic_cast<AliVTrack*>(obj->GetDaughter(2));
1260 if (!track0 || !track1 || !track2) return 0;
1261 Double_t prob0[AliPID::kSPECIES];
1262 Double_t prob1[AliPID::kSPECIES];
1263 Double_t prob2[AliPID::kSPECIES];
1265 fPidHF->GetPidCombined()->ComputeProbabilities(track0,fPidHF->GetPidResponse(),prob0);
1266 fPidHF->GetPidCombined()->ComputeProbabilities(track1,fPidHF->GetPidResponse(),prob1);
1267 fPidHF->GetPidCombined()->ComputeProbabilities(track2,fPidHF->GetPidResponse(),prob2);
1269 if(prob1[AliPID::kKaon]>thresholdK){
1270 if(TMath::MaxElement(AliPID::kSPECIES,prob0)>TMath::MaxElement(AliPID::kSPECIES,prob2)){
1271 if(((prob0[AliPID::kPion ]>prob0[AliPID::kProton ])&& prob0[AliPID::kPion]>thresholdPi) && prob2[AliPID::kProton]>thresholdPr) returnvalue=2;//piKp
1272 else if(((prob0[AliPID::kProton ]>prob0[AliPID::kPion ])&& prob0[AliPID::kProton]>thresholdPr) && prob2[AliPID::kPion]>thresholdPi)returnvalue =1;//pKpi
1275 else if(TMath::MaxElement(AliPID::kSPECIES,prob0)<TMath::MaxElement(AliPID::kSPECIES,prob2)){
1276 if(((prob2[AliPID::kPion ]>prob2[AliPID::kProton ])&& prob2[AliPID::kPion]>thresholdPi) && prob0[AliPID::kProton]>thresholdPr) returnvalue=1; //pKpi
1277 else if(((prob2[AliPID::kProton ]>prob2[AliPID::kPion ])&& prob2[AliPID::kProton]>thresholdPr) && prob0[AliPID::kPion]>thresholdPi)returnvalue =2; //piKp
1284 //------------------------------------------------------
1285 void AliRDHFCutsLctopKpi::SetStandardCutsPPb2013() {
1287 SetName("LctopKpiProdCuts");
1288 SetTitle("Production cuts for Lc analysis");
1290 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
1291 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
1292 esdTrackCuts->SetRequireTPCRefit(kTRUE);
1293 esdTrackCuts->SetMinNClustersTPC(70);
1294 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
1295 AliESDtrackCuts::kAny);
1296 esdTrackCuts->SetRequireITSRefit(kTRUE);
1297 esdTrackCuts->SetMinNClustersITS(4);
1298 esdTrackCuts->SetMinDCAToVertexXY(0.);
1299 esdTrackCuts->SetEtaRange(-0.8,0.8);
1300 esdTrackCuts->SetPtRange(0.3,1.e10);
1301 AddTrackCuts(esdTrackCuts);
1303 const Int_t nvars=13;
1304 const Int_t nptbins=9;
1306 ptbins=new Float_t[nptbins+1];
1318 SetGlobalIndex(nvars,nptbins);
1319 SetPtBins(nptbins+1,ptbins);
1321 Float_t** prodcutsval;
1322 prodcutsval=new Float_t*[nvars];
1323 for(Int_t iv=0;iv<nvars;iv++){
1324 prodcutsval[iv]=new Float_t[nptbins];
1327 for(Int_t ipt=0;ipt<nptbins;ipt++){
1328 prodcutsval[0][ipt]=0.13;
1329 prodcutsval[1][ipt]=0.4;
1330 prodcutsval[2][ipt]=0.4;
1331 prodcutsval[3][ipt]=0.;
1332 prodcutsval[4][ipt]=0.;
1333 prodcutsval[5][ipt]=0.;
1334 prodcutsval[6][ipt]=0.06;
1335 prodcutsval[7][ipt]=0.;
1336 prodcutsval[8][ipt]=0.;
1337 prodcutsval[9][ipt]=0.;
1338 prodcutsval[10][ipt]=0.;
1339 prodcutsval[11][ipt]=0.05;
1340 prodcutsval[12][ipt]=0.4;
1342 SetCuts(nvars,nptbins,prodcutsval);
1344 AliAODPidHF* pidObjK=new AliAODPidHF();
1345 Double_t sigmasK[5]={3.,1.,1.,3.,2.};
1346 pidObjK->SetSigma(sigmasK);
1347 pidObjK->SetAsym(kTRUE);
1348 pidObjK->SetMatch(1);
1349 pidObjK->SetTPC(kTRUE);
1350 pidObjK->SetTOF(kTRUE);
1351 pidObjK->SetITS(kTRUE);
1352 Double_t plimK[2]={0.5,0.8};
1353 pidObjK->SetPLimit(plimK,2);
1354 pidObjK->SetTOFdecide(kTRUE);
1357 AliAODPidHF* pidObjpi=new AliAODPidHF();
1358 pidObjpi->SetTPC(kTRUE);
1359 Double_t sigmaspi[5]={3.,0.,0.,0.,0.};
1360 pidObjpi->SetSigma(sigmaspi);
1361 pidObjpi->SetTOFdecide(kTRUE);
1362 SetPidpion(pidObjpi);
1364 AliAODPidHF* pidObjp=new AliAODPidHF();
1365 Double_t sigmasp[5]={3.,1.,1.,3.,2.};
1366 pidObjp->SetSigma(sigmasp);
1367 pidObjp->SetAsym(kTRUE);
1368 pidObjp->SetMatch(1);
1369 pidObjp->SetTPC(kTRUE);
1370 pidObjp->SetTOF(kTRUE);
1371 pidObjp->SetITS(kTRUE);
1372 Double_t plimp[2]={1.,2.};
1373 pidObjp->SetPLimit(plimp,2);
1374 pidObjp->SetTOFdecide(kTRUE);
1380 for(Int_t iiv=0;iiv<nvars;iiv++){
1381 delete [] prodcutsval[iiv];
1383 delete [] prodcutsval;