]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/AOD/AliAnalysisTaskPWG2ESDfilter.cxx
Adding the PWG2 AOD code
[u/mrichter/AliRoot.git] / PWG2 / AOD / AliAnalysisTaskPWG2ESDfilter.cxx
CommitLineData
7f2a4d8b 1//-------------------------------------------------------------------------
2// Task for the Analysis Framework
3// Creates a PWG2 specific AOD, from the ESD adding information required
4// for PWG2 analysis.
5// - Puts the per-track information into the AliPWG2AODTrack container,
6// together with the link to the original AliAODTrack
7//
8// Author: Adam Kisiel, OSU, Adam.Kisiel@cern.ch
9//-------------------------------------------------------------------------
10#include <TChain.h>
11#include <TFile.h>
12#include <TList.h>
13
14#include "AliAnalysisTaskPWG2ESDfilter.h"
15#include "AliAnalysisManager.h"
16#include "AliESDEvent.h"
17#include "AliAODEvent.h"
18#include "AliESDInputHandler.h"
19#include "AliAODHandler.h"
20#include "AliAnalysisFilter.h"
21#include "AliESDtrack.h"
22#include "AliESDMuonTrack.h"
23#include "AliESDVertex.h"
24#include "AliESDv0.h"
25#include "AliESDkink.h"
26#include "AliESDcascade.h"
27#include "AliLog.h"
28#include "AliPWG2AODTrack.h"
29
30ClassImp(AliAnalysisTaskPWG2ESDfilter)
31
32////////////////////////////////////////////////////////////////////////
33
34AliAnalysisTaskPWG2ESDfilter::AliAnalysisTaskPWG2ESDfilter():
35 fDebug(0),
36 fTree(0x0),
37 fESD(0x0),
38 fAOD(0x0),
39 fTreeA(0x0),
40 fTrackFilter(0x0),
41 fKinkFilter(0x0),
42 fV0Filter(0x0),
43 fPWG2AODTracks(0x0)
44{
45 // Default constructor
46}
47
48AliAnalysisTaskPWG2ESDfilter::AliAnalysisTaskPWG2ESDfilter(const char* name):
49 AliAnalysisTask(name, "AnalysisTaskESDfilter"),
50 fDebug(0),
51 fTree(0x0),
52 fESD(0x0),
53 fAOD(0x0),
54 fTreeA(0x0),
55 fTrackFilter(0x0),
56 fKinkFilter(0x0),
57 fV0Filter(0x0),
58 fPWG2AODTracks(0x0)
59{
60 // Default constructor
61 DefineInput (0, TChain::Class());
62 DefineOutput(0, TTree::Class());
63}
64
65void AliAnalysisTaskPWG2ESDfilter::CreateOutputObjects()
66{
67// Create the output container
68 if (fDebug > 1) AliInfo("CreateOutPutData() \n");
69 AliAODHandler* handler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
70
71 fAOD = handler->GetAOD();
72 fTreeA = handler->GetTree();
73 fTreeA->GetUserInfo()->Add(fTrackFilter);
74
75 // *** PWG2 specific ***
76
77 fPWG2AODTracks = new TClonesArray("AliPWG2AODTrack", 0);
78 const char *name = "pwg2aodtracks";
79 fPWG2AODTracks->SetName(name);
80
81 fAOD->AddObject(fPWG2AODTracks);
82
83 TBranch *newBranch = fTreeA->Branch(name, &fPWG2AODTracks);
84 fTreeA->GetUserInfo()->Add(fPWG2AODTracks);
85
86 // --- END PWG2 specific ---
87}
88
89void AliAnalysisTaskPWG2ESDfilter::Init()
90{
91 // Initialization
92 if (fDebug > 1) AliInfo("Init() \n");
93 // Call configuration file
94}
95
96void AliAnalysisTaskPWG2ESDfilter::ConnectInputData(Option_t */*option*/)
97{
98// Connect the input data
99//
100 if (fDebug > 1) AliInfo("ConnectInputData() \n");
101 // Input
102 AliESDInputHandler* esdH = (AliESDInputHandler*)
103 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
104 fESD = (AliESDEvent*) esdH->GetEvent();
105 fTree = esdH->GetTree();
106}
107
108void AliAnalysisTaskPWG2ESDfilter::Exec(Option_t */*option*/)
109{
110// Execute analysis for current event
111//
112 // ESD Filter analysis task executed for each event
113 AliESD* old = fESD->GetAliESDOld();
114
115 Long64_t ientry = fTree->GetReadEntry();
116 printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
117
118 // set arrays and pointers
119 Double_t pos[3];
120 Double_t p[3];
121 Double_t covVtx[6];
122 Double_t covTr[21];
123 Double_t pid[10];
124
125 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
126 for (Int_t i = 0; i < 21; i++) covTr [i] = 0.;
127
128 // *** PWG2 specific ***
129
130 Double_t tpcentrancepoint[3];
131 Double_t tpcexitpoint[3];
132 TBits sharemap;
133 TBits clustermap;
134
135 for (Int_t i = 0; i < 3; i++) { tpcentrancepoint[i] = 0.; tpcexitpoint[i] = 0; }
136
137 // --- END PWG2 specific ---
138
139
140 // loop over events and fill them
141
142 // Multiplicity information needed by the header (to be revised!)
143 Int_t nTracks = fESD->GetNumberOfTracks();
144 Int_t nPosTracks = 0;
145 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack)
146 if (fESD->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
147
148 // Update the header
149
150 AliAODHeader* header = fAOD->GetHeader();
151 header->SetRunNumber(fESD->GetRunNumber());
152 if (old) {
153 header->SetBunchCrossNumber(0);
154 header->SetOrbitNumber(0);
155 header->SetPeriodNumber(0);
156 header->SetEventType(0);
157 header->SetMuonMagFieldScale(-999.);
158 header->SetCentrality(-999.);
159 } else {
160 header->SetBunchCrossNumber(fESD->GetBunchCrossNumber());
161 header->SetOrbitNumber(fESD->GetOrbitNumber());
162 header->SetPeriodNumber(fESD->GetPeriodNumber());
163 header->SetEventType(fESD->GetEventType());
164 header->SetMuonMagFieldScale(-999.);
165 header->SetCentrality(-999.);
166 }
167
168 header->SetTriggerMask(fESD->GetTriggerMask());
169 header->SetTriggerCluster(fESD->GetTriggerCluster());
170 header->SetMagneticField(fESD->GetMagneticField());
171 header->SetZDCN1Energy(fESD->GetZDCN1Energy());
172 header->SetZDCP1Energy(fESD->GetZDCP1Energy());
173 header->SetZDCN2Energy(fESD->GetZDCN2Energy());
174 header->SetZDCP2Energy(fESD->GetZDCP2Energy());
175 header->SetZDCEMEnergy(fESD->GetZDCEMEnergy(0),fESD->GetZDCEMEnergy(1));
176 header->SetRefMultiplicity(nTracks);
177 header->SetRefMultiplicityPos(nPosTracks);
178 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
179//
180//
181 Int_t nV0s = fESD->GetNumberOfV0s();
182 Int_t nCascades = fESD->GetNumberOfCascades();
183 Int_t nKinks = fESD->GetNumberOfKinks();
184 Int_t nVertices = nV0s + nCascades + nKinks + 1 /* = prim. vtx*/;
185 Int_t nJets = 0;
186 Int_t nCaloClus = fESD->GetNumberOfCaloClusters();
187 Int_t nFmdClus = 0;
188 Int_t nPmdClus = fESD->GetNumberOfPmdTracks();
189
190 printf(" NV0=%d NCASCADES=%d NKINKS=%d\n", nV0s, nCascades, nKinks);
191
192// fAOD->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
193
194 AliAODTrack *aodTrack;
195
196
197 // Array to take into account the tracks already added to the AOD
198 Bool_t * usedTrack = NULL;
199 if (nTracks>0) {
200 usedTrack = new Bool_t[nTracks];
201 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
202 }
203 // Array to take into account the V0s already added to the AOD
204 Bool_t * usedV0 = NULL;
205 if (nV0s>0) {
206 usedV0 = new Bool_t[nV0s];
207 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
208 }
209 // Array to take into account the kinks already added to the AOD
210 Bool_t * usedKink = NULL;
211 if (nKinks>0) {
212 usedKink = new Bool_t[nKinks];
213 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
214 }
215
216 // Access to the AOD container of vertices
217 TClonesArray &vertices = *(fAOD->GetVertices());
218 Int_t jVertices=0;
219
220 // Access to the AOD container of tracks
221 TClonesArray &tracks = *(fAOD->GetTracks());
222 Int_t jTracks=0;
223 Int_t pTracks=0;
224
225 // Add primary vertex. The primary tracks will be defined
226 // after the loops on the composite objects (V0, cascades, kinks)
227 const AliESDVertex *vtx = fESD->GetPrimaryVertex();
228
229 vtx->GetXYZ(pos); // position
230 vtx->GetCovMatrix(covVtx); //covariance matrix
231
232 AliAODVertex * primary = new(vertices[jVertices++])
233 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, AliAODVertex::kPrimary);
234 primary->Print();
235
236
237 // Create vertices starting from the most complex objects
238 Double_t chi2 = 0.;
239
240 // Cascades
241 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
242 AliESDcascade *cascade = fESD->GetCascade(nCascade);
243
244 cascade->GetXYZ(pos[0], pos[1], pos[2]);
245
246 if (!old) {
247 chi2 = vtx->GetChi2toNDF();
248 cascade->GetPosCovXi(covVtx);
249 } else {
250 chi2 = -999.;
251 }
252 // Add the cascade vertex
253 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
254 covVtx,
255 chi2, // = chi2/NDF since NDF = 2*2-3 (AM)
256 primary,
257 AliAODVertex::kCascade);
258
259 primary->AddDaughter(vcascade);
260
261 // Add the V0 from the cascade. The ESD class have to be optimized...
262 // Now we have to search for the corresponding Vo in the list of V0s
263 // using the indeces of the positive and negative tracks
264
265 Int_t posFromV0 = cascade->GetPindex();
266 Int_t negFromV0 = cascade->GetNindex();
267
268
269 AliESDv0 * v0 = 0x0;
270 Int_t indV0 = -1;
271
272 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
273
274 v0 = fESD->GetV0(iV0);
275 Int_t posV0 = v0->GetPindex();
276 Int_t negV0 = v0->GetNindex();
277
278 if (posV0==posFromV0 && negV0==negFromV0) {
279 indV0 = iV0;
280 break;
281 }
282 }
283
284 AliAODVertex * vV0FromCascade = 0x0;
285
286 if (indV0>-1 && !usedV0[indV0] ) {
287
288 // the V0 exists in the array of V0s and is not used
289
290 usedV0[indV0] = kTRUE;
291
292 v0->GetXYZ(pos[0], pos[1], pos[2]);
293 if (!old) {
294 chi2 = v0->GetChi2V0();
295 v0->GetPosCov(covVtx);
296 } else {
297 chi2 = -999.;
298 }
299
300 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
301 covVtx,
302 chi2, // = chi2/NDF since NDF = 2*2-3 (AM)
303 vcascade,
304 AliAODVertex::kV0);
305 } else {
306
307 // the V0 doesn't exist in the array of V0s or was used
308// cerr << "Error: event " << fESD->GetEventNumberInFile() << " cascade " << nCascade
309// << " The V0 " << indV0
310// << " doesn't exist in the array of V0s or was used!" << endl;
311
312 cascade->GetXYZ(pos[0], pos[1], pos[2]);
313
314 if (!old) {
315 chi2 = v0->GetChi2V0();
316 cascade->GetPosCov(covVtx);
317 } else {
318 chi2 = -999.;
319 }
320
321 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
322 covVtx,
323 chi2, // = chi2/NDF since NDF = 2*2-3 (AM)
324 vcascade,
325 AliAODVertex::kV0);
326 vcascade->AddDaughter(vV0FromCascade);
327 }
328
329 // Add the positive tracks from the V0
330
331 if (posFromV0>-1 && !usedTrack[posFromV0]) {
332
333 usedTrack[posFromV0] = kTRUE;
334
335 AliESDtrack *esdTrack = fESD->GetTrack(posFromV0);
336 esdTrack->GetPxPyPz(p);
337 esdTrack->GetXYZ(pos);
338 esdTrack->GetCovarianceXYZPxPyPz(covTr);
339 esdTrack->GetESDpid(pid);
340
341 vV0FromCascade->AddDaughter(aodTrack =
342 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
343 esdTrack->GetLabel(),
344 p,
345 kTRUE,
346 pos,
347 kFALSE,
348 covTr,
349 (Short_t)esdTrack->GetSign(),
350 esdTrack->GetITSClusterMap(),
351 pid,
352 vV0FromCascade,
353 kTRUE, // check if this is right
354 kFALSE, // check if this is right
355 AliAODTrack::kSecondary)
356 );
357 aodTrack->ConvertAliPIDtoAODPID();
358 }
359 else {
360// cerr << "Error: event " << fESD->GetEventNumberInFile() << " cascade " << nCascade
361// << " track " << posFromV0 << " has already been used!" << endl;
362 }
363
364 // Add the negative tracks from the V0
365
366 if (negFromV0>-1 && !usedTrack[negFromV0]) {
367
368 usedTrack[negFromV0] = kTRUE;
369
370 AliESDtrack *esdTrack = fESD->GetTrack(negFromV0);
371 esdTrack->GetPxPyPz(p);
372 esdTrack->GetXYZ(pos);
373 esdTrack->GetCovarianceXYZPxPyPz(covTr);
374 esdTrack->GetESDpid(pid);
375
376 vV0FromCascade->AddDaughter(aodTrack =
377 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
378 esdTrack->GetLabel(),
379 p,
380 kTRUE,
381 pos,
382 kFALSE,
383 covTr,
384 (Short_t)esdTrack->GetSign(),
385 esdTrack->GetITSClusterMap(),
386 pid,
387 vV0FromCascade,
388 kTRUE, // check if this is right
389 kFALSE, // check if this is right
390 AliAODTrack::kSecondary)
391 );
392 aodTrack->ConvertAliPIDtoAODPID();
393 }
394 else {
395// cerr << "Error: event " << fESD->GetEventNumberInFile() << " cascade " << nCascade
396// << " track " << negFromV0 << " has already been used!" << endl;
397 }
398
399 // Add the bachelor track from the cascade
400
401 Int_t bachelor = cascade->GetBindex();
402
403 if(bachelor>-1 && !usedTrack[bachelor]) {
404
405 usedTrack[bachelor] = kTRUE;
406
407 AliESDtrack *esdTrack = fESD->GetTrack(bachelor);
408 esdTrack->GetPxPyPz(p);
409 esdTrack->GetXYZ(pos);
410 esdTrack->GetCovarianceXYZPxPyPz(covTr);
411 esdTrack->GetESDpid(pid);
412
413 vcascade->AddDaughter(aodTrack =
414 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
415 esdTrack->GetLabel(),
416 p,
417 kTRUE,
418 pos,
419 kFALSE,
420 covTr,
421 (Short_t)esdTrack->GetSign(),
422 esdTrack->GetITSClusterMap(),
423 pid,
424 vcascade,
425 kTRUE, // check if this is right
426 kFALSE, // check if this is right
427 AliAODTrack::kSecondary)
428 );
429 aodTrack->ConvertAliPIDtoAODPID();
430 }
431 else {
432// cerr << "Error: event " << fESD->GetEventNumberInFile() << " cascade " << nCascade
433// << " track " << bachelor << " has already been used!" << endl;
434 }
435
436 // Add the primary track of the cascade (if any)
437
438 } // end of the loop on cascades
439
440 // V0s
441
442 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
443
444 if (usedV0[nV0]) continue; // skip if aready added to the AOD
445
446 AliESDv0 *v0 = fESD->GetV0(nV0);
447
448 v0->GetXYZ(pos[0], pos[1], pos[2]);
449
450 if (!old) {
451 chi2 = v0->GetChi2V0();
452 v0->GetPosCov(covVtx);
453 } else {
454 chi2 = -999.;
455 }
456
457
458 AliAODVertex * vV0 =
459 new(vertices[jVertices++]) AliAODVertex(pos,
460 covVtx,
461 chi2, // = chi2/NDF since NDF = 2*2-3
462 primary,
463 AliAODVertex::kV0);
464 primary->AddDaughter(vV0);
465
466 Int_t posFromV0 = v0->GetPindex();
467 Int_t negFromV0 = v0->GetNindex();
468
469 // Add the positive tracks from the V0
470
471 if (posFromV0>-1 && !usedTrack[posFromV0]) {
472
473 usedTrack[posFromV0] = kTRUE;
474
475 AliESDtrack *esdTrack = fESD->GetTrack(posFromV0);
476 esdTrack->GetPxPyPz(p);
477 esdTrack->GetXYZ(pos);
478 esdTrack->GetCovarianceXYZPxPyPz(covTr);
479 esdTrack->GetESDpid(pid);
480
481 vV0->AddDaughter(aodTrack =
482 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
483 esdTrack->GetLabel(),
484 p,
485 kTRUE,
486 pos,
487 kFALSE,
488 covTr,
489 (Short_t)esdTrack->GetSign(),
490 esdTrack->GetITSClusterMap(),
491 pid,
492 vV0,
493 kTRUE, // check if this is right
494 kFALSE, // check if this is right
495 AliAODTrack::kSecondary)
496 );
497 aodTrack->ConvertAliPIDtoAODPID();
498 }
499 else {
500// cerr << "Error: event " << fESD->GetEventNumberInFile() << " V0 " << nV0
501// << " track " << posFromV0 << " has already been used!" << endl;
502 }
503
504 // Add the negative tracks from the V0
505
506 if (negFromV0>-1 && !usedTrack[negFromV0]) {
507
508 usedTrack[negFromV0] = kTRUE;
509
510 AliESDtrack *esdTrack = fESD->GetTrack(negFromV0);
511 esdTrack->GetPxPyPz(p);
512 esdTrack->GetXYZ(pos);
513 esdTrack->GetCovarianceXYZPxPyPz(covTr);
514 esdTrack->GetESDpid(pid);
515
516 vV0->AddDaughter(aodTrack =
517 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
518 esdTrack->GetLabel(),
519 p,
520 kTRUE,
521 pos,
522 kFALSE,
523 covTr,
524 (Short_t)esdTrack->GetSign(),
525 esdTrack->GetITSClusterMap(),
526 pid,
527 vV0,
528 kTRUE, // check if this is right
529 kFALSE, // check if this is right
530 AliAODTrack::kSecondary)
531 );
532 aodTrack->ConvertAliPIDtoAODPID();
533 }
534 else {
535// cerr << "Error: event " << fESD->GetEventNumberInFile() << " V0 " << nV0
536// << " track " << negFromV0 << " has already been used!" << endl;
537 }
538
539 } // end of the loop on V0s
540
541 // Kinks: it is a big mess the access to the information in the kinks
542 // The loop is on the tracks in order to find the mother and daugther of each kink
543
544
545 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
546
547
548 AliESDtrack * esdTrack = fESD->GetTrack(iTrack);
549
550 Int_t ikink = esdTrack->GetKinkIndex(0);
551
552 if (ikink && nKinks) {
553 // Negative kink index: mother, positive: daughter
554
555 // Search for the second track of the kink
556
557 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
558
559 AliESDtrack * esdTrack1 = fESD->GetTrack(jTrack);
560
561 Int_t jkink = esdTrack1->GetKinkIndex(0);
562
563 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
564
565 // The two tracks are from the same kink
566
567 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
568
569 Int_t imother = -1;
570 Int_t idaughter = -1;
571
572 if (ikink<0 && jkink>0) {
573
574 imother = iTrack;
575 idaughter = jTrack;
576 }
577 else if (ikink>0 && jkink<0) {
578
579 imother = jTrack;
580 idaughter = iTrack;
581 }
582 else {
583// cerr << "Error: Wrong combination of kink indexes: "
584// << ikink << " " << jkink << endl;
585 continue;
586 }
587
588 // Add the mother track
589
590 AliAODTrack * mother = NULL;
591
592 if (!usedTrack[imother]) {
593
594 usedTrack[imother] = kTRUE;
595
596 AliESDtrack *esdTrack = fESD->GetTrack(imother);
597 esdTrack->GetPxPyPz(p);
598 esdTrack->GetXYZ(pos);
599 esdTrack->GetCovarianceXYZPxPyPz(covTr);
600 esdTrack->GetESDpid(pid);
601
602 mother =
603 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
604 esdTrack->GetLabel(),
605 p,
606 kTRUE,
607 pos,
608 kFALSE,
609 covTr,
610 (Short_t)esdTrack->GetSign(),
611 esdTrack->GetITSClusterMap(),
612 pid,
613 primary,
614 kTRUE, // check if this is right
615 kTRUE, // check if this is right
616 AliAODTrack::kPrimary);
617 primary->AddDaughter(mother);
618 mother->ConvertAliPIDtoAODPID();
619 }
620 else {
621// cerr << "Error: event " << fESD->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
622// << " track " << imother << " has already been used!" << endl;
623 }
624
625 // Add the kink vertex
626 AliESDkink * kink = fESD->GetKink(TMath::Abs(ikink)-1);
627
628 AliAODVertex * vkink =
629 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
630 NULL,
631 0.,
632 mother,
633 AliAODVertex::kKink);
634 // Add the daughter track
635
636 AliAODTrack * daughter = NULL;
637
638 if (!usedTrack[idaughter]) {
639
640 usedTrack[idaughter] = kTRUE;
641
642 AliESDtrack *esdTrack = fESD->GetTrack(idaughter);
643 esdTrack->GetPxPyPz(p);
644 esdTrack->GetXYZ(pos);
645 esdTrack->GetCovarianceXYZPxPyPz(covTr);
646 esdTrack->GetESDpid(pid);
647
648 daughter =
649 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
650 esdTrack->GetLabel(),
651 p,
652 kTRUE,
653 pos,
654 kFALSE,
655 covTr,
656 (Short_t)esdTrack->GetSign(),
657 esdTrack->GetITSClusterMap(),
658 pid,
659 vkink,
660 kTRUE, // check if this is right
661 kTRUE, // check if this is right
662 AliAODTrack::kPrimary);
663 vkink->AddDaughter(daughter);
664 daughter->ConvertAliPIDtoAODPID();
665 }
666 else {
667// cerr << "Error: event " << fESD->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
668// << " track " << idaughter << " has already been used!" << endl;
669 }
670 }
671 }
672 }
673 }
674
675
676 // Tracks (primary and orphan)
677
678 printf("NUMBER OF TRACKS %5d\n", nTracks);
679
680 // *** PWG2 specific ***
681
682 fPWG2AODTracks->Delete();
683 fPWG2AODTracks->Expand(nTracks);
684 TClonesArray &tPWG2AODTracks = *fPWG2AODTracks;
685
686 // --- END PWG2 specific ---
687
688 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
689
690 if (usedTrack[nTrack]) continue;
691 AliESDtrack *esdTrack = fESD->GetTrack(nTrack);
692 UInt_t selectInfo = 0;
693 //
694 // Track selection
695 if (fTrackFilter) {
696 selectInfo = fTrackFilter->IsSelected(esdTrack);
697 if (!selectInfo) continue;
698 }
699
700 //
701 esdTrack->GetPxPyPz(p);
702 esdTrack->GetXYZ(pos);
703 esdTrack->GetCovarianceXYZPxPyPz(covTr);
704 esdTrack->GetESDpid(pid);
705
706 Float_t impactXY, impactZ;
707
708 esdTrack->GetImpactParameters(impactXY,impactZ);
709
710 // *** PWG2 specific ***
711
712 sharemap = esdTrack->GetTPCSharedMap();
713 clustermap = esdTrack->GetTPCClusterMap();
714
715 esdTrack->GetInnerXYZ(tpcentrancepoint);
716 tpcentrancepoint[2] -= pos[2];
717
718 esdTrack->GetOuterXYZ(tpcexitpoint);
719 tpcexitpoint[2] -= pos[2];
720
721 // --- END PWG2 specific ---
722
723
724 if (impactXY<3) {
725 // track inside the beam pipe
726
727 primary->AddDaughter(aodTrack =
728 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
729 esdTrack->GetLabel(),
730 p,
731 kTRUE,
732 pos,
733 kFALSE,
734 covTr,
735 (Short_t)esdTrack->GetSign(),
736 esdTrack->GetITSClusterMap(),
737 pid,
738 primary,
739 kTRUE, // check if this is right
740 kTRUE, // check if this is right
741 AliAODTrack::kPrimary,
742 selectInfo)
743 );
744 aodTrack->ConvertAliPIDtoAODPID();
745
746 // *** PWG2 specific ****
747 // Add the PWG2 info into the AOD
748 new (tPWG2AODTracks[pTracks++]) AliPWG2AODTrack(tpcentrancepoint,
749 tpcexitpoint,
750 sharemap,
751 clustermap,
752 aodTrack);
753 // --- END PWG2 specific ---
754 }
755 else {
756 // outside the beam pipe: orphan track
757 aodTrack =
758 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
759 esdTrack->GetLabel(),
760 p,
761 kTRUE,
762 pos,
763 kFALSE,
764 covTr,
765 (Short_t)esdTrack->GetSign(),
766 esdTrack->GetITSClusterMap(),
767 pid,
768 NULL,
769 kFALSE, // check if this is right
770 kFALSE, // check if this is right
771 AliAODTrack::kOrphan,
772 selectInfo);
773 aodTrack->ConvertAliPIDtoAODPID();
774
775 // *** PWG2 specific ****
776 // Add the PWG2 info into the AOD
777 new (tPWG2AODTracks[pTracks++]) AliPWG2AODTrack(tpcentrancepoint,
778 tpcexitpoint,
779 sharemap,
780 clustermap,
781 aodTrack);
782 // --- END PWG2 specific ---
783 }
784 } // end of loop on tracks
785
786 // muon tracks
787 Int_t nMuTracks = fESD->GetNumberOfMuonTracks();
788 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
789
790 AliESDMuonTrack *esdMuTrack = fESD->GetMuonTrack(nMuTrack);
791 p[0] = esdMuTrack->Px();
792 p[1] = esdMuTrack->Py();
793 p[2] = esdMuTrack->Pz();
794 pos[0] = primary->GetX();
795 pos[1] = primary->GetY();
796 pos[2] = primary->GetZ();
797
798 // has to be changed once the muon pid is provided by the ESD
799 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
800
801 primary->AddDaughter(
802 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
803 0, // no label provided
804 p,
805 kTRUE,
806 pos,
807 kFALSE,
808 NULL, // no covariance matrix provided
809 (Short_t)-99, // no charge provided
810 0, // no ITSClusterMap
811 pid,
812 primary,
813 kTRUE, // check if this is right
814 kTRUE, // not used for vertex fit
815 AliAODTrack::kPrimary)
816 );
817 }
818
819 printf(" jTracks=%d pTracks=%d PWG2=%d\n", jTracks, pTracks, fPWG2AODTracks->GetEntries());
820
821 delete [] usedTrack;
822 delete [] usedV0;
823 delete [] usedKink;
824
825
826 //
827 PostData(0, fTreeA);
828 return;
829}
830
831void AliAnalysisTaskPWG2ESDfilter::Terminate(Option_t */*option*/)
832{
833// Terminate analysis
834//
835 if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");
836}
837