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
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
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])
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)
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)
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)
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
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)
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)