Commit 6ab068b0 authored by Zolnierczuk, Piotr's avatar Zolnierczuk, Piotr
Browse files

added waveband_binning

parent 7e84e106
Loading
Loading
Loading
Loading
+38 −1
Original line number Diff line number Diff line
@@ -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
@@ -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
+3 −3
Original line number Diff line number Diff line
@@ -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__
+24 −1
Original line number Diff line number Diff line
@@ -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"
@@ -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"