Beispiel #1
0
def test_pullingoutguess():
    g = Sphere(center=(par(guess=.567e-5, limit=[0, 1e-5]),
                       par(.567e-5, (0, 1e-5)), par(15e-6, (1e-5, 2e-5))),
               r=par(8.5e-7, (1e-8, 1e-5)),
               n=ComplexParameter(par(1.59, (1, 2)), 1e-4))

    model = Model(g, Mie.calc_holo)

    s = Sphere(center=[.567e-5, .567e-5, 15e-6], n=1.59 + 1e-4j, r=8.5e-7)

    assert_equal(s.n, model.scatterer.guess.n)
    assert_equal(s.r, model.scatterer.guess.r)
    assert_equal(s.center, model.scatterer.guess.center)

    g = Sphere(center=(par(guess=.567e-5, limit=[0, 1e-5]),
                       par(.567e-5, (0, 1e-5)), par(15e-6, (1e-5, 2e-5))),
               r=par(8.5e-7, (1e-8, 1e-5)),
               n=1.59 + 1e-4j)

    model = Model(g, Mie.calc_holo)

    s = Sphere(center=[.567e-5, .567e-5, 15e-6], n=1.59 + 1e-4j, r=8.5e-7)

    assert_equal(s.n, model.scatterer.guess.n)
    assert_equal(s.r, model.scatterer.guess.r)
    assert_equal(s.center, model.scatterer.guess.center)
Beispiel #2
0
def test_next_model():
    exampleresult = FitResult(parameters={
        'center[1]': 31.367170884695756, 'r': 0.6465280831465722,
        'center[0]': 32.24150087110443,
        'center[2]': 35.1651561654966,
        'alpha': 0.7176299231169572,
        'n': 1.580122175314896},
        scatterer=Sphere(n=1.580122175314896, r=0.6465280831465722,
        center=[32.24150087110443, 31.367170884695756, 35.1651561654966]),
        chisq=0.0001810513851216454, rsq=0.9727020197282801,
        converged=True, time=5.179728031158447,
        model=Model(scatterer=ParameterizedObject(obj=
        Sphere(n=Parameter(guess=1.59, limit=[1.4, 1.7], name='n'),
        r=Parameter(guess=0.65, limit=[0.6, 0.7], name='r'),
        center=[Parameter(guess=32.110424836601304, limit=[2, 40], name='center[0]'),
        Parameter(guess=31.56683986928105, limit=[4, 40], name='center[1]'),
        Parameter(guess=33, limit=[5, 45], name='center[2]')])),
        theory=Mie.calc_holo, alpha=Parameter(guess=0.6, limit=[0.1, 1], name='alpha'),
        constraints=[]), minimizer = None, minimization_details = None)

    gold = Model(scatterer=ParameterizedObject(obj=Sphere(
        n=Parameter(guess=1.580122175314896, limit=[1.4, 1.7], name='n'),
        r=Parameter(guess=0.6465280831465722, limit=[0.6, 0.7], name='r'),
        center=[Parameter(guess=32.24150087110443, limit=[2, 40], name='center[0]'),
        Parameter(guess=31.367170884695756, limit=[4, 40], name='center[1]'),
        Parameter(guess=35.1651561654966, limit=[5, 45], name='center[2]')])),
        theory=Mie.calc_holo, alpha=Parameter(guess=0.7176299231169572, limit=[0.1, 1], name='alpha'),
        constraints=[])

    assert_obj_close(gold, exampleresult.next_model())
Beispiel #3
0
def test_Get_Alpha():

    #checking get_alpha function
    sc = Spheres([Sphere(n = 1.58, r = par(0.5e-6), center = np.array([10., 10., 20.])),
              Sphere(n = 1.58, r = par(0.5e-6), center = np.array([9., 11., 21.]))])
    model = Model(sc, Mie.calc_holo, alpha = par(.7,[.6,1]))

    sc = Spheres([Sphere(n = 1.58, r = par(0.5e-6), center = np.array([10., 10., 20.])),
              Sphere(n = 1.58, r = par(0.5e-6), center = np.array([9., 11., 21.]))])
    model2 = Model(sc, Mie.calc_holo)

    assert_equal(model.get_alpha(model.parameters).guess, 0.7)
    assert_equal(model.get_alpha(model.parameters).name, 'alpha')
    assert_equal(model2.get_alpha(model2.parameters), 1.0)
Beispiel #4
0
def test_dda_fit():
    s = Sphere(n=1.59, r=.2, center=(5, 5, 5))
    o = Optics(wavelen=.66, index=1.33, pixel_scale=.1)

    schema = ImageSchema(optics=o, shape=100)

    h = Mie.calc_holo(s, schema)

    def make_scatterer(r, x, y, z):
        local_s = Sphere(r=r, center=(x, y, z))
        return Scatterer(local_s.indicators, n=s.n)

    parameters = [
        par(.18, [.1, .3], name='r', step=.1),
        par(5, [4, 6], 'x'),
        par(5, [4, 6], 'y'),
        par(5.2, [4, 6], 'z')
    ]

    p = Parametrization(make_scatterer, parameters)

    model = Model(p, DDA.calc_holo)

    res = fit(model, h)

    assert_parameters_allclose(res.parameters,
                               dict([('r', 0.2003609439787491),
                                     ('x', 5.0128083665603995),
                                     ('y', 5.0125252883133617),
                                     ('z', 4.9775097284878775)]),
                               rtol=1e-3)
Beispiel #5
0
def test_fit_mie_single():
    holo = normalize(get_example_data('image0001.yaml'))

    parameters = [
        Parameter(name='x', guess=.567e-5, limit=[0.0, 1e-5]),
        Parameter(name='y', guess=.576e-5, limit=[0, 1e-5]),
        Parameter(name='z', guess=15e-6, limit=[1e-5, 2e-5]),
        Parameter(name='n', guess=1.59, limit=[1, 2]),
        Parameter(name='r', guess=8.5e-7, limit=[1e-8, 1e-5])
    ]

    def make_scatterer(x, y, z, r, n):
        return Sphere(n=n + 1e-4j, r=r, center=(x, y, z))

    thry = Mie(False)
    model = Model(Parametrization(make_scatterer, parameters),
                  thry.calc_holo,
                  alpha=Parameter(name='alpha', guess=.6, limit=[.1, 1]))

    assert_raises(InvalidMinimizer, fit, model, holo, minimizer=Sphere)

    result = fit(model, holo)

    assert_obj_close(result.scatterer, gold_sphere, rtol=1e-3)
    assert_approx_equal(result.parameters['alpha'], gold_alpha, significant=3)
    assert_equal(model, result.model)
Beispiel #6
0
def test_serialization():
    par_s = Sphere(center=(par(.567e-5, [0, 1e-5]), par(.576e-6, [0, 1e-5]),
                           par(15e-6, [1e-5, 2e-5])),
                   r=par(8.5e-7, [1e-8, 1e-5]),
                   n=par(1.59, [1, 2]))

    alpha = par(.6, [.1, 1], 'alpha')

    schema = ImageSchema(shape=100,
                         spacing=.1151e-6,
                         optics=Optics(.66e-6, 1.33))

    model = Model(par_s, Mie.calc_holo, alpha=alpha)

    holo = Mie.calc_holo(model.scatterer.guess, schema, model.alpha.guess)

    result = fit(model, holo)

    temp = tempfile.NamedTemporaryFile()
    save(temp, result)

    temp.flush()
    temp.seek(0)
    loaded = load(temp)

    assert_obj_close(result, loaded, context='serialized_result')
Beispiel #7
0
def test_layered():
    s = Sphere(n = (1,2), r = (1, 2), center = (2, 2, 2))
    sch = ImageSchema((10, 10), .2, Optics(.66, 1, (1, 0)))
    hs = Mie.calc_holo(s, sch)

    guess = hp.scattering.scatterer.sphere.LayeredSphere((1,2), (par(1.01), par(.99)), (2, 2, 2))
    model = Model(guess, Mie.calc_holo)
    res = fit(model, hs)
    assert_allclose(res.scatterer.t, (1, 1), rtol = 1e-12)
Beispiel #8
0
def test_fit_multisphere_noisydimer_slow():
    optics = Optics(wavelen=658e-9, polarization = [0., 1.0],
                       divergence = 0., pixel_scale = [0.345e-6, 0.345e-6],
                       index = 1.334)

    holo = normalize(get_example_data('image0002.yaml'))

    # Now construct the model, and fit
    parameters = [Parameter(name = 'x0', guess = 1.64155e-5,
                            limit = [0, 1e-4]),
                  Parameter(1.7247e-5, [0, 1e-4], 'y0'),
                  Parameter(20.582e-6, [0, 1e-4], 'z0'),
                  Parameter(.6856e-6, [1e-8, 1e-4], 'r0'),
                  Parameter(1.6026, [1, 2], 'nr0'),
                  Parameter(1.758e-5, [0, 1e-4], 'x1'),
                  Parameter(1.753e-5, [0, 1e-4], 'y1'),
                  Parameter(21.2698e-6, [1e-8, 1e-4], 'z1'),
                  Parameter(.695e-6, [1e-8, 1e-4], 'r1'),
                  Parameter(1.6026, [1, 2], 'nr1')]

    def make_scatterer(x0, x1, y0, y1, z0, z1, r0, r1, nr0, nr1):
        s = Spheres([
                Sphere(center = (x0, y0, z0), r=r0, n = nr0+1e-5j),
                Sphere(center = (x1, y1, z1), r=r1, n = nr1+1e-5j)])
        return s

    # initial guess
    #s1 = Sphere(n=1.6026+1e-5j, r = .6856e-6,
    #            center=(1.64155e-05, 1.7247e-05, 20.582e-6))
    #s2 = Sphere(n=1.6026+1e-5j, r = .695e-6,
    #            center=(1.758e-05, 1.753e-05, 21.2698e-6))
    #sc = Spheres([s1, s2])
    #alpha = 0.99

    #lb1 = Sphere(1+1e-5j, 1e-8, 0, 0, 0)
    #ub1 = Sphere(2+1e-5j, 1e-5, 1e-4, 1e-4, 1e-4)
    #step1 = Sphere(1e-4+1e-4j, 1e-8, 0, 0, 0)
    #lb = Spheres([lb1, lb1]), .1
    #ub = Spheres([ub1, ub1]), 1
    #step = Spheres([step1, step1]), 0

    model = Model(parameters, Multisphere, make_scatterer=make_scatterer, alpha
    = Parameter(.99, [.1, 1.0], 'alpha'))
    result = fit(model, holo)
    print result.scatterer

    gold = np.array([1.642e-5, 1.725e-5, 2.058e-5, 1e-5, 1.603, 6.857e-7,
                     1.758e-5, 1.753e-5, 2.127e-5, 1e-5, 1.603,
                     6.964e-7])
    gold_alpha = 1.0

    assert_parameters_allclose(result.scatterer, gold, rtol=1e-2)
    # TODO: This test fails, alpha comes back as .9899..., where did
    # the gold come from?
    assert_approx_equal(result.alpha, gold_alpha, significant=2)
Beispiel #9
0
def test_fit_complex_parameter():
    '''
    Test that complex parameters are handled correctly when fit.
    '''

    # use a Sphere with complex n
    # a fake scattering model
    def scat_func(sph, schema, scaling=None):
        # TODO: scaling kwarg required, seems like a silly kluge
        def silly_function(theta):
            return theta * sph.r + sph.n.real * theta**2 + 2. * sph.n.imag

        #import pdb
        #pdb.set_trace()
        return Marray(
            np.array([
                silly_function(theta)
                for theta, phi in schema.positions_theta_phi()
            ]), **schema._dict)

    # generate data
    schema = Schema(positions=Angles(np.linspace(0., np.pi / 2., 6)))
    ref_sph = Sphere(r=1.5, n=0.4 + 0.8j)
    data = scat_func(ref_sph, schema)

    # varying both real and imaginary parts
    par_s = Sphere(r=par(1.49),
                   n=ComplexParameter(real=par(0.405), imag=par(0.81)))
    model = Model(par_s, scat_func)
    result = fit(model, data)
    assert_allclose(result.scatterer.r, ref_sph.r)
    assert_allclose(result.scatterer.n.real, ref_sph.n.real)
    assert_allclose(result.scatterer.n.imag, ref_sph.n.imag)

    # varying just the real part
    par_s2 = Sphere(r=par(1.49), n=ComplexParameter(real=par(0.405), imag=0.8))
    model2 = Model(par_s2, scat_func)
    result2 = fit(model2, data)
    assert_allclose(result2.scatterer.r, ref_sph.r)
    assert_allclose(result2.scatterer.n.real, ref_sph.n.real)
    assert_allclose(result2.scatterer.n.imag, ref_sph.n.imag)
Beispiel #10
0
def test_fit_superposition():
    """
    Fit Mie superposition to a calculated hologram from two spheres
    """
    # Make a test hologram
    optics = Optics(wavelen=6.58e-07,
                    index=1.33,
                    polarization=[0.0, 1.0],
                    divergence=0,
                    spacing=None,
                    train=None,
                    mag=None,
                    pixel_scale=[2 * 2.302e-07, 2 * 2.302e-07])

    s1 = Sphere(n=1.5891 + 1e-4j, r=.65e-6, center=(1.56e-05, 1.44e-05, 15e-6))
    s2 = Sphere(n=1.5891 + 1e-4j, r=.65e-6, center=(3.42e-05, 3.17e-05, 10e-6))
    sc = Spheres([s1, s2])
    alpha = .629

    theory = Mie(optics, 100)
    holo = theory.calc_holo(sc, alpha)

    # Now construct the model, and fit
    parameters = [
        Parameter(name='x0', guess=1.6e-5, limit=[0, 1e-4]),
        Parameter('y0', 1.4e-5, [0, 1e-4]),
        Parameter('z0', 15.5e-6, [0, 1e-4]),
        Parameter('r0', .65e-6, [0.6e-6, 0.7e-6]),
        Parameter('nr', 1.5891, [1, 2]),
        Parameter('x1', 3.5e-5, [0, 1e-4]),
        Parameter('y1', 3.2e-5, [0, 1e-4]),
        Parameter('z1', 10.5e-6, [0, 1e-4]),
        Parameter('r1', .65e-6, [0.6e-6, 0.7e-6])
    ]

    def make_scatterer(x0, x1, y0, y1, z0, z1, r0, r1, nr):
        s = Spheres([
            Sphere(center=(x0, y0, z0), r=r0, n=nr + 1e-4j),
            Sphere(center=(x1, y1, z1), r=r1, n=nr + 1e-4j)
        ])
        return s

    model = Model(parameters,
                  Mie,
                  make_scatterer=make_scatterer,
                  alpha=Parameter('alpha', .63, [.5, 0.8]))
    result = fit(model, holo)

    assert_obj_close(result.scatterer, sc)
    assert_approx_equal(result.alpha, alpha, significant=4)
    assert_equal(result.model, model)
    assert_read_matches_write(result)
Beispiel #11
0
def test_integer_correctness():
    # we keep having bugs where the fitter doesn't
    schema = ImageSchema(shape = 100, spacing = .1,
                         optics = Optics(wavelen = .660, index = 1.33, polarization = (1, 0)))
    s = Sphere(center = (10.2, 9.8, 10.3), r = .5, n = 1.58)
    holo = Mie.calc_holo(s, schema)

    par_s = Sphere(center = (par(guess = 10, limit = [5,15]), par(10, [5, 15]), par(10, [5, 15])),
                   r = .5, n = 1.58)

    model = Model(par_s, Mie.calc_holo, alpha = par(.6, [.1, 1]))
    result = fit(model, holo)
    assert_allclose(result.scatterer.center, [10.2, 9.8, 10.3])
Beispiel #12
0
def test_Tying():

    #tied parameters
    n1 = par(1.59)
    sc = Spheres([
        Sphere(n=n1, r=par(0.5e-6), center=np.array([10., 10., 20.])),
        Sphere(n=n1, r=par(0.5e-6), center=np.array([9., 11., 21.]))
    ])
    model = Model(sc, Mie.calc_holo, alpha=par(.7, [.6, 1]))

    assert_equal(model.parameters[0].guess, 1.59)
    assert_equal(model.parameters[1].guess, 5e-7)
    assert_equal(len(model.parameters), 4)
Beispiel #13
0
def test_n():
    sph = Sphere(par(.5), 1.6, (5,5,5))
    sch = ImageSchema(shape=[100, 100], spacing=[0.1, 0.1],
                      optics=Optics(wavelen=0.66,
                                    index=1.33,
                                    polarization=[1, 0],
                                    divergence=0.0),
                      origin=[0.0, 0.0, 0.0])

    model = Model(sph, Mie.calc_holo, alpha=1)
    holo = Mie.calc_holo(model.scatterer.guess, sch)
    coster = CostComputer(holo, model, random_subset=.1)
    assert_allclose(coster.flattened_difference({'n' : .5}), 0)
Beispiel #14
0
def test_constraint():
    sch = ImageSchema(100)
    with warnings.catch_warnings():
        # TODO: we should really only supress overlap warnings here,
        # but I am too lazy to figure it out right now, and I don't
        # think we are likely to hit warnings here that won't get
        # caught elsewhere -tgd 2013-12-01
        warnings.simplefilter("ignore")
        spheres = Spheres([Sphere(r=.5, center=(0,0,0)),
                           Sphere(r=.5, center=(0,0,par(.2)))])
        model = Model(spheres, Multisphere.calc_holo, constraints=limit_overlaps())
        coster = CostComputer(sch, model)
        cost = coster._calc({'1:Sphere.center[2]' : .2})
        assert_equal(cost, np.ones_like(sch)*np.inf)
Beispiel #15
0
def test_ComplexPar():

    #complex parameter
    def makeScatterer(n):
        n**2
        return fake_sph

    parm = Parametrization(
        makeScatterer,
        [ComplexParameter(real=par(1.58), imag=par(.001), name='n')])
    model = Model(parm, Mie.calc_holo, alpha=par(.7, [.6, 1]))

    assert_equal(model.parameters[0].name, 'n.real')
    assert_equal(model.parameters[1].name, 'n.imag')
Beispiel #16
0
def test_fit_single_openopt():
    holo = normalize(get_example_data('image0001.yaml'))
    s = Sphere(center = (par(guess=.567e-5, limit=[.4e-5,.6e-5]),
                         par(.567e-5, (.4e-5, .6e-5)), par(15e-6, (1.3e-5, 1.8e-5))),
               r = par(8.5e-7, (5e-7, 1e-6)),
               n = ComplexParameter(par(1.59, (1.5,1.8)), 1e-4j))

    model = Model(s, Mie(False).calc_holo, alpha = par(.6, [.1,1]))
    try:
        minimizer = OpenOpt('scipy_slsqp')
    except ImportError:
        raise SkipTest
    result = fit(model, holo, minimizer = minimizer)
    assert_obj_close(result.scatterer, gold_sphere, rtol=1e-3)
    # TODO: see if we can get this back to 3 sig figs correct alpha
    assert_approx_equal(result.parameters['alpha'], gold_alpha, significant=3)
    assert_equal(model, result.model)
Beispiel #17
0
def test_fit_mie_par_scatterer():
    holo = normalize(get_example_data('image0001.yaml'))

    s = Sphere(center = (par(guess=.567e-5, limit=[0,1e-5]),
                         par(.567e-5, (0, 1e-5)), par(15e-6, (1e-5, 2e-5))),
               r = par(8.5e-7, (1e-8, 1e-5)),
               n = ComplexParameter(par(1.59, (1,2)), 1e-4j))

    thry = Mie(False)
    model = Model(s, thry.calc_holo, alpha = par(.6, [.1,1]))

    result = fit(model, holo)

    assert_obj_close(result.scatterer, gold_sphere, rtol=1e-3)
    # TODO: see if we can get this back to 3 sig figs correct alpha
    assert_approx_equal(result.parameters['alpha'], gold_alpha, significant=3)
    assert_equal(model, result.model)
    assert_read_matches_write(result)
Beispiel #18
0
def test_fit_random_subset():
    holo = normalize(get_example_data('image0001.yaml'))

    s = Sphere(center = (par(guess=.567e-5, limit=[0,1e-5]),
                         par(.567e-5, (0, 1e-5)), par(15e-6, (1e-5, 2e-5))),
               r = par(8.5e-7, (1e-8, 1e-5)), n = ComplexParameter(par(1.59, (1,2)),1e-4j))

    model = Model(s, Mie.calc_holo, alpha = par(.6, [.1,1]))
    np.random.seed(40)
    result = fit(model, holo, random_subset=.1)

    # we have to use a relatively loose tolerance here because the random
    # selection occasionally causes the fit to be a bit worse
    assert_obj_close(result.scatterer, gold_sphere, rtol=1e-3)
    # TODO: figure out if it is a problem that alpha is frequently coming out
    # wrong in the 3rd decimal place.
    assert_approx_equal(result.parameters['alpha'], gold_alpha, significant=3)
    assert_equal(model, result.model)

    assert_read_matches_write(result)
Beispiel #19
0
def test_fit_random_subset():
    holo = normalize(get_example_data('image0001.yaml'))

    s = Sphere(center=(par(guess=.567e-5, limit=[0, 1e-5]),
                       par(.567e-5, (0, 1e-5)), par(15e-6, (1e-5, 2e-5))),
               r=par(8.5e-7, (1e-8, 1e-5)),
               n=ComplexParameter(par(1.59, (1, 2)), 1e-4))

    model = Model(s, Mie(False).calc_holo, alpha=par(.6, [.1, 1]))
    np.random.seed(40)
    result = fit(model, holo, random_subset=.1)

    # TODO: this tolerance has to be rather large to pass, we should
    # probably track down if this is a sign of a problem
    assert_obj_close(result.scatterer, gold_sphere, rtol=1e-2)
    # TODO: figure out if it is a problem that alpha is frequently coming out
    # wrong in the 3rd decimal place.
    assert_approx_equal(result.parameters['alpha'], gold_alpha, significant=3)
    assert_equal(model, result.model)

    assert_read_matches_write(result)
Beispiel #20
0
def test_Get_Alpha():

    #checking get_alpha function
    sc = Spheres([
        Sphere(n=1.58, r=par(0.5e-6), center=np.array([10., 10., 20.])),
        Sphere(n=1.58, r=par(0.5e-6), center=np.array([9., 11., 21.]))
    ])
    model = Model(sc, Mie.calc_holo, alpha=par(.7, [.6, 1]))

    sc = Spheres([
        Sphere(n=1.58, r=par(0.5e-6), center=np.array([10., 10., 20.])),
        Sphere(n=1.58, r=par(0.5e-6), center=np.array([9., 11., 21.]))
    ])
    model2 = Model(sc, Mie.calc_holo)

    assert_equal(model.get_alpha(model.parameters).guess, 0.7)
    assert_equal(model.get_alpha(model.parameters).name, 'alpha')
    assert_equal(model2.get_alpha(model2.parameters), 1.0)
Beispiel #21
0
def test_io():
    model = Model(Sphere(par(1)), calc_holo)
    assert_read_matches_write(model)

    model = Model(Sphere(par(1)), calc_holo, theory=Mie(False))
    assert_read_matches_write(model)
Beispiel #22
0
def test_io():
    model = Model(Sphere(par(1)), Mie.calc_holo)
    assert_read_matches_write(model)

    model = Model(Sphere(par(1)), Mie(False).calc_holo)
    assert_read_matches_write(model)
Beispiel #23
0
def test_model_guess():
    ps = Sphere(n=par(1.59, [1.5,1.7]), r = .5, center=(5,5,5))
    m = Model(ps, Mie)
    assert_obj_close(m.scatterer.guess, Sphere(n=1.59, r=0.5, center=[5, 5, 5]))