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
Esempio n. 3
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
Esempio n. 4
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
Esempio n. 6
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
Esempio n. 7
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
Esempio n. 9
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
Esempio n. 10
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
Esempio n. 11
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
Esempio n. 12
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
Esempio n. 13
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