]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ANALYSIS/AliAnalysisTaskESDfilter.cxx
Removed macros not compatible with current package
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisTaskESDfilter.cxx
CommitLineData
96b85d73 1/**************************************************************************
2 * Copyright(c) 1998-1999, 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/* $Id: AliAnalysisTaskESDfilter.cxx 24535 2008-03-16 22:43:30Z fca $ */
17
18#include <TChain.h>
ec6465fe 19#include <TList.h>
96b85d73 20#include <TFile.h>
e6500713 21#include <TArrayI.h>
d7bdc804 22#include <TRandom.h>
96b85d73 23
24#include "AliAnalysisTaskESDfilter.h"
25#include "AliAnalysisManager.h"
26#include "AliESDEvent.h"
27#include "AliAODEvent.h"
28#include "AliESDInputHandler.h"
29#include "AliAODHandler.h"
30#include "AliAnalysisFilter.h"
96b85d73 31#include "AliESDMuonTrack.h"
32#include "AliESDVertex.h"
33#include "AliESDv0.h"
34#include "AliESDkink.h"
35#include "AliESDcascade.h"
36#include "AliESDPmdTrack.h"
37#include "AliESDCaloCluster.h"
38#include "AliESDCaloCells.h"
39#include "AliMultiplicity.h"
40#include "AliLog.h"
41
42ClassImp(AliAnalysisTaskESDfilter)
43
44////////////////////////////////////////////////////////////////////////
45
46AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
47 AliAnalysisTaskSE(),
48 fTrackFilter(0x0),
49 fKinkFilter(0x0),
d7bdc804 50 fV0Filter(0x0),
51 fHighPthreshold(0),
52 fPtshape(0x0)
96b85d73 53{
54 // Default constructor
55}
56
57AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
58 AliAnalysisTaskSE(name),
59 fTrackFilter(0x0),
60 fKinkFilter(0x0),
d7bdc804 61 fV0Filter(0x0),
62 fHighPthreshold(0),
63 fPtshape(0x0)
96b85d73 64{
65 // Constructor
66}
67
68void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
69{
70// Create the output container
71 OutputTree()->GetUserInfo()->Add(fTrackFilter);
72}
73
74void AliAnalysisTaskESDfilter::Init()
75{
76 // Initialization
77 if (fDebug > 1) AliInfo("Init() \n");
78 // Call configuration file
79}
80
81
82void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
83{
84// Execute analysis for current event
85//
86
87 Long64_t ientry = Entry();
2827d046 88 if (fDebug > 0) printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
d7bdc804 89 if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
90 if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
96b85d73 91 ConvertESDtoAOD();
92}
93
94void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
95 // ESD Filter analysis task executed for each event
96 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
97 AliESD* old = esd->GetAliESDOld();
98
99 // set arrays and pointers
100 Float_t posF[3];
101 Double_t pos[3];
102 Double_t p[3];
103 Double_t p_pos[3];
104 Double_t p_neg[3];
8d69965b 105 Double_t p_pos_atv0[3];
106 Double_t p_neg_atv0[3];
96b85d73 107 Double_t covVtx[6];
108 Double_t covTr[21];
109 Double_t pid[10];
110
111 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
112 for (Int_t i = 0; i < 21; i++) covTr [i] = 0.;
113
114
115 // loop over events and fill them
116
117 // Multiplicity information needed by the header (to be revised!)
118 Int_t nTracks = esd->GetNumberOfTracks();
8d69965b 119 // if (fDebug > 0) printf("-------------------Bo: Number of ESD tracks %d \n",nTracks);
120
96b85d73 121 Int_t nPosTracks = 0;
3e492e99 122// for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack)
123// if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
96b85d73 124
125 // Update the header
126
127 AliAODHeader* header = AODEvent()->GetHeader();
128 header->SetRunNumber(esd->GetRunNumber());
129 if (old) {
130 header->SetBunchCrossNumber(0);
131 header->SetOrbitNumber(0);
132 header->SetPeriodNumber(0);
133 header->SetEventType(0);
134 header->SetMuonMagFieldScale(-999.); // FIXME
135 header->SetCentrality(-999.); // FIXME
136 } else {
137 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
138 header->SetOrbitNumber(esd->GetOrbitNumber());
139 header->SetPeriodNumber(esd->GetPeriodNumber());
140 header->SetEventType(esd->GetEventType());
141 header->SetMuonMagFieldScale(-999.); // FIXME
142 header->SetCentrality(-999.); // FIXME
143 }
144
145 header->SetTriggerMask(esd->GetTriggerMask());
146 header->SetTriggerCluster(esd->GetTriggerCluster());
147 header->SetMagneticField(esd->GetMagneticField());
148 header->SetZDCN1Energy(esd->GetZDCN1Energy());
149 header->SetZDCP1Energy(esd->GetZDCP1Energy());
150 header->SetZDCN2Energy(esd->GetZDCN2Energy());
151 header->SetZDCP2Energy(esd->GetZDCP2Energy());
152 header->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
96b85d73 153//
154//
155 Int_t nV0s = esd->GetNumberOfV0s();
156 Int_t nCascades = esd->GetNumberOfCascades();
157 Int_t nKinks = esd->GetNumberOfKinks();
158 Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;
159 Int_t nJets = 0;
160 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
161 Int_t nFmdClus = 0;
162 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
163
2827d046 164 if (fDebug > 0)
165 printf(" NV0=%d NCASCADES=%d NKINKS=%d\n", nV0s, nCascades, nKinks);
96b85d73 166
167 AODEvent()->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
168
169 AliAODTrack *aodTrack = 0x0;
d7bdc804 170 AliAODPid *detpid = 0x0;
171 Double_t timezero = 0; //TO BE FIXED
7dd90a3c 172 AliAODv0 *aodV0 = 0x0;
173
8d69965b 174 // RefArray to take into account the tracks associated to V0s
175 TRefArray *v0DaughterTracks = NULL;
176 if (nTracks>0) v0DaughterTracks = new TRefArray(nTracks);
177
96b85d73 178 // Array to take into account the tracks already added to the AOD
179 Bool_t * usedTrack = NULL;
180 if (nTracks>0) {
181 usedTrack = new Bool_t[nTracks];
182 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
183 }
184 // Array to take into account the V0s already added to the AOD
185 Bool_t * usedV0 = NULL;
186 if (nV0s>0) {
187 usedV0 = new Bool_t[nV0s];
188 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
189 }
190 // Array to take into account the kinks already added to the AOD
191 Bool_t * usedKink = NULL;
192 if (nKinks>0) {
193 usedKink = new Bool_t[nKinks];
194 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
195 }
196
197 // Access to the AOD container of vertices
198 TClonesArray &vertices = *(AODEvent()->GetVertices());
199 Int_t jVertices=0;
200
201 // Access to the AOD container of tracks
202 TClonesArray &tracks = *(AODEvent()->GetTracks());
203 Int_t jTracks=0;
204
205 // Access to the AOD container of V0s
206 TClonesArray &V0s = *(AODEvent()->GetV0s());
207 Int_t jV0s=0;
208
209 // Add primary vertex. The primary tracks will be defined
210 // after the loops on the composite objects (V0, cascades, kinks)
211 const AliESDVertex *vtx = esd->GetPrimaryVertex();
212
213 vtx->GetXYZ(pos); // position
214 vtx->GetCovMatrix(covVtx); //covariance matrix
215
216 AliAODVertex * primary = new(vertices[jVertices++])
c06d243f 217 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
2827d046 218 if (fDebug > 0) primary->Print();
96b85d73 219
220 // Create vertices starting from the most complex objects
221 Double_t chi2 = 0.;
222
223 // Cascades
224 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
225 AliESDcascade *cascade = esd->GetCascade(nCascade);
226
227 cascade->GetXYZ(pos[0], pos[1], pos[2]);
228
229 if (!old) {
230 chi2 = cascade->GetChi2Xi(); // = chi2/NDF since NDF = 2*2-3
231 cascade->GetPosCovXi(covVtx);
232 } else {
233 chi2 = -999.;
234 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
235 }
236 // Add the cascade vertex
237 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
238 covVtx,
239 chi2,
240 primary,
241 nCascade,
242 AliAODVertex::kCascade);
243
244 primary->AddDaughter(vcascade);
245
246 // Add the V0 from the cascade. The ESD class have to be optimized...
247 // Now we have to search for the corresponding Vo in the list of V0s
248 // using the indeces of the positive and negative tracks
249
250 Int_t posFromV0 = cascade->GetPindex();
251 Int_t negFromV0 = cascade->GetNindex();
252
253
254 AliESDv0 * v0 = 0x0;
255 Int_t indV0 = -1;
256
257 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
258
259 v0 = esd->GetV0(iV0);
260 Int_t posV0 = v0->GetPindex();
261 Int_t negV0 = v0->GetNindex();
262
263 if (posV0==posFromV0 && negV0==negFromV0) {
264 indV0 = iV0;
265 break;
266 }
267 }
268
269 AliAODVertex * vV0FromCascade = 0x0;
270
271 if (indV0>-1 && !usedV0[indV0] ) {
272
273 // the V0 exists in the array of V0s and is not used
274
275 usedV0[indV0] = kTRUE;
276
277 v0->GetXYZ(pos[0], pos[1], pos[2]);
278 if (!old) {
279 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
280 v0->GetPosCov(covVtx);
281 } else {
282 chi2 = -999.;
283 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
284 }
285
286 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
287 covVtx,
288 chi2,
289 vcascade,
290 indV0,
291 AliAODVertex::kV0);
292 } else {
293
294 // the V0 doesn't exist in the array of V0s or was used
295// cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
296// << " The V0 " << indV0
297// << " doesn't exist in the array of V0s or was used!" << endl;
298
299 cascade->GetXYZ(pos[0], pos[1], pos[2]);
300
301 if (!old) {
302 chi2 = v0->GetChi2V0();
303 cascade->GetPosCov(covVtx);
304 } else {
305 chi2 = -999.;
306 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
307 }
308
309 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
310 covVtx,
311 chi2, // = chi2/NDF since NDF = 2*2-3 (AM)
312 vcascade,
313 indV0,
314 AliAODVertex::kV0);
315 vcascade->AddDaughter(vV0FromCascade);
316 }
317
318 // Add the positive tracks from the V0
319
320 if (posFromV0>-1 && !usedTrack[posFromV0]) {
321
322 usedTrack[posFromV0] = kTRUE;
323
324 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
325 esdTrack->GetPxPyPz(p_pos);
326 esdTrack->GetXYZ(pos);
327 esdTrack->GetCovarianceXYZPxPyPz(covTr);
328 esdTrack->GetESDpid(pid);
fae68d32 329 UInt_t selectInfo = 0;
330 if (fTrackFilter) {
331 selectInfo = fTrackFilter->IsSelected(esdTrack);
332 }
96b85d73 333
334 vV0FromCascade->AddDaughter(aodTrack =
335 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
336 esdTrack->GetLabel(),
337 p_pos,
338 kTRUE,
339 pos,
340 kFALSE,
341 covTr,
342 (Short_t)esdTrack->GetSign(),
343 esdTrack->GetITSClusterMap(),
344 pid,
345 vV0FromCascade,
346 kTRUE, // check if this is right
347 kFALSE, // check if this is right
3de26c63 348 AliAODTrack::kSecondary,
349 selectInfo)
350 );
3e492e99 351 if (esdTrack->GetSign() > 0) nPosTracks++;
96b85d73 352 aodTrack->ConvertAliPIDtoAODPID();
4fcd837c 353 aodTrack->SetFlags(esdTrack->GetStatus());
d7bdc804 354 SetAODPID(esdTrack,aodTrack,detpid,timezero);
96b85d73 355 }
356 else {
357// cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
358// << " track " << posFromV0 << " has already been used!" << endl;
359 }
360
361 // Add the negative tracks from the V0
362
363 if (negFromV0>-1 && !usedTrack[negFromV0]) {
364
365 usedTrack[negFromV0] = kTRUE;
366
367 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
368 esdTrack->GetPxPyPz(p_neg);
369 esdTrack->GetXYZ(pos);
370 esdTrack->GetCovarianceXYZPxPyPz(covTr);
371 esdTrack->GetESDpid(pid);
fae68d32 372 UInt_t selectInfo = 0;
373 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);
3de26c63 374
96b85d73 375 vV0FromCascade->AddDaughter(aodTrack =
376 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
377 esdTrack->GetLabel(),
378 p_neg,
379 kTRUE,
380 pos,
381 kFALSE,
382 covTr,
383 (Short_t)esdTrack->GetSign(),
384 esdTrack->GetITSClusterMap(),
385 pid,
386 vV0FromCascade,
387 kTRUE, // check if this is right
388 kFALSE, // check if this is right
3de26c63 389 AliAODTrack::kSecondary,
390 selectInfo)
391 );
392
3e492e99 393 if (esdTrack->GetSign() > 0) nPosTracks++;
96b85d73 394 aodTrack->ConvertAliPIDtoAODPID();
4fcd837c 395 aodTrack->SetFlags(esdTrack->GetStatus());
d7bdc804 396 SetAODPID(esdTrack,aodTrack,detpid,timezero);
96b85d73 397 }
398 else {
399// cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
400// << " track " << negFromV0 << " has already been used!" << endl;
401 }
402
403 // add it to the V0 array as well
404 Double_t d0[2] = { -999., -99.};
405 // counting is probably wrong
406 new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
407
408 // Add the bachelor track from the cascade
409
410 Int_t bachelor = cascade->GetBindex();
411
412 if(bachelor>-1 && !usedTrack[bachelor]) {
413
414 usedTrack[bachelor] = kTRUE;
415
416 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
417 esdTrack->GetPxPyPz(p);
418 esdTrack->GetXYZ(pos);
419 esdTrack->GetCovarianceXYZPxPyPz(covTr);
420 esdTrack->GetESDpid(pid);
fae68d32 421 UInt_t selectInfo = 0;
422 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);
96b85d73 423
424 vcascade->AddDaughter(aodTrack =
425 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
426 esdTrack->GetLabel(),
427 p,
428 kTRUE,
429 pos,
430 kFALSE,
431 covTr,
432 (Short_t)esdTrack->GetSign(),
433 esdTrack->GetITSClusterMap(),
434 pid,
435 vcascade,
436 kTRUE, // check if this is right
437 kFALSE, // check if this is right
3de26c63 438 AliAODTrack::kSecondary,
439 selectInfo)
440 );
3e492e99 441 if (esdTrack->GetSign() > 0) nPosTracks++;
96b85d73 442 aodTrack->ConvertAliPIDtoAODPID();
4fcd837c 443 aodTrack->SetFlags(esdTrack->GetStatus());
d7bdc804 444 SetAODPID(esdTrack,aodTrack,detpid,timezero);
96b85d73 445 }
446 else {
447// cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
448// << " track " << bachelor << " has already been used!" << endl;
449 }
450
451 // Add the primary track of the cascade (if any)
452
453 } // end of the loop on cascades
ec6465fe 454
455 //
96b85d73 456 // V0s
ec6465fe 457 //
458 TList v0objects;
96b85d73 459
460 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
461
7dd90a3c 462 if (usedV0[nV0]) continue; // skip if already added to the AOD
96b85d73 463
464 AliESDv0 *v0 = esd->GetV0(nV0);
ec6465fe 465 Int_t posFromV0 = v0->GetPindex();
466 Int_t negFromV0 = v0->GetNindex();
467 if (posFromV0 < 0 || negFromV0 < 0) continue;
468
469 // V0 selection
470 //
471 AliESDVertex* esdVtx = (AliESDVertex*)((esd->GetPrimaryVertex())->Clone());
96b85d73 472
ec6465fe 473 AliESDtrack *esdV0Pos = esd->GetTrack(posFromV0);
474 AliESDtrack *esdV0Neg = esd->GetTrack(negFromV0);
475 v0objects.AddAt(v0, 0);
476 v0objects.AddAt(esdV0Pos, 1);
477 v0objects.AddAt(esdV0Neg, 2);
478 v0objects.AddAt(esdVtx, 3);
479 UInt_t selectV0 = 0;
480 if (fV0Filter) {
481 selectV0 = fV0Filter->IsSelected(&v0objects);
482 delete esdVtx;
483 if (!selectV0)
484 continue;
485 }
486
487 //
488 //
489
96b85d73 490 v0->GetXYZ(pos[0], pos[1], pos[2]);
491
492 if (!old) {
493 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
494 v0->GetPosCov(covVtx);
495 } else {
496 chi2 = -999.;
497 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
498 }
499
500
501 AliAODVertex * vV0 =
502 new(vertices[jVertices++]) AliAODVertex(pos,
503 covVtx,
504 chi2,
505 primary,
506 nV0,
507 AliAODVertex::kV0);
508 primary->AddDaughter(vV0);
509
7dd90a3c 510
511 Float_t dcaPosToPrimVertexXYZ[2] = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
512 Float_t dcaNegToPrimVertexXYZ[2] = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
513 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = Pos and ..[1] = Neg
96b85d73 514
7dd90a3c 515 Double_t dcaV0Daughters = v0->GetDcaV0Daughters();
516 Double_t dcaV0ToPrimVertex = v0->GetD();
517
8d69965b 518 v0->GetPPxPyPz(p_pos_atv0[0],p_pos_atv0[1],p_pos_atv0[2]);
519 v0->GetNPxPyPz(p_neg_atv0[0],p_neg_atv0[1],p_neg_atv0[2]);
7dd90a3c 520
96b85d73 521 // Add the positive tracks from the V0
522
ec6465fe 523
524 esdV0Pos->GetPxPyPz(p_pos);
525 esdV0Pos->GetXYZ(pos);
526 esdV0Pos->GetCovarianceXYZPxPyPz(covTr);
527 esdV0Pos->GetESDpid(pid);
528 esdV0Pos->GetImpactParameters(dcaPosToPrimVertexXYZ[0],dcaPosToPrimVertexXYZ[1]);
529 if (!usedTrack[posFromV0]) {
96b85d73 530 usedTrack[posFromV0] = kTRUE;
fae68d32 531 UInt_t selectInfo = 0;
ec6465fe 532 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);
533 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Pos->GetID(),
534 esdV0Pos->GetLabel(),
8d69965b 535 p_pos,
536 kTRUE,
537 pos,
538 kFALSE,
539 covTr,
ec6465fe 540 (Short_t)esdV0Pos->GetSign(),
541 esdV0Pos->GetITSClusterMap(),
8d69965b 542 pid,
543 vV0,
544 kTRUE, // check if this is right
545 kFALSE, // check if this is right
3de26c63 546 AliAODTrack::kSecondary,
547 selectInfo);
8d69965b 548 v0DaughterTracks->AddAt(aodTrack,posFromV0);
549 // if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());
ec6465fe 550 if (esdV0Pos->GetSign() > 0) nPosTracks++;
96b85d73 551 aodTrack->ConvertAliPIDtoAODPID();
ec6465fe 552 aodTrack->SetFlags(esdV0Pos->GetStatus());
553 SetAODPID(esdV0Pos,aodTrack,detpid,timezero);
554 }
555 else {
8d69965b 556 aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(posFromV0));
557 // if (fDebug > 0) printf("-------------------Bo pos track from refArray pt %.3f \n",aodTrack->Pt());
96b85d73 558 }
ec6465fe 559 vV0->AddDaughter(aodTrack);
560
96b85d73 561 // Add the negative tracks from the V0
562
ec6465fe 563 esdV0Neg->GetPxPyPz(p_neg);
564 esdV0Neg->GetXYZ(pos);
565 esdV0Neg->GetCovarianceXYZPxPyPz(covTr);
566 esdV0Neg->GetESDpid(pid);
567 esdV0Neg->GetImpactParameters(dcaNegToPrimVertexXYZ[0],dcaNegToPrimVertexXYZ[1]);
568
569 if (!usedTrack[negFromV0]) {
96b85d73 570 usedTrack[negFromV0] = kTRUE;
fae68d32 571 UInt_t selectInfo = 0;
ec6465fe 572 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);
573 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Neg->GetID(),
574 esdV0Neg->GetLabel(),
8d69965b 575 p_neg,
576 kTRUE,
577 pos,
578 kFALSE,
579 covTr,
ec6465fe 580 (Short_t)esdV0Neg->GetSign(),
581 esdV0Neg->GetITSClusterMap(),
8d69965b 582 pid,
583 vV0,
584 kTRUE, // check if this is right
585 kFALSE, // check if this is right
3de26c63 586 AliAODTrack::kSecondary,
587 selectInfo);
ec6465fe 588
8d69965b 589 v0DaughterTracks->AddAt(aodTrack,negFromV0);
590 // if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());
ec6465fe 591 if (esdV0Neg->GetSign() > 0) nPosTracks++;
96b85d73 592 aodTrack->ConvertAliPIDtoAODPID();
ec6465fe 593 aodTrack->SetFlags(esdV0Neg->GetStatus());
594 SetAODPID(esdV0Neg,aodTrack,detpid,timezero);
595 }
596 else {
8d69965b 597 aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(negFromV0));
598 // if (fDebug > 0) printf("-------------------Bo neg track from refArray pt %.3f \n",aodTrack->Pt());
96b85d73 599 }
ec6465fe 600 vV0->AddDaughter(aodTrack);
601 dcaDaughterToPrimVertex[0] =
602 TMath::Sqrt(dcaPosToPrimVertexXYZ[0]*dcaPosToPrimVertexXYZ[0]
603 +dcaPosToPrimVertexXYZ[1]*dcaPosToPrimVertexXYZ[1]);
7dd90a3c 604 dcaDaughterToPrimVertex[1] =
ec6465fe 605 TMath::Sqrt(dcaNegToPrimVertexXYZ[0]*dcaNegToPrimVertexXYZ[0]
606 +dcaNegToPrimVertexXYZ[1]*dcaNegToPrimVertexXYZ[1]);
96b85d73 607 // add it to the V0 array as well
7dd90a3c 608 aodV0 = new(V0s[jV0s++])
ec6465fe 609 AliAODv0(vV0, dcaV0Daughters, dcaV0ToPrimVertex, p_pos_atv0, p_neg_atv0, dcaDaughterToPrimVertex); // to be refined
7dd90a3c 610 // set the aod v0 on-the-fly status
611 aodV0->SetOnFlyStatus(v0->GetOnFlyStatus());
96b85d73 612 }
613 V0s.Expand(jV0s);
614 // end of the loop on V0s
615
616 // Kinks: it is a big mess the access to the information in the kinks
617 // The loop is on the tracks in order to find the mother and daugther of each kink
618
619
620 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
621
622 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
623
624 Int_t ikink = esdTrack->GetKinkIndex(0);
625
626 if (ikink && nKinks) {
627 // Negative kink index: mother, positive: daughter
628
629 // Search for the second track of the kink
630
631 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
632
633 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
634
635 Int_t jkink = esdTrack1->GetKinkIndex(0);
636
637 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
638
639 // The two tracks are from the same kink
640
641 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
642
643 Int_t imother = -1;
644 Int_t idaughter = -1;
645
646 if (ikink<0 && jkink>0) {
647
648 imother = iTrack;
649 idaughter = jTrack;
650 }
651 else if (ikink>0 && jkink<0) {
652
653 imother = jTrack;
654 idaughter = iTrack;
655 }
656 else {
657// cerr << "Error: Wrong combination of kink indexes: "
658// << ikink << " " << jkink << endl;
659 continue;
660 }
661
5dddb02b 662 // Add the mother track if it passed primary track selection cuts
96b85d73 663
664 AliAODTrack * mother = NULL;
665
fae68d32 666 UInt_t selectInfo = 0;
667 if (fTrackFilter) {
668 selectInfo = fTrackFilter->IsSelected(esd->GetTrack(imother));
669 if (!selectInfo) continue;
670 }
5dddb02b 671
96b85d73 672 if (!usedTrack[imother]) {
673
674 usedTrack[imother] = kTRUE;
675
03a5cc9f 676 AliESDtrack *esdTrackM = esd->GetTrack(imother);
677 esdTrackM->GetPxPyPz(p);
678 esdTrackM->GetXYZ(pos);
679 esdTrackM->GetCovarianceXYZPxPyPz(covTr);
680 esdTrackM->GetESDpid(pid);
5dddb02b 681
96b85d73 682 mother =
03a5cc9f 683 new(tracks[jTracks++]) AliAODTrack(esdTrackM->GetID(),
684 esdTrackM->GetLabel(),
96b85d73 685 p,
686 kTRUE,
687 pos,
688 kFALSE,
689 covTr,
03a5cc9f 690 (Short_t)esdTrackM->GetSign(),
691 esdTrackM->GetITSClusterMap(),
96b85d73 692 pid,
693 primary,
694 kTRUE, // check if this is right
695 kTRUE, // check if this is right
3de26c63 696 AliAODTrack::kPrimary,
697 selectInfo);
03a5cc9f 698 if (esdTrackM->GetSign() > 0) nPosTracks++;
699 mother->SetFlags(esdTrackM->GetStatus());
635ef56c 700 mother->ConvertAliPIDtoAODPID();
96b85d73 701 primary->AddDaughter(mother);
702 mother->ConvertAliPIDtoAODPID();
d7bdc804 703 SetAODPID(esdTrackM,mother,detpid,timezero);
96b85d73 704 }
705 else {
706// cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
707// << " track " << imother << " has already been used!" << endl;
708 }
709
710 // Add the kink vertex
711 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
712
713 AliAODVertex * vkink =
714 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
715 NULL,
716 0.,
717 mother,
718 esdTrack->GetID(), // This is the track ID of the mother's track!
719 AliAODVertex::kKink);
720 // Add the daughter track
721
722 AliAODTrack * daughter = NULL;
723
724 if (!usedTrack[idaughter]) {
725
726 usedTrack[idaughter] = kTRUE;
727
03a5cc9f 728 AliESDtrack *esdTrackD = esd->GetTrack(idaughter);
729 esdTrackD->GetPxPyPz(p);
730 esdTrackD->GetXYZ(pos);
731 esdTrackD->GetCovarianceXYZPxPyPz(covTr);
732 esdTrackD->GetESDpid(pid);
fae68d32 733 UInt_t selectInfo = 0;
734 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);
96b85d73 735 daughter =
03a5cc9f 736 new(tracks[jTracks++]) AliAODTrack(esdTrackD->GetID(),
737 esdTrackD->GetLabel(),
96b85d73 738 p,
739 kTRUE,
740 pos,
741 kFALSE,
742 covTr,
03a5cc9f 743 (Short_t)esdTrackD->GetSign(),
744 esdTrackD->GetITSClusterMap(),
96b85d73 745 pid,
746 vkink,
747 kTRUE, // check if this is right
748 kTRUE, // check if this is right
3de26c63 749 AliAODTrack::kSecondary,
750 selectInfo);
751
03a5cc9f 752 if (esdTrackD->GetSign() > 0) nPosTracks++;
753 daughter->SetFlags(esdTrackD->GetStatus());
635ef56c 754 daughter->ConvertAliPIDtoAODPID();
96b85d73 755 vkink->AddDaughter(daughter);
756 daughter->ConvertAliPIDtoAODPID();
d7bdc804 757 SetAODPID(esdTrackD,daughter,detpid,timezero);
96b85d73 758 }
759 else {
760// cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
761// << " track " << idaughter << " has already been used!" << endl;
762 }
763 }
764 }
765 }
766 }
767
768
769 // Tracks (primary and orphan)
770
3e492e99 771 if (fDebug > 0) printf("NUMBER OF ESD TRACKS %5d\n", nTracks);
96b85d73 772
773 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
774
775
776 if (usedTrack[nTrack]) continue;
777
778 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
779 UInt_t selectInfo = 0;
780 //
781 // Track selection
782 if (fTrackFilter) {
783 selectInfo = fTrackFilter->IsSelected(esdTrack);
784 if (!selectInfo) continue;
785 }
786
787 //
788 esdTrack->GetPxPyPz(p);
789 esdTrack->GetXYZ(pos);
790 esdTrack->GetCovarianceXYZPxPyPz(covTr);
791 esdTrack->GetESDpid(pid);
792
96b85d73 793
fae68d32 794 primary->AddDaughter(aodTrack =
795 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
796 esdTrack->GetLabel(),
797 p,
798 kTRUE,
799 pos,
800 kFALSE,
801 covTr,
802 (Short_t)esdTrack->GetSign(),
803 esdTrack->GetITSClusterMap(),
804 pid,
805 primary,
806 kTRUE, // check if this is right
807 kTRUE, // check if this is right
808 AliAODTrack::kPrimary,
809 selectInfo)
810 );
811 if (esdTrack->GetSign() > 0) nPosTracks++;
812 aodTrack->SetFlags(esdTrack->GetStatus());
813 aodTrack->ConvertAliPIDtoAODPID();
814 SetAODPID(esdTrack,aodTrack,detpid,timezero);
96b85d73 815 } // end of loop on tracks
816
3e492e99 817 // Update number of AOD tracks in header at the end of track loop (M.G.)
818 header->SetRefMultiplicity(jTracks);
819 header->SetRefMultiplicityPos(nPosTracks);
820 header->SetRefMultiplicityNeg(jTracks - nPosTracks);
821 if (fDebug > 0)
822 printf(" NAODTRACKS=%d NPOS=%d NNEG=%d\n", jTracks, nPosTracks, jTracks - nPosTracks);
823 // Do not shrink the array of tracks - other filters may add to it (M.G)
824// tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
96b85d73 825
826 // Access to the AOD container of PMD clusters
827 TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
828 Int_t jPmdClusters=0;
829
830 for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
831 // file pmd clusters, to be revised!
832 AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
833 Int_t nLabel = 0;
834 Int_t *label = 0x0;
03a5cc9f 835 Double_t posPmd[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ()};
836 Double_t pidPmd[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
96b85d73 837 // type not set!
838 // assoc cluster not set
03a5cc9f 839 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), posPmd, pidPmd);
96b85d73 840 }
841
842 // Access to the AOD container of clusters
843 TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
844 Int_t jClusters=0;
845
846 for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
847
848 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
849
e6500713 850 Int_t id = cluster->GetID();
851 Int_t nLabel = cluster->GetNLabels();
852 TArrayI* labels = cluster->GetLabels();
853 Int_t *label = 0;
854 if (labels) label = (cluster->GetLabels())->GetArray();
855
96b85d73 856 Float_t energy = cluster->E();
857 cluster->GetPosition(posF);
e6500713 858 Char_t ttype = AliAODCluster::kUndef;
96b85d73 859
860 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
861 ttype=AliAODCluster::kPHOSNeutral;
862 }
863 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
864 ttype = AliAODCluster::kEMCALClusterv1;
865 }
866
867
868 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
869 nLabel,
870 label,
871 energy,
636555d2 872 posF,
96b85d73 873 NULL,
874 ttype);
875
e6500713 876 caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
877 cluster->GetClusterDisp(),
78902954 878 cluster->GetM20(), cluster->GetM02(),
879 cluster->GetEmcCpvDistance(),
880 cluster->GetNExMax(),cluster->GetTOF()) ;
e6500713 881
3cbe9a4d 882 caloCluster->SetPIDFromESD(cluster->GetPid());
e6500713 883 caloCluster->SetNCells(cluster->GetNCells());
884 caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
885 caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
78902954 886
887 TArrayI* matchedT = cluster->GetTracksMatched();
cb234979 888 if (matchedT && cluster->GetTrackMatched() >= 0) {
78902954 889 for (Int_t im = 0; im < matchedT->GetSize(); im++) {
890 caloCluster->AddTrackMatched((esd->GetTrack(im)));
891 }
892 }
893
96b85d73 894 }
895 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
896 // end of loop on calo clusters
897
898 // fill EMCAL cell info
899 if (esd->GetEMCALCells()) { // protection against missing ESD information
900 AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
901 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
902
903 AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
904 aodEMcells.CreateContainer(nEMcell);
905 aodEMcells.SetType(AliAODCaloCells::kEMCAL);
906 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
907 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
908 }
909 aodEMcells.Sort();
910 }
911
912 // fill PHOS cell info
913 if (esd->GetPHOSCells()) { // protection against missing ESD information
914 AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
915 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
916
917 AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
918 aodPHcells.CreateContainer(nPHcell);
919 aodPHcells.SetType(AliAODCaloCells::kPHOS);
920 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
921 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
922 }
923 aodPHcells.Sort();
924 }
925
926 // tracklets
927 AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
928 const AliMultiplicity *mult = esd->GetMultiplicity();
929 if (mult) {
930 if (mult->GetNumberOfTracklets()>0) {
931 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
932
933 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
0939e22a 934 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0), mult->GetLabel(n, 1));
96b85d73 935 }
936 }
937 } else {
938 //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
939 }
940
941 delete [] usedTrack;
942 delete [] usedV0;
943 delete [] usedKink;
8d69965b 944 delete v0DaughterTracks;
96b85d73 945
946 return;
947}
948
d7bdc804 949void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid, Double_t timezero)
950{
951 //
952 // Setter for the raw PID detector signals
953 //
954
955 if(esdtrack->Pt()>fHighPthreshold) {
956 detpid = new AliAODPid();
373fc041 957 SetDetectorRawSignals(detpid,esdtrack,timezero);
d7bdc804 958 aodtrack->SetDetPID(detpid);
959 } else {
960 if(fPtshape){
961 if(esdtrack->Pt()> fPtshape->GetXmin()){
962 Double_t y = fPtshape->Eval(esdtrack->Pt())/fPtshape->Eval(fHighPthreshold);
963 if(gRandom->Rndm(0)<1./y){
964 detpid = new AliAODPid();
373fc041 965 SetDetectorRawSignals(detpid,esdtrack,timezero);
d7bdc804 966 aodtrack->SetDetPID(detpid);
967 }//end rndm
968 }//end if p < pmin
969 }//end if p function
970 }// end else
971}
972
373fc041 973void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtrack *track, Double_t timezero)
974{
975//
976//assignment of the detector signals (AliXXXesdPID inspired)
977//
978 if(!track){
979 AliInfo("no ESD track found. .....exiting");
980 return;
981 }
982
983 aodpid->SetITSsignal(track->GetITSsignal());
984 aodpid->SetTPCsignal(track->GetTPCsignal());
985 //n TRD planes = 6
986
987 Int_t nslices = track->GetNumberOfTRDslices()*6;
988 Double_t *trdslices = new Double_t[nslices];
989 for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) {
990 for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);
991 }
d7bdc804 992
373fc041 993
994 aodpid->SetTRDsignal(track->GetNumberOfTRDslices()*6,trdslices);
995 Double_t times[AliAODPid::kSPECIES]; track->GetIntegratedTimes(times);
996 aodpid->SetIntegratedTimes(times);
997
998 aodpid->SetTOFsignal(track->GetTOFsignal()-timezero); // to be fixed
999 aodpid->SetHMPIDsignal(track->GetHMPIDsignal());
1000
1001}
96b85d73 1002void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
1003{
1004// Terminate analysis
1005//
1006 if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");
1007}
1008