///////////////////////////////////////////////////////////////////////////////
//
// Extends the ConcentratorOpticalModel to match the SNOMAN 5_0294
// version. This takes into account the SNOMAN specific assumptions.
// Namely this includes a SNOMAN specific look-up table.
//
// Author: Phil G Jones <p.jones22@physics.ox.ac.uk>
//
// REVISION HISTORY:
//     05/11/2010 : P G Jones - New file
//     2014-08-05 : P G Jones - Updated doxygen.
//
///////////////////////////////////////////////////////////////////////////////

#ifndef __RAT_ConcentratorSNOMANOpticalModel_hh__
#define __RAT_ConcentratorSNOMANOpticalModel_hh__

#include <RAT/ConcentratorOpticalModel.hh>

class G4Region;
class G4LogicalVolume;

namespace RAT
{

class ConcentratorSNOMANOpticalModel : public ConcentratorOpticalModel
{
public:
  // The constructor invoked with the model name and applicable region
  //
  // name: name of this model
  // region: region this model is applied in
  // params: parameters that control this models settings, index to RATDB
  // volume: volume this model applies to
  ConcentratorSNOMANOpticalModel( const G4String name, G4Region* const region,
                                  const std::string params, G4LogicalVolume* const volume );

  // The method that does the actual tracking
  //
  // fastTrack: track to track
  // fastStep: result of tracking
  virtual void DoIt( const G4FastTrack& fastTrack, G4FastStep& fastStep );

protected:
  // Return the reflection probability for the angle and wavelength.
  //
  // position: position in local coordinates
  // theta: photon angle to the boundary, in radians
  // energy: energy of the photon
  // polarisation: polarisation in local coordinates
  // specularR: specular reflection probability
  // diffuseR: diffuse reflection probability
  virtual void GetReflectionProb( const G4ThreeVector& position,
                                  const G4double theta,  const G4double energy,
                                  const EPolarisation polarisation,
                                  G4double& specularR, G4double& diffuseR );

  std::vector<G4double> fPrompt; // The prompt response table
  G4double fPromptNormalisation; // The prompt normalisation factor
};

} //::RAT

#endif