Optical photons transmit with TRANSMISSION = 0 and REFLECTIVITY = 1?

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

The issue is the confusing terminology. Neither TRANSMISSION nor REFLECTIVITY mean what one might think they do.

One of 3 things might happen to the photon at the boundary.

  1. It is absorbed.
  2. It passes through the boundary unchanged (same direction, energy)
  3. It interacts according to Snell’s law.

The probability of the photon being absorbed is 1-REFLECTIVITY. The probability of passing through the boundary unchanged is TRANSMISSION.

In your case, with TRANSMISSION=0 and REFLECTIVITY=1, all the photons interact according to Snell’s law. Some undergo total internal reflection and some undergo Fresnel refraction.

I think, if you want a perfectly diffuse and opaque reflector, you want a dielectric_metal surface (maybe this relates to your other question).

Hi dsawkey, thank you for your reply. I think I understand the processes you’ve outlined better now. It makes sense that the application of Snell’s law would yield refraction :stuck_out_tongue:

After considering your suggestion to change the surface type, I realized what I’m looking for is actually dielectric_dielectric and groundfrontpainted. As per the UNIFIED model flow chart, this surface type does what I’m looking for. It is basically like using ground with a dielectric_metal interface but employs Lambertian reflection instead of spike reflection. And no refraction! :slight_smile:

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.