by Scott Prahl
April 2024
Inverse Adding-Doubling is a command-line program that determines the intrinsic optical properties of a flat scattering and absoption sample using measurements of the total reflection and transmission. Basically, optical properties are repeatedly guessed until the calculated reflection and transmission match the measured values. The program accounts for realistic measurement constraints associated with integrating sphere effects.
This package provides two executables ad
and iad
. The first does a forward adding-doubling calculation (i.e., given the albedo, optical thickness, and anisotropy it returns the total reflection and transmission). The second does the reverse.
This program Prahl et al., Applied Optics, 32, 559-568, 1993 uses the Adding-Doubling method of van de Hulst Multiple Light Scattering, Academic Press, 1978. I extended the Adding-Doubling method to account for Fresnel reflection at boundaries as well as corrections that must accompany integrating sphere experiments.
Finally, integrating spheres do not always collect all the light that exits from the front or back surface of a sample. Since this is impossible to account for the 1D adding-doubling technique, a Monte Carlo simulation is embedded in the inverse calculation.
Details about using the program are documented in the accompanying manual.
Obtaining executables from source entails unzipping and running make
(See
INSTALL.md for more details.) Windows executables are available
in the iad-win-3-16-2.zip
releases.
To find the optical properties of a 1mm thick sample with 40% total reflectance and 10% total transmission
./iad -r 0.4 -t 0.1 -d 1
which will generate output that ends with
# Measured M_R Measured M_T Estimated Estimated Estimated
##wave M_R fit M_T fit mu_a mu_s' g
# [nm] [---] [---] [---] [---] 1/mm 1/mm [---]
1 0.4000 0.4000 0.1000 0.0999 0.4673 3.9317 0.0000 *
The process can be reversed by doing a forward calculation with the -z
option. Here -A 0.4673
sets the absorption coefficient, and -j 3.9317
sets the reduced scattering coefficient). Specifying the thickness -d 1
is necessary because the default
thickness is infinite.
./iad -z -A 0.4673 -j 3.9317 -d 1
produces output that ends with
# Measured M_R Measured M_T Estimated Estimated Estimated
##wave M_R fit M_T fit mu_a mu_s' g
# [nm] [---] [---] [---] [---] 1/mm 1/mm [---]
0 0.0000 0.4000 0.0000 0.0999 0.4673 3.9317 0.0000 *
For Windows, there are executable binaries
ad.exe
andiad.exe
compiled using MinGW-w64. These apps can be run using theCommand Prompt
applicationcmd.exe
. These binaries are packaged in the separateiad-win
distributions on github or omlc.
Often one wants the optical properties over an entire spectrum. A good example was recently provide by @anishabahl. This measurement was made with a spectrophotometer equipped with a dual beam integrating sphere. The input data looks includes the total reflection and transmission as well a header that describes the experiment. The reflection and transmission data look like this
The input file is processed with
iad -X -i 8 -g 0.9 phantom-with-no-slides.rxt
The option i 8
indicates that light is incident on the sample at an angle of 8°, -X
indicates that a sphere with dual beams was used, and -g 0.9
indicates the default
scattering anisotropy. Note that in the PDMS file, the refractive index of the
sample changes with each data point
This command will produce an output file that when plotted looks like
which matches the intrinsic absorption of Wacker PDMS found in Cai's 2008 Disseration
This is an excellent set of measurements because there is almost no influence of the absorption coefficient on the scattering coefficient.
As of March 2024, there is now a python command-line script iadplus
that will analyze an .rxt
input file and graph the results. Everything is assembled into a Jupyter notebook for convenience. You may need to install some python modules to be able to use iadplus
iadplus -options '-i 8 -X ' file.rxt
will run iad
and produce file-notebook/file.ipynb
along with a bunch of .svg
files used in the Jupyter notebook file.ipynb
Scott Prahl