fixing coding convention viols. RecPoint macro updated.
[u/mrichter/AliRoot.git] / PWG2 / FLOW / AliFlowTasks / AliAnalysisTaskFlowK0Candidates.cxx
CommitLineData
6e214c87 1/*************************************************************************
2* Copyright(c) 1998-2008, 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// AliAnalysisTaskFlowK0Candidates:
18// Analysis task to select K0 candidates for flow analysis.
19// Uses one AliESDtrackCuts object for both daughters and
20// QA histograms to monitor the reconstruction.
21// Author: Carlos Perez (cperez@cern.ch)
22//////////////////////////////////////////////////////
23
24#include "TChain.h"
25#include "TList.h"
26#include "TH1D.h"
27#include "TVector3.h"
28
29#include "AliAnalysisTaskSE.h"
30#include "AliAnalysisManager.h"
31
32#include "AliESDEvent.h"
33#include "AliESDInputHandler.h"
34#include "AliESDtrack.h"
35#include "AliESDtrackCuts.h"
36
37#include "AliAODEvent.h"
38#include "AliAODInputHandler.h"
39#include "AliAODTrack.h"
40
41#include "AliCFManager.h"
42
41dc4195 43#include "TMath.h"
6e214c87 44#include "TObjArray.h"
45#include "AliFlowCandidateTrack.h"
46#include "AliFlowEventCuts.h"
47
48#include "AliAnalysisTaskFlowK0Candidates.h"
49
50
51ClassImp(AliAnalysisTaskFlowK0Candidates)
52
53//_____________________________________________________________________________
54AliAnalysisTaskFlowK0Candidates::AliAnalysisTaskFlowK0Candidates() :
55 AliAnalysisTaskSE(),
56 fCutsEvent(NULL),
57 fCuts(NULL),
41dc4195 58 fQAList(NULL),
6e214c87 59 fMassMin(0),
41dc4195 60 fMassMax(0),
61 fDLcut(0),
62 tEvent(NULL),
63 tMulti(NULL)
6e214c87 64{
41dc4195 65 for(int i=0; i!=4; ++i) {
66 tMass[i] = NULL;
67 tDCA[i] = NULL;
68 tDL[i] = NULL;
69 tCTP[i] = NULL;
70 td0d0[i] = NULL;
71 tPhi[i] = NULL;
72 tEta[i] = NULL;
73 tPt[i] = NULL;
74 tAPhi[i] = NULL;
75 tAEta[i] = NULL;
76 tAPt[i] = NULL;
77 tBPhi[i] = NULL;
78 tBEta[i] = NULL;
79 tBPt[i] = NULL;
80 }
6e214c87 81}
82
83//_____________________________________________________________________________
84AliAnalysisTaskFlowK0Candidates::AliAnalysisTaskFlowK0Candidates(const char *name, AliFlowEventCuts *cutsEvent, AliESDtrackCuts *cuts, Double_t MassMin, Double_t MassMax) :
85 AliAnalysisTaskSE(name),
86 fCutsEvent(cutsEvent),
87 fCuts(cuts),
41dc4195 88 fQAList(NULL),
6e214c87 89 fMassMin(MassMin),
41dc4195 90 fMassMax(MassMax),
91 fDLcut(0),
92 tEvent(NULL),
93 tMulti(NULL)
6e214c87 94{
41dc4195 95 for(int i=0; i!=4; ++i) {
96 tMass[i] = NULL;
97 tDCA[i] = NULL;
98 tDL[i] = NULL;
99 tCTP[i] = NULL;
100 td0d0[i] = NULL;
101 tPhi[i] = NULL;
102 tEta[i] = NULL;
103 tPt[i] = NULL;
104 tAPhi[i] = NULL;
105 tAEta[i] = NULL;
106 tAPt[i] = NULL;
107 tBPhi[i] = NULL;
108 tBEta[i] = NULL;
109 tBPt[i] = NULL;
110 }
6e214c87 111 DefineInput( 0, TChain::Class() );
112 DefineOutput( 1, TObjArray::Class() );
113 DefineOutput( 2, TList::Class() );
114}
115
116//_____________________________________________________________________________
117AliAnalysisTaskFlowK0Candidates::~AliAnalysisTaskFlowK0Candidates()
118{
41dc4195 119 if(fQAList) delete fQAList;
6e214c87 120}
121
122//_____________________________________________________________________________
123void AliAnalysisTaskFlowK0Candidates::UserCreateOutputObjects()
124{
41dc4195 125 fQAList = new TList();
126 fQAList->SetOwner();
127 AddQAEvents();
128 AddQACandidates();
129 PostData( 2, fQAList);
130}
131//_____________________________________________________________________________
132void AliAnalysisTaskFlowK0Candidates::AddQAEvents()
133{
134 TList *tQAEvents = new TList();
135 tQAEvents->SetName("Events");
136 tQAEvents->SetOwner();
137 tEvent = new TH1D("Event", "Number of Events", 2, 0, 2);
138 tQAEvents->Add(tEvent);
139 tMulti = new TH1D("Multiplicity", "Multiplicity", 180, 0, 10000);
140 tQAEvents->Add(tMulti);
141 fQAList->Add(tQAEvents);
142}
143//_____________________________________________________________________________
144void AliAnalysisTaskFlowK0Candidates::AddQACandidates()
145{
146 TList *tQACandidates[4];
147 TList *tQADaughters[4];
148 for(int i=0; i!=4; ++i) {
149 tQACandidates[i] = new TList();
150 tQACandidates[i]->SetOwner();
151 tQACandidates[i]->SetName(Form("Candidates%d",i));
152 tMass[i] = new TH1D( Form("Mass%i",i), "Mass;M_{#pi#pi} [GeV];Counts per MeV", 180, 0.41, 0.59); tQACandidates[i]->Add( tMass[i] );
153 tDCA[i] = new TH1D( Form("DCA%i" ,i), "DCA;[cm];Counts per 10 um", 180, 0.00, 0.18); tQACandidates[i]->Add( tDCA[i] );
154 tDL[i] = new TH1D( Form("DL%i" ,i), "Decay Length;[cm];Counts per 0.1 mm", 180, 0.00, 1.80); tQACandidates[i]->Add( tDL[i] );
155 tCTP[i] = new TH1D( Form("CTP%i" ,i), "Cos#theta_{p}", 180,-1.10, 1.10); tQACandidates[i]->Add( tCTP[i] );
156 td0d0[i] = new TH1D( Form("d0d0%i",i), "d_{0}xd_{0};[cm^{2}];Cnts 0.01 mm^{2}",180,-0.009,0.009);tQACandidates[i]->Add( td0d0[i] );
157 tPhi[i] = new TH1D( Form("Phi%i" ,i), "Phi;[rad];Counts per degree", 180,0,TMath::TwoPi()); tQACandidates[i]->Add( tPhi[i] );
158 tEta[i] = new TH1D( Form("Eta%i" ,i), "Eta;;Counts per 0.04", 180,-3.60, 3.60); tQACandidates[i]->Add( tEta[i] );
159 tPt[i] = new TH1D( Form("Pt%i" ,i), "Pt;[GeV];Counts per 0.1 GeV", 180, 0.00,18.00); tQACandidates[i]->Add( tPt[i] );
160 tQADaughters[i] = new TList();
161 tQADaughters[i]->SetOwner();
162 tQADaughters[i]->SetName(Form("Daughters%d",i));
163 tAPhi[i] = new TH1D( Form("PhiBef%i",i), "Phi prePropagation;[rad];Cnts per degree",180,0,TMath::TwoPi()); tQADaughters[i]->Add( tAPhi[i] );
164 tAEta[i] = new TH1D( Form("EtaBef%i",i), "Eta prePropagation;;Counts per 0.04" ,180,-3.6,3.6); tQADaughters[i]->Add( tAEta[i] );
165 tAPt[i] = new TH1D( Form("PtBef%i" ,i), "Pt prePropagation;[GeV];Counts per 0.1 GeV",180, 0, 18); tQADaughters[i]->Add( tAPt[i] );
166 tBPhi[i] = new TH1D( Form("PhiAft%i",i), "Phi posPropagation;[rad];Cnts per degree",180,0,TMath::TwoPi()); tQADaughters[i]->Add( tBPhi[i] );
167 tBEta[i] = new TH1D( Form("EtaAft%i",i), "Eta posPropagation;;Counts per 0.04" ,180,-3.6,3.6); tQADaughters[i]->Add( tBEta[i] );
168 tBPt[i] = new TH1D( Form("PtAft%i" ,i), "Pt posPropagation;[GeV];Counts per 0.1 GeV",180, 0, 18); tQADaughters[i]->Add( tBPt[i] );
169 tQACandidates[i]->Add(tQADaughters[i]);
170 fQAList->Add(tQACandidates[i]);
171 }
6e214c87 172}
6e214c87 173//_____________________________________________________________________________
174void AliAnalysisTaskFlowK0Candidates::NotifyRun()
175{
41dc4195 176// AliESDEvent *fESD = dynamic_cast<AliESDEvent*>(InputEvent());
177// if(!fESD) return;
6e214c87 178}
179
180//_____________________________________________________________________________
181void AliAnalysisTaskFlowK0Candidates::UserExec(Option_t *)
182{
41dc4195 183 AliESDEvent *fESD = dynamic_cast<AliESDEvent*>(InputEvent());
184 AliAODEvent *fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
185 if( (!fESD)&&(!fAOD) )
186 return;
187// printf("\nEvent found");
188 tEvent->Fill( 0 );
6e214c87 189 if(fCutsEvent)
41dc4195 190 if( !(fCutsEvent->IsSelected(InputEvent())) )
191 return;
192 tEvent->Fill( 1 );
193 if(fESD)
194 ReadFromESD(fESD);
195 else if(fAOD)
196 ReadFromAOD(fAOD);
197}
198//_____________________________________________________________________________
199void AliAnalysisTaskFlowK0Candidates::ReadFromESD(AliESDEvent *fESD)
200{
6e214c87 201 TObjArray *POIselection = new TObjArray();
202 POIselection->SetOwner();
6e214c87 203 int nTracks = fESD->GetNumberOfTracks();
41dc4195 204 tMulti->Fill( nTracks );
205 for(int i=0; i!=nTracks; ++i) {
6e214c87 206 AliESDtrack *ioT = fESD->GetTrack(i);
207 if(fCuts)
208 if( !(fCuts->IsSelected(ioT)) )
209 continue;
41dc4195 210 // printf("\n first particle OK...");
211 for(int j=i+1; j!=nTracks; ++j) {
6e214c87 212 AliESDtrack *joT = fESD->GetTrack(j);
41dc4195 213 if( (ioT->Charge()*joT->Charge()) > 0 )
6e214c87 214 continue;
215 if(fCuts)
216 if( !(fCuts->IsSelected(joT)) )
217 continue;
41dc4195 218 // printf("\n second also...");
6e214c87 219 AliESDtrack *iT = new AliESDtrack(*ioT);
220 AliESDtrack *jT = new AliESDtrack(*joT);
221 // getting distance of closest approach
222 double DCA = iT->PropagateToDCA(jT,fESD->GetMagneticField());
41dc4195 223 // printf(" propagated...");
6e214c87 224 // getting decay length
41dc4195 225 TVector3 vp, vv, vl;
226 vp = TVector3( (iT->Xv()+jT->Xv())/2, (iT->Yv()+jT->Yv())/2, (iT->Zv()+jT->Zv())/2 ); // candidate position
227 vv = TVector3( fESD->GetPrimaryVertex()->GetX(), fESD->GetPrimaryVertex()->GetY(), fESD->GetPrimaryVertex()->GetZ() ); // vertex position
228 vl = vp - vv; // flight line
6e214c87 229 double DL;
41dc4195 230 DL = vl.Mag();
231 // getting cos pointing angle
6e214c87 232 double CTP;
41dc4195 233 TVector3 vi, vj, vs;
6e214c87 234 vi = TVector3( iT->Px(), iT->Py(), iT->Pz() );
235 vj = TVector3( jT->Px(), jT->Py(), jT->Pz() );
236 vs = vi + vj;
41dc4195 237 CTP = TMath::Cos( vl.Angle(vs) ); // Marta says: "Carlos, it is faster if you calculate this by hand!"
238 double D0D0;
239 D0D0 = iT->GetD(vv.X(),vv.Y(),fESD->GetMagneticField())*jT->GetD(vv.X(),vv.Y(),fESD->GetMagneticField());
6e214c87 240 // getting invariant mass
241 double sum12 = iT->P()*iT->P()+jT->P()*jT->P();
242 double pro12 = iT->P()*iT->P()*jT->P()*jT->P();
243 double InvMass = 0;
244 InvMass += TMath::Power(0.13957018,2);
245 InvMass += sqrt( TMath::Power(0.13957018,4) + TMath::Power(0.13957018,2)*(sum12) + pro12 );
246 InvMass -= ( iT->Px()*jT->Px()+iT->Py()*jT->Py()+iT->Pz()*jT->Pz() );
247 InvMass *= 2;
248 InvMass = sqrt(InvMass);
41dc4195 249 // filtering
250 int iLevel = 3;
251 if( CTP<0.8 )
252 iLevel = 2;
253 if( DL<fDLcut ) // 0.5
254 iLevel = 1;
255 if( DCA>0.05 )
256 iLevel = 0;
257 // printf(" candidate at level %d...",iLevel);
258 for(int h=0; h!=iLevel+1; ++h) {
259 // printf(" %d",h);
260 // candidate
261 tDCA[h]->Fill( DCA );
262 tDL[h]->Fill( DL );
263 tCTP[h]->Fill( CTP );
264 td0d0[h]->Fill( D0D0 );
265 tMass[h]->Fill( InvMass );
266 tPhi[h]->Fill( vs.Phi()+TMath::Pi() );
267 tEta[h]->Fill( vs.Eta() );
268 tPt[h]->Fill( vs.Pt() );
269 // daughters
270 tAPhi[h]->Fill( iT->Phi() );
271 tAEta[h]->Fill( iT->Eta() );
272 tAPt[h]->Fill( iT->Pt() );
273 tAPhi[h]->Fill( jT->Phi() );
274 tAEta[h]->Fill( jT->Eta() );
275 tAPt[h]->Fill( jT->Pt() );
276 tBPhi[h]->Fill( ioT->Phi());
277 tBEta[h]->Fill( ioT->Eta());
278 tBPt[h]->Fill( ioT->Pt() );
279 tBPhi[h]->Fill( joT->Phi());
280 tBEta[h]->Fill( joT->Eta());
281 tBPt[h]->Fill( joT->Pt() );
282 }
283 // building candidate
284 if( (InvMass>fMassMin) && (InvMass<fMassMax) && (iLevel==3) ) {
285 AliFlowCandidateTrack *sTrack = new AliFlowCandidateTrack();
286 sTrack->SetMass( InvMass );
287 sTrack->SetPt( vs.Pt() );
288 sTrack->SetPhi( vs.Phi()+TMath::Pi() );
289 sTrack->SetEta( vs.Eta() );
290 sTrack->SetCharge( 0 );
291 sTrack->AddDaughter( iT->GetID() );
292 sTrack->AddDaughter( jT->GetID() );
293 POIselection->AddLast( sTrack );
6e214c87 294 }
6e214c87 295 delete iT;
296 delete jT;
41dc4195 297 } // endfor j
298 } // endfor i
299 PostData( 1, POIselection );
300 PostData( 2, fQAList);
301}
302
303//_____________________________________________________________________________
304void AliAnalysisTaskFlowK0Candidates::ReadFromAOD(AliAODEvent *fAOD)
305{
306 TObjArray *POIselection = new TObjArray();
307 POIselection->SetOwner();
308 int nTracks = fAOD->GetNumberOfTracks();
309 tMulti->Fill( nTracks );
310 for(int i=0; i!=fAOD->GetNumberOfV0s(); ++i) {
311 AliAODv0 *iV0 = (AliAODv0*) fAOD->GetV0(i);
312 if ( iV0->GetOnFlyStatus() ) continue;
313 if ( (iV0->ChargeProng(0)*iV0->ChargeProng(1))>0 ) continue;
314 // getting distance of closest approach
315 double DCA = iV0->DcaV0Daughters();
316 // getting decay length
317 double DL;
318 double vv[3];
319 vv[0] = fAOD->GetPrimaryVertex()->GetX();
320 vv[1] = fAOD->GetPrimaryVertex()->GetY();
321 vv[2] = fAOD->GetPrimaryVertex()->GetZ();
322 DL = iV0->DecayLengthV0(vv);
323 // cos pointing angle
324 double CTP;
325 CTP = iV0->CosPointingAngle(vv);
326 double D0D0;
327 D0D0 = iV0->Prodd0d0();
328 // getting invariant mass
329 double InvMass = iV0->MassK0Short();
330 // filtering
331 int iLevel = 3;
332 if( CTP<0.8 )
333 iLevel = 2;
334 if( DL<fDLcut ) // 0.5
335 iLevel = 1;
336 if( DCA>0.05 )
337 iLevel = 0;
338 for(int h=0; h!=iLevel+1; ++h) {
339 // candidate
340 tDCA[h]->Fill( DCA );
341 tDL[h]->Fill( DL );
342 tCTP[h]->Fill( CTP );
343 td0d0[h]->Fill( D0D0 );
344 tMass[h]->Fill( InvMass );
345 tPhi[h]->Fill( iV0->Phi() );
346 tEta[h]->Fill( iV0->Eta() );
347 tPt[h]->Fill( iV0->Pt() );
348 // daughters
349 tAPhi[h]->Fill( ( (AliAODTrack*) iV0->GetDaughter(0) )->Phi() );
350 tAEta[h]->Fill( ( (AliAODTrack*) iV0->GetDaughter(0) )->Eta() );
351 tAPt[h]->Fill( ( (AliAODTrack*) iV0->GetDaughter(0) )->Pt() );
352 tAPhi[h]->Fill( ( (AliAODTrack*) iV0->GetDaughter(1) )->Phi() );
353 tAEta[h]->Fill( ( (AliAODTrack*) iV0->GetDaughter(1) )->Eta() );
354 tAPt[h]->Fill( ( (AliAODTrack*) iV0->GetDaughter(1) )->Pt() );
355 tBPhi[h]->Fill( iV0->PhiProng(0) );
356 tBEta[h]->Fill( iV0->EtaProng(0) );
357 tBPt[h]->Fill( iV0->PtProng(0) );
358 tBPhi[h]->Fill( iV0->PhiProng(1) );
359 tBEta[h]->Fill( iV0->EtaProng(1) );
360 tBPt[h]->Fill( iV0->PtProng(1) );
6e214c87 361 }
41dc4195 362 AliFlowCandidateTrack *sTrack = new AliFlowCandidateTrack();
363 sTrack->SetMass( InvMass );
364 sTrack->SetPt( iV0->Pt() );
365 sTrack->SetPhi( iV0->Phi() );
366 sTrack->SetEta( iV0->Eta() );
367 sTrack->SetCharge( 0 );
368 sTrack->AddDaughter( iV0->GetPosID() );
369 sTrack->AddDaughter( iV0->GetNegID() );
370 POIselection->AddLast( sTrack );
6e214c87 371 }
372 PostData( 1, POIselection );
41dc4195 373 PostData( 2, fQAList);
6e214c87 374}
375
376//_____________________________________________________________________________
377void AliAnalysisTaskFlowK0Candidates::Terminate(Option_t *)
378{
379}
380