33.5. Optical Surfaces
Table of Contents
Reflection
In Geant4, an optical surface describes how optical photons behave when they encounter a boundary between two volumes. The surface can reflect, transmit, or absorb light, and can do so in an ideal or realistic way. You define these properties with the class G4OpticalSurface, and then attach it to a boundary between volumes through a G4LogicalBorderSurface or a G4LogicalSkinSurface.
Reflection occurs when an optical photon hits a surface and is returned into the same medium instead of entering the other one. Geant4 supports several reflection models that you select with the surface type and finish. A typical setup looks like this in C++:
auto optSurf = new G4OpticalSurface("CrystalWrap");
optSurf->SetType(dielectric_metal);
optSurf->SetFinish(groundfrontpainted);
optSurf->SetModel(unified);
The combination of SetType, SetFinish, and SetModel determines how Geant4 calculates the outgoing direction of each photon. In the unified model, which is commonly used for detector simulations, reflection is described in terms of components such as specular reflection, diffuse reflection, and backscatter. These components are specified through properties of a G4MaterialPropertiesTable that you attach to the optical surface.
For a unified model surface, the most important reflection-related properties are:
| Property name | Meaning |
|---|---|
REFLECTIVITY | Probability that the photon is reflected instead of absorbed |
EFFICIENCY | Probability that a reflected photon is detected/removed |
SPECULARLOBECONSTANT | Fraction of reflections near the mirror direction |
SPECULARSPIKECONSTANT | Fraction of perfect specular reflections |
BACKSCATTERCONSTANT | Fraction of photons reflected back toward the incident side |
LAMBERTIAN (derived internally) | Remaining diffuse reflection fraction |
These are given as functions of photon energy, through G4MaterialPropertiesTable:
auto mptSurf = new G4MaterialPropertiesTable;
// Example: 2 photon energies
std::vector<G4double> photonEnergy = {2.0*eV, 3.0*eV};
std::vector<G4double> reflectivity = {0.95, 0.90};
std::vector<G4double> specLobe = {0.5, 0.5};
std::vector<G4double> specSpike = {0.1, 0.1};
std::vector<G4double> backScatter = {0.0, 0.0};
mptSurf->AddProperty("REFLECTIVITY", photonEnergy, reflectivity);
mptSurf->AddProperty("SPECULARLOBECONSTANT", photonEnergy, specLobe);
mptSurf->AddProperty("SPECULARSPIKECONSTANT", photonEnergy, specSpike);
mptSurf->AddProperty("BACKSCATTERCONSTANT", photonEnergy, backScatter);
optSurf->SetMaterialPropertiesTable(mptSurf);The sum of the four reflection fractions at any energy defines how reflection is partitioned into specular, near-specular, backscattered, and diffuse parts. Geant4 internally treats the remaining fraction as Lambertian diffuse reflection.
For a realistic optical surface, you must define energy-dependent properties like REFLECTIVITY and the unified model constants. Make sure that the sum of reflection components does not exceed 1, and that REFLECTIVITY represents a true probability between 0 and 1.
Geant4 supports several surface types. Two very common ones for reflection are dielectric_metal and dielectric_dielectric.
With dielectric_metal, the surface behaves like a metal mirror. Reflection is controlled almost entirely by the surface REFLECTIVITY. Photons that are not reflected are considered absorbed, so they are removed from the simulation. This is typically used for mirrors and reflective wrappings.
With dielectric_dielectric, the surface represents a boundary between two transparent dielectrics, for example scintillator and air or scintillator and optical grease. In this case, reflection is partly determined by the refractive indices of the materials on each side, and by the selected surface model. You can still apply roughness and reflection components with the unified model, but Fresnel reflection and refraction are handled according to the optical properties of the materials.
The surface finish also affects reflection. A polished finish assumes an ideal smooth surface, which produces sharp specular reflections. A ground or groundfrontpainted finish introduces microscopic roughness, which broadens reflected directions and can lead to more diffuse light.
Once you define the optical surface, you associate it with geometry. A border surface is applied only at the interface between two specific physical volumes:
new G4LogicalBorderSurface("WrapSurface",
physScintillator,
physWrap,
optSurf);A skin surface applies to all boundaries of a logical volume with other volumes:
new G4LogicalSkinSurface("CrystalSkin", logicCrystal, optSurf);When an optical photon reaches a boundary with an optical surface, Geant4 samples whether it is reflected, transmitted, or absorbed. If reflection occurs, the new direction is computed according to the surface model (for example, the unified model with your chosen fractions). The photon then continues its track in the same material until it is absorbed, detected, or leaves the geometry.
In practice, the choice of reflection model strongly influences light collection in detectors. A highly reflective wrapping around a scintillator can significantly increase the number of photons that reach a photodetector. Tuning REFLECTIVITY and the roughness parameters allows you to approximate real detector surfaces, such as Teflon wrapping or painted scintillator faces, without explicitly modeling microscopic features.
Refraction
Refraction is the change in direction of an optical photon when it passes from one material into another with a different refractive index. In Geant4, refraction is handled automatically by the optical boundary process whenever a photon reaches the interface between two dielectric materials that have refractive indices defined as functions of photon energy.
Refraction follows Snell’s law. If $n_1$ and $n_2$ are the refractive indices in the initial and final media, and $\theta_1$ and $\theta_2$ are the angles with respect to the surface normal, then
$$
n_1 \sin\theta_1 = n_2 \sin\theta_2.
$$
Geant4 uses the RINDEX property in each material’s G4MaterialPropertiesTable to represent $n(E)$, the refractive index as a function of photon energy $E$. You typically define this once when you set up your materials:
auto mptWater = new G4MaterialPropertiesTable;
std::vector<G4double> photonEnergy = {2.0*eV, 3.0*eV};
std::vector<G4double> rindexWater = {1.33, 1.34};
mptWater->AddProperty("RINDEX", photonEnergy, rindexWater);
water->SetMaterialPropertiesTable(mptWater);When a photon encounters a boundary between two dielectrics, Geant4 looks up the refractive indices in both materials at the photon’s current energy. It then computes the probabilities for reflection and transmission using Fresnel equations, and samples which outcome occurs. Total internal reflection is naturally included when the photon is in a higher index medium and the angle is larger than the critical angle.
The critical angle for total internal reflection is given by
$$
\sin \theta_c = \frac{n_2}{n_1}, \quad \text{for } n_1 > n_2.
$$
If $\theta_1 > \theta_c$, the photon is reflected back into the higher index medium. Geant4 does not need you to calculate $\theta_c$ explicitly. It follows from the Fresnel computation using the defined refractive indices.
For correct refraction, you must define a consistent RINDEX for every optical material over the full photon energy range used in your simulation. Gaps or mismatched energy ranges in RINDEX tables can lead to unphysical behavior or missing refraction.
The presence of an optical surface at a dielectric boundary modifies how Geant4 uses the refractive indices. For a dielectric_dielectric surface, Geant4 still considers the refractive indices to compute Fresnel reflection and refraction, but the surface model can add additional effects, such as micro-facet roughness or partial diffuse reflection. If you choose the unified model with a polished finish, the surface behaves nearly like an ideal optical interface, where refraction obeys Snell’s law and reflection obeys Fresnel equations. If you choose a ground finish, surface roughness smears the apparent surface normal, which leads to spread in the refracted direction.
In many detector simulations, a thin coupling layer, such as optical grease, is placed between a scintillator and a photodetector window. You model this by defining separate materials, each with its own RINDEX, and by placing the volumes in contact. Geant4 then handles refraction at both interfaces, for example scintillator to grease, and grease to window, so the photon direction changes according to each step in refractive index.
The probability that a photon passes through a boundary instead of being reflected depends on the mismatch between the refractive indices and the incidence angle. A large mismatch, for example between a high index scintillator and air, increases reflection. Introducing an intermediate material with a refractive index between those of the two main media can reduce reflections and increase transmission.
Like reflection, refraction is influenced by photon energy. Because RINDEX is energy dependent, a single boundary can refract different wavelengths by different amounts. Geant4 tracks each photon with its own energy, so dispersion effects appear automatically if your RINDEX tables include realistic energy dependence.
In practice, correct refraction is essential for realistic modeling of light transport in detectors. The shape of volumes, the indices of materials, and the presence or absence of explicit optical surfaces all affect how light is guided or lost. By focusing on correct RINDEX definitions and using dielectric_dielectric surfaces only where needed, you can obtain a good balance between realism and simplicity in your optical photon simulations.
Views: 11
KAHIBARO