181 lines
6.1 KiB
Python
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)
|