#ifndef ALIGENPYTHIAPLUS_H
#define ALIGENPYTHIAPLUS_H
#include "AliGenMC.h"
#include "AliPythia.h"
class AliPythiaBase;
class TParticle;
class AliGenPythiaEventHeader;
class AliGenEventHeader;
class AliStack;
class AliRunLoader;
class AliGenPythiaPlus : public AliGenMC
{
public:
typedef enum {kFlavorSelection, kParentSelection} StackFillOpt_t;
typedef enum {kCountAll, kCountParents, kCountTrackables} CountMode_t;
typedef enum {kCluster, kCell} JetRecMode_t;
AliGenPythiaPlus();
AliGenPythiaPlus(AliPythiaBase* pythia);
virtual ~AliGenPythiaPlus();
virtual void Generate();
virtual void Init();
virtual void SetSeed(UInt_t seed);
virtual void SetEventListRange(Int_t eventFirst=-1, Int_t eventLast=-1);
virtual void SetProcess(Process_t proc = kPyCharm) {fProcess = proc;}
virtual void SetStrucFunc(StrucFunc_t func = kCTEQ5L) {fStrucFunc = func;}
virtual void SetPtHard(Float_t ptmin = 0, Float_t ptmax = 1.e10)
{fPtHardMin = ptmin; fPtHardMax = ptmax; }
virtual void SetYHard(Float_t ymin = -1.e10, Float_t ymax = 1.e10)
{fYHardMin = ymin; fYHardMax = ymax; }
virtual void SetGluonRadiation(Int_t iIn, Int_t iFin)
{fGinit = iIn; fGfinal = iFin;}
virtual void SetPtKick(Float_t kt = 1.)
{fPtKick = kt;}
virtual void UseNewMultipleInteractionsScenario() {fNewMIS = kTRUE;}
virtual void SwitchHFOff() {fHFoff = kTRUE;}
virtual void SetEnergyCMS(Float_t energy = 5500) {fEnergyCMS = energy;}
virtual void SetNuclei(Int_t a1, Int_t a2);
virtual void SetJetEtRange(Float_t etmin = 0., Float_t etmax = 1.e4)
{fEtMinJet = etmin; fEtMaxJet = etmax;}
virtual void SetJetEtaRange(Float_t etamin = -20., Float_t etamax = 20.)
{fEtaMinJet = etamin; fEtaMaxJet = etamax;}
virtual void SetJetPhiRange(Float_t phimin = 0., Float_t phimax = 360.)
{fPhiMinJet = TMath::Pi()*phimin/180.; fPhiMaxJet = TMath::Pi()*phimax/180.;}
virtual void SetJetReconstructionMode(Int_t mode = kCell) {fJetReconstruction = mode;}
virtual void SetGammaEtaRange(Float_t etamin = -20., Float_t etamax = 20.)
{fEtaMinGamma = etamin; fEtaMaxGamma = etamax;}
virtual void SetGammaPhiRange(Float_t phimin = 0., Float_t phimax = 360.)
{fPhiMinGamma = TMath::Pi()*phimin/180.; fPhiMaxGamma = TMath::Pi()*phimax/180.;}
virtual void SetFragPhotonInCalo(Bool_t b) {fFragPhotonInCalo = b;}
virtual void SetPi0InCalo (Bool_t b) {fPi0InCalo = b;}
virtual void SetPhotonInCalo(Bool_t b) {fPhotonInCalo = b;}
virtual void SetCheckPHOS (Bool_t b) {fCheckPHOS = b;}
virtual void SetCheckEMCAL(Bool_t b) {fCheckEMCAL = b;}
virtual void SetFragPhotonInEMCAL(Bool_t b) {fCheckEMCAL = b; fFragPhotonInCalo = b;}
virtual void SetFragPhotonInPHOS(Bool_t b) {fCheckPHOS = b; fFragPhotonInCalo = b;}
virtual void SetPi0InEMCAL(Bool_t b) {fCheckEMCAL = b; fPi0InCalo = b;}
virtual void SetPi0InPHOS(Bool_t b) {fCheckPHOS = b; fPi0InCalo = b;}
virtual void SetPhotonInEMCAL(Bool_t b) {fCheckEMCAL = b; fPhotonInCalo = b;}
virtual void SetPhotonInPHOS(Bool_t b) {fCheckPHOS = b; fPhotonInCalo = b;}
virtual void SetPhotonInPHOSeta(Bool_t b) {fCheckPHOSeta = b; fPhotonInCalo = b;}
virtual void SetFragPhotonOrPi0MinPt(Float_t pt) {fFragPhotonOrPi0MinPt = pt;}
virtual void SetPhotonMinPt(Float_t pt) {fPhotonMinPt = pt;}
void RotatePhi(Int_t iphcand, Bool_t& okdd);
virtual void SetTriggerParticle(Int_t particle = 0, Float_t etamax = 0.9)
{fTriggerParticle = particle; fTriggerEta = etamax;}
virtual void SetFeedDownHigherFamily(Bool_t opt) {
fFeedDownOpt = opt;
}
virtual void SetStackFillOpt(StackFillOpt_t opt) {
fStackFillOpt = opt;
}
virtual void SetFragmentation(Bool_t opt) {
fFragmentation = opt;
}
virtual void SetCountMode(CountMode_t mode) {
fCountMode = mode;
}
virtual void SetQuench(Int_t flag = 0) {fQuench = flag;}
virtual void SetHadronisation(Int_t flag = 1) {fHadronisation = flag;}
virtual void SetReadFromFile(const Text_t *filname) {fFileName = filname; fReadFromFile = 1;}
virtual void SetInteractionRate(Float_t rate,Float_t timewindow = 90.e-6);
virtual Float_t GetInteractionRate() const {return fInteractionRate;}
virtual Float_t GetXsection() const {return fXsection;}
void GetJets(Int_t& njets, Int_t& ntrig, Float_t jets[4][10]);
void RecJetsUA1(Int_t& njets, Float_t jets[4][50]);
void SetPycellParameters(Float_t etamax = 2., Int_t neta = 274, Int_t nphi = 432,
Float_t thresh = 0., Float_t etseed = 4.,
Float_t minet = 10., Float_t r = 1.);
virtual Process_t GetProcess() const {return fProcess;}
virtual StrucFunc_t GetStrucFunc() const {return fStrucFunc;}
virtual void GetPtHard(Float_t& ptmin, Float_t& ptmax) const
{ptmin = fPtHardMin; ptmax = fPtHardMax;}
virtual void GetNuclei(Int_t& a1, Int_t& a2) const
{a1 = fAProjectile; a2 = fATarget;}
virtual void GetJetEtRange(Float_t& etamin, Float_t& etamax) const
{etamin = fEtaMinJet; etamax = fEtaMaxJet;}
virtual void GetJetPhiRange(Float_t& phimin, Float_t& phimax) const
{phimin = fPhiMinJet*180./TMath::Pi(); phimax = fPhiMaxJet*180/TMath::Pi();}
virtual void GetGammaEtaRange(Float_t& etamin, Float_t& etamax) const
{etamin = fEtaMinGamma; etamax = fEtaMaxGamma;}
virtual void GetGammaPhiRange(Float_t& phimin, Float_t& phimax) const
{phimin = fPhiMinGamma*180./TMath::Pi(); phimax = fPhiMaxGamma*180./TMath::Pi();}
virtual void SetHeavyQuarkYRange(Float_t ymin=-20., Float_t ymax=20.){
fYMinHQ = ymin; fYMaxHQ=ymax; fUseYCutHQ=kTRUE;
}
Bool_t IsInEMCAL(Float_t phi, Float_t eta) const;
Bool_t IsInPHOS(Float_t phi, Float_t eta) const;
virtual void FinishRun();
Bool_t CheckTrigger(const TParticle* jet1, const TParticle* jet2);
Bool_t CheckKinematicsOnChild();
void GetSubEventTime();
virtual void SetTune(Int_t itune) {fItune = itune;}
virtual void SetInfo(Int_t info) {fInfo = info;}
protected:
void AdjustWeights() const;
Int_t GenerateMB();
void MakeHeader();
void GeneratePileup();
AliPythiaBase *fPythia;
Process_t fProcess;
StrucFunc_t fStrucFunc;
Float_t fKineBias;
Int_t fTrials;
Int_t fTrialsRun;
Float_t fQ;
Float_t fX1;
Float_t fX2;
Float_t fEventTime;
Float_t fInteractionRate;
Float_t fTimeWindow;
Int_t fCurSubEvent;
TArrayF *fEventsTime;
Int_t fNev;
Int_t fFlavorSelect;
Float_t fXsection;
Float_t fPtHardMin;
Float_t fPtHardMax;
Float_t fYHardMin;
Float_t fYHardMax;
Int_t fGinit;
Int_t fGfinal;
Int_t fHadronisation;
Int_t fNpartons;
Int_t fReadFromFile;
Int_t fQuench;
Float_t fPtKick;
Bool_t fFullEvent;
AliDecayer *fDecayer;
Int_t fDebugEventFirst;
Int_t fDebugEventLast;
Float_t fEtMinJet;
Float_t fEtMaxJet;
Float_t fEtaMinJet;
Float_t fEtaMaxJet;
Float_t fPhiMinJet;
Float_t fPhiMaxJet;
Int_t fJetReconstruction;
Float_t fEtaMinGamma;
Float_t fEtaMaxGamma;
Float_t fPhiMinGamma;
Float_t fPhiMaxGamma;
Bool_t fUseYCutHQ;
Float_t fYMinHQ;
Float_t fYMaxHQ;
Float_t fPycellEtaMax;
Int_t fPycellNEta;
Int_t fPycellNPhi;
Float_t fPycellThreshold;
Float_t fPycellEtSeed;
Float_t fPycellMinEtJet;
Float_t fPycellMaxRadius;
StackFillOpt_t fStackFillOpt;
Bool_t fFeedDownOpt;
Bool_t fFragmentation;
Bool_t fSetNuclei;
Bool_t fNewMIS;
Bool_t fHFoff;
Int_t fTriggerParticle;
Float_t fTriggerEta;
CountMode_t fCountMode;
AliGenPythiaEventHeader* fHeader;
AliRunLoader* fRL;
const Text_t* fFileName;
Bool_t fFragPhotonInCalo;
Bool_t fPi0InCalo;
Bool_t fPhotonInCalo;
Bool_t fCheckEMCAL;
Bool_t fCheckPHOS;
Bool_t fCheckPHOSeta;
Float_t fFragPhotonOrPi0MinPt;
Float_t fPhotonMinPt;
Float_t fPHOSMinPhi;
Float_t fPHOSMaxPhi;
Float_t fPHOSEta;
Float_t fEMCALMinPhi;
Float_t fEMCALMaxPhi;
Float_t fEMCALEta;
Int_t fItune;
Int_t fInfo;
private:
AliGenPythiaPlus(const AliGenPythiaPlus &Pythia);
AliGenPythiaPlus & operator=(const AliGenPythiaPlus & rhs);
ClassDef(AliGenPythiaPlus, 4)
};
#endif