Ejemplo n.º 1
0
def putParSoftCheck(ID, parList, timeout=30, online=False):
    '''
    Put (write) a set of parameters (list) on an ID while this function
    checks whether the target state is reached or not through readbacks
    for given tolerances.

    ID: aphla ID instance

    parList: 2d parameter list in the format of [name, value, tolerance]
    [['gap',15,1e-4],['phase',12,1e-4]]

    timeout: Maximum time the motor control should wait for each "put"
    in the unit of seconds.

    return: True if success, otherwise throws an exception.
    '''

    if not online:
        return True  # TODO: To be reomved once we are allowed to move ID motors

    for par in parList:
        t0 = datetime.now()
        converged = False

        try:
            ID.put(par[0], par[1], unitsys=None)  # raw unit
        except:
            print 'Failed to set the setpoint for {0} to {1}'.format(
                par[0], par[1])
            raise

        # TODO: remove hardcoding
        ap.caput("SR:C28-ID:G1{DW100:2}ManG:Go_.PROC", 1, wait=False)

        while not converged:
            p0 = ID.get(par[0], unitsys=None)
            if abs(p0 - par[1]) <= par[
                    2]:  # TODO: readback & setpoint unit may be different! Check it!
                # print "Agree: ", p0, par[1], "eps=", par[2]
                converged = True
                break
            t1 = datetime.now()
            if (t1 - t0).total_seconds() > timeout:
                break
            time.sleep(0.5)
        if not converged:
            raise RuntimeError(
                "timeout at setting {0}={1} (epsilon={2})".format(
                    par[0], par[1], par[2]))

    return True
Ejemplo n.º 2
0
def putParSoftCheck(ID, parList, timeout=30, online=False):
    """
    Put (write) a set of parameters (list) on an ID while this function
    checks whether the target state is reached or not through readbacks
    for given tolerances.

    ID: aphla ID instance

    parList: 2d parameter list in the format of [name, value, tolerance]
    [['gap',15,1e-4],['phase',12,1e-4]]

    timeout: Maximum time the motor control should wait for each "put"
    in the unit of seconds.

    return: True if success, otherwise throws an exception.
    """

    if not online:
        return True  # TODO: To be reomved once we are allowed to move ID motors

    for par in parList:
        t0 = datetime.now()
        converged = False

        try:
            ID.put(par[0], par[1], unitsys=None)  # raw unit
        except:
            print "Failed to set the setpoint for {0} to {1}".format(par[0], par[1])
            raise

        # TODO: remove hardcoding
        ap.caput("SR:C28-ID:G1{DW100:2}ManG:Go_.PROC", 1, wait=False)

        while not converged:
            p0 = ID.get(par[0], unitsys=None)
            if abs(p0 - par[1]) <= par[2]:  # TODO: readback & setpoint unit may be different! Check it!
                # print "Agree: ", p0, par[1], "eps=", par[2]
                converged = True
                break
            t1 = datetime.now()
            if (t1 - t0).total_seconds() > timeout:
                break
            time.sleep(0.5)
        if not converged:
            raise RuntimeError("timeout at setting {0}={1} (epsilon={2})".format(par[0], par[1], par[2]))

    return True
Ejemplo n.º 3
0
def switchFeedback(fftable = "off"):
    """
    switchFeedback("on") or "off"
    """
    if fftable not in ["on", "off"]:
        raise RuntimeError("invalid feed forward table state: ('on'|'off')")

    for dw in ap.getGroupMembers(["DW",], op="union"):
        if "gap" not in dw.fields():
            print "WARNING: no 'gap' field in {0}".format(dw.name)
            continue
        pv = dw.pv(field="gap", handle="setpoint")[0]
        m = re.match(r"([^\{\}]+)\{(.+)\}", pv)
        if not m:
            print "WARNING: inconsistent naming '{0}'".format(pv)
        pvffwd = "{0}{{{1}}}MPS:Lookup_.INPA".format(m.group(1), m.group(2))
        pvffwd_pref = "{0}{{{1}-Mtr:Gap}}.RBV ".format(m.group(1), m.group(2))

        pvffwd_val = {"on": pvffwd_pref + "CP NM",
                      "off": pvffwd_pref + "NPP N"}
        print "set {0}='{1}'".format(pvffwd, pvffwd_val[fftable])
        ap.caput(pvffwd, pvffwd_val[fftable])
Ejemplo n.º 4
0
def run_single_bumps(pvmaps):
    for pvm in pvmaps:
        if ap.caget(pvm["cmd"]) == 0: continue
        ap.caput(pvm["cmddone"], 0)
        ename = pvm["idname"]
        if not ename: continue
        if ap.caget(pvm["op"]) == 0: continue
        xc, xangle = ap.caget([pvm["offset"], pvm["angle"]])
        plane = pvm["XY"].lower()
        print ename, xc, xangle, plane
        norm0, norm1, norm2, corvals = ap.setIdBump(
            ename, xc, xangle, plane=plane, check=False, ncor=6, dImax=0.5)
        print "Norm:", norm0, norm1, norm2
        print corvals
        ap.caput(pvm["cmddone"], 1)
        ap.caput(pvm["cmd"], 0)
        cothread.Yield(0.1)
Ejemplo n.º 5
0
def run_single_bumps(pvmaps):
    for pvm in pvmaps:
        if ap.caget(pvm["cmd"]) == 0: continue
        ap.caput(pvm["cmddone"], 0)
        ename = pvm["idname"]
        if not ename: continue
        if ap.caget(pvm["op"]) == 0: continue
        xc, xangle = ap.caget([pvm["offset"], pvm["angle"]])
        plane = pvm["XY"].lower()
        print ename, xc, xangle, plane
        dImax = ap.caget("SR:APHLA:SOFB{BUMP:ALL}Single-dImax-I")
        norm0, norm1, norm2, corvals = ap.setIdBump(
            ename, xc, xangle, plane=plane, check=False, ncor=4, dImax=dImax,
            bbpms=[pvm["bpm1"], pvm["bpm2"]])
        #norm0, norm1, norm2, corvals = ap.setIdBump(
        #    ename, xc, xangle, plane=plane, check=False, ncor=6, dImax=0.5)
        print "Norm:", norm0, norm1, norm2
        print corvals
        ap.caput(pvm["cmddone"], 1)
        ap.caput(pvm["cmd"], 0)
        cothread.Yield(0.1)
Ejemplo n.º 6
0
def switchFeedback(ID, fftable = "off"):
    """
    switchFeedback("on") or "off"
    """
    if fftable not in ["on", "off"]:
        raise RuntimeError("invalid feed forward table state: ('on'|'off')")
    # 0 - manual, 1 - auto
    val = 0 if fftable == "off" else 1

    if ID.name == "epu49g1c23u":
        for i in range(6):
            ap.caput("SR:C23-ID:G1A{EPU:1-FF:%d}Ena-Sel" % i, val)
    if ID.name == "epu49g1c23d":
        for i in range(6):
            ap.caput("SR:C23-ID:G1A{EPU:2-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "dw100g1c28u":
        for i in range(6):
            ap.caput("SR:C28-ID:G1{DW100:1-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "dw100g1c28d":
        for i in range(6):
            ap.caput("SR:C28-ID:G1{DW100:2-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "ivu20g1c03c":
        for i in range(6):
            ap.caput("SR:C3-ID:G1{IVU20:1-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "ivu21g1c05d":
        for i in range(6):
            ap.caput("SR:C5-ID:G1{IVU21:1-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "ivu22g1c10c":
        for i in range(4):
            ap.caput("SR:C10-ID:G1{IVU22:1-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "ivu20g1c11c":
        for i in range(6):
            ap.caput("SR:C11-ID:G1{IVU20:1-FF:%d}Ena-Sel" % i, val)
Ejemplo n.º 7
0
            print bpm.name, mac["HV"], pvdict["hv1"], bpm.pv(field="xref1")[0]
        pvmaps.append(pvdict)

    #for b in ap.getElements("UBPM"):
    #    print b.name, b.pv(field="x")
    print "Start checking IDLocalBump command ..."
    while True:
        run_single_bumps(pvmaps)
        if ap.caget(_pvcmd) == 0:
            time.sleep(1)
            continue
        #obt = ap.getOrbit(spos=True)
        #print "BPMS:", len(ap.getElements("BPM")),
        #print np.average(obt[:,0]), np.std(obt[:,0])
        for pvm in pvmaps:
            ap.caput(pvm["cmddone"], 0)
        for pvm in pvmaps:
            ename = pvm["idname"]
            if not ename: continue
            if ap.caget(pvm["op"]) == 0: continue
            xc, xangle = ap.caget([pvm["offset"], pvm["angle"]])
            plane = pvm["XY"].lower()
            print ename, xc, xangle, plane
            dImax = ap.caget("SR:APHLA:SOFB{BUMP:ALL}dImax-I")
            norm0, norm1, norm2, corvals = ap.setIdBump(
                ename, xc, xangle, plane=plane, check=False, ncor=6, dImax=dImax,
                bbpms=[pvm["bpm1"], pvm["bpm2"]])
            #norm0, norm1, norm2, corvals = ap.setIdBump(
            #    ename, xc, xangle, plane=plane, check=False, ncor=6, dImax=0.5)
            print "Norm:", norm0, norm1, norm2
            print corvals
Ejemplo n.º 8
0
def switchFeedback(ID, fftable="off"):
    """
    switchFeedback("on") or "off"
    """
    if fftable not in ["on", "off"]:
        raise RuntimeError("invalid feed forward table state: ('on'|'off')")
    # 0 - manual, 1 - auto
    val = 0 if fftable == "off" else 1

    if ID.name == "epu49g1c23u":
        for i in range(6):
            ap.caput("SR:C23-ID:G1A{EPU:1-FF:%d}Ena-Sel" % i, val)
    if ID.name == "epu49g1c23d":
        for i in range(6):
            ap.caput("SR:C23-ID:G1A{EPU:2-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "dw100g1c28u":
        for i in range(6):
            ap.caput("SR:C28-ID:G1{DW100:1-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "dw100g1c28d":
        for i in range(6):
            ap.caput("SR:C28-ID:G1{DW100:2-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "ivu20g1c03c":
        for i in range(6):
            ap.caput("SR:C3-ID:G1{IVU20:1-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "ivu21g1c05d":
        for i in range(6):
            ap.caput("SR:C5-ID:G1{IVU21:1-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "ivu22g1c10c":
        for i in range(4):
            ap.caput("SR:C10-ID:G1{IVU22:1-FF:%d}Ena-Sel" % i, val)
    elif ID.name == "ivu20g1c11c":
        for i in range(6):
            ap.caput("SR:C11-ID:G1{IVU20:1-FF:%d}Ena-Sel" % i, val)
Ejemplo n.º 9
0
            print bpm.name, mac["HV"], pvdict["hv1"], bpm.pv(field="xref1")[0]
        pvmaps.append(pvdict)

    #for b in ap.getElements("UBPM"):
    #    print b.name, b.pv(field="x")
    print "Start checking IDLocalBump command ..."
    while True:
        run_single_bumps(pvmaps)
        if ap.caget(_pvcmd) == 0:
            time.sleep(1)
            continue
        #obt = ap.getOrbit(spos=True)
        #print "BPMS:", len(ap.getElements("BPM")),
        #print np.average(obt[:,0]), np.std(obt[:,0])
        for pvm in pvmaps:
            ap.caput(pvm["cmddone"], 0)
        for pvm in pvmaps:
            ename = pvm["idname"]
            if not ename: continue
            if ap.caget(pvm["op"]) == 0: continue
            xc, xangle = ap.caget([pvm["offset"], pvm["angle"]])
            plane = pvm["XY"].lower()
            print ename, xc, xangle, plane
            norm0, norm1, norm2, corvals = ap.setIdBump(
                ename, xc, xangle, plane=plane, check=False, ncor=6, dImax=0.5)
            print "Norm:", norm0, norm1, norm2
            print corvals
            ap.caput(pvm["cmddone"], 1)
            cothread.Yield(0.1)
        time.sleep(1)
        ap.caput(_pvcmd, 0)