Reflectivity of "dielectric_dielectric" range

Hi All,

Per discussions on this forum, available literature, and some simple tests with my build (10.06.p03), I have the following question:

Upon setting the reflectivity value, which I understand to be 1-absorption coefficient for a ground dielectric_dielectric logical border surface, I have found that if it is set to 1.0, and optical photons are sent toward the surface they will occasionally reflect, sometimes not at all if the in-going material (where the photon is headed) is not a traditional reflector material (e.g. paper). However if I set the reflectivity to 0.99, the photon will reflect every time, regardless of material used. My expectation here is that the absorption coefficient should be = 0, and thus the photon should not be absorbed/transmitted. However, at the other end, reflectivity set to 0.0 or 0.01, the photon will transmit/refract every time, which would correlate to the absorption coefficient = 1 (0.99).

By comparison, if I use a dielectric_metal setting, the photon will reflect every time, regardless if the reflectivity is set at 1.0 or 0.99, and the material used. And it will also transmit/refract each time regardless of the reflectivity value (0.0 or 0.01) and material used. I understand from the literature that the dielectric_metal setting will allow only for reflection or absorption, with the reflection probability determined by the reflectivity value, which in my case there is a good correlation between what I observe and the values used.

Is there an upper limit to the reflectivity value which can be used when using a dielectric_dielectric setting? Again, my expectation is that when setting reflectivity to 1, the absorption coefficient should be = 0; 1 = 1 - abs, abs = 1-1 = 0.

I noticed this question was raised previously (Cannot get dielectric/dielectric interface to reflect optical photons), but I did not see a follow-up/resolution and so I decided to ask again. In my case as well, both materials have RINDEX defined (out_n = 1, in_n = 2.27).

Thank you all for your time and consideration.

-Frank

Hi Frank,

As far as I can tell, the REFLECTIVITY can be between 0 and 1. I tried assigning a REFLECTIVITY of greater than 1 and it produced the same result as a REFLECTIVITY of 1. (I haven’t looked at the distribution code, but I am guessing that the parameter value is tested for max and min value and set to those limits if exceeded.)

For a dielectric/metal boundary, REFLECTIVITY for G4LogicalBorderSurface behaves as the parameter’s name implies. Optical photons are reflected with a probability set by the REFLECTIVITY value. The Fresnel equations are not used and non reflected photons are absorbed.

For a dielectric/dielectric boundary, the results are different. Optical photons are absorbed with a probability of 1-REFLECTIVITY. The remaining photons are then governed by the Fresnel equations and reflect or refract accordingly. As Erik Dietz-Laursonn states (‘Peculiarities in the Simulation of Optical Physics with Geant4’, arXiv:1612.05162v1 2016), “…the REFLECTIVITY variable simulates something like absorbing dirt on the surface. To specify the reflectivity of a surface between two dielectrics, the TRANSMITTANCE variable has to be used, where the reflectivity R derives from the transmittance T by R = 100 % - T”.

Hi,

Thank you so much for your quick response. And thank you for also pointing me in the direction of the article by Dietz-Laursonn.

In my tests, I have set the reflectivity as described in the references and what you have described here; for the dielectric_dielectric setting, having R = 1 - T, where R and T are reflectivity and transmittance respectively.

I am still a bit perplexed with regards to the behavior of the optical photons at a dielectric_dielectric setting, when setting R = 1 vs R = 0.99. My thought is that maybe the range of allowed values is (0, 1) (exclusive 0 and 1) and not [0,1] (inclusive of 0 and 1).

In your assignment of R > 1, was this for a dielectric_dielectric or dielectric_metal setting?

Thank you again for your time and consideration.

-Frank

Hi,
I have been looking at the source code of the Geant4 v11 optical processes and I do not yet see an explanation for your R=1 vs R=0.99 problem. Maybe someone more familiar with the optical process code might have a look at it to see. (Given my familiarity with it, that’s a pretty low bar.)

If memory serves me correctly, when I tried R>1, it was only for a dielectric/dielectric boundary surface, since only those types of surfaces were causing me problems for my particular study. I will try to dig up the results, but they were done more than two years ago with Geant4 10.5.1.

I could not find my earlier G4 10.5.1 runs with REFLECTIVITY>1, so I ran a small example using OpNovice2 (G4 v11.0.0) to check the limits on the REFLECTIVITY and TRANSMITTANCE parameter values. It confirms what I had recalled, namely that if the parameter values are <0, the optical photons behave as though the values are 0. If the values are >1, they behave as though they are 1.

I have not been able to duplicate your R=1 vs R=0.99 problem so far. Could you provide more details about the material properties and photon wavelengths that you are using to generate the discrepancies.

Hi,

Thank you so much for all of the effort you have put in to help me with this.

In my material definition script I have:

#include "Material.hh"
#include "G4SystemOfUnits.hh"
#include "G4PhysicalConstants.hh"
using namespace std;

Material* Material::me =0;

Material::Material() {
  //    my material 
  DefineMaterials();
  DefineBoundaries();
  DefineProperties();
  SetMaterialIndexes();
}

Material::~Material(){}

Material* Material::Get() {
  if (!me)
    me = new Material();

  return me;
}

void Material::DefineMaterials() {

  G4String  name,
            symbol;
  G4int     z,
            ncomponents,
            natoms;
  G4double  a,
            density,
            fractionmass,
            temperature,
            pressure;



  G4Element* H  = new G4Element(name="Hydrogen",  symbol="H" , z=1,  a=1.00794*g/mole );
  G4Element* C  = new G4Element(name="Carbon",    symbol="C",  z=6,  a=12.0107*g/mole );
  G4Element* O  = new G4Element(name="Oxygen",    symbol="O",  z=8,  a=15.9994*g/mole );
  G4Element* N  = new G4Element(name="Nitrogen",  symbol="N",  z=7,  a=14.00067*g/mole);
  
...

//Paper (Cellulose C6H10O5)
  density=0.8*g/cm3;
  fPaper = new G4Material(name="Paper",density,ncomponents=3,kStateSolid);
  fPaper->AddElement(C,45*perCent);
  fPaper->AddElement(H,6*perCent);
  fPaper->AddElement(O,49*perCent);

// Vacuum
  density = 1.29e-20*g/cm3;
  fVacuum = new G4Material(name="Vacuum", density, ncomponents=2);
  fVacuum->AddElement(N, fractionmass=0.7);
  fVacuum->AddElement(O, fractionmass=0.3);

...

}

void Material::DefineProperties() {

//---------------------------------------------------------------------------------
// Vacuum
//---------------------------------------------------------------------------------

  G4MaterialPropertiesTable *myVacuum = new G4MaterialPropertiesTable();
  G4double  myVacuumRI[2], myVacuumAbs[2];
  myVacuumAbs[0] = 1*km;
  myVacuumAbs[1] = 1*km;
  myVacuumRI[0] = 1 ; 
  myVacuumRI[1] = 1 ; 
  G4double myVacuumEne[2] = {0.1*eV , 20*eV} ;  
  
  myVacuum->AddProperty("RINDEX",   myVacuumEne , myVacuumRI,  2);
  myVacuum->AddProperty("ABSLENGTH", myVacuumEne, myVacuumAbs, 2);
  fVacuum->SetMaterialPropertiesTable(myVacuum);

...

//---------------------------------------------------------------------------------
// Paper (Frank 6 December 2021)
//---------------------------------------------------------------------------------

  G4MaterialPropertiesTable *myPaper = new G4MaterialPropertiesTable();
  G4double  myPaperRI[2], myPaperAbs[2];
  myPaperAbs[0] = 1*mm;
  myPaperAbs[1] = 1*mm;
  myPaperRI[0] = 2.27 ; 
  myPaperRI[1] = 2.27 ; 
  G4double myPaperEne[2] = {0.1*eV , 20*eV} ;  
  
  myPaper->AddProperty("RINDEX",   myPaperEne , myPaperRI,  2);
  myPaper->AddProperty("ABSLENGTH", myPaperEne, myPaperAbs, 2);
  fPaper->SetMaterialPropertiesTable(myPaper);

...

}

And then in my detector construction file I have:

#include "DetectorConstruction.hh"
#include "Material.hh"
#include "IO.hh"
#include "Storage.hh"

#include "G4RunManager.hh"
#include "G4NistManager.hh"
#include "G4Box.hh"
#include "G4Tubs.hh"
#include "G4Polyhedra.hh"
#include "G4Transform3D.hh"
#include "G4Cons.hh"
#include "G4VisAttributes.hh"
#include "G4Colour.hh"
#include "G4Orb.hh"
#include "G4Sphere.hh"
#include "G4Trd.hh"
#include "G4LogicalVolume.hh"
#include "G4PVPlacement.hh"
#include "G4SystemOfUnits.hh"
#include "G4OpticalSurface.hh"
#include "G4MaterialPropertiesTable.hh" 
#include "G4LogicalBorderSurface.hh" 



#include "G4Element.hh"
#include "G4LogicalSkinSurface.hh"
#include "G4Material.hh"
#include "G4ThreeVector.hh"
#include "G4VSolid.hh"
#include "G4BooleanSolid.hh"
#include "G4SubtractionSolid.hh"
#include "G4ExtrudedSolid.hh"
#include "G4RotationMatrix.hh"
#include "G4ReflectedSolid.hh"
#include "G4ReflectionFactory.hh"
#include "G4Transform3D.hh"
#include <vector>

DetectorConstruction::DetectorConstruction()
: G4VUserDetectorConstruction()
{ }

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

DetectorConstruction::~DetectorConstruction()
{ }

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

G4VPhysicalVolume* DetectorConstruction::Construct()
{  

...
//---------------------------------------------------------------------------------
// World
//---------------------------------------------------------------------------------
fSolidWorld = new G4Box("World_Solid", 2.*meter, 2.*meter, 2.*meter);
fLogicWorld = new G4LogicalVolume(fSolidWorld, Material::Get()->GetVacuum(), "World_Logic");
fPhysicWorld = new G4PVPlacement(0, 
                                  G4ThreeVector(0,0,0),
                                  "World",
                                  fLogicWorld,
                                  NULL,
                                  false,
                                  0);



//---------------------------------------------------------------------------------
// Reflecting Material
//---------------------------------------------------------------------------------

 fSolidReflector  = new G4Tubs("SolidReflector", innerRadius, 12.5*mm, motref_h, startAngle, spanningAngle) ;
 fLogicReflector  = new G4LogicalVolume(fSolidReflector, Material::Get()->GetPaper() , "LogicReflector");
 fPhysicReflector = new G4PVPlacement(yRot,
                                 G4ThreeVector(motref_x, 0.*cm, 0.*cm), 
                                "ReflectorLayer",
                                fLogicReflector,
                                fPhysicWorld,
                                false,
                                0,
                                myCheckOverlap);
  fLogicReflector->SetVisAttributes( G4VisAttributes(myGreen) );;

...

DefineSurfaces();

 
  
  return fPhysicWorld;
}

void DetectorConstruction::DefineSurfaces(){

G4double energy[2] = {3.1*eV, 1.55*eV};
G4double ref[2] = {0.01,0.01};
G4double tran[2] = {0.99,0.99};
G4double ref_refl[2] = {0.9, 0.9}; 
G4double tran_refl[2] = {0.1, 0.1};

//---------------------------------------------------------------------------------
  // Reflector-Vacuum surface
  //---------------------------------------------------------------------------------

  G4OpticalSurface *fOpReflectorAirSurface = new G4OpticalSurface("OpAirReflectorSurface", glisur, ground, dielectric_dielectric, 0.0);
  new G4LogicalBorderSurface("ReflectorAirSurface", fPhysicReflector, fPhysicWorld, fOpReflectorAirSurface);

  G4MaterialPropertiesTable *fReflectorAirSurfProp = new G4MaterialPropertiesTable();
  fReflectorAirSurfProp->AddProperty("REFLECTIVITY", energy, ref, 2);
  fReflectorAirSurfProp->AddProperty("TRANSMITTANCE", energy, tran, 2);
  fOpReflectorAirSurface->SetMaterialPropertiesTable( fReflectorAirSurfProp );


//---------------------------------------------------------------------------------
// Vacuum-Reflector surface
//---------------------------------------------------------------------------------

  G4OpticalSurface *fOpAirReflectorSurface = new     G4OpticalSurface("OpAirReflectorSurface", glisur, ground, dielectric_dielectric, 0.0);
  new G4LogicalBorderSurface("AirReflectorSurface", fPhysicWorld, fPhysicReflector, fOpAirReflectorSurface);

  G4MaterialPropertiesTable *fAirReflectorSurfProp = new G4MaterialPropertiesTable();
  fAirReflectorSurfProp->AddProperty("REFLECTIVITY", energy, ref_refl, 2);
  fAirReflectorSurfProp->AddProperty("TRANSMITTANCE", energy, tran_refl, 2);
  fOpAirReflectorSurface->SetMaterialPropertiesTable( fAirReflectorSurfProp );

...

}

The optical photons I use are 3 eV (413.3 nm).

Here is a sample of what the pre and post Step points look like at the 0.99 and 1 REFLECTIVITY settings (TRANSMITTANCE is set as 1-REFLECTIVITY).

For REFLECTIVITY = 1.0, starting in the scintillator and heading perpendicular to the surface of the reflecting material (angle of incidence = 0)

Step pre point: (399.3,0,0)
Material Index: YAP
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

Step post point: (398.3,0,0)
Material Index: YAP
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

Step pre point: (398.3,0,0)
Material Index: Paper
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

Step post point: (398.2,0.0064505,-0.000318219)
Material Index: Paper
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

Step pre point: (398.2,0.0064505,-0.000318219)
Material Index: Vacuum
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

Step post point: (-2000,154.702,-7.63186)
Material Index: Vacuum
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

and for REFLECTIVITY = 0.99, other conditions the same as above:

Step pre point: (399.3,0,0)
Material Index: YAP
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

Step post point: (398.3,0,0)
Material Index: YAP
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

Step pre point: (398.3,0,0)
Material Index: Paper
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

Step post point: (398.3,0,0)
Material Index: Paper
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

Step pre point: (398.3,0,0)
Material Index: YAP
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

Step post point: (400.3,0.971597,-0.186861)
Material Index: YAP
PDG = 0
TrackID: 1
PID:0
E: 3 eV; 

I have also tried using the “unified” setting vs “glider” and obtain the same result.

Thank you so much again for all of your time and consideration. Please let me know if there is anything else you would like to see.

Hi Frank,
One potential problem that I noticed is that in your surface properties definition, you define the energy vector with elements decreasing in energy:
G4double energy[2] = {3.1eV, 1.55eV};
Since your reflectivity and transmittance vectors have constant values, one would think that this should not matter. And maybe it doesn’t, but I recall reading somewhere (I cannot remember where) that the energy values should have increasing values. It is an easy fix, so it is probably worth a try.

I found a recent Forum reference (Feb 2022) about the requirement for increasing element values in the energy vector: G4PhysicsFreeVector Reversed Order vs G4PhysicsOrderedFreeVector

I am sure that I also read about this quite a while ago, but I cannot find a reference to it in the official documentation.
John

Thank you again for your quick responses.

I have fixed the order of the energy values, and have tried also using only the TRANSMITTANCE variable to set the reflectivity as discussed above and in Dietz-Laursonn paper, to no avail in either and both cases.

Setting just TRANSMITTANCE to 0.01 still does return the desired behavior.

The Geant4 terminology makes these parameters hard to understand. Don’t think of the material properties TRANSMITTANCE and REFLECTIVITY as equivalent to whether the photon is transmitted or reflected!

For a dielectric-dielectric surface, the photon may interact in one of three ways:

  1. it may be absorbed;
  2. it may continue to propagate as if the surface wasn’t there;
  3. it may follow Fresnel’s equations (could go forward or backward)

We’re going to choose what happens by specifying two parameters P1 and P2 and choosing a random number R, where 0 < R < 1 [Note 1]

Now,

  1. if R > (P1+P2) choose option 1
  2. else if R > P1 [i.e. P1 <= R <= (P1+P2) ] choose option 2
  3. else [ i.e. R <= P1] choose option 3

It only makes sense to choose P1 and P2 between (and including) 0 and 1. And there is no relation between P1 and P2 (except P1+P2 > 1 is equivalent to P1+P2 = 1, because the largest R can be is 1).

I would suggest, when starting out, you’ll want option 3 always. The photon follow’s Fresnel equations. So, set P1 = 1 and P2 = 0 (verify it in the expressions above). Once you’re satisfied that that works, you can try to model some impurities by adjusting P1 and P2 accordingly.

Now the confusing part. Specify P1 with the material property name REFLECTIVITY and P2 with the material property name TRANSMITTANCE.

The code is here:
https://geant4.kek.jp/lxr/source/processes/optical/src/G4OpBoundaryProcess.cc?v=11.0#L435

Try it with extended example OpNovice2 and macro boundary.mac (modify as needed). You’ll see that it works.

[Note 1] I don’t know whether R can equal 0 or 1, but it doesn’t matter for this. because it could only happen with vanishingly small probability.

Hi @dsawkey ,

Thank you so much for your reply. I have a couple of questions still.

To check my understanding of what you replied; some specific scenarios (with ref = reflectivity value and trans = transmittance value):

If ref = 1 and trans = 0, R = 1, the third option will be used, where the photon will obey the Fresnel equations.
if ref = 0 and R > trans, either option 1 or 2 will be selected, the photon is either absorbed or transmitted

Please correct me if I misunderstood.

I went through “G4OpBoundaryProcess.cc” and found the algorithm you described, the choice of which option based on the comparison of a random number to the reflectivity and transmittance value, being used for a finish of either polishedbackpainted or groundbackpainted (lines 1164-1189). On lines 1078-1122, I notice an algorithm for performing reflection, based off the comparison to G4BooleanRand function taking the transmission coefficient as its argument, which would correlate to comments made about reflection with dielectric dielectric surfaces in the Dietz-Laursonn paper. I am sorry for being obtuse, I am sure I am missing what you would like me to see. If possible could you point me in the right direction?

Also, I have built OpNovice2, but do not have a macro called “boundary.mac” is this located elsewhere, as in another example? I searched my geant4 source files and did not find any macro with that name.

Thank you so much for your help and time, it is greatly appreciated.

boundary.mac is in the OpNovice2 example folder for at least Geant4 10.7.2 and forward. What version are you using?

Option 3 for any R, but see below.

In this case R > ref + trans, so option 1.

You’re right, the transmission coefficient appears in code for what I called option 3. In truth, I don’t know what non-zero TRANSMITTIVITY is supposed to simulate. What do you want it to do?

Thank you Daren, for providing a clear explanation of what REFLECTIVITY and TRANSMITTANCE are. I’ve been beating my brains out for some time trying to figure out the rigorous connection with surface reflection and transmission. I could never understand why, if you provided a REFLECTIVITY, that a TRANSMITTANCE value was not automatically evaluated from it. The key, as you pointed out, is recognizing that they are not related and are not really reflectance or transmissivity.

I had read the explanation in the Application Developers Book under the UNIFIED model (Section 5.2 last paragraph of page 255 of the 11.0 release PDF file) which says a similar thing but without that key idea!

One related question. Where does one go to point out errors in the documentation? In the reference just mentioned, the Book refers to the material property “TRANSMISSION” in a few places, where I think “TRANSMITTANCE” is meant.

To Bugzilla, the same as for code bugs. Choose the Documentation category.

Hi @dsawkey and @John_McFee ,

I am currently using 10.06.p03 . I have downloaded 11.0.1 and have run the OpNovice2 example with the boundary.mac macro, altering the reflectivity and transmittance values, but am unfortunately still confused.

I apologize for being so obtuse, all in all, is it correct to assume that when reflectivity = 1.0, that the expectation is that this does not correlate to a perfectly reflecting surface, but instead that it opens the possibility for reflection (and also for transmission) through the Fresnel equations? And furthermore, that the only other two possibilities are either absorption or transmission (options 1 and 2 respectively) without a possibility of reflection? Is option 3, the only chance of having reflection at all?

Thank you both so much for your help. I really can’t stress how much I appreciate it.

-Frank

Thank you, Michael. I will file a bug report.

John

Hi Frank,

is it correct to assume that when reflectivity = 1.0, that the expectation is that this does not correlate to a perfectly reflecting surface, but instead that it opens the possibility for reflection (and also for transmission) through the Fresnel equations?

Assuming reflectivity (r) and transmittance (t) are each restricted to the range of [0,1] and that we are dealing with a dielectric/dielectric boundary in what follows, if r=1 then the Fresnel equations apply. I am not sure what you mean by a perfect reflector, but following the Fresnel equations does not imply that the surface is or is not a perfect reflector. (E.g., A glass/air interface with photons approaching from the glass side reflects ~4% of the light at a normal angle of incidence, but can reflect 100% if the angle of incidence is beyond the critical angle.)

Let t=0 for the moment. If r<1, say r=0.8, then according to the code’s logic, for an incident optical photon 20% of the time the generated random number R>(r+t) and the photon is absorbed. So the surface behaves like a dirty (absorbing) layer with absorption coefficient of 0.2 (i.e., 1-r).

Now let t be non-zero, say t=0.1. Then r+t=0.9. So R>(r+t)=0.9 10% of the time and an incident photon is thus absorbed 10% of the time. Likewise r<R<(r+t) 10% of the time and the photon gets transmitted as though the surface does not exist 10% of the time. (I am not sure what this is supposed to physically model.) The remaining 80% of the time, Fresnel equations apply to the photon refraction or reflection.

I have tried these examples in OpNovice2 and the results agree with the above arguments (within statistics).

So reflections will only occur for the Fresnel “option”. However, all this only applies to a dielectric/dielectric boundary. A dielectric/metal boundary supports reflection as if the surface were a perfect mirror. The REFLECTIVITY parameter acts as the name implies.

Hi @John_McFee ,

To make sure I understand, when using a dielectric_dielectric surface type, some combination of absorption/transmission and the Fresnel equations will govern the behavior of the photon at the interface, with the Fresnel equations solely governing at r = 1, t = 0. Thus the photon will only reflect if the conditions are right (critical angle for TIR, etc.). Aside from total internal reflection, there is no scenario (combination of r and t) which will cause the photon to always reflect, this is what I referred to as my “perfect reflector”.
Whereas the use of a dielectric_metal surface type will allow for a mirror like interface for the photon, where the photon will either be absorbed or reflect, no refraction possible, and the ability for it to reflect will depend on the reflectivity setting.

Please correct me if I am wrong.

Thank you all again so much.

-Frank

Are you trying to make something like a half-silvered mirror, where some particles reflect as from a mirror and others propagate through a dielectric? In this case my understanding is that there are a couple of options.

  1. Use one of the “painted” dielectric-dielectric finishes
  2. Use a dielectric-metal surface and add another volume (i.e. G4PhysicalVolume) as the dielectric behind

In both cases specify the transmission as desired.