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 /* $Id: AliRDHFCutsDStartoKpipi.cxx 61203 2013-03-02 22:52:17Z fprino $ */
18 /////////////////////////////////////////////////////////////
20 // Class for cuts on AOD reconstructed DStar->Kpipi
22 // Author: A.Grelli, alessandro.grelli@uu.nl
24 // PID method implemented by Y.Wang, yifei@physi.uni-heidelberg.de
26 /////////////////////////////////////////////////////////////
28 #include <TDatabasePDG.h>
29 #include <Riostream.h>
30 #include "AliAODRecoDecayHF2Prong.h"
31 #include "AliAODRecoCascadeHF.h"
32 #include "AliRDHFCutsD0toKpi.h"
33 #include "AliRDHFCutsDStartoKpipi.h"
34 #include "AliAODTrack.h"
35 #include "AliESDtrack.h"
36 #include "AliAODPid.h"
37 #include "AliTPCPIDResponse.h"
38 #include "AliAODVertex.h"
39 #include "AliESDVertex.h"
44 ClassImp(AliRDHFCutsDStartoKpipi)
46 //--------------------------------------------------------------------------
47 AliRDHFCutsDStartoKpipi::AliRDHFCutsDStartoKpipi(const char* name) :
54 // Default Constructor
59 TString varNames[16]={
69 "inv. mass half width of D* [GeV]",
70 "half width of (M_Kpipi-M_D0) [GeV]",
71 "PtMin of pi_s [GeV/c]",
72 "PtMax of pi_s [GeV/c]",
73 "theta, angle between the pi_s and decay plane of the D0 [rad]",
76 Bool_t isUpperCut[16]={
93 SetVarNames(nvars,varNames,isUpperCut);
111 SetVarsForOpt(5,forOpt);
112 Float_t limits[2]={0,999999999.};
115 //--------------------------------------------------------------------------
116 AliRDHFCutsDStartoKpipi::AliRDHFCutsDStartoKpipi(const AliRDHFCutsDStartoKpipi &source) :
126 if(source.GetTrackCutsSoftPi()) AddTrackCutsSoftPi(source.GetTrackCutsSoftPi());
129 //--------------------------------------------------------------------------
130 AliRDHFCutsDStartoKpipi &AliRDHFCutsDStartoKpipi::operator=(const AliRDHFCutsDStartoKpipi &source)
133 // assignment operator
135 if(&source == this) return *this;
137 AliRDHFCuts::operator=(source);
138 if(source.GetTrackCutsSoftPi()) {
139 delete fTrackCutsSoftPi;
140 fTrackCutsSoftPi = new AliESDtrackCuts(*(source.GetTrackCutsSoftPi()));
147 //---------------------------------------------------------------------------
148 void AliRDHFCutsDStartoKpipi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) {
150 // Fills in vars the values of the variables
152 if(nvars!=fnVarsForOpt) {
153 printf("AliRDHFCutsDStartoKpipi::GetCutsVarsForOpt: wrong number of variables\n");
158 AliAODRecoCascadeHF* dstarD0pi = (AliAODRecoCascadeHF*)d;
160 AliAODTrack *softPi = (AliAODTrack*)dstarD0pi->GetBachelor();
162 AliAODRecoDecayHF2Prong* dd = (AliAODRecoDecayHF2Prong*)dstarD0pi->Get2Prong();
168 if(TMath::Abs(pdgdaughters[0])==211) {
169 vars[iter]=dd->InvMassD0();
171 vars[iter]=dd->InvMassD0bar();
176 vars[iter]=dd->GetDCA();
180 if(TMath::Abs(pdgdaughters[0])==211) {
181 vars[iter] = dd->CosThetaStarD0();
183 vars[iter] = dd->CosThetaStarD0bar();
188 if(TMath::Abs(pdgdaughters[0])==321) {
189 vars[iter]=dd->PtProng(0);
192 vars[iter]=dd->PtProng(1);
197 if(TMath::Abs(pdgdaughters[0])==211) {
198 vars[iter]=dd->PtProng(0);
201 vars[iter]=dd->PtProng(1);
206 if(TMath::Abs(pdgdaughters[0])==321) {
207 vars[iter]=dd->Getd0Prong(0);
210 vars[iter]=dd->Getd0Prong(1);
215 if(TMath::Abs(pdgdaughters[0])==211) {
216 vars[iter]=dd->Getd0Prong(0);
219 vars[iter]=dd->Getd0Prong(1);
224 vars[iter]= dd->Prodd0d0();
228 vars[iter]=dd->CosPointingAngle();
232 vars[iter]=dstarD0pi->InvMassDstarKpipi();
236 vars[iter]=dstarD0pi->DeltaInvMass();
240 vars[iter] = softPi->Pt();
244 vars[iter] = softPi->Pt();
248 vars[iter] =dstarD0pi->AngleD0dkpPisoft();
252 vars[iter]=TMath::Abs(dd->CosPointingAngleXY());
256 vars[iter]=(dd->NormalizedDecayLengthXY()*(dd->P()/dd->Pt()));
261 //---------------------------------------------------------------------------
262 Int_t AliRDHFCutsDStartoKpipi::IsSelected(TObject* obj,Int_t selectionLevel, AliAODEvent* aod) {
264 // Apply selection for D*.
265 // Added functionality to remove the D0 daughters from primary vertex (not dafult)
271 cout<<"Cut matrice not inizialized. Exit..."<<endl;
275 AliAODRecoCascadeHF* d = (AliAODRecoCascadeHF*)obj;
277 cout<<"AliAODRecoCascadeHF null"<<endl;
281 Double_t ptD=d->Pt();
282 if(ptD<fMinPtCand) return 0;
283 if(ptD>fMaxPtCand) return 0;
286 AliAODRecoDecayHF2Prong* dd = (AliAODRecoDecayHF2Prong*)d->Get2Prong();
288 cout<<"AliAODRecoDecayHF2Prong null"<<endl;
292 if(fUseTrackSelectionWithFilterBits && dd->HasBadDaughters()) return 0;
294 AliAODTrack *b = (AliAODTrack*)d->GetBachelor();
295 if(fTrackCutsSoftPi && fTrackCutsSoftPi->GetRequireTPCRefit()){
296 if(!(b->TestFilterMask(BIT(4)))) return 0;
300 Int_t returnvaluePID=3;
303 // selection on candidate
304 if(selectionLevel==AliRDHFCuts::kAll ||
305 selectionLevel==AliRDHFCuts::kCandidate) {
308 Int_t ptbin=PtBin(pt);
310 // DStarMass and D0mass
311 Double_t mDSPDG = TDatabasePDG::Instance()->GetParticle(413)->Mass();
312 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
314 Double_t deltaPDG = mDSPDG-mD0PDG;
316 // Half width DStar mass
317 if(TMath::Abs(mDSPDG - (d->InvMassDstarKpipi()))>fCutsRD[GetGlobalIndex(9,ptbin)]) return 0;
318 // Half width Delta mass
320 if(TMath::Abs(deltaPDG-(d->DeltaInvMass())) > fCutsRD[GetGlobalIndex(10,ptbin)]) return 0;
322 // cut on soft pion pt
323 if(b->Pt() < fCutsRD[GetGlobalIndex(11,ptbin)] || b->Pt() > fCutsRD[GetGlobalIndex(12,ptbin)]) return 0;
324 // cut on the angle between D0 decay plane and soft pion
325 if(d->AngleD0dkpPisoft() > fCutsRD[GetGlobalIndex(13,ptbin)]) return 0;
327 // select D0 that passes D* cuts
328 returnvalue = IsD0FromDStarSelected(pt,dd,selectionLevel, aod);
329 if((b->Charge()==+1 && returnvalue==2) || (b->Charge()==-1 && returnvalue==1)) return 0;
333 fIsSelectedCuts = returnvalue;
336 if(selectionLevel==AliRDHFCuts::kAll ||
337 selectionLevel==AliRDHFCuts::kCandidate ||
338 selectionLevel==AliRDHFCuts::kPID) {
339 returnvaluePID = IsSelectedPID(d);
340 fIsSelectedPID = returnvaluePID;
342 if(returnvaluePID!=3) returnvalue =0;
345 // selection on daughter tracks
346 if(selectionLevel==AliRDHFCuts::kAll ||
347 selectionLevel==AliRDHFCuts::kTracks) {
348 if(!AreDaughtersSelected(dd)) return 0;
349 if(fTrackCutsSoftPi) {
350 AliAODVertex *vAOD = d->GetPrimaryVtx();
351 Double_t pos[3],cov[6];
353 vAOD->GetCovarianceMatrix(cov);
354 const AliESDVertex vESD(pos,cov,100.,100);
355 if(!IsDaughterSelected(b,&vESD,fTrackCutsSoftPi)) return 0;
362 //_________________________________________________________________________________________________
363 Int_t AliRDHFCutsDStartoKpipi::IsD0FromDStarSelected(Double_t pt, TObject* obj,Int_t selectionLevel, AliAODEvent* aod) const {
365 // Apply selection for D0 from D*. The selection in on D0 prongs
366 // added functionality to recalculate the primary vertex without D0 prongs (not default)
370 cout<<"Cut matrice not inizialized. Exit..."<<endl;
374 AliAODRecoDecayHF2Prong* dd = (AliAODRecoDecayHF2Prong*)obj;
377 cout<<"AliAODRecoDecayHF2Prong null"<<endl;
381 // selection on daughter tracks is done in IsSelected()
385 // selection on candidate
386 if(selectionLevel==AliRDHFCuts::kAll ||
387 selectionLevel==AliRDHFCuts::kCandidate) {
390 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
393 // add vertex recalculation without daughters
394 AliAODVertex *origownvtx=0x0;
395 if(fRemoveDaughtersFromPrimary && !fUseMCVertex) {
396 if(dd->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*dd->GetOwnPrimaryVtx());
397 if(!RecalcOwnPrimaryVtx(dd,aod)) {
398 CleanOwnPrimaryVtx(dd,aod,origownvtx);
405 if(dd->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*dd->GetOwnPrimaryVtx());
406 if(!SetMCPrimaryVtx(dd,aod)) {
407 CleanOwnPrimaryVtx(dd,aod,origownvtx);
412 Int_t ptbin=PtBin(pt);
414 CleanOwnPrimaryVtx(dd,aod,origownvtx);
418 Double_t mD0,mD0bar,ctsD0,ctsD0bar;
424 if(dd->PtProng(1) < fCutsRD[GetGlobalIndex(3,ptbin)] || dd->PtProng(0) < fCutsRD[GetGlobalIndex(4,ptbin)]) okD0 = 0;
425 if(dd->PtProng(0) < fCutsRD[GetGlobalIndex(3,ptbin)] || dd->PtProng(1) < fCutsRD[GetGlobalIndex(4,ptbin)]) okD0bar = 0;
427 if(!okD0 && !okD0bar) {CleanOwnPrimaryVtx(dd,aod,origownvtx); return 0;}
429 if(TMath::Abs(dd->Getd0Prong(1)) > fCutsRD[GetGlobalIndex(5,ptbin)] ||
430 TMath::Abs(dd->Getd0Prong(0)) > fCutsRD[GetGlobalIndex(6,ptbin)]) okD0 = 0;
431 if(TMath::Abs(dd->Getd0Prong(0)) > fCutsRD[GetGlobalIndex(6,ptbin)] ||
432 TMath::Abs(dd->Getd0Prong(1)) > fCutsRD[GetGlobalIndex(5,ptbin)]) okD0bar = 0;
433 if(!okD0 && !okD0bar) {CleanOwnPrimaryVtx(dd,aod,origownvtx); return 0;}
435 if(dd->GetDCA() > fCutsRD[GetGlobalIndex(1,ptbin)]) {CleanOwnPrimaryVtx(dd,aod,origownvtx); return 0;}
437 dd->InvMassD0(mD0,mD0bar);
438 if(TMath::Abs(mD0-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)]) okD0 = 0;
439 if(TMath::Abs(mD0bar-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)]) okD0bar = 0;
440 if(!okD0 && !okD0bar) {CleanOwnPrimaryVtx(dd,aod,origownvtx); return 0;}
442 dd->CosThetaStarD0(ctsD0,ctsD0bar);
443 if(TMath::Abs(ctsD0) > fCutsRD[GetGlobalIndex(2,ptbin)]) okD0 = 0;
444 if(TMath::Abs(ctsD0bar) > fCutsRD[GetGlobalIndex(2,ptbin)]) okD0bar = 0;
445 if(!okD0 && !okD0bar) {CleanOwnPrimaryVtx(dd,aod,origownvtx); return 0;}
447 if(dd->Prodd0d0() > fCutsRD[GetGlobalIndex(7,ptbin)]) {CleanOwnPrimaryVtx(dd,aod,origownvtx); return 0;}
449 if(dd->CosPointingAngle() < fCutsRD[GetGlobalIndex(8,ptbin)]) {CleanOwnPrimaryVtx(dd,aod,origownvtx); return 0;}
451 if(TMath::Abs(dd->CosPointingAngleXY()) < fCutsRD[GetGlobalIndex(14,ptbin)]) {CleanOwnPrimaryVtx(dd,aod,origownvtx); return 0;}
453 Double_t normalDecayLengXY=(dd->NormalizedDecayLengthXY()*(dd->P()/dd->Pt()));
454 if (normalDecayLengXY < fCutsRD[GetGlobalIndex(15, ptbin)]) {CleanOwnPrimaryVtx(dd,aod,origownvtx); return 0;}
456 if (okD0) returnvalue=1; //cuts passed as D0
457 if (okD0bar) returnvalue=2; //cuts passed as D0bar
458 if (okD0 && okD0bar) returnvalue=3; //both
460 // unset recalculated primary vertex when not needed any more
461 CleanOwnPrimaryVtx(dd,aod,origownvtx);
467 //----------------------------------------------------------------------------------
468 Bool_t AliRDHFCutsDStartoKpipi::IsInFiducialAcceptance(Double_t pt, Double_t y) const
471 // D* fiducial acceptance region
474 if(fMaxRapidityCand>-998.){
475 if(TMath::Abs(y) > fMaxRapidityCand) return kFALSE;
480 // applying cut for pt > 5 GeV
481 AliDebug(4,Form("pt of D* = %f (> 5), cutting at |y| < 0.8\n",pt));
482 if (TMath::Abs(y) > 0.8){
486 // appliying smooth cut for pt < 5 GeV
487 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
488 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
489 AliDebug(2,Form("pt of D* = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
490 if (y < minFiducialY || y > maxFiducialY){
498 //_______________________________________________________________________________-
499 Int_t AliRDHFCutsDStartoKpipi::IsSelectedPID(AliAODRecoDecayHF* obj)
502 // PID method, n signa approach default
505 AliAODRecoCascadeHF* dstar = (AliAODRecoCascadeHF*)obj;
507 cout<<"AliAODRecoCascadeHF null"<<endl;
511 if(!fUsePID || dstar->Pt() > fMaxPtPid) return 3;
513 AliAODRecoDecayHF2Prong* d0 = (AliAODRecoDecayHF2Prong*)dstar->Get2Prong();
515 cout<<"AliAODRecoDecayHF2Prong null"<<endl;
520 AliAODTrack *pos = (AliAODTrack*)dstar->Get2Prong()->GetDaughter(0);
521 AliAODTrack *neg = (AliAODTrack*)dstar->Get2Prong()->GetDaughter(1);
523 if (dstar->Charge()>0){
524 if(!SelectPID(pos,2)) return 0;//pion+
525 if(!SelectPID(neg,3)) return 0;//kaon-
527 if(!SelectPID(pos,3)) return 0;//kaon+
528 if(!SelectPID(neg,2)) return 0;//pion-
534 //_______________________________________________________________________________-
535 Int_t AliRDHFCutsDStartoKpipi::SelectPID(AliAODTrack *track, Int_t type)
540 Bool_t isParticle=kTRUE;
542 if(fPidHF->GetMatch()==1){//n-sigma
543 Bool_t TPCon=TMath::Abs(2)>1e-4?kTRUE:kFALSE;
544 Bool_t TOFon=TMath::Abs(3)>1e-4?kTRUE:kFALSE;
550 if(fPidHF->CheckStatus(track,"TPC")){
551 if(type==2) isTPC=fPidHF->IsPionRaw(track,"TPC");
552 if(type==3) isTPC=fPidHF->IsKaonRaw(track,"TPC");
556 if(fPidHF->CheckStatus(track,"TOF")){
557 if(type==2) isTOF=fPidHF->IsPionRaw(track,"TOF");
558 if(type==3) isTOF=fPidHF->IsKaonRaw(track,"TOF");
562 //--------------------------------
563 // cut on high momentum in the TPC
564 //--------------------------------
565 Double_t pPIDcut = track->P();
566 if(pPIDcut>fTPCflag) isTPC=1;
568 isParticle = isTPC&&isTOF;
571 if(fPidHF->GetMatch()==2){//bayesian
572 //Double_t priors[5]={0.01,0.001,0.3,0.3,0.3};
573 Double_t prob[5]={1.,1.,1.,1.,1.};
575 //fPidHF->SetPriors(priors);
576 // fPidHF->BayesianProbability(track,prob);
580 for (Int_t i=0; i<5; i++) {
581 if (prob[i]>max) {k=i; max=prob[i];}
583 isParticle = Bool_t(k==type);
590 //__________________________________________________________________________________-
591 void AliRDHFCutsDStartoKpipi::SetStandardCutsPP2010() {
593 //STANDARD CUTS USED FOR 2010 pp analysis
595 // Need to be updated for the final cut version
598 SetName("DStartoD0piCutsStandard");
599 SetTitle("Standard Cuts for D* analysis");
602 SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
607 // CUTS ON SINGLE TRACKS
608 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
609 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
610 esdTrackCuts->SetRequireTPCRefit(kTRUE);
611 esdTrackCuts->SetRequireITSRefit(kTRUE);
612 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
613 esdTrackCuts->SetMinDCAToVertexXY(0.);
614 esdTrackCuts->SetEtaRange(-0.8,0.8);
615 esdTrackCuts->SetPtRange(0.3,1.e10);
618 AliESDtrackCuts* esdSoftPicuts=new AliESDtrackCuts();
619 esdSoftPicuts->SetRequireSigmaToVertex(kFALSE);
620 esdSoftPicuts->SetRequireTPCRefit(kFALSE);
621 esdSoftPicuts->SetRequireITSRefit(kFALSE);
622 esdSoftPicuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
623 AliESDtrackCuts::kAny);
624 esdSoftPicuts->SetPtRange(0.0,1.e10);
626 AddTrackCuts(esdTrackCuts);
627 AddTrackCutsSoftPi(esdSoftPicuts);
630 delete esdSoftPicuts;
633 const Int_t nptbins =13;
634 const Double_t ptmax = 9999.;
635 const Int_t nvars=16;
636 Float_t ptbins[nptbins+1];
652 SetGlobalIndex(nvars,nptbins);
653 SetPtBins(nptbins+1,ptbins);
655 Float_t cutsMatrixD0toKpiStand[nptbins][nvars]={{0.7,220.*1E-4,0.7,0.21,0.21,500.*1E-4,500.*1E-4,-2000.*1E-8,0.85,0.3,0.1,0.05,100,0.5,-1.,0.},/* pt<0.5*/
656 {0.7,220.*1E-4,0.7,0.21,0.21,500.*1E-4,500.*1E-4,-16000.*1E-8,0.85,0.3,0.1,0.05,100,0.5,-1.,0.},/* 0.5<pt<1*/
657 {0.7,400.*1E-4,0.8,0.7,0.7,400.*1E-4,400.*1E-4,-36000.*1E-8,0.82,0.3,0.1,0.05,100,0.5,-1.,0.},/* 1<pt<2 */
658 {0.7,200.*1E-4,0.8,0.7,0.7,800.*1E-4,800.*1E-4,-16000.*1E-8,0.9,0.3,0.1,0.05,100,0.5,-1.,0.},/* 2<pt<3 */
659 {0.7,500.*1E-4,0.8,1.0,1.0,420.*1E-4,560.*1E-4,-6500.*1E-8,0.9,0.3,0.1,0.05,100,0.5,-1.,0.},/* 3<pt<4 */
660 {0.7,800.*1E-4,0.9,1.2,1.2,700.*1E-4,700.*1E-4,1000.*1E-8,0.9,0.3,0.1,0.05,100,0.5,-1.,0.},/* 4<pt<5 */
661 {0.7,1000.*1E-4,1.0,1.0,1.0,800.*1E-4,800.*1E-4,50000.*1E-8,0.8,0.3,0.1,0.05,100,0.5,-1.,0.},/* 5<pt<6 */
662 {0.7,1000.*1E-4,1.0,1.0,1.0,1000.*1E-4,1000.*1E-4,100000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.},/* 6<pt<7 */
663 {0.7,1000.*1E-4,1.0,1.0,1.0,1000.*1E-4,1000.*1E-4,100000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.},/* 7<pt<8 */
664 {0.7,1000.*1E-4,1.0,1.0,1.0,1000.*1E-4,1000.*1E-4,600000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.},/* 8<pt<12 */
665 {0.7,1000.*1E-4,1.0,1.0,1.0,1500.*1E-4,1500.*1E-4,1000000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.},/* 12<pt<16 */
666 {0.7,1000.*1E-4,1.0,1.0,1.0,1500.*1E-4,1500.*1E-4,1000000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.},/* 16<pt<20 */
667 {0.7,1000.*1E-4,1.0,1.0,1.0,1500.*1E-4,1500.*1E-4,1000000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.}};/* pt>24 */
670 //CREATE TRANSPOSE MATRIX...REVERSE INDICES as required by AliRDHFCuts
671 Float_t **cutsMatrixTransposeStand=new Float_t*[nvars];
672 for(Int_t iv=0;iv<nvars;iv++)cutsMatrixTransposeStand[iv]=new Float_t[nptbins];
674 for (Int_t ibin=0;ibin<nptbins;ibin++){
675 for (Int_t ivar = 0; ivar<nvars; ivar++){
676 cutsMatrixTransposeStand[ivar][ibin]=cutsMatrixD0toKpiStand[ibin][ivar];
680 SetCuts(nvars,nptbins,cutsMatrixTransposeStand);
682 for(Int_t iv=0;iv<nvars;iv++) delete [] cutsMatrixTransposeStand[iv];
683 delete [] cutsMatrixTransposeStand;
684 cutsMatrixTransposeStand=NULL;
686 // PID SETTINGS FOR D* analysis
687 AliAODPidHF* pidObj=new AliAODPidHF();
688 //pidObj->SetName("pid4DSatr");
690 Double_t priors[5]={0.01,0.001,0.3,0.3,0.3};
691 pidObj->SetPriors(priors);
692 pidObj->SetMatch(mode);
693 pidObj->SetSigma(0,2); // TPC
694 pidObj->SetSigma(3,3); // TOF
695 pidObj->SetTPC(kTRUE);
696 pidObj->SetTOF(kTRUE);
708 //_____________________________________________________________________________-
709 void AliRDHFCutsDStartoKpipi::SetStandardCutsPbPb2010(){
711 // TEMPORARY, WORK IN PROGRESS ... BUT WORKING!
716 SetName("DStartoD0piCutsStandard");
717 SetTitle("Standard Cuts for D* analysis in PbPb 2010");
722 // CUTS ON SINGLE TRACKS
723 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
724 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
725 esdTrackCuts->SetRequireTPCRefit(kTRUE);
726 esdTrackCuts->SetRequireITSRefit(kTRUE);
727 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
728 esdTrackCuts->SetMinDCAToVertexXY(0.);
729 esdTrackCuts->SetEtaRange(-0.8,0.8);
730 esdTrackCuts->SetPtRange(0.3,1.e10);
733 AliESDtrackCuts* esdSoftPicuts=new AliESDtrackCuts();
734 esdSoftPicuts->SetRequireSigmaToVertex(kFALSE);
735 esdSoftPicuts->SetRequireTPCRefit(kTRUE);
736 esdSoftPicuts->SetRequireITSRefit(kTRUE);
737 esdSoftPicuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
738 AliESDtrackCuts::kAny); //test d0 asimmetry
739 esdSoftPicuts->SetPtRange(0.25,5);
741 AddTrackCuts(esdTrackCuts);
742 AddTrackCutsSoftPi(esdSoftPicuts);
745 delete esdSoftPicuts;
748 const Int_t nptbins =13;
749 const Double_t ptmax = 9999.;
750 const Int_t nvars=16;
751 Float_t ptbins[nptbins+1];
767 SetGlobalIndex(nvars,nptbins);
768 SetPtBins(nptbins+1,ptbins);
770 Float_t cutsMatrixD0toKpiStand[nptbins][nvars]={{0.7,220.*1E-4,0.7,0.21,0.21,500.*1E-4,500.*1E-4,-2000.*1E-8,0.85,0.3,0.1,0.05,100,0.5,-1.,0.},/* pt<0.5*/
771 {0.7,220.*1E-4,0.7,0.21,0.21,500.*1E-4,500.*1E-4,-16000.*1E-8,0.85,0.3,0.1,0.05,100,0.5,-1.,0.},/* 0.5<pt<1*/
772 {0.7,400.*1E-4,0.8,0.7,0.7,800.*1E-4,800.*1E-4,-36000.*1E-8,0.82,0.3,0.1,0.05,100,0.5,-1.,0.},/* 1<pt<2 */
773 {0.7,200.*1E-4,0.8,0.7,0.7,800.*1E-4,800.*1E-4,-16000.*1E-8,0.9,0.3,0.1,0.05,100,0.5,-1.,0.},/* 2<pt<3 */
774 {0.7,500.*1E-4,0.8,1.0,1.0,420.*1E-4,560.*1E-4,-6500.*1E-8,0.9,0.3,0.1,0.05,100,0.5,-1.,0.},/* 3<pt<4 */
775 {0.7,800.*1E-4,0.9,1.2,1.2,700.*1E-4,700.*1E-4,1000.*1E-8,0.9,0.3,0.1,0.05,100,0.5,-1.,0.},/* 4<pt<5 */
776 {0.7,1000.*1E-4,1.0,1.0,1.0,800.*1E-4,800.*1E-4,50000.*1E-8,0.8,0.3,0.1,0.05,100,0.5,-1.,0.},/* 5<pt<6 */
777 {0.7,1000.*1E-4,1.0,1.0,1.0,1000.*1E-4,1000.*1E-4,100000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.},/* 6<pt<7 */
778 {0.7,1000.*1E-4,1.0,1.0,1.0,1000.*1E-4,1000.*1E-4,100000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.},/* 7<pt<8 */
779 {0.7,1000.*1E-4,1.0,1.0,1.0,1000.*1E-4,1000.*1E-4,600000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.},/* 8<pt<12 */
780 {0.7,1000.*1E-4,1.0,1.0,1.0,1500.*1E-4,1500.*1E-4,1000000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.},/* 12<pt<16 */
781 {0.7,1000.*1E-4,1.0,1.0,1.0,1500.*1E-4,1500.*1E-4,1000000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.},/* 16<pt<24 */
782 {0.7,1000.*1E-4,1.0,1.0,1.0,1500.*1E-4,1500.*1E-4,1000000.*1E-8,0.7,0.3,0.1,0.05,100,0.5,-1.,0.}};/* pt>24 */
785 //CREATE TRANSPOSE MATRIX...REVERSE INDICES as required by AliRDHFCuts
786 Float_t **cutsMatrixTransposeStand=new Float_t*[nvars];
787 for(Int_t iv=0;iv<nvars;iv++)cutsMatrixTransposeStand[iv]=new Float_t[nptbins];
789 for (Int_t ibin=0;ibin<nptbins;ibin++){
790 for (Int_t ivar = 0; ivar<nvars; ivar++){
791 cutsMatrixTransposeStand[ivar][ibin]=cutsMatrixD0toKpiStand[ibin][ivar];
795 SetCuts(nvars,nptbins,cutsMatrixTransposeStand);
797 for(Int_t iv=0;iv<nvars;iv++) delete [] cutsMatrixTransposeStand[iv];
798 delete [] cutsMatrixTransposeStand;
799 cutsMatrixTransposeStand=NULL;
802 AliAODPidHF* pidObj=new AliAODPidHF();
803 // pidObj->SetName("pid4DSatr");
805 Double_t priors[5]={0.01,0.001,0.3,0.3,0.3};
806 pidObj->SetPriors(priors);
807 pidObj->SetMatch(mode);
808 pidObj->SetSigma(0,2); // TPC
809 pidObj->SetSigma(3,3); // TOF
810 pidObj->SetTPC(kTRUE);
811 pidObj->SetTOF(kTRUE);
825 //_____________________________________________________________________________
826 void AliRDHFCutsDStartoKpipi::SetStandardCutsPbPb2011(){
828 // Not implemented !!
830 SetStandardCutsPbPb2011DStar(0);
833 //_________________________________here the PbPb vs pt _________________________________________
834 void AliRDHFCutsDStartoKpipi::SetStandardCutsPbPb2011DStar(TH1F *hfl){
836 // Default 2010 PbPb cut object
838 SetName("DStartoD0piCutsStandard2011");
839 SetTitle("Standard Cuts for D* analysis in PbPb 2011");
847 ResetMaskAndEnableMBTrigger();
848 EnableCentralTrigger();
849 EnableSemiCentralTrigger();
851 // CENTRALITY SELECTION
852 SetMinCentrality(0.);
853 SetMaxCentrality(10.);
854 SetUseCentrality(AliRDHFCuts::kCentV0M);
856 // CUTS ON SINGLE TRACKS
857 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
858 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
859 esdTrackCuts->SetRequireTPCRefit(kTRUE);
860 esdTrackCuts->SetRequireITSRefit(kTRUE);
861 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
862 esdTrackCuts->SetMinDCAToVertexXY(0.);
863 esdTrackCuts->SetEtaRange(-0.8,0.8);
864 esdTrackCuts->SetPtRange(0.3,1.e10);
866 esdTrackCuts->SetMaxDCAToVertexXY(1.);
867 esdTrackCuts->SetMaxDCAToVertexZ(1.);
871 AliESDtrackCuts* esdSoftPicuts=new AliESDtrackCuts();
872 esdSoftPicuts->SetRequireSigmaToVertex(kFALSE);
873 esdSoftPicuts->SetRequireTPCRefit(kTRUE);
874 esdSoftPicuts->SetRequireITSRefit(kTRUE);
875 esdSoftPicuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
876 AliESDtrackCuts::kAny); //test d0 asimmetry
877 esdSoftPicuts->SetPtRange(0.1,10);
879 esdSoftPicuts->SetMaxDCAToVertexXY(1.);
880 esdSoftPicuts->SetMaxDCAToVertexZ(1.);
882 SetSelectCandTrackSPDFirst(kTRUE, 4);
884 //nothing below 3 GeV/c, speed up the calculation
885 SetMinPtCandidate(3.0);
887 AddTrackCuts(esdTrackCuts);
888 AddTrackCutsSoftPi(esdSoftPicuts);
891 delete esdSoftPicuts;
894 const Int_t nptbins =14;
895 const Double_t ptmax = 36.;
896 const Int_t nvars=16;
897 Float_t ptbins[nptbins+1];
914 SetGlobalIndex(nvars,nptbins);
915 SetPtBins(nptbins+1,ptbins);
917 Float_t cutsMatrixD0toKpiStand[nptbins][nvars]={{0.032,220.*1E-4,0.9,0.5,0.5,500.*1E-4,500.*1E-4,-16000.*1E-8,0.85,0.3,0.1,0.05,100,0.5,-1.,9.},/* 0.5<pt<1*/
918 {0.032,350.*1E-4,0.9,0.5,0.5,800.*1E-4,800.*1E-4,-20000.*1E-8,0.96,0.3,0.15,0.05,100,0.5,0.99,10.},/* 1<pt<2 */
919 {0.032,300.*1E-4,0.9,0.5,0.5,900.*1E-4,900.*1E-4,-42000.*1E-8,0.96,0.3,0.15,0.05,100,0.5,0.99,9.},/* 2<pt<3 */
920 {0.036,300.*1E-4,0.8,0.8,0.8,900.*1E-4,900.*1E-4,-39000.*1E-8,0.99,0.3,0.15,0.05,100,0.5,0.998,8.},/* 3<pt<4 */
921 {0.038,225.*1E-4,0.8,1.0,1.0,1000.*1E-4,1000.*1E-4,-30000.*1E-8,0.99,0.3,0.15,0.05,100,0.5,0.998,7.5},/* 4<pt<5 */
922 {0.045,200.*1E-4,1.0,1.0,1.0,1000.*1E-4,1000.*1E-4,-23000.*1E-8,0.99,0.3,0.15,0.05,100,0.5,0.998,7.},/* 5<pt<6 */
923 {0.045,210.*1E-4,1.0,1.0,1.0,1000.*1E-4,1000.*1E-4,-10000.*1E-8,0.982,0.3,0.15,0.05,100,0.5,0.998,6.4},/* 6<pt<7 */
924 {0.050,230.*1E-4,1.0,1.0,1.0,1000.*1E-4,1000.*1E-4,-12700.*1E-8,0.98,0.3,0.15,0.05,100,0.5,0.998,6.4},/* 7<pt<8 */
925 {0.060,200.*1E-4,1.0,0.9,0.9,1000.*1E-4,1000.*1E-4,-7500.*1E-8,0.98,0.3,0.15,0.05,100,0.5,0.998,4.7},/* 8<pt<10 */
926 {0.060,200.*1E-4,1.0,0.9,0.9,1000.*1E-4,1000.*1E-4,-7500.*1E-8,0.97,0.3,0.15,0.05,100,1.0,0.998,4.7},/* 10<pt<12 */
927 {0.074,200.*1E-4,1.0,0.5,0.5,1500.*1E-4,1500.*1E-4,-7500.*1E-8,0.95,0.3,0.15,0.05,100,1.0,0.998,3},/* 12<pt<16 */
928 {0.074,210.*1E-4,1.0,0.5,0.5,1500.*1E-4,1500.*1E-4,-5000.*1E-8,0.95,0.3,0.15,0.05,100,1.0,0.998,2.},/* 16<pt<20 */
929 {0.074,220.*1E-4,1.0,0.5,0.5,1500.*1E-4,1500.*1E-4,-5000.*1E-8,0.93,0.3,0.15,0.05,100,1.0,0.995,2.},/* 20<pt<24 */
930 {0.074,400.*1E-4,1.0,0.5,0.5,2000.*1E-4,2000.*1E-4,40000.*1E-8,0.7,0.3,0.15,0.05,100,1.0,0.9,1.}};/* 24<pt<36 */
933 //CREATE TRANSPOSE MATRIX...REVERSE INDICES as required by AliRDHFCuts
934 Float_t **cutsMatrixTransposeStand=new Float_t*[nvars];
935 for(Int_t iv=0;iv<nvars;iv++)cutsMatrixTransposeStand[iv]=new Float_t[nptbins];
937 for (Int_t ibin=0;ibin<nptbins;ibin++){
938 for (Int_t ivar = 0; ivar<nvars; ivar++){
939 cutsMatrixTransposeStand[ivar][ibin]=cutsMatrixD0toKpiStand[ibin][ivar];
943 SetCuts(nvars,nptbins,cutsMatrixTransposeStand);
945 for(Int_t iv=0;iv<nvars;iv++) delete [] cutsMatrixTransposeStand[iv];
946 delete [] cutsMatrixTransposeStand;
947 cutsMatrixTransposeStand=NULL;
949 // PID SETTINGS // ---
950 AliAODPidHF* pidObj=new AliAODPidHF();
951 // pidObj->SetName("pid4DSatr");
954 pidObj->SetMatch(mode);
955 pidObj->SetSigma(0,3); // TPC -- 2 sigma for pt < 4
956 pidObj->SetSigma(3,3); // TOF
957 pidObj->SetTPC(kTRUE);
958 pidObj->SetTOF(kTRUE);
959 pidObj->SetOldPid(kFALSE);
964 // PID off for tracks with pt above 4 GeV/c
965 SetOffHighPtPIDinTPC(4.0);
966 SetRemoveDaughtersFromPrim(kFALSE);
968 SetHistoForCentralityFlattening(hfl,0.,10,0.,0);
978 //-----------------------------------Here the multiplicity pp--------------------------------
980 void AliRDHFCutsDStartoKpipi::SetStandardCutsPP2010DStarMult(Bool_t rec){
984 // STANDARD CUTS USED FOR 2010 pp analysis (multiplicity)
988 SetName("DStartoD0piCutsStandard");
989 SetTitle("Standard Cuts for D* analysis pp mult");
992 SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
999 // CUTS ON SINGLE TRACKS
1000 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
1001 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
1002 esdTrackCuts->SetRequireTPCRefit(kTRUE);
1003 esdTrackCuts->SetRequireITSRefit(kTRUE);
1004 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
1005 esdTrackCuts->SetMinDCAToVertexXY(0.);
1006 esdTrackCuts->SetEtaRange(-0.8,0.8);
1007 esdTrackCuts->SetPtRange(0.3,1.e10);
1009 esdTrackCuts->SetMaxDCAToVertexXY(1.);
1010 esdTrackCuts->SetMaxDCAToVertexZ(1.);
1013 // CUTS on SOFT PION
1014 AliESDtrackCuts* esdSoftPicuts=new AliESDtrackCuts();
1015 esdSoftPicuts->SetRequireSigmaToVertex(kFALSE);
1016 esdSoftPicuts->SetRequireTPCRefit(kFALSE);
1017 esdSoftPicuts->SetRequireITSRefit(kTRUE);
1018 esdSoftPicuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
1019 AliESDtrackCuts::kAny);
1020 esdSoftPicuts->SetPtRange(0.08,1.e10);
1021 SetUseCentrality(kFALSE);
1023 AddTrackCuts(esdTrackCuts);
1024 AddTrackCutsSoftPi(esdSoftPicuts);
1025 delete esdTrackCuts;
1027 delete esdSoftPicuts;
1030 const Int_t nptbins =14;
1031 const Double_t ptmax = 9999.;
1032 const Int_t nvars=16;
1033 Float_t ptbins[nptbins+1];
1050 SetGlobalIndex(nvars,nptbins);
1051 SetPtBins(nptbins+1,ptbins);
1053 Float_t cutsMatrixD0toKpiStand[nptbins][nvars]={{0.026,220.*1E-4,0.7,0.21,0.21,500.*1E-4,500.*1E-4,-2000.*1E-8,0.85,0.3,0.1,0.05,100,0.5,-1.,0.},/* pt<0.5*/
1054 {0.039,300.*1E-4,0.7,0.21,0.21,500.*1E-4,500.*1E-4,-16000.*1E-8,0.85,0.3,0.1,0.05,100,0.5,-1.,0.},/* 0.5<pt<1*/
1055 {0.022,400.*1E-4,0.8,0.7,0.7,800.*1E-4,800.*1E-4,-20000.*1E-8,0.8,0.3,0.3,0.05,100,0.5,-1.,0.},/* 1<pt<2 */
1056 {0.032,350.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-13000.*1E-8,0.9,0.3,0.3,0.05,100,0.8,-1.,0.},/* 2<pt<3 */
1057 {0.032,500.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-8000.*1E-8,0.9,0.3,0.3,0.05,100,0.8,-1.,0.},/* 3<pt<4 */
1058 {0.032,700.*1E-4,0.9,0.9,0.9,1000.*1E-4,1000.*1E-4,10000.*1E-8,0.9,0.3,0.3,0.05,100,1.0,-1.,0.},/* 4<pt<5 */
1059 {0.036,1000.*1E-4,1.0,0.8,0.8,1000.*1E-4,1000.*1E-4,50000.*1E-8,0.9,0.3,0.3,0.05,100,1.0,-1.,0.},/* 5<pt<6 */
1060 {0.036,1000.*1E-4,1.0,0.8,0.8,1000.*1E-4,1000.*1E-4,100000.*1E-8,0.7,0.3,0.3,0.05,100,1.0,-1.,0.},/* 6<pt<7 */
1061 {0.036,1000.*1E-4,1.0,0.8,0.8,1200.*1E-4,1200.*1E-4,100000.*1E-8,0.6,0.3,0.3,0.05,100,1.0,-1.,0.},/* 7<pt<8 */
1062 {0.065,2000.*1E-4,1.0,0.3,0.3,2000.*1E-4,2000.*1E-4,1000000.*1E-8,0.5,0.3,0.3,0.05,100,1.0,-1.,0.},/* 8<pt<10 */
1063 {0.075,2000.*1E-4,1.0,0.3,0.3,2000.*1E-4,2000.*1E-4,1000000.*1E-8,0.3,0.3,0.3,0.05,100,1.0,-1.,0.},/* 10<pt<12 */
1064 {0.084,6000.*1E-4,1.0,0.3,0.3,1500.*1E-4,1500.*1E-4,1000000.*1E-8,0.1,0.3,0.1,0.05,100,1.0,-1.,0.},/* 12<pt<16 */
1065 {0.084,1000.*1E-4,1.0,1.0,1.0,1500.*1E-4,1500.*1E-4,1000000.*1E-8,0.7,0.3,0.1,0.05,100,1.0,-1.,0.},/* 16<pt<20 */
1066 {0.7,1000.*1E-4,1.0,1.0,1.0,1500.*1E-4,1500.*1E-4,1000000.*1E-8,0.7,0.3,0.1,0.05,100,1.0,-1.,0.}};/* pt>24 */
1069 //CREATE TRANSPOSE MATRIX...REVERSE INDICES as required by AliRDHFCuts
1070 Float_t **cutsMatrixTransposeStand=new Float_t*[nvars];
1071 for(Int_t iv=0;iv<nvars;iv++)cutsMatrixTransposeStand[iv]=new Float_t[nptbins];
1073 for (Int_t ibin=0;ibin<nptbins;ibin++){
1074 for (Int_t ivar = 0; ivar<nvars; ivar++){
1075 cutsMatrixTransposeStand[ivar][ibin]=cutsMatrixD0toKpiStand[ibin][ivar];
1079 SetCuts(nvars,nptbins,cutsMatrixTransposeStand);
1081 for(Int_t iv=0;iv<nvars;iv++) delete [] cutsMatrixTransposeStand[iv];
1082 delete [] cutsMatrixTransposeStand;
1083 cutsMatrixTransposeStand=NULL;
1085 // remove daughters from primary vertex
1086 SetRemoveDaughtersFromPrim(rec);
1088 // PID SETTINGS FOR D* analysis
1089 AliAODPidHF* pidObj=new AliAODPidHF();
1090 //pidObj->SetName("pid4DSatr");
1092 pidObj->SetMatch(mode);
1093 pidObj->SetSigma(0,3); // TPC
1094 pidObj->SetSigma(3,3); // TOF
1095 pidObj->SetTPC(kTRUE);
1096 pidObj->SetTOF(kTRUE);
1100 pidObj->SetOldPid(kTRUE);