////////////////////////////////////////////////////////////////////////
/// \class RAT::ConcentratorConstructorParams
///
/// \brief   The struct of parameters needed to construct a concentrator
///
/// \author  Phil Jones <p.jones22@physics.ox.ac.uk>
/// \author Aksel Hallin <aksel.hallin@ualberta.ca> -- contact person
///
/// REVISION HISTORY:\n
///     07/09 : P.Jones - First Revision, new file. \n
///     08/10 : P.Jones - New constructor. \n
///     01/11 : P.Jones - Added data input option \n
///
/// \details  Stores the necessary parameters for a concentrator
///
///
////////////////////////////////////////////////////////////////////////

#ifndef __RAT_ConcentratorConsrtuctorParams__
#define __RAT_ConcentratorConsrtuctorParams__

#include <string>
#include <vector>

class G4Material;
class G4OpticalSurface;
class G4VisAttributes;

namespace RAT
{

class ConcentratorConstructorParams
{
public:
  enum EConcDefinition { eSNOMAN, eRAT };

  ConcentratorConstructorParams( const std::string& concType,
                                 G4Material* motherMaterial,
                                 G4VisAttributes* visAttributes );

  virtual ~ConcentratorConstructorParams() {}

  std::string fConcType; ///< String that defines the concentrator type in the db
  std::string fModelType; ///< Name of the Model, default is ConcentratorOpticalModel
  std::string fModelParams; ///< The Model Parameter set, e.g. Optics0
  double fUpperRadius; ///< Radius of concentrator water adjacent face
  double fLowerRadius; ///< Radius of concentrator pmt adjacent face
  double fA; ///< As defined in Michael Lay thesis, Torus cross section ellipse minor axis
  double fB; ///< As defined in Michael Lay thesis, Torus cross section ellipse major axis
  double fD; ///< As defined in Michael Lay thesis, Radius of torus
  std::vector<double> fZCoord; ///< If not using a fit (A, B, D) then measured position
  std::vector<double> fRhoCoord; ///< If not using a fit (A, B, D) then measured position
  double fOffset; ///< Concentrator offset in z from pmt equator
  int fNumPetals; ///< Number of Petals
  double fPetalThickness; ///< Thickness of the petal
  double fPlasticThickness; ///< Thickness of the plastic
  double fLipZCoord; ///< The lip middle Z coord, lip is edge is above and below.
  double fLipOuterRadius; ///< The outer radius of the lip, inner radius is that of the plastic
  G4Material* fBulkMaterial; ///< Concentrator Bulk (Plastic) material
  G4Material* fPetalMaterial; ///< Concentrator Bulk (Petal) material
  G4Material* fMotherMaterial; ///< Material of the volume the petal is placed into
  G4OpticalSurface* fReflectiveSurface; ///< Reflective surface for petals
  G4VisAttributes* fVisAttributes; ///< Visualisation attributes
  EConcDefinition fConcDefinition; ///< Does concentrator use RAT or SNOMAN definition
private:
  ConcentratorConstructorParams();
};


} //::RAT

#endif