]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/AliDielectronV0Cuts.cxx
- HF can take now all kind of histograms
[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 "AliDielectronPID.h"
35 #include "AliESDv0.h"
36
37 ClassImp(AliDielectronV0Cuts)
38
39
40 AliDielectronV0Cuts::AliDielectronV0Cuts() :
41   AliDielectronVarCuts(),
42   fV0TrackArr(0),
43   fExcludeTracks(kTRUE),
44   fMotherPdg(0),
45   fNegPdg(0),
46   fPosPdg(0),
47   fPID(-1),
48   fOrbit(0),
49   fPeriod(0),
50   fBunchCross(0)
51 {
52   //
53   // Default costructor
54   //
55 }
56
57 //________________________________________________________________________
58 AliDielectronV0Cuts::AliDielectronV0Cuts(const char* name, const char* title) :
59   AliDielectronVarCuts(name,title),
60   fV0TrackArr(0),
61   fExcludeTracks(kTRUE),
62   fMotherPdg(0),
63   fNegPdg(0),
64   fPosPdg(0),
65   fPID(-1),
66   fOrbit(0),
67   fPeriod(0),
68   fBunchCross(0)
69 {
70   //
71   // Named contructor
72   //
73 }
74
75 //________________________________________________________________________
76 AliDielectronV0Cuts::~AliDielectronV0Cuts()
77 {
78   //
79   // Destructor
80   //
81
82 }
83
84 //________________________________________________________________________
85 void AliDielectronV0Cuts::InitEvent(AliVTrack *trk)
86 {
87   //
88   // Init the V0 candidates
89   //
90
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());
98   else
99     return;
100
101
102   // IsNewEvent
103   if(!ev) return;
104   if(!IsNewEvent(ev)) return;
105   //  printf(" Build V0 candidates according to the applied cuts \n");
106
107   // TODO think about MCevent
108   //  Print();
109
110   // rest booleans
111   fV0TrackArr.ResetAllBits();
112
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);
124
125   Int_t nV0s = 0;
126   AliDielectronPair candidate;
127   candidate.SetPdgCode(fMotherPdg);
128
129   // ESD or AOD event
130   if(ev->IsA() == AliESDEvent::Class()) {
131     const AliESDEvent *esdev = static_cast<const AliESDEvent*>(ev);
132
133     //printf("there are %d V0s in the event \n",esdev->GetNumberOfV0s());
134     // loop over V0s
135     for (Int_t iv=0; iv<esdev->GetNumberOfV0s(); ++iv){
136       AliESDv0 *v = esdev->GetV0(iv);
137       if(!v) continue;
138
139       // should we make use of AliESDv0Cuts::GetPdgCode() to preselect candiadtes, e.g.:
140       // if(fMotherPdg!=v->GetPdgCode()) continue;
141
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);
146         continue;
147       }
148
149       // PID default cuts
150       if(fPID>=0) {
151         if( !dauPIDcuts.IsSelected(trNeg) ) continue;
152         if( !dauPIDcuts.IsSelected(trPos) ) continue;
153       }
154
155       // basic track cuts
156       if( !dauQAcuts2.IsSelected(trNeg) ) continue;
157       if( !dauQAcuts2.IsSelected(trPos) ) continue;
158       if( !dauQAcuts1.IsSelected(trNeg) ) continue;
159       if( !dauQAcuts1.IsSelected(trPos) ) continue;
160
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);
167
168       if(AliDielectronVarCuts::IsSelected(&candidate)) {
169         nV0s++;
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());
173       }
174     }
175
176   }
177   else if(ev->IsA() == AliAODEvent::Class()) {
178     const AliAODEvent *aodEv = static_cast<const AliAODEvent*>(ev);
179
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;
186
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);
191         continue;
192       }
193       //nV0stored++;
194
195       // PID default cuts
196       if(fPID>=0) {
197         if( !dauPIDcuts.IsSelected(trNeg) ) continue;
198         if( !dauPIDcuts.IsSelected(trPos) ) continue;
199       }
200
201       // basic track cuts
202       if( !dauQAcuts2.IsSelected(trNeg) ) continue;
203       if( !dauQAcuts2.IsSelected(trPos) ) continue;
204       if( !dauQAcuts1.IsSelected(trNeg) ) continue;
205       if( !dauQAcuts1.IsSelected(trPos) ) continue;
206
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);
211
212       if(AliDielectronVarCuts::IsSelected(&candidate)) {
213         nV0s++;
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());
217       }
218     }
219     //printf("there are %d V0s in the event \n",nV0stored);
220   }
221   else
222     return;
223
224   //  printf(" Number of V0s candiates found %d \n",nV0s);
225
226 }
227 //________________________________________________________________________
228 Bool_t AliDielectronV0Cuts::IsSelected(TObject* track)
229 {
230   //
231   // Make cut decision
232   //
233
234   if(!track) return kFALSE;
235
236   AliVTrack *vtrack = static_cast<AliVTrack*>(track);
237   InitEvent(vtrack);
238   //printf(" track ID %d selected result %d %d \n",vtrack->GetID(),(fV0TrackArr.TestBitNumber(vtrack->GetID())),fExcludeTracks);
239   return ( (fV0TrackArr.TestBitNumber(vtrack->GetID()))^fExcludeTracks );
240 }
241
242 //________________________________________________________________________
243 Bool_t AliDielectronV0Cuts::IsNewEvent(const AliVEvent *ev)
244 {
245   //
246   // check weather we process a new event
247   //
248
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());
251
252   if( fBunchCross == ev->GetBunchCrossNumber() ) {
253     if( fOrbit == ev->GetOrbitNumber() )         {
254       if( fPeriod == ev->GetPeriodNumber() )     {
255         return kFALSE;
256       }
257     }
258   }
259
260   fBunchCross = ev->GetBunchCrossNumber();
261   fOrbit      = ev->GetOrbitNumber();
262   fPeriod     = ev->GetPeriodNumber();
263   return kTRUE;
264 }