1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 /* $Id: AliAnalysisTaskESDfilter.cxx 24535 2008-03-16 22:43:30Z fca $ */
23 #include "AliAnalysisTaskESDfilter.h"
24 #include "AliAnalysisManager.h"
25 #include "AliESDEvent.h"
26 #include "AliAODEvent.h"
27 #include "AliESDInputHandler.h"
28 #include "AliAODHandler.h"
29 #include "AliAnalysisFilter.h"
30 #include "AliESDMuonTrack.h"
31 #include "AliESDVertex.h"
33 #include "AliESDkink.h"
34 #include "AliESDcascade.h"
35 #include "AliESDPmdTrack.h"
36 #include "AliESDCaloCluster.h"
37 #include "AliESDCaloCells.h"
38 #include "AliMultiplicity.h"
41 ClassImp(AliAnalysisTaskESDfilter)
43 ////////////////////////////////////////////////////////////////////////
45 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
53 // Default constructor
56 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
57 AliAnalysisTaskSE(name),
67 void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
69 // Create the output container
70 OutputTree()->GetUserInfo()->Add(fTrackFilter);
73 void AliAnalysisTaskESDfilter::Init()
76 if (fDebug > 1) AliInfo("Init() \n");
77 // Call configuration file
81 void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
83 // Execute analysis for current event
86 Long64_t ientry = Entry();
87 if (fDebug > 0) printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
88 if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
89 if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
93 void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
94 // ESD Filter analysis task executed for each event
95 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
96 AliESD* old = esd->GetAliESDOld();
98 // set arrays and pointers
108 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
109 for (Int_t i = 0; i < 21; i++) covTr [i] = 0.;
112 // loop over events and fill them
114 // Multiplicity information needed by the header (to be revised!)
115 Int_t nTracks = esd->GetNumberOfTracks();
116 Int_t nPosTracks = 0;
117 // for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack)
118 // if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
122 AliAODHeader* header = AODEvent()->GetHeader();
123 header->SetRunNumber(esd->GetRunNumber());
125 header->SetBunchCrossNumber(0);
126 header->SetOrbitNumber(0);
127 header->SetPeriodNumber(0);
128 header->SetEventType(0);
129 header->SetMuonMagFieldScale(-999.); // FIXME
130 header->SetCentrality(-999.); // FIXME
132 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
133 header->SetOrbitNumber(esd->GetOrbitNumber());
134 header->SetPeriodNumber(esd->GetPeriodNumber());
135 header->SetEventType(esd->GetEventType());
136 header->SetMuonMagFieldScale(-999.); // FIXME
137 header->SetCentrality(-999.); // FIXME
140 header->SetTriggerMask(esd->GetTriggerMask());
141 header->SetTriggerCluster(esd->GetTriggerCluster());
142 header->SetMagneticField(esd->GetMagneticField());
143 header->SetZDCN1Energy(esd->GetZDCN1Energy());
144 header->SetZDCP1Energy(esd->GetZDCP1Energy());
145 header->SetZDCN2Energy(esd->GetZDCN2Energy());
146 header->SetZDCP2Energy(esd->GetZDCP2Energy());
147 header->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
150 Int_t nV0s = esd->GetNumberOfV0s();
151 Int_t nCascades = esd->GetNumberOfCascades();
152 Int_t nKinks = esd->GetNumberOfKinks();
153 Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;
155 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
157 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
160 printf(" NV0=%d NCASCADES=%d NKINKS=%d\n", nV0s, nCascades, nKinks);
162 AODEvent()->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
164 AliAODTrack *aodTrack = 0x0;
165 AliAODPid *detpid = 0x0;
166 Double_t timezero = 0; //TO BE FIXED
167 AliAODv0 *aodV0 = 0x0;
169 // Array to take into account the tracks already added to the AOD
170 Bool_t * usedTrack = NULL;
172 usedTrack = new Bool_t[nTracks];
173 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
175 // Array to take into account the V0s already added to the AOD
176 Bool_t * usedV0 = NULL;
178 usedV0 = new Bool_t[nV0s];
179 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
181 // Array to take into account the kinks already added to the AOD
182 Bool_t * usedKink = NULL;
184 usedKink = new Bool_t[nKinks];
185 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
188 // Access to the AOD container of vertices
189 TClonesArray &vertices = *(AODEvent()->GetVertices());
192 // Access to the AOD container of tracks
193 TClonesArray &tracks = *(AODEvent()->GetTracks());
196 // Access to the AOD container of V0s
197 TClonesArray &V0s = *(AODEvent()->GetV0s());
200 // Add primary vertex. The primary tracks will be defined
201 // after the loops on the composite objects (V0, cascades, kinks)
202 const AliESDVertex *vtx = esd->GetPrimaryVertex();
204 vtx->GetXYZ(pos); // position
205 vtx->GetCovMatrix(covVtx); //covariance matrix
207 AliAODVertex * primary = new(vertices[jVertices++])
208 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
209 if (fDebug > 0) primary->Print();
211 // Create vertices starting from the most complex objects
215 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
216 AliESDcascade *cascade = esd->GetCascade(nCascade);
218 cascade->GetXYZ(pos[0], pos[1], pos[2]);
221 chi2 = cascade->GetChi2Xi(); // = chi2/NDF since NDF = 2*2-3
222 cascade->GetPosCovXi(covVtx);
225 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
227 // Add the cascade vertex
228 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
233 AliAODVertex::kCascade);
235 primary->AddDaughter(vcascade);
237 // Add the V0 from the cascade. The ESD class have to be optimized...
238 // Now we have to search for the corresponding Vo in the list of V0s
239 // using the indeces of the positive and negative tracks
241 Int_t posFromV0 = cascade->GetPindex();
242 Int_t negFromV0 = cascade->GetNindex();
248 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
250 v0 = esd->GetV0(iV0);
251 Int_t posV0 = v0->GetPindex();
252 Int_t negV0 = v0->GetNindex();
254 if (posV0==posFromV0 && negV0==negFromV0) {
260 AliAODVertex * vV0FromCascade = 0x0;
262 if (indV0>-1 && !usedV0[indV0] ) {
264 // the V0 exists in the array of V0s and is not used
266 usedV0[indV0] = kTRUE;
268 v0->GetXYZ(pos[0], pos[1], pos[2]);
270 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
271 v0->GetPosCov(covVtx);
274 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
277 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
285 // the V0 doesn't exist in the array of V0s or was used
286 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
287 // << " The V0 " << indV0
288 // << " doesn't exist in the array of V0s or was used!" << endl;
290 cascade->GetXYZ(pos[0], pos[1], pos[2]);
293 chi2 = v0->GetChi2V0();
294 cascade->GetPosCov(covVtx);
297 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
300 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
302 chi2, // = chi2/NDF since NDF = 2*2-3 (AM)
306 vcascade->AddDaughter(vV0FromCascade);
309 // Add the positive tracks from the V0
311 if (posFromV0>-1 && !usedTrack[posFromV0]) {
313 usedTrack[posFromV0] = kTRUE;
315 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
316 esdTrack->GetPxPyPz(p_pos);
317 esdTrack->GetXYZ(pos);
318 esdTrack->GetCovarianceXYZPxPyPz(covTr);
319 esdTrack->GetESDpid(pid);
321 vV0FromCascade->AddDaughter(aodTrack =
322 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
323 esdTrack->GetLabel(),
329 (Short_t)esdTrack->GetSign(),
330 esdTrack->GetITSClusterMap(),
333 kTRUE, // check if this is right
334 kFALSE, // check if this is right
335 AliAODTrack::kSecondary)
337 if (esdTrack->GetSign() > 0) nPosTracks++;
338 aodTrack->ConvertAliPIDtoAODPID();
339 aodTrack->SetFlags(esdTrack->GetStatus());
340 SetAODPID(esdTrack,aodTrack,detpid,timezero);
343 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
344 // << " track " << posFromV0 << " has already been used!" << endl;
347 // Add the negative tracks from the V0
349 if (negFromV0>-1 && !usedTrack[negFromV0]) {
351 usedTrack[negFromV0] = kTRUE;
353 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
354 esdTrack->GetPxPyPz(p_neg);
355 esdTrack->GetXYZ(pos);
356 esdTrack->GetCovarianceXYZPxPyPz(covTr);
357 esdTrack->GetESDpid(pid);
359 vV0FromCascade->AddDaughter(aodTrack =
360 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
361 esdTrack->GetLabel(),
367 (Short_t)esdTrack->GetSign(),
368 esdTrack->GetITSClusterMap(),
371 kTRUE, // check if this is right
372 kFALSE, // check if this is right
373 AliAODTrack::kSecondary)
375 if (esdTrack->GetSign() > 0) nPosTracks++;
376 aodTrack->ConvertAliPIDtoAODPID();
377 aodTrack->SetFlags(esdTrack->GetStatus());
378 SetAODPID(esdTrack,aodTrack,detpid,timezero);
381 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
382 // << " track " << negFromV0 << " has already been used!" << endl;
385 // add it to the V0 array as well
386 Double_t d0[2] = { -999., -99.};
387 // counting is probably wrong
388 new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
390 // Add the bachelor track from the cascade
392 Int_t bachelor = cascade->GetBindex();
394 if(bachelor>-1 && !usedTrack[bachelor]) {
396 usedTrack[bachelor] = kTRUE;
398 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
399 esdTrack->GetPxPyPz(p);
400 esdTrack->GetXYZ(pos);
401 esdTrack->GetCovarianceXYZPxPyPz(covTr);
402 esdTrack->GetESDpid(pid);
404 vcascade->AddDaughter(aodTrack =
405 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
406 esdTrack->GetLabel(),
412 (Short_t)esdTrack->GetSign(),
413 esdTrack->GetITSClusterMap(),
416 kTRUE, // check if this is right
417 kFALSE, // check if this is right
418 AliAODTrack::kSecondary)
420 if (esdTrack->GetSign() > 0) nPosTracks++;
421 aodTrack->ConvertAliPIDtoAODPID();
422 aodTrack->SetFlags(esdTrack->GetStatus());
423 SetAODPID(esdTrack,aodTrack,detpid,timezero);
426 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
427 // << " track " << bachelor << " has already been used!" << endl;
430 // Add the primary track of the cascade (if any)
432 } // end of the loop on cascades
436 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
438 if (usedV0[nV0]) continue; // skip if already added to the AOD
440 AliESDv0 *v0 = esd->GetV0(nV0);
442 v0->GetXYZ(pos[0], pos[1], pos[2]);
445 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
446 v0->GetPosCov(covVtx);
449 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
454 new(vertices[jVertices++]) AliAODVertex(pos,
460 primary->AddDaughter(vV0);
462 Int_t posFromV0 = v0->GetPindex();
463 Int_t negFromV0 = v0->GetNindex();
465 Float_t dcaPosToPrimVertexXYZ[2] = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
466 Float_t dcaNegToPrimVertexXYZ[2] = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
467 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = Pos and ..[1] = Neg
469 Double_t dcaV0Daughters = v0->GetDcaV0Daughters();
470 Double_t dcaV0ToPrimVertex = v0->GetD();
473 // Add the positive tracks from the V0
475 if (posFromV0>-1 && !usedTrack[posFromV0]) {
477 usedTrack[posFromV0] = kTRUE;
479 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
480 esdTrack->GetPxPyPz(p_pos);
481 esdTrack->GetXYZ(pos);
482 esdTrack->GetCovarianceXYZPxPyPz(covTr);
483 esdTrack->GetESDpid(pid);
484 esdTrack->GetImpactParameters(dcaPosToPrimVertexXYZ[0],dcaPosToPrimVertexXYZ[1]);
486 vV0->AddDaughter(aodTrack =
487 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
488 esdTrack->GetLabel(),
494 (Short_t)esdTrack->GetSign(),
495 esdTrack->GetITSClusterMap(),
498 kTRUE, // check if this is right
499 kFALSE, // check if this is right
500 AliAODTrack::kSecondary)
502 if (esdTrack->GetSign() > 0) nPosTracks++;
503 aodTrack->ConvertAliPIDtoAODPID();
504 aodTrack->SetFlags(esdTrack->GetStatus());
505 SetAODPID(esdTrack,aodTrack,detpid,timezero);
508 // cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
509 // << " track " << posFromV0 << " has already been used!" << endl;
512 // Add the negative tracks from the V0
514 if (negFromV0>-1 && !usedTrack[negFromV0]) {
516 usedTrack[negFromV0] = kTRUE;
518 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
519 esdTrack->GetPxPyPz(p_neg);
520 esdTrack->GetXYZ(pos);
521 esdTrack->GetCovarianceXYZPxPyPz(covTr);
522 esdTrack->GetESDpid(pid);
523 esdTrack->GetImpactParameters(dcaNegToPrimVertexXYZ[0],dcaNegToPrimVertexXYZ[1]);
525 vV0->AddDaughter(aodTrack =
526 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
527 esdTrack->GetLabel(),
533 (Short_t)esdTrack->GetSign(),
534 esdTrack->GetITSClusterMap(),
537 kTRUE, // check if this is right
538 kFALSE, // check if this is right
539 AliAODTrack::kSecondary)
541 if (esdTrack->GetSign() > 0) nPosTracks++;
542 aodTrack->ConvertAliPIDtoAODPID();
543 aodTrack->SetFlags(esdTrack->GetStatus());
544 SetAODPID(esdTrack,aodTrack,detpid,timezero);
547 // cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
548 // << " track " << negFromV0 << " has already been used!" << endl;
550 dcaDaughterToPrimVertex[0] =
551 TMath::Sqrt(dcaPosToPrimVertexXYZ[0]*dcaPosToPrimVertexXYZ[0]
552 +dcaPosToPrimVertexXYZ[1]*dcaPosToPrimVertexXYZ[1]);
553 dcaDaughterToPrimVertex[1] =
554 TMath::Sqrt(dcaNegToPrimVertexXYZ[0]*dcaNegToPrimVertexXYZ[0]
555 +dcaNegToPrimVertexXYZ[1]*dcaNegToPrimVertexXYZ[1]);
557 // add it to the V0 array as well
558 aodV0 = new(V0s[jV0s++])
559 AliAODv0(vV0, dcaV0Daughters, dcaV0ToPrimVertex, p_pos, p_neg, dcaDaughterToPrimVertex); // to be refined
560 // set the aod v0 on-the-fly status
561 aodV0->SetOnFlyStatus(v0->GetOnFlyStatus());
563 printf("In the v0 loop: onFlyStatus=%d,dcaV0Daughters=%.3f dcaV0ToPrimVertex=%.3f dcaDaughterToPrimVertex=[%.3f,%.3f]\n",
564 aodV0->GetOnFlyStatus(), aodV0->DcaV0Daughters(), aodV0->DcaV0ToPrimVertex(),
565 aodV0->DcaPosToPrimVertex(),aodV0->DcaNegToPrimVertex());
568 // end of the loop on V0s
570 // Kinks: it is a big mess the access to the information in the kinks
571 // The loop is on the tracks in order to find the mother and daugther of each kink
574 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
576 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
578 Int_t ikink = esdTrack->GetKinkIndex(0);
580 if (ikink && nKinks) {
581 // Negative kink index: mother, positive: daughter
583 // Search for the second track of the kink
585 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
587 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
589 Int_t jkink = esdTrack1->GetKinkIndex(0);
591 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
593 // The two tracks are from the same kink
595 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
598 Int_t idaughter = -1;
600 if (ikink<0 && jkink>0) {
605 else if (ikink>0 && jkink<0) {
611 // cerr << "Error: Wrong combination of kink indexes: "
612 // << ikink << " " << jkink << endl;
616 // Add the mother track
618 AliAODTrack * mother = NULL;
620 if (!usedTrack[imother]) {
622 usedTrack[imother] = kTRUE;
624 AliESDtrack *esdTrackM = esd->GetTrack(imother);
625 esdTrackM->GetPxPyPz(p);
626 esdTrackM->GetXYZ(pos);
627 esdTrackM->GetCovarianceXYZPxPyPz(covTr);
628 esdTrackM->GetESDpid(pid);
631 new(tracks[jTracks++]) AliAODTrack(esdTrackM->GetID(),
632 esdTrackM->GetLabel(),
638 (Short_t)esdTrackM->GetSign(),
639 esdTrackM->GetITSClusterMap(),
642 kTRUE, // check if this is right
643 kTRUE, // check if this is right
644 AliAODTrack::kPrimary);
645 if (esdTrackM->GetSign() > 0) nPosTracks++;
646 mother->SetFlags(esdTrackM->GetStatus());
647 mother->ConvertAliPIDtoAODPID();
648 primary->AddDaughter(mother);
649 mother->ConvertAliPIDtoAODPID();
650 SetAODPID(esdTrackM,mother,detpid,timezero);
653 // cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
654 // << " track " << imother << " has already been used!" << endl;
657 // Add the kink vertex
658 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
660 AliAODVertex * vkink =
661 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
665 esdTrack->GetID(), // This is the track ID of the mother's track!
666 AliAODVertex::kKink);
667 // Add the daughter track
669 AliAODTrack * daughter = NULL;
671 if (!usedTrack[idaughter]) {
673 usedTrack[idaughter] = kTRUE;
675 AliESDtrack *esdTrackD = esd->GetTrack(idaughter);
676 esdTrackD->GetPxPyPz(p);
677 esdTrackD->GetXYZ(pos);
678 esdTrackD->GetCovarianceXYZPxPyPz(covTr);
679 esdTrackD->GetESDpid(pid);
682 new(tracks[jTracks++]) AliAODTrack(esdTrackD->GetID(),
683 esdTrackD->GetLabel(),
689 (Short_t)esdTrackD->GetSign(),
690 esdTrackD->GetITSClusterMap(),
693 kTRUE, // check if this is right
694 kTRUE, // check if this is right
695 AliAODTrack::kSecondary);
696 if (esdTrackD->GetSign() > 0) nPosTracks++;
697 daughter->SetFlags(esdTrackD->GetStatus());
698 daughter->ConvertAliPIDtoAODPID();
699 vkink->AddDaughter(daughter);
700 daughter->ConvertAliPIDtoAODPID();
701 SetAODPID(esdTrackD,daughter,detpid,timezero);
704 // cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
705 // << " track " << idaughter << " has already been used!" << endl;
713 // Tracks (primary and orphan)
715 if (fDebug > 0) printf("NUMBER OF ESD TRACKS %5d\n", nTracks);
717 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
720 if (usedTrack[nTrack]) continue;
722 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
723 UInt_t selectInfo = 0;
727 selectInfo = fTrackFilter->IsSelected(esdTrack);
728 if (!selectInfo) continue;
732 esdTrack->GetPxPyPz(p);
733 esdTrack->GetXYZ(pos);
734 esdTrack->GetCovarianceXYZPxPyPz(covTr);
735 esdTrack->GetESDpid(pid);
737 Float_t impactXY, impactZ;
739 esdTrack->GetImpactParameters(impactXY,impactZ);
742 // track inside the beam pipe
744 primary->AddDaughter(aodTrack =
745 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
746 esdTrack->GetLabel(),
752 (Short_t)esdTrack->GetSign(),
753 esdTrack->GetITSClusterMap(),
756 kTRUE, // check if this is right
757 kTRUE, // check if this is right
758 AliAODTrack::kPrimary,
761 if (esdTrack->GetSign() > 0) nPosTracks++;
762 aodTrack->SetFlags(esdTrack->GetStatus());
763 aodTrack->ConvertAliPIDtoAODPID();
764 SetAODPID(esdTrack,aodTrack,detpid,timezero);
767 // outside the beam pipe: orphan track
768 // Don't write them anymore!
772 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
773 esdTrack->GetLabel(),
779 (Short_t)esdTrack->GetSign(),
780 esdTrack->GetITSClusterMap(),
783 kFALSE, // check if this is right
784 kFALSE, // check if this is right
785 AliAODTrack::kOrphan,
787 if (esdTrack->GetSign() > 0) nPosTracks++;
788 aodTrack->SetFlags(esdTrack->GetStatus());
789 aodTrack->ConvertAliPIDtoAODPID();
792 } // end of loop on tracks
794 // Update number of AOD tracks in header at the end of track loop (M.G.)
795 header->SetRefMultiplicity(jTracks);
796 header->SetRefMultiplicityPos(nPosTracks);
797 header->SetRefMultiplicityNeg(jTracks - nPosTracks);
799 printf(" NAODTRACKS=%d NPOS=%d NNEG=%d\n", jTracks, nPosTracks, jTracks - nPosTracks);
800 // Do not shrink the array of tracks - other filters may add to it (M.G)
801 // tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
803 // Access to the AOD container of PMD clusters
804 TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
805 Int_t jPmdClusters=0;
807 for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
808 // file pmd clusters, to be revised!
809 AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
812 Double_t posPmd[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ()};
813 Double_t pidPmd[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
815 // assoc cluster not set
816 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), posPmd, pidPmd);
819 // Access to the AOD container of clusters
820 TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
823 for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
825 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
827 Int_t id = cluster->GetID();
828 Int_t nLabel = cluster->GetNLabels();
829 TArrayI* labels = cluster->GetLabels();
831 if (labels) label = (cluster->GetLabels())->GetArray();
833 Float_t energy = cluster->E();
834 cluster->GetPosition(posF);
835 Char_t ttype = AliAODCluster::kUndef;
837 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
838 ttype=AliAODCluster::kPHOSNeutral;
840 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
841 ttype = AliAODCluster::kEMCALClusterv1;
845 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
853 caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
854 cluster->GetClusterDisp(),
855 cluster->GetM20(), cluster->GetM02(),
856 cluster->GetEmcCpvDistance(),
857 cluster->GetNExMax(),cluster->GetTOF()) ;
859 caloCluster->SetPIDFromESD(cluster->GetPid());
860 caloCluster->SetNCells(cluster->GetNCells());
861 caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
862 caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
864 TArrayI* matchedT = cluster->GetTracksMatched();
866 for (Int_t im = 0; im < matchedT->GetSize(); im++) {
867 caloCluster->AddTrackMatched((esd->GetTrack(im)));
872 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
873 // end of loop on calo clusters
875 // fill EMCAL cell info
876 if (esd->GetEMCALCells()) { // protection against missing ESD information
877 AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
878 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
880 AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
881 aodEMcells.CreateContainer(nEMcell);
882 aodEMcells.SetType(AliAODCaloCells::kEMCAL);
883 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
884 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
889 // fill PHOS cell info
890 if (esd->GetPHOSCells()) { // protection against missing ESD information
891 AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
892 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
894 AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
895 aodPHcells.CreateContainer(nPHcell);
896 aodPHcells.SetType(AliAODCaloCells::kPHOS);
897 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
898 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
904 AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
905 const AliMultiplicity *mult = esd->GetMultiplicity();
907 if (mult->GetNumberOfTracklets()>0) {
908 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
910 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
911 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0), mult->GetLabel(n, 1));
915 //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
925 void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid, Double_t timezero)
928 // Setter for the raw PID detector signals
931 if(esdtrack->Pt()>fHighPthreshold) {
932 detpid = new AliAODPid();
933 detpid->SetDetectorRawSignals(esdtrack,timezero);
934 aodtrack->SetDetPID(detpid);
937 if(esdtrack->Pt()> fPtshape->GetXmin()){
938 Double_t y = fPtshape->Eval(esdtrack->Pt())/fPtshape->Eval(fHighPthreshold);
939 if(gRandom->Rndm(0)<1./y){
940 detpid = new AliAODPid();
941 detpid->SetDetectorRawSignals(esdtrack,timezero);
942 aodtrack->SetDetPID(detpid);
950 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
952 // Terminate analysis
954 if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");