#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 (energyE2) 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()