116 lines
3.2 KiB
Python
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() |