diff --git a/1d_separation.py b/1d_separation.py index 59a1a8021a13e0a195135dab23032f2c274b5cb3..14f976db5e9297cfc4dfcf94aec896990fca8cc3 100644 --- a/1d_separation.py +++ b/1d_separation.py @@ -16,7 +16,8 @@ if __name__ == '__main__': sh = S.draw_sample() s = FFT(sh) - u = ift.Field(s_space, val = -12) + u = ift.Field(s_space, val = -12.) + u.val[200] = 1 u.val[300] = 3 u.val[500] = 4 diff --git a/hubble_separation.py b/hubble_separation.py index 2199e549848448c2c74b683e9b1d2bb99734e258..20973e089986c86a466c030dff6b138ffd1a54d7 100644 --- a/hubble_separation.py +++ b/hubble_separation.py @@ -10,16 +10,15 @@ from mpl_toolkits.axes_grid1 import make_axes_locatable from mpl_toolkits.axes_grid1 import AxesGrid - np.random.seed(42) if __name__ == '__main__': path = 'hst_05195_01_wfpc2_f702w_pc_sci.fits' data = load_data(path) alpha = 1.3 - myEnergy = build_problem(data, alpha=alpha, BFGS=True) + myEnergy = build_problem(data, alpha=alpha, BFGS=False) for i in range(10): - myEnergy = problem_iteration(myEnergy, iterations=10, BFGS=True) + myEnergy = problem_iteration(myEnergy, iterations=10, BFGS=False) A = ift.FFTSmoothingOperator(myEnergy.position.domain, sigma=2.) plt.magma() size = 15 @@ -42,7 +41,7 @@ if __name__ == '__main__': plt.axis('off') ax = plt.gca() - im = ax.imshow(A(myEnergy.point_like).val, norm=LogNorm(vmin=vmin, vmax=vmax)) + im = ax.imshow(myEnergy.point_like.val, norm=LogNorm(vmin=vmin, vmax=vmax)) divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.05) cbar = plt.colorbar(im, cax=cax) @@ -67,7 +66,7 @@ if __name__ == '__main__': plt.figure() - fig, ax = plt.subplots(1, 3, figsize=(6, 3)) + fig, ax = plt.subplots(1, 3, figsize=(6, 4)) plt.suptitle('zoomed in section', size=size) # fig.tight_layout() @@ -120,12 +119,3 @@ if __name__ == '__main__': for cax in grid.cbar_axes: cax.toggle_label(True) - - plt.close() - plt.figure() - power = ift.power_analyze(myEnergy.diffuse) - k_lengths = power.domain.k_lenghts - plt.plot(power.val, k_lengths, 'k-') - plt.yscale('log') - plt.xscale('log') - plt.title('diffuse power') diff --git a/separation_energy.py b/separation_energy.py index d9e6500e2db4242945ec877b91bab4c91ce7c0ba..2feaf7e0a06e87eeaed425c68e1d01027e6de3c0 100644 --- a/separation_energy.py +++ b/separation_energy.py @@ -5,7 +5,7 @@ from nifty4.library.nonlinearities import PositiveTanh class SeparationEnergy(ift.Energy): def __init__(self, position, data, alpha, correlation, inverter=None): - if (position>9.).any() or (position<-9.).any(): + if (position > 9.).any() or (position < -9.).any(): raise ValueError("position outside allowed range") super(SeparationEnergy, self).__init__(position=position) @@ -14,7 +14,10 @@ class SeparationEnergy(ift.Energy): self._inverter = inverter self._q = 1e-40 - h_space = correlation.domain[0] if correlation is not None else position.domain[0].get_default_codomain() + if correlation is None: + h_space = position.domain[0].get_default_codomain() + else: + h_space = correlation.domain[0] FFT = ift.FFTOperator(h_space, position.domain[0]) self._ptanh = PositiveTanh() @@ -24,8 +27,10 @@ class SeparationEnergy(ift.Energy): s = ift.log(data * one_m_a) if correlation is None: - binbounds = ift.PowerSpace.useful_binbounds(h_space, logarithmic=False) - correlation = ift.power_analyze(FFT.inverse_times(s), binbounds=binbounds) + binbounds = ift.PowerSpace.useful_binbounds(h_space, + logarithmic=False) + correlation = ift.power_analyze(FFT.inverse_times(s), + binbounds=binbounds) correlation = ift.create_power_operator(h_space, correlation) self._correlation = correlation @@ -45,21 +50,23 @@ class SeparationEnergy(ift.Energy): s_p = -a_p/one_m_a diffuse = Sis * s_p - point = (alpha - 1. - qexpmu) * a_p/a + u_p = a_p/a + point = (alpha - 1. - qexpmu) * u_p det = position / var_x det += s_p self._gradient = (diffuse + point + det).lock() - if inverter is not None: # curvature is needed, remember some values - self._qexpmu = qexpmu - self._s_p = s_p - self._FFT = FFT - self._var_x = var_x - self._point = point - self._u_p = a_p/a + if inverter is not None: # curvature is needed + point = qexpmu * u_p ** 2 + R = FFT.inverse * s_p + N = self._correlation + S = ift.DiagonalOperator(1./(point + 1./var_x)) + self._curvature = ift.library.WienerFilterCurvature( + R=R, N=N, S=S, inverter=self._inverter) def at(self, position): - return self.__class__(position, self._data, self._alpha, self._correlation, self._inverter) + return self.__class__(position, self._data, self._alpha, + self._correlation, self._inverter) @property def diffuse(self): @@ -74,7 +81,8 @@ class SeparationEnergy(ift.Energy): return SeparationEnergy(position, data, alpha, None, inverter) def with_new_correlation(self): - return SeparationEnergy(self._position, self._data, self._alpha, None, self._inverter) + return SeparationEnergy(self._position, self._data, self._alpha, None, + self._inverter) @property def value(self): @@ -86,16 +94,11 @@ class SeparationEnergy(ift.Energy): @property def curvature(self): - point = self._qexpmu * self._u_p ** 2 - R = self._FFT.inverse * self._s_p - N = self._correlation - S = ift.DiagonalOperator(1/(point + 1/self._var_x)) - return ift.library.WienerFilterCurvature(R=R, N=N, S=S, - inverter=self._inverter) + return self._curvature def longest_step(self, dir): - p = self.position.to_global_data() - d = dir.to_global_data() - lim = np.where(d>0, 9, -9) + p = self.position.local_data + d = dir.local_data + lim = np.where(d > 0, 9, -9) dist = (lim-p)/d - return np.min(dist) + return ift.Field.from_local_data(self.position.domain, dist).min()