4 #include "AliAODEvent.h"
6 #include "AliESDtrack.h"
7 #include "AliESDVertex.h"
12 void CreateAODfromESD(const char *inFileName = "AliESD.root", const char *outFileName = "AliAOD.root") {
14 // create an AliAOD object
15 AliAODEvent *aod = new AliAODEvent();
16 aod->CreateStdContent();
19 TFile *outFile = TFile::Open(outFileName, "RECREATE");
22 TTree *aodTree = new TTree("AOD", "AliAOD tree");
23 aodTree->Branch(aod->GetList());
26 TFile *inFile = TFile::Open(inFileName, "READ");
27 TTree *t = (TTree*) inFile->Get("esdTree");
28 TBranch *b = t->GetBranch("ESD");
32 Int_t nEvents = b->GetEntries();
34 // loop over events and fill them
35 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
38 // Multiplicity information needed by the header (to be revised!)
39 Int_t nTracks = esd->GetNumberOfTracks();
41 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
42 if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
45 aod->AddHeader(new AliAODHeader(esd ->GetEventNumber(),
50 esd->GetMagneticField(),
51 -999., // centrality; to be filled, still
52 esd->GetTriggerMask(),
53 esd->GetTriggerCluster(),
54 esd->GetEventType()));
56 Int_t nV0s = esd->GetNumberOfV0s();
57 Int_t nCascades = esd->GetNumberOfCascades();
58 Int_t nKinks = esd->GetNumberOfKinks();
59 Int_t nVertices = nV0s + nCascades + nKinks;
61 aod->ResetStd(nTracks, nVertices);
64 // Array to take into account the tracks already added to the AOD
65 Bool_t * usedTrack = NULL;
67 usedTrack = new Bool_t[nTracks];
68 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
70 // Array to take into account the V0s already added to the AOD
71 Bool_t * usedV0 = NULL;
73 usedV0 = new Bool_t[nV0s];
74 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
77 // Access to the AOD container of vertices
78 TClonesArray &vertices = *(aod->GetVertices());
81 // Access to the AOD container of tracks
82 TClonesArray &tracks = *(aod->GetTracks());
85 // Add primary vertex. The primary tracks will be defined
86 // after the loops on the composite objects (V0, cascades, kinks)
87 const AliESDVertex *vtx = esd->GetPrimaryVertex();
90 vtx->GetXYZ(pos); // position
92 vtx->GetCovMatrix(cov); //covariance matrix
94 AliAODVertex * primary = new(vertices[jVertices++])
95 AliAODVertex(pos, cov, vtx->GetChi2(), NULL, AliAODVertex::kPrimary);
97 // Create vertices starting from the most complex objects
100 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
101 AliESDcascade *cascade = esd->GetCascade(nCascade);
104 cascade->GetXYZ(posXi[0], posXi[1], posXi[2]);
106 cascade->GetPosCovXi(covXi);
108 // Add the cascade vertex
109 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(posXi,
111 cascade->GetChi2Xi(),
113 AliAODVertex::kCascade);
115 primary->AddDaughter(vcascade);
117 // Add the V0 from the cascade. The ESD class have to be optimized...
118 // Now we have to search for the corresponding Vo in the list of V0s
119 // using the indeces of the positive and negative tracks
121 Int_t posFromV0 = cascade->GetPindex();
122 Int_t negFromV0 = cascade->GetNindex();
128 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
130 v0 = esd->GetV0(iV0);
131 Int_t pos = v0->GetPindex();
132 Int_t neg = v0->GetNindex();
134 if (pos==posFromV0 && neg==negFromV0) {
140 AliAODVertex * vV0FromCascade = 0x0;
144 usedV0[indV0] = kTRUE;
147 v0->GetXYZ(posV0[0], posV0[1], posV0[2]);
149 v0->GetPosCov(covV0);
151 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(posV0,
159 cascade->GetXYZ(posV0[0], posV0[1], posV0[2]);
161 cascade->GetPosCov(covV0);
163 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(posV0,
168 vcascade->AddDaughter(vV0FromCascade);
171 // Add the positive tracks from the V0
173 usedTrack[posFromV0] = kTRUE;
176 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
179 esdTrack->GetPxPyPz(p);
185 esdTrack->GetCovarianceXYZPxPyPz(cov);
188 esdTrack->GetESDpid(pid);
190 vV0FromCascade->AddDaughter(
191 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
192 esdTrack->GetLabel(),
197 (Short_t)esdTrack->GetSign(),
198 esdTrack->GetITSClusterMap(),
201 AliAODTrack::kSecondary)
205 // Add the negative tracks from the V0
207 usedTrack[negFromV0] = kTRUE;
210 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
213 esdTrack->GetPxPyPz(p);
219 esdTrack->GetCovarianceXYZPxPyPz(cov);
222 esdTrack->GetESDpid(pid);
224 vV0FromCascade->AddDaughter(
225 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
226 esdTrack->GetLabel(),
232 (Short_t)esdTrack->GetSign(),
233 esdTrack->GetITSClusterMap(),
236 AliAODTrack::kSecondary)
240 // Add the bachelor track from the cascade
242 Int_t bachelor = cascade->GetBindex();
244 usedTrack[bachelor] = kTRUE;
247 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
250 esdTrack->GetPxPyPz(p);
256 esdTrack->GetCovarianceXYZPxPyPz(cov);
259 esdTrack->GetESDpid(pid);
261 vcascade->AddDaughter(
262 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
263 esdTrack->GetLabel(),
269 (Short_t)esdTrack->GetSign(),
270 esdTrack->GetITSClusterMap(),
273 AliAODTrack::kSecondary)
277 // Add the primary track of the cascade (if any)
283 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
285 if (usedV0[nV0]) continue; // skip if aready added to the AOD
287 AliESDv0 *v0 = esd->GetV0(nV0);
290 v0->GetXYZ(posV0[0], posV0[1], posV0[2]);
292 v0->GetPosCov(covV0);
295 new(vertices[jVertices++]) AliAODVertex(posV0,
300 primary->AddDaughter(vV0);
302 Int_t posFromV0 = v0->GetPindex();
303 Int_t negFromV0 = v0->GetNindex();
305 // Add the positive tracks from the V0
307 usedTrack[posFromV0] = kTRUE;
310 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
313 esdTrack->GetPxPyPz(p);
319 esdTrack->GetCovarianceXYZPxPyPz(cov);
322 esdTrack->GetESDpid(pid);
325 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
326 esdTrack->GetLabel(),
331 (Short_t)esdTrack->GetSign(),
332 esdTrack->GetITSClusterMap(),
335 AliAODTrack::kSecondary)
339 // Add the negative tracks from the V0
341 usedTrack[negFromV0] = kTRUE;
344 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
347 esdTrack->GetPxPyPz(p);
353 esdTrack->GetCovarianceXYZPxPyPz(cov);
356 esdTrack->GetESDpid(pid);
359 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
360 esdTrack->GetLabel(),
366 (Short_t)esdTrack->GetSign(),
367 esdTrack->GetITSClusterMap(),
370 AliAODTrack::kSecondary)
378 for (Int_t nKink = 0; nKink < nKinks; ++nKink) {
380 AliESDkink *kink = esd->GetKink(nKink);
382 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
386 AliAODVertex::kKink); // create a vtx
391 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
394 if (usedTrack[nTrack]) continue;
396 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
399 esdTrack->GetPxPyPz(p);
405 esdTrack->GetCovarianceXYZPxPyPz(cov);
408 esdTrack->GetESDpid(pid);
410 primary->AddDaughter(
411 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
412 esdTrack->GetLabel(),
418 (Short_t)esdTrack->GetSign(),
419 esdTrack->GetITSClusterMap(),
422 AliAODTrack::kPrimary)
427 // fill the tree for this event
431 aodTree->GetUserInfo()->Add(aod);
436 // write the tree to the specified file
437 outFile = aodTree->GetCurrentFile();