Пример #1
0
def test_ne():
    objs = [
        batoid.Table([0, 1], [1, 2], 'linear'),
        batoid.Table([0, 1], [1, 2], 'ceil'),
        batoid.Table([0, 1], [2, 1], 'linear'),
        batoid.Table([], [], 'linear')
    ]
    all_obj_diff(objs)
Пример #2
0
def test_ne():
    objs = [
        batoid.Table([0, 1], [1, 2], batoid.Table.Interpolant.linear),
        batoid.Table([0, 1], [1, 2], batoid.Table.Interpolant.ceil),
        batoid.Table([0, 1], [2, 1], batoid.Table.Interpolant.linear),
        batoid.Table([], [], batoid.Table.Interpolant.linear)
    ]
    all_obj_diff(objs)
Пример #3
0
def test_table_medium_refraction():
    import random
    random.seed(57721566)

    filename = os.path.join(batoid.datadir, "media", "silica_dispersion.txt")
    wave, n = np.genfromtxt(filename).T
    table = batoid.Table(wave, n, batoid.Table.Interpolant.linear)
    silica = batoid.TableMedium(table)
    air = batoid.ConstMedium(1.000277)

    asphere = batoid.Asphere(25.0, -0.97, [1e-3, 1e-5])
    for i in range(10000):
        x = random.gauss(0, 1)
        y = random.gauss(0, 1)
        vx = random.gauss(0, 1e-1)
        vy = random.gauss(0, 1e-1)
        wavelength = random.uniform(0.3, 1.2)
        ray = batoid.Ray(x, y, -0.1, vx, vy, 1, 0, wavelength)

        cm1 = batoid.ConstMedium(silica.getN(wavelength))
        cm2 = batoid.ConstMedium(air.getN(wavelength))

        rray1 = asphere.refract(ray, silica, air)
        rray2 = asphere.refract(ray, cm1, cm2)

        assert rray1 == rray2
Пример #4
0
def test_silica_sellmeier_table():
    import random
    import time
    random.seed(577)

    # File from phosim
    filename = os.path.join(batoid.datadir, "media", "silica_dispersion.txt")
    wave, n = np.genfromtxt(filename).T
    wave *= 1e-6  # microns -> meters
    table = batoid.Table(wave, n, batoid.Table.Interpolant.linear)
    table_silica = batoid.TableMedium(table)

    # Coefficients from
    # https://refractiveindex.info/?shelf=main&book=SiO2&page=Malitson
    sellmeier_silica = batoid.SellmeierMedium(0.6961663, 0.4079426, 0.8974794,
                                              0.0684043**2, 0.1162414**2,
                                              9.896161**2)

    # Making this a timing test too for fun
    ws = []
    for i in range(100000):
        ws.append(random.uniform(0.3e-6, 1.2e-6))
    table_n = []
    sellmeier_n = []
    t0 = time.time()
    for w in ws:
        table_n.append(table_silica.getN(w))
    t1 = time.time()
    for w in ws:
        sellmeier_n.append(sellmeier_silica.getN(w))
    t2 = time.time()
    print("TableMedium took {} s".format(t1 - t0))
    print("SellmeierMedium took {} s".format(t2 - t1))
    np.testing.assert_allclose(table_n, sellmeier_n, atol=1e-6, rtol=0)
    do_pickle(sellmeier_silica)
Пример #5
0
def parse_medium(value):
    from numbers import Real
    if isinstance(value, batoid.Medium):
        return value
    elif isinstance(value, Real):
        return batoid.ConstMedium(value)
    elif isinstance(value, str):
        if value == 'air':
            return batoid.Air()
        elif value == 'silica':
            return batoid.SellmeierMedium(0.6961663, 0.4079426, 0.8974794,
                                          0.0684043**2, 0.1162414**2,
                                          9.896161**2)
        elif value == 'hsc_air':
            return batoid.ConstMedium(1.0)
        w = [0.4, 0.6, 0.75, 0.9, 1.1]
        w = [w_ * 1e-6 for w_ in w]
        if value == 'hsc_silica':
            return batoid.TableMedium(
                batoid.Table(w, [
                    1.47009272, 1.45801158, 1.45421013, 1.45172729, 1.44917721
                ], batoid.Table.Interpolant.linear))
        elif value == 'hsc_bsl7y':
            return batoid.TableMedium(
                batoid.Table(w, [
                    1.53123287, 1.51671428, 1.51225242, 1.50939738, 1.50653251
                ], batoid.Table.Interpolant.linear))
        elif value == 'hsc_pbl1y':
            return batoid.TableMedium(
                batoid.Table(w, [
                    1.57046066, 1.54784671, 1.54157395, 1.53789058, 1.53457169
                ], batoid.Table.Interpolant.linear))
        elif value == 'NLAK10':
            return batoid.SellmeierMedium(1.72878017, 0.169257825, 1.19386956,
                                          0.00886014635, 0.0363416509,
                                          82.9009069)
        elif value == 'PFK85':
            return batoid.SumitaMedium(2.1858326, -0.0050155632, 0.0075107775,
                                       0.00017770562, -1.2164148e-05,
                                       6.1341005e-07)
        elif value == 'BK7':
            return batoid.SellmeierMedium(1.03961212, 0.231792344, 1.01046945,
                                          0.00600069867, 0.0200179144,
                                          103.560653)
        else:
            raise RuntimeError("Unknown medium {}".format(value))
Пример #6
0
def test_refraction_chromatic():
    import random
    random.seed(577215664)
    wavelength1 = 500e-9
    wavelength2 = 600e-9
    flux = 1.0

    plane = batoid.Plane()
    filename = os.path.join(batoid.datadir, "media", "silica_dispersion.txt")
    wave, n = np.genfromtxt(filename).T
    wave *= 1e-6  # micron -> meters
    table = batoid.Table(wave, n, batoid.Table.Interpolant.linear)
    silica = batoid.TableMedium(table)
    air = batoid.Air()

    thx, thy = 0.001, 0.0001
    dirCos = batoid.utils.gnomonicToDirCos(thx, thy)
    rv1 = batoid.rayGrid(10.0, 1., dirCos[0], dirCos[1], -dirCos[2], 2,
                         wavelength1, flux, silica)
    rv2 = batoid.rayGrid(10.0, 1., dirCos[0], dirCos[1], -dirCos[2], 2,
                         wavelength2, flux, silica)
    rays = []
    for ray in rv1:
        rays.append(ray)
    for ray in rv2:
        rays.append(ray)
    rvCombined = batoid.RayVector(rays)

    rv1r = plane.refract(rv1, silica, air)
    rv2r = plane.refract(rv2, silica, air)
    assert rv1r != rv2r
    rays = []
    for ray in rv1r:
        rays.append(ray)
    for ray in rv2r:
        rays.append(ray)
    rvrCombined1 = batoid.RayVector(rays)

    rvrCombined2 = plane.refract(rvCombined, silica, air)

    assert rvrCombined1 == rvrCombined2

    # Check in-place
    plane.refractInPlace(rv1, silica, air)
    plane.refractInPlace(rv2, silica, air)
    assert rv1 != rv2
    plane.refractInPlace(rvCombined, silica, air)
    rays = []
    for ray in rv1:
        rays.append(ray)
    for ray in rv2:
        rays.append(ray)
    rvCombined2 = batoid.RayVector(rays)

    assert rvCombined == rvCombined2
Пример #7
0
def test_ne():
    filename = os.path.join(batoid.datadir, "media", "silica_dispersion.txt")
    wave, n = np.genfromtxt(filename).T
    wave *= 1e-6  # microns -> meters
    table = batoid.Table(wave, n, batoid.Table.Interpolant.linear)
    table2 = batoid.Table(wave * 1.01, n, batoid.Table.Interpolant.linear)

    objs = [
        batoid.ConstMedium(1.0),
        batoid.ConstMedium(1.1),
        batoid.TableMedium(table),
        batoid.TableMedium(table2),
        batoid.SellmeierMedium(0.6961663, 0.4079426, 0.8974794, 0.0684043**2,
                               0.1162414**2, 9.896161**2),
        batoid.SellmeierMedium(0.4079426, 0.6961663, 0.8974794, 0.0684043**2,
                               0.1162414**2, 9.896161**2),
        batoid.Air(),
        batoid.Air(pressure=100)
    ]
    all_obj_diff(objs)
Пример #8
0
def test_table_medium():
    import random
    random.seed(57)

    # File from phosim
    filename = os.path.join(batoid.datadir, "media", "silica_dispersion.txt")
    wave, n = np.genfromtxt(filename).T
    wave *= 1e-6  # microns -> meters
    table = batoid.Table(wave, n, batoid.Table.Interpolant.linear)
    table_medium = batoid.TableMedium(table)
    for i in range(100):
        w = random.uniform(0.3e-6, 1.2e-6)
        assert table_medium.getN(w) == table(w)
    assert table_medium.table == table
    do_pickle(table_medium)
Пример #9
0
def test_table():
    import random
    random.seed(5)

    for j in range(10):
        m = random.uniform(3, 4)
        b = random.uniform(10, 20)
        f = lambda x: m * x + b

        x = np.array([random.uniform(0, 1) for i in range(10)])
        x.sort()
        y = f(x)
        table = batoid.Table(x, y, 'linear')

        xtest = np.array([random.uniform(min(x), max(x)) for i in range(10)])
        ytruth = f(xtest)
        yinterp = np.array([table(xt) for xt in xtest])

        np.testing.assert_allclose(x, table.args, rtol=0, atol=1e-14)
        np.testing.assert_allclose(y, table.vals, rtol=0, atol=1e-14)
        np.testing.assert_allclose(ytruth, yinterp, rtol=0, atol=1e-14)
        assert table.interp == 'linear'

        do_pickle(table)
Пример #10
0
def parse_table(config):
    return batoid.Table(config['args'], config['vals'], config['interp'])
Пример #11
0
def parse_medium(value):
    from numbers import Real
    if isinstance(value, batoid.Medium):
        return value
    elif isinstance(value, Real):
        return batoid.ConstMedium(value)
    elif isinstance(value, str):
        if value == 'air':
            return batoid.Air()
        elif value == 'silica':
            return batoid.SellmeierMedium(0.6961663, 0.4079426, 0.8974794,
                                          0.0684043**2, 0.1162414**2,
                                          9.896161**2)
        elif value == 'hsc_air':
            return batoid.ConstMedium(1.0)
        w = [0.4, 0.6, 0.75, 0.9, 1.1]
        w = [w_ * 1e-6 for w_ in w]
        w_desi = [
            365.015, 435.835, 486.133, 587.562, 656.273, 852.110, 1013.98
        ]
        w_desi = [w_ * 1e-9 for w_ in w_desi]
        if value == 'hsc_silica':
            return batoid.TableMedium(
                batoid.Table(w, [
                    1.47009272, 1.45801158, 1.45421013, 1.45172729, 1.44917721
                ], batoid.Table.Interpolant.linear))
        elif value == 'hsc_bsl7y':
            return batoid.TableMedium(
                batoid.Table(w, [
                    1.53123287, 1.51671428, 1.51225242, 1.50939738, 1.50653251
                ], batoid.Table.Interpolant.linear))
        elif value == 'hsc_pbl1y':
            return batoid.TableMedium(
                batoid.Table(w, [
                    1.57046066, 1.54784671, 1.54157395, 1.53789058, 1.53457169
                ], batoid.Table.Interpolant.linear))
        elif value == 'desi_C1':
            # Use melt data from DESI-2880-v2
            return batoid.TableMedium(
                batoid.Table(w_desi, [
                    1.474580, 1.466730, 1.463162, 1.458499, 1.456402, 1.452500,
                    1.450278
                ], batoid.Table.Interpolant.linear))
        elif value == 'desi_C2':
            # Use melt data from DESI-2880-v2
            return batoid.TableMedium(
                batoid.Table(w_desi, [
                    1.474641, 1.466791, 1.463223, 1.458561, 1.45646, 1.452563,
                    1.450342
                ], batoid.Table.Interpolant.linear))
        elif value == 'desi_ADC1':
            # Use melt data from DESI-2880-v2
            return batoid.TableMedium(
                batoid.Table(w_desi, [
                    1.536945, 1.527374, 1.523070, 1.517498, 1.515022, 1.510508,
                    1.508023
                ], batoid.Table.Interpolant.linear))
        elif value == 'desi_ADC2':
            # Use melt data from DESI-2880-v2
            return batoid.TableMedium(
                batoid.Table(w_desi, [
                    1.536225, 1.526635, 1.522325, 1.516746, 1.514267, 1.509743,
                    1.507246
                ], batoid.Table.Interpolant.linear))
        elif value == 'desi_C3':
            # Use generic fused silica until melt data is available.
            return batoid.TableMedium(
                batoid.Table(w_desi, [
                    1.474555, 1.466701, 1.463132, 1.458467, 1.45637, 1.452469,
                    1.450245
                ], batoid.Table.Interpolant.linear))
        elif value == 'desi_C4':
            # Use generic fused silica until melt data is available.
            return batoid.TableMedium(
                batoid.Table(w_desi, [
                    1.474555, 1.466701, 1.463132, 1.458467, 1.45637, 1.452469,
                    1.450245
                ], batoid.Table.Interpolant.linear))
        elif value == 'NLAK10':
            return batoid.SellmeierMedium(1.72878017, 0.169257825, 1.19386956,
                                          0.00886014635, 0.0363416509,
                                          82.9009069)
        elif value == 'PFK85':
            return batoid.SumitaMedium(2.1858326, -0.0050155632, 0.0075107775,
                                       0.00017770562, -1.2164148e-05,
                                       6.1341005e-07)
        elif value == 'BK7':
            return batoid.SellmeierMedium(1.03961212, 0.231792344, 1.01046945,
                                          0.00600069867, 0.0200179144,
                                          103.560653)
        else:
            raise RuntimeError("Unknown medium {}".format(value))