Supplementary Material for: Correcting the Bias of Light Obscuration and Flow Imaging Particle Counters
Dean C. Ripple1 and Zhishang Hu2
1Biomolecular Measurement Division, National Institute of Standards and Technology, Gaithersburg, MD USA
2Center for Computational and Systems Biology, Institute of Biophysics, Chinese Academy of Sciences, Beijing, China
Overview of the procedure for bias correction of light obscuration measurements
The procedure for correcting the bias of light obscuration measurements has multiple steps, as given in detail in the Methods section of the main paper. These steps are outlined below to provide the reader with a concise summary of the complete procedure.
Procedure:
1.Experimentally determine the effective aperture of the light obscuration apparatus (this needs to be done only once)
2.Using Mie theory and the value of , calculate the extinction efficiency factor for PSL beads versus diameter, Qpsl(d) (this needs to be done only once)
3.For a given particle suspension type, measure the phase map of a selection of particles
4.Convert phase map to refractive index versus particle diameter, using Eq. 2.
5.From the refractive index versus diameter plot, identify largest diameter with nearly constant refractive index
6.For particle diameters less than the cut-off diameter dc, model the particles as homogeneous spheroids of refractive index n(dc), and use Mie or RGD theory to predict the extinction efficiency factor Q.
7.For particle diameters greater than dc, obtain Q by scaling Q(dc) according to Eq. 7.
8.Obtain a diameter scale correction using Eq. 4.
Of these steps, only steps 3 and 4 are laborious.
Behavior of RGD Scattering Theory for Large Spheres and Spheroids
The extinction efficiency factor of a sphere, for detection by scattering at angles ≥, is given by(20)
(S1
withand. As explained in the main text, the finite detector acceptance angle assures that for sufficiently large values of d, u1 for all angles from to . For , is an oscillatory function with a magnitude that scales(40) as u4. Substituting Cu4, with C a constant, for in Eq. S1, one obtains:
,(S2
which is independent of d. Thus, in the limit of large d, Q approaches a valuethat is dependent on but independent of diameter, andproportional to , or equivalently,(n)2.
For a spheroid, Eq. S1 still applies, provided that the parameter u is multiplied by a factor dependent on the aspect ratio of the spheroid and the angular orientation of the spheroid axis(38). Because this factor does not depend on the average size of the spheroid,Qapproaches a value independent of diameterin the limit of large spheroids by a similar analysis.
Figure S1. Theoretical variation with aperture angle of the ratio of indicated diameter for PMMA beads immersed in oil to the diameter of the same beads immersed in water. Beads were nominally 70 µm diameter; calculations and measurements were performed at a vacuum wavelength of 670 nm. Comparison with the experimentally measured ratio gives an empirical value for the effective aperture angle.
Figure S2. Particle counts for agitated HSA particles, as a function of diameter, with diameters transformed for each data set using silica bead calibration for FI and Mie and RGD theories with constant nfor LO. Error bars indicate standard error of the meanSEM of the counts of three different sample vials.
Figure S3. Workflow for determining particle refractive index difference Dn and effective diameter.
Sample code for RGD theory calculations of the extinction efficiency factor Q, for a light obscuration system with finite detector aperture. The code is written in Fortran 90. The function QTRAP(FUNC,A,B,TOLER,S,ERR) performs numerical integration of the function FUNC from limits A to B, to a tolerance TOLER, returning the value in S and an estimate of actual error in ERR. QTRAP, apart from slight modifications, was obtained from W. H. Press, B. P. Flannery, S. A. Teukolsky, and W. T. Vetterling, Numerical Recipes, Cambridge University Press, New York (1986), but is not included here due to copyright restrictions.
! LOModelSimple.f90
!****************************************************************************
!
! PROGRAM: LOModelSimple
program LOModelSimple
! Program finds the extinction efficiency factor, Q, for scattering from a
! homogeneous prolate spheroid, using Rayleigh-Gans-Debye theory and with a
! finite detector acceptance angle.
! Q is obtained by integrating the scattering intensity over the scattering
! angle.
!
! Reference:
! Barber PW and Wang D-S, "Rayleigh-Gans Debye applicability to scattering by
! nonspherical particles" (1978) Applied Optics 17:797-803
! Notation differs from Barber and Wang:
! Barber and Wang variable Program variable
! alpha theta0
! phi -phi0
! theta theta
! eta rmu
!
! User specifies orientation, aspect ratio, and refractive index of the
! spheroids. Program steps through a set of specified diameters and calculates
! the extinction efficiency factor.
!
! Spheroid orientation may be random, aligned with the fluid flow, or at a fixed
! angle. For fixed angle, the output value of Q is based not
! on the true projected area but instead on the projected area of a randomly
! oriented particle.
!
! Integrand within the scattering intensity integral varies over many orders of
! magnitude and has many near discontinuities. For this reason, higher
! order integral formulas are not suitable, and program uses a simple
! trapezoidal formula combined with fairly
! stringent convergence criteria (convergence needed for two calls in a row,
! and minimum number of calls).
!
! Program used in conjunction with Mie scattering results for spherical PSL
! beads to generate calibration curves for light obscuration
! apparatus.
!
! Equation validity is not built in--valid for generally small refractive index
! (<1.5 should be fine)
!
! Standard scattering theory applies, except integrals of scattering angle (to
! find Q) are from acceptance angle to pi, and not from zero.
!
! Variables:
! Although all variables are explicitly declared, some real variables begin
! with a lower case r as a reminder that
! they are real and not integers.
! Real variables
! a(42): semimajor axis of prolate spheroid (micrometers)
! b(42): semiminor axis of prolate spheroid (micrometers)
! rlambda: wavelength, entered as the vacuum wavelength, but then scaled
! to be wavelength in the fluid medium
! deltan: difference between the refractive index of the particle and the
! fluid medium
! rk: wave number (reciprocal micrometers)
! pi: constant pi
! pi2: pi/2
! rn: refractive index of the particle, scaled by dividing by the refractive
! index of the fluid medium
! theta: scattering angle (radians)
! aT,thetaT,theta0T,radiusT: temporary values of a, theta, theta0, and
! radius
! ThetaMax: maximum angle of integration, beyond which integrand is negligible
! (radians)
! Q: extinction efficiency factor
! phi0: azimuthal angle of particle axis
! Q1,Q2,Q3: components of Q for subranges of the total integration over
! theta
! ThetaMaxFr,FractionInteg: Parameters for breaking up the total range of
! integration into three pieces
! riMed: refractive index of the medium (coded as water in the visible)
! err: error in Q
! err1,err2,err3: error in Q1, Q2, and Q3
! FracError: fractional error in Q
! eps: small number used in check if particle is spherical or not
! rproj2: square of radius of sphere of same projected area as randomly
! oriented particle
! prefactor: grouped prefactor outside of integral for scattering intensity
! InitToler: absolute tolerance for error of Q integration for first call
! Qold: stored value of Q from previous calculation
! AAngle: acceptance angle of detector = minimum polar angle for light
! scattering to not impinge on obscuration detector
! radius(42): array of radius values at which calculations are performed
! rmu: reciprocal of aspect ratio (greek letter mu) of particles, rmu
! defined as a/b > 1
! toler: tolerance for integration of scattering intensity
! FracToler: fractional tolerance for integration of scattering intensity
! theta0: polar angle of major axis of spheroid
! Integer variables
! i,j: index variables in loops
! dummy: dummy index, used in data reads to skip over a value
! npts: number of points to calculate
! nradius: default number of radius values
! nradiusM: optional maximum number of radius values, to reduce calculation
! time at large radius values
!
! Character variables
! corient: parameter indicating whether particles have fixed (specified
! orientation), random (average over all angles), or aligned (axis along axis
! of fluid flow)
! orientation (f, r, or a):
! cdummy: dummy variable, used for character inputs that are not used in
!calculation
!
! Real functions
! FuncSIRGD: Scattering intensity for a prolate spheroid at fixed orientation
! FuncSIRanRGD: Scattering intensity for a prolate spheroid at random
! orientation
!****************************************************************************
implicit none
real(8) a(42),b(42),rlambda,deltan,rk,pi,rn,theta
real(8) aT,thetaT,theta0T,radiusT,ThetaMax,FuncSI,FuncSIRan,Q,phi0,Q1, Q2,Q3,ThetaMaxFr,FractionInteg
real(8) riMed,err,err1,err2,err3,FracError,eps,rproj2
real(8) FuncSIRGD,FuncSIRanRGD
real(8) prefactor,InitToler,Qold
real(8) AAngle,radius(42),rmu,toler,FracToler,theta0,pi2
integer i,j,dummy,npts,nradius,nradiusM
character*40 filenm
character corient,cdummy
external FuncSIRGD,FuncSIRanRGD
!Set up common block to have transfer values of theta, theta0, radius, all suffix T
common aT,thetaT,theta0T,radiusT,rmu,rn,rk,rlambda,phi0
data radius/0.20,0.24,0.29,0.35,0.42,0.50,0.60,0.75,0.90,1.10,1.30,1.60,1.90,2.30,2.70,3.30,3.90,4.70,5.70,6.90,8.3,10.,12.,14.,16.,18.,20.,22.,24.,26.,28.,30.,32.,34.,36.,38.,40.,42.,44.,46.,48.,50./
pi=3.14159265358979d0
pi2=pi/2.d0
eps=1.d-4
FractionInteg=10.d0
! Absolute tolerance for integral of Q, smallest radius = InitToler
InitToler=1.d-4
! Subsequent fractional tolerance on Q = FracToler; dropped down below by a
! factor of 10 for fixed orientation.
FracToler=1.d-3
! Wavelength of light in surrounding medium = rlambdamed
riMed=1.3309
write(*,*) 'Enter reciprocal of aspect ratio (>1): '
read(*,*) rmu
write(*,*) 'Enter in vacuo wavelength & absolute refractive index difference: '
read(*,*) rlambda,deltan
! Check on reasonable input value
if(deltan .gt. 1.d0) then
write(*,*) 'Enter refr. index DIFFERENCE from unity. (enter any character to continue)'
read(*,*) cdummy
stop
end if
write(*,*) 'Fixed, random, or aligned orientation (f, r, or a): '
read(*,*) corient
if (corient .eq. 'f' .or. corient .eq. 'a') FracToler=FracToler/10.d0
write(*,*) 'Enter instrument acceptance angle (rad): '
read(*,*) AAngle
write(*,*) 'Enter file name for output: '
read(*,*) filenm
open(unit=9,file=filenm)
write(9,'(A)') 'RGD theory'
nradius=42
write(9,*) 'Aspect ratio, in vacuo wavelength, abs. refr. index delta: '
write(9,'(f5.1,'', '',f6.2,'', '',f6.3)') rmu,rlambda,deltan
rlambda=rlambda/riMed
deltan=deltan/riMed
rn=1.d0+deltan
rk=2*pi/rlambda
write(9,'(A,f8.4)') 'Acceptance angle (rad): ',AAngle
if (corient .eq. 'f') then
write(9,*)'Major axis angle of spheroid: fixed'
write(9,*) 'S integrand based on prefactor with random proj. area. '
! choose theta0 = polar angle of major axis of spheroid
write(*,*) 'Enter angle of major axis of spheroid (deg.): '
read(*,*) theta0
write(9,'(A,f6.1)') 'Major axis angle of spheroid (deg.): ',theta0
! convert to rad
theta0=theta0*(pi/180.d0)
if (abs(theta0) .lt. 1.d-6) then
theta0=1.d-6
end if
elseif (corient .eq. 'a') then
write(9,*)'Major axis angle of spheroid: aligned'
write(9,*) 'S integrand based on prefactor with true proj. area. '
! spheroid aligned with flow field
theta0=90.d0
write(9,'(A,f6.1)') 'Major axis angle of spheroid (deg.): ',theta0
theta0=theta0*(pi/180.d0)
else
write(9,*)'Major axis angle of spheroid: random'
write(9,*) 'S integrand based on prefactor with true random proj. area. '
end if
write(*,*) 'Enter max. number of radii (42 max): '
read(*,*) nradiusM
nradius=min(nradiusM,nradius)
write(*,*) 'Index, eff. radius, squared proj. radius, Q, frac. error: '
write(9,*) 'eff. radius, squared proj. radius, Q, frac. error: '
! Loop over radii
do i=1,nradius
! calculate major & minor radii:
a(i)=rmu**(2.d0/3.d0)*radius(i)
b(i)=a(i)/rmu
radiusT=radius(i)
aT=a(i)
thetamax=(pi/180.d0)*min(90.,1000*rlambda/radiusT)+AAngle
! Integral done between acceptance angle and Thetamax. Integral is split into
! forward scattering subrange, & remainder out to ThetaMax,
! breaking at ThetamaxFr
ThetamaxFr=AAngle+(ThetaMax-AAngle)/FractionInteg
if ((corient .eq. 'r' .or. corient .eq. 'f') .and. rmu .gt. (1.d0+eps)) then
! rproj = radius of sphere of same proj. area as randomly oriented particle; see
! Jennings Proc. Roy Soc. A 419:137 (1988)
rproj2=(a(i)**2/(2*rmu))*(1/rmu + (rmu/sqrt(rmu**2-1))*atan(sqrt(rmu**2-1)))
else !corient .eq. 'a' or particle is a sphere
rproj2=a(i)*b(i)
endif
Prefactor=rk**4*a(i)**2*b(i)**4*((rn**2-1)**2/(rn**2+2)**2)/(pi*rproj2)
! Use last value of Q to set tolerance, unless i=1
if (i .eq. 1) then
toler=InitToler/Prefactor
else
toler=FracToler*Qold/Prefactor
end if
!Fixed particle orientation
if (corient .eq. 'f' .or. corient .eq. 'a') Then
!******************
! Integrate S integrand (FuncSIRGD)
theta0T=theta0
call QTRAP(FuncSIRGD,AAngle,ThetaMaxFr,toler,Q1,err1)
call QTRAP(FuncSIRGD,ThetaMaxFr,thetaMax,toler,Q2,err2)
call QTRAP(FuncSIRGD,ThetaMax,pi,toler,Q3,err3)
else
! Random orientation--average over all theta0 values.
! Integrate S integrand (FuncSIRanRGD) from acceptance angle to pi in three
! steps.
call QTRAP(FuncSIRanRGD,AAngle,ThetaMaxFr,toler,Q1,err1)
call QTRAP(FuncSIRanRGD,ThetaMaxFr,thetaMax,toler,Q2,err2)
call QTRAP(FuncSIRanRGD,ThetaMax,pi,toler,Q3,err3)
end if
FracError=(err1+err2+err3)/(Q1+Q2+Q3)
Q=Prefactor*(Q1+Q2+Q3)
Qold=Q
write(*,'(i3,'', '',F8.4,'', '',g11.3,'', '',g11.3,'', '',f6.3)') i,radius(i),rproj2,Q,FracError
! write(*,'(3(g11.3,'', ''))') Q1, Q2, Q3
write(9,'(f8.3,'', '',g12.4,'', '',g13.5,'', '',f6.3)') radius(i),rproj2,Q,FracError
end do
stop
end program LOModelSimple
real(8) function FuncSIRGD(theta)
! FuncSIRGD = Integral of phi dependent terms in scattering intensity
! Scattering angle theta and spheroid angle theta0 are fixed.
implicit none
real(8) aT,theta,thetaT,theta0T,radiusT,rmu,rn,rk,rlambda,toler
real(8) phiIntegral
!Set up common block to have transfer values of theta, theta0, radius, all suffix T
common aT,thetaT,theta0T,radiusT,rmu,rn,rk,rlambda
thetaT=theta
! In this function, spheroid angle theta0 is fixed--only need to call RGD integrand
call RGDphi(phiIntegral)
FuncSIRGD=phiIntegral
return
end
real(8) function FuncSIRanRGD(theta)
! Like FuncSIRGD, but integrate over all orientations of theta0
! FuncSIRanRGD = Integral of all theta0 and phi dependent terms in scattering
! intensity
! Scattering angle theta is fixed.
implicit none
real(8) sinRGD,sinRGDint,aT,theta,thetaT,theta0T,radiusT,rmu,rn,rk,rlambda
real(8) phiIntegral,pi2,pi4,toler,err
!Set up common block to have transfer values of theta, theta0, radius, all suffix T
common aT,thetaT,theta0T,radiusT,rmu,rn,rk,rlambda
external sinRGD
! pi2 = pi/2
! pi4 = pi/4
data pi2/1.570796327/
data pi4/0.785398163/
thetaT=theta
! Find typical magnitude of sinRGDint, and use to set tolerance
toler=1.d-2*sinRGD(pi4)
! Integrate over spheroid angle theta0 from 0 to pi/2
! err = error of integration
call qtrap(sinRGD,1.d-6,pi2,toler,sinRGDint,err)
! Integral of sin(theta0) from 0 to pi/2 = 1, so normalized sinRGDint is same as
! sinRGDint
! No factor of sin(theta), since that's carried in phiIntegral for RGD formulas.
FuncSIRanRGD=sinRGDint
return
end
real(8) function sinRGD(theta0)
! Integrand for averaging (integral of RGD scattering over phi) over theta0
! Parameters:
! theta0: scattering angle
! phiIntegral: integral of form factor squared and theta dependent terms over phi
! sinRGD: product of sin(theta0) and phiIntegral
! RGDphi: integral of scattering intensity over phi
implicit none
real(8) theta0,phiIntegral
real(8) aT,thetaT,theta0T,radiusT,rmu,rn,rk,rlambda
common aT,thetaT,theta0T,radiusT,rmu,rn,rk,rlambda
theta0t=theta0
call RGDphi(phiIntegral)
sinRGD=sin(theta0)*phiIntegral
return
end
subroutine RGDphi(phiIntegral)
! Average scattering integral over phi, but keep theta and theta0 fixed.
! Second-lowest integrand.
implicit none
real(8) toler, rk,aT,thetaT,theta0T,fIntegrand,phiIntegral,err,pi
real(8) radiusT,rmu,rn,rlambda
common aT,thetaT,theta0T,radiusT,rmu,rn,rk,rlambda
external fintegrand
data pi/3.1415925d0/
! estimate typical magnitude of integrand; assume angle-dependent terms have
! magnitude approximately 0.5.
toler=1.d-2*rk*aT*sin(thetaT/2.)
! perform phi integral
call QTRAP(fintegrand,0.d0,pi,toler,phiIntegral,err)
return
end
real(8) function fintegrand(phi)
! Returns theta and phi dependent integrand equal to form factor squared, times
! theta-dependent terms.
! Lowest level of integrand
! beta: angle defined by Barber and Wang paper
! theta0T: scattering angle
! thetaT: angle of spheroid major axis from z axis
! phi: azimuthal angle of spheroid, relative to plane of incident and scattered light
! f: form factor (3/u^3)(sin u - u cos u), same as Barber and Wang, Eq. 3
! fintegrand: f^2 (1 + cos^2(theta) sin(theta)
implicit none
real(8) rk,aT,thetaT,beta,theta0T,phi,u,f,radiusT,rmu,rn,rlambda
common aT,thetaT,theta0T,radiusT,rmu,rn,rk,rlambda
! Eqs. 5 and 4 of Barber and Wang:
beta=acos(-cos(theta0T)*sin(thetaT/2.) + sin(theta0T)*cos(thetaT/2.)*cos(phi))
u=2*rk*aT*sin(thetaT/2)*sqrt(cos(beta)**2 + (sin(beta)/rmu)**2)
if (u .lt. 1.d-2) then
f=1.d0
else
f=(3/u**3)*(sin(u) - u*cos(u))
end if
fIntegrand=(1 + cos(thetaT)**2)*sin(thetaT)*f**2
return
end
This paper is a contribution of the United States government and is not subject to copyright