Reflectivity of "dielectric_dielectric" range

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.

Hi @dsawkey,

I was investigating what effect the reflectivity and transmittance values have on a dielectric_dielectric surface. And specifically what happens at the limits of each; as in at reflectivity = 1, does the surface become mirror like.

From the discussion here it seems as though the dielectric_dielectric surface type will follow the Fresnel equations and/or will cause absorption of the incident photon. Is it correct to assume that there is no way to generate a mirror like surface when using the dielectric_dielectric surface? Is a mirror like surface only possible when using a dielectric_metal surface type? Please correct me if I am wrong.

Thank you so much for all of your help time and consideration.

-Frank

No, it depends on the surface finish. A dielectric_dielectric surface with polishedfrontpainted finish is equivalent to a dielectric_metal surface, according to the diagram in the Book for Application Developers. A dielectric_dielectric surface with polished surface can’t be made to reflect with REFLECTIVITY.