]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/AliDielectronV0Cuts.cxx
- add V0 cut class
[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(0x0)
42 {
43   //
44   // Default costructor
45   //
46 }
47
48 //________________________________________________________________________
49 AliDielectronV0Cuts::AliDielectronV0Cuts(const char* name, const char* title) :
50   AliDielectronVarCuts(name,title),
51   fV0TrackArr(0x0)
52 {
53   //
54   // Named contructor
55   //
56 }
57
58 //________________________________________________________________________
59 AliDielectronV0Cuts::~AliDielectronV0Cuts()
60 {
61   //
62   // Destructor
63   //
64   if(fV0TrackArr) {
65     delete fV0TrackArr;
66     fV0TrackArr=0;
67   }
68 }
69
70
71 //________________________________________________________________________
72 void AliDielectronV0Cuts::Init()
73 {
74   //
75   // Init the V0 candidates
76   //
77
78   // TODO think about MCevent
79   //  Print();
80
81   // take current event from the varmanager
82   AliVEvent *ev  =   AliDielectronVarManager::GetCurrentEvent();
83   if(!ev) return;
84   fV0TrackArr = new TArrayC(ev->GetNumberOfTracks());
85
86   // basic quality cut, at least one of the V0 daughters has to fullfill
87   AliDielectronVarCuts *dauQAcuts1 = new AliDielectronVarCuts();
88   dauQAcuts1->AddCut(AliDielectronVarManager::kPt,           0.5,  1e30);
89   dauQAcuts1->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9);
90   dauQAcuts1->AddCut(AliDielectronVarManager::kNclsTPC,     50.0, 160.0);
91   AliDielectronTrackCuts *dauQAcuts2 = new AliDielectronTrackCuts();
92   dauQAcuts2->SetRequireITSRefit(kTRUE);
93   dauQAcuts2->SetRequireTPCRefit(kTRUE);
94
95   Int_t nV0s = 0;
96
97   // ESD or AOD event
98   if(ev->IsA() == AliESDEvent::Class()) {
99     const AliESDEvent *esdev = static_cast<const AliESDEvent*>(ev);
100     // loop over V0s
101     for (Int_t iv=0; iv<esdev->GetNumberOfV0s(); ++iv){
102       AliESDv0 *v = esdev->GetV0(iv);
103       if(!v) continue;
104
105       AliESDtrack *tr1=esdev->GetTrack(v->GetIndex(0));
106       AliESDtrack *tr2=esdev->GetTrack(v->GetIndex(1));
107       if(!tr1 || !tr2){
108         printf("Error: Couldn't get V0 daughter: %p - %p\n",tr1,tr2);
109         continue;
110       }
111
112       // at least one of the daughter has to pass basic QA cuts
113       if(!(dauQAcuts1->IsSelected(tr1) && dauQAcuts2->IsSelected(tr1)) ||
114          !(dauQAcuts1->IsSelected(tr1) && dauQAcuts2->IsSelected(tr1))  ) continue;
115       //      printf(" One or both V0 daughters pass the qa cuts \n");
116
117       // eventually take the external trackparam and build the KFparticles by hand (see AliESDv0::GetKFInfo)
118       AliDielectronPair candidate;
119       candidate.SetPdgCode(22);
120       candidate.SetGammaTracks(tr1, 11, tr2, 11);
121       // this is not needed, because the daughters where used in the v0 vertex fit (I guess)
122       //      AliKFVertex v0vtx = *v;
123       //      candidate.SetProductionVertex(v0vtx);
124
125       //Fill values
126       Double_t values[AliDielectronVarManager::kNMaxValues];
127       AliDielectronVarManager::Fill(&candidate,values);
128
129       fSelectedCutsMask=0;
130       for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
131         Int_t cut=fActiveCuts[iCut];
132         SETBIT(fSelectedCutsMask,iCut);
133         if ( ((values[cut]<fCutMin[iCut]) || (values[cut]>fCutMax[iCut]))^fCutExclude[iCut] ) CLRBIT(fSelectedCutsMask,iCut);
134       }
135
136       Bool_t isSelected=(fSelectedCutsMask==fActiveCutsMask);
137       if ( fCutType==kAny ) isSelected=(fSelectedCutsMask>0);
138
139       // store boolean at index=trackID
140       if(isSelected) {
141         nV0s++;
142         if(tr1->GetID()>fV0TrackArr->GetSize()) {/* printf(" size of array %d too small expand to %d \n",fV0TrackArr->GetSize(), tr1->GetID());*/ fV0TrackArr->Set(tr1->GetID()+1); }
143         if(tr2->GetID()>fV0TrackArr->GetSize()) {/* printf(" size of array %d too small expand to %d \n",fV0TrackArr->GetSize(), tr2->GetID());*/ fV0TrackArr->Set(tr2->GetID()+1); }
144         //      printf(" gamma found for vtx %p dau1id %d dau2id %d \n",v,tr1->GetID(),tr2->GetID());
145         fV0TrackArr->AddAt(1,tr1->GetID());
146         fV0TrackArr->AddAt(1,tr2->GetID());
147       }
148     }
149   }
150   else if(ev->IsA() == AliAODEvent::Class()) {
151     const AliAODEvent *aodEv = static_cast<const AliAODEvent*>(ev);
152     // loop over vertices
153     for (Int_t ivertex=0; ivertex<aodEv->GetNumberOfVertices(); ++ivertex){
154       AliAODVertex *v=aodEv->GetVertex(ivertex);
155       if(v->GetType()!=AliAODVertex::kV0) continue;
156       if(v->GetNDaughters()!=2) continue;
157
158       AliAODTrack *tr1=dynamic_cast<AliAODTrack*>(v->GetDaughter(0));
159       AliAODTrack *tr2=dynamic_cast<AliAODTrack*>(v->GetDaughter(1));
160       if(!tr1 || !tr2){
161         printf("Error: Couldn't get V0 daughter: %p - %p\n",tr1,tr2);
162         continue;
163       }
164
165       // at least one of the daughter has to pass basic QA cuts
166       if(!(dauQAcuts1->IsSelected(tr1) && dauQAcuts2->IsSelected(tr1)) ||
167          !(dauQAcuts1->IsSelected(tr1) && dauQAcuts2->IsSelected(tr1))  ) continue;
168
169       //      printf(" One or both V0 daughters pass the qa cuts \n");
170
171       AliKFVertex v0vtx = *v;
172       AliDielectronPair candidate;
173       candidate.SetPdgCode(22); // TODO setter?
174       candidate.SetGammaTracks(tr1, 11, tr2, 11);
175       candidate.SetProductionVertex(v0vtx);
176
177       //Fill values
178       Double_t values[AliDielectronVarManager::kNMaxValues];
179       AliDielectronVarManager::Fill(&candidate,values);
180
181       fSelectedCutsMask=0;
182       for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
183         Int_t cut=fActiveCuts[iCut];
184         SETBIT(fSelectedCutsMask,iCut);
185         if ( ((values[cut]<fCutMin[iCut]) || (values[cut]>fCutMax[iCut]))^fCutExclude[iCut] ) CLRBIT(fSelectedCutsMask,iCut);
186       }
187
188       Bool_t isSelected=(fSelectedCutsMask==fActiveCutsMask);
189       if ( fCutType==kAny ) isSelected=(fSelectedCutsMask>0);
190
191       // store boolean at index=trackID
192       if(isSelected) {
193         nV0s++;
194         if(tr1->GetID()>fV0TrackArr->GetSize()) {/* printf(" size of array %d too small expand to %d \n",fV0TrackArr->GetSize(), tr1->GetID());*/ fV0TrackArr->Set(tr1->GetID()+1); }
195         if(tr2->GetID()>fV0TrackArr->GetSize()) {/* printf(" size of array %d too small expand to %d \n",fV0TrackArr->GetSize(), tr2->GetID());*/ fV0TrackArr->Set(tr2->GetID()+1); }
196         //      printf(" gamma found for vtx %p dau1id %d dau2id %d \n",v,tr1->GetID(),tr2->GetID());
197         fV0TrackArr->AddAt(1,tr1->GetID());
198         fV0TrackArr->AddAt(1,tr2->GetID());
199       }
200     }
201   }
202   else
203     return;
204
205   delete dauQAcuts1;
206   delete dauQAcuts2;
207   //  printf(" Number of V0s candiates found %d \n",nV0s);
208
209 }
210 //________________________________________________________________________
211 Bool_t AliDielectronV0Cuts::IsSelected(TObject* track)
212 {
213   //
214   // Make cut decision
215   //
216   if(!fV0TrackArr->GetSum()) return kTRUE;
217   if(!track) return kFALSE;
218   //what about VParticles MC, better to store pointers??
219   AliVTrack *vtrack = static_cast<AliVTrack*>(track);
220   if(!vtrack) return kFALSE;
221
222   //  printf(" tttttrackID %d \n",vtrack->GetID());
223
224   if(fV0TrackArr->At(vtrack->GetID()) != 1) return kTRUE;
225   else {
226     //printf(" track belongs to a V0 candidate \n");
227     return kFALSE;
228   }
229
230 }