+ // 3 - Add the bachelor track from the cascade\r
+ \r
+ if (!fUsedTrack[idxBachFromCascade]) {\r
+ \r
+ esdCascadeBach->GetPxPyPz(momBach);\r
+ esdCascadeBach->GetXYZ(pos);\r
+ esdCascadeBach->GetCovarianceXYZPxPyPz(covTr);\r
+ esdCascadeBach->GetESDpid(pid);\r
+ \r
+ fUsedTrack[idxBachFromCascade] = kTRUE;\r
+ UInt_t selectInfo = 0;\r
+ if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeBach);\r
+ if (fMChandler) fMChandler->SelectParticle(esdCascadeBach->GetLabel());\r
+ aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack(esdCascadeBach->GetID(),\r
+ esdCascadeBach->GetLabel(), \r
+ momBach, \r
+ kTRUE,\r
+ pos,\r
+ kFALSE, // Why kFALSE for "isDCA" ? FIXME\r
+ covTr, \r
+ (Short_t)esdCascadeBach->GetSign(),\r
+ esdCascadeBach->GetITSClusterMap(), \r
+ pid,\r
+ vCascade,\r
+ kTRUE, // usedForVtxFit = kFALSE ? FIXME\r
+ vtx->UsesTrack(esdCascadeBach->GetID()),\r
+ AliAODTrack::kSecondary,\r
+ selectInfo);\r
+ aodTrack->SetTPCFitMap(esdCascadeBach->GetTPCFitMap());\r
+ aodTrack->SetTPCClusterMap(esdCascadeBach->GetTPCClusterMap());\r
+ aodTrack->SetTPCSharedMap (esdCascadeBach->GetTPCSharedMap());\r
+ aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeBach));\r
+ aodTrack->SetTPCPointsF(esdCascadeBach->GetTPCNclsF());\r
+ fAODTrackRefs->AddAt(aodTrack,idxBachFromCascade);\r
+ \r
+ if (esdCascadeBach->GetSign() > 0) ++fNumberOfPositiveTracks;\r
+ aodTrack->ConvertAliPIDtoAODPID();\r
+ aodTrack->SetFlags(esdCascadeBach->GetStatus());\r
+ SetAODPID(esdCascadeBach,aodTrack,detpid);\r
+ }\r
+ else {\r
+ aodTrack = static_cast<AliAODTrack*>( fAODTrackRefs->At(idxBachFromCascade) );\r
+ }\r
+ \r
+ vCascade->AddDaughter(aodTrack);\r
+ \r
+// if (fDebug > 4) {\r
+// printf("---- Cascade / bach dghter : \n");\r
+// aodTrack->Print();\r
+// }\r
+ \r
+ \r
+ // 4 - Add the V0 from the cascade. \r
+ // = V0vtx + both pos and neg daughter tracks + the aodV0 itself\r
+ //\r
+ \r
+ if ( !fUsedV0[idxV0FromCascade] ) {\r
+ // 4.A - if VO structure hasn't been created yet\r
+ \r
+ // 4.A.1 - Create the V0 vertex of the cascade\r
+ \r
+ esdV0FromCascade->GetXYZ(pos[0], pos[1], pos[2]);\r
+ esdV0FromCascade->GetPosCov(covVtx);\r
+ chi2 = esdV0FromCascade->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3 ?\r
+ \r
+ vV0FromCascade = new(verticesArray[fNumberOfVertices++]) AliAODVertex(pos,\r
+ covVtx,\r
+ chi2,\r
+ vCascade,\r
+ idxV0FromCascade, //id of ESDv0\r
+ AliAODVertex::kV0);\r
+ // Note:\r
+ // one V0 can be used by several cascades.\r
+ // So, one AOD V0 vtx can have several parent vtx.\r
+ // This is not directly allowed by AliAODvertex.\r
+ // Setting the parent vtx (here = param "vCascade") doesn't lead to a crash\r
+ // but to a problem of consistency within AODEvent.\r
+ // -> See below paragraph 4.B, for the proposed treatment of such a case.\r
+ \r
+ // Add the vV0FromCascade to the aodVOVtxRefs\r
+ fAODV0VtxRefs->AddAt(vV0FromCascade,idxV0FromCascade);\r
+ \r
+ \r
+ // 4.A.2 - Add the positive tracks from the V0\r
+ \r
+ esdCascadePos->GetPxPyPz(momPos);\r
+ esdCascadePos->GetXYZ(pos);\r
+ esdCascadePos->GetCovarianceXYZPxPyPz(covTr);\r
+ esdCascadePos->GetESDpid(pid);\r
+ \r
+ \r
+ if (!fUsedTrack[idxPosFromV0Dghter]) {\r
+ fUsedTrack[idxPosFromV0Dghter] = kTRUE;\r
+ \r
+ UInt_t selectInfo = 0;\r
+ if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadePos);\r
+ if(fMChandler) fMChandler->SelectParticle(esdCascadePos->GetLabel());\r
+ aodTrack = new(tracksArray[fNumberOfTracks++]) \r
+ AliAODTrack( esdCascadePos->GetID(),\r
+ esdCascadePos->GetLabel(), \r
+ momPos, \r
+ kTRUE,\r
+ pos,\r
+ kFALSE, // Why kFALSE for "isDCA" ? FIXME\r
+ covTr, \r
+ (Short_t)esdCascadePos->GetSign(),\r
+ esdCascadePos->GetITSClusterMap(), \r
+ pid,\r
+ vV0FromCascade,\r
+ kTRUE, // usedForVtxFit = kFALSE ? FIXME\r
+ vtx->UsesTrack(esdCascadePos->GetID()),\r
+ AliAODTrack::kSecondary,\r
+ selectInfo);\r
+ aodTrack->SetTPCFitMap(esdCascadePos->GetTPCFitMap());\r
+ aodTrack->SetTPCClusterMap(esdCascadePos->GetTPCClusterMap());\r
+ aodTrack->SetTPCSharedMap (esdCascadePos->GetTPCSharedMap());\r
+ aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadePos));\r
+ aodTrack->SetTPCPointsF(esdCascadePos->GetTPCNclsF());\r
+ fAODTrackRefs->AddAt(aodTrack,idxPosFromV0Dghter);\r
+ \r
+ if (esdCascadePos->GetSign() > 0) ++fNumberOfPositiveTracks;\r
+ aodTrack->ConvertAliPIDtoAODPID();\r
+ aodTrack->SetFlags(esdCascadePos->GetStatus());\r
+ SetAODPID(esdCascadePos,aodTrack,detpid);\r
+ }\r
+ else {\r
+ aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxPosFromV0Dghter));\r
+ }\r
+ vV0FromCascade->AddDaughter(aodTrack);\r
+ \r
+ \r
+ // 4.A.3 - Add the negative tracks from the V0\r
+ \r
+ esdCascadeNeg->GetPxPyPz(momNeg);\r
+ esdCascadeNeg->GetXYZ(pos);\r
+ esdCascadeNeg->GetCovarianceXYZPxPyPz(covTr);\r
+ esdCascadeNeg->GetESDpid(pid);\r
+ \r
+ \r
+ if (!fUsedTrack[idxNegFromV0Dghter]) {\r
+ fUsedTrack[idxNegFromV0Dghter] = kTRUE;\r
+ \r
+ UInt_t selectInfo = 0;\r
+ if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeNeg);\r
+ if(fMChandler)fMChandler->SelectParticle(esdCascadeNeg->GetLabel());\r
+ aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack( esdCascadeNeg->GetID(),\r
+ esdCascadeNeg->GetLabel(),\r
+ momNeg,\r
+ kTRUE,\r
+ pos,\r
+ kFALSE, // Why kFALSE for "isDCA" ? FIXME\r
+ covTr, \r
+ (Short_t)esdCascadeNeg->GetSign(),\r
+ esdCascadeNeg->GetITSClusterMap(), \r
+ pid,\r
+ vV0FromCascade,\r
+ kTRUE, // usedForVtxFit = kFALSE ? FIXME\r
+ vtx->UsesTrack(esdCascadeNeg->GetID()),\r
+ AliAODTrack::kSecondary,\r
+ selectInfo);\r
+ aodTrack->SetTPCFitMap(esdCascadeNeg->GetTPCFitMap());\r
+ aodTrack->SetTPCClusterMap(esdCascadeNeg->GetTPCClusterMap());\r
+ aodTrack->SetTPCSharedMap (esdCascadeNeg->GetTPCSharedMap());\r
+ aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeNeg));\r
+ aodTrack->SetTPCPointsF(esdCascadeNeg->GetTPCNclsF());\r
+ fAODTrackRefs->AddAt(aodTrack,idxNegFromV0Dghter);\r
+ \r
+ if (esdCascadeNeg->GetSign() > 0) ++fNumberOfPositiveTracks;\r
+ aodTrack->ConvertAliPIDtoAODPID();\r
+ aodTrack->SetFlags(esdCascadeNeg->GetStatus());\r
+ SetAODPID(esdCascadeNeg,aodTrack,detpid);\r
+ }\r
+ else {\r
+ aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxNegFromV0Dghter));\r
+ }\r
+ \r
+ vV0FromCascade->AddDaughter(aodTrack);\r
+ \r
+ \r
+ // 4.A.4 - Add the V0 from cascade to the V0 array\r
+ \r
+ Double_t dcaV0Daughters = esdV0FromCascade->GetDcaV0Daughters();\r
+ Double_t dcaV0ToPrimVertex = esdV0FromCascade->GetD( esd.GetPrimaryVertex()->GetX(),\r
+ esd.GetPrimaryVertex()->GetY(),\r
+ esd.GetPrimaryVertex()->GetZ() );\r
+ esdV0FromCascade->GetPPxPyPz( momPosAtV0vtx[0],momPosAtV0vtx[1],momPosAtV0vtx[2] ); \r
+ esdV0FromCascade->GetNPxPyPz( momNegAtV0vtx[0],momNegAtV0vtx[1],momNegAtV0vtx[2] ); \r
+ \r
+ Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = DCA in (x,y) for Pos and ..[1] = Neg\r
+ dcaDaughterToPrimVertex[0] = TMath::Abs(esdCascadePos->GetD( esd.GetPrimaryVertex()->GetX(),\r
+ esd.GetPrimaryVertex()->GetY(),\r
+ esd.GetMagneticField()) );\r
+ dcaDaughterToPrimVertex[1] = TMath::Abs(esdCascadeNeg->GetD( esd.GetPrimaryVertex()->GetX(),\r
+ esd.GetPrimaryVertex()->GetY(),\r
+ esd.GetMagneticField()) );\r
+ \r
+ aodV0 = new(V0s()[fNumberOfV0s++]) AliAODv0( vV0FromCascade, \r
+ dcaV0Daughters,\r
+ dcaV0ToPrimVertex, \r
+ momPosAtV0vtx, \r
+ momNegAtV0vtx, \r
+ dcaDaughterToPrimVertex); \r
+ // set the aod v0 on-the-fly status\r
+ aodV0->SetOnFlyStatus(esdV0FromCascade->GetOnFlyStatus());\r
+ \r
+ // Add the aodV0 to the aodVORefs\r
+ fAODV0Refs->AddAt(aodV0,idxV0FromCascade);\r
+ \r
+ fUsedV0[idxV0FromCascade] = kTRUE;\r
+ \r
+ } else { \r
+ // 4.B - if V0 structure already used\r
+ \r
+ // Note :\r
+ // one V0 can be used by several cascades (frequent in PbPb evts) : \r
+ // same V0 which used but attached to different bachelor tracks\r
+ // -> aodVORefs and fAODV0VtxRefs are needed.\r
+ // Goal : avoid a redundancy of the info in "Vertices" and "v0s" clones array.\r
+ \r
+ vV0FromCascade = static_cast<AliAODVertex*>( fAODV0VtxRefs->At(idxV0FromCascade) );\r
+ aodV0 = static_cast<AliAODv0*> ( fAODV0Refs ->At(idxV0FromCascade) );\r
+ \r
+ // - Treatment of the parent for such a "re-used" V0 :\r
+ // Insert the cascade that reuses the V0 vertex in the lineage chain\r
+ // Before : vV0 -> vCascade1 -> vPrimary\r
+ // - Hyp : cascade2 uses the same V0 as cascade1\r
+ // After : vV0 -> vCascade2 -> vCascade1 -> vPrimary\r
+ \r
+ AliAODVertex *vCascadePreviousParent = static_cast<AliAODVertex*> (vV0FromCascade->GetParent());\r
+ vV0FromCascade->SetParent(vCascade);\r
+ vCascade ->SetParent(vCascadePreviousParent);\r
+ \r
+// if(fDebug > 2) \r
+// printf("---- Cascade / Lineage insertion\n"\r
+// "Parent of V0 vtx = Cascade vtx %p\n"\r
+// "Parent of the cascade vtx = Cascade vtx %p\n"\r
+// "Parent of the parent cascade vtx = Cascade vtx %p\n", \r
+// static_cast<void*> (vV0FromCascade->GetParent()),\r
+// static_cast<void*> (vCascade->GetParent()),\r
+// static_cast<void*> (vCascadePreviousParent->GetParent()) );\r
+ \r
+ }// end if V0 structure already used\r
+ \r
+// if (fDebug > 2) {\r
+// printf("---- Cascade / V0 vertex: \n");\r
+// vV0FromCascade->Print();\r
+// }\r
+// \r
+// if (fDebug > 4) {\r
+// printf("---- Cascade / pos dghter : \n");\r
+// aodTrack->Print();\r
+// printf("---- Cascade / neg dghter : \n");\r
+// aodTrack->Print();\r
+// printf("---- Cascade / aodV0 : \n");\r
+// aodV0->Print();\r
+// }\r
+ \r
+ // In any case (used V0 or not), add the V0 vertex to the cascade one.\r
+ vCascade->AddDaughter(vV0FromCascade); \r
+ \r
+ \r
+ // 5 - Add the primary track of the cascade (if any)\r