Analysis code update for ESDs + AOD part developed
authorlmilano <lmilano@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 15 Feb 2012 13:46:52 +0000 (13:46 +0000)
committerlmilano <lmilano@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 15 Feb 2012 13:46:52 +0000 (13:46 +0000)
PWGLF/STRANGENESS/AliAnalysisTaskCheckCascadePbPb.cxx
PWGLF/STRANGENESS/AliAnalysisTaskCheckCascadePbPb.h
PWGLF/STRANGENESS/AliAnalysisTaskCheckPerformanceCascadePbPb.cxx
PWGLF/STRANGENESS/AliAnalysisTaskCheckPerformanceCascadePbPb.h

index de1d9c2..d7f1bfd 100644 (file)
 //              Adapted to Cascade : A.Maire Mar2008, antonin.maire@ires.in2p3.fr
 //              Modified :           A.Maire Mar2010 
 //
-//              Adapted to PbPb analysis: M. Nicassio Feb2011, maria.nicassio@ba.infn.it
-//              - Physics selection moved to the run.C macro
-//              - Centrality selection added (+ setters) 
-//              - flag and setters added (CF container usage, vertex range)
-//              - histo added and histo/container binning changed 
-//              - protection in the destructor for CAF usage          
-//              - AliWarning disabled
-//              - number of tracklets from AOD also          
-//              - automatic settings for PID (July 2011) 
-//              - centrality and nTracks variables added to CF containers
+//              Adapted to PbPb analysis: M. Nicassio, maria.nicassio@ba.infn.it
+//               Feb-August2011
+//                - Physics selection moved to the run.C macro
+//                - Centrality selection added (+ setters) and histos
+//                - flag and setters added (CF container usage, vertex range)
+//                - histo added and histo/container binning changed 
+//                - protection in the destructor for CAF usage          
+//                - AliWarning disabled
+//                - number of tracklets from AOD also          
+//                - automatic settings for PID
+//               September2011
+//                - proper time histos/container added (V0 and Cascades)
+//                - cosine PA V0 wrt Xi vertex in the container  
+//               November2011
+//                - re-run V0's and cascade's vertexers (SetCuts instead SetDefaultCuts!!)
+//                - AOD analysis part completed 
 //-----------------------------------------------------------------
 
 class TTree;
@@ -60,8 +66,8 @@ class AliAODv0;
 #include "AliCentrality.h"
 #include "AliESDEvent.h"
 #include "AliAODEvent.h"
-//      #include "AliV0vertexer.h"
-//      #include "AliCascadeVertexer.h"
+#include "AliV0vertexer.h"
+#include "AliCascadeVertexer.h"
 #include "AliESDtrackCuts.h"
 #include "AliPIDResponse.h"
 
@@ -70,12 +76,14 @@ class AliAODv0;
 #include "AliInputEventHandler.h"
 #include "AliAnalysisManager.h"
 #include "AliMCEventHandler.h"
-#include "AliESDInputHandler.h"
+#include "AliESDInputHandler.h" 
+#include "AliAODInputHandler.h"
 #include "AliCFContainer.h"
 #include "AliMultiplicity.h"
 
 #include "AliESDcascade.h"
 #include "AliAODcascade.h"
+#include "AliAODTrack.h"
 
 #include "AliAnalysisTaskCheckCascadePbPb.h"
 
@@ -85,7 +93,7 @@ ClassImp(AliAnalysisTaskCheckCascadePbPb)
 
 //________________________________________________________________________
 AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb() 
-  : AliAnalysisTaskSE(), fAnalysisType("ESD"), fCollidingSystems(0), /*fPaveTextBookKeeping(0),*/
+  : AliAnalysisTaskSE(), fAnalysisType("ESD"), fESDtrackCuts(0),/*fPaveTextBookKeeping(0),*/
     fPIDResponse                (0),
     fkRerunV0CascVertexers      (0),
     fkQualityCutZprimVtxPos     (kTRUE),
@@ -97,7 +105,6 @@ AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb()
     fCentrUpLim                 (0),
     fCentrEstimator             (0),
     fVtxRange                   (0),
-    fUseCFContCascadeCuts       (0),
 
 
        // - Cascade part initialisation
@@ -105,7 +112,6 @@ AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb()
     fHistEvtsInCentralityBinsvsNtracks(0),
     fHistCascadeMultiplicityBeforeEvSel(0),
     fHistCascadeMultiplicityForCentrEvt(0), fHistTrackMultiplicityForCentrEvt(0), fHistTPCrefitTrackMultiplicityForCentrEvt(0),
-    fHistCascadeMultiplicityForTrigEvtAndZprimVtx(0),
     fHistCascadeMultiplicityForSelEvt(0),
     fHistPosBestPrimaryVtxXForSelEvt(0), fHistPosBestPrimaryVtxYForSelEvt(0), fHistPosBestPrimaryVtxZForSelEvt(0),
     fHistTPCrefitTrackMultiplicityForCascadeEvt(0),
@@ -158,9 +164,6 @@ AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb()
     fCFContCascadePIDOmegaMinus(0),
     fCFContCascadePIDOmegaPlus(0),
     fCFContCascadeCuts(0),
-  fAlephParameters(),
-  fV0Sels(),
-  fCascSels(),
     
 //    fHnSpAngularCorrXiMinus(0), fHnSpAngularCorrXiPlus(0), 
 //    fHnSpAngularCorrOmegaMinus(0), fHnSpAngularCorrOmegaPlus(0),
@@ -179,7 +182,7 @@ AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb()
 
 //________________________________________________________________________
 AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb(const char *name) 
-  : AliAnalysisTaskSE(name), fAnalysisType("ESD"), fCollidingSystems(0), /*fPaveTextBookKeeping(0),*/
+  : AliAnalysisTaskSE(name), fAnalysisType("ESD"), fESDtrackCuts(0), /*fPaveTextBookKeeping(0),*/
     fPIDResponse                (0),
     fkRerunV0CascVertexers      (0),
     fkQualityCutZprimVtxPos     (kTRUE),
@@ -191,14 +194,12 @@ AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb(const char *nam
     fCentrUpLim                 (0),
     fCentrEstimator             (0),
     fVtxRange                   (0),
-    fUseCFContCascadeCuts       (0),
      
        // - Cascade part initialisation
     fListHistCascade(0),
     fHistEvtsInCentralityBinsvsNtracks(0),
     fHistCascadeMultiplicityBeforeEvSel(0),
     fHistCascadeMultiplicityForCentrEvt(0), fHistTrackMultiplicityForCentrEvt(0), fHistTPCrefitTrackMultiplicityForCentrEvt(0),
-    fHistCascadeMultiplicityForTrigEvtAndZprimVtx(0),
     fHistCascadeMultiplicityForSelEvt(0),
     fHistPosBestPrimaryVtxXForSelEvt(0), fHistPosBestPrimaryVtxYForSelEvt(0), fHistPosBestPrimaryVtxZForSelEvt(0),
     fHistTPCrefitTrackMultiplicityForCascadeEvt(0),
@@ -250,9 +251,6 @@ AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb(const char *nam
     fCFContCascadePIDOmegaMinus(0),
     fCFContCascadePIDOmegaPlus(0),
     fCFContCascadeCuts(0),
-  fAlephParameters(),
-  fV0Sels(),
-  fCascSels(),
     
 //    fHnSpAngularCorrXiMinus(0), fHnSpAngularCorrXiPlus(0), 
 //    fHnSpAngularCorrOmegaMinus(0), fHnSpAngularCorrOmegaPlus(0),
@@ -269,23 +267,23 @@ AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb(const char *nam
   // Input slot #0 works with a TChain
   // DefineInput(0, TChain::Class());
   // Output slot #1 writes into a TList container (cascade)
-        
+        // default Pb-Pb values
         fV0Sels[0] =  33.  ;  // max allowed chi2
-        fV0Sels[1] =   0.001; // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
-        fV0Sels[2] =   0.001; // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
-        fV0Sels[3] =   0.2 ;  // max allowed DCA between the daughter tracks       (LHC09a4 : 0.5)
-        fV0Sels[4] =   0.0 ;  // min allowed cosine of V0's pointing angle         (LHC09a4 : 0.99)
-        fV0Sels[5] =   0.1 ;  // min radius of the fiducial volume                 (LHC09a4 : 0.2)
-        fV0Sels[6] = 100.  ;  // max radius of the fiducial volume                 (LHC09a4 : 100.0)
+        fV0Sels[1] =   0.1;   // min allowed impact parameter for the 1st daughter 
+        fV0Sels[2] =   0.1;   // min allowed impact parameter for the 2nd daughter 
+        fV0Sels[3] =   1.;    // max allowed DCA between the daughter tracks       
+        fV0Sels[4] =    .998 ;// min allowed cosine of V0's pointing angle         
+        fV0Sels[5] =   0.9 ;  // min radius of the fiducial volume                 
+        fV0Sels[6] = 100.  ;    // max radius of the fiducial volume                 
 
         fCascSels[0] =  33.   ;  // max allowed chi2 (same as PDC07)
-        fCascSels[1] =   0.001;  // min allowed V0 impact parameter                    (PDC07 : 0.05   / LHC09a4 : 0.025 )
-        fCascSels[2] =   0.008;  // "window" around the Lambda mass                    (PDC07 : 0.008  / LHC09a4 : 0.010 )
-        fCascSels[3] =   0.03;  // min allowed bachelor's impact parameter            (PDC07 : 0.035  / LHC09a4 : 0.025 )
-        fCascSels[4] =   0.3  ;  // max allowed DCA between the V0 and the bachelor    (PDC07 : 0.1    / LHC09a4 : 0.2   )
-        fCascSels[5] =   0.9998 ;  // min allowed cosine of the cascade pointing angle   (PDC07 : 0.9985 / LHC09a4 : 0.998 )
-        fCascSels[6] =   0.1  ;  // min radius of the fiducial volume                  (PDC07 : 0.9    / LHC09a4 : 0.2   )
-        fCascSels[7] = 100.   ;  // max radius of the fiducial volume                  (PDC07 : 100    / LHC09a4 : 100   )
+        fCascSels[1] =   0.05;  // min allowed V0 impact parameter                    
+        fCascSels[2] =   0.008;  // "window" around the Lambda mass                    
+        fCascSels[3] =   0.03;   // min allowed bachelor's impact parameter           //check cuts 
+        fCascSels[4] =   0.3  ;  // max allowed DCA between the V0 and the bachelor    
+        fCascSels[5] =   0.999 ;// min allowed cosine of the cascade pointing angle   
+        fCascSels[6] =   0.9  ;  // min radius of the fiducial volume                  
+        fCascSels[7] = 100.   ;  // max radius of the fiducial volume                  
 
   // Output slot #0 writes into a TList container (Cascade)
   DefineOutput(1, TList::Class());
@@ -294,8 +292,7 @@ AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb(const char *nam
 }
 
 
-AliAnalysisTaskCheckCascadePbPb::~AliAnalysisTaskCheckCascadePbPb()
-{
+AliAnalysisTaskCheckCascadePbPb::~AliAnalysisTaskCheckCascadePbPb() {
   //
   // Destructor
   //
@@ -305,14 +302,14 @@ AliAnalysisTaskCheckCascadePbPb::~AliAnalysisTaskCheckCascadePbPb()
   // Because of TList::SetOwner() ...
         
   if (fListHistCascade && !AliAnalysisManager::GetAnalysisManager()->IsProofMode())         { delete fListHistCascade;     fListHistCascade = 0x0;    }
+  if (fESDtrackCuts)         { delete fESDtrackCuts;        fESDtrackCuts = 0x0; }
   //if (fPaveTextBookKeeping)     { delete fPaveTextBookKeeping; fPaveTextBookKeeping = 0x0;} // fPaveTextBookKeeping is not strored in the TList
 }
 
 
 
 //________________________________________________________________________
-void AliAnalysisTaskCheckCascadePbPb::UserCreateOutputObjects()
-{
+void AliAnalysisTaskCheckCascadePbPb::UserCreateOutputObjects() {
   // Create histograms
   // Called once
 
@@ -320,10 +317,38 @@ void AliAnalysisTaskCheckCascadePbPb::UserCreateOutputObjects()
 
  fListHistCascade = new TList();
  fListHistCascade->SetOwner();  // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
+
  // New PID object
-   AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
-   AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
-   fPIDResponse = inputHandler->GetPIDResponse();
+ AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
+ AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
+ fPIDResponse = inputHandler->GetPIDResponse();
+
+ // Only used to get the number of primary reconstructed tracks
+ if (fAnalysisType == "ESD"&& (! fESDtrackCuts )){
+   fESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE); // Std definition of primary (see kTRUE argument) tracks for 2010
+//   fESDtrackCuts->SetEtaRange(-0.8,+0.8);
+//   fESDtrackCuts->SetPtRange(0.15, 1e10);
+   Printf("CheckCascade - ESDtrackCuts set up to 2010 std ITS-TPC cuts...");
+ }
+
+ // Initialize cuts to re-run V0 and cascade vertexers 
+ fV0Sels[0] =  33.   ;     // max allowed chi2
+ fV0Sels[1] =   0.1  ;     // min allowed impact parameter for the 1st daughter 
+ fV0Sels[2] =   0.1  ;     // min allowed impact parameter for the 2nd daughter 
+ fV0Sels[3] =   1.   ;     // max allowed DCA between the daughter tracks       
+ fV0Sels[4] =    .998;     // min allowed cosine of V0's pointing angle         
+ fV0Sels[5] =   0.9  ;     // min radius of the fiducial volume                 
+ fV0Sels[6] = 100.   ;     // max radius of the fiducial volume                 
+
+ fCascSels[0] =  33.    ;  // max allowed chi2 (not used) 
+ fCascSels[1] =   0.05  ;  // min allowed V0 impact parameter                    
+ fCascSels[2] =   0.008 ;  // "window" around the Lambda mass                    
+ fCascSels[3] =   0.05  ;  // min allowed bachelor's impact parameter            
+ fCascSels[4] =   0.3   ;  // max allowed DCA between the V0 and the bachelor    
+ fCascSels[5] =   0.9989;  // min allowed cosine of the cascade pointing angle   
+ fCascSels[6] =   0.9   ;  // min radius of the fiducial volume                  
+ fCascSels[7] = 100.    ; 
+  
 
 /* 
 if( !fPaveTextBookKeeping){
@@ -340,7 +365,7 @@ if( !fPaveTextBookKeeping){
         fPaveTextBookKeeping->AddText( "Task CHECK CASCADE analysis" );
         fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
         fPaveTextBookKeeping->AddText( Form("AnalysisType : %s ", fAnalysisType.Data() ));
-        if(!fCollidingSystems)  fPaveTextBookKeeping->AddText("Colliding system : p-p collisions ");
+        
         else                    fPaveTextBookKeeping->AddText("Colliding system : A-A collisions ");
 
         fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
@@ -395,14 +420,9 @@ if( !fPaveTextBookKeeping){
         fListHistCascade->Add(fHistEvtsInCentralityBinsvsNtracks);
  
 if(! fHistCascadeMultiplicityBeforeEvSel) {
-       if(fCollidingSystems)// AA collisions
-               fHistCascadeMultiplicityBeforeEvSel = new TH1F("fHistCascadeMultiplicityBeforeEvSel", 
+        fHistCascadeMultiplicityBeforeEvSel = new TH1F("fHistCascadeMultiplicityBeforeEvSel", 
                        "Cascades per event (before vertex and centrality selections);Nbr of Cascades/Evt;Events", 
                        100, 0, 200000);                
-       else // pp collisions
-               fHistCascadeMultiplicityBeforeEvSel = new TH1F("fHistCascadeMultiplicityBeforeEvSel", 
-                       "Cascades per event (before vertex and centrality selections);Nbr of Cascades/Evt;Events", 
-                       25, 0, 25);
        fListHistCascade->Add(fHistCascadeMultiplicityBeforeEvSel);
 }
 
@@ -410,73 +430,34 @@ if(! fHistCascadeMultiplicityBeforeEvSel) {
         //--------------
         
 if(! fHistCascadeMultiplicityForCentrEvt) {
-       if(fCollidingSystems)// AA collisions
-               fHistCascadeMultiplicityForCentrEvt = new TH1F("fHistCascadeMultiplicityForCentrEvt", 
+        fHistCascadeMultiplicityForCentrEvt = new TH1F("fHistCascadeMultiplicityForCentrEvt", 
                        "Cascades per event (for triggered evt);Nbr of Cascades/Evt;Events", 
                        100, 0, 200000);                
-       else // pp collisions
-               fHistCascadeMultiplicityForCentrEvt = new TH1F("fHistCascadeMultiplicityForCentrEvt", 
-                       "Cascades per event (for triggered evt);Nbr of Cascades/Evt;Events", 
-                       25, 0, 25);
        fListHistCascade->Add(fHistCascadeMultiplicityForCentrEvt);
 }
 
  
 if(! fHistTrackMultiplicityForCentrEvt) {      
-       if(fCollidingSystems)// AA collisions   
-               fHistTrackMultiplicityForCentrEvt = new TH1F("fHistTrackMultiplicityForCentrEvt", 
+       fHistTrackMultiplicityForCentrEvt = new TH1F("fHistTrackMultiplicityForCentrEvt", 
                        "Track Multiplicity (for triggered evt);Nbr of tracks/Evt;Events", 
                        200, 0, 12000);                 
-       else // pp collisions
-               fHistTrackMultiplicityForCentrEvt = new TH1F("fHistTrackMultiplicityForCentrEvt", 
-                       "Track Multiplicity (for triggered evt);Nbr of tracks/Evt;Events", 
-                       300, 0, 300);
        fListHistCascade->Add(fHistTrackMultiplicityForCentrEvt);
 }
 
 if(! fHistTPCrefitTrackMultiplicityForCentrEvt) {      
-       if(fCollidingSystems)// AA collisions   
-               fHistTPCrefitTrackMultiplicityForCentrEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCentrEvt", 
+       fHistTPCrefitTrackMultiplicityForCentrEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCentrEvt", 
                        "TPCrefit track Multiplicity (for triggered evt);Nbr of TPCrefit tracks/Evt;Events", 
                        200, 0, 12000);                 
-       else // pp collisions
-               fHistTPCrefitTrackMultiplicityForCentrEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCentrEvt", 
-                       "TPCrefit track Multiplicity (for triggered evt);Nbr of TPCrefit tracks/Evt;Events", 
-                       300, 0, 300);
        fListHistCascade->Add(fHistTPCrefitTrackMultiplicityForCentrEvt);
 }
 
-
-
-
-        // - Histos for events passing the trigger selection + |z(prim. vertex)| < XX cm
-        //--------------
-        
-if(! fHistCascadeMultiplicityForTrigEvtAndZprimVtx) {
-        if(fCollidingSystems)// AA collisions
-                fHistCascadeMultiplicityForTrigEvtAndZprimVtx = new TH1F("fHistCascadeMultiplicityForTrigEvtAndZprimVtx", 
-                        "Cascades per event;Nbr of Cascades/Evt;Events", 
-                        100, 0, 200000);           
-        else // pp collisions
-                fHistCascadeMultiplicityForTrigEvtAndZprimVtx = new TH1F("fHistCascadeMultiplicityForTrigEvtAndZprimVtx", 
-                        "Cascades per event;Nbr of Cascades/Evt;Events", 
-                        25, 0, 25);
-        fListHistCascade->Add(fHistCascadeMultiplicityForTrigEvtAndZprimVtx);
-}
-
-
         // - Histos for events passing the event selection at the analysis level
         //--------------
         
 if(! fHistCascadeMultiplicityForSelEvt) {
-       if(fCollidingSystems)// AA collisions
-               fHistCascadeMultiplicityForSelEvt = new TH1F("fHistCascadeMultiplicityForSelEvt", 
+       fHistCascadeMultiplicityForSelEvt = new TH1F("fHistCascadeMultiplicityForSelEvt", 
                        "Cascades per event;Nbr of Cascades/Evt;Events", 
                        100, 0, 200000);                
-       else // pp collisions
-               fHistCascadeMultiplicityForSelEvt = new TH1F("fHistCascadeMultiplicityForSelEvt", 
-                       "Cascades per event;Nbr of Cascades/Evt;Events", 
-                       25, 0, 25);
        fListHistCascade->Add(fHistCascadeMultiplicityForSelEvt);
 }
 
@@ -502,14 +483,9 @@ if(! fHistPosBestPrimaryVtxZForSelEvt ){
         //--------------
         
 if(! fHistTPCrefitTrackMultiplicityForCascadeEvt) {
-       if(fCollidingSystems)// AA collisions   
-               fHistTPCrefitTrackMultiplicityForCascadeEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCascadeEvt", 
+       fHistTPCrefitTrackMultiplicityForCascadeEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCascadeEvt", 
                        "TPCrefit track Multiplicity (for evt with Casc.);Nbr of TPCrefit tracks/Evt with cascade(s);Events", 
                        200, 0, 20000);                 
-       else // pp collisions
-               fHistTPCrefitTrackMultiplicityForCascadeEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCascadeEvt", 
-                       "TPCrefit track Multiplicity (for evt with Casc.);Nbr of TPCrefit tracks/Evt with cascade(s);Events", 
-                       300, 0, 300);
        fListHistCascade->Add(fHistTPCrefitTrackMultiplicityForCascadeEvt);
 }
 
@@ -614,7 +590,7 @@ if(! fHistDcaBachToPrimVertex) {
 }
 
 if(! fHistXiCosineOfPointingAngle) {
-       fHistXiCosineOfPointingAngle = new TH1F("fHistXiCosineOfPointingAngle", "Cosine of Xi Pointing Angle; Cos (Xi Point.Angl);Number of Xis", 200, 0.99, 1.0);
+       fHistXiCosineOfPointingAngle = new TH1F("fHistXiCosineOfPointingAngle", "Cosine of Xi Pointing Angle; Cos (Xi Point.Angl);Number of Xis", 101, 0.99, 1.0001);
        fListHistCascade->Add(fHistXiCosineOfPointingAngle);
 }
 
@@ -639,7 +615,7 @@ if (! fHistV0Chi2Xi) {
 }
 
 if (! fHistDcaV0DaughtersXi) {
-       fHistDcaV0DaughtersXi = new TH1F("fHistDcaV0DaughtersXi", "DCA between V0 daughters, in cascade;DCA (cm);Number of V0s", 120, 0., 0.6);
+       fHistDcaV0DaughtersXi = new TH1F("fHistDcaV0DaughtersXi", "DCA between V0 daughters, in cascade;DCA (cm);Number of V0s", 240, 0., 1.2);
        fListHistCascade->Add(fHistDcaV0DaughtersXi);
 }
 
@@ -649,7 +625,7 @@ if (! fHistDcaV0ToPrimVertexXi) {
 }
 
 if (! fHistV0CosineOfPointingAngleXi) {
-       fHistV0CosineOfPointingAngleXi = new TH1F("fHistV0CosineOfPointingAngleXi", "Cosine of V0 Pointing Angle, in cascade;Cos(V0 Point. Angl); Counts", 200, 0.98, 1.0);
+       fHistV0CosineOfPointingAngleXi = new TH1F("fHistV0CosineOfPointingAngleXi", "Cosine of V0 Pointing Angle, in cascade;Cos(V0 Point. Angl); Counts", 200, 0.95, 1.0001);
        fListHistCascade->Add(fHistV0CosineOfPointingAngleXi);
 }
 
@@ -747,7 +723,7 @@ if(! fHistChargeXi ){
 
 
 if (! fHistV0toXiCosineOfPointingAngle) {
-       fHistV0toXiCosineOfPointingAngle = new TH1F("fHistV0toXiCosineOfPointingAngle", "Cos. of V0 Ptng Angl / Xi vtx ;Cos(V0 Point. Angl / Xi vtx); Counts", 100, 0.99, 1.0);
+       fHistV0toXiCosineOfPointingAngle = new TH1F("fHistV0toXiCosineOfPointingAngle", "Cos. of V0 Ptng Angl / Xi vtx ;Cos(V0 Point. Angl / Xi vtx); Counts", 200, 0.95, 1.0001);
        fListHistCascade->Add(fHistV0toXiCosineOfPointingAngle);
 }
 
@@ -827,38 +803,12 @@ if(! f2dHistXiRadiusVsEffMassOmegaPlus) {
        fListHistCascade->Add(f2dHistXiRadiusVsEffMassOmegaPlus);
 }
 
-//------
-
 if(! f2dHistTPCdEdxOfCascDghters){
         f2dHistTPCdEdxOfCascDghters = new TH2F( "f2dHistTPCdEdxOfCascDghters", "TPC dE/dx of the cascade daughters; charge x || #vec{p}_{TPC inner wall}(Casc. daughter) || (GeV/c); TPC signal (ADC) ", 2000, -10.0, 10.0, 450, 0., 900.);
        fListHistCascade->Add(f2dHistTPCdEdxOfCascDghters);
 }
 
 
-
-// Part 2 : Raw material for yield extraction -------
-/*
-if(! f3dHistXiPtVsEffMassVsYXiMinus) {
-       f3dHistXiPtVsEffMassVsYXiMinus = new TH3F( "f3dHistXiPtVsEffMassVsYXiMinus", "Pt_{cascade} Vs M_{#Xi^{-} candidates} Vs Y_{#Xi}; Pt_{cascade} (GeV/c); M( #Lambda , #pi^{-} ) (GeV/c^{2}) ;Y_{#Xi} ", 100, 0., 10.0, 400, 1.2, 2.0, 44, -1.1,1.1);
-       fListHistCascade->Add(f3dHistXiPtVsEffMassVsYXiMinus);
-}
-
-if(! f3dHistXiPtVsEffMassVsYXiPlus) {
-       f3dHistXiPtVsEffMassVsYXiPlus = new TH3F( "f3dHistXiPtVsEffMassVsYXiPlus", "Pt_{cascade} Vs M_{#Xi^{+} candidates} Vs Y_{#Xi}; Pt_{cascade} (GeV/c); M( #Lambda , #pi^{+} ) (GeV/c^{2}); Y_{#Xi}", 100, 0., 10.0, 400, 1.2, 2.0, 44, -1.1,1.1);
-       fListHistCascade->Add(f3dHistXiPtVsEffMassVsYXiPlus);
-}
-
-if(! f3dHistXiPtVsEffMassVsYOmegaMinus) {
-       f3dHistXiPtVsEffMassVsYOmegaMinus = new TH3F( "f3dHistXiPtVsEffMassVsYOmegaMinus", "Pt_{cascade} Vs M_{#Omega^{-} candidates} Vs Y_{#Omega}; Pt_{cascade} (GeV/c); M( #Lambda , K^{-} ) (GeV/c^{2}); Y_{#Omega}", 100, 0., 10.0, 500, 1.5, 2.5, 44, -1.1,1.1);
-       fListHistCascade->Add(f3dHistXiPtVsEffMassVsYOmegaMinus);
-}
-
-if(! f3dHistXiPtVsEffMassVsYOmegaPlus) {
-       f3dHistXiPtVsEffMassVsYOmegaPlus = new TH3F( "f3dHistXiPtVsEffMassVsYOmegaPlus", "Pt_{cascade} Vs M_{#Omega^{+} candidates} Vs Y_{#Omega}; Pt_{cascade} (GeV/c); M( #Lambda , K^{+} ) (GeV/c^{2}); Y_{#Omega}", 100, 0., 10.0, 500, 1.5, 2.5, 44, -1.1,1.1);
-       fListHistCascade->Add(f3dHistXiPtVsEffMassVsYOmegaPlus);
-}
-*/
-//--
 if(!fCFContCascadePIDXiMinus)  {
   const        Int_t  lNbSteps      =  7 ;
   const Int_t  lNbVariables  =  4 ;
@@ -868,8 +818,7 @@ if(!fCFContCascadePIDXiMinus)  {
   lNbBinsPerVar[0] = 100;
   lNbBinsPerVar[1] = 800;
   lNbBinsPerVar[2] = 22;
-  if(fCollidingSystems) lNbBinsPerVar[3] = 11;
-  else lNbBinsPerVar[3] = 100;
+  lNbBinsPerVar[3] = 11;
  
   
   fCFContCascadePIDXiMinus = new AliCFContainer("fCFContCascadePIDXiMinus","Pt_{cascade} Vs M_{#Xi^{-} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
@@ -878,15 +827,13 @@ if(!fCFContCascadePIDXiMinus)  {
   fCFContCascadePIDXiMinus->SetBinLimits(0,   0.0  ,  10.0 );  // Pt(Cascade)
   fCFContCascadePIDXiMinus->SetBinLimits(1,   1.2  ,   2.0 );  // Xi Effective mass
   fCFContCascadePIDXiMinus->SetBinLimits(2,  -1.1  ,   1.1 );  // Rapidity
-  if (fCollidingSystems){ 
-    Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
-    for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
-    lBinLim3[0] = 0.0;
-    lBinLim3[1] = 5.0;
-    lBinLim3[2] = 10.0;
-    fCFContCascadePIDXiMinus->SetBinLimits(3,  lBinLim3 );       // Centrality
-  } else
-        fCFContCascadePIDXiMinus->SetBinLimits(3, 0.0, 250.0  );     // SPD tracklets Multiplicity
+
+  Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
+  for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
+  lBinLim3[0] = 0.0;
+  lBinLim3[1] = 5.0;
+  lBinLim3[2] = 10.0;
+  fCFContCascadePIDXiMinus->SetBinLimits(3,  lBinLim3 );       // Centrality
   
   // Setting the step title : one per PID case
   fCFContCascadePIDXiMinus->SetStepTitle(0, "No PID");
@@ -901,8 +848,7 @@ if(!fCFContCascadePIDXiMinus)  {
   fCFContCascadePIDXiMinus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
   fCFContCascadePIDXiMinus->SetVarTitle(1, "M( #Lambda , #pi^{-} ) (GeV/c^{2})");
   fCFContCascadePIDXiMinus->SetVarTitle(2, "Y_{#Xi}");
-  if (fCollidingSystems) fCFContCascadePIDXiMinus->SetVarTitle(3, "Centrality");
-  else fCFContCascadePIDXiMinus->SetVarTitle(3, "SPD tracklets Multiplicity");
+  fCFContCascadePIDXiMinus->SetVarTitle(3, "Centrality");
   
   fListHistCascade->Add(fCFContCascadePIDXiMinus);
   
@@ -917,8 +863,7 @@ if (!fCFContCascadePIDXiPlus) {
   lNbBinsPerVar[0] = 100;
   lNbBinsPerVar[1] = 800;
   lNbBinsPerVar[2] = 22;
-  if(fCollidingSystems) lNbBinsPerVar[3] = 11;
-  else lNbBinsPerVar[3] = 100;
+  lNbBinsPerVar[3] = 11;
   
   fCFContCascadePIDXiPlus = new AliCFContainer("fCFContCascadePIDXiPlus","Pt_{cascade} Vs M_{#Xi^{+} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
   
@@ -927,15 +872,12 @@ if (!fCFContCascadePIDXiPlus) {
   fCFContCascadePIDXiPlus->SetBinLimits(0,   0.0  ,  10.0 );   // Pt(Cascade)
   fCFContCascadePIDXiPlus->SetBinLimits(1,   1.2  ,   2.0 );   // Xi Effective mass
   fCFContCascadePIDXiPlus->SetBinLimits(2,  -1.1  ,   1.1 );   // Rapidity
-  if(fCollidingSystems) { 
-    Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
-    for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
-    lBinLim3[0] = 0.0;
-    lBinLim3[1] = 5.0;
-    lBinLim3[2] = 10.0;
-        fCFContCascadePIDXiPlus->SetBinLimits(3,lBinLim3);     // Centrality 
-  } else
-        fCFContCascadePIDXiPlus->SetBinLimits(3, 0.0, 250.0  );     // SPD tracklets Multiplicity
+  Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
+  for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
+  lBinLim3[0] = 0.0;
+  lBinLim3[1] = 5.0;
+  lBinLim3[2] = 10.0;
+  fCFContCascadePIDXiPlus->SetBinLimits(3,lBinLim3);     // Centrality 
   
   // Setting the step title : one per PID case
   fCFContCascadePIDXiPlus->SetStepTitle(0, "No PID");
@@ -950,8 +892,7 @@ if (!fCFContCascadePIDXiPlus) {
   fCFContCascadePIDXiPlus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
   fCFContCascadePIDXiPlus->SetVarTitle(1, "M( #Lambda , #pi^{+} ) (GeV/c^{2})");
   fCFContCascadePIDXiPlus->SetVarTitle(2, "Y_{#Xi}");
-  if(fCollidingSystems) fCFContCascadePIDXiPlus->SetVarTitle(3, "Centrality");
-  else fCFContCascadePIDXiPlus->SetVarTitle(3, "SPD tracklets Multiplicity");
+  fCFContCascadePIDXiPlus->SetVarTitle(3, "Centrality");
   
   fListHistCascade->Add(fCFContCascadePIDXiPlus);
   
@@ -967,8 +908,7 @@ if(!fCFContCascadePIDOmegaMinus)  {
   lNbBinsPerVar[0] = 100;
   lNbBinsPerVar[1] = 1000;
   lNbBinsPerVar[2] = 22;
-  if(fCollidingSystems) lNbBinsPerVar[3] = 11;
-  else lNbBinsPerVar[3] = 100;
+  lNbBinsPerVar[3] = 11;
  
   
   fCFContCascadePIDOmegaMinus = new AliCFContainer("fCFContCascadePIDOmegaMinus","Pt_{cascade} Vs M_{#Omega^{-} candidates} Vs Y_{#Omega}", lNbSteps, lNbVariables, lNbBinsPerVar );
@@ -978,16 +918,12 @@ if(!fCFContCascadePIDOmegaMinus)  {
   fCFContCascadePIDOmegaMinus->SetBinLimits(0,   0.0  ,  10.0 );       // Pt(Cascade)
   fCFContCascadePIDOmegaMinus->SetBinLimits(1,   1.5  ,   2.5 );       // Omega Effective mass
   fCFContCascadePIDOmegaMinus->SetBinLimits(2,  -1.1  ,   1.1 );       // Rapidity
-  if(fCollidingSystems) {
-    Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
-    for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
-    lBinLim3[0] = 0.0;
-    lBinLim3[1] = 5.0;
-    lBinLim3[2] = 10.0;
-        fCFContCascadePIDOmegaMinus->SetBinLimits(3,lBinLim3);     // Centrality
-  } else
-        fCFContCascadePIDOmegaMinus->SetBinLimits(3, 0.0, 250.0  );     // SPD tracklets Multiplicity
-  
+  Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
+  for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
+  lBinLim3[0] = 0.0;
+  lBinLim3[1] = 5.0;
+  lBinLim3[2] = 10.0;
+  fCFContCascadePIDOmegaMinus->SetBinLimits(3,lBinLim3);     // Centrality
   // Setting the step title : one per PID case
   fCFContCascadePIDOmegaMinus->SetStepTitle(0, "No PID");
   fCFContCascadePIDOmegaMinus->SetStepTitle(1, "TPC PID / 4-#sigma cut on Bachelor track");
@@ -1001,8 +937,7 @@ if(!fCFContCascadePIDOmegaMinus)  {
   fCFContCascadePIDOmegaMinus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
   fCFContCascadePIDOmegaMinus->SetVarTitle(1, "M( #Lambda , K^{-} ) (GeV/c^{2})");
   fCFContCascadePIDOmegaMinus->SetVarTitle(2, "Y_{#Omega}");
-  if(fCollidingSystems) fCFContCascadePIDOmegaMinus->SetVarTitle(3, "Centrality"); 
-  else fCFContCascadePIDOmegaMinus->SetVarTitle(3, "SPD tracklets Multiplicity");
+  fCFContCascadePIDOmegaMinus->SetVarTitle(3, "Centrality"); 
   
   fListHistCascade->Add(fCFContCascadePIDOmegaMinus);
   
@@ -1027,15 +962,12 @@ if(!fCFContCascadePIDOmegaPlus)  {
   fCFContCascadePIDOmegaPlus->SetBinLimits(0,   0.0  ,  10.0 );        // Pt(Cascade)
   fCFContCascadePIDOmegaPlus->SetBinLimits(1,   1.5  ,   2.5 );        // Omega Effective mass
   fCFContCascadePIDOmegaPlus->SetBinLimits(2,  -1.1  ,   1.1 );        // Rapidity
-  if(fCollidingSystems) {
-    Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
-    for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
-    lBinLim3[0] = 0.0;
-    lBinLim3[1] = 5.0;
-    lBinLim3[2] = 10.0;      
-        fCFContCascadePIDOmegaPlus->SetBinLimits(3,lBinLim3);    // Centrality
-  } else
-        fCFContCascadePIDOmegaPlus->SetBinLimits(3, 0.0, 250.0  );    // SPD tracklets Multiplicity
+  Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
+  for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
+  lBinLim3[0] = 0.0;
+  lBinLim3[1] = 5.0;
+  lBinLim3[2] = 10.0;      
+  fCFContCascadePIDOmegaPlus->SetBinLimits(3,lBinLim3);    // Centrality
   
   // Setting the step title : one per PID case
   fCFContCascadePIDOmegaPlus->SetStepTitle(0, "No PID");
@@ -1050,8 +982,7 @@ if(!fCFContCascadePIDOmegaPlus)  {
   fCFContCascadePIDOmegaPlus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
   fCFContCascadePIDOmegaPlus->SetVarTitle(1, "M( #Lambda , K^{+} ) (GeV/c^{2})");
   fCFContCascadePIDOmegaPlus->SetVarTitle(2, "Y_{#Omega}");
-  if(fCollidingSystems) fCFContCascadePIDOmegaPlus->SetVarTitle(3, "Centrality");
-  else fCFContCascadePIDOmegaPlus->SetVarTitle(3, "SPD tracklets Multiplicity"); 
+  fCFContCascadePIDOmegaPlus->SetVarTitle(3, "SPD tracklets Multiplicity"); 
   
   fListHistCascade->Add(fCFContCascadePIDOmegaPlus);
   
@@ -1059,24 +990,24 @@ if(!fCFContCascadePIDOmegaPlus)  {
 
 
 // Part 3 : Towards the optimisation of topological selections -------
-if(! fCFContCascadeCuts&&fUseCFContCascadeCuts) {
+if(! fCFContCascadeCuts) {
    
        // Container meant to store all the relevant distributions corresponding to the cut variables.
-        //          - FIXME optimize number of bins
         //          - NB overflow/underflow of variables on which we want to cut later should be 0!!! 
   const        Int_t  lNbSteps      =  4 ;
-  const Int_t  lNbVariables  =  19 ;
+  const Int_t  lNbVariables  =  22 ;
   //array for the number of bins in each dimension :
   Int_t lNbBinsPerVar[lNbVariables] = {0};
   lNbBinsPerVar[0]  = 100;
   lNbBinsPerVar[1]  = 126;
-  lNbBinsPerVar[2]  = 100;
-  lNbBinsPerVar[3]  = 221;
+  lNbBinsPerVar[2]  = 24;
+  lNbBinsPerVar[3]  = 220;
   lNbBinsPerVar[4]  = 30;
   lNbBinsPerVar[5]  = 50;
   
-  lNbBinsPerVar[6]  = 100;
-  lNbBinsPerVar[7]  = 43;
+  lNbBinsPerVar[6]  = 101;
+
+  lNbBinsPerVar[7]  = 102;
   lNbBinsPerVar[8]  = 101;
   lNbBinsPerVar[9]  = 26;
   lNbBinsPerVar[10] = 26;
@@ -1091,10 +1022,12 @@ if(! fCFContCascadeCuts&&fUseCFContCascadeCuts) {
   
   lNbBinsPerVar[16] = 20;
  
-  if(fCollidingSystems) lNbBinsPerVar[17] = 11;
-  else lNbBinsPerVar[17] = 100;
+  lNbBinsPerVar[17] = 11;
   lNbBinsPerVar[18] = 100; 
-    
+  lNbBinsPerVar[19] = 112; // Proper time of cascade
+  lNbBinsPerVar[20] = 112; // Proper time of V0
+  lNbBinsPerVar[21] = 112; // Distance V0-Xi in transverse plane
+
   fCFContCascadeCuts = new AliCFContainer("fCFContCascadeCuts","Container for Cascade cuts", lNbSteps, lNbVariables, lNbBinsPerVar );
   
   
@@ -1104,36 +1037,33 @@ if(! fCFContCascadeCuts&&fUseCFContCascadeCuts) {
   fCFContCascadeCuts->SetBinLimits(0, 0., 2.);                 // DcaXiDaughters : 0.0 to 2.0
   //1
   Double_t *lBinLim1  = new Double_t[ lNbBinsPerVar[1]+1 ];
-  for(Int_t i=0; i< lNbBinsPerVar[1];i++)   lBinLim1[i]  = (Double_t)0.0   + (5.  - 0.0 )/(lNbBinsPerVar[1]-1)  * (Double_t)i ;
+  lBinLim1[0] = 0.0; 
+  lBinLim1[1] = 0.03;
+  for(Int_t i=2; i< lNbBinsPerVar[1];i++)   lBinLim1[i]  = (Double_t)0.03   + (5.  - 0.03 )/(lNbBinsPerVar[1]-2)  * (Double_t)(i-1) ;
   lBinLim1[ lNbBinsPerVar[1]  ] = 100.0;
   fCFContCascadeCuts -> SetBinLimits(1,  lBinLim1 );            
   delete [] lBinLim1;                                          // DcaBachToPrimVertexXi : 0.0 to 0.5    
   //2 
-  fCFContCascadeCuts->SetBinLimits(2, .99, 1.);                // XiCosineOfPointingAngle : 0.99 to 1.0        
+  fCFContCascadeCuts->SetBinLimits(2, .9988, 1.);              // XiCosineOfPointingAngle : 0.99 to 1.0        
   //3
-  Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
-  for(Int_t i=0; i< lNbBinsPerVar[3];i++)   lBinLim3[i] = (Double_t)0.0 + (5.  - 0.0 )/(lNbBinsPerVar[3]-1) * (Double_t)i ;
-  lBinLim3[ lNbBinsPerVar[3]  ] = 110.0;
-  fCFContCascadeCuts -> SetBinLimits(3,  lBinLim3 );           // XiRadius : 0.0 to 4.0
-  delete [] lBinLim3;                                          // XiRadius : 0.0 to 5.0         
+  fCFContCascadeCuts -> SetBinLimits(3, 0., 110.);             // XiRadius : 0.0 to 110.0
   //4
   fCFContCascadeCuts->SetBinLimits(4, 1.1, 1.13 );             // InvMassLambdaAsCascDghter
   //5
   fCFContCascadeCuts->SetBinLimits(5, 0., 2.);                 // DcaV0DaughtersXi : 0.0 to 2.0        
   //6 
-  fCFContCascadeCuts->SetBinLimits(6, .99, 1.);                // V0CosineOfPointingAngleXi : 0.99 to 1.0      
+  fCFContCascadeCuts->SetBinLimits(6, .95, 1.0005);            // V0CosineOfPointingAngleXi : 0.99 to 1.0      
   //7
   Double_t *lBinLim7  = new Double_t[ lNbBinsPerVar[7]+1 ];
-  for(Int_t i=0; i< lNbBinsPerVar[7]-2;i++)   lBinLim7[i]  = (Double_t)0.0   + (20.  - 0.0 )/(lNbBinsPerVar[7]-3)  * (Double_t)i ;
-  lBinLim7[ lNbBinsPerVar[7]-2] = 100.0;
+  for(Int_t i=0; i< lNbBinsPerVar[7]-1;i++)   lBinLim7[i]  = (Double_t)0.0   + (100.  - 0.0 )/(lNbBinsPerVar[7]-2)  * (Double_t)i ;
   lBinLim7[ lNbBinsPerVar[7]-1] = 200.0;
   lBinLim7[ lNbBinsPerVar[7]] = 1000.0; 
   fCFContCascadeCuts -> SetBinLimits(7,  lBinLim7 );           
-  delete [] lBinLim7;                                          // V0RadiusXi : 0.0 to 20.0     
+  delete [] lBinLim7;                                          // V0RadiusXi : 0.0 to 100.0    
   //8
   Double_t *lBinLim8  = new Double_t[ lNbBinsPerVar[8]+1 ];
-        for(Int_t i=0; i< lNbBinsPerVar[8];i++)   lBinLim8[i]  = (Double_t)0.0   + (0.4  - 0.0 )/(lNbBinsPerVar[8]-1)  * (Double_t)i ;
-        lBinLim8[ lNbBinsPerVar[8]  ] = 100.0;
+  for(Int_t i=0; i< lNbBinsPerVar[8];i++)   lBinLim8[i]  = (Double_t)0.0   + (0.4  - 0.0 )/(lNbBinsPerVar[8]-1)  * (Double_t)i ;
+  lBinLim8[ lNbBinsPerVar[8]  ] = 100.0;
   fCFContCascadeCuts -> SetBinLimits(8,  lBinLim8 );        
   delete [] lBinLim8;                                          // DcaV0ToPrimVertexXi : 0.0 to 0.4     
   //9
@@ -1147,7 +1077,7 @@ if(! fCFContCascadeCuts&&fUseCFContCascadeCuts) {
   for(Int_t i=0; i< lNbBinsPerVar[10];i++)   lBinLim10[i]  = (Double_t)0.0   + (0.25  - 0.0 )/(lNbBinsPerVar[10]-1)  * (Double_t)i ;
   lBinLim10[ lNbBinsPerVar[10]  ] = 100.0;
   fCFContCascadeCuts -> SetBinLimits(10,  lBinLim10 );            
-  delete [] lBinLim10;                                         // DcaPosToPrimVertexXi : 0.0 to 0.25   
+  delete [] lBinLim10;                                         // DcaNegToPrimVertexXi : 0.0 to 0.25   
   //11
   fCFContCascadeCuts->SetBinLimits(11, 1.25, 1.40);            // InvMassXi
   fCFContCascadeCuts->SetBinLimits(12, 1.62, 1.74);            // InvMassOmega
@@ -1155,20 +1085,24 @@ if(! fCFContCascadeCuts&&fUseCFContCascadeCuts) {
   fCFContCascadeCuts->SetBinLimits(14, -1.1, 1.1);             // Y(Xi)
   fCFContCascadeCuts->SetBinLimits(15, -1.1, 1.1);             // Y(Omega)
   fCFContCascadeCuts->SetBinLimits(16, -10.0, 10.0);           // BestPrimaryVtxPosZ
-  if (fCollidingSystems) { 
-    Double_t *lBinLim17  = new Double_t[ lNbBinsPerVar[17]+1 ];
-    for(Int_t i=3; i< lNbBinsPerVar[17]+1;i++)   lBinLim17[i]  = (Double_t)(i-1)*10.;
-    lBinLim17[0] = 0.0;
-    lBinLim17[1] = 5.0; 
-    lBinLim17[2] = 10.0;
-    fCFContCascadeCuts -> SetBinLimits(17,  lBinLim17 );       // Centrality
-    delete [] lBinLim17;
-    fCFContCascadeCuts->SetBinLimits(18, 0.0, 6000.0);        // ESD track multiplicity 
-  } else {
-    fCFContCascadeCuts->SetBinLimits(17, 0.0, 250.0);          // SPDTrackletsMultiplicity
-    fCFContCascadeCuts->SetBinLimits(18, 0.0, 200.0);          // ESD track multiplicity
-  }
-  
+  Double_t *lBinLim17  = new Double_t[ lNbBinsPerVar[17]+1 ];
+  for(Int_t i=3; i< lNbBinsPerVar[17]+1;i++)   lBinLim17[i]  = (Double_t)(i-1)*10.;
+  lBinLim17[0] = 0.0;
+  lBinLim17[1] = 5.0; 
+  lBinLim17[2] = 10.0;
+  fCFContCascadeCuts -> SetBinLimits(17,  lBinLim17 );         // Centrality
+  delete [] lBinLim17;
+  fCFContCascadeCuts->SetBinLimits(18, 0.0, 6000.0);           // ESD track multiplicity 
+
+  Double_t *lBinLim19  = new Double_t[ lNbBinsPerVar[19]+1 ];
+  for(Int_t i=0; i< lNbBinsPerVar[19];i++)   lBinLim19[i]  = (Double_t)-1.   + (110.  + 1.0 )/(lNbBinsPerVar[19]-1)  * (Double_t)i ;
+  lBinLim19[ lNbBinsPerVar[19]  ] = 2000.0;
+  fCFContCascadeCuts->SetBinLimits(19, lBinLim19);             // Proper time cascade
+
+  fCFContCascadeCuts->SetBinLimits(20, lBinLim19);             // Proper time V0
+
+  fCFContCascadeCuts->SetBinLimits(21, lBinLim19);             // Distance V0-Xi in tansverse plane
+  delete [] lBinLim19;
   // Setting the number of steps : one for each cascade species (Xi-, Xi+ and Omega-, Omega+)
   fCFContCascadeCuts->SetStepTitle(0, "#Xi^{-} candidates");
   fCFContCascadeCuts->SetStepTitle(1, "#bar{#Xi}^{+} candidates");
@@ -1176,7 +1110,6 @@ if(! fCFContCascadeCuts&&fUseCFContCascadeCuts) {
   fCFContCascadeCuts->SetStepTitle(3, "#bar{#Omega}^{+} candidates");
   
   // Setting the variable title, per axis
-  // fCFContCascadeCuts->SetVarTitle(40,  "Chi2Xi");
   fCFContCascadeCuts->SetVarTitle(0,  "Dca(XiDaughters) (cm)");
   fCFContCascadeCuts->SetVarTitle(1,  "Dca(Bach/PrimVertex) (cm)");
   fCFContCascadeCuts->SetVarTitle(2,  "cos(Xi pointing angle)");
@@ -1200,10 +1133,13 @@ if(! fCFContCascadeCuts&&fUseCFContCascadeCuts) {
   
   fCFContCascadeCuts->SetVarTitle(16, "Z-position(BestPrimVtx) (cm)");
   
-  if (fCollidingSystems) fCFContCascadeCuts->SetVarTitle(17, "Centrality");
-  else fCFContCascadeCuts->SetVarTitle(17, "SPD tracklets Multiplicity");
+  fCFContCascadeCuts->SetVarTitle(17, "Centrality");
 
   fCFContCascadeCuts->SetVarTitle(18, "ESD track multiplicity");
+
+  fCFContCascadeCuts->SetVarTitle(19, "Proper time cascade");
+  fCFContCascadeCuts->SetVarTitle(20, "Proper time V0");
+  fCFContCascadeCuts->SetVarTitle(21, "Distance V0-Xi in transverse plane");
   
   fListHistCascade->Add(fCFContCascadeCuts);
 }
@@ -1225,89 +1161,6 @@ if(! fCFContCascadeCuts&&fUseCFContCascadeCuts) {
   fHistDcaV0ToPrimVertexXivsInvMass = new TH2F("fHistDcaV0ToPrimVertexXivsInvMass", "DCA of V0 to Prim. Vertex, in cascade;DCA (cm);Number of Cascades", 200, 0., 1.,400,1.2,2.0);
         fListHistCascade->Add(fHistDcaV0ToPrimVertexXivsInvMass);
 
-
-
-// Part 4 : Angular correlation study -------
-/*
-if(! fHnSpAngularCorrXiMinus){
-       // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
-       // Delta Phi  = 360 bins de -180., 180.
-       // Delta Eta  = 120 bins de -3.0, 3.0
-       // Pt Cascade = 100 bins de 0., 10.0,
-       // Pt track = 150 bins de 0., 15.0
-       
-   Int_t    bins[5] = { 360, 120, 100, 150, 40};
-   Double_t xmin[5] = {-50., -3.,  0.,  0., 1.30};
-   Double_t xmax[5] = { 310., 3., 10., 15., 1.34};
-   fHnSpAngularCorrXiMinus = new THnSparseF("fHnSpAngularCorrXiMinus", "Angular Correlation for #Xi^{-}:", 5, bins, xmin, xmax);
-       fHnSpAngularCorrXiMinus->GetAxis(0)->SetTitle(" #Delta#phi(Casc,Track) (deg)");
-       fHnSpAngularCorrXiMinus->GetAxis(1)->SetTitle(" #Delta#eta(Casc,Track)");
-       fHnSpAngularCorrXiMinus->GetAxis(2)->SetTitle(" Pt_{Casc} (GeV/c)");
-       fHnSpAngularCorrXiMinus->GetAxis(3)->SetTitle(" Pt_{any track} (GeV/c)");
-       fHnSpAngularCorrXiMinus->GetAxis(4)->SetTitle(" Eff. Inv Mass (GeV/c^{2})");
-       fHnSpAngularCorrXiMinus->Sumw2();
-   fListHistCascade->Add(fHnSpAngularCorrXiMinus);
-}
-
-if(! fHnSpAngularCorrXiPlus){
-       // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
-       // Delta Phi  = 360 bins de -180., 180.
-       // Delta Eta  = 120 bins de -3.0, 3.0
-       // Pt Cascade = 100 bins de 0., 10.0,
-       // Pt track = 150 bins de 0., 15.0
-   Int_t    bins[5] = { 360, 120, 100, 150, 40};
-   Double_t xmin[5] = {-50., -3.,  0.,  0., 1.30};
-   Double_t xmax[5] = { 310., 3., 10., 15., 1.34};
-   fHnSpAngularCorrXiPlus = new THnSparseF("fHnSpAngularCorrXiPlus", "Angular Correlation for #Xi^{+}:", 5, bins, xmin, xmax);
-       fHnSpAngularCorrXiPlus->GetAxis(0)->SetTitle(" #Delta#phi(Casc,Track) (deg)");
-       fHnSpAngularCorrXiPlus->GetAxis(1)->SetTitle(" #Delta#eta(Casc,Track)");
-       fHnSpAngularCorrXiPlus->GetAxis(2)->SetTitle(" Pt_{Casc} (GeV/c)");
-       fHnSpAngularCorrXiPlus->GetAxis(3)->SetTitle(" Pt_{any track} (GeV/c)");
-       fHnSpAngularCorrXiPlus->GetAxis(4)->SetTitle(" Eff. Inv Mass (GeV/c^{2})");
-       fHnSpAngularCorrXiPlus->Sumw2();
-   fListHistCascade->Add(fHnSpAngularCorrXiPlus);
-}
-
-if(! fHnSpAngularCorrOmegaMinus){
-       // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
-       // Delta Phi  = 360 bins de -180., 180.
-       // Delta Eta  = 120 bins de -3.0, 3.0
-       // Pt Cascade = 100 bins de 0., 10.0,
-       // Pt track = 150 bins de 0., 15.0
-       
-   Int_t    bins[5] = { 360, 120, 100, 150, 40};
-   Double_t xmin[5] = {-50., -3.,  0.,  0., 1.65};
-   Double_t xmax[5] = { 310., 3., 10., 15., 1.69};
-   fHnSpAngularCorrOmegaMinus = new THnSparseF("fHnSpAngularCorrOmegaMinus", "Angular Correlation for #Omega^{-}:", 5, bins, xmin, xmax);
-       fHnSpAngularCorrOmegaMinus->GetAxis(0)->SetTitle(" #Delta#phi(Casc,Track) (deg)");
-       fHnSpAngularCorrOmegaMinus->GetAxis(1)->SetTitle(" #Delta#eta(Casc,Track)");
-       fHnSpAngularCorrOmegaMinus->GetAxis(2)->SetTitle(" Pt_{Casc} (GeV/c)");
-       fHnSpAngularCorrOmegaMinus->GetAxis(3)->SetTitle(" Pt_{any track} (GeV/c)");
-       fHnSpAngularCorrOmegaMinus->GetAxis(4)->SetTitle(" Eff. Inv Mass (GeV/c^{2})");
-       fHnSpAngularCorrOmegaMinus->Sumw2();
-   fListHistCascade->Add(fHnSpAngularCorrOmegaMinus);
-}
-
-if(! fHnSpAngularCorrOmegaPlus){
-       // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
-       // Delta Phi  = 360 bins de -180., 180.
-       // Delta Eta  = 120 bins de -3.0, 3.0
-       // Pt Cascade = 100 bins de 0., 10.0,
-       // Pt track = 150 bins de 0., 15.0
-   Int_t    bins[5] = { 360, 120, 100, 150, 40};
-   Double_t xmin[5] = {-50., -3.,  0.,  0., 1.65};
-   Double_t xmax[5] = { 310., 3., 10., 15., 1.69};
-   fHnSpAngularCorrOmegaPlus = new THnSparseF("fHnSpAngularCorrOmegaPlus", "Angular Correlation for #Omega^{+}:", 5, bins, xmin, xmax);
-       fHnSpAngularCorrOmegaPlus->GetAxis(0)->SetTitle(" #Delta#phi(Casc,Track) (deg)");
-       fHnSpAngularCorrOmegaPlus->GetAxis(1)->SetTitle(" #Delta#eta(Casc,Track)");
-       fHnSpAngularCorrOmegaPlus->GetAxis(2)->SetTitle(" Pt_{Casc} (GeV/c)");
-       fHnSpAngularCorrOmegaPlus->GetAxis(3)->SetTitle(" Pt_{any track} (GeV/c)");
-       fHnSpAngularCorrOmegaPlus->GetAxis(4)->SetTitle(" Eff. Inv Mass (GeV/c^{2})");
-       fHnSpAngularCorrOmegaPlus->Sumw2();
-   fListHistCascade->Add(fHnSpAngularCorrOmegaPlus);
-}
-*/
-
 PostData(1, fListHistCascade);
 /* PostData(2, fPaveTextBookKeeping);*/
 }// end UserCreateOutputObjects
@@ -1320,15 +1173,31 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
 
   AliESDEvent *lESDevent = 0x0;
   AliAODEvent *lAODevent = 0x0;
+
+  if(!fPIDResponse) {
+     AliError("Cannot get pid response");
+     return;
+  }
+
+
   Int_t    ncascades                      = -1;
   Int_t    nTrackMultiplicity             = -1;
   Int_t    nTrackWithTPCrefitMultiplicity =  0;
+  // Primary tracks from ESD/AOD
+  Float_t lPrimaryTrackMultiplicity = -1.;
+
 
   Short_t  lStatusTrackingPrimVtx         = -2;
   Double_t lTrkgPrimaryVtxPos[3]          = {-100.0, -100.0, -100.0};
   Double_t lBestPrimaryVtxPos[3]          = {-100.0, -100.0, -100.0};
   Double_t lMagneticField                 = -10.;
 
+  AliCentrality* centrality;
+  AliESDVZERO* esdV0;
+  AliAODVZERO* aodV0;
+  Float_t multV0A = 0.;
+  Float_t multV0C = 0.;
+
   // Connect to the InputEvent 
   // After these lines, we should have an ESD/AOD event + the number of cascades in it.
                
@@ -1339,69 +1208,75 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       return;
     }
         
-    fHistCascadeMultiplicityBeforeEvSel->Fill ( lESDevent->GetNumberOfCascades() );  
-        
     //-------------------------------------------------
 
-    // 0 - Trigger managment
+    // 0 - Trigger management
     // NOTE : Check the availability of the proper trigger  --> MN Physics selection moved to runProof  macro
 
     //-------------------------------------------------
 
     // 1 - Cascade vertexer (ESD)
+    if (fkRerunV0CascVertexers) { // Relaunch V0 and Cascade vertexers
+
+      lESDevent->ResetCascades();
+      lESDevent->ResetV0s();
+                
+      AliV0vertexer *lV0vtxer = new AliV0vertexer();
+      AliCascadeVertexer *lCascVtxer = new AliCascadeVertexer();
+
+        //lV0vtxer->GetCuts(fV0Sels);
+        //lCascVtxer->GetCuts(fCascSels);
+
+      lV0vtxer->SetCuts(fV0Sels);      // NB don't use SetDefaultCuts!! because it acts on static variables 
+      lCascVtxer->SetCuts(fCascSels);
         
-    if (fkRerunV0CascVertexers) { // FIXME : relaunch V0 and Cascade vertexers
-//      if (fAnalysisType == "ESD" ) {
-//        lESDevent->ResetCascades();
-//        lESDevent->ResetV0s();
-//                 
-//        AliV0vertexer lV0vtxer;
-//        AliCascadeVertexer lCascVtxer;
-//                 
-//        lV0vtxer.SetDefaultCuts(fV0Sels);
-//        lCascVtxer.SetDefaultCuts(fCascSels);
-//                 
-//        lV0vtxer.Tracks2V0vertices(lESDevent);
-//        lCascVtxer.V0sTracks2CascadeVertices(lESDevent);
-//      }
+         
+      lV0vtxer->Tracks2V0vertices(lESDevent);
+      lCascVtxer->V0sTracks2CascadeVertices(lESDevent);
+
+      delete lV0vtxer;
+      delete lCascVtxer;
     }// end if(RelaunchV0CascVertexers)
         
     //-------------------------------------------------
     ncascades                      = lESDevent->GetNumberOfCascades();
     nTrackWithTPCrefitMultiplicity = DoESDTrackWithTPCrefitMultiplicity(lESDevent);  
+    centrality = lESDevent->GetCentrality();
+    esdV0 = lESDevent->GetVZEROData();
+    multV0A=esdV0->GetMTotV0A();
+    multV0C=esdV0->GetMTotV0C();
 
-  }//if (fAnalysisType == "ESD")
-  // MN: variable for centrality selection
-  AliESDVZERO* esdV0 = lESDevent->GetVZEROData();
-  Float_t multV0A=esdV0->GetMTotV0A();
-  Float_t multV0C=esdV0->GetMTotV0C();
+  } else if (fAnalysisType == "AOD") {
+    lAODevent = dynamic_cast<AliAODEvent*>( InputEvent() );
+    if (!lAODevent) {
+      AliWarning("ERROR: lAODevent not available \n");
+      return;
+    }
+    ncascades                      = lAODevent->GetNumberOfCascades();
+    nTrackWithTPCrefitMultiplicity = -1;
+    centrality = lAODevent->GetCentrality();
+    aodV0 = lAODevent->GetVZEROData();
+    multV0A=aodV0->GetMTotV0A();
+    multV0C=aodV0->GetMTotV0C();
 
-  AliCentrality *centrality = lESDevent->GetCentrality();
+  } else {
+
+    Printf("Analysis type (ESD or AOD) not specified \n");
+    return;
+
+  }
+
+  fHistCascadeMultiplicityBeforeEvSel->Fill (ncascades);
   //  Printf("Centrality percentile V0M for this event %f)\n",  centrality->GetCentralityPercentile("V0M"));
-/*  if (!(centrality->IsEventInCentralityClass(fCentrLowLim,fCentrUpLim,fCentrEstimator.Data()))) {
-    PostData(1, fListHistCascade);
-    return; 
-  }*/
   Float_t lcentrality = centrality->GetCentralityPercentile(fCentrEstimator.Data());
-  if (lcentrality==-1||lcentrality>=90.) {
+  if (lcentrality<fCentrLowLim||lcentrality>=fCentrUpLim) { 
     PostData(1, fListHistCascade);
     return;
   }
 
   fV0Ampl->Fill(multV0A+multV0C);
   
-  if (fAnalysisType == "AOD") {  
-    lAODevent = dynamic_cast<AliAODEvent*>( InputEvent() ); 
-    if (!lAODevent) {
-      AliWarning("ERROR: lAODevent not available \n");
-      return;
-    }
-    ncascades                      = lAODevent->GetNumberOfCascades();
-    nTrackWithTPCrefitMultiplicity = -1;
-        
-  }
-
   // For AOD or ESD ...
   nTrackMultiplicity = (InputEvent())->GetNumberOfTracks();
 
@@ -1431,17 +1306,6 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
     lPrimaryBestESDVtx->GetXYZ( lBestPrimaryVtxPos );
     lStatusTrackingPrimVtx  = lPrimaryTrackingESDVtx->GetStatus();
 
-    // FIXME : quality cut on the z-position of the prim vertex.
-    if (fkQualityCutZprimVtxPos) {
-      if (TMath::Abs(lBestPrimaryVtxPos[2]) > fVtxRange ) { 
-        AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !"); 
-        PostData(1, fListHistCascade); 
-        return; 
-      }
-    }
-        
-    fHistCascadeMultiplicityForTrigEvtAndZprimVtx->Fill( ncascades  );
-        
     // FIXME : remove TPC-only primary vertex : retain only events with tracking + SPD vertex
     if (fkQualityCutNoTPConlyPrimVtx) {
       const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
@@ -1462,23 +1326,42 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
         
     lMagneticField = lESDevent->GetMagneticField( );
     // FIXME if(TMath::Abs(lMagneticField ) < 10e-6) continue;
-        
+    lPrimaryTrackMultiplicity = fESDtrackCuts->CountAcceptedTracks(lESDevent);    
   }// end if(ESD)
         
   if (fAnalysisType == "AOD") {
-    // To be developed
-    const AliAODVertex *lPrimaryBestAODVtx = lAODevent->GetPrimaryVertex();    
-    // get the best primary vertex available for the event
-    // We may keep the one which is the best one available = GetVertex(0)
-    // Pb with pile-up to expect
+
+    const AliAODVertex *lPrimaryBestAODVtx = lAODevent->GetPrimaryVertex();
+    if (!lPrimaryBestAODVtx){
+        AliWarning("No prim. vertex in AOD... return!");
+        PostData(1, fListHistCascade);
+        return;
+    }
+       
+    // get the best primary vertex available for the event GetVertex(0)
     // This one will be used for next calculations (DCA essentially)
     lPrimaryBestAODVtx->GetXYZ( lBestPrimaryVtxPos );
         
     lStatusTrackingPrimVtx  = -1;
     lTrkgPrimaryVtxPos[0]   = -100.0;
     lTrkgPrimaryVtxPos[1]   = -100.0;
-    lTrkgPrimaryVtxPos[2]   = -100.0;
-    lMagneticField = 0.;
+    lTrkgPrimaryVtxPos[2]   = -100.0;   
+    lMagneticField = lAODevent->GetMagneticField();  
+
+    lPrimaryTrackMultiplicity = 0;
+    for (Int_t itrack = 0; itrack<nTrackMultiplicity; itrack++) {
+      AliAODTrack* track = lAODevent->GetTrack(itrack); 
+      if (track->TestFilterBit(AliAODTrack::kTrkGlobal)) lPrimaryTrackMultiplicity++;
+    }
+  }
+
+  // Quality cut on the z-position of the prim vertex.
+  if (fkQualityCutZprimVtxPos) {
+    if (TMath::Abs(lBestPrimaryVtxPos[2]) > fVtxRange ) {
+      AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
+      PostData(1, fListHistCascade);
+      return;
+    }
   }
 
        // - I.Step 2 : Filling histos that characterize the selected event : x,y,z prim. Vtx distrib. (ESD)
@@ -1491,14 +1374,9 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
   
   // ---------------------------------------------------------------
 
+  fHistEvtsInCentralityBinsvsNtracks->Fill(lcentrality,lPrimaryTrackMultiplicity);
   
-  AliESDtrackCuts *trackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE); // Std definition of primary (see kTRUE argument) tracks for 2010
-  //trackCuts->SetEtaRange(-0.8,+0.8);
-  //trackCuts->SetPtRange(0.15, 1e10);
-
-  Float_t lESDtrackMultiplicity = trackCuts->CountAcceptedTracks(lESDevent);
 
-  fHistEvtsInCentralityBinsvsNtracks->Fill(lcentrality,lESDtrackMultiplicity);
 
   // II - Calculation Part dedicated to Xi vertices
   
@@ -1522,9 +1400,9 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
     Double_t lXiRadius = -1000. ;
         
         // - 2nd part of initialisation : Nbr of clusters within TPC for the 3 daughter cascade tracks
-    Int_t    lPosTPCClusters    = -1; // For ESD only ...//FIXME : wait for availability in AOD
-    Int_t    lNegTPCClusters    = -1; // For ESD only ...
-    Int_t    lBachTPCClusters   = -1; // For ESD only ...
+    UShort_t    lPosTPCClusters    = -1; // For ESD only ...
+    UShort_t    lNegTPCClusters    = -1; // For ESD only ...
+    UShort_t    lBachTPCClusters   = -1; // For ESD only ...
         
     Double_t lInnerWallMomCascDghters[3] = {-100., -100., -100.};
     Double_t lTPCSignalCascDghters   [3] = {-100., -100., -100.};
@@ -1564,17 +1442,22 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
     Bool_t   lIsBachelorKaon       = kFALSE;
     Bool_t   lIsBachelorPion       = kFALSE; 
        
-    Bool_t   lIsBachelorKaonForTPC = kFALSE; // For ESD only ...//FIXME : wait for availability in AOD
-    Bool_t   lIsBachelorPionForTPC = kFALSE; // For ESD only ...
-    Bool_t   lIsNegPionForTPC      = kFALSE; // For ESD only ...
-    Bool_t   lIsPosPionForTPC      = kFALSE; // For ESD only ...
-    Bool_t   lIsNegProtonForTPC    = kFALSE; // For ESD only ...
-    Bool_t   lIsPosProtonForTPC    = kFALSE; // For ESD only ...
+    Bool_t   lIsBachelorKaonForTPC = kFALSE; 
+    Bool_t   lIsBachelorPionForTPC = kFALSE; 
+    Bool_t   lIsNegPionForTPC      = kFALSE; 
+    Bool_t   lIsPosPionForTPC      = kFALSE; 
+    Bool_t   lIsNegProtonForTPC    = kFALSE; 
+    Bool_t   lIsPosProtonForTPC    = kFALSE; 
 
        // - 6th part of initialisation : extra info for QA
     Double_t lXiMomX       = 0., lXiMomY = 0., lXiMomZ = 0.;
     Double_t lXiTransvMom  = 0. ;
     Double_t lXiTotMom     = 0. ;
+    
+    Double_t lV0PMomX       = 0., lV0PMomY = 0., lV0PMomZ = 0.;
+    Double_t lV0NMomX       = 0., lV0NMomY = 0., lV0NMomZ = 0.;
+    Double_t lV0TotMom     = 0. ;
+
                
     Double_t lBachMomX       = 0., lBachMomY  = 0., lBachMomZ   = 0.;
     Double_t lBachTransvMom  = 0.;
@@ -1589,11 +1472,6 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
        // - 7th part of initialisation : variables for the AliCFContainer dedicated to cascade cut optmisiation
     Int_t    lSPDTrackletsMultiplicity = -1;
   
-       // - 8th part of initialisation : variables needed for Angular correlations
-    TVector3 lTVect3MomXi(0.,0.,0.);
-    Int_t    lArrTrackID[3] = {-1, -1, -1};
-
-         
     if (fAnalysisType == "ESD") { 
   
     // -------------------------------------
@@ -1659,7 +1537,6 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
         continue;
       }
         
-        
       lPosTPCClusters   = pTrackXi->GetTPCNcls();
       lNegTPCClusters   = nTrackXi->GetTPCNcls();
       lBachTPCClusters  = bachTrackXi->GetTPCNcls();
@@ -1678,7 +1555,7 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
                 // 2 - Poor quality related to TPC clusters
         if (lPosTPCClusters  < 80) { AliWarning("Pb / V0 Pos. track has less than 80 TPC clusters ... continue!"); continue; }
         if (lNegTPCClusters  < 80) { AliWarning("Pb / V0 Neg. track has less than 80 TPC clusters ... continue!"); continue; }
-        if(lBachTPCClusters < 80) { AliWarning("Pb / Bach.   track has less than 80 TPC clusters ... continue!"); continue; }
+        if (lBachTPCClusters < 80) { AliWarning("Pb / Bach.   track has less than 80 TPC clusters ... continue!"); continue; }
       }
         
       const AliExternalTrackParam *pExtTrack    = pTrackXi    ->GetInnerParam();
@@ -1704,10 +1581,11 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       lDcaV0DaughtersXi                = xi->GetDcaV0Daughters(); 
       lV0Chi2Xi                        = xi->GetChi2V0();
        
-      lV0CosineOfPointingAngleXi       = xi->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
-                                                                         lBestPrimaryVtxPos[1],
-                                                                         lBestPrimaryVtxPos[2] );
-
+      lV0CosineOfPointingAngleXi       = xi->GetV0CosineOfPointingAngle(lBestPrimaryVtxPos[0],
+                                                                         lBestPrimaryVtxPos[1],
+                                                                         lBestPrimaryVtxPos[2] );
+      //if (lV0CosineOfPointingAngleXi==1.) cout << "Cosine V0 PA wrt Xi pos ==1!" <<endl;
       lDcaV0ToPrimVertexXi             = xi->GetD( lBestPrimaryVtxPos[0], 
                                                    lBestPrimaryVtxPos[1], 
                                                    lBestPrimaryVtxPos[2] );
@@ -1730,14 +1608,14 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
                
                // - II.Step 3' : extra-selection for cascade candidates
       if (fkExtraSelections) {
-       // if(lChi2Xi > 2000) continue; // in AliCascadeVertexer   
-       // if(lV0Chi2Xi > 2000) continue; // in AliV0vertexer
+        // if(lChi2Xi > 2000) continue; // in AliCascadeVertexer   
+        // if(lV0Chi2Xi > 2000) continue; // in AliV0vertexer
                
         if (lDcaXiDaughters > 0.3) continue; // in AliCascadeVertexer 
         if (lXiCosineOfPointingAngle < 0.999 ) continue; // in AliCascadeVertexer
         if (lDcaV0ToPrimVertexXi < 0.05) continue; // in AliCascadeVertexer
         if (lDcaBachToPrimVertexXi < 0.03) continue; // in AliCascadeVertexer
-////      if (TMath::Abs(lInvMassLambdaAsCascDghter-1.11568) > 0.006 ) continue;  // in AliCascadeVertexer 
+        // if (TMath::Abs(lInvMassLambdaAsCascDghter-1.11568) > 0.006 ) continue;  // in AliCascadeVertexer 
 
         if (lDcaV0DaughtersXi > 1.) continue; // in AliV0vertexer 
         if (lV0CosineOfPointingAngleXi < 0.998) continue; // in AliV0vertexer
@@ -1745,10 +1623,10 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
         if (lDcaNegToPrimVertexXi < 0.1) continue; // in AliV0vertexer
 
 
-         if(lXiRadius < .9) continue; // in AliCascadeVertexer
-//       if(lXiRadius > 100) continue; // in AliCascadeVertexer
-         if(lV0RadiusXi < 0.9) continue; // in AliV0vertexer  
-//       if(lV0RadiusXi > 100) continue; // in AliV0vertexer
+       if(lXiRadius < .9) continue; // in AliCascadeVertexer
+        // if(lXiRadius > 100) continue; // in AliCascadeVertexer
+       if(lV0RadiusXi < 0.9) continue; // in AliV0vertexer  
+        // if(lV0RadiusXi > 100) continue; // in AliV0vertexer
 
       }
        
@@ -1793,123 +1671,11 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
         lV0quality = 0.;
         xi->ChangeMassHypothesis(lV0quality , -3312);  // Back to "default" hyp.
       }// end if positive bachelor
-       
-       
-       
+
                // - II.Step 5 : PID on the daughter tracks
                //-------------
-       
-       // A - Combined PID
-       // Reasonable guess for the priors for the cascade track sample (e-, mu, pi, K, p)
-      Double_t lPriorsGuessXi[5]    = {0, 0, 2, 0, 1};
-      Double_t lPriorsGuessOmega[5] = {0, 0, 1, 1, 1};
-       
-       // Combined VO-positive-daughter PID
-      AliPID pPidXi;           pPidXi.SetPriors(    lPriorsGuessXi    );
-      AliPID pPidOmega;        pPidOmega.SetPriors( lPriorsGuessOmega );
-               
-      if ( pTrackXi->IsOn(AliESDtrack::kESDpid) ) {  // Combined PID exists
-        Double_t r[10] = {0.}; pTrackXi->GetESDpid(r);
-        pPidXi.SetProbabilities(r);
-        pPidOmega.SetProbabilities(r);
-               
-               // Check if the V0 positive track is a proton (case for Xi-)
-        Double_t pproton = pPidXi.GetProbability(AliPID::kProton);
-        if (pproton > pPidXi.GetProbability(AliPID::kElectron) &&
-            pproton > pPidXi.GetProbability(AliPID::kMuon)     &&
-            pproton > pPidXi.GetProbability(AliPID::kPion)     &&
-            pproton > pPidXi.GetProbability(AliPID::kKaon)     )     lIsPosInXiProton = kTRUE;
-               
-               // Check if the V0 positive track is a pi+ (case for Xi+)
-        Double_t ppion = pPidXi.GetProbability(AliPID::kPion);
-       if (ppion > pPidXi.GetProbability(AliPID::kElectron) &&
-           ppion > pPidXi.GetProbability(AliPID::kMuon)     &&
-           ppion > pPidXi.GetProbability(AliPID::kKaon)     &&
-           ppion > pPidXi.GetProbability(AliPID::kProton)   )     lIsPosInXiPion = kTRUE;
-               
-               
-               // Check if the V0 positive track is a proton (case for Omega-)
-       pproton = 0.;
-       pproton = pPidOmega.GetProbability(AliPID::kProton);
-       if (pproton > pPidOmega.GetProbability(AliPID::kElectron) &&
-           pproton > pPidOmega.GetProbability(AliPID::kMuon)     &&
-           pproton > pPidOmega.GetProbability(AliPID::kPion)     &&
-           pproton > pPidOmega.GetProbability(AliPID::kKaon)     )  lIsPosInOmegaProton = kTRUE;
-               
-               // Check if the V0 positive track is a pi+ (case for Omega+)
-       ppion = 0.;
-       ppion = pPidOmega.GetProbability(AliPID::kPion);
-       if (ppion > pPidOmega.GetProbability(AliPID::kElectron) &&
-           ppion > pPidOmega.GetProbability(AliPID::kMuon)     &&
-           ppion > pPidOmega.GetProbability(AliPID::kKaon)     &&
-           ppion > pPidOmega.GetProbability(AliPID::kProton)   )    lIsPosInOmegaPion = kTRUE;
-               
-      }// end if V0 positive track with existing combined PID  
-       
-       
-       // Combined VO-negative-daughter PID
-      AliPID nPidXi;           nPidXi.SetPriors(    lPriorsGuessXi    );
-      AliPID nPidOmega;        nPidOmega.SetPriors( lPriorsGuessOmega );
-               
-      if ( nTrackXi->IsOn(AliESDtrack::kESDpid) ) {  // Combined PID exists
-        Double_t r[10] = {0.}; nTrackXi->GetESDpid(r);
-        nPidXi.SetProbabilities(r);
-        nPidOmega.SetProbabilities(r);
-               
-               // Check if the V0 negative track is a pi- (case for Xi-)
-        Double_t ppion = nPidXi.GetProbability(AliPID::kPion);
-        if (ppion > nPidXi.GetProbability(AliPID::kElectron) &&
-            ppion > nPidXi.GetProbability(AliPID::kMuon)     &&
-            ppion > nPidXi.GetProbability(AliPID::kKaon)     &&
-            ppion > nPidXi.GetProbability(AliPID::kProton)   )     lIsNegInXiPion = kTRUE;
-
-               // Check if the V0 negative track is an anti-proton (case for Xi+)
-        Double_t pproton = nPidXi.GetProbability(AliPID::kProton);
-       if (pproton > nPidXi.GetProbability(AliPID::kElectron) &&
-           pproton > nPidXi.GetProbability(AliPID::kMuon)     &&
-           pproton > nPidXi.GetProbability(AliPID::kPion)     &&
-           pproton > nPidXi.GetProbability(AliPID::kKaon)     )     lIsNegInXiProton = kTRUE;
-               
-               // Check if the V0 negative track is a pi- (case for Omega-)
-       ppion = 0.;
-       ppion = nPidOmega.GetProbability(AliPID::kPion);
-       if (ppion > nPidOmega.GetProbability(AliPID::kElectron) &&
-           ppion > nPidOmega.GetProbability(AliPID::kMuon)     &&
-           ppion > nPidOmega.GetProbability(AliPID::kKaon)     &&
-           ppion > nPidOmega.GetProbability(AliPID::kProton)   )    lIsNegInOmegaPion = kTRUE;
-               
-               // Check if the V0 negative track is an anti-proton (case for Omega+)
-       pproton = 0.;
-       pproton = nPidOmega.GetProbability(AliPID::kProton);
-       if (pproton > nPidOmega.GetProbability(AliPID::kElectron) &&
-           pproton > nPidOmega.GetProbability(AliPID::kMuon)     &&
-           pproton > nPidOmega.GetProbability(AliPID::kPion)     &&
-           pproton > nPidOmega.GetProbability(AliPID::kKaon)     )  lIsNegInOmegaProton = kTRUE;
-      }// end if V0 negative track with existing combined PID  
-       
-               
-       // Combined bachelor PID
-      AliPID bachPidXi;        bachPidXi.SetPriors(    lPriorsGuessXi    );
-      AliPID bachPidOmega;     bachPidOmega.SetPriors( lPriorsGuessOmega );
-       
-      if ( bachTrackXi->IsOn(AliESDtrack::kESDpid) ) {  // Combined PID exists
-        Double_t r[10] = {0.}; bachTrackXi->GetESDpid(r);
-        bachPidXi.SetProbabilities(r);
-        bachPidOmega.SetProbabilities(r);
-               // Check if the bachelor track is a pion
-        Double_t ppion = bachPidXi.GetProbability(AliPID::kPion);
-        if (ppion > bachPidXi.GetProbability(AliPID::kElectron) &&
-          ppion > bachPidXi.GetProbability(AliPID::kMuon)     &&
-          ppion > bachPidXi.GetProbability(AliPID::kKaon)     &&
-          ppion > bachPidXi.GetProbability(AliPID::kProton)   )     lIsBachelorPion = kTRUE;
-               // Check if the bachelor track is a kaon
-        Double_t pkaon = bachPidOmega.GetProbability(AliPID::kKaon);
-       if (pkaon > bachPidOmega.GetProbability(AliPID::kElectron) &&
-           pkaon > bachPidOmega.GetProbability(AliPID::kMuon)     &&
-           pkaon > bachPidOmega.GetProbability(AliPID::kPion)     &&
-           pkaon > bachPidOmega.GetProbability(AliPID::kProton)   )  lIsBachelorKaon = kTRUE;  
-      }// end if bachelor track with existing combined PID
-       
+/*     
+       // A - Combined PID */ // removed, add when will be used
        
        // B - TPC PID : 3-sigma bands on Bethe-Bloch curve
        
@@ -1959,6 +1725,10 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
       lXiTransvMom     = TMath::Sqrt( lXiMomX*lXiMomX   + lXiMomY*lXiMomY );
       lXiTotMom        = TMath::Sqrt( lXiMomX*lXiMomX   + lXiMomY*lXiMomY   + lXiMomZ*lXiMomZ );
+
+      xi->GetNPxPyPz(lV0NMomX,lV0NMomY,lV0NMomZ);
+      xi->GetPPxPyPz(lV0PMomX,lV0PMomY,lV0PMomZ);
+      lV0TotMom = TMath::Sqrt(TMath::Power(lV0NMomX+lV0PMomX,2)+TMath::Power(lV0NMomY+lV0PMomY,2)+TMath::Power(lV0NMomZ+lV0PMomZ,2));
                
       xi->GetBPxPyPz(  lBachMomX,  lBachMomY,  lBachMomZ );
       lBachTransvMom  = TMath::Sqrt( lBachMomX*lBachMomX   + lBachMomY*lBachMomY );
@@ -2012,38 +1782,26 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
                // II.Step 7 - Complementary info for monitoring the cascade cut variables
        
       const AliMultiplicity *lAliMult = lESDevent->GetMultiplicity();
-      if(fAnalysisType == "ESD") lSPDTrackletsMultiplicity      = lAliMult->GetNumberOfTracklets();
-      else if(fAnalysisType == "AOD") lSPDTrackletsMultiplicity = lAODevent->GetTracklets()->GetNumberOfTracklets();
-               // II.Step 8 - Azimuthal correlation study
-               //-------------
-       
-      lTVect3MomXi.SetXYZ( lXiMomX, lXiMomY, lXiMomZ );
-      lArrTrackID[0] = pTrackXi   ->GetID();
-      lArrTrackID[1] = nTrackXi   ->GetID();
-      lArrTrackID[2] = bachTrackXi->GetID();
-       
-       
+      lSPDTrackletsMultiplicity      = lAliMult->GetNumberOfTracklets();
+      
     }// end of ESD treatment
   
  
     if (fAnalysisType == "AOD") {
-       
-       // -------------------------------------
-       // II.AOD - Calcultaion Part dedicated to Xi vertices (ESD)
-       
+
+      lSPDTrackletsMultiplicity = lAODevent->GetTracklets()->GetNumberOfTracklets();   
+
+      // II.AOD - Calculation Part dedicated to Xi vertices 
+       
       const AliAODcascade *xi = lAODevent->GetCascade(iXi);
       if (!xi) continue;
                
-       // Just to know which file is currently open : locate the file containing Xi
-       // cout << "Name of the file containing Xi candidate(s) :" <<  fesdH->GetTree()->GetCurrentFile()->GetName() << endl;
-       
-       
                // - II.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (AOD)
                //-------------
        
 
       lTrkgPrimaryVtxRadius3D = -500. ;
-      // FIXME : We don't have the different prim. vertex at the AOD level -> nothing to do.
+      // We don't have the different prim. vertex at the AOD level -> nothing to do.
 
       lBestPrimaryVtxRadius3D = TMath::Sqrt(  lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
                                               lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
@@ -2053,12 +1811,12 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
                // - II.Step 2 : Assigning the necessary variables for specific AliAODcascade data members (AOD)        
                //-------------
        
-      lEffMassXi                       = xi->MassXi(); // default working hypothesis : cascade = Xi- decay
+      lEffMassXi               = xi->MassXi(); // default working hypothesis : cascade = Xi- decay
       lChi2Xi                  = xi->Chi2Xi();
-      lDcaXiDaughters                  = xi->DcaXiDaughters();
+      lDcaXiDaughters          = xi->DcaXiDaughters();
       lXiCosineOfPointingAngle         = xi->CosPointingAngleXi( lBestPrimaryVtxPos[0], 
-                                                                 lBestPrimaryVtxPos[1], 
-                                                                 lBestPrimaryVtxPos[2] );
+                                                         lBestPrimaryVtxPos[1], 
+                                                         lBestPrimaryVtxPos[2] );
                                        // Take care : 
                                        // the best available vertex should be used (like in AliCascadeVertexer)
 
@@ -2067,6 +1825,50 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       lPosXi[2] = xi->DecayVertexXiZ();
       lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0]  +  lPosXi[1]*lPosXi[1] );
                
+      AliAODTrack *pTrackXi    = dynamic_cast<AliAODTrack*>( xi->GetDaughter(0) );
+      AliAODTrack *nTrackXi    = dynamic_cast<AliAODTrack*>( xi->GetDaughter(1) );
+      AliAODTrack *bachTrackXi = dynamic_cast<AliAODTrack*>( xi->GetDecayVertexXi()->GetDaughter(0) );
+      if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
+        AliWarning("ERROR: Could not retrieve one of the 3 AOD daughter tracks of the cascade ...");
+        continue;
+      }
+
+      UInt_t lIdxPosXi  = (UInt_t) TMath::Abs( pTrackXi->GetID() );  
+      UInt_t lIdxNegXi  = (UInt_t) TMath::Abs( nTrackXi->GetID() );
+      UInt_t lBachIdx   = (UInt_t) TMath::Abs( bachTrackXi->GetID() );
+
+                // Care track label can be negative in MC production (linked with the track quality)
+                // However = normally, not the case for track index ...
+
+                // FIXME : rejection of a double use of a daughter track (nothing but just a crosscheck of what is done in the cascade vertexer)
+      if (lBachIdx == lIdxNegXi) {
+        AliWarning("Pb / Idx(Bach. track) = Idx(Neg. track) ... continue!"); continue;
+      }
+      if (lBachIdx == lIdxPosXi) {
+        AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
+      }
+
+      lPosTPCClusters   = pTrackXi->GetTPCNcls(); // FIXME: Is this ok? or something like in LambdaK0PbPb task AOD?
+      lNegTPCClusters   = nTrackXi->GetTPCNcls();
+      lBachTPCClusters  = bachTrackXi->GetTPCNcls();
+
+                // Rejection of a poor quality tracks
+      if (fkQualityCutTPCrefit) {
+                // 1 - Poor quality related to TPCrefit
+        if (!(pTrackXi->IsOn(AliAODTrack::kTPCrefit))) { AliWarning("Pb / V0 Pos. track has no TPCrefit ... continue!"); continue; }
+        if (!(nTrackXi->IsOn(AliAODTrack::kTPCrefit))) { AliWarning("Pb / V0 Neg. track has no TPCrefit ... continue!"); continue; }
+        if (!(bachTrackXi->IsOn(AliAODTrack::kTPCrefit))) { AliWarning("Pb / Bach.   track has no TPCrefit ... continue!"); continue; }
+      }
+      if (fkQualityCut80TPCcls) {
+                // 2 - Poor quality related to TPC clusters
+        if (lPosTPCClusters  < 80) { //AliWarning("Pb / V0 Pos. track has less than 80 TPC clusters ... continue!");
+          continue; }
+        if (lNegTPCClusters  < 80) { //AliWarning("Pb / V0 Neg. track has less than 80 TPC clusters ... continue!");
+          continue; }
+        if (lBachTPCClusters < 80) { //AliWarning("Pb / Bach.   track has less than 80 TPC clusters ... continue!");
+          continue; }
+      }
+
 
                // - II.Step 3 : around the tracks : Bach + V0 (AOD)
                // ~ Necessary variables for AODcascade data members coming from the AODv0 part (inheritance)
@@ -2082,7 +1884,6 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       lDcaV0DaughtersXi                = xi->DcaV0Daughters(); 
       lV0Chi2Xi                        = xi->Chi2V0();
 
-      lV0CosineOfPointingAngleXi       = xi->CosPointingAngle( lBestPrimaryVtxPos );
       lDcaV0ToPrimVertexXi             = xi->DcaV0ToPrimVertex();
        
       lDcaBachToPrimVertexXi           = xi->DcaBachToPrimVertex(); 
@@ -2093,6 +1894,8 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       lPosV0Xi[2] = xi->DecayVertexV0Z(); 
       lV0RadiusXi      = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0]  +  lPosV0Xi[1]*lPosV0Xi[1] );
 
+      lV0CosineOfPointingAngleXi        = xi->CosPointingAngle( lBestPrimaryVtxPos ); 
+
       lDcaPosToPrimVertexXi            = xi->DcaPosToPrimVertex(); 
       lDcaNegToPrimVertexXi            = xi->DcaNegToPrimVertex(); 
 
@@ -2105,42 +1908,27 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       if ( lChargeXi < 0 )             lInvMassOmegaMinus      = xi->MassOmega();
       if ( lChargeXi > 0 )             lInvMassOmegaPlus       = xi->MassOmega();
 
-       
-               // - II.Step 5 : PID on the daughters (To be developed ...)
+
+               // - II.Step 5 : PID on the daughters 
                //-------------
        
        // Combined PID
        
-       /* 
-       // Reasonable guess for the priors for the cascade track sample
-       Double_t lPriorsGuessXi[5]    = {0.0, 0.0, 2, 0, 1};
-       Double_t lPriorsGuessOmega[5] = {0.0, 0.0, 1, 1, 1};
-       AliPID bachPidXi;       bachPidXi.SetPriors(    lPriorsGuessXi    );
-       AliPID bachPidOmega;    bachPidOmega.SetPriors( lPriorsGuessOmega );
        
-       const AliAODTrack *bachTrackXi = lAODevent->GetTrack( xi->GetBachID() ); // FIXME : GetBachID not implemented ?
-       
-     if( bachTrackXi->IsOn(AliESDtrack::kESDpid) ){  // Combined PID exists, the AOD flags = a copy of the ESD ones
-               Double_t r[10]; bachTrackXi->GetPID(r);
-               bachPidXi.SetProbabilities(r);
-               bachPidOmega.SetProbabilities(r);
-               // Check if the bachelor track is a pion
-               Double_t ppion = bachPidXi.GetProbability(AliPID::kPion);
-               if (ppion > bachPidXi.GetProbability(AliPID::kElectron) &&
-                   ppion > bachPidXi.GetProbability(AliPID::kMuon)     &&
-                   ppion > bachPidXi.GetProbability(AliPID::kKaon)     &&
-                   ppion > bachPidXi.GetProbability(AliPID::kProton)   )     lIsBachelorPion = kTRUE;
-               // Check if the bachelor track is a kaon
-               Double_t pkaon = bachPidOmega.GetProbability(AliPID::kKaon);
-               if (pkaon > bachPidOmega.GetProbability(AliPID::kElectron) &&
-                   pkaon > bachPidOmega.GetProbability(AliPID::kMuon)     &&
-                   pkaon > bachPidOmega.GetProbability(AliPID::kPion)     &&
-                   pkaon > bachPidOmega.GetProbability(AliPID::kProton)   )  lIsBachelorKaon = kTRUE;
-               
-      }// end if bachelor track with existing combined PID
-      */
-       
-       // TPC PID
+       // TPC PID: 4-sigma bands on Bethe-Bloch curve
+
+        // Bachelor
+      if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 4) lIsBachelorKaonForTPC = kTRUE;
+      if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( bachTrackXi,AliPID::kPion)) < 4) lIsBachelorPionForTPC = kTRUE;
+
+        // Negative V0 daughter
+      if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( nTrackXi,AliPID::kPion   )) < 4) lIsNegPionForTPC   = kTRUE;
+      if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( nTrackXi,AliPID::kProton )) < 4) lIsNegProtonForTPC = kTRUE;
+
+        // Positive V0 daughter
+      if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( pTrackXi,AliPID::kPion   )) < 4) lIsPosPionForTPC   = kTRUE;
+      if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 4) lIsPosProtonForTPC = kTRUE;
+
        
                // - II.Step 6 : extra info for QA (AOD)
                // miscellaneous pieces onf info that may help regarding data quality assessment.
@@ -2150,7 +1938,12 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       lXiMomZ = xi->MomXiZ();
       lXiTransvMom     = TMath::Sqrt( lXiMomX*lXiMomX   + lXiMomY*lXiMomY );
       lXiTotMom        = TMath::Sqrt( lXiMomX*lXiMomX   + lXiMomY*lXiMomY   + lXiMomZ*lXiMomZ );
-       
+
+      Double_t lV0MomX = xi->MomV0X();
+      Double_t lV0MomY = xi->MomV0Y();
+      Double_t lV0MomZ = xi->MomV0Z();
+      lV0TotMom = TMath::Sqrt(TMath::Power(lV0MomX,2)+TMath::Power(lV0MomY,2)+TMath::Power(lV0MomZ,2));
+
       lBachMomX = xi->MomBachX();
       lBachMomY = xi->MomBachY();
       lBachMomZ = xi->MomBachZ();              
@@ -2162,51 +1955,77 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
 
       lRapXi    = xi->RapXi();
       lRapOmega = xi->RapOmega();
-      lEta      = xi->Eta();                           // Will not work ! need a method Pz(), Py() Px() 
-      lTheta    = xi->Theta() *180.0/TMath::Pi();     // in AODcascade.
-      lPhi      = xi->Phi()   *180.0/TMath::Pi();     // Here, we will get eta, theta, phi for the V0 ...
+      lEta      = xi->Eta();                           // Will not work ! need a method Pz(), Py() Px() 
+      lTheta    = xi->Theta() *180.0/TMath::Pi();       // in AODcascade.
+      lPhi      = xi->Phi()   *180.0/TMath::Pi();       // Here, we will get eta, theta, phi for the V0 ...
       lAlphaXi  = xi->AlphaXi();
       lPtArmXi  = xi->PtArmXi();
 
                // II.Step 7 - Complementary info for monitoring the cascade cut variables
-       //FIXME : missing for AOD : TPCCluster
-       
-               // II.Step 8 - Azimuthal correlation study
-               //-------------
-       
-      lTVect3MomXi.SetXYZ( lXiMomX, lXiMomY, lXiMomZ );
-       
-      AliAODTrack *pTrackXi    = dynamic_cast<AliAODTrack*>( xi->GetDaughter(0) );
-      AliAODTrack *nTrackXi    = dynamic_cast<AliAODTrack*>( xi->GetDaughter(1) );
-      AliAODTrack *bachTrackXi = dynamic_cast<AliAODTrack*>( xi->GetDecayVertexXi()->GetDaughter(0) ); 
-      if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
-       AliWarning("ERROR: Could not retrieve one of the 3 AOD daughter tracks of the cascade ...");
-       continue;
-      }
-               
-      lArrTrackID[0] = pTrackXi   ->GetID();
-      lArrTrackID[1] = nTrackXi   ->GetID();
-      lArrTrackID[2] = bachTrackXi->GetID();
+       // TPC clusters
        
     }// end of AOD treatment
 
 
+    // Calculate proper time for cascade
+
+    Double_t cascadeMass = 0.;
+
+    if ( ( (lChargeXi<0) && lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) ||
+         ( (lChargeXi>0) && lIsBachelorPionForTPC && lIsNegProtonForTPC && lIsPosPionForTPC )  ) cascadeMass = 1.321;
+
+    if ( ( (lChargeXi<0) && lIsBachelorKaonForTPC   && lIsPosProtonForTPC    && lIsNegPionForTPC ) ||
+         ( (lChargeXi>0) && lIsBachelorKaonForTPC   && lIsNegProtonForTPC    && lIsPosPionForTPC )  ) cascadeMass = 1.672;
+
+    Double_t lctau =  TMath::Sqrt(TMath::Power((lPosXi[0]-lBestPrimaryVtxPos[0]),2)+TMath::Power((lPosXi[1]-lBestPrimaryVtxPos[1]),2)+TMath::Power(( lPosXi[2]-lBestPrimaryVtxPos[2]),2));
+    if (lXiTotMom!=0)         lctau = lctau*cascadeMass/lXiTotMom;
+    else lctau = -1.;
+
+
+    // Calculate proper time for Lambda (reconstructed)
+     Float_t lambdaMass = 1.115683; // PDG mass
+     Float_t distV0Xi =  TMath::Sqrt(TMath::Power((lPosV0Xi[0]-lPosXi[0]),2)+TMath::Power((lPosV0Xi[1]-lPosXi[1]),2)+TMath::Power((lPosV0Xi[2]-lPosXi[2]),2));
+     Float_t lctauV0 = -1.;
+     if (lV0TotMom!=0) lctauV0 = distV0Xi*lambdaMass/lV0TotMom;
+
+     Float_t distTV0Xi =  TMath::Sqrt(TMath::Power((lPosV0Xi[0]-lPosXi[0]),2)+TMath::Power((lPosV0Xi[1]-lPosXi[1]),2));
+
+
     // -------------------------------------
     // II.Fill - Filling the TH1,2,3Fs, HnSparses, CFContainers, FOR events with CASCADES !
-        
-        // if( lIsBachelorKaonForTPC )
+    // For AliEVE      
+/*         if(lChargeXi < 0&& lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) {
+            if (lXiTransvMom>2.&&lXiTransvMom<4.&&(lInvMassXiMinus<1.322&&lInvMassXiMinus>1.320)&&(lXiRadius<8.&&lXiRadius>3.)) {
         //                 // FIXME : Just to know which file is currently open : locate the file containing Xi
-        // cout << "Name of the file containing Omega candidate(s) :" 
-        //         << CurrentFileName() 
-        //         << " / entry: "     << Entry()
-        //         << " / in file: "   << lESDevent->GetEventNumberInFile()   // <- Cvetan / From Mihaela: AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetReadEntry();
-        //         << " : mass(Omega+) = " << lInvMassOmegaPlus 
-        //         << " : mass(Omega-) = " << lInvMassOmegaMinus
-        //         << " / charge = "   << lChargeXi
-        //         << " / pt(Casc) = " << lXiTransvMom
-        //         << " / Decay 2d R(Xi) = " << lXiRadius 
-        //         << endl;
-  
+         cout << "Name of the file containing Xi candidate(s) :" 
+                 << CurrentFileName() 
+                 << " / entry: "     << Entry()
+                 << " / in file: "   << lESDevent->GetEventNumberInFile()   // <- Cvetan / From Mihaela: AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetReadEntry();
+                 << " AliESDcascade number " << iXi 
+                 << " : mass(Xi-) = " << lInvMassXiMinus
+                 << " / charge = "   << lChargeXi
+                 << " / pt(Casc) = " << lXiTransvMom
+                 << " / Decay 2d R(Xi) = " << lXiRadius 
+                 << endl;
+          }
+         }
+         if(lChargeXi < 0&& lIsBachelorKaonForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) {
+           if (lXiTransvMom>2&&lXiTransvMom<4&&(lInvMassOmegaMinus<1.674&&lInvMassOmegaMinus>1.670)&&(lXiRadius<8.&&lXiRadius>3.)) {
+         cout << "Name of the file containing Omega candidate(s) :"
+                 << CurrentFileName()
+                 << " / entry: "     << Entry()
+                 << " / in file: "   << lESDevent->GetEventNumberInFile()   // <- Cvetan / From Mihaela: AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetReadEntry();
+                 << " AliESDcascade number " << iXi 
+                 << " : mass(Omega-) = " << lInvMassOmegaMinus
+                 << " / charge = "   << lChargeXi
+                 << " / pt(Casc) = " << lXiTransvMom
+                 << " / Decay 2d R(Xi) = " << lXiRadius
+                 << endl;
+
+           }
+         }
+*/
+          
 
        // - II.Fill.Step 1      : primary vertex
   
@@ -2344,8 +2163,7 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       lContainerPIDVars[0] = lXiTransvMom       ;
       lContainerPIDVars[1] = lInvMassXiMinus    ;
       lContainerPIDVars[2] = lRapXi             ;
-      if (fCollidingSystems) lContainerPIDVars[3] = lcentrality;
-      else lContainerPIDVars[3] = lSPDTrackletsMultiplicity;
+      lContainerPIDVars[3] = lcentrality;
                        
                // No PID
       fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 0); // No PID
@@ -2383,8 +2201,7 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       lContainerPIDVars[0] = lXiTransvMom       ;
       lContainerPIDVars[1] = lInvMassXiPlus     ;
       lContainerPIDVars[2] = lRapXi             ;
-      if (fCollidingSystems) lContainerPIDVars[3] = lcentrality;
-      else lContainerPIDVars[3] = lSPDTrackletsMultiplicity;
+      lContainerPIDVars[3] = lcentrality;
                        
                // No PID
       fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 0); // No PID
@@ -2422,8 +2239,7 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       lContainerPIDVars[0] = lXiTransvMom       ;
       lContainerPIDVars[1] = lInvMassOmegaMinus ;
       lContainerPIDVars[2] = lRapOmega          ;
-      if (fCollidingSystems) lContainerPIDVars[3] = lcentrality;
-      else lContainerPIDVars[3] = lSPDTrackletsMultiplicity;
+      lContainerPIDVars[3] = lcentrality;
                
                // No PID
       fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 0); // No PID
@@ -2461,8 +2277,7 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
       lContainerPIDVars[0] = lXiTransvMom       ;
       lContainerPIDVars[1] = lInvMassOmegaPlus ;
       lContainerPIDVars[2] = lRapOmega          ;
-      if (fCollidingSystems) lContainerPIDVars[3] = lcentrality;
-      else lContainerPIDVars[3] = lSPDTrackletsMultiplicity;
+      lContainerPIDVars[3] = lcentrality;
                        
                // No PID
       fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 0); // No PID
@@ -2495,8 +2310,7 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
        
                
         // II.Fill.Step 7 : filling the AliCFContainer (optimisation of topological selections)
-     if (fUseCFContCascadeCuts) { 
-       Double_t lContainerCutVars[19] = {0.0};
+       Double_t lContainerCutVars[22] = {0.0};
                         
        lContainerCutVars[0]  = lDcaXiDaughters;
        lContainerCutVars[1]  = lDcaBachToPrimVertexXi;
@@ -2504,7 +2318,7 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
        lContainerCutVars[3]  = lXiRadius;
        lContainerCutVars[4]  = lInvMassLambdaAsCascDghter;
        lContainerCutVars[5]  = lDcaV0DaughtersXi;
-       lContainerCutVars[6]  = lV0CosineOfPointingAngleXi;
+       lContainerCutVars[6]  = lV0toXiCosineOfPointingAngle;
        lContainerCutVars[7]  = lV0RadiusXi;
        lContainerCutVars[8]  = lDcaV0ToPrimVertexXi;   
        lContainerCutVars[9]  = lDcaPosToPrimVertexXi;
@@ -2513,11 +2327,14 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
        lContainerCutVars[13] = lXiTransvMom;
         
        lContainerCutVars[16] = lBestPrimaryVtxPos[2];
-       if (fCollidingSystems) lContainerCutVars[17] = lcentrality;  
-       else lContainerCutVars[17] = lSPDTrackletsMultiplicity;
-       lContainerCutVars[18] = lESDtrackMultiplicity;       
-//       lContainerCutVars[19] = lBachTPCClusters;                // FIXME : BachTPCClusters          is not available for AOD ... = -1
-        
+       lContainerCutVars[17] = lcentrality;  
+       lContainerCutVars[18] = lPrimaryTrackMultiplicity;       
+//       lContainerCutVars[19] = lBachTPCClusters;                
+       
+       lContainerCutVars[19] = lctau;
+       lContainerCutVars[20] = lctauV0;
+       lContainerCutVars[21] = distTV0Xi;
        if ( lChargeXi < 0 ) {
          lContainerCutVars[11] = lInvMassXiMinus;
          lContainerCutVars[12] = lInvMassOmegaMinus;//1.63;
@@ -2547,20 +2364,7 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
          if ( lIsBachelorKaonForTPC   && lIsNegProtonForTPC    && lIsPosPionForTPC )
            fCFContCascadeCuts->Fill(lContainerCutVars,3); // for Omega+
        }
-     } 
                         
-        // II.Fill.Step 8 :  angular correlations
-/*        
-        if( lChargeXi < 0 ){
-                if( lIsBachelorPionForTPC   && lIsPosProtonForTPC    && lIsNegPionForTPC )      DoAngularCorrelation("Xi-",    lInvMassXiMinus,    lArrTrackID, lTVect3MomXi, lEta);
-                if( lIsBachelorKaonForTPC   && lIsPosProtonForTPC    && lIsNegPionForTPC )      DoAngularCorrelation("Omega-", lInvMassOmegaMinus, lArrTrackID, lTVect3MomXi, lEta);
-        }
-        else{
-                if( lIsBachelorPionForTPC   && lIsNegProtonForTPC    && lIsPosPionForTPC )      DoAngularCorrelation("Xi+",    lInvMassXiPlus,    lArrTrackID, lTVect3MomXi, lEta);
-                if( lIsBachelorKaonForTPC   && lIsNegProtonForTPC    && lIsPosPionForTPC )      DoAngularCorrelation("Omega+", lInvMassOmegaPlus, lArrTrackID, lTVect3MomXi, lEta);
-        }
-        
-*/     
    }// end of the Cascade loop (ESD or AOD)
     
   
@@ -2568,89 +2372,7 @@ void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
  PostData(1, fListHistCascade);
 }
 
-/*
-void AliAnalysisTaskCheckCascadePbPb::DoAngularCorrelation( const Char_t   *lCascType, 
-                                                             Double_t  lInvMassCascade, 
-                                                       const Int_t    *lArrTrackID,
-                                                             TVector3 &lTVect3MomXi, 
-                                                             Double_t  lEtaXi ){
-  // Perform the Delta(Phi)Delta(Eta) analysis 
-  // by properly filling the THnSparseF 
-       
-       TString lStrCascType( lCascType );
-       
-       Double_t lCascPdgMass = 0.0;
-       if( lStrCascType.Contains("Xi") )       lCascPdgMass = 1.3217;
-       if( lStrCascType.Contains("Omega") )    lCascPdgMass = 1.6724;
-       
-       if( lInvMassCascade > lCascPdgMass + 0.010) return;
-       if( lInvMassCascade < lCascPdgMass - 0.010) return;
-       // Check the Xi- candidate is within the proper mass window m0 +- 10 MeV
-       
-       
-       // 1st loop: check there is no track with a higher pt ...
-       // = The cascade is meant to be a leading particle : Pt(Casc) > any track in the event
-       for(Int_t TrckIdx = 0; TrckIdx < (InputEvent())->GetNumberOfTracks() ; TrckIdx++ )
-       {// Loop over all the tracks of the event
-       
-               AliVTrack *lCurrentTrck = dynamic_cast<AliVTrack*>( (InputEvent())->GetTrack( TrckIdx ) );
-                       if (!lCurrentTrck ) {
-                               AliWarning("ERROR Correl. Study : Could not retrieve a track while looping over the event tracks ...");
-                               continue;
-                       }
-               if(lTVect3MomXi.Pt() < lCurrentTrck->Pt() ) return;     
-               // Room for improvement: //FIXME
-               // 1. There is a given resolution on pt : maybe release the cut Pt(casc) < Pt(track)*90% ?
-               // 2. Apply this cut only when DeltaPhi(casc, track) > 90 deg = when track is in the away-side ?
-               // 3. Anti-splitting cut (like in Femto analysis) ?
-                       
-       }// end control loop
-       
-       // 2nd loop: filling loop
-       for(Int_t TrckIdx = 0; TrckIdx < (InputEvent())->GetNumberOfTracks() ; TrckIdx++ )
-       {// Loop over all the tracks of the event
-       
-               AliVTrack *lCurrentTrck = dynamic_cast<AliVTrack*>( (InputEvent())->GetTrack( TrckIdx ) );
-                       if (!lCurrentTrck ) {
-                               AliWarning("ERROR Correl. Study : Could not retrieve a track while looping over the event tracks ...");
-                               continue;
-                       }
-                               
-               // Room for improvement: //FIXME
-               // 1. Loop only on primary tracks ?     
-               // 2. Exclude the tracks that build the condisdered cascade = the bachelor + the V0 dghters
-               //     This may bias the outcome, especially for low multplicity events.
-               // Note : For ESD event, track ID == track index.
-                       if(lCurrentTrck->GetID() == lArrTrackID[0]) continue;
-                       if(lCurrentTrck->GetID() == lArrTrackID[1]) continue;
-                       if(lCurrentTrck->GetID() == lArrTrackID[2]) continue;
-                       
-               TVector3 lTVect3MomTrck(lCurrentTrck->Px(), lCurrentTrck->Py(), lCurrentTrck->Pz() );
-               
-               // 2 hypotheses made here :
-               //   - The Xi trajectory is a straight line,
-               //   - The Xi doesn't loose any energy by crossing the first layer(s) of ITS, if ever;
-               //      So, meaning hyp: vect p(Xi) at the emission = vect p(Xi) at the decay vertex
-               //      By doing this, we introduce a systematic error on the cascade Phi ...
-               // Room for improvement: take into account the curvature of the Xi trajectory //FIXME
-       
-               Double_t lHnSpFillVar[5] = {0.};
-               lHnSpFillVar[0] = lTVect3MomXi.DeltaPhi(lTVect3MomTrck) * 180.0/TMath::Pi(); // Delta phi(Casc,Track) (deg)
-               if(lHnSpFillVar[0] < -50.0) lHnSpFillVar[0] += 360.0;           
-               lHnSpFillVar[1] = lEtaXi - lCurrentTrck->Eta();                            // Delta eta(Casc,Track)
-               lHnSpFillVar[2] = lTVect3MomXi.Pt();                                       // Pt_{Casc}
-               lHnSpFillVar[3] = lCurrentTrck->Pt();                                      // Pt_{any track}
-               lHnSpFillVar[4] = lInvMassCascade;                                         // Eff. Inv Mass (control var)
-               
-               if(      lStrCascType.Contains("Xi-") )      fHnSpAngularCorrXiMinus    ->Fill( lHnSpFillVar );
-               else if( lStrCascType.Contains("Xi+") )      fHnSpAngularCorrXiPlus     ->Fill( lHnSpFillVar );
-               else if( lStrCascType.Contains("Omega-") )   fHnSpAngularCorrOmegaMinus ->Fill( lHnSpFillVar );
-               else if( lStrCascType.Contains("Omega+") )   fHnSpAngularCorrOmegaPlus  ->Fill( lHnSpFillVar );
-       
-       }// end - Loop over all the tracks in the event
-
-}
-*/
+//________________________________________________________________________
 Int_t AliAnalysisTaskCheckCascadePbPb::DoESDTrackWithTPCrefitMultiplicity(const AliESDEvent *lESDevent) {
     // Checking the number of tracks with TPCrefit for each event
     // Needed for a rough assessment of the event multiplicity
@@ -2674,10 +2396,6 @@ Int_t AliAnalysisTaskCheckCascadePbPb::DoESDTrackWithTPCrefitMultiplicity(const
     return  nTrackWithTPCrefitMultiplicity;
 }
 
-
-
-
-
 //________________________________________________________________________
 void AliAnalysisTaskCheckCascadePbPb::Terminate(Option_t *) 
 {
@@ -2758,13 +2476,13 @@ void AliAnalysisTaskCheckCascadePbPb::Terminate(Option_t *)
   fHistMassXiPlus ->DrawCopy("ESAME");
   
   
-  TLegend *legendeXi =new TLegend(0.67,0.34,0.97,0.54);
-               legendeXi->SetTextFont(42);
-               legendeXi->SetTextSize(0.05);
-               legendeXi->SetFillColor(kWhite);
-               legendeXi->AddEntry( fHistMassXiMinus,"#Xi^{-} candidates","lp");
-               legendeXi->AddEntry( fHistMassXiPlus,"#Xi^{+} candidates","lp");
-               legendeXi->Draw();
+  TLegend *legendXi =new TLegend(0.67,0.34,0.97,0.54);
+               legendXi->SetTextFont(42);
+               legendXi->SetTextSize(0.05);
+               legendXi->SetFillColor(kWhite);
+               legendXi->AddEntry( fHistMassXiMinus,"#Xi^{-} candidates","lp");
+               legendXi->AddEntry( fHistMassXiPlus,"#Xi^{+} candidates","lp");
+               legendXi->Draw();
   
   
   canCheckCascade->cd(4);  
@@ -2787,12 +2505,12 @@ void AliAnalysisTaskCheckCascadePbPb::Terminate(Option_t *)
   fHistMassOmegaMinus->DrawCopy("ESAME");
 
   
-   TLegend *legendeOmega = new TLegend(0.67,0.34,0.97,0.54);
-               legendeOmega->SetTextFont(42);
-               legendeOmega->SetTextSize(0.05);
-               legendeOmega->SetFillColor(kWhite);
-               legendeOmega->AddEntry( fHistMassOmegaMinus,"#Omega^{-} candidates","lp");
-               legendeOmega->AddEntry( fHistMassOmegaPlus,"#Omega^{+} candidates","lp");
-               legendeOmega->Draw();
+   TLegend *legendOmega = new TLegend(0.67,0.34,0.97,0.54);
+               legendOmega->SetTextFont(42);
+               legendOmega->SetTextSize(0.05);
+               legendOmega->SetFillColor(kWhite);
+               legendOmega->AddEntry( fHistMassOmegaMinus,"#Omega^{-} candidates","lp");
+               legendOmega->AddEntry( fHistMassOmegaPlus,"#Omega^{+} candidates","lp");
+               legendOmega->Draw();
 
 }
index 5faa194..adac220 100644 (file)
@@ -47,10 +47,8 @@ class AliAnalysisTaskCheckCascadePbPb : public AliAnalysisTaskSE {
                                            TVector3 &lTVect3MomXi, 
                                            Double_t  lEtaXi);*/
   virtual Int_t  DoESDTrackWithTPCrefitMultiplicity(const AliESDEvent *lESDevent);
-  
   virtual void   Terminate(Option_t *);
   
-  void SetCollidingSystems           (Short_t collidingSystems          = 0    ) { fCollidingSystems            = collidingSystems;           }
   void SetAnalysisType               (const char* analysisType          = "ESD") { fAnalysisType                = analysisType;               }
   void SetRelaunchV0CascVertexers    (Bool_t rerunV0CascVertexers       = 0    ) { fkRerunV0CascVertexers       = rerunV0CascVertexers;       }
   void SetQualityCutZprimVtxPos      (Bool_t qualityCutZprimVtxPos      = kTRUE) { fkQualityCutZprimVtxPos      = qualityCutZprimVtxPos;      }
@@ -62,7 +60,6 @@ class AliAnalysisTaskCheckCascadePbPb : public AliAnalysisTaskSE {
   void SetCentralityUpLim            (Float_t centruplim                = 100. ) { fCentrUpLim                  = centruplim;                 }
   void SetCentralityEst              (TString   centrest                = "V0M") { fCentrEstimator              = centrest;                   }
   void SetVertexRange                (Float_t vtxrange                  = 0.   ) { fVtxRange                    = vtxrange;                   }
-  void SetUseCFContCascadeCuts       (Bool_t usecfcontcascadecuts       = kFALSE){fUseCFContCascadeCuts         = usecfcontcascadecuts;       }
 
  private:
         // Note : In ROOT, "//!" means "do not stream the data from Master node to Worker node" ...
@@ -71,8 +68,7 @@ class AliAnalysisTaskCheckCascadePbPb : public AliAnalysisTaskSE {
 
 
         TString         fAnalysisType;                  // "ESD" or "AOD" analysis type        
-        Short_t         fCollidingSystems;              // 0 = pp collisions or 1 = AA collisions
-
+        AliESDtrackCuts *fESDtrackCuts;                 // ESD track cuts used for primary track definition
         //TPaveText       *fPaveTextBookKeeping;          // TString to store all the relevant info necessary for book keeping (v0 cuts, cascade cuts, quality cuts, ...)
         AliPIDResponse *fPIDResponse;                   //! PID response object
 
@@ -86,15 +82,12 @@ class AliAnalysisTaskCheckCascadePbPb : public AliAnalysisTaskSE {
         Float_t         fCentrUpLim;                    // Upper limit for centrality percentile selection
         TString         fCentrEstimator;                // string for the centrality estimator
         Float_t         fVtxRange;                      // to select events with |zvtx|<fVtxRange cm
-        Bool_t          fUseCFContCascadeCuts;          // to use CF containers for topological cut optimization
 
        
-        Double_t        fAlephParameters[5];            // Array to store the 5 param values for the TPC Bethe-Bloch parametrisation
         Double_t        fV0Sels[7];                     // Array to store the 7 values for the different selections V0 related (if fkRerunV0CascVertexers)
         Double_t        fCascSels[8];                   // Array to store the 8 values for the different selections Casc. related (if fkRerunV0CascVertexers)
 
-
-        TList      *fListHistCascade;              //! List of Cascade histograms
+        TList      *fListHistCascade;                   //! List of Cascade histograms
         
         // - General histos (filled before the trigger selection)
         TH2F    *fHistEvtsInCentralityBinsvsNtracks;  //! Events in centrality bins vs N ESDtracks
@@ -105,9 +98,6 @@ class AliAnalysisTaskCheckCascadePbPb : public AliAnalysisTaskSE {
         TH1F    *fHistTrackMultiplicityForCentrEvt;                //! Track multiplicity distribution (without any cut = include ITS stand-alone + global tracks)
         TH1F    *fHistTPCrefitTrackMultiplicityForCentrEvt;        //! Track multiplicity distribution for tracks with TPCrefit
         
-        // - General histos (filled for any triggered event + (|z(prim. vtx)| < 10 cm ) )
-        TH1F    *fHistCascadeMultiplicityForTrigEvtAndZprimVtx;   //! Cascade multiplicity distribution
-
         // - General histos (filled for events selected in this analysis (|z(prim. vtx)| < 10 cm + prim vtx = SPD or Tracking) )
         TH1F    *fHistCascadeMultiplicityForSelEvt;     //! Cascade multiplicity distribution
         TH1F    *fHistPosBestPrimaryVtxXForSelEvt;      //! (best) primary vertex position distribution in x 
@@ -244,7 +234,7 @@ class AliAnalysisTaskCheckCascadePbPb : public AliAnalysisTaskSE {
   AliAnalysisTaskCheckCascadePbPb(const AliAnalysisTaskCheckCascadePbPb&);            // not implemented
   AliAnalysisTaskCheckCascadePbPb& operator=(const AliAnalysisTaskCheckCascadePbPb&); // not implemented
   
-  ClassDef(AliAnalysisTaskCheckCascadePbPb, 2);
+  ClassDef(AliAnalysisTaskCheckCascadePbPb, 3);
 };
 
 #endif
index 2836e93..d43eef4 100644 (file)
 //-----------------------------------------------------------------
 //           AliAnalysisTaskCheckPerformanceCascadePbPb class
 //            This task is for a performance study of cascade identification in PbPb.
-//            It works with MC info and ESD.
-//            Use with AOD tree = under development
+//            It works with MC info and ESD/AOD.
 //            Origin   : AliAnalysisTaskCheckPerformanceCascade class by A. Maire Nov2010, antonin.maire@ires.in2p3.fr
 //            Modified for PbPb analysis: M. Nicassio Feb2011, maria.nicassio@ba.infn.it:
-//                        - physics selection moved to the runProof.C macro
-//                        - added centrality selection  
+//                        - physics selection moved to the run.C macro
+//                        - added centrality selection and possibility to select events in nTracks ranges 
 //                        - added new histograms 
 //                        - modified binning of some histograms and containers 
 //                        - flag to enable CF container usage 
-//                        - protection in the destructor for CAF usage
+//                        - check in the destructor for CAF usage
 //                        - flag for acceptance cut in the MC part
 //                        - in the MC particle selection IsPhysicalPrimary added and number of particles taken as appropriate for HIJING 
-//                          (however for cascades one gets the same if runs on Nprimaries in the stack and does not require IsPhysicalPrimary)
-//                        - number of tracklets from AOD also
-//                        - automatic settings for PID (July 2011) 
-//                        - added possibility to select either injected cascades or HIJING cascades (May 2011)  
+//                          (however for cascades one gets the same if runs on Nprimaries in the stack and does not check IsPhysicalPrimary)
+//                        - automatic settings for PID 
+//                        - selection of injected cascades and HIJING cascades (kind of "bug" in method IsFromBGEvent())
+//                        - added proper time histograms for cascades and lambdas
+//                        - cos of PA V0 wrt Xi vertex and not primary vertex  
+//                        - distance xi-V0 added in the container
+//                        - AOD analysis developed (January 2012)
 //-----------------------------------------------------------------
 
 
 #include "AliGenHijingEventHeader.h"
 #include "AliESDtrackCuts.h"
 #include "AliPIDResponse.h"
-//   #include "AliV0vertexer.h"
-//   #include "AliCascadeVertexer.h"
+//#include "AliV0vertexer.h"
+//#include "AliCascadeVertexer.h"
 #include "AliESDEvent.h"
 #include "AliESDcascade.h"
 #include "AliAODEvent.h"
+#include "AliAODMCParticle.h" 
 #include "AliAnalysisTaskCheckPerformanceCascadePbPb.h"
 
 ClassImp(AliAnalysisTaskCheckPerformanceCascadePbPb)
@@ -78,7 +81,7 @@ ClassImp(AliAnalysisTaskCheckPerformanceCascadePbPb)
      //_____Dummy constructor________________________________________________________________
 AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCascadePbPb() 
 : AliAnalysisTaskSE(), // <- take care to AliAnalysisTask( empty )
-  fDebugCascade(0), fAnalysisType("ESD"), fCollidingSystems(0), fESDtrackCuts(0), /*fPaveTextBookKeeping(0),*/
+  fAnalysisType("ESD"), fESDtrackCuts(0), /*fPaveTextBookKeeping(0),*/
 
     fPIDResponse                   (0),
     fkRerunV0CascVertexers         (0),
@@ -87,9 +90,7 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
     fkQualityCutNoTPConlyPrimVtx   (kTRUE),
     fkQualityCutTPCrefit           (kTRUE),
     fkQualityCut80TPCcls           (kTRUE),
-    fkIsDataRecoWith1PadTPCCluster (kTRUE),
     fkExtraSelections              (0),
-    fUseCFCont                     (0),
     fCentrLowLim(0),    fCentrUpLim(0), fCentrEstimator(0),
     fVtxRange                      (0),
     fApplyAccCut                   (0),
@@ -100,6 +101,9 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
 
     // Events in centrality bins
     fHistEvtsInCentralityBinsvsNtracks(0),
+    fHistBestVtxX(0),
+    fHistBestVtxY(0),
+    fHistBestVtxZ(0),
  
     // Cascade multiplicity histos
 
@@ -128,11 +132,15 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
       
    // Xi-
    fHistEtaGenCascXiMinus(0),
-   f3dHistGenPtVsGenYGenvsCentXiMinus(0),
-   f3dHistGenPtVsGenYGenvsNtracksXiMinus(0),
-
+   f3dHistGenPtVsGenYvsCentXiMinusNat(0),
+   f3dHistGenPtVsGenYvsNtracksXiMinusNat(0),
+   f3dHistGenPtVsGenYvsCentXiMinusInj(0),
+   f3dHistGenPtVsGenYvsNtracksXiMinusInj(0),
+   f3dHistGenPtVsGenctauvsYXiMinusNat(0),
+   f3dHistGenPtVsGenctauvsYXiMinusInj(0),
    
-    fHistThetaGenCascXiMinus(0),
+    fHistThetaGenCascXiMinusNat(0),
+    fHistThetaGenCascXiMinusInj(0), 
     f2dHistGenPtVsGenYFdblXiMinus(0),
     
     fHistThetaLambdaXiMinus(0), 
@@ -148,11 +156,15 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
    
    // Xi+
    fHistEtaGenCascXiPlus(0),
-   f3dHistGenPtVsGenYGenvsCentXiPlus(0),
-   f3dHistGenPtVsGenYGenvsNtracksXiPlus(0),
-
+   f3dHistGenPtVsGenYvsCentXiPlusNat(0),
+   f3dHistGenPtVsGenYvsNtracksXiPlusNat(0),
+   f3dHistGenPtVsGenYvsCentXiPlusInj(0),
+   f3dHistGenPtVsGenYvsNtracksXiPlusInj(0),
+   f3dHistGenPtVsGenctauvsYXiPlusNat(0),
+   f3dHistGenPtVsGenctauvsYXiPlusInj(0),
    
-    fHistThetaGenCascXiPlus(0), 
+    fHistThetaGenCascXiPlusNat(0), 
+    fHistThetaGenCascXiPlusInj(0),
     f2dHistGenPtVsGenYFdblXiPlus(0),
     
     fHistThetaLambdaXiPlus(0), 
@@ -167,11 +179,15 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
    
    // Omega-
    fHistEtaGenCascOmegaMinus(0),
-   f3dHistGenPtVsGenYGenvsCentOmegaMinus(0),
-   f3dHistGenPtVsGenYGenvsNtracksOmegaMinus(0),
-
+   f3dHistGenPtVsGenYvsCentOmegaMinusNat(0),
+   f3dHistGenPtVsGenYvsNtracksOmegaMinusNat(0),
+   f3dHistGenPtVsGenYvsCentOmegaMinusInj(0),
+   f3dHistGenPtVsGenYvsNtracksOmegaMinusInj(0),
+   f3dHistGenPtVsGenctauvsYOmegaMinusNat(0),
+   f3dHistGenPtVsGenctauvsYOmegaMinusInj(0),
    
-    fHistThetaGenCascOmegaMinus(0),
+    fHistThetaGenCascOmegaMinusNat(0),
+    fHistThetaGenCascOmegaMinusInj(0),
     f2dHistGenPtVsGenYFdblOmegaMinus(0),
     
     fHistThetaLambdaOmegaMinus(0), 
@@ -187,11 +203,15 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
    
    // Omega+
    fHistEtaGenCascOmegaPlus(0),
-   f3dHistGenPtVsGenYGenvsCentOmegaPlus(0),
-   f3dHistGenPtVsGenYGenvsNtracksOmegaPlus(0),
-
+   f3dHistGenPtVsGenYvsCentOmegaPlusNat(0),
+   f3dHistGenPtVsGenYvsNtracksOmegaPlusNat(0),
+   f3dHistGenPtVsGenYvsCentOmegaPlusInj(0),
+   f3dHistGenPtVsGenYvsNtracksOmegaPlusInj(0),
+   f3dHistGenPtVsGenctauvsYOmegaPlusNat(0),
+   f3dHistGenPtVsGenctauvsYOmegaPlusInj(0),
    
-    fHistThetaGenCascOmegaPlus(0),
+    fHistThetaGenCascOmegaPlusNat(0),
+    fHistThetaGenCascOmegaPlusInj(0),
     f2dHistGenPtVsGenYFdblOmegaPlus(0),
     
     fHistThetaLambdaOmegaPlus(0), 
@@ -264,7 +284,17 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
     f2dHistAsMCResPhiXiPlus(0),
     f2dHistAsMCResPhiOmegaMinus(0),
     f2dHistAsMCResPhiOmegaPlus(0),
-                               
+
+       //  - Correlation between proton (antiproton) daughter MC pt and Xi/Omega MC pt (to apply Geat/Fluka correction)
+    f2dHistAsMCptProtonMCptXiMinus(0),
+    f2dHistAsMCptAntiprotonMCptXiPlus(0),
+    f2dHistAsMCptProtonMCptOmegaMinus(0),
+    f2dHistAsMCptAntiprotonMCptOmegaPlus(0),
+    
+    fHistV0toXiCosineOfPointingAngle(0),
+    fHistV0CosineOfPointingAnglevsPtXi(0),
+    fHistV0CosineOfPointingAnglevsPtOmega(0), 
+                           
     fCFContCascadePIDAsXiMinus(0),
     fCFContCascadePIDAsXiPlus(0),
     fCFContCascadePIDAsOmegaMinus(0),
@@ -276,7 +306,6 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
 
 {
 // Dummy constructor
-        for(Int_t iAlephIdx   = 0; iAlephIdx   < 5; iAlephIdx++   ) { fAlephParameters [iAlephIdx]    = -1.; }
         for(Int_t iV0selIdx   = 0; iV0selIdx   < 7; iV0selIdx++   ) { fV0Sels          [iV0selIdx   ] = -1.; }
         for(Int_t iCascSelIdx = 0; iCascSelIdx < 8; iCascSelIdx++ ) { fCascSels        [iCascSelIdx ] = -1.; }
 }
@@ -287,17 +316,16 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
 //_____Non-default Constructor________________________________________________________________
 AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCascadePbPb(const char *name) 
   : AliAnalysisTaskSE(name),
-    fDebugCascade(0), fAnalysisType("ESD"), fCollidingSystems(0), 
- fESDtrackCuts(0), /*fPaveTextBookKeeping(0),*/
+    fAnalysisType("ESD"), fESDtrackCuts(0), /*fPaveTextBookKeeping(0),*/
+
+    fPIDResponse                   (0),
     fkRerunV0CascVertexers         (0),
     fkQualityCutZprimVtxPos        (kTRUE),
     fkRejectEventPileUp            (kTRUE),
     fkQualityCutNoTPConlyPrimVtx   (kTRUE),
     fkQualityCutTPCrefit           (kTRUE),
     fkQualityCut80TPCcls           (kTRUE),
-    fkIsDataRecoWith1PadTPCCluster (kTRUE),
     fkExtraSelections              (0),
-    fUseCFCont(0),
     fCentrLowLim(0), fCentrUpLim(0), fCentrEstimator(0),
     fVtxRange                      (0),
     fApplyAccCut                   (0),
@@ -308,6 +336,9 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
 
     // Events in centraity bins
     fHistEvtsInCentralityBinsvsNtracks(0),
+    fHistBestVtxX(0),
+    fHistBestVtxY(0),
+    fHistBestVtxZ(0),
 
     // Cascade multiplicity histos
 
@@ -335,11 +366,15 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
    
 // Xi-
    fHistEtaGenCascXiMinus(0),
-   f3dHistGenPtVsGenYGenvsCentXiMinus(0),
-   f3dHistGenPtVsGenYGenvsNtracksXiMinus(0),
-
+   f3dHistGenPtVsGenYvsCentXiMinusNat(0),
+   f3dHistGenPtVsGenYvsNtracksXiMinusNat(0),
+   f3dHistGenPtVsGenYvsCentXiMinusInj(0),
+   f3dHistGenPtVsGenYvsNtracksXiMinusInj(0),
+   f3dHistGenPtVsGenctauvsYXiMinusNat(0),
+   f3dHistGenPtVsGenctauvsYXiMinusInj(0),
    
-    fHistThetaGenCascXiMinus(0),
+    fHistThetaGenCascXiMinusNat(0),
+    fHistThetaGenCascXiMinusInj(0),
     f2dHistGenPtVsGenYFdblXiMinus(0),
     
     fHistThetaLambdaXiMinus(0), 
@@ -355,10 +390,15 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
    
    // Xi+
    fHistEtaGenCascXiPlus(0),
-  f3dHistGenPtVsGenYGenvsCentXiPlus(0),
-  f3dHistGenPtVsGenYGenvsNtracksXiPlus(0),
-    fHistThetaGenCascXiPlus(0), 
+  f3dHistGenPtVsGenYvsCentXiPlusNat(0),
+  f3dHistGenPtVsGenYvsNtracksXiPlusNat(0),
+  f3dHistGenPtVsGenYvsCentXiPlusInj(0),
+  f3dHistGenPtVsGenYvsNtracksXiPlusInj(0),
+  f3dHistGenPtVsGenctauvsYXiPlusNat(0),
+  f3dHistGenPtVsGenctauvsYXiPlusInj(0),
+
+    fHistThetaGenCascXiPlusNat(0), 
+    fHistThetaGenCascXiPlusInj(0),
     f2dHistGenPtVsGenYFdblXiPlus(0),
     
     fHistThetaLambdaXiPlus(0), 
@@ -373,10 +413,15 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
    
    // Omega-
    fHistEtaGenCascOmegaMinus(0),
-   f3dHistGenPtVsGenYGenvsCentOmegaMinus(0),
-   f3dHistGenPtVsGenYGenvsNtracksOmegaMinus(0),
-   
-    fHistThetaGenCascOmegaMinus(0),
+   f3dHistGenPtVsGenYvsCentOmegaMinusNat(0),
+   f3dHistGenPtVsGenYvsNtracksOmegaMinusNat(0),
+   f3dHistGenPtVsGenYvsCentOmegaMinusInj(0),
+   f3dHistGenPtVsGenYvsNtracksOmegaMinusInj(0),
+   f3dHistGenPtVsGenctauvsYOmegaMinusNat(0),
+   f3dHistGenPtVsGenctauvsYOmegaMinusInj(0),
+    fHistThetaGenCascOmegaMinusNat(0),
+    fHistThetaGenCascOmegaMinusInj(0),
     f2dHistGenPtVsGenYFdblOmegaMinus(0),
     
     fHistThetaLambdaOmegaMinus(0), 
@@ -392,11 +437,15 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
    
    // Omega+
    fHistEtaGenCascOmegaPlus(0),
-   f3dHistGenPtVsGenYGenvsCentOmegaPlus(0),
-   f3dHistGenPtVsGenYGenvsNtracksOmegaPlus(0),
-
+   f3dHistGenPtVsGenYvsCentOmegaPlusNat(0),
+   f3dHistGenPtVsGenYvsNtracksOmegaPlusNat(0),
+   f3dHistGenPtVsGenYvsCentOmegaPlusInj(0),
+   f3dHistGenPtVsGenYvsNtracksOmegaPlusInj(0),
+   f3dHistGenPtVsGenctauvsYOmegaPlusNat(0),
+   f3dHistGenPtVsGenctauvsYOmegaPlusInj(0),
    
-    fHistThetaGenCascOmegaPlus(0),
+    fHistThetaGenCascOmegaPlusNat(0),
+    fHistThetaGenCascOmegaPlusInj(0),
     f2dHistGenPtVsGenYFdblOmegaPlus(0),
     
     fHistThetaLambdaOmegaPlus(0), 
@@ -470,6 +519,16 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
     f2dHistAsMCResPhiOmegaMinus(0),
     f2dHistAsMCResPhiOmegaPlus(0),
 
+       //  - Correlation between proton (antiproton) daughter MC pt and Xi/Omega MC pt (to apply Geat/Fluka correction)
+    f2dHistAsMCptProtonMCptXiMinus(0),
+    f2dHistAsMCptAntiprotonMCptXiPlus(0),
+    f2dHistAsMCptProtonMCptOmegaMinus(0),
+    f2dHistAsMCptAntiprotonMCptOmegaPlus(0),
+
+    fHistV0toXiCosineOfPointingAngle(0),
+    fHistV0CosineOfPointingAnglevsPtXi(0),
+    fHistV0CosineOfPointingAnglevsPtOmega(0),
+
     fCFContCascadePIDAsXiMinus(0),
     fCFContCascadePIDAsXiPlus(0),
     fCFContCascadePIDAsOmegaMinus(0),
@@ -479,7 +538,6 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
 
     fV0Ampl(0)
 
-
 {
   // Constructor
 
@@ -487,26 +545,25 @@ AliAnalysisTaskCheckPerformanceCascadePbPb::AliAnalysisTaskCheckPerformanceCasca
   // Input slot #0 works with a TChain
   // Output slot #1 writes into a TList container (cascade)
         
-        for(Int_t iAlephIdx   = 0; iAlephIdx   < 5; iAlephIdx++   ) { fAlephParameters [iAlephIdx]    = -1.; }
         
-        // Hyper Loose  // FIXME change with PbPb cuts
+        // PbPb default cuts
         
         fV0Sels[0] =  33.  ;  // max allowed chi2
-        fV0Sels[1] =   0.001; // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
-        fV0Sels[2] =   0.001; // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
-        fV0Sels[3] =   5.0 ;  // max allowed DCA between the daughter tracks       (LHC09a4 : 0.5)
-        fV0Sels[4] =   0.0 ;  // min allowed cosine of V0's pointing angle         (LHC09a4 : 0.99)
-        fV0Sels[5] =   0.1 ;  // min radius of the fiducial volume                 (LHC09a4 : 0.2)
-        fV0Sels[6] = 100.  ;  // max radius of the fiducial volume                 (LHC09a4 : 100.0)
+        fV0Sels[1] =   0.1; // min allowed impact parameter for the 1st daughter 
+        fV0Sels[2] =   0.1; // min allowed impact parameter for the 2nd daughter 
+        fV0Sels[3] =   1.0 ;  // max allowed DCA between the daughter tracks       
+        fV0Sels[4] =   0.998 ;  // min allowed cosine of V0's pointing angle         
+        fV0Sels[5] =   0.9;  // min radius of the fiducial volume                 
+        fV0Sels[6] = 100.  ;  // max radius of the fiducial volume                 
         
-        fCascSels[0] =  33.   ;  // max allowed chi2 (same as PDC07)
-        fCascSels[1] =   0.001;  // min allowed V0 impact parameter                    (PDC07 : 0.05   / LHC09a4 : 0.025 )
-        fCascSels[2] =   0.008;  // "window" around the Lambda mass                    (PDC07 : 0.008  / LHC09a4 : 0.010 )
-        fCascSels[3] =   0.001;  // min allowed bachelor's impact parameter            (PDC07 : 0.035  / LHC09a4 : 0.025 )
-        fCascSels[4] =   5.0  ;  // max allowed DCA between the V0 and the bachelor    (PDC07 : 0.1    / LHC09a4 : 0.2   )
-        fCascSels[5] =   0.82 ;  //FIXME min allowed cosine of the cascade pointing angle   (PDC07 : 0.9985 / LHC09a4 : 0.998 )
-        fCascSels[6] =   0.1  ;  // min radius of the fiducial volume                  (PDC07 : 0.9    / LHC09a4 : 0.2   )
-        fCascSels[7] = 100.   ;  // max radius of the fiducial volume                  (PDC07 : 100    / LHC09a4 : 100   )
+        fCascSels[0] =  33.   ;  // max allowed chi2 
+        fCascSels[1] =   0.05;  // min allowed V0 impact parameter                    
+        fCascSels[2] =   0.008;  // "window" around the Lambda mass                    
+        fCascSels[3] =   0.03;  // min allowed bachelor's impact parameter            
+        fCascSels[4] =   0.3  ;  // max allowed DCA between the V0 and the bachelor    
+        fCascSels[5] =   0.999;  // min allowed cosine of the cascade pointing angle   
+        fCascSels[6] =   0.9  ;  // min radius of the fiducial volume                  
+        fCascSels[7] = 100.   ;  // max radius of the fiducial volume                  
         
         
   DefineOutput(1, TList::Class());
@@ -549,13 +606,13 @@ void AliAnalysisTaskCheckPerformanceCascadePbPb::UserCreateOutputObjects()
    AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
    fPIDResponse = inputHandler->GetPIDResponse();
         
-// Only used to get the number of primary reconstructed tracks
-if(! fESDtrackCuts ){
-      fESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE); // Std definition of primary (see kTRUE argument) tracks for 2010
-//      fESDtrackCuts->SetEtaRange(-0.8,+0.8);
-//      fESDtrackCuts->SetPtRange(0.15, 1e10);
-      Printf("CheckCascade - ESDtrackCuts set up to 2010 std ITS-TPC cuts...");
-}
+   // Only used to get the number of primary reconstructed tracks
+   if (! fESDtrackCuts ){
+     fESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE); // Std definition of primary (see kTRUE argument) tracks for 2010
+//     fESDtrackCuts->SetEtaRange(-0.8,+0.8);
+//     fESDtrackCuts->SetPtRange(0.15, 1e10);
+     Printf("CheckCascade - ESDtrackCuts set up to 2010 std ITS-TPC cuts...");
+   }
 
 
 /*
@@ -572,8 +629,7 @@ if( !fPaveTextBookKeeping){
         fPaveTextBookKeeping->AddText( "Task CHECK PERFORMANCE CASCADE analysis" );
         fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
         fPaveTextBookKeeping->AddText( Form("AnalysisType : %s ", fAnalysisType.Data() ));
-        if(!fCollidingSystems)  fPaveTextBookKeeping->AddText("Colliding system : p-p collisions ");
-        else                    fPaveTextBookKeeping->AddText("Colliding system : A-A collisions ");
+        fPaveTextBookKeeping->AddText("Colliding system : A-A collisions ");
 
         fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
     
@@ -616,28 +672,32 @@ if( !fPaveTextBookKeeping){
 
         fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
 
-        fPaveTextBookKeeping->AddText("G. TPC Aleph Param : ");
-        fPaveTextBookKeeping->AddText( Form("   - fAlephParam [0] =  %.5g", fAlephParameters[0] ));
-        fPaveTextBookKeeping->AddText( Form("   - fAlephParam [1] =  %.5g", fAlephParameters[1] ));
-        fPaveTextBookKeeping->AddText( Form("   - fAlephParam [2] =  %.5g", fAlephParameters[2] ));
-        fPaveTextBookKeeping->AddText( Form("   - fAlephParam [3] =  %.5g", fAlephParameters[3] ));
-        fPaveTextBookKeeping->AddText( Form("   - fAlephParam [4] =  %.5g", fAlephParameters[4] ));
-        
         fListHistCascade->Add(fPaveTextBookKeeping);
 }       
 */
  
   // - General
   Double_t ptBinLimits[101];
-  for (Int_t iptbin = 0; iptbin<101; ++iptbin) {ptBinLimits[iptbin]=iptbin*0.1;};
-  Double_t yBinLimits[221];
-  for (Int_t iybin = 0; iybin<221; ++iybin) {yBinLimits[iybin]=-1.1+iybin*0.01;};
+  for (Int_t iptbin = 0; iptbin<101; ++iptbin) ptBinLimits[iptbin]=iptbin*0.1;
+  Double_t yBinLimits[111];
+  for (Int_t iybin = 0; iybin<111; ++iybin) yBinLimits[iybin]=-1.1+iybin*0.02;
 
   // Events in centrality bins
   Double_t centBinLimits[12] = {0.,5.,10.,20.,30.,40.,50.,60.,70.,80.,90.,100.};
-  fHistEvtsInCentralityBinsvsNtracks = new TH2F("fHistEvtsInCentralityBinsvsNtracks","",11,centBinLimits,100,0.,6000.);
+
+  Double_t ctauBinLimits[112];
+  for (Int_t ict = 0; ict<112; ++ict) ctauBinLimits[ict] = (Double_t) (ict-1.); 
+
+  fHistEvtsInCentralityBinsvsNtracks = new TH2F("fHistEvtsInCentralityBinsvsNtracks","",11,centBinLimits,100,0.,4000.);
   fListHistCascade->Add(fHistEvtsInCentralityBinsvsNtracks);
 
+  fHistBestVtxX = new TH1F("fHistBestVtxX","",100,-0.1,0.1);
+  fListHistCascade->Add(fHistBestVtxX);
+  fHistBestVtxY = new TH1F("fHistBestVtxY","",100,-1,1);
+  fListHistCascade->Add(fHistBestVtxY);
+  fHistBestVtxZ = new TH1F("fHistBestVtxZ","",100,-20.,20.);
+  fListHistCascade->Add(fHistBestVtxZ);
+
   // Cascade multiplicity distributions
   
   fHistnXiPlusPerEvTot= new TH1F("fHistnXiPlusPerEvTot", "", 100, 0, 100);
@@ -668,19 +728,19 @@ if( !fPaveTextBookKeeping){
   fListHistCascade->Add(fHistnAssoOmegaPlus);
   
   if (!fHistMCTrackMultiplicity) {
-     fHistMCTrackMultiplicity = new TH1F("fHistMCTrackMultiplicity", "Multiplicity distribution;Number of tracks;Events", 200, 0, 400000); 
-  fListHistCascade->Add(fHistMCTrackMultiplicity);
+    fHistMCTrackMultiplicity = new TH1F("fHistMCTrackMultiplicity", "Multiplicity distribution;Number of tracks;Events", 200, 0, 200000.); 
+    fListHistCascade->Add(fHistMCTrackMultiplicity);
   }
   
     // - Resolution of the multiplicity estimator
-  if(! f2dHistRecoMultVsMCMult){
-       f2dHistRecoMultVsMCMult = new TH2F("f2dHistRecoMultVsMCMult", "Resolution of the multiplicity estimator (prim. tracks); Reco Multiplicity (prim. tracks); MC multiplicity (gen. part.)", 200, 0., 6000., 200, 0., 6000.);
-       fListHistCascade->Add(f2dHistRecoMultVsMCMult);
+  if (! f2dHistRecoMultVsMCMult){
+    f2dHistRecoMultVsMCMult = new TH2F("f2dHistRecoMultVsMCMult", "Resolution of the multiplicity estimator (prim. tracks); Reco Multiplicity (prim. tracks); MC multiplicity (gen. part.)", 200, 0., 150000., 200, 0., 200000.);
+    fListHistCascade->Add(f2dHistRecoMultVsMCMult);
   }
   
   if (!fHistEtaGenProton) {
-     fHistEtaGenProton = new TH1F("fHistEtaGenProton", "#eta of any gen. p^{+};#eta;Number of prim. protons", 200, -10, 10);
-     fListHistCascade->Add(fHistEtaGenProton);
+    fHistEtaGenProton = new TH1F("fHistEtaGenProton", "#eta of any gen. p^{+};#eta;Number of prim. protons", 200, -10, 10);
+    fListHistCascade->Add(fHistEtaGenProton);
   }
   
   if (!fHistEtaGenAntiProton) {
@@ -695,26 +755,48 @@ if( !fPaveTextBookKeeping){
   if (!fHistEtaGenCascXiMinus) {
      fHistEtaGenCascXiMinus = new TH1F("fHistEtaGenCascXiMinus", "#eta of any gen. #Xi^{-};#eta;Number of Casc", 200, -10, 10);
      fListHistCascade->Add(fHistEtaGenCascXiMinus);
-  }
+   }
 
-  if (!f3dHistGenPtVsGenYGenvsCentXiMinus) {
-     f3dHistGenPtVsGenYGenvsCentXiMinus = new TH3D("f3dHistGenPtVsGenYGenvsCentXiMinus", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 220, yBinLimits, 11, centBinLimits);
-     fListHistCascade->Add(f3dHistGenPtVsGenYGenvsCentXiMinus);
+  if (!f3dHistGenPtVsGenYvsCentXiMinusNat) {
+     f3dHistGenPtVsGenYvsCentXiMinusNat = new TH3D("f3dHistGenPtVsGenYvsCentXiMinusNat", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 110, yBinLimits, 11, centBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsCentXiMinusNat);
+   }
+  if (!f3dHistGenPtVsGenYvsNtracksXiMinusNat) {
+    f3dHistGenPtVsGenYvsNtracksXiMinusNat = new TH3D("f3dHistGenPtVsGenYvsNtracksXiMinusNat", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 110, -1.1, 1.1, 100, 0., 4000.);
+    fListHistCascade->Add(f3dHistGenPtVsGenYvsNtracksXiMinusNat);
+  }
+  if (!f3dHistGenPtVsGenYvsCentXiMinusInj) {
+     f3dHistGenPtVsGenYvsCentXiMinusInj = new TH3D("f3dHistGenPtVsGenYvsCentXiMinusInj", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 110, yBinLimits, 11, centBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsCentXiMinusInj);
+  }
+  if (!f3dHistGenPtVsGenYvsNtracksXiMinusInj) {
+    f3dHistGenPtVsGenYvsNtracksXiMinusInj = new TH3D("f3dHistGenPtVsGenYvsNtracksXiMinusInj", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 110, -1.1, 1.1, 100, 0., 4000.);
+    fListHistCascade->Add(f3dHistGenPtVsGenYvsNtracksXiMinusInj);
   }
-  if (!f3dHistGenPtVsGenYGenvsNtracksXiMinus) {
-     f3dHistGenPtVsGenYGenvsNtracksXiMinus = new TH3D("f3dHistGenPtVsGenYGenvsNtracksXiMinus", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 220, -1.1, 1.1, 100, 0., 6000.);
-     fListHistCascade->Add(f3dHistGenPtVsGenYGenvsNtracksXiMinus);
+  if (!f3dHistGenPtVsGenctauvsYXiMinusNat) {
+     f3dHistGenPtVsGenctauvsYXiMinusNat = new TH3D("f3dHistGenPtVsGenctauvsYXiMinusNat", "MC P_{t} Vs MC ctau Vs Y of Gen #Xi^{-} ", 100, ptBinLimits, 111, ctauBinLimits, 110, yBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenctauvsYXiMinusNat);
   }
 
+  if (!f3dHistGenPtVsGenctauvsYXiMinusInj) {
+     f3dHistGenPtVsGenctauvsYXiMinusInj = new TH3D("f3dHistGenPtVsGenctauvsYXiMinusInj", "MC P_{t} Vs MC ctau Vs Y of Gen #Xi^{-} ", 100, ptBinLimits, 111, ctauBinLimits, 110, yBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenctauvsYXiMinusInj);
+  }
   
+
   // - Info at the generation level of multi-strange particle
   
-  if (!fHistThetaGenCascXiMinus) {
-     fHistThetaGenCascXiMinus = new TH1F("fHistThetaGenCascXiMinus", "#theta of gen. #Xi^{-};#theta;Number of Casc.", 200, -10, 190);
-     fListHistCascade->Add(fHistThetaGenCascXiMinus);
+  if (!fHistThetaGenCascXiMinusNat) {
+     fHistThetaGenCascXiMinusNat = new TH1F("fHistThetaGenCascXiMinusNat", "#theta of gen. #Xi^{-};#theta;Number of Casc.", 200, -10, 190);
+     fListHistCascade->Add(fHistThetaGenCascXiMinusNat);
   }
 
+  if (!fHistThetaGenCascXiMinusInj) {
+     fHistThetaGenCascXiMinusInj = new TH1F("fHistThetaGenCascXiMinusInj", "#theta of injected. #Xi^{-};#theta;Number of Casc.", 200, -10, 190);
+     fListHistCascade->Add(fHistThetaGenCascXiMinusInj);
+  }
+
+
   if (!f2dHistGenPtVsGenYFdblXiMinus) {
      f2dHistGenPtVsGenYFdblXiMinus = new TH2D("f2dHistGenPtVsGenYFdblXiMinus", "MC P_{t} Vs MC Y of findable Gen #Xi^{-}; Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 220, -1.1, 1.1);
      fListHistCascade->Add(f2dHistGenPtVsGenYFdblXiMinus);
@@ -768,22 +850,44 @@ if( !fPaveTextBookKeeping){
      fHistEtaGenCascXiPlus = new TH1F("fHistEtaGenCascXiPlus", "#eta of any gen. #Xi^{+};#eta;Number of Casc", 200, -10, 10);
      fListHistCascade->Add(fHistEtaGenCascXiPlus);
   }
-if (!f3dHistGenPtVsGenYGenvsCentXiPlus) {
-     f3dHistGenPtVsGenYGenvsCentXiPlus = new TH3D("f3dHistGenPtVsGenYGenvsCentXiPlus", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 220, yBinLimits, 11, centBinLimits);
-     fListHistCascade->Add(f3dHistGenPtVsGenYGenvsCentXiPlus);
+  if (!f3dHistGenPtVsGenYvsCentXiPlusNat) {
+     f3dHistGenPtVsGenYvsCentXiPlusNat = new TH3D("f3dHistGenPtVsGenYvsCentXiPlusNat", "MC P_{t} Vs MC Y of Gen #Xi^{+} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 110, yBinLimits, 11, centBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsCentXiPlusNat);
+  }
+  if (!f3dHistGenPtVsGenYvsNtracksXiPlusNat) {
+    f3dHistGenPtVsGenYvsNtracksXiPlusNat = new TH3D("f3dHistGenPtVsGenYvsNtracksXiPlusNat", "MC P_{t} Vs MC Y of Gen #Xi^{+} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 110, -1.1, 1.1, 100, 0., 4000.);
+    fListHistCascade->Add(f3dHistGenPtVsGenYvsNtracksXiPlusNat);
   }
-  if (!f3dHistGenPtVsGenYGenvsNtracksXiPlus) {
-     f3dHistGenPtVsGenYGenvsNtracksXiPlus = new TH3D("f3dHistGenPtVsGenYGenvsNtracksXiPlus", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 220, -1.1, 1.1, 100, 0., 6000.);
-     fListHistCascade->Add(f3dHistGenPtVsGenYGenvsNtracksXiPlus);
+  if (!f3dHistGenPtVsGenYvsCentXiPlusInj) {
+     f3dHistGenPtVsGenYvsCentXiPlusInj = new TH3D("f3dHistGenPtVsGenYvsCentXiPlusInj", "MC P_{t} Vs MC Y of Gen #Xi^{+} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 110, yBinLimits, 11, centBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsCentXiPlusInj);
   }
+  if (!f3dHistGenPtVsGenYvsNtracksXiPlusInj) {
+    f3dHistGenPtVsGenYvsNtracksXiPlusInj = new TH3D("f3dHistGenPtVsGenYvsNtracksXiPlusInj", "MC P_{t} Vs MC Y of Gen #Xi^{+} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 110, -1.1, 1.1, 100, 0., 4000.);
+    fListHistCascade->Add(f3dHistGenPtVsGenYvsNtracksXiPlusInj);
+  }
+  if (!f3dHistGenPtVsGenctauvsYXiPlusNat) {
+     f3dHistGenPtVsGenctauvsYXiPlusNat = new TH3D("f3dHistGenPtVsGenctauvsYXiPlusNat", "MC P_{t} Vs MC ctau Vs Yof Gen #Xi^{+} ", 100, ptBinLimits, 111, ctauBinLimits, 110, yBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenctauvsYXiPlusNat);
+  }
+  if (!f3dHistGenPtVsGenctauvsYXiPlusInj) {
+     f3dHistGenPtVsGenctauvsYXiPlusInj = new TH3D("f3dHistGenPtVsGenctauvsYXiPlusInj", "MC P_{t} Vs MC ctau Vs Yof Gen #Xi^{+} ", 100, ptBinLimits, 111, ctauBinLimits, 110, yBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenctauvsYXiPlusInj);
+  }
+
   
   
   // - Info at the generation level of multi-strange particle
   
-  if (!fHistThetaGenCascXiPlus) {
-     fHistThetaGenCascXiPlus = new TH1F("fHistThetaGenCascXiPlus", "#theta of gen. #Xi^{+};#theta;Number of Casc.", 200, -10, 190);
-     fListHistCascade->Add(fHistThetaGenCascXiPlus);
+  if (!fHistThetaGenCascXiPlusNat) {
+     fHistThetaGenCascXiPlusNat = new TH1F("fHistThetaGenCascXiPlusNat", "#theta of gen. #Xi^{+};#theta;Number of Casc.", 200, -10, 190);
+     fListHistCascade->Add(fHistThetaGenCascXiPlusNat);
   }
+  if (!fHistThetaGenCascXiPlusInj) {
+     fHistThetaGenCascXiPlusInj = new TH1F("fHistThetaGenCascXiPlusInj", "#theta of inj. #Xi^{+};#theta;Number of Casc.", 200, -10, 190);
+     fListHistCascade->Add(fHistThetaGenCascXiPlusInj);
+  }
+
  
   if (!f2dHistGenPtVsGenYFdblXiPlus) {
      f2dHistGenPtVsGenYFdblXiPlus = new TH2D("f2dHistGenPtVsGenYFdblXiPlus", "MC P_{t} Vs MC Y of findable Gen #Xi^{+} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 220, -1.1, 1.1);
@@ -837,23 +941,46 @@ if (!f3dHistGenPtVsGenYGenvsCentXiPlus) {
      fHistEtaGenCascOmegaMinus = new TH1F("fHistEtaGenCascOmegaMinus", "#eta of any gen. #Omega^{-};#eta;Number of Casc", 200, -10, 10);
      fListHistCascade->Add(fHistEtaGenCascOmegaMinus);
   }
- if (!f3dHistGenPtVsGenYGenvsCentOmegaMinus) {
-     f3dHistGenPtVsGenYGenvsCentOmegaMinus = new TH3D("f3dHistGenPtVsGenYGenvsCentOmegaMinus", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 220, yBinLimits, 11, centBinLimits);
-     fListHistCascade->Add(f3dHistGenPtVsGenYGenvsCentOmegaMinus);
+ if (!f3dHistGenPtVsGenYvsCentOmegaMinusNat) {
+     f3dHistGenPtVsGenYvsCentOmegaMinusNat = new TH3D("f3dHistGenPtVsGenYvsCentOmegaMinusNat", "MC P_{t} Vs MC Y of Gen #Omega^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 110, yBinLimits, 11, centBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsCentOmegaMinusNat);
+  }
+  if (!f3dHistGenPtVsGenYvsNtracksOmegaMinusNat) {
+     f3dHistGenPtVsGenYvsNtracksOmegaMinusNat = new TH3D("f3dHistGenPtVsGenYvsNtracksOmegaMinusNat", "MC P_{t} Vs MC Y of Gen #Omega^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 110, -1.1, 1.1, 100, 0., 4000.);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsNtracksOmegaMinusNat);
+  }
+  if (!f3dHistGenPtVsGenYvsCentOmegaMinusInj) {
+     f3dHistGenPtVsGenYvsCentOmegaMinusInj = new TH3D("f3dHistGenPtVsGenYvsCentOmegaMinusInj", "MC P_{t} Vs MC Y of Gen #Omega^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 110, yBinLimits, 11, centBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsCentOmegaMinusInj);
   }
-  if (!f3dHistGenPtVsGenYGenvsNtracksOmegaMinus) {
-     f3dHistGenPtVsGenYGenvsNtracksOmegaMinus = new TH3D("f3dHistGenPtVsGenYGenvsNtracksOmegaMinus", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 220, -1.1, 1.1, 100, 0., 6000.);
-     fListHistCascade->Add(f3dHistGenPtVsGenYGenvsNtracksOmegaMinus);
+  if (!f3dHistGenPtVsGenYvsNtracksOmegaMinusInj) {
+     f3dHistGenPtVsGenYvsNtracksOmegaMinusInj = new TH3D("f3dHistGenPtVsGenYvsNtracksOmegaMinusInj", "MC P_{t} Vs MC Y of Gen #Omega^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 110, -1.1, 1.1, 100, 0., 4000.);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsNtracksOmegaMinusInj);
   }
+  if (!f3dHistGenPtVsGenctauvsYOmegaMinusNat) { 
+     f3dHistGenPtVsGenctauvsYOmegaMinusNat = new TH3D("f3dHistGenPtVsGenctauvsYOmegaMinusNat", "MC P_{t} Vs MC ctau Vs Y of Gen #Omega^{-} ", 100, ptBinLimits, 111, ctauBinLimits, 110, yBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenctauvsYOmegaMinusNat);
+  }
+  if (!f3dHistGenPtVsGenctauvsYOmegaMinusInj) {
+     f3dHistGenPtVsGenctauvsYOmegaMinusInj = new TH3D("f3dHistGenPtVsGenctauvsYOmegaMinusInj", "MC P_{t} Vs MC ctau Vs Y of Gen #Omega^{-} ", 100, ptBinLimits, 111, ctauBinLimits, 110, yBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenctauvsYOmegaMinusInj);
+  }
+
+
 
   
   
   // - Info at the generation level of multi-strange particle
   
-  if (!fHistThetaGenCascOmegaMinus) {
-     fHistThetaGenCascOmegaMinus = new TH1F("fHistThetaGenCascOmegaMinus", "#theta of gen. #Omega^{-};#theta;Number of Casc.", 200, -10, 190);
-     fListHistCascade->Add(fHistThetaGenCascOmegaMinus);
+  if (!fHistThetaGenCascOmegaMinusNat) {
+     fHistThetaGenCascOmegaMinusNat = new TH1F("fHistThetaGenCascOmegaMinusNat", "#theta of gen. #Omega^{-};#theta;Number of Casc.", 200, -10, 190);
+     fListHistCascade->Add(fHistThetaGenCascOmegaMinusNat);
   }
+  if (!fHistThetaGenCascOmegaMinusInj) {
+     fHistThetaGenCascOmegaMinusInj = new TH1F("fHistThetaGenCascOmegaMinusInj", "#theta of inj. #Omega^{-};#theta;Number of Casc.", 200, -10, 190);
+     fListHistCascade->Add(fHistThetaGenCascOmegaMinusInj);
+  }
+
  
   if (!f2dHistGenPtVsGenYFdblOmegaMinus) {
      f2dHistGenPtVsGenYFdblOmegaMinus = new TH2D("f2dHistGenPtVsGenYFdblOmegaMinus", "MC P_{t} Vs MC Y of findable Gen #Omega^{-}; Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 220, -1.1, 1.1);
@@ -907,22 +1034,43 @@ if (!f3dHistGenPtVsGenYGenvsCentXiPlus) {
      fHistEtaGenCascOmegaPlus = new TH1F("fHistEtaGenCascOmegaPlus", "#eta of any gen. #Omega^{+};#eta;Number of Casc", 200, -10, 10);
      fListHistCascade->Add(fHistEtaGenCascOmegaPlus);
   }
-  if (!f3dHistGenPtVsGenYGenvsCentOmegaPlus) {
-     f3dHistGenPtVsGenYGenvsCentOmegaPlus = new TH3D("f3dHistGenPtVsGenYGenvsCentOmegaPlus", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 220, yBinLimits, 11, centBinLimits);
-     fListHistCascade->Add(f3dHistGenPtVsGenYGenvsCentOmegaPlus);
+  if (!f3dHistGenPtVsGenYvsCentOmegaPlusNat) {
+     f3dHistGenPtVsGenYvsCentOmegaPlusNat = new TH3D("f3dHistGenPtVsGenYvsCentOmegaPlusNat", "MC P_{t} Vs MC Y of Gen #Omega^{+} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 110, yBinLimits, 11, centBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsCentOmegaPlusNat);
+  }
+  if (!f3dHistGenPtVsGenYvsNtracksOmegaPlusNat) {
+     f3dHistGenPtVsGenYvsNtracksOmegaPlusNat = new TH3D("f3dHistGenPtVsGenYvsNtracksOmegaPlusNat", "MC P_{t} Vs MC Y of Gen #Omega^{+} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 110, -1.1, 1.1, 100, 0., 4000.);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsNtracksOmegaPlusNat);
+  }
+  if (!f3dHistGenPtVsGenYvsCentOmegaPlusInj) {
+     f3dHistGenPtVsGenYvsCentOmegaPlusInj = new TH3D("f3dHistGenPtVsGenYvsCentOmegaPlusInj", "MC P_{t} Vs MC Y of Gen #Omega^{+} ;Pt_{MC} (GeV/c); Y_{MC}", 100, ptBinLimits, 110, yBinLimits, 11, centBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsCentOmegaPlusInj);
   }
-  if (!f3dHistGenPtVsGenYGenvsNtracksOmegaPlus) {
-     f3dHistGenPtVsGenYGenvsNtracksOmegaPlus = new TH3D("f3dHistGenPtVsGenYGenvsNtracksOmegaPlus", "MC P_{t} Vs MC Y of Gen #Xi^{-} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 220, -1.1, 1.1, 100, 0., 6000.);
-     fListHistCascade->Add(f3dHistGenPtVsGenYGenvsNtracksOmegaPlus);
+  if (!f3dHistGenPtVsGenYvsNtracksOmegaPlusInj) {
+     f3dHistGenPtVsGenYvsNtracksOmegaPlusInj = new TH3D("f3dHistGenPtVsGenYvsNtracksOmegaPlusInj", "MC P_{t} Vs MC Y of Gen #Omega^{+} ;Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 110, -1.1, 1.1, 100, 0., 4000.);
+     fListHistCascade->Add(f3dHistGenPtVsGenYvsNtracksOmegaPlusInj);
+  }
+  if (!f3dHistGenPtVsGenctauvsYOmegaPlusNat) {
+     f3dHistGenPtVsGenctauvsYOmegaPlusNat = new TH3D("f3dHistGenPtVsGenctauvsYOmegaPlusNat", "MC P_{t} Vs MC ctau Vs Y of Gen #Omega^{+} ", 100, ptBinLimits, 111, ctauBinLimits, 110, yBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenctauvsYOmegaPlusNat);
+  }
+  if (!f3dHistGenPtVsGenctauvsYOmegaPlusInj) {
+     f3dHistGenPtVsGenctauvsYOmegaPlusInj = new TH3D("f3dHistGenPtVsGenctauvsYOmegaPlusInj", "MC P_{t} Vs MC ctau Vs Y of Gen #Omega^{+} ", 100, ptBinLimits, 111, ctauBinLimits, 110, yBinLimits);
+     fListHistCascade->Add(f3dHistGenPtVsGenctauvsYOmegaPlusInj);
   }
  
   
   // - Info at the generation level of multi-strange particle
   
-  if (!fHistThetaGenCascOmegaPlus) {
-     fHistThetaGenCascOmegaPlus = new TH1F("fHistThetaGenCascOmegaPlus", "#theta of gen. #Omega^{+};#theta;Number of Casc.", 200, -10, 190);
-     fListHistCascade->Add(fHistThetaGenCascOmegaPlus);
+  if (!fHistThetaGenCascOmegaPlusNat) {
+     fHistThetaGenCascOmegaPlusNat = new TH1F("fHistThetaGenCascOmegaPlusNat", "#theta of gen. #Omega^{+};#theta;Number of Casc.", 200, -10, 190);
+     fListHistCascade->Add(fHistThetaGenCascOmegaPlusNat);
   }
+  if (!fHistThetaGenCascOmegaPlusInj) {
+     fHistThetaGenCascOmegaPlusInj = new TH1F("fHistThetaGenCascOmegaPlusInj", "#theta of inj. #Omega^{+};#theta;Number of Casc.", 200, -10, 190);
+     fListHistCascade->Add(fHistThetaGenCascOmegaPlusInj);
+  }
+
  
   if (!f2dHistGenPtVsGenYFdblOmegaPlus) {
      f2dHistGenPtVsGenYFdblOmegaPlus = new TH2D("f2dHistGenPtVsGenYFdblOmegaPlus", "MC P_{t} Vs MC Y of findable Gen #Omega^{+}; Pt_{MC} (GeV/c); Y_{MC}", 100, 0., 10., 220, -1.1, 1.1);
@@ -1212,10 +1360,42 @@ if (!f3dHistGenPtVsGenYGenvsCentXiPlus) {
           f2dHistAsMCResPhiOmegaPlus = new TH2F( "f2dHistAsMCResPhiOmegaPlus", "Resolution in #phi for #Omega^{+}; Pt_{MC} (GeV/c); #phi(MC) - #phi(reco)   (deg)", 200, 0., 10., 60, -30., 30.);
           fListHistCascade->Add(f2dHistAsMCResPhiOmegaPlus);
   }
-  
+
+         //  - Correlation between proton (antiproton) daughter MC pt and Xi/Omega MC pt (to apply Geant/Fluka correction)
+    if (!f2dHistAsMCptProtonMCptXiMinus) {
+      f2dHistAsMCptProtonMCptXiMinus = new TH2F( "f2dHistAsMCptProtonMCptXiMinus", "Proton MC pt vs Xi- MC pt", 100, 0., 10., 100, 0., 10.); 
+      fListHistCascade->Add(f2dHistAsMCptProtonMCptXiMinus);
+    }
+    if (!f2dHistAsMCptAntiprotonMCptXiPlus) {
+      f2dHistAsMCptAntiprotonMCptXiPlus = new TH2F( "f2dHistAsMCptAntiprotonMCptXiPlus", "Antiproton MC pt vs Xi+ MC pt", 100, 0., 10., 100, 0., 10.);
+      fListHistCascade->Add(f2dHistAsMCptAntiprotonMCptXiPlus);
+    }
+    if (!f2dHistAsMCptProtonMCptOmegaMinus) {
+      f2dHistAsMCptProtonMCptOmegaMinus = new TH2F( "f2dHistAsMCptProtonMCptOmegaMinus", "Proton MC pt vs Omega- MC pt", 100, 0., 10., 100, 0., 10.);
+      fListHistCascade->Add(f2dHistAsMCptProtonMCptOmegaMinus);
+    }
+    if (!f2dHistAsMCptAntiprotonMCptOmegaPlus) {
+      f2dHistAsMCptAntiprotonMCptOmegaPlus = new TH2F( "f2dHistAsMCptAntiprotonMCptOmegaPlus", "Antiproton MC pt vs Omega+ MC pt", 100, 0., 10., 100, 0., 10.);
+      fListHistCascade->Add(f2dHistAsMCptAntiprotonMCptOmegaPlus);
+    }
+
+    if (! fHistV0toXiCosineOfPointingAngle) {
+        fHistV0toXiCosineOfPointingAngle = new TH1F("fHistV0toXiCosineOfPointingAngle", "Cos. of V0 Ptng Angl / Xi vtx ;Cos(V0 Point. Angl / Xi vtx); Counts", 200, 0.95, 1.0001);
+        fListHistCascade->Add(fHistV0toXiCosineOfPointingAngle);
+    }
+
+    if (! fHistV0CosineOfPointingAnglevsPtXi) {
+        fHistV0CosineOfPointingAnglevsPtXi = new TH2F("fHistV0CosineOfPointingAnglevsPtXi", "Cos. of V0 Ptng Angl vs cascade Pt ;Cos(V0 Point. Angl); Counts",100, 0., 10., 200, 0.95, 1.0001);
+        fListHistCascade->Add(fHistV0CosineOfPointingAnglevsPtXi);
+    }
+    if (! fHistV0CosineOfPointingAnglevsPtOmega) {
+        fHistV0CosineOfPointingAnglevsPtOmega = new TH2F("fHistV0CosineOfPointingAnglevsPtOmega", "Cos. of V0 Ptng Angl vs cascade Pt ;Cos(V0 Point. Angl); Counts",100, 0., 10., 200, 0.95, 1.0001);
+        fListHistCascade->Add(fHistV0CosineOfPointingAnglevsPtOmega);
+    }
+
   
                 // - PID container
-if(! fCFContCascadePIDAsXiMinus&&fUseCFCont)  {
+if(! fCFContCascadePIDAsXiMinus)  {
   const        Int_t  lNbSteps      =  7 ;
   const Int_t  lNbVariables  =  4 ;
 
@@ -1224,8 +1404,7 @@ if(! fCFContCascadePIDAsXiMinus&&fUseCFCont)  {
   lNbBinsPerVar[0] = 100;
   lNbBinsPerVar[1] = 800;
   lNbBinsPerVar[2] = 22;
-  if(fCollidingSystems) lNbBinsPerVar[3] = 11;
-  else lNbBinsPerVar[3] = 100;
+  lNbBinsPerVar[3] = 11;
 
   fCFContCascadePIDAsXiMinus = new AliCFContainer("fCFContCascadePIDAsXiMinus","Pt_{cascade} Vs M_{#Xi^{-} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
   
@@ -1233,15 +1412,12 @@ if(! fCFContCascadePIDAsXiMinus&&fUseCFCont)  {
   fCFContCascadePIDAsXiMinus->SetBinLimits(0,   0.0  ,  10.0 );        // Pt(Cascade)
   fCFContCascadePIDAsXiMinus->SetBinLimits(1,   1.2  ,   2.0 );        // Xi Effective mass
   fCFContCascadePIDAsXiMinus->SetBinLimits(2,  -1.1  ,   1.1 );        // Rapidity
-  if(fCollidingSystems) {
-    Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
-    for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
-    lBinLim3[0] = 0.0;
-    lBinLim3[1] = 5.0;
-    lBinLim3[2] = 10.0;
-    fCFContCascadePIDAsXiMinus->SetBinLimits(3,  lBinLim3 );       // Centrality
-  } else
-    fCFContCascadePIDAsXiMinus->SetBinLimits(3, 0.0, 250.0  );     // SPD tracklet multiplicity
+  Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
+  for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
+  lBinLim3[0] = 0.0;
+  lBinLim3[1] = 5.0;
+  lBinLim3[2] = 10.0;
+  fCFContCascadePIDAsXiMinus->SetBinLimits(3,  lBinLim3 );       // Centrality
   
   // Setting the step title : one per PID case
   fCFContCascadePIDAsXiMinus->SetStepTitle(0, "No PID");
@@ -1256,14 +1432,13 @@ if(! fCFContCascadePIDAsXiMinus&&fUseCFCont)  {
   fCFContCascadePIDAsXiMinus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
   fCFContCascadePIDAsXiMinus->SetVarTitle(1, "M( #Lambda , #pi^{-} ) (GeV/c^{2})");
   fCFContCascadePIDAsXiMinus->SetVarTitle(2, "Y_{#Xi}");
-  if (fCollidingSystems) fCFContCascadePIDAsXiMinus->SetVarTitle(3, "Centrality");
-  else fCFContCascadePIDAsXiMinus->SetVarTitle(3, "SPD tracklets Multiplicity");
+  fCFContCascadePIDAsXiMinus->SetVarTitle(3, "Centrality");
 
   fListHistCascade->Add(fCFContCascadePIDAsXiMinus);
   
 }
 
-if(! fCFContCascadePIDAsXiPlus&&fUseCFCont)  {
+if(! fCFContCascadePIDAsXiPlus)  {
   const        Int_t  lNbSteps      =  7 ;
   const Int_t  lNbVariables  =  4 ;
 
@@ -1272,8 +1447,7 @@ if(! fCFContCascadePIDAsXiPlus&&fUseCFCont)  {
   lNbBinsPerVar[0] = 100;
   lNbBinsPerVar[1] = 800;
   lNbBinsPerVar[2] = 22;
-  if(fCollidingSystems) lNbBinsPerVar[3] = 11;
-  else lNbBinsPerVar[3] = 100;
+  lNbBinsPerVar[3] = 11;
   
   fCFContCascadePIDAsXiPlus = new AliCFContainer("fCFContCascadePIDAsXiPlus","Pt_{cascade} Vs M_{#Xi^{+} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
   
@@ -1282,15 +1456,12 @@ if(! fCFContCascadePIDAsXiPlus&&fUseCFCont)  {
   fCFContCascadePIDAsXiPlus->SetBinLimits(0,   0.0  ,  10.0 ); // Pt(Cascade)
   fCFContCascadePIDAsXiPlus->SetBinLimits(1,   1.2  ,   2.0 ); // Xi Effective mass
   fCFContCascadePIDAsXiPlus->SetBinLimits(2,  -1.1  ,   1.1 ); // Rapidity
-  if(fCollidingSystems) {
-    Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
-    for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
-    lBinLim3[0] = 0.0;
-    lBinLim3[1] = 5.0;
-    lBinLim3[2] = 10.0;
-        fCFContCascadePIDAsXiPlus->SetBinLimits(3,lBinLim3);     // Centrality
-  } else
-       fCFContCascadePIDAsXiPlus->SetBinLimits(3, 0.0, 250.0  );     // SPD tracklets Multiplicity 
+  Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
+  for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
+  lBinLim3[0] = 0.0;
+  lBinLim3[1] = 5.0;
+  lBinLim3[2] = 10.0;
+  fCFContCascadePIDAsXiPlus->SetBinLimits(3,lBinLim3);     // Centrality
   
   // Setting the step title : one per PID case
   fCFContCascadePIDAsXiPlus->SetStepTitle(0, "No PID");
@@ -1305,15 +1476,14 @@ if(! fCFContCascadePIDAsXiPlus&&fUseCFCont)  {
   fCFContCascadePIDAsXiPlus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
   fCFContCascadePIDAsXiPlus->SetVarTitle(1, "M( #Lambda , #pi^{+} ) (GeV/c^{2})");
   fCFContCascadePIDAsXiPlus->SetVarTitle(2, "Y_{#Xi}");
-  if(fCollidingSystems) fCFContCascadePIDAsXiPlus->SetVarTitle(3, "Centrality");
-  else fCFContCascadePIDAsXiPlus->SetVarTitle(3, "SPD tracklets Multiplicity");
+  fCFContCascadePIDAsXiPlus->SetVarTitle(3, "Centrality");
   
   fListHistCascade->Add(fCFContCascadePIDAsXiPlus);
   
 }
 
 
-if(! fCFContCascadePIDAsOmegaMinus&&fUseCFCont)  {
+if(! fCFContCascadePIDAsOmegaMinus)  {
   const        Int_t  lNbSteps      =  7 ;
   const Int_t  lNbVariables  =  4 ;
 
@@ -1322,9 +1492,7 @@ if(! fCFContCascadePIDAsOmegaMinus&&fUseCFCont)  {
   lNbBinsPerVar[0] = 100;
   lNbBinsPerVar[1] = 1000;
   lNbBinsPerVar[2] = 22;
-  if(fCollidingSystems) lNbBinsPerVar[3] = 11;
-  else lNbBinsPerVar[3] = 100;
+  lNbBinsPerVar[3] = 11;
   
   fCFContCascadePIDAsOmegaMinus = new AliCFContainer("fCFContCascadePIDAsOmegaMinus","Pt_{cascade} Vs M_{#Omega^{-} candidates} Vs Y_{#Omega}", lNbSteps, lNbVariables, lNbBinsPerVar );
   
@@ -1333,15 +1501,12 @@ if(! fCFContCascadePIDAsOmegaMinus&&fUseCFCont)  {
   fCFContCascadePIDAsOmegaMinus->SetBinLimits(0,   0.0  ,  10.0 );     // Pt(Cascade)
   fCFContCascadePIDAsOmegaMinus->SetBinLimits(1,   1.5  ,   2.5 );     // Omega Effective mass
   fCFContCascadePIDAsOmegaMinus->SetBinLimits(2,  -1.1  ,   1.1 );     // Rapidity
-  if(fCollidingSystems) {
-    Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
-    for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
-    lBinLim3[0] = 0.0;
-    lBinLim3[1] = 5.0;
-    lBinLim3[2] = 10.0;
-        fCFContCascadePIDAsOmegaMinus->SetBinLimits(3,lBinLim3);     // Centrality
-  } else
-       fCFContCascadePIDAsOmegaMinus->SetBinLimits(3, 0.0, 250.0  );     // SPD tracklets multiplicity 
+  Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
+  for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
+  lBinLim3[0] = 0.0;
+  lBinLim3[1] = 5.0;
+  lBinLim3[2] = 10.0;
+  fCFContCascadePIDAsOmegaMinus->SetBinLimits(3,lBinLim3);     // Centrality
   
   // Setting the step title : one per PID case
   fCFContCascadePIDAsOmegaMinus->SetStepTitle(0, "No PID");
@@ -1356,15 +1521,13 @@ if(! fCFContCascadePIDAsOmegaMinus&&fUseCFCont)  {
   fCFContCascadePIDAsOmegaMinus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
   fCFContCascadePIDAsOmegaMinus->SetVarTitle(1, "M( #Lambda , K^{-} ) (GeV/c^{2})");
   fCFContCascadePIDAsOmegaMinus->SetVarTitle(2, "Y_{#Omega}");
-  if(fCollidingSystems) fCFContCascadePIDAsOmegaMinus->SetVarTitle(3, "Centrality");
-  else fCFContCascadePIDAsOmegaMinus->SetVarTitle(3, "SPD tracklet multiplicity");
-  
+  fCFContCascadePIDAsOmegaMinus->SetVarTitle(3, "Centrality");
   
   fListHistCascade->Add(fCFContCascadePIDAsOmegaMinus);
   
 }
 
-if(! fCFContCascadePIDAsOmegaPlus&&fUseCFCont)  {
+if(! fCFContCascadePIDAsOmegaPlus)  {
   const        Int_t  lNbSteps      =  7 ;
   const Int_t  lNbVariables  =  4 ;
 
@@ -1373,8 +1536,7 @@ if(! fCFContCascadePIDAsOmegaPlus&&fUseCFCont)  {
   lNbBinsPerVar[0] = 100;
   lNbBinsPerVar[1] = 1000;
   lNbBinsPerVar[2] = 22;
-  if(fCollidingSystems) lNbBinsPerVar[3] = 11;
-  else lNbBinsPerVar[3] = 100;
+  lNbBinsPerVar[3] = 11;
   
   fCFContCascadePIDAsOmegaPlus = new AliCFContainer("fCFContCascadePIDAsOmegaPlus","Pt_{cascade} Vs M_{#Omega^{+} candidates} Vs Y_{#Omega}", lNbSteps, lNbVariables, lNbBinsPerVar );
   
@@ -1383,15 +1545,12 @@ if(! fCFContCascadePIDAsOmegaPlus&&fUseCFCont)  {
   fCFContCascadePIDAsOmegaPlus->SetBinLimits(0,   0.0  ,  10.0 );      // Pt(Cascade)
   fCFContCascadePIDAsOmegaPlus->SetBinLimits(1,   1.5  ,   2.5 );      // Omega Effective mass
   fCFContCascadePIDAsOmegaPlus->SetBinLimits(2,  -1.1  ,   1.1 );      // Rapidity
-  if(fCollidingSystems) {
-    Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
-    for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
-    lBinLim3[0] = 0.0;
-    lBinLim3[1] = 5.0;
-    lBinLim3[2] = 10.0;
-        fCFContCascadePIDAsOmegaPlus->SetBinLimits(3,lBinLim3);     // Centrality
-  } else
-       fCFContCascadePIDAsOmegaPlus->SetBinLimits(3, 0.0, 250.0  );     // SPD tracklet multiplicity
+  Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
+  for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++)   lBinLim3[i]  = (Double_t)(i-1)*10.;
+  lBinLim3[0] = 0.0;
+  lBinLim3[1] = 5.0;
+  lBinLim3[2] = 10.0;
+  fCFContCascadePIDAsOmegaPlus->SetBinLimits(3,lBinLim3);     // Centrality
   
   // Setting the step title : one per PID case
   fCFContCascadePIDAsOmegaPlus->SetStepTitle(0, "No PID");
@@ -1406,91 +1565,87 @@ if(! fCFContCascadePIDAsOmegaPlus&&fUseCFCont)  {
   fCFContCascadePIDAsOmegaPlus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
   fCFContCascadePIDAsOmegaPlus->SetVarTitle(1, "M( #Lambda , K^{+} ) (GeV/c^{2})");
   fCFContCascadePIDAsOmegaPlus->SetVarTitle(2, "Y_{#Omega}");
-  if(fCollidingSystems) fCFContCascadePIDAsOmegaPlus->SetVarTitle(3, "Centrality");
-  else fCFContCascadePIDAsOmegaPlus->SetVarTitle(3,"SPD tracklet multiplicity");
+  fCFContCascadePIDAsOmegaPlus->SetVarTitle(3, "Centrality");
   
   fListHistCascade->Add(fCFContCascadePIDAsOmegaPlus);
   
 }
 
 // Part 3 : Towards the optimisation of topological selections -------
-if(! fCFContAsCascadeCuts&&fUseCFCont){
+if(! fCFContAsCascadeCuts){
    
        // Container meant to store all the relevant distributions corresponding to the cut variables.
-        //          - FIXME optimize number of bins
         //          - NB overflow/underflow of variables on which we want to cut later should be 0!!!
 
   const        Int_t  lNbSteps      =  4 ;
-  const Int_t  lNbVariables  =  19 ;
+  const Int_t  lNbVariables  =  22 ;
   
   //array for the number of bins in each dimension :
   Int_t lNbBinsPerVar[lNbVariables] = {0};
   lNbBinsPerVar[0]  = 100;
   lNbBinsPerVar[1]  = 126;
-  lNbBinsPerVar[2]  = 100;
-  lNbBinsPerVar[3]  = 221;
+  lNbBinsPerVar[2]  = 24;
+  lNbBinsPerVar[3]  = 220;
   lNbBinsPerVar[4]  = 30;
   lNbBinsPerVar[5]  = 50;
   
-  lNbBinsPerVar[6]  = 100;
-  lNbBinsPerVar[7]  = 43;
+  lNbBinsPerVar[6]  = 101;
+  lNbBinsPerVar[7]  = 102;
   lNbBinsPerVar[8]  = 101;
   lNbBinsPerVar[9]  = 26;
   lNbBinsPerVar[10] = 26;
   
-  lNbBinsPerVar[11] = 150; // 2-MeV/c2 bins
-  lNbBinsPerVar[12] = 120; // 2-MeV/c2 bins
+  lNbBinsPerVar[11] = 150; // 1-MeV/c2 bins
+  lNbBinsPerVar[12] = 120;  
   
   lNbBinsPerVar[13] = 100;
   
-  lNbBinsPerVar[14] = 44; // 0.05 in rapidity units
-  lNbBinsPerVar[15] = 44; // 0.05 in rapidity units
+  lNbBinsPerVar[14] = 110; // 0.02 unit of y per bin 
+  lNbBinsPerVar[15] = 110; 
   
-  lNbBinsPerVar[16] = 20;
+  lNbBinsPerVar[16] = 2;
  
-
-  if(fCollidingSystems) lNbBinsPerVar[17] = 11;
-  else lNbBinsPerVar[17] = 100;
+  lNbBinsPerVar[17] = 11;
   lNbBinsPerVar[18] = 100;
-   
-   
+
+  lNbBinsPerVar[19] = 112; // Proper time of cascade
+  lNbBinsPerVar[20] = 112; // Proper time of V0 
+  lNbBinsPerVar[21] = 112; // Distance V0-Xi in the transverse plane 
+  
   fCFContAsCascadeCuts = new AliCFContainer("fCFContAsCascadeCuts","Cut Container for Asso. Cascades", lNbSteps, lNbVariables, lNbBinsPerVar );
   
   //0
   fCFContAsCascadeCuts->SetBinLimits(0, 0., 2.);                 // DcaXiDaughters : 0.0 to 2.0
   //1
    Double_t *lBinLim1  = new Double_t[ lNbBinsPerVar[1]+1 ];
-   for(Int_t i=0; i< lNbBinsPerVar[1];i++)   lBinLim1[i]  = (Double_t)0.0   + (5.  - 0.0 )/(lNbBinsPerVar[1]-1)  * (Double_t)i ;
+   lBinLim1[0] = 0.0;
+   lBinLim1[1] = 0.03;
+   for(Int_t i=2; i< lNbBinsPerVar[1];i++)   lBinLim1[i]  = (Double_t)0.03   + (5.  - 0.03 )/(lNbBinsPerVar[1]-2)  * (Double_t)(i-1) ;
    lBinLim1[ lNbBinsPerVar[1]  ] = 100.0;
    fCFContAsCascadeCuts -> SetBinLimits(1,  lBinLim1 );
   delete [] lBinLim1;                                            // DcaBachToPrimVertexXi : 0.0 to 0.5
   //2
-  fCFContAsCascadeCuts->SetBinLimits(2, .99, 1.);                // XiCosineOfPointingAngle : 0.99 to 1.0        
+  fCFContAsCascadeCuts->SetBinLimits(2, .9988, 1.);                // XiCosineOfPointingAngle : 0.99 to 1.0        
   //3
-  Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
-  for(Int_t i=0; i< lNbBinsPerVar[3];i++)   lBinLim3[i] = (Double_t)0.0 + (5.  - 0.0 )/(lNbBinsPerVar[3]-1) * (Double_t)i ;
-  lBinLim3[ lNbBinsPerVar[3]  ] = 110.0;
-  fCFContAsCascadeCuts -> SetBinLimits(3,  lBinLim3 );            // XiRadius : 0.0 to 4.0
-  delete [] lBinLim3;
+  fCFContAsCascadeCuts -> SetBinLimits(3, 0., 110. );            // XiRadius : 0.0 to 110.0
 
   //4
   fCFContAsCascadeCuts->SetBinLimits(4, 1.1, 1.13);               // InvMassLambdaAsCascDghter
   //5
   fCFContAsCascadeCuts->SetBinLimits(5, 0., 2.);                  // DcaV0DaughtersXi : 0.0 to 2.0        
   //6
-  fCFContAsCascadeCuts->SetBinLimits(6, 0.99, 1.);                // V0CosineOfPointingAngleXi : 0.98 to 1.0      
+  fCFContAsCascadeCuts->SetBinLimits(6, 0.95, 1.0005);                // V0CosineOfPointingAngleXi : 0.99 to 1.0      // temporary test 1.1
   //7
   Double_t *lBinLim7  = new Double_t[ lNbBinsPerVar[7]+1 ];
-  for(Int_t i=0; i< lNbBinsPerVar[7]-2;i++)   lBinLim7[i]  = (Double_t)0.0   + (20.  - 0.0 )/(lNbBinsPerVar[7]-3)  * (Double_t)i ;
-  lBinLim7[ lNbBinsPerVar[7]-2] = 100.0;
+  for(Int_t i=0; i< lNbBinsPerVar[7]-1;i++)   lBinLim7[i]  = (Double_t)0.0   + (100.  - 0.0 )/(lNbBinsPerVar[7]-2)  * (Double_t)i ;
   lBinLim7[ lNbBinsPerVar[7]-1] = 200.0;
   lBinLim7[ lNbBinsPerVar[7]] = 1000.0;
   fCFContAsCascadeCuts -> SetBinLimits(7,  lBinLim7 );
-  delete [] lBinLim7;                                             // V0RadiusXi : 0.0 to 20.0      
+  delete [] lBinLim7;                                             // V0RadiusXi : 0.0 to 1000.0      
   //8
   Double_t *lBinLim8  = new Double_t[ lNbBinsPerVar[8]+1 ];
-        for(Int_t i=0; i< lNbBinsPerVar[8];i++)   lBinLim8[i]  = (Double_t)0.0   + (0.4  - 0.0 )/(lNbBinsPerVar[8]-1)  * (Double_t)i ;
-        lBinLim8[ lNbBinsPerVar[8]  ] = 100.0;
+  for(Int_t i=0; i< lNbBinsPerVar[8];i++)   lBinLim8[i]  = (Double_t)0.0   + (0.4  - 0.0 )/(lNbBinsPerVar[8]-1)  * (Double_t)i ;
+  lBinLim8[ lNbBinsPerVar[8]  ] = 100.0;
   fCFContAsCascadeCuts -> SetBinLimits(8,  lBinLim8 );
   delete [] lBinLim8;                                             // DcaV0ToPrimVertexXi : 0. to 0.4     
   //9
@@ -1511,21 +1666,22 @@ if(! fCFContAsCascadeCuts&&fUseCFCont){
   fCFContAsCascadeCuts->SetBinLimits(13, 0.0, 10.0);             // XiTransvMom 
   fCFContAsCascadeCuts->SetBinLimits(14, -1.1, 1.1);              // Y(Xi)
   fCFContAsCascadeCuts->SetBinLimits(15, -1.1, 1.1);              // Y(Omega)
-  fCFContAsCascadeCuts->SetBinLimits(16, -10.0, 10.0);            // BestPrimaryVtxPosZ
-  if (fCollidingSystems) {
-    Double_t *lBinLim17  = new Double_t[ lNbBinsPerVar[17]+1 ];
-    for(Int_t i=3; i< lNbBinsPerVar[17]+1;i++)   lBinLim17[i]  = (Double_t)(i-1)*10.;
-    lBinLim17[0] = 0.0;
-    lBinLim17[1] = 5.0;
-    lBinLim17[2] = 10.0;
-    fCFContAsCascadeCuts -> SetBinLimits(17,  lBinLim17 );       // Centrality
-    delete [] lBinLim17;
-    fCFContAsCascadeCuts->SetBinLimits(18, 0.0, 6000.0);         // ESD track multiplicity 
-  } else {
-    fCFContAsCascadeCuts->SetBinLimits(17, 0.0, 250.0);          // SPDTrackletsMultiplicity
-    fCFContAsCascadeCuts->SetBinLimits(18, 0.0, 200.0);          // ESD track multiplicity
-  }
-
+  fCFContAsCascadeCuts->SetBinLimits(16, 0.0, 2.0);               // Natural or injected  
+  Double_t *lBinLim17  = new Double_t[ lNbBinsPerVar[17]+1 ];
+  for(Int_t i=3; i< lNbBinsPerVar[17]+1;i++)   lBinLim17[i]  = (Double_t)(i-1)*10.;
+  lBinLim17[0] = 0.0;
+  lBinLim17[1] = 5.0;
+  lBinLim17[2] = 10.0;
+  fCFContAsCascadeCuts -> SetBinLimits(17,  lBinLim17 );       // Centrality
+  delete [] lBinLim17;
+  fCFContAsCascadeCuts->SetBinLimits(18, 0.0, 6000.0);         // ESD track multiplicity 
+  Double_t *lBinLim19  = new Double_t[ lNbBinsPerVar[19]+1 ];
+  for(Int_t i=0; i< lNbBinsPerVar[19];i++)   lBinLim19[i]  = (Double_t)-1.   + (110.  + 1.0 )/(lNbBinsPerVar[19]-1)  * (Double_t)i ;
+  lBinLim19[ lNbBinsPerVar[19]  ] = 2000.0;
+  fCFContAsCascadeCuts->SetBinLimits(19, lBinLim19);           // Proper time cascade 
+  fCFContAsCascadeCuts->SetBinLimits(20, lBinLim19);           // Proper time V0
+  fCFContAsCascadeCuts->SetBinLimits(21, lBinLim19);           // Distance V0-Xi in the transverse plane
+  delete [] lBinLim19;
   // Setting the number of steps : one for each cascade species (Xi-, Xi+ and Omega-, Omega+)
   fCFContAsCascadeCuts->SetStepTitle(0, "#Xi^{-} candidates associated to MC");
   fCFContAsCascadeCuts->SetStepTitle(1, "#bar{#Xi}^{+} candidates associated to MC");
@@ -1554,12 +1710,15 @@ if(! fCFContAsCascadeCuts&&fUseCFCont){
   fCFContAsCascadeCuts->SetVarTitle(14, "Y_{MC}(Xi)");
   fCFContAsCascadeCuts->SetVarTitle(15, "Y_{MC}(Omega)");
   
-  fCFContAsCascadeCuts->SetVarTitle(16, "Z-position(BestPrimVtx) (cm)");
+  fCFContAsCascadeCuts->SetVarTitle(16, "Injected or natural particles");
   
-  if (fCollidingSystems) fCFContAsCascadeCuts->SetVarTitle(17, "Centrality");
-  else fCFContAsCascadeCuts->SetVarTitle(17, "SPD tracklets Multiplicity");
+  fCFContAsCascadeCuts->SetVarTitle(17, "Centrality");
   fCFContAsCascadeCuts->SetVarTitle(18, "ESD track multiplicity");
   
+  fCFContAsCascadeCuts->SetVarTitle(19, "Proper time cascade");
+  fCFContAsCascadeCuts->SetVarTitle(20, "Proper time V0"); 
+  fCFContAsCascadeCuts->SetVarTitle(21, "Distance V0-Xi in the transverse plane");
+
   fListHistCascade->Add(fCFContAsCascadeCuts);
 }
 
@@ -1572,8 +1731,7 @@ PostData(1, fListHistCascade);
 
 
 //________________________________________________________________________
-void AliAnalysisTaskCheckPerformanceCascadePbPb::UserExec(Option_t *) 
-{
+void AliAnalysisTaskCheckPerformanceCascadePbPb::UserExec(Option_t *) {
        
   // Main loop
   // Called for each event
@@ -1582,194 +1740,243 @@ void AliAnalysisTaskCheckPerformanceCascadePbPb::UserExec(Option_t *)
        AliAODEvent *lAODevent = 0x0;
        AliMCEvent  *lMCevent  = 0x0; 
        AliStack    *lMCstack  = 0x0; 
-       Int_t ncascades = -1;
-       
+
+        TClonesArray *arrayMC = 0;
+
+        if (!fPIDResponse) {
+          AliError("Cannot get pid response");
+          return;
+        }
+
        
   // Connect to the InputEvent 
-  // After these lines, we should have an ESD/AOD event + the number of cascades in it.
+  // After these lines, we should have an ESD/AOD event 
                
        if (fAnalysisType == "ESD") {
-               lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
-               if (!lESDevent) {
-                       Printf("ERROR: lESDevent not available \n");
-                       cout << "Name of the file with pb :" <<  CurrentFileName() << endl;  // or AliAnalysisTaskSE::CurrentFileName()
-                       return;
-               }
+
+         lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
+         if (!lESDevent) {
+           Printf("ERROR: lESDevent not available \n");
+           cout << "Name of the file with pb :" <<  CurrentFileName() << endl;  
+           return;
+         }
+          lMCevent = MCEvent();
+          if (!lMCevent) {
+            Printf("ERROR: Could not retrieve MC event \n");
+            cout << "Name of the file with pb :" <<  CurrentFileName() << endl;
+            return;
+          }
+
+          lMCstack = lMCevent->Stack();
+          if (!lMCstack) {
+            Printf("ERROR: Could not retrieve MC stack \n");
+            cout << "Name of the file with pb :" <<  CurrentFileName() << endl;
+            return;
+          }
+
+          if (fkRerunV0CascVertexers) { // relaunch V0 and Cascade vertexer
+           /* lESDevent->ResetCascades();
+            lESDevent->ResetV0s();
+
+            AliV0vertexer lV0vtxer;
+            AliCascadeVertexer lCascVtxer;
+
+            lV0vtxer.SetCuts(fV0Sels);
+            lCascVtxer.SetCuts(fCascSels);
+
+            lV0vtxer.Tracks2V0vertices(lESDevent);
+            lCascVtxer.V0sTracks2CascadeVertices(lESDevent);*/
+          }
+
        } else if (fAnalysisType == "AOD") {  
-               lAODevent = dynamic_cast<AliAODEvent*>( InputEvent() ); 
-               if (!lAODevent) {
-                       Printf("ERROR: lAODevent not available \n");
-                       cout << "Name of the file with pb :" <<  CurrentFileName() << endl;
-                       return;
-               }
-       }
-       
 
-       lMCevent = MCEvent();
-       if (!lMCevent) {
-               Printf("ERROR: Could not retrieve MC event \n");
-               cout << "Name of the file with pb :" <<  CurrentFileName() << endl;     
-               return;
-       }
+         lAODevent = dynamic_cast<AliAODEvent*>( InputEvent() ); 
+         if (!lAODevent) {
+           Printf("ERROR: lAODevent not available \n");
+           cout << "Name of the file with pb :" <<  CurrentFileName() << endl;
+           return;
+         }
 
-       lMCstack = lMCevent->Stack();
-       if (!lMCstack) {
-               Printf("ERROR: Could not retrieve MC stack \n");
-               cout << "Name of the file with pb :" <<  CurrentFileName() << endl;
-               return;
-               
-       }
+          arrayMC = (TClonesArray*) lAODevent->GetList()->FindObject(AliAODMCParticle::StdBranchName());
+          if (!arrayMC) AliFatal("Error: MC particles branch not found!\n");
 
-        
-   // Temporary way : AOD awareness of the code to be developed  FIXME
-   if (fAnalysisType == "AOD") return;
-   
-  //-------------------------------------------------
-  // 1 - Cascade vertexer (ESD)
-        if (fkRerunV0CascVertexers) { // relaunch V0 and Cascade vertexers, not test in PbPb 
-                if(fAnalysisType == "ESD" ){
-//                         lESDevent->ResetCascades();
-//                         lESDevent->ResetV0s();
-// 
-//                         AliV0vertexer lV0vtxer;
-//                         AliCascadeVertexer lCascVtxer;
-// 
-//                         lV0vtxer.SetDefaultCuts(fV0Sels);
-//                         lCascVtxer.SetDefaultCuts(fCascSels);
-// 
-//                         lV0vtxer.Tracks2V0vertices(lESDevent);
-//                         lCascVtxer.V0sTracks2CascadeVertices(lESDevent);
-                }
-        }
+       } else {
+
+          Printf("Analysis type (ESD or AOD) not specified \n");
+          return;
 
+        }
+       
 
   //------------------------------------------------
-  // 2 - Preparing the general info about of the event = prim. Vtx + magnetic field (ESD)
-  
+  // 1 - Preparing the general info about of the event = prim. Vtx + magnetic field (ESD)
+        Double_t lBestPrimaryVtxPos[3]   = {-100.0, -100.0, -100.0};
+        Double_t lMagneticField    = -10.; 
+        Int_t ncascades = -1;
+        // Primary tracks from ESD/AOD
+        Float_t lPrimaryTrackMultiplicity= -1.;
+
+        AliCentrality* centrality = 0x0;
+        AliESDVZERO* esdV0 = 0x0;
+        AliAODVZERO* aodV0 = 0x0;
+        Float_t multV0A = 0.;
+        Float_t multV0C = 0.;
+
+        Int_t   nNumberOfMCPrimaries     = -1;
 
-//      if(fAnalysisType == "ESD" ){
+        Int_t nTrackMultiplicity = (InputEvent())->GetNumberOfTracks();
 
-        // Magnetic field
-                const Double_t lMagneticField = lESDevent->GetMagneticField( );
+        if (fAnalysisType == "ESD" ) {
 
         // Prim vertex
-                const AliESDVertex *lPrimaryTrackingVtx = lESDevent->GetPrimaryVertexTracks();  // get the vtx stored in ESD found with tracks
-                const AliESDVertex *lPrimarySPDVtx      = lESDevent->GetPrimaryVertexSPD();     // get the vtx stored in ESD found with SPD tracklets
-
-                const AliESDVertex *lPrimaryBestVtx     = lESDevent->GetPrimaryVertex();
-                        // get the best primary vertex available for the event
-                        // As done in AliCascadeVertexer, we keep the one which is the best one available.
-                        // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
-                        Double_t lBestPrimaryVtxPos[3]   = {-100.0, -100.0, -100.0};
-                lPrimaryBestVtx->GetXYZ( lBestPrimaryVtxPos );
-
-                // FIXME : quality cut on the z-position of the prim vertex.
-                if(fkQualityCutZprimVtxPos) {
-                        if(TMath::Abs(lBestPrimaryVtxPos[2]) > fVtxRange ) { 
-                                AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !"); 
-                                PostData(1, fListHistCascade); 
-                                return;
-                        }
-                }
-                // FIXME : quality selection regarding pile-up rejection 
-                if(fkRejectEventPileUp) {
-                        if(lESDevent->IsPileupFromSPD() ){// minContributors=3, minZdist=0.8, nSigmaZdist=3., nSigmaDiamXY=2., nSigmaDiamZ=5.  -> see http://alisoft.cern.ch/viewvc/trunk/STEER/AliESDEvent.h?root=AliRoot&r1=41914&r2=42199&pathrev=42199
-                                AliWarning("Pb / Event tagged as pile-up by SPD... return !"); 
-                                PostData(1, fListHistCascade); 
-                                return; 
-                        }
-                }
-                // FIXME : remove TPC-only primary vertex : retain only events with tracking + SPD vertex
-                if(fkQualityCutNoTPConlyPrimVtx) {
-                        if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingVtx->GetStatus() ){
-                                AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
-                                PostData(1, fListHistCascade); 
-                                return;
-                        }
-                }
-
-  // Centrality determination
-  AliESDVZERO* esdV0 = lESDevent->GetVZEROData();
-  Float_t multV0A=esdV0->GetMTotV0A();
-  Float_t multV0C=esdV0->GetMTotV0C();
-
-  AliCentrality *centrality = lESDevent->GetCentrality();
-  //  Printf("Centrality percentile V0M for this event %f)\n",  centrality->GetCentralityPercentile("V0M"));
-  Float_t lcentrality = centrality->GetCentralityPercentile(fCentrEstimator.Data());
-  if (lcentrality==100.) lcentrality=99.9;
-/*  if (lcentrality==-1||lcentrality>=90.) {
-    PostData(1, fListHistCascade);
-    return;
-  }
-*/
-/*  if (!(centrality->IsEventInCentralityClass(fCentrLowLim,fCentrUpLim,fCentrEstimator.Data()))) {
-    PostData(1, fListHistCascade);
-    return; 
-  }
-*/
-  fV0Ampl->Fill(multV0A+multV0C);
+          const AliESDVertex *lPrimaryTrackingVtx = lESDevent->GetPrimaryVertexTracks();  // get the vtx stored in ESD found with tracks
+          const AliESDVertex *lPrimarySPDVtx      = lESDevent->GetPrimaryVertexSPD();     // get the vtx stored in ESD found with SPD tracklets
+
+          const AliESDVertex *lPrimaryBestVtx     = lESDevent->GetPrimaryVertex();
+          // get the best primary vertex available for the event
+          // As done in AliCascadeVertexer, we keep the one which is the best one available.
+          // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
+          lPrimaryBestVtx->GetXYZ( lBestPrimaryVtxPos );
+
+          // FIXME : quality selection regarding pile-up rejection, not in the Cascade task 
+          if (fkRejectEventPileUp) {
+            if (lESDevent->IsPileupFromSPD() ) {// minContributors=3, minZdist=0.8, nSigmaZdist=3., nSigmaDiamXY=2., nSigmaDiamZ=5.  -> see http://alisoft.cern.ch/viewvc/trunk/STEER/AliESDEvent.h?root=AliRoot&r1=41914&r2=42199&pathrev=42199
+              AliWarning("Pb / Event tagged as pile-up by SPD... return !"); 
+              PostData(1, fListHistCascade); 
+              return; 
+            }
+          }
+          // FIXME : remove TPC-only primary vertex : retain only events with tracking + SPD vertex
+          if (fkQualityCutNoTPConlyPrimVtx) {
+            if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingVtx->GetStatus() ){
+              AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
+              PostData(1, fListHistCascade); 
+              return;
+            }
+          }
+
+          lMagneticField = lESDevent->GetMagneticField();
+
+          ncascades = lESDevent->GetNumberOfCascades();
+
+          lPrimaryTrackMultiplicity = fESDtrackCuts->CountAcceptedTracks(lESDevent);
+
+          //        nNumberOfMCPrimaries       = lMCstack->GetNprimary();
+          nNumberOfMCPrimaries = lMCstack->GetNtrack(); // MN: this stack->GetNtrack(); has to be used to check primaries because in HIJING decay products of D and B mesons are also primaries and produced in HIJING during transport, however this is not the number of primaries!
+          // Centrality determination
+          esdV0 = lESDevent->GetVZEROData();
+          multV0A = esdV0->GetMTotV0A();
+          multV0C = esdV0->GetMTotV0C();
+
+          centrality = lESDevent->GetCentrality();
+
+        } else if (fAnalysisType == "AOD") {
+
+          const AliAODVertex *lPrimaryBestAODVtx = lAODevent->GetPrimaryVertex();
+          if (!lPrimaryBestAODVtx) {
+            AliWarning("No prim. vertex in AOD... return!");
+            PostData(1, fListHistCascade);
+            return;
+          }
+
+          // get the best primary vertex available for the event GetVertex(0)
+          // This one will be used for next calculations (DCA essentially)
+          lPrimaryBestAODVtx->GetXYZ( lBestPrimaryVtxPos );
+
+          lMagneticField = lAODevent->GetMagneticField();
+
+          ncascades = lAODevent->GetNumberOfCascades();
+
+          lPrimaryTrackMultiplicity = 0.;
+          for (Int_t itrack = 0; itrack<nTrackMultiplicity; itrack++) {
+            AliAODTrack* track = lAODevent->GetTrack(itrack);
+            if (track->TestFilterBit(AliAODTrack::kTrkGlobal)) lPrimaryTrackMultiplicity++;
+          }
+
+          nNumberOfMCPrimaries = arrayMC->GetEntries();
+
+
+          centrality = lAODevent->GetCentrality();
+          aodV0 = lAODevent->GetVZEROData();
+          multV0A=aodV0->GetMTotV0A();
+          multV0C=aodV0->GetMTotV0C();
+
+        } 
+
+        if (fkQualityCutZprimVtxPos) { // Should be already in the centrality selection
+          if (TMath::Abs(lBestPrimaryVtxPos[2]) > fVtxRange ) {
+            AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
+            PostData(1, fListHistCascade);
+            return;
+          }
+        }
 
-//      }// if ESD
-        
-        
-  //   cout << "Name of the accessed file :" <<  fInputHandler->GetTree()->GetCurrentFile()->GetName() << endl;
+      //  Printf("Centrality percentile V0M for this event %f)\n",  centrality->GetCentralityPercentile("V0M"));
 
-  //   cout << "Tree characteristics ..." << endl;
-  //   fInputHandler->GetTree()->Print("toponly");
-  //   fInputHandler->GetTree()->GetBranch("PrimaryVertex")->Print();
-  //   fInputHandler->GetTree()->GetBranch("SPDVertex")->Print();
 
+        Float_t lcentrality = centrality->GetCentralityPercentile(fCentrEstimator.Data());
+        if (lcentrality<fCentrLowLim||lcentrality>=fCentrUpLim) {
+          PostData(1, fListHistCascade);
+          return;
+        }
 
+        if (nNumberOfMCPrimaries < 1) {
+          PostData(1, fListHistCascade);
+          return; // should be useless because we require vertex and centrality selection 
+        }
 
-  // ---------------------------------------------------------------
-  // - Initialisation of the part dedicated to cascade vertices
+        fV0Ampl->Fill(multV0A+multV0C);
 
-  if(fAnalysisType == "ESD")            ncascades = lESDevent->GetNumberOfCascades();
-  else if(fAnalysisType == "AOD")       ncascades = lAODevent->GetNumberOfCascades();
-       
-  
-  Int_t   nNumberOfMCPrimaries       = -1;
-  Int_t   nMCPrimariesInAcceptance   =  0;
-  Int_t   nTrackPrimaryMultiplicity  = -1;
-  
-  
-//        nNumberOfMCPrimaries       = lMCstack->GetNprimary(); 
-        nNumberOfMCPrimaries = lMCstack->GetNtrack(); // MN: this stack->GetNtrack(); has to be used because in HIJING decay products of D and B mesons are also primaries and produced in HIJING during transport  
-         
-        nTrackPrimaryMultiplicity  = fESDtrackCuts->CountAcceptedTracks(lESDevent);
+        // Best vertex distribution
+        fHistBestVtxX->Fill(lBestPrimaryVtxPos[0]);
+        fHistBestVtxY->Fill(lBestPrimaryVtxPos[1]);
+        fHistBestVtxZ->Fill(lBestPrimaryVtxPos[2]);
+        fHistEvtsInCentralityBinsvsNtracks->Fill(lcentrality,lPrimaryTrackMultiplicity);
 
-        fHistEvtsInCentralityBinsvsNtracks->Fill(lcentrality,nTrackPrimaryMultiplicity);
+        fHistMCTrackMultiplicity->Fill( nNumberOfMCPrimaries );  // MN: neutral particles included and also not physical ones
 
-        if(nNumberOfMCPrimaries < 1) return;
-    
-        fHistMCTrackMultiplicity->Fill( nNumberOfMCPrimaries );  // MN: neutral particles included and also not physical ones 
-    
+        //cout << "Name of the accessed file :" <<  CurrentFileName() << endl;
+
+        Int_t   nMCPrimariesInAcceptance   =  0;
 //_____________________________________________________________________________        
 // Part 1 - Loop over the MC primaries 
         
-    for (Int_t iCurrentLabelStack = 0; iCurrentLabelStack < nNumberOfMCPrimaries; iCurrentLabelStack++) {// This is the beginning of the loop on primaries
+    for (Int_t iCurrentLabelStack = 0; iCurrentLabelStack < nNumberOfMCPrimaries; iCurrentLabelStack++) {
+
+      if (fAnalysisType == "ESD") {
 
         TParticle* lCurrentParticle = 0x0; 
                    lCurrentParticle = lMCstack->Particle( iCurrentLabelStack );
-        if(!lCurrentParticle) {
-                Printf("MC Primary loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
-                continue;
+        if (!lCurrentParticle) {
+          Printf("MC Primary loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
+          continue;
         }
   
         if (!lMCstack->IsPhysicalPrimary(iCurrentLabelStack)) continue;
         
        
-        if( TMath::Abs( lCurrentParticle->Eta() ) > 0.8 ) continue;    
-        nMCPrimariesInAcceptance++;  
-    }
+        if ( TMath::Abs( lCurrentParticle->Eta() ) > 0.8 ) continue;    
+
+      } else if (fAnalysisType == "AOD") {
+
+        AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(iCurrentLabelStack);
+        if(TMath::Abs(partMC->Eta())>0.8) continue;  
+
+      }
+
+      nMCPrimariesInAcceptance++;
+   }
     
-    f2dHistRecoMultVsMCMult->Fill( nTrackPrimaryMultiplicity, nMCPrimariesInAcceptance );  // MN: neutral are included
+   f2dHistRecoMultVsMCMult->Fill( lPrimaryTrackMultiplicity, nMCPrimariesInAcceptance );  // MN: neutral are included
 
 
    // For proton
    
-/*   for (Int_t iCurrentLabelStack = 0; iCurrentLabelStack < nNumberOfMCPrimaries; iCurrentLabelStack++) 
-       {// This is the begining of the loop on primaries, for protons
+/*   for (Int_t iCurrentLabelStack = 0; iCurrentLabelStack < nNumberOfMCPrimaries; iCurrentLabelStack++) {
           
        TParticle* lCurrentParticle = lMCstack->Particle( iCurrentLabelStack );
        if(!lCurrentParticle){
@@ -1783,7 +1990,7 @@ void AliAnalysisTaskCheckPerformanceCascadePbPb::UserExec(Option_t *)
 
        if( lCurrentParticle->GetPdgCode() == -2212 )
                fHistEtaGenAntiProton->Fill( lCurrentParticle->Eta() );
-       }// end loop over primary proton
+      }// end loop over primary proton
 */   
 
       
@@ -1801,9 +2008,15 @@ void AliAnalysisTaskCheckPerformanceCascadePbPb::UserExec(Option_t *)
        
        
        TH1F *lHistEtaGenCasc         = 0;      
-       TH3D *l3dHistGenPtVsGenYGenvsCent = 0;
-        TH3D *l3dHistGenPtVsGenYGenvsNtracks = 0;
-       TH1F *lHistThetaGenCasc       = 0;
+       TH3D *l3dHistGenPtVsGenYvsCentNat = 0;
+        TH3D *l3dHistGenPtVsGenYvsNtracksNat = 0;
+        TH3D *l3dHistGenPtVsGenYvsCentInj = 0;
+        TH3D *l3dHistGenPtVsGenYvsNtracksInj = 0;
+        TH3D *l3dHistGenPtVsGenctauvsYNat = 0;
+        TH3D *l3dHistGenPtVsGenctauvsYInj = 0; 
+
+       TH1F *lHistThetaGenCascNat    = 0;
+        TH1F *lHistThetaGenCascInj    = 0;
        TH2D *l2dHistGenPtVsGenYFdbl  = 0;
        TH1F *lHistThetaLambda        = 0;
        TH1F *lHistThetaBach          = 0;
@@ -1815,10 +2028,13 @@ void AliAnalysisTaskCheckPerformanceCascadePbPb::UserExec(Option_t *)
         Int_t ncascperev = 0; 
         Int_t ncascperevtot = 0;
 
+        Int_t endOfHijingEvent = -1;
 
 for (Int_t iCascType = 1; iCascType < 5; iCascType++) { 
   ncascperev = 0;
   ncascperevtot = 0;
+
+  endOfHijingEvent = -1;
        
   switch (iCascType) {
     case 1: // Xi-
@@ -1830,10 +2046,16 @@ for (Int_t iCascType = 1; iCascType < 5; iCascType++) {
                
                // any Xi-
         lHistEtaGenCasc        = fHistEtaGenCascXiMinus;
-         l3dHistGenPtVsGenYGenvsCent = f3dHistGenPtVsGenYGenvsCentXiMinus;
-         l3dHistGenPtVsGenYGenvsNtracks = f3dHistGenPtVsGenYGenvsNtracksXiMinus;       
+         l3dHistGenPtVsGenYvsCentNat = f3dHistGenPtVsGenYvsCentXiMinusNat;
+         l3dHistGenPtVsGenYvsNtracksNat = f3dHistGenPtVsGenYvsNtracksXiMinusNat;
+         l3dHistGenPtVsGenYvsCentInj = f3dHistGenPtVsGenYvsCentXiMinusInj;
+         l3dHistGenPtVsGenYvsNtracksInj = f3dHistGenPtVsGenYvsNtracksXiMinusInj;
+         l3dHistGenPtVsGenctauvsYNat = f3dHistGenPtVsGenctauvsYXiMinusNat;
+         l3dHistGenPtVsGenctauvsYInj = f3dHistGenPtVsGenctauvsYXiMinusInj;
+
                // cascades generated within acceptance (cut in pt + theta)
-        lHistThetaGenCasc      = fHistThetaGenCascXiMinus;
+        lHistThetaGenCascNat      = fHistThetaGenCascXiMinusNat;
+         lHistThetaGenCascInj      = fHistThetaGenCascXiMinusInj;
         l2dHistGenPtVsGenYFdbl = f2dHistGenPtVsGenYFdblXiMinus;
         lHistThetaLambda       = fHistThetaLambdaXiMinus;
         lHistThetaBach         = fHistThetaBachXiMinus;
@@ -1853,13 +2075,16 @@ for (Int_t iCascType = 1; iCascType < 5; iCascType++) {
         
                // any Xi+
         lHistEtaGenCasc        = fHistEtaGenCascXiPlus;
-        //l2dHistGenPtVsGenYGen  = f2dHistGenPtVsGenYGenXiPlus;
-         l3dHistGenPtVsGenYGenvsCent = f3dHistGenPtVsGenYGenvsCentXiPlus;
-         l3dHistGenPtVsGenYGenvsNtracks = f3dHistGenPtVsGenYGenvsNtracksXiPlus;
-
+         l3dHistGenPtVsGenYvsCentNat = f3dHistGenPtVsGenYvsCentXiPlusNat;
+         l3dHistGenPtVsGenYvsNtracksNat = f3dHistGenPtVsGenYvsNtracksXiPlusNat;
+         l3dHistGenPtVsGenYvsCentInj = f3dHistGenPtVsGenYvsCentXiPlusInj;
+         l3dHistGenPtVsGenYvsNtracksInj = f3dHistGenPtVsGenYvsNtracksXiPlusInj;
+         l3dHistGenPtVsGenctauvsYNat = f3dHistGenPtVsGenctauvsYXiPlusNat;
+         l3dHistGenPtVsGenctauvsYInj = f3dHistGenPtVsGenctauvsYXiPlusInj;
        
                // cascades generated within acceptance (cut in pt + theta)      
-        lHistThetaGenCasc      = fHistThetaGenCascXiPlus;
+        lHistThetaGenCascNat      = fHistThetaGenCascXiPlusNat;
+         lHistThetaGenCascInj      = fHistThetaGenCascXiPlusInj;
         l2dHistGenPtVsGenYFdbl = f2dHistGenPtVsGenYFdblXiPlus;
         lHistThetaLambda       = fHistThetaLambdaXiPlus;
         lHistThetaBach         = fHistThetaBachXiPlus;
@@ -1879,13 +2104,16 @@ for (Int_t iCascType = 1; iCascType < 5; iCascType++) {
         
                // any Omega-
         lHistEtaGenCasc        = fHistEtaGenCascOmegaMinus;            
-//      l2dHistGenPtVsGenYGen  = f2dHistGenPtVsGenYGenOmegaMinus;      
-         l3dHistGenPtVsGenYGenvsCent = f3dHistGenPtVsGenYGenvsCentOmegaMinus;
-         l3dHistGenPtVsGenYGenvsNtracks = f3dHistGenPtVsGenYGenvsNtracksOmegaMinus;
-
+         l3dHistGenPtVsGenYvsCentNat = f3dHistGenPtVsGenYvsCentOmegaMinusNat;
+         l3dHistGenPtVsGenYvsNtracksNat = f3dHistGenPtVsGenYvsNtracksOmegaMinusNat;
+         l3dHistGenPtVsGenYvsCentInj = f3dHistGenPtVsGenYvsCentOmegaMinusInj;
+         l3dHistGenPtVsGenYvsNtracksInj = f3dHistGenPtVsGenYvsNtracksOmegaMinusInj; 
+         l3dHistGenPtVsGenctauvsYNat = f3dHistGenPtVsGenctauvsYOmegaMinusNat;
+         l3dHistGenPtVsGenctauvsYInj = f3dHistGenPtVsGenctauvsYOmegaMinusInj;
        
                // cascades generated within acceptance (cut in pt + theta)
-        lHistThetaGenCasc      = fHistThetaGenCascOmegaMinus;
+        lHistThetaGenCascNat      = fHistThetaGenCascOmegaMinusNat;
+         lHistThetaGenCascInj      = fHistThetaGenCascOmegaMinusInj;
         l2dHistGenPtVsGenYFdbl = f2dHistGenPtVsGenYFdblOmegaMinus;
         lHistThetaLambda       = fHistThetaLambdaOmegaMinus;
         lHistThetaBach         = fHistThetaBachOmegaMinus;
@@ -1905,12 +2133,17 @@ for (Int_t iCascType = 1; iCascType < 5; iCascType++) {
         
                // any Omega+
         lHistEtaGenCasc        = fHistEtaGenCascOmegaPlus;
-         l3dHistGenPtVsGenYGenvsCent = f3dHistGenPtVsGenYGenvsCentOmegaPlus;
-         l3dHistGenPtVsGenYGenvsNtracks = f3dHistGenPtVsGenYGenvsNtracksOmegaPlus;
+         l3dHistGenPtVsGenYvsCentNat = f3dHistGenPtVsGenYvsCentOmegaPlusNat;
+         l3dHistGenPtVsGenYvsNtracksNat = f3dHistGenPtVsGenYvsNtracksOmegaPlusNat;
+         l3dHistGenPtVsGenYvsCentInj = f3dHistGenPtVsGenYvsCentOmegaPlusInj;
+         l3dHistGenPtVsGenYvsNtracksInj = f3dHistGenPtVsGenYvsNtracksOmegaPlusInj;
+         l3dHistGenPtVsGenctauvsYNat = f3dHistGenPtVsGenctauvsYOmegaPlusNat;
+         l3dHistGenPtVsGenctauvsYInj = f3dHistGenPtVsGenctauvsYOmegaPlusInj;
 
                
                // cascades generated within acceptance (cut in pt + theta)
-        lHistThetaGenCasc      = fHistThetaGenCascOmegaPlus;
+        lHistThetaGenCascNat      = fHistThetaGenCascOmegaPlusNat;
+         lHistThetaGenCascInj      = fHistThetaGenCascOmegaPlusInj;
         l2dHistGenPtVsGenYFdbl = f2dHistGenPtVsGenYFdblOmegaPlus;
         lHistThetaLambda       = fHistThetaLambdaOmegaPlus;
         lHistThetaBach         = fHistThetaBachOmegaPlus;
@@ -1924,173 +2157,386 @@ for (Int_t iCascType = 1; iCascType < 5; iCascType++) {
   }// end switch cascade
 
 
-  for (Int_t iCurrentLabelStack = 0; iCurrentLabelStack < nNumberOfMCPrimaries; iCurrentLabelStack++) {// This is the beginning of the loop on primaries
-      
-        TParticle* lCurrentParticle = 0x0; 
-                  lCurrentParticle = lMCstack->Particle( iCurrentLabelStack );
-       if (!lCurrentParticle) {
-          Printf("Cascade loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
+  for (Int_t iCurrentLabelStack = 0; iCurrentLabelStack < nNumberOfMCPrimaries; iCurrentLabelStack++) {
+
+    Bool_t kIsNaturalPart = kFALSE;
+    Double_t partEnergy = 0.;
+    Double_t partPz     = 0.;
+    Double_t partEta    = 0.;
+    Double_t partTheta  = 0.;
+    Double_t partP      = 0.;
+    Double_t partPt     = 0.;
+    Double_t partVx     = 0.;
+    Double_t partVy     = 0.;
+    Double_t partVz     = 0.;
+    Double_t bacVx      = 0.;
+    Double_t bacVy      = 0.;
+    Double_t bacVz      = 0.;    
+    Double_t partMass   = 0.;
+
+    if ( fAnalysisType == "ESD" ) {      
+      TParticle* lCurrentParticle = 0x0; 
+                 lCurrentParticle = lMCstack->Particle( iCurrentLabelStack );
+      if (!lCurrentParticle) {
+        Printf("Cascade loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
+        continue;
+      }
+      if (!lMCstack->IsPhysicalPrimary(iCurrentLabelStack)) continue; 
+      if (lCurrentParticle->GetPdgCode() == lPdgCodeCasc) {  // Here !
+        //cout << "Xi- within loop " << iCurrentLabelStack << "/ " << nNumberOfMCPrimaries << endl;
+               
+       // -  Xi level ... _____________________________________________________________
+       TParticle* xiMC = 0x0;
+                  xiMC = lCurrentParticle;
+       if (!xiMC) {
+         Printf("MC TParticle pointer to Cascade = 0x0 ! Skip ...");
          continue;
        }
-       if (!lMCstack->IsPhysicalPrimary(iCurrentLabelStack)) continue; 
-       if (lCurrentParticle->GetPdgCode() == lPdgCodeCasc) {  // Here !
-               //cout << "Xi- within loop " << iCurrentLabelStack << "/ " << nNumberOfMCPrimaries << endl;
-               
-               // -  Xi level ... _____________________________________________________________
-               TParticle* xiMC = 0x0;
-                          xiMC = lCurrentParticle;
-               if(!xiMC){
-                       Printf("MC TParticle pointer to Cascade = 0x0 ! Skip ...");
-                       continue;
-               } // redundant?
-
-                // To select injected/bio particles Bool_t AliMCEvent::IsFromBGEvent(Int_t index) 
-
-               ncascperevtot++;        
-               // Fill the first histos : = any generated Xi, not necessarily within the acceptance
-               Double_t lRapXiMC = 0.5*TMath::Log((xiMC->Energy() + xiMC->Pz()) / (xiMC->Energy() - xiMC->Pz() +1.e-13));
-               
-               lHistEtaGenCasc         ->Fill( xiMC->Eta() );   
-               l3dHistGenPtVsGenYGenvsCent   ->Fill( xiMC->Pt(), lRapXiMC, lcentrality );
-                l3dHistGenPtVsGenYGenvsNtracks->Fill( xiMC->Pt(), lRapXiMC, nTrackPrimaryMultiplicity );       
-                       
-               
-               
-               // Check the emission of particle stays within the acceptance of the detector (cut in theta)
-               if (fApplyAccCut) {if( xiMC->Theta() < TMath::Pi()/4.0  ||    xiMC->Theta() > 3.0*TMath::Pi()/4.0 ) continue;}  
-               if( xiMC->GetNDaughters() != 2) continue;
-               if( xiMC->GetDaughter(0) < 0 )  continue;
-               if( xiMC->GetDaughter(1) < 0 )  continue;
+
+        kIsNaturalPart = lMCevent->IsFromBGEvent(iCurrentLabelStack); 
+        if (!kIsNaturalPart) { 
+          if (!(lCurrentParticle->GetFirstMother()<0)) kIsNaturalPart = kTRUE; // because there are primaries (ALICE definition) not produced in the collision   
+        }
+        partEnergy = xiMC->Energy();
+        partPz = xiMC->Pz();
+        partEta = xiMC->Eta();
+        partPt = xiMC->Pt();
+        partP = xiMC->P();
+        partTheta = xiMC->Theta();
+        partMass = xiMC->GetMass();
+        partVx = xiMC->Vx();
+        partVy = xiMC->Vy();
+        partVz = xiMC->Vz();
+
+        if (xiMC->GetDaughter(0)>=0) {
+          TParticle *mcBach = lMCstack->Particle(xiMC->GetDaughter(0));
+          if (mcBach) {
+            bacVx  = mcBach->Vx();
+            bacVy  = mcBach->Vy();
+            bacVz  = mcBach->Vz();
+          }
+        }
+      } else continue;
+    } else if ( fAnalysisType == "AOD" ) {
+
+      AliAODMCParticle *lCurrentParticleaod = (AliAODMCParticle*) arrayMC->At(iCurrentLabelStack);
+      if (!lCurrentParticleaod) {
+        Printf("Cascade loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
+        continue;
+      }
+      
+      if (endOfHijingEvent==-1) {  // For injected MC: determine where HIJING event ends 
+        if ((lCurrentParticleaod->GetStatus()==21)||
+            ( (lCurrentParticleaod->GetPdgCode() == 443) &&
+              (lCurrentParticleaod->GetMother() == -1)   &&
+              (lCurrentParticleaod->GetDaughter(0) ==  (iCurrentLabelStack+1)))) {
+         
+          endOfHijingEvent = iCurrentLabelStack; 
+
+        }
+      }  
+
+      if (!lCurrentParticleaod->IsPhysicalPrimary()) continue;  
+      if (!(lCurrentParticleaod->PdgCode() == lPdgCodeCasc)) continue;
+
+       
+      kIsNaturalPart = kTRUE;
+      if ((iCurrentLabelStack>=endOfHijingEvent)&&(endOfHijingEvent!=-1)&&(lCurrentParticleaod->GetMother()<0)) kIsNaturalPart = kFALSE; 
+
+      partEnergy = lCurrentParticleaod->E();
+      partPz = lCurrentParticleaod->Pz();
+      partEta = lCurrentParticleaod->Eta();
+      partP = lCurrentParticleaod->P();
+      partPt = lCurrentParticleaod->Pt();
+      partTheta = lCurrentParticleaod->Theta();
+      partMass = lCurrentParticleaod->M(); // FIXME not sure this works, seems not implemented
+      partVx = lCurrentParticleaod->Xv();
+      partVy = lCurrentParticleaod->Yv();
+      partVz = lCurrentParticleaod->Zv();
+
+      if (lCurrentParticleaod->GetDaughter(0)>=0) {
+        AliAODMCParticle *mcBach = (AliAODMCParticle*) arrayMC->At(lCurrentParticleaod->GetDaughter(0));
+        if (mcBach) {
+          bacVx  = mcBach->Xv();
+          bacVy  = mcBach->Yv();
+          bacVz  = mcBach->Zv();
+        }
+      }
+
+    }
+      
+    ncascperevtot++;   
+       // Fill the first histos : = any generated Xi, not necessarily within the acceptance
+    Double_t lRapXiMC = 0.5*TMath::Log((partEnergy + partPz) / (partEnergy - partPz +1.e-13));
+        // Calculate proper time
+    Double_t lctau = TMath::Sqrt((partVx-bacVx)*(partVx-bacVx)+(partVy-bacVy)*(partVy-bacVy)+(partVz-bacVz)*(partVz-bacVz));
+    if (partP!=0.)    lctau = lctau*partMass/partP;
+    else lctau = -1.;
+
+    Double_t lRadToDeg = 180.0/TMath::Pi();
+
+    // Fill the first histos : = any generated Xi, not necessarily within the acceptance               
+    lHistEtaGenCasc    ->Fill( partEta );       
+
+    if (kIsNaturalPart) {
+      l3dHistGenPtVsGenYvsCentNat   ->Fill( partPt, lRapXiMC, lcentrality );
+      l3dHistGenPtVsGenYvsNtracksNat->Fill( partPt, lRapXiMC, lPrimaryTrackMultiplicity );     
+      l3dHistGenPtVsGenctauvsYNat->Fill( partPt, lctau, lRapXiMC );
+      lHistThetaGenCascNat       ->Fill( lRadToDeg * partTheta );
+    } else {
+      l3dHistGenPtVsGenYvsCentInj   ->Fill( partPt, lRapXiMC, lcentrality );
+      l3dHistGenPtVsGenYvsNtracksInj->Fill( partPt, lRapXiMC, lPrimaryTrackMultiplicity );
+      l3dHistGenPtVsGenctauvsYInj->Fill( partPt, lctau, lRapXiMC );
+      lHistThetaGenCascInj       ->Fill( lRadToDeg * partTheta );
+    }
+
+    // Check the emission of particle stays within the acceptance of the detector (cut in theta)
+    if (fApplyAccCut) { if( partTheta < TMath::Pi()/4.0 || partTheta > 3.0*TMath::Pi()/4.0 ) continue;}        
+
+    Float_t lambdaTheta = 0.;
+    Float_t bacTheta    = 0.;
+    Float_t dghtBarV0Theta = 0.;
+    Float_t dghtMesV0Theta = 0.;
+    Float_t bacPt       = 0.;
+    Float_t dghtBarV0Pt = 0.;
+    Float_t dghtMesV0Pt = 0.;
+
+
+    if ( fAnalysisType == "ESD" ) { 
+      TParticle* xiMC = lMCstack->Particle( iCurrentLabelStack ); 
+      if ( xiMC->GetNDaughters() != 2) continue;
+      if ( xiMC->GetDaughter(0) < 0 )  continue;
+      if ( xiMC->GetDaughter(1) < 0 )  continue;
                
-                       TParticle* lDght0ofXi = lMCstack->Particle(  xiMC->GetDaughter(0) );
-                       TParticle* lDght1ofXi = lMCstack->Particle(  xiMC->GetDaughter(1) );
+      TParticle* lDght0ofXi = lMCstack->Particle(  xiMC->GetDaughter(0) );
+      TParticle* lDght1ofXi = lMCstack->Particle(  xiMC->GetDaughter(1) );
                        
-               TParticle* lLambda = 0;
-               TParticle* lBach   = 0;
+      TParticle* lLambda = 0;
+      TParticle* lBach   = 0;
                        
-               // Xi - Case 1
-                       if(     lDght0ofXi->GetPdgCode() == lPdgCodeLambda   &&  // Here !
-                               lDght1ofXi->GetPdgCode() == lPdgCodeBach ){      // Here !
+      // Xi - Case 1
+      if ( lDght0ofXi->GetPdgCode() == lPdgCodeLambda   &&  // Here !
+           lDght1ofXi->GetPdgCode() == lPdgCodeBach ){      // Here !
                                
-                               lLambda = lDght0ofXi;
-                               lBach   = lDght1ofXi;
-                       }// end if dghter 0 = Lambda and    dghter 1 = Pi-  
+        lLambda = lDght0ofXi;
+        lBach   = lDght1ofXi;
+      }// end if dghter 0 = Lambda and    dghter 1 = Pi-  
                        
-               // Xi - Case 2
-                       else if( lDght0ofXi->GetPdgCode() == lPdgCodeBach  &&      // Here !
-                                lDght1ofXi->GetPdgCode() == lPdgCodeLambda ){     // Here !
+      // Xi - Case 2
+        else if ( lDght0ofXi->GetPdgCode() == lPdgCodeBach  &&      // Here !
+                  lDght1ofXi->GetPdgCode() == lPdgCodeLambda ){     // Here !
                        
-                               lBach   = lDght0ofXi;
-                               lLambda = lDght1ofXi;
-                       }//  end if dghter 0 = Pi-  and   dghter 1 = Lambda
+        lBach   = lDght0ofXi;
+       lLambda = lDght1ofXi;
+      }//  end if dghter 0 = Pi-  and   dghter 1 = Lambda
                        
-               // V0 otherwise - Case 3        
-                       else continue;
+       // V0 otherwise - Case 3        
+        else continue;
                
-                       // Check the emission of particle stays within the acceptance of the detector (cut in pt + theta)
-                       if (fApplyAccCut) { 
-                          if( lLambda->Theta() < TMath::Pi()/4.0  ||    lLambda->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
-                         if( lBach->Theta() < TMath::Pi()/4.0    ||    lBach->Theta() > 3.0*TMath::Pi()/4.0 )   continue;
-                         if( lBach->Pt() < 0.150 ) continue; //FIXME : maybe tuned for Xi but not for K- from Omega ...
-                        }              
+      // Check the emission of particle stays within the acceptance of the detector (cut in pt + theta)
+      if (fApplyAccCut) { 
+        if ( lLambda->Theta() < TMath::Pi()/4.0  ||    lLambda->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
+        if( lBach->Theta() < TMath::Pi()/4.0    ||    lBach->Theta() > 3.0*TMath::Pi()/4.0 )   continue;
+        if( lBach->Pt() < 0.150 ) continue; //FIXME : maybe tuned for Xi but not for K- from Omega ...
+      }                
                
-               // -  V0 level ... _____________________________________________________________
-               TParticle* lDghtBarV0 = 0;
-               TParticle* lDghtMesV0 = 0;
-               
-               if( lLambda->GetNDaughters() != 2 )  continue;
-               if( lLambda->GetDaughter(0) < 0 )    continue;
-               if( lLambda->GetDaughter(1) < 0 )    continue;
+      // -  V0 level ... _____________________________________________________________
+      TParticle* lDghtBarV0 = 0;
+      TParticle* lDghtMesV0 = 0;
+       
+      if( lLambda->GetNDaughters() != 2 )  continue;
+      if( lLambda->GetDaughter(0) < 0 )    continue;
+      if( lLambda->GetDaughter(1) < 0 )    continue;
                
                
-               TParticle* lDght0ofLambda = lMCstack->Particle(  lLambda->GetDaughter(0) );
-               TParticle* lDght1ofLambda = lMCstack->Particle(  lLambda->GetDaughter(1) );
+      TParticle* lDght0ofLambda = lMCstack->Particle(  lLambda->GetDaughter(0) );
+      TParticle* lDght1ofLambda = lMCstack->Particle(  lLambda->GetDaughter(1) );
                        
-               // V0 - Case 1
-                       if(     lDght0ofLambda->GetPdgCode() == lPdgCodeDghtBarV0 &&    // Here !
-                               lDght1ofLambda->GetPdgCode() == lPdgCodeDghtMesV0 ){    // Here !
+      // V0 - Case 1
+      if ( lDght0ofLambda->GetPdgCode() == lPdgCodeDghtBarV0 &&    // Here !
+           lDght1ofLambda->GetPdgCode() == lPdgCodeDghtMesV0 ) {    // Here !
                        
-                               lDghtBarV0 = lDght0ofLambda;
-                               lDghtMesV0 = lDght1ofLambda;
-                       }// end if dghter 0 = Proton  and   dghter 1 = Pi-  
+        lDghtBarV0 = lDght0ofLambda;
+        lDghtMesV0 = lDght1ofLambda;
+      }// end if dghter 0 = Proton  and   dghter 1 = Pi-  
                        
-               // V0 - Case 2
-                       else if( lDght0ofLambda->GetPdgCode() == lPdgCodeDghtMesV0  &&     // Here !
-                                lDght1ofLambda->GetPdgCode() == lPdgCodeDghtBarV0 ){      // Here !
+      // V0 - Case 2
+        else if ( lDght0ofLambda->GetPdgCode() == lPdgCodeDghtMesV0  &&     // Here !
+                  lDght1ofLambda->GetPdgCode() == lPdgCodeDghtBarV0 ) {      // Here !
                        
-                               lDghtMesV0 = lDght0ofLambda;
-                               lDghtBarV0 = lDght1ofLambda;
-                       }//  end if dghter 0 = Pi-  and   dghter 1 = proton
+        lDghtMesV0 = lDght0ofLambda;
+       lDghtBarV0 = lDght1ofLambda;
+      }//  end if dghter 0 = Pi-  and   dghter 1 = proton
                        
-               // V0 otherwise - Case 3
-                       else continue;
+      // V0 otherwise - Case 3
+        else continue;
        
                        
-                       // Check the emission of particle stays within the acceptance of the detector
-                       if (fApplyAccCut) { 
-                          if( lDghtBarV0->Theta() < TMath::Pi()/4.0  ||  lDghtBarV0->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
-                          if( lDghtMesV0->Theta() < TMath::Pi()/4.0  ||  lDghtMesV0->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
-                       
-                         if( lDghtBarV0->Pt() < 0.250 ) continue;
-                         if( lDghtMesV0->Pt() < 0.150 ) continue;
-                       }
-                       
-                       
-               // - Just to know which file is currently open : locate the file containing Xi 
-               //cout << "Name of the file containing generated Xi :" <<  fInputHandler->GetTree()->GetCurrentFile()->GetName() 
-               //                                                   <<  endl;  
-                       
-               Double_t lRadToDeg = 180.0/TMath::Pi(); 
-                       
-               // - Filling histos ... _________________________________________________________________       
-                       lHistThetaGenCasc       ->Fill( lRadToDeg * xiMC->Theta()  );
-                       l2dHistGenPtVsGenYFdbl  ->Fill( xiMC->Pt(), lRapXiMC );
-                       
-                       // - Fill theta histos for Lambda and Bach
-                       lHistThetaLambda        ->Fill( lRadToDeg * lLambda->Theta() );
-                       lHistThetaBach          ->Fill( lRadToDeg *   lBach->Theta() );
-                       
-                       // - Fill theta histos for V0 daughters
-                       lHistThetaBarDghter     ->Fill( lRadToDeg * lDghtBarV0->Theta() );
-                       lHistThetaMesDghter     ->Fill( lRadToDeg * lDghtMesV0->Theta() );
-                       
-                       // - Fill pt histos.
-                       lHistPtBach             ->Fill(      lBach->Pt() );
-                       lHistPtBarDghter        ->Fill( lDghtBarV0->Pt() );
-                       lHistPtMesDghter        ->Fill( lDghtMesV0->Pt() );
-                      //  if(iCascType == 1) Printf("Xi- current index = %n ", iCurrentLabelStack);
-                       ncascperev++;                   
-               }// end if current particle = Xi-
+      // Check the emission of particle stays within the acceptance of the detector
+      if (fApplyAccCut) { 
+        if( lDghtBarV0->Theta() < TMath::Pi()/4.0  ||  lDghtBarV0->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
+        if( lDghtMesV0->Theta() < TMath::Pi()/4.0  ||  lDghtMesV0->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
+       
+        if( lDghtBarV0->Pt() < 0.250 ) continue;
+        if( lDghtMesV0->Pt() < 0.150 ) continue;
+      }
+
+      lambdaTheta = lLambda->Theta();
+      bacTheta    = lBach->Theta();
+      dghtBarV0Theta = lDghtBarV0->Theta();                    
+      dghtMesV0Theta = lDghtMesV0->Theta();
+      bacPt       = lBach->Pt();
+      dghtBarV0Pt = lDghtBarV0->Pt();
+      dghtMesV0Pt = lDghtMesV0->Pt();
+                       
+    } else if ( fAnalysisType == "AOD") {
+
+      AliAODMCParticle *xiMC = (AliAODMCParticle*) arrayMC->At(iCurrentLabelStack);
+      if ( xiMC->GetNDaughters() != 2) continue;
+      if ( xiMC->GetDaughter(0) < 0 )  continue;
+      if ( xiMC->GetDaughter(1) < 0 )  continue;
+
+      AliAODMCParticle* lDght0ofXi = (AliAODMCParticle*) arrayMC->At(  xiMC->GetDaughter(0) );
+      AliAODMCParticle* lDght1ofXi = (AliAODMCParticle*) arrayMC->At(  xiMC->GetDaughter(1) );
+
+      AliAODMCParticle* lLambda = 0;
+      AliAODMCParticle* lBach   = 0;
+
+      // Xi - Case 1
+      if ( lDght0ofXi->PdgCode() == lPdgCodeLambda   &&  // Here !
+           lDght1ofXi->PdgCode() == lPdgCodeBach ){      // Here !
+
+        lLambda = lDght0ofXi;
+        lBach   = lDght1ofXi;
+      }// end if dghter 0 = Lambda and    dghter 1 = Pi-
+
+      // Xi - Case 2
+        else if ( lDght0ofXi->PdgCode() == lPdgCodeBach  &&      // Here !
+                  lDght1ofXi->PdgCode() == lPdgCodeLambda ){     // Here !
+
+        lBach   = lDght0ofXi;
+        lLambda = lDght1ofXi;
+      }//  end if dghter 0 = Pi-  and   dghter 1 = Lambda
+
+        // V0 otherwise - Case 3
+        else continue;
+
+      // Check the emission of particle stays within the acceptance of the detector (cut in pt + theta)
+      if (fApplyAccCut) {
+        if ( lLambda->Theta() < TMath::Pi()/4.0  ||    lLambda->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
+        if( lBach->Theta() < TMath::Pi()/4.0    ||    lBach->Theta() > 3.0*TMath::Pi()/4.0 )   continue;
+        if( lBach->Pt() < 0.150 ) continue; //FIXME : maybe tuned for Xi but not for K- from Omega ...
+      }
+
+      // -  V0 level ... _____________________________________________________________
+      AliAODMCParticle* lDghtBarV0 = 0;
+      AliAODMCParticle* lDghtMesV0 = 0;
+
+      if( lLambda->GetNDaughters() != 2 )  continue;
+      if( lLambda->GetDaughter(0) < 0 )    continue;
+      if( lLambda->GetDaughter(1) < 0 )    continue;
+
+
+      AliAODMCParticle* lDght0ofLambda = (AliAODMCParticle*) arrayMC->At(  lLambda->GetDaughter(0) );
+      AliAODMCParticle* lDght1ofLambda = (AliAODMCParticle*) arrayMC->At(  lLambda->GetDaughter(1) );
+
+      // V0 - Case 1
+      if ( lDght0ofLambda->PdgCode() == lPdgCodeDghtBarV0 &&    // Here !
+           lDght1ofLambda->PdgCode() == lPdgCodeDghtMesV0 ) {    // Here !
+
+        lDghtBarV0 = lDght0ofLambda;
+        lDghtMesV0 = lDght1ofLambda;
+      }// end if dghter 0 = Proton  and   dghter 1 = Pi-
+
+      // V0 - Case 2
+        else if ( lDght0ofLambda->PdgCode() == lPdgCodeDghtMesV0  &&     // Here !
+                  lDght1ofLambda->PdgCode() == lPdgCodeDghtBarV0 ) {      // Here !
+
+        lDghtMesV0 = lDght0ofLambda;
+        lDghtBarV0 = lDght1ofLambda;
+      }//  end if dghter 0 = Pi-  and   dghter 1 = proton
+
+      // V0 otherwise - Case 3
+        else continue;
+
+
+      // Check the emission of particle stays within the acceptance of the detector
+      if (fApplyAccCut) {
+        if( lDghtBarV0->Theta() < TMath::Pi()/4.0  ||  lDghtBarV0->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
+        if( lDghtMesV0->Theta() < TMath::Pi()/4.0  ||  lDghtMesV0->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
+
+        if( lDghtBarV0->Pt() < 0.250 ) continue;
+        if( lDghtMesV0->Pt() < 0.150 ) continue;
+      }
+
+
+      lambdaTheta = lLambda->Theta();
+      bacTheta    = lBach->Theta();
+      dghtBarV0Theta = lDghtBarV0->Theta();
+      dghtMesV0Theta = lDghtMesV0->Theta();
+      bacPt       = lBach->Pt();
+      dghtBarV0Pt = lDghtBarV0->Pt();
+      dghtMesV0Pt = lDghtMesV0->Pt();
+
+    }
+
+    // - Just to know which file is currently open : locate the file containing Xi
+                //cout << "Name of the file containing generated Xi :" <<  CurrentFileName()
+                //       
+    // - Filling histos for findable cascades... _________________________________________________________________
+
+    // - Fill theta histos for Lambda and Bach
+    lHistThetaLambda        ->Fill( lRadToDeg * lambdaTheta );
+    lHistThetaBach          ->Fill( lRadToDeg * bacTheta );
+
+    // - Fill theta histos for V0 daughters
+    lHistThetaBarDghter     ->Fill( lRadToDeg * dghtBarV0Theta );
+    lHistThetaMesDghter     ->Fill( lRadToDeg * dghtMesV0Theta );
+
+    // - Fill pt histos.
+    lHistPtBach             ->Fill( bacPt );
+    lHistPtBarDghter        ->Fill( dghtBarV0Pt );
+    lHistPtMesDghter        ->Fill( dghtMesV0Pt );
+    //  if(iCascType == 1) Printf("Xi- current index = %n ", iCurrentLabelStack);
+
+    l2dHistGenPtVsGenYFdbl  ->Fill( partPt, lRapXiMC );
+
+    ncascperev++;                      
+               
             
-     }// This is the end of the loop on primaries
+  }// This is the end of the loop on primaries
   
-     if(iCascType == 1) {
-       fHistnXiMinusPerEv->Fill(ncascperev);
-       fHistnXiMinusPerEvTot->Fill(ncascperevtot);
+  if (iCascType == 1) {
+    fHistnXiMinusPerEv->Fill(ncascperev);
+    fHistnXiMinusPerEvTot->Fill(ncascperevtot);
 //       Printf("N xi-tot = %n N xi-acc = %n\n", ncascperevtot, ncascperev);
-     }
-     if(iCascType == 2) {
-       fHistnXiPlusPerEv->Fill(ncascperev);
-       fHistnXiPlusPerEvTot->Fill(ncascperevtot);
-     }
-     if(iCascType == 3) {
-       fHistnOmegaMinusPerEv->Fill(ncascperev);
-       fHistnOmegaMinusPerEvTot->Fill(ncascperevtot);
-     }
-     if(iCascType == 4) {
-       fHistnOmegaPlusPerEv->Fill(ncascperev);
-       fHistnOmegaPlusPerEvTot->Fill(ncascperevtot);
-     }
-
-
+  }
+  if (iCascType == 2) {
+    fHistnXiPlusPerEv->Fill(ncascperev);
+    fHistnXiPlusPerEvTot->Fill(ncascperevtot);
+  }
+  if (iCascType == 3) {
+    fHistnOmegaMinusPerEv->Fill(ncascperev);
+    fHistnOmegaMinusPerEvTot->Fill(ncascperevtot);
+  }
+  if (iCascType == 4) {
+    fHistnOmegaPlusPerEv->Fill(ncascperev);
+    fHistnOmegaPlusPerEvTot->Fill(ncascperevtot);
+  }
 
    
 // - Re-initialisation of the local TH1F pointers
 lHistEtaGenCasc         = 0x0;
-l3dHistGenPtVsGenYGenvsCent = 0x0;
-l3dHistGenPtVsGenYGenvsNtracks = 0x0;
-
-lHistThetaGenCasc       = 0x0;
+l3dHistGenPtVsGenYvsCentNat = 0x0;
+l3dHistGenPtVsGenYvsNtracksNat = 0x0;
+l3dHistGenPtVsGenYvsCentInj = 0x0;
+l3dHistGenPtVsGenYvsNtracksInj = 0x0;
+l3dHistGenPtVsGenctauvsYNat = 0x0;
+l3dHistGenPtVsGenctauvsYInj = 0x0;
+
+lHistThetaGenCascNat    = 0x0;
+lHistThetaGenCascInj    = 0x0;
 l2dHistGenPtVsGenYFdbl  = 0x0;
 lHistThetaLambda        = 0x0;
 lHistThetaBach          = 0x0;
@@ -2112,8 +2558,104 @@ Int_t nAssoXiPlus = 0;
 Int_t nAssoOmegaMinus = 0;
 Int_t nAssoOmegaPlus = 0;
 
+
+Int_t lPosTPCClusters   = 0;
+Int_t lNegTPCClusters   = 0;
+Int_t lBachTPCClusters  = 0;
+
+
+// Double_t lChi2Xi         = -1. ;
+Double_t lDcaXiDaughters            = -1. ;
+Double_t lDcaBachToPrimVertexXi     = -1. ;
+Double_t lXiCosineOfPointingAngle   = -1. ;
+Double_t lPosXi[3]                  = { -1000.0, -1000.0, -1000.0 };
+Double_t lXiRadius                  = -1000. ;
+
+Double_t lInvMassLambdaAsCascDghter = 0.;
+Double_t lDcaV0DaughtersXi          = -1.;
+// Double_t lV0Chi2Xi               = -1. ;
+Double_t lV0CosineOfPointingAngleXi = -1.;
+Double_t lV0CosineOfPointingAngle   = -1.;
+Double_t lPosV0Xi[3]                = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
+Double_t lV0RadiusXi                = -1000.;
+Double_t lDcaV0ToPrimVertexXi       = -1.;
+Double_t lDcaPosToPrimVertexXi      = -1.;
+Double_t lDcaNegToPrimVertexXi      = -1.;
+
+Double_t lChargeXi                  = -1.;
+
+Double_t lV0mom = -1000.;
+Double_t lmcPt = -1.;         
+Double_t lmcRapCasc = -1.; 
+Double_t lmcEta = -1000.;     
+Double_t lmcTransvRadius = -1000.; 
+
+
+Double_t lrecoPt = -100.;     
+Double_t lrecoTransvRadius = -1000.; 
+
+Double_t lDeltaPhiMcReco = -1.;
+
+Double_t lmcPtPosV0Dghter = -100.;
+Double_t lmcPtNegV0Dghter = -100.;
+Double_t lrecoP = -100.;
+
+Double_t   lmcPtBach = -100.;
+
+Double_t cascadeMass = 0.;
+
+Int_t    lSPDTrackletsMultiplicity       = -1;
+
+
 for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Cascade loop
-               
+
+
+      Bool_t   lIsPosInXiProton      = kFALSE;
+      Bool_t   lIsPosInXiPion        = kFALSE;
+      Bool_t   lIsPosInOmegaProton   = kFALSE;
+      Bool_t   lIsPosInOmegaPion     = kFALSE;
+
+      Bool_t   lIsNegInXiProton      = kFALSE;
+      Bool_t   lIsNegInXiPion        = kFALSE;
+      Bool_t   lIsNegInOmegaProton   = kFALSE;
+      Bool_t   lIsNegInOmegaPion     = kFALSE;
+
+      Bool_t   lIsBachelorKaon       = kFALSE;
+      Bool_t   lIsBachelorPion       = kFALSE;
+
+      Bool_t   lIsBachelorKaonForTPC = kFALSE;
+      Bool_t   lIsBachelorPionForTPC = kFALSE;
+      Bool_t   lIsNegPionForTPC      = kFALSE;
+      Bool_t   lIsPosPionForTPC      = kFALSE;
+      Bool_t   lIsNegProtonForTPC    = kFALSE;
+      Bool_t   lIsPosProtonForTPC    = kFALSE;
+
+      // Combined PID
+      // Reasonable guess for the priors for the cascade track sample (e-, mu, pi, K, p)
+      Double_t lPriorsGuessXi[5]    = {0, 0, 2, 0, 1};
+      Double_t lPriorsGuessOmega[5] = {0, 0, 1, 1, 1};
+
+      Double_t ppionBach = 0.0, pkaonBach = 0.0;
+
+      Bool_t   lIsBachelorMCPiMinus  = kFALSE;
+      Bool_t   lIsBachelorMCPiPlus   = kFALSE;
+      Bool_t   lIsBachelorMCKMinus   = kFALSE;
+      Bool_t   lIsBachelorMCKPlus    = kFALSE;
+
+      Double_t lInvMassXiMinus    = 0.;
+      Double_t lInvMassXiPlus     = 0.;
+      Double_t lInvMassOmegaMinus = 0.;
+      Double_t lInvMassOmegaPlus  = 0.;
+
+      Bool_t lAssoXiMinus    = kFALSE;
+      Bool_t lAssoXiPlus     = kFALSE;
+      Bool_t lAssoOmegaMinus = kFALSE;
+      Bool_t lAssoOmegaPlus  = kFALSE;
+
+      Bool_t kIsNaturalPart = kFALSE;
+
+      if ( fAnalysisType == "ESD" ) {          
        AliESDcascade *xiESD = lESDevent->GetCascade(iXi);
        if (!xiESD) continue;
        
@@ -2142,9 +2684,9 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                continue;
        }
        
-        Int_t lPosTPCClusters   = pTrackXi->GetTPCNcls();
-        Int_t lNegTPCClusters   = nTrackXi->GetTPCNcls();
-        Int_t lBachTPCClusters  = bachTrackXi->GetTPCNcls(); 
+        lPosTPCClusters   = pTrackXi->GetTPCNcls();
+        lNegTPCClusters   = nTrackXi->GetTPCNcls();
+        lBachTPCClusters  = bachTrackXi->GetTPCNcls(); 
 
                 // FIXME : rejection of a poor quality tracks
         if(fkQualityCutTPCrefit){
@@ -2166,10 +2708,6 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
        // - Step II.2 : Info over reconstructed cascades
        //------------- 
        
-       Double_t lInvMassXiMinus    = 0.;
-       Double_t lInvMassXiPlus     = 0.;
-       Double_t lInvMassOmegaMinus = 0.;
-       Double_t lInvMassOmegaPlus  = 0.;
        
        Double_t lV0quality = 0.;
        
@@ -2208,25 +2746,6 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                xiESD->ChangeMassHypothesis(lV0quality , -3312);        // Back to "default" hyp.
        }
        
-        // Double_t lChi2Xi         = -1. ;
-        Double_t lDcaXiDaughters            = -1. ;
-        Double_t lDcaBachToPrimVertexXi     = -1. ;
-        Double_t lXiCosineOfPointingAngle   = -1. ;
-        Double_t lPosXi[3]                  = { -1000.0, -1000.0, -1000.0 };
-        Double_t lXiRadius                  = -1000. ;
-
-        Double_t lInvMassLambdaAsCascDghter = 0.;
-        Double_t lDcaV0DaughtersXi          = -1.;
-        // Double_t lV0Chi2Xi               = -1. ;
-        Double_t lV0CosineOfPointingAngleXi = -1.;
-        Double_t lPosV0Xi[3]                = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
-        Double_t lV0RadiusXi                = -1000.;
-        Double_t lDcaV0ToPrimVertexXi       = -1.;
-        Double_t lDcaPosToPrimVertexXi      = -1.;
-        Double_t lDcaNegToPrimVertexXi      = -1.;
-
-        Int_t    nTrackWithTPCrefitMultiplicity  =  0;
-        Int_t    lSPDTrackletsMultiplicity       = -1;
 
         //lChi2Xi                       = xiESD->GetChi2Xi();
         lDcaXiDaughters                 = xiESD->GetDcaXiDaughters();
@@ -2238,17 +2757,22 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                                                                                   lBestPrimaryVtxPos[1],
                                                                                   lBestPrimaryVtxPos[2] );
                                         // Take care : the best available vertex should be used (like in AliCascadeVertexer)
-        xiESD->GetXYZcascade( lPosXi[0],  lPosXi[1], lPosXi[2] );
-        lXiRadius                       = TMath::Sqrt( lPosXi[0]*lPosXi[0]  +  lPosXi[1]*lPosXi[1] );
+        xiESD->GetXYZcascade( lPosXi[0],  lPosXi[1], lPosXi[2] );  
         lInvMassLambdaAsCascDghter      = xiESD->GetEffMass();
                                         // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
         lDcaV0DaughtersXi               = xiESD->GetDcaV0Daughters();
         // lV0Chi2Xi                    = xiESD->GetChi2V0();
-        lV0CosineOfPointingAngleXi      = xiESD->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
-                                                                             lBestPrimaryVtxPos[1],
-                                                                             lBestPrimaryVtxPos[2] );
+        lV0CosineOfPointingAngleXi      = xiESD->GetV0CosineOfPointingAngle( lPosXi[0],    
+                                                                             lPosXi[1],
+                                                                             lPosXi[2] );
+
+        lV0CosineOfPointingAngle      = xiESD->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
+                                                                           lBestPrimaryVtxPos[1],
+                                                                           lBestPrimaryVtxPos[2]); 
+
+        //if (lV0CosineOfPointingAngleXi==1.) cout << "Cosine V0 PA wrt Xi pos ==1!" <<endl;
+        //else if (lV0CosineOfPointingAngleXi>1.) cout <<"Cosine V0 PA wrt Xi pos >1!"<<endl;
         xiESD->GetXYZ( lPosV0Xi[0],  lPosV0Xi[1], lPosV0Xi[2] );
-        lV0RadiusXi                     = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0]  +  lPosV0Xi[1]*lPosV0Xi[1] );
 
         lDcaV0ToPrimVertexXi            = xiESD->GetD( lBestPrimaryVtxPos[0],
                                                 lBestPrimaryVtxPos[1],
@@ -2262,39 +2786,8 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                                                                          lBestPrimaryVtxPos[1],
                                                                          lMagneticField  )     );
 
-                               // - II.Step 3' : extra-selection for cascade candidates
-                // Towards optimisation of AA selection
-      if (fkExtraSelections) {
-
-        // if(lChi2Xi > 2000) continue; // in AliCascadeVertexer
-        // if(lV0Chi2Xi > 2000) continue; // in AliV0vertexer
-
-        if (lDcaXiDaughters > 0.3) continue; // in AliCascadeVertexer
-        if (lXiCosineOfPointingAngle < 0.999 ) continue; // in AliCascadeVertexer
-        if (lDcaV0ToPrimVertexXi < 0.05) continue; // in AliCascadeVertexer
-        if (lDcaBachToPrimVertexXi < 0.03) continue; // in AliCascadeVertexer
-////      if (TMath::Abs(lInvMassLambdaAsCascDghter-1.11568) > 0.006 ) continue;  // in AliCascadeVertexer
-
-        if (lDcaV0DaughtersXi > 1.) continue; // in AliV0vertexer
-        if (lV0CosineOfPointingAngleXi < 0.998) continue; // in AliV0vertexer
-        if (lDcaPosToPrimVertexXi < 0.1) continue; // in AliV0vertexer
-        if (lDcaNegToPrimVertexXi < 0.1) continue; // in AliV0vertexer
-
-
-          if(lXiRadius < .9) continue; // in AliCascadeVertexer
-//        if(lXiRadius > 100) continue; // in AliCascadeVertexer
-          if(lV0RadiusXi < 0.9) continue; // in AliV0vertexer
-//        if(lV0RadiusXi > 100) continue; // in AliV0vertexer
-
-      }
+       lChargeXi = xiESD->Charge();
        
-       Double_t lChargeXi = xiESD->Charge();
-       
-       if( lChargeXi < 0 )     fHistMassXiMinus        ->Fill( lInvMassXiMinus );
-       if( lChargeXi > 0 )     fHistMassXiPlus         ->Fill( lInvMassXiPlus );
-       if( lChargeXi < 0 )     fHistMassOmegaMinus     ->Fill( lInvMassOmegaMinus );
-       if( lChargeXi > 0 )     fHistMassOmegaPlus      ->Fill( lInvMassOmegaPlus );
-
        // - Step II.3 : PID info   
 
        //-------------
@@ -2302,31 +2795,7 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
        
        // 3.1 - PID Information
 
-       Bool_t   lIsPosInXiProton      = kFALSE;
-       Bool_t   lIsPosInXiPion        = kFALSE;
-       Bool_t   lIsPosInOmegaProton   = kFALSE;
-       Bool_t   lIsPosInOmegaPion     = kFALSE;
-       
-       Bool_t   lIsNegInXiProton      = kFALSE;
-       Bool_t   lIsNegInXiPion        = kFALSE;
-       Bool_t   lIsNegInOmegaProton   = kFALSE;
-       Bool_t   lIsNegInOmegaPion     = kFALSE;
-       
-       Bool_t   lIsBachelorKaon       = kFALSE;
-       Bool_t   lIsBachelorPion       = kFALSE; 
-       
-       Bool_t   lIsBachelorKaonForTPC = kFALSE; // For ESD only ...//FIXME : wait for availability in AOD
-       Bool_t   lIsBachelorPionForTPC = kFALSE; // For ESD only ...
-       Bool_t   lIsNegPionForTPC      = kFALSE; // For ESD only ...
-       Bool_t   lIsPosPionForTPC      = kFALSE; // For ESD only ...
-       Bool_t   lIsNegProtonForTPC    = kFALSE; // For ESD only ...
-       Bool_t   lIsPosProtonForTPC    = kFALSE; // For ESD only ...
 
-        // 3.1.A - Combined PID
-       // Reasonable guess for the priors for the cascade track sample (e-, mu, pi, K, p)
-       Double_t lPriorsGuessXi[5]    = {0, 0, 2, 0, 1};
-       Double_t lPriorsGuessOmega[5] = {0, 0, 1, 1, 1};
-       
        // Combined VO-positive-daughter PID
        AliPID pPidXi;          pPidXi.SetPriors(    lPriorsGuessXi    );
        AliPID pPidOmega;       pPidOmega.SetPriors( lPriorsGuessOmega );
@@ -2374,7 +2843,7 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
        AliPID nPidXi;          nPidXi.SetPriors(    lPriorsGuessXi    );
        AliPID nPidOmega;       nPidOmega.SetPriors( lPriorsGuessOmega );
                
-       if( nTrackXi->IsOn(AliESDtrack::kESDpid) ){  // Combined PID exists
+       if( nTrackXi->IsOn(AliESDtrack::kESDpid) ) {  // Combined PID exists
                Double_t r[10] = {0.}; nTrackXi->GetESDpid(r);
                nPidXi.SetProbabilities(r);
                nPidOmega.SetProbabilities(r);
@@ -2416,9 +2885,8 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
        AliPID bachPidXi;       bachPidXi.SetPriors(    lPriorsGuessXi    );
        AliPID bachPidOmega;    bachPidOmega.SetPriors( lPriorsGuessOmega );
        
-        Double_t ppionBach = 0.0, pkaonBach = 0.0;
         
-       if( bachTrackXi->IsOn(AliESDtrack::kESDpid) ){  // Combined PID exists
+       if ( bachTrackXi->IsOn(AliESDtrack::kESDpid) ) {  // Combined PID exists
                Double_t r[10] = {0.}; bachTrackXi->GetESDpid(r);
                bachPidXi.SetProbabilities(r);
                bachPidOmega.SetProbabilities(r);
@@ -2439,7 +2907,6 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
        
        // 3.1.B - TPC PID : 4-sigma bands on Bethe-Bloch curve
 
-        // Here for the new PID object I put fPIDResponse instead of fESDpid
         // Bachelor
         if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 4) lIsBachelorKaonForTPC = kTRUE;
         if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( bachTrackXi,AliPID::kPion)) < 4) lIsBachelorPionForTPC = kTRUE;
@@ -2480,48 +2947,23 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
         }
 */        
                
-        // Combined PID TH1s
-       if( lChargeXi < 0 && lIsBachelorPion )    fHistMassWithCombPIDXiMinus     ->Fill( lInvMassXiMinus    );
-       if( lChargeXi > 0 && lIsBachelorPion )    fHistMassWithCombPIDXiPlus      ->Fill( lInvMassXiPlus     );
-       if( lChargeXi < 0 && lIsBachelorKaon )    fHistMassWithCombPIDOmegaMinus  ->Fill( lInvMassOmegaMinus );
-       if( lChargeXi > 0 && lIsBachelorKaon )    fHistMassWithCombPIDOmegaPlus   ->Fill( lInvMassOmegaPlus  );
-         
-       
        // 3.2 - PID proba Vs Pt(Bach)
        Int_t      lblBachForPID  = (Int_t) TMath::Abs( bachTrackXi->GetLabel() );
        TParticle* mcBachForPID   = lMCstack->Particle( lblBachForPID );
-       Double_t   lmcPtBach      = mcBachForPID->Pt();
+       lmcPtBach      = mcBachForPID->Pt();
        
-       if(lIsBachelorPion)   f2dHistPIDprobaPionVsMCPtBach->Fill( lmcPtBach, ppionBach );
-       if(lIsBachelorKaon)   f2dHistPIDprobaKaonVsMCPtBach->Fill( lmcPtBach, pkaonBach );
-       
-                       
        // 3.3 - MC perfect PID
-       Bool_t   lIsBachelorMCPiMinus  = kFALSE;
-       Bool_t   lIsBachelorMCPiPlus   = kFALSE;
-       Bool_t   lIsBachelorMCKMinus   = kFALSE;
-       Bool_t   lIsBachelorMCKPlus    = kFALSE;        
        
        if( mcBachForPID->GetPdgCode() == -211) lIsBachelorMCPiMinus = kTRUE;
        if( mcBachForPID->GetPdgCode() ==  211) lIsBachelorMCPiPlus  = kTRUE;
        if( mcBachForPID->GetPdgCode() == -321) lIsBachelorMCKMinus  = kTRUE;
        if( mcBachForPID->GetPdgCode() ==  321) lIsBachelorMCKPlus   = kTRUE;
        
-       if( lChargeXi < 0 && lIsBachelorMCPiMinus )    fHistMassWithMcPIDXiMinus     ->Fill( lInvMassXiMinus );
-       if( lChargeXi > 0 && lIsBachelorMCPiPlus  )    fHistMassWithMcPIDXiPlus      ->Fill( lInvMassXiPlus );
-       if( lChargeXi < 0 && lIsBachelorMCKMinus  )    fHistMassWithMcPIDOmegaMinus  ->Fill( lInvMassOmegaMinus );
-       if( lChargeXi > 0 && lIsBachelorMCKPlus   )    fHistMassWithMcPIDOmegaPlus   ->Fill( lInvMassOmegaPlus );
        
        
        // - Step II.4 : MC association (care : lots of "continue;" below this line)
        //------------- 
        
-       Bool_t lAssoXiMinus    = kFALSE;
-       Bool_t lAssoXiPlus     = kFALSE;
-       Bool_t lAssoOmegaMinus = kFALSE;
-       Bool_t lAssoOmegaPlus  = kFALSE;
-       
-       
        if(fDebug > 5)
                cout    << "MC EventNumber : " << lMCevent->Header()->GetEvent() 
                        << " / MC event Number in Run : " << lMCevent->Header()->GetEventNrInRun() << endl;
@@ -2578,32 +3020,40 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
 
         if (!(lMCstack->IsPhysicalPrimary(lblMotherBach))) continue;  
 
+        kIsNaturalPart = lMCevent->IsFromBGEvent(lblMotherBach); // if kTRUE the particle is a natural one
+        if (!kIsNaturalPart) {
+          if (!(mcMotherBach->GetFirstMother()<0)) kIsNaturalPart = kTRUE;
+        }
+
        // - Step 4.4 : Manage boolean for association
-       
+       
        if( mcMotherBach                ->GetPdgCode() ==   3312 &&
            mcGdMotherPosV0Dghter       ->GetPdgCode() ==   3312 &&
            mcGdMotherNegV0Dghter       ->GetPdgCode() ==   3312)    {  lAssoXiMinus = kTRUE;
+                                                                        cascadeMass = 1.321;
                                                                       //  Printf("Xi- asso current index = %n ", lblGdMotherPosV0Dghter);  
                                                                         nAssoXiMinus++; }
        
        else if( mcMotherBach           ->GetPdgCode() ==  -3312 &&
            mcGdMotherPosV0Dghter       ->GetPdgCode() ==  -3312 &&
            mcGdMotherNegV0Dghter       ->GetPdgCode() ==  -3312)    {  lAssoXiPlus = kTRUE;
+                                                                        cascadeMass = 1.321;
                                                                         nAssoXiPlus++; }
        
        else if( mcMotherBach           ->GetPdgCode() ==   3334 &&
            mcGdMotherPosV0Dghter       ->GetPdgCode() ==   3334 &&
            mcGdMotherNegV0Dghter       ->GetPdgCode() ==   3334)    {  lAssoOmegaMinus = kTRUE;
+                                                                        cascadeMass = 1.672;
                                                                         nAssoOmegaMinus++; }
                
        else if( mcMotherBach           ->GetPdgCode() ==  -3334 &&
            mcGdMotherPosV0Dghter       ->GetPdgCode() ==  -3334 &&
            mcGdMotherNegV0Dghter       ->GetPdgCode() ==  -3334)    {  lAssoOmegaPlus = kTRUE;
+                                                                        cascadeMass = 1.672;
                                                                         nAssoOmegaPlus++; }
        
        
        
-       if(!lAssoXiMinus && !lAssoXiPlus && !lAssoOmegaMinus && !lAssoOmegaPlus) continue; // no association, skip the rest of the code 
        // If a proper association  exists ...
                
        if(fDebug > 4){
@@ -2644,34 +3094,429 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
        }
 
        
-       // - Step 5 : Plots around the cascade candidates associated with MC
-       //------------- 
-       
-        Double_t lmcPt             = mcMotherBach->Pt();
-        Double_t lmcRapCasc        = 0.5*TMath::Log( (mcMotherBach->Energy() + mcMotherBach->Pz()) / 
+        lmcPt             = mcMotherBach->Pt();
+        lmcRapCasc        = 0.5*TMath::Log( (mcMotherBach->Energy() + mcMotherBach->Pz()) / 
                                                      (mcMotherBach->Energy() - mcMotherBach->Pz() +1.e-13) );
-        Double_t lmcEta            = mcMotherBach->Eta();
-        Double_t lmcTransvRadius   = mcBach->R(); // to get the decay point of Xi, = the production vertex of Bachelor ...
+        lmcEta            = mcMotherBach->Eta();
+        lmcTransvRadius   = mcBach->R(); // to get the decay point of Xi, = the production vertex of Bachelor ...
         
         TVector3 lmcTVect3Mom( mcMotherBach->Px(), mcMotherBach->Py(), mcMotherBach->Pz() );
 
-        Double_t lrecoPt           = xiESD->Pt();
-        Double_t lrecoTransvRadius = TMath::Sqrt( xiESD->Xv() * xiESD->Xv() + xiESD->Yv() * xiESD->Yv() );
+        lrecoPt           = xiESD->Pt();
+        lrecoTransvRadius = TMath::Sqrt( xiESD->Xv() * xiESD->Xv() + xiESD->Yv() * xiESD->Yv() );
         
-        TVector3 lrecoTVect3Mom( xiESD->Px(), xiESD->Py(), xiESD->Pz()  );
-        Double_t lDeltaPhiMcReco   = lmcTVect3Mom.DeltaPhi( lrecoTVect3Mom ) * 180.0/TMath::Pi();
+        TVector3 lrecoTVect3Mom( xiESD->Px(), xiESD->Py(), xiESD->Pz() );
+        lDeltaPhiMcReco   = lmcTVect3Mom.DeltaPhi( lrecoTVect3Mom ) * 180.0/TMath::Pi();
 
-        
+        lmcPtPosV0Dghter = mcPosV0Dghter->Pt() ;
+        lmcPtNegV0Dghter = mcNegV0Dghter->Pt();
+        lrecoP           = xiESD->P();
+
+        Double_t nV0mom[3] = {0. ,0. ,0. };
+        Double_t pV0mom[3] = {0. ,0. ,0. };
+
+        xiESD->GetNPxPyPz(nV0mom[0],nV0mom[1],nV0mom[2]);    
+        xiESD->GetPPxPyPz(pV0mom[0],pV0mom[1],pV0mom[2]);
+
+        lV0mom = TMath::Sqrt(TMath::Power(nV0mom[0]+pV0mom[0],2)+TMath::Power(nV0mom[1]+pV0mom[1],2)+TMath::Power(nV0mom[2]+pV0mom[2],2)); 
+
+      } else if ( fAnalysisType == "AOD" ) {
+
+        const AliAODcascade *xiAOD = lAODevent->GetCascade(iXi);
+
+        if (!xiAOD) continue;
+
+        // - Step II.1 : Connection to daughter tracks of the current cascade
+        //-------------
+
+        AliAODTrack *pTrackXi    = dynamic_cast<AliAODTrack*>( xiAOD->GetDaughter(0) );
+        AliAODTrack *nTrackXi    = dynamic_cast<AliAODTrack*>( xiAOD->GetDaughter(1) );
+        AliAODTrack *bachTrackXi = dynamic_cast<AliAODTrack*>( xiAOD->GetDecayVertexXi()->GetDaughter(0) );
+        if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
+          AliWarning("ERROR: Could not retrieve one of the 3 AOD daughter tracks of the cascade ...");
+          continue;
+        }
+
+        UInt_t lIdxPosXi  = (UInt_t) TMath::Abs( pTrackXi->GetID() );
+        UInt_t lIdxNegXi  = (UInt_t) TMath::Abs( nTrackXi->GetID() );
+        UInt_t lBachIdx   = (UInt_t) TMath::Abs( bachTrackXi->GetID() );
+
+                // abs value not needed ; the index should always be positive (!= label ...)
+
+
+        // FIXME : rejection of a double use of a daughter track (nothing but just a crosscheck of what is done in the cascade vertexer)
+        if(lBachIdx == lIdxNegXi) {
+                AliWarning("Pb / Idx(Bach. track) = Idx(Neg. track) ... continue!"); continue;
+        }
+        if(lBachIdx == lIdxPosXi) {
+                AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
+        }
+
+        lPosTPCClusters   = pTrackXi->GetTPCNcls();
+        lNegTPCClusters   = nTrackXi->GetTPCNcls();
+        lBachTPCClusters  = bachTrackXi->GetTPCNcls();
+
+
+        // FIXME : rejection of a poor quality tracks
+        if (fkQualityCutTPCrefit) {
+                // 1 - Poor quality related to TPCrefit
+          if (!(pTrackXi->IsOn(AliAODTrack::kTPCrefit))) { AliWarning("Pb / V0 Pos. track has no TPCrefit ... continue!"); continue; }
+          if (!(nTrackXi->IsOn(AliAODTrack::kTPCrefit))) { AliWarning("Pb / V0 Neg. track has no TPCrefit ... continue!"); continue; }
+          if (!(bachTrackXi->IsOn(AliAODTrack::kTPCrefit))) { AliWarning("Pb / Bach.   track has no TPCrefit ... continue!"); continue; }
+
+        }
+        if (fkQualityCut80TPCcls) {
+                // 2 - Poor quality related to TPC clusters
+                if(lPosTPCClusters  < 80) { AliWarning("Pb / V0 Pos. track has less than 80 TPC clusters ... continue!"); continue; }
+                if(lNegTPCClusters  < 80) { AliWarning("Pb / V0 Neg. track has less than 80 TPC clusters ... continue!"); continue; }
+                if(lBachTPCClusters < 80) { AliWarning("Pb / Bach.   track has less than 80 TPC clusters ... continue!"); continue; }
+        }
+
+        // - Step II.2 : Info over reconstructed cascades
+        //-------------
+
+
+        if( bachTrackXi->Charge() < 0 ) {
+                lInvMassXiMinus = xiAOD->MassXi();
+
+                lInvMassOmegaMinus = xiAOD->MassOmega();
+        }
+
+        if( bachTrackXi->Charge() >  0 ){
+                lInvMassXiPlus = xiAOD->MassXi();
+
+                lInvMassOmegaPlus = xiAOD->MassOmega();
+
+        }
+
+
+        //lChi2Xi                       = xiAOD->Chi2Xi();
+        lDcaXiDaughters                 = xiAOD->DcaXiDaughters();
+        lDcaBachToPrimVertexXi          = xiAOD->DcaBachToPrimVertex();
+        lXiCosineOfPointingAngle        = xiAOD->CosPointingAngleXi( lBestPrimaryVtxPos[0],
+                                                                     lBestPrimaryVtxPos[1],
+                                                                     lBestPrimaryVtxPos[2] );
+
+        lPosXi[0] = xiAOD->DecayVertexXiX();
+        lPosXi[1] = xiAOD->DecayVertexXiY();
+        lPosXi[2] = xiAOD->DecayVertexXiZ();
+
+        lInvMassLambdaAsCascDghter      = xiAOD->MassLambda();
+                                        // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
+        lDcaV0DaughtersXi               = xiAOD->DcaV0Daughters();
+        // lV0Chi2Xi                    = xiAOD->GetChi2V0();
+        lV0CosineOfPointingAngleXi      = xiAOD->CosPointingAngle( lPosXi );
+
+        lV0CosineOfPointingAngle        = xiAOD->CosPointingAngle( lBestPrimaryVtxPos );
+
+        lPosV0Xi[0] = xiAOD->DecayVertexV0X();
+        lPosV0Xi[1] = xiAOD->DecayVertexV0Y();
+        lPosV0Xi[2] = xiAOD->DecayVertexV0Z();
+
+
+        lDcaV0ToPrimVertexXi            = xiAOD->DcaV0ToPrimVertex();
+
+        lDcaPosToPrimVertexXi           = xiAOD->DcaPosToPrimVertex();
+
+        lDcaNegToPrimVertexXi           = xiAOD->DcaNegToPrimVertex();
+
+        lChargeXi = xiAOD->ChargeXi();
+
+        // - Step II.3 : PID info
+
+        //-------------
+
+
+        // 3.1 - PID Information
+
+
+        // Combined VO-positive-daughter PID
+
+        // Combined bachelor PID
+/*        AliPID bachPidXi;       bachPidXi.SetPriors(    lPriorsGuessXi    );
+        AliPID bachPidOmega;    bachPidOmega.SetPriors( lPriorsGuessOmega );
+
+        if ( bachTrackXi->IsOn(AliESDtrack::kESDpid) ) {  // Combined PID exists
+                Double_t r[10] = {0.}; bachTrackXi->GetESDpid(r);
+                bachPidXi.SetProbabilities(r);
+                bachPidOmega.SetProbabilities(r);
+                // Check if the bachelor track is a pion
+                    ppionBach = bachPidXi.GetProbability(AliPID::kPion);
+                if (ppionBach > bachPidXi.GetProbability(AliPID::kElectron) &&
+                    ppionBach > bachPidXi.GetProbability(AliPID::kMuon)     &&
+                    ppionBach > bachPidXi.GetProbability(AliPID::kKaon)     &&
+                    ppionBach > bachPidXi.GetProbability(AliPID::kProton)   )     lIsBachelorPion = kTRUE;
+                // Check if the bachelor track is a kaon
+                    pkaonBach = bachPidOmega.GetProbability(AliPID::kKaon);
+                if (pkaonBach > bachPidOmega.GetProbability(AliPID::kElectron) &&
+                    pkaonBach > bachPidOmega.GetProbability(AliPID::kMuon)     &&
+                    pkaonBach > bachPidOmega.GetProbability(AliPID::kPion)     &&
+                    pkaonBach > bachPidOmega.GetProbability(AliPID::kProton)   )  lIsBachelorKaon = kTRUE;
+        }// end if bachelor track with existing combined PID
+*/
+
+        // 3.1.B - TPC PID : 4-sigma bands on Bethe-Bloch curve
+
+
+                // Bachelor
+        if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 4) lIsBachelorKaonForTPC = kTRUE;
+        if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( bachTrackXi,AliPID::kPion)) < 4) lIsBachelorPionForTPC = kTRUE;
+
+        // Negative V0 daughter
+        if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( nTrackXi,AliPID::kPion   )) < 4) lIsNegPionForTPC   = kTRUE;
+        if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( nTrackXi,AliPID::kProton )) < 4) lIsNegProtonForTPC = kTRUE;
+
+        // Positive V0 daughter
+        if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( pTrackXi,AliPID::kPion   )) < 4) lIsPosPionForTPC   = kTRUE;
+        if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 4) lIsPosProtonForTPC = kTRUE;
+
+/*
+        const AliExternalTrackParam *pInnerWallTrackXi    = pTrackXi    ->GetInnerParam(); // Do not use GetTPCInnerWall
+        const AliExternalTrackParam *nInnerWallTrackXi    = nTrackXi    ->GetInnerParam();
+        const AliExternalTrackParam *bachInnerWallTrackXi = bachTrackXi ->GetInnerParam();
+        if(pInnerWallTrackXi && nInnerWallTrackXi && bachInnerWallTrackXi ){
+
+                Double_t pMomInnerWall    = pInnerWallTrackXi   ->GetP();
+                Double_t nMomInnerWall    = nInnerWallTrackXi   ->GetP();
+                Double_t bachMomInnerWall = bachInnerWallTrackXi->GetP();
+
+                // Bachelor
+                if (TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kPion)) < 3)                              lIsBachelorPionForTPC = kTRUE;
+                if (bachMomInnerWall < 0.350  && TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 5) lIsBachelorKaonForTPC = kTRUE;
+                if (bachMomInnerWall > 0.350  && TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 3) lIsBachelorKaonForTPC = kTRUE;
+
+                // Negative V0 daughter
+                if (TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kPion   )) < 3  )                           lIsNegPionForTPC   = kTRUE;
+                if (nMomInnerWall < 0.6  && TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kProton ) ) < 5 )   lIsNegProtonForTPC = kTRUE;
+                if (nMomInnerWall > 0.6  && TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kProton ) ) < 3 )   lIsNegProtonForTPC = kTRUE;
+
+                // Positive V0 daughter
+                if (TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kPion   )) < 3 )                            lIsPosPionForTPC   = kTRUE;
+                if (pMomInnerWall < 0.6  && TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 5)     lIsPosProtonForTPC = kTRUE;
+                if (pMomInnerWall > 0.6  && TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 3)     lIsPosProtonForTPC = kTRUE;
+
+        }
+*/
+
+        // 3.2 - PID proba Vs Pt(Bach)
+        Int_t      lblBachForPID  = (Int_t) TMath::Abs( bachTrackXi->GetLabel() );
+        AliAODMCParticle* mcBachForPID   = (AliAODMCParticle*) arrayMC->At( lblBachForPID );
+        lmcPtBach      = mcBachForPID->Pt();
+
+        // 3.3 - MC perfect PID
+
+        if( mcBachForPID->PdgCode() == -211) lIsBachelorMCPiMinus = kTRUE;
+        if( mcBachForPID->PdgCode() ==  211) lIsBachelorMCPiPlus  = kTRUE;
+        if( mcBachForPID->PdgCode() == -321) lIsBachelorMCKMinus  = kTRUE;
+        if( mcBachForPID->PdgCode() ==  321) lIsBachelorMCKPlus   = kTRUE;
+
+
+
+        // - Step II.4 : MC association (care : lots of "continue;" below this line)
+        //-------------
+
+        if(fDebug > 5)
+                cout    << "MC EventNumber : " << lMCevent->Header()->GetEvent()
+                        << " / MC event Number in Run : " << lMCevent->Header()->GetEventNrInRun() << endl;
+
+        // - Step 4.1 : level of the V0 daughters
+
+        Int_t lblPosV0Dghter = (Int_t) TMath::Abs( pTrackXi->GetLabel() );
+                // Abs value = needed ! question of quality track association ... (negative label when at least one cluster in the track is from a different particle)
+        Int_t lblNegV0Dghter = (Int_t) TMath::Abs( nTrackXi->GetLabel() );
+        AliAODMCParticle* mcPosV0Dghter = (AliAODMCParticle*) arrayMC->At( lblPosV0Dghter );
+        AliAODMCParticle* mcNegV0Dghter = (AliAODMCParticle*) arrayMC->At( lblNegV0Dghter );
+
+
+        // - Step 4.2 : level of the Xi daughters
+
+        Int_t lblMotherPosV0Dghter = mcPosV0Dghter->GetMother();   
+        Int_t lblMotherNegV0Dghter = mcNegV0Dghter->GetMother();
+
+                if( lblMotherPosV0Dghter != lblMotherNegV0Dghter) continue; // same mother
+                if( lblMotherPosV0Dghter < 0 ) continue; // this particle is primary, no mother
+                if( lblMotherNegV0Dghter < 0 ) continue;
+
+
+                // mothers = Lambda candidate ... a priori
+
+        AliAODMCParticle* mcMotherPosV0Dghter = (AliAODMCParticle*) arrayMC->At( lblMotherPosV0Dghter );
+        AliAODMCParticle* mcMotherNegV0Dghter = (AliAODMCParticle*) arrayMC->At( lblMotherNegV0Dghter );  // MN: redundant?? already checked that labels are the same...-->same part from stack
+
+        Int_t      lblBach  = (Int_t) TMath::Abs( bachTrackXi->GetLabel() );
+        AliAODMCParticle* mcBach   = (AliAODMCParticle*) arrayMC->At( lblBach );
+
+
+        // - Step 4.3 : level of Xi candidate
+
+        Int_t lblGdMotherPosV0Dghter =   mcMotherPosV0Dghter->GetMother() ;
+        Int_t lblGdMotherNegV0Dghter =   mcMotherNegV0Dghter->GetMother() ;
+
+                if( lblGdMotherPosV0Dghter != lblGdMotherNegV0Dghter ) continue;
+                if( lblGdMotherPosV0Dghter < 0 ) continue; // primary lambda ...
+                if( lblGdMotherNegV0Dghter < 0 ) continue; // primary lambda ...
+
+                // Gd mothers = Xi candidate ... a priori
+
+        AliAODMCParticle* mcGdMotherPosV0Dghter = (AliAODMCParticle*) arrayMC->At( lblGdMotherPosV0Dghter );
+        AliAODMCParticle* mcGdMotherNegV0Dghter = (AliAODMCParticle*) arrayMC->At( lblGdMotherNegV0Dghter );
+
+        Int_t lblMotherBach = (Int_t) TMath::Abs( mcBach->GetMother() );
+
+        if( lblMotherBach != lblGdMotherPosV0Dghter ) continue; //same mother for bach and V0 daughters
+
+        AliAODMCParticle* mcMotherBach = (AliAODMCParticle*) arrayMC->At( lblMotherBach );
+
+                // Check if cascade is primary
+
+        if (!(mcMotherBach->IsPhysicalPrimary())) continue;
+
+
+        kIsNaturalPart = kTRUE;
+
+        if ((lblMotherBach>=endOfHijingEvent)&&(endOfHijingEvent!=-1)&&(mcMotherBach->GetMother()<0)) kIsNaturalPart = kFALSE;
+
+        // - Step 4.4 : Manage boolean for association
+
+        if( mcMotherBach                ->GetPdgCode() ==   3312 &&
+            mcGdMotherPosV0Dghter       ->GetPdgCode() ==   3312 &&
+            mcGdMotherNegV0Dghter       ->GetPdgCode() ==   3312)    {  lAssoXiMinus = kTRUE;
+                                                                        cascadeMass = 1.321;
+                                                                      //  Printf("Xi- asso current index = %n ", lblGdMotherPosV0Dghter);
+                                                                        nAssoXiMinus++; }
+
+        else if( mcMotherBach           ->GetPdgCode() ==  -3312 &&
+            mcGdMotherPosV0Dghter       ->GetPdgCode() ==  -3312 &&
+            mcGdMotherNegV0Dghter       ->GetPdgCode() ==  -3312)    {  lAssoXiPlus = kTRUE;
+                                                                        cascadeMass = 1.321;
+                                                                        nAssoXiPlus++; }
+
+        else if( mcMotherBach           ->GetPdgCode() ==   3334 &&
+            mcGdMotherPosV0Dghter       ->GetPdgCode() ==   3334 &&
+            mcGdMotherNegV0Dghter       ->GetPdgCode() ==   3334)    {  lAssoOmegaMinus = kTRUE;
+                                                                        cascadeMass = 1.672;
+                                                                        nAssoOmegaMinus++; }
+
+        else if( mcMotherBach           ->GetPdgCode() ==  -3334 &&
+            mcGdMotherPosV0Dghter       ->GetPdgCode() ==  -3334 &&
+            mcGdMotherNegV0Dghter       ->GetPdgCode() ==  -3334)    {  lAssoOmegaPlus = kTRUE;
+                                                                        cascadeMass = 1.672;
+                                                                        nAssoOmegaPlus++; }
+        //-------------
+
+        lmcPt             = mcMotherBach->Pt();
+        lmcRapCasc        = 0.5*TMath::Log( (mcMotherBach->E() + mcMotherBach->Pz()) /
+                                                     (mcMotherBach->E() - mcMotherBach->Pz() +1.e-13) );
+        lmcEta            = mcMotherBach->Eta();
+        Float_t decayCascX = mcBach->Xv();
+        Float_t decayCascY = mcBach->Yv();
+        lmcTransvRadius   = TMath::Sqrt(decayCascX*decayCascX+decayCascY*decayCascY); // decay point of Xi, = the production vertex of Bachelor ...
+
+        TVector3 lmcTVect3Mom( mcMotherBach->Px(), mcMotherBach->Py(), mcMotherBach->Pz() );
+
+        Double_t xiMomX = xiAOD->MomXiX();
+        Double_t xiMomY = xiAOD->MomXiY();
+        Double_t xiMomZ = xiAOD->MomXiZ();
+
+        lrecoPt           = TMath::Sqrt( xiMomX*xiMomX   + xiMomY*xiMomY ); 
+        lrecoTransvRadius = TMath::Sqrt( xiAOD->DecayVertexXiX() * xiAOD->DecayVertexXiX() + xiAOD->DecayVertexXiY() * xiAOD->DecayVertexXiY() );
+
+        TVector3 lrecoTVect3Mom( xiMomX, xiMomY, xiMomZ );
+        lDeltaPhiMcReco   = lmcTVect3Mom.DeltaPhi( lrecoTVect3Mom ) * 180.0/TMath::Pi();
+
+        lmcPtPosV0Dghter = mcPosV0Dghter->Pt() ;
+        lmcPtNegV0Dghter = mcNegV0Dghter->Pt();
+        lrecoP           = TMath::Sqrt( xiMomX*xiMomX   + xiMomY*xiMomY   + xiMomZ*xiMomZ );;
+
+        Double_t lV0momX = xiAOD->MomV0X();
+        Double_t lV0momY = xiAOD->MomV0Y();
+        Double_t lV0momZ = xiAOD->MomV0Z();
+        lV0mom = TMath::Sqrt(TMath::Power(lV0momX,2)+TMath::Power(lV0momY,2)+TMath::Power(lV0momZ,2));
+
+      }
+
+      lXiRadius                       = TMath::Sqrt( lPosXi[0]*lPosXi[0]  +  lPosXi[1]*lPosXi[1] );
+      lV0RadiusXi                     = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0]  +  lPosV0Xi[1]*lPosV0Xi[1] ); 
+
+      // Extra-selection for cascade candidates
+                // Towards optimisation of AA selection
+      if (fkExtraSelections) {
+
+        // if(lChi2Xi > 2000) continue; // in AliCascadeVertexer
+        // if(lV0Chi2Xi > 2000) continue; // in AliV0vertexer
+
+        if (lDcaXiDaughters > 0.3) continue; // in AliCascadeVertexer
+        if (lXiCosineOfPointingAngle < 0.999 ) continue; // in AliCascadeVertexer
+        if (lDcaV0ToPrimVertexXi < 0.05) continue; // in AliCascadeVertexer
+        if (lDcaBachToPrimVertexXi < 0.03) continue; // in AliCascadeVertexer
+////      if (TMath::Abs(lInvMassLambdaAsCascDghter-1.11568) > 0.006 ) continue;  // in AliCascadeVertexer
+
+        if (lDcaV0DaughtersXi > 1.) continue; // in AliV0vertexer
+        if (lV0CosineOfPointingAngleXi < 0.998) continue; // in AliV0vertexer
+        if (lDcaPosToPrimVertexXi < 0.1) continue; // in AliV0vertexer
+        if (lDcaNegToPrimVertexXi < 0.1) continue; // in AliV0vertexer
+
+
+          if(lXiRadius < .9) continue; // in AliCascadeVertexer
+//        if(lXiRadius > 100) continue; // in AliCascadeVertexer
+          if(lV0RadiusXi < 0.9) continue; // in AliV0vertexer
+//        if(lV0RadiusXi > 100) continue; // in AliV0vertexer
+
+      }
+
+
+      // Combined PID TH1s
+      if( lChargeXi < 0 && lIsBachelorPion )    fHistMassWithCombPIDXiMinus     ->Fill( lInvMassXiMinus    );
+      if( lChargeXi > 0 && lIsBachelorPion )    fHistMassWithCombPIDXiPlus      ->Fill( lInvMassXiPlus     );
+      if( lChargeXi < 0 && lIsBachelorKaon )    fHistMassWithCombPIDOmegaMinus  ->Fill( lInvMassOmegaMinus );
+      if( lChargeXi > 0 && lIsBachelorKaon )    fHistMassWithCombPIDOmegaPlus   ->Fill( lInvMassOmegaPlus  );
+
+      if( lChargeXi < 0 )     fHistMassXiMinus        ->Fill( lInvMassXiMinus );
+      if( lChargeXi > 0 )     fHistMassXiPlus         ->Fill( lInvMassXiPlus );
+      if( lChargeXi < 0 )     fHistMassOmegaMinus     ->Fill( lInvMassOmegaMinus );
+      if( lChargeXi > 0 )     fHistMassOmegaPlus      ->Fill( lInvMassOmegaPlus );
+
+      if(lIsBachelorPion)   f2dHistPIDprobaPionVsMCPtBach->Fill( lmcPtBach, ppionBach );
+      if(lIsBachelorKaon)   f2dHistPIDprobaKaonVsMCPtBach->Fill( lmcPtBach, pkaonBach );
+
+      if( lChargeXi < 0 && lIsBachelorMCPiMinus )    fHistMassWithMcPIDXiMinus     ->Fill( lInvMassXiMinus );
+      if( lChargeXi > 0 && lIsBachelorMCPiPlus  )    fHistMassWithMcPIDXiPlus      ->Fill( lInvMassXiPlus );
+      if( lChargeXi < 0 && lIsBachelorMCKMinus  )    fHistMassWithMcPIDOmegaMinus  ->Fill( lInvMassOmegaMinus );
+      if( lChargeXi > 0 && lIsBachelorMCKPlus   )    fHistMassWithMcPIDOmegaPlus   ->Fill( lInvMassOmegaPlus );
+
+
+
+      if(!lAssoXiMinus && !lAssoXiPlus && !lAssoOmegaMinus && !lAssoOmegaPlus) continue; // no association, skip the rest of the code
+         
+        // Calculate proper time for cascade (reconstructed)
+         
+        Double_t lctau =  TMath::Sqrt(TMath::Power((lPosXi[0]-lBestPrimaryVtxPos[0]),2)+TMath::Power((lPosXi[1]-lBestPrimaryVtxPos[1]),2)+TMath::Power((lPosXi[2]-lBestPrimaryVtxPos[2]),2));
+        if (lrecoP!=0)         lctau = lctau*cascadeMass/lrecoP;   
+        else lctau = -1.;
+
+
+        // Calculate proper time for Lambda (reconstructed)
+        Float_t lambdaMass = 1.115683; // PDG mass 
+        Float_t distV0Xi =  TMath::Sqrt(TMath::Power((lPosV0Xi[0]-lPosXi[0]),2)+TMath::Power((lPosV0Xi[1]-lPosXi[1]),2)+TMath::Power((lPosV0Xi[2]-lPosXi[2]),2)); 
+        Float_t lctauV0 = -1.;
+        if (lV0mom!=0) lctauV0 = distV0Xi*lambdaMass/lV0mom; 
+
+        Float_t distTV0Xi =  TMath::Sqrt(TMath::Power((lPosV0Xi[0]-lPosXi[0]),2)+TMath::Power((lPosV0Xi[1]-lPosXi[1]),2));
+       
        // - Histos for the cascade candidates associated with MC
        
        if( lChargeXi < 0 && lAssoXiMinus){     
-               fHistAsMCMassXiMinus          ->Fill( lInvMassXiMinus  );
+                fHistAsMCMassXiMinus         ->Fill( lInvMassXiMinus  );
                if(lIsBachelorPion)     f2dHistAsMCandCombPIDGenPtVsGenYXiMinus->Fill( lmcPt, lmcRapCasc );
                f2dHistAsMCGenPtVsGenYXiMinus ->Fill( lmcPt, lmcRapCasc);
                fHistAsMCGenEtaXiMinus        ->Fill( lmcEta           );
                f2dHistAsMCResPtXiMinus       ->Fill( lmcPt,           (lrecoPt - lmcPt)/ lmcPt );
                f2dHistAsMCResRXiMinus        ->Fill( lmcTransvRadius, (lrecoTransvRadius - lmcTransvRadius)/ lmcTransvRadius    );
                 f2dHistAsMCResPhiXiMinus      ->Fill( lmcPt, lDeltaPhiMcReco );
+                f2dHistAsMCptProtonMCptXiMinus->Fill(lmcPt,lmcPtPosV0Dghter);
+                fHistV0CosineOfPointingAnglevsPtXi->Fill(lmcPt,lV0CosineOfPointingAngle);
        }
        
        else if( lChargeXi > 0 && lAssoXiPlus){ 
@@ -2682,6 +3527,8 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                f2dHistAsMCResPtXiPlus        ->Fill( lmcPt,           (lrecoPt - lmcPt)/ lmcPt );
                f2dHistAsMCResRXiPlus         ->Fill( lmcTransvRadius, (lrecoTransvRadius - lmcTransvRadius)/ lmcTransvRadius    );
                 f2dHistAsMCResPhiXiPlus       ->Fill( lmcPt, lDeltaPhiMcReco );
+                f2dHistAsMCptAntiprotonMCptXiPlus->Fill(lmcPt,lmcPtNegV0Dghter);
+                fHistV0CosineOfPointingAnglevsPtXi->Fill(lmcPt,lV0CosineOfPointingAngle);
        }
        
        else if( lChargeXi < 0 && lAssoOmegaMinus){     
@@ -2692,6 +3539,8 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                f2dHistAsMCResPtOmegaMinus       ->Fill( lmcPt,           (lrecoPt - lmcPt)/ lmcPt );
                f2dHistAsMCResROmegaMinus        ->Fill( lmcTransvRadius, (lrecoTransvRadius - lmcTransvRadius)/ lmcTransvRadius    );
                 f2dHistAsMCResPhiOmegaMinus      ->Fill( lmcPt, lDeltaPhiMcReco );
+                f2dHistAsMCptProtonMCptOmegaMinus->Fill(lmcPt,lmcPtPosV0Dghter);
+                fHistV0CosineOfPointingAnglevsPtOmega->Fill(lmcPt,lV0CosineOfPointingAngle);
        }
        
        else if( lChargeXi > 0 && lAssoOmegaPlus){      
@@ -2702,24 +3551,23 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                f2dHistAsMCResPtOmegaPlus        ->Fill( lmcPt,           (lrecoPt - lmcPt)/ lmcPt );
                f2dHistAsMCResROmegaPlus         ->Fill( lmcTransvRadius, (lrecoTransvRadius - lmcTransvRadius)/ lmcTransvRadius    );
                 f2dHistAsMCResPhiOmegaPlus       ->Fill( lmcPt, lDeltaPhiMcReco );
+                f2dHistAsMCptAntiprotonMCptOmegaPlus->Fill(lmcPt,lmcPtNegV0Dghter);
+                fHistV0CosineOfPointingAnglevsPtOmega->Fill(lmcPt,lV0CosineOfPointingAngle);
         }
-        
-        
+
+        fHistV0toXiCosineOfPointingAngle->Fill(lV0CosineOfPointingAngleXi);
+       
         // - Step 6 : Containers = Cascade cuts + PID
        //------------- 
-      if (fUseCFCont) {
-
-        nTrackWithTPCrefitMultiplicity  = DoESDTrackWithTPCrefitMultiplicity(lESDevent);  // FIXME : variable which is not used anymore at the moment ... 
-                                                                                          //    ->  keep it while the task is still under development.
-        
-        
-        const AliMultiplicity *lAliMult = lESDevent->GetMultiplicity();
-        if(fAnalysisType == "ESD") lSPDTrackletsMultiplicity       = lAliMult->GetNumberOfTracklets();
-        else if(fAnalysisType == "AOD") lSPDTrackletsMultiplicity = lAODevent->GetTracklets()->GetNumberOfTracklets();
+        if (fAnalysisType == "ESD") {
+          const AliMultiplicity *lAliMult = lESDevent->GetMultiplicity();
+          lSPDTrackletsMultiplicity       = lAliMult->GetNumberOfTracklets();
+        }
+        else if (fAnalysisType == "AOD") lSPDTrackletsMultiplicity = lAODevent->GetTracklets()->GetNumberOfTracklets();
         
 
         // 6.3 - Filling the AliCFContainer (optimisation of topological selections + systematics)
-        Double_t lContainerCutVars[19] = {0.0};
+        Double_t lContainerCutVars[21] = {0.0};
 
         lContainerCutVars[0]  = lDcaXiDaughters;
         lContainerCutVars[1]  = lDcaBachToPrimVertexXi;
@@ -2735,10 +3583,13 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
 
         lContainerCutVars[13] = lmcPt;
 
-        lContainerCutVars[16] = lBestPrimaryVtxPos[2];
-        if (fCollidingSystems) lContainerCutVars[17] = lcentrality;
-        else lContainerCutVars[17] = lSPDTrackletsMultiplicity;       
-        lContainerCutVars[18] = nTrackPrimaryMultiplicity;       
+        if (kIsNaturalPart) lContainerCutVars[16] = 0.;
+        else lContainerCutVars[16] = 1.;
+        lContainerCutVars[17] = lcentrality;
+        lContainerCutVars[18] = lPrimaryTrackMultiplicity;       
+        lContainerCutVars[19] = lctau;
+        lContainerCutVars[20] = lctauV0;
+        lContainerCutVars[21] = distTV0Xi;
 
         // All cases should be covered below
         if( lChargeXi < 0 && lAssoXiMinus    ) {
@@ -2749,7 +3600,7 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                 if ( lIsBachelorPionForTPC   && lIsPosProtonForTPC    && lIsNegPionForTPC )    
                   fCFContAsCascadeCuts->Fill(lContainerCutVars,0); // for Xi-
         }
-        if( lChargeXi > 0 && lAssoXiPlus     ){
+        if( lChargeXi > 0 && lAssoXiPlus    ) {
                 lContainerCutVars[11] = lInvMassXiPlus;
                 lContainerCutVars[12] = lInvMassOmegaPlus;//1.26;
                 lContainerCutVars[14] = lmcRapCasc;
@@ -2757,7 +3608,7 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                 if ( lIsBachelorPionForTPC   && lIsNegProtonForTPC    && lIsPosPionForTPC )    
                   fCFContAsCascadeCuts->Fill(lContainerCutVars,1); // for Xi+
         }
-        if( lChargeXi < 0 && lAssoOmegaMinus )  {
+        if( lChargeXi < 0 && lAssoOmegaMinus ) {
                 lContainerCutVars[11] = lInvMassXiMinus;//1.63;
                 lContainerCutVars[12] = lInvMassOmegaMinus;
                 lContainerCutVars[14] = -1.;
@@ -2765,7 +3616,7 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                 if ( lIsBachelorKaonForTPC   && lIsPosProtonForTPC    && lIsNegPionForTPC )    
                   fCFContAsCascadeCuts->Fill(lContainerCutVars,2); // for Omega-
         }
-       if( lChargeXi > 0 && lAssoOmegaPlus  ){
+       if( lChargeXi > 0 && lAssoOmegaPlus  ) {
                 lContainerCutVars[11] = lInvMassXiPlus;//1.26;
                 lContainerCutVars[12] = lInvMassOmegaPlus;
                 lContainerCutVars[14] = -1.;
@@ -2785,8 +3636,7 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                lContainerPIDVars[0] = lmcPt              ;
                lContainerPIDVars[1] = lInvMassXiMinus    ;
                lContainerPIDVars[2] = lmcRapCasc         ;
-               if (fCollidingSystems) lContainerPIDVars[3] = lcentrality;
-                else lContainerPIDVars[3] = lSPDTrackletsMultiplicity ;   
+               lContainerPIDVars[3] = lcentrality;
                        
                // No PID
                        fCFContCascadePIDAsXiMinus->Fill(lContainerPIDVars, 0); // No PID
@@ -2811,9 +3661,9 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                    lIsPosInXiProton    )
                        fCFContCascadePIDAsXiMinus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
                
-               if(lIsBachelorPion     && 
-                  lIsPosInXiProton && 
-                  lIsNegInXiPion    )
+               if( lIsBachelorPion     && 
+                   lIsPosInXiProton && 
+                   lIsNegInXiPion    )
                        fCFContCascadePIDAsXiMinus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
        }
        
@@ -2821,11 +3671,10 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
        
        // Xi Plus              
        if( lChargeXi > 0 && lAssoXiPlus ) {
-               lContainerPIDVars[0] = lmcPt              ;
-               lContainerPIDVars[1] = lInvMassXiPlus     ;
-               lContainerPIDVars[2] = lmcRapCasc           ;
-               if (fCollidingSystems) lContainerPIDVars[3] = lcentrality;
-                else lContainerPIDVars[3] = lSPDTrackletsMultiplicity ;  
+               lContainerPIDVars[0] = lmcPt         ;
+               lContainerPIDVars[1] = lInvMassXiPlus;
+               lContainerPIDVars[2] = lmcRapCasc    ;
+               lContainerPIDVars[3] = lcentrality   ;
                        
                // No PID
                        fCFContCascadePIDAsXiPlus->Fill(lContainerPIDVars, 0); // No PID
@@ -2850,9 +3699,9 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                    lIsNegInXiProton    )
                        fCFContCascadePIDAsXiPlus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
                
-               if(lIsBachelorPion     && 
-                  lIsNegInXiProton && 
-                  lIsPosInXiPion    )
+               if( lIsBachelorPion     && 
+                   lIsNegInXiProton && 
+                   lIsPosInXiPion    )
                        fCFContCascadePIDAsXiPlus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
        }
        
@@ -2863,8 +3712,7 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                lContainerPIDVars[0] = lmcPt              ;
                lContainerPIDVars[1] = lInvMassOmegaMinus ;
                lContainerPIDVars[2] = lmcRapCasc         ;
-               if (fCollidingSystems) lContainerPIDVars[3] = lcentrality;
-                else lContainerPIDVars[3] = lSPDTrackletsMultiplicity ; 
+               lContainerPIDVars[3] = lcentrality;
                        
                // No PID
                        fCFContCascadePIDAsOmegaMinus->Fill(lContainerPIDVars, 0); // No PID
@@ -2902,8 +3750,7 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                lContainerPIDVars[0] = lmcPt              ;
                lContainerPIDVars[1] = lInvMassOmegaPlus  ;
                lContainerPIDVars[2] = lmcRapCasc         ;
-               if (fCollidingSystems) lContainerPIDVars[3] = lcentrality;
-                else lContainerPIDVars[3] = lSPDTrackletsMultiplicity ; 
+               lContainerPIDVars[3] = lcentrality;
                        
                // No PID
                        fCFContCascadePIDAsOmegaPlus->Fill(lContainerPIDVars, 0); // No PID
@@ -2928,11 +3775,10 @@ for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Casc
                    lIsNegInOmegaProton    )
                        fCFContCascadePIDAsOmegaPlus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
                
-               if(lIsBachelorKaon     && 
-                  lIsNegInOmegaProton && 
-                  lIsPosInOmegaPion    )
+               if( lIsBachelorKaon     && 
+                   lIsNegInOmegaProton && 
+                   lIsPosInOmegaPion    )
                        fCFContCascadePIDAsOmegaPlus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
-       }
         
       }        
        
@@ -2949,29 +3795,6 @@ fHistnAssoOmegaPlus->Fill(nAssoOmegaPlus);
 }      
 
 
-Int_t AliAnalysisTaskCheckPerformanceCascadePbPb::DoESDTrackWithTPCrefitMultiplicity(const AliESDEvent *lESDevent) {
-    // Checking the number of tracks with TPCrefit for each event
-    // Needed for a rough assessment of the event multiplicity
-        
-        Int_t nTrackWithTPCrefitMultiplicity = 0;
-        for (Int_t iTrackIdx = 0; iTrackIdx < (InputEvent())->GetNumberOfTracks(); iTrackIdx++) {
-                AliESDtrack *esdTrack  = 0x0;
-                             esdTrack  = lESDevent->GetTrack( iTrackIdx );
-                if (!esdTrack) { AliWarning("Pb / Could not retrieve one track within the track loop for TPCrefit check ..."); continue; }
-
-                ULong_t lTrackStatus    = esdTrack->GetStatus();
-                            if ((lTrackStatus&AliESDtrack::kTPCrefit)    == 0) continue;
-                            else nTrackWithTPCrefitMultiplicity++;
-                    // FIXME :
-                    // The goal here is to get a better assessment of the event multiplicity.
-                    // (InputEvent())->GetNumberOfTracks() takes into account ITS std alone tracks + global tracks
-                    // This may introduce a bias. Hence the number of TPC refit tracks.
-                    // Note : the event multiplicity = analysis on its own... See Jacek's or Jan Fiete's analysis on dN/d(pt) and dN/d(eta)
-
-        }// end loop over all event tracks
-        return  nTrackWithTPCrefitMultiplicity;
-}
-
 //________________________________________________________________________
 void AliAnalysisTaskCheckPerformanceCascadePbPb::Terminate(Option_t *) {
   // Draw result to the screen
index 8de05f1..21f4abf 100644 (file)
@@ -6,8 +6,7 @@
 // //-----------------------------------------------------------------
 // //        AliAnalysisTaskCheckPerformanceCascadePbPb class
 // //            This task is for a performance study of cascade identification.
-// //            It works with MC info and ESD.
-// //              Use with AOD tree = under development
+// //            It works with MC info and ESD and AOD tree 
 // //            Origin   : A.Maire Jan2010, antonin.maire@ires.in2p3.fr
 // //            Modified : M.Nicassio Feb2011, maria.nicassio@ba.infn.it
 // //-----------------------------------------------------------------
@@ -32,12 +31,8 @@ class AliAnalysisTaskCheckPerformanceCascadePbPb : public AliAnalysisTaskSE {
   
   virtual void   UserCreateOutputObjects();
   virtual void   UserExec(Option_t *option);
-  virtual Int_t  DoESDTrackWithTPCrefitMultiplicity(const AliESDEvent *lESDevent);
   virtual void   Terminate(Option_t *);
   
-  void SetDebugLevelCascade(Int_t lDebugCascade = 0)          {fDebugCascade = lDebugCascade;}
-  void SetCollidingSystems (Short_t collidingSystems = 0)     {fCollidingSystems = collidingSystems;}
-  
   void SetAnalysisType     (const char* analysisType    = "ESD") { fAnalysisType     = analysisType;}
   
   void SetRelaunchV0CascVertexers    (Bool_t rerunV0CascVertexers       = 0    ) { fkRerunV0CascVertexers         =  rerunV0CascVertexers;      }
@@ -46,9 +41,7 @@ class AliAnalysisTaskCheckPerformanceCascadePbPb : public AliAnalysisTaskSE {
   void SetQualityCutNoTPConlyPrimVtx (Bool_t qualityCutNoTPConlyPrimVtx = kTRUE) { fkQualityCutNoTPConlyPrimVtx   =  qualityCutNoTPConlyPrimVtx;}
   void SetQualityCutTPCrefit         (Bool_t qualityCutTPCrefit         = kTRUE) { fkQualityCutTPCrefit           =  qualityCutTPCrefit;        }
   void SetQualityCut80TPCcls         (Bool_t qualityCut80TPCcls         = kTRUE) { fkQualityCut80TPCcls           =  qualityCut80TPCcls;        }
-  void SetAlephParamFor1PadTPCCluster(Bool_t onePadTPCCluster           = kTRUE) { fkIsDataRecoWith1PadTPCCluster =  onePadTPCCluster ;         }
   void SetExtraSelections            (Bool_t extraSelections            = 0    ) { fkExtraSelections              =  extraSelections;           }
-  void SetUseCFCont                  (Bool_t usecfcont                  = 0    ) { fUseCFCont                     = usecfcont;                  } 
   void SetCentralityLowLim           (Float_t centrlowlim               = 0.   ) { fCentrLowLim                   = centrlowlim;                }
   void SetCentralityUpLim            (Float_t centruplim                = 100. ) { fCentrUpLim                    = centruplim;                 }
   void SetCentralityEst              (TString centrest                  = "V0M") { fCentrEstimator                = centrest;                   }  
@@ -60,10 +53,7 @@ class AliAnalysisTaskCheckPerformanceCascadePbPb : public AliAnalysisTaskSE {
         // your data member object is created on the worker nodes and streaming is not needed.
         // http://root.cern.ch/download/doc/11InputOutput.pdf, page 14
 
-        Int_t           fDebugCascade;          // Denug Flag for this task devoted to cascade
         TString         fAnalysisType;          // "ESD" or "AOD" analysis type        
-        TString         fTriggerMaskType;       // type of trigger to use in UserExec : AliVEvent::kMB or kHighMult ?
-        Short_t         fCollidingSystems;      // 0 = pp collisions or 1 = AA collisions
         AliESDtrackCuts *fESDtrackCuts;         // ESD track cuts used for primary track definition
       //TPaveText       *fPaveTextBookKeeping;  // TString to store all the relevant info necessary for book keeping (v0 cuts, cascade cuts, quality cuts, ...)
         AliPIDResponse *fPIDResponse;           //! PID response object        
@@ -74,23 +64,23 @@ class AliAnalysisTaskCheckPerformanceCascadePbPb : public AliAnalysisTaskSE {
         Bool_t          fkQualityCutNoTPConlyPrimVtx;   // Boolean : kTRUE = prim vtx should be SPD or Tracking vertex
         Bool_t          fkQualityCutTPCrefit;           // Boolean : kTRUE = ask for TPCrefit for the 3 daughter tracks
         Bool_t          fkQualityCut80TPCcls;           // Boolean : kTRUE = ask for 80 TPC clusters for each daughter track
-        Bool_t          fkIsDataRecoWith1PadTPCCluster; // Boolean : kTRUE = data reconstructed with the "one pad cluster" algo in TPC (important for the ALEPH param for TPC PID)
         Bool_t          fkExtraSelections;              // Boolean : kTRUE = apply tighter selections, before starting the analysis
-        Bool_t          fUseCFCont;                     // enables usage of CF containers 
         Float_t         fCentrLowLim;                   // Lower limit for centrality percentile selection
         Float_t         fCentrUpLim;                    // Upper limit for centrality percentile selection
         TString         fCentrEstimator;                // String for the centrality estimator
         Float_t         fVtxRange;                      // to select events with |zvtx|<fVtxRange cm
         Bool_t          fApplyAccCut;                   // flag to apply acceptance cuts to MC cascades        
         
-        Double_t        fAlephParameters[5];            // Array to store the 5 param values for the TPC Bethe-Bloch parametrisation
         Double_t        fV0Sels[7];                     // Array to store the 7 values for the different selections V0 related (if fkRerunV0CascVertexers)
         Double_t        fCascSels[8];                   // Array to store the 8 values for the different selections Casc. related (if fkRerunV0CascVertexers)
        
        TList   *fListHistCascade;              //! List of Cascade histograms
 
                 // - Histos
-        TH2F    *fHistEvtsInCentralityBinsvsNtracks;    //! Events in centrality bins vs N ESDtracks 
+        TH2F    *fHistEvtsInCentralityBinsvsNtracks;    //! Events in centrality bins vs N ESDtracks
+        TH1F    *fHistBestVtxX;                //! Vertex distribution
+        TH1F    *fHistBestVtxY;                //! Vertex distribution
+        TH1F    *fHistBestVtxZ;                //! Vertex distribution
         TH1F    *fHistnXiPlusPerEvTot;         //! Cascade multiplicity histogram
         TH1F    *fHistnXiMinusPerEvTot;        //! Cascade multiplicity histogram
         TH1F    *fHistnOmegaPlusPerEvTot;      //! Cascade multiplicity histogram
@@ -120,12 +110,17 @@ class AliAnalysisTaskCheckPerformanceCascadePbPb : public AliAnalysisTaskSE {
        //--------------
        // Xi-
        TH1F    *fHistEtaGenCascXiMinus;                //! MC Pseudo-rapidity of any generated Xi- (no cuts in acceptance)
-        TH3D    *f3dHistGenPtVsGenYGenvsCentXiMinus;
-        TH3D    *f3dHistGenPtVsGenYGenvsNtracksXiMinus;
-               
+        TH3D    *f3dHistGenPtVsGenYvsCentXiMinusNat;
+        TH3D    *f3dHistGenPtVsGenYvsNtracksXiMinusNat;
+       TH3D    *f3dHistGenPtVsGenYvsCentXiMinusInj;
+        TH3D    *f3dHistGenPtVsGenYvsNtracksXiMinusInj;
+        TH3D    *f3dHistGenPtVsGenctauvsYXiMinusNat;
+        TH3D    *f3dHistGenPtVsGenctauvsYXiMinusInj;   
+
+        TH1F    *fHistThetaGenCascXiMinusNat;           //! MC Theta angle of the generated Xi-
+        TH1F    *fHistThetaGenCascXiMinusInj;           //! MC Theta angle of the injected Xi-
        // - Histos planned for Xi- emitted within the acceptance (cuts in theta + pt of daughters)
        //      = findable cascades
-       TH1F    *fHistThetaGenCascXiMinus;              //! MC Theta angle of the generated Xi-
        TH2D    *f2dHistGenPtVsGenYFdblXiMinus;         //! MC Pt Vs MC y of the findable Xi-
        
        TH1F    *fHistThetaLambdaXiMinus;               //! MC Theta angle of the Lambda daughter of the generated Xi-
@@ -143,12 +138,16 @@ class AliAnalysisTaskCheckPerformanceCascadePbPb : public AliAnalysisTaskSE {
        //--------------
        // Xi+
        TH1F    *fHistEtaGenCascXiPlus;                 //! MC Pseudo-rapidity of any generated Xi+ (no cuts in acceptance)
-        TH3D    *f3dHistGenPtVsGenYGenvsCentXiPlus;
-        TH3D    *f3dHistGenPtVsGenYGenvsNtracksXiPlus;
-
-                       
+        TH3D    *f3dHistGenPtVsGenYvsCentXiPlusNat;
+        TH3D    *f3dHistGenPtVsGenYvsNtracksXiPlusNat;
+        TH3D    *f3dHistGenPtVsGenYvsCentXiPlusInj;
+        TH3D    *f3dHistGenPtVsGenYvsNtracksXiPlusInj;
+        TH3D    *f3dHistGenPtVsGenctauvsYXiPlusNat;
+        TH3D    *f3dHistGenPtVsGenctauvsYXiPlusInj;
+       
+        TH1F    *fHistThetaGenCascXiPlusNat;            //! MC Theta angle of the generated Xi+
+        TH1F    *fHistThetaGenCascXiPlusInj;            //! MC Theta angle of the injected Xi+
        // - Histos planned for Xi+ emitted within the acceptance (cuts in theta + pt of daughters)
-       TH1F    *fHistThetaGenCascXiPlus;               //! MC Theta angle of the generated Xi+
        TH2D    *f2dHistGenPtVsGenYFdblXiPlus;          //! MC Pt Vs MC y of the findable Xi+
        
        TH1F    *fHistThetaLambdaXiPlus;                //! MC Theta angle of the anti-Lambda daughter of the generated Xi+
@@ -166,12 +165,16 @@ class AliAnalysisTaskCheckPerformanceCascadePbPb : public AliAnalysisTaskSE {
        //--------------
        // Omega-
        TH1F    *fHistEtaGenCascOmegaMinus;             //! MC Pseudo-rapidity of any generated Omega- (no cuts in acceptance)
-        TH3D    *f3dHistGenPtVsGenYGenvsCentOmegaMinus;
-        TH3D    *f3dHistGenPtVsGenYGenvsNtracksOmegaMinus;
+        TH3D    *f3dHistGenPtVsGenYvsCentOmegaMinusNat;
+        TH3D    *f3dHistGenPtVsGenYvsNtracksOmegaMinusNat;
+        TH3D    *f3dHistGenPtVsGenYvsCentOmegaMinusInj;
+        TH3D    *f3dHistGenPtVsGenYvsNtracksOmegaMinusInj;
+        TH3D    *f3dHistGenPtVsGenctauvsYOmegaMinusNat;
+        TH3D    *f3dHistGenPtVsGenctauvsYOmegaMinusInj;
 
-       
+        TH1F    *fHistThetaGenCascOmegaMinusNat;        //! MC Theta angle of the generated Omega-
+        TH1F    *fHistThetaGenCascOmegaMinusInj;        //! MC Theta angle of the injected Omega-
        // - Histos planned for Omega- emitted within the acceptance (cuts in theta + pt of daughters)
-       TH1F    *fHistThetaGenCascOmegaMinus;           //! MC Theta angle of the generated Omega-
        TH2D    *f2dHistGenPtVsGenYFdblOmegaMinus;      //! MC Pt Vs MC y of the findable Omega-
        
        TH1F    *fHistThetaLambdaOmegaMinus;            //! MC Theta angle of the Lambda daughter of the generated Omega-
@@ -189,12 +192,16 @@ class AliAnalysisTaskCheckPerformanceCascadePbPb : public AliAnalysisTaskSE {
        //--------------
        // Omega+
        TH1F    *fHistEtaGenCascOmegaPlus;              //! MC Pseudo-rapidity of any generated Omega+ (no cuts in acceptance)
-        TH3D    *f3dHistGenPtVsGenYGenvsCentOmegaPlus;
-        TH3D    *f3dHistGenPtVsGenYGenvsNtracksOmegaPlus;
-
-               
+        TH3D    *f3dHistGenPtVsGenYvsCentOmegaPlusNat;
+        TH3D    *f3dHistGenPtVsGenYvsNtracksOmegaPlusNat;
+        TH3D    *f3dHistGenPtVsGenYvsCentOmegaPlusInj;
+        TH3D    *f3dHistGenPtVsGenYvsNtracksOmegaPlusInj;
+        TH3D    *f3dHistGenPtVsGenctauvsYOmegaPlusNat;
+        TH3D    *f3dHistGenPtVsGenctauvsYOmegaPlusInj;
+       
+        TH1F    *fHistThetaGenCascOmegaPlusNat;         //! MC Theta angle of the generated Omega+
+        TH1F    *fHistThetaGenCascOmegaPlusInj;         //! MC Theta angle of the injected Omega+
        // - Histos planned for Omega+ emitted within the acceptance (cuts in theta + pt of daughters)
-       TH1F    *fHistThetaGenCascOmegaPlus;            //! MC Theta angle of the generated Omega+
        TH2D    *f2dHistGenPtVsGenYFdblOmegaPlus;       //! MC Pt Vs MC y of the findable Omega+
        
        TH1F    *fHistThetaLambdaOmegaPlus;             //! MC Theta angle of the anti-Lambda daughter of the generated Omega+
@@ -277,7 +284,15 @@ class AliAnalysisTaskCheckPerformanceCascadePbPb : public AliAnalysisTaskSE {
         TH2F    *f2dHistAsMCResPhiXiPlus;               //! resolution in azimuth Phi = f(gen. Pt), for Xi+
         TH2F    *f2dHistAsMCResPhiOmegaMinus;           //! resolution in azimuth Phi = f(gen. Pt), for Omega-
         TH2F    *f2dHistAsMCResPhiOmegaPlus;            //! resolution in azimuth Phi = f(gen. Pt), for Omega+
-        
+
+        TH2F    *f2dHistAsMCptProtonMCptXiMinus;        //! MC pt proton vs Mc pt Xi-
+        TH2F    *f2dHistAsMCptAntiprotonMCptXiPlus;     //! MC pt antiproton vs Mc pt Xi+
+        TH2F    *f2dHistAsMCptProtonMCptOmegaMinus;     //! MC pt proton vs Mc pt Omega-
+        TH2F    *f2dHistAsMCptAntiprotonMCptOmegaPlus;  //! MC pt antiproton vs Mc pt Omega+
+
+        TH1F    *fHistV0toXiCosineOfPointingAngle;      //! To check new V0 CosPA cut
+        TH2F    *fHistV0CosineOfPointingAnglevsPtXi;    //! To check new V0 CosPA cut 
+        TH2F    *fHistV0CosineOfPointingAnglevsPtOmega; //! To check new V0 CosPA cut 
         
         // - Compilation of all PID plots (3D = casc. transv. momemtum Vs Casc Eff mass Vs Y), stored into an AliCFContainer
        AliCFContainer  *fCFContCascadePIDAsXiMinus;      //! for Xi-   : Container to store any 3D histos with the different PID flavours
@@ -289,11 +304,11 @@ class AliAnalysisTaskCheckPerformanceCascadePbPb : public AliAnalysisTaskSE {
        AliCFContainer  *fCFContAsCascadeCuts;            //! Container meant to store all the relevant distributions corresponding to the cut variables
 
         TH1F *fV0Ampl;                                    //! Histo to check the V0 amplitude distribution (centrality estimator)  
-       
+
   AliAnalysisTaskCheckPerformanceCascadePbPb(const AliAnalysisTaskCheckPerformanceCascadePbPb&);            // not implemented
   AliAnalysisTaskCheckPerformanceCascadePbPb& operator=(const AliAnalysisTaskCheckPerformanceCascadePbPb&); // not implemented
   
-  ClassDef(AliAnalysisTaskCheckPerformanceCascadePbPb, 2);
+  ClassDef(AliAnalysisTaskCheckPerformanceCascadePbPb, 3);
 };
 
 #endif