def test_multipledataset_corefinement(self): # test corefinement of three datasets data361 = ReflectDataset(os.path.join(self.pth, 'e361r.txt')) data365 = ReflectDataset(os.path.join(self.pth, 'e365r.txt')) data366 = ReflectDataset(os.path.join(self.pth, 'e366r.txt')) si = SLD(2.07, name='Si') sio2 = SLD(3.47, name='SiO2') d2o = SLD(6.36, name='d2o') h2o = SLD(-0.56, name='h2o') cm3 = SLD(3.47, name='cm3') polymer = SLD(1, name='polymer') structure361 = si | sio2(10, 4) | polymer(200, 3) | d2o(0, 3) structure365 = si | structure361[1] | structure361[2] | cm3(0, 3) structure366 = si | structure361[1] | structure361[2] | h2o(0, 3) structure365[-1].rough = structure361[-1].rough structure366[-1].rough = structure361[-1].rough structure361[1].thick.setp(vary=True, bounds=(0, 20)) structure361[2].thick.setp(value=200., bounds=(200., 250.), vary=True) structure361[2].sld.real.setp(vary=True, bounds=(0, 2)) structure361[2].vfsolv.setp(value=5., bounds=(0., 100.), vary=True) model361 = ReflectModel(structure361, bkg=2e-5) model365 = ReflectModel(structure365, bkg=2e-5) model366 = ReflectModel(structure366, bkg=2e-5) model361.bkg.setp(vary=True, bounds=(1e-6, 5e-5)) model365.bkg.setp(vary=True, bounds=(1e-6, 5e-5)) model366.bkg.setp(vary=True, bounds=(1e-6, 5e-5)) objective361 = Objective(model361, data361) objective365 = Objective(model365, data365) objective366 = Objective(model366, data366) global_objective = GlobalObjective( [objective361, objective365, objective366]) # are the right numbers of parameters varying? assert_equal(len(global_objective.varying_parameters()), 7) # can we set the parameters? global_objective.setp(np.array([1e-5, 10, 212, 1, 10, 1e-5, 1e-5])) f = CurveFitter(global_objective) f.fit() indiv_chisqr = np.sum( [objective.chisqr() for objective in global_objective.objectives]) # the overall chi2 should be sum of individual chi2 global_chisqr = global_objective.chisqr() assert_almost_equal(global_chisqr, indiv_chisqr) # now check that the parameters were held in common correctly. slabs361 = structure361.slabs() slabs365 = structure365.slabs() slabs366 = structure366.slabs() assert_equal(slabs365[0:2, 0:5], slabs361[0:2, 0:5]) assert_equal(slabs366[0:2, 0:5], slabs361[0:2, 0:5]) assert_equal(slabs365[-1, 3], slabs361[-1, 3]) assert_equal(slabs366[-1, 3], slabs361[-1, 3]) # check that the residuals are the correct lengths res361 = objective361.residuals() res365 = objective365.residuals() res366 = objective366.residuals() res_global = global_objective.residuals() assert_allclose(res_global[0:len(res361)], res361, rtol=1e-5) assert_allclose(res_global[len(res361):len(res361) + len(res365)], res365, rtol=1e-5) assert_allclose(res_global[len(res361) + len(res365):], res366, rtol=1e-5) repr(global_objective)
fig = plt.figure(figsize=(5, 25 / 6)) gs = mpl.gridspec.GridSpec(1, 3) ax1 = plt.subplot(gs[0, 0:2]) ax2 = plt.subplot(gs[0, 2]) abc = {'dspc_20': '(a)', 'dspc_30': '(a)', 'dspc_40': '(a)', 'dspc_50': '(a)'} chi = np.zeros((7)) for i in range(len(cont)): choose = global_objective.pgen(ngen=100) ax1.errorbar(datasets[i].x, datasets[i].y * (datasets[i].x)**4 * 10**(i - 1), yerr=datasets[i].y_err * (datasets[i].x)**4 * 10**(i - 1), linestyle='', marker='o', color=sns.color_palette()[i]) for pvec in choose: global_objective.setp(pvec) ax1.plot(datasets[i].x, models[i](datasets[i].x, x_err=datasets[i].x_err) * (datasets[i].x)**4 * 10**(i - 1), color=sns.color_palette()[i], alpha=0.1) zs, sld = structures[i].sld_profile() if zs.min() > -20: x2 = np.linspace(-20, zs.min(), 100) zs = np.append(x2, zs) y2 = np.zeros_like(x2) sld = np.append(y2, sld) if zs.max() < 80: x3 = np.linspace(zs.max(), 81, 100) y3 = np.ones_like(x3) * sld[-1] zs = np.append(zs, x3)