]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGLF/STRANGENESS/LambdaK0/AliAnalysisTaskExtractV0.cxx
Added trigger skipping (for ::SetCollisionCandidates operation), added some extra...
[u/mrichter/AliRoot.git] / PWGLF / STRANGENESS / LambdaK0 / AliAnalysisTaskExtractV0.cxx
index 200cc8984e810417ecced782aa39a082fd322027..c7de44e2ce90617812b61831f0141421587cb4a6 100644 (file)
@@ -82,6 +82,7 @@ class AliAODv0;
 #include "AliESDUtils.h"
 #include "AliESDHeader.h"
 
+#include "AliAnalysisUtils.h"
 #include "AliAnalysisTaskExtractV0.h"
 
 //debugging purposes
@@ -90,11 +91,21 @@ class AliAODv0;
 ClassImp(AliAnalysisTaskExtractV0)
 
 AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0() 
-  : AliAnalysisTaskSE(), fListHistV0(0), fTree(0), fPIDResponse(0),fESDtrackCuts(0),
-   fkIsNuclear     ( kFALSE ), 
-   fkLowEnergyPP   ( kFALSE ),
-   fkUseOnTheFly   ( kFALSE ),
-   fkTakeAllTracks ( kFALSE ),
+  : AliAnalysisTaskSE(), fListHistV0(0), fTree(0), fPIDResponse(0),fESDtrackCuts(0), fUtils(0),
+  fkIsNuclear     ( kFALSE ), 
+  fkSwitchINT7    ( kFALSE ),
+  fkUseOnTheFly   ( kFALSE ),
+  fkTakeAllTracks ( kFALSE ),
+  fCentralityEstimator("V0M"),
+  fkLightWeight   ( kFALSE ),
+  fkFastOnly      ( "" ),
+  fkpAVertexSelection( kFALSE ),
+  fkRunV0Vertexer ( kFALSE ),
+  fkRejectPileup  ( kTRUE ),
+  fkSpecialExecution( kFALSE ),
+  fkSkipTrigger   ( kFALSE ),
+  fExtraDCAHeavyToPrimVertex(0),
+  fExtraDCALightToPrimVertex(0),
 //------------------------------------------------
 // Initialize 
        fTreeVariableChi2V0(0),
@@ -128,6 +139,10 @@ AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0()
        fTreeVariableLeastNbrCrossedRows(0),
        fTreeVariableLeastRatioCrossedRowsOverFindable(0),
        fTreeVariableMultiplicity(0),
+       fTreeVariableMultiplicityV0A(0),
+       fTreeVariableMultiplicityZNA(0),
+       fTreeVariableMultiplicityTRK(0),
+       fTreeVariableMultiplicitySPD(0),
   
   fTreeVariableRunNumber(0),
   fTreeVariableEventNumber(0),
@@ -144,6 +159,22 @@ AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0()
   fTreeVariablePVy(0),
   fTreeVariablePVz(0),
 
+  fTreeVariableNegTrackStatus(0),
+  fTreeVariablePosTrackStatus(0),
+
+  fTreeVariableNegTPCSignal(0),
+  fTreeVariablePosTPCSignal(0),
+  fTreeVariableNegInnerP(0),
+  fTreeVariablePosInnerP(0),
+
+  fTreeVariableNegPx(0),
+  fTreeVariableNegPy(0),
+  fTreeVariableNegPz(0),
+  fTreeVariablePosPx(0),
+  fTreeVariablePosPy(0),
+  fTreeVariablePosPz(0),
+
+
 //------------------------------------------------
 // HISTOGRAMS
 // --- Filled on an Event-by-event basis
@@ -159,6 +190,34 @@ AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0()
    fHistMultiplicityNoTPCOnly(0),
    fHistMultiplicityNoTPCOnlyNoPileup(0),
 
+//V0A Centrality
+fHistMultiplicityV0ABeforeTrigSel(0),
+fHistMultiplicityV0AForTrigEvt(0),
+fHistMultiplicityV0A(0),
+fHistMultiplicityV0ANoTPCOnly(0),
+fHistMultiplicityV0ANoTPCOnlyNoPileup(0),
+
+//ZNA Centrality
+fHistMultiplicityZNABeforeTrigSel(0),
+fHistMultiplicityZNAForTrigEvt(0),
+fHistMultiplicityZNA(0),
+fHistMultiplicityZNANoTPCOnly(0),
+fHistMultiplicityZNANoTPCOnlyNoPileup(0),
+
+//TRK Centrality
+fHistMultiplicityTRKBeforeTrigSel(0),
+fHistMultiplicityTRKForTrigEvt(0),
+fHistMultiplicityTRK(0),
+fHistMultiplicityTRKNoTPCOnly(0),
+fHistMultiplicityTRKNoTPCOnlyNoPileup(0),
+
+//SPD Centrality
+fHistMultiplicitySPDBeforeTrigSel(0),
+fHistMultiplicitySPDForTrigEvt(0),
+fHistMultiplicitySPD(0),
+fHistMultiplicitySPDNoTPCOnly(0),
+fHistMultiplicitySPDNoTPCOnlyNoPileup(0),
+
   //Raw Data for Vertex Z position estimator change
        f2dHistMultiplicityVsVertexZBeforeTrigSel(0),
        f2dHistMultiplicityVsVertexZForTrigEvt(0),
@@ -172,18 +231,30 @@ AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0()
    fHistPVxAnalysis(0),
    fHistPVyAnalysis(0),
    fHistPVzAnalysis(0),
-   fHistSwappedV0Counter(0)
+   fHistSwappedV0Counter(0),
+  f2dHistdEdxPos(0),
+  f2dHistdEdxNeg(0)
 {
   // Dummy Constructor
+  for(Int_t iV0selIdx   = 0; iV0selIdx   < 7; iV0selIdx++   ) { fV0Sels          [iV0selIdx   ] = -1.; }
 }
 
 AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0(const char *name) 
-  : AliAnalysisTaskSE(name), fListHistV0(0), fTree(0), fPIDResponse(0),fESDtrackCuts(0),
-   fkIsNuclear     ( kFALSE ), 
-   fkLowEnergyPP   ( kFALSE ),
-   fkUseOnTheFly   ( kFALSE ),
-   fkTakeAllTracks ( kFALSE ),
-     
+  : AliAnalysisTaskSE(name), fListHistV0(0), fTree(0), fPIDResponse(0),fESDtrackCuts(0), fUtils(0),
+  fkIsNuclear     ( kFALSE ), 
+  fkSwitchINT7    ( kFALSE ),
+  fkUseOnTheFly   ( kFALSE ),
+  fkTakeAllTracks ( kFALSE ),
+  fCentralityEstimator("V0M"),
+  fkLightWeight   ( kFALSE ),
+  fkFastOnly      ( "" ),
+  fkpAVertexSelection( kFALSE ),
+  fkRunV0Vertexer ( kFALSE ),
+  fkRejectPileup  ( kTRUE ),
+  fkSpecialExecution( kFALSE ),
+  fkSkipTrigger   ( kFALSE ),
+  fExtraDCAHeavyToPrimVertex(0),
+  fExtraDCALightToPrimVertex(0),
 //------------------------------------------------
 // Initialize 
        fTreeVariableChi2V0(0),
@@ -217,7 +288,11 @@ AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0(const char *name)
        fTreeVariableLeastNbrCrossedRows(0),
        fTreeVariableLeastRatioCrossedRowsOverFindable(0),
        fTreeVariableMultiplicity(0),
-  
+  fTreeVariableMultiplicityV0A(0),
+  fTreeVariableMultiplicityZNA(0),
+  fTreeVariableMultiplicityTRK(0),
+  fTreeVariableMultiplicitySPD(0),
+
   fTreeVariableRunNumber(0),
   fTreeVariableEventNumber(0),
   
@@ -233,6 +308,21 @@ AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0(const char *name)
   fTreeVariablePVy(0),
   fTreeVariablePVz(0),
 
+  fTreeVariableNegTrackStatus(0),
+  fTreeVariablePosTrackStatus(0),
+
+  fTreeVariableNegTPCSignal(0),
+  fTreeVariablePosTPCSignal(0),
+  fTreeVariableNegInnerP(0),
+  fTreeVariablePosInnerP(0),
+
+  fTreeVariableNegPx(0),
+  fTreeVariableNegPy(0),
+  fTreeVariableNegPz(0),
+  fTreeVariablePosPx(0),
+  fTreeVariablePosPy(0),
+  fTreeVariablePosPz(0),
+
 //------------------------------------------------
 // HISTOGRAMS
 // --- Filled on an Event-by-event basis
@@ -248,6 +338,35 @@ AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0(const char *name)
    fHistMultiplicityNoTPCOnly(0),
    fHistMultiplicityNoTPCOnlyNoPileup(0),
 
+
+//V0A Centrality
+fHistMultiplicityV0ABeforeTrigSel(0),
+fHistMultiplicityV0AForTrigEvt(0),
+fHistMultiplicityV0A(0),
+fHistMultiplicityV0ANoTPCOnly(0),
+fHistMultiplicityV0ANoTPCOnlyNoPileup(0),
+
+//ZNA Centrality
+fHistMultiplicityZNABeforeTrigSel(0),
+fHistMultiplicityZNAForTrigEvt(0),
+fHistMultiplicityZNA(0),
+fHistMultiplicityZNANoTPCOnly(0),
+fHistMultiplicityZNANoTPCOnlyNoPileup(0),
+
+//TRK Centrality
+fHistMultiplicityTRKBeforeTrigSel(0),
+fHistMultiplicityTRKForTrigEvt(0),
+fHistMultiplicityTRK(0),
+fHistMultiplicityTRKNoTPCOnly(0),
+fHistMultiplicityTRKNoTPCOnlyNoPileup(0),
+
+//SPD Centrality
+fHistMultiplicitySPDBeforeTrigSel(0),
+fHistMultiplicitySPDForTrigEvt(0),
+fHistMultiplicitySPD(0),
+fHistMultiplicitySPDNoTPCOnly(0),
+fHistMultiplicitySPDNoTPCOnlyNoPileup(0),
+
   //Raw Data for Vertex Z position estimator change
        f2dHistMultiplicityVsVertexZBeforeTrigSel(0),
        f2dHistMultiplicityVsVertexZForTrigEvt(0),
@@ -261,9 +380,21 @@ AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0(const char *name)
    fHistPVxAnalysis(0),
    fHistPVyAnalysis(0),
    fHistPVzAnalysis(0),
-   fHistSwappedV0Counter(0)
+   fHistSwappedV0Counter(0),
+  f2dHistdEdxPos(0),
+  f2dHistdEdxNeg(0)
 {
   // Constructor
+  // Set Loose cuts or not here...
+  // REALLY LOOSE? Be careful when attempting to run over PbPb if fkRunV0Vertexer is set! 
+  fV0Sels[0] =  33.  ;  // max allowed chi2
+  fV0Sels[1] =   0.02;  // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
+  fV0Sels[2] =   0.02;  // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
+  fV0Sels[3] =   2.0 ;  // max allowed DCA between the daughter tracks       (LHC09a4 : 0.5)
+  fV0Sels[4] =   0.95;  // min allowed cosine of V0's pointing angle         (LHC09a4 : 0.99)
+  fV0Sels[5] =   0.5 ;  // min radius of the fiducial volume                 (LHC09a4 : 0.2)
+  fV0Sels[6] = 200.  ;  // max radius of the fiducial volume                 (LHC09a4 : 100.0)
+  
   // Output slot #0 writes into a TList container (Lambda Histos and fTree)
    DefineOutput(1, TList::Class());
    DefineOutput(2, TTree::Class());
@@ -289,7 +420,10 @@ AliAnalysisTaskExtractV0::~AliAnalysisTaskExtractV0()
     delete fESDtrackCuts;
     fESDtrackCuts = 0x0; 
   }
-
+  if (fUtils){
+    delete fUtils;
+    fUtils = 0x0;
+  }
 
 }
 
@@ -327,6 +461,10 @@ void AliAnalysisTaskExtractV0::UserCreateOutputObjects()
 /*16*/ fTree->Branch("fTreeVariableLeastRatioCrossedRowsOverFindable",&fTreeVariableLeastRatioCrossedRowsOverFindable,"fTreeVariableLeastRatioCrossedRowsOverFindable/F");
 //-----------MULTIPLICITY-INFO--------------------
 /*17*/ fTree->Branch("fTreeVariableMultiplicity",&fTreeVariableMultiplicity,"fTreeVariableMultiplicity/I");
+  /*17*/       fTree->Branch("fTreeVariableMultiplicityV0A",&fTreeVariableMultiplicityV0A,"fTreeVariableMultiplicityV0A/I");
+  /*17*/       fTree->Branch("fTreeVariableMultiplicityZNA",&fTreeVariableMultiplicityZNA,"fTreeVariableMultiplicityZNA/I");
+  /*17*/       fTree->Branch("fTreeVariableMultiplicityTRK",&fTreeVariableMultiplicityTRK,"fTreeVariableMultiplicityTRK/I");
+  /*17*/       fTree->Branch("fTreeVariableMultiplicitySPD",&fTreeVariableMultiplicitySPD,"fTreeVariableMultiplicitySPD/I");
 //------------------------------------------------
 /*18*/ fTree->Branch("fTreeVariableDistOverTotMom",&fTreeVariableDistOverTotMom,"fTreeVariableDistOverTotMom/F");
 /*19*/ fTree->Branch("fTreeVariableNSigmasPosProton",&fTreeVariableNSigmasPosProton,"fTreeVariableNSigmasPosProton/F");
@@ -337,6 +475,8 @@ void AliAnalysisTaskExtractV0::UserCreateOutputObjects()
 /*24*/ fTree->Branch("fTreeVariablePosEta",&fTreeVariablePosEta,"fTreeVariablePosEta/F");
 /*25*/ fTree->Branch("fTreeVariableRunNumber",&fTreeVariableRunNumber,"fTreeVariableRunNumber/I");
 /*26*/ fTree->Branch("fTreeVariableEventNumber",&fTreeVariableEventNumber,"fTreeVariableEventNumber/l");
+  
+  if( fkLightWeight == kFALSE ){
 //-----------FOR CTAU DEBUGGING: Full Phase Space + Decay Position Info 
         fTree->Branch("fTreeVariablePVx",&fTreeVariablePVx,"fTreeVariablePVx/F");
         fTree->Branch("fTreeVariablePVy",&fTreeVariablePVy,"fTreeVariablePVy/F");
@@ -349,20 +489,40 @@ void AliAnalysisTaskExtractV0::UserCreateOutputObjects()
         fTree->Branch("fTreeVariableV0Px",&fTreeVariableV0Px,"fTreeVariableV0Px/F");
         fTree->Branch("fTreeVariableV0Py",&fTreeVariableV0Py,"fTreeVariableV0Py/F");
         fTree->Branch("fTreeVariableV0Pz",&fTreeVariableV0Pz,"fTreeVariableV0Pz/F");
+  
+        fTree->Branch("fTreeVariableNegTrackStatus",&fTreeVariableNegTrackStatus,"fTreeVariableNegTrackStatus/l");
+        fTree->Branch("fTreeVariablePosTrackStatus",&fTreeVariablePosTrackStatus,"fTreeVariablePosTrackStatus/l");
+  }
+  if( fkSpecialExecution == kTRUE ){
+    fTree->Branch("fTreeVariablePosTPCSignal",&fTreeVariablePosTPCSignal,"fTreeVariablePosTPCSignal/F");
+    fTree->Branch("fTreeVariableNegTPCSignal",&fTreeVariableNegTPCSignal,"fTreeVariableNegTPCSignal/F");
+    fTree->Branch("fTreeVariablePosInnerP",&fTreeVariablePosInnerP,"fTreeVariablePosInnerP/F");
+    fTree->Branch("fTreeVariableNegInnerP",&fTreeVariableNegInnerP,"fTreeVariableNegInnerP/F");
+    
+    fTree->Branch("fTreeVariablePosPx",&fTreeVariablePosPx,"fTreeVariablePosPx/F");
+    fTree->Branch("fTreeVariablePosPy",&fTreeVariablePosPy,"fTreeVariablePosPy/F");
+    fTree->Branch("fTreeVariablePosPz",&fTreeVariablePosPz,"fTreeVariablePosPz/F");
+    fTree->Branch("fTreeVariableNegPx",&fTreeVariableNegPx,"fTreeVariableNegPx/F");
+    fTree->Branch("fTreeVariableNegPy",&fTreeVariableNegPy,"fTreeVariableNegPy/F");
+    fTree->Branch("fTreeVariableNegPz",&fTreeVariableNegPz,"fTreeVariableNegPz/F");
+  }
+  
 //------------------------------------------------
 // Particle Identification Setup
 //------------------------------------------------
 
-   AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
-   AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
-   fPIDResponse = inputHandler->GetPIDResponse();
-
-  // Multiplicity 
-
-    if(! fESDtrackCuts ){
-          fESDtrackCuts = new AliESDtrackCuts();
-    }
-
+  AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
+  fPIDResponse = inputHandler->GetPIDResponse();
+  
+  // Multiplicity
+  
+  if(! fESDtrackCuts ){
+    fESDtrackCuts = new AliESDtrackCuts();
+  }
+  if(! fUtils ){
+    fUtils = new AliAnalysisUtils();
+  }
 
 //------------------------------------------------
 // V0 Multiplicity Histograms
@@ -414,6 +574,7 @@ void AliAnalysisTaskExtractV0::UserCreateOutputObjects()
 // Track Multiplicity Histograms
 //------------------------------------------------
 
+  //Default V0M Centrality (if PbPb) 
    if(! fHistMultiplicityBeforeTrigSel) {
       fHistMultiplicityBeforeTrigSel = new TH1F("fHistMultiplicityBeforeTrigSel", 
          "Tracks per event;Nbr of Tracks;Events", 
@@ -444,9 +605,135 @@ void AliAnalysisTaskExtractV0::UserCreateOutputObjects()
          200, 0, 200);                 
       fListHistV0->Add(fHistMultiplicityNoTPCOnlyNoPileup);
    }
-
-
-
+  
+  //V0A Centrality (if PbPb / pPb)
+  if(! fHistMultiplicityV0ABeforeTrigSel) {
+    fHistMultiplicityV0ABeforeTrigSel = new TH1F("fHistMultiplicityV0ABeforeTrigSel",
+                                              "Centrality Distribution: V0A;V0A Centrality;Events",
+                                              200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityV0ABeforeTrigSel);
+  }
+  if(! fHistMultiplicityV0AForTrigEvt) {
+    fHistMultiplicityV0AForTrigEvt = new TH1F("fHistMultiplicityV0AForTrigEvt",
+                                              "Centrality Distribution: V0A;V0A Centrality;Events",
+                                           200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityV0AForTrigEvt);
+  }
+  if(! fHistMultiplicityV0A) {
+    fHistMultiplicityV0A = new TH1F("fHistMultiplicityV0A",
+                                              "Centrality Distribution: V0A;V0A Centrality;Events",
+                                 200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityV0A);
+  }
+  if(! fHistMultiplicityV0ANoTPCOnly) {
+    fHistMultiplicityV0ANoTPCOnly = new TH1F("fHistMultiplicityV0ANoTPCOnly",
+                                              "Centrality Distribution: V0A;V0A Centrality;Events",
+                                          200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityV0ANoTPCOnly);
+  }
+  if(! fHistMultiplicityV0ANoTPCOnlyNoPileup) {
+    fHistMultiplicityV0ANoTPCOnlyNoPileup = new TH1F("fHistMultiplicityV0ANoTPCOnlyNoPileup",
+                                              "Centrality Distribution: V0A;V0A Centrality;Events",
+                                                  200, 0, 200);                
+    fListHistV0->Add(fHistMultiplicityV0ANoTPCOnlyNoPileup);
+  }
+  
+  //ZNA Centrality (if PbPb / pPb)
+  if(! fHistMultiplicityZNABeforeTrigSel) {
+    fHistMultiplicityZNABeforeTrigSel = new TH1F("fHistMultiplicityZNABeforeTrigSel",
+                                                 "Centrality Distribution: ZNA;ZNA Centrality;Events",
+                                                 200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityZNABeforeTrigSel);
+  }
+  if(! fHistMultiplicityZNAForTrigEvt) {
+    fHistMultiplicityZNAForTrigEvt = new TH1F("fHistMultiplicityZNAForTrigEvt",
+                                              "Centrality Distribution: ZNA;ZNA Centrality;Events",
+                                              200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityZNAForTrigEvt);
+  }
+  if(! fHistMultiplicityZNA) {
+    fHistMultiplicityZNA = new TH1F("fHistMultiplicityZNA",
+                                    "Centrality Distribution: ZNA;ZNA Centrality;Events",
+                                    200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityZNA);
+  }
+  if(! fHistMultiplicityZNANoTPCOnly) {
+    fHistMultiplicityZNANoTPCOnly = new TH1F("fHistMultiplicityZNANoTPCOnly",
+                                             "Centrality Distribution: ZNA;ZNA Centrality;Events",
+                                             200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityZNANoTPCOnly);
+  }
+  if(! fHistMultiplicityZNANoTPCOnlyNoPileup) {
+    fHistMultiplicityZNANoTPCOnlyNoPileup = new TH1F("fHistMultiplicityZNANoTPCOnlyNoPileup",
+                                                     "Centrality Distribution: ZNA;ZNA Centrality;Events",
+                                                     200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityZNANoTPCOnlyNoPileup);
+  }
+  
+  //TRK Centrality (if PbPb / pPb)
+  if(! fHistMultiplicityTRKBeforeTrigSel) {
+    fHistMultiplicityTRKBeforeTrigSel = new TH1F("fHistMultiplicityTRKBeforeTrigSel",
+                                                 "Centrality Distribution: TRK;TRK Centrality;Events",
+                                                 200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityTRKBeforeTrigSel);
+  }
+  if(! fHistMultiplicityTRKForTrigEvt) {
+    fHistMultiplicityTRKForTrigEvt = new TH1F("fHistMultiplicityTRKForTrigEvt",
+                                              "Centrality Distribution: TRK;TRK Centrality;Events",
+                                              200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityTRKForTrigEvt);
+  }
+  if(! fHistMultiplicityTRK) {
+    fHistMultiplicityTRK = new TH1F("fHistMultiplicityTRK",
+                                    "Centrality Distribution: TRK;TRK Centrality;Events",
+                                    200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityTRK);
+  }
+  if(! fHistMultiplicityTRKNoTPCOnly) {
+    fHistMultiplicityTRKNoTPCOnly = new TH1F("fHistMultiplicityTRKNoTPCOnly",
+                                             "Centrality Distribution: TRK;TRK Centrality;Events",
+                                             200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityTRKNoTPCOnly);
+  }
+  if(! fHistMultiplicityTRKNoTPCOnlyNoPileup) {
+    fHistMultiplicityTRKNoTPCOnlyNoPileup = new TH1F("fHistMultiplicityTRKNoTPCOnlyNoPileup",
+                                                     "Centrality Distribution: TRK;TRK Centrality;Events",
+                                                     200, 0, 200);
+    fListHistV0->Add(fHistMultiplicityTRKNoTPCOnlyNoPileup);
+  }
+  
+  //SPD Centrality (if PbPb / pPb)
+  if(! fHistMultiplicitySPDBeforeTrigSel) {
+    fHistMultiplicitySPDBeforeTrigSel = new TH1F("fHistMultiplicitySPDBeforeTrigSel",
+                                                 "Centrality Distribution: SPD;SPD Centrality;Events",
+                                                 200, 0, 200);
+    fListHistV0->Add(fHistMultiplicitySPDBeforeTrigSel);
+  }
+  if(! fHistMultiplicitySPDForTrigEvt) {
+    fHistMultiplicitySPDForTrigEvt = new TH1F("fHistMultiplicitySPDForTrigEvt",
+                                              "Centrality Distribution: SPD;SPD Centrality;Events",
+                                              200, 0, 200);
+    fListHistV0->Add(fHistMultiplicitySPDForTrigEvt);
+  }
+  if(! fHistMultiplicitySPD) {
+    fHistMultiplicitySPD = new TH1F("fHistMultiplicitySPD",
+                                    "Centrality Distribution: SPD;SPD Centrality;Events",
+                                    200, 0, 200);
+    fListHistV0->Add(fHistMultiplicitySPD);
+  }
+  if(! fHistMultiplicitySPDNoTPCOnly) {
+    fHistMultiplicitySPDNoTPCOnly = new TH1F("fHistMultiplicitySPDNoTPCOnly",
+                                             "Centrality Distribution: SPD;SPD Centrality;Events",
+                                             200, 0, 200);
+    fListHistV0->Add(fHistMultiplicitySPDNoTPCOnly);
+  }
+  if(! fHistMultiplicitySPDNoTPCOnlyNoPileup) {
+    fHistMultiplicitySPDNoTPCOnlyNoPileup = new TH1F("fHistMultiplicitySPDNoTPCOnlyNoPileup",
+                                                     "Centrality Distribution: SPD;SPD Centrality;Events",
+                                                     200, 0, 200);
+    fListHistV0->Add(fHistMultiplicitySPDNoTPCOnlyNoPileup);
+  }
+  
   //Raw Data for Vertex Z position estimator change
        //TH2F    *f2dHistMultiplicityVsVertexZBeforeTrigSel;           //! multiplicity distribution    
        //TH2F    *f2dHistMultiplicityVsVertexZForTrigEvt;                      //! multiplicity distribution
@@ -524,6 +811,19 @@ void AliAnalysisTaskExtractV0::UserCreateOutputObjects()
          2, 0, 2);             
       fListHistV0->Add(fHistSwappedV0Counter);
    }
+  
+  //Create dE/dx histograms
+  if(! f2dHistdEdxPos ){
+    f2dHistdEdxPos = new TH2F("f2dHistdEdxPos","Pos. Daughter dE/dx;p (GeV/c);TPC Signal",
+                              200,0,10,500,0,1000);
+    if (fkSpecialExecution) fListHistV0->Add(f2dHistdEdxPos);
+  }
+  if(! f2dHistdEdxNeg ){
+    f2dHistdEdxNeg = new TH2F("f2dHistdEdxNeg","Neg. Daughter dE/dx;p (GeV/c);TPC Signal",
+                              200,0,10,500,0,1000);
+    if (fkSpecialExecution) fListHistV0->Add(f2dHistdEdxNeg);
+  }
+  
    //Regular output: Histograms
    PostData(1, fListHistV0);
    //TTree Object: Saved to base directory. Should cache to disk while saving. 
@@ -558,6 +858,18 @@ void AliAnalysisTaskExtractV0::UserExec(Option_t *)
       AliWarning("ERROR: lESDevent not available \n");
       return;
    }
+  
+  //------------------------------------------------
+  // Rerun V0 vertexer, if asked for
+  // --- WARNING: Be careful when using in PbPb
+  //------------------------------------------------
+  if( fkRunV0Vertexer ){
+    lESDevent->ResetV0s();
+    AliV0vertexer lV0vtxer;
+    lV0vtxer.SetDefaultCuts(fV0Sels);
+    lV0vtxer.Tracks2V0vertices(lESDevent);
+  }
+  
    fTreeVariableRunNumber = lESDevent->GetRunNumber();
    fTreeVariableEventNumber =  
     ( ( ((ULong64_t)lESDevent->GetPeriodNumber() ) << 36 ) |
@@ -565,7 +877,11 @@ void AliAnalysisTaskExtractV0::UserExec(Option_t *)
         ((ULong64_t)lESDevent->GetBunchCrossNumber() )  );
 
    //REVISED multiplicity estimator after 'multiplicity day' (2011)
-   Int_t lMultiplicity = -100; 
+   Int_t lMultiplicity = -100;
+   Int_t lMultiplicityV0A = -100;
+   Int_t lMultiplicityZNA = -100;
+   Int_t lMultiplicityTRK = -100;
+   Int_t lMultiplicitySPD = -100;  
 
    if(fkIsNuclear == kFALSE) lMultiplicity = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC,0.5);
 
@@ -574,7 +890,11 @@ void AliAnalysisTaskExtractV0::UserExec(Option_t *)
    if(fkIsNuclear == kTRUE){ 
       AliCentrality* centrality;
       centrality = lESDevent->GetCentrality();
-      lMultiplicity = ( ( Int_t ) ( centrality->GetCentralityPercentile( "V0M" ) ) );
+      lMultiplicity = ( ( Int_t ) ( centrality->GetCentralityPercentile(   fCentralityEstimator.Data() ) ) );
+      lMultiplicityV0A = ( ( Int_t ) ( centrality->GetCentralityPercentile(   "V0A" ) ) );
+      lMultiplicityZNA = ( ( Int_t ) ( centrality->GetCentralityPercentile(   "ZNA" ) ) );
+      lMultiplicityTRK = ( ( Int_t ) ( centrality->GetCentralityPercentile(   "TRK" ) ) );
+      lMultiplicitySPD = ( ( Int_t ) ( centrality->GetCentralityPercentile(   "CL1" ) ) );
       if (centrality->GetQuality()>1) {
         PostData(1, fListHistV0);
         PostData(2, fTree);
@@ -585,32 +905,61 @@ void AliAnalysisTaskExtractV0::UserExec(Option_t *)
    //Set variable for filling tree afterwards!
    //---> pp case......: GetReferenceMultiplicity
    //---> Pb-Pb case...: Centrality by V0M
-   fTreeVariableMultiplicity = lMultiplicity;
-   fHistMultiplicityBeforeTrigSel->Fill ( lMultiplicity );
-   fHistV0MultiplicityBeforeTrigSel->Fill ( lESDevent->GetNumberOfV0s() );
+  fTreeVariableMultiplicity = lMultiplicity;
+  fTreeVariableMultiplicityV0A = lMultiplicityV0A;
+  fTreeVariableMultiplicityZNA = lMultiplicityZNA;
+  fTreeVariableMultiplicityTRK = lMultiplicityTRK;
+  fTreeVariableMultiplicitySPD = lMultiplicitySPD;
+  
+  fHistMultiplicityBeforeTrigSel->Fill ( lMultiplicity );
+  fHistMultiplicityV0ABeforeTrigSel->Fill ( lMultiplicityV0A );
+  fHistMultiplicityZNABeforeTrigSel->Fill ( lMultiplicityZNA );
+  fHistMultiplicityTRKBeforeTrigSel->Fill ( lMultiplicityTRK );
+  fHistMultiplicitySPDBeforeTrigSel->Fill ( lMultiplicitySPD );
+  
+  fHistV0MultiplicityBeforeTrigSel->Fill ( lESDevent->GetNumberOfV0s() );
 
 //------------------------------------------------
 // Physics Selection
 //------------------------------------------------
-
-// new method        
-   UInt_t maskIsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
-   Bool_t isSelected = 0;
-   isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
-
-   //pp at 2.76TeV: special case, ignore FastOnly
-   if ( (fkLowEnergyPP == kTRUE) && (maskIsSelected& AliVEvent::kFastOnly) ){
+  
+  // new method
+  UInt_t maskIsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
+  Bool_t isSelected = 0;
+  Bool_t isSelectedExtra = kTRUE; //extra sel, default YES
+  isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
+  
+  if( fkSkipTrigger == kFALSE ){
+    //pA triggering: CINT7
+    if( fkSwitchINT7 ) isSelected = (maskIsSelected & AliVEvent::kINT7) == AliVEvent::kINT7;
+    
+    //Extra selection applies if with/without SDD is to be dealth with
+    if( fkFastOnly == "kFastOnly"){
+      //If not kFastOnly, isSelectedExtra will be kFALSE; procedure will reject it
+      isSelectedExtra = (maskIsSelected & AliVEvent::kFastOnly) == AliVEvent::kFastOnly;
+    }
+    if( fkFastOnly == "NotkFastOnly"){
+      //If not kFastOnly, isSelectedExtra will be kTRUE; procedure will accept it
+      isSelectedExtra = !( (maskIsSelected & AliVEvent::kFastOnly) == AliVEvent::kFastOnly );
+    }
+    
+    //Standard Min-Bias Selection
+    if ( !isSelected ) {
       PostData(1, fListHistV0);
       PostData(2, fTree);
       return;
-   } 
-   //Standard Min-Bias Selection
-   if ( ! isSelected ) { 
+    }
+    //Check if goes through extra selections
+    //isSelectedExtra will be true in case -> fkFastOnly==""
+    //isSelectedExtra will be true in case -> fkFastOnly=="kFastOnly"    && bit kFastOnly ON
+    //isSelectedExtra will be true in case -> fkFastOnly=="NotkFastOnly" && bit kFastOnly OFF
+    if ( !isSelectedExtra ) {
       PostData(1, fListHistV0);
       PostData(2, fTree);
       return;
-   }
-
+    }
+  }
+  
 //------------------------------------------------
 // After Trigger Selection
 //------------------------------------------------
@@ -619,7 +968,11 @@ void AliAnalysisTaskExtractV0::UserExec(Option_t *)
 
   fHistV0MultiplicityForTrigEvt     ->Fill( nV0s       );
   fHistMultiplicityForTrigEvt       ->Fill( lMultiplicity  );
-
+  fHistMultiplicityV0AForTrigEvt       ->Fill( lMultiplicityV0A  );
+  fHistMultiplicityZNAForTrigEvt       ->Fill( lMultiplicityZNA  );
+  fHistMultiplicityTRKForTrigEvt       ->Fill( lMultiplicityTRK  );
+  fHistMultiplicitySPDForTrigEvt       ->Fill( lMultiplicitySPD  );
+  
 //------------------------------------------------
 // Getting: Primary Vertex + MagField Info
 //------------------------------------------------
@@ -650,18 +1003,34 @@ void AliAnalysisTaskExtractV0::UserExec(Option_t *)
 // Primary Vertex Z position: SKIP
 //------------------------------------------------
 
-   if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0 ) { 
-      AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !"); 
-      PostData(1, fListHistV0);
-      PostData(2, fTree);
-      return; 
-   }
-
-   f2dHistMultiplicityVsVertexZ->Fill( lMultiplicity, tPrimaryVtxPosition[2] );
-
-   lMagneticField = lESDevent->GetMagneticField( );
-   fHistV0MultiplicityForSelEvt ->Fill( nV0s );
-   fHistMultiplicity->Fill(lMultiplicity);
+  if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0 && fkpAVertexSelection==kFALSE) {
+    AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
+    PostData(1, fListHistV0);
+    PostData(2, fTree);
+    return;
+  }
+  if(fkpAVertexSelection==kTRUE && fUtils->IsFirstEventInChunk(lESDevent)) {
+    AliWarning("Pb / | This is the first event in the chunk!");
+    PostData(1, fListHistV0);
+    PostData(2, fTree);
+    return;
+  }
+  if(fkpAVertexSelection==kTRUE && !fUtils->IsVertexSelected2013pA(lESDevent)) {
+    AliWarning("Pb / | Vertex not selected by 2013 pA criteria!");
+    PostData(1, fListHistV0);
+    PostData(2, fTree);
+    return;
+  }
+  
+  f2dHistMultiplicityVsVertexZ->Fill( lMultiplicity, tPrimaryVtxPosition[2] );
+  
+  lMagneticField = lESDevent->GetMagneticField( );
+  fHistV0MultiplicityForSelEvt ->Fill( nV0s );
+  fHistMultiplicity->Fill(lMultiplicity);
+  fHistMultiplicityV0A->Fill(lMultiplicityV0A);
+  fHistMultiplicityZNA->Fill(lMultiplicityZNA);
+  fHistMultiplicityTRK->Fill(lMultiplicityTRK);
+  fHistMultiplicitySPD->Fill(lMultiplicitySPD);
 
 //------------------------------------------------
 // Only look at events with well-established PV
@@ -669,7 +1038,7 @@ void AliAnalysisTaskExtractV0::UserExec(Option_t *)
        
    const AliESDVertex *lPrimaryTrackingESDVtxCheck = lESDevent->GetPrimaryVertexTracks();
    const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
-   if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtxCheck->GetStatus() ){
+   if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtxCheck->GetStatus() && fkpAVertexSelection==kFALSE ){
       AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
       PostData(1, fListHistV0);
       PostData(2, fTree);
@@ -678,23 +1047,31 @@ void AliAnalysisTaskExtractV0::UserExec(Option_t *)
 
 
    f2dHistMultiplicityVsVertexZNoTPCOnly->Fill( lMultiplicity, tPrimaryVtxPosition[2] );
-   fHistV0MultiplicityForSelEvtNoTPCOnly ->Fill( nV0s );
-   fHistMultiplicityNoTPCOnly->Fill(lMultiplicity);
+  fHistV0MultiplicityForSelEvtNoTPCOnly ->Fill( nV0s );
+  fHistMultiplicityNoTPCOnly->Fill(lMultiplicity);
+  fHistMultiplicityV0ANoTPCOnly->Fill(lMultiplicityV0A);
+  fHistMultiplicityZNANoTPCOnly->Fill(lMultiplicityZNA);
+  fHistMultiplicityTRKNoTPCOnly->Fill(lMultiplicityTRK);
+  fHistMultiplicitySPDNoTPCOnly->Fill(lMultiplicitySPD);
 
 //------------------------------------------------
 // Pileup Rejection
 //------------------------------------------------
 
    // FIXME : quality selection regarding pile-up rejection 
-   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
+   if(lESDevent->IsPileupFromSPD() && !fkIsNuclear && fkRejectPileup){// 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
       PostData(1, fListHistV0);
       PostData(2, fTree); 
       return;
    }
 
-   f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup->Fill( lMultiplicity, tPrimaryVtxPosition[2] );
-   fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup ->Fill( nV0s );
-   fHistMultiplicityNoTPCOnlyNoPileup->Fill(lMultiplicity);
+  f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup->Fill( lMultiplicity, tPrimaryVtxPosition[2] );
+  fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup ->Fill( nV0s );
+  fHistMultiplicityNoTPCOnlyNoPileup->Fill(lMultiplicity);
+  fHistMultiplicityV0ANoTPCOnlyNoPileup->Fill(lMultiplicityV0A);
+  fHistMultiplicityZNANoTPCOnlyNoPileup->Fill(lMultiplicityZNA);
+  fHistMultiplicityTRKNoTPCOnlyNoPileup->Fill(lMultiplicityTRK);
+  fHistMultiplicitySPDNoTPCOnlyNoPileup->Fill(lMultiplicitySPD);
   
 //------------------------------------------------
 // MAIN LAMBDA LOOP STARTS HERE
@@ -781,6 +1158,24 @@ void AliAnalysisTaskExtractV0::UserExec(Option_t *)
       //Daughter Eta for Eta selection, afterwards
       fTreeVariableNegEta = nTrack->Eta();
       fTreeVariablePosEta = pTrack->Eta();
+     
+     if( fkSpecialExecution ){
+       fTreeVariableNegPx = lMomNeg[0]; fTreeVariableNegPy = lMomNeg[1]; fTreeVariableNegPz = lMomNeg[2];
+       fTreeVariablePosPx = lMomPos[0]; fTreeVariablePosPy = lMomPos[1]; fTreeVariablePosPz = lMomPos[2];
+       //Need to acquire info to do dEdx cut afterwards...
+       fTreeVariablePosTPCSignal = pTrack->GetTPCsignal();
+       fTreeVariableNegTPCSignal = nTrack->GetTPCsignal();
+       //Get Inner momentum if possible
+       fTreeVariableNegInnerP = nTrack->GetP();
+       fTreeVariablePosInnerP = pTrack->GetP();
+       const AliExternalTrackParam *innerpos=pTrack->GetInnerParam();
+       const AliExternalTrackParam *innerneg=nTrack->GetInnerParam();
+       if(innerpos) { fTreeVariablePosInnerP = innerpos->GetP(); }
+       if(innerneg) { fTreeVariableNegInnerP = innerneg->GetP(); }
+       
+       f2dHistdEdxPos->Fill( fTreeVariablePosInnerP , fTreeVariablePosdEdxSig );
+       f2dHistdEdxNeg->Fill( fTreeVariableNegInnerP , fTreeVariableNegdEdxSig );
+     }
 
       // Filter like-sign V0 (next: add counter and distribution)
       if ( pTrack->GetSign() == nTrack->GetSign()){
@@ -798,7 +1193,11 @@ void AliAnalysisTaskExtractV0::UserExec(Option_t *)
       // 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;
-
+     
+      //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
@@ -880,41 +1279,51 @@ void AliAnalysisTaskExtractV0::UserExec(Option_t *)
 //------------------------------------------------
 // Fill Tree! 
 //------------------------------------------------
-
-// The conditionals are meant to decrease excessive
-// memory usage! 
-
-//First Selection: Reject OnFly
-      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; 
-         Double_t lLowerLimitK0Short = (4.30006e-01) - (1.10029e-02)*fTreeVariablePt;
-         //Lambda: Linear (for higher pt) plus exponential (for low-pt broadening)
-         //[0]+[1]*x+[2]*TMath::Exp(-[3]*x)
-         Double_t lUpperLimitLambda = (1.13688e+00) + (5.27838e-03)*fTreeVariablePt + (8.42220e-02)*TMath::Exp(-(3.80595e+00)*fTreeVariablePt); 
-         Double_t lLowerLimitLambda = (1.09501e+00) - (5.23272e-03)*fTreeVariablePt - (7.52690e-02)*TMath::Exp(-(3.46339e+00)*fTreeVariablePt);
-         //Do Selection      
-         if( (fTreeVariableInvMassLambda     < lUpperLimitLambda  && fTreeVariableInvMassLambda     > lLowerLimitLambda     ) || 
-             (fTreeVariableInvMassAntiLambda < lUpperLimitLambda  && fTreeVariableInvMassAntiLambda > lLowerLimitLambda     ) || 
-             (fTreeVariableInvMassK0s        < lUpperLimitK0Short && fTreeVariableInvMassK0s        > lLowerLimitK0Short    ) ){
-             //Pre-selection in case this is AA...
-             if( fkIsNuclear == kFALSE ) fTree->Fill();
-             if( fkIsNuclear == kTRUE){ 
-             //If this is a nuclear collision___________________
-             // ... pre-filter with TPC, daughter eta selection
-               if( (fTreeVariableInvMassLambda     < lUpperLimitLambda  && fTreeVariableInvMassLambda     > lLowerLimitLambda 
-                      && TMath::Abs(fTreeVariableNSigmasPosProton) < 6.0 && TMath::Abs(fTreeVariableNSigmasNegPion) < 6.0 ) || 
-                   (fTreeVariableInvMassAntiLambda < lUpperLimitLambda  && fTreeVariableInvMassAntiLambda > lLowerLimitLambda 
-                      && TMath::Abs(fTreeVariableNSigmasNegProton) < 6.0 && TMath::Abs(fTreeVariableNSigmasPosPion) < 6.0 ) ||  
-                   (fTreeVariableInvMassK0s        < lUpperLimitK0Short && fTreeVariableInvMassK0s        > lLowerLimitK0Short 
-                      && TMath::Abs(fTreeVariableNSigmasNegPion)   < 6.0 && TMath::Abs(fTreeVariableNSigmasPosPion) < 6.0 ) ){
-                  //insane test
-                  if ( TMath::Abs(fTreeVariableNegEta)<0.8 && TMath::Abs(fTreeVariablePosEta)<0.8 ) fTree->Fill();
-               }
-             }//end nuclear_____________________________________
-         }
-      }
+     
+     // The conditionals are meant to decrease excessive
+     // memory usage!
+     
+     //First Selection: Reject OnFly
+     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;
+       Double_t lLowerLimitK0Short = (4.30006e-01) - (1.10029e-02)*fTreeVariablePt;
+       //Lambda: Linear (for higher pt) plus exponential (for low-pt broadening)
+       //[0]+[1]*x+[2]*TMath::Exp(-[3]*x)
+       Double_t lUpperLimitLambda = (1.13688e+00) + (5.27838e-03)*fTreeVariablePt + (8.42220e-02)*TMath::Exp(-(3.80595e+00)*fTreeVariablePt);
+       Double_t lLowerLimitLambda = (1.09501e+00) - (5.23272e-03)*fTreeVariablePt - (7.52690e-02)*TMath::Exp(-(3.46339e+00)*fTreeVariablePt);
+       //Do Selection
+       if( (fTreeVariableInvMassLambda     < lUpperLimitLambda  && fTreeVariableInvMassLambda     > lLowerLimitLambda     ) ||
+          (fTreeVariableInvMassAntiLambda < lUpperLimitLambda  && fTreeVariableInvMassAntiLambda > lLowerLimitLambda     ) ||
+          (fTreeVariableInvMassK0s        < lUpperLimitK0Short && fTreeVariableInvMassK0s        > lLowerLimitK0Short    ) ){
+         //Pre-selection in case this is AA...
+         if( fkIsNuclear == kFALSE ) fTree->Fill();
+         if( fkIsNuclear == kTRUE){
+           //If this is a nuclear collision___________________
+           // ... pre-filter with TPC, daughter eta selection
+           if( (fTreeVariableInvMassLambda     < lUpperLimitLambda  && fTreeVariableInvMassLambda     > lLowerLimitLambda
+                && TMath::Abs(fTreeVariableNSigmasPosProton) < 6.0 && TMath::Abs(fTreeVariableNSigmasNegPion) < 6.0 ) ||
+              (fTreeVariableInvMassAntiLambda < lUpperLimitLambda  && fTreeVariableInvMassAntiLambda > lLowerLimitLambda
+               && TMath::Abs(fTreeVariableNSigmasNegProton) < 6.0 && TMath::Abs(fTreeVariableNSigmasPosPion) < 6.0 ) ||
+              (fTreeVariableInvMassK0s        < lUpperLimitK0Short && fTreeVariableInvMassK0s        > lLowerLimitK0Short
+               && TMath::Abs(fTreeVariableNSigmasNegPion)   < 6.0 && TMath::Abs(fTreeVariableNSigmasPosPion) < 6.0 ) ){
+                //insane test
+                if ( TMath::Abs(fTreeVariableNegEta)<0.8 && TMath::Abs(fTreeVariablePosEta)<0.8 && !fkSpecialExecution) fTree->Fill();
+              }
+         }//end nuclear_____________________________________
+       }
+     }
+     
+     if(lOnFlyStatus == 0 && fkSpecialExecution){
+       if(
+          (fTreeVariableNSigmasPosProton > 6 && TMath::Abs(fTreeVariableNSigmasNegPion)< 6
+           && fTreeVariableDcaPosToPrimVertex > fExtraDCAHeavyToPrimVertex && fTreeVariableDcaNegToPrimVertex > fExtraDCALightToPrimVertex ) ||
+          (fTreeVariableNSigmasNegProton > 6 && TMath::Abs(fTreeVariableNSigmasPosPion)< 6
+           && fTreeVariableDcaPosToPrimVertex > fExtraDCALightToPrimVertex && fTreeVariableDcaNegToPrimVertex > fExtraDCAHeavyToPrimVertex ) ){
+         fTree->Fill();
+       }
+     }
 
 //------------------------------------------------
 // Fill tree over.