This commit is contained in:
2023-05-01 11:28:04 +02:00
parent 3a83f3cf34
commit abe3bcb19c
265 changed files with 28663 additions and 1295 deletions

View File

@@ -1,10 +1,45 @@
# TESTIOC:TESTSINUS:SinCalc
# TESTIOC:TESTWF2:MyWF
# TESTIOC:TESTCALCOUT:Input
# TESTIOC:TESTCALCOUT:Output
#get_context().dataManager.provider.embeddedAtributes = False
#get_context().dataManager.provider.ADD_ATTRIBUTE_FILE_TIMESTAMP = True
###################################################################################################
# EPICS utilities
###################################################################################################
##############
#####################################################################################
if get_context().getScriptType()==ScriptType.cpy:
def on_ctrl_cmd(cmd):
global RE
print ("Control command: ", cmd)
if cmd=="abort":
if "RE" in globals():
if RE.state not in ['idle','paused', 'pausing']:
print ("Run Engine pause request")
RE.request_pause()
abort()
def otf(mode="ENERGY", e1=None, e2=None, beta1=None, beta2=None, theta1=None, theta2=None, \
time=1.0, modulo=1, turn_off_beam=False):
"""
mode: "ENERGY" or "AMNGLE"
"""
run("otf", {"E1":450.0, "E2":460.0})
run("otf", {
"MODE":mode, \
"E1":float(e1) if e1 is not None else None, \
"E2":float(e2) if e2 is not None else None, \
"BETA1":float(beta1) if beta1 is not None else None, \
"BETA2":float(beta2) if beta2 is not None else None, \
"THETA1":float(theta1) if theta1 is not None else None, \
"THETA2":float(theta2) if theta2 is not None else None, \
"TIME":float(time), \
"MODULO":int(modulo), \
"ENDSCAN":turn_off_beam, \
})
def caget_str(ch):
return ''.join((chr(i) if i else "") for i in caget(ch))
@@ -73,17 +108,47 @@ def on_command_started(info):
def on_command_finished(info):
pass #print "Finished: " + str(info.script) + " Error: " + str(info.error)
def on_change_data_path(path):
print "Data path: " + str(path)
#print "Data path: " + str(path)
pass
def on_session_started(id):
print "Start session: ", id
#print "Start session: ", id
get_context().sessionManager.setMetadata("beamlineState", {"sin": sin.take(), "inp": inp.take()})
get_context().sessionManager.setMetadata("beamlineState2", {"sin": sin.take(), "inp": inp.take()})
def on_session_finished(id):
print "Stop session: ", id
#print "Stop session: ", id
get_context().sessionManager.setMetadata("scientificMetadata",SCI_METADATA)
get_context().sessionManager.setMetadata("scientificMetadata2",SCI_METADATA)
###################################################################################################
# Image filters
###################################################################################################
class DataFilter(Filter.DataFilter):
def process(self, data):
data=data.copy()
data.mult(2.0)
return data
data_filter = DataFilter("filter")
image.addListener(data_filter)
proc_data=ColormapAdapter("proc_data", data_filter)
add_device(proc_data, True)
class ImageFilter(Filter.ImageFilter):
def process(self, img):
return ImagingUtils.transpose(img)
image_filter = ImageFilter("filter")
image.addListener(image_filter)
#proc_image=ColormapAdapter("proc_image", image_filter)
add_device(image_filter, True)
image.refresh()
@@ -144,6 +209,7 @@ import random
#State listener: cleanup can be made at end of execution
def onStateChange(state, former, script):
#print state
if state == State.Closing:
#print "Closing the app"
pass
@@ -180,20 +246,26 @@ class SimulatedOutput(Writable):
def write(self, value):
pass
def getName(self):
return "sout"
class SimulatedInput(Readable):
#class SimulatedInput(Readable):
class SimulatedInput(ReadonlyRegisterBase):
def __init__(self):
self.x = 0.0
def read(self):
#def read(self):
def doRead(self):
self.x = self.x + 0.1
noise = (random.random() - 0.5) / 20.0
return math.sin(self.x) + noise
def getName(self):
return "sinp"
sout = SimulatedOutput()
sinp = SimulatedInput()
add_device(sinp, True)
#for m in mu, delta, gamma, eta, chi, phi:
# m.setSpeed(m.config.defaultSpeed)
#Controler Evenrt Listener
@@ -632,6 +704,9 @@ scan_val.set([0.0,] * MAX_ARRAY_DEV_SIZE )
#cas6= CAS("PSHELL:var",sin)
"""
#show_panel(master)
def plot_numpy_array(na, title = None):
plot( Convert.reshape(na.getData(),na.getDimensions()),title=title)
@@ -646,7 +721,6 @@ def run_fda(file_name, arguments={}):
#Convex hull plots
def clear_convex_hull_plot(title):
plots = get_plots(title = title)
@@ -893,4 +967,132 @@ class Counter(ReadonlyRegisterBase):
add_device(Counter("counter"), True)
def trigger_scienta():
"""
Trigger new acquisition
"""
scienta.start()
#scienta.waitNewImage(-1)
###################################################################################################
# Handlig diagnostics
###################################################################################################
###################################################################################################
# Handlig diagnostics
###################################################################################################
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()
diag_channels = []
diag_channels.append(scienta.lowEnergy)
diag_channels.append(scienta.centerEnergy)
diag_channels.append(scienta.highEnergy)
diag_channels.append(scienta.energyWidth)
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 scan_2d(range_x, range_y, steps_x, steps_y, exposures=None, settling_time=0.1, zigzag=True, compression=False, dry_run=False):
if type(range_x)==float: range_x =[-range_x, range_x]
if type(range_y)==float: range_y =[-range_y, range_y]
return run("templates/Scan2D", { \
"DRY_RUN": dry_run, \
"RANGE_X": range_x, \
"RANGE_Y": range_y, \
"STEPS": [steps_x, steps_y], \
"EXPOSURES": exposures, \
"SETTLING_TIME": settling_time, \
"ZIGZAG": zigzag, \
"COMPRESSION": compression
})
"""
add_device(PipelineStream("p","localhost:8889", "simulation_sp"), True)
p.monitored=True
s=p.createSubsampled(1.0)
#show_panel(s)
show_panel(p)
"""
print "Finished initialization"