Changes by Chris and project fixes

This commit is contained in:
Gobbo Alexandre
2022-03-07 09:39:06 +01:00
parent e026811933
commit 3588c10d4e
20 changed files with 323 additions and 59 deletions

45
script/cpython/psss.py Executable file
View File

@@ -0,0 +1,45 @@
import numpy as np
from scipy.optimize import curve_fit
import sys
def gaus(x, a, x0, sigma, offset):
return offset + a * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))
#Return [amp, mean_val, sigma, offset]
def fit_energy(e_from, e_to, steps, num_shots, data):
energy_range = np.linspace(e_from, e_to, steps)
energy_range_fit = np.linspace(energy_range[0], energy_range[-1], len(energy_range)*10)
centre_line_out = data[:,:,int(data.shape[2]/2)].mean(axis=1)
try:
popt,pcov = curve_fit(gaus,energy_range,centre_line_out,p0=[1,energy_range[np.argmax(centre_line_out)],energy_range.mean()*1e-3,1e3*num_shots])
except:
raise Exception('Fit failed: spectrum might not be near scan range center \n' + str(sys.exc_info()[1]))
#print('Fit failed: spectrum might not be near scan range center')
#return None
max_ind = np.argmax(centre_line_out)
max_photon_energy=energy_range[max_ind]
print(max_photon_energy)
return popt, centre_line_out
#Return [amp, mean_val, sigma, offset]
def fit_crystal_height(xstal_from, xstal_to, steps, data):
xstal_range = np.linspace(xstal_from, xstal_to, steps)
projection = data.mean(axis=1).mean(axis=1)
offset = np.mean(projection[0:100])
signal_centre = xstal_range[np.argmax(projection)]
xstal_range_fit = np.linspace(xstal_range[0], xstal_range[-1], len(xstal_range)*10)
try:
popt,pcov = curve_fit(gaus,xstal_range,projection,p0=[100,signal_centre,-0.2,offset])
except:
raise Exception('Fit failed: spectrum might not be near scan range center \n' + str(sys.exc_info()[1]))
#print('Fit failed: spectrum might not be near scan range center')
#return None
return popt, projection
def get_signal_centre(data, data_range):
projection = data.mean(axis=1).mean(axis=1)
signal_centre = data_range[np.argmax(projection)]
return signal_centre, projection

32
script/cpython/psss_plot.py Executable file
View File

@@ -0,0 +1,32 @@
import numpy as np
import matplotlib.pyplot as plt
def gaus(x, a, x0, sigma, offset):
return offset + a * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))
def plot_energy(E_from, E_to, steps, Scan_spec, popt, measured_offset):
Energy_range = np.linspace(E_from, E_to, steps)
centre_line_out = Scan_spec[:,:,int(Scan_spec.shape[2]/2)].mean(axis=1)
Energy_range_fit = np.linspace(Energy_range[0], Energy_range[-1], len(Energy_range)*10)
plt.figure(figsize=[10,5])
plt.subplot(121)
plt.title('PSSS scan of set photon energy')
plt.pcolormesh(np.arange(0,Scan_spec.shape[2]), Energy_range, Scan_spec.mean(axis=1),cmap='CMRmap')
plt.vlines(int(Scan_spec.shape[2]/2), Energy_range[0], Energy_range[-1],linestyles='--', colors='orange')
plt.xlim([0,Scan_spec.shape[2]])
plt.xlabel('Camera pixel')
plt.ylabel('Set PSSS energy [eV] \n SARFE10-PSSS059:ENERGY')
plt.subplot(122)
plt.title('At camera centre pixel %1i \nCalibrated energy = %.1f [eV]\n Offset from machine = %.1f [eV]'%(int(Scan_spec.shape[2]/2),popt[1],measured_offset))
plt.plot(centre_line_out,Energy_range,linewidth = 2, color = 'orange',label ='measured')
try:
plt.plot(gaus(Energy_range_fit,*popt),Energy_range_fit,'r:',label='fit')
except:
pass
plt.xticks([])
plt.legend()
plt.grid(True)

36
script/cpython/wrapper.py Executable file
View File

@@ -0,0 +1,36 @@
from jeputils import *
RELOAD_CPYTHON = not App.isDetached()
def fit_energy(e_from, e_to, steps, num_shots, data):
data = to_array(data, 'd')
dims = [len(data), len(data[0]), len(data[0][0])]
data = Convert.flatten(data)
arr = to_npa(data, dims)
popt, centre_line_out = call_jep("cpython/psss", "fit_energy", [e_from, e_to, steps, num_shots, arr], reload=RELOAD_CPYTHON)
return popt.getData(), centre_line_out.getData()
def fit_crystal_height(xstal_from, xstal_to, steps, data):
data = to_array(data, 'd')
dims = [len(data), len(data[0]), len(data[0][0])]
data = Convert.flatten(data)
arr = to_npa(data, dims)
popt, projection = call_jep("cpython/psss", "fit_crystal_height", [xstal_from, xstal_to, steps, arr], reload=RELOAD_CPYTHON)
return popt.getData(), projection.getData()
def get_signal_centre(data, data_range):
data = to_array(data, 'd')
dims = [len(data), len(data[0]), len(data[0][0])]
data = Convert.flatten(data)
arr = to_npa(data, dims)
data_range = to_npa(to_array(data_range, 'd'))
signal_centre, projection = call_jep("cpython/psss", "get_signal_centre", [arr, data_range], reload=RELOAD_CPYTHON)
return signal_centre, projection.getData()
def plot_energy(e_from, e_to, steps, data, popt, measured_offset):
data = to_array(data, 'd')
dims = [len(data), len(data[0]), len(data[0][0])]
data = Convert.flatten(data)
arr = to_npa(data, dims)
ret = call_jep("cpython/psss_plot", "plot_energy", [e_from, e_to, steps, arr, popt, measured_offset], reload=RELOAD_CPYTHON)
return ret