Loading pysen/lib.py +38 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ PySEN library functions """ #somehow numpy is reporting missing stuff from numpy import pi, log, sin, arcsin from numpy import pi, log, sin, arcsin, round class ElasticScattering(object): """Elastic scattering Loading Loading @@ -113,6 +113,43 @@ def t_binning(lmax, qmin, q0, dq, dlam=3.0, nt=42, trim=False): return max(t1, 1), min(t2, nt) return t1, t2 def waveband_binning(nslices, lmin, lmax, t1, t2, nt=42): """ We would like to have constant x = dlam/lambda for N slices for wavelenegth band [ lmin=lam[0], lmax=lam[N] ]. Since x = dlam/lambda = 2 * (lam[k] - lam[k-1])/(lam[k] + lam[k-1]) thus lam[k] = lam[k-a] * (2+x)/(2+x) or lam[k] = lam[0] * kappa^k where kappa = (2+x)/(2+x) = (lam[N]/lam[0])^1/N nslices = 3 # number of slices lmin, lmax = 5, 8 # overall wavelength band [A] t1,t2 = 4,38 # TOF selection nt = 42 # number of TOF channels """ dlam = lmax-lmin lam_0 = lmax - dlam*(nt-t1)/nt lam_N = lmax - dlam*(nt-t2)/nt kappa_N = (lam_N/lam_0)**(1.0/nslices) x = (2*kappa_N -2 )/(kappa_N +1) result = dict(lam0=lam_0, lamN=lam_N, dlam=x, kappa=kappa_N, bands=[]) l1 = lam_0 it1 = t1 for k in range(0,nslices): l2 = l1 * kappa_N it2 = int( round( nt*(l2 - lmin)/dlam)) result['bands'].append((l1,l2, it1,it2)) l1 = l2 it1 = it2 return result get_theta = ElasticScattering.theta Loading pysen/revision.py +3 −3 Original line number Diff line number Diff line Loading @@ -2,9 +2,9 @@ PySEN revision module """ import sys __version__ = "0.33-devel" __release__ = "20170508" __date__ = "May 8, 2017" __version__ = "0.34-devel" __release__ = "20170518" __date__ = "May 18, 2017" # VERSION = __version__ RELEASE = __release__ Loading test/test_lib.py +24 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,8 @@ import unittest import numpy as np from pysen.lib import q_binning, t_binning, get_theta, get_q, get_dspace from pysen.lib import (q_binning, t_binning, waveband_binning, get_theta, get_q, get_dspace) class BinningTestCase(unittest.TestCase): "Binning Test Cases" Loading Loading @@ -47,6 +48,28 @@ class BinningTestCase(unittest.TestCase): actual = t_binning(8.0, 0.125, q0, dq, dlam=3.0, nt=42) self.assertEqual((t1, t2), actual) def test_waveband_binning(self): bands = [ (5.286, 5.810, 4, 11 ), (5.810, 6.386, 11, 19 ), (6.386, 7.019, 19, 28 ), (7.019, 7.714, 28, 38 ), ] res = waveband_binning(4, 5.0, 8.0, 4, 38, nt=42) self.assertEqual(len(bands), len(res['bands'])) self.assertAlmostEqual(bands[ 0][0], res['lam0'], 3) self.assertAlmostEqual(bands[-1][1], res['lamN'], 3) self.assertAlmostEqual(1.099, res['kappa'], 3) self.assertAlmostEqual(0.094, res['dlam'], 3) for i, (l1,l2,t1,t2) in enumerate(res['bands']): el1, el2, et1, et2 = bands[i] self.assertAlmostEqual(el1, l1, 3) self.assertAlmostEqual(el2, l2, 3) self.assertEqual(et1, t1) self.assertEqual(et2, t2) class ElasticScatteringCase(unittest.TestCase): "Elastic Scattering Test Cases" Loading Loading
pysen/lib.py +38 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ PySEN library functions """ #somehow numpy is reporting missing stuff from numpy import pi, log, sin, arcsin from numpy import pi, log, sin, arcsin, round class ElasticScattering(object): """Elastic scattering Loading Loading @@ -113,6 +113,43 @@ def t_binning(lmax, qmin, q0, dq, dlam=3.0, nt=42, trim=False): return max(t1, 1), min(t2, nt) return t1, t2 def waveband_binning(nslices, lmin, lmax, t1, t2, nt=42): """ We would like to have constant x = dlam/lambda for N slices for wavelenegth band [ lmin=lam[0], lmax=lam[N] ]. Since x = dlam/lambda = 2 * (lam[k] - lam[k-1])/(lam[k] + lam[k-1]) thus lam[k] = lam[k-a] * (2+x)/(2+x) or lam[k] = lam[0] * kappa^k where kappa = (2+x)/(2+x) = (lam[N]/lam[0])^1/N nslices = 3 # number of slices lmin, lmax = 5, 8 # overall wavelength band [A] t1,t2 = 4,38 # TOF selection nt = 42 # number of TOF channels """ dlam = lmax-lmin lam_0 = lmax - dlam*(nt-t1)/nt lam_N = lmax - dlam*(nt-t2)/nt kappa_N = (lam_N/lam_0)**(1.0/nslices) x = (2*kappa_N -2 )/(kappa_N +1) result = dict(lam0=lam_0, lamN=lam_N, dlam=x, kappa=kappa_N, bands=[]) l1 = lam_0 it1 = t1 for k in range(0,nslices): l2 = l1 * kappa_N it2 = int( round( nt*(l2 - lmin)/dlam)) result['bands'].append((l1,l2, it1,it2)) l1 = l2 it1 = it2 return result get_theta = ElasticScattering.theta Loading
pysen/revision.py +3 −3 Original line number Diff line number Diff line Loading @@ -2,9 +2,9 @@ PySEN revision module """ import sys __version__ = "0.33-devel" __release__ = "20170508" __date__ = "May 8, 2017" __version__ = "0.34-devel" __release__ = "20170518" __date__ = "May 18, 2017" # VERSION = __version__ RELEASE = __release__ Loading
test/test_lib.py +24 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,8 @@ import unittest import numpy as np from pysen.lib import q_binning, t_binning, get_theta, get_q, get_dspace from pysen.lib import (q_binning, t_binning, waveband_binning, get_theta, get_q, get_dspace) class BinningTestCase(unittest.TestCase): "Binning Test Cases" Loading Loading @@ -47,6 +48,28 @@ class BinningTestCase(unittest.TestCase): actual = t_binning(8.0, 0.125, q0, dq, dlam=3.0, nt=42) self.assertEqual((t1, t2), actual) def test_waveband_binning(self): bands = [ (5.286, 5.810, 4, 11 ), (5.810, 6.386, 11, 19 ), (6.386, 7.019, 19, 28 ), (7.019, 7.714, 28, 38 ), ] res = waveband_binning(4, 5.0, 8.0, 4, 38, nt=42) self.assertEqual(len(bands), len(res['bands'])) self.assertAlmostEqual(bands[ 0][0], res['lam0'], 3) self.assertAlmostEqual(bands[-1][1], res['lamN'], 3) self.assertAlmostEqual(1.099, res['kappa'], 3) self.assertAlmostEqual(0.094, res['dlam'], 3) for i, (l1,l2,t1,t2) in enumerate(res['bands']): el1, el2, et1, et2 = bands[i] self.assertAlmostEqual(el1, l1, 3) self.assertAlmostEqual(el2, l2, 3) self.assertEqual(et1, t1) self.assertEqual(et2, t2) class ElasticScatteringCase(unittest.TestCase): "Elastic Scattering Test Cases" Loading