-
- // Array to take into account the tracks already added to the AOD
- Bool_t * usedTrack = NULL;
- if (nTracks>0) {
- usedTrack = new Bool_t[nTracks];
- for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
- }
- // Array to take into account the V0s already added to the AOD
- Bool_t * usedV0 = NULL;
- if (nV0s>0) {
- usedV0 = new Bool_t[nV0s];
- for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
- }
- // Array to take into account the kinks already added to the AOD
- Bool_t * usedKink = NULL;
- if (nKinks>0) {
- usedKink = new Bool_t[nKinks];
- for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
- }
-
- // Access to the AOD container of vertices
- TClonesArray &vertices = *(aod->GetVertices());
- Int_t jVertices=0;
-
- // Access to the AOD container of tracks
- TClonesArray &tracks = *(aod->GetTracks());
- Int_t jTracks=0;
-
- // Add primary vertex. The primary tracks will be defined
- // 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 covVtx[6]; // We have to give changing names to the variables (like cov?, x?, and p?) because CINT doesn't recognize blocks correctly.
- vtx->GetCovMatrix(covVtx); //covariance matrix
-
- AliAODVertex * primary = new(vertices[jVertices++])
- AliAODVertex(pos, covVtx, vtx->GetChi2(), NULL, AliAODVertex::kPrimary);
-
- // Create vertices starting from the most complex objects
-
- // Cascades
- 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);
-
- // Add the cascade vertex
- AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(posXi,
- covXi,
- cascade->GetChi2Xi(),
- primary,
- AliAODVertex::kCascade);
-
- primary->AddDaughter(vcascade);
-
- // Add the V0 from the cascade. The ESD class have to be optimized...
- // Now we have to search for the corresponding Vo in the list of V0s
- // using the indeces of the positive and negative tracks
-
- Int_t posFromV0 = cascade->GetPindex();
- Int_t negFromV0 = cascade->GetNindex();
-
-
- AliESDv0 * v0 = 0x0;
- Int_t indV0 = -1;
-
- for (Int_t iV0=0; iV0<nV0s; ++iV0) {
-
- v0 = esd->GetV0(iV0);
- Int_t posV0 = v0->GetPindex();
- Int_t negV0 = v0->GetNindex();
-
- if (posV0==posFromV0 && negV0==negFromV0) {
- indV0 = iV0;
- break;
- }
- }
-
- AliAODVertex * vV0FromCascade = 0x0;
-
- if (indV0>-1 && !usedV0[indV0] ) {
-
- // the V0 exists in the array of V0s and is not used
-
- usedV0[indV0] = kTRUE;
-
- Double_t posV0[3];
- v0->GetXYZ(posV0[0], posV0[1], posV0[2]);
- Double_t covV0_1[6];
- v0->GetPosCov(covV0_1);
-
- vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(posV0,
- covV0_1,
- v0->GetChi2V0(),
- vcascade,
- AliAODVertex::kV0);
- } else {
-
- // the V0 doesn't exist in the array of V0s or was used
- cerr << "Error: event " << iEvent << " cascade " << nCascade
- << " The V0 " << indV0
- << " doesn't exist in the array of V0s or was used!" << endl;
-
- Double_t posV0_2[3];
- cascade->GetXYZ(posV0_2[0], posV0_2[1], posV0_2[2]);
- Double_t covV0_2[6];
- cascade->GetPosCov(covV0_2);
-
- vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(posV0_2,
- covV0_2,
- v0->GetChi2V0(),
- vcascade,
- AliAODVertex::kV0);
- vcascade->AddDaughter(vV0FromCascade);
- }
-
- // Add the positive tracks from the V0
-
- if (! usedTrack[posFromV0]) {
-
- usedTrack[posFromV0] = kTRUE;
-
- AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
-
- Double_t p1[3];
- esdTrack->GetPxPyPz(p1);
-
- Double_t x1[3];
- esdTrack->GetXYZ(x1);
-
- Double_t covV0PosTr[21];
- esdTrack->GetCovarianceXYZPxPyPz(covV0PosTr);
-
- Double_t pid1[10];
- esdTrack->GetESDpid(pid1);
-
- vV0FromCascade->AddDaughter(
- new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
- esdTrack->GetLabel(),
- p1,
- kTRUE,
- x1,
- kFALSE,
- covV0PosTr,
- (Short_t)esdTrack->GetSign(),
- esdTrack->GetITSClusterMap(),
- pid1,
- vV0FromCascade,
- kFALSE, // check if this is right
- AliAODTrack::kSecondary)
- );
- }
- else {
- cerr << "Error: event " << iEvent << " cascade " << nCascade
- << " track " << posFromV0 << " has already been used!" << endl;
- }
-
- // Add the negative tracks from the V0
-
- if (!usedTrack[negFromV0]) {
-
- usedTrack[negFromV0] = kTRUE;
-
- AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
-
- Double_t p2[3];
- esdTrack->GetPxPyPz(p2);
-
- Double_t x2[3];
- esdTrack->GetXYZ(x2);
-
- Double_t covV0NegTr[21];
- esdTrack->GetCovarianceXYZPxPyPz(covV0NegTr);
-
- Double_t pid2[10];
- esdTrack->GetESDpid(pid2);
-
- vV0FromCascade->AddDaughter(
- new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
- esdTrack->GetLabel(),
- p2,
- kTRUE,
- x2,
- kFALSE,
- covV0NegTr,
- (Short_t)esdTrack->GetSign(),
- esdTrack->GetITSClusterMap(),
- pid2,
- vV0FromCascade,
- kFALSE, // check if this is right
- AliAODTrack::kSecondary)
- );
- }
- else {
- cerr << "Error: event " << iEvent << " cascade " << nCascade
- << " track " << negFromV0 << " has already been used!" << endl;
- }
-
- // Add the bachelor track from the cascade
-
- Int_t bachelor = cascade->GetBindex();
-
- if(!usedTrack[bachelor]) {
-
- usedTrack[bachelor] = kTRUE;
-
- AliESDtrack *esdTrack = esd->GetTrack(bachelor);
-
- Double_t p3[3];
- esdTrack->GetPxPyPz(p3);
-
- Double_t x3[3];
- esdTrack->GetXYZ(x3);
-
- Double_t covXiTr[21];
- esdTrack->GetCovarianceXYZPxPyPz(covXiTr);
-
- Double_t pid3[10];
- esdTrack->GetESDpid(pid3);
-
- vcascade->AddDaughter(
- new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
- esdTrack->GetLabel(),
- p3,
- kTRUE,
- x3,
- kFALSE,
- covXiTr,
- (Short_t)esdTrack->GetSign(),
- esdTrack->GetITSClusterMap(),
- pid3,
- vcascade,
- kFALSE, // check if this is right
- AliAODTrack::kSecondary)
- );
- }
- else {
- cerr << "Error: event " << iEvent << " cascade " << nCascade
- << " track " << bachelor << " has already been used!" << endl;
- }
-
- // Add the primary track of the cascade (if any)
-
- } // end of the loop on cascades