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 D+->Kpipi
22 // Author: R. Bala, bala@to.infn.it
23 // G. Ortona, ortona@to.infn.it
24 /////////////////////////////////////////////////////////////
26 #include <TDatabasePDG.h>
27 #include <Riostream.h>
29 #include "AliRDHFCutsDplustoKpipi.h"
30 #include "AliAODRecoDecayHF3Prong.h"
31 #include "AliAODTrack.h"
32 #include "AliESDtrack.h"
35 ClassImp(AliRDHFCutsDplustoKpipi)
37 //--------------------------------------------------------------------------
38 AliRDHFCutsDplustoKpipi::AliRDHFCutsDplustoKpipi(const char* name) :
42 fUseImpParProdCorrCut(kFALSE)
45 // Default Constructor
49 TString varNames[14]={"inv. mass [GeV]",
52 "d0K [cm] lower limit!",
53 "d0Pi [cm] lower limit!",
57 "pM=Max{pT1,pT2,pT3} (GeV/c)",
63 Bool_t isUpperCut[14]={kTRUE,
77 SetVarNames(nvars,varNames,isUpperCut);
78 Bool_t forOpt[14]={kFALSE,
92 SetVarsForOpt(7,forOpt);
93 Float_t limits[2]={0,999999999.};
95 if(fPidHF)delete fPidHF;
96 fPidHF=new AliAODPidHF();
97 Double_t plim[2]={0.6,0.8};
98 Double_t nsigma[5]={2.,1.,2.,3.,0.};
100 fPidHF->SetPLimit(plim);
101 fPidHF->SetAsym(kTRUE);
102 fPidHF->SetSigma(nsigma);
108 fPidHF->SetCompat(kTRUE);
120 //--------------------------------------------------------------------------
121 AliRDHFCutsDplustoKpipi::AliRDHFCutsDplustoKpipi(const AliRDHFCutsDplustoKpipi &source) :
123 fUseStrongPid(source.fUseStrongPid),
124 fMaxPtStrongPid(source.fMaxPtStrongPid),
125 fUseImpParProdCorrCut(source.fUseImpParProdCorrCut)
132 //--------------------------------------------------------------------------
133 AliRDHFCutsDplustoKpipi &AliRDHFCutsDplustoKpipi::operator=(const AliRDHFCutsDplustoKpipi &source)
136 // assignment operator
138 if(&source == this) return *this;
140 AliRDHFCuts::operator=(source);
147 //---------------------------------------------------------------------------
148 void AliRDHFCutsDplustoKpipi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters,AliAODEvent *aod) {
150 // Fills in vars the values of the variables
154 if(nvars!=fnVarsForOpt) {
155 printf("AliRDHFCutsDplustoKpipi::GetCutsVarsForOpt: wrong number of variables\n");
159 AliAODRecoDecayHF3Prong *dd = (AliAODRecoDecayHF3Prong*)d;
161 //recalculate vertex w/o daughters
162 Bool_t cleanvtx=kFALSE;
163 AliAODVertex *origownvtx=0x0;
164 if(fRemoveDaughtersFromPrimary) {
165 if(dd->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*dd->GetOwnPrimaryVtx());
167 if(!RecalcOwnPrimaryVtx(dd,aod)) {
168 CleanOwnPrimaryVtx(dd,aod,origownvtx);
176 vars[iter]=dd->InvMassDplus();
180 for(Int_t iprong=0;iprong<3;iprong++){
181 if(TMath::Abs(pdgdaughters[iprong])==321) {
182 vars[iter]=dd->PtProng(iprong);
188 Float_t minPtDau=1000000.0;
189 for(Int_t iprong=0;iprong<3;iprong++){
190 if(TMath::Abs(pdgdaughters[iprong])==211) {
191 if(dd->PtProng(iprong)<minPtDau){
192 minPtDau=dd->PtProng(iprong);
200 for(Int_t iprong=0;iprong<3;iprong++){
201 if(TMath::Abs(pdgdaughters[iprong])==321) {
202 vars[iter]=dd->Getd0Prong(iprong);
208 Float_t minImpParDau=1000000.0;
209 for(Int_t iprong=0;iprong<3;iprong++){
210 if(TMath::Abs(pdgdaughters[iprong])==211) {
211 if(dd->Getd0Prong(iprong)<minImpParDau){
212 minImpParDau=dd->Getd0Prong(iprong);
216 vars[iter]=minImpParDau;
220 Float_t dist12 = dd->GetDist12toPrim();
221 Float_t dist23 = dd->GetDist23toPrim();
222 if(dist12<dist23)vars[iter]=dist12;
223 else vars[iter]=dist23;
227 vars[iter]=dd->GetSigmaVert(aod);
231 vars[iter] = dd->DecayLength();
236 for(Int_t i=0;i<3;i++){
237 if(dd->PtProng(i)>ptmax)ptmax=dd->PtProng(i);
243 vars[iter]=dd->CosPointingAngle();
247 vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
252 for(Int_t iprong=0;iprong<3;iprong++){
253 if(dd->GetDCA(iprong)<maxDCA){
254 maxDCA=dd->GetDCA(iprong);
261 vars[iter]=dd->NormalizedDecayLengthXY()*dd->P()/dd->Pt();
265 vars[iter]=dd->CosPointingAngleXY();
268 if(cleanvtx)CleanOwnPrimaryVtx(dd,aod,origownvtx);
272 //---------------------------------------------------------------------------
273 Bool_t AliRDHFCutsDplustoKpipi::IsInFiducialAcceptance(Double_t pt, Double_t y) const
276 // Checking if Dplus is in fiducial acceptance region
280 // applying cut for pt > 5 GeV
281 AliDebug(2,Form("pt of D+ = %f (> 5), cutting at |y| < 0.8",pt));
282 if (TMath::Abs(y) > 0.8) return kFALSE;
285 // appliying smooth cut for pt < 5 GeV
286 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
287 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
288 AliDebug(2,Form("pt of D+ = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
289 if (y < minFiducialY || y > maxFiducialY) return kFALSE;
295 //---------------------------------------------------------------------------
296 Int_t AliRDHFCutsDplustoKpipi::IsSelectedPID(AliAODRecoDecayHF *rd)
299 // PID selection, returns 3 if accepted, 0 if not accepted
301 if(!fUsePID || !rd) return 3;
302 //if(fUsePID)printf("i am inside the pid \n");
305 Int_t sign= rd->GetCharge();
306 for(Int_t daught=0;daught<3;daught++){
307 AliAODTrack *track=(AliAODTrack*)rd->GetDaughter(daught);
308 Int_t isPion=fPidHF->MakeRawPid(track,AliPID::kPion);
309 Int_t isKaon=fPidHF->MakeRawPid(track,AliPID::kKaon);
310 Int_t isProton=fPidHF->MakeRawPid(track,AliPID::kProton);
312 if(isProton>0 && isKaon<0 && isPion<0) return 0;
313 if(isKaon>0 && isPion<0) nkaons++;
314 if(isKaon<0) nNotKaons++;
315 if(sign==track->Charge()){//pions
316 if(isPion<0)return 0;
317 if(rd->Pt()<fMaxPtStrongPid && isPion<=0 && fUseStrongPid>1)return 0;
320 if(isKaon<0)return 0;
321 if(rd->Pt()<fMaxPtStrongPid && isKaon<=0 && fUseStrongPid>0)return 0;
325 if(nkaons>1)return 0;
326 if(nNotKaons==3)return 0;
332 //---------------------------------------------------------------------------
333 Int_t AliRDHFCutsDplustoKpipi::IsSelected(TObject* obj,Int_t selectionLevel, AliAODEvent* aod) {
335 // Apply selection, returns 3 if accepted, 0 if not accepted
343 cout<<"Cut matrix not inizialized. Exit..."<<endl;
347 AliAODRecoDecayHF3Prong* d=(AliAODRecoDecayHF3Prong*)obj;
351 cout<<"AliAODRecoDecayHF3Prong null"<<endl;
355 if(fKeepSignalMC) if(IsSignalMC(d,aod,411)) return 3;
358 Int_t returnvaluePID=3;
359 Int_t returnvalueCuts=3;
362 if(pt<fMinPtCand) return 0;
363 if(pt>fMaxPtCand) return 0;
365 if(d->HasBadDaughters()) return 0;
367 // selection on candidate
368 if(selectionLevel==AliRDHFCuts::kAll ||
369 selectionLevel==AliRDHFCuts::kCandidate) {
371 //recalculate vertex w/o daughters
372 AliAODVertex *origownvtx=0x0;
373 if(fRemoveDaughtersFromPrimary) {
374 if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());
375 if(!RecalcOwnPrimaryVtx(d,aod)) {
376 CleanOwnPrimaryVtx(d,aod,origownvtx);
381 Int_t ptbin=PtBin(pt);
383 CleanOwnPrimaryVtx(d,aod,origownvtx);
387 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
388 Double_t mDplus=d->InvMassDplus();
389 if(TMath::Abs(mDplus-mDplusPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
392 if(d->GetDist12toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]|| d->GetDist23toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
394 Double_t sum2=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
395 if(sum2<fCutsRD[GetGlobalIndex(10,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
397 if(fUseImpParProdCorrCut){
398 if(d->Getd0Prong(0)*d->Getd0Prong(1)<0. && d->Getd0Prong(2)*d->Getd0Prong(1)<0.) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
403 for(Int_t i=0;i<3;i++) if(d->GetDCA(i)>fCutsRD[GetGlobalIndex(11,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
405 if(d->Pt2Prong(1) < fCutsRD[GetGlobalIndex(1,ptbin)]*fCutsRD[GetGlobalIndex(1,ptbin)] || TMath::Abs(d->Getd0Prong(1))<fCutsRD[GetGlobalIndex(3,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}//Kaon
407 if(d->Pt2Prong(0) < fCutsRD[GetGlobalIndex(2,ptbin)]*fCutsRD[GetGlobalIndex(2,ptbin)] || TMath::Abs(d->Getd0Prong(0))<fCutsRD[GetGlobalIndex(4,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}//Pion1
409 if(d->Pt2Prong(2) < fCutsRD[GetGlobalIndex(2,ptbin)]*fCutsRD[GetGlobalIndex(2,ptbin)] || TMath::Abs(d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(4,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}//Pion2
411 if(d->Pt2Prong(0)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)] && d->Pt2Prong(1)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)] && d->Pt2Prong(2)<fCutsRD[GetGlobalIndex(8,ptbin)]*fCutsRD[GetGlobalIndex(8,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
413 if(d->DecayLength2()<fCutsRD[GetGlobalIndex(7,ptbin)]*fCutsRD[GetGlobalIndex(7,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
415 if(d->CosPointingAngle()< fCutsRD[GetGlobalIndex(9,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
417 if(d->NormalizedDecayLengthXY()*d->P()/pt<fCutsRD[GetGlobalIndex(12,ptbin)]){CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
419 if(d->CosPointingAngleXY()<fCutsRD[GetGlobalIndex(13,ptbin)]){CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
422 Double_t sigmavert=d->GetSigmaVert(aod);
423 if(sigmavert>fCutsRD[GetGlobalIndex(6,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
425 // unset recalculated primary vertex when not needed any more
426 CleanOwnPrimaryVtx(d,aod,origownvtx);
428 fIsSelectedCuts=returnvalueCuts;
430 //if(!returnvalueCuts) return 0; // returnvalueCuts cannot be 0 here
433 if(selectionLevel==AliRDHFCuts::kAll ||
434 selectionLevel==AliRDHFCuts::kCandidate ||
435 selectionLevel==AliRDHFCuts::kPID) {
436 returnvaluePID = IsSelectedPID(d);
437 fIsSelectedPID=returnvaluePID;
439 if(returnvaluePID==0)return 0;
441 // selection on daughter tracks
442 if(selectionLevel==AliRDHFCuts::kAll ||
443 selectionLevel==AliRDHFCuts::kTracks) {
444 if(!AreDaughtersSelected(d)) return 0;
456 //---------------------------------------------------------------------------
459 void AliRDHFCutsDplustoKpipi::SetStandardCutsPP2010() {
461 //STANDARD CUTS USED FOR 2010 pp analysis
464 SetName("DplustoKpipiCutsStandard");
465 SetTitle("Standard Cuts for D+ analysis");
468 SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
473 AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
474 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
476 esdTrackCuts->SetRequireTPCRefit(kTRUE);
477 esdTrackCuts->SetRequireITSRefit(kTRUE);
478 //esdTrackCuts->SetMinNClustersITS(4); // default is 5
479 esdTrackCuts->SetMinNClustersTPC(70);
480 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
481 AliESDtrackCuts::kAny);
482 // default is kBoth, otherwise kAny
483 esdTrackCuts->SetMinDCAToVertexXY(0.);
484 esdTrackCuts->SetPtRange(0.3,1.e10);
486 AddTrackCuts(esdTrackCuts);
489 const Int_t nptbins =13;
490 const Int_t nvars=14;
491 Float_t ptbins[nptbins+1];
508 Float_t** anacutsval;
509 anacutsval=new Float_t*[nvars];
511 for(Int_t ic=0;ic<nvars;ic++){anacutsval[ic]=new Float_t[nptbins];}
513 //Double_t cutsDplus[12]={0.2,0.4,0.4,0.,0.,0.01,0.06,0.02,0.,0.85,0.,10000000000.};
514 for(Int_t ipt=0;ipt<nptbins;ipt++){
515 anacutsval[0][ipt]=0.2;
516 anacutsval[3][ipt]=0.;
517 anacutsval[4][ipt]=0.;
518 anacutsval[5][ipt]=0.01;
519 anacutsval[11][ipt]=10000000000.;
520 anacutsval[12][ipt]=0.;
521 anacutsval[13][ipt]=0.;
524 anacutsval[1][0]=0.3;
525 anacutsval[1][1]=0.3;
526 anacutsval[1][2]=0.4;
527 anacutsval[2][0]=0.3;
528 anacutsval[2][1]=0.3;
529 anacutsval[2][2]=0.4;
530 for(Int_t ipt=3;ipt<nptbins;ipt++){
531 anacutsval[1][ipt]=0.4;
532 anacutsval[2][ipt]=0.4;
535 anacutsval[6][0]=0.022100;
536 anacutsval[6][1]=0.022100;
537 anacutsval[6][2]=0.034;
538 anacutsval[6][3]=0.020667;
539 anacutsval[6][4]=0.020667;
540 anacutsval[6][5]=0.023333;
543 anacutsval[7][0]=0.08;
544 anacutsval[7][1]=0.08;
545 anacutsval[7][2]=0.09;
546 anacutsval[7][3]=0.095;
547 anacutsval[7][4]=0.095;
549 anacutsval[8][0]=0.5;
550 anacutsval[8][1]=0.5;
551 anacutsval[8][2]=1.0;
552 anacutsval[8][3]=0.5;
553 anacutsval[8][4]=0.5;
556 anacutsval[9][0]=0.95;
557 anacutsval[9][1]=0.95;
558 anacutsval[9][2]=0.95;
559 anacutsval[9][3]=0.95;
560 anacutsval[9][4]= 0.95;
561 anacutsval[9][5]=0.92;
562 anacutsval[9][6]=0.92;
563 anacutsval[9][7]=0.92;
564 anacutsval[9][8]=0.92;
565 anacutsval[9][9]=0.90;
566 anacutsval[9][10]=0.90;
567 anacutsval[9][11]=0.90;
568 anacutsval[9][12]=0.90;
570 anacutsval[10][0]=0.0055;
571 anacutsval[10][1]=0.0055;
572 anacutsval[10][2]= 0.0028;
573 anacutsval[10][3]=0.000883;
574 anacutsval[10][4]=0.000883;
577 for(Int_t ipt=5;ipt<nptbins;ipt++){
578 anacutsval[6][ipt]=0.02333;
579 anacutsval[7][ipt]=0.115;
580 anacutsval[8][ipt]=0.5;
581 anacutsval[10][ipt]=0.000883;
585 SetGlobalIndex(nvars,nptbins);
586 SetPtBins(nptbins+1,ptbins);
587 SetCuts(nvars,nptbins,anacutsval);
589 SetRemoveDaughtersFromPrim(kTRUE);
593 for(Int_t iic=0;iic<nvars;iic++){delete [] anacutsval[iic];}
594 delete [] anacutsval;
601 void AliRDHFCutsDplustoKpipi::SetStandardCutsPbPb2010() {
603 //STANDARD CUTS USED FOR 2010 Pb Pb analysis.... not optimized yet
606 SetName("DplustoKpipiCutsStandard");
607 SetTitle("Standard Cuts for D+ analysis in PbPb2010 run");
610 //SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
616 AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
617 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
619 esdTrackCuts->SetRequireTPCRefit(kTRUE);
620 esdTrackCuts->SetRequireITSRefit(kTRUE);
621 //esdTrackCuts->SetMinNClustersITS(4); // default is 5
622 esdTrackCuts->SetMinNClustersTPC(70);
623 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
624 AliESDtrackCuts::kAny);
625 // default is kBoth, otherwise kAny
626 esdTrackCuts->SetMinDCAToVertexXY(0.);
627 esdTrackCuts->SetPtRange(0.8,1.e10);
629 AddTrackCuts(esdTrackCuts);
631 const Int_t nptbins=10;
633 ptbins=new Float_t[nptbins+1];
646 const Int_t nvars=14;
648 Float_t** anacutsval;
649 anacutsval=new Float_t*[nvars];
651 for(Int_t ic=0;ic<nvars;ic++){anacutsval[ic]=new Float_t[nptbins];}
652 //Double_t cutsDplus[12]={0.2,0.4,0.4,0.,0.,0.01,0.06,0.02,0.,0.85,0.,10000000000.};
654 for(Int_t ipt=0;ipt<nptbins;ipt++){
655 anacutsval[0][ipt]=0.2;
656 anacutsval[1][ipt]=0.8;
657 anacutsval[2][ipt]=0.8;
658 anacutsval[3][ipt]=0.;
659 anacutsval[4][ipt]=0.;
660 anacutsval[5][ipt]=0.01;
661 anacutsval[11][ipt]=10000000000.;
662 anacutsval[12][ipt]=0.;
663 anacutsval[13][ipt]=0.;
665 anacutsval[1][5]=0.9;
667 anacutsval[6][0]=0.022100;
668 anacutsval[6][1]=0.022100;
669 anacutsval[6][2]=0.034;
670 anacutsval[6][3]=0.020667;
671 anacutsval[6][4]=0.020667;
672 anacutsval[6][5]=0.023333;
674 anacutsval[7][0]=0.08;
675 anacutsval[7][1]=0.08;
676 anacutsval[7][2]=0.17;
677 anacutsval[7][3]=0.14;
678 anacutsval[7][4]=0.14;
679 anacutsval[7][5]=0.19;
681 anacutsval[8][0]=0.8;
682 anacutsval[8][1]=0.8;
683 anacutsval[8][2]=1.1;
684 anacutsval[8][3]=0.5;
685 anacutsval[8][4]=0.5;
686 anacutsval[8][5]=0.5;
688 anacutsval[9][0]=0.995;
689 anacutsval[9][1]=0.995;
690 anacutsval[9][2]=0.997;
691 anacutsval[9][3]=0.998;
692 anacutsval[9][4]=0.998;
693 anacutsval[9][5]=0.995;
695 anacutsval[10][0]=0.0055;
696 anacutsval[10][1]=0.0055;
697 anacutsval[10][2]= 0.0028;
698 anacutsval[10][3]=0.000883;
699 anacutsval[10][4]=0.000883;
700 anacutsval[10][5]=0.000883;
702 anacutsval[12][5]=12.;
703 anacutsval[13][5]=0.998571;
704 anacutsval[12][6]=10.;
705 anacutsval[13][6]=0.997143;
707 for(Int_t ipt=6;ipt<nptbins;ipt++){
708 anacutsval[6][ipt]=0.02333;
709 anacutsval[7][ipt]=0.19;
710 anacutsval[8][ipt]=2.0;
711 anacutsval[9][ipt]=0.997;
712 anacutsval[10][ipt]=0.000883;
714 anacutsval[7][6]=0.14;
715 anacutsval[9][6]=0.995;
717 SetPtBins(nptbins+1,ptbins);
718 SetCuts(nvars,nptbins,anacutsval);
720 SetMinCentrality(1E-10);
721 SetMaxCentrality(20.);
722 SetUseCentrality(AliRDHFCuts::kCentV0M);
723 SetRemoveDaughtersFromPrim(kFALSE);
727 for(Int_t iic=0;iic<nvars;iic++){delete [] anacutsval[iic];}
728 delete [] anacutsval;