#ifndef LCDGETPARAM_H
#define LCDGETPARAM_H

#include "TObject.h"
#include "TString.h"
#include "LCDDetectorVolume.h"

class LCDGetParameters : public TObject {

public:
  LCDGetParameters(FILE* parFile);

  // For Magnetic Field
  Double_t  GetMagneticField() {return m_Field;}
  void SetMagneticField(Double_t b) {m_Field = b;}

  // Parameters for IP smear
  Double_t  GetIPSigmaX(){return m_ipSigmaX;}
  Double_t  GetIPSigmaY(){return m_ipSigmaY;}
  Double_t  GetIPSigmaZ(){return m_ipSigmaZ;}
  void SetIPSigmaX(Double_t x){m_ipSigmaX = x;}
  void SetIPSigmaY(Double_t y){m_ipSigmaY = y;}
  void SetIPSigmaZ(Double_t z){m_ipSigmaZ = z;}
  
  // Parameters for Track selection
  Int_t     GetMinHit() {return m_minHit;}
  Double_t  GetPTMin()  {return m_PtMin;}
  Double_t  GetPolarInner() {return m_PolarInner;}
  Double_t  GetPolarOuter() {return m_PolarOuter;}
  
  // Parameters for Cluster smear
  Double_t  GetCalEnergyEMA() {return m_CalEnergyEMA;}
  Double_t  GetCalEnergyEMB() {return m_CalEnergyEMB;}
  Double_t  GetCalEnergyHADA(){return m_CalEnergyHADA;}
  Double_t  GetCalEnergyHADB(){return m_CalEnergyHADB;}
  Double_t  GetCalTransEMA()  {return m_CalTransEMA;}
  Double_t  GetCalTransEMB()  {return m_CalTransEMB;}
  Double_t  GetCalTransHADA() {return m_CalTransHADA;}
  Double_t  GetCalTransHADB() {return m_CalTransHADB;}
  
  void  SetCalEnergyEMA(Double_t a) { m_CalEnergyEMA  = a;}
  void  SetCalEnergyEMB(Double_t a) { m_CalEnergyEMB  = a;}
  void  SetCalEnergyHADA(Double_t a){ m_CalEnergyHADA = a;}
  void  SetCalEnergyHADB(Double_t a){ m_CalEnergyHADB = a;}
  void  SetCalTransEMA(Double_t a)  { m_CalTransEMA   = a;}
  void  SetCalTransEMB(Double_t a)  { m_CalTransEMB   = a;}
  void  SetCalTransHADA(Double_t a) { m_CalTransHADA  = a;}
  void  SetCalTransHADB(Double_t a) { m_CalTransHADB  = a;}
  
  // Parameters for cluster merging in FastMC
  Double_t GetEMMergeSize()  {return m_EMMergeSize;};
  Double_t GetEMMergeAngle() {return m_EMMergeAngle;};
  Double_t GetHADMergeSize() {return m_HADMergeSize;};
  Double_t GetHADMergeAngle(){return m_HADMergeAngle;};
  
  void SetEMMergeSize(Double_t a)  { m_EMMergeSize  = a;};
  void SetEMMergeAngle(Double_t a) { m_EMMergeAngle = a;};
  void SetHADMergeSize(Double_t a) { m_HADMergeSize = a;};
  void SetHADMergeAngle(Double_t a){ m_HADMergeAngle= a;};
  
  // Parameters for Calorimeter geometries
  Double_t  GetEMEnergyScale()  {return m_EMEnergyScale;};
  Double_t  GetHADEnergyScale() {return m_HADEnergyScale;};
  Double_t  GetMUEnergyScale()  {return m_MUEnergyScale;};
  Double_t  GetLUMEnergyScale() {return m_LUMEnergyScale;};
  Double_t  GetEMThetaSeg()  {return m_EMThetaSeg;};
  Double_t  GetHADThetaSeg() {return m_HADThetaSeg;};
  Double_t  GetMUThetaSeg()  {return m_MUThetaSeg;};
  Double_t  GetLUMThetaSeg() {return m_LUMThetaSeg;};
  Double_t  GetEMphiSeg()  {return m_EMphiSeg;};
  Double_t  GetHADphiSeg() {return m_HADphiSeg;};
  Double_t  GetMUphiSeg()  {return m_MUphiSeg;};
  Double_t  GetLUMphiSeg() {return m_LUMphiSeg;};
  
  // Parameters for Detector geometries
  Int_t     GetEMBarrelLayer()    {return m_EMBarrelLayer;}; 
  Int_t     GetHADBarrelLayer()   {return m_HADBarrelLayer;};
  Int_t     GetMUBarrelLayer()    {return m_MUBarrelLayer;};
  Double_t  GetEMBarrelThick()    {return m_EMBarrelThick;};
  Double_t  GetHADBarrelThick()   {return m_HADBarrelThick;};
  Double_t  GetMUBarrelThick()    {return m_MUBarrelThick;};
  Double_t  GetEMBarrelAbsThick() {return m_EMBarrelAbsThick;};
  Double_t  GetHADBarrelAbsThick(){return m_HADBarrelAbsThick;};
  Double_t  GetMUBarrelAbsThick() {return m_MUBarrelAbsThick;};
  
  Double_t  GetEMBarrelInnerR()   {return m_EMBarrelInnerR;};
  Double_t  GetHADBarrelInnerR()  {return m_HADBarrelInnerR;};
  Double_t  GetMUBarrelInnerR()   {return m_MUBarrelInnerR;};
  Double_t  GetEMBarrelOuterR()   {return m_EMBarrelOuterR;};
  Double_t  GetHADBarrelOuterR()  {return m_HADBarrelOuterR;};
  Double_t  GetMUBarrelOuterR()   {return m_MUBarrelOuterR;};
  Double_t  GetEMBarrelOuterZ()   {return m_EMBarrelOuterZ;};
  Double_t  GetHADBarrelOuterZ()  {return m_HADBarrelOuterZ;};
  Double_t  GetMUBarrelOuterZ()   {return m_MUBarrelOuterZ;};
  Double_t  GetEMEndcapInnerZ()   {return m_EMEndcapInnerZ;};
  Double_t  GetHADEndcapInnerZ()  {return m_HADEndcapInnerZ;};
  Double_t  GetMUEndcapInnerZ()   {return m_MUEndcapInnerZ;};
  Double_t  GetLUMEndcapInnerZ()  {return m_LUMEndcapInnerZ;};
  Int_t     GetEMEndcapLayer()    {return m_EMEndcapLayer;}; 
  Int_t     GetHADEndcapLayer()   {return m_HADEndcapLayer;};
  Int_t     GetMUEndcapLayer()    {return m_MUEndcapLayer;};
  Int_t     GetLUMEndcapLayer()   {return m_LUMEndcapLayer;};
  Double_t  GetEMEndcapThick()  {return m_EMEndcapThick;};
  Double_t  GetHADEndcapThick() {return m_HADEndcapThick;};
  Double_t  GetMUEndcapThick()  {return m_MUEndcapThick;};
  Double_t  GetLUMEndcapThick() {return m_LUMEndcapThick;};
  
  Double_t  GetCoilInnerR()  {return m_CoilInnerR;};
  Double_t  GetCoilOuterZ()  {return m_CoilOuterZ;};
  Double_t  GetCoilThick()   {return m_CoilThick;};
  Double_t  GetCoilIntLeng() {return m_CoilIntLeng;};
  Double_t  GetPipeOuter()   {return m_PipeOuter;};
  
  TString* GetDetectorName()   {return &m_DetectorName;}
  TString* GetCoilPlace()      {return &m_CoilPlace;}
  TString* GetEMBarrelAbsMat() {return &m_EMBarrelAbsMat;}; 
  TString* GetHADBarrelAbsMat(){return &m_HADBarrelAbsMat;};
  TString* GetMUBarrelAbsMat() {return &m_MUBarrelAbsMat;}; 
  
  void SetCoilinHAD() {m_CoilPlace = "CoilinHAD";} // HAD cal is out of Coil
  void SetCoiloutHAD(){m_CoilPlace = "CoiloutHAD";}// HAD cal is within Coil
  
  Int_t SetDetectorVolumes();
  
  LCDDetectorVolume* GetDetectorVolumes(){return m_Volumes;}
  LCDDetectorVolume* GetInnerVolume(){return m_InnerVolume;}
  Int_t GetNVolumes(){return m_nVolumes;}
  
private:
  Double_t m_Field; // Magnetic field
  
  Double_t m_ipSigmaX; //Error of IP smear, X.
  Double_t m_ipSigmaY; //Error of IP smear, Y.
  Double_t m_ipSigmaZ; //Error of IP smear, Z.
  
  Int_t    m_minHit;     // min hit for track acceptance
  Double_t m_PtMin;      // min momentum for track acceptance
  Double_t m_PolarInner; // polar angle acceptance for tracking barrel
  Double_t m_PolarOuter; // polar angle acceptance for tracking ec
  
  // For Cluster smearing
  Double_t  m_CalEnergyEMA;
  Double_t  m_CalEnergyEMB;
  Double_t  m_CalEnergyHADA;
  Double_t  m_CalEnergyHADB;
  Double_t  m_CalTransEMA;
  Double_t  m_CalTransEMB;
  Double_t  m_CalTransHADA;
  Double_t  m_CalTransHADB;
  
  Double_t m_EMMergeSize;    // EM  Merge size  (= Moriel radius)
  Double_t m_EMMergeAngle;   // EM  Merge angle (= granularity)
  Double_t m_HADMergeSize;   // HAD Merge size  (= Moriel radius)
  Double_t m_HADMergeAngle;  // HAD Merge angle (= granularity)
  
  Double_t m_EMEnergyScale;  // EM  emergy scale for sampling
  Double_t m_HADEnergyScale; // HAD emergy scale for sampling
  Double_t m_MUEnergyScale;  // MU  emergy scale for sampling
  Double_t m_LUMEnergyScale; // LUM emergy scale for sampling
  
  Double_t m_EMThetaSeg;  // EM  Theta segmentation
  Double_t m_HADThetaSeg; // HAD Theta segmentation
  Double_t m_MUThetaSeg;  // MU  Theta segmentation
  Double_t m_LUMThetaSeg; // ELU Theta segmentation
  
  Double_t m_EMphiSeg;  // EM  phi segmentation
  Double_t m_HADphiSeg; // HAD phi segmentation
  Double_t m_MUphiSeg;  // MU  phi segmentation
  Double_t m_LUMphiSeg; // LUM phi segmentation
  
  Double_t  m_EMBarrelInnerR;
  Double_t  m_HADBarrelInnerR;
  Double_t  m_MUBarrelInnerR;
  Double_t  m_EMBarrelOuterR;
  Double_t  m_HADBarrelOuterR;
  Double_t  m_MUBarrelOuterR;
  Double_t  m_EMBarrelOuterZ;
  Double_t  m_HADBarrelOuterZ;
  Double_t  m_MUBarrelOuterZ;
  Int_t     m_EMBarrelLayer;
  Int_t     m_HADBarrelLayer;
  Int_t     m_MUBarrelLayer;
  Double_t  m_EMBarrelThick;
  Double_t  m_HADBarrelThick;
  Double_t  m_MUBarrelThick;
  Double_t  m_EMBarrelAbsThick;
  Double_t  m_HADBarrelAbsThick;
  Double_t  m_MUBarrelAbsThick;
  
  Double_t  m_EMEndcapInnerZ;
  Double_t  m_HADEndcapInnerZ;
  Double_t  m_MUEndcapInnerZ;
  Double_t  m_LUMEndcapInnerZ;
  Int_t     m_EMEndcapLayer;
  Int_t     m_HADEndcapLayer;
  Int_t     m_MUEndcapLayer;
  Int_t     m_LUMEndcapLayer;
  Double_t  m_EMEndcapThick;
  Double_t  m_HADEndcapThick;
  Double_t  m_MUEndcapThick;
  Double_t  m_LUMEndcapThick;
  
  Double_t  m_CoilInnerR;
  Double_t  m_CoilOuterZ;
  Double_t  m_CoilThick;
  Double_t  m_CoilIntLeng;
  Double_t  m_PipeOuter;
  
  TString m_DetectorName;    // nickname for detector geometry
  TString m_CoilPlace;       // Place of Coil (within/out of HAD CAL)
  TString m_EMBarrelAbsMat;  // EM  CAL Absorber Material
  TString m_HADBarrelAbsMat; // HAD CAL Absorber Material
  TString m_MUBarrelAbsMat;  // MU  detector Material
  
  //LCDDetectorVolume* pCur;
  
  LCDDetectorVolume* m_Volumes;       // Array of detector volumes
  LCDDetectorVolume* m_InnerVolume;   // Innermost volume about IP
  Int_t        m_nVolumes;            // Number of detector volumes in array
  
public:
  ClassDef(LCDGetParameters,0)      //  Get recon parameters from a file
};
#endif



