#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
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) {
// 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
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);
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;
}
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 {
<< " 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);
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
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
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;
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]) {
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
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
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
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) ) {
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
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
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;
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) {
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;
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;