Files
x03da/script/otf.py
gac-x03da da38c92c97 Closedown
2022-02-02 16:54:53 +01:00

116 lines
3.2 KiB
Python

#Debugging parameters
if not get_exec_pars().getCommand(False).args:
1/0
MODE = "ANGLE"
E1 = 450.0
E2 = 460.0
BETA1 = -86.325
BETA2 = -86.365
THETA1 = 87.345
THETA2 = 87.370
TIME = 1.0 #min
MODULO=1
ENDSCAN=False
if MODE=="ANGLE":
print "\nStart OTF scan... Beta", BETA1,"->",BETA2," Theta", THETA1,"->",THETA2, TIME,"- min modulo=",MODULO
if None in [BETA1, BETA2, THETA1, THETA2]:
raise Exception("Invalid angle")
else:
print "\nStart OTF scan...", E1,"eV ->",E2,"eV,",TIME,"- min modulo=",MODULO
if None in [E1, E2]:
raise Exception("Invalid energy")
wait_beam()
sensors = SampleCurrent, RefCurrent, MonoBeta, MonoTheta, MonoEnergy, MonoCff
#dev_run='ca://X03DA-OTF:RUN?monitored=true&type=d'
#dev_sts='ca://X03DA-OTF:STATUS?monitored=true&type=d'
#sensors = dev_run,dev_sts, MonoEnergy, MonoBeta, MonoTheta, SampleCurrent, RefCurrent
caput('X03DA-OTF:TIME', TIME)
caput('X03DA-OTF:MODE', MODE)
if MODE=="ANGLE":
caput('X03DA-OTF:BETA1', BETA1)
caput('X03DA-OTF:BETA2', BETA2)
caput('X03DA-OTF:THETA1', THETA1)
caput('X03DA-OTF:THETA2', THETA2)
else:
caput('X03DA-OTF:E1', E1)
caput('X03DA-OTF:E2', E2)
#caput('X03DA-OTF:FOLDER', FOLDER)
#caput('X03DA-OTF:FILE', FILE)
if MODE=="ENERGY":
print "Set Energy"
Eph.move(E1)
print "Energy setting done"
#caput('X07MA-PGM:CERBK.N',10) # set energy readback averaging to 10 pts
time.sleep(0.1)
scan_completed = False
caput('X03DA-OTF:RUN', "START")
if MODE=="ENERGY":
time.sleep(0.5)
else:
MonoBeta.waitValueInRange(BETA1, 0.001, -1)
def monitoring_task():
global scan_completed
time.sleep(1.0)
#Not working
#cawait('X03DA-OTF:RUN', "STOP", type = 's')
#cawait('X03DA-OTF:STATUS', "DONE", type = 's')
if MODE=="ENERGY":
Eph.readback.waitValueInRange(E2, 1.0, -1)
time.sleep(5.0)
else:
MonoBeta.waitValueInRange(BETA2, 0.0001, -1)
scan_completed = True
get_exec_pars().currentScan.abort()
print "otf wait done"
ret = fork(monitoring_task)
last_energy=None
count=0
def after_read(rec):
global last_energy, count
if (count % MODULO) != 0:
rec.invalidate()
elif MODE=="ENERGY":
energy =rec[MonoEnergy]
if last_energy is not None:
if ((E2>E1) and ((last_energy>=energy) or (energy<E1))) or \
((E1>E2) and ((last_energy<=energy) or (energy>E2))) :
rec.invalidate()
else:
last_energy=energy
else:
last_energy=energy
rec.invalidate()
count=count+1
try:
print "Scanning...",
try:
mscan(SampleCurrent, sensors, -1, None, range="auto", take_initial=False, after_read=after_read, domain_axis="MonoEnergy", snaps=diag_channels_no_Scienta)
finally:
ret[0].cancel(True)
except:
if not scan_completed:
print sys.exc_info()
print("Aborting...")
raise
finally:
caput('X03DA-OTF:RUN', 'STOP')
if ENDSCAN:
after_scan()