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
16 /////////////////////////////////////////////////////////////
\r
18 // Class for cuts on AOD reconstructed D0->Kpipipi
\r
20 // Author: r.romita@gsi.de, andrea.dainese@pd.infn.it
\r
21 /////////////////////////////////////////////////////////////
\r
23 #include <TDatabasePDG.h>
\r
24 #include <Riostream.h>
\r
26 #include "AliRDHFCutsD0toKpipipi.h"
\r
27 #include "AliAODRecoDecayHF4Prong.h"
\r
28 #include "AliAODTrack.h"
\r
29 #include "AliESDtrack.h"
\r
31 ClassImp(AliRDHFCutsD0toKpipipi)
\r
33 //--------------------------------------------------------------------------
\r
34 AliRDHFCutsD0toKpipipi::AliRDHFCutsD0toKpipipi(const char* name) :
\r
38 // Default Constructor
\r
42 TString varNames[9]={"inv. mass [GeV]",
\r
44 "Dist 2-trk Vtx to PrimVtx [cm]",
\r
45 "Dist 3-trk Vtx to PrimVtx [cm]",
\r
46 "Dist 4-trk Vtx to PrimVtx [cm]",
\r
51 Bool_t isUpperCut[9]={kTRUE,
\r
60 SetVarNames(nvars,varNames,isUpperCut);
\r
61 Bool_t forOpt[9]={kFALSE,
\r
70 SetVarsForOpt(5,forOpt);
\r
71 Float_t limits[2]={0,999999999.};
\r
72 SetPtBins(2,limits);
\r
74 //--------------------------------------------------------------------------
\r
75 AliRDHFCutsD0toKpipipi::AliRDHFCutsD0toKpipipi(const AliRDHFCutsD0toKpipipi &source) :
\r
83 //--------------------------------------------------------------------------
\r
84 AliRDHFCutsD0toKpipipi &AliRDHFCutsD0toKpipipi::operator=(const AliRDHFCutsD0toKpipipi &source)
\r
87 // assignment operator
\r
89 if(&source == this) return *this;
\r
91 AliRDHFCuts::operator=(source);
\r
97 //---------------------------------------------------------------------------
\r
98 void AliRDHFCutsD0toKpipipi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) {
\r
100 // Fills in vars the values of the variables
\r
103 if(nvars!=fnVarsForOpt) {
\r
104 printf("AliRDHFCutsD0toKpipipi::GetCutsVarsForOpt: wrong number of variables\n");
\r
108 AliAODRecoDecayHF4Prong *dd = (AliAODRecoDecayHF4Prong*)d;
\r
112 if(fVarsForOpt[0]) {
\r
114 Double_t mD0[2],mD0bar[2];
\r
115 if(TMath::Abs(pdgdaughters[1])==321 || TMath::Abs(pdgdaughters[3])==321) {
\r
116 dd->InvMassD0(mD0);
\r
117 if(TMath::Abs(pdgdaughters[1])==321) {
\r
123 dd->InvMassD0bar(mD0bar);
\r
124 if(TMath::Abs(pdgdaughters[0])==321) {
\r
132 if(fVarsForOpt[1]){
\r
134 vars[iter]=dd->GetDCA();
\r
137 if(fVarsForOpt[2]){
\r
139 vars[iter]=dd->GetDist12toPrim();
\r
141 if(fVarsForOpt[3]){
\r
143 vars[iter]=dd->GetDist3toPrim();
\r
145 if(fVarsForOpt[4]){
\r
147 vars[iter]=dd->GetDist4toPrim();
\r
149 if(fVarsForOpt[5]){
\r
151 vars[iter]=dd->CosPointingAngle();
\r
153 if(fVarsForOpt[6]){
\r
155 vars[iter]=dd->Pt();
\r
157 if(fVarsForOpt[7]){
\r
159 vars[iter]=999999999.;
\r
160 printf("ERROR: optmization for rho mass cut not implemented\n");
\r
162 if(fVarsForOpt[8]){
\r
164 vars[iter]=999999999.;
\r
165 printf("ERROR: optmization for PID cut not implemented\n");
\r
170 //---------------------------------------------------------------------------
\r
171 Int_t AliRDHFCutsD0toKpipipi::IsSelected(TObject* obj,Int_t selectionLevel) {
\r
177 cout<<"Cut matrix not inizialized. Exit..."<<endl;
\r
181 AliAODRecoDecayHF4Prong* d=(AliAODRecoDecayHF4Prong*)obj;
\r
184 cout<<"AliAODRecoDecayHF4Prong null"<<endl;
\r
189 // selection on daughter tracks
\r
190 if(selectionLevel==AliRDHFCuts::kAll ||
\r
191 selectionLevel==AliRDHFCuts::kTracks) {
\r
192 if(!AreDaughtersSelected(d)) return 0;
\r
196 Int_t returnvalue=1;
\r
198 // selection on candidate
\r
199 if(selectionLevel==AliRDHFCuts::kAll ||
\r
200 selectionLevel==AliRDHFCuts::kCandidate) {
\r
202 Int_t ptbin=PtBin(d->Pt());
\r
204 Int_t okD0=1,okD0bar=1;
\r
205 Double_t mD0[2],mD0bar[2];
\r
206 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
\r
209 if(TMath::Abs(mD0[0]-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)] &&
\r
210 TMath::Abs(mD0[1]-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)]) okD0 = 0;
\r
211 d->InvMassD0bar(mD0bar);
\r
212 if(TMath::Abs(mD0bar[0]-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)] &&
\r
213 TMath::Abs(mD0bar[1]-mD0PDG) > fCutsRD[GetGlobalIndex(0,ptbin)]) okD0bar = 0;
\r
214 if(!okD0 && !okD0bar) return 0;
\r
216 if(d->GetDCA() > fCutsRD[GetGlobalIndex(1,ptbin)]) return 0;
\r
217 if(d->GetDist12toPrim() < fCutsRD[GetGlobalIndex(2,ptbin)]) return 0;
\r
218 if(d->GetDist3toPrim() < fCutsRD[GetGlobalIndex(3,ptbin)]) return 0;
\r
219 if(d->GetDist4toPrim() < fCutsRD[GetGlobalIndex(4,ptbin)]) return 0;
\r
220 if(d->CosPointingAngle() < fCutsRD[GetGlobalIndex(5,ptbin)]) return 0;
\r
221 if(d->Pt() < fCutsRD[GetGlobalIndex(6,ptbin)]) return 0;
\r
222 if(!d->CutRhoMass(mD0,mD0bar,fCutsRD[GetGlobalIndex(0,ptbin)],fCutsRD[GetGlobalIndex(7,ptbin)])) return 0;
\r
224 if (okD0) returnvalue=1; //cuts passed as D0
\r
225 if (okD0bar) returnvalue=2; //cuts passed as D0bar
\r
226 if (okD0 && okD0bar) returnvalue=3; //cuts passed as D0 and D0bar
\r
229 return returnvalue;
\r
231 //---------------------------------------------------------------------------
\r