+ postrack1 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkP1);
+
+ if(!TESTBIT(seleFlags[iTrkP1],kBitDispl)) continue;
+
+ // Make cascades with V0+track
+ //
+ if(fCascades) {
+ // loop on V0's
+ for(iv0=0; iv0<nv0; iv0++){
+
+ //AliDebug(1,Form(" loop on v0s for track number %d and v0 number %d",iTrkP1,iv0));
+
+ // Get the V0
+ if(fInputAOD) {
+ v0 = ((AliAODEvent*)event)->GetV0(iv0);
+ } else {
+ esdV0 = ((AliESDEvent*)event)->GetV0(iv0);
+ }
+ if ( (!v0 || !v0->IsA()->InheritsFrom("AliAODv0") ) &&
+ (!esdV0 || !esdV0->IsA()->InheritsFrom("AliESDv0") ) ) continue;
+
+
+ // Get the tracks that form the V0
+ // ( parameters at primary vertex )
+ // and define an AliExternalTrackParam out of them
+ AliExternalTrackParam * posV0track;
+ AliExternalTrackParam * negV0track;
+
+ if(fInputAOD){
+ AliAODTrack *posVV0track = (AliAODTrack*)(v0->GetDaughter(0));
+ AliAODTrack *negVV0track = (AliAODTrack*)(v0->GetDaughter(1));
+ if( !posVV0track || !negVV0track ) continue;
+ //
+ // Apply some basic V0 daughter criteria
+ //
+ // bachelor must not be a v0-track
+ if (posVV0track->GetID() == postrack1->GetID() ||
+ negVV0track->GetID() == postrack1->GetID()) continue;
+ // reject like-sign v0
+ if ( posVV0track->Charge() == negVV0track->Charge() ) continue;
+ // avoid ghost TPC tracks
+ if(!(posVV0track->GetStatus() & AliESDtrack::kTPCrefit) ||
+ !(negVV0track->GetStatus() & AliESDtrack::kTPCrefit)) continue;
+ // Get AliExternalTrackParam out of the AliAODTracks
+ Double_t xyz[3], pxpypz[3], cv[21]; Short_t sign;
+ posVV0track->PxPyPz(pxpypz); posVV0track->XvYvZv(xyz);
+ posVV0track->GetCovarianceXYZPxPyPz(cv); sign=posVV0track->Charge();
+ posV0track = new AliExternalTrackParam(xyz,pxpypz,cv,sign);
+ negVV0track->PxPyPz(pxpypz); negVV0track->XvYvZv(xyz);
+ negVV0track->GetCovarianceXYZPxPyPz(cv); sign=negVV0track->Charge();
+ negV0track = new AliExternalTrackParam(xyz,pxpypz,cv,sign);
+ } else {
+ AliESDtrack *posVV0track = (AliESDtrack*)(event->GetTrack( esdV0->GetPindex() ));
+ AliESDtrack *negVV0track = (AliESDtrack*)(event->GetTrack( esdV0->GetNindex() ));
+ if( !posVV0track || !negVV0track ) continue;
+ //
+ // Apply some basic V0 daughter criteria
+ //
+ // bachelor must not be a v0-track
+ if (posVV0track->GetID() == postrack1->GetID() ||
+ negVV0track->GetID() == postrack1->GetID()) continue;
+ // reject like-sign v0
+ if ( posVV0track->Charge() == negVV0track->Charge() ) continue;
+ // avoid ghost TPC tracks
+ if(!(posVV0track->GetStatus() & AliESDtrack::kTPCrefit) ||
+ !(negVV0track->GetStatus() & AliESDtrack::kTPCrefit)) continue;
+ // reject kinks (only necessary on AliESDtracks)
+ if (posVV0track->GetKinkIndex(0)>0 || negVV0track->GetKinkIndex(0)>0) continue;
+ // Get AliExternalTrackParam out of the AliESDtracks
+ posV0track = new AliExternalTrackParam(*posVV0track);
+ negV0track = new AliExternalTrackParam(*negVV0track);
+
+ // Define the AODv0 from ESDv0 if reading ESDs
+ v0 = TransformESDv0toAODv0(esdV0,twoTrackArrayV0);
+ }
+ if( !posV0track || !negV0track ){
+ AliDebug(1,Form(" Couldn't get the V0 daughters"));
+ continue;
+ }
+
+ // fill in the v0 two-external-track-param array
+ twoTrackArrayV0->AddAt(posV0track,0);
+ twoTrackArrayV0->AddAt(negV0track,1);
+
+ // Get the V0 dca
+ dcaV0 = v0->DcaV0Daughters();
+
+ // Define the V0 (neutral) track
+ AliNeutralTrackParam *trackV0;
+ if(fInputAOD) {
+ const AliVTrack *trackVV0 = dynamic_cast<const AliVTrack*>(v0);
+ if(trackVV0) trackV0 = new AliNeutralTrackParam(trackVV0);
+ } else {
+ Double_t xyz[3], pxpypz[3];
+ esdV0->XvYvZv(xyz);
+ esdV0->PxPyPz(pxpypz);
+ Double_t cv[21]; for(int i=0; i<21; i++) cv[i]=0;
+ trackV0 = new AliNeutralTrackParam(xyz,pxpypz,cv,0);
+ }
+ // Fill in the object array to create the cascade
+ twoTrackArrayCasc->AddAt(postrack1,0);
+ twoTrackArrayCasc->AddAt(trackV0,1);
+ // Compute the cascade vertex
+ AliAODVertex *vertexCasc = 0;
+ if(fFindVertexForCascades) {
+ // DCA between the two tracks
+ dcaCasc = postrack1->GetDCA(trackV0,fBzkG,xdummy,ydummy);
+ // Vertexing+
+ vertexCasc = ReconstructSecondaryVertex(twoTrackArrayCasc,dispersion,kFALSE);
+ } else {
+ // assume Cascade decays at the primary vertex
+ Double_t pos[3],cov[6],chi2perNDF;
+ fV1->GetXYZ(pos);
+ fV1->GetCovMatrix(cov);
+ chi2perNDF = fV1->GetChi2toNDF();
+ vertexCasc = new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,2);
+ dcaCasc = 0.;
+ }
+ if(!vertexCasc) {
+ delete posV0track; posV0track=NULL;
+ delete negV0track; negV0track=NULL;
+ delete trackV0; trackV0=NULL;
+ if(!fInputAOD) {delete v0; v0=NULL;}
+ twoTrackArrayV0->Clear();
+ twoTrackArrayCasc->Clear();
+ continue;
+ }
+
+ // Create and store the Cascade if passed the cuts
+ ioCascade = MakeCascade(twoTrackArrayCasc,event,vertexCasc,v0,dcaCasc,okCascades);
+ if(okCascades && ioCascade) {
+ //AliDebug(1,Form("Storing a cascade object... "));
+ // add the vertex and the cascade to the AOD
+ AliAODVertex *vCasc = new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexCasc);
+ rc = new(aodCascadesRef[iCascades++])AliAODRecoCascadeHF(*ioCascade);
+ rc->SetSecondaryVtx(vCasc);
+ vCasc->SetParent(rc);
+ rc->SetPrimaryVtxRef((AliAODVertex*)event->GetPrimaryVertex());
+ if(!fInputAOD) vCasc->AddDaughter(v0); // just to fill ref #0 ??
+ AddRefs(vCasc,rc,event,twoTrackArrayCasc); // add the track (proton)
+ vCasc->AddDaughter(v0); // fill the 2prong V0
+ }
+
+ // Clean up
+ delete posV0track; posV0track=NULL;
+ delete negV0track; negV0track=NULL;
+ delete trackV0; trackV0=NULL;
+ twoTrackArrayV0->Clear();
+ twoTrackArrayCasc->Clear();
+ if(ioCascade) { delete ioCascade; ioCascade=NULL; }
+ if(vertexCasc) { delete vertexCasc; vertexCasc=NULL; }
+ if(!fInputAOD) {delete v0; v0=NULL;}
+
+ } // end loop on V0's
+ }
+
+ // If there is less than 2 particles continue
+ if(trkEntries<2) {
+ AliDebug(1,Form(" Not enough tracks: %d",trkEntries));
+ continue;
+ }
+
+ if(postrack1->Charge()<0 && !fLikeSign) continue;
+