#ifndef ALIGENSLOWNUCLEONS_H
#define ALIGENSLOWNUCLEONS_H
#include "AliGenerator.h"
class AliSlowNucleonModel;
class TH2F;
class TH1F;
class TF1;
class AliGenSlowNucleons : public AliGenerator
{
public:
AliGenSlowNucleons();
AliGenSlowNucleons(Int_t npart);
virtual ~AliGenSlowNucleons();
virtual void Init();
virtual void FinishRun();
virtual void Generate();
virtual void SetPmax(Float_t pmax = 10.) {fPmax = pmax;}
virtual void SetNominalCmsEnergy(Float_t energy = 14000.) {fCMS = energy;}
virtual void SetTarget(Int_t a = 208, Int_t z = 82) {fATarget = a; fZTarget = z;}
virtual void SetTarget(TString s, Int_t a, Int_t z) {AliGenerator::SetTarget(s, a, z);}
virtual void SetProtonDirection(Float_t dir = 1.);
virtual void SetCharge(Int_t c = 1) {fCharge = c;}
virtual void SetTemperature(Double_t t1 = 0.04, Double_t t2 = 0.004)
{fTemperatureG = t1; fTemperatureB = t2;}
virtual void SetBetaSource(Double_t b1 = 0.05, Double_t b2 = 0.)
{fBetaSourceG = b1; fBetaSourceB = b2;}
virtual void SetSlowNucleonModel(AliSlowNucleonModel* model)
{fSlowNucleonModel = model;}
virtual Bool_t NeedsCollisionGeometry() const {return kTRUE;}
virtual void SetCollisionGeometry(AliCollisionGeometry* geom)
{fCollisionGeometry = geom;}
virtual void SetDebug(Int_t flag = 0) {fDebug = flag;}
virtual void SetNumbersOfSlowNucleons(Int_t ngp, Int_t ngn, Int_t nbp, Int_t nbn)
{fNgp = ngp; fNgn = ngn; fNbp = nbp; fNbn = nbn;}
virtual void SetThetaDist(Int_t flag=0) {fThetaDistribution = flag;}
virtual void SetBeamCrossingAngle(Float_t crossAngle) {fBeamCrossingAngle = crossAngle;}
virtual void SetBeamDivergence(Float_t divergence) {fBeamDivergence = divergence;}
virtual Int_t GetNGrayProtons() {return fNgp;}
virtual Int_t GetNGrayNeutrons() {return fNgn;}
virtual Int_t GetNBlackProtons() {return fNbp;}
virtual Int_t GetNBlackNeutrons() {return fNbn;}
virtual void SetModelSmear(Int_t imode) {fSmearMode=imode;}
protected:
void GenerateSlow(Int_t charge, Double_t T, Double_t beta, Float_t* q, Float_t &theta);
Double_t Maxwell(Double_t m, Double_t p, Double_t t);
void Lorentz(Double_t m, Double_t beta, Float_t* q);
void BeamCrossDivergence(Int_t iwhat, Float_t *pLab);;
void AddAngle(Double_t theta1, Double_t phi1, Double_t theta2,
Double_t phi2, Double_t *angle);
void SetProcessID(Int_t nt, UInt_t process);
protected:
Float_t fCMS;
Double_t fMomentum;
Double_t fBeta;
Float_t fPmax;
Int_t fCharge;
Float_t fProtonDirection;
Float_t fTemperatureG;
Float_t fBetaSourceG;
Float_t fTemperatureB;
Float_t fBetaSourceB;
Int_t fNgp;
Int_t fNgn;
Int_t fNbp;
Int_t fNbn;
Int_t fDebug;
TH2F* fDebugHist1;
TH2F* fDebugHist2;
Int_t fThetaDistribution;
TH1F* fCosThetaGrayHist;
TF1* fCosTheta;
Float_t fBeamCrossingAngle;
Float_t fBeamDivergence;
Float_t fBeamDivEvent;
Int_t fSmearMode;
AliSlowNucleonModel* fSlowNucleonModel;
enum {kGrayProcess = 200, kBlackProcess = 300};
private:
AliGenSlowNucleons(const AliGenSlowNucleons &sn);
AliGenSlowNucleons & operator=(const AliGenSlowNucleons & rhs);
ClassDef(AliGenSlowNucleons,4)
};
#endif