def main(argv=None): global simulate global fp global shut_open global current global x3h5capture #parse command line options usage = "usage: %prog [options]\nData files are written to /data/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--detname", action="store", type="string", dest="detname", help="detector PV base") parser.add_option("--xstart", action="store", type="float", dest="xo", help="starting X position") parser.add_option("--xnumstep", action="store", type="int", dest="Nx", help="number of steps in X") parser.add_option("--xstepsize", action="store", type="float", dest="dx", help="step size in X") parser.add_option("--ystart", action="store", type="float", dest="yo", help="starting Y position") parser.add_option("--ynumstep", action="store", type="int", dest="Ny", help="number of steps in Y") parser.add_option("--ystepsize", action="store", type="float", dest="dy", help="step size in Y") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves") parser.add_option("--checkbeam", action="store_true", dest="checkbeam", default=False, help="only acquire when beam is on") parser.add_option("--acqtime", action="store", type="float", dest="acqt", default=1, help="image integration time [sec]") parser.add_option("--acqnum", action="store", type="int", dest="acqn", default=1, help="frames per scan point") (options, args) = parser.parse_args() #open log file D0 = time.localtime()[0] D1 = time.localtime()[1] D2 = time.localtime()[2] D3 = time.localtime()[3] D4 = time.localtime()[4] cd = os.getcwd() filedir = '/nfs/xf05id1/data/' if sys.argv[0][0] == '.': out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(filedir + repr(D0)) except OSError: try: os.mkdir(filedir + repr(D0)) except Exception: print 'cannot create directory: ' + '/data/' + repr(D0) sys.exit() try: os.chdir(filedir + repr(D0) + '/' + repr(D1)) except OSError: try: os.mkdir(filedir + repr(D0) + '/' + repr(D1)) except Exception: print 'cannot create directory: ' + '/data/' + repr( D0) + '/' + repr(D1) sys.exit() try: os.chdir(filedir + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except OSError: try: os.mkdir(filedir + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except Exception: print 'cannot create directory: ' + filedir + repr( D0) + '/' + repr(D1) + '/' + repr(D2) sys.exit() try: fp = open(out_filename, 'a') except Exception: print 'cannot open file: ' + out_filename sys.exit() os.chdir(cd) fp.write('#' + ', '.join(sys.argv)) fp.write('\n') H5path = '/epics/data/201507/300126' #initialize PVs and callbacks if options.detname == None: detstr = '' print "must provide detector pv base, e.g., 'XF:28IDA-BI{URL:01}'" sys.exit() else: detstr = options.detname xmotname = 'XF:05IDD-ES:1{Stg:Smpl1-Ax:X}' ymotname = 'XF:05IDD-ES:1{Stg:Smpl1-Ax:Y}' xmot = PV(xmotname + 'Mtr.VAL') xmot_cur = PV(xmotname + 'Mtr.RBV') ymot = PV(ymotname + 'Mtr.VAL') ymot_cur = PV(ymotname + 'Mtr.RBV') shut_status = PV('SR:C05-EPS{PLC:1}Shutter:Sum-Sts') beam_current = PV('SR:C03-BI{DCCT:1}I:Total-I') bmot_cur = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}Mtr.RBV') #transmission #check command line options if options.yo == None: print "must provide a starting point in the vertical" sys.exit() else: yo = options.yo if options.xo == None: print "must provide a starting point in the horizontal" sys.exit() else: xo = options.xo if options.dx == None: dx = 0.00000001 else: dx = options.dx if options.dy == None: dy = 0.00000001 else: dy = options.dy if options.Nx == None: Nx = 0 else: Nx = options.Nx if options.Ny == None: Ny = 0 else: Ny = options.Ny if options.stall == None: twait = 0. else: twait = options.stall diode0 = PV(detstr + 'Cur:I0-I') diode1 = PV(detstr + 'Cur:I1-I') diode2 = PV(detstr + 'Cur:I2-I') diode3 = PV(detstr + 'Cur:I3-I') wb = srxslit.nsls2slit(tb='XF:05IDA-OP:1{Slt:1-Ax:T}', bb='XF:05IDA-OP:1{Slt:1-Ax:B}', ib='XF:05IDA-OP:1{Slt:1-Ax:I}', ob='XF:05IDA-OP:1{Slt:1-Ax:O}') pb = srxslit.nsls2slit(ib='XF:05IDA-OP:1{Slt:2-Ax:I}', ob='XF:05IDA-OP:1{Slt:2-Ax:O}') ssa = srxslit.nsls2slit(tb='XF:05IDB-OP:1{Slt:SSA-Ax:T}', bb='XF:05IDB-OP:1{Slt:SSA-Ax:B}', ob='XF:05IDB-OP:1{Slt:SSA-Ax:O}', ib='XF:05IDB-OP:1{Slt:SSA-Ax:I}') x3acq = PV('XSPRESS3-EXAMPLE:Acquire') x3erase = PV('XSPRESS3-EXAMPLE:ERASE') x3acqtime = PV('XSPRESS3-EXAMPLE:AcquireTime') x3acqnum = PV('XSPRESS3-EXAMPLE:NumImages') x3tmode = PV('XSPRESS3-EXAMPLE:TriggerMode') x3h5path = PV('XSPRESS3-EXAMPLE:HDF5:FilePath') x3h5fname = PV('XSPRESS3-EXAMPLE:HDF5:FileName') x3h5fnum = PV('XSPRESS3-EXAMPLE:HDF5:FileNumber') x3h5vdim = PV('XSPRESS3-EXAMPLE:HDF5:NumExtraDims') x3h5size = PV('XSPRESS3-EXAMPLE:HDF5:ExtraDimSizeN') x3h5d1 = PV('XSPRESS3-EXAMPLE:HDF5:ExtraDimSizeX') x3h5d2 = PV('XSPRESS3-EXAMPLE:HDF5:ExtraDimSizeY') #report ROIs for channels and counts at each point x3ch1roi0min = PV('XSPRESS3-EXAMPLE:C1_MCA_ROI1_LLM') x3ch1roi0max = PV('XSPRESS3-EXAMPLE:C1_MCA_ROI1_HLM') x3ch1roi0ct = PV('XSPRESS3-EXAMPLE:C1_ROI1:Value_RBV') x3ch1roi1min = PV('XSPRESS3-EXAMPLE:C1_MCA_ROI2_LLM') x3ch1roi1max = PV('XSPRESS3-EXAMPLE:C1_MCA_ROI2_HLM') x3ch1roi1ct = PV('XSPRESS3-EXAMPLE:C1_ROI2:Value_RBV') x3ch1roi2min = PV('XSPRESS3-EXAMPLE:C1_MCA_ROI3_LLM') x3ch1roi2max = PV('XSPRESS3-EXAMPLE:C1_MCA_ROI3_HLM') x3ch1roi2ct = PV('XSPRESS3-EXAMPLE:C1_ROI3:Value_RBV') x3ch2roi0min = PV('XSPRESS3-EXAMPLE:C2_MCA_ROI1_LLM') x3ch2roi0max = PV('XSPRESS3-EXAMPLE:C2_MCA_ROI1_HLM') x3ch2roi0ct = PV('XSPRESS3-EXAMPLE:C2_ROI1:Value_RBV') x3ch2roi1min = PV('XSPRESS3-EXAMPLE:C2_MCA_ROI2_LLM') x3ch2roi1max = PV('XSPRESS3-EXAMPLE:C2_MCA_ROI2_HLM') x3ch2roi1ct = PV('XSPRESS3-EXAMPLE:C2_ROI2:Value_RBV') x3ch2roi2min = PV('XSPRESS3-EXAMPLE:C2_MCA_ROI3_LLM') x3ch2roi2max = PV('XSPRESS3-EXAMPLE:C2_MCA_ROI3_HLM') x3ch2roi2ct = PV('XSPRESS3-EXAMPLE:C2_ROI3:Value_RBV') x3ch3roi0min = PV('XSPRESS3-EXAMPLE:C3_MCA_ROI1_LLM') x3ch3roi0max = PV('XSPRESS3-EXAMPLE:C3_MCA_ROI1_HLM') x3ch3roi0ct = PV('XSPRESS3-EXAMPLE:C3_ROI1:Value_RBV') x3ch3roi1min = PV('XSPRESS3-EXAMPLE:C3_MCA_ROI2_LLM') x3ch3roi1max = PV('XSPRESS3-EXAMPLE:C3_MCA_ROI2_HLM') x3ch3roi1ct = PV('XSPRESS3-EXAMPLE:C3_ROI2:Value_RBV') x3ch3roi2min = PV('XSPRESS3-EXAMPLE:C3_MCA_ROI3_LLM') x3ch3roi2max = PV('XSPRESS3-EXAMPLE:C3_MCA_ROI3_HLM') x3ch3roi2ct = PV('XSPRESS3-EXAMPLE:C3_ROI3:Value_RBV') #claim ROI 4 for our own use. we will integrate over all 4096 channels. x3ch1roi3min = PV('XSPRESS3-EXAMPLE:C1_MCA_ROI4_LLM') x3ch1roi3max = PV('XSPRESS3-EXAMPLE:C1_MCA_ROI4_HLM') x3ch1roi3ct = PV('XSPRESS3-EXAMPLE:C1_ROI4:Value_RBV') x3ch2roi3min = PV('XSPRESS3-EXAMPLE:C2_MCA_ROI4_LLM') x3ch2roi3max = PV('XSPRESS3-EXAMPLE:C2_MCA_ROI4_HLM') x3ch2roi3ct = PV('XSPRESS3-EXAMPLE:C2_ROI4:Value_RBV') x3ch3roi3min = PV('XSPRESS3-EXAMPLE:C3_MCA_ROI4_LLM') x3ch3roi3max = PV('XSPRESS3-EXAMPLE:C3_MCA_ROI4_HLM') x3ch3roi3ct = PV('XSPRESS3-EXAMPLE:C3_ROI4:Value_RBV') xmot_cur.get() ymot_cur.get() norm0 = PV('XF:05IDD-BI:1{BPM:01}.S20') norm1 = PV('XF:05IDD-BI:1{BPM:01}.S21') norm2 = PV('XF:05IDD-BI:1{BPM:01}.S22') norm3 = PV('XF:05IDD-BI:1{BPM:01}.S23') xmot_cur.add_callback(cbfx) ymot_cur.add_callback(cbfy) shut_status.add_callback(cbf_shut) beam_current.add_callback(cbf_curr) xmot_cur.run_callbacks() ymot_cur.run_callbacks() shut_status.run_callbacks() beam_current.run_callbacks() x3h5path.put(H5path) x3h5fname.put(repr(D3) + '_' + repr(D4) + '_') x3h5fnum.put(0) x3acqtime.put(options.acqt) x3acqnum.put(options.acqn) x3tmode.put(1) x3ch1roi3min.put(0) x3ch2roi3min.put(0) x3ch3roi3min.put(0) x3ch1roi3max.put(4096) x3ch2roi3max.put(4096) x3ch3roi3max.put(4096) #h5 set up x3h5vdim.put(2) x3h5size.put(options.acqn) x3h5d1.put(options.Nx + 1) x3h5d2.put(options.Ny + 1) str = '#NSLS-II SRX' + time.asctime() fp.write(str) fp.write('\n') str = '#Start time is ' + time.asctime() print str fp.write(str) fp.write('\n') str='# x: %(hs)6.4f ; y: %(vs)6.4f ; ROI1 %(roi1i)d:%(roi1a)d ; ROI2 %(roi2i)d:%(roi2a)d ; ROI3 %(roi3i)d:%(roi3a)d'%\ {"hs":xmot_cur.get(),"vs":ymot_cur.get(), 'roi1i':x3ch1roi0min.get(), 'roi1a':x3ch1roi0max.get(), 'roi2i':x3ch1roi1min.get(), 'roi2a':x3ch1roi1max.get(), 'roi3i':x3ch1roi2min.get(), 'roi3a':x3ch1roi2max.get()} print str fp.write(str) fp.write('\n') roits = x3ch3roi3ct.timestamp str='# SSA HCEN: %(WBHC)f ; SSA HSIZE: %(WBHS)f ; SSA VCEN: %(WBVC)f ; SSA VSIZE: %(WBVS)f'%\ {"WBHC":ssa.hcen(), "WBHS":ssa.hsize(), "WBVC":ssa.vcen(), "WBVS":ssa.vsize()} print str fp.write(str) fp.write('\n') str='# Bragg: %(B)6.4f ; Energy: %(E)6.4f ; WB HCEN: %(WBHC)f ; WB HSIZE: %(WBHS)f ; WB VCEN: %(WBVC)f ; WB VSIZE: %(WBVS)f'%\ {"B":bmot_cur.get(), "E": 12398. / (2 * 3.1355 * math.sin(bmot_cur.get()/180.*3.1416)), "WBHC":wb.hcen(), "WBHS":wb.hsize(), "WBVC":wb.vcen(), "WBVS":wb.vsize()} print str fp.write(str) fp.write('\n') str = "# -------------------------------------------------------------------- " print str fp.write(str) fp.write('\n') str = '#[point #]\tX pos\t\tY pos\tch 1\t\tch 2\t\tch 3\t\tch 4\tdBPM1\t\tdBPM2\t\tdBPM3\t\tdBPM4\t\troi0\t\troi1\t\troi2\t\troi3\t\ttime' print str fp.write(str) fp.write('\n') if options.sim is True: str = " -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') else: time.sleep(2) x3h5capture.put(1) #number of rows and columns completed by scan Ncol = Nrow = 0 LN = 0 #diode readback is now limiting factor for scan speed oldsig = 0. #when the cryocooler kicks in, the beam is unusable for ~3200sec cryo = PV('XF:05IDA-OP:1{Mono:HDCM}T:LN2Out-I') ct = cryo.get() while (ct is None): time.sleep(0.05) ct = cryo.get() t0 = time.time() cryocounter = 0 shut_toggle = False #nested loops for scanning z,x,y for y in np.linspace(yo, yo + ((Ny) * dy), Ny + 1): tar[1][0] = y tar[1][1] = 1 if options.sim is False: ymot.put(tar[1][0]) if indeadband(float(tar[1][0]), float(ymot_cur.get()), dbd) == 1: tar[1][1] = 0 if Nrow % 2 == 0: xs = 0. + xo xe = ((Nx + 1) * dx) + xo - dx xi = dx else: xs = ((Nx) * dx) + xo xe = 0. + xo xi = -dx for x in np.linspace(xs, xe, Nx + 1): tar[0][0] = x tar[0][1] = 1 if indeadband(float(tar[0][0]), float(xmot_cur.get()), dbd) == 1: tar[0][1] = 0 if options.sim is False: xmot.put(tar[0][0]) while ((tar[0][1] == 1) or (tar[1][1] == 1)): time.sleep(0.01) signal0 = signal1 = signal2 = signal3 = 0. nsig0 = nsig1 = nsig2 = nsig3 = 0. sig0 = sig1 = sig2 = sig3 = 0. time.sleep(twait) while (options.checkbeam and (cryo.get() < (ct - 0.1))): print "Stopped. Detected possible cryocooler activation." time.sleep(1) cryocounter = cryocounter + 1 #if the above is true for five cycles, the cryocooler was on, wait another 10min if (options.checkbeam and cryocounter > 300): print "Detected cryocooler activation, waiting 10min" time.sleep(600) cryocounter = 0 while (options.checkbeam and (shut_open == False or beam_current == False)): print "Stopped. Waiting for scan conditions to return to normal." if shut_open == False: shut_toggle = True time.sleep(10.) if shut_toggle == True: print "Entering optics conditioning period. Waiting 5min" time.sleep(300) shut_toggle = False if options.sim is False: x3erase.put(1) while signal0 == 0.: signal0 = diode0.get() while signal1 == 0.: signal1 = float(diode1.get()) while (signal1 == oldsig): time.sleep(0.05) signal1 = diode1.get() oldsig = signal1 while signal2 == 0.: signal2 = diode2.get() while signal3 == 0.: signal3 = diode3.get() while nsig0 == 0.: nsig0 = float(norm0.get()) while nsig1 == 0.: nsig1 = float(norm1.get()) while nsig2 == 0.: nsig2 = float(norm2.get()) while nsig3 == 0.: nsig3 = float(norm3.get()) sig0 = 0 sig1 = 0 sig2 = 0 sig3 = 0 for i in range(0, options.acqn): x3acq.put(1) time.sleep(options.acqt) while (x3ch3roi3ct.get() == 0.0 or x3ch3roi3ct.timestamp == roits): time.sleep(0.02) roits = x3ch3roi3ct.timestamp while (x3ch3roi3ct.timestamp == roits): time.sleep(0.1) sig0 = sig0 + x3ch1roi0ct.get() + x3ch2roi0ct.get( ) + x3ch3roi0ct.get() sig1 = sig1 + x3ch1roi1ct.get() + x3ch2roi1ct.get( ) + x3ch3roi1ct.get() sig2 = sig2 + x3ch1roi2ct.get() + x3ch2roi2ct.get( ) + x3ch3roi2ct.get() sig3 = sig3 + x3ch1roi3ct.get() + x3ch2roi3ct.get( ) + x3ch3roi3ct.get() roits = x3ch3roi3ct.timestamp tn = time.time() - t0 if options.sim is False: str = '%(X)06d %(XC)9.4f %(YC)9.4f %(d1)10.7e %(d2)10.7e %(d3)10.7e %(d4)10.7e %(n0)10.7e %(n1)10.7e %(n2)10.7e %(n3)10.7e %(s0)10.7e %(s1)10.7e %(s2)10.7e %(s3)10.7e %(time)9.2f' % { 'X': Ncol, 'XC': xmot_cur.get(), "YC": ymot_cur.get(), "d1": float(signal0), "d2": float(signal1), "d3": float(signal2), "d4": float(signal3), 'n0': nsig0, 'n1': nsig1, 'n2': nsig2, 'n3': nsig3, "s0": sig0, "s1": sig1, "s2": sig2, "s3": sig3, "time": tn } print str fp.write(str) fp.write('\n') else: str = '%(X)06d %(XC)8.4f %(YC)8.4f %(d1)10.7e %(d2)10.7e %(d3)10.7e %(d4)10.7e' % { "X": int(Ncol), "XC": tar[0][0], "YC": tar[1][0], "d1": float(signal0), "d2": float(signal1), "d3": float(signal2), "d4": float(signal3) } print str fp.write(str) fp.write('\n') Ncol = Ncol + 1 Nrow = Nrow + 1 str = 'End time is ' + time.asctime() print str fp.write(str) fp.write('\n') fp.close() return 0
def main(argv=None): global dbd global simulate global fp global shut_open global current global T_stop d111 = SRXenergy.d111 dBragg = SRXenergy.dBragg #parse command line options usage = "usage: %prog [options]\nData files are written to /data/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--detname", action="store", type="string", dest="detname", help="detector to trigger") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--config", action="store", type="string", dest="fname", help="name of config file") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves and bursting") parser.add_option("--checkbeam", action="store_true", dest="checkbeam", default=False, help="only acquire when beam is on") (options, args) = parser.parse_args() #open log file D0 = time.localtime()[0] D1 = time.localtime()[1] D2 = time.localtime()[2] D3 = time.localtime()[3] D4 = time.localtime()[4] cd = os.getcwd() fstr = '/nfs/xf05id1/data/' if sys.argv[0][0] == '.': out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D0)+'_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D0)+'_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(fstr + repr(D0)) except OSError: try: os.mkdir(fstr + repr(D0)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) sys.exit() try: os.chdir(fstr + repr(D0) + '/' + repr(D1)) except OSError: try: os.mkdir(fstr + repr(D0) + '/' + repr(D1)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) + '/' + repr( D1) sys.exit() try: os.chdir(fstr + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except OSError: try: os.mkdir(fstr + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) + '/' + repr( D1) + '/' + repr(D2) sys.exit() try: fp = open(out_filename, 'a') except Exception: print 'cannot open file: ' + out_filename sys.exit() os.chdir(cd) fp.write('#') fp.write(', '.join(sys.argv)) fp.write('\n') #open list of scan points try: fconfig = open(options.fname) except Exception: print "cannot open file containing scan points. Error opening: " + options.fname sys.exit() fstr = '#a default string' pN = 0 angle = list() ivu = list() t2gap = list() while fstr.rsplit().__len__() > 0: if (fstr[0] is not '#'): pN = pN + 1 angle.append(fstr.rsplit()[0]) ivu.append(fstr.rsplit()[1]) t2gap.append(fstr.rsplit()[2]) fstr = fconfig.readline() fconfig.close() #initialize PVs and callbacks if options.detname == None: # detstr='XF:03IDA-BI{FS:1-CAM:1}' detstr = '' print "must provide detector pv base, e.g., 'XF:28IDA-BI{URL:01}'" sys.exit() else: detstr = options.detname bmot = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}Mtr.VAL') bmot_cur = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}Mtr.RBV') bmot_stop = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}Mtr.STOP') umot = PV('SR:C5-ID:G1{IVU21:1-Mtr:2}Inp:Pos') umot_cur = PV('SR:C5-ID:G1{IVU21:1-LEnc}Gap') umot_go = PV('SR:C5-ID:G1{IVU21:1-Mtr:2}Sw:Go') gmot = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:X2}Mtr.VAL') gmot_cur = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:X2}Mtr.RBV') gmot_stop = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:X2}Mtr.STOP') traj_o_x = PV('SR:C31-{AI}Aie5-2:Offset-x-Cal') traj_o_y = PV('SR:C31-{AI}Aie5-2:Offset-y-Cal') traj_a_x = PV('SR:C31-{AI}Aie5-2:Angle-x-Cal') traj_a_y = PV('SR:C31-{AI}Aie5-2:Angle-y-Cal') shut_status = PV('SR:C05-EPS{PLC:1}Shutter:Sum-Sts') beam_current = PV('SR:C03-BI{DCCT:1}I:Total-I') bragg_temp = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}T-I') if detstr == 'xf05bpm03' or detstr == 'xf05bpm04': det0 = PV(detstr + ':DataRead_Ch1') det1 = PV(detstr + ':DataRead_Ch2') det2 = PV(detstr + ':DataRead_Ch3') det3 = PV(detstr + ':DataRead_Ch4') else: det0 = PV(detstr + 'Cur:I0-I') det1 = PV(detstr + 'Cur:I1-I') det2 = PV(detstr + 'Cur:I2-I') det3 = PV(detstr + 'Cur:I3-I') bmot.info bmot_cur.info bmot_stop.info umot.info umot_cur.info umot_go.info gmot.info gmot_cur.info gmot_stop.info det0.info det1.info det2.info det3.info bragg_temp.info bmot_cur.add_callback(cbfx) bmot_cur.run_callbacks() umot_cur.add_callback(cbfy) umot_cur.run_callbacks() gmot_cur.add_callback(cbfz) gmot_cur.run_callbacks() shut_status.add_callback(cbf_shut) beam_current.add_callback(cbf_curr) shut_status.run_callbacks() beam_current.run_callbacks() bragg_temp.add_callback(cbf_temp) bragg_temp.run_callbacks() #check command line options if options.stall == None: twait = 0. else: twait = options.stall # display_list = np.zeros((pN+1,2)) # count=0 str = '#Start time is ' + time.asctime() print str fp.write(str) fp.write('\n') if options.sim is True: str = " -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') str="#Current position [mm]: %(XC)7.4f, %(YC)7.4f, %(ZC)7.3f" %\ {"XC":bmot_cur.get(),"YC":umot_cur.get(),"ZC":gmot_cur.get()} print str fp.write(str) fp.write('\n') time.sleep(2) LN = 0 for x in range(0, pN): tar[0][1] = 1 tar[0][0] = float(angle[x]) tar[1][1] = 1 tar[1][0] = float(ivu[x]) tar[2][1] = 1 tar[2][0] = float(t2gap[x]) #if tar[0][0] is the original position, raise "in position" flag if indeadband(float(tar[0][0]), float(bmot_cur.get()), dbd) == 1: tar[0][1] = 0 if indeadband(float(tar[1][0]), float(umot_cur.get()), dbd) == 1: tar[1][1] = 0 if indeadband(float(tar[2][0]), float(gmot_cur.get()), dbd) == 1: tar[2][1] = 0 if options.sim is False: bmot.put(tar[0][0]) umot.put(tar[1][0]) gmot.put(tar[2][0]) time.sleep(1) umot_go.put(0) else: tar[0][1] = 0 tar[1][1] = 0 tar[2][1] = 0 try: ox = traj_o_x.get() except CA.Client.Exception: ox = 12398 continue try: oy = traj_o_y.get() except CA.Client.Exception: oy = 12398 continue try: ax = traj_a_x.get() except CA.Client.Exception: ax = 12398 continue try: ay = traj_a_y.get() except CA.Client.Exception: ay = 12398 continue while (tar[0][1] == 1) or (tar[1][1] == 1) or (tar[2][1] == 1): time.sleep(0.05) if LN > 400: umot_go.put(0) LN = 0 else: LN = LN + 1 if options.sim is False: time.sleep(twait) while (options.checkbeam and (shut_open == False or beam_current == False)) or T_stop == True: print "Stopped. Waiting for scan conditions to return to normal." time.sleep(60.) print det0.get() signal0 = float(det0.get()) signal1 = float(det1.get()) signal2 = float(det2.get()) signal3 = float(det3.get()) while (signal0 < 1e-11): time.sleep(0.02) signal0 = float(det0.get()) signal1 = float(det1.get()) signal2 = float(det2.get()) signal3 = float(det3.get()) else: while (options.checkbeam and (shut_open == False or beam_current == False)): print "Stopped. Waiting for beam to return." time.sleep(60.) signal0 = 0. signal1 = 0. signal2 = 0. signal3 = 0. if options.sim is False: str = ' E= %(E)8.3f B= %(B)8.4f U= %(U)8.4f G= %(G)8.3f : %(C0)10.7e %(C1)10.7e %(C2)10.7e %(C3)10.7e TRAJ %(OX)6.3f %(OY)6.3f %(AX)6.3f %(AY)6.3f %(T)d' % { "E": 12.3984 / (2 * d111 * np.sin( (bmot_cur.get() + dBragg) * np.pi / 180)), "B": float(bmot_cur.get()), "U": float(umot_cur.get()), "G": float(gmot_cur.get()), "C0": signal0, "C1": signal1, "C2": signal2, "C3": signal3, "OX": ox, "AX": ax, "OY": oy, "AY": ay, 'T': time.time() } print str fp.write(str) fp.write('\n') else: str = ' E= %(E)8.3f B= %(B)8.4f U= %(U)8.4f G= %(G)8.3f : %(C0)10.7e %(C1)10.7e %(C2)10.7e %(C3)10.7e TRAJ %(OX)6.3f %(OY)6.3f %(AX)6.3f %(AY)6.3f' % { "E": 12.3984 / (2 * d111 * np.sin( (bmot_cur.get() + dBragg) * np.pi / 180)), "B": tar[0][0], "U": tar[1][0], "G": tar[2][0], "C0": signal0, "C1": signal1, "C2": signal2, "C3": signal3, "OX": ox, "AX": ax, "OY": oy, "AY": ay } print str fp.write(str) fp.write('\n') # display_list[count,0] = x # display_list[count,1] = signal0 # count = count+1 #return to starting positions # if options.sim is False: # bmot.put(float(angle[0])) # gmot.put(float(ivu[0])) # umot.put(float(t2gap[0])) # time.sleep(2) # xmot_stop.put(0) str = '#End time is ' + time.asctime() print str fp.write(str) fp.write('\n') fp.close() # plt.figure() # plt.plot(display_list[:,0],display_list[:,1]) # plt.plot(display_list[:,0],display_list[:,1],'go') # plt.show() return 0
def main(argv=None): global simulate global fp global shut_open global current #parse command line options usage = "usage: %prog [options]\nData files are written to /data/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--detname", action="store", type="string", dest="detname", help="detector PV base") parser.add_option("--xstart", action="store", type="float", dest="xo", help="starting X position") parser.add_option("--xnumstep", action="store", type="int", dest="Nx", help="number of steps in X") parser.add_option("--xstepsize", action="store", type="float", dest="dx", help="step size in X") parser.add_option("--ystart", action="store", type="float", dest="yo", help="starting Y position") parser.add_option("--ynumstep", action="store", type="int", dest="Ny", help="number of steps in Y") parser.add_option("--ystepsize", action="store", type="float", dest="dy", help="step size in Y") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves") parser.add_option("--checkbeam", action="store_true", dest="checkbeam", default=False, help="only acquire when beam is on") (options, args) = parser.parse_args() #open log file D0 = time.localtime()[0] D1 = time.localtime()[1] D2 = time.localtime()[2] D3 = time.localtime()[3] D4 = time.localtime()[4] cd = os.getcwd() filedir = '/nfs/xf05id1/data/' if sys.argv[0][0] == '.': out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(filedir + repr(D0)) except OSError: try: os.mkdir(filedir + repr(D0)) except Exception: print 'cannot create directory: ' + '/data/' + repr(D0) sys.exit() try: os.chdir(filedir + repr(D0) + '/' + repr(D1)) except OSError: try: os.mkdir(filedir + repr(D0) + '/' + repr(D1)) except Exception: print 'cannot create directory: ' + '/data/' + repr( D0) + '/' + repr(D1) sys.exit() try: os.chdir(filedir + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except OSError: try: os.mkdir(filedir + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except Exception: print 'cannot create directory: ' + filedir + repr( D0) + '/' + repr(D1) + '/' + repr(D2) sys.exit() try: fp = open(out_filename, 'a') except Exception: print 'cannot open file: ' + out_filename sys.exit() os.chdir(cd) fp.write('#' + ', '.join(sys.argv)) fp.write('\n') #initialize PVs and callbacks if options.detname == None: # detstr='XF:03IDA-BI{FS:1-CAM:1}' detstr = '' print "must provide detector pv base, e.g., 'XF:28IDA-BI{URL:01}'" sys.exit() else: detstr = options.detname ##### original script for Aerotech stages # xmotname='XF:05IDD-ES:1{Stg:Smpl1-Ax:X}' #AerotechX # ymotname='XF:05IDD-ES:1{Stg:Smpl1-Ax:Y}' #AerotechY # xmot=PV(xmotname+'Mtr.VAL') # xmot_cur=PV(xmotname+'Mtr.RBV') # ymot=PV(ymotname+'Mtr.VAL') # ymot_cur=PV(ymotname+'Mtr.RBV') ###### #####modified for nPoint Stages xmot = PV('NPOINT:CH1:SET_POSITION.A') xmot_cur = PV('NPOINT:CH1:GET_POSITION') ymot = PV('NPOINT:CH2:SET_POSITION.A') ymot_cur = PV('NPOINT:CH2:GET_POSITION') ##### shut_status = PV('SR:C05-EPS{PLC:1}Shutter:Sum-Sts') beam_current = PV('SR:C03-BI{DCCT:1}I:Total-I') #transmission #check command line options if options.yo == None: print "must provide a starting point in the vertical" sys.exit() else: yo = options.yo if options.xo == None: print "must provide a starting point in the horizontal" sys.exit() else: xo = options.xo if options.dx == None: dx = 0.00000001 else: dx = options.dx if options.dy == None: dy = 0.00000001 else: dy = options.dy if options.Nx == None: Nx = 0 else: Nx = options.Nx if options.Ny == None: Ny = 0 else: Ny = options.Ny if options.stall == None: twait = 0. else: twait = options.stall diode0 = PV(detstr + 'Cur:I0-I') diode1 = PV(detstr + 'Cur:I1-I') diode2 = PV(detstr + 'Cur:I2-I') diode3 = PV(detstr + 'Cur:I3-I') xmot_cur.get() ymot_cur.get() norm0 = PV('xf05bpm03:DataRead_Ch1') norm1 = PV('xf05bpm03:DataRead_Ch2') norm2 = PV('xf05bpm03:DataRead_Ch3') norm3 = PV('xf05bpm03:DataRead_Ch4') ssa0 = PV('XF:05IDA-BI{BPM:05}AH501:Current1:MeanValue_RBV') ssa0.get() ssa1 = PV('XF:05IDA-BI{BPM:05}AH501:Current2:MeanValue_RBV') ssa1.get() ssa2 = PV('XF:05IDA-BI{BPM:05}AH501:Current3:MeanValue_RBV') ssa2.get() ssa3 = PV('XF:05IDA-BI{BPM:05}AH501:Current4:MeanValue_RBV') ssa3.get() xmot_cur.add_callback(cbfx) ymot_cur.add_callback(cbfy) shut_status.add_callback(cbf_shut) beam_current.add_callback(cbf_curr) xmot_cur.run_callbacks() ymot_cur.run_callbacks() shut_status.run_callbacks() beam_current.run_callbacks() str = '#Start time is ' + time.asctime() print str fp.write(str) fp.write('\n') str = '#[point #]\tX pos\tY pos\tch 1\tch 2\tch 3\tch 4\tBPM1\tssa0\tssa1\tssa2\tssa3\ttime' print str fp.write(str) fp.write('\n') str='# x: %(hs)6.4f ; y: %(vs)6.4f '%\ {"hs":xmot_cur.get(),"vs":ymot_cur.get()} print str fp.write(str) fp.write('\n') if options.sim is True: str = " -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') time.sleep(2) #number of rows and columns completed by scan Ncol = Nrow = 0 LN = 0 #diode readback is now limiting factor for scan speed oldsig = 0. #when the cryocooler kicks in, the beam is unusable for ~3200sec cryo = PV('XF:05IDA-OP:1{Mono:HDCM}T:LN2Out-I') ct = cryo.get() while (ct is None): time.sleep(0.05) ct = cryo.get() t0 = time.time() cryocounter = 0 shut_toggle = False #nested loops for scanning z,x,y for y in np.linspace(yo, yo + ((Ny) * dy), Ny + 1): tar[1][0] = y tar[1][1] = 1 if options.sim is False: ymot.put(tar[1][0]) if indeadband(float(tar[1][0]), float(ymot_cur.get()), dbd) == 1: tar[1][1] = 0 if Nrow % 2 == 0: xs = 0. + xo xe = ((Nx + 1) * dx) + xo - dx xi = dx else: xs = ((Nx) * dx) + xo xe = 0. + xo xi = -dx for x in np.linspace(xs, xe, Nx + 1): tar[0][0] = x tar[0][1] = 1 if indeadband(float(tar[0][0]), float(xmot_cur.get()), dbd) == 1: tar[0][1] = 0 if options.sim is False: xmot.put(tar[0][0]) while ((tar[0][1] == 1) or (tar[1][1] == 1)): time.sleep(0.01) signal0 = signal1 = signal2 = signal3 = 0. nsig0 = nsig1 = nsig2 = nsig3 = 0. sigssa0 = sigssa1 = sigssa2 = sigssa3 = 0. time.sleep(twait) while (options.checkbeam and (cryo.get() < (ct))): print "Stopped. Detected possible cryocooler activation." time.sleep(1) cryocounter = cryocounter + 1 #if the above is true for five cycles, the cryocooler was on, wait another 5min if (options.checkbeam and cryocounter > 300): print "Detected cryocooler activation, waiting 10min" time.sleep(600) cryocounter = 0 while (options.checkbeam and (shut_open == False or beam_current == False)): print "Stopped. Waiting for scan conditions to return to normal." if shut_open == False: shut_toggle = True time.sleep(10.) if shut_toggle == True: print "Entering optics conditioning period. Waiting 5min" time.sleep(300) shut_toggle = False if options.sim is False: while signal0 == 0.: signal0 = diode0.get() while signal1 == 0.: signal1 = float(diode1.get()) while (signal1 == oldsig): time.sleep(0.05) signal1 = diode1.get() oldsig = signal1 while signal2 == 0.: signal2 = diode2.get() while signal3 == 0.: signal3 = diode3.get() while nsig0 == 0.: nsig0 = float(norm0.get()) while nsig1 == 0.: nsig1 = float(norm1.get()) while nsig2 == 0.: nsig2 = float(norm2.get()) while nsig3 == 0.: nsig3 = float(norm3.get()) sigssa0 = ssa0.get() sigssa1 = ssa1.get() sigssa2 = ssa2.get() sigssa3 = ssa3.get() tn = time.time() - t0 if options.sim is False: str = '[%(X)06d] at ( %(XC)9.4f , %(YC)9.4f ): %(d1)10.7e %(d2)10.7e %(d3)10.7e %(d4)10.7e %(norm)10.7e %(s0)10.7e %(s1)10.7e %(s2)10.7e %(s3)10.7e %(time)9.2f' % { 'X': Ncol, 'XC': xmot_cur.get(), "YC": ymot_cur.get(), "d1": float(signal0), "d2": float(signal1), "d3": float(signal2), "d4": float(signal3), 'norm': nsig0 + nsig1 + nsig2 + nsig3, "s0": sigssa0, "s1": sigssa1, "s2": sigssa2, "s3": sigssa3, "time": tn } print str fp.write(str) fp.write('\n') else: str = '[%(X)06d] at ( %(XC)8.4f , %(YC)8.4f ): %(d1)10.7e %(d2)10.7e %(d3)10.7e %(d4)10.7e' % { "X": int(Ncol), "XC": tar[0][0], "YC": tar[1][0], "d1": float(signal0), "d2": float(signal1), "d3": float(signal2), "d4": float(signal3) } print str fp.write(str) fp.write('\n') Ncol = Ncol + 1 Nrow = Nrow + 1 str = 'End time is ' + time.asctime() print str fp.write(str) fp.write('\n') fp.close() return 0
def main(argv=None): global dbd global simulate global fp global shut_open global current global T_stop #parse command line options usage = "usage: %prog [options]\nData files are written to /data/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") usage = "usage: %prog [options]\nData files are written to /data/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--config",action="store", type="string", dest="fname", help="name of config file") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves and bursting") parser.add_option("--checkbeam", action="store_true", dest="checkbeam", default=False, help="only acquire when beam is on") parser.add_option("--acqtime", action="store", type="float", dest="acqt", help="image integration time [sec]") parser.add_option("--acqnum", action="store", type="int", dest="acqn", help="images to collect") (options,args) = parser.parse_args() #open log file D0=time.localtime()[0] D1=time.localtime()[1] D2=time.localtime()[2] D3=time.localtime()[3] D4=time.localtime()[4] cd=os.getcwd() fstr='/nfs/xf05id1/data/' if sys.argv[0][0]=='.': out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D0)+'_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D0)+'_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(fstr+repr(D0)) except OSError: try: os.mkdir(fstr+repr(D0)) except Exception: print 'cannot create directory: '+fstr+repr(D0) sys.exit() try: os.chdir(fstr+repr(D0)+'/'+repr(D1)) except OSError: try: os.mkdir(fstr+repr(D0)+'/'+repr(D1)) except Exception: print 'cannot create directory: '+fstr+repr(D0)+'/'+repr(D1) sys.exit() try: os.chdir(fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)) except OSError: try: os.mkdir(fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)) except Exception: print 'cannot create directory: '+fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2) sys.exit() try: fp=open(out_filename,'a') except Exception: print 'cannot open file: '+out_filename sys.exit() try: os.chdir(fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'HDF5') except OSError: try: os.mkdir(fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'HDF5') except Exception: print 'cannot create directory: '+fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'HDF5' sys.exit() # H5path=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/HDF5' H5path='/epics/data/2015-3/300198' os.chdir(cd) fp.write('#') fp.write(', '.join(sys.argv)) fp.write('\n') #open list of scan points try: fconfig=open(options.fname) except Exception: print "cannot open file containing scan points. Error opening: "+options.fname sys.exit() fstr='#a default string' pN=0 angle=list() ivu=list() t2gap=list() while fstr.rsplit().__len__() > 0: if (fstr[0] is not '#'): pN=pN+1 angle.append(fstr.rsplit()[0]) ivu.append(fstr.rsplit()[1]) t2gap.append(fstr.rsplit()[2]) fstr=fconfig.readline() fconfig.close() #initialize PVs and callbacks detstr='XF:05IDA{IM:1}' bmot = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}Mtr.VAL') bmot_cur = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}Mtr.RBV') bmot_stop = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}Mtr.STOP') umot = PV('SR:C5-ID:G1{IVU21:1-Mtr:2}Inp:Pos') umot_cur = PV('SR:C5-ID:G1{IVU21:1-LEnc}Gap') umot_go = PV('SR:C5-ID:G1{IVU21:1-Mtr:2}Sw:Go') gmot = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:X2}Mtr.VAL') gmot_cur = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:X2}Mtr.RBV') gmot_stop = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:X2}Mtr.STOP') shut_status=PV('SR:C05-EPS{PLC:1}Shutter:Sum-Sts') beam_current=PV('SR:C03-BI{DCCT:1}I:Total-I') bragg_temp=PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}T-I') norm0=PV('XF:05IDD-BI:1{BPM:01}.S20') norm1=PV('XF:05IDD-BI:1{BPM:01}.S21') norm2=PV('XF:05IDD-BI:1{BPM:01}.S22') norm3=PV('XF:05IDD-BI:1{BPM:01}.S23') wb=srxslit.nsls2slit(tb='XF:05IDA-OP:1{Slt:1-Ax:T}',bb='XF:05IDA-OP:1{Slt:1-Ax:B}',ib='XF:05IDA-OP:1{Slt:1-Ax:I}',ob='XF:05IDA-OP:1{Slt:1-Ax:O}') pb=srxslit.nsls2slit(ib='XF:05IDA-OP:1{Slt:2-Ax:I}',ob='XF:05IDA-OP:1{Slt:2-Ax:O}') ssa=srxslit.nsls2slit(tb='XF:05IDB-OP:1{Slt:SSA-Ax:T}', bb='XF:05IDB-OP:1{Slt:SSA-Ax:B}', ob='XF:05IDB-OP:1{Slt:SSA-Ax:O}',ib='XF:05IDB-OP:1{Slt:SSA-Ax:I}') x3acq=PV('XSPRESS3-EXAMPLE:Acquire') x3erase=PV('XSPRESS3-EXAMPLE:ERASE') x3acqtime=PV('XSPRESS3-EXAMPLE:AcquireTime') x3acqnum=PV('XSPRESS3-EXAMPLE:NumImages') x3tmode=PV('XSPRESS3-EXAMPLE:TriggerMode') x3h5path=PV('XSPRESS3-EXAMPLE:HDF5:FilePath') x3h5fname=PV('XSPRESS3-EXAMPLE:HDF5:FileName') x3h5fnum=PV('XSPRESS3-EXAMPLE:HDF5:FileNumber') x3h5vdim=PV('XSPRESS3-EXAMPLE:HDF5:NumExtraDims') x3h5size=PV('XSPRESS3-EXAMPLE:HDF5:ExtraDimSizeN') x3h5d1=PV('XSPRESS3-EXAMPLE:HDF5:ExtraDimSizeX') x3h5d2=PV('XSPRESS3-EXAMPLE:HDF5:ExtraDimSizeY') #report ROIs for channels and counts at each point x3ch1roi0min=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI1_LLM') x3ch1roi0max=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI1_HLM') x3ch1roi0ct=PV('XSPRESS3-EXAMPLE:C1_ROI1:Value_RBV') x3ch1roi1min=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI2_LLM') x3ch1roi1max=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI2_HLM') x3ch1roi1ct=PV('XSPRESS3-EXAMPLE:C1_ROI2:Value_RBV') x3ch1roi2min=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI3_LLM') x3ch1roi2max=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI3_HLM') x3ch1roi2ct=PV('XSPRESS3-EXAMPLE:C1_ROI3:Value_RBV') x3ch2roi0min=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI1_LLM') x3ch2roi0max=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI1_HLM') x3ch2roi0ct=PV('XSPRESS3-EXAMPLE:C2_ROI1:Value_RBV') x3ch2roi1min=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI2_LLM') x3ch2roi1max=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI2_HLM') x3ch2roi1ct=PV('XSPRESS3-EXAMPLE:C2_ROI2:Value_RBV') x3ch2roi2min=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI3_LLM') x3ch2roi2max=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI3_HLM') x3ch2roi2ct=PV('XSPRESS3-EXAMPLE:C2_ROI3:Value_RBV') x3ch3roi0min=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI1_LLM') x3ch3roi0max=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI1_HLM') x3ch3roi0ct=PV('XSPRESS3-EXAMPLE:C3_ROI1:Value_RBV') x3ch3roi1min=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI2_LLM') x3ch3roi1max=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI2_HLM') x3ch3roi1ct=PV('XSPRESS3-EXAMPLE:C3_ROI2:Value_RBV') x3ch3roi2min=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI3_LLM') x3ch3roi2max=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI3_HLM') x3ch3roi2ct=PV('XSPRESS3-EXAMPLE:C3_ROI3:Value_RBV') #claim ROI 4 for our own use. we will integrate over all 4096 channels. x3ch1roi3min=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI4_LLM') x3ch1roi3max=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI4_HLM') x3ch1roi3ct=PV('XSPRESS3-EXAMPLE:C1_ROI4:Value_RBV') x3ch2roi3min=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI4_LLM') x3ch2roi3max=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI4_HLM') x3ch2roi3ct=PV('XSPRESS3-EXAMPLE:C2_ROI4:Value_RBV') x3ch3roi3min=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI4_LLM') x3ch3roi3max=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI4_HLM') x3ch3roi3ct=PV('XSPRESS3-EXAMPLE:C3_ROI4:Value_RBV') dett=PV('XF:05IDD-ES:1{EVR:1-Out:FP3}Src:Scale-SP') deti=PV('XF:05IDA{IM:1}Per-SP') detinit=PV('XF:05IDA{IM:1}Cmd:Init') det0 = PV(detstr+'Cur:I0-I') det1 = PV(detstr+'Cur:I1-I') det2 = PV(detstr+'Cur:I2-I') det3 = PV(detstr+'Cur:I3-I') bmot.info bmot_cur.info bmot_stop.info umot.info umot_cur.info umot_go.info gmot.info gmot_cur.info gmot_stop.info det0.info det1.info det2.info det3.info bragg_temp.info bmot_cur.add_callback(cbfx) bmot_cur.run_callbacks() umot_cur.add_callback(cbfy) umot_cur.run_callbacks() gmot_cur.add_callback(cbfz) gmot_cur.run_callbacks() shut_status.add_callback(cbf_shut) beam_current.add_callback(cbf_curr) shut_status.run_callbacks() beam_current.run_callbacks() bragg_temp.add_callback(cbf_temp) bragg_temp.run_callbacks() x3h5path.put(H5path) x3h5fname.put(repr(D0)+'_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_') x3h5fnum.put(0) x3acqtime.put(options.acqt) x3acqnum.put(options.acqn) x3tmode.put(1) x3ch1roi3min.put(0) x3ch2roi3min.put(0) x3ch3roi3min.put(0) x3ch1roi3max.put(4096) x3ch2roi3max.put(4096) x3ch3roi3max.put(4096) #h5 set up x3h5vdim.put(1) x3h5size.put(options.acqn) x3h5d1.put(pN) x3h5d2.put(0) roits=x3ch3roi3ct.timestamp dett.put(3) #overhead on triggering F460 deti.put(float(options.acqn)*options.acqt*.9) detinit.put(1) #check command line options if options.stall == None: twait = 0. else: twait = options.stall str='#NSLS-II SRX'+time.asctime() fp.write(str) fp.write('\n') str='# Start time is '+time.asctime() print str fp.write(str) fp.write('\n') if options.sim is True: str=" -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') else: x3h5capture.put(1) dett.put(4) time.sleep(2) while x3h5capture.get() == 0: time.sleep(0.5) dett.put(3) str='# bragg: %(br)6.4f ; undulator: %(un)6.4f ; gap: %(cg)f ; ROI1 %(roi1i)d:%(roi1a)d ; ROI2 %(roi2i)d:%(roi2a)d ; ROI3 %(roi3i)d:%(roi3a)d'%\ {"br":bmot_cur.get(),"un":umot_cur.get(), "cg":gmot_cur.get(),'roi1i':x3ch1roi0min.get(), 'roi1a':x3ch1roi0max.get(), 'roi2i':x3ch1roi1min.get(), 'roi2a':x3ch1roi1max.get(), 'roi3i':x3ch1roi2min.get(), 'roi3a':x3ch1roi2max.get()} print str fp.write(str) fp.write('\n') str="# --------------------" print str fp.write(str) fp.write('\n') str="# bragg u-gap c-gap energy I0-1 I0-2 I0-3 I0-4 time ROI-1 ROI-2 ROI-3 ROI-4 intensity" print str fp.write(str) fp.write('\n') LN=0 oldsig=det0.get() t0=time.time() sig0=0. sig1=0. sig2=0. sig3=0. nsig0=0. nsig1=0. nsig2=0. nsig3=0. for x in range(0,pN): tar[0][1] = 1 tar[0][0] = float(angle[x]) tar[1][1] = 1 tar[1][0] = float(ivu[x]) tar[2][1] = 1 tar[2][0] = float(t2gap[x]) #if tar[0][0] is the original position, raise "in position" flag if indeadband(float(tar[0][0]),float(bmot_cur.get()),dbd)==1: tar[0][1] = 0 if indeadband(float(tar[1][0]),float(umot_cur.get()),dbd)==1: tar[1][1] = 0 if indeadband(float(tar[2][0]),float(gmot_cur.get()),dbd)==1: tar[2][1] = 0 if options.sim is False: bmot.put(tar[0][0]) umot.put(tar[1][0]) gmot.put(tar[2][0]) time.sleep(1) umot_go.put(0) else: tar[0][1]=0 tar[1][1]=0 tar[2][1]=0 while (tar[0][1] == 1) or (tar[1][1] == 1) or(tar[2][1] == 1): time.sleep(0.05) if LN > 400: umot_go.put(0) LN=0 else: LN=LN+1 if options.sim is False: time.sleep(twait) while ( options.checkbeam and (shut_open == False or beam_current == False)) or T_stop==True: print "Stopped. Waiting for scan conditions to return to normal." if shut_open == False: print "\t->shutter is closed" elif beam_current == False: print "\t->Ring current is below threshold" elif T_stop==True: print "\t->HDCM pitch motor is too hot" else: print "\t->why not have a nice cup of tea or hit ctrl-C?" time.sleep(60.) x3erase.put(1) dett.put(4) nsig0=norm0.get() nsig1=norm1.get() nsig2=norm2.get() nsig3=norm3.get() sig0=sig1=sig2=sig3=3 for i in range(0,options.acqn): x3acq.put(1) while ( x3ch3roi3ct.get()==0.0 or x3ch3roi3ct.timestamp==roits): time.sleep(0.02) sig0=sig0+x3ch1roi0ct.get()+x3ch2roi0ct.get()+x3ch3roi0ct.get() sig1=sig1+x3ch1roi1ct.get()+x3ch2roi1ct.get()+x3ch3roi1ct.get() sig2=sig2+x3ch1roi2ct.get()+x3ch2roi2ct.get()+x3ch3roi2ct.get() sig3=sig3+x3ch1roi3ct.get()+x3ch2roi3ct.get()+x3ch3roi3ct.get() roits=x3ch3roi3ct.timestamp signal0=float(det1.get()) while (signal0==0.0): signal0=float(det1.get()) # while(signal0 == oldsig): # signal0=det0.get() # oldsig=signal0 dett.put(3) else: while ( options.checkbeam and (shut_open == False or beam_current == False)): print "Stopped. Waiting for beam to return." time.sleep(60.) signal0=0. nsig1=0 nsig2=0 nsig3=0 tn=time.time()-t0 if options.sim is False: # str=' %(B)8.4f %(U)8.4f %(G)8.3f %(E)8.2f %(C0)10.7e %(C1)10.7e %(C2)10.7e %(C3)10.7e %(T)d %(ROI1)d %(ROI2)d %(ROI3)d %(ROI4)d %(T1)10.7e'%{"B":float(bmot_cur.get()), "U":float(umot_cur.get()), "G":float(gmot_cur.get()), "C0":nsig0, "C1":nsig1, "C2":nsig2, "C3":nsig3, "ROI1":sig0,'T':tn,"ROI2":sig1,"ROI3":sig2,"ROI4":sig3,"T1":signal0,"E":12398.4 / (2 * 3.13029665951 * math.sin((bmot_cur.get()+0.323658778534)/180.*np.pi))} str=' %(B)8.4f %(U)8.4f %(G)8.3f %(E)8.2f %(C0)10.7e %(C1)10.7e %(C2)10.7e %(C3)10.7e %(T)d %(ROI1)d %(ROI2)d %(ROI3)d %(ROI4)d %(T1)10.7e'%{"B":float(bmot_cur.get()), "U":float(umot_cur.get()), "G":float(gmot_cur.get()), "C0":nsig0, "C1":nsig1, "C2":nsig2, "C3":nsig3, "ROI1":sig0,'T':tn,"ROI2":sig1,"ROI3":sig2,"ROI4":sig3,"T1":signal0,"E":12398.4 / (2 * dSi111 * math.sin((bmot_cur.get()+dbragg)/180.*np.pi))} print str fp.write(str) fp.write('\n') else: str=' B= %(B)8.4f U= %(U)8.4f G= %(G)8.3f : %(C0)10.7e %(C1)10.7e %(C2)10.7e %(C3)10.7e %(ROI)d %(T)d'%{"B":tar[0][0], "U":tar[1][0], "G":tar[2][0], "C0":signal0, "C1":nsig1, "C2":nsig2, "C3":nsig3, "ROI":x3ch1roi0ct.get(),'T':time.time()} print str fp.write(str) fp.write('\n') str='#End time is '+time.asctime() print str fp.write(str) fp.write('\n') fp.close()
def main(argv=None): global dbd global simulate global fp global shut_open global current global T_stop #parse command line options usage = "usage: %prog [options]\nData files are written to /data/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--detname", action="store", type="string", dest="detname", help="detector to trigger") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--config",action="store", type="string", dest="fname", help="name of config file") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves and bursting") parser.add_option("--checkbeam", action="store_true", dest="checkbeam", default=False, help="only acquire when beam is on") parser.add_option("--acqtime", action="store", type="float", dest="acqt", help="image integration time [sec]") parser.add_option("--acqnum", action="store", type="int", dest="acqn", help="images to collect") (options,args) = parser.parse_args() #open log file D0=time.localtime()[0] D1=time.localtime()[1] D2=time.localtime()[2] D3=time.localtime()[3] D4=time.localtime()[4] cd=os.getcwd() fstr='/nfs/xf05id1/data/' if sys.argv[0][0]=='.': out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(fstr+repr(D0)) except OSError: try: os.mkdir(fstr+repr(D0)) except Exception: print 'cannot create directory: '+fstr+repr(D0) sys.exit() try: os.chdir(fstr+repr(D0)+'/'+repr(D1)) except OSError: try: os.mkdir(fstr+repr(D0)+'/'+repr(D1)) except Exception: print 'cannot create directory: '+fstr+repr(D0)+'/'+repr(D1) sys.exit() try: os.chdir(fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)) except OSError: try: os.mkdir(fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)) except Exception: print 'cannot create directory: '+fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2) sys.exit() try: fp=open(out_filename,'a') except Exception: print 'cannot open file: '+out_filename sys.exit() try: os.chdir(fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'HDF5') except OSError: try: os.mkdir(fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'HDF5') except Exception: print 'cannot create directory: '+fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'HDF5' sys.exit() # H5path=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/HDF5' H5path='/epics/data/201507' os.chdir(cd) fp.write(', '.join(sys.argv)) fp.write('\n') #open list of scan points try: fconfig=open(options.fname) except Exception: print "cannot open file containing scan points. Error opening: "+options.fname sys.exit() fstr='#a default string' pN=0 angle=list() ivu=list() t2gap=list() while fstr.rsplit().__len__() > 0: if (fstr[0] is not '#'): pN=pN+1 angle.append(fstr.rsplit()[0]) ivu.append(fstr.rsplit()[1]) t2gap.append(fstr.rsplit()[2]) fstr=fconfig.readline() fconfig.close() #initialize PVs and callbacks if options.detname == None: # detstr='XF:03IDA-BI{FS:1-CAM:1}' detstr='' print "must provide detector pv base, e.g., 'XF:28IDA-BI{URL:01}'" sys.exit() else: detstr=options.detname bmot = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}Mtr.VAL') bmot_cur = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}Mtr.RBV') bmot_stop = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}Mtr.STOP') umot = PV('SR:C5-ID:G1{IVU21:1-Mtr:2}Inp:Pos') umot_cur = PV('SR:C5-ID:G1{IVU21:1-LEnc}Gap') umot_go = PV('SR:C5-ID:G1{IVU21:1-Mtr:2}Sw:Go') gmot = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:X2}Mtr.VAL') gmot_cur = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:X2}Mtr.RBV') gmot_stop = PV('XF:05IDA-OP:1{Mono:HDCM-Ax:X2}Mtr.STOP') shut_status=PV('SR:C05-EPS{PLC:1}Shutter:Sum-Sts') beam_current=PV('SR:C03-BI{DCCT:1}I:Total-I') bragg_temp=PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}T-I') x3acq=PV('XSPRESS3-EXAMPLE:Acquire') x3erase=PV('XSPRESS3-EXAMPLE:ERASE') x3acqtime=PV('XSPRESS3-EXAMPLE:AcquireTime') x3acqnum=PV('XSPRESS3-EXAMPLE:NumImages') x3tmode=PV('XSPRESS3-EXAMPLE:TriggerMode') x3h5path=PV('XSPRESS3-EXAMPLE:HDF5:FilePath') x3h5fname=PV('XSPRESS3-EXAMPLE:HDF5:FileName') x3h5fnum=PV('XSPRESS3-EXAMPLE:HDF5:FileNumber') x3h5capture=PV('XSPRESS3-EXAMPLE:HDF5:Capture') x3ch1roi0min=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI1_LLM') x3ch1roi0max=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI1_HLM') x3ch1roi0ct=PV('XSPRESS3-EXAMPLE:C1_ROI1:Value_RBV') if detstr=='xf05bpm03' or detstr=='xf05bpm04': det0 = PV(detstr+':DataRead_Ch1') det1 = PV(detstr+':DataRead_Ch2') det2 = PV(detstr+':DataRead_Ch3') det3 = PV(detstr+':DataRead_Ch4') else: det0 = PV(detstr+'Cur:I0-I') det1 = PV(detstr+'Cur:I1-I') det2 = PV(detstr+'Cur:I2-I') det3 = PV(detstr+'Cur:I3-I') bmot.info bmot_cur.info bmot_stop.info umot.info umot_cur.info umot_go.info gmot.info gmot_cur.info gmot_stop.info det0.info det1.info det2.info det3.info bragg_temp.info bmot_cur.add_callback(cbfx) bmot_cur.run_callbacks() umot_cur.add_callback(cbfy) umot_cur.run_callbacks() gmot_cur.add_callback(cbfz) gmot_cur.run_callbacks() shut_status.add_callback(cbf_shut) beam_current.add_callback(cbf_curr) shut_status.run_callbacks() beam_current.run_callbacks() bragg_temp.add_callback(cbf_temp) bragg_temp.run_callbacks() x3h5path.put(H5path) x3h5fname.put(repr(D3)+'_'+repr(D4)+'_') x3h5fnum.put(0) x3acqtime.put(options.acqt) x3acqnum.put(options.acqn) x3tmode.put(1) #check command line options if options.stall == None: twait = 0. else: twait = options.stall # display_list = np.zeros((pN+1,2)) # count=0 str='Start time is '+time.asctime() print str fp.write(str) fp.write('\n') if options.sim is True: str=" -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') str="Current position [mm]: %(XC)7.4f, %(YC)7.4f, %(ZC)7.3f; ROI is %(MIN)d : %(MAX)d" %\ {"XC":bmot_cur.get(),"YC":umot_cur.get(),"ZC":gmot_cur.get(), "MIN":x3ch1roi0min.get(), "MAX":x3ch1roi0max.get()} print str fp.write(str) fp.write('\n') time.sleep(2) LN=0 for x in range(0,pN): tar[0][1] = 1 tar[0][0] = float(angle[x]) tar[1][1] = 1 tar[1][0] = float(ivu[x]) tar[2][1] = 1 tar[2][0] = float(t2gap[x]) #if tar[0][0] is the original position, raise "in position" flag if indeadband(float(tar[0][0]),float(bmot_cur.get()),dbd)==1: tar[0][1] = 0 if indeadband(float(tar[1][0]),float(umot_cur.get()),dbd)==1: tar[1][1] = 0 if indeadband(float(tar[2][0]),float(gmot_cur.get()),dbd)==1: tar[2][1] = 0 if options.sim is False: bmot.put(tar[0][0]) umot.put(tar[1][0]) gmot.put(tar[2][0]) time.sleep(1) umot_go.put(0) else: tar[0][1]=0 tar[1][1]=0 tar[2][1]=0 while (tar[0][1] == 1) or (tar[1][1] == 1) or(tar[2][1] == 1): time.sleep(0.05) if LN > 400: umot_go.put(0) LN=0 else: LN=LN+1 if options.sim is False: time.sleep(twait) while ( options.checkbeam and (shut_open == False or beam_current == False)) or T_stop==True: print "Stopped. Waiting for scan conditions to return to normal." time.sleep(60.) signal0=float(det0.get()) signal1=float(det1.get()) signal2=float(det2.get()) signal3=float(det3.get()) x3h5capture.put(1) x3erase.put(1) x3acq.put(1) while (signal0<1e-11): time.sleep(0.02) signal0=float(det0.get()) signal1=float(det1.get()) signal2=float(det2.get()) signal3=float(det3.get()) time.sleep(options.acqt) else: while ( options.checkbeam and (shut_open == False or beam_current == False)): print "Stopped. Waiting for beam to return." time.sleep(60.) signal0=0. signal1=0. signal2=0. signal3=0. if options.sim is False: str=' B= %(B)8.4f U= %(U)8.4f G= %(G)8.3f : %(C0)10.7e %(C1)10.7e %(C2)10.7e %(C3)10.7e %(ROI)d %(T)d'%{"B":float(bmot_cur.get()), "U":float(umot_cur.get()), "G":float(gmot_cur.get()), "C0":signal0, "C1":signal1, "C2":signal2, "C3":signal3, "ROI":x3ch1roi0ct.get(),'T':time.time()} print str fp.write(str) fp.write('\n') else: str=' B= %(B)8.4f U= %(U)8.4f G= %(G)8.3f : %(C0)10.7e %(C1)10.7e %(C2)10.7e %(C3)10.7e %(ROI)d %(T)d'%{"B":tar[0][0], "U":tar[1][0], "G":tar[2][0], "C0":signal0, "C1":signal1, "C2":signal2, "C3":signal3, "ROI":x3ch1roi0ct.get(),'T':time.time()} print str fp.write(str) fp.write('\n') # display_list[count,0] = x # display_list[count,1] = signal0 # count = count+1 #return to starting positions # if options.sim is False: # bmot.put(float(angle[0])) # gmot.put(float(ivu[0])) # umot.put(float(t2gap[0])) # time.sleep(2) # xmot_stop.put(0) str='End time is '+time.asctime() print str fp.write(str) fp.write('\n') fp.close() # plt.figure() # plt.plot(display_list[:,0],display_list[:,1]) # plt.plot(display_list[:,0],display_list[:,1],'go') # plt.show() return 0
def main(argv=None): global dbd global simulate global fp #parse command line options usage = "usage: %prog [options]\nData files are written to ~<operator>/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--motname", action="store", type="string", dest="motname", help="motor to scan") parser.add_option("--detname", action="store", type="string", dest="detname", help="detector to trigger") parser.add_option("--xstart", action="store", type="float", dest="xo", help="starting X position") parser.add_option("--xnumstep", action="store", type="int", dest="Nx", help="number of steps in X") parser.add_option("--xstepsize", action="store", type="float", dest="dx", help="step size in X") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves and bursting") (options, args) = parser.parse_args() #open log file D0 = time.localtime()[0] D1 = time.localtime()[1] D2 = time.localtime()[2] D3 = time.localtime()[3] D4 = time.localtime()[4] cd = os.getcwd() fstr = '/nfs/xf05id1/data/' if sys.argv[0][0] == '.': out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(fstr + repr(D0)) except OSError: try: os.mkdir(fstr + repr(D0)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) sys.exit() try: os.chdir(fstr + repr(D0) + '/' + repr(D1)) except OSError: try: os.mkdir(fstr + repr(D0) + '/' + repr(D1)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) + '/' + repr( D1) sys.exit() try: os.chdir(fstr + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except OSError: try: os.mkdir(fstr + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) + '/' + repr( D1) + '/' + repr(D2) sys.exit() try: fp = open(out_filename, 'a') except Exception: print 'cannot open file: ' + out_filename sys.exit() os.chdir(cd) fp.write(', '.join(sys.argv)) fp.write('\n') #initialize PVs and callbacks if options.motname == None: # xmotstr='XF:03IDA-OP{Mon:1-Ax:P}' xmotstr = '' print "must provide motor pv base, e.g., 'XF:28IDA-OP:1{Slt:MB1-Ax:T}'" sys.exit() else: xmotstr = options.motname if options.detname == None: # detstr='XF:03IDA-BI{FS:1-CAM:1}' detstr = '' print "must provide detector pv base, e.g., 'XF:28IDA-BI{URL:01}'" sys.exit() else: detstr = options.detname #transmission xmot = PV(xmotstr + 'Mtr.VAL') xmot_cur = PV(xmotstr + 'Mtr.RBV') xmot_stop = PV(xmotstr + 'Mtr.STOP') det_acq = PV(detstr + 'Acquire') det_exp = PV(detstr + 'AcquireTime') det_ROI_int = PV(detstr + 'Stats1:Total_RBV') det_imode = PV(detstr + 'ImageMode') xmot_cur.get(as_string=True) xmot_cur.add_callback(cbfx) xmot_cur.run_callbacks() det_acq.info det_exp.info det_ROI_int.info print det_ROI_int.get() print "readback is " + detstr + 'Stats1:Total_RBV' print "motor PV is " + xmotstr + 'Mtr.VAL' print "trigger PV is " + detstr + 'Acquire' if det_acq.get() is not 0: det_acq.put(1) det_imode.put(0) #check command line options if options.xo == None: xo = xmot_cur.get() else: xo = options.xo if options.dx == None: dx = 0.00000001 else: dx = options.dx if options.Nx == None: Nx = 0 else: Nx = options.Nx if options.stall == None: twait = 0. else: twait = options.stall display_list = np.zeros((Nx + 1, 2)) str = 'Start time is ' + time.asctime() print str fp.write(str) fp.write('\n') if options.sim is True: str = " -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') str="Current position [mm]: %(XC)7.3f" %\ {"XC":xmot_cur.get()} print str fp.write(str) fp.write('\n') str="Starting scan at: %(XO)7.3f"%\ {"XO":xo} print str fp.write(str) fp.write('\n') time.sleep(2) #number of rows and columns completed by scan Ncol = 0 LN = 0 #scan direction for x dir = 1 #intensity ROIint = -1 count = 0 #nested loops for scanning z,x,y for x in frange(0, Nx * dx, dx): tar[0][1] = 1 tar[0][0] = x + xo #if tar[0][0] is the original position, raise "in position" flag if indeadband(float(tar[0][0]), float(xmot_cur.get()), dbd) == 1: tar[0][1] = 0 if options.sim is False: xmot.put(tar[0][0]) else: tar[0][1] = 0 while (tar[0][1] == 1): if LN > 1000: LN = 0 xmot.put(tar[0][0]) LN = LN + 1 xmot.info if xmot.severity == 2: str = "\t scan stopped at " + xmot_cur.get() print str fp.write(str) fp.write('\n') raw_input( "clear motor error and press enter (or ctrl-C to halt)" ) xmot.put(tar[0][0]) time.sleep(twait) if options.sim is False: det_acq.put(1) while det_acq.get() == 1: time.sleep(det_exp.get()) time.sleep(twait) ROIint = float(det_ROI_int.get()) else: print "bang" if options.sim is False: str = ' [%(X)04d] at (X= %(XC)8.3f ): Integrated ROI signal is %(RI)10.7e ' % { "X": Ncol, "XC": xmot_cur.get(), "RI": ROIint } print str fp.write(str) fp.write('\n') else: str = ' [%(X)04d] at (X= %(XC)8.3f )' % { "X": Ncol, "XC": tar[0][0] } print str fp.write(str) fp.write('\n') Ncol = Ncol + 1 # display_list[count,0] = x display_list[count, 0] = xmot_cur.get() display_list[count, 1] = ROIint count = count + 1 #return to starting positions if options.sim is False: xmot.put(xo) time.sleep(0.01) str = 'End time is ' + time.asctime() print str fp.write(str) fp.write('\n') fp.close() plt.figure() plt.plot(display_list[:, 0], display_list[:, 1]) plt.plot(display_list[:, 0], display_list[:, 1], 'go') plt.show() return 0
def main(argv=None): us_0_pv = PV('XF:05IDA{IM:1}Cur:I0-I') us_1_pv = PV('XF:05IDA{IM:1}Cur:I1-I') ds_0_pv = PV('XF:05IDA{IM:1}Cur:I2-I') ds_1_pv = PV('XF:05IDA{IM:1}Cur:I3-I') us_0_pv.add_callback(cbf_u0) us_0_pv.run_callbacks() us_1_pv.add_callback(cbf_u1) us_1_pv.run_callbacks() ds_0_pv.add_callback(cbf_d0) ds_0_pv.run_callbacks() ds_1_pv.add_callback(cbf_d1) ds_1_pv.run_callbacks() time.sleep(5) decu0 = 0 decd0 = 0 decu1 = 0 decd1 = 0 print " CH0\t\tCH1\t\tCH2\t\tCH3\t\tAvg\t\trun avg\t\t Rate" while True: if ppow_it[0] == 0: decu0 = 0 else: decu0 = 1 # if ((ppow[0][10]+ppow[1][10]+ppow[2][10]+ppow[3][10])/4.) > 2.: # fstr0='\033[40;91m' # elif ((ppow[0][10]+ppow[1][10]+ppow[2][10]+ppow[3][10])/4.) > 2.: # fstr0='\033[40;96m' # else: # fstr0='\033[40;94m' # fstr_term='\033[0m' fstr0 = fstr_term = '' sys.stdout.write( "%(pow1)8.6e %(pow2)8.6e %(pow3)8.6e %(pow4)8.6e %(FSS)s%(gavg)8.6e \t\t%(Tavg)8.6e%(FST)s\t%(rate)06.2f Hz\r" % { 'pow1': ppow[0][ppow_it[0] - decu0], 'pow2': ppow[1][ppow_it[1] - decu1], 'pow3': ppow[2][ppow_it[2] - decd0], 'pow4': ppow[3][ppow_it[3] - decd1], 'gavg': (ppow[0][ppow_it[0] - decu0] + ppow[1][ppow_it[1] - decu1] + ppow[2][ppow_it[2] - decd0] + ppow[3][ppow_it[3] - decd1]) / 4., 'Tavg': (ppow[0][10] + ppow[1][10] + ppow[2][10] + ppow[3][10]) / 4., 'rate': (ppow[0][11] + ppow[1][11] + ppow[2][11] + ppow[3][11]) / 4. / .6 / .6, 'FSS': fstr0, 'FST': fstr_term }) sys.stdout.flush() time.sleep(.01) return 0
def main(argv=None): global simulate global fp global shut_open global current #parse command line options usage = "usage: %prog [options]\nData files are written to /data/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--slitname", action="store", type="string", dest="motname", help="valid options: wb, pb, ssa") parser.add_option("--detname", action="store", type="string", dest="detname", help="detector PV base") parser.add_option("--xstart", action="store", type="float", dest="xo", help="starting X position") parser.add_option("--xnumstep", action="store", type="int", dest="Nx", help="number of steps in X") parser.add_option("--xstepsize", action="store", type="float", dest="dx", help="step size in X") parser.add_option("--ystart", action="store", type="float", dest="yo", help="starting Y position") parser.add_option("--ynumstep", action="store", type="int", dest="Ny", help="number of steps in Y") parser.add_option("--ystepsize", action="store", type="float", dest="dy", help="step size in Y") parser.add_option("--hsize", action="store", type="float", dest="hs", help="slit size in horizontal") parser.add_option("--vsize", action="store", type="float", dest="vs", help="slit size in vertical") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves") parser.add_option("--checkbeam", action="store_true", dest="checkbeam", default=False, help="only acquire when beam is on") (options, args) = parser.parse_args() #open log file D0 = time.localtime()[0] D1 = time.localtime()[1] D2 = time.localtime()[2] D3 = time.localtime()[3] D4 = time.localtime()[4] cd = os.getcwd() filedir = '/nfs/xf05id1/data/' if sys.argv[0][0] == '.': out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(filedir + repr(D0)) except OSError: try: os.mkdir(filedir + repr(D0)) except Exception: print 'cannot create directory: ' + '/data/' + repr(D0) sys.exit() try: os.chdir(filedir + repr(D0) + '/' + repr(D1)) except OSError: try: os.mkdir(filedir + repr(D0) + '/' + repr(D1)) except Exception: print 'cannot create directory: ' + '/data/' + repr( D0) + '/' + repr(D1) sys.exit() try: os.chdir(filedir + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except OSError: try: os.mkdir(filedir + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except Exception: print 'cannot create directory: ' + filedir + repr( D0) + '/' + repr(D1) + '/' + repr(D2) sys.exit() try: fp = open(out_filename, 'a') except Exception: print 'cannot open file: ' + out_filename sys.exit() os.chdir(cd) fp.write(', '.join(sys.argv)) fp.write('\n') #initialize PVs and callbacks if options.motname == None: # xmotstr='XF:03IDA-OP{Mon:1-Ax:P}' xmotstr = '' print "must provide slit pv base, e.g., 'XF:28IDA-OP:1{Slt:MB1-Ax:T}'" sys.exit() else: xmotstr = options.motname if options.detname == None: # detstr='XF:03IDA-BI{FS:1-CAM:1}' detstr = '' print "must provide detector pv base, e.g., 'XF:28IDA-BI{URL:01}'" sys.exit() else: detstr = options.detname if options.motname == 'wb': slit=srxslit.nsls2slit(ib='XF:05IDA-OP:1{Slt:1-Ax:I}',\ ob='XF:05IDA-OP:1{Slt:1-Ax:O}',tb='XF:05IDA-OP:1{Slt:1-Ax:T}',\ bb='XF:05IDA-OP:1{Slt:1-Ax:B}') elif options.motname == 'pb': slit = srxslit.nsls2slit(ib='XF:05IDA-OP:1{Slt:2-Ax:I}', ob='XF:05IDA-OP:1{Slt:2-Ax:O}') elif options.motname == 'ssa': # slit=srxslit.nsls2slit(ib='XF:05IDB-OP:1{Slt:SSA-Ax:T}',\ # ob='XF:05IDB-OP:1{Slt:SSA-Ax:B}',tb='XF:05IDB-OP:1{Slt:SSA-Ax:O}',\ # bb='XF:05IDB-OP:1{Slt:SSA-Ax:I}') slit=srxslit.nsls2slit(ib='XF:05IDB-OP:1{Slt:SSA-Ax:I}',\ ob='XF:05IDB-OP:1{Slt:SSA-Ax:O}',tb='XF:05IDB-OP:1{Slt:SSA-Ax:T}',\ bb='XF:05IDB-OP:1{Slt:SSA-Ax:B}') # diode=PV('XF:05IDA{IM:1}Cur:I0-I') diode = PV('XF:05IDD-BI:1{Mscp:1-Cam:1}Stats1:Total_RBV') else: print "no valid slit options found on command line" sys.exit() #transmission #check command line options if options.yo == None: print "must provide a starting point in the vertical" sys.exit() else: yo = options.yo if options.xo == None: print "must provide a starting point in the horizontal" sys.exit() else: xo = options.xo if options.dx == None: dx = 0.00000001 else: dx = options.dx if options.dy == None: dy = 0.00000001 else: dy = options.dy if options.Nx == None: Nx = 0 else: Nx = options.Nx if options.Ny == None: Ny = 0 else: Ny = options.Ny if options.stall == None: twait = 0. else: twait = options.stall if options.hs is not None: if options.sim is False: slit.hsize(options.hs) if options.vs is not None: if options.sim is False: slit.vsize(options.vs) if options.motname == 'pb' or options.motname == 'wb': diode0 = PV(detstr + ':DataRead_Ch1') diode1 = PV(detstr + ':DataRead_Ch2') diode2 = PV(detstr + ':DataRead_Ch3') diode3 = PV(detstr + ':DataRead_Ch4') else: diode0 = PV(detstr + ':Current1:MeanValue_RBV') diode1 = PV(detstr + ':Current2:MeanValue_RBV') diode2 = PV(detstr + ':Current3:MeanValue_RBV') diode3 = PV(detstr + ':Current4:MeanValue_RBV') traj_o_x = PV('SR:C31-{AI}Aie5-2:Offset-x-Cal') traj_o_y = PV('SR:C31-{AI}Aie5-2:Offset-y-Cal') traj_a_x = PV('SR:C31-{AI}Aie5-2:Angle-x-Cal') traj_a_y = PV('SR:C31-{AI}Aie5-2:Angle-y-Cal') shut_status = PV('SR:C05-EPS{PLC:1}Shutter:Sum-Sts') beam_current = PV('SR:C03-BI{DCCT:1}I:Total-I') shut_status.add_callback(cbf_shut) beam_current.add_callback(cbf_curr) shut_status.run_callbacks() beam_current.run_callbacks() str = 'Start time is ' + time.asctime() print str fp.write(str) fp.write('\n') str = '#[point #]\tX pos\tY pos\tch 1\tch 2\tch 3\tch 4\tbpm ox\tbpm oy\tbpm ax\tbpm ay\tdiff h\tdiff v\tib\tob\tbb\ttp' print str fp.write(str) fp.write('\n') str='# h size: %(hs)6.3f ; v size: %(vs)6.3f ; h center: %(hc)6.3f ; v center: %(vc)6.3f'%\ {"hs":slit.hsize(),"vs":slit.vsize(),"hc":slit.hcen(),"vc":slit.vcen()} print str fp.write(str) fp.write('\n') if options.sim is True: str = " -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') time.sleep(2) #number of rows and columns completed by scan Ncol = Nrow = 0 LN = 0 #scan direction for x dir = 1 count = 0 sigarray = list() #nested loops for scanning z,x,y for y in np.linspace(yo, yo + ((Ny) * dy), Ny + 1): sigarry = [] if Nrow % 2 == 0: xs = 0. + xo xe = ((Nx + 1) * dx) + xo - dx xi = dx else: xs = ((Nx) * dx) + xo xe = 0. + xo xi = -dx for x in np.linspace(xs, xe, Nx + 1): if options.sim is False: h = slit.hcen(x) v = slit.vcen(y) time.sleep(twait) while (options.checkbeam and (shut_open == False or beam_current == False)): print "Stopped. Waiting for scan conditions to return to normal." time.sleep(60.) sig = 0. if options.motname == 'ssa': while sig == 0.: sig = diode.get() #sigarray.append([x,sig]) signal0 = signal1 = signal2 = signal3 = 0. while signal0 == 0.: signal0 = diode0.get() while signal1 == 0.: signal1 = diode1.get() while signal2 == 0.: signal2 = diode2.get() while signal3 == 0.: signal3 = diode3.get() if options.sim is False: str = '[%(X)04d] at ( %(XC)8.3f , %(YC)8.3f ): %(d1)10.7e %(d2)10.7e %(d3)10.7e %(d4)10.7e %(ox)6.3f %(oy)6.3f %(ax)6.3f %(ay)6.3f %(in)7.4e %(out)7.4e %(down)7.4e %(IB)7.4e %(OB)7.4e %(TB)7.4e %(BB)7.4e' % { "IB": slit.ibraw(), "OB": slit.obraw(), "BB": slit.bbraw(), "TB": slit.tbraw(), "down": float(sig), "X": Ncol, "XC": float(slit.hcen()), "d1": float(signal0), "d2": float(signal1), "d3": float(signal2), "d4": float(signal3), 'YC': float(slit.vcen()), 'ox': float(traj_o_x.get()), 'oy': float(traj_o_y.get()), 'ax': float(traj_a_x.get()), 'ay': float(traj_a_y.get()), 'in': (float(signal0) - float(signal1)) / float(signal1), 'out': (float(signal2) - float(signal3)) / float(signal3) } print str fp.write(str) fp.write('\n') else: str = '[%(X)04d] at ( %(XC)8.3f , %(YC)8.3f ): %(d1)10.7e %(d2)10.7e %(d3)10.7e %(d4)10.7e %(ox)6.3f %(oy)6.3f %(ax)6.3f %(ay)6.3f %(down)7.4e' % { "down": float(sig), "X": int(Ncol), "XC": float(x), "d1": float(signal0), "d2": float(signal1), "d3": float(signal2), "d4": float(signal3), 'YC': float(y), 'ox': float(traj_o_x.get()), 'oy': float(traj_o_y.get()), 'ax': float(traj_a_x.get()), 'ay': float(traj_a_y.get()) } print str fp.write(str) fp.write('\n') Ncol = Ncol + 1 #M=0. #for m in range(0,len(sigarray)): # if sigarray[m][1]>1.8e-7: # M=M+float(sigarray[m][1]) #MX=0. #for m in range(0,len(sigarray)): # if sigarray[m][1]>1.8e-7: # MX=MX+float(sigarray[m][0])*float(sigarray[m][1]) #str="CoM detected at %6.3e"%(MX/M) #print str #fp.write(str) #fp.write('\n') Nrow = Nrow + 1 str = 'End time is ' + time.asctime() print str fp.write(str) fp.write('\n') fp.close() if options.sim is False: slit.hcen(xo) slit.vcen(yo) return 0
def main(argv=None): global simulate global fp global shut_open global current global x3h5capture global xmot_cur global ymot_cur global shut_status global beam_current #parse command line options usage = "usage: %prog [options]\nData files are written to /data/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--detname", action="store", type="string", dest="detname", help="detector PV base") parser.add_option("--xstart", action="store", type="float", dest="xo", help="starting X position") parser.add_option("--xnumstep", action="store", type="int", dest="Nx", help="number of steps in X") parser.add_option("--xstepsize", action="store", type="float", dest="dx", help="step size in X") parser.add_option("--ystart", action="store", type="float", dest="yo", help="starting Y position") parser.add_option("--ynumstep", action="store", type="int", dest="Ny", help="number of steps in Y") parser.add_option("--ystepsize", action="store", type="float", dest="dy", help="step size in Y") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves") parser.add_option("--checkbeam", action="store_true", dest="checkbeam", default=False, help="only acquire when beam is on") parser.add_option("--checkcryo", action="store_true", dest="checkcryo", default=False, help="only acquire when cryo status is ok") parser.add_option("--acqtime", action="store", type="float", dest="acqt", default=1, help="image integration time [sec]") parser.add_option("--acqnum", action="store", type="int", dest="acqn", default=1, help="frames per scan point") (options,args) = parser.parse_args() #open log file D0=time.localtime()[0] D1=time.localtime()[1] D2=time.localtime()[2] D3=time.localtime()[3] D4=time.localtime()[4] cd=os.getcwd() filedir = '/nfs/xf05id1/data/' if sys.argv[0][0]=='.': out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(filedir+repr(D0)) except OSError: try: os.mkdir(filedir+repr(D0)) except Exception: print 'cannot create directory: '+'/data/'+repr(D0) sys.exit() try: os.chdir(filedir+repr(D0)+'/'+repr(D1)) except OSError: try: os.mkdir(filedir+repr(D0)+'/'+repr(D1)) except Exception: print 'cannot create directory: '+'/data/'+repr(D0)+'/'+repr(D1) sys.exit() try: os.chdir(filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)) except OSError: try: os.mkdir(filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)) except Exception: print 'cannot create directory: '+filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2) sys.exit() try: fp=open(out_filename,'a') except Exception: print 'cannot open file: '+out_filename sys.exit() os.chdir(cd) fp.write('#'+', '.join(sys.argv)) fp.write('\n') H5path='/epics/data/2015-3/in-house' #H5path='/epics/data/2015-2/testing' #initialize PVs and callbacks if options.detname == None: detstr='' print "must provide detector pv base, e.g., 'XF:28IDA-BI{URL:01}'" sys.exit() else: detstr=options.detname ##### original script for Aerotech stages # xmotname='XF:05IDD-ES:1{Stg:Smpl1-Ax:X}' # ymotname='XF:05IDD-ES:1{Stg:Smpl1-Ax:Y}' # xmot=PV(xmotname+'Mtr.VAL') # xmot_cur=PV(xmotname+'Mtr.RBV') # ymot=PV(ymotname+'Mtr.VAL') # ymot_cur=PV(ymotname+'Mtr.RBV') ###### #####modified for nPoint Stages # xmot=PV('NPOINT:CH1:SET_POSITION.A',connection_timeout=2) # xmot_cur=PV('NPOINT:CH1:GET_POSITION',connection_timeout=2) # ymot=PV('NPOINT:CH2:SET_POSITION.A',connection_timeout=2) # ymot_cur=PV('NPOINT:CH2:GET_POSITION',connection_timeout=2) #####modified for HR coarse Stages; X=Attocube ECS505 X, Y=Attocube ECS505 Z xmot=PV('XF:05IDD-ES:1{Stg:Ecs50}:ACT0:CMD:TARGET',connection_timeout=2) xmot_cur=PV('XF:05IDD-ES:1{Stg:Ecs50}:ACT0:POSITION',connection_timeout=2) ymot=PV('XF:05IDD-ES:1{Stg:Ecs50}:ACT1:CMD:TARGET',connection_timeout=2) ymot_cur=PV('XF:05IDD-ES:1{Stg:Ecs50}:ACT1:POSITION',connection_timeout=2) ##### shut_status=PV('SR:C05-EPS{PLC:1}Shutter:Sum-Sts',connection_timeout=2) beam_current=PV('SR:C03-BI{DCCT:1}I:Total-I',connection_timeout=2) bmot_cur=PV('XF:05IDA-OP:1{Mono:HDCM-Ax:P}Mtr.RBV',connection_timeout=2) #transmission #check command line options if options.yo == None: print "must provide a starting point in the vertical" sys.exit() else: yo = options.yo if options.xo == None: print "must provide a starting point in the horizontal" sys.exit() else: xo = options.xo if options.dx == None: dx = 0.00000001 else: dx = options.dx if options.dy == None: dy = 0.00000001 else: dy = options.dy if options.Nx == None: Nx = 0 else: Nx = options.Nx if options.Ny == None: Ny = 0 else: Ny = options.Ny if options.stall == None: twait = 0. else: twait = options.stall diode0=PV(detstr+'Cur:I0-I',connection_timeout=4) diode1=PV(detstr+'Cur:I1-I',connection_timeout=4) diode2=PV(detstr+'Cur:I2-I',connection_timeout=4) diode3=PV(detstr+'Cur:I3-I',connection_timeout=4) diode0.connect() diode1.connect() diode2.connect() diode3.connect() dett=PV('XF:05IDD-ES:1{EVR:1-Out:FP3}Src:Scale-SP',connection_timeout=2) deti=PV('XF:05IDA{IM:1}Per-SP',connection_timeout=4) detinit=PV('XF:05IDA{IM:1}Cmd:Init',connection_timeout=4) wb=srxslit.nsls2slit(tb='XF:05IDA-OP:1{Slt:1-Ax:T}',bb='XF:05IDA-OP:1{Slt:1-Ax:B}',ib='XF:05IDA-OP:1{Slt:1-Ax:I}',ob='XF:05IDA-OP:1{Slt:1-Ax:O}') pb=srxslit.nsls2slit(ib='XF:05IDA-OP:1{Slt:2-Ax:I}',ob='XF:05IDA-OP:1{Slt:2-Ax:O}') ssa=srxslit.nsls2slit(tb='XF:05IDB-OP:1{Slt:SSA-Ax:T}', bb='XF:05IDB-OP:1{Slt:SSA-Ax:B}', ob='XF:05IDB-OP:1{Slt:SSA-Ax:O}',ib='XF:05IDB-OP:1{Slt:SSA-Ax:I}') x3acq=PV('XSPRESS3-EXAMPLE:Acquire',connection_timeout=2) x3erase=PV('XSPRESS3-EXAMPLE:ERASE',connection_timeout=2) x3acqtime=PV('XSPRESS3-EXAMPLE:AcquireTime',connection_timeout=2) x3acqnum=PV('XSPRESS3-EXAMPLE:NumImages',connection_timeout=2) x3tmode=PV('XSPRESS3-EXAMPLE:TriggerMode',connection_timeout=2) x3h5path=PV('XSPRESS3-EXAMPLE:HDF5:FilePath',connection_timeout=2) x3h5fname=PV('XSPRESS3-EXAMPLE:HDF5:FileName',connection_timeout=2) x3h5fnum=PV('XSPRESS3-EXAMPLE:HDF5:FileNumber',connection_timeout=2) x3h5vdim=PV('XSPRESS3-EXAMPLE:HDF5:NumExtraDims',connection_timeout=2) x3h5size=PV('XSPRESS3-EXAMPLE:HDF5:ExtraDimSizeN',connection_timeout=2) x3h5d1=PV('XSPRESS3-EXAMPLE:HDF5:ExtraDimSizeX',connection_timeout=2) x3h5d2=PV('XSPRESS3-EXAMPLE:HDF5:ExtraDimSizeY',connection_timeout=2) #report ROIs for channels and counts at each point x3ch1roi0min=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI1_LLM',connection_timeout=2) x3ch1roi0max=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI1_HLM',connection_timeout=2) x3ch1roi0ct=PV('XSPRESS3-EXAMPLE:C1_ROI1:Value_RBV',connection_timeout=2) x3ch1roi1min=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI2_LLM',connection_timeout=2) x3ch1roi1max=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI2_HLM',connection_timeout=2) x3ch1roi1ct=PV('XSPRESS3-EXAMPLE:C1_ROI2:Value_RBV',connection_timeout=2) x3ch1roi2min=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI3_LLM',connection_timeout=2) x3ch1roi2max=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI3_HLM',connection_timeout=2) x3ch1roi2ct=PV('XSPRESS3-EXAMPLE:C1_ROI3:Value_RBV',connection_timeout=2) x3ch2roi0min=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI1_LLM',connection_timeout=2) x3ch2roi0max=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI1_HLM',connection_timeout=2) x3ch2roi0ct=PV('XSPRESS3-EXAMPLE:C2_ROI1:Value_RBV',connection_timeout=2) x3ch2roi1min=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI2_LLM',connection_timeout=2) x3ch2roi1max=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI2_HLM',connection_timeout=2) x3ch2roi1ct=PV('XSPRESS3-EXAMPLE:C2_ROI2:Value_RBV',connection_timeout=2) x3ch2roi2min=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI3_LLM',connection_timeout=2) x3ch2roi2max=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI3_HLM',connection_timeout=2) x3ch2roi2ct=PV('XSPRESS3-EXAMPLE:C2_ROI3:Value_RBV',connection_timeout=2) x3ch3roi0min=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI1_LLM',connection_timeout=2) x3ch3roi0max=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI1_HLM',connection_timeout=2) x3ch3roi0ct=PV('XSPRESS3-EXAMPLE:C3_ROI1:Value_RBV',connection_timeout=2) x3ch3roi1min=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI2_LLM',connection_timeout=2) x3ch3roi1max=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI2_HLM',connection_timeout=2) x3ch3roi1ct=PV('XSPRESS3-EXAMPLE:C3_ROI2:Value_RBV',connection_timeout=2) x3ch3roi2min=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI3_LLM',connection_timeout=2) x3ch3roi2max=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI3_HLM',connection_timeout=2) x3ch3roi2ct=PV('XSPRESS3-EXAMPLE:C3_ROI3:Value_RBV',connection_timeout=2) #claim ROI 4 for our own use. we will integrate over all 4096 channels. x3ch1roi3min=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI4_LLM',connection_timeout=2) x3ch1roi3max=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI4_HLM',connection_timeout=2) x3ch1roi3ct=PV('XSPRESS3-EXAMPLE:C1_ROI4:Value_RBV',connection_timeout=2) x3ch2roi3min=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI4_LLM',connection_timeout=2) x3ch2roi3max=PV('XSPRESS3-EXAMPLE:C2_MCA_ROI4_HLM',connection_timeout=2) x3ch2roi3ct=PV('XSPRESS3-EXAMPLE:C2_ROI4:Value_RBV',connection_timeout=2) x3ch3roi3min=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI4_LLM',connection_timeout=2) x3ch3roi3max=PV('XSPRESS3-EXAMPLE:C3_MCA_ROI4_HLM',connection_timeout=2) x3ch3roi3ct=PV('XSPRESS3-EXAMPLE:C3_ROI4:Value_RBV',connection_timeout=2) # xmot_cur.get() xmot_cur.connect() # ymot_cur.get() ymot_cur.connect() norm0=PV('XF:05IDD-BI:1{BPM:01}.S20',connection_timeout=2) norm1=PV('XF:05IDD-BI:1{BPM:01}.S21',connection_timeout=2) norm2=PV('XF:05IDD-BI:1{BPM:01}.S22',connection_timeout=2) norm3=PV('XF:05IDD-BI:1{BPM:01}.S23',connection_timeout=2) xmot_cur.add_callback(cbfx) ymot_cur.add_callback(cbfy) shut_status.add_callback(cbf_shut) beam_current.add_callback(cbf_curr) xmot_cur.run_callbacks() ymot_cur.run_callbacks() shut_status.run_callbacks() beam_current.run_callbacks() x3h5path.put(H5path) x3h5fname.put(repr(D0)+'_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_') x3h5fnum.put(0) x3acqtime.put(options.acqt) x3acqnum.put(options.acqn) x3tmode.put(1) x3ch1roi3min.put(0) x3ch2roi3min.put(0) x3ch3roi3min.put(0) x3ch1roi3max.put(4096) x3ch2roi3max.put(4096) x3ch3roi3max.put(4096) #h5 set up x3h5vdim.put(2) x3h5size.put(options.acqn) x3h5d1.put(options.Nx+1) x3h5d2.put(options.Ny+1) dett.put(3) #overhead on triggering F460 deti.put(float(options.acqn)*options.acqt*1.) detinit.put(1) #ring buffer and PV for tracking ion chamber value ic_hist=collections.deque(maxlen=50) ic_hist.append(0.) v19st=PV('XF:05IDA-UT{Cryo:1-IV:19}Pos-I',connection_timeout=4) v19st.connect() str='#NSLS-II SRX'+time.asctime() fp.write(str) fp.write('\n') str='#Start time is '+time.asctime() print str fp.write(str) fp.write('\n') str='# x: %(hs)6.4f ; y: %(vs)6.4f ; ROI1 %(roi1i)d:%(roi1a)d ; ROI2 %(roi2i)d:%(roi2a)d ; ROI3 %(roi3i)d:%(roi3a)d'%\ {"hs":xmot_cur.get(),"vs":ymot_cur.get(), 'roi1i':x3ch1roi0min.get(), 'roi1a':x3ch1roi0max.get(), 'roi2i':x3ch1roi1min.get(), 'roi2a':x3ch1roi1max.get(), 'roi3i':x3ch1roi2min.get(), 'roi3a':x3ch1roi2max.get()} print str fp.write(str) fp.write('\n') roits=x3ch3roi3ct.timestamp str='# SSA HCEN: %(WBHC)f ; SSA HSIZE: %(WBHS)f ; SSA VCEN: %(WBVC)f ; SSA VSIZE: %(WBVS)f'%\ {"WBHC":ssa.hcen(), "WBHS":ssa.hsize(), "WBVC":ssa.vcen(), "WBVS":ssa.vsize()} print str fp.write(str) fp.write('\n') str='# Bragg: %(B)6.4f ; Energy: %(E)6.4f ; WB HCEN: %(WBHC)f ; WB HSIZE: %(WBHS)f ; WB VCEN: %(WBVC)f ; WB VSIZE: %(WBVS)f'%\ {"B":bmot_cur.get(), "E": 12398. / (2 * 3.12964794061 * math.sin((bmot_cur.get()+0.323341791985)/180.*3.1416)), "WBHC":wb.hcen(), "WBHS":wb.hsize(), "WBVC":wb.vcen(), "WBVS":wb.vsize()} print str fp.write(str) fp.write('\n') str="# -------------------------------------------------------------------- " print str fp.write(str) fp.write('\n') str='#[point #]\tX pos\t\tY pos\tch 1\t\tch 2\t\tch 3\t\tch 4\tdBPM1\t\tdBPM2\t\tdBPM3\t\tdBPM4\t\troi0\t\troi1\t\troi2\t\troi3\t\ttime' print str fp.write(str) fp.write('\n') if options.sim is True: str=" -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') else: x3h5capture.put(1) dett.put(4) time.sleep(2) thisisstupid=0 while x3h5capture.get() == 0: time.sleep(0.5) thisisstupid+=1 if (thisisstupid%20==0): print "waiting for xspress3" dett.put(3) ic_hist.append(diode1.get()) #number of rows and columns completed by scan Ncol=Nrow=0 LN=0 #diode readback is now limiting factor for scan speed oldsig=0. #when the cryocooler kicks in, the beam is unusable for ~3200sec # cryo=PV('XF:05IDA-OP:1{Mono:HDCM}T:LN2Out-I') # ct=cryo.get() # while( ct is None): # time.sleep(0.1) # ct=cryo.get() # print "waiting for cryocooler to respond" t0=time.time() cryocounter=0 shut_toggle=False #nested loops for scanning z,x,y for y in np.linspace(yo,yo+((Ny)*dy),Ny+1): tar[1][0]=y tar[1][1]=1 if options.sim is False: ymot.put(tar[1][0]) if indeadband(float(tar[1][0]),float(ymot_cur.get()),dbd)==1: tar[1][1] = 0 if Nrow%2==0: xs=0.+xo xe=((Nx+1)*dx)+xo-dx xi=dx else: xs=((Nx)*dx)+xo xe=0.+xo xi=-dx for x in np.linspace(xs,xe,Nx+1): tar[0][0]=x tar[0][1]=1 if indeadband(float(tar[0][0]),float(xmot_cur.get()),dbd)==1: tar[0][1]=0 if options.sim is False: xmot.put(tar[0][0]) while ((tar[0][1] == 1) or (tar[1][1] == 1)): time.sleep(0.01) signal0=signal1=signal2=signal3=0. nsig0=nsig1=nsig2=nsig3=0. sig0=sig1=sig2=sig3=0. # while ( options.checkbeam and (cryo.get() < (ct - 0.1)) ): # print "Stopped. Detected possible cryocooler activation." # time.sleep(1) # cryocounter=cryocounter+1 #if the above is true for five cycles, the cryocooler was on, wait another 10min # if ( options.checkbeam and cryocounter > 300 ): # print "Detected cryocooler activation, waiting 10min" # time.sleep(600) # cryocounter=0 #this is my averge IC current tavg=np.asarray(ic_hist).mean() #check the filling valve status and set flag high if it is open while ( options.checkcryo and (v19st.get() > 0.)): print "Stopped. Crycooler valve V19 is open." cryocounter=1 time.sleep(1) #while the ion chamber is reading less than 80% of previous history, sleep while (cryocounter==1): #trigger the 460 and store the ion chamber value dett.put(4) time.sleep(5+options.acqt) oldsig=diode1.get() dett.put(3) #if the reading is less than 80% of historical value or the valve is open, sleep #remember that the reading is negative-going if (oldsig > (-1.*0.8*tavg)) and (v19st.get > 0.): print "Beam current has not returned" time.sleep(30) else: cryocounter=0 while ( options.checkbeam and (shut_open == False or beam_current == False)): print "Stopped. Waiting for scan conditions to return to normal." if shut_open==False: shut_toggle=True time.sleep(10.) if shut_toggle==True: print "Entering optics conditioning period. Waiting 5min" time.sleep(300) shut_toggle=False if options.sim is False: x3erase.put(1) dett.put(4) while nsig0==0.: nsig0=float(norm0.get()) while nsig1==0.: nsig1=float(norm1.get()) while nsig2==0.: nsig2=float(norm2.get()) while nsig3==0.: nsig3=float(norm3.get()) sig0=0 sig1=0 sig2=0 sig3=0 for i in range(0,options.acqn): x3acq.put(1) while ( x3ch3roi3ct.get()==0.0 or x3ch3roi3ct.timestamp==roits): time.sleep(0.02) sig0=sig0+x3ch1roi0ct.get()+x3ch2roi0ct.get()+x3ch3roi0ct.get() sig1=sig1+x3ch1roi1ct.get()+x3ch2roi1ct.get()+x3ch3roi1ct.get() sig2=sig2+x3ch1roi2ct.get()+x3ch2roi2ct.get()+x3ch3roi2ct.get() sig3=sig3+x3ch1roi3ct.get()+x3ch2roi3ct.get()+x3ch3roi3ct.get() roits=x3ch3roi3ct.timestamp signal0=diode0.get() if signal0==oldsig: time.sleep(0.02) signal0=diode0.get() oldsig=signal0 signal1=diode1.get() signal2=diode2.get() signal3=diode3.get() dett.put(3) #populate a ring buffer with every 100th ion chamber reading #we will use the average of this buffer to determine recovery #from a cryocooler activation if(Nx%100 ==0): ic_hist.append(signal1) time.sleep(twait) tn=time.time()-t0 if options.sim is False: str='%(X)06d %(XC)9.4f %(YC)9.4f %(d1)10.7e %(d2)10.7e %(d3)10.7e %(d4)10.7e %(n0)10.7e %(n1)10.7e %(n2)10.7e %(n3)10.7e %(s0)10.7e %(s1)10.7e %(s2)10.7e %(s3)10.7e %(time)9.2f'%{ 'X':Ncol, 'XC':xmot_cur.get(),"YC":ymot_cur.get(), "d1":float(signal0), "d2":float(signal1), "d3":float(signal2),"d4":float(signal3), 'n0':nsig0, 'n1':nsig1, 'n2':nsig2, 'n3':nsig3, "s0":sig0,"s1":sig1,"s2":sig2,"s3":sig3, "time":tn} print str fp.write(str) fp.write('\n') else: str='%(X)06d %(XC)8.4f %(YC)8.4f %(d1)10.7e %(d2)10.7e %(d3)10.7e %(d4)10.7e'%{"X":int(Ncol),"XC":tar[0][0], "YC":tar[1][0], "d1":float(signal0), "d2":float(signal1), "d3":float(signal2),"d4":float(signal3)} print str fp.write(str) fp.write('\n') Ncol=Ncol+1 Nrow=Nrow+1 str='#End time is '+time.asctime() print str fp.write(str) fp.write('\n') fp.close() xmot_cur.clear_callbacks() ymot_cur.clear_callbacks() shut_status.clear_callbacks() beam_current.clear_callbacks() return 0
def main(argv=None): global dbd global simulate global fp #deadband in motor units dbd = .001 #parse command line options usage = "usage: %prog [options]\nData files are written to /data/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--motname", action="store", type="string", dest="motname", help="motor to scan") parser.add_option("--detname", action="store", type="string", dest="detname", help="detector to trigger") parser.add_option("--xstart", action="store", type="float", dest="xo", help="starting X position") parser.add_option("--xnumstep", action="store", type="int", dest="Nx", help="number of steps in X") parser.add_option("--xstepsize", action="store", type="float", dest="dx", help="step size in X") parser.add_option("--deadband", action="store", type="float", dest="dbd", help="software deadband for motion, default is 0.001 motor units") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves and bursting") parser.add_option("--acqtime", action="store", type="float", dest="acqt", help="SDD acquisition time at each step [seconds]") (options,args) = parser.parse_args() #open log file D0=time.localtime()[0] D1=time.localtime()[1] D2=time.localtime()[2] D3=time.localtime()[3] D4=time.localtime()[4] cd=os.getcwd() fstr='/nfs/xf05id1/data/' if sys.argv[0][0]=='.': out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(fstr+repr(D0)) except OSError: try: os.mkdir(fstr+repr(D0)) except Exception: print 'cannot create directory: '+fstr+repr(D0) sys.exit() try: os.chdir(fstr+repr(D0)+'/'+repr(D1)) except OSError: try: os.mkdir(fstr+repr(D0)+'/'+repr(D1)) except Exception: print 'cannot create directory: '+fstr+repr(D0)+'/'+repr(D1) sys.exit() try: os.chdir(fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)) except OSError: try: os.mkdir(fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)) except Exception: print 'cannot create directory: '+fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2) sys.exit() H5path='/epics/data/201507' try: fp=open(out_filename,'a') except Exception: print 'cannot open file: '+out_filename sys.exit() os.chdir(cd) fp.write(', '.join(sys.argv)) fp.write('\n') #initialize PVs and callbacks if options.motname == None: # xmotstr='XF:03IDA-OP{Mon:1-Ax:P}' xmotstr='' print "must provide motor pv base, e.g., 'XF:28IDA-OP:1{Slt:MB1-Ax:T}'" sys.exit() else: xmotstr=options.motname if options.detname == None: # detstr='XF:03IDA-BI{FS:1-CAM:1}' detstr='' print "must provide detector pv base, e.g., 'XF:28IDA-BI{URL:01}'" sys.exit() else: detstr=options.detname if xmotstr.rsplit('{')[1].rsplit('}')[0] == 'IVU21:1-Mtr:2': undpv=True else: undpv=False if options.dbd is not None: dbd=options.dbd #transmission if undpv is False: xmot = PV(xmotstr+'Mtr.VAL') xmot_cur = PV(xmotstr+'Mtr.RBV') xmot_stop = PV(xmotstr+'Mtr.STOP') else: xmot = PV(xmotstr+'Inp:Pos') xmot_cur = PV(xmotstr.rsplit('{')[0]+'{IVU21:1-LEnc}Gap') xmot_stop = PV(xmotstr+'Sw:Go') # det_acq = PV(detstr+'Cur:I0-I') if 'IM' in detstr: det0_acq=PV(detstr) det1_acq=PV(detstr.replace('I0-I','I1-I')) else: det0_acq = PV(detstr) det1_acq = None x3acq=PV('XSPRESS3-EXAMPLE:Acquire') x3erase=PV('XSPRESS3-EXAMPLE:ERASE') x3acqtime=PV('XSPRESS3-EXAMPLE:AcquireTime') x3acqnum=PV('XSPRESS3-EXAMPLE:NumImages') x3tmode=PV('XSPRESS3-EXAMPLE:TriggerMode') x3h5path=PV('XSPRESS3-EXAMPLE:HDF5:FilePath') x3h5fname=PV('XSPRESS3-EXAMPLE:HDF5:FileName') x3h5fnum=PV('XSPRESS3-EXAMPLE:HDF5:FileNumber') x3h5capture=PV('XSPRESS3-EXAMPLE:HDF5:Capture') x3ch1roi0min=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI1_LLM') x3ch1roi0max=PV('XSPRESS3-EXAMPLE:C1_MCA_ROI1_HLM') x3ch1roi0ct=PV('XSPRESS3-EXAMPLE:C1_ROI1:Value_RBV') xmot_cur.get(as_string = True) xmot_cur.add_callback(cbfx) xmot_cur.run_callbacks() det0_acq.info if det1_acq is not None: det1_acq.info #check command line options if options.xo == None: xo = xmot_cur.get() else: xo = options.xo if options.dx == None: dx = 0.00000001 else: dx = options.dx if options.Nx == None: Nx = 0 else: Nx = options.Nx if options.stall == None: twait = 0. else: twait = options.stall x3h5path.put(H5path) x3h5fname.put(repr(D3)+'_'+repr(D4)+'_') x3h5fnum.put(0) x3acqtime.put(options.acqt) x3acqnum.put(1) x3tmode.put(1) str='Start time is '+time.asctime() print str fp.write(str) fp.write('\n') if options.sim is True: str=" -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') str="Current position [mm]: %(XC)7.3f" %\ {"XC":xmot_cur.get()} print str fp.write(str) fp.write('\n') str="Starting scan at: %(XO)7.3f"%\ {"XO":xo} print str fp.write(str) fp.write('\n') time.sleep(2) #number of rows and columns completed by scan Ncol=0 LN=0 #scan direction for x dir=1 #intensity ROIint=-1 count = 0 #nested loops for scanning z,x,y for x in frange(0,Nx*dx,dx): tar[0][1] = 1 tar[0][0] = x+xo #if tar[0][0] is the original position, raise "in position" flag if indeadband(float(tar[0][0]),float(xmot_cur.get()),dbd)==1: tar[0][1] = 0 if options.sim is False: xmot.put(tar[0][0]) if undpv ==True: time.sleep(0.5) xmot_stop.put(0) else: tar[0][1]=0 while (tar[0][1] == 1): if LN>1000: LN=0 xmot.put(tar[0][0]) LN=LN+1 xmot.info if xmot.severity == 2: str="\t scan stopped at "+xmot_cur.get() print str fp.write(str) fp.write('\n') raw_input("clear motor error and press enter (or ctrl-C to halt)") xmot.put(tar[0][0]) time.sleep(twait) if options.sim is False: time.sleep(twait) x3h5capture.put(1) x3erase.put(1) x3acq.put(1) signal=[0.,0.] signal[0]=float(det0_acq.get()) while(signal[0] == 0.): time.sleep(0.01) signal[0]=float(det0_acq.get()) if det1_acq is not None: signal[1]=float(det1_acq.get()) while(signal[1] == 0.): time.sleep(0.01) signal[1]=float(det1_acq.get()) time.sleep(options.acqt) else: print "bang" signal=0. if options.sim is False: sigstr='%(one)10.7e %(two)10.7e'%{'one':signal[0],'two':signal[1]} str=' [%(X)04d] at (X= %(XC)9.4f ): signal is %(RI)s '%{"X":Ncol,"XC":xmot_cur.get(), "RI":sigstr} print str fp.write(str) fp.write('\n') else: str=' [%(X)04d] at (X= %(XC)8.3f )'%{"X":Ncol,"XC":tar[0][0]} print str fp.write(str) fp.write('\n') Ncol=Ncol+1 #return to starting positions if options.sim is False: xmot.put(xo) time.sleep(0.01) if undpv ==True: time.sleep(0.5) xmot_stop.put(0) str='End time is '+time.asctime() print str fp.write(str) fp.write('\n') fp.close() # xmot_cur.clear_callbacks() return 0
def main(argv=None): global dbd global simulate global fp #parse command line options usage = "usage: %prog [options]\nData files are written to ~<operator>/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--motname", action="store", type="string", dest="motname", help="motor to scan") parser.add_option("--detname", action="store", type="string", dest="detname", help="detector to trigger") parser.add_option("--xstart", action="store", type="float", dest="xo", help="starting X position") parser.add_option("--xnumstep", action="store", type="int", dest="Nx", help="number of steps in X") parser.add_option("--xstepsize", action="store", type="float", dest="dx", help="step size in X") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves and bursting") parser.add_option("--acqtime", action="store", type="float", dest="acqt", help="acquisition time") parser.add_option("--filename", action="store", type="str", dest="fname", help="base file name for data") (options, args) = parser.parse_args() #open log file D0 = time.localtime()[0] D1 = time.localtime()[1] D2 = time.localtime()[2] D3 = time.localtime()[3] D4 = time.localtime()[4] cd = os.getcwd() fstr = '/nfs/xf05id1/data/' if sys.argv[0][0] == '.': out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D0)+'_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D0)+'_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(fstr + repr(D0)) except OSError: try: os.mkdir(fstr + repr(D0)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) sys.exit() try: os.chdir(fstr + repr(D0) + '/' + repr(D1)) except OSError: try: os.mkdir(fstr + repr(D0) + '/' + repr(D1)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) + '/' + repr( D1) sys.exit() try: os.chdir(fstr + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except OSError: try: os.mkdir(fstr + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) + '/' + repr( D1) + '/' + repr(D2) sys.exit() try: fp = open(out_filename, 'a') except Exception: print 'cannot open file: ' + out_filename sys.exit() os.chdir(cd) fp.write('# ') fp.write(', '.join(sys.argv)) fp.write('\n') #initialize PVs and callbacks if options.motname == None: # xmotstr='XF:03IDA-OP{Mon:1-Ax:P}' xmotstr = '' print "must provide motor pv base, e.g., 'XF:28IDA-OP:1{Slt:MB1-Ax:T}'" sys.exit() else: xmotstr = options.motname if options.detname == None: # detstr='XF:03IDA-BI{FS:1-CAM:1}' detstr = '' print "must provide detector pv base, e.g., 'XF:28IDA-BI{URL:01}'" sys.exit() else: detstr = options.detname #transmission xmot = PV(xmotstr + 'Mtr.VAL') xmot_cur = PV(xmotstr + 'Mtr.RBV') xmot_stop = PV(xmotstr + 'Mtr.STOP') det_acq = PV(detstr + 'Acquire') det_exp = PV(detstr + 'AcquireTime') det_ROI1_int = PV(detstr + 'Stats1:Total_RBV') det_ROI2_int = PV(detstr + 'Stats2:Total_RBV') det_ROI3_int = PV(detstr + 'Stats3:Total_RBV') det_ROI4_int = PV(detstr + 'Stats4:Total_RBV') det_imode = PV(detstr + 'ImageMode') det_im_en = PV(detstr + 'TIFF1:EnableCallbacks') det_im_path = PV(detstr + 'TIFF1:FilePath') det_im_name = PV(detstr + 'TIFF1:FileName') det_im_num = PV(detstr + 'TIFF1:FileNumber') det_im_save = PV(detstr + 'TIFF1:WriteFile') det_im_cap = PV(detstr + 'TIFF1:Capture') xmot_cur.get(as_string=True) xmot_cur.add_callback(cbfx) xmot_cur.run_callbacks() det_acq.info det_exp.info det_ROI1_int.info print det_ROI1_int.get() print "readback is " + detstr + 'Stats1:Total_RBV' print "motor PV is " + xmotstr + 'Mtr.VAL' print "trigger PV is " + detstr + 'Acquire' det_im_en.put(1) if det_acq.get() is not 0: det_acq.put(1) if options.acqt is not None: det_exp.put(options.acqt) else: det_exp.put(0.1) det_imode.put(0) det_im_cap.put(1) if options.fname is None: det_im_name.put('energytest-2015-3') else: det_im_name.put(options.fname) #check command line options if options.xo == None: xo = xmot_cur.get() else: xo = options.xo if options.dx == None: dx = 0.00000001 else: dx = options.dx if options.Nx == None: Nx = 0 else: Nx = options.Nx if options.stall == None: twait = 0. else: twait = options.stall # display_list = np.zeros((Nx+1,2)) str = '# Start time is ' + time.asctime() print str fp.write(str) fp.write('\n') if options.sim is True: str = "# -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') str="# Current position [mm]: %(XC)7.3f" %\ {"XC":xmot_cur.get()} print str fp.write(str) fp.write('\n') str="# Starting scan at: %(XO)7.3f"%\ {"XO":xo} print str fp.write(str) fp.write('\n') time.sleep(2) str = "# #####" print str fp.write(str) fp.write('\n') str = "# point_num\tmotor_pos\tROI1_int\tROI2_int\tROI3_int\tROI4_int" print str fp.write(str) fp.write('\n') #number of rows and columns completed by scan Ncol = 0 LN = 0 #scan direction for x dir = 1 #intensity ROIint = [-1, -1, -1, -1] count = 0 #nested loops for scanning z,x,y for x in frange(0, Nx * dx, dx): tar[0][1] = 1 tar[0][0] = x + xo #if tar[0][0] is the original position, raise "in position" flag if indeadband(float(tar[0][0]), float(xmot_cur.get()), dbd) == 1: tar[0][1] = 0 if options.sim is False: xmot.put(tar[0][0]) else: tar[0][1] = 0 while (tar[0][1] == 1): time.sleep(.05) if options.sim is False: det_acq.put(1) while det_acq.get() == 1: time.sleep(det_exp.get()) time.sleep(twait) ROIint[0] = float(det_ROI1_int.get()) ROIint[1] = float(det_ROI2_int.get()) ROIint[2] = float(det_ROI3_int.get()) ROIint[3] = float(det_ROI4_int.get()) det_im_save.put(1) else: print "bang" ROIint[0] = random.randint(1000, 100000) ROIint[1] = random.randint(100, 10000) ROIint[2] = random.randint(100, 10000) ROIint[3] = random.randint(100, 10000) if options.sim is False: str=' %(X)04d %(XC)8.3f %(RI0)10.7e %(RI1)10.7e %(RI2)10.7e %(RI3)10.7e'%{"X":Ncol,"XC":xmot_cur.get(), "RI0":ROIint[0],\ "RI1":ROIint[1],"RI2":ROIint[2],"RI3":ROIint[3]} print str fp.write(str) fp.write('\n') else: str=' %(X)04d %(XC)8.3f %(RI0)10.7e %(RI1)10.7e %(RI2)10.7e %(RI3)10.7e'%{"X":Ncol,"XC":tar[0][0], "RI0":ROIint[0],\ "RI1":ROIint[1],"RI2":ROIint[2],"RI3":ROIint[3]} print str fp.write(str) fp.write('\n') Ncol = Ncol + 1 # display_list[count,0] = x # display_list[count,0] = xmot_cur.get() # display_list[count,1] = ROIint # count = count+1 #return to starting positions # if options.sim is False: # xmot.put(xo) # time.sleep(0.01) det_im_cap.put(0) det_im_save.put(0) str = '# End time is ' + time.asctime() print str fp.write(str) fp.write('\n') fp.close() return 0
def main(argv=None): global simulate global fp global shut_open global current #parse command line options usage = "usage: %prog [options]" parser = OptionParser(usage) parser.add_option("--config", action="store", type="str", dest="cfile", help="file with (x,y) pairs of points") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds] for settling") parser.add_option("--samples", action="store", type="int", dest="nsamp", help="collect this many samples at each point") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves") parser.add_option("--checkbeam", action="store_true", dest="checkbeam", default=False, help="only acquire when beam is on") (options, args) = parser.parse_args() #open log file D0 = time.localtime()[0] D1 = time.localtime()[1] D2 = time.localtime()[2] D3 = time.localtime()[3] D4 = time.localtime()[4] cd = os.getcwd() try: cfp = open(options.cfile, 'r') except Exception: print 'could not open file of coord pairs' sys.exit() fstr = '#a default string' pN = 0 x = list() y = list() while fstr.rsplit().__len__() > 0: if (fstr[0] is not '#'): pN = pN + 1 x.append(fstr.rsplit()[0]) y.append(fstr.rsplit()[1]) fstr = cfp.readline() cfp.close() filedir = '/nfs/xf05id1/data/' if sys.argv[0][0] == '.': out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(filedir + repr(D0)) except OSError: try: os.mkdir(filedir + repr(D0)) except Exception: print 'cannot create directory: ' + '/data/' + repr(D0) sys.exit() try: os.chdir(filedir + repr(D0) + '/' + repr(D1)) except OSError: try: os.mkdir(filedir + repr(D0) + '/' + repr(D1)) except Exception: print 'cannot create directory: ' + '/data/' + repr( D0) + '/' + repr(D1) sys.exit() try: os.chdir(filedir + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except OSError: try: os.mkdir(filedir + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except Exception: print 'cannot create directory: ' + filedir + repr( D0) + '/' + repr(D1) + '/' + repr(D2) sys.exit() try: fp = open(out_filename, 'a') except Exception: print 'cannot open file: ' + out_filename sys.exit() os.chdir(cd) fp.write('#' + ', '.join(sys.argv)) fp.write('\n') #initialize PVs and callbacks detstr = 'XF:05IDA{IM:1}' xmotname = 'XF:05IDD-ES:1{Stg:Smpl1-Ax:X}' ymotname = 'XF:05IDD-ES:1{Stg:Smpl1-Ax:Y}' xmot = PV(xmotname + 'Mtr.VAL') xmot_cur = PV(xmotname + 'Mtr.RBV') ymot = PV(ymotname + 'Mtr.VAL') ymot_cur = PV(ymotname + 'Mtr.RBV') shut_status = PV('SR:C05-EPS{PLC:1}Shutter:Sum-Sts') beam_current = PV('SR:C03-BI{DCCT:1}I:Total-I') #transmission #check command line options if options.stall == None: twait = 0. else: twait = options.stall diode0 = PV(detstr + 'Cur:I0-I') diode1 = PV(detstr + 'Cur:I1-I') diode2 = PV(detstr + 'Cur:I2-I') diode3 = PV(detstr + 'Cur:I3-I') xmot_cur.get() ymot_cur.get() norm0 = PV('xf05bpm03:DataRead_Ch1') norm1 = PV('xf05bpm03:DataRead_Ch2') norm2 = PV('xf05bpm03:DataRead_Ch3') norm3 = PV('xf05bpm03:DataRead_Ch4') ssa0 = PV('XF:05IDA-BI{BPM:05}AH501:Current1:MeanValue_RBV') ssa0.get() ssa1 = PV('XF:05IDA-BI{BPM:05}AH501:Current2:MeanValue_RBV') ssa1.get() ssa2 = PV('XF:05IDA-BI{BPM:05}AH501:Current3:MeanValue_RBV') ssa2.get() ssa3 = PV('XF:05IDA-BI{BPM:05}AH501:Current4:MeanValue_RBV') ssa3.get() xmot_cur.add_callback(cbfx) ymot_cur.add_callback(cbfy) shut_status.add_callback(cbf_shut) beam_current.add_callback(cbf_curr) xmot_cur.run_callbacks() ymot_cur.run_callbacks() shut_status.run_callbacks() beam_current.run_callbacks() str = '#Start time is ' + time.asctime() print str fp.write(str) fp.write('\n') str = '#[point #]\tX pos\tY pos\tch 1\tch 2\tch 3\tch 4\tBPM1\tssa0\tssa1\tssa2\tssa3\ttime\tback avg\tback std\tfluoro avg\tfluoro std' print str fp.write(str) fp.write('\n') str='# x: %(hs)6.4f ; y: %(vs)6.4f '%\ {"hs":xmot_cur.get(),"vs":ymot_cur.get()} print str fp.write(str) fp.write('\n') if options.sim is True: str = " -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') time.sleep(2) #number of rows and columns completed by scan Ncol = Nrow = 0 LN = 0 #diode readback is now limiting factor for scan speed oldsig = diode1.timestamp oldsig1 = diode0.timestamp #when the cryocooler kicks in, the beam is unusable for ~3200sec cryo = PV('XF:05IDA-OP:1{Mono:HDCM}T:LN2Out-I') ct = cryo.get() while (ct is None): time.sleep(0.05) ct = cryo.get() t0 = time.time() cryocounter = 0 shut_toggle = False fluor = np.zeros(options.nsamp) back = np.zeros(options.nsamp) #nested loops for scanning z,x,y for i in range(0, pN): tar[1][0] = float(y[i]) tar[1][1] = 1 tar[0][0] = float(x[i]) tar[0][1] = 1 if options.sim is False: ymot.put(tar[1][0]) xmot.put(tar[0][0]) if indeadband(float(tar[1][0]), float(ymot_cur.get()), dbd) == 1: tar[1][1] = 0 if indeadband(float(tar[0][0]), float(xmot_cur.get()), dbd) == 1: tar[0][1] = 0 if options.sim is False: while ((tar[0][1] == 1) or (tar[1][1] == 1)): time.sleep(0.01) signal0 = signal1 = signal2 = signal3 = 0. nsig0 = nsig1 = nsig2 = nsig3 = 0. sigssa0 = sigssa1 = sigssa2 = sigssa3 = 0. time.sleep(twait) samps = 0 while (samps < options.nsamp): while (options.checkbeam and (cryo.get() < (ct))): print "Stopped. Detected possible cryocooler activation." time.sleep(1) cryocounter = cryocounter + 1 #if the above is true for five cycles, the cryocooler was on, wait another 5min if (options.checkbeam and cryocounter > 300): print "Detected cryocooler activation, waiting 10min" time.sleep(600) cryocounter = 0 while (options.checkbeam and (shut_open == False or beam_current == False)): print "Stopped. Waiting for scan conditions to return to normal." if shut_open == False: shut_toggle = True time.sleep(10.) if shut_toggle == True: print "Entering optics conditioning period. Waiting 5min" time.sleep(300) shut_toggle = False tstart = time.time() if options.sim is False: while signal0 == 0.: signal0 = diode0.get() while (diode0.timestamp == oldsig1): time.sleep(.05) signal0 = diode0.get() back[samps] = signal0 oldsig1 = diode0.timestamp while signal1 == 0.: signal1 = diode1.get() while (diode1.timestamp == oldsig): time.sleep(.05) signal1 = diode1.get() fluor[samps] = signal1 oldsig = diode1.timestamp while signal2 == 0.: signal2 = diode2.get() while signal3 == 0.: signal3 = diode3.get() while nsig0 == 0.: nsig0 = float(norm0.get()) while nsig1 == 0.: nsig1 = float(norm1.get()) while nsig2 == 0.: nsig2 = float(norm2.get()) while nsig3 == 0.: nsig3 = float(norm3.get()) sigssa0 = ssa0.get() sigssa1 = ssa1.get() sigssa2 = ssa2.get() sigssa3 = ssa3.get() tn = time.time() - t0 if samps == options.nsamp - 1: str = '[ %(X)06d %(SAMP)05d ] at ( %(XC)9.4f , %(YC)9.4f ): %(d1)10.7e %(d2)10.7e %(d3)10.7e %(d4)10.7e %(norm)10.7e %(s0)10.7e %(s1)10.7e %(s2)10.7e %(s3)10.7e %(time)9.2f %(BA)10.7e %(BS)10.7e %(FA)10.7e %(FS)10.7e' % { 'X': i, 'XC': xmot_cur.get(), "YC": ymot_cur.get(), "d1": float(signal0), "d2": float(signal1), "d3": float(signal2), "d4": float(signal3), 'norm': nsig0 + nsig1 + nsig2 + nsig3, "s0": sigssa0, "s1": sigssa1, "s2": sigssa2, "s3": sigssa3, "time": tn, "SAMP": samps, "BA": np.average(back), "BS": np.std(back), "FA": np.average(fluor), "FS": np.std(fluor) } else: str = '[ %(X)06d %(SAMP)05d ] at ( %(XC)9.4f , %(YC)9.4f ): %(d1)10.7e %(d2)10.7e %(d3)10.7e %(d4)10.7e %(norm)10.7e %(s0)10.7e %(s1)10.7e %(s2)10.7e %(s3)10.7e %(time)9.2f' % { 'X': i, 'XC': xmot_cur.get(), "YC": ymot_cur.get(), "d1": float(signal0), "d2": float(signal1), "d3": float(signal2), "d4": float(signal3), 'norm': nsig0 + nsig1 + nsig2 + nsig3, "s0": sigssa0, "s1": sigssa1, "s2": sigssa2, "s3": sigssa3, "time": tn, "SAMP": samps } print str fp.write(str) fp.write('\n') else: str = '[ %(X)06d %(SAMP)05d ] at ( %(XC)8.4f , %(YC)8.4f ): %(d1)10.7e %(d2)10.7e %(d3)10.7e %(d4)10.7e' % { "X": int(i), "XC": tar[0][0], "YC": tar[1][0], "d1": float(signal0), "d2": float(signal1), "d3": float(signal2), "d4": float(signal3), "SAMP": samps } print str fp.write(str) fp.write('\n') samps = samps + 1 str = '#End time is ' + time.asctime() print str fp.write(str) fp.write('\n') fp.close() return 0
def main(argv=None): global dbd global simulate global fp #parse command line options usage = "usage: %prog [options]\nData files are written to /data/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--motname", action="store", type="string", dest="motname", help="motor to scan") parser.add_option("--detname", action="store", type="string", dest="detname", help="detector groups: wb, pb, bpm1, bpm2") parser.add_option("--xstart", action="store", type="float", dest="xo", help="starting X position") parser.add_option("--xnumstep", action="store", type="int", dest="Nx", help="number of steps in X") parser.add_option("--xstepsize", action="store", type="float", dest="dx", help="step size in X") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves and bursting") (options, args) = parser.parse_args() #open log file D0 = time.localtime()[0] D1 = time.localtime()[1] D2 = time.localtime()[2] D3 = time.localtime()[3] D4 = time.localtime()[4] cd = os.getcwd() filedir = '/nfs/xf05id1/data/' if sys.argv[0][0] == '.': out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=filedir+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(filedir + repr(D0)) except OSError: try: os.mkdir(filedir + repr(D0)) except Exception: print 'cannot create directory: ' + '/data/' + repr(D0) sys.exit() try: os.chdir(filedir + repr(D0) + '/' + repr(D1)) except OSError: try: os.mkdir(filedir + repr(D0) + '/' + repr(D1)) except Exception: print 'cannot create directory: ' + '/data/' + repr( D0) + '/' + repr(D1) sys.exit() try: os.chdir(filedir + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except OSError: try: os.mkdir(filedir + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except Exception: print 'cannot create directory: ' + filedir + repr( D0) + '/' + repr(D1) + '/' + repr(D2) sys.exit() try: fp = open(out_filename, 'a') except Exception: print 'cannot open file: ' + out_filename sys.exit() os.chdir(cd) fp.write(', '.join(sys.argv)) fp.write('\n') #initialize PVs and callbacks if options.motname == None: # xmotstr='XF:03IDA-OP{Mon:1-Ax:P}' xmotstr = '' print "must provide motor pv base, e.g., 'XF:28IDA-OP:1{Slt:MB1-Ax:T}'" sys.exit() else: xmotstr = options.motname if options.detname == None: # detstr='XF:03IDA-BI{FS:1-CAM:1}' detstr = '' print "must provide detector pv base, e.g., 'XF:28IDA-BI{URL:01}'" sys.exit() else: #detstr=options.detname slitoption = options.detname if slitoption == 'wb': diode1 = 'XF:05IDA-BI{BPM:01}AH501:Current1' diode2 = 'XF:05IDA-BI{BPM:01}AH501:Current2' diode3 = 'XF:05IDA-BI{BPM:01}AH501:Current3' diode4 = 'XF:05IDA-BI{BPM:01}AH501:Current4' det_acqname = 'XF:05IDA-BI:1{FS:1-Cam:1}Acquire' det_expname = 'XF:05IDA-BI:1{FS:1-Cam:1}AcquireTime' det_ROI_intname = 'XF:05IDA-BI:1{FS:1-Cam:1}Stats1:Total_RBV' det_imodename = 'XF:05IDA-BI:1{FS:1-Cam:1}ImageMode' elif slitoption == 'pb': diode1 = 'XF:05IDA-BI{BPM:02}AH501:Current1' diode2 = 'XF:05IDA-BI{BPM:02}AH501:Current2' diode3 = 'XF:05IDA-BI{BPM:02}AH501:Current3' diode4 = 'XF:05IDA-BI{BPM:02}AH501:Current4' det_acqname = 'XF:05IDA-BI:1{BPM:1-Cam:1}Acquire' det_expname = 'XF:05IDA-BI:1{BPM:1-Cam:1}AcquireTime' det_ROI_intname = 'XF:05IDA-BI:1{BPM:1-Cam:1}Stats1:Total_RBV' det_imodename = 'XF:05IDA-BI:1{BPM:1-Cam:1}ImageMode' elif slitoption == 'bpm1': diode1 = 'XF:05IDA{IM:1}Cur:I0-I' diode2 = 'XF:05IDA{IM:1}Cur:I1-I' diode3 = 'XF:05IDA{IM:1}Cur:I2-I' diode4 = 'XF:05IDA{IM:1}Cur:I3-I' elif slitoption == 'bpm2': diode0 = 'XF:05IDA{IM:1}Cur:I0-I' diode1 = 'XF:05IDA-BI{BPM:05}AH501:Current1:MeanValue_RBV' diode2 = 'XF:05IDA-BI{BPM:05}AH501:Current2:MeanValue_RBV' diode3 = 'XF:05IDA-BI{BPM:05}AH501:Current3:MeanValue_RBV' diode4 = 'XF:05IDA-BI{BPM:05}AH501:Current4:MeanValue_RBV' else: print 'specify reading slits e.g. wb' #transmission xmot = PV(xmotstr + 'Mtr.VAL') xmot_cur = PV(xmotstr + 'Mtr.RBV') xmot_stop = PV(xmotstr + 'Mtr.STOP') if slitoption == 'bpm1': diode1_pv = PV(diode1) diode2_pv = PV(diode2) diode3_pv = PV(diode3) diode4_pv = PV(diode4) elif slitoption == 'bpm2': diode0_pv = PV(diode0) diode1_pv = PV(diode1) diode2_pv = PV(diode2) diode3_pv = PV(diode3) diode4_pv = PV(diode4) else: det_acq = PV(det_acqname) det_exp = PV(det_expname) det_ROI_int = PV(det_ROI_intname) det_imode = PV(det_imodename) diode1_pv = PV(diode1 + ':MeanValue_RBV') diode2_pv = PV(diode2 + ':MeanValue_RBV') diode3_pv = PV(diode3 + ':MeanValue_RBV') diode4_pv = PV(diode4 + ':MeanValue_RBV') if det_acq.get() is not 0: det_acq.put(1) det_imode.put(0) xmot_cur.get(as_string=True) xmot_cur.add_callback(cbfx) xmot_cur.run_callbacks() #check command line options if options.xo == None: xo = xmot_cur.get() else: xo = options.xo if options.dx == None: dx = 0.00000001 else: dx = options.dx if options.Nx == None: Nx = 0 else: Nx = options.Nx if options.stall == None: twait = 0. else: twait = options.stall display_list = np.zeros((Nx + 1, 5)) str = 'Start time is ' + time.asctime() print str fp.write(str) fp.write('\n') if options.sim is True: str = " -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') str="Current position [mm]: %(XC)7.3f" %\ {"XC":xmot_cur.get()} print str fp.write(str) fp.write('\n') str="Starting scan at: %(XO)7.3f"%\ {"XO":xo} print str fp.write(str) fp.write('\n') time.sleep(2) #number of rows and columns completed by scan Ncol = 0 LN = 0 #scan direction for x dir = 1 #intensity ROIint = -1 count = 0 #nested loops for scanning z,x,y for x in frange(0, Nx * dx, dx): tar[0][1] = 1 tar[0][0] = x + xo #if tar[0][0] is the original position, raise "in position" flag if indeadband(float(tar[0][0]), float(xmot_cur.get()), dbd) == 1: tar[0][1] = 0 if options.sim is False: xmot.put(tar[0][0]) else: tar[0][1] = 0 while (tar[0][1] == 1): if LN > 1000: LN = 0 xmot.put(tar[0][0]) LN = LN + 1 xmot.info if options.sim is False: time.sleep(twait) if slitoption == 'bpm1': diode1_read = diode1_pv.get() diode2_read = diode2_pv.get() diode3_read = diode3_pv.get() diode4_read = diode4_pv.get() elif slitoption == 'bpm2': ROIint = diode1_read = diode2_read = diode3_read = diode4_read = 0. while ROIint == 0.: ROIint = diode0_pv.get() while diode1_read == 0.: diode1_read = diode1_pv.get() while diode2_read == 0.: diode2_read = diode2_pv.get() while diode3_read == 0.: diode3_read = diode3_pv.get() while diode4_read == 0.: diode4_read = diode4_pv.get() else: diode1_read = diode1_pv.get() diode2_read = diode2_pv.get() diode3_read = diode3_pv.get() diode4_read = diode4_pv.get() det_acq.put(1) while det_acq.get() == 1: time.sleep(det_exp.get()) time.sleep(twait) ROIint = float(det_ROI_int.get()) else: print "bang" if options.sim is False: str = '[%(X)04d] at (X= %(XC)8.3f ): diode1 %(d1)10.7e, diode2 %(d2)10.7e, diode3 %(d3)10.7e, diode4 %(d4)10.7e, ROI %(roi)10d' % { "X": Ncol, "XC": xmot_cur.get(), "d1": diode1_read, "d2": diode2_read, "d3": diode3_read, "d4": diode4_read, 'roi': ROIint } print str fp.write(str) fp.write('\n') else: str = ' [%(X)04d] at (X= %(XC)8.3f )' % { "X": Ncol, "XC": tar[0][0] } print str fp.write(str) fp.write('\n') Ncol = Ncol + 1 if options.sim is False: display_list[count, 0] = xmot_cur.get() display_list[count, 1] = diode1_read display_list[count, 2] = diode2_read display_list[count, 3] = diode3_read display_list[count, 4] = diode4_read else: display_list[count, 0] = tar[0][0] display_list[count, 1] = 0. display_list[count, 2] = 0. display_list[count, 3] = 0. display_list[count, 4] = 0. count = count + 1 #return to starting positions if options.sim is False: xmot.put(xo) time.sleep(0.01) str = 'End time is ' + time.asctime() print str fp.write(str) fp.write('\n') fp.close() # plt.figure() #plt.plot(display_list[:,0],display_list[:,1]) # plt.plot(display_list[:,0],display_list[:,1],color='r') # plt.plot(display_list[:,0],display_list[:,1],'go') # plt.plot(display_list[:,0],display_list[:,2],color='g') # plt.plot(display_list[:,0],display_list[:,3],color='b') # plt.plot(display_list[:,0],display_list[:,4],color='k') # plt.show() return 0
def main(argv=None): global dbd global simulate global fp global shut_open global current #deadband in motor units dbd = .001 #parse command line options usage = "usage: %prog [options]\nData files are written to /data/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--motname", action="store", type="string", dest="motname", help="motor to scan") parser.add_option("--xstart", action="store", type="float", dest="xo", help="starting X position") parser.add_option("--xnumstep", action="store", type="int", dest="Nx", help="number of steps in X") parser.add_option("--xstepsize", action="store", type="float", dest="dx", help="step size in X") parser.add_option( "--deadband", action="store", type="float", dest="dbd", help="software deadband for motion, default is 0.001 motor units") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves and bursting") parser.add_option("--checkbeam", action="store_true", dest="checkbeam", default=False, help="only acquire when beam is on") parser.add_option("--samples", action="store", type="int", dest="Nsamp", default=10, help="number of samples") parser.add_option("--raw", action="store_true", dest="rawval", default=False, help="return dimensionless values for BPM positions") (options, args) = parser.parse_args() #open log file D0 = time.localtime()[0] D1 = time.localtime()[1] D2 = time.localtime()[2] D3 = time.localtime()[3] D4 = time.localtime()[4] cd = os.getcwd() fstr = '/nfs/xf05id1/data/' if sys.argv[0][0] == '.': out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(fstr + repr(D0)) except OSError: try: os.mkdir(fstr + repr(D0)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) sys.exit() try: os.chdir(fstr + repr(D0) + '/' + repr(D1)) except OSError: try: os.mkdir(fstr + repr(D0) + '/' + repr(D1)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) + '/' + repr( D1) sys.exit() try: os.chdir(fstr + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except OSError: try: os.mkdir(fstr + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) + '/' + repr( D1) + '/' + repr(D2) sys.exit() try: fp = open(out_filename, 'a') except Exception: print 'cannot open file: ' + out_filename sys.exit() os.chdir(cd) fp.write(', '.join(sys.argv)) fp.write('\n') #initialize PVs and callbacks if options.motname == None: # xmotstr='XF:03IDA-OP{Mon:1-Ax:P}' xmotstr = '' print "must provide motor pv base, e.g., 'XF:28IDA-OP:1{Slt:MB1-Ax:T}'" sys.exit() else: xmotstr = options.motname if xmotstr.rsplit('{')[1].rsplit('}')[0] == 'IVU21:1-Mtr:2': undpv = True else: undpv = False if options.dbd is not None: dbd = options.dbd if options.Nsamp == 1: print "[WW] number of samples should be greater than one" #transmission traj_o_x = PV('SR:C31-{AI}Aie5-2:Offset-x-Cal') traj_o_y = PV('SR:C31-{AI}Aie5-2:Offset-y-Cal') traj_a_x = PV('SR:C31-{AI}Aie5-2:Angle-x-Cal') traj_a_y = PV('SR:C31-{AI}Aie5-2:Angle-y-Cal') xmot = PV(xmotstr + 'Mtr.VAL') xmot_cur = PV(xmotstr + 'Mtr.RBV') xmot_stop = PV(xmotstr + 'Mtr.STOP') shut_status = PV('SR:C05-EPS{PLC:1}Shutter:Sum-Sts') beam_current = PV('SR:C03-BI{DCCT:1}I:Total-I') xmot_cur.get(as_string=True) xmot_cur.add_callback(cbfx) xmot_cur.run_callbacks() shut_status.add_callback(cbf_shut) beam_current.add_callback(cbf_curr) shut_status.run_callbacks() beam_current.run_callbacks() bpm1 = srxbpm.nsls2bpm(bpm='bpm1') bpm2 = srxbpm.nsls2bpm(bpm='bpm2') #check command line options if options.xo == None: xo = xmot_cur.get() else: xo = options.xo if options.dx == None: dx = 0.00000001 else: dx = options.dx if options.Nx == None: Nx = 0 else: Nx = options.Nx if options.stall == None: twait = 0. else: twait = options.stall str = 'Start time is ' + time.asctime() print str fp.write(str) fp.write('\n') if options.sim is True: str = " -----simulating motor moves and bursts-----" print str fp.write(str) fp.write('\n') str="# Current position: %(XC)7.3f" %\ {"XC":xmot_cur.get()} print str fp.write(str) fp.write('\n') str="# Starting scan at: %(XO)7.3f"%\ {"XO":xo} print str fp.write(str) fp.write('\n') str = "#\t\t\t bpm1 H H-stddev bpm1 V V-stddev bpm2 H H-stddev bpm2 V V-stddev e bpm\t x off y off x angle y angle" print str fp.write(str) fp.write('\n') time.sleep(2) #number of rows and columns completed by scan Ncol = 0 LN = 0 #scan direction for x dir = 1 #intensity ROIint = -1 count = 0 #nested loops for scanning z,x,y for x in frange(0, Nx * dx, dx): tar[0][1] = 1 tar[0][0] = x + xo #if tar[0][0] is the original position, raise "in position" flag if indeadband(float(tar[0][0]), float(xmot_cur.get()), dbd) == 1: tar[0][1] = 0 if options.sim is False: xmot.put(tar[0][0]) if undpv == True: time.sleep(0.5) xmot_stop.put(0) else: tar[0][1] = 0 try: ox = traj_o_x.get() except CA.Client.Exception: ox = 12398 continue try: oy = traj_o_y.get() except CA.Client.Exception: ox = 12398 continue try: ay = traj_a_y.get() except CA.Client.Exception: ay = 12398 continue try: ax = traj_a_x.get() except CA.Client.Exception: ax = 12398 continue while (tar[0][1] == 1): time.sleep(0.05) h1_array = np.zeros(options.Nsamp) v1_array = np.zeros(options.Nsamp) h2_array = np.zeros(options.Nsamp) v2_array = np.zeros(options.Nsamp) time.sleep(twait) tmp = -12398. bpm1_dict = bpm1.P() bpm2_dict = bpm2.P() for i in range(0, options.Nsamp): #a call to srxbpm.nsls2bpm.P() typically returns within 35us while a call to *.Pavg(1) takes hundreds of ms #stuff the "instaneous" position information into an ndarray and calculate mean and stddev later while (tmp == bpm1_dict['H']): time.sleep(0.1) bpm1_dict = bpm1.P() bpm2_dict = bpm2.P() if options.rawval is True: h1_array[i] = bpm1_dict['H'] * bpm1._H_Cal v1_array[i] = bpm1_dict['V'] * bpm1._V_Cal h2_array[i] = bpm2_dict['H'] * bpm2._H_Cal v2_array[i] = bpm2_dict['V'] * bpm2._V_Cal else: h1_array[i] = bpm1_dict['H'] v1_array[i] = bpm1_dict['V'] h2_array[i] = bpm2_dict['H'] v2_array[i] = bpm2_dict['V'] tmp = bpm1_dict['H'] if options.sim is False: str = ' [%(X)04d] at (X= %(XC)9.4f ): %(H1)8.5f %(H1S)8.4e %(V1)8.5f %(V1S)8.4e %(H2)8.5f %(H2S)8.4e %(V2)8.5f %(V2S)8.4e\t\t%(OX)6.3f %(OY)6.3f %(AX)6.3f %(AY)6.3f' % { "X": Ncol, "XC": xmot_cur.get(), "OX": ox, "AX": ax, "OY": oy, "AY": ay, "H1": h1_array.mean(), "H1S": h1_array.std(), "V1": v1_array.mean(), "V1S": v1_array.std(), "H2": h2_array.mean(), "H2S": h2_array.std(), "V2": v2_array.mean(), "V2S": v2_array.std() } print str fp.write(str) fp.write('\n') else: str = ' [%(X)04d] at (X= %(XC)9.4f ): %(H1)8.5f %(H1S)8.4e %(V1)8.5f %(V1S)8.4e %(H2)8.5f %(H2S)8.4e %(V2)8.5f %(V2S)8.4e\t\t%(OX)6.3f %(OY)6.3f %(AX)6.3f %(AY)6.3f' % { "X": Ncol, "XC": tar[0][0], "OX": ox, "AX": ax, "OY": oy, "AY": ay, "H1": h1_array.mean(), "H1S": h1_array.std(), "V1": v1_array.mean(), "V1S": v1_array.std(), "H2": h2_array.mean(), "H2S": h2_array.std(), "V2": v2_array.mean(), "V2S": v2_array.std() } print str fp.write(str) fp.write('\n') Ncol = Ncol + 1 str = 'End time is ' + time.asctime() print str fp.write(str) fp.write('\n') fp.close() return 0
def main(argv=None): global dbd global simulate global fp d111 = SRXenergy.d111 dBragg = SRXenergy.dBragg #parse command line options usage = "usage: %prog [options]\nData files are written to ~<operator>/<year>/<month>/<day>/" parser = OptionParser(usage) parser.add_option("--motname", action="store", type="string", dest="motname", help="motor to scan") parser.add_option("--detname", action="store", type="string", dest="detname", help="detector to trigger") parser.add_option("--xstart", action="store", type="float", dest="xo", help="starting X position") parser.add_option("--xnumstep", action="store", type="int", dest="Nx", help="number of steps in X") parser.add_option("--xstepsize", action="store", type="float", dest="dx", help="step size in X") parser.add_option("--wait", action="store", type="float", dest="stall", help="wait at each step [seconds]") parser.add_option("--simulate", action="store_true", dest="sim", default=False, help="simulate motor moves and bursting") parser.add_option("--acqtime", action="store", type="float", dest="acqt", help="acquisition time") parser.add_option("--filename", action="store", type="str", dest="fname", help="base file name for data") (options, args) = parser.parse_args() #open log file D0 = time.localtime()[0] D1 = time.localtime()[1] D2 = time.localtime()[2] D3 = time.localtime()[3] D4 = time.localtime()[4] cd = os.getcwd() fstr = '/nfs/xf05id1/data/' if sys.argv[0][0] == '.': out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D0)+'_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[0]+'.txt' else: out_filename=fstr+repr(D0)+'/'+repr(D1)+'/'+repr(D2)+'/'+'log_'+repr(D0)+'_'+repr(D1)+'_'+repr(D2)+'_'+repr(D3)+'_'+repr(D4)+'_'+\ string.split(string.strip(sys.argv[0],'./'),'/')[5]+'.txt' try: os.chdir(fstr + repr(D0)) except OSError: try: os.mkdir(fstr + repr(D0)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) sys.exit() try: os.chdir(fstr + repr(D0) + '/' + repr(D1)) except OSError: try: os.mkdir(fstr + repr(D0) + '/' + repr(D1)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) + '/' + repr( D1) sys.exit() try: os.chdir(fstr + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except OSError: try: os.mkdir(fstr + repr(D0) + '/' + repr(D1) + '/' + repr(D2)) except Exception: print 'cannot create directory: ' + fstr + repr(D0) + '/' + repr( D1) + '/' + repr(D2) sys.exit() try: fp = open(out_filename, 'a') except Exception: print 'cannot open file: ' + out_filename sys.exit() os.chdir(cd) fp.write('# ') fp.write(', '.join(sys.argv)) fp.write('\n') #initialize PVs and callbacks if options.motname == None: # xmotstr='XF:03IDA-OP{Mon:1-Ax:P}' xmotstr = '' print "must provide motor pv base, e.g., 'XF:28IDA-OP:1{Slt:MB1-Ax:T}'" sys.exit() else: xmotstr = options.motname if options.detname == None: # detstr='XF:03IDA-BI{FS:1-CAM:1}' detstr = '' print "must provide detector pv base, e.g., 'XF:28IDA-BI{URL:01}'" sys.exit() else: detstr = options.detname #transmission xmot = PV(xmotstr + 'Mtr.VAL') xmot_cur = PV(xmotstr + 'Mtr.RBV') xmot_stop = PV(xmotstr + 'Mtr.STOP') det_acq = PV(detstr + 'Acquire') det_exp = PV(detstr + 'AcquireTime') det_ROI1_int = PV(detstr + 'Stats1:Total_RBV') det_ROI2_int = PV(detstr + 'Stats2:Total_RBV') det_ROI3_int = PV(detstr + 'Stats3:Total_RBV') det_ROI4_int = PV(detstr + 'Stats4:Total_RBV') det_imode = PV(detstr + 'ImageMode') det_im_en = PV(detstr + 'TIFF1:EnableCallbacks') det_im_path = PV(detstr + 'TIFF1:FilePath') det_im_name = PV(detstr + 'TIFF1:FileName') det_im_num = PV(detstr + 'TIFF1:FileNumber') det_im_save = PV(detstr + 'TIFF1:WriteFile') det_im_cap = PV(detstr + 'TIFF1:Capture') #ring current ring_i = PV('SR:C03-BI{DCCT:1}I:Real-I') text = '#@ '\ +'ring_i = ' + str(ring_i.get()) + '\t' \ +'\n' print text fp.write(text) #undulator real position, gap and taper u_real_ds_low = PV('SR:C5-ID:G1{IVU21:1}REAL_POSITION_DS_LOWER') u_real_ds_upp = PV('SR:C5-ID:G1{IVU21:1}REAL_POSITION_DS_UPPER') u_real_us_low = PV('SR:C5-ID:G1{IVU21:1}REAL_POSITION_US_LOWER') u_real_us_upp = PV('SR:C5-ID:G1{IVU21:1}REAL_POSITION_US_UPPER') text = '#@ '\ +'u_real_ds_low = ' + str(u_real_ds_low.get()) + '\t' \ +'u_real_ds_upp = ' + str(u_real_ds_upp.get()) + '\t' \ +'u_real_us_low = ' + str(u_real_us_low.get()) + '\t' \ +'u_real_us_upp = ' + str(u_real_us_upp.get()) + '\t' \ +'\n' print text fp.write(text) u_real_gap_avg = PV('SR:C5-ID:G1{IVU21:1}REAL_GAP_AVG') u_real_gap_ds = PV('SR:C5-ID:G1{IVU21:1}REAL_GAP_DS') u_real_gap_us = PV('SR:C5-ID:G1{IVU21:1}REAL_GAP_US') u_real_tapper = PV('SR:C5-ID:G1{IVU21:1}REAL_GAP_TAPER') text = '#@ ' \ +'u_real_gap_avg = ' + str(u_real_gap_avg.get()) + '\t' \ +'u_real_gap_ds = ' + str(u_real_gap_ds.get()) + '\t' \ +'u_real_gap_us = ' + str(u_real_gap_us.get()) + '\t' \ +'u_real_tapper = ' + str(u_real_tapper.get()) + '\t' \ +'\n' print text fp.write(text) #undulator elivation, girder u_real_elevation_us = PV('SR:C5-ID:G1{IVU21:1}REAL_ELEVATION_US') u_real_elevation_ds = PV('SR:C5-ID:G1{IVU21:1}REAL_ELEVATION_DS') u_real_elevation_avg = PV('SR:C5-ID:G1{IVU21:1}REAL_ELEVATION_AVG') text = '#@ ' \ +'u_real_elevation_us = ' + str(u_real_elevation_us.get()) + '\t' \ +'u_real_elevation_ds = ' + str(u_real_elevation_ds.get()) + '\t' \ +'u_real_elevation_avg = ' + str(u_real_elevation_avg.get()) + '\t' \ +'\n' print text fp.write(text) u_real_girder_lower_tilt = PV('SR:C5-ID:G1{IVU21:1}REAL_GIRDER_LOWER_TILT') u_real_girder_upper_tilt = PV('SR:C5-ID:G1{IVU21:1}REAL_GIRDER_UPPER_TILT') text = '#@ ' \ +'u_real_girder_lower_tilt = ' + str(u_real_girder_lower_tilt.get()) + '\t' \ +'u_real_girder_upper_tilt = ' + str(u_real_girder_upper_tilt.get()) + '\t' \ +'\n' print text fp.write(text) #undulator offset u_offset_ds_low = PV('SR:C5-ID:G1{IVU21:1}OFFSET_DS_LOWER_NEW') u_offset_ds_upp = PV('SR:C5-ID:G1{IVU21:1}OFFSET_DS_UPPER_NEW') u_offset_us_low = PV('SR:C5-ID:G1{IVU21:1}OFFSET_US_LOWER_NEW') u_offset_us_upp = PV('SR:C5-ID:G1{IVU21:1}OFFSET_US_UPPER_NEW') u_gap_for_calc = PV('SR:C5-ID:G1{IVU21:1}GAP_TO_USE_FOR_CALC:RB') text = '#@ ' \ +'u_offset_ds_low = ' + str(u_offset_ds_low.get()) + '\t' \ +'u_offset_ds_upp = ' + str(u_offset_ds_upp.get()) + '\t' \ +'u_offset_us_low = ' + str(u_offset_us_low.get()) + '\t' \ +'u_offset_us_upp = ' + str(u_offset_us_upp.get()) + '\t' \ +'u_gap_for_calc = ' + str(u_gap_for_calc.get()) + '\t' \ +'\n' print text fp.write(text) #undulator positions, gap and taper u_ds_low = PV('SR:C5-ID:G1{IVU21:1}POSITION_DS_LOWER') u_ds_upp = PV('SR:C5-ID:G1{IVU21:1}POSITION_DS_UPPER') u_us_low = PV('SR:C5-ID:G1{IVU21:1}POSITION_US_LOWER') u_us_upp = PV('SR:C5-ID:G1{IVU21:1}POSITION_US_UPPER') text = '#@ ' \ +'u_ds_low = ' + str(u_ds_low.get()) + '\t' \ +'u_ds_upp = ' + str(u_ds_upp.get()) + '\t' \ +'u_us_low = ' + str(u_us_low.get()) + '\t' \ +'u_us_upp = ' + str(u_us_upp.get()) + '\t' \ +'\n' print text fp.write(text) u_gap_avg = PV('SR:C5-ID:G1{IVU21:1}GAP_AVG') u_gap_ds = PV('SR:C5-ID:G1{IVU21:1}GAP_DS') u_gap_us = PV('SR:C5-ID:G1{IVU21:1}GAP_US') u_gap_taper = PV('SR:C5-ID:G1{IVU21:1}GAP_TAPER') text = '#@ ' \ +'u_gap_avg = ' + str(u_gap_avg.get()) + '\t' \ +'u_gap_ds = ' + str(u_gap_ds.get()) + '\t' \ +'u_gap_us = ' + str(u_gap_us.get()) + '\t' \ +'u_gap_taper = ' + str(u_gap_taper.get()) + '\t' \ +'\n' print text fp.write(text) u_girder_lower_tilt = PV('SR:C5-ID:G1{IVU21:1}GIRDER_LOWER_TILT') u_girder_upper_tile = PV('SR:C5-ID:G1{IVU21:1}GIRDER_UPPER_TILT') u_girder_tilt_error = PV('SR:C5-ID:G1{IVU21:1}GIRDER_TILT_ERROR') u_girder_tilt_limit = PV('SR:C5-ID:G1{IVU21:1}GIRDER_TILT_LIMIT') text = '#@ ' \ +'u_girder_lower_tilt = ' + str(u_girder_lower_tilt.get()) + '\t' \ +'u_girder_upper_tile = ' + str(u_girder_upper_tile.get()) + '\t' \ +'u_girder_tilt_error = ' + str(u_girder_tilt_error.get()) + '\t' \ +'u_girder_tilt_limit = ' + str(u_girder_tilt_limit.get()) + '\t' \ +'\n' print text fp.write(text) u_elev_ct_us = PV('SR:C5-ID:G1{IVU21:1-LEnc:1}Pos') u_elev_offset_us = PV('SR:C5-ID:G1{IVU21:1-LEnc:1}Offset') u_elev_ct_ds = PV('SR:C5-ID:G1{IVU21:1-LEnc:6}Pos') u_elev_offset_ds = PV('SR:C5-ID:G1{IVU21:1-LEnc:6}Offset') text = '#@ ' \ +'u_elev_ct_us = ' + str(u_elev_ct_us.get()) + '\t' \ +'u_elev_offset_us = ' + str(u_elev_offset_us.get()) + '\t' \ +'u_elev_ct_ds = ' + str(u_elev_ct_ds.get()) + '\t' \ +'u_elev_offset_ds = ' + str(u_elev_offset_ds.get()) + '\t' \ +'\n' print text fp.write(text) elevation_us = (u_elev_ct_us.get() + u_elev_offset_us.get()) / 1000000 elevation_ds = (u_elev_ct_ds.get() + u_elev_offset_ds.get()) / 1000000 elevation_avg = (elevation_us + elevation_ds) / 2 elevation_dif = elevation_us - elevation_ds text = '#@ ' \ +'elevation_us = ' + str(elevation_us) + '\t' \ +'elevation_ds = ' + str(elevation_ds) + '\t' \ +'elevation_avg = ' + str(elevation_avg) + '\t' \ +'elevation_dif = ' + str(elevation_dif) + '\t' \ +'\n' print text fp.write(text) xmot_cur.get(as_string=True) xmot_cur.add_callback(cbfx) xmot_cur.run_callbacks() det_acq.info det_exp.info det_ROI1_int.info print det_ROI1_int.get() print "readback is " + detstr + 'Stats1:Total_RBV' print "motor PV is " + xmotstr + 'Mtr.VAL' print "trigger PV is " + detstr + 'Acquire' det_im_en.put(1) if det_acq.get() is not 0: det_acq.put(1) if options.acqt is not None: det_exp.put(options.acqt) else: det_exp.put(0.1) det_imode.put(0) det_im_cap.put(1) if options.fname is None: det_im_name.put('energytest-2015-3') else: det_im_name.put(options.fname) #check command line options if options.xo == None: xo = xmot_cur.get() else: xo = options.xo if options.dx == None: dx = 0.00000001 else: dx = options.dx if options.Nx == None: Nx = 0 else: Nx = options.Nx if options.stall == None: twait = 0. else: twait = options.stall # display_list = np.zeros((Nx+1,2)) text = '# Start time is ' + time.asctime() print text fp.write(text) fp.write('\n') if options.sim is True: text = "# -----simulating motor moves and bursts-----" print text fp.write(text) fp.write('\n') text="# Current position [mm]: %(XC)7.3f" %\ {"XC":xmot_cur.get()} print text fp.write(text) fp.write('\n') text="# Starting scan at: %(XO)7.3f"%\ {"XO":xo} print text fp.write(text) fp.write('\n') time.sleep(2) text = "# #####" print text fp.write(text) fp.write('\n') text = "# point_num\tmotor_pos\tenergy\tROI1_int\tROI2_int\tROI3_int\tROI4_int" print text fp.write(text) fp.write('\n') #number of rows and columns completed by scan Ncol = 0 LN = 0 #scan direction for x dir = 1 #intensity ROIint = [-1, -1, -1, -1] count = 0 #nested loops for scanning z,x,y for x in frange(0, Nx * dx, dx): tar[0][1] = 1 tar[0][0] = x + xo #if tar[0][0] is the original position, raise "in position" flag if indeadband(float(tar[0][0]), float(xmot_cur.get()), dbd) == 1: tar[0][1] = 0 if options.sim is False: xmot.put(tar[0][0]) else: tar[0][1] = 0 while (tar[0][1] == 1): time.sleep(.05) if options.sim is False: det_acq.put(1) while det_acq.get() == 1: time.sleep(det_exp.get()) time.sleep(twait) ROIint[0] = float(det_ROI1_int.get()) ROIint[1] = float(det_ROI2_int.get()) ROIint[2] = float(det_ROI3_int.get()) ROIint[3] = float(det_ROI4_int.get()) det_im_save.put(1) else: print "bang" ROIint[0] = random.randint(1000, 100000) ROIint[1] = random.randint(100, 10000) ROIint[2] = random.randint(100, 10000) ROIint[3] = random.randint(100, 10000) if options.sim is False: text=' %(X)04d %(XC)8.3f %(E)8.3f %(RI0)10.7e %(RI1)10.7e %(RI2)10.7e %(RI3)10.7e'%{"X":Ncol,"XC":xmot_cur.get(), "RI0":ROIint[0],\ "RI1":ROIint[1],"RI2":ROIint[2],"RI3":ROIint[3], "E":12.3984/(2*d111*np.sin((xmot_cur.get()+dBragg)*np.pi/180))} print text fp.write(text) fp.write('\n') else: text=' %(X)04d %(XC)8.3f %(RI0)10.7e %(RI1)10.7e %(RI2)10.7e %(RI3)10.7e'%{"X":Ncol,"XC":tar[0][0], "RI0":ROIint[0],\ "RI1":ROIint[1],"RI2":ROIint[2],"RI3":ROIint[3]} print text fp.write(text) fp.write('\n') Ncol = Ncol + 1 # display_list[count,0] = x # display_list[count,0] = xmot_cur.get() # display_list[count,1] = ROIint # count = count+1 #return to starting positions # if options.sim is False: # xmot.put(xo) # time.sleep(0.01) det_im_cap.put(0) det_im_save.put(0) text = '# End time is ' + time.asctime() print text fp.write(text) fp.write('\n') fp.close() return 0