예제 #1
0
    def update(self, geo_pars=None, **kwargs):
        """
        update internal p dictionary. Recompute all internal array buffers
        """
        # local reference to avoid excessive self. use
        p = self.p
        if geo_pars is not None:
            p.update(geo_pars)
        for k, v in kwargs.iteritems():
            if p.has_key(k): p[k] = v

        self.sh = p.N

        # calculate the grids
        [X, Y] = u.grids(self.sh, p.psize_sam, p.origin_sam)

        # maybe useful later. delete this references if space is short
        self.grids_sam = [X, Y]
        self.grids_det = [X, Y]

        # calculating kernel
        psize_fspace = p.lam * p.z / p.N / p.psize_det
        [V, W] = u.grids(self.sh, psize_fspace, 'fft')
        a2 = (V**2 + W**2) / p.z**2

        self.kernel = np.exp(2j * np.pi * (p.z / p.lam) *
                             (np.sqrt(1 - a2) - 1))
        #self.kernel = np.fft.fftshift(self.kernel)
        self.ikernel = self.kernel.conj()
예제 #2
0
파일: geometry.py 프로젝트: aglowacki/ptypy
    def update(self,geo_pars=None,**kwargs):
        """
        update internal p dictionary. Recompute all internal array buffers
        """
        # local reference to avoid excessive self. use
        p = self.p
        if geo_pars is not None:
            p.update(geo_pars)
        for k,v in kwargs.iteritems():
            if p.has_key(k): p[k] = v
               

        self.sh = p.N
        
        # calculate the grids
        [X,Y] = u.grids(self.sh,p.psize_sam,p.origin_sam)
                
        # maybe useful later. delete this references if space is short
        self.grids_sam = [X,Y]  
        self.grids_det = [X,Y] 
        
        # calculating kernel
        psize_fspace = p.lam * p.z / p.N / p.psize_det
        [V,W] = u.grids(self.sh,psize_fspace,'fft')
        a2 = (V**2+W**2) /p.z**2          
        
        self.kernel = np.exp(2j * np.pi * (p.z / p.lam) * (np.sqrt(1 - a2) - 1))
        #self.kernel = np.fft.fftshift(self.kernel)
        self.ikernel = self.kernel.conj()
예제 #3
0
    def update(self, geo_pars=None, **kwargs):
        """
        update internal p dictionary. Recompute all internal array buffers
        """
        # local reference to avoid excessive self. use
        p = self.p
        if geo_pars is not None:
            p.update(geo_pars)
        for k, v in kwargs.iteritems():
            if p.has_key(k): p[k] = v

        # wavelength * distance factor
        lz = p.lam * p.z

        #calculate real space pixel size.
        psize_sam = p.psize_sam if p.psize_sam is not None else lz / p.N / p.psize_det

        # calculate array shape from misfit
        self.crop_pad = np.round(u.expect2(p.misfit) / 2.0).astype(int) * 2
        self.sh = p.N + self.crop_pad

        # calculate the grids
        [X, Y] = u.grids(self.sh, psize_sam, p.origin_sam)
        [V, W] = u.grids(self.sh, p.psize_det, p.origin_det)

        # maybe useful later. delete this references if space is short
        self.grids_sam = [X, Y]
        self.grids_det = [V, W]

        # quadratic phase + shift factor before fft
        pre = np.exp(1j * np.pi * (X**2 + Y**2) / lz).astype(self.dtype)
        self.pre_fft = pre * np.exp(-2.0 * np.pi * 1j * (
            (X - X[0, 0]) * V[0, 0] +
            (Y - Y[0, 0]) * W[0, 0]) / lz).astype(self.dtype)

        # quadratic phase + shift factor before fft
        post = np.exp(1j * np.pi * (V**2 + W**2) / lz).astype(self.dtype)
        self.post_fft = post * np.exp(-2.0 * np.pi * 1j *
                                      (X[0, 0] * V + Y[0, 0] * W) / lz).astype(
                                          self.dtype)

        # factors for inverse operation
        self.pre_ifft = self.post_fft.conj()
        self.post_ifft = self.pre_fft.conj()
예제 #4
0
파일: geometry.py 프로젝트: aglowacki/ptypy
    def update(self,geo_pars=None,**kwargs):
        """
        update internal p dictionary. Recompute all internal array buffers
        """
        # local reference to avoid excessive self. use
        p = self.p
        if geo_pars is not None:
            p.update(geo_pars)
        for k,v in kwargs.iteritems():
            if p.has_key(k): p[k] = v
               
        # wavelength * distance factor
        lz= p.lam * p.z
        
        #calculate real space pixel size. 
        psize_sam = p.psize_sam if p.psize_sam is not None else lz / p.N / p.psize_det
        
        # calculate array shape from misfit 
        self.crop_pad = np.round(u.expect2(p.misfit) /2.0).astype(int) * 2
        self.sh = p.N + self.crop_pad
        
        # calculate the grids
        [X,Y] = u.grids(self.sh,psize_sam,p.origin_sam)
        [V,W] = u.grids(self.sh,p.psize_det,p.origin_det)
        
        # maybe useful later. delete this references if space is short
        self.grids_sam = [X,Y]  
        self.grids_det = [V,W]
        
        # quadratic phase + shift factor before fft
        pre = np.exp(1j * np.pi * (X**2+Y**2) / lz ).astype(self.dtype)
        self.pre_fft = pre*np.exp(-2.0*np.pi*1j*((X-X[0,0])*V[0,0]+(Y-Y[0,0])*W[0,0])/ lz).astype(self.dtype)
        
        # quadratic phase + shift factor before fft
        post=np.exp(1j * np.pi * (V**2+W**2) / lz ).astype(self.dtype)
        self.post_fft = post*np.exp(-2.0*np.pi*1j*(X[0,0]*V+Y[0,0]*W)/ lz).astype(self.dtype)

        # factors for inverse operation
        self.pre_ifft = self.post_fft.conj()
        self.post_ifft = self.pre_fft.conj()