diff options
author | tlatorre <tlatorre@uchicago.edu> | 2018-10-03 09:52:19 -0500 |
---|---|---|
committer | tlatorre <tlatorre@uchicago.edu> | 2018-10-03 09:52:19 -0500 |
commit | 86e89541032a0a345ae70d4b31aec474e4899890 (patch) | |
tree | 8257c8f1a7ca847a5f8d4cfcdee055ed02d1049a /utils/index.py | |
parent | 405f0d448eb15b4f686c1f7ee47794d82eaaf62c (diff) | |
download | sddm-86e89541032a0a345ae70d4b31aec474e4899890.tar.gz sddm-86e89541032a0a345ae70d4b31aec474e4899890.tar.bz2 sddm-86e89541032a0a345ae70d4b31aec474e4899890.zip |
move python scripts into utils/ directory
Diffstat (limited to 'utils/index.py')
-rw-r--r-- | utils/index.py | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/utils/index.py b/utils/index.py new file mode 100644 index 0000000..4edcd59 --- /dev/null +++ b/utils/index.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +This is a script to calculate the index of refraction of water as a function of +wavelength, temperature, and pressure and fit it to a linear approximation in a +wavelength region where the PMTs are sensitive to. The data comes from [1]. + +[1] "Refractive index of Water and Steam as Function of Wavelength, Temperature, and Density". Schiebener et al. 1989. +""" +from __future__ import print_function, division +import numpy as np + +A0 = 0.243905091 +A1 = 9.53518094e-3 +A2 = -3.64358110e-3 +A3 = 2.65666426e-4 +A4 = 1.59189325e-3 +A5 = 2.45733798e-3 +A6 = 0.897478251 +A7 = -1.63066183e-2 +UV = 0.2292020 +IR = 5.432937 + +def get_index(p, wavelength, T): + """ + Returns the index of pure water for a given density, wavelength, and + temperature. The density should be in units of kg/m^3, the wavelength in nm, + and the temperature in Celsius. + """ + # normalize the density, temperature, and pressure + p = p/1000.0 + wavelength = wavelength/589.0 + T = (T+273.15)/273.15 + + # first we compute the right hand side of Equation 7 + c = A0 + A1*p + A2*T + A3*wavelength**2*T + A4/wavelength**2 + A5/(wavelength**2-UV**2) + A6/(wavelength**2-IR**2) + A7*p**2 + c *= p + + return np.sqrt((2*c+1)/(1-c)) + +def approximate_index(x, a, b): + """ + Returns the index of refraction using the approximation: + + n = a + b/x**2 + """ + return a + b/x**2 + +def chi2(pars, x, data): + """ + Returns the squares of the difference between the data and the model for + the inverse of the index of refraction, i.e. + + 1/n = lambda**2/(a*lambda**2+b) + """ + a, b = pars + return np.sum((approximate_index(x,a,b)-data)**2) + +if __name__ == '__main__': + import matplotlib.pyplot as plt + import argparse + from scipy.optimize import fmin + + parser = argparse.ArgumentParser("fit for an approximation to the inverse of the index of refraction of water") + parser.add_argument("--temperature", type=float, default=10.0) + parser.add_argument("--density", type=float, default=1000.0) + parser.add_argument("--low", type=float, default=300.0) + parser.add_argument("--high", type=float, default=600.0) + args = parser.parse_args() + + x = np.linspace(args.low,args.high,1000) + n = get_index(args.density,x,args.temperature) + xmin = fmin(chi2,[1,1],args=(x,1/n)) + + print(xmin) + + a, b = xmin + y = approximate_index(x,a,b) + + plt.plot(x,1/n,label="data") + plt.plot(x,y,label="fit") + plt.xlabel("Wavelength (nm)") + plt.ylabel("1/n") + plt.title("Index of Refraction of Water at 273.15 K") + plt.legend() + plt.show() |