1 /**************************************************************************
\r
2 * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
18 /////////////////////////////////////////////////////////////
\r
20 // Class for cuts on AOD reconstructed D0->Kpi
\r
22 // Author: A.Dainese, andrea.dainese@pd.infn.it
\r
23 /////////////////////////////////////////////////////////////
\r
25 #include <TDatabasePDG.h>
\r
26 #include <Riostream.h>
\r
28 #include "AliRDHFCutsD0toKpi.h"
\r
29 #include "AliAODRecoDecayHF2Prong.h"
\r
30 #include "AliAODTrack.h"
\r
31 #include "AliESDtrack.h"
\r
32 #include "AliAODPid.h"
\r
33 #include "AliTPCPIDResponse.h"
\r
34 #include "AliAODVertex.h"
\r
35 #include "AliKFVertex.h"
\r
36 #include "AliKFParticle.h"
\r
38 ClassImp(AliRDHFCutsD0toKpi)
\r
40 //--------------------------------------------------------------------------
\r
41 AliRDHFCutsD0toKpi::AliRDHFCutsD0toKpi(const char* name) :
\r
43 fUseSpecialCuts(kFALSE),
\r
45 fDefaultPID(kFALSE),
\r
48 fPtMaxSpecialCuts(9999.)
\r
51 // Default Constructor
\r
55 TString varNames[11]={"inv. mass [GeV]",
\r
64 "|cosThetaPointXY|",
\r
65 "NormDecayLenghtXY"};
\r
66 Bool_t isUpperCut[11]={kTRUE,
\r
77 SetVarNames(nvars,varNames,isUpperCut);
\r
78 Bool_t forOpt[11]={kFALSE,
\r
89 SetVarsForOpt(4,forOpt);
\r
90 Float_t limits[2]={0,999999999.};
\r
91 SetPtBins(2,limits);
\r
94 //--------------------------------------------------------------------------
\r
95 AliRDHFCutsD0toKpi::AliRDHFCutsD0toKpi(const AliRDHFCutsD0toKpi &source) :
\r
96 AliRDHFCuts(source),
\r
97 fUseSpecialCuts(source.fUseSpecialCuts),
\r
98 fLowPt(source.fLowPt),
\r
99 fDefaultPID(source.fDefaultPID),
\r
100 fUseKF(source.fUseKF),
\r
101 fPtLowPID(source.fPtLowPID),
\r
102 fPtMaxSpecialCuts(source.fPtMaxSpecialCuts)
\r
105 // Copy constructor
\r
109 //--------------------------------------------------------------------------
\r
110 AliRDHFCutsD0toKpi &AliRDHFCutsD0toKpi::operator=(const AliRDHFCutsD0toKpi &source)
\r
113 // assignment operator
\r
115 if(&source == this) return *this;
\r
117 AliRDHFCuts::operator=(source);
\r
118 fUseSpecialCuts=source.fUseSpecialCuts;
\r
119 fLowPt=source.fLowPt;
\r
120 fDefaultPID=source.fDefaultPID;
\r
121 fUseKF=source.fUseKF;
\r
122 fPtLowPID=source.fPtLowPID;
\r
123 fPtMaxSpecialCuts=source.fPtMaxSpecialCuts;
\r
129 //---------------------------------------------------------------------------
\r
130 void AliRDHFCutsD0toKpi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters,AliAODEvent *aod) {
\r
132 // Fills in vars the values of the variables
\r
135 if(nvars!=fnVarsForOpt) {
\r
136 printf("AliRDHFCutsD0toKpi::GetCutsVarsForOpt: wrong number of variables\n");
\r
140 AliAODRecoDecayHF2Prong *dd = (AliAODRecoDecayHF2Prong*)d;
\r
142 //recalculate vertex w/o daughters
\r
143 Bool_t cleanvtx=kFALSE;
\r
144 AliAODVertex *origownvtx=0x0;
\r
145 if(fRemoveDaughtersFromPrimary) {
\r
146 if(dd->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*dd->GetOwnPrimaryVtx());
\r
148 if(!RecalcOwnPrimaryVtx(dd,aod)) {
\r
149 CleanOwnPrimaryVtx(dd,aod,origownvtx);
\r
155 if(fVarsForOpt[0]){
\r
157 if(TMath::Abs(pdgdaughters[0])==211) {
\r
158 vars[iter]=dd->InvMassD0();
\r
160 vars[iter]=dd->InvMassD0bar();
\r
163 if(fVarsForOpt[1]){
\r
165 vars[iter]=dd->GetDCA();
\r
167 if(fVarsForOpt[2]){
\r
169 if(TMath::Abs(pdgdaughters[0])==211) {
\r
170 vars[iter] = dd->CosThetaStarD0();
\r
172 vars[iter] = dd->CosThetaStarD0bar();
\r
175 if(fVarsForOpt[3]){
\r
177 if(TMath::Abs(pdgdaughters[0])==321) {
\r
178 vars[iter]=dd->PtProng(0);
\r
181 vars[iter]=dd->PtProng(1);
\r
184 if(fVarsForOpt[4]){
\r
186 if(TMath::Abs(pdgdaughters[0])==211) {
\r
187 vars[iter]=dd->PtProng(0);
\r
190 vars[iter]=dd->PtProng(1);
\r
193 if(fVarsForOpt[5]){
\r
195 if(TMath::Abs(pdgdaughters[0])==321) {
\r
196 vars[iter]=dd->Getd0Prong(0);
\r
199 vars[iter]=dd->Getd0Prong(1);
\r
202 if(fVarsForOpt[6]){
\r
204 if(TMath::Abs(pdgdaughters[0])==211) {
\r
205 vars[iter]=dd->Getd0Prong(0);
\r
208 vars[iter]=dd->Getd0Prong(1);
\r
211 if(fVarsForOpt[7]){
\r
213 vars[iter]= dd->Prodd0d0();
\r
215 if(fVarsForOpt[8]){
\r
217 vars[iter]=dd->CosPointingAngle();
\r
220 if(fVarsForOpt[9]){
\r
222 vars[iter]=TMath::Abs(dd->CosPointingAngleXY());
\r
225 if(fVarsForOpt[10]){
\r
227 vars[iter]=dd->NormalizedDecayLengthXY();
\r
230 if(cleanvtx)CleanOwnPrimaryVtx(dd,aod,origownvtx);
\r
234 //---------------------------------------------------------------------------
\r
235 Int_t AliRDHFCutsD0toKpi::IsSelected(TObject* obj,Int_t selectionLevel,AliAODEvent* aod) {
\r
245 cout<<"Cut matrice not inizialized. Exit..."<<endl;
\r
249 AliAODRecoDecayHF2Prong* d=(AliAODRecoDecayHF2Prong*)obj;
\r
252 cout<<"AliAODRecoDecayHF2Prong null"<<endl;
\r
256 if(fKeepSignalMC) if(IsSignalMC(d,aod,421)) return 3;
\r
258 Double_t ptD=d->Pt();
\r
259 if(ptD<fMinPtCand) return 0;
\r
260 if(ptD>fMaxPtCand) return 0;
\r
262 if(d->HasBadDaughters()) return 0;
\r
264 // returnvalue: 0 not sel, 1 only D0, 2 only D0bar, 3 both
\r
265 Int_t returnvaluePID=3;
\r
266 Int_t returnvalueCuts=3;
\r
268 // selection on candidate
\r
269 if(selectionLevel==AliRDHFCuts::kAll ||
\r
270 selectionLevel==AliRDHFCuts::kCandidate) {
\r
274 //recalculate vertex w/o daughters
\r
275 AliAODVertex *origownvtx=0x0;
\r
276 if(fRemoveDaughtersFromPrimary && !fUseMCVertex) {
\r
277 if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());
\r
278 if(!RecalcOwnPrimaryVtx(d,aod)) {
\r
279 CleanOwnPrimaryVtx(d,aod,origownvtx);
\r
285 if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());
\r
286 if(!SetMCPrimaryVtx(d,aod)) {
\r
287 CleanOwnPrimaryVtx(d,aod,origownvtx);
\r
292 Double_t pt=d->Pt();
\r
294 Int_t okD0=0,okD0bar=0;
\r
296 Int_t ptbin=PtBin(pt);
\r
298 CleanOwnPrimaryVtx(d,aod,origownvtx);
\r
302 Double_t mD0,mD0bar,ctsD0,ctsD0bar;
\r
305 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
\r
307 d->InvMassD0(mD0,mD0bar);
\r
308 if(TMath::Abs(mD0-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)]) okD0 = 0;
\r
309 if(TMath::Abs(mD0bar-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)]) okD0bar = 0;
\r
310 if(!okD0 && !okD0bar) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
\r
312 if(d->Prodd0d0() > fCutsRD[GetGlobalIndex(7,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
\r
315 if(d->Pt2Prong(1) < fCutsRD[GetGlobalIndex(3,ptbin)]*fCutsRD[GetGlobalIndex(3,ptbin)] || d->Pt2Prong(0) < fCutsRD[GetGlobalIndex(4,ptbin)]*fCutsRD[GetGlobalIndex(4,ptbin)]) okD0 = 0;
\r
316 if(d->Pt2Prong(0) < fCutsRD[GetGlobalIndex(3,ptbin)]*fCutsRD[GetGlobalIndex(3,ptbin)] || d->Pt2Prong(1) < fCutsRD[GetGlobalIndex(4,ptbin)]*fCutsRD[GetGlobalIndex(4,ptbin)]) okD0bar = 0;
\r
317 if(!okD0 && !okD0bar) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
\r
320 if(TMath::Abs(d->Getd0Prong(1)) > fCutsRD[GetGlobalIndex(5,ptbin)] ||
\r
321 TMath::Abs(d->Getd0Prong(0)) > fCutsRD[GetGlobalIndex(6,ptbin)]) okD0 = 0;
\r
322 if(TMath::Abs(d->Getd0Prong(0)) > fCutsRD[GetGlobalIndex(6,ptbin)] ||
\r
323 TMath::Abs(d->Getd0Prong(1)) > fCutsRD[GetGlobalIndex(5,ptbin)]) okD0bar = 0;
\r
324 if(!okD0 && !okD0bar) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
\r
326 if(d->GetDCA() > fCutsRD[GetGlobalIndex(1,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
\r
329 d->CosThetaStarD0(ctsD0,ctsD0bar);
\r
330 if(TMath::Abs(ctsD0) > fCutsRD[GetGlobalIndex(2,ptbin)]) okD0 = 0;
\r
331 if(TMath::Abs(ctsD0bar) > fCutsRD[GetGlobalIndex(2,ptbin)]) okD0bar = 0;
\r
332 if(!okD0 && !okD0bar) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
\r
334 if(d->CosPointingAngle() < fCutsRD[GetGlobalIndex(8,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
\r
337 if(TMath::Abs(d->CosPointingAngleXY()) < fCutsRD[GetGlobalIndex(9,ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
\r
339 Double_t normalDecayLengXY=d->NormalizedDecayLengthXY();
\r
340 if (normalDecayLengXY < fCutsRD[GetGlobalIndex(10, ptbin)]) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
\r
342 if (returnvalueCuts!=0) {
\r
343 if (okD0) returnvalueCuts=1; //cuts passed as D0
\r
344 if (okD0bar) returnvalueCuts=2; //cuts passed as D0bar
\r
345 if (okD0 && okD0bar) returnvalueCuts=3; //cuts passed as D0 and D0bar
\r
348 // call special cuts
\r
350 if(fUseSpecialCuts && (pt<fPtMaxSpecialCuts)) special=IsSelectedSpecialCuts(d);
\r
351 if(!special) {CleanOwnPrimaryVtx(d,aod,origownvtx); return 0;}
\r
353 // unset recalculated primary vertex when not needed any more
\r
354 CleanOwnPrimaryVtx(d,aod,origownvtx);
\r
357 // go to selection with Kalman vertexing, if requested
\r
358 returnvalueCuts = IsSelectedKF(d,aod);
\r
361 fIsSelectedCuts=returnvalueCuts;
\r
362 if(!returnvalueCuts) return 0;
\r
366 // selection on PID
\r
367 if(selectionLevel==AliRDHFCuts::kAll ||
\r
368 selectionLevel==AliRDHFCuts::kCandidate ||
\r
369 selectionLevel==AliRDHFCuts::kPID) {
\r
370 returnvaluePID = IsSelectedPID(d);
\r
371 fIsSelectedPID=returnvaluePID;
\r
372 if(!returnvaluePID) return 0;
\r
375 Int_t returnvalueComb=CombineSelectionLevels(3,returnvalueCuts,returnvaluePID);
\r
377 if(!returnvalueComb) return 0;
\r
379 // selection on daughter tracks
\r
380 if(selectionLevel==AliRDHFCuts::kAll ||
\r
381 selectionLevel==AliRDHFCuts::kTracks) {
\r
382 if(!AreDaughtersSelected(d)) return 0;
\r
385 // cout<<"Pid = "<<returnvaluePID<<endl;
\r
386 return returnvalueComb;
\r
389 //------------------------------------------------------------------------------------------
\r
390 Int_t AliRDHFCutsD0toKpi::IsSelectedKF(AliAODRecoDecayHF2Prong *d,
\r
391 AliAODEvent* aod) const {
\r
393 // Apply selection using KF-vertexing
\r
396 AliAODTrack *track0 = (AliAODTrack*)d->GetDaughter(0);
\r
397 AliAODTrack *track1 = (AliAODTrack*)d->GetDaughter(1);
\r
399 if(!track0 || !track1) {
\r
400 cout<<"one or two D0 daughters missing!"<<endl;
\r
404 // returnvalue: 0 not sel, 1 only D0, 2 only D0bar, 3 both
\r
405 Int_t returnvalueCuts=3;
\r
407 // candidate selection with AliKF
\r
408 AliKFParticle::SetField(aod->GetMagneticField()); // set the magnetic field
\r
410 Int_t okD0=0,okD0bar=0;
\r
413 // convert tracks into AliKFParticles
\r
415 AliKFParticle negPiKF(*track1,-211); // neg pion kandidate
\r
416 AliKFParticle negKKF(*track1,-321); // neg kaon kandidate
\r
417 AliKFParticle posPiKF(*track0,211); // pos pion kandidate
\r
418 AliKFParticle posKKF(*track0,321); // pos kaon kandidate
\r
420 // build D0 candidates
\r
422 AliKFParticle d0c(negKKF,posPiKF); // D0 candidate
\r
423 AliKFParticle ad0c(posKKF,negPiKF); // D0bar candidate
\r
425 // create kf primary vertices
\r
427 AliAODVertex *vtx1 = aod->GetPrimaryVertex();
\r
428 AliKFVertex primVtx(*vtx1);
\r
429 AliKFVertex aprimVtx(*vtx1);
\r
431 if(primVtx.GetNContributors()<=0) okD0 = 0;
\r
432 if(aprimVtx.GetNContributors()<=0) okD0bar = 0;
\r
433 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
437 Double_t d0mass = d0c.GetMass();
\r
438 Double_t ad0mass = ad0c.GetMass();
\r
440 // calculate P of D0 and D0bar
\r
441 Double_t d0P = d0c.GetP();
\r
442 Double_t d0Px = d0c.GetPx();
\r
443 Double_t d0Py = d0c.GetPy();
\r
444 Double_t d0Pz = d0c.GetPz();
\r
445 Double_t ad0P = ad0c.GetP();
\r
446 Double_t ad0Px = ad0c.GetPx();
\r
447 Double_t ad0Py = ad0c.GetPy();
\r
448 Double_t ad0Pz = ad0c.GetPz();
\r
450 //calculate Pt of D0 and D0bar
\r
452 Double_t pt=d0c.GetPt();
\r
453 Double_t apt=ad0c.GetPt();
\r
455 // remove D0 daughters from primary vertices (if used in vertex fit) and add D0-candidates
\r
457 if(track0->GetUsedForPrimVtxFit()) {
\r
458 primVtx -= posPiKF;
\r
459 aprimVtx -= posKKF;
\r
462 if(track1->GetUsedForPrimVtxFit()) {
\r
463 primVtx -= negKKF;
\r
464 aprimVtx -= negPiKF;
\r
470 if(primVtx.GetNContributors()<=0) okD0 = 0;
\r
471 if(aprimVtx.GetNContributors()<=0) okD0bar = 0;
\r
472 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
474 //calculate cut variables
\r
476 // calculate impact params of daughters w.r.t recalculated vertices
\r
478 Double_t impactPi = posPiKF.GetDistanceFromVertexXY(primVtx);
\r
479 Double_t aimpactPi = negPiKF.GetDistanceFromVertexXY(aprimVtx);
\r
480 Double_t impactKa = negKKF.GetDistanceFromVertexXY(primVtx);
\r
481 Double_t aimpactKa = posKKF.GetDistanceFromVertexXY(aprimVtx);
\r
483 // calculate Product of Impact Params
\r
485 Double_t prodParam = impactPi*impactKa;
\r
486 Double_t aprodParam = aimpactPi*aimpactKa;
\r
488 // calculate cosine of pointing angles
\r
490 TVector3 mom(d0c.GetPx(),d0c.GetPy(),d0c.GetPz());
\r
491 TVector3 fline(d0c.GetX()-primVtx.GetX(),
\r
492 d0c.GetY()-primVtx.GetY(),
\r
493 d0c.GetZ()-primVtx.GetZ());
\r
494 Double_t pta = mom.Angle(fline);
\r
495 Double_t cosP = TMath::Cos(pta); // cosine of pta for D0 candidate
\r
497 TVector3 amom(ad0c.GetPx(),ad0c.GetPy(),ad0c.GetPz());
\r
498 TVector3 afline(ad0c.GetX()-aprimVtx.GetX(),
\r
499 ad0c.GetY()-aprimVtx.GetY(),
\r
500 ad0c.GetZ()-aprimVtx.GetZ());
\r
501 Double_t apta = amom.Angle(afline);
\r
502 Double_t acosP = TMath::Cos(apta); // cosine of pta for D0bar candidate
\r
504 // calculate P of Pions at Decay Position of D0 and D0bar candidates
\r
505 negKKF.TransportToParticle(d0c);
\r
506 posPiKF.TransportToParticle(d0c);
\r
507 posKKF.TransportToParticle(ad0c);
\r
508 negPiKF.TransportToParticle(ad0c);
\r
510 Double_t pxPi = posPiKF.GetPx();
\r
511 Double_t pyPi = posPiKF.GetPy();
\r
512 Double_t pzPi = posPiKF.GetPz();
\r
513 Double_t ptPi = posPiKF.GetPt();
\r
515 Double_t apxPi = negPiKF.GetPx();
\r
516 Double_t apyPi = negPiKF.GetPy();
\r
517 Double_t apzPi = negPiKF.GetPz();
\r
518 Double_t aptPi = negPiKF.GetPt();
\r
520 // calculate Pt of Kaons at Decay Position of D0 and D0bar candidates
\r
522 Double_t ptK = negKKF.GetPt();
\r
523 Double_t aptK = posKKF.GetPt();
\r
525 //calculate cos(thetastar)
\r
526 Double_t massvtx = TDatabasePDG::Instance()->GetParticle(421)->Mass();
\r
528 massp[0] = TDatabasePDG::Instance()->GetParticle(321)->Mass();
\r
529 massp[1] = TDatabasePDG::Instance()->GetParticle(211)->Mass();
\r
530 Double_t pStar = TMath::Sqrt(TMath::Power(massvtx*massvtx-massp[0]*massp[0]-massp[1]*massp[1],2.)
\r
531 -4.*massp[0]*massp[0]*massp[1]*massp[1])/(2.*massvtx);
\r
533 // cos(thetastar) for D0 and Pion
\r
535 Double_t d0E = TMath::Sqrt(massvtx*massvtx + d0P*d0P);
\r
536 Double_t beta = d0P/d0E;
\r
537 Double_t gamma = d0E/massvtx;
\r
538 TVector3 momPi(pxPi,pyPi,pzPi);
\r
539 TVector3 momTot(d0Px,d0Py,d0Pz);
\r
540 Double_t q1 = momPi.Dot(momTot)/momTot.Mag();
\r
541 Double_t cts = (q1/gamma-beta*TMath::Sqrt(pStar*pStar+massp[1]*massp[1]))/pStar;
\r
543 // cos(thetastar) for D0bar and Pion
\r
545 Double_t ad0E = TMath::Sqrt(massvtx*massvtx + ad0P*ad0P);
\r
546 Double_t abeta = ad0P/ad0E;
\r
547 Double_t agamma = ad0E/massvtx;
\r
548 TVector3 amomPi(apxPi,apyPi,apzPi);
\r
549 TVector3 amomTot(ad0Px,ad0Py,ad0Pz);
\r
550 Double_t aq1 = amomPi.Dot(amomTot)/amomTot.Mag();
\r
551 Double_t acts = (aq1/agamma-abeta*TMath::Sqrt(pStar*pStar+massp[1]*massp[1]))/pStar;
\r
553 // calculate reduced Chi2 for the full D0 fit
\r
554 d0c.SetProductionVertex(primVtx);
\r
555 ad0c.SetProductionVertex(aprimVtx);
\r
556 negKKF.SetProductionVertex(d0c);
\r
557 posPiKF.SetProductionVertex(d0c);
\r
558 posKKF.SetProductionVertex(ad0c);
\r
559 negPiKF.SetProductionVertex(ad0c);
\r
560 d0c.TransportToProductionVertex();
\r
561 ad0c.TransportToProductionVertex();
\r
563 // calculate the decay length
\r
564 Double_t decayLengthD0 = d0c.GetDecayLength();
\r
565 Double_t adecayLengthD0 = ad0c.GetDecayLength();
\r
567 Double_t chi2D0 = 50.;
\r
568 if(d0c.GetNDF() > 0 && d0c.GetChi2() >= 0) {
\r
569 chi2D0 = d0c.GetChi2()/d0c.GetNDF();
\r
572 Double_t achi2D0 = 50.;
\r
573 if(ad0c.GetNDF() > 0 && ad0c.GetChi2() >= 0) {
\r
574 achi2D0 = ad0c.GetChi2()/ad0c.GetNDF();
\r
578 Int_t ptbin=PtBin(pt);
\r
579 Int_t aptbin=PtBin(apt);
\r
581 if(ptbin < 0) okD0 = 0;
\r
582 if(aptbin < 0) okD0bar = 0;
\r
583 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
585 if(ptK < fCutsRD[GetGlobalIndex(3,ptbin)] || ptPi < fCutsRD[GetGlobalIndex(4,ptbin)]) okD0 = 0;
\r
586 if(aptK < fCutsRD[GetGlobalIndex(3,aptbin)] || aptPi < fCutsRD[GetGlobalIndex(4,aptbin)]) okD0bar = 0;
\r
587 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
590 if(TMath::Abs(impactKa) > fCutsRD[GetGlobalIndex(5,ptbin)] ||
\r
591 TMath::Abs(impactPi) > fCutsRD[GetGlobalIndex(6,ptbin)]) okD0 = 0;
\r
593 if(TMath::Abs(aimpactKa) > fCutsRD[GetGlobalIndex(5,aptbin)] ||
\r
594 TMath::Abs(aimpactPi) > fCutsRD[GetGlobalIndex(6,aptbin)]) okD0bar = 0;
\r
596 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
598 // for the moment via the standard method due to bug in AliKF
\r
599 if(d->GetDCA() > fCutsRD[GetGlobalIndex(1,ptbin)]) okD0 = 0;
\r
600 if(d->GetDCA() > fCutsRD[GetGlobalIndex(1,aptbin)]) okD0bar = 0;
\r
601 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
604 if(TMath::Abs(d0mass-massvtx) > fCutsRD[GetGlobalIndex(0,ptbin)]) okD0 = 0;
\r
605 if(TMath::Abs(ad0mass-massvtx) > fCutsRD[GetGlobalIndex(0,aptbin)]) okD0bar = 0;
\r
606 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
609 if(TMath::Abs(cts) > fCutsRD[GetGlobalIndex(2,ptbin)]) okD0 = 0;
\r
610 if(TMath::Abs(acts) > fCutsRD[GetGlobalIndex(2,aptbin)]) okD0bar = 0;
\r
611 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
613 if(prodParam > fCutsRD[GetGlobalIndex(7,ptbin)]) okD0 = 0;
\r
614 if(aprodParam > fCutsRD[GetGlobalIndex(7,aptbin)]) okD0bar = 0;
\r
615 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
617 if(cosP < fCutsRD[GetGlobalIndex(8,ptbin)]) okD0 = 0;
\r
618 if(acosP < fCutsRD[GetGlobalIndex(8,aptbin)]) okD0bar = 0;
\r
619 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
621 if(chi2D0 > fCutsRD[GetGlobalIndex(10,ptbin)]) okD0 = 0;
\r
622 if(achi2D0 > fCutsRD[GetGlobalIndex(10,aptbin)]) okD0bar = 0;
\r
623 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
625 if(decayLengthD0 < fCutsRD[GetGlobalIndex(9,ptbin)]) okD0 = 0;
\r
626 if(adecayLengthD0 < fCutsRD[GetGlobalIndex(9,aptbin)]) okD0bar = 0;
\r
627 if(!okD0 && !okD0bar) returnvalueCuts=0;
\r
629 if(returnvalueCuts!=0) {
\r
630 if(okD0) returnvalueCuts=1; //cuts passed as D0
\r
631 if(okD0bar) returnvalueCuts=2; //cuts passed as D0bar
\r
632 if(okD0 && okD0bar) returnvalueCuts=3; //cuts passed as D0 and D0bar
\r
635 return returnvalueCuts;
\r
638 //---------------------------------------------------------------------------
\r
640 Bool_t AliRDHFCutsD0toKpi::IsInFiducialAcceptance(Double_t pt, Double_t y) const
\r
643 // Checking if D0 is in fiducial acceptance region
\r
647 // applying cut for pt > 5 GeV
\r
648 AliDebug(2,Form("pt of D0 = %f (> 5), cutting at |y| < 0.8\n",pt));
\r
649 if (TMath::Abs(y) > 0.8){
\r
653 // appliying smooth cut for pt < 5 GeV
\r
654 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
\r
655 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
\r
656 AliDebug(2,Form("pt of D0 = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
\r
657 if (y < minFiducialY || y > maxFiducialY){
\r
664 //---------------------------------------------------------------------------
\r
665 Int_t AliRDHFCutsD0toKpi::IsSelectedPID(AliAODRecoDecayHF* d)
\r
667 // ############################################################
\r
669 // Apply PID selection
\r
672 // ############################################################
\r
674 if(!fUsePID) return 3;
\r
675 if(fDefaultPID) return IsSelectedPIDdefault(d);
\r
677 Int_t isD0D0barPID[2]={1,2};
\r
678 Int_t combinedPID[2][2];// CONVENTION: [daught][isK,IsPi]; [0][0]=(prong 1, isK)=value [0][1]=(prong 1, isPi)=value;
\r
679 // same for prong 2
\r
680 // values convention -1 = discarded
\r
681 // 0 = not identified (but compatible) || No PID (->hasPID flag)
\r
683 // PID search: pion (TPC) or not K (TOF), Kaon hypothesis for both
\r
684 // Initial hypothesis: unknwon (but compatible)
\r
685 combinedPID[0][0]=0; // prima figlia, Kaon
\r
686 combinedPID[0][1]=0; // prima figlia, pione
\r
687 combinedPID[1][0]=0; // seconda figlia, Kaon
\r
688 combinedPID[1][1]=0; // seconda figlia, pion
\r
690 Bool_t checkPIDInfo[2]={kTRUE,kTRUE};
\r
691 Double_t sigma_tmp[3]={fPidHF->GetSigma(0),fPidHF->GetSigma(1),fPidHF->GetSigma(2)};
\r
692 for(Int_t daught=0;daught<2;daught++){
\r
694 AliAODTrack *aodtrack=(AliAODTrack*)d->GetDaughter(daught);
\r
695 if(fPidHF->IsTOFPiKexcluded(aodtrack,5.)) return 0;
\r
697 if(!(fPidHF->CheckStatus(aodtrack,"TPC")) && !(fPidHF->CheckStatus(aodtrack,"TOF"))) {
\r
698 checkPIDInfo[daught]=kFALSE;
\r
703 combinedPID[daught][0]=fPidHF->MakeRawPid(aodtrack,3);
\r
707 if(!(fPidHF->CheckStatus(aodtrack,"TPC"))) {
\r
708 combinedPID[daught][1]=0;
\r
710 fPidHF->SetTOF(kFALSE);
\r
711 combinedPID[daught][1]=fPidHF->MakeRawPid(aodtrack,2);
\r
712 fPidHF->SetTOF(kTRUE);
\r
713 fPidHF->SetCompat(kTRUE);
\r
717 if(combinedPID[daught][0]<=-1&&combinedPID[daught][1]<=-1){ // if not a K- and not a pi- both D0 and D0bar excluded
\r
721 else if(combinedPID[daught][0]==2&&combinedPID[daught][1]>=1){
\r
722 if(aodtrack->Charge()==-1)isD0D0barPID[1]=0;//if K- D0bar excluded
\r
723 else isD0D0barPID[0]=0;// if K+ D0 excluded
\r
725 /* else if(combinedPID[daught][0]==1&&combinedPID[daught][1]>=1){
\r
730 else if(combinedPID[daught][0]>=1||combinedPID[daught][1]<=-1){
\r
731 if(aodtrack->Charge()==-1)isD0D0barPID[1]=0;// not a D0bar if K- or if pi- excluded
\r
732 else isD0D0barPID[0]=0;// not a D0 if K+ or if pi+ excluded
\r
734 else if(combinedPID[daught][0]<=-1||combinedPID[daught][1]>=1){
\r
735 if(aodtrack->Charge()==-1)isD0D0barPID[0]=0;// not a D0 if pi- or if K- excluded
\r
736 else isD0D0barPID[1]=0;// not a D0bar if pi+ or if K+ excluded
\r
739 if(fLowPt && d->Pt()<fPtLowPID){
\r
740 Double_t sigmaTPC[3]={3.,2.,0.};
\r
741 fPidHF->SetSigmaForTPC(sigmaTPC);
\r
743 combinedPID[daught][0]=fPidHF->MakeRawPid(aodtrack,3);
\r
745 Double_t ptProng=aodtrack->P();
\r
748 fPidHF->SetCompat(kFALSE);
\r
749 combinedPID[daught][0]=fPidHF->MakeRawPid(aodtrack,3);
\r
750 fPidHF->SetCompat(kTRUE);
\r
753 if(!(fPidHF->CheckStatus(aodtrack,"TPC"))) {
\r
754 combinedPID[daught][1]=0;
\r
756 fPidHF->SetTOF(kFALSE);
\r
757 Double_t sigmaTPCpi[3]={3.,3.,0.};
\r
758 fPidHF->SetSigmaForTPC(sigmaTPCpi);
\r
759 combinedPID[daught][1]=fPidHF->MakeRawPid(aodtrack,2);
\r
760 fPidHF->SetTOF(kTRUE);
\r
762 Bool_t isTPCpion=fPidHF->IsPionRaw(aodtrack,"TPC");
\r
764 combinedPID[daught][1]=1;
\r
766 combinedPID[daught][1]=-1;
\r
772 fPidHF->SetSigmaForTPC(sigma_tmp);
\r
773 }// END OF LOOP ON DAUGHTERS
\r
775 if(!checkPIDInfo[0] && !checkPIDInfo[1]) {
\r
776 if(fLowPt) fPidHF->SetSigmaForTPC(sigma_tmp);
\r
781 // FURTHER PID REQUEST (both daughter info is needed)
\r
782 if(combinedPID[0][0]<=-1&&combinedPID[1][0]<=-1){
\r
783 fWhyRejection=31;// reject cases in which no kaon-compatible tracks are found
\r
784 if(fLowPt) fPidHF->SetSigmaForTPC(sigma_tmp);
\r
788 if(fLowPt && d->Pt()<fPtLowPID){
\r
789 if(combinedPID[0][0]<=0&&combinedPID[1][0]<=0){
\r
790 fWhyRejection=32;// reject cases where the Kaon is not identified
\r
791 fPidHF->SetSigmaForTPC(sigma_tmp);
\r
795 if(fLowPt) fPidHF->SetSigmaForTPC(sigma_tmp);
\r
797 // cout<<"Why? "<<fWhyRejection<<endl;
\r
798 return isD0D0barPID[0]+isD0D0barPID[1];
\r
800 //---------------------------------------------------------------------------
\r
801 Int_t AliRDHFCutsD0toKpi::IsSelectedPIDdefault(AliAODRecoDecayHF* d)
\r
803 // ############################################################
\r
805 // Apply PID selection
\r
808 // temporary selection: PID AS USED FOR D0 by Andrea Rossi (up to 28/06/2010)
\r
810 // d must be a AliAODRecoDecayHF2Prong object
\r
811 // returns 0 if both D0 and D0bar are rejectecd
\r
812 // 1 if D0 is accepted while D0bar is rejected
\r
813 // 2 if D0bar is accepted while D0 is rejected
\r
814 // 3 if both are accepted
\r
815 // fWhyRejection variable (not returned for the moment, print it if needed)
\r
816 // keeps some information on why a candidate has been
\r
817 // rejected according to the following (unfriendly?) scheme
\r
818 // if more rejection cases are considered interesting, just add numbers
\r
820 // TO BE CONSIDERED WITH A GRAIN OF SALT (the order in which cut are applied is relevant)
\r
821 // from 20 to 30: "detector" selection (PID acceptance)
\r
824 // 28: no (TOF||TPC) pid information (no kTOFpid,kTOFout,kTIME,kTPCpid,...)
\r
826 // from 30 to 40: PID selection
\r
827 // 31: no Kaon compatible tracks found between daughters
\r
828 // 32: no Kaon identified tracks found (strong sel. at low momenta)
\r
829 // 33: both mass hypotheses are rejected
\r
831 // ############################################################
\r
833 if(!fUsePID) return 3;
\r
835 Int_t isD0D0barPID[2]={1,2};
\r
836 Double_t nsigmaTPCpi=-1., nsigmaTPCK=-1.; //used for TPC pid
\r
837 Double_t tofSig,times[5];// used fot TOF pid
\r
838 Int_t hasPID[2]={2,2};// flag to count how many detectors give PID info for the daughters
\r
839 Int_t isKaonPionTOF[2][2],isKaonPionTPC[2][2];
\r
840 Int_t combinedPID[2][2];// CONVENTION: [daught][isK,IsPi]; [0][0]=(prong 1, isK)=value [0][1]=(prong 1, isPi)=value;
\r
841 // same for prong 2
\r
842 // values convention -1 = discarded
\r
843 // 0 = not identified (but compatible) || No PID (->hasPID flag)
\r
845 // PID search: pion (TPC) or not K (TOF), Kaon hypothesis for both
\r
846 // Initial hypothesis: unknwon (but compatible)
\r
847 isKaonPionTOF[0][0]=0;
\r
848 isKaonPionTOF[0][1]=0;
\r
849 isKaonPionTOF[1][0]=0;
\r
850 isKaonPionTOF[1][1]=0;
\r
852 isKaonPionTPC[0][0]=0;
\r
853 isKaonPionTPC[0][1]=0;
\r
854 isKaonPionTPC[1][0]=0;
\r
855 isKaonPionTPC[1][1]=0;
\r
857 combinedPID[0][0]=0;
\r
858 combinedPID[0][1]=0;
\r
859 combinedPID[1][0]=0;
\r
860 combinedPID[1][1]=0;
\r
864 for(Int_t daught=0;daught<2;daught++){
\r
867 // ########### Step 0- CHECKING minimal PID "ACCEPTANCE" ####################
\r
869 AliAODTrack *aodtrack=(AliAODTrack*)d->GetDaughter(daught);
\r
871 if(!(aodtrack->GetStatus()&AliESDtrack::kTPCrefit)){
\r
875 if(!(aodtrack->GetStatus()&AliESDtrack::kITSrefit)){
\r
880 AliAODPid *pid=aodtrack->GetDetPid();
\r
887 // ########### Step 1- Check of TPC and TOF response ####################
\r
889 Double_t ptrack=aodtrack->P();
\r
890 //#################### TPC PID #######################
\r
891 if (!(aodtrack->GetStatus()&AliESDtrack::kTPCpid )){
\r
892 // NO TPC PID INFO FOR THIS TRACK
\r
896 static AliTPCPIDResponse theTPCpid;
\r
897 AliAODPid *pidObj = aodtrack->GetDetPid();
\r
898 Double_t ptProng=pidObj->GetTPCmomentum();
\r
899 nsigmaTPCpi = theTPCpid.GetNumberOfSigmas(ptProng,(Float_t)pid->GetTPCsignal(),(Int_t)aodtrack->GetTPCClusterMap().CountBits(),AliPID::kPion);
\r
900 nsigmaTPCK = theTPCpid.GetNumberOfSigmas(ptProng,(Float_t)pid->GetTPCsignal(),(Int_t)aodtrack->GetTPCClusterMap().CountBits(),AliPID::kKaon);
\r
903 if(TMath::Abs(nsigmaTPCK)<2.)isKaonPionTPC[daught][0]=1;
\r
904 else if(TMath::Abs(nsigmaTPCK)>3.)isKaonPionTPC[daught][0]=-1;
\r
905 if(TMath::Abs(nsigmaTPCpi)<2.)isKaonPionTPC[daught][1]=1;
\r
906 else if(TMath::Abs(nsigmaTPCpi)>3.)isKaonPionTPC[daught][1]=-1;
\r
908 //else if(ptrack<.8){
\r
909 else if(ptProng<.8){
\r
910 if(TMath::Abs(nsigmaTPCK)<1.)isKaonPionTPC[daught][0]=1;
\r
911 else if(TMath::Abs(nsigmaTPCK)>3.)isKaonPionTPC[daught][0]=-1;
\r
912 if(TMath::Abs(nsigmaTPCpi)<1.)isKaonPionTPC[daught][1]=1;
\r
913 else if(TMath::Abs(nsigmaTPCpi)>3.)isKaonPionTPC[daught][1]=-1;
\r
916 // if(nsigmaTPCK>-2.&&nsigmaTPCK<1.)isKaonPionTPC[daught][0]=1;
\r
917 if(TMath::Abs(nsigmaTPCK)>3.)isKaonPionTPC[daught][0]=-1;
\r
918 //if(nsigmaTPCpi>-1.&&nsigmaTPCpi<2.)isKaonPionTPC[daught][1]=1;
\r
919 if(TMath::Abs(nsigmaTPCpi)>3.)isKaonPionTPC[daught][1]=-1;
\r
924 // ##### TOF PID: do not ask nothing for pion/protons ############
\r
925 if(!((aodtrack->GetStatus()&AliESDtrack::kTOFpid)&&(aodtrack->GetStatus()&AliESDtrack::kTOFout)&&(aodtrack->GetStatus()&AliESDtrack::kTIME))){
\r
926 // NO TOF PID INFO FOR THIS TRACK
\r
930 tofSig=pid->GetTOFsignal();
\r
931 pid->GetIntegratedTimes(times);
\r
932 if((tofSig-times[3])>5.*160.)return 0;// PROTON REJECTION
\r
933 if(TMath::Abs(tofSig-times[3])>3.*160.){
\r
934 isKaonPionTOF[daught][0]=-1;
\r
938 isKaonPionTOF[daught][0]=1;
\r
943 //######### Step 2: COMBINE TOF and TPC PID ###############
\r
944 // we apply the following convention: if TPC and TOF disagree (discarded Vs identified) -> unknown
\r
945 combinedPID[daught][0]=isKaonPionTOF[daught][0]+isKaonPionTPC[daught][0];
\r
946 combinedPID[daught][1]=isKaonPionTOF[daught][1]+isKaonPionTPC[daught][1];
\r
949 //######### Step 3: USE PID INFO
\r
951 if(combinedPID[daught][0]<=-1&&combinedPID[daught][1]<=-1){// if not a K- and not a pi- both D0 and D0bar excluded
\r
955 else if(combinedPID[daught][0]==2&&combinedPID[daught][1]>=1){// if in conflict (both pi- and K-), if k for both TPC and TOF -> is K
\r
956 if(aodtrack->Charge()==-1)isD0D0barPID[1]=0;//if K- D0bar excluded
\r
957 else isD0D0barPID[0]=0;// if K+ D0 excluded
\r
959 else if(combinedPID[daught][0]==1&&combinedPID[daught][1]>=1){// if in conflict (both pi- and K-) and k- only for TPC or TOF -> reject
\r
963 else if(combinedPID[daught][0]>=1||combinedPID[daught][1]<=-1){
\r
964 if(aodtrack->Charge()==-1)isD0D0barPID[1]=0;// not a D0bar if K- or if pi- excluded
\r
965 else isD0D0barPID[0]=0;// not a D0 if K+ or if pi+ excluded
\r
967 else if(combinedPID[daught][0]<=-1||combinedPID[daught][1]>=1){
\r
968 if(aodtrack->Charge()==-1)isD0D0barPID[0]=0;// not a D0 if pi- or if K- excluded
\r
969 else isD0D0barPID[1]=0;// not a D0bar if pi+ or if K+ excluded
\r
972 // ########## ALSO DIFFERENT TPC PID REQUEST FOR LOW pt D0: request of K identification ###############################
\r
973 // ########## more tolerant criteria for single particle ID-> more selective criteria for D0 ##############################
\r
974 // ############### NOT OPTIMIZED YET ###################################
\r
976 isKaonPionTPC[daught][0]=0;
\r
977 isKaonPionTPC[daught][1]=0;
\r
978 AliAODPid *pidObj = aodtrack->GetDetPid();
\r
979 Double_t ptProng=pidObj->GetTPCmomentum();
\r
982 if(TMath::Abs(nsigmaTPCK)<3.)isKaonPionTPC[daught][0]=1;
\r
983 else if(TMath::Abs(nsigmaTPCK)>3.)isKaonPionTPC[daught][0]=-1;
\r
984 if(TMath::Abs(nsigmaTPCpi)<3.)isKaonPionTPC[daught][1]=1;
\r
985 else if(TMath::Abs(nsigmaTPCpi)>3.)isKaonPionTPC[daught][1]=-1;
\r
987 //else if(ptrack<.8){
\r
988 else if(ptProng<.8){
\r
989 if(TMath::Abs(nsigmaTPCK)<2.)isKaonPionTPC[daught][0]=1;
\r
990 else if(TMath::Abs(nsigmaTPCK)>3.)isKaonPionTPC[daught][0]=-1;
\r
991 if(TMath::Abs(nsigmaTPCpi)<3.)isKaonPionTPC[daught][1]=1;
\r
992 else if(TMath::Abs(nsigmaTPCpi)>3.)isKaonPionTPC[daught][1]=-1;
\r
995 if(TMath::Abs(nsigmaTPCK)>3.)isKaonPionTPC[daught][0]=-1;
\r
996 if(TMath::Abs(nsigmaTPCpi)>3.)isKaonPionTPC[daught][1]=-1;
\r
1000 }// END OF LOOP ON DAUGHTERS
\r
1002 // FURTHER PID REQUEST (both daughter info is needed)
\r
1003 if(combinedPID[0][0]<=-1&&combinedPID[1][0]<=-1){
\r
1004 fWhyRejection=31;// reject cases in which no kaon-compatible tracks are found
\r
1007 else if(hasPID[0]==0&&hasPID[1]==0){
\r
1008 fWhyRejection=28;// reject cases in which no PID info is available
\r
1012 // request of K identification at low D0 pt
\r
1013 combinedPID[0][0]=0;
\r
1014 combinedPID[0][1]=0;
\r
1015 combinedPID[1][0]=0;
\r
1016 combinedPID[1][1]=0;
\r
1018 combinedPID[0][0]=isKaonPionTOF[0][0]+isKaonPionTPC[0][0];
\r
1019 combinedPID[0][1]=isKaonPionTOF[0][1]+isKaonPionTPC[0][1];
\r
1020 combinedPID[1][0]=isKaonPionTOF[1][0]+isKaonPionTPC[1][0];
\r
1021 combinedPID[1][1]=isKaonPionTOF[1][1]+isKaonPionTPC[1][1];
\r
1023 if(combinedPID[0][0]<=0&&combinedPID[1][0]<=0){
\r
1024 fWhyRejection=32;// reject cases where the Kaon is not identified
\r
1029 // cout<<"Why? "<<fWhyRejection<<endl;
\r
1030 return isD0D0barPID[0]+isD0D0barPID[1];
\r
1035 //---------------------------------------------------------------------------
\r
1036 Int_t AliRDHFCutsD0toKpi::CombineSelectionLevels(Int_t selectionvalTrack,
\r
1037 Int_t selectionvalCand,
\r
1038 Int_t selectionvalPID) const
\r
1041 // This method combines the tracks, PID and cuts selection results
\r
1043 if(selectionvalTrack==0) return 0;
\r
1045 Int_t returnvalue;
\r
1047 switch(selectionvalPID) {
\r
1052 returnvalue=((selectionvalCand==1 || selectionvalCand==3) ? 1 : 0);
\r
1055 returnvalue=((selectionvalCand==2 || selectionvalCand==3) ? 2 : 0);
\r
1058 returnvalue=selectionvalCand;
\r
1065 return returnvalue;
\r
1067 //----------------------------------------------------------------------------
\r
1068 Int_t AliRDHFCutsD0toKpi::IsSelectedSpecialCuts(AliAODRecoDecayHF *d) const
\r
1071 // Note: this method is temporary
\r
1072 // Additional cuts on decay lenght and lower cut for d0 norm are applied using vertex without candidate's daughters
\r
1077 Float_t normDecLengthCut=1.,decLengthCut=TMath::Min(d->P()*0.0066+0.01,0.06/*cm*/), normd0Cut=0.5;
\r
1078 // "decay length" expo law with tau' = beta*gamma*ctau= p/m*ctau =p*0.0123/1.864~p*0.0066
\r
1079 // decay lenght > ctau' implies to retain (1-1/e) (for signal without considering detector resolution),
\r
1081 Int_t returnvalue=3; //cut passed
\r
1082 for(Int_t i=0;i<2/*prongs*/;i++){
\r
1083 if(TMath::Abs(d->Normalizedd0Prong(i))<normd0Cut) return 0; //normd0Cut not passed
\r
1085 if(d->DecayLength2()<decLengthCut*decLengthCut) return 0; //decLengthCut not passed
\r
1086 if(d->NormalizedDecayLength2()<normDecLengthCut*normDecLengthCut) return 0; //decLengthCut not passed
\r
1088 return returnvalue;
\r
1091 //----------------------------------------------
\r
1092 void AliRDHFCutsD0toKpi::SetUseKF(Bool_t useKF)
\r
1094 //switch on candidate selection via AliKFparticle
\r
1095 if(!useKF) return;
\r
1099 SetNVars(nvarsKF);
\r
1100 TString varNamesKF[11]={"inv. mass [GeV]",
\r
1109 "DecayLength[cm]",
\r
1111 Bool_t isUpperCutKF[11]={kTRUE,
\r
1122 SetVarNames(nvarsKF,varNamesKF,isUpperCutKF);
\r
1124 Bool_t forOpt[11]={kFALSE,
\r
1135 SetVarsForOpt(4,forOpt);
\r
1141 void AliRDHFCutsD0toKpi::SetStandardCutsPP2010() {
\r
1143 //STANDARD CUTS USED FOR 2010 pp analysis
\r
1144 //dca cut will be enlarged soon to 400 micron
\r
1147 SetName("D0toKpiCutsStandard");
\r
1148 SetTitle("Standard Cuts for D0 analysis");
\r
1150 // PILE UP REJECTION
\r
1151 SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
\r
1154 SetMinVtxContr(1);
\r
1155 // MAX Z-VERTEX CUT
\r
1158 // TRACKS ON SINGLE TRACKS
\r
1159 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
\r
1160 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
\r
1161 esdTrackCuts->SetRequireTPCRefit(kTRUE);
\r
1162 esdTrackCuts->SetRequireITSRefit(kTRUE);
\r
1163 // esdTrackCuts->SetMinNClustersITS(4);
\r
1164 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
\r
1165 esdTrackCuts->SetMinDCAToVertexXY(0.);
\r
1166 esdTrackCuts->SetEtaRange(-0.8,0.8);
\r
1167 esdTrackCuts->SetPtRange(0.3,1.e10);
\r
1169 AddTrackCuts(esdTrackCuts);
\r
1172 const Int_t nptbins =14;
\r
1173 const Double_t ptmax = 9999.;
\r
1174 const Int_t nvars=11;
\r
1175 Float_t ptbins[nptbins+1];
\r
1192 SetGlobalIndex(nvars,nptbins);
\r
1193 SetPtBins(nptbins+1,ptbins);
\r
1195 Float_t cutsMatrixD0toKpiStand[nptbins][nvars]={{0.400,350.*1E-4,0.8,0.5,0.5,1000.*1E-4,1000.*1E-4,-5000.*1E-8,0.80,0.,0.},/* pt<0.5*/
\r
1196 {0.400,350.*1E-4,0.8,0.5,0.5,1000.*1E-4,1000.*1E-4,-5000.*1E-8,0.80,0.,0.},/* 0.5<pt<1*/
\r
1197 {0.400,300.*1E-4,0.8,0.4,0.4,1000.*1E-4,1000.*1E-4,-25000.*1E-8,0.80,0.,0.},/* 1<pt<2 */
\r
1198 {0.400,300.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-15000.*1E-8,0.85,0.,0.},/* 2<pt<3 */
\r
1199 {0.400,300.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-8000.*1E-8,0.85,0.,0.},/* 3<pt<4 */
\r
1200 {0.400,300.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-8000.*1E-8,0.85,0.,0.},/* 4<pt<5 */
\r
1201 {0.400,300.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-8000.*1E-8,0.85,0.,0.},/* 5<pt<6 */
\r
1202 {0.400,300.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-8000.*1E-8,0.85,0.,0.},/* 6<pt<7 */
\r
1203 {0.400,300.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-7000.*1E-8,0.85,0.,0.},/* 7<pt<8 */
\r
1204 {0.400,300.*1E-4,0.9,0.7,0.7,1000.*1E-4,1000.*1E-4,-5000.*1E-8,0.85,0.,0.},/* 8<pt<12 */
\r
1205 {0.400,300.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,10000.*1E-8,0.85,0.,0.},/* 12<pt<16 */
\r
1206 {0.400,300.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,999999.*1E-8,0.85,0.,0.},/* 16<pt<20 */
\r
1207 {0.400,300.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,999999.*1E-8,0.85,0.,0.},/* 20<pt<24 */
\r
1208 {0.400,300.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,999999.*1E-8,0.85,0.,0.}};/* pt>24 */
\r
1211 //CREATE TRANSPOSE MATRIX...REVERSE INDICES as required by AliRDHFCuts
\r
1212 Float_t **cutsMatrixTransposeStand=new Float_t*[nvars];
\r
1213 for(Int_t iv=0;iv<nvars;iv++)cutsMatrixTransposeStand[iv]=new Float_t[nptbins];
\r
1215 for (Int_t ibin=0;ibin<nptbins;ibin++){
\r
1216 for (Int_t ivar = 0; ivar<nvars; ivar++){
\r
1217 cutsMatrixTransposeStand[ivar][ibin]=cutsMatrixD0toKpiStand[ibin][ivar];
\r
1221 SetCuts(nvars,nptbins,cutsMatrixTransposeStand);
\r
1222 SetUseSpecialCuts(kTRUE);
\r
1223 SetRemoveDaughtersFromPrim(kTRUE);
\r
1225 for(Int_t iv=0;iv<nvars;iv++) delete [] cutsMatrixTransposeStand[iv];
\r
1226 delete [] cutsMatrixTransposeStand;
\r
1227 cutsMatrixTransposeStand=NULL;
\r
1230 AliAODPidHF* pidObj=new AliAODPidHF();
\r
1231 //pidObj->SetName("pid4D0");
\r
1233 const Int_t nlims=2;
\r
1234 Double_t plims[nlims]={0.6,0.8}; //TPC limits in momentum [GeV/c]
\r
1235 Bool_t compat=kTRUE; //effective only for this mode
\r
1236 Bool_t asym=kTRUE;
\r
1237 Double_t sigmas[5]={2.,1.,0.,3.,0.}; //to be checked and to be modified with new implementation of setters by Rossella
\r
1238 pidObj->SetAsym(asym);// if you want to use the asymmetric bands in TPC
\r
1239 pidObj->SetMatch(mode);
\r
1240 pidObj->SetPLimit(plims,nlims);
\r
1241 pidObj->SetSigma(sigmas);
\r
1242 pidObj->SetCompat(compat);
\r
1243 pidObj->SetTPC(kTRUE);
\r
1244 pidObj->SetTOF(kTRUE);
\r
1245 pidObj->SetPCompatTOF(1.5);
\r
1246 pidObj->SetSigmaForTPCCompat(3.);
\r
1247 pidObj->SetSigmaForTOFCompat(3.);
\r
1252 SetUseDefaultPID(kFALSE);
\r
1266 void AliRDHFCutsD0toKpi::SetStandardCutsPbPb2010() {
\r
1268 // Final CUTS USED FOR 2010 PbPb analysis of central events
\r
1269 // REMEMBER TO EVENTUALLY SWITCH ON
\r
1270 // SetUseAOD049(kTRUE);
\r
1273 SetName("D0toKpiCutsStandard");
\r
1274 SetTitle("Standard Cuts for D0 analysis in PbPb2010 run");
\r
1277 // CENTRALITY SELECTION
\r
1278 SetMinCentrality(0.);
\r
1279 SetMaxCentrality(80.);
\r
1280 SetUseCentrality(AliRDHFCuts::kCentV0M);
\r
1285 SetMinVtxContr(1);
\r
1286 // MAX Z-VERTEX CUT
\r
1289 SetOptPileup(AliRDHFCuts::kNoPileupSelection);
\r
1290 // PILE UP REJECTION
\r
1291 //SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
\r
1293 // TRACKS ON SINGLE TRACKS
\r
1294 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
\r
1295 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
\r
1296 esdTrackCuts->SetRequireTPCRefit(kTRUE);
\r
1297 esdTrackCuts->SetRequireITSRefit(kTRUE);
\r
1298 // esdTrackCuts->SetMinNClustersITS(4);
\r
1299 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
\r
1300 esdTrackCuts->SetMinDCAToVertexXY(0.);
\r
1301 esdTrackCuts->SetEtaRange(-0.8,0.8);
\r
1302 esdTrackCuts->SetPtRange(0.7,1.e10);
\r
1304 esdTrackCuts->SetMaxDCAToVertexXY(1.);
\r
1305 esdTrackCuts->SetMaxDCAToVertexZ(1.);
\r
1306 esdTrackCuts->SetMinDCAToVertexXYPtDep("0.0075*TMath::Max(0.,(1-TMath::Floor(TMath::Abs(pt)/2.)))");
\r
1309 AddTrackCuts(esdTrackCuts);
\r
1310 // SPD k FIRST for Pt<3 GeV/c
\r
1311 SetSelectCandTrackSPDFirst(kTRUE, 3);
\r
1313 // CANDIDATE CUTS
\r
1314 const Int_t nptbins =13;
\r
1315 const Double_t ptmax = 9999.;
\r
1316 const Int_t nvars=11;
\r
1317 Float_t ptbins[nptbins+1];
\r
1333 SetGlobalIndex(nvars,nptbins);
\r
1334 SetPtBins(nptbins+1,ptbins);
\r
1335 SetMinPtCandidate(2.);
\r
1337 Float_t cutsMatrixD0toKpiStand[nptbins][nvars]={{0.400,400.*1E-4,0.8,0.3,0.3,1000.*1E-4,1000.*1E-4,-10000.*1E-8,0.85,0.99,2.},/* pt<0.5*/
\r
1338 {0.400,400.*1E-4,0.8,0.3,0.3,1000.*1E-4,1000.*1E-4,-35000.*1E-8,0.9,0.99,2.},/* 0.5<pt<1*/
\r
1339 {0.400,400.*1E-4,0.8,0.4,0.4,1000.*1E-4,1000.*1E-4,-43000.*1E-8,0.85,0.995,2.},/* 1<pt<2 */
\r
1340 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-45000.*1E-8,0.95,0.998,7.},/* 2<pt<3 */
\r
1341 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-36000.*1E-8,0.95,0.998,5.},/* 3<pt<4 */
\r
1342 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-27000.*1E-8,0.95,0.998,5.},/* 4<pt<5 */
\r
1343 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-21000.*1E-8,0.92,0.998,5.},/* 5<pt<6 */
\r
1344 {0.400,270.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-14000.*1E-8,0.88,0.998,5.},/* 6<pt<8 */
\r
1345 {0.400,300.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-5000.*1E-8,0.85,0.998,5.},/* 8<pt<12 */
\r
1346 {0.400,350.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,-1000.*1E-8,0.83,0.998,8.},/* 12<pt<16 */
\r
1347 {0.400,400.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,-1000.*1E-8,0.82,0.995,6.},/* 16<pt<20 */
\r
1348 {0.400,400.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,-1000.*1E-8,0.81,0.995,6.},/* 20<pt<24 */
\r
1349 {0.400,400.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,-1000.*1E-8,0.8,0.99,2.}};/* pt>24 */
\r
1352 //CREATE TRANSPOSE MATRIX...REVERSE INDICES as required by AliRDHFCuts
\r
1353 Float_t **cutsMatrixTransposeStand=new Float_t*[nvars];
\r
1354 for(Int_t iv=0;iv<nvars;iv++)cutsMatrixTransposeStand[iv]=new Float_t[nptbins];
\r
1356 for (Int_t ibin=0;ibin<nptbins;ibin++){
\r
1357 for (Int_t ivar = 0; ivar<nvars; ivar++){
\r
1358 cutsMatrixTransposeStand[ivar][ibin]=cutsMatrixD0toKpiStand[ibin][ivar];
\r
1362 SetCuts(nvars,nptbins,cutsMatrixTransposeStand);
\r
1363 SetUseSpecialCuts(kTRUE);
\r
1364 SetRemoveDaughtersFromPrim(kFALSE);// THIS IS VERY IMPORTANT! TOO SLOW IN PbPb
\r
1365 for(Int_t iv=0;iv<nvars;iv++) delete [] cutsMatrixTransposeStand[iv];
\r
1366 delete [] cutsMatrixTransposeStand;
\r
1367 cutsMatrixTransposeStand=NULL;
\r
1370 AliAODPidHF* pidObj=new AliAODPidHF();
\r
1371 //pidObj->SetName("pid4D0");
\r
1373 const Int_t nlims=2;
\r
1374 Double_t plims[nlims]={0.6,0.8}; //TPC limits in momentum [GeV/c]
\r
1375 Bool_t compat=kTRUE; //effective only for this mode
\r
1376 Bool_t asym=kTRUE;
\r
1377 Double_t sigmas[5]={2.,1.,0.,3.,0.}; //to be checked and to be modified with new implementation of setters by Rossella
\r
1378 pidObj->SetAsym(asym);// if you want to use the asymmetric bands in TPC
\r
1379 pidObj->SetMatch(mode);
\r
1380 pidObj->SetPLimit(plims,nlims);
\r
1381 pidObj->SetSigma(sigmas);
\r
1382 pidObj->SetCompat(compat);
\r
1383 pidObj->SetTPC(kTRUE);
\r
1384 pidObj->SetTOF(kTRUE);
\r
1385 pidObj->SetPCompatTOF(2.);
\r
1386 pidObj->SetSigmaForTPCCompat(3.);
\r
1387 pidObj->SetSigmaForTOFCompat(3.);
\r
1392 SetUseDefaultPID(kFALSE);
\r
1405 void AliRDHFCutsD0toKpi::SetStandardCutsPbPb2010Peripherals() {
\r
1406 // CUTS USED FOR D0 RAA for the CENTRALITY RANGE 20-80%
\r
1409 SetName("D0toKpiCutsStandard");
\r
1410 SetTitle("Standard Cuts for D0 analysis in PbPb2010 run, for peripheral events");
\r
1413 // CENTRALITY SELECTION
\r
1414 SetMinCentrality(40.);
\r
1415 SetMaxCentrality(80.);
\r
1416 SetUseCentrality(AliRDHFCuts::kCentV0M);
\r
1419 SetMinVtxContr(1);
\r
1420 // MAX Z-VERTEX CUT
\r
1423 SetOptPileup(AliRDHFCuts::kNoPileupSelection);
\r
1424 // PILE UP REJECTION
\r
1425 //SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
\r
1427 // TRACKS ON SINGLE TRACKS
\r
1428 AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","default");
\r
1429 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
\r
1430 esdTrackCuts->SetRequireTPCRefit(kTRUE);
\r
1431 esdTrackCuts->SetRequireITSRefit(kTRUE);
\r
1432 // esdTrackCuts->SetMinNClustersITS(4);
\r
1433 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
\r
1434 esdTrackCuts->SetMinDCAToVertexXY(0.);
\r
1435 esdTrackCuts->SetEtaRange(-0.8,0.8);
\r
1436 esdTrackCuts->SetPtRange(0.5,1.e10);
\r
1438 esdTrackCuts->SetMaxDCAToVertexXY(1.);
\r
1439 esdTrackCuts->SetMaxDCAToVertexZ(1.);
\r
1440 esdTrackCuts->SetMinDCAToVertexXYPtDep("0.0025*TMath::Max(0.,(1-TMath::Floor(TMath::Abs(pt)/2.)))");
\r
1443 AddTrackCuts(esdTrackCuts);
\r
1444 // SPD k FIRST for Pt<3 GeV/c
\r
1445 SetSelectCandTrackSPDFirst(kTRUE, 3);
\r
1447 // CANDIDATE CUTS
\r
1448 const Int_t nptbins =13;
\r
1449 const Double_t ptmax = 9999.;
\r
1450 const Int_t nvars=11;
\r
1451 Float_t ptbins[nptbins+1];
\r
1467 SetGlobalIndex(nvars,nptbins);
\r
1468 SetPtBins(nptbins+1,ptbins);
\r
1469 SetMinPtCandidate(0.);
\r
1471 Float_t cutsMatrixD0toKpiStand[nptbins][nvars]={{0.400,400.*1E-4,0.8,0.5,0.5,1000.*1E-4,1000.*1E-4,-20000.*1E-8,0.7,0.993,2.},/* pt<0.5*/
\r
1472 {0.400,400.*1E-4,0.8,0.5,0.5,1000.*1E-4,1000.*1E-4,-25000.*1E-8,0.85,0.993,2.},/* 0.5<pt<1*/
\r
1473 {0.400,400.*1E-4,0.8,0.4,0.4,1000.*1E-4,1000.*1E-4,-40000.*1E-8,0.85,0.995,6.},/* 1<pt<2 */
\r
1474 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-40000.*1E-8,0.95,0.991,5.},/* 2<pt<3 */
\r
1475 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-36000.*1E-8,0.95,0.993,5.},/* 3<pt<4 */
\r
1476 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-27000.*1E-8,0.95,0.995,5.},/* 4<pt<5 */
\r
1477 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-21000.*1E-8,0.92,0.998,5.},/* 5<pt<6 */
\r
1478 {0.400,270.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-14000.*1E-8,0.88,0.998,5.},/* 6<pt<8 */
\r
1479 {0.400,300.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-5000.*1E-8,0.85,0.995,5.},/* 8<pt<12 */
\r
1480 {0.400,350.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,0.*1E-8,0.83,0.995,4.},/* 12<pt<16 */
\r
1481 {0.400,400.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,0.*1E-8,0.82,0.995,4.},/* 16<pt<20 */
\r
1482 {0.400,400.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,0.*1E-8,0.81,0.995,4.},/* 20<pt<24 */
\r
1483 {0.400,400.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,0.*1E-8,0.8,0.995,4.}};/* pt>24 */
\r
1486 //CREATE TRANSPOSE MATRIX...REVERSE INDICES as required by AliRDHFCuts
\r
1487 Float_t **cutsMatrixTransposeStand=new Float_t*[nvars];
\r
1488 for(Int_t iv=0;iv<nvars;iv++)cutsMatrixTransposeStand[iv]=new Float_t[nptbins];
\r
1490 for (Int_t ibin=0;ibin<nptbins;ibin++){
\r
1491 for (Int_t ivar = 0; ivar<nvars; ivar++){
\r
1492 cutsMatrixTransposeStand[ivar][ibin]=cutsMatrixD0toKpiStand[ibin][ivar];
\r
1496 SetCuts(nvars,nptbins,cutsMatrixTransposeStand);
\r
1497 SetUseSpecialCuts(kTRUE);
\r
1498 SetRemoveDaughtersFromPrim(kFALSE);// THIS IS VERY IMPORTANT! TOO SLOW IN PbPb
\r
1499 for(Int_t iv=0;iv<nvars;iv++) delete [] cutsMatrixTransposeStand[iv];
\r
1500 delete [] cutsMatrixTransposeStand;
\r
1501 cutsMatrixTransposeStand=NULL;
\r
1504 AliAODPidHF* pidObj=new AliAODPidHF();
\r
1505 //pidObj->SetName("pid4D0");
\r
1507 const Int_t nlims=2;
\r
1508 Double_t plims[nlims]={0.6,0.8}; //TPC limits in momentum [GeV/c]
\r
1509 Bool_t compat=kTRUE; //effective only for this mode
\r
1510 Bool_t asym=kTRUE;
\r
1511 Double_t sigmas[5]={2.,1.,0.,3.,0.}; //to be checked and to be modified with new implementation of setters by Rossella
\r
1512 pidObj->SetAsym(asym);// if you want to use the asymmetric bands in TPC
\r
1513 pidObj->SetMatch(mode);
\r
1514 pidObj->SetPLimit(plims,nlims);
\r
1515 pidObj->SetSigma(sigmas);
\r
1516 pidObj->SetCompat(compat);
\r
1517 pidObj->SetTPC(kTRUE);
\r
1518 pidObj->SetTOF(kTRUE);
\r
1519 pidObj->SetPCompatTOF(2.);
\r
1520 pidObj->SetSigmaForTPCCompat(3.);
\r
1521 pidObj->SetSigmaForTOFCompat(3.);
\r
1525 SetUseDefaultPID(kFALSE);
\r
1527 SetLowPt(kTRUE,2.);
\r
1540 void AliRDHFCutsD0toKpi::SetStandardCutsPbPb2011() {
\r
1542 // Default 2010 PbPb cut object
\r
1543 SetStandardCutsPbPb2010();
\r
1546 // Enable all 2011 PbPb run triggers
\r
1548 SetTriggerClass("");
\r
1549 ResetMaskAndEnableMBTrigger();
\r
1550 EnableCentralTrigger();
\r
1551 EnableSemiCentralTrigger();
\r