1 /*************************************************************************
2 * Copyright(c) 1998-2009, 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 ///////////////////////////////////////////////////////////////////////////
17 // Cut class providing cuts to all infomation //
18 // available for the AliVParticle interface //
21 // Julian Book <Julian.Book@cern.ch> //
28 ///////////////////////////////////////////////////////////////////////////
31 #include "AliDielectronV0Cuts.h"
32 #include "AliDielectronVarManager.h"
33 #include "AliDielectronTrackCuts.h"
34 #include "AliDielectronPID.h"
37 ClassImp(AliDielectronV0Cuts)
40 AliDielectronV0Cuts::AliDielectronV0Cuts() :
41 AliDielectronVarCuts(),
43 fExcludeTracks(kTRUE),
57 //________________________________________________________________________
58 AliDielectronV0Cuts::AliDielectronV0Cuts(const char* name, const char* title) :
59 AliDielectronVarCuts(name,title),
61 fExcludeTracks(kTRUE),
75 //________________________________________________________________________
76 AliDielectronV0Cuts::~AliDielectronV0Cuts()
84 //________________________________________________________________________
85 void AliDielectronV0Cuts::InitEvent(AliVTrack *trk)
88 // Init the V0 candidates
91 // take current event from the track
92 // TODO: this should be simplyfied by AliVTrack::GetEvent() as soon as implemented
93 const AliVEvent *ev=0;
94 if(trk->IsA() == AliAODTrack::Class())
95 ev=static_cast<const AliVEvent*>((static_cast<const AliAODTrack*>(trk))->GetAODEvent());
96 else if(trk->IsA() == AliESDtrack::Class())
97 ev=static_cast<const AliVEvent*>((static_cast<const AliESDtrack*>(trk))->GetESDEvent());
104 if(!IsNewEvent(ev)) return;
105 // printf(" Build V0 candidates according to the applied cuts \n");
107 // TODO think about MCevent
111 fV0TrackArr.ResetAllBits();
113 // basic quality cut, at least one of the V0 daughters has to fullfill
114 AliDielectronVarCuts dauQAcuts1;
115 dauQAcuts1.AddCut(AliDielectronVarManager::kPt, 0.05, 100.0);
116 dauQAcuts1.AddCut(AliDielectronVarManager::kEta, -0.9, 0.9);
117 dauQAcuts1.AddCut(AliDielectronVarManager::kNclsTPC, 50.0, 160.0);
118 dauQAcuts1.AddCut(AliDielectronVarManager::kTPCchi2Cl, 0.0, 4.0);
119 AliDielectronTrackCuts dauQAcuts2;
120 // dauQAcuts2.SetRequireITSRefit(kTRUE);
121 dauQAcuts2.SetRequireTPCRefit(kTRUE);
122 AliDielectronPID dauPIDcuts;
123 if(fPID>=0) dauPIDcuts.SetDefaults(fPID);
126 AliDielectronPair candidate;
127 candidate.SetPdgCode(fMotherPdg);
130 if(ev->IsA() == AliESDEvent::Class()) {
131 const AliESDEvent *esdev = static_cast<const AliESDEvent*>(ev);
133 //printf("there are %d V0s in the event \n",esdev->GetNumberOfV0s());
135 for (Int_t iv=0; iv<esdev->GetNumberOfV0s(); ++iv){
136 AliESDv0 *v = esdev->GetV0(iv);
139 // should we make use of AliESDv0Cuts::GetPdgCode() to preselect candiadtes, e.g.:
140 // if(fMotherPdg!=v->GetPdgCode()) continue;
142 AliESDtrack *trNeg=esdev->GetTrack(v->GetIndex(0));
143 AliESDtrack *trPos=esdev->GetTrack(v->GetIndex(1));
144 if(!trNeg || !trPos){
145 printf("Error: Couldn't get V0 daughter: %p - %p\n",trNeg,trPos);
151 if( !dauPIDcuts.IsSelected(trNeg) ) continue;
152 if( !dauPIDcuts.IsSelected(trPos) ) continue;
156 if( !dauQAcuts2.IsSelected(trNeg) ) continue;
157 if( !dauQAcuts2.IsSelected(trPos) ) continue;
158 if( !dauQAcuts1.IsSelected(trNeg) ) continue;
159 if( !dauQAcuts1.IsSelected(trPos) ) continue;
161 if(fMotherPdg==22) candidate.SetGammaTracks(trNeg, 11, trPos, 11);
162 else candidate.SetTracks(trNeg, fNegPdg, trPos, fPosPdg);
163 // eventually take the external trackparam and build the KFparticles by hand (see AliESDv0::GetKFInfo)
164 // the folowing is not needed, because the daughters where used in the v0 vertex fit (I guess)
165 // AliKFVertex v0vtx = *v;
166 // candidate.SetProductionVertex(v0vtx);
168 if(AliDielectronVarCuts::IsSelected(&candidate)) {
170 //printf(" gamma found for vtx %p dau1id %d dau2id %d \n",v,trNeg->GetID(),trPos->GetID());
171 fV0TrackArr.SetBitNumber(trNeg->GetID());
172 fV0TrackArr.SetBitNumber(trPos->GetID());
177 else if(ev->IsA() == AliAODEvent::Class()) {
178 const AliAODEvent *aodEv = static_cast<const AliAODEvent*>(ev);
180 // Int_t nV0stored = 0;
181 // loop over vertices
182 for (Int_t ivertex=0; ivertex<aodEv->GetNumberOfVertices(); ++ivertex){
183 AliAODVertex *v=aodEv->GetVertex(ivertex);
184 if(v->GetType()!=AliAODVertex::kV0) continue;
185 if(v->GetNDaughters()!=2) continue;
187 AliAODTrack *trNeg=dynamic_cast<AliAODTrack*>(v->GetDaughter(0));
188 AliAODTrack *trPos=dynamic_cast<AliAODTrack*>(v->GetDaughter(1));
189 if(!trNeg || !trPos){
190 printf("Error: Couldn't get V0 daughter: %p - %p\n",trNeg,trPos);
197 if( !dauPIDcuts.IsSelected(trNeg) ) continue;
198 if( !dauPIDcuts.IsSelected(trPos) ) continue;
202 if( !dauQAcuts2.IsSelected(trNeg) ) continue;
203 if( !dauQAcuts2.IsSelected(trPos) ) continue;
204 if( !dauQAcuts1.IsSelected(trNeg) ) continue;
205 if( !dauQAcuts1.IsSelected(trPos) ) continue;
207 AliKFVertex v0vtx = *v;
208 if(fMotherPdg==22) candidate.SetGammaTracks(trNeg, 11, trPos, 11);
209 else candidate.SetTracks(trNeg, (trNeg->Charge()<0?fNegPdg:fPosPdg), trPos, (trPos->Charge()<0?fNegPdg:fPosPdg));
210 candidate.SetProductionVertex(v0vtx);
212 if(AliDielectronVarCuts::IsSelected(&candidate)) {
214 //printf(" gamma found for vtx %p dau1id %d dau2id %d \n",v,trNeg->GetID(),trPos->GetID());
215 fV0TrackArr.SetBitNumber(trNeg->GetID());
216 fV0TrackArr.SetBitNumber(trPos->GetID());
219 //printf("there are %d V0s in the event \n",nV0stored);
224 // printf(" Number of V0s candiates found %d \n",nV0s);
227 //________________________________________________________________________
228 Bool_t AliDielectronV0Cuts::IsSelected(TObject* track)
234 if(!track) return kFALSE;
236 AliVTrack *vtrack = static_cast<AliVTrack*>(track);
238 //printf(" track ID %d selected result %d %d \n",vtrack->GetID(),(fV0TrackArr.TestBitNumber(vtrack->GetID())),fExcludeTracks);
239 return ( (fV0TrackArr.TestBitNumber(vtrack->GetID()))^fExcludeTracks );
242 //________________________________________________________________________
243 Bool_t AliDielectronV0Cuts::IsNewEvent(const AliVEvent *ev)
246 // check weather we process a new event
249 // printf(" current ev %d %d %d \n",fBunchCross, fOrbit, fPeriod);
250 // printf(" new event %p %d %d %d \n",ev, ev->GetBunchCrossNumber(), ev->GetOrbitNumber(), ev->GetPeriodNumber());
252 if( fBunchCross == ev->GetBunchCrossNumber() ) {
253 if( fOrbit == ev->GetOrbitNumber() ) {
254 if( fPeriod == ev->GetPeriodNumber() ) {
260 fBunchCross = ev->GetBunchCrossNumber();
261 fOrbit = ev->GetOrbitNumber();
262 fPeriod = ev->GetPeriodNumber();