///////////////////////////////////////////////////////////////////////////////
//
// Tracks photons through the PMT and decides if photoelectrons are
// created. This code tracks the photons within the PMT itself, it
// roughly follows the SNOMAN approach.
//
// Author: Phil G Jones
//
// REVISION HISTORY:
// 05/11/2010 : P G Jones - New file
// 2014-08-05 : P G Jones - Update doxygen.
// 2016-10-23 : N Barros - Added a history word to the photoelectron.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef __RAT_PMTOpticalModel_hh__
#define __RAT_PMTOpticalModel_hh__
#include
#include
#include
#include
#include
class G4Region;
class G4OpticalSurface;
namespace RAT
{
class PMTOpticalModel : public G4VFastSimulationModel,
public OpticalModelBase
{
public:
// The constructor invoked with the model name, region of application and envelope flag.
//
// name: name of this model
// region: region this model is applied in
// params: parameters that control this models settings, index to RATDB
// pmtVolume: PMT volume this model applies to
// envelopeVolume: envelope volume this model applies to
// photocathodeSurface: optical surface properties
// mirrorSurface: optical surface properties
PMTOpticalModel( const G4String name, G4Region* const region,
const std::string params, G4LogicalVolume* const pmtVolume,
G4LogicalVolume* const envelopeVolume,
G4OpticalSurface* const photocathodeSurface,
G4OpticalSurface* const mirrorSurface );
// The Destructor
~PMTOpticalModel();
// Returns true if this model applies to the particle type
//
// type: of particle this model applies to
// Returns true if the type is an optical photon
G4bool IsApplicable( const G4ParticleDefinition& type );
// Returns true if this model should be invoked
//
// fastTrack: track to consider
// Returns true if the fastTrack triggers this model
G4bool ModelTrigger( const G4FastTrack & fastTrack );
// The method that does the actual tracking
//
// fastTrack: track to track
// fastStep: result of tracking
virtual void DoIt( const G4FastTrack& fastTrack, G4FastStep& fastStep );
protected:
// Enum of existing PMT volumes, each one also acts as an index to fPMTVolNames, so must ensure they match
enum EPMTVolumes { eGlass, ePCVacuum, ePCAlVacuum, eAlVacuum, eDynode, eOut };
// Track the photon
//
// fastTrack: photon track information
// ipmt: PMT ID
// position: position in local coordinates
// direction: direction in local coordinates
// polarisation: polarisation in local coordinates
// time: time in global MC units
// weight: weight of the track >0 to be alive
void TrackPhoton( const G4FastTrack& fastTrack, const G4int ipmt,
G4ThreeVector& position, G4ThreeVector& direction,
G4ThreeVector& polarisation, G4double& time,
G4double& weight );
// Track the photon across a border between volumes, this can lead to reflection, absorption, refraction etc...
//
// position: position in local coordinates
// energy: energy of the photon
// time: time in global MC units
// previousVolume: volume the track is exiting
// currentVolume: volume the track is entering
// ipmt: PMT ID
// trackID: track ID of the track
// direction: direction in local coordinates
// polarisation: polarisation in local coordinates
// weight: weight of the track >0 to be alive
bool TrackAcrossBorder( const G4FastTrack& fastTrack, const G4ThreeVector& position, const G4double energy,
const G4double time,
const EPMTVolumes previousVolume,
const EPMTVolumes currentVolume,
const G4int ipmt, const G4int trackID,
G4ThreeVector& direction,
G4ThreeVector& polarisation, G4double& weight );
// Calculate the T and R probabilities for Fresnel interfaces
// This expects the direction to to point towards the surface, and the normal away
//
// direction: direction in local coordinates
// polarisation: polarisation in local coordinates
// normal: normal of the surface in local coordinates
// n1: refractive index of exit media
// n2: refractive index of entry media
// T: transmission probability
// R: reflection probability
void CalculateTRFresnel( const G4ThreeVector direction,
const G4ThreeVector polarisation,
const G4ThreeVector normal,
const G4double n1, const std::complex n2,
G4double& T, G4double& R );
// Calculate the T and R probabilites for thin film interfaces
// This expects the direction to to point towards the surface, and the normal away
//
// direction: direction in local coordinates
// polarisation: polarisation in local coordinates
// normal: normal of the surface in local coordinates
// n1: refractive index of exit media
// n2: refractive index of thin film
// n3: refractive index of entry media
// energy: Energy of the photon
// thickness: thickness of the film
// T: transmission probability
// R: reflection probability
void CalculateTRThinFilm( const G4ThreeVector direction,
const G4ThreeVector polarisation,
const G4ThreeVector normal,
const G4double n1, const std::complex n2,
const std::complex n3, const G4double energy,
const G4double thickness,
G4double& T, G4double& R );
// Helper function for CalculateTRThinFilm, input parameters described in
// SNO+-doc-742.
//
// Passes back T, the transmission probability and R, the reflection
// probability
void ToTR( const double u, const double eta, const std::complex g,
const double abs_r12, const double abs_r23, const double abs_t12,
const double abs_t23, const double arg_r12, const double arg_r23,
const double exp1, double& T, double& R );
// Returns the probability that an absorbed hit caused a pe signal
//
// pmtID: PMT ID
// position: position in local coordinates
// energy: energy of the photon
// weight: weight of the track >0 to be alive
virtual G4double GetSignalProbability( const G4int pmtID,
const G4ThreeVector position,
const G4double energy,
const G4double weight );
std::vector fPMTVolNames; // The names of the PMT volumes, indexed by EPMTVolumes
G4VSolid* fGlassVolume; // Glass Volume, also pmt-envelope volume
G4VSolid* fPCVacuumVolume; // Upper inner volume
G4VSolid* fPCAlVacuumVolume; // Middle inner volume
G4VSolid* fAlVacuumVolume; // Lower inner volume
G4VSolid* fDynodeVolume; // Dynode volume
G4MaterialPropertyVector* fWaterRIndex; // Water refractive index
G4MaterialPropertyVector* fGlassRIndex; // Glass refractive index
G4MaterialPropertyVector* fPCRIndex; // Photocathode real refractive index
G4MaterialPropertyVector* fPCKIndex; // Photocathode imaginary refractive index
G4MaterialPropertyVector* fPEEscapeProbability; // Probability of Photoelectron escaping photocathode, f(energy)
G4MaterialPropertyVector* fPCThickness; // Photocathode thickness f(Z)
G4MaterialPropertyVector* fAlRIndex; // Aluminium real refractive index
G4MaterialPropertyVector* fAlKIndex; // Aluminium imaginary refractive index
G4MaterialPropertyVector* fGlassGVelocity; // Glass group velocity
G4MaterialPropertyVector* fPCVacuumGVelocity; // Photocathode vacuum group velocity
G4MaterialPropertyVector* fPCAlVacuumGVelocity; // Photocathode aluminium vacuum group velocity
G4MaterialPropertyVector* fAlVacuumGVelocity; // Aluminium group velocity
G4double fDynodeZTranslation; // Position of the dynode in the PMT co-ord system
G4double fCollectionEfficiency; // Collection efficiency of the PMT
G4double fDynodeReflectivity; // Reflectivity of the dynode stack
};
} //::RAT
#endif