]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/vertexingHF/AliAnalysisVertexingHF.cxx
Included also 3 and 4 prong decays; added variables to ntuple
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliAnalysisVertexingHF.cxx
index 37ee4150a4a143abab69016df9b2fea3e17e8e4b..c27cc5e04fd20d055bc920be672d32661b3b01e4 100644 (file)
@@ -54,6 +54,7 @@ ClassImp(AliAnalysisVertexingHF)
 //----------------------------------------------------------------------------
 AliAnalysisVertexingHF::AliAnalysisVertexingHF():
 fInputAOD(kFALSE),
+fAODMapSize(0),
 fAODMap(0),
 fBzkG(0.),
 fSecVtxWithKF(kFALSE),
@@ -84,6 +85,7 @@ fFindVertexForDstar(kTRUE)
 AliAnalysisVertexingHF::AliAnalysisVertexingHF(const AliAnalysisVertexingHF &source) : 
 TNamed(source),
 fInputAOD(source.fInputAOD),
+fAODMapSize(source.fAODMapSize),
 fAODMap(source.fAODMap),
 fBzkG(source.fBzkG),
 fSecVtxWithKF(source.fSecVtxWithKF),
@@ -119,6 +121,7 @@ AliAnalysisVertexingHF &AliAnalysisVertexingHF::operator=(const AliAnalysisVerte
   //
   if(&source == this) return *this;
   fInputAOD = source.fInputAOD;
+  fAODMapSize = source.fAODMapSize;
   fBzkG = source.fBzkG;
   fSecVtxWithKF = source.fSecVtxWithKF;
   fRecoPrimVtxSkippingTrks = source.fRecoPrimVtxSkippingTrks;
@@ -150,6 +153,7 @@ AliAnalysisVertexingHF::~AliAnalysisVertexingHF() {
   if(fV1) { delete fV1; fV1=0; }
   if(fTrackFilter) { delete fTrackFilter; fTrackFilter=0; }
   if(fTrackFilterSoftPi) { delete fTrackFilterSoftPi; fTrackFilterSoftPi=0; }
+  if(fAODMap) { delete fAODMap; fAODMap=0; }
 }
 //----------------------------------------------------------------------------
 void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
@@ -159,7 +163,8 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
                                            TClonesArray *aodCharm3ProngTClArr,
                                            TClonesArray *aodCharm4ProngTClArr,
                                            TClonesArray *aodDstarTClArr,
-                                           TClonesArray *aodLikeSignTClArr)
+                                           TClonesArray *aodLikeSign2ProngTClArr,
+                                           TClonesArray *aodLikeSign3ProngTClArr)
 {
   // Find heavy-flavour vertex candidates
   // Input:  ESD or AOD
@@ -169,6 +174,12 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
   TString evtype = event->IsA()->GetName();
   fInputAOD = ((evtype=="AliAODEvent") ? kTRUE : kFALSE);
 
+  if(fInputAOD) {
+    AliDebug(2,"Creating HF candidates from AOD");
+  } else {
+    AliDebug(2,"Creating HF candidates from ESD");
+  }
+
   if(!aodVerticesHFTClArr) {
     printf("ERROR: no aodVerticesHFTClArr");
     return;
@@ -193,13 +204,17 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
     printf("ERROR: no aodDstarTClArr");
     return;
   }
-  if(fLikeSign && !aodLikeSignTClArr) {
-    printf("ERROR: no aodLikeSignTClArr");
+  if(fLikeSign && !aodLikeSign2ProngTClArr) {
+    printf("ERROR: no aodLikeSign2ProngTClArr");
+    return;
+  }
+  if(fLikeSign && f3Prong && !aodLikeSign3ProngTClArr) {
+    printf("ERROR: no aodLikeSign2ProngTClArr");
     return;
   }
 
   // delete candidates from previous event and create references
-  Int_t iVerticesHF=0,iD0toKpi=0,iJPSItoEle=0,i3Prong=0,i4Prong=0,iDstar=0,iLikeSign=0;
+  Int_t iVerticesHF=0,iD0toKpi=0,iJPSItoEle=0,i3Prong=0,i4Prong=0,iDstar=0,iLikeSign2Prong=0,iLikeSign3Prong=0;
   aodVerticesHFTClArr->Delete();
   iVerticesHF = aodVerticesHFTClArr->GetEntriesFast();
   TClonesArray &verticesHFRef = *aodVerticesHFTClArr;
@@ -223,16 +238,22 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
     aodDstarTClArr->Delete();
     iDstar = aodDstarTClArr->GetEntriesFast();
   }
-  if(fLikeSign)   {                                
-    aodLikeSignTClArr->Delete();                     
-    iLikeSign = aodLikeSignTClArr->GetEntriesFast(); 
+  if(fLikeSign) {                                
+    aodLikeSign2ProngTClArr->Delete();                     
+    iLikeSign2Prong = aodLikeSign2ProngTClArr->GetEntriesFast(); 
+  }  
+  if(fLikeSign && f3Prong) {                                
+    aodLikeSign3ProngTClArr->Delete();                     
+    iLikeSign3Prong = aodLikeSign3ProngTClArr->GetEntriesFast(); 
   }  
-  TClonesArray &aodD0toKpiRef      = *aodD0toKpiTClArr;
-  TClonesArray &aodJPSItoEleRef    = *aodJPSItoEleTClArr;
-  TClonesArray &aodCharm3ProngRef  = *aodCharm3ProngTClArr;
-  TClonesArray &aodCharm4ProngRef  = *aodCharm4ProngTClArr;
-  TClonesArray &aodDstarRef        = *aodDstarTClArr;
-  TClonesArray &aodLikeSignRef     = *aodLikeSignTClArr;
+
+  TClonesArray &aodD0toKpiRef        = *aodD0toKpiTClArr;
+  TClonesArray &aodJPSItoEleRef      = *aodJPSItoEleTClArr;
+  TClonesArray &aodCharm3ProngRef    = *aodCharm3ProngTClArr;
+  TClonesArray &aodCharm4ProngRef    = *aodCharm4ProngTClArr;
+  TClonesArray &aodDstarRef          = *aodDstarTClArr;
+  TClonesArray &aodLikeSign2ProngRef = *aodLikeSign2ProngTClArr;
+  TClonesArray &aodLikeSign3ProngRef = *aodLikeSign3ProngTClArr;
 
 
   AliAODRecoDecayHF2Prong *io2Prong  = 0;
@@ -273,7 +294,8 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
     return;
   }
   TString primTitle = primary->GetTitle();
-  if(!primTitle.Contains("VertexerTracks")) {
+  if(!primTitle.Contains("VertexerTracks") ||
+     primary->GetNContributors()<=0) {
     AliDebug(1," No primary vertex from tracks");
     return;
   }
@@ -295,7 +317,7 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
   TObjArray *fourTrackArray    = new TObjArray(4);
   
   Double_t dispersion;
-  Bool_t isLikeSignPair=kFALSE;
+  Bool_t isLikeSign2Prong=kFALSE,isLikeSign3Prong=kFALSE;
 
   AliAODRecoDecayHF   *rd = 0;
   AliAODRecoCascadeHF *rc = 0;
@@ -327,17 +349,18 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
       if(!TESTBIT(seleFlags[iTrkN1],kBitDispl)) continue;
 
       if(postrack1->Charge()==negtrack1->Charge()) { // like-sign 
-       isLikeSignPair=kTRUE;
+       isLikeSign2Prong=kTRUE;
        if(!fLikeSign)    continue;
        if(iTrkN1<iTrkP1) continue; // this is needed to avoid double-counting of like-sign
       } else { // unlike-sign
-       isLikeSignPair=kFALSE;
+       isLikeSign2Prong=kFALSE;
        if(postrack1->Charge()<0 || negtrack1->Charge()>0) continue;  // this is needed to avoid double-counting of unlike-sign
       }
 
       // back to primary vertex
       postrack1->PropagateToDCA(fV1,fBzkG,kVeryBig);
       negtrack1->PropagateToDCA(fV1,fBzkG,kVeryBig);
+      //printf("********** %d %d\n",postrack1->GetID(),negtrack1->GetID());
 
       // DCA between the two tracks
       dcap1n1 = postrack1->GetDCA(negtrack1,fBzkG,xdummy,ydummy);
@@ -355,14 +378,14 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
 
       // 2 prong candidate
       if(fD0toKpi || fJPSItoEle || fDstar || fLikeSign) { 
-
+      
        io2Prong = Make2Prong(twoTrackArray1,event,vertexp1n1,dcap1n1,okD0,okJPSI,okD0fromDstar);
-
-       if((fD0toKpi && okD0) || (fJPSItoEle && okJPSI) || (isLikeSignPair && (okD0 || okJPSI))) {
+      
+       if((fD0toKpi && okD0) || (fJPSItoEle && okJPSI) || (isLikeSign2Prong && (okD0 || okJPSI))) {
          // add the vertex and the decay to the AOD
          AliAODVertex *v2Prong = new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexp1n1);
          if(fInputAOD) AddDaughterRefs(v2Prong,event,twoTrackArray1);
-         if(!isLikeSignPair) {
+         if(!isLikeSign2Prong) {
            if(okD0) {  
              rd = new(aodD0toKpiRef[iD0toKpi++])AliAODRecoDecayHF2Prong(*io2Prong);
              rd->SetSecondaryVtx(v2Prong);
@@ -373,14 +396,14 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
              rd->SetSecondaryVtx(v2Prong);
              if(!okD0) v2Prong->SetParent(rd); // it cannot have two mothers ...
            }
-         } else { // isLikeSignPair
-           rd = new(aodLikeSignRef[iLikeSign++])AliAODRecoDecayHF2Prong(*io2Prong);
+         } else { // isLikeSign2Prong
+           rd = new(aodLikeSign2ProngRef[iLikeSign2Prong++])AliAODRecoDecayHF2Prong(*io2Prong);
            rd->SetSecondaryVtx(v2Prong);
            v2Prong->SetParent(rd);
          }
        }
        // D* candidates
-       if(fDstar && okD0fromDstar && !isLikeSignPair) {
+       if(fDstar && okD0fromDstar && !isLikeSign2Prong) {
          // write references in io2Prong
          if(fInputAOD) {
            AddDaughterRefs(vertexp1n1,event,twoTrackArray1);
@@ -459,19 +482,19 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
            }
            twoTrackArrayCasc->Clear();
            trackPi=0; 
-           ioCascade=NULL;
-           delete vertexCasc;
+           if(ioCascade) {delete ioCascade; ioCascade=NULL;}
+           delete vertexCasc; vertexCasc=NULL;
          } // end loop on soft pi tracks
 
          if(trackD0) {delete trackD0; trackD0=NULL;}
 
        }
-
-       io2Prong=NULL;
+       if(io2Prong) {delete io2Prong; io2Prong=NULL;}
       }      
 
       twoTrackArray1->Clear(); 
-      if((!f3Prong && !f4Prong) || isLikeSignPair)  { 
+      if( (!f3Prong && !f4Prong) || 
+         (isLikeSign2Prong && !f3Prong) ) { 
        negtrack1=0; 
        delete vertexp1n1; 
        continue; 
@@ -492,6 +515,16 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
 
        if(!TESTBIT(seleFlags[iTrkP2],kBitDispl)) continue;
 
+       if(isLikeSign2Prong) { // like-sign pair -> have to build only like-sign triplet 
+         if(postrack1->Charge()>0) { // ok: like-sign triplet (+++)
+           isLikeSign3Prong=kTRUE;
+         } else { // not ok
+           continue;
+         }
+       } else { // normal triplet (+-+)
+         isLikeSign3Prong=kFALSE; 
+       }
+
        // back to primary vertex
        postrack1->PropagateToDCA(fV1,fBzkG,kVeryBig);
        postrack2->PropagateToDCA(fV1,fBzkG,kVeryBig);
@@ -510,30 +543,47 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
        if(!vertexp2n1) { 
          twoTrackArray2->Clear();
          postrack2=0; 
-         continue; 
+         continue;
        }
 
        // 3 prong candidates
        if(f3Prong) { 
-
-         threeTrackArray->AddAt(postrack1,0);
-         threeTrackArray->AddAt(negtrack1,1);
-         threeTrackArray->AddAt(postrack2,2);
+         if(postrack2->Charge()>0) {
+           threeTrackArray->AddAt(postrack1,0);
+           threeTrackArray->AddAt(negtrack1,1);
+           threeTrackArray->AddAt(postrack2,2);
+         } else {
+           threeTrackArray->AddAt(negtrack1,0);
+           threeTrackArray->AddAt(postrack1,1);
+           threeTrackArray->AddAt(postrack2,2);
+         }
 
          AliAODVertex* secVert3PrAOD = ReconstructSecondaryVertex(threeTrackArray,dispersion);
          io3Prong = Make3Prong(threeTrackArray,event,secVert3PrAOD,dispersion,vertexp1n1,vertexp2n1,dcap1n1,dcap2n1,dcap1p2,ok3Prong);
          if(ok3Prong) {
            AliAODVertex *v3Prong = new(verticesHFRef[iVerticesHF++])AliAODVertex(*secVert3PrAOD);
            if(fInputAOD) AddDaughterRefs(v3Prong,event,threeTrackArray);
-           rd = new(aodCharm3ProngRef[i3Prong++])AliAODRecoDecayHF3Prong(*io3Prong);
-           rd->SetSecondaryVtx(v3Prong);
-           v3Prong->SetParent(rd);
+           if(!isLikeSign3Prong) {
+             rd = new(aodCharm3ProngRef[i3Prong++])AliAODRecoDecayHF3Prong(*io3Prong);
+             rd->SetSecondaryVtx(v3Prong);
+             v3Prong->SetParent(rd);
+           } else { // isLikeSign3Prong
+             rd = new(aodLikeSign3ProngRef[iLikeSign3Prong++])AliAODRecoDecayHF3Prong(*io3Prong);
+             rd->SetSecondaryVtx(v3Prong);
+             v3Prong->SetParent(rd);
+           }
          }
-         if(io3Prong) io3Prong=NULL; 
+         if(io3Prong) {delete io3Prong; io3Prong=NULL;} 
+         if(secVert3PrAOD) {delete secVert3PrAOD; secVert3PrAOD=NULL;} 
        }
 
        // 4 prong candidates
-       if(f4Prong) {
+       if(f4Prong 
+          // don't make 4 prong with like-sign pairs and triplets
+          && !isLikeSign2Prong && !isLikeSign3Prong
+          // track-to-track dca cuts already now
+          && dcap1n1 < fD0to4ProngsCuts[1]
+          && dcap2n1 < fD0to4ProngsCuts[1]) {
 
          // back to primary vertex
          postrack1->PropagateToDCA(fV1,fBzkG,kVeryBig);
@@ -565,9 +615,9 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
            negtrack1->PropagateToDCA(fV1,fBzkG,kVeryBig);
            negtrack2->PropagateToDCA(fV1,fBzkG,kVeryBig);
            dcap1n2 = postrack1->GetDCA(negtrack2,fBzkG,xdummy,ydummy);
-           if(dcap1n2>dcaMax) { negtrack2=0; continue; }
+           if(dcap1n2 > fD0to4ProngsCuts[1]) { negtrack2=0; continue; }
             dcap2n2 = postrack2->GetDCA(negtrack2,fBzkG,xdummy,ydummy);
-            if(dcap2n2>dcaMax) { negtrack2=0; continue; }
+            if(dcap2n2 > fD0to4ProngsCuts[1]) { negtrack2=0; continue; }
 
            // Vertexing
            fourTrackArray->AddAt(postrack1,0);
@@ -585,7 +635,8 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
              v4Prong->SetParent(rd);
            }
 
-           if(io4Prong) io4Prong=NULL; 
+           if(io4Prong) {delete io4Prong; io4Prong=NULL;} 
+           if(secVert4PrAOD) {delete secVert4PrAOD; secVert4PrAOD=NULL;} 
            fourTrackArray->Clear();
            negtrack2 = 0;
 
@@ -603,7 +654,7 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
 
       twoTrackArray2->Clear();
       
-      // 2nd LOOP  ON  NEGATIVE  TRACKS (for 3 prong +--)
+      // 2nd LOOP  ON  NEGATIVE  TRACKS (for 3 prong -+-)
       for(iTrkN2=iTrkN1+1; iTrkN2<nSeleTrks; iTrkN2++) {
 
        if(iTrkN2==iTrkP1 || iTrkN2==iTrkP2 || iTrkN2==iTrkN1) continue;
@@ -617,6 +668,16 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
 
        if(!TESTBIT(seleFlags[iTrkN2],kBitDispl)) continue;
 
+       if(isLikeSign2Prong) { // like-sign pair -> have to build only like-sign triplet 
+         if(postrack1->Charge()<0) { // ok: like-sign triplet (---)
+           isLikeSign3Prong=kTRUE;
+         } else { // not ok
+           continue;
+         }
+       } else { // normal triplet (-+-)
+         isLikeSign3Prong=kFALSE; 
+       }
+
        // back to primary vertex
        postrack1->PropagateToDCA(fV1,fBzkG,kVeryBig);
        negtrack1->PropagateToDCA(fV1,fBzkG,kVeryBig);
@@ -648,17 +709,25 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
          if(ok3Prong) {
            AliAODVertex *v3Prong = new(verticesHFRef[iVerticesHF++])AliAODVertex(*secVert3PrAOD);
            if(fInputAOD) AddDaughterRefs(v3Prong,event,threeTrackArray);
-           rd = new(aodCharm3ProngRef[i3Prong++])AliAODRecoDecayHF3Prong(*io3Prong);
-           rd->SetSecondaryVtx(v3Prong);
-           v3Prong->SetParent(rd);
+           if(!isLikeSign3Prong) {
+             rd = new(aodCharm3ProngRef[i3Prong++])AliAODRecoDecayHF3Prong(*io3Prong);
+             rd->SetSecondaryVtx(v3Prong);
+             v3Prong->SetParent(rd);
+           } else { // isLikeSign3Prong
+             rd = new(aodLikeSign3ProngRef[iLikeSign3Prong++])AliAODRecoDecayHF3Prong(*io3Prong);
+             rd->SetSecondaryVtx(v3Prong);
+             v3Prong->SetParent(rd);
+           }
          }
-         if(io3Prong) io3Prong=NULL; 
+         if(io3Prong) {delete io3Prong; io3Prong=NULL;} 
+         if(secVert3PrAOD) {delete secVert3PrAOD; secVert3PrAOD=NULL;}
        }
 
        negtrack2 = 0;
        delete vertexp1n2;
 
       } // end 2nd loop on negative tracks
+      
       twoTrackArray2->Clear();
       
       negtrack1 = 0;
@@ -692,8 +761,12 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
                    (Int_t)aodDstarTClArr->GetEntriesFast()));
   }
   if(fLikeSign) {
-    AliDebug(1,Form(" Like-sign pairs in event = %d;\n",
-                   (Int_t)aodLikeSignTClArr->GetEntriesFast()));
+    AliDebug(1,Form(" Like-sign 2Prong in event = %d;\n",
+                   (Int_t)aodLikeSign2ProngTClArr->GetEntriesFast()));
+  }
+  if(fLikeSign && f3Prong) {
+    AliDebug(1,Form(" Like-sign 3Prong in event = %d;\n",
+                   (Int_t)aodLikeSign3ProngTClArr->GetEntriesFast()));
   }
     
 
@@ -706,7 +779,8 @@ void AliAnalysisVertexingHF::FindCandidates(AliVEvent *event,
   delete [] seleFlags; seleFlags=NULL;
 
   if(fInputAOD) {
-    seleTrksArray.Delete();
+    seleTrksArray.Delete(); 
+    if(fAODMap) { delete fAODMap; fAODMap=NULL; }
   }
 
   return;
@@ -782,8 +856,8 @@ AliAODRecoCascadeHF* AliAnalysisVertexingHF::MakeCascade(
   delete tmpCascade; tmpCascade=NULL;
   if(!fRecoPrimVtxSkippingTrks && !fRmTrksFromPrimVtx) {
     rd2Prong->UnsetOwnPrimaryVtx();
-    delete primVertexAOD; primVertexAOD=NULL;
   }
+  if(primVertexAOD) {delete primVertexAOD; primVertexAOD=NULL;}
   //---
   
   return theCascade;
@@ -826,7 +900,7 @@ AliAODRecoDecayHF2Prong *AliAnalysisVertexingHF::Make2Prong(
     AliDebug(2," candidate didn't pass mass cut");
     return 0x0;    
   }
-
+  
   // primary vertex to be used by this candidate
   AliAODVertex *primVertexAOD  = PrimaryVertex(twoTrackArray,event);
   if(!primVertexAOD) return 0x0;
@@ -838,14 +912,15 @@ AliAODRecoDecayHF2Prong *AliAnalysisVertexingHF::Make2Prong(
   negtrack->PropagateToDCA(primVertexAOD,fBzkG,kVeryBig,d0z0,covd0z0);
   d0[1] = d0z0[0];
   d0err[1] = TMath::Sqrt(covd0z0[0]);
-
+  
   // create the object AliAODRecoDecayHF2Prong
   AliAODRecoDecayHF2Prong *the2Prong = new AliAODRecoDecayHF2Prong(secVert,px,py,pz,d0,d0err,dca);
   the2Prong->SetOwnPrimaryVtx(primVertexAOD);
   UShort_t id[2]={(UShort_t)postrack->GetID(),(UShort_t)negtrack->GetID()};
   the2Prong->SetProngIDs(2,id);
+  delete primVertexAOD; primVertexAOD=NULL;
 
-
+  
   // select D0->Kpi
   Int_t checkD0,checkD0bar;
   if(fD0toKpi)   okD0          = the2Prong->SelectD0(fD0toKpiCuts,checkD0,checkD0bar);
@@ -859,8 +934,10 @@ AliAODRecoDecayHF2Prong *AliAnalysisVertexingHF::Make2Prong(
   //if(fDebug && fDstar) printf("   %d\n",(Int_t)okD0fromDstar);
 
   // remove the primary vertex (was used only for selection)
-  if(!fRecoPrimVtxSkippingTrks && !fRmTrksFromPrimVtx) the2Prong->UnsetOwnPrimaryVtx();
-
+  if(!fRecoPrimVtxSkippingTrks && !fRmTrksFromPrimVtx) {
+    the2Prong->UnsetOwnPrimaryVtx();
+  }
+  
   // get PID info from ESD
   Double_t esdpid0[5]={0.,0.,0.,0.,0.};
   if(postrack->GetStatus()&AliESDtrack::kESDpid) postrack->GetESDpid(esdpid0);
@@ -889,7 +966,7 @@ AliAODRecoDecayHF3Prong* AliAnalysisVertexingHF::Make3Prong(
 
 
   ok3Prong=kFALSE;
-  if(!secVert) return 0x0; 
+  if(!secVert || !vertexp1n1 || !vertexp2n1) return 0x0; 
 
   Double_t px[3],py[3],pz[3],d0[3],d0err[3];
   Double_t momentum[3];
@@ -944,6 +1021,7 @@ AliAODRecoDecayHF3Prong* AliAnalysisVertexingHF::Make3Prong(
   UShort_t id[3]={(UShort_t)postrack1->GetID(),(UShort_t)negtrack->GetID(),(UShort_t)postrack2->GetID()};
   the3Prong->SetProngIDs(3,id);
 
+  delete primVertexAOD; primVertexAOD=NULL;
 
   // select D+->Kpipi, Ds->KKpi, Lc->pKpi
   if(f3Prong) {
@@ -955,7 +1033,9 @@ AliAODRecoDecayHF3Prong* AliAnalysisVertexingHF::Make3Prong(
   }
   //if(fDebug) printf("ok3Prong: %d\n",(Int_t)ok3Prong);
 
-  if(!fRecoPrimVtxSkippingTrks && !fRmTrksFromPrimVtx) the3Prong->UnsetOwnPrimaryVtx();
+  if(!fRecoPrimVtxSkippingTrks && !fRmTrksFromPrimVtx) {
+    the3Prong->UnsetOwnPrimaryVtx();
+  }
 
   // get PID info from ESD
   Double_t esdpid0[5]={0.,0.,0.,0.,0.};
@@ -990,7 +1070,7 @@ AliAODRecoDecayHF4Prong* AliAnalysisVertexingHF::Make4Prong(
   // G.E.Bruno, R.Romita
 
   ok4Prong=kFALSE;
-  if(!secVert) return 0x0; 
+  if(!secVert || !vertexp1n1 || !vertexp1n1p2) return 0x0; 
 
   Double_t px[4],py[4],pz[4],d0[4],d0err[4];//d0z[3];
 
@@ -1015,12 +1095,15 @@ AliAODRecoDecayHF4Prong* AliAnalysisVertexingHF::Make4Prong(
   px[3] = momentum[0]; py[3] = momentum[1]; pz[3] = momentum[2];
 
   // invariant mass cut for rho or D0 (try to improve coding here..)
-  //Bool_t okMassCut=kFALSE;
-  //if(!okMassCut) if(SelectInvMass(2,3,px,py,pz)) okMassCut=kTRUE;
-  //if(!okMassCut) {
-  //  if(fDebug) printf(" candidate didn't pass mass cut\n");
-  //  return 0x0;
-  // }
+  Bool_t okMassCut=kFALSE;
+  if(!okMassCut && fD0to4ProngsCuts[8]==0.){      //no PID, to be implemented with PID
+    if(SelectInvMass(4,4,px,py,pz)) okMassCut=kTRUE;
+  }
+  if(!okMassCut) {
+    //if(fDebug) printf(" candidate didn't pass mass cut\n");
+    //printf(" candidate didn't pass mass cut\n");
+    return 0x0;
+  }
 
   // primary vertex to be used by this candidate
   AliAODVertex *primVertexAOD  = PrimaryVertex(fourTrackArray,event);
@@ -1053,22 +1136,14 @@ AliAODRecoDecayHF4Prong* AliAnalysisVertexingHF::Make4Prong(
   UShort_t id[4]={(UShort_t)postrack1->GetID(),(UShort_t)negtrack1->GetID(),(UShort_t)postrack2->GetID(),(UShort_t)negtrack2->GetID()};
   the4Prong->SetProngIDs(4,id);
 
-  // invariant mass cut for rho or D0 (try to improve coding here..)
-  Bool_t okMassCut=kFALSE;
-  if(!okMassCut && fD0to4ProngsCuts[8]==0.){      //no PID, to be implemented with PID
-    if(SelectInvMass(4,4,px,py,pz)) okMassCut=kTRUE;
-  }
-  if(!okMassCut) {
-    //if(fDebug) printf(" candidate didn't pass mass cut\n");
-    //printf(" candidate didn't pass mass cut\n");
-    return 0x0;
-  }
-
+  delete primVertexAOD; primVertexAOD=NULL;
 
   Int_t checkD0,checkD0bar;
   ok4Prong=the4Prong->SelectD0(fD0to4ProngsCuts,checkD0,checkD0bar);
 
-  if(!fRecoPrimVtxSkippingTrks && !fRmTrksFromPrimVtx) the4Prong->UnsetOwnPrimaryVtx();
+  if(!fRecoPrimVtxSkippingTrks && !fRmTrksFromPrimVtx) {
+    the4Prong->UnsetOwnPrimaryVtx();
+  }
 
  
   // get PID info from ESD
@@ -1127,7 +1202,7 @@ AliAODVertex* AliAnalysisVertexingHF::PrimaryVertex(TObjArray *trkArray,
        if(strstr(fV1->GetTitle(),"VertexerTracksWithConstraintOnlyFitter")) 
          vertexer->SetOnlyFitter();
       }
-      Int_t skipped[10];
+      Int_t skipped[1000];
       Int_t nTrksToSkip=0,id;
       AliExternalTrackParam *t = 0;
       for(Int_t i=0; i<nTrks; i++) {
@@ -1136,6 +1211,20 @@ AliAODVertex* AliAnalysisVertexingHF::PrimaryVertex(TObjArray *trkArray,
        if(id<0) continue;
        skipped[nTrksToSkip++] = id;
       }
+      // TEMPORARY FIX
+      // For AOD, skip also tracks without covariance matrix
+      if(fInputAOD) {
+       Double_t covtest[21];
+       for(Int_t j=0; j<event->GetNumberOfTracks(); j++) {
+         AliVTrack *vtrack = (AliVTrack*)event->GetTrack(j);
+         if(!vtrack->GetCovarianceXYZPxPyPz(covtest)) {
+           id = (Int_t)t->GetID();
+           if(id<0) continue;
+           skipped[nTrksToSkip++] = id;
+         }
+       }
+      }
+      //
       vertexer->SetSkipTracks(nTrksToSkip,skipped);
       vertexESD = (AliESDVertex*)vertexer->FindPrimaryVertex(event); 
       
@@ -1359,7 +1448,7 @@ Bool_t AliAnalysisVertexingHF::SelectInvMass(Int_t decay,
   Double_t *dummyd0 = new Double_t[nprongs];
   for(Int_t ip=0;ip<nprongs;ip++) dummyd0[ip]=0.;
   AliAODRecoDecay *rd = new AliAODRecoDecay(0x0,nprongs,dummycharge,px,py,pz,dummyd0);
-  delete [] dummyd0;
+  delete [] dummyd0; dummyd0=NULL;
 
   UInt_t pdg2[2],pdg3[3],pdg4[4];
   Double_t mPDG,minv;
@@ -1434,7 +1523,7 @@ Bool_t AliAnalysisVertexingHF::SelectInvMass(Int_t decay,
       break;
     }
 
-  delete rd;
+  delete rd; rd=NULL;
 
   return retval;
 }
@@ -1452,7 +1541,7 @@ void AliAnalysisVertexingHF::SelectTracksAndCopyVertex(AliVEvent *event,
   const AliVVertex *vprimary = event->GetPrimaryVertex();
 
   if(fV1) { delete fV1; fV1=NULL; }
-  if(fAODMap) { delete [] fAODMap; fAODMap=NULL; }
+  if(fAODMap) { delete fAODMap; fAODMap=NULL; }
 
   Int_t nindices=0;
   UShort_t *indices = 0;
@@ -1465,7 +1554,8 @@ void AliAnalysisVertexingHF::SelectTracksAndCopyVertex(AliVEvent *event,
     vprimary->GetCovarianceMatrix(cov);
     fV1 = new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
     indices = new UShort_t[event->GetNumberOfTracks()];
-    fAODMap = new Int_t[100000];
+    fAODMapSize = 100000;
+    fAODMap = new Int_t[fAODMapSize];
   }
 
 
@@ -1491,6 +1581,7 @@ void AliAnalysisVertexingHF::SelectTracksAndCopyVertex(AliVEvent *event,
     }
 
     AliESDtrack *esdt = 0;
+
     if(!fInputAOD) {
       esdt = (AliESDtrack*)track;
     } else {