From 02d5f1fdd3af498dda8a985f6da55118666c0a15 Mon Sep 17 00:00:00 2001 From: Jiri Borovec Date: Tue, 20 Mar 2018 10:53:42 +0100 Subject: [PATCH 1/2] refactor too long demon _iterate method --- dipy/align/imwarp.py | 53 ++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/dipy/align/imwarp.py b/dipy/align/imwarp.py index 61028cd24c..b3cf5e2b92 100644 --- a/dipy/align/imwarp.py +++ b/dipy/align/imwarp.py @@ -1208,13 +1208,7 @@ def _iterate(self): fw_step = np.array(self.metric.compute_forward()) # set zero displacements at the boundary - fw_step[0, ...] = 0 - fw_step[:, 0, ...] = 0 - fw_step[-1, ...] = 0 - fw_step[:, -1, ...] = 0 - if(self.dim == 3): - fw_step[:, :, 0, ...] = 0 - fw_step[:, :, -1, ...] = 0 + fw_step = self.__set_no_boundary_displacement(fw_step) # Normalize the forward step nrm = np.sqrt(np.sum((fw_step/current_disp_spacing)**2, -1)).max() @@ -1234,10 +1228,7 @@ def _iterate(self): bw_step = np.array(self.metric.compute_backward()) # set zero displacements at the boundary - bw_step[0, ...] = 0 - bw_step[:, 0, ...] = 0 - if(self.dim == 3): - bw_step[:, :, 0, ...] = 0 + bw_step = self.__set_no_boundary_displacement(bw_step) # Normalize the backward step nrm = np.sqrt(np.sum((bw_step/current_disp_spacing) ** 2, -1)).max() @@ -1264,6 +1255,38 @@ def _iterate(self): self.energy_list.append(fw_energy + bw_energy) + self.__invert_models(current_disp_world2grid, current_disp_spacing) + + # Free resources no longer needed to compute the forward and backward + # steps + if self.callback is not None: + self.callback(self, RegistrationStages.ITER_END) + self.metric.free_iteration() + + return der + + def __set_no_boundary_displacement(self, step): + """ set zero displacements at the boundary + + :param ndarray step: + :return ndarray: + """ + step[0, ...] = 0 + step[:, 0, ...] = 0 + step[-1, ...] = 0 + step[:, -1, ...] = 0 + if self.dim == 3: + step[:, :, 0, ...] = 0 + step[:, :, -1, ...] = 0 + return step + + def __invert_models(self, current_disp_world2grid, current_disp_spacing): + """ converting static - moving models in both direction + + :param current_disp_world2grid: + :param current_disp_spacing: + """ + # Invert the forward model's forward field self.static_to_ref.backward = np.array( self.invert_vector_field( @@ -1296,14 +1319,6 @@ def _iterate(self): current_disp_spacing, self.inv_iter, self.inv_tol, self.moving_to_ref.forward)) - # Free resources no longer needed to compute the forward and backward - # steps - if self.callback is not None: - self.callback(self, RegistrationStages.ITER_END) - self.metric.free_iteration() - - return der - def _approximate_derivative_direct(self, x, y): r"""Derivative of the degree-2 polynomial fit of the given x, y pairs From 293878f7208e9f0d28cfc4d28bdacd224ac97c2b Mon Sep 17 00:00:00 2001 From: Jiri Borovec Date: Thu, 22 Mar 2018 15:37:19 +0100 Subject: [PATCH 2/2] update docstring --- dipy/align/imwarp.py | 63 ++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/dipy/align/imwarp.py b/dipy/align/imwarp.py index b3cf5e2b92..67a1aef7a3 100644 --- a/dipy/align/imwarp.py +++ b/dipy/align/imwarp.py @@ -1268,8 +1268,15 @@ def _iterate(self): def __set_no_boundary_displacement(self, step): """ set zero displacements at the boundary - :param ndarray step: - :return ndarray: + Parameters + ---------- + step : array, ndim 2 or 3 + displacements field + + Returns + ------- + step : array, ndim 2 or 3 + displacements field """ step[0, ...] = 0 step[:, 0, ...] = 0 @@ -1281,43 +1288,49 @@ def __set_no_boundary_displacement(self, step): return step def __invert_models(self, current_disp_world2grid, current_disp_spacing): - """ converting static - moving models in both direction + """Converting static - moving models in both direction. - :param current_disp_world2grid: - :param current_disp_spacing: + Parameters + ---------- + current_disp_world2grid : array, shape (3, 3) or (4, 4) + the space-to-grid transformation associated to the displacement field + d (transforming physical space coordinates to voxel coordinates of the + displacement field grid) + current_disp_spacing :array, shape (2,) or (3,) + the spacing between voxels (voxel size along each axis) """ # Invert the forward model's forward field self.static_to_ref.backward = np.array( - self.invert_vector_field( - self.static_to_ref.forward, - current_disp_world2grid, - current_disp_spacing, - self.inv_iter, self.inv_tol, self.static_to_ref.backward)) + self.invert_vector_field(self.static_to_ref.forward, + current_disp_world2grid, + current_disp_spacing, + self.inv_iter, self.inv_tol, + self.static_to_ref.backward)) # Invert the backward model's forward field self.moving_to_ref.backward = np.array( - self.invert_vector_field( - self.moving_to_ref.forward, - current_disp_world2grid, - current_disp_spacing, - self.inv_iter, self.inv_tol, self.moving_to_ref.backward)) + self.invert_vector_field(self.moving_to_ref.forward, + current_disp_world2grid, + current_disp_spacing, + self.inv_iter, self.inv_tol, + self.moving_to_ref.backward)) # Invert the forward model's backward field self.static_to_ref.forward = np.array( - self.invert_vector_field( - self.static_to_ref.backward, - current_disp_world2grid, - current_disp_spacing, - self.inv_iter, self.inv_tol, self.static_to_ref.forward)) + self.invert_vector_field(self.static_to_ref.backward, + current_disp_world2grid, + current_disp_spacing, + self.inv_iter, self.inv_tol, + self.static_to_ref.forward)) # Invert the backward model's backward field self.moving_to_ref.forward = np.array( - self.invert_vector_field( - self.moving_to_ref.backward, - current_disp_world2grid, - current_disp_spacing, - self.inv_iter, self.inv_tol, self.moving_to_ref.forward)) + self.invert_vector_field(self.moving_to_ref.backward, + current_disp_world2grid, + current_disp_spacing, + self.inv_iter, self.inv_tol, + self.moving_to_ref.forward)) def _approximate_derivative_direct(self, x, y): r"""Derivative of the degree-2 polynomial fit of the given x, y pairs