]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/vertexingHF/AliCFVertexingHFLctoV0bachelor.cxx
Merge branch master into TRDdev
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliCFVertexingHFLctoV0bachelor.cxx
index ecee4d689e9329ce7395dbfc751492a96ffb4d25..e806ed759bc1b4a91f974b60c8a002c99e1159c7 100644 (file)
@@ -98,9 +98,65 @@ Bool_t AliCFVertexingHFLctoV0bachelor::SetRecoCandidateParam(AliAODRecoDecayHF *
   
   if (fRecoCandidate->GetPrimaryVtx()) AliDebug(4,"fReco Candidate has a pointer to PrimVtx\n");
   
-  AliAODRecoCascadeHF* lcV0bachelor = (AliAODRecoCascadeHF*)fRecoCandidate;
-  if ( !(lcV0bachelor->Getv0()) ) {
-    AliDebug(1,"It is not a Lc->V0+bachelor candidate");
+  AliAODRecoCascadeHF* lcV0bachelor = dynamic_cast<AliAODRecoCascadeHF*>(fRecoCandidate);
+  if (!lcV0bachelor) {
+    AliDebug(2,"cascade doesn't exist, skipped!");
+    return bSignAssoc;
+  }
+
+  if (!lcV0bachelor->GetSecondaryVtx()) {
+    AliDebug(2,"No secondary vertex for cascade");
+    return bSignAssoc;
+  }
+
+  if (lcV0bachelor->GetNDaughters()!=2) {
+    AliDebug(2,Form("No 2 daughters for current cascade (nDaughters=%d)",lcV0bachelor->GetNDaughters()));
+    return bSignAssoc;
+  }
+
+  AliVTrack *cascTrk0 = dynamic_cast<AliVTrack*>(lcV0bachelor->GetDaughter(0));
+  AliVTrack *cascTrk1 = dynamic_cast<AliVTrack*>(lcV0bachelor->GetDaughter(1));
+  if (!cascTrk0 || !cascTrk1) {
+    AliDebug(2,"At least one of V0daughters doesn't exist");
+    return bSignAssoc;
+  }
+
+  AliAODv0 * v0part = dynamic_cast<AliAODv0*>(lcV0bachelor->Getv0());
+  AliAODTrack * bachPart = dynamic_cast<AliAODTrack*>(lcV0bachelor->GetBachelor());
+  if (!v0part || !bachPart) {
+    AliDebug(2,"No V0 or no bachelor for current cascade");
+    return bSignAssoc;
+  }
+
+  if (bachPart->GetID()<0) {
+    AliDebug(2,Form("Bachelor has negative ID %d",bachPart->GetID()));
+    return bSignAssoc;
+  }
+
+  if (!v0part->GetSecondaryVtx()) {
+    AliDebug(2,"No secondary vertex for V0 by cascade");
+    return bSignAssoc;
+  }
+
+  if (v0part->GetNDaughters()!=2) {
+    AliDebug(2,Form("No 2 daughters for V0 of current cascade (onTheFly=%d, nDaughters=%d)",v0part->GetOnFlyStatus(),v0part->GetNDaughters()));
+    return bSignAssoc;
+  }
+
+  AliVTrack *trk0 = dynamic_cast<AliVTrack*>(v0part->GetDaughter(0));
+  AliVTrack *trk1 = dynamic_cast<AliVTrack*>(v0part->GetDaughter(1));
+  if (!trk0 || !trk1) {
+    AliDebug(2,"At least one of V0daughters doesn't exist");
+    return bSignAssoc;
+  }
+
+  //if (trk0->GetLabel()<0 || trk1->GetLabel()<0) {
+  //AliDebug(2,Form("At least one of V0daughters has label negative (%d %d)",trk0->GetLabel(),trk1->GetLabel()));
+  //return bSignAssoc;
+  //}
+
+ if (trk0->GetID()<0 || trk1->GetID()<0) {
+    AliDebug(2,Form("At least one of V0 daughters has negative ID %d %d",trk0->GetID(),trk1->GetID()));
     return bSignAssoc;
   }
 
@@ -122,11 +178,7 @@ Bool_t AliCFVertexingHFLctoV0bachelor::SetRecoCandidateParam(AliAODRecoDecayHF *
   if (mcLabelK0S!=-1 && mcLabelLambda!=-1)
     AliDebug(2,"Strange: current Lc->V0+bachelor candidate has two MC different labels!");
 
-  if (fGenLcOption==kCountAllLctoV0) {
-    if (mcLabelK0S!=-1) mcLabel=mcLabelK0S;
-    if (mcLabelLambda!=-1) mcLabel=mcLabelLambda;
-  }
-  else if (fGenLcOption==kCountK0Sp) {
+  if (fGenLcOption==kCountK0Sp) {
     if (mcLabelK0S!=-1) mcLabel=mcLabelK0S;
     if (mcLabelLambda!=-1) {
       mcLabel=-1;
@@ -147,7 +199,7 @@ Bool_t AliCFVertexingHFLctoV0bachelor::SetRecoCandidateParam(AliAODRecoDecayHF *
     AliDebug(4,"No mcLabel found for current candidate");
     return bSignAssoc;
   }
-  AliDebug(1,Form("Found mcLabel (%d) for current candidate",mcLabel));
+  AliDebug(1,Form("Found mcLabel (%d) for current candidate (onTheFly=%1d)",mcLabel,v0part->GetOnFlyStatus()));
 
   if (fRecoCandidate->NumberOfFakeDaughters()>0){
     fFake = 0;    // fake candidate
@@ -187,7 +239,7 @@ Bool_t AliCFVertexingHFLctoV0bachelor::GetGeneratedValuesFromMCParticle(Double_t
 
   Int_t daughter0lc = fmcPartCandidate->GetDaughter(0);
   Int_t daughter1lc = fmcPartCandidate->GetDaughter(1);
-  if (daughter0lc<0 || daughter1lc<0) {
+  if (daughter0lc<=0 || daughter1lc<=0) {
     AliDebug(2,"Lc daughters are not in MC array");
     return bGenValues;
   }
@@ -236,18 +288,51 @@ Bool_t AliCFVertexingHFLctoV0bachelor::GetRecoValuesFromCandidate(Double_t *vect
   Bool_t bFillRecoValues = kFALSE;
 
   //Get the Lc and the V0 from Lc
-  AliAODRecoCascadeHF* lcV0bachelor = (AliAODRecoCascadeHF*)fRecoCandidate;
+  AliAODRecoCascadeHF* lcV0bachelor = dynamic_cast<AliAODRecoCascadeHF*>(fRecoCandidate);
 
-  AliAODTrack* bachelor = (AliAODTrack*)lcV0bachelor->GetBachelor();
-  AliAODv0* v0toDaughters = (AliAODv0*)lcV0bachelor->Getv0();
-  if (!lcV0bachelor || !bachelor || !v0toDaughters) {
+  if (!lcV0bachelor) {
+    AliDebug(2,"Current cascade doesn't exist, skipped");
+    return bFillRecoValues;
+  }
+
+  if (!lcV0bachelor->GetSecondaryVtx()) {
+    AliDebug(2,"No secondary vertex for cascade");
+    return bFillRecoValues;
+  }
+
+  if (lcV0bachelor->GetNDaughters()!=2) {
+    AliDebug(2,Form("No 2 daughters for current cascade (nDaughters=%d)",lcV0bachelor->GetNDaughters()));
+    return bFillRecoValues;
+  }
+
+  AliAODTrack* bachelor = dynamic_cast<AliAODTrack*>(lcV0bachelor->GetBachelor());
+  AliAODv0* v0toDaughters = dynamic_cast<AliAODv0*>(lcV0bachelor->Getv0());
+  if (!bachelor || !v0toDaughters) {
     AliDebug(2,"No V0 or bachelor in this reco candidate, skipping!");
     return bFillRecoValues;
   }
 
+  if (!v0toDaughters->GetSecondaryVtx()) {
+    AliDebug(2,"No secondary vertex for V0 by cascade");
+    return bFillRecoValues;
+  }
+
+  if (v0toDaughters->GetNDaughters()!=2) {
+    AliDebug(2,Form("current V0 has not 2 daughters (onTheFly=%d, nDaughters=%d)",v0toDaughters->GetOnFlyStatus(),v0toDaughters->GetNDaughters()));
+    return bFillRecoValues;
+  }
+
   Bool_t onTheFlyStatus = v0toDaughters->GetOnFlyStatus();
-  AliAODTrack* v0positiveTrack = (AliAODTrack*)lcV0bachelor->Getv0PositiveTrack();
-  AliAODTrack* v0negativeTrack = (AliAODTrack*)lcV0bachelor->Getv0NegativeTrack();
+  AliAODTrack* v0positiveTrack;
+  AliAODTrack* v0negativeTrack;
+  if (onTheFlyStatus) {
+    v0positiveTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0NegativeTrack());
+    v0negativeTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0PositiveTrack());
+  } else {
+    v0positiveTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0PositiveTrack());
+    v0negativeTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0NegativeTrack());
+  }
+
   if (!v0positiveTrack || !v0negativeTrack) {
     AliDebug(2,"No V0daughters in this reco candidate, skipping!");
     return bFillRecoValues;
@@ -258,15 +343,17 @@ Bool_t AliCFVertexingHFLctoV0bachelor::GetRecoValuesFromCandidate(Double_t *vect
 
   Double_t cosPAwrtPrimVtxV0 = lcV0bachelor->CosV0PointingAngle();
 
-  Double_t pTbachelor = bachelor->Pt();
-  Double_t pTV0pos = v0positiveTrack->Pt();
-  Double_t pTV0neg = v0negativeTrack->Pt();
+  //Double_t pTbachelor = bachelor->Pt();
+  Double_t pbachelor = bachelor->P();
+  //Double_t pTV0pos = v0positiveTrack->Pt();
+  //Double_t pTV0neg = v0negativeTrack->Pt();
   Double_t phi = lcV0bachelor->Phi();
   Double_t dcaV0 = v0toDaughters->GetDCA();
-  Double_t cTLc = lcV0bachelor->Ct(4122); // wrt PrimVtx
+  //Double_t cTLc = lcV0bachelor->Ct(4122); // wrt PrimVtx
   //Double_t dcaLc = lcV0bachelor->GetDCA();
   Double_t cosPointingAngleLc = lcV0bachelor->CosPointingAngle();
 
+  /*
   Double_t cTV0 = 0.;
   AliAODVertex *vtx0 = (AliAODVertex*)lcV0bachelor->GetPrimaryVtx();
   if (!vtx0) {
@@ -279,6 +366,7 @@ Bool_t AliCFVertexingHFLctoV0bachelor::GetRecoValuesFromCandidate(Double_t *vect
       cTV0 = v0toDaughters->Ct(3122,primVtxPos);
     }
   }
+  */
 
   Double_t invMassV0 = 0.;
   if (fGenLcOption==kCountLambdapi) {
@@ -299,21 +387,28 @@ Bool_t AliCFVertexingHFLctoV0bachelor::GetRecoValuesFromCandidate(Double_t *vect
   vectorReco[0]  = pt;
   vectorReco[1]  = rapidity;
   vectorReco[2]  = phi;
-  vectorReco[3]  = cosPAwrtPrimVtxV0;
-  vectorReco[4]  = onTheFlyStatus;
+  vectorReco[3]  = onTheFlyStatus;
+  vectorReco[4]  = fzPrimVertex;
   vectorReco[5]  = fCentValue;
   vectorReco[6]  = fFake; // whether the reconstructed candidate was a fake (fFake = 0) or not (fFake = 2) 
   vectorReco[7]  = fMultiplicity;
 
   if (fConfiguration==AliCFTaskVertexingHF::kSnail) {
-    vectorReco[8]  = pTbachelor;
-    vectorReco[9]  = pTV0pos;
-    vectorReco[10] = pTV0neg;
-    vectorReco[11] = invMassV0;
-    vectorReco[12] = dcaV0;
-    vectorReco[13] = cTV0*1.E4; // in micron
-    vectorReco[14] = cTLc*1.E4; // in micron
+    //vectorReco[8]  = pTbachelor;
+    vectorReco[8]  = pbachelor;
+    vectorReco[9]  = v0toDaughters->Pt();
+    if (fGenLcOption==kCountLambdapi) {
+      vectorReco[10] = v0toDaughters->Y(3122);
+    } else if (fGenLcOption==kCountK0Sp) {
+      vectorReco[10] = v0toDaughters->Y(310);
+    }
+    vectorReco[11] = v0toDaughters->Phi();
+    vectorReco[12] = invMassV0;
+    vectorReco[13] = dcaV0;
+    vectorReco[14] = cosPAwrtPrimVtxV0;
     vectorReco[15] = cosPointingAngleLc;
+    //vectorReco[16] = cTV0*1.E4; // in micron
+    //vectorReco[17] = cTLc*1.E4; // in micron
   }
 
   bFillRecoValues = kTRUE;
@@ -327,7 +422,11 @@ Bool_t AliCFVertexingHFLctoV0bachelor::CheckMCChannelDecay() const
   // check the required decay channel
 
   Bool_t checkCD = kFALSE;
-  
+  Double_t sumPxDau=0.;
+  Double_t sumPyDau=0.;
+  Double_t sumPzDau=0.;
+
   if (fmcPartCandidate->GetNDaughters()!=2) {
     AliDebug(2, Form("The MC particle doesn't decay in 2 particles, skipping!!"));
     return checkCD;
@@ -335,7 +434,7 @@ Bool_t AliCFVertexingHFLctoV0bachelor::CheckMCChannelDecay() const
 
   Int_t daughter0 = fmcPartCandidate->GetDaughter(0);
   Int_t daughter1 = fmcPartCandidate->GetDaughter(1);
-  if (daughter0<0 || daughter1<0){
+  if (daughter0<=0 || daughter1<=0){
     AliDebug(2, Form("The MC particle doesn't have correct daughters, skipping!!"));
     return checkCD;
   }
@@ -361,6 +460,14 @@ Bool_t AliCFVertexingHFLctoV0bachelor::CheckMCChannelDecay() const
       mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1)); // the bachelor
       mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter0)); // the V0
     }
+    if (!mcPartDaughter0 || !mcPartDaughter1) {
+      AliDebug(2,"Problems in the MC Daughters\n");
+      return checkCD;
+    }
+    // momentum of the bachelor
+    sumPxDau+=mcPartDaughter0->Px();
+    sumPyDau+=mcPartDaughter0->Py();
+    sumPzDau+=mcPartDaughter0->Pz();
 
     if (mcPartDaughter1->GetNDaughters()!=2) {
       AliDebug(2, "The Lambda MC particle doesn't decay in 2 particles, skipping!!");
@@ -369,7 +476,7 @@ Bool_t AliCFVertexingHFLctoV0bachelor::CheckMCChannelDecay() const
 
     Int_t daughter1D0 = mcPartDaughter1->GetDaughter(0);
     Int_t daughter1D1 = mcPartDaughter1->GetDaughter(1);
-    if (daughter1D0<0 || daughter1D1<0) {
+    if (daughter1D0<=0 || daughter1D1<=0) {
       AliDebug(2, Form("The Lambda MC particle doesn't have correct daughters, skipping!!"));
       return checkCD;
     }
@@ -389,6 +496,14 @@ Bool_t AliCFVertexingHFLctoV0bachelor::CheckMCChannelDecay() const
       return checkCD;
     }
 
+    // momentum of the V0 daughters
+    sumPxDau+=mcPartDaughter1D0->Px();
+    sumPyDau+=mcPartDaughter1D0->Py();
+    sumPzDau+=mcPartDaughter1D0->Pz();
+    sumPxDau+=mcPartDaughter1D1->Px();
+    sumPyDau+=mcPartDaughter1D1->Py();
+    sumPzDau+=mcPartDaughter1D1->Pz();
+
   } else if (fGenLcOption==kCountK0Sp) { // Lc -> K0bar + proton AND cc
 
     if (!(TMath::Abs(mcPartDaughter0->GetPdgCode())==311   &&
@@ -403,9 +518,23 @@ Bool_t AliCFVertexingHFLctoV0bachelor::CheckMCChannelDecay() const
       mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1)); // the bachelor
       mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter0)); // the V0
     }
+    if (!mcPartDaughter0 || !mcPartDaughter1) {
+      AliDebug(2,"Problems in the MC Daughters after swapping V0 and bachelor\n");
+      return checkCD;
+    }
+
+    // momentum of the bachelor
+    sumPxDau+=mcPartDaughter0->Px();
+    sumPyDau+=mcPartDaughter0->Py();
+    sumPzDau+=mcPartDaughter0->Pz();
+
+    if (mcPartDaughter1->GetNDaughters()!=1) {
+      AliDebug(2, "The K0/K0bar MC particle doesn't decay in 1 particles, skipping!!");
+      return checkCD;
+    }
 
     Int_t daughter = mcPartDaughter1->GetDaughter(0);
-    if (daughter<0) {
+    if (daughter<=0) {
       AliDebug(2, Form("The K0/K0bar MC particle doesn't have correct daughter, skipping!!"));
       return checkCD;
     }
@@ -428,7 +557,7 @@ Bool_t AliCFVertexingHFLctoV0bachelor::CheckMCChannelDecay() const
 
     Int_t daughterD0 = mcPartDaughter->GetDaughter(0);
     Int_t daughterD1 = mcPartDaughter->GetDaughter(1);
-    if (daughterD0<0 || daughterD1<0) {
+    if (daughterD0<=0 || daughterD1<=0) {
       AliDebug(2, Form("The K0S MC particle doesn't have correct daughters, skipping!!"));
       return checkCD;
     }
@@ -446,8 +575,26 @@ Bool_t AliCFVertexingHFLctoV0bachelor::CheckMCChannelDecay() const
       return checkCD;
     }
 
+    // momentum of the V0 daughters
+    sumPxDau+=mcPartDaughterD0->Px();
+    sumPyDau+=mcPartDaughterD0->Py();
+    sumPzDau+=mcPartDaughterD0->Pz();
+    sumPxDau+=mcPartDaughterD1->Px();
+    sumPyDau+=mcPartDaughterD1->Py();
+    sumPzDau+=mcPartDaughterD1->Pz();
+
   }
   
+  Double_t pxMother=fmcPartCandidate->Px();
+  Double_t pyMother=fmcPartCandidate->Py();
+  Double_t pzMother=fmcPartCandidate->Pz();
+  if(TMath::Abs(pxMother-sumPxDau)/(TMath::Abs(pxMother)+1.e-13)>0.00001 ||
+     TMath::Abs(pyMother-sumPyDau)/(TMath::Abs(pyMother)+1.e-13)>0.00001 ||
+     TMath::Abs(pzMother-sumPzDau)/(TMath::Abs(pzMother)+1.e-13)>0.00001){
+    AliDebug(2, "Momentum conservation violated, skipping!!");
+    return checkCD;  
+  }
+
   checkCD = kTRUE;
   return checkCD;
   
@@ -529,13 +676,13 @@ Double_t AliCFVertexingHFLctoV0bachelor::Ctau(AliAODMCParticle *mcPartCandidate)
 
   Int_t daughterD0 = mcPartCandidate->GetDaughter(0);
   Int_t daughterD1 = mcPartCandidate->GetDaughter(1);
-  if (daughterD0<0 || daughterD1<0) {
+  if (daughterD0<=0 || daughterD1<=0) {
     AliDebug(2, Form("The Lc MC particle doesn't have correct daughters, skipping!!"));
     return cTau;
   }
 
-  AliAODMCParticle *mcPartDaughter0 = (AliAODMCParticle*)fmcArray->At(mcPartCandidate->GetDaughter(0));
-  AliAODMCParticle *mcPartDaughter1 = (AliAODMCParticle*)fmcArray->At(mcPartCandidate->GetDaughter(1));
+  AliAODMCParticle *mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughterD0));
+  AliAODMCParticle *mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughterD1));
   if (!mcPartDaughter0 || !mcPartDaughter1) {
     AliDebug(2,"The candidate daughter particles not found in MC array");
     return cTau;
@@ -583,13 +730,14 @@ Bool_t AliCFVertexingHFLctoV0bachelor::SetLabelArray()
   Bool_t checkCD = kFALSE;
   
   if (fmcPartCandidate->GetNDaughters()!=2) {
-    AliDebug(2, Form("The MC particle doesn't have 2 daughters, skipping!!"));
+    AliDebug(2, Form("The MC particle have %d daughters (not 2), skipping!!",fmcPartCandidate->GetNDaughters()));
+    //    fmcPartCandidate->Print();
     return checkCD;
   }
 
   Int_t daughter0 = fmcPartCandidate->GetDaughter(0);
   Int_t daughter1 = fmcPartCandidate->GetDaughter(1);
-  if (daughter0<0 || daughter1<0){
+  if (daughter0<=0 || daughter1<=0){
     AliDebug(2, Form("The MC particle doesn't have correct daughters, skipping!!"));
     return checkCD;
   }
@@ -634,7 +782,7 @@ Bool_t AliCFVertexingHFLctoV0bachelor::SetLabelArray()
 
     Int_t daughter1D0 = mcPartDaughter1->GetDaughter(0);
     Int_t daughter1D1 = mcPartDaughter1->GetDaughter(1);
-    if (daughter1D0<0 || daughter1D1<0) {
+    if (daughter1D0<=0 || daughter1D1<=0) {
       AliDebug(2, Form("The Lambda MC particle doesn't have correct daughters, skipping!!"));
       delete [] fLabelArray;
       fLabelArray = 0x0;
@@ -706,8 +854,15 @@ Bool_t AliCFVertexingHFLctoV0bachelor::SetLabelArray()
       daughter1 = daughterTemp; // the V0 label
     }
 
+    if (mcPartDaughter1->GetNDaughters()!=1) {
+      AliDebug(2, "The K0/K0bar MC particle doesn't decay in 1 particles, skipping!!");
+      delete [] fLabelArray;
+      fLabelArray = 0x0;
+      return checkCD;
+    }
+
     Int_t daughter = mcPartDaughter1->GetDaughter(0);
-    if (daughter<0) {
+    if (daughter<=0) {
       AliDebug(2, Form("The K0/K0bar MC particle doesn't have correct daughter, skipping!!"));
       delete [] fLabelArray;
       fLabelArray = 0x0;
@@ -738,7 +893,7 @@ Bool_t AliCFVertexingHFLctoV0bachelor::SetLabelArray()
 
     Int_t daughterD0 = mcPartDaughter->GetDaughter(0);
     Int_t daughterD1 = mcPartDaughter->GetDaughter(1);
-    if (daughterD0<0 || daughterD1<0) {
+    if (daughterD0<=0 || daughterD1<=0) {
       AliDebug(2, Form("The K0S MC particle doesn't have correct daughters, skipping!!"));
       delete [] fLabelArray;
       fLabelArray = 0x0;
@@ -798,11 +953,11 @@ Bool_t AliCFVertexingHFLctoV0bachelor::FillVectorFromMCarray(AliAODMCParticle *m
   AliAODMCParticle *mcPartV0DaughterNeg = dynamic_cast<AliAODMCParticle*>(fmcArray->At(fLabelArray[2]));
   AliAODMCParticle *mcPartDaughterV0 = 0x0;
 
-  if(!mcPartV0DaughterPos && !mcPartV0DaughterNeg) return bGenValues;
+  if(!mcPartV0DaughterPos || !mcPartV0DaughterNeg) return bGenValues;
 
   if (TMath::Abs(mcPartDaughterK0->GetPdgCode())==311) {
     Int_t daughterK0 = mcPartDaughterK0->GetDaughter(0);
-    if (daughterK0<0) {
+    if (daughterK0<=0) {
       AliDebug(2, Form("The K0/K0bar particle doesn't have correct daughter, skipping!!"));
       return bGenValues;
     }
@@ -823,9 +978,14 @@ Bool_t AliCFVertexingHFLctoV0bachelor::FillVectorFromMCarray(AliAODMCParticle *m
     }
   }
 
+  if (!mcPartDaughterV0) {
+    AliDebug(2,"V0 particle not found in MC array");
+    return bGenValues;
+  }
 
-  Double_t cTLc = Ctau(fmcPartCandidate); // by default wrt Primary Vtx
-  Double_t pTbach = mcPartDaughterBachelor->Pt(); // get the bachelor pT
+  //Double_t cTLc = Ctau(fmcPartCandidate); // by default wrt Primary Vtx
+  //Double_t pTbach = mcPartDaughterBachelor->Pt(); // get the bachelor pT
+  Double_t pbach = mcPartDaughterBachelor->P(); // get the bachelor p
 
   Double_t vtx1[3] = {0,0,0};   // primary vertex              
   Bool_t hasPrimVtx = fmcPartCandidate->XvYvZv(vtx1);  // cm
@@ -885,12 +1045,14 @@ Bool_t AliCFVertexingHFLctoV0bachelor::FillVectorFromMCarray(AliAODMCParticle *m
   charge = 0;
   AliAODRecoDecayHF* decay = new AliAODRecoDecayHF(vtx1,vtx2daughter0,nprongs,charge,px,py,pz,d0);
   Double_t cosPAwrtPrimVtxV0 = decay->CosPointingAngle();
+  /*
   Double_t cTV0 = 0.; //ct
   if (fGenLcOption==kCountK0Sp) {
     cTV0 = decay->Ct(310); // by default wrt Primary Vtx
   } else if (fGenLcOption==kCountLambdapi) {
     cTV0 = decay->Ct(3122); // by default wrt Primary Vtx
   }
+  */
 
   Double_t invMass = 0.; //invMass
   if (fGenLcOption==kCountK0Sp) {
@@ -906,21 +1068,24 @@ Bool_t AliCFVertexingHFLctoV0bachelor::FillVectorFromMCarray(AliAODMCParticle *m
   vectorMC[0]  = fmcPartCandidate->Pt();
   vectorMC[1]  = fmcPartCandidate->Y() ;
   vectorMC[2]  = fmcPartCandidate->Phi();
-  vectorMC[3]  = cosPAwrtPrimVtxV0;
-  vectorMC[4]  = 0; // dummy value x MC, onTheFlyStatus
+  vectorMC[3]  = 0; // dummy value x MC, onTheFlyStatus
+  vectorMC[4]  = fzMCVertex;
   vectorMC[5]  = fCentValue; // reconstructed centrality
   vectorMC[6]  = 1; // dummy value x MC, fFake
   vectorMC[7]  = fMultiplicity; // reconstructed multiplicity
 
   if (fConfiguration==AliCFTaskVertexingHF::kSnail) {
-    vectorMC[8]  = pTbach;
-    vectorMC[9]  = mcPartV0DaughterPos->Pt();
-    vectorMC[10] = mcPartV0DaughterNeg->Pt();
-    vectorMC[11] = invMass;
-    vectorMC[12] = 0; // dummy value x MC, V0 DCA
-    vectorMC[13] = cTV0*1.E4; // in micron
-    vectorMC[14] = cTLc*1.E4; // in micron
+    //vectorMC[8]  = pTbach;
+    vectorMC[8]  = pbach;
+    vectorMC[9]  = mcPartDaughterV0->Pt();
+    vectorMC[10] = mcPartDaughterV0->Y();
+    vectorMC[11] = mcPartDaughterV0->Phi();
+    vectorMC[12] = invMass;
+    vectorMC[13] = 0; // dummy value x MC, V0 DCA
+    vectorMC[14] = cosPAwrtPrimVtxV0;
     vectorMC[15] = cosPAwrtPrimVtxLc;
+    //vectorMC[16] = cTV0*1.E4; // in micron
+    //vectorMC[17] = cTLc*1.E4; // in micron
   }
 
   bGenValues = kTRUE;