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 D0->Kpi
20 // Author: A.Dainese, andrea.dainese@pd.infn.it
21 /////////////////////////////////////////////////////////////
23 #include <TDatabasePDG.h>
24 #include <Riostream.h>
26 #include "AliRDHFCutsD0toKpi.h"
27 #include "AliAODRecoDecayHF2Prong.h"
28 #include "AliAODTrack.h"
29 #include "AliESDtrack.h"
31 ClassImp(AliRDHFCutsD0toKpi)
33 //--------------------------------------------------------------------------
34 AliRDHFCutsD0toKpi::AliRDHFCutsD0toKpi(const char* name) :
38 // Default Constructor
42 TString varNames[9]={"inv. mass [GeV]",
51 Bool_t isUpperCut[9]={kTRUE,
60 SetVarNames(nvars,varNames,isUpperCut);
61 Bool_t forOpt[9]={kFALSE,
70 SetVarsForOpt(4,forOpt);
71 Float_t limits[2]={0,999999999.};
74 //--------------------------------------------------------------------------
75 AliRDHFCutsD0toKpi::AliRDHFCutsD0toKpi(const AliRDHFCutsD0toKpi &source) :
83 //--------------------------------------------------------------------------
84 AliRDHFCutsD0toKpi &AliRDHFCutsD0toKpi::operator=(const AliRDHFCutsD0toKpi &source)
87 // assignment operator
89 if(&source == this) return *this;
91 AliRDHFCuts::operator=(source);
97 //---------------------------------------------------------------------------
98 void AliRDHFCutsD0toKpi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) {
100 // Fills in vars the values of the variables
103 if(nvars!=fnVarsForOpt) {
104 printf("AliRDHFCutsD0toKpi::GetCutsVarsForOpt: wrong number of variables\n");
108 AliAODRecoDecayHF2Prong *dd = (AliAODRecoDecayHF2Prong*)d;
113 if(TMath::Abs(pdgdaughters[0])==211) {
114 vars[iter]=dd->InvMassD0();
116 vars[iter]=dd->InvMassD0bar();
121 vars[iter]=dd->GetDCA();
125 if(TMath::Abs(pdgdaughters[0])==211) {
126 vars[iter] = dd->CosThetaStarD0();
128 vars[iter] = dd->CosThetaStarD0bar();
133 if(TMath::Abs(pdgdaughters[0])==321) {
134 vars[iter]=dd->PtProng(0);
137 vars[iter]=dd->PtProng(1);
142 if(TMath::Abs(pdgdaughters[0])==211) {
143 vars[iter]=dd->PtProng(0);
146 vars[iter]=dd->PtProng(1);
151 if(TMath::Abs(pdgdaughters[0])==321) {
152 vars[iter]=dd->Getd0Prong(0);
155 vars[iter]=dd->Getd0Prong(1);
160 if(TMath::Abs(pdgdaughters[0])==211) {
161 vars[iter]=dd->Getd0Prong(0);
164 vars[iter]=dd->Getd0Prong(1);
169 vars[iter]= dd->Prodd0d0();
173 vars[iter]=dd->CosPointingAngle();
178 //---------------------------------------------------------------------------
179 Int_t AliRDHFCutsD0toKpi::IsSelected(TObject* obj,Int_t selectionLevel) {
185 cout<<"Cut matrice not inizialized. Exit..."<<endl;
189 AliAODRecoDecayHF2Prong* d=(AliAODRecoDecayHF2Prong*)obj;
192 cout<<"AliAODRecoDecayHF2Prong null"<<endl;
197 // selection on daughter tracks
198 if(selectionLevel==AliRDHFCuts::kAll ||
199 selectionLevel==AliRDHFCuts::kTracks) {
200 if(!AreDaughtersSelected(d)) return 0;
206 // selection on candidate
207 if(selectionLevel==AliRDHFCuts::kAll ||
208 selectionLevel==AliRDHFCuts::kCandidate) {
212 Int_t okD0=0,okD0bar=0;
214 Int_t ptbin=PtBin(pt);
216 Double_t mD0,mD0bar,ctsD0,ctsD0bar;
219 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
221 if(d->PtProng(1) < fCutsRD[GetGlobalIndex(3,ptbin)] || d->PtProng(0) < fCutsRD[GetGlobalIndex(4,ptbin)]) okD0 = 0;
222 if(d->PtProng(0) < fCutsRD[GetGlobalIndex(3,ptbin)] || d->PtProng(1) < fCutsRD[GetGlobalIndex(4,ptbin)]) okD0bar = 0;
224 if(!okD0 && !okD0bar) return 0;
226 if(TMath::Abs(d->Getd0Prong(1)) > fCutsRD[GetGlobalIndex(5,ptbin)] ||
227 TMath::Abs(d->Getd0Prong(0)) > fCutsRD[GetGlobalIndex(6,ptbin)]) okD0 = 0;
228 if(TMath::Abs(d->Getd0Prong(0)) > fCutsRD[GetGlobalIndex(6,ptbin)] ||
229 TMath::Abs(d->Getd0Prong(1)) > fCutsRD[GetGlobalIndex(5,ptbin)]) okD0bar = 0;
230 if(!okD0 && !okD0bar) return 0;
232 if(d->GetDCA() > fCutsRD[GetGlobalIndex(1,ptbin)]) return 0;
234 d->InvMassD0(mD0,mD0bar);
235 if(TMath::Abs(mD0-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)]) okD0 = 0;
236 if(TMath::Abs(mD0bar-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)]) okD0bar = 0;
237 if(!okD0 && !okD0bar) return 0;
239 d->CosThetaStarD0(ctsD0,ctsD0bar);
240 if(TMath::Abs(ctsD0) > fCutsRD[GetGlobalIndex(2,ptbin)]) okD0 = 0;
241 if(TMath::Abs(ctsD0bar) > fCutsRD[GetGlobalIndex(2,ptbin)]) okD0bar = 0;
242 if(!okD0 && !okD0bar) return 0;
244 if(d->Prodd0d0() > fCutsRD[GetGlobalIndex(7,ptbin)]) return 0;
246 if(d->CosPointingAngle() < fCutsRD[GetGlobalIndex(8,ptbin)]) return 0;
248 if (okD0) returnvalue=1; //cuts passed as D0
249 if (okD0bar) returnvalue=2; //cuts passed as D0bar
250 if (okD0 && okD0bar) returnvalue=3; //cuts passed as D0 and D0bar
255 //---------------------------------------------------------------------------