ROOT logo
#ifndef AliAnalysisTaskPi0Flow_cxx
#define AliAnalysisTaskPi0Flow_cxx

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

// Analysis task to fill histograms with PHOS ESD or AOD clusters and cells
// Authors : Dmitri Peressounko
// Date    : 28.05.2011
// Modified: 03.08.2012 Henrik Qvigstad
/* $Id$ */

class TObjArray;
class TH1F;
class TH2I;
class TH2F;
class TH3F;
class TF1 ;
class AliStack ;
class AliESDtrackCuts;
class AliPHOSGeometry;
class AliESDEvent ;
class AliPHOSCalibData;
class AliESDtrack ;
class AliESDCaloCluster ;
class AliEPFlattener;
class AliAnalysisUtils;

#include "TArrayD.h"

#include "AliAnalysisTaskSE.h"

class AliAnalysisTaskPi0Flow : public AliAnalysisTaskSE {
public:
    enum Period { kUndefinedPeriod, kLHC10h, kLHC11h, kLHC13 };
    enum EventSelection { kTotal, kInternalTriggerMaskSelection, kHasVertex, kHasAbsVertex, kHasCentrality, kCentUnderUpperBinUpperEdge, kCentOverLowerBinLowerEdge, kHasPHOSClusters, kTotalSelected };
    enum TriggerSelection { kNoSelection, kCentralInclusive, kCentralExclusive, kSemiCentralInclusive, kSemiCentralExclusive, kMBInclusive, kMBExclusive };

public:
    AliAnalysisTaskPi0Flow(const char *name = "AliAnalysisTaskPi0Flow", Period period = kUndefinedPeriod);
    virtual ~AliAnalysisTaskPi0Flow();

    virtual void   UserCreateOutputObjects();
    virtual void   UserExec(Option_t *option);
    /* virtual void   Terminate(Option_t *); */

    void SetPeriod(Period period) { fPeriod = period;}
    void SetCentralityEstimator(const char * centr) {fCentralityEstimator = centr;}
    void EnableTOFCut(Bool_t enable = kTRUE, Double_t TOFCut = 100.e-9, Bool_t fillWide=kFALSE){fTOFCutEnabled=enable; fTOFCut=TOFCut; fFillWideTOF=fillWide;}
    
    void SetCentralityBinning(const TArrayD& edges, const TArrayI& nMixed);
    void SetEventMixingRPBinning(UInt_t nBins) { fNEMRPBins = nBins; }
    void SetInternalTriggerSelection(TriggerSelection selection) { fInternalTriggerSelection = selection; }
    void SetMaxAbsVertexZ(Float_t z) { fMaxAbsVertexZ = z; }
    void SetManualV0EPCalc(Bool_t manCalc = true) {fManualV0EPCalc = manCalc;}
    void SetEnablePHOSModule(int module, Bool_t enable = true);
    
    void SetPHOSBadMap(Int_t mod,TH2I * badMapHist);
    //Where to read AODB object with EP calibration if not default
    void SetEPcalibFileName(const TString filename) {fEPcalibFileName = filename; }   


protected:
    AliAnalysisTaskPi0Flow(const AliAnalysisTaskPi0Flow&); // not implemented
    AliAnalysisTaskPi0Flow& operator=(const AliAnalysisTaskPi0Flow&); // not implemented

    // Step 0:
    AliVEvent* GetEvent();

    // Step 1 (done once):
    void SetGeometry();
    void SetMisalignment();
    void SetV0Calibration(); //V0 calibration
    void SetESDTrackCuts(); // AliESDtrack cuts ( for esd data )
    void SetPHOSCalibData(); // phos re-calibration ( for esd data)
    void SetFlatteningData(); // phos flattening

    // Step 2:
    Bool_t RejectTriggerMaskSelection();

    // Step 3:
    void SetVertex();
    Bool_t RejectEventVertex();

    // Step 4:
    void SetCentrality();
    Bool_t RejectCentrality();

    // Step 5:
    void EvalReactionPlane();
    void EvalV0ReactionPlane();

    // Step 7: QA PHOS cells
    void FillPHOSCellQAHists();

    // Step 8: Event Photons (PHOS Clusters) selection
    virtual void SelectPhotonClusters();
    virtual void FillSelectedClusterHistograms();

    // Step 9: Consider pi0 (photon/cluster) pairs.
    virtual void ConsiderPi0s();

    // Step 10; Mixing
    virtual void ConsiderPi0sMix();

    // Step 11: MC
    virtual void ProcessMC();

    // Step 12: Update lists
    void UpdateLists();

    Bool_t AreNeibors(Int_t id1,Int_t id2) ;
    Double_t ApplyFlattening(Double_t phi, Double_t c) ; //Apply centrality-dependent flattening
    Double_t ApplyFlatteningV0A(Double_t phi, Double_t c) ; //Apply centrality-dependent flattening
    Double_t ApplyFlatteningV0C(Double_t phi, Double_t c) ; //Apply centrality-dependent flattening
    Int_t ConvertToInternalRunNumber(Int_t run) ;
    Double_t CoreEnergy(AliVCluster * clu, AliVCaloCells * cells);
    void EvalCoreLambdas(AliVCluster * clu, AliVCaloCells * cells, Double_t &m02, Double_t &m20) ; 
    Bool_t TestCoreLambda(Double_t pt,Double_t l1,Double_t l2) ;




    void FillHistogram(const char * key,Double_t x) const ; //Fill 1D histogram witn name key
    void FillHistogram(const char * key,Double_t x, Double_t y) const ; //Fill 2D histogram witn name key
    void FillHistogram(const char * key,Double_t x, Double_t y, Double_t z) const ; //Fill 3D histogram witn name key
    void FillHistogram(const char * key,Double_t x, Double_t y, Double_t z, Double_t w) const ; //Fill 3D histogram witn name key

    TVector3 GetVertexVector(const AliVVertex* vertex);
    Int_t GetCentralityBin(Float_t centralityV0M);
    Int_t GetRPBin();

    void LogProgress(int step);
    void LogSelection(int step, int internalRunNumber);

    Bool_t IsGoodChannel(const char * det, Int_t mod,Int_t ix, Int_t iz); //Use addisional bad map for PHOS


    void Reclusterize(AliVCluster * clu) ;
    Double_t TestCPV(Double_t dx, Double_t dz, Double_t pt, Int_t charge);
    Bool_t TestLambda(Double_t pt,Double_t l1,Double_t l2) ;  //Evaluate Dispersion cuts for photons
    Bool_t TestLambda2(Double_t pt,Double_t l1,Double_t l2) ;  //Evaluate Dispersion cuts for photons
    
    UInt_t GetNumberOfCentralityBins() { return fCentEdges.GetSize()-1; }
    TList* GetCaloPhotonsPHOSList(UInt_t vtxBin, UInt_t centBin, UInt_t rpBin);
    
    AliAnalysisUtils* GetAnalysisUtils();


protected:
    // transient constants
    static const Int_t    kNMod = 5;

    // constants:
    static const Double_t kLogWeight ; // log weight for recalibration.
    static const Double_t kAlphaCut ;
    static const Bool_t   doESDReCalibration;
    static const Int_t    kNCenBins = 9; // see EvalV0ReactionPlane()

    // cluster cut variables:
    static const Double_t kMinClusterEnergy;
    static const Double_t kMinBCDistance;  //distance to nearest bad channel
    static const Int_t    kMinNCells;
    static const Double_t kMinM02;

    // Binning, [vtx, centrality, reaction-plane]
    static const Int_t    kNVtxZBins;
    static const Double_t kCentCutoff; // Ignore Centrality over 90%
    TArrayD fCentEdges;  // Centrality Bin Lower edges
    TArrayI fCentNMixed; // Number of mixed events for each centrality bin
    UInt_t fNEMRPBins;
    

    // Behavior / cuts
    Period fPeriod;
    TriggerSelection fInternalTriggerSelection;
    Float_t fMaxAbsVertexZ; // in cm
    Bool_t fManualV0EPCalc;
    Bool_t fModuleEnabled[kNMod]; //[kNMod]
    Bool_t fTOFCutEnabled;
    Double_t fTOFCut;
    Bool_t fFillWideTOF;


    TList * fOutputContainer;        //final histogram container

    TF1 *fNonLinCorr;          // Non-linearity correction
//TF1 * fRecent[5][12] ;//Recentering corrections
    TH2I *fPHOSBadMap[6] ;    //Container for PHOS bad channels map

    // Run variables

    // Step 0: Event Objects
    // fEvent, fMCStack
    AliVEvent* fEvent; //! Current event
    AliESDEvent* fEventESD; //! Current event, if ESD.
    AliAODEvent* fEventAOD; //! Current event, if AOD.

    // Step 1: Run Number, Misalignment Matrix, and Calibration
    Int_t fRunNumber; // run number
    Int_t fInternalRunNumber ;    //Current internal run number
    AliPHOSGeometry  *fPHOSGeo;  //! PHOS geometry
    TProfile *fMultV0;                  // object containing VZERO calibration information
    Float_t fV0Cpol,fV0Apol;            // loaded by OADB
    Float_t fMeanQ[kNCenBins][2][2];    // and recentering
    Float_t fWidthQ[kNCenBins][2][2];   // ...
    AliESDtrackCuts *fESDtrackCuts; // Track cut
    AliPHOSCalibData *fPHOSCalibData; // PHOS calibration object
    TString fEPcalibFileName; 
    AliEPFlattener * fTPCFlat ; //Object for flattening of TPC
    AliEPFlattener * fV0AFlat ; //Object for flattening of V0A
    AliEPFlattener * fV0CFlat ; //Object for flattening of V0C
    
    
    // Step 3: Vertex
    Double_t fVertex[3];
    TVector3 fVertexVector;
    Int_t fVtxBin;


    // Step 4: Centrality
    TString fCentralityEstimator; //! Centrality estimator ("V0M", "ZNA")
    Float_t fCentrality ;         //! Centrality of the current event
    Int_t   fCentBin ;            //! Current centrality bin

    // Step 5: Reaction Plane
    Bool_t fHaveTPCRP ; //! Is TPC RP defined?
    Float_t fRP ;       //!Reaction plane calculated with full TPC
    Float_t fRPV0A ;    //!Reaction plain calculated with A-side TPC: eta>0.15
    Float_t fRPV0C ;    //!Reaction plain calculated with C-side TPC: eta<-0.15
    Int_t fEMRPBin;       //! Event Mixing Reaction Plane Bin

    // Step 8: Event Photons (PHOS Clusters) selection
    TObjArray * fCaloPhotonsPHOS ;      //PHOS photons in current event

    // Step 12: Update lists for mixing.
    TObjArray* fCaloPhotonsPHOSLists; //! array of TList, Containers for events with PHOS photons


    ClassDef(AliAnalysisTaskPi0Flow, 3); // PHOS analysis task
};

#endif
 AliAnalysisTaskPi0Flow.h:1
 AliAnalysisTaskPi0Flow.h:2
 AliAnalysisTaskPi0Flow.h:3
 AliAnalysisTaskPi0Flow.h:4
 AliAnalysisTaskPi0Flow.h:5
 AliAnalysisTaskPi0Flow.h:6
 AliAnalysisTaskPi0Flow.h:7
 AliAnalysisTaskPi0Flow.h:8
 AliAnalysisTaskPi0Flow.h:9
 AliAnalysisTaskPi0Flow.h:10
 AliAnalysisTaskPi0Flow.h:11
 AliAnalysisTaskPi0Flow.h:12
 AliAnalysisTaskPi0Flow.h:13
 AliAnalysisTaskPi0Flow.h:14
 AliAnalysisTaskPi0Flow.h:15
 AliAnalysisTaskPi0Flow.h:16
 AliAnalysisTaskPi0Flow.h:17
 AliAnalysisTaskPi0Flow.h:18
 AliAnalysisTaskPi0Flow.h:19
 AliAnalysisTaskPi0Flow.h:20
 AliAnalysisTaskPi0Flow.h:21
 AliAnalysisTaskPi0Flow.h:22
 AliAnalysisTaskPi0Flow.h:23
 AliAnalysisTaskPi0Flow.h:24
 AliAnalysisTaskPi0Flow.h:25
 AliAnalysisTaskPi0Flow.h:26
 AliAnalysisTaskPi0Flow.h:27
 AliAnalysisTaskPi0Flow.h:28
 AliAnalysisTaskPi0Flow.h:29
 AliAnalysisTaskPi0Flow.h:30
 AliAnalysisTaskPi0Flow.h:31
 AliAnalysisTaskPi0Flow.h:32
 AliAnalysisTaskPi0Flow.h:33
 AliAnalysisTaskPi0Flow.h:34
 AliAnalysisTaskPi0Flow.h:35
 AliAnalysisTaskPi0Flow.h:36
 AliAnalysisTaskPi0Flow.h:37
 AliAnalysisTaskPi0Flow.h:38
 AliAnalysisTaskPi0Flow.h:39
 AliAnalysisTaskPi0Flow.h:40
 AliAnalysisTaskPi0Flow.h:41
 AliAnalysisTaskPi0Flow.h:42
 AliAnalysisTaskPi0Flow.h:43
 AliAnalysisTaskPi0Flow.h:44
 AliAnalysisTaskPi0Flow.h:45
 AliAnalysisTaskPi0Flow.h:46
 AliAnalysisTaskPi0Flow.h:47
 AliAnalysisTaskPi0Flow.h:48
 AliAnalysisTaskPi0Flow.h:49
 AliAnalysisTaskPi0Flow.h:50
 AliAnalysisTaskPi0Flow.h:51
 AliAnalysisTaskPi0Flow.h:52
 AliAnalysisTaskPi0Flow.h:53
 AliAnalysisTaskPi0Flow.h:54
 AliAnalysisTaskPi0Flow.h:55
 AliAnalysisTaskPi0Flow.h:56
 AliAnalysisTaskPi0Flow.h:57
 AliAnalysisTaskPi0Flow.h:58
 AliAnalysisTaskPi0Flow.h:59
 AliAnalysisTaskPi0Flow.h:60
 AliAnalysisTaskPi0Flow.h:61
 AliAnalysisTaskPi0Flow.h:62
 AliAnalysisTaskPi0Flow.h:63
 AliAnalysisTaskPi0Flow.h:64
 AliAnalysisTaskPi0Flow.h:65
 AliAnalysisTaskPi0Flow.h:66
 AliAnalysisTaskPi0Flow.h:67
 AliAnalysisTaskPi0Flow.h:68
 AliAnalysisTaskPi0Flow.h:69
 AliAnalysisTaskPi0Flow.h:70
 AliAnalysisTaskPi0Flow.h:71
 AliAnalysisTaskPi0Flow.h:72
 AliAnalysisTaskPi0Flow.h:73
 AliAnalysisTaskPi0Flow.h:74
 AliAnalysisTaskPi0Flow.h:75
 AliAnalysisTaskPi0Flow.h:76
 AliAnalysisTaskPi0Flow.h:77
 AliAnalysisTaskPi0Flow.h:78
 AliAnalysisTaskPi0Flow.h:79
 AliAnalysisTaskPi0Flow.h:80
 AliAnalysisTaskPi0Flow.h:81
 AliAnalysisTaskPi0Flow.h:82
 AliAnalysisTaskPi0Flow.h:83
 AliAnalysisTaskPi0Flow.h:84
 AliAnalysisTaskPi0Flow.h:85
 AliAnalysisTaskPi0Flow.h:86
 AliAnalysisTaskPi0Flow.h:87
 AliAnalysisTaskPi0Flow.h:88
 AliAnalysisTaskPi0Flow.h:89
 AliAnalysisTaskPi0Flow.h:90
 AliAnalysisTaskPi0Flow.h:91
 AliAnalysisTaskPi0Flow.h:92
 AliAnalysisTaskPi0Flow.h:93
 AliAnalysisTaskPi0Flow.h:94
 AliAnalysisTaskPi0Flow.h:95
 AliAnalysisTaskPi0Flow.h:96
 AliAnalysisTaskPi0Flow.h:97
 AliAnalysisTaskPi0Flow.h:98
 AliAnalysisTaskPi0Flow.h:99
 AliAnalysisTaskPi0Flow.h:100
 AliAnalysisTaskPi0Flow.h:101
 AliAnalysisTaskPi0Flow.h:102
 AliAnalysisTaskPi0Flow.h:103
 AliAnalysisTaskPi0Flow.h:104
 AliAnalysisTaskPi0Flow.h:105
 AliAnalysisTaskPi0Flow.h:106
 AliAnalysisTaskPi0Flow.h:107
 AliAnalysisTaskPi0Flow.h:108
 AliAnalysisTaskPi0Flow.h:109
 AliAnalysisTaskPi0Flow.h:110
 AliAnalysisTaskPi0Flow.h:111
 AliAnalysisTaskPi0Flow.h:112
 AliAnalysisTaskPi0Flow.h:113
 AliAnalysisTaskPi0Flow.h:114
 AliAnalysisTaskPi0Flow.h:115
 AliAnalysisTaskPi0Flow.h:116
 AliAnalysisTaskPi0Flow.h:117
 AliAnalysisTaskPi0Flow.h:118
 AliAnalysisTaskPi0Flow.h:119
 AliAnalysisTaskPi0Flow.h:120
 AliAnalysisTaskPi0Flow.h:121
 AliAnalysisTaskPi0Flow.h:122
 AliAnalysisTaskPi0Flow.h:123
 AliAnalysisTaskPi0Flow.h:124
 AliAnalysisTaskPi0Flow.h:125
 AliAnalysisTaskPi0Flow.h:126
 AliAnalysisTaskPi0Flow.h:127
 AliAnalysisTaskPi0Flow.h:128
 AliAnalysisTaskPi0Flow.h:129
 AliAnalysisTaskPi0Flow.h:130
 AliAnalysisTaskPi0Flow.h:131
 AliAnalysisTaskPi0Flow.h:132
 AliAnalysisTaskPi0Flow.h:133
 AliAnalysisTaskPi0Flow.h:134
 AliAnalysisTaskPi0Flow.h:135
 AliAnalysisTaskPi0Flow.h:136
 AliAnalysisTaskPi0Flow.h:137
 AliAnalysisTaskPi0Flow.h:138
 AliAnalysisTaskPi0Flow.h:139
 AliAnalysisTaskPi0Flow.h:140
 AliAnalysisTaskPi0Flow.h:141
 AliAnalysisTaskPi0Flow.h:142
 AliAnalysisTaskPi0Flow.h:143
 AliAnalysisTaskPi0Flow.h:144
 AliAnalysisTaskPi0Flow.h:145
 AliAnalysisTaskPi0Flow.h:146
 AliAnalysisTaskPi0Flow.h:147
 AliAnalysisTaskPi0Flow.h:148
 AliAnalysisTaskPi0Flow.h:149
 AliAnalysisTaskPi0Flow.h:150
 AliAnalysisTaskPi0Flow.h:151
 AliAnalysisTaskPi0Flow.h:152
 AliAnalysisTaskPi0Flow.h:153
 AliAnalysisTaskPi0Flow.h:154
 AliAnalysisTaskPi0Flow.h:155
 AliAnalysisTaskPi0Flow.h:156
 AliAnalysisTaskPi0Flow.h:157
 AliAnalysisTaskPi0Flow.h:158
 AliAnalysisTaskPi0Flow.h:159
 AliAnalysisTaskPi0Flow.h:160
 AliAnalysisTaskPi0Flow.h:161
 AliAnalysisTaskPi0Flow.h:162
 AliAnalysisTaskPi0Flow.h:163
 AliAnalysisTaskPi0Flow.h:164
 AliAnalysisTaskPi0Flow.h:165
 AliAnalysisTaskPi0Flow.h:166
 AliAnalysisTaskPi0Flow.h:167
 AliAnalysisTaskPi0Flow.h:168
 AliAnalysisTaskPi0Flow.h:169
 AliAnalysisTaskPi0Flow.h:170
 AliAnalysisTaskPi0Flow.h:171
 AliAnalysisTaskPi0Flow.h:172
 AliAnalysisTaskPi0Flow.h:173
 AliAnalysisTaskPi0Flow.h:174
 AliAnalysisTaskPi0Flow.h:175
 AliAnalysisTaskPi0Flow.h:176
 AliAnalysisTaskPi0Flow.h:177
 AliAnalysisTaskPi0Flow.h:178
 AliAnalysisTaskPi0Flow.h:179
 AliAnalysisTaskPi0Flow.h:180
 AliAnalysisTaskPi0Flow.h:181
 AliAnalysisTaskPi0Flow.h:182
 AliAnalysisTaskPi0Flow.h:183
 AliAnalysisTaskPi0Flow.h:184
 AliAnalysisTaskPi0Flow.h:185
 AliAnalysisTaskPi0Flow.h:186
 AliAnalysisTaskPi0Flow.h:187
 AliAnalysisTaskPi0Flow.h:188
 AliAnalysisTaskPi0Flow.h:189
 AliAnalysisTaskPi0Flow.h:190
 AliAnalysisTaskPi0Flow.h:191
 AliAnalysisTaskPi0Flow.h:192
 AliAnalysisTaskPi0Flow.h:193
 AliAnalysisTaskPi0Flow.h:194
 AliAnalysisTaskPi0Flow.h:195
 AliAnalysisTaskPi0Flow.h:196
 AliAnalysisTaskPi0Flow.h:197
 AliAnalysisTaskPi0Flow.h:198
 AliAnalysisTaskPi0Flow.h:199
 AliAnalysisTaskPi0Flow.h:200
 AliAnalysisTaskPi0Flow.h:201
 AliAnalysisTaskPi0Flow.h:202
 AliAnalysisTaskPi0Flow.h:203
 AliAnalysisTaskPi0Flow.h:204
 AliAnalysisTaskPi0Flow.h:205
 AliAnalysisTaskPi0Flow.h:206
 AliAnalysisTaskPi0Flow.h:207
 AliAnalysisTaskPi0Flow.h:208
 AliAnalysisTaskPi0Flow.h:209
 AliAnalysisTaskPi0Flow.h:210
 AliAnalysisTaskPi0Flow.h:211
 AliAnalysisTaskPi0Flow.h:212
 AliAnalysisTaskPi0Flow.h:213
 AliAnalysisTaskPi0Flow.h:214
 AliAnalysisTaskPi0Flow.h:215
 AliAnalysisTaskPi0Flow.h:216
 AliAnalysisTaskPi0Flow.h:217
 AliAnalysisTaskPi0Flow.h:218
 AliAnalysisTaskPi0Flow.h:219
 AliAnalysisTaskPi0Flow.h:220
 AliAnalysisTaskPi0Flow.h:221
 AliAnalysisTaskPi0Flow.h:222
 AliAnalysisTaskPi0Flow.h:223
 AliAnalysisTaskPi0Flow.h:224
 AliAnalysisTaskPi0Flow.h:225
 AliAnalysisTaskPi0Flow.h:226
 AliAnalysisTaskPi0Flow.h:227
 AliAnalysisTaskPi0Flow.h:228
 AliAnalysisTaskPi0Flow.h:229
 AliAnalysisTaskPi0Flow.h:230
 AliAnalysisTaskPi0Flow.h:231
 AliAnalysisTaskPi0Flow.h:232
 AliAnalysisTaskPi0Flow.h:233
 AliAnalysisTaskPi0Flow.h:234
 AliAnalysisTaskPi0Flow.h:235
 AliAnalysisTaskPi0Flow.h:236
 AliAnalysisTaskPi0Flow.h:237
 AliAnalysisTaskPi0Flow.h:238
 AliAnalysisTaskPi0Flow.h:239
 AliAnalysisTaskPi0Flow.h:240
 AliAnalysisTaskPi0Flow.h:241
 AliAnalysisTaskPi0Flow.h:242
 AliAnalysisTaskPi0Flow.h:243