#ifndef ALIMUON_H
#define ALIMUON_H
#include "AliDetector.h"
#include "AliMUONChamber.h"
#include "AliMUONTrigger.h"
#include <TString.h>
class AliMUONResponse;
class AliMUONGeometry;
class AliMUONGeometryTransformer;
class AliMUONGeometryBuilder;
class AliMUONRawWriter;
class AliMUONVGeometryBuilder;
class AliMUONDigitMaker;
class AliMUONVHitStore;
class AliMUONCalibrationData;
class AliMUONDigitCalibrator;
class AliMUONRecoParam;
class AliLoader;
class TObjArray;
class AliMUON : public AliDetector
{
public:
AliMUON();
AliMUON(const char* name, const char* title);
virtual ~AliMUON();
void AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder);
void ResetGeometryBuilder();
AliMUONGeometryBuilder* GetGeometryBuilder() const {return fGeometryBuilder;}
const AliMUONGeometryTransformer* GetGeometryTransformer() const;
virtual AliLoader* MakeLoader(const char* topfoldername);
virtual void SetTreeAddress();
virtual void SetSplitLevel(Int_t SplitLevel) {fSplitLevel=SplitLevel;}
virtual AliDigitizer* CreateDigitizer(AliDigitizationInput* digInput) const;
virtual void SDigits2Digits();
virtual void Hits2SDigits();
virtual void Digits2Raw();
virtual Bool_t Raw2SDigits(AliRawReader* rawReader);
virtual AliTriggerDetector* CreateTriggerDetector() const
{ return new AliMUONTrigger(); }
virtual void SetSigmaIntegration(Int_t id, Float_t p1);
virtual void SetChargeSlope(Int_t id, Float_t p1);
virtual void SetChargeSpread(Int_t id, Float_t p1, Float_t p2);
virtual void SetMaxAdc(Int_t id, Int_t p1);
virtual void SetResponseModel(Int_t id, const AliMUONResponse& response);
virtual void SetMaxStepGas(Float_t p1);
virtual void SetMaxStepAlu(Float_t p1);
virtual void SetMaxDestepGas(Float_t p1);
virtual void SetMaxDestepAlu(Float_t p1);
virtual Float_t GetMaxStepGas() const;
virtual Float_t GetMaxStepAlu() const;
virtual Float_t GetMaxDestepGas() const;
virtual Float_t GetMaxDestepAlu() const;
virtual void SetAlign(Bool_t align = true);
virtual void SetAlign(const TString& fileName, Bool_t align = true);
virtual void SetIsMaxStep(Bool_t isMaxStep) { fIsMaxStep = isMaxStep; }
virtual void SetTriggerScalerEvent(Bool_t scaler = true){fTriggerScalerEvent = scaler;}
virtual void SetTriggerResponseV1(Int_t trigResV1 = 0)
{ fTriggerResponseV1 = trigResV1; }
virtual Int_t GetTriggerResponseV1() const;
virtual void SetTriggerCoinc44(Int_t trigCoinc44 = 0)
{ fTriggerCoinc44 = trigCoinc44; }
virtual Int_t GetTriggerCoinc44() const;
virtual void SetTriggerEffCells(Bool_t trigEffCells = true)
{ fTriggerEffCells = trigEffCells; }
virtual Bool_t GetTriggerEffCells() const;
virtual void SetDigitizerWithNoise(Int_t digitizerWithNoise, Double_t nsigmas=4.0)
{ fDigitizerWithNoise = digitizerWithNoise; fDigitizerNSigmas = nsigmas; }
virtual Int_t GetDigitizerWithNoise() const;
virtual Double_t GetDigitizerNSigmas() const { return fDigitizerNSigmas; }
virtual void SetTailEffect(Bool_t isTailEffect) { fIsTailEffect=isTailEffect; }
virtual void SetConvertTrigger(Bool_t convertTrigger = true) { fConvertTrigger = convertTrigger;}
virtual AliMUONChamber& Chamber(Int_t id)
{return *((AliMUONChamber *) (*fChambers)[id]);}
virtual void MakeBranch(Option_t* opt=" ");
virtual void ResetHits();
void SetDigitStoreClassName(const char* classname) { fDigitStoreConcreteClassName = classname; }
const TString DigitStoreClassName() const { return fDigitStoreConcreteClassName; }
protected:
AliMUON(const AliMUON& rMUON);
AliMUON& operator = (const AliMUON& rhs);
const AliMUONGeometry* GetGeometry() const;
AliMUONRecoParam* GetRecoParam() const;
Int_t fNCh;
Int_t fNTrackingCh;
Int_t fSplitLevel;
TObjArray* fChambers;
AliMUONGeometryBuilder* fGeometryBuilder;
Bool_t fAccCut;
Float_t fAccMin;
Float_t fAccMax;
Float_t fMaxStepGas;
Float_t fMaxStepAlu;
Float_t fMaxDestepGas;
Float_t fMaxDestepAlu;
Int_t fMaxIterPad;
Int_t fCurIterPad;
Bool_t fIsMaxStep;
Bool_t fTriggerScalerEvent;
Int_t fTriggerResponseV1;
Int_t fTriggerCoinc44;
Bool_t fTriggerEffCells;
Int_t fDigitizerWithNoise;
Double_t fDigitizerNSigmas;
Bool_t fIsTailEffect;
Bool_t fConvertTrigger;
AliMUONRawWriter* fRawWriter;
AliMUONDigitMaker* fDigitMaker;
AliMUONVHitStore* fHitStore;
TString fDigitStoreConcreteClassName;
AliMUONCalibrationData* fCalibrationData;
AliMUONDigitCalibrator* fDigitCalibrator;
ClassDef(AliMUON,25)
};
#endif