Hi all, I’ve got a question about transmitting and reflecting opticalphotons
. I’ve encountered a problem that I just cannot figure out, namely that optical photons are transmitted when TRANSMISSION = 0 and REFLECTIVITY = 1. I’m running Geant4 version 10.07.p02.
The setup is this: a 2cm x 2cm x 2cm cube of cerium bromide (index of refraction n = 2.09). Surrounding this is a 1mm thick shell of teflon, (n = 1.38). There is a 10 µm gap of vacuum (low-density hydrogen) between the two.
Because the refractive index of CeBr3 is so high, many photons totally internally reflect. That’s fine. However, I am attempting to model the teflon as a perfectly diffuse and opaque reflector as a starting point. I know that there are lookup tables of teflon material properties, but I am wary of using these given the results in Figure 3 of this paper: arXiv:1612.05162v1. In any event, I should be able to model the teflon without LUTs and have it work.
I configure the teflon material properties to have the above index of refraction, reflectivity of 1 and transmission of 0 for opticalphotons
in the energy range of [0.1 eV, 100 eV]. I then create a G4OpticalSurface
surface, make a new G4MaterialPropertiesTable
, set its refractive indices, transmissions, and reflectivities, and apply a G4LogicalSkinSurface
to the teflon shell. See the function below for the implementation; the function accepts the teflon logical volume as an argument, lv
. I leave the SPECULARLOBECONSTANT
, SPECULARSPIKECONSTANT
, and BACKSCATTERCONSTANT
undefined so that the surface always employs LambertainReflection
.
void attachTeflonOpticalSurf(G4LogicalVolume* lv)
{
static G4OpticalSurface* ts = nullptr;
if (ts == nullptr) {
ts = new G4OpticalSurface("teflon_optical_surf");
ts->SetType(dielectric_dielectric);
ts->SetModel(unified);
ts->SetFinish(polished);
ts->SetSigmaAlpha(0.);
auto* tsPt = new G4MaterialPropertiesTable;
tsPt->AddProperty(
OptDebugMaterials::kREFLECTIVITY,
OptDebugMaterials::TEFLON_REFR_IDX_ENERGIES,
OptDebugMaterials::TEFLON_REFLECTIVITY);
tsPt->AddProperty(
OptDebugMaterials::kREFR_IDX,
OptDebugMaterials::TEFLON_REFR_IDX_ENERGIES,
OptDebugMaterials::TEFLON_REFR_IDXS);
tsPt->AddProperty(
OptDebugMaterials::kTRANSMITTANCE,
OptDebugMaterials::TEFLON_REFR_IDX_ENERGIES,
OptDebugMaterials::TEFLON_TRANSMITTANCE);
ts->SetMaterialPropertiesTable(tsPt);
ts->GetMaterialPropertiesTable()->DumpTable();
}
(void) new G4LogicalSkinSurface("teflon_skin_surf", lv, ts);
}
The constants used above are defined as follows in a separate header:
namespace OptDebugMaterials {
static const G4String kNIST_TEFLON = "G4_TEFLON";
// to be better filled in once precise teflon type is known
static const std::vector<G4double> TEFLON_REFR_IDX_ENERGIES = {
0.1*eV, 100*eV
};
static const std::vector<G4double> TEFLON_REFR_IDXS = {
1.38, 1.38
};
// 23 February 2022
// Teflon reflects ~97% of UV light so just make it 1 for simplicity.
static const std::vector<G4double> TEFLON_REFLECTIVITY = {
1., 1.
};
static const std::vector<G4double> TEFLON_TRANSMITTANCE = {
0., 0.
};
}
Photons still escape the surface of the cube. Here an opticalphoton
is launched from (0, 0, 0), propagates towards the surface closer to us, reflects, and then refracts out of the surface further from us.
I am perplexed. This happens when the finish is ground
or polished
using the UNIFIED model. I hope I am just missing something simple. Something else to know: the boundary process occurring when photons escape is FresnelRefraction
, which I am printing from within a SteppingAction
method.
Thank you for your time and help. I can upload the complete example to GitHub if that would be helpful.
Kind regards,
William