]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGLF/STRANGENESS/LambdaK0/AliAnalysisTaskExtractPerformanceV0.cxx
Add a boolean flag to enable a more lightweight operation
[u/mrichter/AliRoot.git] / PWGLF / STRANGENESS / LambdaK0 / AliAnalysisTaskExtractPerformanceV0.cxx
index 11df147214b6932e60fc8060e02f05f83f15aa0f..eccbc15a9e9f50ac3f1a4d2879a1a4d2a4f59a20 100644 (file)
@@ -86,13 +86,110 @@ class AliAODv0;
 #include "AliESDcascade.h"
 #include "AliAODcascade.h"
 #include "AliESDUtils.h"
+#include "AliGenEventHeader.h"
 
 #include "AliAnalysisTaskExtractPerformanceV0.h"
 
+using std::cout;
+using std::endl;
+
 ClassImp(AliAnalysisTaskExtractPerformanceV0)
 
 AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0() 
-  : AliAnalysisTaskSE(), fListHistV0(0), fTree(0),
+  : AliAnalysisTaskSE(), fListHistV0(0), fTree(0), fPIDResponse(0), fESDtrackCuts(0),
+   fkIsNuclear   ( kFALSE ), 
+   fkSwitchINT7  ( kFALSE ),
+   fkUseOnTheFly ( kFALSE ),
+   fkTakeAllTracks ( kFALSE ),
+   fpArapidityShift ( 0.465 ),
+  fCentralityEstimator("V0M"),
+  fkLightWeight  ( kFALSE ),  
+//------------------------------------------------
+// Tree Variables 
+
+  fTreeVariablePrimaryStatus(0),
+  fTreeVariablePrimaryStatusMother(0),
+  fTreeVariableChi2V0(0),
+       fTreeVariableDcaV0Daughters(0),
+       fTreeVariableDcaV0ToPrimVertex(0),
+       fTreeVariableDcaPosToPrimVertex(0),
+       fTreeVariableDcaNegToPrimVertex(0),
+       fTreeVariableV0CosineOfPointingAngle(0),
+       fTreeVariableV0Radius(0),
+       fTreeVariablePt(0),
+       fTreeVariablePtMC(0),
+       fTreeVariableRapK0Short(0),
+       fTreeVariableRapLambda(0),
+       fTreeVariableRapMC(0),
+       fTreeVariableInvMassK0s(0),
+       fTreeVariableInvMassLambda(0),
+       fTreeVariableInvMassAntiLambda(0),
+       fTreeVariableAlphaV0(0),
+       fTreeVariablePtArmV0(0),
+       fTreeVariableNegTotMomentum(0),
+       fTreeVariablePosTotMomentum(0),
+       fTreeVariableNegTransvMomentum(0),
+       fTreeVariablePosTransvMomentum(0),
+       fTreeVariableNegTransvMomentumMC(0),
+       fTreeVariablePosTransvMomentumMC(0),
+   
+       fTreeVariableNSigmasPosProton(0),
+       fTreeVariableNSigmasPosPion(0),
+       fTreeVariableNSigmasNegProton(0),
+       fTreeVariableNSigmasNegPion(0),
+
+       fTreeVariablePtMother(0),
+       fTreeVariableV0CreationRadius(0),
+  fTreeVariablePID(0),
+  fTreeVariablePIDPositive(0),
+  fTreeVariablePIDNegative(0),
+  fTreeVariablePIDMother(0),
+  fTreeVariableIndexStatus(0),
+  fTreeVariableIndexStatusMother(0),
+
+  fTreeVariableRunNumber(0),
+  fTreeVariableEventNumber(0),
+
+       fTreeVariableDistOverTotMom(0),
+
+       fTreeVariablePosEta(0),
+       fTreeVariableNegEta(0),
+
+       fTreeVariableVertexZ(0),
+
+  fTreeVariableLeastNbrCrossedRows(0),
+  fTreeVariableLeastRatioCrossedRowsOverFindable(0),
+  fTreeVariableMultiplicity(0),
+  fTreeVariableMultiplicityMC(0),
+
+  fTreeVariableV0x(0),
+  fTreeVariableV0y(0),
+  fTreeVariableV0z(0),
+
+  fTreeVariableV0Px(0),
+  fTreeVariableV0Py(0),
+  fTreeVariableV0Pz(0),
+
+  fTreeVariableMCV0x(0),
+  fTreeVariableMCV0y(0),
+  fTreeVariableMCV0z(0),
+
+  fTreeVariableMCV0Px(0),
+  fTreeVariableMCV0Py(0),
+  fTreeVariableMCV0Pz(0),
+
+  fTreeVariablePVx(0),
+  fTreeVariablePVy(0),
+  fTreeVariablePVz(0),
+
+  fTreeVariableMCPVx(0),
+  fTreeVariableMCPVy(0),
+  fTreeVariableMCPVz(0),
+
+  fTreeVariableIsNonInjected(0),
+
+  fTreeVariableNegTrackStatus(0),
+  fTreeVariablePosTrackStatus(0),
 
 //------------------------------------------------
 // HISTOGRAMS
@@ -103,10 +200,31 @@ AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0()
    fHistV0MultiplicityForSelEvt(0),
    fHistV0MultiplicityForSelEvtNoTPCOnly(0),
    fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup(0),
+   fHistMultiplicityBeforeTrigSel(0),
+   fHistMultiplicityForTrigEvt(0),
    fHistMultiplicity(0),
    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
@@ -114,14 +232,46 @@ AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0()
    f3dHistPrimAnalysisPtVsYVsMultLambda(0),
    f3dHistPrimAnalysisPtVsYVsMultAntiLambda(0),
    f3dHistPrimAnalysisPtVsYVsMultK0Short(0),
+   f3dHistPrimAnalysisPtVsYCMSVsMultLambda(0),
+   f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda(0),
+   f3dHistPrimAnalysisPtVsYCMSVsMultK0Short(0),
    f3dHistPrimRawPtVsYVsMultLambda(0),
    f3dHistPrimRawPtVsYVsMultAntiLambda(0),
    f3dHistPrimRawPtVsYVsMultK0Short(0),
+   f3dHistPrimRawPtVsYCMSVsMultLambda(0),
+   f3dHistPrimRawPtVsYCMSVsMultAntiLambda(0),
+   f3dHistPrimRawPtVsYCMSVsMultK0Short(0),
+   f3dHistPrimRawPtVsYVsMultNonInjLambda(0),
+   f3dHistPrimRawPtVsYVsMultNonInjAntiLambda(0),
+   f3dHistPrimRawPtVsYVsMultNonInjK0Short(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),
+   f3dHistGenPtVsYCMSVsMultXiMinus(0),
+   f3dHistGenPtVsYCMSVsMultXiPlus(0),
+   f3dHistGenPtVsYCMSVsMultOmegaMinus(0),
+   f3dHistGenPtVsYCMSVsMultOmegaPlus(0),
+   f3dHistGenSelectedPtVsYCMSVsMultXiMinus(0),
+   f3dHistGenSelectedPtVsYCMSVsMultXiPlus(0),
+   f3dHistGenSelectedPtVsYCMSVsMultOmegaMinus(0),
+   f3dHistGenSelectedPtVsYCMSVsMultOmegaPlus(0),
    fHistPVx(0),
    fHistPVy(0),
    fHistPVz(0),
@@ -130,14 +280,108 @@ AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0()
    fHistPVzAnalysis(0),
    fHistPVxAnalysisHasHighPtLambda(0),
    fHistPVyAnalysisHasHighPtLambda(0),
-   fHistPVzAnalysisHasHighPtLambda(0)
+   fHistPVzAnalysisHasHighPtLambda(0),
+   fHistSwappedV0Counter(0)
 {
   // Dummy Constructor
 }
 
 AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0(const char *name) 
-  : AliAnalysisTaskSE(name), fListHistV0(0), fTree(0),
-     
+  : AliAnalysisTaskSE(name), fListHistV0(0), fTree(0), fPIDResponse(0), fESDtrackCuts(0),
+   fkIsNuclear   ( kFALSE ), 
+   fkSwitchINT7  ( kFALSE ),
+   fkUseOnTheFly ( kFALSE ),
+   fkTakeAllTracks ( kFALSE ),
+   fpArapidityShift ( 0.465 ),
+  fCentralityEstimator("V0M"),
+  fkLightWeight  ( kFALSE ),  
+//------------------------------------------------
+// Tree Variables 
+
+  fTreeVariablePrimaryStatus(0),
+  fTreeVariablePrimaryStatusMother(0),
+  fTreeVariableChi2V0(0),
+       fTreeVariableDcaV0Daughters(0),
+       fTreeVariableDcaV0ToPrimVertex(0),
+       fTreeVariableDcaPosToPrimVertex(0),
+       fTreeVariableDcaNegToPrimVertex(0),
+       fTreeVariableV0CosineOfPointingAngle(0),
+       fTreeVariableV0Radius(0),
+       fTreeVariablePt(0),
+       fTreeVariablePtMC(0),
+       fTreeVariableRapK0Short(0),
+       fTreeVariableRapLambda(0),
+       fTreeVariableRapMC(0),
+       fTreeVariableInvMassK0s(0),
+       fTreeVariableInvMassLambda(0),
+       fTreeVariableInvMassAntiLambda(0),
+       fTreeVariableAlphaV0(0),
+       fTreeVariablePtArmV0(0),
+       fTreeVariableNegTotMomentum(0),
+       fTreeVariablePosTotMomentum(0),
+       fTreeVariableNegTransvMomentum(0),
+       fTreeVariablePosTransvMomentum(0),
+       fTreeVariableNegTransvMomentumMC(0),
+       fTreeVariablePosTransvMomentumMC(0),
+   
+       fTreeVariableNSigmasPosProton(0),
+       fTreeVariableNSigmasPosPion(0),
+       fTreeVariableNSigmasNegProton(0),
+       fTreeVariableNSigmasNegPion(0),
+
+       fTreeVariablePtMother(0),
+       fTreeVariableV0CreationRadius(0),
+  fTreeVariablePID(0),
+  fTreeVariablePIDPositive(0),
+  fTreeVariablePIDNegative(0),
+  fTreeVariablePIDMother(0),
+  fTreeVariableIndexStatus(0),
+  fTreeVariableIndexStatusMother(0),
+
+  fTreeVariableRunNumber(0),
+  fTreeVariableEventNumber(0),
+
+       fTreeVariableDistOverTotMom(0),
+
+       fTreeVariablePosEta(0),
+       fTreeVariableNegEta(0),
+
+       fTreeVariableVertexZ(0),
+
+  fTreeVariableLeastNbrCrossedRows(0),
+  fTreeVariableLeastRatioCrossedRowsOverFindable(0),
+  fTreeVariableMultiplicity(0),
+  fTreeVariableMultiplicityMC(0),
+
+  fTreeVariableV0x(0),
+  fTreeVariableV0y(0),
+  fTreeVariableV0z(0),
+
+  fTreeVariableV0Px(0),
+  fTreeVariableV0Py(0),
+  fTreeVariableV0Pz(0),
+
+  fTreeVariableMCV0x(0),
+  fTreeVariableMCV0y(0),
+  fTreeVariableMCV0z(0),
+
+  fTreeVariableMCV0Px(0),
+  fTreeVariableMCV0Py(0),
+  fTreeVariableMCV0Pz(0),
+
+  fTreeVariablePVx(0),
+  fTreeVariablePVy(0),
+  fTreeVariablePVz(0),
+
+  fTreeVariableMCPVx(0),
+  fTreeVariableMCPVy(0),
+  fTreeVariableMCPVz(0),
+
+  fTreeVariableIsNonInjected(0),
+
+  fTreeVariableNegTrackStatus(0),
+  fTreeVariablePosTrackStatus(0),
+
 //------------------------------------------------
 // HISTOGRAMS
 // --- Filled on an Event-by-event basis
@@ -147,10 +391,30 @@ AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0(const c
    fHistV0MultiplicityForSelEvt(0),
    fHistV0MultiplicityForSelEvtNoTPCOnly(0),
    fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup(0),
+   fHistMultiplicityBeforeTrigSel(0),
+   fHistMultiplicityForTrigEvt(0),
    fHistMultiplicity(0),
    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
@@ -159,14 +423,46 @@ AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0(const c
    f3dHistPrimAnalysisPtVsYVsMultLambda(0),
    f3dHistPrimAnalysisPtVsYVsMultAntiLambda(0),
    f3dHistPrimAnalysisPtVsYVsMultK0Short(0),
+   f3dHistPrimAnalysisPtVsYCMSVsMultLambda(0),
+   f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda(0),
+   f3dHistPrimAnalysisPtVsYCMSVsMultK0Short(0),
    f3dHistPrimRawPtVsYVsMultLambda(0),
    f3dHistPrimRawPtVsYVsMultAntiLambda(0),
    f3dHistPrimRawPtVsYVsMultK0Short(0),
+   f3dHistPrimRawPtVsYCMSVsMultLambda(0),
+   f3dHistPrimRawPtVsYCMSVsMultAntiLambda(0),
+   f3dHistPrimRawPtVsYCMSVsMultK0Short(0),
+   f3dHistPrimRawPtVsYVsMultNonInjLambda(0),
+   f3dHistPrimRawPtVsYVsMultNonInjAntiLambda(0),
+   f3dHistPrimRawPtVsYVsMultNonInjK0Short(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),
+   f3dHistGenPtVsYCMSVsMultXiMinus(0),
+   f3dHistGenPtVsYCMSVsMultXiPlus(0),
+   f3dHistGenPtVsYCMSVsMultOmegaMinus(0),
+   f3dHistGenPtVsYCMSVsMultOmegaPlus(0),
+   f3dHistGenSelectedPtVsYCMSVsMultXiMinus(0),
+   f3dHistGenSelectedPtVsYCMSVsMultXiPlus(0),
+   f3dHistGenSelectedPtVsYCMSVsMultOmegaMinus(0),
+   f3dHistGenSelectedPtVsYCMSVsMultOmegaPlus(0),
    fHistPVx(0),
    fHistPVy(0),
    fHistPVz(0),
@@ -175,7 +471,8 @@ AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0(const c
    fHistPVzAnalysis(0),
    fHistPVxAnalysisHasHighPtLambda(0),
    fHistPVyAnalysisHasHighPtLambda(0),
-   fHistPVzAnalysisHasHighPtLambda(0)
+   fHistPVzAnalysisHasHighPtLambda(0),
+   fHistSwappedV0Counter(0)
 {
    // Constructor
    // Output slot #0 writes into a TList container (Cascade)
@@ -198,27 +495,31 @@ AliAnalysisTaskExtractPerformanceV0::~AliAnalysisTaskExtractPerformanceV0()
       delete fTree;
       fTree = 0x0;
    }
+    //cleanup esd track cuts object too...
+   if (fESDtrackCuts){
+    delete fESDtrackCuts;
+    fESDtrackCuts = 0x0; 
+  }
 }
 
 //________________________________________________________________________
 void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
 {
-   // Create histograms
 
-   fListHistV0 = new TList();
-   fListHistV0->SetOwner();  // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
-       
+   OpenFile(2);        
    // Called once
-   if( !fTree) { 
-      fTree = new TTree("fTree","V0Candidates");
 
 //------------------------------------------------
-// fTree Branch definitions
+
+   fTree = new TTree("fTree","V0Candidates");
+
+//------------------------------------------------
+// fTree Branch definitions - V0 Tree
 //------------------------------------------------
 
 //-----------BASIC-INFO---------------------------
 /* 1*/   fTree->Branch("fTreeVariablePrimaryStatus",&fTreeVariablePrimaryStatus,"fTreeVariablePrimaryStatus/I");       
-/* 1*/   fTree->Branch("fTreeVariablePrimaryStatusMother",&fTreeVariablePrimaryStatusMother,"fTreeVariablePrimaryStatusMother/I");     
+/* 2*/   fTree->Branch("fTreeVariablePrimaryStatusMother",&fTreeVariablePrimaryStatusMother,"fTreeVariablePrimaryStatusMother/I");     
 /* 2*/   fTree->Branch("fTreeVariableChi2V0",&fTreeVariableChi2V0,"Chi2V0/F");
 /* 3*/   fTree->Branch("fTreeVariableDcaV0Daughters",&fTreeVariableDcaV0Daughters,"fTreeVariableDcaV0Daughters/F");
 /* 4*/   fTree->Branch("fTreeVariableDcaPosToPrimVertex",&fTreeVariableDcaPosToPrimVertex,"fTreeVariableDcaPosToPrimVertex/F");
@@ -248,6 +549,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");
@@ -258,13 +560,55 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
 /*34*/   fTree->Branch("fTreeVariableNegEta",&fTreeVariableNegEta,"fTreeVariableNegEta/F");
 /*35*/   fTree->Branch("fTreeVariablePosEta",&fTreeVariablePosEta,"fTreeVariablePosEta/F");
 /*36*/   fTree->Branch("fTreeVariableV0CreationRadius",&fTreeVariableV0CreationRadius,"fTreeVariableV0CreationRadius/F");
+  
+    if ( fkLightWeight == kFALSE ){ // these are debugging branches!
 /*37*/   fTree->Branch("fTreeVariableIndexStatus",&fTreeVariableIndexStatus,"fTreeVariableIndexStatus/I");
 /*38*/   fTree->Branch("fTreeVariableIndexStatusMother",&fTreeVariableIndexStatusMother,"fTreeVariableIndexStatusMother/I");
+    }
 
-      //It's alone...
-      //fListHistV0->Add(fTree);
-   }
+/*39*/          fTree->Branch("fTreeVariableRunNumber",&fTreeVariableRunNumber,"fTreeVariableRunNumber/I");
+/*40*/   fTree->Branch("fTreeVariableEventNumber",&fTreeVariableEventNumber,"fTreeVariableEventNumber/l");
 
+    if ( fkLightWeight == kFALSE ){ // these are debugging branches!
+/*34*/   fTree->Branch("fTreeVariableVertexZ",&fTreeVariableVertexZ,"fTreeVariableVertexZ/F");
+    }
+      
+    if ( fkLightWeight == kFALSE ){ // these are debugging branches!
+//-----------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");
+    }
+
+        fTree->Branch("fTreeVariableIsNonInjected",&fTreeVariableIsNonInjected,"fTreeVariableIsNonInjected/O"); //O for bOOlean...
+  
+  if ( fkLightWeight == kFALSE ){ // these are debugging branches!
+        fTree->Branch("fTreeVariableNegTrackStatus",&fTreeVariableNegTrackStatus,"fTreeVariableNegTrackStatus/l");
+        fTree->Branch("fTreeVariablePosTrackStatus",&fTreeVariablePosTrackStatus,"fTreeVariablePosTrackStatus/l");
+  }
+  
 //------------------------------------------------
 // Particle Identification Setup
 //------------------------------------------------
@@ -273,10 +617,22 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
    AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
    fPIDResponse = inputHandler->GetPIDResponse();
 
+  // Multiplicity 
+
+    if(! fESDtrackCuts ){
+          fESDtrackCuts = new AliESDtrackCuts();
+    }
+
 //------------------------------------------------
 // V0 Multiplicity Histograms
 //------------------------------------------------
 
+   // Create histograms
+   OpenFile(1);
+   fListHistV0 = new TList();
+   fListHistV0->SetOwner();  // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
+
+
    if(! fHistV0MultiplicityBeforeTrigSel) {
       fHistV0MultiplicityBeforeTrigSel = new TH1F("fHistV0MultiplicityBeforeTrigSel", 
          "V0s per event (before Trig. Sel.);Nbr of V0s/Evt;Events", 
@@ -346,6 +702,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
 //------------------------------------------------
@@ -373,6 +836,80 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
       fListHistV0->Add(f3dHistPrimRawPtVsYVsMultK0Short);
    }
 
+   if(! f3dHistPrimRawPtVsYCMSVsMultLambda) {
+      f3dHistPrimRawPtVsYCMSVsMultLambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultLambda", "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(f3dHistPrimRawPtVsYCMSVsMultLambda);
+   }
+   if(! f3dHistPrimRawPtVsYCMSVsMultAntiLambda) {
+      f3dHistPrimRawPtVsYCMSVsMultAntiLambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultAntiLambda", "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(f3dHistPrimRawPtVsYCMSVsMultAntiLambda);
+   }
+   if(! f3dHistPrimRawPtVsYCMSVsMultK0Short) {
+      f3dHistPrimRawPtVsYCMSVsMultK0Short = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultK0Short", "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(f3dHistPrimRawPtVsYCMSVsMultK0Short);
+   }
+
+//---> Non-injected particles
+
+   if(! f3dHistPrimRawPtVsYVsMultNonInjLambda) {
+      f3dHistPrimRawPtVsYVsMultNonInjLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultNonInjLambda", "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(f3dHistPrimRawPtVsYVsMultNonInjLambda);
+   }
+   if(! f3dHistPrimRawPtVsYVsMultNonInjAntiLambda) {
+      f3dHistPrimRawPtVsYVsMultNonInjAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultNonInjAntiLambda", "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(f3dHistPrimRawPtVsYVsMultNonInjAntiLambda);
+   }
+   if(! f3dHistPrimRawPtVsYVsMultNonInjK0Short) {
+      f3dHistPrimRawPtVsYVsMultNonInjK0Short = new TH3F( "f3dHistPrimRawPtVsYVsMultNonInjK0Short", "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(f3dHistPrimRawPtVsYVsMultNonInjK0Short);
+   }
+
+//--- 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) {
@@ -388,7 +925,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);
@@ -398,6 +936,86 @@ 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);
+   }
+
+//CASCADEs, Y CMS 
+
+   if(! f3dHistGenPtVsYCMSVsMultXiMinus) {
+      f3dHistGenPtVsYCMSVsMultXiMinus = new TH3F( "f3dHistGenPtVsYCMSVsMultXiMinus", "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(f3dHistGenPtVsYCMSVsMultXiMinus);
+   }
+   if(! f3dHistGenPtVsYCMSVsMultXiPlus) {
+      f3dHistGenPtVsYCMSVsMultXiPlus = new TH3F( "f3dHistGenPtVsYCMSVsMultXiPlus", "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(f3dHistGenPtVsYCMSVsMultXiPlus);
+   }
+//--- 3D Histo (Pt, Y, Multiplicity) for generated OmegaMinus/Plus
+
+   if(! f3dHistGenPtVsYCMSVsMultOmegaMinus) {
+      f3dHistGenPtVsYCMSVsMultOmegaMinus = new TH3F( "f3dHistGenPtVsYCMSVsMultOmegaMinus", "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(f3dHistGenPtVsYCMSVsMultOmegaMinus);
+   }
+   if(! f3dHistGenPtVsYCMSVsMultOmegaPlus) {
+      f3dHistGenPtVsYCMSVsMultOmegaPlus = new TH3F( "f3dHistGenPtVsYCMSVsMultOmegaPlus", "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(f3dHistGenPtVsYCMSVsMultOmegaPlus);
+   }
+
+
+
+//--------------------------------------------------------------------------------------
+//--- 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);
+   }
+
+//CASCADES, analysis level, y CMS
+
+//--------------------------------------------------------------------------------------
+//--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
+
+   if(! f3dHistGenSelectedPtVsYCMSVsMultXiMinus) {
+      f3dHistGenSelectedPtVsYCMSVsMultXiMinus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultXiMinus", "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(f3dHistGenSelectedPtVsYCMSVsMultXiMinus);
+   }
+   if(! f3dHistGenSelectedPtVsYCMSVsMultXiPlus) {
+      f3dHistGenSelectedPtVsYCMSVsMultXiPlus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultXiPlus", "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(f3dHistGenSelectedPtVsYCMSVsMultXiPlus);
+   }
+//--- 3D Histo (Pt, Y, Multiplicity) for generated OmegaMinus/Plus
+
+   if(! f3dHistGenSelectedPtVsYCMSVsMultOmegaMinus) {
+      f3dHistGenSelectedPtVsYCMSVsMultOmegaMinus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultOmegaMinus", "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(f3dHistGenSelectedPtVsYCMSVsMultOmegaMinus);
+   }
+   if(! f3dHistGenSelectedPtVsYCMSVsMultOmegaPlus) {
+      f3dHistGenSelectedPtVsYCMSVsMultOmegaPlus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultOmegaPlus", "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(f3dHistGenSelectedPtVsYCMSVsMultOmegaPlus);
+   }
+
 
 //----------------------------------
 // Histos at analysis level 
@@ -416,6 +1034,19 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
       fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultK0Short);
    }
 
+   if(! f3dHistPrimAnalysisPtVsYCMSVsMultLambda) {
+      f3dHistPrimAnalysisPtVsYCMSVsMultLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultLambda", "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(f3dHistPrimAnalysisPtVsYCMSVsMultLambda);
+   }
+   if(! f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda) {
+      f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda", "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(f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda);
+   }
+   if(! f3dHistPrimAnalysisPtVsYCMSVsMultK0Short) {
+      f3dHistPrimAnalysisPtVsYCMSVsMultK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultK0Short", "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(f3dHistPrimAnalysisPtVsYCMSVsMultK0Short);
+   }
+
 //----------------------------------
 // Primary Vertex Position Histos
 //----------------------------------
@@ -476,6 +1107,13 @@ void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
             400, -20, 20);       
       fListHistV0->Add(fHistPVzAnalysisHasHighPtLambda);
    }
+   if(! fHistSwappedV0Counter) {
+      fHistSwappedV0Counter = new TH1F("fHistSwappedV0Counter", 
+         "Swap or not histo;Swapped (1) or not (0); count", 
+         2, 0, 2);             
+      fListHistV0->Add(fHistSwappedV0Counter);
+   }
+
    //List of Histograms: Normal
    PostData(1, fListHistV0);
 
@@ -512,6 +1150,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");
@@ -525,13 +1169,38 @@ 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
 //------------------------------------------------
 
-  //REVISED multiplicity estimator after 'multiplicity day' (2011)
-   Int_t lMultiplicity = AliESDtrackCuts::GetReferenceMultiplicity( lESDevent );
+   //REVISED multiplicity estimator after 'multiplicity day' (2011)
+   Int_t lMultiplicity = -100; 
+
+   //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
+   if(fkIsNuclear == kTRUE){ 
+      AliCentrality* centrality;
+      centrality = lESDevent->GetCentrality();
+      lMultiplicity = ( ( Int_t ) ( centrality->GetCentralityPercentile(   fCentralityEstimator.Data() ) ) );
+      if (centrality->GetQuality()>1) {
+        PostData(1, fListHistV0);
+        PostData(2, fTree);
+        return;
+      }
+   }
+  
+   //Set variable for filling tree afterwards!
+   //---> pp case......: GetReferenceMultiplicity
+   //---> Pb-Pb case...: Centrality by V0M
+   fTreeVariableMultiplicity = lMultiplicity;
 
    fHistV0MultiplicityBeforeTrigSel->Fill ( lESDevent->GetNumberOfV0s() );
    fHistMultiplicityBeforeTrigSel->Fill ( lMultiplicity );
@@ -575,23 +1244,66 @@ 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);
+            f3dHistGenPtVsYCMSVsMultXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicity);
          }
          if( lCurrentParticlePrimary->GetPdgCode() == -3312 ){ 
             lPtCurrentPart    = lCurrentParticlePrimary->Pt();
             f3dHistGenPtVsYVsMultXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+            f3dHistGenPtVsYCMSVsMultXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicity);
+         }
+         // Omega Histograms
+         if( lCurrentParticlePrimary->GetPdgCode() == 3334 ){ 
+            lPtCurrentPart    = lCurrentParticlePrimary->Pt();
+            f3dHistGenPtVsYVsMultOmegaMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+            f3dHistGenPtVsYCMSVsMultOmegaMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicity);
+         }
+         if( lCurrentParticlePrimary->GetPdgCode() == -3334 ){ 
+            lPtCurrentPart    = lCurrentParticlePrimary->Pt();
+            f3dHistGenPtVsYVsMultOmegaPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+            f3dHistGenPtVsYCMSVsMultOmegaPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, 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 ------------------------------------------------------------
+
+   //Double_t lpArapidityShift = 0.465;
+   Bool_t lStackNatural = kTRUE;
 //----- Loop on Lambda, K0Short ----------------------------------------------------------------
    for (Int_t iCurrentLabelStack = 0;  iCurrentLabelStack < (lMCstack->GetNtrack()); iCurrentLabelStack++) 
    {// This is the begining of the loop on tracks
@@ -615,20 +1327,57 @@ 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;
 
+          lStackNatural = lMCevent->IsFromBGEvent(iCurrentLabelStack); //Is it? 
+          if (!lStackNatural){
+            if (!(lCurrentParticleForLambdaCheck->GetFirstMother()<0)) 
+              {lStackNatural = kTRUE;} // because there are primaries (ALICE definition) not produced in the collision
+          }
+
          if( lPdgcodeCurrentPart == 3122 ){
             f3dHistPrimRawPtVsYVsMultLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
+            f3dHistPrimRawPtVsYCMSVsMultLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
+            if(lStackNatural){f3dHistPrimRawPtVsYVsMultNonInjLambda->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);
+            f3dHistPrimRawPtVsYCMSVsMultAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
+            if(lStackNatural){f3dHistPrimRawPtVsYVsMultNonInjAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);}
+            f3dHistPrimRawPtVsYVsMultMCAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lNumberOfCharged);
+            f3dHistPrimRawPtVsYVsVertexZAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, mcPrimaryVtx.At(2));
          }
          if( lPdgcodeCurrentPart == 310 ){
             f3dHistPrimRawPtVsYVsMultK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
+            f3dHistPrimRawPtVsYCMSVsMultK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
+            if(lStackNatural){f3dHistPrimRawPtVsYVsMultNonInjK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);}
+            f3dHistPrimRawPtVsYVsMultMCK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lNumberOfCharged);
+            f3dHistPrimRawPtVsYVsVertexZK0Short->Fill(lPtCurrentPart, lRapCurrentPart, mcPrimaryVtx.At(2));
          }
          //Decay Length Acquisition=====================================================
          Double_t decaylength = -1; 
@@ -645,7 +1394,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 ); 
@@ -655,8 +1405,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;
@@ -669,12 +1423,19 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
    UInt_t maskIsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
    Bool_t isSelected = 0;
    isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
+
+   //pA triggering: CINT7
+   if( fkSwitchINT7 ) isSelected = (maskIsSelected & AliVEvent::kINT7) == AliVEvent::kINT7;
+
+   //Standard Min-Bias Selection
    if ( ! isSelected ) { 
       PostData(1, fListHistV0);
       PostData(2, fTree);
       return;
    }
 
+   f2dHistMultiplicityVsTrueForTrigEvt->Fill ( lMultiplicity , lNumberOfCharged );
+   fHistGenVertexZForTrigEvt->Fill( mcPrimaryVtx.At(2) );
 //------------------------------------------------
 // After Trigger Selection
 //------------------------------------------------
@@ -682,7 +1443,6 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
    lNumberOfV0s          = lESDevent->GetNumberOfV0s();
   
    //Set variable for filling tree afterwards!
-   fTreeVariableMultiplicity = lMultiplicity;
    fHistV0MultiplicityForTrigEvt->Fill(lNumberOfV0s);
    fHistMultiplicityForTrigEvt->Fill ( lMultiplicity );
 
@@ -710,6 +1470,8 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
    fHistPVy->Fill( lPrimaryVtxPosition[1] );
    fHistPVz->Fill( lPrimaryVtxPosition[2] );
 
+   f2dHistMultiplicityVsVertexZForTrigEvt->Fill( lMultiplicity, lPrimaryVtxPosition[2] );
+
 //------------------------------------------------
 // Primary Vertex Z position: SKIP
 //------------------------------------------------
@@ -721,10 +1483,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
 //------------------------------------------------
@@ -737,23 +1502,28 @@ 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
 //------------------------------------------------
 
    // FIXME : quality selection regarding pile-up rejection 
-   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
+   if(lESDevent->IsPileupFromSPD() && !fkIsNuclear ){// 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 / This is tagged as Pileup from SPD... return !");
       PostData(1, fListHistV0);
       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] );
@@ -766,6 +1536,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
 //------------------------------------------------
@@ -791,15 +1571,63 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
 
       if( lPdgcodeCurrentPart == 3122 ){
          f3dHistPrimAnalysisPtVsYVsMultLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
+         f3dHistPrimAnalysisPtVsYCMSVsMultLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
       }
       if( lPdgcodeCurrentPart == -3122 ){
          f3dHistPrimAnalysisPtVsYVsMultAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
+         f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
       }
       if( lPdgcodeCurrentPart == 310 ){
          f3dHistPrimAnalysisPtVsYVsMultK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
+         f3dHistPrimAnalysisPtVsYCMSVsMultK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
       }
    }
 
+//----- 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);
+            f3dHistGenSelectedPtVsYCMSVsMultXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicity);
+         }
+         if( lCurrentParticlePrimary->GetPdgCode() == -3312 ){ 
+            lPtCurrentPart    = lCurrentParticlePrimary->Pt();
+            f3dHistGenSelectedPtVsYVsMultXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+            f3dHistGenSelectedPtVsYCMSVsMultXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicity);
+         }
+         // Omega Histograms
+         if( lCurrentParticlePrimary->GetPdgCode() == 3334 ){ 
+            lPtCurrentPart    = lCurrentParticlePrimary->Pt();
+            f3dHistGenSelectedPtVsYVsMultOmegaMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+            f3dHistGenSelectedPtVsYCMSVsMultOmegaMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicity);
+         }
+         if( lCurrentParticlePrimary->GetPdgCode() == -3334 ){ 
+            lPtCurrentPart    = lCurrentParticlePrimary->Pt();
+            f3dHistGenSelectedPtVsYVsMultOmegaPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
+            f3dHistGenSelectedPtVsYCMSVsMultOmegaPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicity);
+         }
+      } 
+   }
+//----- End Loop on primary Xi, Omega ----------------------------------------------------------
+
 //------------------------------------------------
 // MAIN LAMBDA LOOP STARTS HERE
 //------------------------------------------------
@@ -825,6 +1653,15 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       AliESDv0 *v0 = ((AliESDEvent*)lESDevent)->GetV0(iV0);
       if (!v0) continue;
 
+      //---> Fix On-the-Fly candidates
+      if( v0->GetParamN()->Charge() > 0 && v0->GetParamP()->Charge() < 0 ){
+        fHistSwappedV0Counter -> Fill( 1 );
+      }else{
+        fHistSwappedV0Counter -> Fill( 0 ); 
+      }
+      if ( fkUseOnTheFly ) CheckChargeV0(v0); 
+
+
       Double_t tV0mom[3];
       v0->GetPxPyPz( tV0mom[0],tV0mom[1],tV0mom[2] ); 
       Double_t lV0TotalMomentum = TMath::Sqrt(
@@ -835,6 +1672,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());
@@ -862,15 +1710,19 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       // Track quality cuts 
       Float_t lPosTrackCrossedRows = pTrack->GetTPCClusterInfo(2,1);
       Float_t lNegTrackCrossedRows = nTrack->GetTPCClusterInfo(2,1);
-      fTreeVariableLeastNbrCrossedRows = lPosTrackCrossedRows;
+      fTreeVariableLeastNbrCrossedRows = (Int_t) lPosTrackCrossedRows;
       if( lNegTrackCrossedRows < fTreeVariableLeastNbrCrossedRows )
-         fTreeVariableLeastNbrCrossedRows = lNegTrackCrossedRows;
+         fTreeVariableLeastNbrCrossedRows = (Int_t) lNegTrackCrossedRows;
 
       // TPC refit condition (done during reconstruction for Offline but not for On-the-fly)
       if( !(pTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;      
       if( !(nTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;
 
-      if ( ( ( pTrack->GetTPCClusterInfo(2,1) ) < 70 ) || ( ( nTrack->GetTPCClusterInfo(2,1) ) < 70 ) ) continue;
+      //Get status flags
+      fTreeVariablePosTrackStatus = pTrack->GetStatus();
+      fTreeVariableNegTrackStatus = nTrack->GetStatus();
+    
+      if ( ( ( ( pTrack->GetTPCClusterInfo(2,1) ) < 70 ) || ( ( nTrack->GetTPCClusterInfo(2,1) ) < 70 ) )&&(fkTakeAllTracks==kFALSE) ) continue;
        
       //GetKinkIndex condition
       if( pTrack->GetKinkIndex(0)>0 || nTrack->GetKinkIndex(0)>0 ) continue;
@@ -880,15 +1732,17 @@ 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 )
          fTreeVariableLeastRatioCrossedRowsOverFindable = lNegTrackCrossedRowsOverFindable;
 
       //Lowest Cut Level for Ratio Crossed Rows / Findable = 0.8, set here
-      if ( fTreeVariableLeastRatioCrossedRowsOverFindable < 0.8 ) continue;
+      if ( (fTreeVariableLeastRatioCrossedRowsOverFindable < 0.8)&&(fkTakeAllTracks==kFALSE) ) continue;
 
       //End track Quality Cuts
       //________________________________________________________________________
@@ -968,6 +1822,25 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
          //Set tree variables
          fTreeVariablePID   = pThisV0->GetPdgCode(); //PDG Code
          fTreeVariablePtMC  = pThisV0->Pt(); //Perfect Pt
+
+          fTreeVariableIsNonInjected = lMCevent->IsFromBGEvent(lblMotherPosV0Dghter); //Is it? 
+          if (!fTreeVariableIsNonInjected){
+            if (!(pThisV0->GetFirstMother()<0)) 
+              {fTreeVariableIsNonInjected = kTRUE;} // because there are primaries (ALICE definition) not produced in the collision
+          }
+
+         //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.
@@ -977,7 +1850,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!
@@ -1023,12 +1900,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);
@@ -1053,7 +1931,7 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
       //Keep only if included in a parametric InvMass Region 20 sigmas away from peak
 
       //First Selection: Reject OnFly
-      if( lOnFlyStatus == 0 ){
+      if( (lOnFlyStatus == 0 && fkUseOnTheFly == kFALSE) || (lOnFlyStatus != 0 && fkUseOnTheFly == kTRUE ) ){
          //Second Selection: rough 20-sigma band, parametric. 
          //K0Short: Enough to parametrize peak broadening with linear function.    
          Double_t lUpperLimitK0Short = (5.63707e-01) + (1.14979e-02)*fTreeVariablePt; 
@@ -1066,7 +1944,13 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
          if( (fTreeVariableInvMassLambda     < lUpperLimitLambda  && fTreeVariableInvMassLambda     > lLowerLimitLambda     ) || 
              (fTreeVariableInvMassAntiLambda < lUpperLimitLambda  && fTreeVariableInvMassAntiLambda > lLowerLimitLambda     ) || 
              (fTreeVariableInvMassK0s        < lUpperLimitK0Short && fTreeVariableInvMassK0s        > lLowerLimitK0Short    ) ){
-            fTree->Fill();
+             //Pre-selection in case this is AA...
+             if( fkIsNuclear == kFALSE ) fTree->Fill();
+             if( fkIsNuclear == kTRUE){ 
+             //If this is a nuclear collision___________________
+             // ... pre-filter with daughter eta selection only (not TPC)
+               if ( TMath::Abs(fTreeVariableNegEta)<0.8 && TMath::Abs(fTreeVariablePosEta)<0.8 ) fTree->Fill();
+             }//end nuclear_____________________________________
          }
       }
 
@@ -1077,6 +1961,8 @@ void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *)
 
    }// This is the end of the V0 loop
 
+//------------------------------------------------
+
    // Post output data.
    PostData(1, fListHistV0);
    PostData(2, fTree);
@@ -1113,7 +1999,73 @@ 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;
+} 
+
+//________________________________________________________________________
+void AliAnalysisTaskExtractPerformanceV0::CheckChargeV0(AliESDv0 *v0)
+{
+   // This function checks charge of negative and positive daughter tracks. 
+   // If incorrectly defined (onfly vertexer), swaps out. 
+   if( v0->GetParamN()->Charge() > 0 && v0->GetParamP()->Charge() < 0 ){
+      //V0 daughter track swapping is required! Note: everything is swapped here... P->N, N->P
+      Long_t lCorrectNidx = v0->GetPindex();
+      Long_t lCorrectPidx = v0->GetNindex();
+      Double32_t       lCorrectNmom[3];
+      Double32_t       lCorrectPmom[3];
+      v0->GetPPxPyPz( lCorrectNmom[0], lCorrectNmom[1], lCorrectNmom[2] );
+      v0->GetNPxPyPz( lCorrectPmom[0], lCorrectPmom[1], lCorrectPmom[2] );
+
+      AliExternalTrackParam    lCorrectParamN(
+        v0->GetParamP()->GetX() , 
+        v0->GetParamP()->GetAlpha() , 
+        v0->GetParamP()->GetParameter() , 
+        v0->GetParamP()->GetCovariance() 
+      );
+      AliExternalTrackParam    lCorrectParamP(
+        v0->GetParamN()->GetX() , 
+        v0->GetParamN()->GetAlpha() , 
+        v0->GetParamN()->GetParameter() , 
+        v0->GetParamN()->GetCovariance() 
+      );
+      lCorrectParamN.SetMostProbablePt( v0->GetParamP()->GetMostProbablePt() );
+      lCorrectParamP.SetMostProbablePt( v0->GetParamN()->GetMostProbablePt() );
+
+      //Get Variables___________________________________________________
+      Double_t lDcaV0Daughters = v0 -> GetDcaV0Daughters();
+      Double_t lCosPALocal     = v0 -> GetV0CosineOfPointingAngle(); 
+      Bool_t lOnFlyStatusLocal = v0 -> GetOnFlyStatus();
+
+      //Create Replacement Object_______________________________________
+      AliESDv0 *v0correct = new AliESDv0(lCorrectParamN,lCorrectNidx,lCorrectParamP,lCorrectPidx);
+      v0correct->SetDcaV0Daughters          ( lDcaV0Daughters   );
+      v0correct->SetV0CosineOfPointingAngle ( lCosPALocal       );
+      v0correct->ChangeMassHypothesis       ( kK0Short          );
+      v0correct->SetOnFlyStatus             ( lOnFlyStatusLocal );
+
+      //Reverse Cluster info..._________________________________________
+      v0correct->SetClusters( v0->GetClusters( 1 ), v0->GetClusters ( 0 ) );
+
+      *v0 = *v0correct;
+      //Proper cleanup..._______________________________________________
+      v0correct->Delete();
+      v0correct = 0x0;
+
+      //Just another cross-check and output_____________________________
+      if( v0->GetParamN()->Charge() > 0 && v0->GetParamP()->Charge() < 0 ) {
+        AliWarning("Found Swapped Charges, tried to correct but something FAILED!");
+      }else{
+        //AliWarning("Found Swapped Charges and fixed.");
+      }
+      //________________________________________________________________
+   }else{
+      //Don't touch it! ---
+      //Printf("Ah, nice. Charges are already ordered...");
+   }
+   return;
 } 
-//----------------------------------------------------------------------------