def M(psi, det_mod): """.. method:: M(mode, psi_modes, det_mod) Applies modulus constraint to psi_modes(mode) for a given position. :param list psi_modes: A list of CXData instances containing all modes at a given position. :param np.ndarray det_mod: Modulus of measured diffraction pattern. """ if isinstance(psi, CXData): return ifft2(det_mod * exp(complex(0., 1.) * angle(fft2(psi)))) elif isinstance(psi, CXModal): mode_sum = CXModal.modal_sum(abs(fft2(psi))**2.0)**0.5 return ifft2((fft2(psi)/(mode_sum))*det_mod)
def update_figure(self, i=0): cur_cmap = cm.RdGy_r self.f1.clf() self.init_figure() wh = sp.where(abs(self.object.data[0]) > 0.1 * (abs(self.object.data[0]).max())) try: x1, x2 = min(wh[0]), max(wh[0]) y1, y2 = min(wh[1]), max(wh[1]) except (ValueError, IndexError): x1, x2 = 0, self.ob_p y1, y2 = 0, self.ob_p # Plot magnitude of object s1 = pylab.subplot(231) s1_im = s1.imshow(abs(self.object).data[0][x1:x2, y1:y2], cmap=cm.Greys_r) s1.set_title('|object|') plt.axis('off') pylab.colorbar(s1_im) # Plot phase of object s2 = pylab.subplot(232) s2_im = s2.imshow(sp.angle(self.object.data[0][x1:x2, y1:y2]), cmap=cm.hsv) s2.set_title('phase(object)') plt.axis('off') pylab.colorbar(s2_im) # Complex HSV plot of object s3 = pylab.subplot(233) h = ((angle(self.object).data[0][x1:x2, y1:y2] + np.pi) / (2*np.pi)) % 1.0 s = np.ones_like(h) l = abs(self.object).data[0][x1:x2, y1:y2] l-=l.min() l/=l.max() s3_im = s3.imshow(np.dstack(v_hls_to_rgb(h,l,s))) s3.set_title('Complex plot of Object') plt.axis('off') # Plot probe mode 0 s4 = pylab.subplot(234) s4_im = s4.imshow(abs(self.probe.modes[0].data[0]), cmap=cur_cmap) s4.set_title('|probe0|') plt.axis('off') pylab.colorbar(s4_im) if CXP.reconstruction.probe_modes>1: s5 = pylab.subplot(235) s5_im = s5.imshow(abs(self.probe.modes[1].data[0]), cmap=cur_cmap) s5.set_title('|probe1|') plt.axis('off') pylab.colorbar(s5_im) else: pass if self.ppc: s6 = self.f1.add_subplot(236) s6_im = s6.scatter(self.positions.data[0], self.positions.data[1], s=10, c='b', marker='o', alpha=0.5, edgecolors='none', label='current') patches = [] for m in range(self.positions.total): patches.append(Circle((self.positions.initial[0][m], self.positions.initial[1][m]), radius=CXP.reconstruction.ppc_search_radius)) collection = PatchCollection(patches, color='tomato', alpha=0.2, edgecolors=None) s4.add_collection(collection) if CXP.measurement.simulate_data: s4_im = s4.scatter(self.positions.correct[0], self.positions.correct[1], s=10, c='g', marker='o', alpha=0.5, edgecolors='none', label='correct') CXP.log.info('RMS position deviation from correct: [x:{:3.2f},y:{:3.2f}] pixels'.format( sp.sqrt(sp.mean((self.positions.data[0] - self.positions.correct[0])**2.)), sp.sqrt(sp.mean((self.positions.data[1] - self.positions.correct[1])**2.)))) lines=[] for m in range(self.positions.total): lines.append(((self.positions.correct[0][m], self.positions.correct[1][m]), (self.positions.data[0][m], self.positions.data[1][m]))) for element in lines: x, y = zip(*element) s4.plot(x, y, 'g-') else: lines = [] for m in range(self.positions.total): lines.append(((self.positions.initial[0][m], self.positions.initial[1][m]), (self.positions.data[0][m], self.positions.data[1][m]))) for element in lines: x, y = zip(*element) s6.plot(x, y, 'g-') CXP.log.info('RMS position deviation from initial: [x:{:3.2f},y:{:3.2f}] pixels'.format( sp.sqrt(sp.mean((self.positions.data[0] - self.positions.initial[0])**2.)), sp.sqrt(sp.mean((self.positions.data[1] - self.positions.initial[1])**2.)))) s6.legend(prop={'size': 6}) s6.set_title('Position Correction') s6.set_aspect('equal') extent = s6.get_window_extent().transformed(self.f1.dpi_scale_trans.inverted()) pylab.savefig(self._cur_sequence_dir + '/ppc_{:d}.png'.format(self.total_its), bbox_inches=extent.expanded(1.2, 1.2), dpi=100) s6.set_aspect('auto') else: s6 = pylab.subplot(236) if CXP.measurement.simulate_data: s6_im = s6.imshow(abs(self.input_probe[1].data[0]), cmap = cur_cmap) s6.set_title('|input_probe1|') else: s6_im = s6.imshow(nlog(fftshift(self.det_mod[np.mod(i,self.positions.total)])).data[0], cmap=cur_cmap) s6.set_title('Diff Patt: {:d}'.format(i)) plt.axis('off') pylab.colorbar(s6_im) pylab.draw() pylab.savefig(self._cur_sequence_dir + '/recon_{:d}.png'.format(self.total_its), dpi=60)