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 $ */
22 #include "AliAnalysisTaskESDfilter.h"
23 #include "AliAnalysisManager.h"
24 #include "AliESDEvent.h"
25 #include "AliAODEvent.h"
26 #include "AliESDInputHandler.h"
27 #include "AliAODHandler.h"
28 #include "AliAnalysisFilter.h"
29 #include "AliESDtrack.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():
51 // Default constructor
54 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
55 AliAnalysisTaskSE(name),
63 void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
65 // Create the output container
66 OutputTree()->GetUserInfo()->Add(fTrackFilter);
69 void AliAnalysisTaskESDfilter::Init()
72 if (fDebug > 1) AliInfo("Init() \n");
73 // Call configuration file
77 void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
79 // Execute analysis for current event
82 Long64_t ientry = Entry();
83 if (fDebug > 0) printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
88 void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
89 // ESD Filter analysis task executed for each event
90 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
91 AliESD* old = esd->GetAliESDOld();
93 // set arrays and pointers
103 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
104 for (Int_t i = 0; i < 21; i++) covTr [i] = 0.;
107 // loop over events and fill them
109 // Multiplicity information needed by the header (to be revised!)
110 Int_t nTracks = esd->GetNumberOfTracks();
111 Int_t nPosTracks = 0;
112 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack)
113 if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
117 AliAODHeader* header = AODEvent()->GetHeader();
118 header->SetRunNumber(esd->GetRunNumber());
120 header->SetBunchCrossNumber(0);
121 header->SetOrbitNumber(0);
122 header->SetPeriodNumber(0);
123 header->SetEventType(0);
124 header->SetMuonMagFieldScale(-999.); // FIXME
125 header->SetCentrality(-999.); // FIXME
127 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
128 header->SetOrbitNumber(esd->GetOrbitNumber());
129 header->SetPeriodNumber(esd->GetPeriodNumber());
130 header->SetEventType(esd->GetEventType());
131 header->SetMuonMagFieldScale(-999.); // FIXME
132 header->SetCentrality(-999.); // FIXME
135 header->SetTriggerMask(esd->GetTriggerMask());
136 header->SetTriggerCluster(esd->GetTriggerCluster());
137 header->SetMagneticField(esd->GetMagneticField());
138 header->SetZDCN1Energy(esd->GetZDCN1Energy());
139 header->SetZDCP1Energy(esd->GetZDCP1Energy());
140 header->SetZDCN2Energy(esd->GetZDCN2Energy());
141 header->SetZDCP2Energy(esd->GetZDCP2Energy());
142 header->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
143 header->SetRefMultiplicity(nTracks);
144 header->SetRefMultiplicityPos(nPosTracks);
145 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
148 Int_t nV0s = esd->GetNumberOfV0s();
149 Int_t nCascades = esd->GetNumberOfCascades();
150 Int_t nKinks = esd->GetNumberOfKinks();
151 Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;
153 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
155 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
158 printf(" NV0=%d NCASCADES=%d NKINKS=%d\n", nV0s, nCascades, nKinks);
160 AODEvent()->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
162 AliAODTrack *aodTrack = 0x0;
164 // Array to take into account the tracks already added to the AOD
165 Bool_t * usedTrack = NULL;
167 usedTrack = new Bool_t[nTracks];
168 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
170 // Array to take into account the V0s already added to the AOD
171 Bool_t * usedV0 = NULL;
173 usedV0 = new Bool_t[nV0s];
174 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
176 // Array to take into account the kinks already added to the AOD
177 Bool_t * usedKink = NULL;
179 usedKink = new Bool_t[nKinks];
180 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
183 // Access to the AOD container of vertices
184 TClonesArray &vertices = *(AODEvent()->GetVertices());
187 // Access to the AOD container of tracks
188 TClonesArray &tracks = *(AODEvent()->GetTracks());
191 // Access to the AOD container of V0s
192 TClonesArray &V0s = *(AODEvent()->GetV0s());
195 // Add primary vertex. The primary tracks will be defined
196 // after the loops on the composite objects (V0, cascades, kinks)
197 const AliESDVertex *vtx = esd->GetPrimaryVertex();
199 vtx->GetXYZ(pos); // position
200 vtx->GetCovMatrix(covVtx); //covariance matrix
202 AliAODVertex * primary = new(vertices[jVertices++])
203 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, AliAODVertex::kPrimary);
204 if (fDebug > 0) primary->Print();
206 // Create vertices starting from the most complex objects
210 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
211 AliESDcascade *cascade = esd->GetCascade(nCascade);
213 cascade->GetXYZ(pos[0], pos[1], pos[2]);
216 chi2 = cascade->GetChi2Xi(); // = chi2/NDF since NDF = 2*2-3
217 cascade->GetPosCovXi(covVtx);
220 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
222 // Add the cascade vertex
223 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
228 AliAODVertex::kCascade);
230 primary->AddDaughter(vcascade);
232 // Add the V0 from the cascade. The ESD class have to be optimized...
233 // Now we have to search for the corresponding Vo in the list of V0s
234 // using the indeces of the positive and negative tracks
236 Int_t posFromV0 = cascade->GetPindex();
237 Int_t negFromV0 = cascade->GetNindex();
243 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
245 v0 = esd->GetV0(iV0);
246 Int_t posV0 = v0->GetPindex();
247 Int_t negV0 = v0->GetNindex();
249 if (posV0==posFromV0 && negV0==negFromV0) {
255 AliAODVertex * vV0FromCascade = 0x0;
257 if (indV0>-1 && !usedV0[indV0] ) {
259 // the V0 exists in the array of V0s and is not used
261 usedV0[indV0] = kTRUE;
263 v0->GetXYZ(pos[0], pos[1], pos[2]);
265 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
266 v0->GetPosCov(covVtx);
269 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
272 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
280 // the V0 doesn't exist in the array of V0s or was used
281 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
282 // << " The V0 " << indV0
283 // << " doesn't exist in the array of V0s or was used!" << endl;
285 cascade->GetXYZ(pos[0], pos[1], pos[2]);
288 chi2 = v0->GetChi2V0();
289 cascade->GetPosCov(covVtx);
292 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
295 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
297 chi2, // = chi2/NDF since NDF = 2*2-3 (AM)
301 vcascade->AddDaughter(vV0FromCascade);
304 // Add the positive tracks from the V0
306 if (posFromV0>-1 && !usedTrack[posFromV0]) {
308 usedTrack[posFromV0] = kTRUE;
310 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
311 esdTrack->GetPxPyPz(p_pos);
312 esdTrack->GetXYZ(pos);
313 esdTrack->GetCovarianceXYZPxPyPz(covTr);
314 esdTrack->GetESDpid(pid);
316 vV0FromCascade->AddDaughter(aodTrack =
317 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
318 esdTrack->GetLabel(),
324 (Short_t)esdTrack->GetSign(),
325 esdTrack->GetITSClusterMap(),
328 kTRUE, // check if this is right
329 kFALSE, // check if this is right
330 AliAODTrack::kSecondary)
332 aodTrack->ConvertAliPIDtoAODPID();
333 aodTrack->SetFlags(esdTrack->GetStatus());
336 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
337 // << " track " << posFromV0 << " has already been used!" << endl;
340 // Add the negative tracks from the V0
342 if (negFromV0>-1 && !usedTrack[negFromV0]) {
344 usedTrack[negFromV0] = kTRUE;
346 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
347 esdTrack->GetPxPyPz(p_neg);
348 esdTrack->GetXYZ(pos);
349 esdTrack->GetCovarianceXYZPxPyPz(covTr);
350 esdTrack->GetESDpid(pid);
352 vV0FromCascade->AddDaughter(aodTrack =
353 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
354 esdTrack->GetLabel(),
360 (Short_t)esdTrack->GetSign(),
361 esdTrack->GetITSClusterMap(),
364 kTRUE, // check if this is right
365 kFALSE, // check if this is right
366 AliAODTrack::kSecondary)
368 aodTrack->ConvertAliPIDtoAODPID();
369 aodTrack->SetFlags(esdTrack->GetStatus());
372 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
373 // << " track " << negFromV0 << " has already been used!" << endl;
376 // add it to the V0 array as well
377 Double_t d0[2] = { -999., -99.};
378 // counting is probably wrong
379 new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
381 // Add the bachelor track from the cascade
383 Int_t bachelor = cascade->GetBindex();
385 if(bachelor>-1 && !usedTrack[bachelor]) {
387 usedTrack[bachelor] = kTRUE;
389 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
390 esdTrack->GetPxPyPz(p);
391 esdTrack->GetXYZ(pos);
392 esdTrack->GetCovarianceXYZPxPyPz(covTr);
393 esdTrack->GetESDpid(pid);
395 vcascade->AddDaughter(aodTrack =
396 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
397 esdTrack->GetLabel(),
403 (Short_t)esdTrack->GetSign(),
404 esdTrack->GetITSClusterMap(),
407 kTRUE, // check if this is right
408 kFALSE, // check if this is right
409 AliAODTrack::kSecondary)
411 aodTrack->ConvertAliPIDtoAODPID();
412 aodTrack->SetFlags(esdTrack->GetStatus());
415 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
416 // << " track " << bachelor << " has already been used!" << endl;
419 // Add the primary track of the cascade (if any)
421 } // end of the loop on cascades
425 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
427 if (usedV0[nV0]) continue; // skip if aready added to the AOD
429 AliESDv0 *v0 = esd->GetV0(nV0);
431 v0->GetXYZ(pos[0], pos[1], pos[2]);
434 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
435 v0->GetPosCov(covVtx);
438 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
443 new(vertices[jVertices++]) AliAODVertex(pos,
449 primary->AddDaughter(vV0);
451 Int_t posFromV0 = v0->GetPindex();
452 Int_t negFromV0 = v0->GetNindex();
454 // Add the positive tracks from the V0
456 if (posFromV0>-1 && !usedTrack[posFromV0]) {
458 usedTrack[posFromV0] = kTRUE;
460 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
461 esdTrack->GetPxPyPz(p_pos);
462 esdTrack->GetXYZ(pos);
463 esdTrack->GetCovarianceXYZPxPyPz(covTr);
464 esdTrack->GetESDpid(pid);
466 vV0->AddDaughter(aodTrack =
467 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
468 esdTrack->GetLabel(),
474 (Short_t)esdTrack->GetSign(),
475 esdTrack->GetITSClusterMap(),
478 kTRUE, // check if this is right
479 kFALSE, // check if this is right
480 AliAODTrack::kSecondary)
482 aodTrack->ConvertAliPIDtoAODPID();
483 aodTrack->SetFlags(esdTrack->GetStatus());
486 // cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
487 // << " track " << posFromV0 << " has already been used!" << endl;
490 // Add the negative tracks from the V0
492 if (negFromV0>-1 && !usedTrack[negFromV0]) {
494 usedTrack[negFromV0] = kTRUE;
496 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
497 esdTrack->GetPxPyPz(p_neg);
498 esdTrack->GetXYZ(pos);
499 esdTrack->GetCovarianceXYZPxPyPz(covTr);
500 esdTrack->GetESDpid(pid);
502 vV0->AddDaughter(aodTrack =
503 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
504 esdTrack->GetLabel(),
510 (Short_t)esdTrack->GetSign(),
511 esdTrack->GetITSClusterMap(),
514 kTRUE, // check if this is right
515 kFALSE, // check if this is right
516 AliAODTrack::kSecondary)
518 aodTrack->ConvertAliPIDtoAODPID();
519 aodTrack->SetFlags(esdTrack->GetStatus());
522 // cerr << "Error: event " << esd->GetEventNumberInFile() << " V0 " << nV0
523 // << " track " << negFromV0 << " has already been used!" << endl;
526 // add it to the V0 array as well
527 Double_t d0[2] = { 999., 99.};
528 new(V0s[jV0s++]) AliAODv0(vV0, 999., 99., p_pos, p_neg, d0); // to be refined
531 // end of the loop on V0s
533 // Kinks: it is a big mess the access to the information in the kinks
534 // The loop is on the tracks in order to find the mother and daugther of each kink
537 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
539 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
541 Int_t ikink = esdTrack->GetKinkIndex(0);
543 if (ikink && nKinks) {
544 // Negative kink index: mother, positive: daughter
546 // Search for the second track of the kink
548 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
550 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
552 Int_t jkink = esdTrack1->GetKinkIndex(0);
554 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
556 // The two tracks are from the same kink
558 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
561 Int_t idaughter = -1;
563 if (ikink<0 && jkink>0) {
568 else if (ikink>0 && jkink<0) {
574 // cerr << "Error: Wrong combination of kink indexes: "
575 // << ikink << " " << jkink << endl;
579 // Add the mother track
581 AliAODTrack * mother = NULL;
583 if (!usedTrack[imother]) {
585 usedTrack[imother] = kTRUE;
587 AliESDtrack *esdTrack = esd->GetTrack(imother);
588 esdTrack->GetPxPyPz(p);
589 esdTrack->GetXYZ(pos);
590 esdTrack->GetCovarianceXYZPxPyPz(covTr);
591 esdTrack->GetESDpid(pid);
594 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
595 esdTrack->GetLabel(),
601 (Short_t)esdTrack->GetSign(),
602 esdTrack->GetITSClusterMap(),
605 kTRUE, // check if this is right
606 kTRUE, // check if this is right
607 AliAODTrack::kPrimary);
608 mother->SetFlags(esdTrack->GetStatus());
609 mother->ConvertAliPIDtoAODPID();
610 primary->AddDaughter(mother);
611 mother->ConvertAliPIDtoAODPID();
614 // cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
615 // << " track " << imother << " has already been used!" << endl;
618 // Add the kink vertex
619 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
621 AliAODVertex * vkink =
622 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
626 esdTrack->GetID(), // This is the track ID of the mother's track!
627 AliAODVertex::kKink);
628 // Add the daughter track
630 AliAODTrack * daughter = NULL;
632 if (!usedTrack[idaughter]) {
634 usedTrack[idaughter] = kTRUE;
636 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
637 esdTrack->GetPxPyPz(p);
638 esdTrack->GetXYZ(pos);
639 esdTrack->GetCovarianceXYZPxPyPz(covTr);
640 esdTrack->GetESDpid(pid);
643 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
644 esdTrack->GetLabel(),
650 (Short_t)esdTrack->GetSign(),
651 esdTrack->GetITSClusterMap(),
654 kTRUE, // check if this is right
655 kTRUE, // check if this is right
656 AliAODTrack::kPrimary);
657 daughter->SetFlags(esdTrack->GetStatus());
658 daughter->ConvertAliPIDtoAODPID();
659 vkink->AddDaughter(daughter);
660 daughter->ConvertAliPIDtoAODPID();
663 // cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
664 // << " track " << idaughter << " has already been used!" << endl;
672 // Tracks (primary and orphan)
674 if (fDebug > 0) printf("NUMBER OF TRACKS %5d\n", nTracks);
676 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
679 if (usedTrack[nTrack]) continue;
681 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
682 UInt_t selectInfo = 0;
686 selectInfo = fTrackFilter->IsSelected(esdTrack);
687 if (!selectInfo) continue;
691 esdTrack->GetPxPyPz(p);
692 esdTrack->GetXYZ(pos);
693 esdTrack->GetCovarianceXYZPxPyPz(covTr);
694 esdTrack->GetESDpid(pid);
696 Float_t impactXY, impactZ;
698 esdTrack->GetImpactParameters(impactXY,impactZ);
701 // track inside the beam pipe
703 primary->AddDaughter(aodTrack =
704 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
705 esdTrack->GetLabel(),
711 (Short_t)esdTrack->GetSign(),
712 esdTrack->GetITSClusterMap(),
715 kTRUE, // check if this is right
716 kTRUE, // check if this is right
717 AliAODTrack::kPrimary,
720 aodTrack->SetFlags(esdTrack->GetStatus());
721 aodTrack->ConvertAliPIDtoAODPID();
724 // outside the beam pipe: orphan track
725 // Don't write them anymore!
729 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
730 esdTrack->GetLabel(),
736 (Short_t)esdTrack->GetSign(),
737 esdTrack->GetITSClusterMap(),
740 kFALSE, // check if this is right
741 kFALSE, // check if this is right
742 AliAODTrack::kOrphan,
744 aodTrack->SetFlags(esdTrack->GetStatus());
745 aodTrack->ConvertAliPIDtoAODPID();
748 } // end of loop on tracks
750 tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
752 // Access to the AOD container of PMD clusters
753 TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
754 Int_t jPmdClusters=0;
756 for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
757 // file pmd clusters, to be revised!
758 AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
761 Double_t pos[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ() };
762 Double_t pid[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
764 // assoc cluster not set
765 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), pos, pid);
768 // Access to the AOD container of clusters
769 TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
772 for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
774 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
776 Int_t id = cluster->GetID();
777 Int_t nLabel = cluster->GetNLabels();
778 TArrayI* labels = cluster->GetLabels();
780 if (labels) label = (cluster->GetLabels())->GetArray();
782 Float_t energy = cluster->E();
783 cluster->GetPosition(posF);
784 Char_t ttype = AliAODCluster::kUndef;
786 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
787 ttype=AliAODCluster::kPHOSNeutral;
789 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
790 ttype = AliAODCluster::kEMCALClusterv1;
794 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
802 caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
803 cluster->GetClusterDisp(),
804 cluster->GetM20(), cluster->GetM02(),
805 cluster->GetEmcCpvDistance(),
806 cluster->GetNExMax(),cluster->GetTOF()) ;
808 caloCluster->SetNCells(cluster->GetNCells());
809 caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
810 caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
812 TArrayI* matchedT = cluster->GetTracksMatched();
814 for (Int_t im = 0; im < matchedT->GetSize(); im++) {
815 caloCluster->AddTrackMatched((esd->GetTrack(im)));
820 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
821 // end of loop on calo clusters
823 // fill EMCAL cell info
824 if (esd->GetEMCALCells()) { // protection against missing ESD information
825 AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
826 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
828 AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
829 aodEMcells.CreateContainer(nEMcell);
830 aodEMcells.SetType(AliAODCaloCells::kEMCAL);
831 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
832 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
837 // fill PHOS cell info
838 if (esd->GetPHOSCells()) { // protection against missing ESD information
839 AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
840 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
842 AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
843 aodPHcells.CreateContainer(nPHcell);
844 aodPHcells.SetType(AliAODCaloCells::kPHOS);
845 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
846 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
852 AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
853 const AliMultiplicity *mult = esd->GetMultiplicity();
855 if (mult->GetNumberOfTracklets()>0) {
856 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
858 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
859 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0), mult->GetLabel(n, 1));
863 //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
873 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
875 // Terminate analysis
877 if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");