Files
x09la/script/local.py
gac-x09la 95884aa11d
2021-08-30 18:06:20 +02:00

181 lines
6.1 KiB
Python

###################################################################################################
# Deployment specific global definitions - executed after startup.py
###################################################################################################
###################################################################################################
# Device initialization
###################################################################################################
#scienta.getDataArray().setMonitored(True)
class AcquisitionMode(Readable.ReadableString):
def read(self):
return str(scienta.getAcquisitionMode())
_acquisition_mode=AcquisitionMode()
class EnergyMode(Readable.ReadableString):
def read(self):
return str(scienta.getEnergyMode())
_energy_mode=EnergyMode()
class LensMode(Readable.ReadableString):
def read(self):
return str(scienta.getLensMode())
_lens_mode=LensMode()
class DetectorMode(Readable.ReadableString):
def read(self):
return str(scienta.getDetectorMode())
_detector_mode=DetectorMode()
class PassEnergy(Readable):
def read(self):
return scienta.getPassEnergy()
_pass_energy=PassEnergy()
class ElementSet(Readable.ReadableString):
def read(self):
return str(scienta.getElementSet())
_element_set=ElementSet()
###################################################################################################
# Handlig diagnostics
###################################################################################################
diag_channels = []
diag_channels.append(scienta.lowEnergy.readback)
diag_channels.append(scienta.centerEnergy.readback)
diag_channels.append(scienta.highEnergy.readback)
diag_channels.append(scienta.energyStepSize.readback)
diag_channels.append(scienta.energyWidth)
diag_channels.append(scienta.energyCount)
diag_channels.append(scienta.lowThetaY.readback)
diag_channels.append(scienta.centerThetaY.readback)
diag_channels.append(scienta.highThetaY.readback)
diag_channels.append(scienta.thetaYStepSize.readback)
diag_channels.append(scienta.thetaYWidth)
diag_channels.append(scienta.thetaYCount)
diag_channels.append(scienta.lowThetaX)
diag_channels.append(scienta.centerThetaX.readback)
diag_channels.append(scienta.highThetaX)
diag_channels.append(scienta.thetaXStepSize)
diag_channels.append(scienta.thetaXWidth)
diag_channels.append(scienta.thetaXCount)
diag_channels.append(scienta.slicesReadback)
diag_channels.append(scienta.channelsReadback)
diag_channels.append(scienta.excitationEnergy)
diag_channels.append(_acquisition_mode)
diag_channels.append(_energy_mode)
diag_channels.append(_lens_mode)
diag_channels.append(_detector_mode)
diag_channels.append(_pass_energy)
diag_channels.append(_element_set)
diag_channels = sorted(diag_channels, key=lambda channel: channel.name)
def get_diag_name(diag):
return ch.psi.utils.Str.toTitleCase(diag.getName()).replace(" ", "").replace("Readback", "")
def print_diag():
for f in diag_channels:
print "%-25s %s" % (get_diag_name(f) , str(f.read()))
def create_diag_datasets(parent = None):
if parent is None:
parent = get_exec_pars().group
group = parent + "attrs/"
for f in diag_channels:
create_dataset(group+get_diag_name(f) , 's' if (issubclass(type(f), Readable.ReadableString)) else 'd')
def append_diag_datasets(parent = None):
if parent is None:
parent = get_exec_pars().group
group = parent + "attrs/"
for f in diag_channels:
try:
x = f.read()
if x is None:
x = '' if (type(f) is ch.psi.pshell.epics.ChannelString) else float('nan')
append_dataset(group+get_diag_name(f), x)
except:
log("Error sampling " + str(get_diag_name(f)) + ": " + str(sys.exc_info()[1]))
def handle_diagnostics(rec):
#if beam_ok:
if get_exec_pars().save:
#Saving only once the diag data
if rec.index == 0:
create_diag_datasets()
append_diag_datasets()
def trigger_scienta():
"""
Trigger new acquisition
"""
scienta.start()
scienta.waitNewImage(-1)
def dummy_trigger_scienta():
"""
Trigger detector to update the array sizes and calibration
"""
iterations = scienta.getIterations()
scienta.setIterations(1)
try:
trigger_scienta()
finally:
scienta.setIterations(iterations)
###################################################################################################
# Utilities
###################################################################################################
def fit(ydata, xdata = None):
"""
Gaussian fit
"""
if xdata is None:
xdata = frange(0, len(ydata), 1)
#ydata = to_list(ydata)
#xdata = to_list(xdata)
max_y= max(ydata)
index_max = ydata.index(max_y)
max_x= xdata[index_max]
print "Max index:" + str(index_max),
print " x:" + str(max_x),
print " y:" + str(max_y)
gaussians = fit_gaussians(ydata, xdata, [index_max,])
(norm, mean, sigma) = gaussians[0]
p = plot([ydata],["data"],[xdata], title="Fit" )[0]
fitted_gaussian_function = Gaussian(norm, mean, sigma)
scale_x = [float(min(xdata)), float(max(xdata)) ]
points = max((len(xdata)+1), 100)
resolution = (scale_x[1]-scale_x[0]) / points
fit_y = []
fit_x = frange(scale_x[0],scale_x[1],resolution, True)
for x in fit_x:
fit_y.append(fitted_gaussian_function.value(x))
p.addSeries(LinePlotSeries("fit"))
p.getSeries(1).setData(fit_x, fit_y)
if abs(mean - xdata[index_max]) < ((scale_x[0] + scale_x[1])/2):
print "Mean -> " + str(mean)
p.addMarker(mean, None, "Mean="+str(round(norm,2)), Color.MAGENTA.darker())
return (norm, mean, sigma)
else:
p.addMarker(max_x, None, "Max="+str(round(max_x,2)), Color.GRAY)
print "Invalid gaussian fit: " + str(mean)
return (None, None, None)