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() :
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 cout<<"Ingetvarforopt"<<endl;
106 if(nvars!=fnVarsForOpt) {
107 printf("AliRDHFCutsD0toKpi::GetCutsVarsForOpt: wrong number of variables\n");
111 AliAODRecoDecayHF2Prong *dd = (AliAODRecoDecayHF2Prong*)d;
113 vars[0] = dd->GetDCA();
114 if(TMath::Abs(pdgdaughters[0])==211) {
115 vars[1] = dd->CosThetaStarD0();
117 vars[1] = dd->CosThetaStarD0bar();
119 vars[2] = dd->Prodd0d0();
120 vars[3] = dd->CosPointingAngle();
125 //possibile generalizzazione
129 if(TMath::Abs(pdgdaughters[0])==211) {
130 vars[iter]=dd->InvMassD0();
132 vars[iter]=dd->InvMassD0bar();
137 vars[iter]=dd->GetDCA();
141 if(TMath::Abs(pdgdaughters[0])==211) {
142 vars[iter] = dd->CosThetaStarD0();
144 vars[iter] = dd->CosThetaStarD0bar();
149 if(TMath::Abs(pdgdaughters[0])==321) {
150 vars[iter]=dd->PtProng(0);
153 vars[iter]=dd->PtProng(1);
158 if(TMath::Abs(pdgdaughters[0])==211) {
159 vars[iter]=dd->PtProng(0);
162 vars[iter]=dd->PtProng(1);
167 if(TMath::Abs(pdgdaughters[0])==321) {
168 vars[iter]=dd->Getd0Prong(0);
171 vars[iter]=dd->Getd0Prong(1);
176 if(TMath::Abs(pdgdaughters[0])==211) {
177 vars[iter]=dd->Getd0Prong(0);
180 vars[iter]=dd->Getd0Prong(1);
185 vars[iter]= dd->Prodd0d0();
189 vars[iter]=dd->CosPointingAngle();
194 //---------------------------------------------------------------------------
195 Int_t AliRDHFCutsD0toKpi::IsSelected(TObject* obj,Int_t selectionLevel) {
201 cout<<"Cut matrice not inizialized. Exit..."<<endl;
205 AliAODRecoDecayHF2Prong* d=(AliAODRecoDecayHF2Prong*)obj; // ????
209 cout<<"AliAODRecoDecayHF2Prong null"<<endl;
213 // selection on daughter tracks
214 if(selectionLevel==AliRDHFCuts::kAll ||
215 selectionLevel==AliRDHFCuts::kTracks) {
216 Int_t ndaughters = d->GetNDaughters();
217 //cout<<"loop on "<<ndaughters<<"daughters"<<endl;
218 for(Int_t idg=0; idg<ndaughters; idg++) {
219 AliAODTrack *dgTrack = (AliAODTrack*)d->GetDaughter(idg);
220 if(!dgTrack) returnvalue=0;
221 //printf("charge %d\n",dgTrack->Charge());
222 if(dgTrack->Charge()==0) continue; // it's not a track, but a V0
223 // convert to ESD track here
224 AliESDtrack* esdTrack=new AliESDtrack(dgTrack);
226 if(!fTrackCuts->IsSelected(esdTrack)) returnvalue=0;//kFALSE;
228 if(!returnvalue) return 0;
233 //cout<<"cand sel? "<<selectionLevel<<" = "<<AliRDHFCuts::kAll<<" or "<<AliRDHFCuts::kCandidate<<endl;
235 // selection on candidate
236 if(selectionLevel==AliRDHFCuts::kAll ||
237 selectionLevel==AliRDHFCuts::kCandidate) {
241 Int_t okD0=0,okD0bar=0;
243 Int_t ptbin=PtBin(pt);
245 Double_t mD0,mD0bar,ctsD0,ctsD0bar;
248 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
250 if(d->PtProng(1) < fCutsRD[GetGlobalIndex(3,ptbin)] || d->PtProng(0) < fCutsRD[GetGlobalIndex(4,ptbin)]) okD0 = 0;
251 if(d->PtProng(0) < fCutsRD[GetGlobalIndex(3,ptbin)] || d->PtProng(1) < fCutsRD[GetGlobalIndex(4,ptbin)]) okD0bar = 0;
253 if(!okD0 && !okD0bar) returnvalue=0;
255 if(TMath::Abs(d->Getd0Prong(1)) > fCutsRD[GetGlobalIndex(5,ptbin)] ||
256 TMath::Abs(d->Getd0Prong(0)) > fCutsRD[GetGlobalIndex(6,ptbin)]) okD0 = 0;
257 if(TMath::Abs(d->Getd0Prong(0)) > fCutsRD[GetGlobalIndex(6,ptbin)] ||
258 TMath::Abs(d->Getd0Prong(1)) > fCutsRD[GetGlobalIndex(5,ptbin)]) okD0bar = 0;
259 if(!okD0 && !okD0bar) returnvalue=0;
261 if(d->GetDCA() > fCutsRD[GetGlobalIndex(1,ptbin)]) { okD0 = okD0bar = 0; returnvalue=0;
264 d->InvMassD0(mD0,mD0bar);
265 if(TMath::Abs(mD0-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)]) okD0 = 0;
266 if(TMath::Abs(mD0bar-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)]) okD0bar = 0;
267 if(!okD0 && !okD0bar) returnvalue=0;
269 d->CosThetaStarD0(ctsD0,ctsD0bar);
270 if(TMath::Abs(ctsD0) > fCutsRD[GetGlobalIndex(2,ptbin)]) okD0 = 0;
271 if(TMath::Abs(ctsD0bar) > fCutsRD[GetGlobalIndex(2,ptbin)]) okD0bar = 0;
272 if(!okD0 && !okD0bar) returnvalue=0;
274 if(d->Prodd0d0() > fCutsRD[GetGlobalIndex(7,ptbin)]) { okD0 = okD0bar = 0; returnvalue=0; }
276 if(d->CosPointingAngle() < fCutsRD[GetGlobalIndex(8,ptbin)]) { okD0 = okD0bar = 0; returnvalue=0; }
280 if (okD0) returnvalue=1; //cuts passed as D0
281 if (okD0bar) returnvalue=2; //cuts passed as D0bar
282 if (okD0 && okD0bar) returnvalue=3; //cuts passed as D0 and D0bar
289 //---------------------------------------------------------------------------