auger_spec_map.py 文件源码

python
阅读 23 收藏 0 点赞 0 评论 0

项目:FoundryDataBrowser 作者: ScopeFoundry 项目源码 文件源码
def perform_map_analysis(self):
        # Smoothing (presently performed for individual detectors)
        # FIX: MAY NEED A SUM MAP THAT ALIGNS DETECTOR CHANNELS AND SUMS
        sigma_spec = self.settings['spectral_smooth_gauss_sigma'] # In terms of frames?
        width_spec = self.settings['spectral_smooth_savgol_width'] # In terms of frames?
        order_spec = self.settings['spectral_smooth_savgol_order']

        if self.settings['spectral_smooth_type'] == 'Gaussian':
            print('spectral smoothing...')
            self.current_auger_map = gaussian_filter(self.current_auger_map, (sigma_spec,0,0,0,0))
        elif self.settings['spectral_smooth_type'] == 'Savitzky-Golay':
            # Currently always uses 4th order polynomial to fit
            print('spectral smoothing...')
            self.current_auger_map = savgol_filter(self.current_auger_map, 1 + 2*width_spec, order_spec, axis=0)

        # Background subtraction (implemented detector-wise currently)
        # NOTE: INSUFFICIENT SPATIAL SMOOTHING MAY GIVE INACCURATE OR EVEN INF RESULTS
        if not(self.settings['subtract_ke1'] == 'None'):
            print('Performing background subtraction...')
            for iDet in range(self.current_auger_map.shape[-1]):
                # Fit a power law to the background
                # get background range
                ke_min = self.settings['ke1_start']
                ke_max = self.settings['ke1_stop']
                fit_map = (self.ke[iDet] > ke_min) * (self.ke[iDet] < ke_max)
                ke_to_fit = self.ke[iDet,fit_map]
                spec_to_fit = self.current_auger_map[fit_map,0,:,:,iDet].transpose(1,2,0)

                if self.settings['subtract_ke1'] == 'Power Law':
                    # Fit power law
                    A, m = self.fit_powerlaw(ke_to_fit, spec_to_fit)
                    ke_mat = np.tile(self.ke[iDet], (spec_to_fit.shape[0],spec_to_fit.shape[1],1)).transpose(2,0,1)
                    A = np.tile(A, (self.ke.shape[1], 1, 1))
                    m = np.tile(m, (self.ke.shape[1], 1, 1))
                    bg = A * ke_mat**m
                elif self.settings['subtract_ke1'] == 'Linear':
                    # Fit line
                    m, b = self.fit_line(ke_to_fit, spec_to_fit)
                    ke_mat = np.tile(self.ke[iDet], (spec_to_fit.shape[0],spec_to_fit.shape[1],1)).transpose(2,0,1)
                    m = np.tile(m, (self.ke.shape[1], 1, 1))
                    b = np.tile(b, (self.ke.shape[1], 1, 1))
                    bg = m * ke_mat + b

                self.current_auger_map[:,0,:,:,iDet] -= bg

        if self.settings['subtract_tougaard']:
            R_loss = self.settings['R_loss']
            E_loss = self.settings['E_loss']
            dE = self.ke[0,1] - self.ke[0,0]
            # Always use a kernel out to 3 * E_loss to ensure enough feature size
            ke_kernel = np.arange(0, 3*E_loss, abs(dE))
            if not np.mod(len(ke_kernel),2) == 0:
                ke_kernel = np.arange(0, 3*E_loss+dE, abs(dE))
            self.K_toug = (8.0/np.pi**2)*R_loss*E_loss**2 * ke_kernel / ((2.0*E_loss/np.pi)**2 + ke_kernel**2)**2
            # Normalize the kernel so the its area is equal to R_loss
            self.K_toug /= (np.sum(self.K_toug) * dE)/R_loss
            self.current_auger_map -= dE * correlate1d(self.current_auger_map, self.K_toug,
                                                        mode='nearest', origin=-len(ke_kernel)//2, axis=0)
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号