]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/AliDielectronV0Cuts.cxx
-remove printouts
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectronV0Cuts.cxx
1 /*************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
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 **************************************************************************/
15
16 ///////////////////////////////////////////////////////////////////////////
17 //   Cut class providing cuts to all infomation                          //
18 //     available for the AliVParticle interface                          //
19 //                                                                       //
20 // Authors:                                                              //
21 //   Julian Book <Julian.Book@cern.ch>                                  //
22 /*
23
24
25
26 */
27 //                                                                       //
28 ///////////////////////////////////////////////////////////////////////////
29
30
31 #include "AliDielectronV0Cuts.h"
32 #include "AliDielectronVarManager.h"
33 #include "AliDielectronTrackCuts.h"
34 #include "AliESDv0.h"
35
36 ClassImp(AliDielectronV0Cuts)
37
38
39 AliDielectronV0Cuts::AliDielectronV0Cuts() :
40   AliDielectronVarCuts(),
41   fV0TrackArr(0),
42   fExcludeTracks(kTRUE),
43   fMotherPdg(0),
44   fNegPdg(0),
45   fPosPdg(0),
46   fOrbit(0),
47   fPeriod(0),
48   fBunchCross(0)
49 {
50   //
51   // Default costructor
52   //
53 }
54
55 //________________________________________________________________________
56 AliDielectronV0Cuts::AliDielectronV0Cuts(const char* name, const char* title) :
57   AliDielectronVarCuts(name,title),
58   fV0TrackArr(0),
59   fExcludeTracks(kTRUE),
60   fMotherPdg(0),
61   fNegPdg(0),
62   fPosPdg(0),
63   fOrbit(0),
64   fPeriod(0),
65   fBunchCross(0)
66 {
67   //
68   // Named contructor
69   //
70 }
71
72 //________________________________________________________________________
73 AliDielectronV0Cuts::~AliDielectronV0Cuts()
74 {
75   //
76   // Destructor
77   //
78
79 }
80
81 //________________________________________________________________________
82 void AliDielectronV0Cuts::InitEvent(AliVTrack *trk)
83 {
84   //
85   // Init the V0 candidates
86   //
87
88   // take current event from the track
89   // TODO: this should be simplyfied by AliVTrack::GetEvent() as soon as implemented
90   const AliVEvent *ev=0;
91   if(trk->IsA() == AliAODTrack::Class())
92     ev=static_cast<const AliVEvent*>((static_cast<const AliAODTrack*>(trk))->GetAODEvent());
93   else if(trk->IsA() == AliESDtrack::Class())
94     ev=static_cast<const AliVEvent*>((static_cast<const AliESDtrack*>(trk))->GetESDEvent());
95   else
96     return;
97
98
99   // IsNewEvent
100   if(!ev) return;
101   if(!IsNewEvent(ev)) return;
102   //  printf(" Build V0 candidates according to the applied cuts \n");
103
104   // TODO think about MCevent
105   //  Print();
106
107   // rest booleans
108   fV0TrackArr.ResetAllBits();
109
110   // basic quality cut, at least one of the V0 daughters has to fullfill
111   AliDielectronVarCuts dauQAcuts1;
112   dauQAcuts1.AddCut(AliDielectronVarManager::kPt,           0.5,  1e30);
113   dauQAcuts1.AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9);
114   dauQAcuts1.AddCut(AliDielectronVarManager::kNclsTPC,     50.0, 160.0);
115   AliDielectronTrackCuts dauQAcuts2;
116   dauQAcuts2.SetRequireITSRefit(kTRUE);
117   dauQAcuts2.SetRequireTPCRefit(kTRUE);
118
119   Int_t nV0s = 0;
120   AliDielectronPair candidate;
121   candidate.SetPdgCode(fMotherPdg);
122
123   // ESD or AOD event
124   if(ev->IsA() == AliESDEvent::Class()) {
125     const AliESDEvent *esdev = static_cast<const AliESDEvent*>(ev);
126
127     // loop over V0s
128     for (Int_t iv=0; iv<esdev->GetNumberOfV0s(); ++iv){
129       AliESDv0 *v = esdev->GetV0(iv);
130       if(!v) continue;
131
132       // should we make use of AliESDv0Cuts::GetPdgCode() to preselect candiadtes, e.g.:
133       // if(fMotherPdg!=v->GetPdgCode()) continue;
134
135       AliESDtrack *trNeg=esdev->GetTrack(v->GetIndex(0));
136       AliESDtrack *trPos=esdev->GetTrack(v->GetIndex(1));
137       if(!trNeg || !trPos){
138         printf("Error: Couldn't get V0 daughter: %p - %p\n",trNeg,trPos);
139         continue;
140       }
141
142       // at least one of the daughter has to pass basic QA cuts
143       if(!(dauQAcuts1.IsSelected(trNeg) && dauQAcuts2.IsSelected(trNeg)) ||
144          !(dauQAcuts1.IsSelected(trPos) && dauQAcuts2.IsSelected(trPos))  ) continue;
145
146       if(fMotherPdg==22) candidate.SetGammaTracks(trNeg, 11, trPos, 11);
147       else candidate.SetTracks(trNeg, fNegPdg, trPos, fPosPdg);
148       // eventually take the external trackparam and build the KFparticles by hand (see AliESDv0::GetKFInfo)
149       // the folowing is not needed, because the daughters where used in the v0 vertex fit (I guess)
150       //      AliKFVertex v0vtx = *v;
151       //      candidate.SetProductionVertex(v0vtx);
152
153       if(AliDielectronVarCuts::IsSelected(&candidate)) {
154         nV0s++;
155         //printf(" gamma found for vtx %p dau1id %d dau2id %d \n",v,trNeg->GetID(),trPos->GetID());
156         fV0TrackArr.SetBitNumber(trNeg->GetID());
157         fV0TrackArr.SetBitNumber(trPos->GetID());
158       }
159     }
160
161   }
162   else if(ev->IsA() == AliAODEvent::Class()) {
163     const AliAODEvent *aodEv = static_cast<const AliAODEvent*>(ev);
164
165     // loop over vertices
166     for (Int_t ivertex=0; ivertex<aodEv->GetNumberOfVertices(); ++ivertex){
167       AliAODVertex *v=aodEv->GetVertex(ivertex);
168       if(v->GetType()!=AliAODVertex::kV0) continue;
169       if(v->GetNDaughters()!=2) continue;
170
171       AliAODTrack *trNeg=dynamic_cast<AliAODTrack*>(v->GetDaughter(0));
172       AliAODTrack *trPos=dynamic_cast<AliAODTrack*>(v->GetDaughter(1));
173       if(!trNeg || !trPos){
174         printf("Error: Couldn't get V0 daughter: %p - %p\n",trNeg,trPos);
175         continue;
176       }
177
178       // at least one of the daughter has to pass basic QA cuts
179       if(!(dauQAcuts1.IsSelected(trNeg) && dauQAcuts2.IsSelected(trNeg)) ||
180          !(dauQAcuts1.IsSelected(trPos) && dauQAcuts2.IsSelected(trPos))  ) continue;
181
182       AliKFVertex v0vtx = *v;
183       if(fMotherPdg==22) candidate.SetGammaTracks(trNeg, 11, trPos, 11);
184       else candidate.SetTracks(trNeg, (trNeg->Charge()<0?fNegPdg:fPosPdg), trPos, (trPos->Charge()<0?fNegPdg:fPosPdg));
185       candidate.SetProductionVertex(v0vtx);
186
187       if(AliDielectronVarCuts::IsSelected(&candidate)) {
188         nV0s++;
189         //printf(" gamma found for vtx %p dau1id %d dau2id %d \n",v,trNeg->GetID(),trPos->GetID());
190         fV0TrackArr.SetBitNumber(trNeg->GetID());
191         fV0TrackArr.SetBitNumber(trPos->GetID());
192       }
193     }
194
195   }
196   else
197     return;
198
199   //  printf(" Number of V0s candiates found %d \n",nV0s);
200
201 }
202 //________________________________________________________________________
203 Bool_t AliDielectronV0Cuts::IsSelected(TObject* track)
204 {
205   //
206   // Make cut decision
207   //
208
209   if(!track) return kFALSE;
210
211   AliVTrack *vtrack = static_cast<AliVTrack*>(track);
212   InitEvent(vtrack);
213   //  printf(" track ID %d selected result %d \n",vtrack->GetID(),(fV0TrackArr.TestBitNumber(vtrack->GetID()))^fExcludeTracks);
214   return ( (fV0TrackArr.TestBitNumber(vtrack->GetID()))^fExcludeTracks );
215 }
216
217 //________________________________________________________________________
218 Bool_t AliDielectronV0Cuts::IsNewEvent(const AliVEvent *ev)
219 {
220   //
221   // check weather we process a new event
222   //
223
224   //  printf(" current ev %d %d %d \n",fBunchCross, fOrbit, fPeriod);
225   //  printf(" new event %p %d %d %d \n",ev, ev->GetBunchCrossNumber(), ev->GetOrbitNumber(), ev->GetPeriodNumber());
226
227   if( fBunchCross == ev->GetBunchCrossNumber() ) {
228     if( fOrbit == ev->GetOrbitNumber() )         {
229       if( fPeriod == ev->GetPeriodNumber() )     {
230         return kFALSE;
231       }
232     }
233   }
234
235   fBunchCross = ev->GetBunchCrossNumber();
236   fOrbit      = ev->GetOrbitNumber();
237   fPeriod     = ev->GetPeriodNumber();
238   return kTRUE;
239 }