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)
评论列表
文章目录