class Config: def __init__(self): pass def make( self, wavelength, aperture_radius, focal_length, pixel_size, image_width, image_height, n_alpha, n_beta, fit_L, fit_K, focus_positions): self.wavelength = wavelength self.aperture_radius = aperture_radius self.focal_length = focal_length self.image_width = image_width self.image_height = image_height self.pixel_size = pixel_size self.n_alpha, self.n_beta = n_alpha, n_beta self.fit_L, self.fit_K = fit_L, fit_K self.focus_positions = np.array(focus_positions) fu = enz.get_field_unit( wavelength, aperture_radius, focal_length) def make_space(w, p, fu): if w % 2 == 0: return np.linspace(-(w/2 - 0.5), w/2 - 0.5, w)*p/fu else: return np.linspace(-(w - 1)/2, (w - 1)/2, w)*p/fu # image side space xspace = make_space(image_width, pixel_size, fu) yspace = make_space(image_height, pixel_size, fu) self.xspace, self.yspace = xspace, yspace # phase self.phase_grid = RZern(n_alpha) self.phase_fit = FitZern(self.phase_grid, self.fit_L, self.fit_K) print('phase: n_alpha = {}, N_alpha = {}'.format( self.n_alpha, self.phase_grid.nk)) # complex psf self.cpsf = CPsf(n_beta) self.gpf_fit = FitZern(self.cpsf.czern, self.fit_L, self.fit_K) print('cpsf: n_beta = {}, N_beta = {}, N_f = {}'.format( n_beta, self.cpsf.czern.nk, self.focus_positions.size)) # make phase polar grid t1 = time.time() self.phase_grid.make_pol_grid( self.phase_fit.rho_j, self.phase_fit.theta_i) t2 = time.time() print('make phase pol grid {:.6f}'.format(t2 - t1)) # make gpf polar grid (Zernike approximation) t1 = time.time() self.cpsf.czern.make_pol_grid( self.phase_fit.rho_j, self.phase_fit.theta_i) t2 = time.time() print('make gpf pol grid {:.6f}'.format(t2 - t1)) # make cpsf cart grid t1 = time.time() self.cpsf.make_cart_grid( x_sp=xspace, y_sp=yspace, f_sp=focus_positions) t2 = time.time() print('make cpsf cart grid {:.6f}'.format(t2 - t1)) def save(self, filename, prepend=None, libver='latest'): """Save object into an HDF5 file.""" f = h5py.File(filename, 'w', libver=libver) self.save_h5py(f, prepend=prepend) f.close() print('saved <{}>'.format(filename)) def save_h5py(self, f, prepend=None): """Dump object contents into an opened HDF5 file object.""" prefix = 'Config/' if prepend is not None: prefix = prepend + prefix params = { 'chunks': True, 'shuffle': True, 'fletcher32': True, 'compression': 'gzip', 'compression_opts': 9, } f.create_dataset( prefix + 'wavelength', data=np.array([self.wavelength], dtype=np.float)) f.create_dataset( prefix + 'aperture_radius', data=np.array([self.aperture_radius], dtype=np.float)) f.create_dataset( prefix + 'focal_length', data=np.array([self.focal_length], dtype=np.float)) f.create_dataset( prefix + 'image_width', data=np.array([self.image_width], dtype=np.int)) f.create_dataset( prefix + 'image_height', data=np.array([self.image_height], dtype=np.int)) f.create_dataset( prefix + 'pixel_size', data=np.array([self.pixel_size], dtype=np.float)) f.create_dataset( prefix + 'n_alpha', data=np.array([self.n_alpha], dtype=np.int)) f.create_dataset( prefix + 'n_beta', data=np.array([self.n_beta], dtype=np.int)) f.create_dataset( prefix + 'fit_L', data=np.array([self.fit_L], dtype=np.int)) f.create_dataset( prefix + 'fit_K', data=np.array([self.fit_K], dtype=np.int)) params['data'] = self.focus_positions f.create_dataset(prefix + 'focus_positions', **params) params['data'] = self.xspace f.create_dataset(prefix + 'xspace', **params) params['data'] = self.yspace f.create_dataset(prefix + 'yspace', **params) self.phase_fit.save_h5py(f, prepend=prefix+'phase_fit/') self.cpsf.save_h5py(f, prepend=prefix+'cpsf/') self.gpf_fit.save_h5py(f, prepend=prefix+'gpf_fit/') @classmethod def load(cls, filename, prepend=None): """Load object from an HDF5 file.""" f = h5py.File(filename, 'r') print('load <{}>'.format(filename)) z = cls.load_h5py(f, prepend=prepend) f.close() return z @classmethod def load_h5py(cls, f, prepend=None): """Load object contents from an opened HDF5 file object.""" sc = cls() prefix = 'Config/' if prepend is not None: prefix = prepend + prefix sc.wavelength = float(f[prefix + 'wavelength'].value[0]) sc.aperture_radius = float(f[prefix + 'aperture_radius'].value[0]) sc.focal_length = float(f[prefix + 'focal_length'].value[0]) sc.image_width = int(f[prefix + 'image_width'].value[0]) sc.image_height = int(f[prefix + 'image_height'].value[0]) sc.pixel_size = float(f[prefix + 'pixel_size'].value[0]) sc.n_alpha = int(f[prefix + 'n_alpha'].value[0]) sc.n_beta = int(f[prefix + 'n_beta'].value[0]) sc.fit_L = int(f[prefix + 'fit_L'].value[0]) sc.fit_K = int(f[prefix + 'fit_K'].value[0]) sc.focus_positions = f[prefix + 'focus_positions'].value sc.xspace = f[prefix + 'xspace'].value sc.yspace = f[prefix + 'yspace'].value sc.phase_fit = FitZern.load_h5py(f, prepend=prefix+'phase_fit/') sc.phase_grid = sc.phase_fit.z sc.cpsf = CPsf.load_h5py(f, prepend=prefix+'cpsf/') sc.gpf_fit = FitZern.load_h5py(f, prepend=prefix+'gpf_fit/') sc.gpf_fit.z = sc.cpsf.czern print('phase: n_alpha = {}, N_alpha = {}'.format( sc.n_alpha, sc.phase_grid.nk)) print('cpsf: n_beta = {}, N_beta = {}, N_f = {}'.format( sc.n_beta, sc.cpsf.czern.nk, sc.focus_positions.size)) return sc
class Config: def __init__(self): pass def make(self, wavelength, aperture_radius, focal_length, pixel_size, image_width, image_height, n_alpha, n_beta, fit_L, fit_K, focus_positions): self.wavelength = wavelength self.aperture_radius = aperture_radius self.focal_length = focal_length self.image_width = image_width self.image_height = image_height self.pixel_size = pixel_size self.n_alpha, self.n_beta = n_alpha, n_beta self.fit_L, self.fit_K = fit_L, fit_K self.focus_positions = np.array(focus_positions) fu = enz.get_field_unit(wavelength, aperture_radius, focal_length) def make_space(w, p, fu): if w % 2 == 0: return np.linspace(-(w / 2 - 0.5), w / 2 - 0.5, w) * p / fu else: return np.linspace(-(w - 1) / 2, (w - 1) / 2, w) * p / fu # image side space xspace = make_space(image_width, pixel_size, fu) yspace = make_space(image_height, pixel_size, fu) self.xspace, self.yspace = xspace, yspace # phase self.phase_grid = RZern(n_alpha) self.phase_fit = FitZern(self.phase_grid, self.fit_L, self.fit_K) print('phase: n_alpha = {}, N_alpha = {}'.format( self.n_alpha, self.phase_grid.nk)) # complex psf self.cpsf = CPsf(n_beta) self.gpf_fit = FitZern(self.cpsf.czern, self.fit_L, self.fit_K) print('cpsf: n_beta = {}, N_beta = {}, N_f = {}'.format( n_beta, self.cpsf.czern.nk, self.focus_positions.size)) # make phase polar grid t1 = time.time() self.phase_grid.make_pol_grid(self.phase_fit.rho_j, self.phase_fit.theta_i) t2 = time.time() print('make phase pol grid {:.6f}'.format(t2 - t1)) # make gpf polar grid (Zernike approximation) t1 = time.time() self.cpsf.czern.make_pol_grid(self.phase_fit.rho_j, self.phase_fit.theta_i) t2 = time.time() print('make gpf pol grid {:.6f}'.format(t2 - t1)) # make cpsf cart grid t1 = time.time() self.cpsf.make_cart_grid(x_sp=xspace, y_sp=yspace, f_sp=focus_positions) t2 = time.time() print('make cpsf cart grid {:.6f}'.format(t2 - t1)) def save(self, filename, prepend=None, libver='latest'): """Save object into an HDF5 file.""" f = h5py.File(filename, 'w', libver=libver) self.save_h5py(f, prepend=prepend) f.close() print('saved <{}>'.format(filename)) def save_h5py(self, f, prepend=None): """Dump object contents into an opened HDF5 file object.""" prefix = 'Config/' if prepend is not None: prefix = prepend + prefix params = { 'chunks': True, 'shuffle': True, 'fletcher32': True, 'compression': 'gzip', 'compression_opts': 9, } f.create_dataset(prefix + 'wavelength', data=np.array([self.wavelength], dtype=np.float)) f.create_dataset(prefix + 'aperture_radius', data=np.array([self.aperture_radius], dtype=np.float)) f.create_dataset(prefix + 'focal_length', data=np.array([self.focal_length], dtype=np.float)) f.create_dataset(prefix + 'image_width', data=np.array([self.image_width], dtype=np.int)) f.create_dataset(prefix + 'image_height', data=np.array([self.image_height], dtype=np.int)) f.create_dataset(prefix + 'pixel_size', data=np.array([self.pixel_size], dtype=np.float)) f.create_dataset(prefix + 'n_alpha', data=np.array([self.n_alpha], dtype=np.int)) f.create_dataset(prefix + 'n_beta', data=np.array([self.n_beta], dtype=np.int)) f.create_dataset(prefix + 'fit_L', data=np.array([self.fit_L], dtype=np.int)) f.create_dataset(prefix + 'fit_K', data=np.array([self.fit_K], dtype=np.int)) params['data'] = self.focus_positions f.create_dataset(prefix + 'focus_positions', **params) params['data'] = self.xspace f.create_dataset(prefix + 'xspace', **params) params['data'] = self.yspace f.create_dataset(prefix + 'yspace', **params) self.phase_fit.save_h5py(f, prepend=prefix + 'phase_fit/') self.cpsf.save_h5py(f, prepend=prefix + 'cpsf/') self.gpf_fit.save_h5py(f, prepend=prefix + 'gpf_fit/') @classmethod def load(cls, filename, prepend=None): """Load object from an HDF5 file.""" f = h5py.File(filename, 'r') print('load <{}>'.format(filename)) z = cls.load_h5py(f, prepend=prepend) f.close() return z @classmethod def load_h5py(cls, f, prepend=None): """Load object contents from an opened HDF5 file object.""" sc = cls() prefix = 'Config/' if prepend is not None: prefix = prepend + prefix sc.wavelength = float(f[prefix + 'wavelength'].value[0]) sc.aperture_radius = float(f[prefix + 'aperture_radius'].value[0]) sc.focal_length = float(f[prefix + 'focal_length'].value[0]) sc.image_width = int(f[prefix + 'image_width'].value[0]) sc.image_height = int(f[prefix + 'image_height'].value[0]) sc.pixel_size = float(f[prefix + 'pixel_size'].value[0]) sc.n_alpha = int(f[prefix + 'n_alpha'].value[0]) sc.n_beta = int(f[prefix + 'n_beta'].value[0]) sc.fit_L = int(f[prefix + 'fit_L'].value[0]) sc.fit_K = int(f[prefix + 'fit_K'].value[0]) sc.focus_positions = f[prefix + 'focus_positions'].value sc.xspace = f[prefix + 'xspace'].value sc.yspace = f[prefix + 'yspace'].value sc.phase_fit = FitZern.load_h5py(f, prepend=prefix + 'phase_fit/') sc.phase_grid = sc.phase_fit.z sc.cpsf = CPsf.load_h5py(f, prepend=prefix + 'cpsf/') sc.gpf_fit = FitZern.load_h5py(f, prepend=prefix + 'gpf_fit/') sc.gpf_fit.z = sc.cpsf.czern print('phase: n_alpha = {}, N_alpha = {}'.format( sc.n_alpha, sc.phase_grid.nk)) print('cpsf: n_beta = {}, N_beta = {}, N_f = {}'.format( sc.n_beta, sc.cpsf.czern.nk, sc.focus_positions.size)) return sc