1 #if !defined(__CINT__) || defined(__MAKECINT__)
8 #include "AliAODEvent.h"
9 #include "AliAODHeader.h"
10 #include "AliAODVertex.h"
11 #include "AliAODTrack.h"
12 #include "AliAODCluster.h"
15 #include "AliESDtrack.h"
16 #include "AliESDVertex.h"
18 #include "AliESDcascade.h"
19 #include "AliESDCaloCluster.h"
23 void CreateAODfromESD(const char *inFileName = "AliESDs.root",
24 const char *outFileName = "AliAOD.root") {
26 // create an AliAOD object
27 AliAODEvent *aod = new AliAODEvent();
28 aod->CreateStdContent();
31 TFile *outFile = TFile::Open(outFileName, "RECREATE");
34 TTree *aodTree = new TTree("AOD", "AliAOD tree");
35 aodTree->Branch(aod->GetList());
38 TFile *inFile = TFile::Open(inFileName, "READ");
39 TTree *t = (TTree*) inFile->Get("esdTree");
40 TBranch *b = t->GetBranch("ESD");
44 Int_t nEvents = b->GetEntries();
46 // loop over events and fill them
47 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
50 // Multiplicity information needed by the header (to be revised!)
51 Int_t nTracks = esd->GetNumberOfTracks();
53 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
54 if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
57 aod->AddHeader(new AliAODHeader(esd->GetRunNumber(),
58 esd->GetBunchCrossNumber(),
59 esd->GetOrbitNumber(),
63 esd->GetMagneticField(),
64 -999., // centrality; to be filled, still
65 esd->GetTriggerMask(),
66 esd->GetTriggerCluster(),
67 esd->GetEventType()));
69 Int_t nV0s = esd->GetNumberOfV0s();
70 Int_t nCascades = esd->GetNumberOfCascades();
71 Int_t nKinks = esd->GetNumberOfKinks();
72 Int_t nVertices = nV0s + nCascades + nKinks;
74 aod->ResetStd(nTracks, nVertices);
77 // Array to take into account the tracks already added to the AOD
78 Bool_t * usedTrack = NULL;
80 usedTrack = new Bool_t[nTracks];
81 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
83 // Array to take into account the V0s already added to the AOD
84 Bool_t * usedV0 = NULL;
86 usedV0 = new Bool_t[nV0s];
87 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
89 // Array to take into account the kinks already added to the AOD
90 Bool_t * usedKink = NULL;
92 usedKink = new Bool_t[nKinks];
93 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
96 // Access to the AOD container of vertices
97 TClonesArray &vertices = *(aod->GetVertices());
100 // Access to the AOD container of tracks
101 TClonesArray &tracks = *(aod->GetTracks());
104 // Add primary vertex. The primary tracks will be defined
105 // after the loops on the composite objects (V0, cascades, kinks)
106 const AliESDVertex *vtx = esd->GetPrimaryVertex();
109 vtx->GetXYZ(pos); // position
110 Double_t covVtx[6]; // We have to give changing names to the variables (like cov?, x?, and p?) because CINT doesn't recognize blocks correctly.
111 vtx->GetCovMatrix(covVtx); //covariance matrix
113 AliAODVertex * primary = new(vertices[jVertices++])
114 AliAODVertex(pos, covVtx, vtx->GetChi2(), NULL, AliAODVertex::kPrimary);
116 // Create vertices starting from the most complex objects
119 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
120 AliESDcascade *cascade = esd->GetCascade(nCascade);
123 cascade->GetXYZ(posXi[0], posXi[1], posXi[2]);
125 cascade->GetPosCovXi(covXi);
127 // Add the cascade vertex
128 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(posXi,
130 cascade->GetChi2Xi(),
132 AliAODVertex::kCascade);
134 primary->AddDaughter(vcascade);
136 // Add the V0 from the cascade. The ESD class have to be optimized...
137 // Now we have to search for the corresponding Vo in the list of V0s
138 // using the indeces of the positive and negative tracks
140 Int_t posFromV0 = cascade->GetPindex();
141 Int_t negFromV0 = cascade->GetNindex();
147 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
149 v0 = esd->GetV0(iV0);
150 Int_t posV0 = v0->GetPindex();
151 Int_t negV0 = v0->GetNindex();
153 if (posV0==posFromV0 && negV0==negFromV0) {
159 AliAODVertex * vV0FromCascade = 0x0;
161 if (indV0>-1 && !usedV0[indV0] ) {
163 // the V0 exists in the array of V0s and is not used
165 usedV0[indV0] = kTRUE;
168 v0->GetXYZ(posV0[0], posV0[1], posV0[2]);
170 v0->GetPosCov(covV0_1);
172 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(posV0,
179 // the V0 doesn't exist in the array of V0s or was used
180 cerr << "Error: event " << iEvent << " cascade " << nCascade
181 << " The V0 " << indV0
182 << " doesn't exist in the array of V0s or was used!" << endl;
185 cascade->GetXYZ(posV0_2[0], posV0_2[1], posV0_2[2]);
187 cascade->GetPosCov(covV0_2);
189 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(posV0_2,
194 vcascade->AddDaughter(vV0FromCascade);
197 // Add the positive tracks from the V0
199 if (! usedTrack[posFromV0]) {
201 usedTrack[posFromV0] = kTRUE;
203 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
206 esdTrack->GetPxPyPz(p1);
209 esdTrack->GetXYZ(x1);
211 Double_t covV0PosTr[21];
212 esdTrack->GetCovarianceXYZPxPyPz(covV0PosTr);
215 esdTrack->GetESDpid(pid1);
217 vV0FromCascade->AddDaughter(
218 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
219 esdTrack->GetLabel(),
225 (Short_t)esdTrack->GetSign(),
226 esdTrack->GetITSClusterMap(),
229 AliAODTrack::kSecondary)
233 cerr << "Error: event " << iEvent << " cascade " << nCascade
234 << " track " << posFromV0 << " has already been used!" << endl;
237 // Add the negative tracks from the V0
239 if (!usedTrack[negFromV0]) {
241 usedTrack[negFromV0] = kTRUE;
243 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
246 esdTrack->GetPxPyPz(p2);
249 esdTrack->GetXYZ(x2);
251 Double_t covV0NegTr[21];
252 esdTrack->GetCovarianceXYZPxPyPz(covV0NegTr);
255 esdTrack->GetESDpid(pid2);
257 vV0FromCascade->AddDaughter(
258 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
259 esdTrack->GetLabel(),
265 (Short_t)esdTrack->GetSign(),
266 esdTrack->GetITSClusterMap(),
269 AliAODTrack::kSecondary)
273 cerr << "Error: event " << iEvent << " cascade " << nCascade
274 << " track " << negFromV0 << " has already been used!" << endl;
277 // Add the bachelor track from the cascade
279 Int_t bachelor = cascade->GetBindex();
281 if(!usedTrack[bachelor]) {
283 usedTrack[bachelor] = kTRUE;
285 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
288 esdTrack->GetPxPyPz(p3);
291 esdTrack->GetXYZ(x3);
293 Double_t covXiTr[21];
294 esdTrack->GetCovarianceXYZPxPyPz(covXiTr);
297 esdTrack->GetESDpid(pid3);
299 vcascade->AddDaughter(
300 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
301 esdTrack->GetLabel(),
307 (Short_t)esdTrack->GetSign(),
308 esdTrack->GetITSClusterMap(),
311 AliAODTrack::kSecondary)
315 cerr << "Error: event " << iEvent << " cascade " << nCascade
316 << " track " << bachelor << " has already been used!" << endl;
319 // Add the primary track of the cascade (if any)
321 } // end of the loop on cascades
325 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
327 if (usedV0[nV0]) continue; // skip if aready added to the AOD
329 AliESDv0 *v0 = esd->GetV0(nV0);
332 v0->GetXYZ(posV0_3[0], posV0_3[1], posV0_3[2]);
334 v0->GetPosCov(covV0_3);
337 new(vertices[jVertices++]) AliAODVertex(posV0_3,
342 primary->AddDaughter(vV0);
344 Int_t posFromV0 = v0->GetPindex();
345 Int_t negFromV0 = v0->GetNindex();
347 // Add the positive tracks from the V0
349 if (!usedTrack[posFromV0]) {
351 usedTrack[posFromV0] = kTRUE;
353 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
356 esdTrack->GetPxPyPz(p4);
359 esdTrack->GetXYZ(x4);
361 Double_t covV0PosTr_2[21];
362 esdTrack->GetCovarianceXYZPxPyPz(covV0PosTr_2);
365 esdTrack->GetESDpid(pid4);
368 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
369 esdTrack->GetLabel(),
375 (Short_t)esdTrack->GetSign(),
376 esdTrack->GetITSClusterMap(),
379 AliAODTrack::kSecondary)
383 cerr << "Error: event " << iEvent << " V0 " << nV0
384 << " track " << posFromV0 << " has already been used!" << endl;
387 // Add the negative tracks from the V0
389 if (!usedTrack[negFromV0]) {
391 usedTrack[negFromV0] = kTRUE;
393 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
396 esdTrack->GetPxPyPz(p5);
399 esdTrack->GetXYZ(x5);
401 Double_t covV0NegTr_2[21];
402 esdTrack->GetCovarianceXYZPxPyPz(covV0NegTr_2);
405 esdTrack->GetESDpid(pid5);
408 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
409 esdTrack->GetLabel(),
415 (Short_t)esdTrack->GetSign(),
416 esdTrack->GetITSClusterMap(),
419 AliAODTrack::kSecondary)
423 cerr << "Error: event " << iEvent << " V0 " << nV0
424 << " track " << negFromV0 << " has already been used!" << endl;
427 } // end of the loop on V0s
429 // Kinks: it is a big mess the access to the information in the kinks
430 // The loop is on the tracks in order to find the mother and daugther of each kink
433 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
436 AliESDtrack * track = esd->GetTrack(iTrack);
439 Int_t ikink = track->GetKinkIndex(0);
442 // Negative kink index: mother, positive: daughter
444 // Search for the second track of the kink
446 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
448 AliESDtrack * track1 = esd->GetTrack(jTrack);
450 Int_t jkink = track1->GetKinkIndex(0);
452 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
454 // The two tracks are from the same kink
456 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
459 Int_t idaughter = -1;
461 if (ikink<0 && jkink>0) {
466 else if (ikink>0 && jkink<0) {
472 cerr << "Error: Wrong combination of kink indexes: "
473 << ikink << " " << jkink << endl;
477 // Add the mother track
479 AliAODTrack * mother = NULL;
481 if (!usedTrack[imother]) {
483 usedTrack[imother] = kTRUE;
485 AliESDtrack *esdTrack = esd->GetTrack(imother);
488 esdTrack->GetPxPyPz(p6);
491 esdTrack->GetXYZ(x6);
493 Double_t covKinkMother[21];
494 esdTrack->GetCovarianceXYZPxPyPz(covKinkMother);
497 esdTrack->GetESDpid(pid6);
500 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
501 esdTrack->GetLabel(),
507 (Short_t)esdTrack->GetSign(),
508 esdTrack->GetITSClusterMap(),
511 AliAODTrack::kPrimary);
512 primary->AddDaughter(mother);
515 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
516 << " track " << imother << " has already been used!" << endl;
519 // Add the kink vertex
520 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
522 AliAODVertex * vkink =
523 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
527 AliAODVertex::kKink);
528 // Add the daughter track
530 AliAODTrack * daughter = NULL;
532 if (!usedTrack[idaughter]) {
534 usedTrack[idaughter] = kTRUE;
536 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
539 esdTrack->GetPxPyPz(p7);
542 esdTrack->GetXYZ(x7);
544 Double_t covKinkDaughter[21];
545 esdTrack->GetCovarianceXYZPxPyPz(covKinkDaughter);
548 esdTrack->GetESDpid(pid7);
551 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
552 esdTrack->GetLabel(),
558 (Short_t)esdTrack->GetSign(),
559 esdTrack->GetITSClusterMap(),
562 AliAODTrack::kPrimary);
563 vkink->AddDaughter(daughter);
566 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
567 << " track " << idaughter << " has already been used!" << endl;
579 // Tracks (primary and orphan)
581 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
584 if (usedTrack[nTrack]) continue;
586 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
589 esdTrack->GetPxPyPz(p8);
592 esdTrack->GetXYZ(x8);
595 esdTrack->GetCovarianceXYZPxPyPz(covTr);
598 esdTrack->GetESDpid(pid8);
600 Float_t impactXY, impactZ;
602 esdTrack->GetImpactParameters(impactXY,impactZ);
605 // track inside the beam pipe
607 primary->AddDaughter(
608 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
609 esdTrack->GetLabel(),
615 (Short_t)esdTrack->GetSign(),
616 esdTrack->GetITSClusterMap(),
619 AliAODTrack::kPrimary)
623 // outside the beam pipe: orphan track
624 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
625 esdTrack->GetLabel(),
631 (Short_t)esdTrack->GetSign(),
632 esdTrack->GetITSClusterMap(),
635 AliAODTrack::kOrphan);
637 } // end of loop on tracks
640 // Access to the AOD container of vertices
641 TClonesArray &clusters = *(aod->GetClusters());
645 Int_t nClusters = esd->GetNumberOfCaloClusters();
647 for (Int_t iClust=0; iClust<nClusters; ++iClust) {
649 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
651 Int_t id = cluster->GetID();
653 Float_t energy = cluster->GetClusterEnergy();
655 cluster->GetGlobalPosition(x9);
656 Float_t * covMatrix = NULL;
657 Float_t * pid9 = NULL;
658 AliAODVertex *prodVertex = primary;
659 AliAODTrack *primTrack = NULL;
660 Char_t ttype=AliAODCluster::kUndef;
662 if (cluster->IsPHOS()) ttype=AliAODCluster::kPHOSNeutral;
663 else if (cluster->IsEMCAL()) {
665 if (cluster->GetClusterType() == AliESDCaloCluster::kPseudoCluster)
666 ttype = AliAODCluster::kEMCALPseudoCluster;
668 ttype = AliAODCluster::kEMCALClusterv1;
672 new(clusters[jClusters++]) AliAODCluster(id,
682 } // end of loop on clusters
689 // fill the tree for this event
691 } // end of event loop
693 aodTree->GetUserInfo()->Add(aod);
698 // write the tree to the specified file
699 outFile = aodTree->GetCurrentFile();