ROOT logo
#ifndef ALIJETMODELBASETASK_H
#define ALIJETMODELBASETASK_H

// $Id$

class TClonesArray;
class AliEMCALGeometry;
class AliVCluster;
class AliPicoTrack;
class AliVCaloCells;
class AliAODMCParticle;
class AliNamedArrayI;
class TF2;
class AliPythiaInfo;

#include <TH1F.h>
#include <TF1.h>

#include "AliAnalysisTaskSE.h"

class AliJetModelBaseTask : public AliAnalysisTaskSE {
 public:
  AliJetModelBaseTask();
  AliJetModelBaseTask(const char *name, Bool_t drawqa=kFALSE); 
  virtual ~AliJetModelBaseTask();

  void                   SetEtaRange(Float_t min, Float_t max) { fEtaMin       = min;  fEtaMax = max; }
  void                   SetPhiRange(Float_t min, Float_t max) { fPhiMin       = min;  fPhiMax = max; }
  void                   SetPtRange(Float_t min, Float_t max)  { fPtMin        = min;  fPtMax  = max; }
  void                   SetPtSpectrum(TH1F *f)                { fPtSpectrum   = f;    }
  void                   SetPtSpectrum(TF1 *f)                 { fPtSpectrum   = new TH1F("ptSpectrum","ptSpectrum",1000,f->GetXmin(),f->GetXmax()); 
                                                                 fPtSpectrum->Add(f); }
  void                   SetPtPhiEvPlDistribution(TF2 *f)      { fPtPhiEvPlDistribution   = f;    }
  void                   SetDensitySpectrum(TH1F *f)           { fDensitySpectrum = f;    }
  void                   SetDensitySpectrum(TF1 *f)            { fDensitySpectrum = new TH1F("densitypectrum","densitypectrum",1000,f->GetXmin(),f->GetXmax()); 
                                                                 fDensitySpectrum->Add(f); }
  void                   SetDifferentialV2(TF1* f)             { fDifferentialV2 = f;  }
  void                   SetAddV2(Bool_t b)                    { fAddV2 = b;           }
  void                   SetAddFlowFluctuations(Bool_t b)      { fFlowFluctuations = b;}
  void                   SetMC(Bool_t a)                       { fIsMC         = a   ; }
  void                   SetCopyArray(Bool_t copy)             { fCopyArray    = copy; }
  void                   SetTracksName(const char *n)          { fTracksName   = n;    }
  void                   SetClusName(const char *n)            { fCaloName     = n;    }
  void                   SetCellsName(const char *n)           { fCellsName    = n;    }
  void                   SetMCParticlesName(const char *n)     { fMCParticlesName = n; }
    void                 SetPythiaInfoName(const char *n)      { fPythiaInfoName = n; }
  void                   SetSuffix(const char *s)              { fSuffix       = s;    }
  void                   SetGeometryName(const char *n)        { fGeomName     = n;    }
  void                   SetMarkMC(Int_t m)                    { fMarkMC       = m;    }
  virtual void           SetNClusters(Int_t n)                 { fNClusters    = n;    }
  virtual void           SetNCells(Int_t n)                    { fNCells       = n;    }
  virtual void           SetNTracks(Int_t n)                   { fNTracks      = n;    }

 protected:
  void                   UserExec(Option_t* /*option*/);
  void                   UserCreateOutputObjects();
  Int_t                  SetNumberOfOutCells(Int_t n);                                          // set the number of cells
  Int_t                  AddCell(Double_t e = -1, Double_t eta = -999, Double_t phi = -1);      // add a cell; if values are -1 generate random parameters
  Int_t                  AddCell(Double_t e, Int_t absId, Double_t time = 0, Int_t label=0);    // add a cell with given energy, position and times
  AliVCluster           *AddCluster(Double_t e = -1, Double_t eta = -999, Double_t phi = -1, Int_t label=0); // add a cluster; if values are -1 generate random parameters
  AliVCluster           *AddCluster(Double_t e, Int_t absId, Int_t label=0);                    // add a cluster with given energy and position
  AliVCluster           *AddCluster(AliVCluster *oc);                                           // add a cluster (copy)
  AliPicoTrack          *AddTrack(Double_t pt = -1, Double_t eta = -999, Double_t phi = -1, Byte_t type=0, 
				  Double_t etaemc=0, Double_t phiemc=0, Double_t ptemc=0, Bool_t ise=kFALSE, 
				  Int_t label=0, Short_t charge=1, Double_t mass = 0.1396);          // add a track; if values are -1 generate random parameters
  AliAODMCParticle      *AddMCParticle(AliAODMCParticle *part, Int_t origIndex);                // add a MC particle
  void                   AddV2(Double_t &phi, Double_t &pt) const;
  void                   CopyCells();
  void                   CopyClusters();
  void                   CopyTracks();
  void                   CopyMCParticles();
  void                   GetRandomCell(Double_t &eta, Double_t &phi, Int_t &absId);             // generate a random cell in the calorimeter
  Double_t               GetRandomEta(Bool_t emcal=kFALSE);                                     // generate a random eta value in the given range
  Double_t               GetRandomPhi(Bool_t emcal=kFALSE);                                     // generate a random phi value in the given range
  Double_t               GetRandomPt();                                                         // generate a random pt value in the given range
  void                   GetRandomParticle(Double_t &pt, Double_t &eta, Double_t &phi, Bool_t emcal=kFALSE);  // generate a particle with random eta,phi,pt values
  virtual Bool_t         ExecOnce();                                                            // intialize task
  virtual void           Run();                                                                 // do jet model action

  TString                fGeomName;               // EMCal geometry name
  TString                fTracksName;             // name of track collection
  TString                fOutTracksName;          // name of output track collection
  TString                fCaloName;               // name of calo cluster collection
  TString                fOutCaloName;            // name of output cluster collection
  TString                fCellsName;              // name of calo cells collection
  TString                fOutCellsName;           // name of output cells collection
  TString                fMCParticlesName;        // name of MC particle collection
  TString                fOutMCParticlesName;     // name of output MC particle collection
  TString                fPythiaInfoName;         // name of pythia info
  Bool_t                 fIsMC;                   // whether the current event is MC or not
  TString                fSuffix;                 // suffix to add in the name of new collections
  Float_t                fEtaMin;                 // eta minimum value
  Float_t                fEtaMax;                 // eta maximum value
  Float_t                fPhiMin;                 // phi minimum value
  Float_t                fPhiMax;                 // phi maximum value
  Float_t                fPtMin;                  // pt minimum value
  Float_t                fPtMax;                  // pt maximum value
  Bool_t                 fCopyArray;              // whether or not the array will be copied to a new one before modelling
  Int_t                  fNClusters;              // how many clusters are being processed
  Int_t                  fNCells;                 // how many cells are being processed
  Int_t                  fNTracks;                // how many tracks are being processed
  Int_t                  fMarkMC;                 // which MC label is to be used (default=100)
  TH1F                  *fPtSpectrum;             // pt spectrum to extract random pt values
  TF2                   *fPtPhiEvPlDistribution;  // pt vs. (phi-psi) distribution to extract random pt/phi values
  TH1F                  *fDensitySpectrum;        // particle density spectrum to extract random density values
  TF1                   *fDifferentialV2;         // v2 as function of pt
  Bool_t                 fAddV2;                  // add v2 sampled from a tf1
  Bool_t                 fFlowFluctuations;       // introduce gaussian flow fluctuation 
  Bool_t                 fQAhistos;               // draw QA histograms
  Double_t               fPsi;                    //!simmetry plane for the elliptic flow
  Bool_t                 fIsInit;                 //!=true if initialized
  AliEMCALGeometry      *fGeom;                   //!pointer to EMCal geometry
  Double_t               fVertex[3];              //!event vertex
  TClonesArray          *fClusters;               //!cluster collection
  TClonesArray          *fOutClusters;            //!output cluster collection
  TClonesArray          *fTracks;                 //!track collection
  TClonesArray          *fOutTracks;              //!output track collection
  AliVCaloCells         *fCaloCells;              //!cells collection
  AliVCaloCells         *fOutCaloCells;           //!output cells collection
  Int_t                  fAddedCells;             //!number of added cells
  TClonesArray          *fMCParticles;            //!MC particles collection
  AliNamedArrayI        *fMCParticlesMap;         //!MC particles mapping
  TClonesArray          *fOutMCParticles;         //!output MC particles collection
  AliNamedArrayI        *fOutMCParticlesMap;      //!MC particles mapping
  Int_t                  fMCLabelShift;           //!MC label shift
  Bool_t                 fEsdMode;                //!ESD/AOD mode
  TList                 *fOutput;                 //!output list for QA histograms
  AliPythiaInfo    *fPythiaInfo;     //!Info on original partons:PDG,pt, eta, phi and pythia event weight

 private:
  AliJetModelBaseTask(const AliJetModelBaseTask&);            // not implemented
  AliJetModelBaseTask &operator=(const AliJetModelBaseTask&); // not implemented

  ClassDef(AliJetModelBaseTask, 12) // Jet modelling task
};
#endif
 AliJetModelBaseTask.h:1
 AliJetModelBaseTask.h:2
 AliJetModelBaseTask.h:3
 AliJetModelBaseTask.h:4
 AliJetModelBaseTask.h:5
 AliJetModelBaseTask.h:6
 AliJetModelBaseTask.h:7
 AliJetModelBaseTask.h:8
 AliJetModelBaseTask.h:9
 AliJetModelBaseTask.h:10
 AliJetModelBaseTask.h:11
 AliJetModelBaseTask.h:12
 AliJetModelBaseTask.h:13
 AliJetModelBaseTask.h:14
 AliJetModelBaseTask.h:15
 AliJetModelBaseTask.h:16
 AliJetModelBaseTask.h:17
 AliJetModelBaseTask.h:18
 AliJetModelBaseTask.h:19
 AliJetModelBaseTask.h:20
 AliJetModelBaseTask.h:21
 AliJetModelBaseTask.h:22
 AliJetModelBaseTask.h:23
 AliJetModelBaseTask.h:24
 AliJetModelBaseTask.h:25
 AliJetModelBaseTask.h:26
 AliJetModelBaseTask.h:27
 AliJetModelBaseTask.h:28
 AliJetModelBaseTask.h:29
 AliJetModelBaseTask.h:30
 AliJetModelBaseTask.h:31
 AliJetModelBaseTask.h:32
 AliJetModelBaseTask.h:33
 AliJetModelBaseTask.h:34
 AliJetModelBaseTask.h:35
 AliJetModelBaseTask.h:36
 AliJetModelBaseTask.h:37
 AliJetModelBaseTask.h:38
 AliJetModelBaseTask.h:39
 AliJetModelBaseTask.h:40
 AliJetModelBaseTask.h:41
 AliJetModelBaseTask.h:42
 AliJetModelBaseTask.h:43
 AliJetModelBaseTask.h:44
 AliJetModelBaseTask.h:45
 AliJetModelBaseTask.h:46
 AliJetModelBaseTask.h:47
 AliJetModelBaseTask.h:48
 AliJetModelBaseTask.h:49
 AliJetModelBaseTask.h:50
 AliJetModelBaseTask.h:51
 AliJetModelBaseTask.h:52
 AliJetModelBaseTask.h:53
 AliJetModelBaseTask.h:54
 AliJetModelBaseTask.h:55
 AliJetModelBaseTask.h:56
 AliJetModelBaseTask.h:57
 AliJetModelBaseTask.h:58
 AliJetModelBaseTask.h:59
 AliJetModelBaseTask.h:60
 AliJetModelBaseTask.h:61
 AliJetModelBaseTask.h:62
 AliJetModelBaseTask.h:63
 AliJetModelBaseTask.h:64
 AliJetModelBaseTask.h:65
 AliJetModelBaseTask.h:66
 AliJetModelBaseTask.h:67
 AliJetModelBaseTask.h:68
 AliJetModelBaseTask.h:69
 AliJetModelBaseTask.h:70
 AliJetModelBaseTask.h:71
 AliJetModelBaseTask.h:72
 AliJetModelBaseTask.h:73
 AliJetModelBaseTask.h:74
 AliJetModelBaseTask.h:75
 AliJetModelBaseTask.h:76
 AliJetModelBaseTask.h:77
 AliJetModelBaseTask.h:78
 AliJetModelBaseTask.h:79
 AliJetModelBaseTask.h:80
 AliJetModelBaseTask.h:81
 AliJetModelBaseTask.h:82
 AliJetModelBaseTask.h:83
 AliJetModelBaseTask.h:84
 AliJetModelBaseTask.h:85
 AliJetModelBaseTask.h:86
 AliJetModelBaseTask.h:87
 AliJetModelBaseTask.h:88
 AliJetModelBaseTask.h:89
 AliJetModelBaseTask.h:90
 AliJetModelBaseTask.h:91
 AliJetModelBaseTask.h:92
 AliJetModelBaseTask.h:93
 AliJetModelBaseTask.h:94
 AliJetModelBaseTask.h:95
 AliJetModelBaseTask.h:96
 AliJetModelBaseTask.h:97
 AliJetModelBaseTask.h:98
 AliJetModelBaseTask.h:99
 AliJetModelBaseTask.h:100
 AliJetModelBaseTask.h:101
 AliJetModelBaseTask.h:102
 AliJetModelBaseTask.h:103
 AliJetModelBaseTask.h:104
 AliJetModelBaseTask.h:105
 AliJetModelBaseTask.h:106
 AliJetModelBaseTask.h:107
 AliJetModelBaseTask.h:108
 AliJetModelBaseTask.h:109
 AliJetModelBaseTask.h:110
 AliJetModelBaseTask.h:111
 AliJetModelBaseTask.h:112
 AliJetModelBaseTask.h:113
 AliJetModelBaseTask.h:114
 AliJetModelBaseTask.h:115
 AliJetModelBaseTask.h:116
 AliJetModelBaseTask.h:117
 AliJetModelBaseTask.h:118
 AliJetModelBaseTask.h:119
 AliJetModelBaseTask.h:120
 AliJetModelBaseTask.h:121
 AliJetModelBaseTask.h:122
 AliJetModelBaseTask.h:123
 AliJetModelBaseTask.h:124
 AliJetModelBaseTask.h:125
 AliJetModelBaseTask.h:126
 AliJetModelBaseTask.h:127
 AliJetModelBaseTask.h:128
 AliJetModelBaseTask.h:129
 AliJetModelBaseTask.h:130
 AliJetModelBaseTask.h:131
 AliJetModelBaseTask.h:132
 AliJetModelBaseTask.h:133
 AliJetModelBaseTask.h:134
 AliJetModelBaseTask.h:135
 AliJetModelBaseTask.h:136