]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/CreateAODfromESD.C
Some more classes moved from libSTEER to libSTEERBase.
[u/mrichter/AliRoot.git] / STEER / CreateAODfromESD.C
index 0572a048cfdede1d19169146526c1b7df67fd109..26c5fa933878f43a81c12cf8deffd5e00eba3ba6 100644 (file)
@@ -6,15 +6,18 @@
 #include <TMath.h>
 
 #include "AliAODEvent.h"
+#include "AliAODHeader.h"
 #include "AliAODVertex.h"
 #include "AliAODTrack.h"
 #include "AliAODCluster.h"
+#include "AliAODTracklets.h"
 
-#include "AliESD.h"
+#include "AliESDEvent.h"
 #include "AliESDtrack.h"
+#include "AliESDMuonTrack.h"
 #include "AliESDVertex.h"
 #include "AliESDv0.h"
-#include "AliESDCascade.h"
+#include "AliESDcascade.h"
 #include "AliESDCaloCluster.h"
 
 #endif
@@ -30,48 +33,66 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
   TFile *outFile = TFile::Open(outFileName, "RECREATE");
 
   // create the tree
-  TTree *aodTree = new TTree("AOD", "AliAOD tree");
+  TTree *aodTree = new TTree("aodTree", "AliAOD tree");
   aodTree->Branch(aod->GetList());
 
   // connect to ESD
   TFile *inFile = TFile::Open(inFileName, "READ");
   TTree *t = (TTree*) inFile->Get("esdTree");
-  TBranch *b = t->GetBranch("ESD");
-  AliESD *esd = 0;
-  b->SetAddress(&esd);
+  AliESDEvent *esd = new AliESDEvent();
+  esd->ReadFromTree(t);
 
-  Int_t nEvents = b->GetEntries();
+  Int_t nEvents = t->GetEntries();
+
+  // set arrays and pointers
+  Float_t posF[3];
+  Double_t pos[3];
+  Double_t p[3];
+  Double_t covVtx[6];
+  Double_t covTr[21];
+  Double_t pid[10];
 
   // loop over events and fill them
   for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
-    b->GetEntry(iEvent);
+    t->GetEntry(iEvent);
 
     // Multiplicity information needed by the header (to be revised!)
     Int_t nTracks   = esd->GetNumberOfTracks();
     Int_t nPosTracks = 0;
     for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) 
-      if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
-
-    // create the header
-    aod->AddHeader(new AliAODHeader(esd ->GetEventNumber(), 
-                                   esd->GetRunNumber(),
-                                   nTracks,
-                                   nPosTracks,
-                                   nTracks-nPosTracks,
-                                   esd->GetMagneticField(),
-                                   -999., // centrality; to be filled, still
-                                   esd->GetTriggerMask(),
-                                   esd->GetTriggerCluster(),
-                                   esd->GetEventType()));
-
+      if (esd->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
+    
+    // Access to the header
+    AliAODHeader *header = aod->GetHeader();
+
+    // fill the header
+    *header = AliAODHeader(esd->GetRunNumber(),
+                          esd->GetBunchCrossNumber(),
+                          esd->GetOrbitNumber(),
+                          esd->GetPeriodNumber(),
+                          nTracks,
+                          nPosTracks,
+                          nTracks-nPosTracks,
+                          esd->GetMagneticField(),
+                          -999., // fill muon magnetic field
+                          -999., // centrality; to be filled, still
+                          esd->GetZDCN1Energy(),
+                          esd->GetZDCP1Energy(),
+                          esd->GetZDCN2Energy(),
+                          esd->GetZDCP2Energy(),
+                          esd->GetZDCEMEnergy(),
+                          esd->GetTriggerMask(),
+                          esd->GetTriggerCluster(),
+                          esd->GetEventType());
+  
     Int_t nV0s      = esd->GetNumberOfV0s();
     Int_t nCascades = esd->GetNumberOfCascades();
     Int_t nKinks    = esd->GetNumberOfKinks();
     Int_t nVertices = nV0s + nCascades + nKinks;
     
     aod->ResetStd(nTracks, nVertices);
+    AliAODTrack *aodTrack;
     
-
     // Array to take into account the tracks already added to the AOD
     Bool_t * usedTrack = NULL;
     if (nTracks>0) {
@@ -103,13 +124,11 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
     // after the loops on the composite objects (V0, cascades, kinks)
     const AliESDVertex *vtx = esd->GetPrimaryVertex();
       
-    Double_t pos[3];
     vtx->GetXYZ(pos); // position
-    Double_t cov[6];
-    vtx->GetCovMatrix(cov); //covariance matrix
+    vtx->GetCovMatrix(covVtx); //covariance matrix
 
     AliAODVertex * primary = new(vertices[jVertices++])
-      AliAODVertex(pos, cov, vtx->GetChi2(), NULL, AliAODVertex::kPrimary);
+      AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, AliAODVertex::kPrimary);
          
     // Create vertices starting from the most complex objects
       
@@ -117,15 +136,13 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
     for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
       AliESDcascade *cascade = esd->GetCascade(nCascade);
       
-      Double_t posXi[3];
-      cascade->GetXYZ(posXi[0], posXi[1], posXi[2]);
-      Double_t covXi[6];
-      cascade->GetPosCovXi(covXi);
+      cascade->GetXYZ(pos[0], pos[1], pos[2]);
+      cascade->GetPosCovXi(covVtx);
      
       // Add the cascade vertex
-      AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(posXi,
-                                                                       covXi,
-                                                                       cascade->GetChi2Xi(),
+      AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
+                                                                       covVtx,
+                                                                       cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
                                                                        primary,
                                                                        AliAODVertex::kCascade);
 
@@ -145,10 +162,10 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
       for (Int_t iV0=0; iV0<nV0s; ++iV0) {
 
        v0 = esd->GetV0(iV0);
-       Int_t pos = v0->GetPindex();
-       Int_t neg = v0->GetNindex();
+       Int_t posV0 = v0->GetPindex();
+       Int_t negV0 = v0->GetNindex();
 
-       if (pos==posFromV0 && neg==negFromV0) {
+       if (posV0==posFromV0 && negV0==negFromV0) {
          indV0 = iV0;
          break;
        }
@@ -162,14 +179,12 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
 
        usedV0[indV0] = kTRUE;
        
-       Double_t posV0[3];
-       v0->GetXYZ(posV0[0], posV0[1], posV0[2]);
-       Double_t covV0[6];
-       v0->GetPosCov(covV0);
+       v0->GetXYZ(pos[0], pos[1], pos[2]);
+       v0->GetPosCov(covVtx);
        
-       vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(posV0,
-                                                                covV0,
-                                                                v0->GetChi2V0(),
+       vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
+                                                                covVtx,
+                                                                v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
                                                                 vcascade,
                                                                 AliAODVertex::kV0);
       } else {
@@ -179,14 +194,12 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
             << " The V0 " << indV0 
             << " doesn't exist in the array of V0s or was used!" << endl;
 
-       Double_t posV0[3];
-       cascade->GetXYZ(posV0[0], posV0[1], posV0[2]);
-       Double_t covV0[6];
-       cascade->GetPosCov(covV0);
+       cascade->GetXYZ(pos[0], pos[1], pos[2]);
+       cascade->GetPosCov(covVtx);
       
-       vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(posV0,
-                                                                covV0,
-                                                                v0->GetChi2V0(),
+       vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
+                                                                covVtx,
+                                                                v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
                                                                 vcascade,
                                                                 AliAODVertex::kV0);
        vcascade->AddDaughter(vV0FromCascade);
@@ -199,32 +212,28 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
        usedTrack[posFromV0] = kTRUE;
 
        AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
-       
-       Double_t p[3];
        esdTrack->GetPxPyPz(p);
-       
-       Double_t x[3];
-       esdTrack->GetXYZ(x);
-       
-       Double_t cov[21];
-       esdTrack->GetCovarianceXYZPxPyPz(cov);
-       
-       Double_t pid[10];
+       esdTrack->GetXYZ(pos);
+       esdTrack->GetCovarianceXYZPxPyPz(covTr);
        esdTrack->GetESDpid(pid);
        
-       vV0FromCascade->AddDaughter(
+       vV0FromCascade->AddDaughter(aodTrack =
                                    new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                           esdTrack->GetLabel(), 
-                                          p, kTRUE,
-                                          x,
+                                          p, 
+                                          kTRUE,
+                                          pos,
                                           kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
+                                          covTr
+                                          (Short_t)esdTrack->Charge(),
                                           esdTrack->GetITSClusterMap(), 
                                           pid,
                                           vV0FromCascade,
+                                          kTRUE,  // check if this is right
+                                          kFALSE, // check if this is right
                                           AliAODTrack::kSecondary)
                );
+       aodTrack->ConvertAliPIDtoAODPID();
       }
       else {
        cerr << "Error: event " << iEvent << " cascade " << nCascade
@@ -238,33 +247,28 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
        usedTrack[negFromV0] = kTRUE;
        
        AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
-       
-       Double_t p[3];
        esdTrack->GetPxPyPz(p);
-       
-       Double_t x[3];
-       esdTrack->GetXYZ(x);
-       
-       Double_t cov[21];
-       esdTrack->GetCovarianceXYZPxPyPz(cov);
-       
-       Double_t pid[10];
+       esdTrack->GetXYZ(pos);
+       esdTrack->GetCovarianceXYZPxPyPz(covTr);
        esdTrack->GetESDpid(pid);
        
-       vV0FromCascade->AddDaughter(
+       vV0FromCascade->AddDaughter(aodTrack =
                 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                           esdTrack->GetLabel(),
                                           p,
                                           kTRUE,
-                                          x,
+                                          pos,
                                           kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
+                                          covTr
+                                          (Short_t)esdTrack->Charge(),
                                           esdTrack->GetITSClusterMap(), 
                                           pid,
                                           vV0FromCascade,
+                                          kTRUE,  // check if this is right
+                                          kFALSE, // check if this is right
                                           AliAODTrack::kSecondary)
                );
+       aodTrack->ConvertAliPIDtoAODPID();
       }
       else {
        cerr << "Error: event " << iEvent << " cascade " << nCascade
@@ -280,34 +284,29 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
        usedTrack[bachelor] = kTRUE;
        
        AliESDtrack *esdTrack = esd->GetTrack(bachelor);
-       
-       Double_t p[3];
        esdTrack->GetPxPyPz(p);
-       
-       Double_t x[3];
-       esdTrack->GetXYZ(x);
-       
-       Double_t cov[21];
-       esdTrack->GetCovarianceXYZPxPyPz(cov);
-       
-       Double_t pid[10];
+       esdTrack->GetXYZ(pos);
+       esdTrack->GetCovarianceXYZPxPyPz(covTr);
        esdTrack->GetESDpid(pid);
 
-       vcascade->AddDaughter(
+       vcascade->AddDaughter(aodTrack =
                new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                           esdTrack->GetLabel(),
                                           p,
                                           kTRUE,
-                                          x,
+                                          pos,
                                           kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
+                                          covTr
+                                          (Short_t)esdTrack->Charge(),
                                           esdTrack->GetITSClusterMap(), 
                                           pid,
                                           vcascade,
+                                          kTRUE,  // check if this is right
+                                          kFALSE, // check if this is right
                                           AliAODTrack::kSecondary)
                );
-      }
+       aodTrack->ConvertAliPIDtoAODPID();
+     }
       else {
        cerr << "Error: event " << iEvent << " cascade " << nCascade
             << " track " << bachelor << " has already been used!" << endl;
@@ -325,22 +324,20 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
 
       AliESDv0 *v0 = esd->GetV0(nV0);
       
-      Double_t posV0[3];
-      v0->GetXYZ(posV0[0], posV0[1], posV0[2]);
-      Double_t covV0[6];
-      v0->GetPosCov(covV0);
+      v0->GetXYZ(pos[0], pos[1], pos[2]);
+      v0->GetPosCov(covVtx);
 
       AliAODVertex * vV0 = 
-       new(vertices[jVertices++]) AliAODVertex(posV0,
-                                               covV0,
-                                               v0->GetChi2V0(),
+       new(vertices[jVertices++]) AliAODVertex(pos,
+                                               covVtx,
+                                               v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
                                                primary,
                                                AliAODVertex::kV0);
       primary->AddDaughter(vV0);
 
       Int_t posFromV0 = v0->GetPindex();
       Int_t negFromV0 = v0->GetNindex();
-
+      
       // Add the positive tracks from the V0
 
       if (!usedTrack[posFromV0]) {
@@ -348,32 +345,28 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
        usedTrack[posFromV0] = kTRUE;
 
        AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
-      
-       Double_t p[3];
        esdTrack->GetPxPyPz(p);
-       
-       Double_t x[3];
-       esdTrack->GetXYZ(x);
-       
-       Double_t cov[21];
-       esdTrack->GetCovarianceXYZPxPyPz(cov);
-       
-       Double_t pid[10];
+       esdTrack->GetXYZ(pos);
+       esdTrack->GetCovarianceXYZPxPyPz(covTr);
        esdTrack->GetESDpid(pid);
        
-       vV0->AddDaughter(
+       vV0->AddDaughter(aodTrack =
                new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                           esdTrack->GetLabel(), 
-                                          p, kTRUE,
-                                          x,
+                                          p, 
+                                          kTRUE,
+                                          pos,
                                           kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
+                                          covTr
+                                          (Short_t)esdTrack->Charge(),
                                           esdTrack->GetITSClusterMap(), 
                                           pid,
                                           vV0,
+                                          kTRUE,  // check if this is right
+                                          kFALSE, // check if this is right
                                           AliAODTrack::kSecondary)
                );
+       aodTrack->ConvertAliPIDtoAODPID();
       }
       else {
        cerr << "Error: event " << iEvent << " V0 " << nV0
@@ -387,33 +380,28 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
        usedTrack[negFromV0] = kTRUE;
 
        AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
-      
-       Double_t p[3];
        esdTrack->GetPxPyPz(p);
-       
-       Double_t x[3];
-       esdTrack->GetXYZ(x);
-       
-       Double_t cov[21];
-       esdTrack->GetCovarianceXYZPxPyPz(cov);
-       
-       Double_t pid[10];
+       esdTrack->GetXYZ(pos);
+       esdTrack->GetCovarianceXYZPxPyPz(covTr);
        esdTrack->GetESDpid(pid);
 
-       vV0->AddDaughter(
+       vV0->AddDaughter(aodTrack =
                 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                           esdTrack->GetLabel(),
                                           p,
                                           kTRUE,
-                                          x,
+                                          pos,
                                           kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
+                                          covTr
+                                          (Short_t)esdTrack->Charge(),
                                           esdTrack->GetITSClusterMap(), 
                                           pid,
                                           vV0,
+                                          kTRUE,  // check if this is right
+                                          kFALSE, // check if this is right
                                           AliAODTrack::kSecondary)
                );
+       aodTrack->ConvertAliPIDtoAODPID();
       }
       else {
        cerr << "Error: event " << iEvent << " V0 " << nV0
@@ -429,10 +417,9 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
     for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
 
 
-      AliESDtrack * track = esd->GetTrack(iTrack);
-
+      AliESDtrack * esdTrack = esd->GetTrack(iTrack);
 
-      Int_t ikink = track->GetKinkIndex(0);
+      Int_t ikink = esdTrack->GetKinkIndex(0);
 
       if (ikink) {
        // Negative kink index: mother, positive: daughter
@@ -441,9 +428,9 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
 
        for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
 
-         AliESDtrack * track1 = esd->GetTrack(jTrack);
+         AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
 
-         Int_t jkink = track1->GetKinkIndex(0);
+         Int_t jkink = esdTrack1->GetKinkIndex(0);
 
          if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
 
@@ -479,34 +466,28 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
              usedTrack[imother] = kTRUE;
        
              AliESDtrack *esdTrack = esd->GetTrack(imother);
-       
-             Double_t p[3];
              esdTrack->GetPxPyPz(p);
-             
-             Double_t x[3];
-             esdTrack->GetXYZ(x);
-             
-             Double_t cov[21];
-             esdTrack->GetCovarianceXYZPxPyPz(cov);
-             
-             Double_t pid[10];
+             esdTrack->GetXYZ(pos);
+             esdTrack->GetCovarianceXYZPxPyPz(covTr);
              esdTrack->GetESDpid(pid);
-             
-             
+
              mother = 
                new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                           esdTrack->GetLabel(),
                                           p,
                                           kTRUE,
-                                          x,
+                                          pos,
                                           kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
+                                          covTr
+                                          (Short_t)esdTrack->Charge(),
                                           esdTrack->GetITSClusterMap(), 
                                           pid,
                                           primary,
+                                          kTRUE, // check if this is right
+                                          kTRUE, // check if this is right
                                           AliAODTrack::kPrimary);
              primary->AddDaughter(mother);
+             mother->ConvertAliPIDtoAODPID();
            }
            else {
              cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
@@ -531,34 +512,28 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
              usedTrack[idaughter] = kTRUE;
        
              AliESDtrack *esdTrack = esd->GetTrack(idaughter);
-       
-             Double_t p[3];
              esdTrack->GetPxPyPz(p);
-             
-             Double_t x[3];
-             esdTrack->GetXYZ(x);
-             
-             Double_t cov[21];
-             esdTrack->GetCovarianceXYZPxPyPz(cov);
-             
-             Double_t pid[10];
+             esdTrack->GetXYZ(pos);
+             esdTrack->GetCovarianceXYZPxPyPz(covTr);
              esdTrack->GetESDpid(pid);
-             
-             
+
              daughter = 
                new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                           esdTrack->GetLabel(),
                                           p,
                                           kTRUE,
-                                          x,
+                                          pos,
                                           kFALSE,
-                                          cov, 
-                                          (Short_t)esdTrack->GetSign(),
+                                          covTr
+                                          (Short_t)esdTrack->Charge(),
                                           esdTrack->GetITSClusterMap(), 
                                           pid,
                                           vkink,
+                                          kTRUE, // check if this is right
+                                          kTRUE, // check if this is right
                                           AliAODTrack::kPrimary);
              vkink->AddDaughter(daughter);
+             daughter->ConvertAliPIDtoAODPID();
            }
            else {
              cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
@@ -582,17 +557,9 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
       if (usedTrack[nTrack]) continue;
 
       AliESDtrack *esdTrack = esd->GetTrack(nTrack);
-      
-      Double_t p[3];
       esdTrack->GetPxPyPz(p);
-      
-      Double_t x[3];
-      esdTrack->GetXYZ(x);
-      
-      Double_t cov[21];
-      esdTrack->GetCovarianceXYZPxPyPz(cov);
-       
-      Double_t pid[10];
+      esdTrack->GetXYZ(pos);
+      esdTrack->GetCovarianceXYZPxPyPz(covTr);
       esdTrack->GetESDpid(pid);
 
       Float_t impactXY, impactZ;
@@ -602,44 +569,90 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
       if (impactXY<3) {
        // track inside the beam pipe
       
-       primary->AddDaughter(
+       primary->AddDaughter(aodTrack =
            new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                         esdTrack->GetLabel(),
                                         p,
                                         kTRUE,
-                                        x,
+                                        pos,
                                         kFALSE,
-                                        cov, 
-                                        (Short_t)esdTrack->GetSign(),
+                                        covTr
+                                        (Short_t)esdTrack->Charge(),
                                         esdTrack->GetITSClusterMap(), 
                                         pid,
                                         primary,
+                                        kTRUE, // check if this is right
+                                        kTRUE, // check if this is right
                                         AliAODTrack::kPrimary)
            );
+       aodTrack->ConvertAliPIDtoAODPID();
       }
       else {
        // outside the beam pipe: orphan track
+           aodTrack =
            new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                         esdTrack->GetLabel(),
                                         p,
                                         kTRUE,
-                                        x,
+                                        pos,
                                         kFALSE,
-                                        cov, 
-                                        (Short_t)esdTrack->GetSign(),
+                                        covTr
+                                        (Short_t)esdTrack->Charge(),
                                         esdTrack->GetITSClusterMap(), 
                                         pid,
                                         NULL,
+                                        kFALSE, // check if this is right
+                                        kFALSE, // check if this is right
                                         AliAODTrack::kOrphan);
+           aodTrack->ConvertAliPIDtoAODPID();
       }        
     } // end of loop on tracks
 
-
-    // Access to the AOD container of vertices
+    // muon tracks
+    Int_t nMuTracks = esd->GetNumberOfMuonTracks();
+    for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
+      
+      AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);     
+      p[0] = esdMuTrack->Px(); 
+      p[1] = esdMuTrack->Py(); 
+      p[2] = esdMuTrack->Pz();
+      pos[0] = primary->GetX(); 
+      pos[1] = primary->GetY(); 
+      pos[2] = primary->GetZ();
+      
+      // has to be changed once the muon pid is provided by the ESD
+      for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
+      
+      primary->AddDaughter( aodTrack =
+         new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
+                                            0, // no label provided
+                                            p,
+                                            kTRUE,
+                                            pos,
+                                            kFALSE,
+                                            NULL, // no covariance matrix provided
+                                            esdMuTrack->Charge(),
+                                            0, // ITSClusterMap is set below
+                                            pid,
+                                            primary,
+                                            kFALSE,  // muon tracks are not used to fit the primary vtx
+                                            kFALSE,  // not used for vertex fit
+                                            AliAODTrack::kPrimary)
+         );
+       aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
+       Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
+       aodTrack->SetMatchTrigger(track2Trigger);
+       if (track2Trigger) 
+         aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
+       else 
+         aodTrack->SetChi2MatchTrigger(0.);
+    }
+    
+    // Access to the AOD container of clusters
     TClonesArray &clusters = *(aod->GetClusters());
     Int_t jClusters=0;
 
-    // Clusters
+    // Calo Clusters
     Int_t nClusters    = esd->GetNumberOfCaloClusters();
 
     for (Int_t iClust=0; iClust<nClusters; ++iClust) {
@@ -648,11 +661,8 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
 
       Int_t id = cluster->GetID();
       Int_t label = -1;
-      Float_t energy = cluster->GetClusterEnergy();
-      Float_t x[3];
-      cluster->GetGlobalPosition(x);
-      Float_t * covMatrix = NULL;
-      Float_t * pid = NULL; 
+      Float_t energy = cluster->E();
+      cluster->GetPosition(posF);
       AliAODVertex *prodVertex = primary;
       AliAODTrack *primTrack = NULL;
       Char_t ttype=AliAODCluster::kUndef;
@@ -670,15 +680,28 @@ void CreateAODfromESD(const char *inFileName = "AliESDs.root",
       new(clusters[jClusters++]) AliAODCluster(id,
                                               label,
                                               energy,
-                                              x,
-                                              covMatrix,
-                                              pid,
+                                              pos,
+                                              NULL, // no covariance matrix provided
+                                              NULL, // no pid for clusters provided
                                               prodVertex,
                                               primTrack,
                                               ttype);
 
-    } // end of loop on clusters
+    } // end of loop on calo clusters
+
+    // tracklets
+    const AliMultiplicity *mult = esd->GetMultiplicity();
+    if (mult) {
+      if (mult->GetNumberOfTracklets()>0) {
+       aod->GetTracklets()->CreateContainer(mult->GetNumberOfTracklets());
 
+       for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
+         aod->GetTracklets()->SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n));
+       }
+      }
+    } else {
+      Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
+    }
 
     delete [] usedTrack;
     delete [] usedV0;