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 **************************************************************************/
16 /////////////////////////////////////////////////////////////
18 // Class for cuts on AOD reconstructed D+->Kpipi
20 // Author: R. Bala, bala@to.infn.it
21 // G. Ortona, ortona@to.infn.it
22 /////////////////////////////////////////////////////////////
24 #include <TDatabasePDG.h>
25 #include <Riostream.h>
27 #include "AliRDHFCutsDplustoKpipi.h"
28 #include "AliAODRecoDecayHF3Prong.h"
29 #include "AliAODTrack.h"
30 #include "AliESDtrack.h"
33 ClassImp(AliRDHFCutsDplustoKpipi)
35 //--------------------------------------------------------------------------
36 AliRDHFCutsDplustoKpipi::AliRDHFCutsDplustoKpipi(const char* name) :
41 // Default Constructor
45 TString varNames[12]={"inv. mass [GeV]",
48 "d0K [cm] lower limit!",
49 "d0Pi [cm] lower limit!",
53 "pM=Max{pT1,pT2,pT3} (GeV/c)",
57 Bool_t isUpperCut[12]={kTRUE,
69 SetVarNames(nvars,varNames,isUpperCut);
70 Bool_t forOpt[12]={kFALSE,
82 SetVarsForOpt(5,forOpt);
83 Float_t limits[2]={0,999999999.};
85 if(fPidHF)delete fPidHF;
86 fPidHF=new AliAODPidHF();
87 Double_t plim[2]={0.6,0.8};
88 Double_t nsigma[5]={2.,1.,2.,3.,0.};
90 fPidHF->SetPLimit(plim);
91 fPidHF->SetAsym(kTRUE);
92 fPidHF->SetSigma(nsigma);
98 fPidHF->SetCompat(kTRUE);
110 //--------------------------------------------------------------------------
111 AliRDHFCutsDplustoKpipi::AliRDHFCutsDplustoKpipi(const AliRDHFCutsDplustoKpipi &source) :
113 fUseStrongPid(source.fUseStrongPid)
121 //--------------------------------------------------------------------------
122 AliRDHFCutsDplustoKpipi &AliRDHFCutsDplustoKpipi::operator=(const AliRDHFCutsDplustoKpipi &source)
125 // assignment operator
127 if(&source == this) return *this;
129 AliRDHFCuts::operator=(source);
136 //---------------------------------------------------------------------------
137 void AliRDHFCutsDplustoKpipi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) {
139 // Fills in vars the values of the variables
143 if(nvars!=fnVarsForOpt) {
144 printf("AliRDHFCutsDplustoKpipi::GetCutsVarsForOpt: wrong number of variables\n");
148 AliAODRecoDecayHF3Prong *dd = (AliAODRecoDecayHF3Prong*)d;
153 vars[iter]=dd->InvMassDplus();
157 for(Int_t iprong=0;iprong<3;iprong++){
158 if(TMath::Abs(pdgdaughters[iprong])==321) {
159 vars[iter]=dd->PtProng(iprong);
165 Float_t minPtDau=1000000.0;
166 for(Int_t iprong=0;iprong<3;iprong++){
167 if(TMath::Abs(pdgdaughters[iprong])==211) {
168 if(dd->PtProng(iprong)<minPtDau){
169 minPtDau=dd->PtProng(iprong);
177 for(Int_t iprong=0;iprong<3;iprong++){
178 if(TMath::Abs(pdgdaughters[iprong])==321) {
179 vars[iter]=dd->Getd0Prong(iprong);
185 Float_t minImpParDau=1000000.0;
186 for(Int_t iprong=0;iprong<3;iprong++){
187 if(TMath::Abs(pdgdaughters[iprong])==211) {
188 if(dd->Getd0Prong(iprong)<minImpParDau){
189 minImpParDau=dd->Getd0Prong(iprong);
193 vars[iter]=minImpParDau;
197 Float_t dist12 = dd->GetDist12toPrim();
198 Float_t dist23 = dd->GetDist23toPrim();
199 if(dist12<dist23)vars[iter]=dist12;
200 else vars[iter]=dist23;
204 vars[iter]=dd->GetSigmaVert();
208 vars[iter] = dd->DecayLength();
213 for(Int_t i=0;i<3;i++){
214 if(dd->PtProng(i)>ptmax)ptmax=dd->PtProng(i);
220 vars[iter]=dd->CosPointingAngle();
224 vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
229 for(Int_t iprong=0;iprong<3;iprong++){
230 if(dd->GetDCA(iprong)<maxDCA){
231 maxDCA=dd->GetDCA(iprong);
238 //---------------------------------------------------------------------------
239 Bool_t AliRDHFCutsDplustoKpipi::IsInFiducialAcceptance(Double_t pt, Double_t y) const
242 // Checking if Dplus is in fiducial acceptance region
246 // applying cut for pt > 5 GeV
247 AliDebug(2,Form("pt of D+ = %f (> 5), cutting at |y| < 0.8",pt));
248 if (TMath::Abs(y) > 0.8) return kFALSE;
251 // appliying smooth cut for pt < 5 GeV
252 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
253 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
254 AliDebug(2,Form("pt of D+ = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
255 if (y < minFiducialY || y > maxFiducialY) return kFALSE;
261 //---------------------------------------------------------------------------
262 Int_t AliRDHFCutsDplustoKpipi::IsSelectedPID(AliAODRecoDecayHF *rd)
265 // PID selection, returns 3 if accepted, 0 if not accepted
267 if(!fUsePID || !rd) return 3;
268 //if(fUsePID)printf("i am inside the pid \n");
271 Int_t sign= rd->GetCharge();
272 for(Int_t daught=0;daught<3;daught++){
273 AliAODTrack *track=(AliAODTrack*)rd->GetDaughter(daught);
274 Int_t isPion=fPidHF->MakeRawPid(track,AliPID::kPion);
275 Int_t isKaon=fPidHF->MakeRawPid(track,AliPID::kKaon);
276 Int_t isProton=fPidHF->MakeRawPid(track,AliPID::kProton);
278 if(isProton>0 && isKaon<0 && isPion<0) return 0;
279 if(isKaon>0 && isPion<0) nkaons++;
280 if(isKaon<0) nNotKaons++;
281 if(sign==track->Charge()){//pions
282 if(isPion<0)return 0;
283 if(rd->Pt()<2. && isPion<=0 && fUseStrongPid)return 0;
286 if(isKaon<0)return 0;
287 if(rd->Pt()<2. && isKaon<=0 && fUseStrongPid)return 0;
293 if(nkaons>1)return 0;
294 if(nNotKaons==3)return 0;
300 //---------------------------------------------------------------------------
301 Int_t AliRDHFCutsDplustoKpipi::IsSelected(TObject* obj,Int_t selectionLevel, AliAODEvent* aod) {
303 // Apply selection, returns 3 if accepted, 0 if not accepted
307 cout<<"Cut matrix not inizialized. Exit..."<<endl;
311 AliAODRecoDecayHF3Prong* d=(AliAODRecoDecayHF3Prong*)obj;
315 cout<<"AliAODRecoDecayHF3Prong null"<<endl;
321 // selection on daughter tracks
322 if(selectionLevel==AliRDHFCuts::kAll ||
323 selectionLevel==AliRDHFCuts::kTracks) {
324 if(!AreDaughtersSelected(d)) return 0;
328 Int_t returnvaluePID=3;
329 Int_t returnvalueCuts=3;
332 //if(selectionLevel==AliRDHFCuts::kAll ||
333 if(selectionLevel==AliRDHFCuts::kCandidate ||
334 selectionLevel==AliRDHFCuts::kPID) {
335 returnvaluePID = IsSelectedPID(d);
337 if(returnvaluePID==0)return 0;
340 // selection on candidate
341 if(selectionLevel==AliRDHFCuts::kAll ||
342 selectionLevel==AliRDHFCuts::kCandidate) {
344 //recalculate vertex w/o daughters
345 AliAODVertex *origownvtx=0x0;
346 AliAODVertex *recvtx=0x0;
347 if(fRemoveDaughtersFromPrimary) {
349 AliError("Can not remove daughters from vertex without AOD event");
352 if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());
353 recvtx=d->RemoveDaughtersFromPrimaryVtx(aod);
355 AliDebug(2,"Removal of daughter tracks failed");
356 //recvtx=d->GetPrimaryVtx();
363 //set recalculed primary vertex
364 d->SetOwnPrimaryVtx(recvtx);
365 delete recvtx; recvtx=NULL;
370 Int_t ptbin=PtBin(pt);
373 d->SetOwnPrimaryVtx(origownvtx);
377 else d->UnsetOwnPrimaryVtx();
381 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
382 Double_t mDplus=d->InvMassDplus();
383 if(TMath::Abs(mDplus-mDplusPDG)>fCutsRD[GetGlobalIndex(0,ptbin)])returnvalueCuts=0;
384 // if(d->PtProng(1) < fCutsRD[GetGlobalIndex(3,ptbin)] || d->PtProng(0) < fCutsRD[GetGlobalIndex(4,ptbin)]) okD0 = 0;
385 if(TMath::Abs(d->PtProng(1)) < fCutsRD[GetGlobalIndex(1,ptbin)] || TMath::Abs(d->Getd0Prong(1))<fCutsRD[GetGlobalIndex(3,ptbin)])returnvalueCuts=0;//Kaon
386 if(TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(2,ptbin)] || TMath::Abs(d->Getd0Prong(0))<fCutsRD[GetGlobalIndex(4,ptbin)])returnvalueCuts=0;//Pion1
387 if(TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(2,ptbin)] || TMath::Abs(d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(4,ptbin)])returnvalueCuts=0;//Pion2
392 if(d->GetDist12toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]|| d->GetDist23toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)])returnvalueCuts=0;
393 if(d->Getd0Prong(0)*d->Getd0Prong(1)<0. && d->Getd0Prong(2)*d->Getd0Prong(1)<0.)returnvalueCuts=0;
396 if(d->GetSigmaVert()>fCutsRD[GetGlobalIndex(6,ptbin)])returnvalueCuts=0;
398 if(d->DecayLength()<fCutsRD[GetGlobalIndex(7,ptbin)])returnvalueCuts=0;
400 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)])returnvalueCuts=0;
401 if(d->CosPointingAngle()< fCutsRD[GetGlobalIndex(9,ptbin)])returnvalueCuts=0;
402 Double_t sum2=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
403 if(sum2<fCutsRD[GetGlobalIndex(10,ptbin)])returnvalueCuts=0;
406 for(Int_t i=0;i<3;i++) if(d->GetDCA(i)>fCutsRD[GetGlobalIndex(11,ptbin)]) returnvalueCuts=0;
407 // unset recalculated primary vertex when not needed any more
409 d->SetOwnPrimaryVtx(origownvtx);
412 } else if(fRemoveDaughtersFromPrimary) {
413 d->UnsetOwnPrimaryVtx();
414 AliDebug(3,"delete new vertex\n");
417 return returnvalueCuts;
426 //---------------------------------------------------------------------------
429 void AliRDHFCutsDplustoKpipi::SetStandardCutsPP2010() {
431 //STANDARD CUTS USED FOR 2010 pp analysis
434 SetName("DplustoKpipiCutsStandard");
435 SetTitle("Standard Cuts for D+ analysis");
438 SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
443 AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
444 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
446 esdTrackCuts->SetRequireTPCRefit(kTRUE);
447 esdTrackCuts->SetRequireITSRefit(kTRUE);
448 //esdTrackCuts->SetMinNClustersITS(4); // default is 5
449 esdTrackCuts->SetMinNClustersTPC(70);
450 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
451 AliESDtrackCuts::kAny);
452 // default is kBoth, otherwise kAny
453 esdTrackCuts->SetMinDCAToVertexXY(0.);
454 esdTrackCuts->SetPtRange(0.3,1.e10);
456 AddTrackCuts(esdTrackCuts);
459 const Int_t nptbins =13;
460 const Int_t nvars=12;
461 Float_t ptbins[nptbins+1];
478 Float_t** anacutsval;
479 anacutsval=new Float_t*[nvars];
481 for(Int_t ic=0;ic<nvars;ic++){anacutsval[ic]=new Float_t[nptbins];}
483 //Double_t cutsDplus[12]={0.2,0.4,0.4,0.,0.,0.01,0.06,0.02,0.,0.85,0.,10000000000.};
485 for(Int_t ipt=0;ipt<nptbins;ipt++){
486 anacutsval[ic][ipt]=0.2;
490 for(Int_t ipt=0;ipt<nptbins;ipt++){
491 anacutsval[ic][ipt]=0.;
494 for(Int_t ipt=0;ipt<nptbins;ipt++){
495 anacutsval[ic][ipt]=0.;
498 for(Int_t ipt=0;ipt<nptbins;ipt++){
499 anacutsval[ic][ipt]=0.01;
502 //for(Int_t ipt=0;ipt<nptbins;ipt++){
503 // anacutsval[ic][ipt]=0.06;
506 for(Int_t ipt=0;ipt<nptbins;ipt++){
507 anacutsval[ic][ipt]=10000000000.;
511 anacutsval[1][0]=0.3;
512 anacutsval[1][1]=0.3;
513 anacutsval[1][2]=0.4;
515 anacutsval[2][0]=0.3;
516 anacutsval[2][1]=0.3;
517 anacutsval[2][2]=0.4;
521 for(Int_t ipt=3;ipt<nptbins;ipt++){
522 anacutsval[ic][ipt]=0.4;
525 for(Int_t ipt=3;ipt<nptbins;ipt++){
526 anacutsval[ic][ipt]=0.4;
529 anacutsval[6][0]=0.022100;
530 anacutsval[6][1]=0.022100;
531 anacutsval[6][2]=0.034;
532 anacutsval[6][3]=0.020667;
533 anacutsval[6][4]=0.020667;
534 anacutsval[6][5]=0.023333;
535 anacutsval[6][6]=0.023333;
536 anacutsval[6][7]=0.023333;
537 anacutsval[6][8]=0.023333;
538 anacutsval[6][9]=0.023333;
539 anacutsval[6][10]=0.06;
540 anacutsval[6][11]=0.06;
541 anacutsval[6][12]=0.06;
544 anacutsval[7][0]=0.08;
545 anacutsval[7][1]=0.08;
546 anacutsval[7][2]=0.09;
547 anacutsval[7][3]=0.095;
548 anacutsval[7][4]=0.095;
549 anacutsval[7][5]=0.115;
550 anacutsval[7][6]=0.115;
551 anacutsval[7][7]=0.115;
552 anacutsval[7][8]=0.115;
553 anacutsval[7][9]=0.115;
554 anacutsval[7][10]=0.02;
555 anacutsval[7][11]=0.02;
556 anacutsval[7][12]=0.02;
559 anacutsval[8][0]=0.5;
560 anacutsval[8][1]=0.5;
561 anacutsval[8][2]=1.0;
562 anacutsval[8][3]=0.5;
563 anacutsval[8][4]=0.5;
564 anacutsval[8][5]=0.5;
565 anacutsval[8][6]=0.5;
566 anacutsval[8][7]=0.5;
567 anacutsval[8][8]=0.5;
568 anacutsval[8][9]=0.5;
569 anacutsval[8][10]=0.2;
570 anacutsval[8][11]=0.2;
571 anacutsval[8][12]=0.2;
574 anacutsval[9][0]=0.95;
575 anacutsval[9][1]=0.95;
576 anacutsval[9][2]=0.95;
577 anacutsval[9][3]=0.95;
578 anacutsval[9][4]= 0.95;
579 anacutsval[9][5]=0.92;
580 anacutsval[9][6]=0.92;
581 anacutsval[9][7]=0.92;
582 anacutsval[9][8]=0.92;
583 anacutsval[9][9]=0.90;
584 anacutsval[9][10]=0.90;
585 anacutsval[9][11]=0.90;
586 anacutsval[9][12]=0.90;
588 anacutsval[10][0]=0.0055;
589 anacutsval[10][1]=0.0055;
590 anacutsval[10][2]= 0.0028;
591 anacutsval[10][3]=0.000883;
592 anacutsval[10][4]=0.000883;
593 anacutsval[10][5]=0.000883;
594 anacutsval[10][6]=0.000883;
595 anacutsval[10][7]=0.000883;
596 anacutsval[10][8]=0.000883;
597 anacutsval[10][9]=0.000883;
598 anacutsval[10][10]=0.0;
599 anacutsval[10][11]=0.0;
600 anacutsval[10][12]=0.0;
602 SetGlobalIndex(nvars,nptbins);
603 SetPtBins(nptbins+1,ptbins);
604 SetCuts(nvars,nptbins,anacutsval);
606 SetRemoveDaughtersFromPrim(kTRUE);
610 for(Int_t iic=0;iic<nvars;iic++){delete [] anacutsval[iic];}
611 delete [] anacutsval;
618 void AliRDHFCutsDplustoKpipi::SetStandardCutsPbPb2010() {
620 //STANDARD CUTS USED FOR 2010 Pb Pb analysis.... not optimized yet
623 SetName("DplustoKpipiCutsStandard");
624 SetTitle("Standard Cuts for D+ analysis in PbPb2010 run");
627 //SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
633 AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
634 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
636 esdTrackCuts->SetRequireTPCRefit(kTRUE);
637 esdTrackCuts->SetRequireITSRefit(kTRUE);
638 //esdTrackCuts->SetMinNClustersITS(4); // default is 5
639 esdTrackCuts->SetMinNClustersTPC(70);
640 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
641 AliESDtrackCuts::kAny);
642 // default is kBoth, otherwise kAny
643 esdTrackCuts->SetMinDCAToVertexXY(0.);
644 esdTrackCuts->SetPtRange(0.8,1.e10);
646 AddTrackCuts(esdTrackCuts);
648 const Int_t nptbins=10;
650 ptbins=new Float_t[nptbins+1];
663 const Int_t nvars=12;
667 Float_t** anacutsval;
668 anacutsval=new Float_t*[nvars];
670 for(Int_t ic=0;ic<nvars;ic++){anacutsval[ic]=new Float_t[nptbins];}
671 //Double_t cutsDplus[12]={0.2,0.4,0.4,0.,0.,0.01,0.06,0.02,0.,0.85,0.,10000000000.};
673 for(Int_t ipt=0;ipt<nptbins;ipt++){
674 anacutsval[ic][ipt]=0.2;
678 for(Int_t ipt=0;ipt<nptbins;ipt++){
679 anacutsval[ic][ipt]=0.;
682 for(Int_t ipt=0;ipt<nptbins;ipt++){
683 anacutsval[ic][ipt]=0.;
686 for(Int_t ipt=0;ipt<nptbins;ipt++){
687 anacutsval[ic][ipt]=0.01;
690 //for(Int_t ipt=0;ipt<nptbins;ipt++){
691 // anacutsval[ic][ipt]=0.06;
694 for(Int_t ipt=0;ipt<nptbins;ipt++){
695 anacutsval[ic][ipt]=10000000000.;
702 for(Int_t ipt=0;ipt<nptbins;ipt++){
703 anacutsval[ic][ipt]=0.8;
706 for(Int_t ipt=0;ipt<nptbins;ipt++){
707 anacutsval[ic][ipt]=0.8;
711 anacutsval[6][0]=0.022100;
712 anacutsval[6][1]=0.022100;
713 anacutsval[6][2]=0.034;
714 anacutsval[6][3]=0.020667;
715 anacutsval[6][4]=0.020667;
716 anacutsval[6][5]=0.023333;
717 anacutsval[6][6]=0.023333;
718 anacutsval[6][7]=0.023333;
719 anacutsval[6][8]=0.023333;
720 anacutsval[6][9]=0.023333;
722 anacutsval[7][0]=0.08;
723 anacutsval[7][1]=0.08;
724 anacutsval[7][2]=0.09;
725 anacutsval[7][3]=0.095;
726 anacutsval[7][4]=0.095;
727 anacutsval[7][5]=0.115;
728 anacutsval[7][6]=0.115;
729 anacutsval[7][7]=0.115;
730 anacutsval[7][8]=0.115;
731 anacutsval[7][9]=0.115;
733 anacutsval[8][0]=0.5;
734 anacutsval[8][1]=0.5;
735 anacutsval[8][2]=1.0;
736 anacutsval[8][3]=0.5;
737 anacutsval[8][4]=0.5;
738 anacutsval[8][5]=0.5;
739 anacutsval[8][6]=0.5;
740 anacutsval[8][7]=0.5;
741 anacutsval[8][8]=0.5;
742 anacutsval[8][9]=0.5;
744 anacutsval[9][0]=0.995;
745 anacutsval[9][1]=0.995;
746 anacutsval[9][2]=0.997;
747 anacutsval[9][3]=0.989;
748 anacutsval[9][4]= 0.989;
749 anacutsval[9][5]=0.997;
750 anacutsval[9][6]=0.997;
751 anacutsval[9][7]=0.997;
752 anacutsval[9][8]=0.997;
753 anacutsval[9][9]=0.997;
755 anacutsval[10][0]=0.0055;
756 anacutsval[10][1]=0.0055;
757 anacutsval[10][2]= 0.0028;
758 anacutsval[10][3]=0.000883;
759 anacutsval[10][4]=0.000883;
760 anacutsval[10][5]=0.000883;
761 anacutsval[10][6]=0.000883;
762 anacutsval[10][7]=0.000883;
763 anacutsval[10][8]=0.000883;
764 anacutsval[10][9]=0.000883;
767 SetPtBins(nptbins+1,ptbins);
768 SetCuts(nvars,nptbins,anacutsval);
770 SetRemoveDaughtersFromPrim(kFALSE);
774 for(Int_t iic=0;iic<nvars;iic++){delete [] anacutsval[iic];}
775 delete [] anacutsval;