#ifndef ALIITSSIMUPARAM_H
#define ALIITSSIMUPARAM_H
#include <TRandom.h>
#include<TObject.h>
#include <TString.h>
#include <TArrayF.h>
class AliITSSimuParam : public TObject {
public:
AliITSSimuParam();
AliITSSimuParam(const AliITSSimuParam& simpar);
AliITSSimuParam& operator=(const AliITSSimuParam& source);
~AliITSSimuParam();
void SetGeVToCharge(Double_t gc=3.6e-9){fGeVcharge = gc;}
Double_t GetGeVToCharge() const {return fGeVcharge;}
Double_t GeVToCharge(Double_t gev) const {return gev/fGeVcharge;}
void SetDistanceOverVoltage(Double_t d,Double_t v){fDOverV = d/v;}
void SetDistanceOverVoltage(Double_t dv=0.000375){fDOverV = dv;}
Double_t GetDistanceOverVoltage() const {return fDOverV;}
void SetSPDBiasVoltageAll(Double_t bias=18.182) {for(Int_t i=0;i<240;i++) fSPDBiasVoltage[i]=bias;}
void SetSPDBiasVoltage(Int_t mod, Double_t bias=18.182) {if(mod<0 || mod>239) return; fSPDBiasVoltage[mod]=bias;}
Double_t GetSPDBiasVoltage(Int_t mod=0) const {if(mod<0 || mod>239) return 0; return fSPDBiasVoltage[mod];}
void SetSPDThresholdsAll(Double_t thresh, Double_t sigma)
{for(Int_t i=0;i<240;i++) {fSPDThresh[i]=thresh; fSPDSigma[i]=sigma;}}
void SetSPDThresholds(Int_t mod,Double_t thresh, Double_t sigma)
{if(mod<0 || mod>239) return; fSPDThresh[mod]=thresh; fSPDSigma[mod]=sigma; }
void SPDThresholds(const Int_t mod, Double_t& thresh, Double_t& sigma) const;
void SetSPDNoiseAll(Double_t noise, Double_t baseline)
{for(Int_t i=0;i<240;i++) {fSPDNoise[i]=noise; fSPDBaseline[i]=baseline;}}
void SetSPDNoise(Int_t mod,Double_t noise, Double_t baseline)
{if(mod<0 || mod>239) return; fSPDNoise[mod]=noise; fSPDBaseline[mod]=baseline; }
void SPDNoise(const Int_t mod,Double_t &noise, Double_t &baseline) const;
Double_t ApplySPDBaselineAndNoise(Int_t mod=0) const
{if (mod<0 || mod>239) mod=0; return fSPDBaseline[mod]+fSPDNoise[mod]*gRandom->Gaus();}
void SetSPDCouplingOption(const char *opt) {fSPDCouplOpt=opt;}
void GetSPDCouplingOption(char *opt) const {strncpy(opt,fSPDCouplOpt.Data(),fSPDCouplOpt.Sizeof());}
void SetSPDCouplingParam(Double_t col, Double_t row)
{fSPDCouplCol = col; fSPDCouplRow = row;}
void GetSPDCouplingParam(Double_t &col, Double_t &row) const
{col = fSPDCouplCol; row = fSPDCouplRow;}
void SetSPDSigmaDiffusionAsymmetry(Double_t ecc) {fSPDEccDiff=ecc;}
void GetSPDSigmaDiffusionAsymmetry(Double_t &ecc) const {ecc=fSPDEccDiff;}
void SetSPDLorentzDrift(Bool_t ison) {fSPDLorentzDrift=ison;}
Bool_t GetSPDLorentzDrift() const {return fSPDLorentzDrift;}
void SetSPDLorentzHoleWeight(Float_t weight) {fSPDLorentzHoleWeight=weight;}
Float_t GetSPDLorentzHoleWeight() const {return fSPDLorentzHoleWeight;}
void SetSPDAddNoisyFlag(Bool_t value) {fSPDAddNoisyFlag = value;}
Bool_t GetSPDAddNoisyFlag() const {return fSPDAddNoisyFlag;}
void SetSPDRemoveDeadFlag(Bool_t value) {fSPDRemoveDeadFlag = value;}
Bool_t GetSPDRemoveDeadFlag() const {return fSPDRemoveDeadFlag;}
void SetSDDElectronics(Int_t p1=1) {fSDDElectronics=p1; }
Int_t GetSDDElectronics() const {return fSDDElectronics;}
void SetSDDDiffCoeff(Float_t p1, Float_t p2) {
fSDDDiffCoeff=p1; fSDDDiffCoeff1=p2;}
void GetSDDDiffCoeff(Float_t &diff,Float_t &diff1) const {
diff=fSDDDiffCoeff; diff1=fSDDDiffCoeff1;}
void SetSDDJitterError(Float_t jitter) {fSDDJitterError=jitter;}
Float_t GetSDDJitterError() const {return fSDDJitterError;}
void SetSDDDynamicRange(Double_t p1) {fSDDDynamicRange = p1;}
Float_t GetSDDDynamicRange() const {return fSDDDynamicRange;}
void SetSDDMaxAdc(Double_t p1) {fSDDMaxAdc=p1;}
Float_t GetSDDMaxAdc() const {return fSDDMaxAdc;}
void SetSDDChargeLoss(Double_t p1) {fSDDChargeLoss=p1;}
Float_t GetSDDChargeLoss() const {return fSDDChargeLoss;}
void SetSDDTrigDelay(Double_t p1) {fSDDTrigDelay=p1;}
Float_t GetSDDTrigDelay() const {return fSDDTrigDelay;}
void SetSDDCorrMapPrecision(Double_t p1) {fSDDMapPrec=p1;}
Float_t GetSDDCorrMapPrecision() const {return fSDDMapPrec;}
void SetSDDkeVtoADC(Double_t p1) {fSDDkeVtoADC=p1;}
Float_t GetSDDkeVtoADC() const {return fSDDkeVtoADC;}
void SetSDDRawDataFormatCarlos() {fSDDRawFormat=7;}
void SetSDDRawDataFormatFixLen8bitEncoded() {fSDDRawFormat=0;}
Char_t GetSDDRawDataFormat() const {return fSDDRawFormat;}
void SetSSDLorentzDrift(Bool_t ison) {fSSDLorentzDrift=ison;}
Bool_t GetSSDLorentzDrift() const {return fSSDLorentzDrift;}
Int_t GetSSDZSThreshold() const {
return fSSDZSThreshold; }
virtual void SetSSDZSThreshold(Int_t zsth) { fSSDZSThreshold = zsth; }
void SetSSDCouplings(Double_t pr, Double_t pl, Double_t nr, Double_t nl) {
fSSDCouplingPR=pr; fSSDCouplingPL=pl; fSSDCouplingNR=nr; fSSDCouplingNL=nl; }
Double_t GetSSDCouplingPR() const {return fSSDCouplingPR;}
Double_t GetSSDCouplingPL() const {return fSSDCouplingPL;}
Double_t GetSSDCouplingNR() const {return fSSDCouplingNR;}
Double_t GetSSDCouplingNL() const {return fSSDCouplingNL;}
void SetNSigmaIntegration(Double_t p1) {fNsigmas=p1;}
Float_t GetNSigmaIntegration() const {return fNsigmas;}
void SetNLookUp(Int_t p1);
Int_t GetGausNLookUp() const {return fNcomps;}
Float_t GetGausLookUp(Int_t i) {
if (!fGaus) SetNLookUp(fgkNcompsDefault);
if(i<0 || i>=fNcomps) return 0.;return fGaus->At(i);
}
void SetImpurity(Double_t n=0.0){fN = n;}
Double_t Impurity() const {return fN;}
Double_t MobilityElectronSiEmp() const ;
Double_t MobilityHoleSiEmp() const ;
Double_t DiffusionCoefficientElectron() const ;
Double_t DiffusionCoefficientHole() const ;
Double_t SpeedElectron() const ;
Double_t SpeedHole() const ;
Double_t SigmaDiffusion3D(Double_t l) const;
Double_t SigmaDiffusion2D(Double_t l) const;
Double_t SigmaDiffusion1D(Double_t l) const;
Double_t LorentzAngleElectron(Double_t bz) const;
Double_t LorentzAngleHole(Double_t bz) const;
Double_t DepletedRegionThicknessA(Double_t dopCons,
Double_t voltage,
Double_t elecCharge,
Double_t voltBuiltIn=0.5)const;
Double_t DepletedRegionThicknessB(Double_t resist,Double_t voltage,
Double_t mobility,
Double_t voltBuiltIn=0.5,
Double_t dielConst=1.E-12)const;
Double_t ReverseBiasCurrent(Double_t temp,Double_t revBiasCurT1,
Double_t tempT1,Double_t energy=1.2)const;
void PrintParameters() const;
protected:
static const Float_t fgkSPDBiasVoltageDefault;
static const Double_t fgkSPDThreshDefault;
static const Double_t fgkSPDSigmaDefault;
static const TString fgkSPDCouplingOptDefault;
static const Double_t fgkSPDCouplColDefault;
static const Double_t fgkSPDCouplRowDefault;
static const Float_t fgkSPDEccDiffDefault;
static const Float_t fgkSPDLorentzHoleWeightDefault;
static const Float_t fgkSDDDiffCoeffDefault;
static const Float_t fgkSDDDiffCoeff1Default;
static const Float_t fgkSDDJitterErrorDefault;
static const Float_t fgkSDDDynamicRangeDefault;
static const Int_t fgkSDDMaxAdcDefault;
static const Float_t fgkSDDChargeLossDefault;
static const Float_t fgkSDDTrigDelayDefault;
static const Float_t fgkSDDMapPrecDefault;
static const Float_t fgkSDDkeVtoADCDefault;
static const Double_t fgkSSDCouplingPRDefault;
static const Double_t fgkSSDCouplingPLDefault;
static const Double_t fgkSSDCouplingNRDefault;
static const Double_t fgkSSDCouplingNLDefault;
static const Int_t fgkSSDZSThresholdDefault;
static const Float_t fgkNsigmasDefault;
static const Int_t fgkNcompsDefault;
private:
Double_t fGeVcharge;
Double_t fDOverV;
Double_t fSPDBiasVoltage[240];
Double_t fSPDThresh[240];
Double_t fSPDSigma[240];
Double_t fSPDNoise[240];
Double_t fSPDBaseline[240];
TString fSPDCouplOpt;
Double_t fSPDCouplCol;
Double_t fSPDCouplRow;
Float_t fSPDEccDiff;
Bool_t fSPDLorentzDrift;
Float_t fSPDLorentzHoleWeight;
Bool_t fSPDAddNoisyFlag;
Bool_t fSPDRemoveDeadFlag;
Int_t fSDDElectronics;
Float_t fSDDDiffCoeff;
Float_t fSDDDiffCoeff1;
Float_t fSDDJitterError;
Float_t fSDDDynamicRange;
Float_t fSDDMaxAdc;
Float_t fSDDChargeLoss;
Float_t fSDDTrigDelay;
Float_t fSDDMapPrec;
Float_t fSDDkeVtoADC;
Char_t fSDDRawFormat;
Bool_t fSSDLorentzDrift;
Double_t fSSDCouplingPR;
Double_t fSSDCouplingPL;
Double_t fSSDCouplingNR;
Double_t fSSDCouplingNL;
Int_t fSSDZSThreshold;
Float_t fNsigmas;
Int_t fNcomps;
TArrayF *fGaus;
Double_t fN;
Float_t fT;
ClassDef(AliITSSimuParam,6);
};
#endif