#ifndef AliAnalysisTaskLRC_H #define AliAnalysisTaskLRC_H // Analysis task for Long Range Correlation (LRC) analysis using TPC data // This includes a TList of AliLRCProcess objects that are processing LRC analysis // for a given eta-phi windows // Author : Andrey Ivanov, Igor Altsybeev, St.Peterburg State University // Email: Igor.Altsybeev.ch #include <AliPIDResponse.h> #include <AliPIDCombined.h> #include <AliAnalysisTaskSE.h> //#define kNumberOfParentParticleClassesInMC 8 //class AliLRCProcess; class AliLRCBase; class AliESDtrackCuts; class TH1D; class TH2D; class TH1I; class TRandom3; class TParticle; //class AliSimpleEvent; class TTree; class TStopwatch; //enum en_AnalysisType //{ // en_AnalysisType_ESD = 0, // en_AnalysisType_AOD //}; class AliAnalysisTaskLRC : public AliAnalysisTaskSE { public: //Constructors AliAnalysisTaskLRC( const char *name = "AliAnalysisTaskLRC", Bool_t runKine = kFALSE ); virtual ~AliAnalysisTaskLRC() {} //AliAnalysisTaskSE overloading virtual void UserCreateOutputObjects(); virtual void UserExec(Option_t *option); // virtual void UserExecLoop( Double_t phiAdditional = 0 );//Option_t *option); virtual void Terminate(Option_t *); //---------------------------------- void AddLRCProcess(AliLRCBase *newProc); //Adds new AliLRCProcess to analysis task // Setters void SetMinNumberOfSPDtracklets( Int_t MinSPDtracklets ); //Sets min number of SPD tracklets void SetMaxPtLimit(Double_t MaxPtLimit); //Sets Max Pt filter void SetMinPtLimit(Double_t MinPtLimit); //Sets Min Pt filter void SetKineLowPtCut(Double_t MinKineParticlePtLimit); //Sets Min Pt filter for kine particles void SetCheckForkVtx(Bool_t CheckForkVtx){fCheckForkVtx=CheckForkVtx;} // Accept only events with veretex void SetCheckForVtxPosition(Bool_t CheckForVtxPosition ){fCheckForVtxPosition=CheckForVtxPosition;} //Accept only events with veretex in slected range void SetTrackCuts(AliESDtrackCuts* const cuts) { fEsdTrackCuts = cuts; } void SetAODtrackCutBit(UInt_t bit){ fAODtrackCutBit = bit; } //AOD track cut bit void SetShowEventStats(Bool_t ShowEventStats) {fShowEventStats= ShowEventStats;} void SetShowPerTrackStats(Bool_t ShowPerTrackStats) {fShowPerTrackStats=ShowPerTrackStats;} void SetVtxDiamond(Double_t Vx, Double_t Vy, Double_t Vz) {fVxMax = Vx;fVyMax =Vy;fVzMax = Vz;} void SetNchCuts(Int_t minNch, Int_t maxNch){fMinAcceptedTracksCut=minNch; fMaxAcceptedTracksCut=maxNch;} void SetNumberOfPhiSectors(Int_t nSectors){ fNumberOfPhiSectors = nSectors; }//fNeedToRotateSector = kTRUE; } void SetCentralityClass(Float_t minCentralityClass, Float_t maxCentralityClass ){ fMinCentralityClass = minCentralityClass; fMaxCentralityClass = maxCentralityClass; } void SetIonsAnalysis(Bool_t isIonsFlag ){ fIsIonsAnalysis = isIonsFlag; } void SetEtAnalysis(Bool_t isEtAnalysisFlag ){ fEtInsteadOfPt = isEtAnalysisFlag; } void SetUsePhiShufflingByHand(Bool_t usePhiShufflingByHand ){ fUsePhiShufflingByHand = usePhiShufflingByHand; } void SetUseToyEvents(Bool_t useToyEvents ){ fUseToyEvents = useToyEvents; } void SetNumberOfToyEvents(Int_t nEvents ){ fNumberOfToyEvents = nEvents; } void SetArtificialInefficiencyCoeff( Double_t artificialInefficiencyCoeff ) { fArtificialInefficiency = artificialInefficiencyCoeff; } //Sets coeff for artificial inefficiency //void SetNumberOfPhiSectorsByHand( Int_t numberOfPhiSectorsByHand ) { fNumberOfPhiSectorsByHand = numberOfPhiSectorsByHand; } // Getters TList* GetListOfProcessors() { return &fLRCproc;} // Returns list of included AliESDtrackCuts* GetTrackCuts() const { return fEsdTrackCuts; } AliLRCBase * Proc(Int_t index);// Get Processor i void SetParticleTypeForTask( TString strF, TString strB ); //( char* strF, char* strB ); // void SetMCparticleClassForFillingLRC( TString strParticleType ) { fStrMCparticleClassForFillingLRC = strParticleType; } // void SetEtaCutsForSpecMCanalysis( double etaMin, double etaMax ) { fEtaMCanalysisCutMin = etaMin; fEtaMCanalysisCutMax = etaMax; } void SetV0ACMultThreshold( int minMult ) { fThresholdOnV0mult = minMult; } // void SetIncludeEventTreeInOutput( Bool_t flag ) { fSetIncludeEventTreeInOutput = flag; } // Bool_t GetIncludeEventTreeInOutput() { return fSetIncludeEventTreeInOutput; } // void SetAnalysisType( en_AnalysisType analysisType ) { fAnalysisType = analysisType; } // en_AnalysisType GetAnalysisType() { return fAnalysisType; } Double_t GetEventPlane(AliVEvent *event); //track cuts array stuff void AddTrackCutForBits(AliESDtrackCuts* const cuts, TString cutsName ); void SetUseListCuts( Bool_t const useCutsList ) { fSwitchToListingCuts = useCutsList; } Int_t GetNumberOfTrackCutForBits() const { return fArrTrackCuts.GetEntries();/*fNumberOfCutsToRemember*/; } void SetAnalysisLevel(const char* analysisLevel) { fAnalysisLevel = analysisLevel;} const char* GetAnalysisLevel() { return fAnalysisLevel.Data(); } void SetMCESD( Bool_t flagMCESD ) { fAnalyseMCESD = flagMCESD; } Bool_t GetMCESD() const { return fAnalyseMCESD; } void SetFlagWatchZDC( Bool_t flagWatchZDC) { fFlagWatchZDC = flagWatchZDC;} void SetFlagWatchV0 ( Bool_t flagWatchV0 ) { fFlagWatchV0 = flagWatchV0 ;} void SetFlagWatchFMD( Bool_t flagWatchFMD) { fFlagWatchFMD = flagWatchFMD;} Bool_t GetFlagWatchZDC() { return fFlagWatchZDC; } Bool_t GetFlagWatchV0 () { return fFlagWatchV0 ; } Bool_t GetFlagWatchFMD() { return fFlagWatchFMD; } void FillLRCProcessors( int nTracks, Double_t eventCentrality ); void ProfilePhiByHand( int numberOfAcceptedTracksForLRC ); void UseToyEvents(); void SetEtaRegionForTests( Double_t etaRegionForTests ) { fEtaRegionForTests = etaRegionForTests; } Double_t GetEtaRegionForTests() { return fEtaRegionForTests; } void SetMultCutInEtaRegion( Double_t multCutInEtaRegion ) { fMultCutInEtaRegion = multCutInEtaRegion; } Double_t GetMultCutInEtaRegion() { return fMultCutInEtaRegion; } inline void FixAngleInTwoPi( Double_t &lPhi ) { if ( lPhi > 2 * TMath::Pi() ) lPhi -= 2 * TMath::Pi(); else if ( lPhi < 0 ) lPhi += 2 * TMath::Pi(); } void SetFlagSuppressAddingSomeHistos( Bool_t flagSuppressAddingSomeHistos ) { fFlagSuppressAddingSomeHistos = flagSuppressAddingSomeHistos; } enum enTaskObjectParameters { kMaxParticlesNumber = 15000, kMaxLRCprocArrayPointers = 10000 }; // default TPC & TOF pid (via GetTPCpid & GetTOFpid) protected: void SetParticleTypeToProcessors( int windowId, TString strPid ); Int_t fNumberOfPhiSectors; // n of phi rotations Bool_t fFlagSuppressAddingSomeHistos; //flag to include in output list some histos or not include // AliLRCBase *fLRCprocArrayPointers[kMaxLRCprocArrayPointers]; // Track cuts TString fAnalysisLevel; //ESD, AOD or MC AliESDtrackCuts *fEsdTrackCuts; // esd track cuts UInt_t fAODtrackCutBit;//track cut bit from track selection (only used for AODs) // Array with different track cuts to remember in simple event Tree TObjArray fArrTrackCuts; //AliESDtrackCuts* [100]; // Arr with different track cuts TString fArrCutsNames[100]; // Arr with names of different track cuts TH1I *fHistCutsNamesBins; //! tracks passed different cut sets in histogram bins Bool_t fSwitchToListingCuts; // switch to remember cuts desicions and not to drop track by fTrackCuts // en_AnalysisType fAnalysisType; // type of analysis //SPD tracklets cut Int_t fMinNumberOfSPDtracklets; //Minimum number of SPD tracklets in ESD event // Acceptance cuts Double_t fMaxPtLimit; //Max Pt filter Double_t fMinPtLimit; // Min Pt filter Double_t fKineLowPtCut; // Min Pt for Kine tracks // Nch cuts Int_t fMinAcceptedTracksCut; //Minimum number of accepted tracks in event Int_t fMaxAcceptedTracksCut; //Maximum number of accepted tracks in event // Vtx cuts Bool_t fCheckForkVtx; // Check for vertex Bool_t fCheckForVtxPosition; // Check if vertex position in range Double_t fVxMax; // X vrtx max Double_t fVyMax; // Y vrtx max Double_t fVzMax; // Z vrtx max TList fLRCproc; // AliLRCProcess objects list TList* fOutList; //! Task Output data container Bool_t fRunKine; // ESD/AOD - KINE switch Bool_t fAnalyseMCESD; // MCESD switch Bool_t fShowEventStats; // Allows per event debug output (trigger Nch, cuts etc) Bool_t fShowPerTrackStats; // Allows per track debug output Double_t fEtaRegionForTests; //eta region to tests Double_t fMultCutInEtaRegion; // cut on mult in eta region // QA histos TH1I *fHistEventCutStats; //! Event cut statistics TH1I *fHistTrackCutStats; //! Track cut statistics TH1I *fHistAODTrackStats; //! AOD track bits statistics TH1D *fHistVx; //! Vx hist TH1D *fHistVy; //! Vy hist TH1D *fHistVz; //! Vz hist TH1D *fHistVxMCrecoDiff; //! Vx hist MC-reco diff TH1D *fHistVyMCrecoDiff; //! Vy hist MC-reco diff TH1D *fHistVzMCrecoDiff; //! Vz hist MC-reco diff TH1I *fHistVertexNconributors; //! vertex contributors number TH1I *fHistNumberOfPileupVerticesTracks; //! number of pileup verteces in event (ESD or AOD) by tracks TH1I *fHistNumberOfPileupVerticesSPD; //! number of pileup verteces in event (ESD or AOD) by SPD TH2F *fHistEventPlane; //event plane distribution TH1F *fHistPt; //! Overal Pt spectrum TH1F *fHistEta; //! Overal Eta spectrum TH1F *fHistEtaAODpure; //! Overal Eta spectrum aod pure before cuts TH1F *fHistPhi; //! Overal Phi spectrum TH2D *fHistEtaPhi; //! 2D plot for checking acceptance TH1F *fHistPhiLRCrotationsCheck; //! Overal Phi spectrum for LRC rotations TH1F *fHistPhiArtificialProfilingCheck; //! hist for the check of profiled phi TH1F *fHistPhiArtificialProfilingCheckWrtEvPlane; //! hist for the check of profiled phi wrt event plane TH1F *fHistPhiArtificialEvPlane; //! hist artificial event plane TH2D *fHistEtaVsZvCoverage; //! Statistics on tracks Zv and Eta for all tracks TH2D *fHistEtaVsZvCoverageAccepted; //! Statistics on tracks Zv and Eta for accepted tracks TH1D *fHistMultBeforeCuts; //! Histo: Number of tracks before applying cuts TH1D *fHistAcceptedMult; //! Number of accepted tracks histo TH1D *fHistAcceptedTracks; //! Number of tracks accepted for filling LRC processors, histo TH1D *fHistMultiplicityInEtaRegion; //! Number of tracks in |eta| region TH1D *fHistMultiplicityInEtaRegionAfterPtCuts; //! Number of tracks in |eta| region after Pt Cuts TH2D *fHist2DMultiplicityMCESDInEtaRegion; //! Number of tracks in |eta| region (MC vs ESD) TH1D *fHistAcceptedTracksAfterPtCuts; //! Number of tracks accepted for filling LRC processors, histo TH1D *fHistAcceptedTPCtracks; //! Number of accepted tracks with TPC inner param TH1D *fHistClustersTPC; //! Number of TPC clusters distribution TH1D *fHistClustersTPCafterCuts; //! Number of TPC clusters distribution after cuts TH1D *fHistCrossedRowsTPC; //! Number of TPC crossed rows TH1D *fHistCrossedRowsTPCafterCuts; //! Number of TPC crossed rows after cuts TH1D *fHistClustersITS; //! Number of ITS clusters distribution TH1D *fHistTrackletsITS; //! Number of ITS tracklets distribution TH2D *fHist2DClustersTPCvsPt; //! Number of TPC clusters vs Pt distribution (to see the dependence!) TH2D *fHist2DClustersTPCvsEta; //! Number of TPC clusters vs Eta distribution (to see the dependence!) TH2D *fHist2DAcceptedTracksPtvsEta; //! rejected tracks pt vs eta TH1D *fHistMClabels; //! MC labels TH1D *fHistRejectedTracksCharge; //! Charge of rejected tracks TH1D *fHistTracksCharge; //! Charge of accepted tracks (zero is filled only for MC truth) //netcharge study TH1D *fHistPtPlus; //! pt distr for + TH1D *fHistPtMinus; //! pt distr for - TH1D *fHistNetChargeVsPt; //! Net charge vs pt of accepted tracks TH1D *fHistChargePlusVsPtTmp; //! Net charge vs pt of accepted tracks + TH1D *fHistChargeMinusVsPtTmp; //! Net charge vs pt of accepted tracks - TH2D *fHist2DNetChargeVsPt; //! Net charge vs pt of accepted tracks 2D TH2D *fHist2DNetChargeVsPtCorrectedOnEventMean; //! Net charge vs pt of accepted tracks 2D shifted by mean TH2D *fHist2DNetChargeVsPtCorrectedOnEventMeanNormOnNch; //! Net charge vs pt of accepted tracks 2D norm on nCh AliAnalysisTaskLRC(const AliAnalysisTaskLRC&); // not implemented AliAnalysisTaskLRC& operator=(const AliAnalysisTaskLRC&); // not implemented TH1D *fHistProbabilitiesPID; //!hist of esd pid prob-s //Double_t *fProbabilitiesPID; //! array of esd pid prob-s TH1D *fHistESDtrackMass; //!hist of esd particle masses TH1D *fHistProbabilityPion; //!hist of pion probability TH1D *fHistProbabilityKaon; //!hist of kaon probability TH1D *fHistProbabilityProton; //!hist of proton probability TH1D *fHistParticlesDistr; //!hist of particles distr TH1D *fHistParticlesDistrBeforeCuts; //!hist of particles distr TH1D *fHistCentralityPercentile; //! centrality class TH1D *fHistCentralityClass10; //! centrality class by 10 TH1D *fHistCentralityClass5; //! centrality class by 5 //ZDC stuff TH1D *fHistZDCenergy[5]; //! ZDC energy for diff mult conditions TH1D *fHistZDCparticipants; //! ZDC participants //V0 stuff TH1D *fHistV0multiplicity; //! V0 mult TH1D *fHistV0Amultiplicity; //! V0 A mult TH1D *fHistV0Cmultiplicity; //! V0 C mult TH2D *fHist2DV0ACmultiplicity; //! V0 A-C mult //TH1D *fHistV0spectra; //! V0 particle masses TH2D *fHist2DTracksAcceptedVsV0multiplicity; //! V0 mult Vs N tracks Accepted TH1D *fHistV0AmultiplicityRing[4]; //! V0 A mult in rings TH1D *fHistV0CmultiplicityRing[4]; //! V0 C mult in rings TH2D *fHist2DV0ACmultiplicityRing[4]; //! V0 A-C mult in rings TH2D *fHist2DTracksAcceptedVsV0AmultiplicityRing[4]; //! V0A mult Rings Vs N tracks Accepted TH2D *fHist2DTracksAcceptedVsV0CmultiplicityRing[4]; //! V0C mult Rings Vs N tracks Accepted TH1D *fHistV0cells ; //! V0 cells TH1D *fHistV0Acells ; //! V0 A cells TH1D *fHistV0Ccells ; //! V0 C cells TH2D *fHist2DV0ACcells ; //! V0 A-C cells Int_t fThresholdOnV0mult; //min V0AC mult to analyse this event (default is 0) //centrality class Float_t fMinCentralityClass; // min bound on centrality percentile Float_t fMaxCentralityClass; // max bound on centrality percentile Bool_t fIsIonsAnalysis; //Ions analysis flag Bool_t fEtInsteadOfPt; //pass the Et instead of Pt to LRC processors Bool_t fUsePhiShufflingByHand; //flag for manual suffling of tracks phi Bool_t fUseToyEvents; //flag for manual suffling of tracks phi Int_t fNumberOfToyEvents; //number of toy events Int_t fTmpCounter; //! TMP const AliPIDResponse *fPIDResponse; //! PID response object AliPIDCombined *fPIDCombined; //! combined PID object TH1F *fPriors[AliPID::kSPECIES]; //! priors TH2D *fPriorsUsed[AliPID::kSPECIES]; //! priors used TH2D *fProbTPCTOF[AliPID::kSPECIES]; //! combined probabilities vs mom TPC-TOF TH2D *fProbAllDets[AliPID::kSPECIES]; //! combined probabilities ALL dets vs mom TH1D *fHistPidMaxProbability; //!hist of max probabilities for arrays PID species TH1D *fHistPidPureMaxProbability; //!hist of max probabilities for arrays PID species (when detId is TPC+TOF) TString fStrPIDforFwd; //PID name for FWD win TString fStrPIDforBwd; //PID name for BWD win Bool_t fPIDsensingFlag; //flag that we sense PID in processors int fMultForZDCstudy[5]; //! threshold multiplicities for ZDC study //artificial inefficiency (27.09.12) Double_t fArtificialInefficiency; // inefficiency by hand in [0,1], default is 0 TH2D *fHistNumberOfDroppedByHandTracks; //! Number of tracks which were dropped by hand vs N of accepted tracks TRandom3 *fRand; //random generator for some uses //phi artificial gaps Double_t fPhiArtificialGapBegin; // inefficiency in phi - gap position edge begins Double_t fPhiArtificialGapEnd; // inefficiency in phi - gap position edge ends //flags for inclusion of detectors info: Bool_t fFlagWatchZDC; //study ZDC issues Bool_t fFlagWatchV0; //study V0 issues Bool_t fFlagWatchFMD; //study FMD issues TStopwatch *fAnalysisTimer; //arrays with data for LRC processors Double_t fArrayTracksPt[kMaxParticlesNumber]; Double_t fArrayTracksEta[kMaxParticlesNumber]; Double_t fArrayTracksPhi[kMaxParticlesNumber]; Short_t fArrayTracksCharge[kMaxParticlesNumber]; Int_t fArrayTracksPID[kMaxParticlesNumber]; //test MC particles // TH1D *fHistMCvertexRdeltaFromParent; //!MC R hist // TH1F *fHistMCparentsStat; //! MC parent ratios for different partile classes // TH1F *fHistMCparentsEta[kNumberOfParentParticleClassesInMC]; //! MC parents eta distributions for different particle classes // TH1F *fHistMCchildsEta[kNumberOfParentParticleClassesInMC]; //! MC childs eta distributions for different partile classes // TH1F *fHistMCdeltaEtaChildParent[kNumberOfParentParticleClassesInMC]; //! MC delta eta b/n parent and child // TH1F *fHistMCdeltaPhiChildParent[kNumberOfParentParticleClassesInMC]; //! MC delta phi b/n parent and child // TH2D *fHist2DMCchildrenPhiChildParent[kNumberOfParentParticleClassesInMC]; //! MC delta b/n parent and child in eta-phi // TH1F *fHistMCNumberOfChildren[kNumberOfParentParticleClassesInMC]; //! Number of children for fathers in MC (for different father classes) // TH1D *fHistMCchildrenEtaDeviationsFromAverage[kNumberOfParentParticleClassesInMC]; //! MC delta b/n av. eta and each child's eta for each father (for different father classes) // TH1D *fHistMCchildrenPhiDeviationsFromAverage[kNumberOfParentParticleClassesInMC]; //! MC delta b/n av. phi and each child's phi for each father (for different father classes) // TH2D *fHist2DMCchildrenPhiDeviationsFromAverage[kNumberOfParentParticleClassesInMC]; //! MC delta b/n av. eta-phi and each child's eta and phi for each father (for different father classes) // TString fStrMCparticleClassForFillingLRC; // name of particle class for LRC filling (default is All) // Double_t fEtaMCanalysisCutMin; // spec MC analysis: cut on eta // Double_t fEtaMCanalysisCutMax; // spec MC analysis: cut on eta // TH1F *fHistMCparentDeepness; //! MC deepness of parent tree from "physical primary" children // TH1F *fHistMCparentsInitialStat; //! MC initial papa particle class distr // TH1F *fHistMCEtaInitialQuark; //! MC eta distr of "initial" quarks // TH1F *fHistMCEtaInitialGluon; //! MC eta distr of "initial" gluons // TH1F *fHistMCEtaInitialProton; //! MC eta distr of "initial" protons // TH1F *fHistMCnumberInitialQuarksInEvent; //! MC initial quarks number distr // TH1F *fHistMCnumberInitialGluonsInEvent; //! MC initial gluons number distr // TH1F *fHistMCnumberInitialProtonInEvent; //! MC initial proton number distr (check that there are 2) // TH1F *fHistMCnumberChildrenFromInitialQuarksInEvent; //! MC children number from initial quarks distr // TH1F *fHistMCnumberChildrenFromInitialGluonsInEvent; //! MC children number from initial gluons distr // TH1F *fHistMCnumberChildrenFromInitialProtonInEvent; //! MC children number from initial proton distr (check that there are 2) // 4.01.2012: MyTree stuff // AliSimpleEvent *fSimpleEvent; // instance of simple event to be filled in analysis loop // Int_t fNsimpleEvents; // TTree *fEventTree; //! event tree to write into output file // Bool_t fSetIncludeEventTreeInOutput; // flag to use event tree or not ClassDef(AliAnalysisTaskLRC, 11 ); }; #endif