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"
36 ClassImp(AliDielectronV0Cuts)
39 AliDielectronV0Cuts::AliDielectronV0Cuts() :
40 AliDielectronVarCuts(),
48 //________________________________________________________________________
49 AliDielectronV0Cuts::AliDielectronV0Cuts(const char* name, const char* title) :
50 AliDielectronVarCuts(name,title),
58 //________________________________________________________________________
59 AliDielectronV0Cuts::~AliDielectronV0Cuts()
71 //________________________________________________________________________
72 void AliDielectronV0Cuts::Init()
75 // Init the V0 candidates
78 // TODO think about MCevent
81 // take current event from the varmanager
82 AliVEvent *ev = AliDielectronVarManager::GetCurrentEvent();
84 fV0TrackArr = new TArrayC(ev->GetNumberOfTracks());
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);
98 if(ev->IsA() == AliESDEvent::Class()) {
99 const AliESDEvent *esdev = static_cast<const AliESDEvent*>(ev);
101 for (Int_t iv=0; iv<esdev->GetNumberOfV0s(); ++iv){
102 AliESDv0 *v = esdev->GetV0(iv);
105 AliESDtrack *tr1=esdev->GetTrack(v->GetIndex(0));
106 AliESDtrack *tr2=esdev->GetTrack(v->GetIndex(1));
108 printf("Error: Couldn't get V0 daughter: %p - %p\n",tr1,tr2);
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");
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);
126 Double_t values[AliDielectronVarManager::kNMaxValues];
127 AliDielectronVarManager::Fill(&candidate,values);
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);
136 Bool_t isSelected=(fSelectedCutsMask==fActiveCutsMask);
137 if ( fCutType==kAny ) isSelected=(fSelectedCutsMask>0);
139 // store boolean at index=trackID
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());
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;
158 AliAODTrack *tr1=dynamic_cast<AliAODTrack*>(v->GetDaughter(0));
159 AliAODTrack *tr2=dynamic_cast<AliAODTrack*>(v->GetDaughter(1));
161 printf("Error: Couldn't get V0 daughter: %p - %p\n",tr1,tr2);
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;
169 // printf(" One or both V0 daughters pass the qa cuts \n");
171 AliKFVertex v0vtx = *v;
172 AliDielectronPair candidate;
173 candidate.SetPdgCode(22); // TODO setter?
174 candidate.SetGammaTracks(tr1, 11, tr2, 11);
175 candidate.SetProductionVertex(v0vtx);
178 Double_t values[AliDielectronVarManager::kNMaxValues];
179 AliDielectronVarManager::Fill(&candidate,values);
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);
188 Bool_t isSelected=(fSelectedCutsMask==fActiveCutsMask);
189 if ( fCutType==kAny ) isSelected=(fSelectedCutsMask>0);
191 // store boolean at index=trackID
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());
207 // printf(" Number of V0s candiates found %d \n",nV0s);
210 //________________________________________________________________________
211 Bool_t AliDielectronV0Cuts::IsSelected(TObject* track)
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;
222 // printf(" tttttrackID %d \n",vtrack->GetID());
224 if(fV0TrackArr->At(vtrack->GetID()) != 1) return kTRUE;
226 //printf(" track belongs to a V0 candidate \n");