]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGLF/STRANGENESS/LambdaK0/AliAnalysisTaskExtractPerformanceV0.cxx
Changes for decay length debugging.
[u/mrichter/AliRoot.git] / PWGLF / STRANGENESS / LambdaK0 / AliAnalysisTaskExtractPerformanceV0.cxx
index 6017a2ea046e87ce2c6cd7a9501df54adb68e130..bdb46e9ec19729a0e76a09799e7a8f46b6dc78d9 100644 (file)
@@ -86,6 +86,7 @@ class AliAODv0;
 #include "AliESDcascade.h"
 #include "AliAODcascade.h"
 #include "AliESDUtils.h"
+#include "AliGenEventHeader.h"
 
 #include "AliAnalysisTaskExtractPerformanceV0.h"
 
@@ -95,7 +96,7 @@ using std::endl;
 ClassImp(AliAnalysisTaskExtractPerformanceV0)
 
 AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0() 
-  : AliAnalysisTaskSE(), fListHistV0(0), fTree(0), fPIDResponse(0),
+  : AliAnalysisTaskSE(), fListHistV0(0), fTree(0), fPIDResponse(0), fESDtrackCuts(0),
    fkIsNuclear   ( kFALSE ), 
    fkLowEnergyPP ( kFALSE ),
    fkUseOnTheFly ( kFALSE ),
@@ -115,6 +116,25 @@ AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0()
    fHistMultiplicityNoTPCOnly(0),
    fHistMultiplicityNoTPCOnlyNoPileup(0),
 
+       f2dHistMultiplicityVsTrueBeforeTrigSel(0),
+       f2dHistMultiplicityVsTrueForTrigEvt(0),
+       f2dHistMultiplicityVsTrue(0),
+       f2dHistMultiplicityVsTrueNoTPCOnly(0),
+       f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup(0),
+
+  //Raw Data for Vertex Z position estimator change
+       f2dHistMultiplicityVsVertexZBeforeTrigSel(0),
+       f2dHistMultiplicityVsVertexZForTrigEvt(0),
+       f2dHistMultiplicityVsVertexZ(0),
+       f2dHistMultiplicityVsVertexZNoTPCOnly(0),
+       f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup(0),
+
+  fHistGenVertexZBeforeTrigSel(0),     
+  fHistGenVertexZForTrigEvt(0),
+  fHistGenVertexZ(0),
+  fHistGenVertexZNoTPCOnly(0),
+  fHistGenVertexZNoTPCOnlyNoPileup(0),
+
 //------------------------------------------------
 // PARTICLE HISTOGRAMS
 // --- Filled on a Particle-by-Particle basis
@@ -125,11 +145,26 @@ AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0()
    f3dHistPrimRawPtVsYVsMultLambda(0),
    f3dHistPrimRawPtVsYVsMultAntiLambda(0),
    f3dHistPrimRawPtVsYVsMultK0Short(0),
+   f3dHistPrimRawPtVsYVsMultMCLambda(0),
+   f3dHistPrimRawPtVsYVsMultMCAntiLambda(0),
+   f3dHistPrimRawPtVsYVsMultMCK0Short(0),
+   f3dHistPrimRawPtVsYVsVertexZLambda(0),
+   f3dHistPrimRawPtVsYVsVertexZAntiLambda(0),
+   f3dHistPrimRawPtVsYVsVertexZK0Short(0),
+   f3dHistPrimCloseToPVPtVsYVsMultLambda(0),
+   f3dHistPrimCloseToPVPtVsYVsMultAntiLambda(0),
+   f3dHistPrimCloseToPVPtVsYVsMultK0Short(0),
    f3dHistPrimRawPtVsYVsDecayLengthLambda(0),
    f3dHistPrimRawPtVsYVsDecayLengthAntiLambda(0),
    f3dHistPrimRawPtVsYVsDecayLengthK0Short(0),
    f3dHistGenPtVsYVsMultXiMinus(0),
    f3dHistGenPtVsYVsMultXiPlus(0),
+   f3dHistGenPtVsYVsMultOmegaMinus(0),
+   f3dHistGenPtVsYVsMultOmegaPlus(0),
+   f3dHistGenSelectedPtVsYVsMultXiMinus(0),
+   f3dHistGenSelectedPtVsYVsMultXiPlus(0),
+   f3dHistGenSelectedPtVsYVsMultOmegaMinus(0),
+   f3dHistGenSelectedPtVsYVsMultOmegaPlus(0),
    fHistPVx(0),
    fHistPVy(0),
    fHistPVz(0),
@@ -145,7 +180,7 @@ AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0()
 }
 
 AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0(const char *name) 
-  : AliAnalysisTaskSE(name), fListHistV0(0), fTree(0), fPIDResponse(0),
+  : AliAnalysisTaskSE(name), fListHistV0(0), fTree(0), fPIDResponse(0), fESDtrackCuts(0),
    fkIsNuclear   ( kFALSE ), 
    fkLowEnergyPP ( kFALSE ),
    fkUseOnTheFly ( kFALSE ),
@@ -165,6 +200,24 @@ AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0(const c
    fHistMultiplicityNoTPCOnly(0),
    fHistMultiplicityNoTPCOnlyNoPileup(0),
 
+       f2dHistMultiplicityVsTrueBeforeTrigSel(0),
+       f2dHistMultiplicityVsTrueForTrigEvt(0),
+       f2dHistMultiplicityVsTrue(0),
+       f2dHistMultiplicityVsTrueNoTPCOnly(0),
+       f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup(0),
+
+  //Raw Data for Vertex Z position estimator change
+       f2dHistMultiplicityVsVertexZBeforeTrigSel(0),
+       f2dHistMultiplicityVsVertexZForTrigEvt(0),
+       f2dHistMultiplicityVsVertexZ(0),
+       f2dHistMultiplicityVsVertexZNoTPCOnly(0),
+       f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup(0),
+
+  fHistGenVertexZBeforeTrigSel(0),     
+  fHistGenVertexZForTrigEvt(0),
+  fHistGenVertexZ(0),
+  fHistGenVertexZNoTPCOnly(0),
+  fHistGenVertexZNoTPCOnlyNoPileup(0),
 
 //------------------------------------------------
 // PARTICLE HISTOGRAMS
@@ -176,11 +229,26 @@ AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0(const c
    f3dHistPrimRawPtVsYVsMultLambda(0),
    f3dHistPrimRawPtVsYVsMultAntiLambda(0),
    f3dHistPrimRawPtVsYVsMultK0Short(0),
+   f3dHistPrimRawPtVsYVsMultMCLambda(0),
+   f3dHistPrimRawPtVsYVsMultMCAntiLambda(0),
+   f3dHistPrimRawPtVsYVsMultMCK0Short(0),
+   f3dHistPrimRawPtVsYVsVertexZLambda(0),
+   f3dHistPrimRawPtVsYVsVertexZAntiLambda(0),
+   f3dHistPrimRawPtVsYVsVertexZK0Short(0),
+   f3dHistPrimCloseToPVPtVsYVsMultLambda(0),
+   f3dHistPrimCloseToPVPtVsYVsMultAntiLambda(0),
+   f3dHistPrimCloseToPVPtVsYVsMultK0Short(0),
    f3dHistPrimRawPtVsYVsDecayLengthLambda(0),
    f3dHistPrimRawPtVsYVsDecayLengthAntiLambda(0),
    f3dHistPrimRawPtVsYVsDecayLengthK0Short(0),
    f3dHistGenPtVsYVsMultXiMinus(0),
    f3dHistGenPtVsYVsMultXiPlus(0),
+   f3dHistGenPtVsYVsMultOmegaMinus(0),
+   f3dHistGenPtVsYVsMultOmegaPlus(0),
+   f3dHistGenSelectedPtVsYVsMultXiMinus(0),
+   f3dHistGenSelectedPtVsYVsMultXiPlus(0),
+   f3dHistGenSelectedPtVsYVsMultOmegaMinus(0),
+   f3dHistGenSelectedPtVsYVsMultOmegaPlus(0),
    fHistPVx(0),
    fHistPVy(0),
    fHistPVz(0),
@@ -213,6 +281,11 @@ AliAnalysisTaskExtractPerformanceV0::~AliAnalysisTaskExtractPerformanceV0()
       delete fTree;
       fTree = 0x0;
    }
+    //cleanup esd track cuts object too...
+   if (fESDtrackCuts){
+    delete fESDtrackCuts;
+    fESDtrackCuts = 0x0; 
+  }
 }
 
 //________________________________________________________________________
@@ -221,10 +294,13 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
 
    OpenFile(2);        
    // Called once
+
+//------------------------------------------------
+
    fTree = new TTree("fTree","V0Candidates");
 
 //------------------------------------------------
-// fTree Branch definitions
+// fTree Branch definitions - V0 Tree
 //------------------------------------------------
 
 //-----------BASIC-INFO---------------------------
@@ -259,6 +335,7 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
 /*27*/   fTree->Branch("fTreeVariableV0CosineOfPointingAngle",&fTreeVariableV0CosineOfPointingAngle,"fTreeVariableV0CosineOfPointingAngle/F");
 //-----------MULTIPLICITY-INFO--------------------
 /*28*/   fTree->Branch("fTreeVariableMultiplicity",&fTreeVariableMultiplicity,"fTreeVariableMultiplicity/I");
+/*28*/   fTree->Branch("fTreeVariableMultiplicityMC",&fTreeVariableMultiplicityMC,"fTreeVariableMultiplicityMC/I");
 //------------------------------------------------
 /*29*/   fTree->Branch("fTreeVariableDistOverTotMom",&fTreeVariableDistOverTotMom,"fTreeVariableDistOverTotMom/F");
 /*30*/   fTree->Branch("fTreeVariableNSigmasPosProton",&fTreeVariableNSigmasPosProton,"fTreeVariableNSigmasPosProton/F");
@@ -272,6 +349,38 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
 /*37*/   fTree->Branch("fTreeVariableIndexStatus",&fTreeVariableIndexStatus,"fTreeVariableIndexStatus/I");
 /*38*/   fTree->Branch("fTreeVariableIndexStatusMother",&fTreeVariableIndexStatusMother,"fTreeVariableIndexStatusMother/I");
 
+/*39*/          fTree->Branch("fTreeVariableRunNumber",&fTreeVariableRunNumber,"fTreeVariableRunNumber/I");
+/*40*/   fTree->Branch("fTreeVariableEventNumber",&fTreeVariableEventNumber,"fTreeVariableEventNumber/l");
+
+/*34*/   fTree->Branch("fTreeVariableVertexZ",&fTreeVariableVertexZ,"fTreeVariableVertexZ/F");
+
+//-----------FOR CTAU DEBUGGING: Full Phase Space + Decay Position Info 
+        fTree->Branch("fTreeVariableV0x",&fTreeVariableV0x,"fTreeVariableV0x/F");
+        fTree->Branch("fTreeVariableV0y",&fTreeVariableV0y,"fTreeVariableV0y/F");
+        fTree->Branch("fTreeVariableV0z",&fTreeVariableV0z,"fTreeVariableV0z/F");
+
+        fTree->Branch("fTreeVariableV0Px",&fTreeVariableV0Px,"fTreeVariableV0Px/F");
+        fTree->Branch("fTreeVariableV0Py",&fTreeVariableV0Py,"fTreeVariableV0Py/F");
+        fTree->Branch("fTreeVariableV0Pz",&fTreeVariableV0Pz,"fTreeVariableV0Pz/F");
+
+//-----------FOR CTAU DEBUGGING: Full Phase Space + Decay Position Info, perfect info from MC
+        fTree->Branch("fTreeVariableMCV0x",&fTreeVariableMCV0x,"fTreeVariableMCV0x/F");
+        fTree->Branch("fTreeVariableMCV0y",&fTreeVariableMCV0y,"fTreeVariableMCV0y/F");
+        fTree->Branch("fTreeVariableMCV0z",&fTreeVariableMCV0z,"fTreeVariableMCV0z/F");
+
+        fTree->Branch("fTreeVariableMCV0Px",&fTreeVariableMCV0Px,"fTreeVariableMCV0Px/F");
+        fTree->Branch("fTreeVariableMCV0Py",&fTreeVariableMCV0Py,"fTreeVariableMCV0Py/F");
+        fTree->Branch("fTreeVariableMCV0Pz",&fTreeVariableMCV0Pz,"fTreeVariableMCV0Pz/F");
+
+//-----------FOR CTAU DEBUGGING: Primary vertex info 
+        fTree->Branch("fTreeVariablePVx",&fTreeVariablePVx,"fTreeVariablePVx/F");
+        fTree->Branch("fTreeVariablePVy",&fTreeVariablePVy,"fTreeVariablePVy/F");
+        fTree->Branch("fTreeVariablePVz",&fTreeVariablePVz,"fTreeVariablePVz/F");
+
+        fTree->Branch("fTreeVariableMCPVx",&fTreeVariableMCPVx,"fTreeVariableMCPVx/F");
+        fTree->Branch("fTreeVariableMCPVy",&fTreeVariableMCPVy,"fTreeVariableMCPVy/F");
+        fTree->Branch("fTreeVariableMCPVz",&fTreeVariableMCPVz,"fTreeVariableMCPVz/F");
+
 //------------------------------------------------
 // Particle Identification Setup
 //------------------------------------------------
@@ -280,6 +389,12 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
    AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
    fPIDResponse = inputHandler->GetPIDResponse();
 
+  // Multiplicity 
+
+    if(! fESDtrackCuts ){
+          fESDtrackCuts = new AliESDtrackCuts();
+    }
+
 //------------------------------------------------
 // V0 Multiplicity Histograms
 //------------------------------------------------
@@ -359,6 +474,113 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
       fListHistV0->Add(fHistMultiplicityNoTPCOnlyNoPileup);
    }
 
+  //Raw Data for J/Psi paper Technique
+       //TH2F    *f2dHistMultiplicityVsTrueBeforeTrigSel;              //! multiplicity distribution    
+       //TH2F    *f2dHistMultiplicityVsTrueForTrigEvt;                         //! multiplicity distribution
+       //TH2F    *f2dHistMultiplicityVsTrue;                                                   //! multiplicity distribution
+       //TH2F    *f2dHistMultiplicityVsTrueNoTPCOnly;                          //! multiplicity distribution
+       //TH2F    *f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup;                  //! multiplicity distribution
+
+   if(! f2dHistMultiplicityVsTrueBeforeTrigSel) {
+      f2dHistMultiplicityVsTrueBeforeTrigSel = new TH2F("f2dHistMultiplicityVsTrueBeforeTrigSel", 
+         "Tracks per event", 200, 0, 200, 200, 0, 200);                
+      fListHistV0->Add(f2dHistMultiplicityVsTrueBeforeTrigSel);
+   }
+   if(! f2dHistMultiplicityVsTrueForTrigEvt) {
+      f2dHistMultiplicityVsTrueForTrigEvt = new TH2F("f2dHistMultiplicityVsTrueForTrigEvt", 
+         "Tracks per event", 200, 0, 200, 200, 0, 200);                
+      fListHistV0->Add(f2dHistMultiplicityVsTrueForTrigEvt);
+   }
+   if(! f2dHistMultiplicityVsTrue) {
+      f2dHistMultiplicityVsTrue = new TH2F("f2dHistMultiplicityVsTrue", 
+         "Tracks per event", 200, 0, 200, 200, 0, 200);                
+      fListHistV0->Add(f2dHistMultiplicityVsTrue);
+   }
+   if(! f2dHistMultiplicityVsTrueNoTPCOnly) {
+      f2dHistMultiplicityVsTrueNoTPCOnly = new TH2F("f2dHistMultiplicityVsTrueNoTPCOnly", 
+         "Tracks per event", 200, 0, 200, 200, 0, 200);                
+      fListHistV0->Add(f2dHistMultiplicityVsTrueNoTPCOnly);
+   }
+   if(! f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup) {
+      f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup = new TH2F("f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup", 
+         "Tracks per event", 200, 0, 200, 200, 0, 200);                
+      fListHistV0->Add(f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup);
+   }
+
+
+  //Raw Data for Vertex Z position estimator change
+       //TH2F    *f2dHistMultiplicityVsVertexZBeforeTrigSel;           //! multiplicity distribution    
+       //TH2F    *f2dHistMultiplicityVsVertexZForTrigEvt;                      //! multiplicity distribution
+       //TH2F    *f2dHistMultiplicityVsVertexZ;                                                //! multiplicity distribution
+       //TH2F    *f2dHistMultiplicityVsVertexZNoTPCOnly;                               //! multiplicity distribution
+       //TH2F    *f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup;                       //! multiplicity distribution
+
+   if(! f2dHistMultiplicityVsVertexZBeforeTrigSel) {
+      f2dHistMultiplicityVsVertexZBeforeTrigSel = new TH2F("f2dHistMultiplicityVsVertexZBeforeTrigSel", 
+         "Tracks per event", 200, 0, 200,400, -20, 20);                
+      fListHistV0->Add(f2dHistMultiplicityVsVertexZBeforeTrigSel);
+   }
+   if(! f2dHistMultiplicityVsVertexZForTrigEvt) {
+      f2dHistMultiplicityVsVertexZForTrigEvt = new TH2F("f2dHistMultiplicityVsVertexZForTrigEvt", 
+         "Tracks per event", 200, 0, 200, 400, -20, 20);               
+      fListHistV0->Add(f2dHistMultiplicityVsVertexZForTrigEvt);
+   }
+   if(! f2dHistMultiplicityVsVertexZ) {
+      f2dHistMultiplicityVsVertexZ = new TH2F("f2dHistMultiplicityVsVertexZ", 
+         "Tracks per event", 200, 0, 200, 400, -20, 20);               
+      fListHistV0->Add(f2dHistMultiplicityVsVertexZ);
+   }
+   if(! f2dHistMultiplicityVsVertexZNoTPCOnly) {
+      f2dHistMultiplicityVsVertexZNoTPCOnly = new TH2F("f2dHistMultiplicityVsVertexZNoTPCOnly", 
+         "Tracks per event", 200, 0, 200, 400, -20, 20);               
+      fListHistV0->Add(f2dHistMultiplicityVsVertexZNoTPCOnly);
+   }
+   if(! f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup) {
+      f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup = new TH2F("f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup", 
+         "Tracks per event", 200, 0, 200, 400, -20, 20);               
+      fListHistV0->Add(f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup);
+   }
+
+//Generated PVz test
+
+//   TH1F      *fHistGenVertexZBeforeTrigSel;     //! multiplicity distribution      
+//   TH1F      *fHistGenVertexZForTrigEvt;        //! multiplicity distribution
+//   TH1F      *fHistGenVertexZ;                  //! multiplicity distribution
+//   TH1F      *fHistGenVertexZNoTPCOnly;         //! multiplicity distribution
+//   TH1F      *fHistGenVertexZNoTPCOnlyNoPileup; //! multiplicity distribution
+
+   if(! fHistGenVertexZBeforeTrigSel) {
+         fHistGenVertexZBeforeTrigSel = new TH1F("fHistGenVertexZBeforeTrigSel", 
+            "PV z position;Nbr of Evts;z", 
+            400, -20, 20);       
+      fListHistV0->Add(fHistGenVertexZBeforeTrigSel);
+   }
+   if(! fHistGenVertexZForTrigEvt) {
+         fHistGenVertexZForTrigEvt = new TH1F("fHistGenVertexZForTrigEvt", 
+            "PV z position;Nbr of Evts;z", 
+            400, -20, 20);       
+      fListHistV0->Add(fHistGenVertexZForTrigEvt);
+   }
+   if(! fHistGenVertexZ) {
+         fHistGenVertexZ = new TH1F("fHistGenVertexZ", 
+            "PV z position;Nbr of Evts;z", 
+            400, -20, 20);       
+      fListHistV0->Add(fHistGenVertexZ);
+   }
+   if(! fHistGenVertexZNoTPCOnly) {
+         fHistGenVertexZNoTPCOnly = new TH1F("fHistGenVertexZNoTPCOnly", 
+            "PV z position;Nbr of Evts;z", 
+            400, -20, 20);       
+      fListHistV0->Add(fHistGenVertexZNoTPCOnly);
+   }
+   if(! fHistGenVertexZNoTPCOnlyNoPileup) {
+         fHistGenVertexZNoTPCOnlyNoPileup = new TH1F("fHistGenVertexZNoTPCOnlyNoPileup", 
+            "PV z position;Nbr of Evts;z", 
+            400, -20, 20);       
+      fListHistV0->Add(fHistGenVertexZNoTPCOnlyNoPileup);
+   }
+
+
 //------------------------------------------------
 // Generated Particle Histograms
 //------------------------------------------------
@@ -386,6 +608,52 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
       fListHistV0->Add(f3dHistPrimRawPtVsYVsMultK0Short);
    }
 
+//--- 3D Histo (Pt, Y, MultiplicityMC)  
+
+   if(! f3dHistPrimRawPtVsYVsMultMCLambda) {
+      f3dHistPrimRawPtVsYVsMultMCLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultMCLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistPrimRawPtVsYVsMultMCLambda);
+   }
+   if(! f3dHistPrimRawPtVsYVsMultMCAntiLambda) {
+      f3dHistPrimRawPtVsYVsMultMCAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultMCAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistPrimRawPtVsYVsMultMCAntiLambda);
+   }
+   if(! f3dHistPrimRawPtVsYVsMultMCK0Short) {
+      f3dHistPrimRawPtVsYVsMultMCK0Short = new TH3F( "f3dHistPrimRawPtVsYVsMultMCK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistPrimRawPtVsYVsMultMCK0Short);
+   }
+
+//--- 3D Histo (Pt, Y, VertexZ)  
+
+   if(! f3dHistPrimRawPtVsYVsVertexZLambda) {
+      f3dHistPrimRawPtVsYVsVertexZLambda = new TH3F( "f3dHistPrimRawPtVsYVsVertexZLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs VertexZiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; VertexZ", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,40,-10,10);
+      fListHistV0->Add(f3dHistPrimRawPtVsYVsVertexZLambda);
+   }
+   if(! f3dHistPrimRawPtVsYVsVertexZAntiLambda) {
+      f3dHistPrimRawPtVsYVsVertexZAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsVertexZAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs VertexZiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; VertexZ", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,40,-10,10);
+      fListHistV0->Add(f3dHistPrimRawPtVsYVsVertexZAntiLambda);
+   }
+   if(! f3dHistPrimRawPtVsYVsVertexZK0Short) {
+      f3dHistPrimRawPtVsYVsVertexZK0Short = new TH3F( "f3dHistPrimRawPtVsYVsVertexZK0Short", "Pt_{K0S} Vs Y_{K0S} Vs VertexZiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; VertexZ", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,40,-10,10);
+      fListHistV0->Add(f3dHistPrimRawPtVsYVsVertexZK0Short);
+   }
+
+//--- 3D Histo (Pt, Y, Multiplicity), close to PV criterion
+
+   if(! f3dHistPrimCloseToPVPtVsYVsMultLambda) {
+      f3dHistPrimCloseToPVPtVsYVsMultLambda = new TH3F( "f3dHistPrimCloseToPVPtVsYVsMultLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistPrimCloseToPVPtVsYVsMultLambda);
+   }
+   if(! f3dHistPrimCloseToPVPtVsYVsMultAntiLambda) {
+      f3dHistPrimCloseToPVPtVsYVsMultAntiLambda = new TH3F( "f3dHistPrimCloseToPVPtVsYVsMultAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistPrimCloseToPVPtVsYVsMultAntiLambda);
+   }
+   if(! f3dHistPrimCloseToPVPtVsYVsMultK0Short) {
+      f3dHistPrimCloseToPVPtVsYVsMultK0Short = new TH3F( "f3dHistPrimCloseToPVPtVsYVsMultK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistPrimCloseToPVPtVsYVsMultK0Short);
+   }
+
+
 //--- 3D Histo (Pt, Y, Proper Decay Length)
 
    if(! f3dHistPrimRawPtVsYVsDecayLengthLambda) {
@@ -401,7 +669,8 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
       fListHistV0->Add(f3dHistPrimRawPtVsYVsDecayLengthK0Short);
    }
 
-//--- 3D Histo (Pt, Y, Multiplicity) for generated charged Xi (feeddown)
+//--------------------------------------------------------------------------------------
+//--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, all generated
 
    if(! f3dHistGenPtVsYVsMultXiMinus) {
       f3dHistGenPtVsYVsMultXiMinus = new TH3F( "f3dHistGenPtVsYVsMultXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
@@ -411,6 +680,39 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
       f3dHistGenPtVsYVsMultXiPlus = new TH3F( "f3dHistGenPtVsYVsMultXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
       fListHistV0->Add(f3dHistGenPtVsYVsMultXiPlus);
    }
+//--- 3D Histo (Pt, Y, Multiplicity) for generated OmegaMinus/Plus
+
+   if(! f3dHistGenPtVsYVsMultOmegaMinus) {
+      f3dHistGenPtVsYVsMultOmegaMinus = new TH3F( "f3dHistGenPtVsYVsMultOmegaMinus", "Pt_{#Omega} Vs Y_{#Omega} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Omega} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistGenPtVsYVsMultOmegaMinus);
+   }
+   if(! f3dHistGenPtVsYVsMultOmegaPlus) {
+      f3dHistGenPtVsYVsMultOmegaPlus = new TH3F( "f3dHistGenPtVsYVsMultOmegaPlus", "Pt_{#Omega} Vs Y_{#Omega} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Omega} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistGenPtVsYVsMultOmegaPlus);
+   }
+
+//--------------------------------------------------------------------------------------
+//--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
+
+   if(! f3dHistGenSelectedPtVsYVsMultXiMinus) {
+      f3dHistGenSelectedPtVsYVsMultXiMinus = new TH3F( "f3dHistGenSelectedPtVsYVsMultXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultXiMinus);
+   }
+   if(! f3dHistGenSelectedPtVsYVsMultXiPlus) {
+      f3dHistGenSelectedPtVsYVsMultXiPlus = new TH3F( "f3dHistGenSelectedPtVsYVsMultXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultXiPlus);
+   }
+//--- 3D Histo (Pt, Y, Multiplicity) for generated OmegaMinus/Plus
+
+   if(! f3dHistGenSelectedPtVsYVsMultOmegaMinus) {
+      f3dHistGenSelectedPtVsYVsMultOmegaMinus = new TH3F( "f3dHistGenSelectedPtVsYVsMultOmegaMinus", "Pt_{#Omega} Vs Y_{#Omega} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Omega} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultOmegaMinus);
+   }
+   if(! f3dHistGenSelectedPtVsYVsMultOmegaPlus) {
+      f3dHistGenSelectedPtVsYVsMultOmegaPlus = new TH3F( "f3dHistGenSelectedPtVsYVsMultOmegaPlus", "Pt_{#Omega} Vs Y_{#Omega} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Omega} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
+      fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultOmegaPlus);
+   }
+
 
 //----------------------------------
 // Histos at analysis level 
@@ -532,6 +834,12 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       return;
    }
         
+   fTreeVariableRunNumber = lESDevent->GetRunNumber();
+   fTreeVariableEventNumber =  
+    ( ( ((ULong64_t)lESDevent->GetPeriodNumber() ) << 36 ) |
+      ( ((ULong64_t)lESDevent->GetOrbitNumber () ) << 12 ) |
+        ((ULong64_t)lESDevent->GetBunchCrossNumber() )  );
+
    lMCevent = MCEvent();
    if (!lMCevent) {
       Printf("ERROR: Could not retrieve MC event \n");
@@ -545,6 +853,10 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       cout << "Name of the file with pb :" <<  fInputHandler->GetTree()->GetCurrentFile()->GetName() << endl;
       return;
    }
+   TArrayF mcPrimaryVtx;
+   AliGenEventHeader* mcHeader=lMCevent->GenEventHeader();
+   if(!mcHeader) return;
+   mcHeader->PrimaryVertex(mcPrimaryVtx);
         
 //------------------------------------------------
 // Multiplicity Information Acquistion
@@ -553,7 +865,8 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
    //REVISED multiplicity estimator after 'multiplicity day' (2011)
    Int_t lMultiplicity = -100; 
 
-   if(fkIsNuclear == kFALSE) lMultiplicity = AliESDtrackCuts::GetReferenceMultiplicity( lESDevent );
+   //testing purposes
+   if(fkIsNuclear == kFALSE) lMultiplicity = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC,0.5);
 
    //---> If this is a nuclear collision, then go nuclear on "multiplicity" variable...
    //---> Warning: Experimental
@@ -615,11 +928,16 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
          Printf("Cascade loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
          continue;
       }
-      if ( TMath::Abs(lCurrentParticlePrimary->GetPdgCode()) == 3312 ){ 
-         Double_t lRapXiMCPrimary = 0.5*TMath::Log((lCurrentParticlePrimary->Energy() + lCurrentParticlePrimary->Pz()) / (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13));
+      if ( TMath::Abs(lCurrentParticlePrimary->GetPdgCode()) == 3312 || TMath::Abs(lCurrentParticlePrimary->GetPdgCode()) == 3334 ) { 
+         Double_t lRapXiMCPrimary = -100;
+         if( (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) != 0 ) { 
+           if ( (lCurrentParticlePrimary->Energy() + lCurrentParticlePrimary->Pz()) / (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) !=0 ){
+             lRapXiMCPrimary = 0.5*TMath::Log( (lCurrentParticlePrimary->Energy() + lCurrentParticlePrimary->Pz()) / (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) );
+           }
+         }
 
          //=================================================================================
-         // Xi Histograms for Feeddown - Primary Charged Xis
+         // Xi Histograms
          if( lCurrentParticlePrimary->GetPdgCode() == 3312 ){ 
             lPtCurrentPart    = lCurrentParticlePrimary->Pt();
             f3dHistGenPtVsYVsMultXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
@@ -628,10 +946,43 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
             lPtCurrentPart    = lCurrentParticlePrimary->Pt();
             f3dHistGenPtVsYVsMultXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
          }
+         // Omega Histograms
+         if( lCurrentParticlePrimary->GetPdgCode() == 3334 ){ 
+            lPtCurrentPart    = lCurrentParticlePrimary->Pt();
+            f3dHistGenPtVsYVsMultOmegaMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+         }
+         if( lCurrentParticlePrimary->GetPdgCode() == -3334 ){ 
+            lPtCurrentPart    = lCurrentParticlePrimary->Pt();
+            f3dHistGenPtVsYVsMultOmegaPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+         }
       } 
    }
 //----- End Loop on primary Xi, Omega ----------------------------------------------------------
 
+//--------- GENERATED NUMBER OF CHARGED PARTICLES
+// ---> Set Variables to Zero again
+// ---> Variable Definition
+
+  Long_t lNumberOfCharged = 0; 
+
+//----- Loop on Stack ----------------------------------------------------------------
+   for (Int_t iCurrentLabelStack = 0;  iCurrentLabelStack < (lMCstack->GetNtrack()); iCurrentLabelStack++) 
+   {// This is the begining of the loop on tracks
+      TParticle* particleOne = lMCstack->Particle(iCurrentLabelStack);
+      if(!particleOne) continue;
+      if(!particleOne->GetPDG()) continue;
+      Double_t lThisCharge = particleOne->GetPDG()->Charge()/3.;
+      if(TMath::Abs(lThisCharge)<0.001) continue;
+      if(! (lMCstack->IsPhysicalPrimary(iCurrentLabelStack)) ) continue;
+      
+      Double_t gpt = particleOne -> Pt();
+      Double_t geta = particleOne -> Eta(); 
+
+      if( TMath::Abs(geta) < 0.5) lNumberOfCharged++; 
+   }//End of loop on tracks
+//----- End Loop on Stack ------------------------------------------------------------
+
+
 //----- Loop on Lambda, K0Short ----------------------------------------------------------------
    for (Int_t iCurrentLabelStack = 0;  iCurrentLabelStack < (lMCstack->GetNtrack()); iCurrentLabelStack++) 
    {// This is the begining of the loop on tracks
@@ -655,20 +1006,45 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
          lRapCurrentPart   = MyRapidity(lCurrentParticleForLambdaCheck->Energy(),lCurrentParticleForLambdaCheck->Pz());
          lPtCurrentPart    = lCurrentParticleForLambdaCheck->Pt();
 
+          //Use Close to PV for filling CloseToPV histograms!
+         Double_t dx, dy, dz; 
+
+         dx = ( (mcPrimaryVtx.At(0)) - (lCurrentParticleForLambdaCheck->Vx()) ); 
+         dy = ( (mcPrimaryVtx.At(1)) - (lCurrentParticleForLambdaCheck->Vy()) );
+         dz = ( (mcPrimaryVtx.At(2)) - (lCurrentParticleForLambdaCheck->Vz()) );
+         Double_t lDistToPV = TMath::Sqrt(dx*dx + dy*dy + dz*dz);
+         if( lDistToPV <= 0.001){ 
+           if( lPdgcodeCurrentPart == 3122 ){
+              f3dHistPrimCloseToPVPtVsYVsMultLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
+           }
+           if( lPdgcodeCurrentPart == -3122 ){
+              f3dHistPrimCloseToPVPtVsYVsMultAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
+           }
+           if( lPdgcodeCurrentPart == 310 ){
+              f3dHistPrimCloseToPVPtVsYVsMultK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
+           }
+         }
+
          //Use Physical Primaries only for filling PrimRaw Histograms!
          if ( lMCstack->IsPhysicalPrimary(iCurrentLabelStack)!=kTRUE ) continue;
 
          if( lPdgcodeCurrentPart == 3122 ){
             f3dHistPrimRawPtVsYVsMultLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
+            f3dHistPrimRawPtVsYVsMultMCLambda->Fill(lPtCurrentPart, lRapCurrentPart, lNumberOfCharged);
+            f3dHistPrimRawPtVsYVsVertexZLambda->Fill(lPtCurrentPart, lRapCurrentPart, mcPrimaryVtx.At(2));
             if( TMath::Abs( lCurrentParticleForLambdaCheck->Eta() )<1.2 && lPtCurrentPart>2 ){
                lHasHighPtLambda = kTRUE; //Keep track of events with Lambda within |eta|<1.2 and pt>2
             }
          }
          if( lPdgcodeCurrentPart == -3122 ){
             f3dHistPrimRawPtVsYVsMultAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
+            f3dHistPrimRawPtVsYVsMultMCAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lNumberOfCharged);
+            f3dHistPrimRawPtVsYVsVertexZAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, mcPrimaryVtx.At(2));
          }
          if( lPdgcodeCurrentPart == 310 ){
             f3dHistPrimRawPtVsYVsMultK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
+            f3dHistPrimRawPtVsYVsMultMCK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lNumberOfCharged);
+            f3dHistPrimRawPtVsYVsVertexZK0Short->Fill(lPtCurrentPart, lRapCurrentPart, mcPrimaryVtx.At(2));
          }
          //Decay Length Acquisition=====================================================
          Double_t decaylength = -1; 
@@ -685,7 +1061,8 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
                //Need to correct for relativitity! Involves multiplying by mass and dividing by momentum. 
                if(TMath::Abs( lPdgcodeCurrentPart ) == 3122 ) { lV0Mass = 1.115683; }
                if(TMath::Abs( lPdgcodeCurrentPart ) == 310 ) { lV0Mass = 0.497614; }
-               decaylength = ( lV0Mass * decaylength ) / ( lCurrentParticleForLambdaCheck->P() + 1e-10 );
+               if( lCurrentParticleForLambdaCheck->P() + 1e-10 != 0 ) decaylength = ( lV0Mass * decaylength ) / ( lCurrentParticleForLambdaCheck->P() + 1e-10 );
+               if( lCurrentParticleForLambdaCheck->P() + 1e-10 == 0 ) decaylength = 1e+5;
             }
          }
          if( lPdgcodeCurrentPart == 3122) f3dHistPrimRawPtVsYVsDecayLengthLambda ->Fill( lPtCurrentPart, lRapCurrentPart , decaylength ); 
@@ -695,8 +1072,12 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
    }//End of loop on tracks
 //----- End Loop on Lambda, K0Short ------------------------------------------------------------
 
-// ---> Set Variables to Zero again
-// ---> Variable Definition
+
+   f2dHistMultiplicityVsTrueBeforeTrigSel->Fill ( lMultiplicity , lNumberOfCharged );
+
+    fTreeVariableMultiplicityMC = lNumberOfCharged;
+
+   fHistGenVertexZBeforeTrigSel->Fill( (mcPrimaryVtx.At(2)) );
 
    lPdgcodeCurrentPart = 0;
    lRapCurrentPart  = 0;
@@ -723,6 +1104,8 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       return;
    }
 
+   f2dHistMultiplicityVsTrueForTrigEvt->Fill ( lMultiplicity , lNumberOfCharged );
+   fHistGenVertexZForTrigEvt->Fill( mcPrimaryVtx.At(2) );
 //------------------------------------------------
 // After Trigger Selection
 //------------------------------------------------
@@ -757,6 +1140,8 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
    fHistPVy->Fill( lPrimaryVtxPosition[1] );
    fHistPVz->Fill( lPrimaryVtxPosition[2] );
 
+   f2dHistMultiplicityVsVertexZForTrigEvt->Fill( lMultiplicity, lPrimaryVtxPosition[2] );
+
 //------------------------------------------------
 // Primary Vertex Z position: SKIP
 //------------------------------------------------
@@ -768,10 +1153,13 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       return; 
    }
 
+   f2dHistMultiplicityVsVertexZ->Fill( lMultiplicity, lPrimaryVtxPosition[2] );
+
    lMagneticField = lESDevent->GetMagneticField( );
    fHistV0MultiplicityForSelEvt ->Fill( lNumberOfV0s );
    fHistMultiplicity->Fill(lMultiplicity);
-
+   f2dHistMultiplicityVsTrue->Fill ( lMultiplicity , lNumberOfCharged );
+   fHistGenVertexZ->Fill( (mcPrimaryVtx.At(2)) );
 //------------------------------------------------
 // SKIP: Events with well-established PVtx
 //------------------------------------------------
@@ -784,9 +1172,12 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       PostData(2, fTree);
       return;
    }
+
+   f2dHistMultiplicityVsVertexZNoTPCOnly->Fill( lMultiplicity, lPrimaryVtxPosition[2] );
    fHistV0MultiplicityForSelEvtNoTPCOnly ->Fill( lNumberOfV0s );
    fHistMultiplicityNoTPCOnly->Fill(lMultiplicity);
-
+   f2dHistMultiplicityVsTrueNoTPCOnly->Fill ( lMultiplicity , lNumberOfCharged );
+   fHistGenVertexZNoTPCOnly->Fill( (mcPrimaryVtx.At(2)) );
 //------------------------------------------------
 // Pileup Rejection Studies
 //------------------------------------------------
@@ -798,9 +1189,11 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       PostData(2, fTree);
       return;
    }
+   f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup->Fill( lMultiplicity, lPrimaryVtxPosition[2] );
    fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup ->Fill( lNumberOfV0s );
    fHistMultiplicityNoTPCOnlyNoPileup->Fill(lMultiplicity);
-
+   f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup->Fill ( lMultiplicity , lNumberOfCharged );
+   fHistGenVertexZNoTPCOnlyNoPileup->Fill( (mcPrimaryVtx.At(2)) );
    //Do control histograms without the IsFromVertexerZ events, but consider them in analysis...
    if( ! (lESDevent->GetPrimaryVertex()->IsFromVertexerZ() )    ){ 
       fHistPVxAnalysis->Fill( lPrimaryVtxPosition[0] );
@@ -813,6 +1206,16 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       }
    }
 
+  fTreeVariableVertexZ = lPrimaryVtxPosition[2];
+
+  fTreeVariablePVx = lPrimaryVtxPosition[0];
+  fTreeVariablePVy = lPrimaryVtxPosition[1];
+  fTreeVariablePVz = lPrimaryVtxPosition[2];
+
+  fTreeVariableMCPVx = (mcPrimaryVtx.At(0));
+  fTreeVariableMCPVy = (mcPrimaryVtx.At(1));
+  fTreeVariableMCPVz = (mcPrimaryVtx.At(2));
+
 //------------------------------------------------
 // stack loop starts here
 //------------------------------------------------
@@ -847,6 +1250,47 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       }
    }
 
+//----- Loop on primary Xi, Omega --------------------------------------------------------------
+   for (Int_t iCurrentLabelStack = 0; iCurrentLabelStack < lNbMCPrimary; iCurrentLabelStack++) 
+   {// This is the begining of the loop on primaries
+      
+      TParticle* lCurrentParticlePrimary = 0x0; 
+      lCurrentParticlePrimary = lMCstack->Particle( iCurrentLabelStack );
+      if(!lCurrentParticlePrimary){
+         Printf("Cascade loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
+         continue;
+      }
+      if ( TMath::Abs(lCurrentParticlePrimary->GetPdgCode()) == 3312 || TMath::Abs(lCurrentParticlePrimary->GetPdgCode()) == 3334 ) { 
+         Double_t lRapXiMCPrimary = -100;
+         if( (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) != 0 ) { 
+           if ( (lCurrentParticlePrimary->Energy() + lCurrentParticlePrimary->Pz()) / (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) !=0 ){
+             lRapXiMCPrimary = 0.5*TMath::Log( (lCurrentParticlePrimary->Energy() + lCurrentParticlePrimary->Pz()) / (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) );
+           }
+         }
+
+         //=================================================================================
+         // Xi Histograms
+         if( lCurrentParticlePrimary->GetPdgCode() == 3312 ){ 
+            lPtCurrentPart    = lCurrentParticlePrimary->Pt();
+            f3dHistGenSelectedPtVsYVsMultXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+         }
+         if( lCurrentParticlePrimary->GetPdgCode() == -3312 ){ 
+            lPtCurrentPart    = lCurrentParticlePrimary->Pt();
+            f3dHistGenSelectedPtVsYVsMultXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+         }
+         // Omega Histograms
+         if( lCurrentParticlePrimary->GetPdgCode() == 3334 ){ 
+            lPtCurrentPart    = lCurrentParticlePrimary->Pt();
+            f3dHistGenSelectedPtVsYVsMultOmegaMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+         }
+         if( lCurrentParticlePrimary->GetPdgCode() == -3334 ){ 
+            lPtCurrentPart    = lCurrentParticlePrimary->Pt();
+            f3dHistGenSelectedPtVsYVsMultOmegaPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+         }
+      } 
+   }
+//----- End Loop on primary Xi, Omega ----------------------------------------------------------
+
 //------------------------------------------------
 // MAIN LAMBDA LOOP STARTS HERE
 //------------------------------------------------
@@ -891,6 +1335,17 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       lPt = v0->Pt();
       lRapK0Short = v0->RapK0Short();
       lRapLambda  = v0->RapLambda();
+
+      //Set Variables for later filling
+      fTreeVariableV0x = tDecayVertexV0[0];
+      fTreeVariableV0y = tDecayVertexV0[1];
+      fTreeVariableV0z = tDecayVertexV0[2];
+
+      //Set Variables for later filling
+      fTreeVariableV0Px = tV0mom[0];
+      fTreeVariableV0Py = tV0mom[1];
+      fTreeVariableV0Pz = tV0mom[2];
+
       if ((lPt<fMinV0Pt)||(fMaxV0Pt<lPt)) continue;
 
       UInt_t lKeyPos = (UInt_t)TMath::Abs(v0->GetPindex());
@@ -936,8 +1391,10 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
 
       //Compute ratio Crossed Rows / Findable clusters
       //Note: above test avoids division by zero! 
-      Float_t lPosTrackCrossedRowsOverFindable = lPosTrackCrossedRows / ((double)(pTrack->GetTPCNclsF())); 
-      Float_t lNegTrackCrossedRowsOverFindable = lNegTrackCrossedRows / ((double)(nTrack->GetTPCNclsF())); 
+      Float_t lPosTrackCrossedRowsOverFindable = -1;
+      Float_t lNegTrackCrossedRowsOverFindable = -1;
+      if ( ((double)(pTrack->GetTPCNclsF()) ) != 0 ) lPosTrackCrossedRowsOverFindable = lPosTrackCrossedRows / ((double)(pTrack->GetTPCNclsF())); 
+      if ( ((double)(nTrack->GetTPCNclsF()) ) != 0 ) lNegTrackCrossedRowsOverFindable = lNegTrackCrossedRows / ((double)(nTrack->GetTPCNclsF())); 
 
       fTreeVariableLeastRatioCrossedRowsOverFindable = lPosTrackCrossedRowsOverFindable;
       if( lNegTrackCrossedRowsOverFindable < fTreeVariableLeastRatioCrossedRowsOverFindable )
@@ -1024,6 +1481,19 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
          //Set tree variables
          fTreeVariablePID   = pThisV0->GetPdgCode(); //PDG Code
          fTreeVariablePtMC  = pThisV0->Pt(); //Perfect Pt
+
+         //Set Variables for later filling
+         //Be careful: Vx, Vy, Vz: Creation vertex. So decay position is the 
+         //Creation vertex of any one of the daughters!
+         fTreeVariableMCV0x = mcPosV0Dghter->Vx();
+         fTreeVariableMCV0y = mcPosV0Dghter->Vy();
+         fTreeVariableMCV0z = mcPosV0Dghter->Vz();
+
+         //Set Variables for later filling
+         fTreeVariableMCV0Px = pThisV0->Px();
+         fTreeVariableMCV0Py = pThisV0->Py();
+         fTreeVariableMCV0Pz = pThisV0->Pz();
+
          //Only Interested if it's a Lambda, AntiLambda or K0s 
          //Avoid the Junction Bug! PYTHIA has particles with Px=Py=Pz=E=0 occasionally, 
          //having particle code 88 (unrecognized by PDG), for documentation purposes.
@@ -1033,7 +1503,11 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
          if( TMath::Abs(fTreeVariablePID) == 3122 || fTreeVariablePID==310 ){
             fTreeVariableRapMC = pThisV0->Y(); //Perfect Y
          }
-         fTreeVariableV0CreationRadius = pThisV0->R(); // Creation Radius
+         fTreeVariableV0CreationRadius = TMath::Sqrt(
+          TMath::Power(  ( (mcPrimaryVtx.At(0)) - (pThisV0->Vx()) ) , 2) + 
+          TMath::Power(  ( (mcPrimaryVtx.At(1)) - (pThisV0->Vy()) ) , 2) + 
+          TMath::Power(  ( (mcPrimaryVtx.At(2)) - (pThisV0->Vz()) ) , 2) 
+         );
          if( lblMotherPosV0Dghter  < lNbMCPrimary ) fTreeVariableIndexStatus = 1; //looks primary
          if( lblMotherPosV0Dghter >= lNbMCPrimary ) fTreeVariableIndexStatus = 2; //looks secondary
          if( lMCstack->IsPhysicalPrimary       (lblMotherPosV0Dghter) ) fTreeVariablePrimaryStatus = 1; //Is Primary!
@@ -1079,12 +1553,13 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       fTreeVariableNSigmasNegPion   = fPIDResponse->NumberOfSigmasTPC( nTrack, AliPID::kPion );
 
 //tDecayVertexV0[0],tDecayVertexV0[1],tDecayVertexV0[2]
-      fTreeVariableDistOverTotMom = TMath::Sqrt(
+      Double_t lDistanceTravelled = TMath::Sqrt(
                                                TMath::Power( tDecayVertexV0[0] - lBestPrimaryVtxPos[0] , 2) +
                                                TMath::Power( tDecayVertexV0[1] - lBestPrimaryVtxPos[1] , 2) +
                                                TMath::Power( tDecayVertexV0[2] - lBestPrimaryVtxPos[2] , 2)
                                        );
-      fTreeVariableDistOverTotMom /= (lV0TotalMomentum + 1e-10); //avoid division by zero, to be sure
+      fTreeVariableDistOverTotMom = 1e+5;
+      if( lV0TotalMomentum + 1e-10 != 0 ) fTreeVariableDistOverTotMom = lDistanceTravelled / (lV0TotalMomentum + 1e-10); //avoid division by zero, to be sure
 
       Double_t lMomentumPosTemp[3];
       pTrack->GetPxPyPz(lMomentumPosTemp);
@@ -1139,6 +1614,8 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
 
    }// This is the end of the V0 loop
 
+//------------------------------------------------
+
    // Post output data.
    PostData(1, fListHistV0);
    PostData(2, fTree);
@@ -1175,7 +1652,11 @@ void AliAnalysisTaskExtractPerformanceV0::Terminate(Option_t *)
 Double_t AliAnalysisTaskExtractPerformanceV0::MyRapidity(Double_t rE, Double_t rPz) const
 {
    // Local calculation for rapidity
-   return 0.5*TMath::Log((rE+rPz)/(rE-rPz+1.e-13));
+   Double_t ReturnValue = -100;
+   if( (rE-rPz+1.e-13) != 0 && (rE+rPz) != 0 ){ 
+      ReturnValue =  0.5*TMath::Log((rE+rPz)/(rE-rPz+1.e-13));
+   }
+   return ReturnValue;
 } 
 
 //________________________________________________________________________