manoharan-lab / holopy

Hologram processing and light scattering in python
GNU General Public License v3.0
131 stars 50 forks source link

Absorption cross section physical check #408

Closed golovart closed 2 years ago

golovart commented 2 years ago

I was performing a cross-check of the results generated by HoloPy and experimental plots, and I encountered some mismatch or misunderstanding. For this test, I took Ag nano-spheres (refraction indices from https://refractiveindex.info/ Wu et al. 2014) to compare with a plot reported in the paper [1]

The sample code and comparing plots are below.

A preparation step, interpolating refractive index data

import matplotlib.pyplot as plt
import holopy as hp
from holopy.scattering import Scatterer, Sphere, calc_cross_sections
from holopy.scattering.theory import Mie
import numpy as np
import scipy as sp
from scipy import interpolate

Ag_n = np.loadtxt('Ag_wu14.txt')
lamb_min = Ag_n[0,0]; lamb_max = Ag_n[-1,0]
m_ag = {}
m_ag['R'] = sp.interpolate.interp1d(Ag_n[:,0], Ag_n[:,1], kind='cubic')
m_ag['I'] = sp.interpolate.interp1d(Ag_n[:,0], Ag_n[:,2], kind='cubic')

Then I use Mie theory (for simplicity) to obtain cross sections for Ag spheres in water (as mentioned in the experimental setup in [1]):

cabs_sph = {} ### a dictionary to store absorption cross sections
for d in [20,50,100,200]:
    mie_xsec = Mie()
    cabs_sph[str(d)] = []
    ### iteration over different wavelengths
    for lam in np.linspace(0.29,0.7,200):
        s_a = Sphere(n = m_ag['R'](lam)+1j*m_ag['I'](lam), r = d/2*1e-3, center = (0,0,0))
        xsec = calc_cross_sections(s_a, medium_index=1.33, illum_wavelen=lam, illum_polarization=(1,0), theory=mie_xsec)
        cabs_sph[str(d)].append(xsec[1])

and simply plotting the result:

plt.figure(figsize=(10,7))
for d in [20,50,100,200]:
    plt.plot(np.linspace(0.29,0.7,200)[10:]*1000, cabs_sph[str(d)][10:], label=str(d)+'nm', linewidth=2.5)
plt.legend()
plt.xlabel('lambda, nm')
plt.grid()
plt.title('Cabs, Ag in water')
plt.show()
cabs_ag_holopy

However, in [1] the plot for Absorbance (should be equivalent to absorption cross section multiplied by concentration and optical path, so basically proportional to a fixed constant, similar to all samples if the concentration is the same) behaves differently.

absorbance_article

Looks like in HoloPy simulation for larger spheres (100 and 200 nm), the higher multipole peaks are significantly higher than the main peak (that is expected around 500nm wavelength). And in general, secondary peaks at lower wavelengths are anomalously high.

I would be very grateful for your help in understanding this issue. Maybe there is a flaw in my physics intuition, or perhaps the absorption cross section is not to be compared with absorbance. Could you please suggest the relevant physical cross-check or hints for these anomalies?

[1] Hlaing, May, et al. "Absorption and scattering cross-section extinction values of silver nanoparticles." Optical Materials 58 (2016): 439-444. https://doi.org/10.1016/j.optmat.2016.06.013

vnmanoharan commented 2 years ago

It has been a while since I looked at calculating extinction for metal nanoparticles using HoloPy, but as I recall we have not gotten reliable values in the past. I think the underlying reason is that we must truncate the expansion for the Mie coefficients at some order, and that truncation order is not well tuned for metals.

golovart commented 2 years ago

But this behaviour persists even when cross sections are calculated by ADDA (it's not directly implemented in HoloPy, but ADDA does the absorption and extinction cross sections by default).

cabs_adda

I guess, it might be more of a physics question, whether I am comparing the same things. Not sure if this is the correct place to ask, but I would be grateful for hints on what/how should be compared to some experimental values for metallic particles.

vnmanoharan commented 2 years ago

I don't have access to reference [1] above, but if these are experimental measurements, you may want to check that they are actually measuring the absorbance and not the extinction. It is unfortunately too common to plot data from transmission measurements using the term "absorbance" when in fact both absorption and scattering are occurring.

golovart commented 2 years ago

That indeed was the case, thank you so much for this hint! Extinction behaves as expected.

cext_ag_mie