#include "AliESDUtils.h"
#include "AliESDHeader.h"
+#include "AliAnalysisUtils.h"
#include "AliAnalysisTaskExtractV0.h"
//debugging purposes
ClassImp(AliAnalysisTaskExtractV0)
AliAnalysisTaskExtractV0::AliAnalysisTaskExtractV0()
- : AliAnalysisTaskSE(), fListHistV0(0), fTree(0), fPIDResponse(0),fESDtrackCuts(0),
- fkIsNuclear ( kFALSE ),
- fkLowEnergyPP ( kFALSE ),
- fkUseOnTheFly ( 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 ),
+ fTPCdEdxSelection ( kTRUE ),
+ fEtaRefMult ( 0.5 ),
+//------------------------------------------------
+// Initialize
+ fTreeVariableChi2V0(0),
+ fTreeVariableDcaV0Daughters(0),
+ fTreeVariableDcaV0ToPrimVertex(0),
+ fTreeVariableDcaPosToPrimVertex(0),
+ fTreeVariableDcaNegToPrimVertex(0),
+ fTreeVariableV0CosineOfPointingAngle(0),
+ fTreeVariableV0Radius(0),
+ fTreeVariablePt(0),
+ fTreeVariableRapK0Short(0),
+ fTreeVariableRapLambda(0),
+ fTreeVariableInvMassK0s(0),
+ fTreeVariableInvMassLambda(0),
+ fTreeVariableInvMassAntiLambda(0),
+ fTreeVariableAlphaV0(0),
+ fTreeVariablePtArmV0(0),
+ fTreeVariableNegTotMomentum(0),
+ fTreeVariablePosTotMomentum(0),
+ fTreeVariableNegdEdxSig(0),
+ fTreeVariablePosdEdxSig(0),
+ fTreeVariableNegEta(0),
+ fTreeVariablePosEta(0),
+
+ fTreeVariableNSigmasPosProton(0),
+ fTreeVariableNSigmasPosPion(0),
+ fTreeVariableNSigmasNegProton(0),
+ fTreeVariableNSigmasNegPion(0),
+
+ fTreeVariableDistOverTotMom(0),
+ fTreeVariableLeastNbrCrossedRows(0),
+ fTreeVariableLeastRatioCrossedRowsOverFindable(0),
+ fTreeVariableMultiplicity(0),
+ fTreeVariableMultiplicityV0A(0),
+ fTreeVariableMultiplicityZNA(0),
+ fTreeVariableMultiplicityTRK(0),
+ fTreeVariableMultiplicitySPD(0),
+
+ fTreeVariableRunNumber(0),
+ fTreeVariableEventNumber(0),
+
+ fTreeVariableV0x(0),
+ fTreeVariableV0y(0),
+ fTreeVariableV0z(0),
+
+ fTreeVariableV0Px(0),
+ fTreeVariableV0Py(0),
+ fTreeVariableV0Pz(0),
+
+ fTreeVariablePVx(0),
+ 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
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),
fHistSwappedV0Counter(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 ),
-
+ : 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 ),
+ fTPCdEdxSelection ( kTRUE ),
+ fEtaRefMult ( 0.5 ),
+//------------------------------------------------
+// Initialize
+ fTreeVariableChi2V0(0),
+ fTreeVariableDcaV0Daughters(0),
+ fTreeVariableDcaV0ToPrimVertex(0),
+ fTreeVariableDcaPosToPrimVertex(0),
+ fTreeVariableDcaNegToPrimVertex(0),
+ fTreeVariableV0CosineOfPointingAngle(0),
+ fTreeVariableV0Radius(0),
+ fTreeVariablePt(0),
+ fTreeVariableRapK0Short(0),
+ fTreeVariableRapLambda(0),
+ fTreeVariableInvMassK0s(0),
+ fTreeVariableInvMassLambda(0),
+ fTreeVariableInvMassAntiLambda(0),
+ fTreeVariableAlphaV0(0),
+ fTreeVariablePtArmV0(0),
+ fTreeVariableNegTotMomentum(0),
+ fTreeVariablePosTotMomentum(0),
+ fTreeVariableNegdEdxSig(0),
+ fTreeVariablePosdEdxSig(0),
+ fTreeVariableNegEta(0),
+ fTreeVariablePosEta(0),
+
+ fTreeVariableNSigmasPosProton(0),
+ fTreeVariableNSigmasPosPion(0),
+ fTreeVariableNSigmasNegProton(0),
+ fTreeVariableNSigmasNegPion(0),
+
+ fTreeVariableDistOverTotMom(0),
+ fTreeVariableLeastNbrCrossedRows(0),
+ fTreeVariableLeastRatioCrossedRowsOverFindable(0),
+ fTreeVariableMultiplicity(0),
+ fTreeVariableMultiplicityV0A(0),
+ fTreeVariableMultiplicityZNA(0),
+ fTreeVariableMultiplicityTRK(0),
+ fTreeVariableMultiplicitySPD(0),
+
+ fTreeVariableRunNumber(0),
+ fTreeVariableEventNumber(0),
+
+ fTreeVariableV0x(0),
+ fTreeVariableV0y(0),
+ fTreeVariableV0z(0),
+
+ fTreeVariableV0Px(0),
+ fTreeVariableV0Py(0),
+ fTreeVariableV0Pz(0),
+
+ fTreeVariablePVx(0),
+ 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
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),
fHistSwappedV0Counter(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());
delete fESDtrackCuts;
fESDtrackCuts = 0x0;
}
-
+ if (fUtils){
+ delete fUtils;
+ fUtils = 0x0;
+ }
}
/*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");
/*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");
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");
+ }
+
//------------------------------------------------
// 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
// Track Multiplicity Histograms
//------------------------------------------------
+ //Default V0M Centrality (if PbPb)
if(! fHistMultiplicityBeforeTrigSel) {
fHistMultiplicityBeforeTrigSel = new TH1F("fHistMultiplicityBeforeTrigSel",
"Tracks per event;Nbr of Tracks;Events",
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
2, 0, 2);
fListHistV0->Add(fHistSwappedV0Counter);
}
+
//Regular output: Histograms
PostData(1, fListHistV0);
//TTree Object: Saved to base directory. Should cache to disk while saving.
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 ) |
((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);
+ if(fkIsNuclear == kFALSE) lMultiplicity = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC,fEtaRefMult);
//---> 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( "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);
//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
//------------------------------------------------
fHistV0MultiplicityForTrigEvt ->Fill( nV0s );
fHistMultiplicityForTrigEvt ->Fill( lMultiplicity );
-
+ fHistMultiplicityV0AForTrigEvt ->Fill( lMultiplicityV0A );
+ fHistMultiplicityZNAForTrigEvt ->Fill( lMultiplicityZNA );
+ fHistMultiplicityTRKForTrigEvt ->Fill( lMultiplicityTRK );
+ fHistMultiplicitySPDForTrigEvt ->Fill( lMultiplicitySPD );
+
//------------------------------------------------
// Getting: Primary Vertex + MagField Info
//------------------------------------------------
f2dHistMultiplicityVsVertexZForTrigEvt->Fill( lMultiplicity, tPrimaryVtxPosition[2] );
-//------------------------------------------------
-// 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);
+ //------------------------------------------------
+ // Primary Vertex Requirements Section:
+ // ---> pp and PbPb: Only requires |z|<10cm
+ // ---> pPb: all requirements checked at this stage
+ //------------------------------------------------
+
+ //Roberto's PV selection criteria, implemented 17th April 2013
+
+ /* vertex selection */
+ Bool_t fHasVertex = kFALSE;
+
+ const AliESDVertex *vertex = lESDevent->GetPrimaryVertexTracks();
+ if (vertex->GetNContributors() < 1) {
+ vertex = lESDevent->GetPrimaryVertexSPD();
+ if (vertex->GetNContributors() < 1) fHasVertex = kFALSE;
+ else fHasVertex = kTRUE;
+ TString vtxTyp = vertex->GetTitle();
+ Double_t cov[6]={0};
+ vertex->GetCovarianceMatrix(cov);
+ Double_t zRes = TMath::Sqrt(cov[5]);
+ if (vtxTyp.Contains("vertexer:Z") && (zRes>0.25)) fHasVertex = kFALSE;
+ }
+ else fHasVertex = kTRUE;
+
+ //Is First event in chunk rejection: Still present!
+ if(fkpAVertexSelection==kTRUE && fHasVertex == kFALSE) {
+ AliWarning("Pb / | PV does not satisfy selection criteria!");
+ PostData(1, fListHistV0);
+ PostData(2, fTree);
+ return;
+ }
+
+ //Is First event in chunk rejection: Still present!
+ if(fkpAVertexSelection==kTRUE && fUtils->IsFirstEventInChunk(lESDevent)) {
+ AliWarning("Pb / | This is the first event in the chunk!");
+ PostData(1, fListHistV0);
+ PostData(2, fTree);
+ return;
+ }
+
+ //17 April Fix: Always do primary vertex Z selection, after pA vertex selection from Roberto
+ if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0) {
+ if( !fkpAVertexSelection ) AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
+ if( fkpAVertexSelection ) AliWarning("Pb / | pPb case | 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);
+ fHistMultiplicityV0A->Fill(lMultiplicityV0A);
+ fHistMultiplicityZNA->Fill(lMultiplicityZNA);
+ fHistMultiplicityTRK->Fill(lMultiplicityTRK);
+ fHistMultiplicitySPD->Fill(lMultiplicitySPD);
//------------------------------------------------
// Only look at events with well-established PV
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);
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
// 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;
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
//________________________________________________________________________
//------------------------------------------------
// 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
+ && ( fTPCdEdxSelection==kFALSE ||( fTPCdEdxSelection==kTRUE && TMath::Abs(fTreeVariableNSigmasPosProton) < 6.0 && TMath::Abs(fTreeVariableNSigmasNegPion) < 6.0 ) ) ) ||
+ (fTreeVariableInvMassAntiLambda < lUpperLimitLambda && fTreeVariableInvMassAntiLambda > lLowerLimitLambda
+ && ( fTPCdEdxSelection==kFALSE ||( fTPCdEdxSelection==kTRUE && TMath::Abs(fTreeVariableNSigmasNegProton) < 6.0 && TMath::Abs(fTreeVariableNSigmasPosPion) < 6.0 ) ) ) ||
+ (fTreeVariableInvMassK0s < lUpperLimitK0Short && fTreeVariableInvMassK0s > lLowerLimitK0Short
+ && ( fTPCdEdxSelection==kFALSE ||( fTPCdEdxSelection==kTRUE && 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_____________________________________
+ }
+ }
//------------------------------------------------
// Fill tree over.