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 **************************************************************************/
18 //-----------------------------------------------------------------
19 // Implementation of the ESD class
20 // This is the class to deal with during the phisical analysis of data
21 // This class is generated directly by the reconstruction methods
22 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
23 //-----------------------------------------------------------------
26 #include "AliESDfriend.h"
28 #include "AliAODEvent.h"
29 #include "AliAODHeader.h"
30 #include "AliAODVertex.h"
31 #include "AliAODTrack.h"
32 #include "AliAODCluster.h"
37 //______________________________________________________________________________
39 fEventNumberInFile(0),
61 fTracks("AliESDtrack",15000),
62 fHLTConfMapTracks("AliESDHLTtrack",25000),
63 fHLTHoughTracks("AliESDHLTtrack",15000),
64 fMuonTracks("AliESDMuonTrack",30),
65 fPmdTracks("AliESDPmdTrack",3000),
66 fTrdTracks("AliESDTrdTrack",300),
68 fCascades("AliESDcascade",20),
69 fKinks("AliESDkink",4000),
70 fCaloClusters("AliESDCaloCluster",10000),
72 fFirstEMCALCluster(-1),
73 fEMCALTriggerPosition(0x0),
74 fEMCALTriggerAmplitudes(0x0),
76 fFirstPHOSCluster(-1),
77 fPHOSTriggerPosition(0x0),
78 fPHOSTriggerAmplitudes(0x0),
81 fErrorLogs("AliRawDataErrorLog",5)
84 for (Int_t i=0; i<24; i++) {
88 for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
89 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=0.;
91 //______________________________________________________________________________
92 AliESD::AliESD(const AliESD& esd):
94 fEventNumberInFile(esd.fEventNumberInFile),
95 fBunchCrossNumber(esd.fBunchCrossNumber),
96 fOrbitNumber(esd.fOrbitNumber),
97 fPeriodNumber(esd.fPeriodNumber),
98 fRunNumber(esd.fRunNumber),
99 fTimeStamp(esd.fTimeStamp),
100 fEventType(esd.fEventType),
101 fTriggerMask(esd.fTriggerMask),
102 fTriggerCluster(esd.fTriggerCluster),
103 fRecoVersion(esd.fRecoVersion),
104 fMagneticField(esd.fMagneticField),
105 fZDCN1Energy(esd.fZDCN1Energy),
106 fZDCP1Energy(esd.fZDCP1Energy),
107 fZDCN2Energy(esd.fZDCN2Energy),
108 fZDCP2Energy(esd.fZDCP2Energy),
109 fZDCEMEnergy(esd.fZDCEMEnergy),
110 fZDCParticipants(esd.fZDCParticipants),
111 fT0zVertex(esd.fT0zVertex),
112 fSPDVertex(esd.fSPDVertex),
113 fPrimaryVertex(esd.fPrimaryVertex),
114 fSPDMult(esd.fSPDMult),
115 fT0timeStart(esd.fT0timeStart),
116 fTracks(*((TClonesArray*)esd.fTracks.Clone())),
117 fHLTConfMapTracks(*((TClonesArray*)esd.fHLTConfMapTracks.Clone())),
118 fHLTHoughTracks(*((TClonesArray*)esd.fHLTHoughTracks.Clone())),
119 fMuonTracks(*((TClonesArray*)esd.fMuonTracks.Clone())),
120 fPmdTracks(*((TClonesArray*)esd.fPmdTracks.Clone())),
121 fTrdTracks(*((TClonesArray*)esd.fTrdTracks.Clone())),
122 fV0s(*((TClonesArray*)esd.fV0s.Clone())),
123 fCascades(*((TClonesArray*)esd.fCascades.Clone())),
124 fKinks(*((TClonesArray*)esd.fKinks.Clone())),
125 fCaloClusters(*((TClonesArray*)esd.fCaloClusters.Clone())),
126 fEMCALClusters(esd.fEMCALClusters),
127 fFirstEMCALCluster(esd.fFirstEMCALCluster),
128 fEMCALTriggerPosition(esd. fEMCALTriggerPosition),
129 fEMCALTriggerAmplitudes(esd.fEMCALTriggerAmplitudes),
130 fPHOSClusters(esd.fPHOSClusters),
131 fFirstPHOSCluster(esd.fFirstPHOSCluster),
132 fPHOSTriggerPosition(esd.fPHOSTriggerPosition),
133 fPHOSTriggerAmplitudes(esd.fPHOSTriggerAmplitudes),
134 fESDFMD(esd.fESDFMD),
135 fESDVZERO(esd.fESDVZERO),
136 fErrorLogs(*((TClonesArray*)esd.fErrorLogs.Clone()))
138 for (Int_t i=0; i<24; i++) {
139 fT0time[i] = esd.fT0time[i];
140 fT0amplitude[i] = esd.fT0amplitude[i];
142 for (Int_t i=0; i<2; i++) fDiamondXY[i]=esd.fDiamondXY[i];
143 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
146 //______________________________________________________________________________
147 AliESD & AliESD::operator=(const AliESD& source) {
149 // Assignment operator
151 if(&source == this) return *this;
153 fEventNumberInFile = source.fEventNumberInFile;
154 fBunchCrossNumber = source.fBunchCrossNumber;
155 fOrbitNumber = source.fOrbitNumber;
156 fPeriodNumber = source.fPeriodNumber;
157 fRunNumber = source.fRunNumber;
158 fTimeStamp = source.fTimeStamp;
159 fEventType = source.fEventType;
160 fTriggerMask = source.fTriggerMask;
161 fTriggerCluster = source.fTriggerCluster;
162 fRecoVersion = source.fRecoVersion;
163 fMagneticField = source.fMagneticField;
164 fZDCN1Energy = source.fZDCN1Energy;
165 fZDCP1Energy = source.fZDCP1Energy;
166 fZDCN2Energy = source.fZDCN2Energy;
167 fZDCP2Energy = source.fZDCP2Energy;
168 fZDCEMEnergy = source.fZDCEMEnergy;
169 fZDCParticipants = source.fZDCParticipants;
170 fT0zVertex = source.fT0zVertex;
171 fSPDVertex = source.fSPDVertex;
172 fPrimaryVertex = source.fPrimaryVertex;
173 fSPDMult = source.fSPDMult;
174 fT0timeStart = source.fT0timeStart;
175 fTracks = *((TClonesArray*)source.fTracks.Clone());
176 fHLTConfMapTracks = *((TClonesArray*)source.fHLTConfMapTracks.Clone());
177 fHLTHoughTracks = *((TClonesArray*)source.fHLTHoughTracks.Clone());
178 fMuonTracks = *((TClonesArray*)source.fMuonTracks.Clone());
179 fPmdTracks = *((TClonesArray*)source.fPmdTracks.Clone());
180 fTrdTracks = *((TClonesArray*)source.fTrdTracks.Clone());
181 fV0s = *((TClonesArray*)source.fV0s.Clone());
182 fCascades = *((TClonesArray*)source.fCascades.Clone());
183 fKinks = *((TClonesArray*)source.fKinks.Clone());
184 fCaloClusters = *((TClonesArray*)source.fCaloClusters.Clone());
185 fEMCALClusters = source.fEMCALClusters;
186 fFirstEMCALCluster = source.fFirstEMCALCluster;
187 fPHOSClusters = source.fPHOSClusters;
188 fFirstPHOSCluster = source.fFirstPHOSCluster;
189 fESDFMD = source.fESDFMD;
190 fESDVZERO = source.fESDVZERO;
191 fEMCALTriggerPosition=source. fEMCALTriggerPosition;
192 fEMCALTriggerAmplitudes=source.fEMCALTriggerAmplitudes;
193 fPHOSTriggerPosition=source.fPHOSTriggerPosition;
194 fPHOSTriggerAmplitudes=source.fPHOSTriggerAmplitudes;
195 fErrorLogs = *((TClonesArray*)source.fErrorLogs.Clone());
197 for (Int_t i=0; i<24; i++) {
198 fT0time[i] = source.fT0time[i];
199 fT0amplitude[i] = source.fT0amplitude[i];
201 for (Int_t i=0; i<2; i++) fDiamondXY[i]=source.fDiamondXY[i];
202 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=source.fDiamondCovXY[i];
209 //______________________________________________________________________________
213 // Standard destructor
216 fHLTConfMapTracks.Delete();
217 fHLTHoughTracks.Delete();
218 fMuonTracks.Delete();
224 fCaloClusters.Delete();
227 // fEMCALTriggerPosition->Delete();
228 // fEMCALTriggerAmplitudes->Delete();
229 // fPHOSTriggerPosition->Delete();
230 // fPHOSTriggerAmplitudes->Delete();
231 // delete fEMCALTriggerPosition;
232 // delete fEMCALTriggerAmplitudes;
233 // delete fPHOSTriggerPosition;
234 // delete fPHOSTriggerAmplitudes;
239 //______________________________________________________________________________
242 fEventNumberInFile=0;
261 new (&fSPDVertex) AliESDVertex();
262 new (&fPrimaryVertex) AliESDVertex();
263 new (&fSPDMult) AliMultiplicity();
265 fHLTConfMapTracks.Clear();
266 fHLTHoughTracks.Clear();
272 fCaloClusters.Clear();
274 fFirstEMCALCluster=-1;
276 fFirstPHOSCluster=-1;
277 if (fESDFMD) fESDFMD->Clear();
278 // fEMCALTriggerPosition->Clear();
279 // fEMCALTriggerAmplitudes->Clear();
280 // fPHOSTriggerPosition->Clear();
281 // fPHOSTriggerAmplitudes->Clear();
285 Int_t AliESD::AddV0(const AliESDv0 *v) {
289 Int_t idx=fV0s.GetEntriesFast();
290 new(fV0s[idx]) AliESDv0(*v);
294 //______________________________________________________________________________
295 void AliESD::Print(Option_t *) const
298 // Print header information of the event
300 printf("ESD run information\n");
301 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
302 GetEventNumberInFile(),
303 GetBunchCrossNumber(),
308 GetMagneticField() );
309 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
310 fPrimaryVertex.GetXv(), fPrimaryVertex.GetXRes(),
311 fPrimaryVertex.GetYv(), fPrimaryVertex.GetYRes(),
312 fPrimaryVertex.GetZv(), fPrimaryVertex.GetZRes());
313 printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
314 GetDiamondX(),GetDiamondY());
315 printf("SPD Multiplicity. Number of tracklets %d \n",
316 fSPDMult.GetNumberOfTracklets());
317 printf("Event from reconstruction version %d \n",fRecoVersion);
318 printf("Number of tracks: \n");
319 printf(" charged %d\n", GetNumberOfTracks());
320 printf(" hlt CF %d\n", GetNumberOfHLTConfMapTracks());
321 printf(" hlt HT %d\n", GetNumberOfHLTHoughTracks());
322 printf(" muon %d\n", GetNumberOfMuonTracks());
323 printf(" pmd %d\n", GetNumberOfPmdTracks());
324 printf(" trd %d\n", GetNumberOfTrdTracks());
325 printf(" v0 %d\n", GetNumberOfV0s());
326 printf(" cascades %d\n", GetNumberOfCascades());
327 printf(" kinks %d\n", GetNumberOfKinks());
328 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
329 printf(" phos %d\n", GetNumberOfPHOSClusters());
330 printf(" emcal %d\n", GetNumberOfEMCALClusters());
331 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
332 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
335 void AliESD::SetESDfriend(const AliESDfriend *ev) {
337 // Attaches the complementary info to the ESD
341 Int_t ntrk=ev->GetNumberOfTracks();
343 for (Int_t i=0; i<ntrk; i++) {
344 const AliESDfriendTrack *f=ev->GetTrack(i);
345 GetTrack(i)->SetFriendTrack(f);
349 void AliESD::GetESDfriend(AliESDfriend *ev) const {
351 // Extracts the complementary info from the ESD
355 Int_t ntrk=GetNumberOfTracks();
357 for (Int_t i=0; i<ntrk; i++) {
358 const AliESDtrack *t=GetTrack(i);
359 const AliESDfriendTrack *f=t->GetFriendTrack();
364 AliAODEvent *AliESD::CreateAOD() const {
366 // Creates and returns the standard AOD from the ESD.
367 // Make sure to delete it outside of this function!
370 // create an AliAOD object
371 AliAODEvent *aod = new AliAODEvent();
372 aod->CreateStdContent();
374 // set arrays and pointers
382 // Multiplicity information needed by the header (to be revised!)
383 Int_t nTracks = GetNumberOfTracks();
384 Int_t nPosTracks = 0;
385 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
386 if (GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
389 aod->AddHeader(new AliAODHeader(GetRunNumber(),
390 GetBunchCrossNumber(),
397 -999., // fill muon magnetic field
398 -999., // centrality; to be filled, still
408 Int_t nV0s = GetNumberOfV0s();
409 Int_t nCascades = GetNumberOfCascades();
410 Int_t nKinks = GetNumberOfKinks();
411 Int_t nVertices = nV0s + nCascades + nKinks;
413 aod->ResetStd(nTracks, nVertices);
414 AliAODTrack *aodTrack;
416 // Array to take into account the tracks already added to the AOD
417 Bool_t * usedTrack = NULL;
419 usedTrack = new Bool_t[nTracks];
420 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
422 // Array to take into account the V0s already added to the AOD
423 Bool_t * usedV0 = NULL;
425 usedV0 = new Bool_t[nV0s];
426 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
428 // Array to take into account the kinks already added to the AOD
429 Bool_t * usedKink = NULL;
431 usedKink = new Bool_t[nKinks];
432 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
435 // Access to the AOD container of vertices
436 TClonesArray &vertices = *(aod->GetVertices());
439 // Access to the AOD container of tracks
440 TClonesArray &tracks = *(aod->GetTracks());
443 // Add primary vertex. The primary tracks will be defined
444 // after the loops on the composite objects (V0, cascades, kinks)
445 const AliESDVertex *vtx = GetPrimaryVertex();
447 vtx->GetXYZ(pos); // position
448 vtx->GetCovMatrix(covVtx); //covariance matrix
450 AliAODVertex * primary = new(vertices[jVertices++])
451 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, AliAODVertex::kPrimary);
453 // Create vertices starting from the most complex objects
456 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
457 AliESDcascade *cascade = GetCascade(nCascade);
459 cascade->GetXYZ(pos[0], pos[1], pos[2]);
460 cascade->GetPosCovXi(covVtx);
462 // Add the cascade vertex
463 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
465 cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
467 AliAODVertex::kCascade);
469 primary->AddDaughter(vcascade);
471 // Add the V0 from the cascade. The ESD class have to be optimized...
472 // Now we have to search for the corresponding Vo in the list of V0s
473 // using the indeces of the positive and negative tracks
475 Int_t posFromV0 = cascade->GetPindex();
476 Int_t negFromV0 = cascade->GetNindex();
481 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
484 Int_t posV0 = v0->GetPindex();
485 Int_t negV0 = v0->GetNindex();
487 if (posV0==posFromV0 && negV0==negFromV0) {
493 AliAODVertex * vV0FromCascade = 0x0;
495 if (indV0>-1 && !usedV0[indV0] ) {
497 // the V0 exists in the array of V0s and is not used
499 usedV0[indV0] = kTRUE;
501 v0->GetXYZ(pos[0], pos[1], pos[2]);
502 v0->GetPosCov(covVtx);
504 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
506 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
511 // the V0 doesn't exist in the array of V0s or was used
512 printf("Error: cascade %d. The V0 %d doesn't exist in the array of V0s or was used!\n", nCascade, indV0);
513 cascade->GetXYZ(pos[0], pos[1], pos[2]);
514 cascade->GetPosCov(covVtx);
516 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
518 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
521 vcascade->AddDaughter(vV0FromCascade);
524 // Add the positive tracks from the V0
526 if (! usedTrack[posFromV0]) {
528 usedTrack[posFromV0] = kTRUE;
530 AliESDtrack *esdTrack = GetTrack(posFromV0);
531 esdTrack->GetPxPyPz(p);
532 esdTrack->GetXYZ(pos);
533 esdTrack->GetCovarianceXYZPxPyPz(covTr);
534 esdTrack->GetESDpid(pid);
536 vV0FromCascade->AddDaughter(
537 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
538 esdTrack->GetLabel(),
544 (Short_t)esdTrack->GetSign(),
545 esdTrack->GetITSClusterMap(),
548 kTRUE, // check if this is right
549 kFALSE, // check if this is right
550 AliAODTrack::kSecondary)
552 aodTrack->ConvertAliPIDtoAODPID();
555 printf("Error: cascade %d track %d has already been used!\n", nCascade, posFromV0);
558 // Add the negative tracks from the V0
560 if (!usedTrack[negFromV0]) {
562 usedTrack[negFromV0] = kTRUE;
564 AliESDtrack *esdTrack = GetTrack(negFromV0);
565 esdTrack->GetPxPyPz(p);
566 esdTrack->GetXYZ(pos);
567 esdTrack->GetCovarianceXYZPxPyPz(covTr);
568 esdTrack->GetESDpid(pid);
570 vV0FromCascade->AddDaughter(
571 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
572 esdTrack->GetLabel(),
578 (Short_t)esdTrack->GetSign(),
579 esdTrack->GetITSClusterMap(),
582 kTRUE, // check if this is right
583 kFALSE, // check if this is right
584 AliAODTrack::kSecondary)
586 aodTrack->ConvertAliPIDtoAODPID();
589 printf("Error: cascade %d track %d has already been used!\n", nCascade, negFromV0);
592 // Add the bachelor track from the cascade
594 Int_t bachelor = cascade->GetBindex();
596 if(!usedTrack[bachelor]) {
598 usedTrack[bachelor] = kTRUE;
600 AliESDtrack *esdTrack = GetTrack(bachelor);
601 esdTrack->GetPxPyPz(p);
602 esdTrack->GetXYZ(pos);
603 esdTrack->GetCovarianceXYZPxPyPz(covTr);
604 esdTrack->GetESDpid(pid);
606 vcascade->AddDaughter(
607 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
608 esdTrack->GetLabel(),
614 (Short_t)esdTrack->GetSign(),
615 esdTrack->GetITSClusterMap(),
618 kTRUE, // check if this is right
619 kFALSE, // check if this is right
620 AliAODTrack::kSecondary)
622 aodTrack->ConvertAliPIDtoAODPID();
625 printf("Error: cascade %d track %d has already been used!\n", nCascade, bachelor);
628 // Add the primary track of the cascade (if any)
630 } // end of the loop on cascades
634 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
636 if (usedV0[nV0]) continue; // skip if aready added to the AOD
638 AliESDv0 *v0 = GetV0(nV0);
640 v0->GetXYZ(pos[0], pos[1], pos[2]);
641 v0->GetPosCov(covVtx);
644 new(vertices[jVertices++]) AliAODVertex(pos,
646 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
649 primary->AddDaughter(vV0);
651 Int_t posFromV0 = v0->GetPindex();
652 Int_t negFromV0 = v0->GetNindex();
654 // Add the positive tracks from the V0
656 if (!usedTrack[posFromV0]) {
658 usedTrack[posFromV0] = kTRUE;
660 AliESDtrack *esdTrack = GetTrack(posFromV0);
661 esdTrack->GetPxPyPz(p);
662 esdTrack->GetXYZ(pos);
663 esdTrack->GetCovarianceXYZPxPyPz(covTr);
664 esdTrack->GetESDpid(pid);
667 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
668 esdTrack->GetLabel(),
674 (Short_t)esdTrack->GetSign(),
675 esdTrack->GetITSClusterMap(),
678 kTRUE, // check if this is right
679 kFALSE, // check if this is right
680 AliAODTrack::kSecondary)
682 aodTrack->ConvertAliPIDtoAODPID();
685 printf("Error: V0 %d track %d has already been used!\n", nV0, posFromV0);
688 // Add the negative tracks from the V0
690 if (!usedTrack[negFromV0]) {
692 usedTrack[negFromV0] = kTRUE;
694 AliESDtrack *esdTrack = GetTrack(negFromV0);
695 esdTrack->GetPxPyPz(p);
696 esdTrack->GetXYZ(pos);
697 esdTrack->GetCovarianceXYZPxPyPz(covTr);
698 esdTrack->GetESDpid(pid);
701 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
702 esdTrack->GetLabel(),
708 (Short_t)esdTrack->GetSign(),
709 esdTrack->GetITSClusterMap(),
712 kTRUE, // check if this is right
713 kFALSE, // check if this is right
714 AliAODTrack::kSecondary)
716 aodTrack->ConvertAliPIDtoAODPID();
719 printf("Error: V0 %d track %d has already been used!\n", nV0, negFromV0);
722 } // end of the loop on V0s
724 // Kinks: it is a big mess the access to the information in the kinks
725 // The loop is on the tracks in order to find the mother and daugther of each kink
727 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
730 AliESDtrack * esdTrack = GetTrack(iTrack);
732 Int_t ikink = esdTrack->GetKinkIndex(0);
735 // Negative kink index: mother, positive: daughter
737 // Search for the second track of the kink
739 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
741 AliESDtrack * esdTrack1 = GetTrack(jTrack);
743 Int_t jkink = esdTrack1->GetKinkIndex(0);
745 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
747 // The two tracks are from the same kink
749 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
752 Int_t idaughter = -1;
754 if (ikink<0 && jkink>0) {
759 else if (ikink>0 && jkink<0) {
765 printf("Error: Wrong combination of kink indexes: %d %d\n", ikink, jkink);
769 // Add the mother track
771 AliAODTrack * mother = NULL;
773 if (!usedTrack[imother]) {
775 usedTrack[imother] = kTRUE;
777 AliESDtrack *esdTrack = GetTrack(imother);
778 esdTrack->GetPxPyPz(p);
779 esdTrack->GetXYZ(pos);
780 esdTrack->GetCovarianceXYZPxPyPz(covTr);
781 esdTrack->GetESDpid(pid);
784 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
785 esdTrack->GetLabel(),
791 (Short_t)esdTrack->GetSign(),
792 esdTrack->GetITSClusterMap(),
795 kTRUE, // check if this is right
796 kTRUE, // check if this is right
797 AliAODTrack::kPrimary);
798 primary->AddDaughter(mother);
799 mother->ConvertAliPIDtoAODPID();
802 printf("Error: kink %d track %d has already been used!\n", TMath::Abs(ikink)-1, imother);
804 // Add the kink vertex
805 AliESDkink * kink = GetKink(TMath::Abs(ikink)-1);
807 AliAODVertex * vkink =
808 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
812 AliAODVertex::kKink);
813 // Add the daughter track
815 AliAODTrack * daughter = NULL;
817 if (!usedTrack[idaughter]) {
819 usedTrack[idaughter] = kTRUE;
821 AliESDtrack *esdTrack = GetTrack(idaughter);
822 esdTrack->GetPxPyPz(p);
823 esdTrack->GetXYZ(pos);
824 esdTrack->GetCovarianceXYZPxPyPz(covTr);
825 esdTrack->GetESDpid(pid);
828 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
829 esdTrack->GetLabel(),
835 (Short_t)esdTrack->GetSign(),
836 esdTrack->GetITSClusterMap(),
839 kTRUE, // check if this is right
840 kTRUE, // check if this is right
841 AliAODTrack::kPrimary);
842 vkink->AddDaughter(daughter);
843 daughter->ConvertAliPIDtoAODPID();
846 printf("Error: kink %d track %d has already been used!\n", TMath::Abs(ikink)-1, idaughter);
857 // Tracks (primary and orphan)
859 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
862 if (usedTrack[nTrack]) continue;
864 AliESDtrack *esdTrack = GetTrack(nTrack);
865 esdTrack->GetPxPyPz(p);
866 esdTrack->GetXYZ(pos);
867 esdTrack->GetCovarianceXYZPxPyPz(covTr);
868 esdTrack->GetESDpid(pid);
870 Float_t impactXY, impactZ;
872 esdTrack->GetImpactParameters(impactXY,impactZ);
875 // track inside the beam pipe
877 primary->AddDaughter(
878 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
879 esdTrack->GetLabel(),
885 (Short_t)esdTrack->GetSign(),
886 esdTrack->GetITSClusterMap(),
889 kTRUE, // check if this is right
890 kTRUE, // check if this is right
891 AliAODTrack::kPrimary)
893 aodTrack->ConvertAliPIDtoAODPID();
896 // outside the beam pipe: orphan track
898 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
899 esdTrack->GetLabel(),
905 (Short_t)esdTrack->GetSign(),
906 esdTrack->GetITSClusterMap(),
909 kFALSE, // check if this is right
910 kFALSE, // check if this is right
911 AliAODTrack::kOrphan);
912 aodTrack->ConvertAliPIDtoAODPID();
914 } // end of loop on tracks
917 Int_t nMuTracks = GetNumberOfMuonTracks();
918 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
920 AliESDMuonTrack *esdMuTrack = GetMuonTrack(nMuTrack);
921 p[0] = esdMuTrack->Px();
922 p[1] = esdMuTrack->Py();
923 p[2] = esdMuTrack->Pz();
924 pos[0] = primary->GetX();
925 pos[1] = primary->GetY();
926 pos[2] = primary->GetZ();
928 // has to be changed once the muon pid is provided by the ESD
929 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
931 primary->AddDaughter(
932 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
933 0, // no label provided
938 NULL, // no covariance matrix provided
939 (Short_t)-99, // no charge provided
940 0, // no ITSClusterMap
943 kTRUE, // check if this is right
944 kTRUE, // not used for vertex fit
945 AliAODTrack::kPrimary)
949 // Access to the AOD container of clusters
950 TClonesArray &clusters = *(aod->GetClusters());
954 Int_t nClusters = GetNumberOfCaloClusters();
956 for (Int_t iClust=0; iClust<nClusters; ++iClust) {
958 AliESDCaloCluster * cluster = GetCaloCluster(iClust);
960 Int_t id = cluster->GetID();
962 Float_t energy = cluster->GetClusterEnergy();
963 cluster->GetGlobalPosition(posF);
964 AliAODVertex *prodVertex = primary;
965 AliAODTrack *primTrack = NULL;
966 Char_t ttype=AliAODCluster::kUndef;
968 if (cluster->IsPHOS()) ttype=AliAODCluster::kPHOSNeutral;
969 else if (cluster->IsEMCAL()) {
971 if (cluster->GetClusterType() == AliESDCaloCluster::kPseudoCluster)
972 ttype = AliAODCluster::kEMCALPseudoCluster;
974 ttype = AliAODCluster::kEMCALClusterv1;
978 new(clusters[jClusters++]) AliAODCluster(id,
982 NULL, // no covariance matrix provided
983 NULL, // no pid for clusters provided
988 } // end of loop on calo clusters