def test_orbit_bump(self): v0 = ap.getOrbit() bpm = ap.getElements("BPM") hcor = ap.getElements("HCOR") hcor1 = ap.getElements("cx*") vcor = ap.getElements("VCOR") vcor1 = ap.getElements("cy*") # for e in hcor: # print e.name, e.pv(field='x') self.assertGreater(len(v0), 0) self.assertGreaterEqual(len(bpm), 180) self.assertEqual(len(hcor1), 180) self.assertGreaterEqual(len(hcor), 180) self.assertEqual(len(vcor1), 180) self.assertGreaterEqual(len(vcor), 180) # maximum deviation mx, my = max(abs(v0[:, 0])), max(abs(v0[:, 1])) ih = np.random.randint(0, len(hcor), 3) iv = np.random.randint(0, len(vcor), 4) for i in ih: hcor[i].x = hcor[i].x + np.random.rand() * 1e-6 for i in iv: vcor[i].y = vcor[i].y + np.random.rand() * 1e-6 ap.hlalib.waitStableOrbit(v0, minwait=5) v1 = ap.getOrbit() self.assertNotEqual(np.std(v1[:, 0]), np.std(v0[:, 0])) self.logger.info("resetting trims") ap.hlalib._reset_trims() time.sleep(10)
def test_orbit_bump(self): v0 = ap.getOrbit() bpm = ap.getElements('BPM') hcor = ap.getElements('HCOR') hcor1 = ap.getElements('cx*') vcor = ap.getElements('VCOR') vcor1 = ap.getElements('cy*') #for e in hcor: # print e.name, e.pv(field='x') self.assertGreater(len(v0), 0) self.assertGreaterEqual(len(bpm), 180) self.assertEqual(len(hcor1), 180) self.assertGreaterEqual(len(hcor), 180) self.assertEqual(len(vcor1), 180) self.assertGreaterEqual(len(vcor), 180) # maximum deviation mx, my = max(abs(v0[:,0])), max(abs(v0[:,1])) ih = np.random.randint(0, len(hcor), 3) iv = np.random.randint(0, len(vcor), 4) for i in ih: hcor[i].x = hcor[i].x+np.random.rand()*1e-6 for i in iv: vcor[i].y = vcor[i].y+np.random.rand()*1e-6 ap.hlalib.waitStableOrbit(v0, minwait=5) v1 = ap.getOrbit() self.assertNotEqual(np.std(v1[:,0]), np.std(v0[:,0])) self.logger.info("resetting trims") ap.hlalib._reset_trims() time.sleep(10)
def test_linearity_l2(self): bpms = self.ormdata.getBpmNames() trims = self.ormdata.getTrimNames() corrname = trims[4] corr = ap.getExactElement(corrname) x0 = corr.x obt0 = ap.getOrbit(spos=True) dxlst = np.linspace(-1e-4, 1e-4, 5) + x0 obt = [] for i,dx in enumerate(dxlst): corr.x = dx time.sleep(3) obt.append(ap.getOrbit(spos=True)) jbpm = 36 bpm = ap.getExactElement(bpms[jbpm]) mij = self.ormdata.get(bpm.name, 'x', corr.name, 'x') dxobt = [obt[i][jbpm,0] for i in range(len(dxlst))] plt.clf() plt.plot(dxlst, dxobt, 'r--o') plt.plot(dxlst, mij*dxlst + obt0[jbpm,0]) plt.savefig(figname("test_ormdata_linearity.png")) corr.x = x0 #print orm #for i,b in enumerate(orm.bpm): # print i, b[0], b[2] #orm.checkLinearity(plot=True) pass
def test_measure_orm_sub1_l2(self): #trimlst = ['ch1g6c15b', 'cl2g6c14b', 'cm1g4c26a'] trimlst = ['cl2g6c14b'] #trimx = ['CXH1G6C15B'] bpmlst = [e.name for e in ap.getElements('BPM')] trims = ap.getElements(trimlst) for t in trims: t.x = 0 t.y = 0 fname = time.strftime("orm_sub1_%Y%m%d_%H%M.hdf5") orm1 = ap.measOrbitRm(bpmlst, trimlst, fname, verbose=2) ormdat = ap.apdata.OrmData(fname) corr = trims[0] x0 = corr.x obt0 = ap.getOrbit(spos=True) dxlst = np.linspace(-1e-4, 1e-4, 5) + x0 obt = [] for i,dx in enumerate(dxlst): corr.x = dx time.sleep(3) obt.append(ap.getOrbit(spos=True)) jbpm = 36 bpm = ap.getExactElement(bpmlst[jbpm]) mij = ormdat.get(bpm.name, 'x', corr.name, 'x') dxobt = [obt[i][jbpm,0] for i in range(len(dxlst))] plt.clf() plt.plot(dxlst, dxobt, 'r--o') plt.plot(dxlst, mij*dxlst + obt0[jbpm,0]) plt.savefig(figname("test_measure_orm_sub1_linearity.png")) corr.x = x0
def test_orbit_read_l0(self): self.logger.info("reading orbit") self.assertGreater(len(ap.getElements('BPM')), 0) bpm = ap.getElements('BPM') for i,e in enumerate(bpm): self.assertGreaterEqual(abs(e.x), 0) self.assertGreaterEqual(abs(e.y), 0) v = ap.getOrbit() self.assertGreater(len(v), 0) v = ap.getOrbit('*') self.assertGreater(len(v), 0) v = ap.getOrbit('p[lhm]*') self.assertGreater(len(v), 0)
def test_orbit_read(self): self.logger.info("reading orbit") self.assertGreater(len(ap.getElements("BPM")), 0) bpm = ap.getElements("BPM") for i, e in enumerate(bpm): self.assertGreaterEqual(abs(e.x), 0) self.assertGreaterEqual(abs(e.y), 0) v = ap.getOrbit() self.assertGreater(len(v), 0) v = ap.getOrbit("*") self.assertGreater(len(v), 0) v = ap.getOrbit("p[lhm]*") self.assertGreater(len(v), 0)
def test_golden(self): f = open("golden.txt", "w") cors = ap.getElements('COR') for c in cors: c.x = 0.0 c.y = 0.0 time.sleep(2) obt0a = ap.getOrbit(spos=True) for scale in [1.0, 0.9, 0.8, 0.7, 0.6]: ap.correctOrbit(scale=scale, wait=3) time.sleep(6) obt0 = ap.getOrbit(spos=True) d0 = np.zeros((len(cors), 2), 'd') for i,c in enumerate(cors): d0[i,0] = c.x d0[i,1] = c.y c.setGolden('x', d0[i,0], unitsys=None) c.setGolden('y', d0[i,1], unitsys=None) f.write("{0} x {1}\n".format(c.name, d0[i,0])) f.write("{0} y {1}\n".format(c.name, d0[i,1])) f.close() # now reset the orbit time.sleep(5) for c in cors: c.x = 0.0 c.y = 0.0 for i,c in enumerate(cors): c.reset('x', data='golden') c.reset('y', data='golden') time.sleep(6) d1 = np.zeros((len(cors), 2), 'd') for i,c in enumerate(cors): d1[i,0] = c.x d1[i,1] = c.y obt1 = ap.getOrbit(spos=True) plt.subplot(311) plt.plot(obt0a[:,-1], obt0a[:,0], 'g-') plt.plot(obt0[:,-1], obt0[:,0], 'r-') plt.plot(obt1[:,-1], obt1[:,0], 'b--') plt.subplot(312) plt.plot(d1[:,0] - d0[:,0], 'r-') plt.plot(d1[:,1] - d0[:,1], 'b--') plt.subplot(313) plt.plot(obt0[:,-1], obt1[:,0] - obt0[:,0], 'r-x') plt.plot(obt1[:,-1], obt1[:,1] - obt0[:,1], 'b-o') plt.savefig(figname("test_golden.png"))
def _random_kick(self, n, vx = 1e-4, vy = 1e-4): v0 = ap.getOrbit() hcors = self.lat.getElementList('COR') for i in range(n): k = np.random.randint(len(hcors)) v0x, v0y = hcors[k].x, hcors[k].y self.kickers.append([hcors[k], v0x, v0y]) hcors[k].x = vx hcors[k].y = vy ap.hlalib.waitStableOrbit(v0, minwait=3)
def test_corr_orbit_l2(self): self._random_kick(3) obt = ap.getOrbit() bpm = ap.getElements('BPM')[60:101] trim = ap.getGroupMembers(['*', '[HV]COR'], op='intersection') v0 = ap.getOrbit('p*', spos=True) ap.correctOrbit(bpm, trim, repeat=5, scale=0.9) time.sleep(4) v1 = ap.getOrbit('p*', spos=True) import matplotlib.pylab as plt plt.clf() ax = plt.subplot(211) fig = plt.plot(v0[:,-1], v0[:,0], 'r-x', label='X(before)') fig = plt.plot(v1[:,-1], v1[:,0], 'g-o', label='X(after)') plt.legend() ax = plt.subplot(212) fig = plt.plot(v0[:,-1], v0[:,1], 'r-x', label='Y(before)') fig = plt.plot(v1[:,-1], v1[:,1], 'g-o', label='Y(after)') plt.legend() plt.savefig(figname("test_nsls2_orbit_correct.png"))
def measBackground(ID, output, iiter): """measure the background and return saved group name""" if not nsls2id.putBackground(ID): print "Failed at setting {0} to background mode".format(ID) return None # create background subgroup with index fid = h5py.File(output) prefix = "iter_" iterindex = max([int(g[len(prefix):]) for g in fid[ID.name].keys() if g.startswith(prefix)] + [-1]) + 1 bkgGroup = "iter_{0:04d}".format(iterindex) grp = fid[ID.name].create_group(bkgGroup) orb0 = ap.getOrbit(spos=True) grp["orbit"] = orb0 tau, I = ap.getLifetimeCurrent() grp["lifetime"] = tau grp["current"] = I grp.attrs["iter"] = iiter fid.close() return bkgGroup
def test_local_bump(self): hcor = ap.getElements('HCOR') hcor_v0 = [e.x for e in hcor] vcor = ap.getElements('VCOR') vcor_v0 = [e.y for e in vcor] bpm = ap.getElements('BPM') bpm_v0 = [[e.x, e.y] for e in bpm] bpm_v1 = [[e.x, e.y] for e in bpm] for i in range(0, len(bpm)): bpm_v1[i] = [0, 0] x1, x2 = 1e-4, 2e-4 bpm_v1[20][0] = x1 bpm_v1[21][0] = x1 bpm_v1[22][0] = x1 bpm_v1[23][0] = x2 bpm_v1[24][0] = x2 bpm_v1[25][0] = x1 bpm_v1[26][0] = x1 bpm_v1[100][1] = x2 bpm_v1[101][1] = x2 bpm_v1[102][1] = x1 bpm_v1[103][1] = x1 bpm_v1[104][1] = x2 bpm_v1[105][1] = x2 ap.setLocalBump(bpm, hcor+vcor, bpm_v1, repeat=10, verbose=3) import matplotlib.pylab as plt plt.clf() v = ap.getOrbit(spos=True) plt.plot(v[:,-1], v[:,0], '-.') plt.plot(v[:,-1], v[:,1], '--') plt.savefig(figname("test_localbump.png"))
hclist = ['cyh1g2c10a', 'cyh2g2c10a', #'cxm1g4c10a', #'cxm1g4c10b', 'cyl1g6c10b', 'cyl2g6c10b'] hcor = ap.getElements(hclist) for h in hcor: print h beta = ap.getBeta(hclist) phi = ap.getPhase(hclist) for h in hcor: h.y = 0 time.sleep(6) x0 = ap.getOrbit(spos=True) #print type(beta), type(phi), type(x) #dphi = (phi - phi[0,:])*(2*np.pi) # the plane, x or y ic = 1 theta = [5e-6, -5e-6, 0, 0] b0, b1, b2, b3 = np.sqrt(beta[:,ic]) sp30 = np.sin((phi[3,ic] - phi[0,ic])*2*np.pi) sp31 = np.sin((phi[3,ic] - phi[1,ic])*2*np.pi) sp20 = np.sin((phi[2,ic] - phi[0,ic])*2*np.pi) sp21 = np.sin((phi[2,ic] - phi[1,ic])*2*np.pi) sp32 = np.sin((phi[3,ic] - phi[2,ic])*2*np.pi) theta[2] = -(b0*theta[0]*sp30 + b1*theta[1]*sp31)/sp32/b2
import aphla as ap import numpy as np import matplotlib.pylab as plt import time print ap.__path__ ap.initNSLS2V1() bpms = ap.getElements('BPM') #trims = ap.getGroupMembers(['*', '[HV]COR'], op='intersection') trims = ap.getElements('HCOR') + ap.getElements('VCOR') print "Bpms x Trims: (%d, %d)" % (len(bpms), len(trims)) v0 = ap.getOrbit(spos=True) n1, n2 = 130, 150 ap.setLocalBump([e.name for e in bpms[n1:n2]], [e.name for e in trims], np.ones((n2 - n1, 2), 'd') * 1e-5, scale=0.7, repeat=6) #Euclidian norm: ... time.sleep(4) v1 = ap.getOrbit(spos=True) time.sleep(4) v2 = ap.getOrbit(spos=True) # plotting plt.clf() ax = plt.subplot(211) ax.annotate("H orbit before/after correction", (0.03, 0.9), xycoords='axes fraction') ax.plot(v0[:, -1], v0[:, 0], 'r-')
def saveState(idobj, output, iiter, parnames=None, background=None, extdata={}): """ parnames - list of extra fields of idobj to be saved. background - the group name for its last background. extdata - extra data dictionary. returns data group name """ t1 = datetime.now() prefix = "background" if background is None else "iter" # create background subgroup with index fid = h5py.File(output) iterindex = max([int(g[len(prefix) + 1 :]) for g in fid[idobj.name].keys() if g.startswith(prefix)] + [-1]) + 1 groupName = "{0}_{1:04d}".format(prefix, iterindex) grp = fid[idobj.name].create_group(groupName) orb0 = ap.getOrbit(spos=True) grp["orbit"] = orb0 tau, I = ap.getLifetimeCurrent() grp["lifetime"] = tau grp["current"] = I if parnames is None: parnames = ["gap", "phase", "mode"] else: parnames = ["gap", "phase", "mode"] + list(parnames) parnames = np.unique(parnames).tolist() fields = idobj.fields() for par in parnames: if par in fields: grp[par] = idobj.get(par, unitsys=None) grp[par].attrs["unitsymb"] = idobj.getUnit(par, unitsys=None) for k, v in extdata.items(): grp[k] = v grp.attrs["iter"] = iiter if background: grp.attrs["background"] = background else: # Save current ID trim setpoints elemflds = createCorrectorField(idobj) _, flds = zip(*elemflds) trim_sps = [idobj.get(ch, unitsys=None, handle="setpoint") for ch in flds] grp["trim_sp"] = trim_sps grp["trim_sp"].attrs["fields"] = flds # Save current BPM offsets try: bpm_offset_pvs = saveState.bpm_offset_pvs bpm_offset_pv_suffixes = saveState.bpm_offset_pv_suffixes bpm_offset_fields = saveState.bpm_offset_fields bpm_names = saveState.bpm_names except AttributeError: bpms = ap.getElements("p[uhlm]*") bpm_names = [b.name for b in bpms] bpm_pv_prefixes = [b.pv(field="xbba")[0].replace("BbaXOff-SP", "") for b in bpms] bpm_offset_fields = ["xbba", "ybba", "xref1", "yref1", "xref2", "yref2"] bpm_offset_pv_suffixes = [bpms[0].pv(field=f)[0].replace(bpm_pv_prefixes[0], "") for f in bpm_offset_fields] bpm_offset_pvs = [] for suf in bpm_offset_pv_suffixes: bpm_offset_pvs += [prefix + suf for prefix in bpm_pv_prefixes] saveState.bpm_offset_pvs = bpm_offset_pvs saveState.bpm_offset_pv_suffixes = bpm_offset_pv_suffixes saveState.bpm_offset_fields = bpm_offset_fields saveState.bpm_names = bpm_names bpm_offsets = ( np.array([d.real if d.ok else np.nan for d in ap.caget(bpm_offset_pvs, throw=False)]) .reshape((len(bpm_offset_pv_suffixes), -1)) .T ) grp.create_dataset("bpm_offsets", data=bpm_offsets, compression="gzip") grp["bpm_offsets"].attrs["fields"] = bpm_offset_fields grp["bpm_offsets"].attrs["pv_suffixes"] = bpm_offset_pv_suffixes grp["bpm_offsets"].attrs["bpm_names"] = bpm_names grp.attrs["state_saved"] = t1.strftime("%Y-%m-%d %H:%M:%S.%f") fid.close() return groupName
import aphla as ap import numpy as np import matplotlib.pylab as plt import time print ap.__path__ ap.initNSLS2V1() bpms = ap.getElements('BPM') #trims = ap.getGroupMembers(['*', '[HV]COR'], op='intersection') trims = ap.getElements('HCOR') + ap.getElements('VCOR') print "Bpms x Trims: (%d, %d)" % (len(bpms), len(trims) ) v0 = ap.getOrbit(spos=True) n1, n2 = 130, 150 ap.setLocalBump([e.name for e in bpms[n1:n2]], [e.name for e in trims], np.ones((n2-n1, 2), 'd')*1e-5, scale=0.7, repeat=6) #Euclidian norm: ... time.sleep(4) v1 = ap.getOrbit(spos=True) time.sleep(4) v2 = ap.getOrbit(spos=True) # plotting plt.clf() ax = plt.subplot(211) ax.annotate("H orbit before/after correction", (0.03, 0.9), xycoords='axes fraction') ax.plot(v0[:,-1], v0[:,0], 'r-') ax.plot(v1[:,-1], v1[:,0], 'g--') ax.plot(v2[n1:n2,-1], v2[n1:n2,0], 'g-o')
gamma = 3.0e3/.511 eta = alphac - 1/gamma/gamma # orbit at cell 3-6 BPMs bpmobj = ap.getElements('p*c0[3-6]*') bpmnames = [b.name for b in bpmobj] s1 = [b.sb for b in bpmobj] eta0 = ap.getDispersion(bpmnames) print "dispersion:", eta0 # f in MHz f0 = ap.getRfFrequency() f = np.linspace(f0 - 1e-5, f0 + 1e-5, 5) # avoid a bug in virtac obt0 = ap.getOrbit(bpmnames) x0, y0 = obt0[:,0], obt0[:,1] time.sleep(4) codx = np.zeros((len(f), len(bpmobj)), 'd') cody = np.zeros((len(f), len(bpmobj)), 'd') for i,f1 in enumerate(f): ap.putRfFrequency(f1) time.sleep(3) obt1 = ap.getOrbit() # repeat the put/get in case simulator did not response latest results ap.putRfFrequency(f1) time.sleep(6) obt2 = ap.getOrbit(bpmnames) print i, obt1[0,:2], obt2[0,:2]
def test_orbit_l0(self): v = ap.getOrbit()
def saveState(idobj, output, iiter, parnames=None, background=None, extdata={}): """ parnames - list of extra fields of idobj to be saved. background - the group name for its last background. extdata - extra data dictionary. returns data group name """ t1 = datetime.now() prefix = "background" if background is None else "iter" # create background subgroup with index fid = h5py.File(output, 'a') iterindex = max([int(g[len(prefix)+1:]) for g in list(fid[idobj.name]) if g.startswith(prefix)] + [-1]) + 1 groupName = "{0}_{1:04d}".format(prefix, iterindex) grp = fid[idobj.name].create_group(groupName) orb0 = ap.getOrbit(spos=True) grp["orbit"] = orb0 tau, I = ap.getLifetimeCurrent() grp["lifetime"] = tau grp["current"] = I if parnames is None: parnames = ['gap', 'phase', 'mode'] else: parnames = ['gap', 'phase', 'mode'] + list(parnames) parnames = np.unique(parnames).tolist() fields = idobj.fields() for par in parnames: if par in fields: grp[par] = idobj.get(par, unitsys=None) grp[par].attrs['unitsymb'] = idobj.getUnit(par, unitsys=None) for k,v in extdata.items(): grp[k] = v grp.attrs["iter"] = iiter if background: grp.attrs["background"] = background else: # Save current ID trim setpoints elemflds = createCorrectorField(idobj) _, flds = zip(*elemflds) trim_sps = [idobj.get(ch, unitsys=None, handle='setpoint') for ch in flds] grp['trim_sp'] = trim_sps grp['trim_sp'].attrs['fields'] = flds # Save current BPM offsets try: bpm_offset_pvs = saveState.bpm_offset_pvs bpm_offset_pv_suffixes = saveState.bpm_offset_pv_suffixes bpm_offset_fields = saveState.bpm_offset_fields bpm_names = saveState.bpm_names except AttributeError: bpms = ap.getElements('p[uhlm]*') bpm_names = [b.name for b in bpms] bpm_pv_prefixes = [b.pv(field='xbba')[0].replace('BbaXOff-SP', '') for b in bpms] bpm_offset_fields = ['xbba', 'ybba', 'xref1', 'yref1', 'xref2', 'yref2'] bpm_offset_pv_suffixes = [ bpms[0].pv(field=f)[0].replace(bpm_pv_prefixes[0], '') for f in bpm_offset_fields] bpm_offset_pvs = [] for suf in bpm_offset_pv_suffixes: bpm_offset_pvs += [prefix+suf for prefix in bpm_pv_prefixes] saveState.bpm_offset_pvs = bpm_offset_pvs saveState.bpm_offset_pv_suffixes = bpm_offset_pv_suffixes saveState.bpm_offset_fields = bpm_offset_fields saveState.bpm_names = bpm_names bpm_offsets = np.array( [d.real if d.ok else np.nan for d in ap.caget(bpm_offset_pvs, throw=False)]).reshape( (len(bpm_offset_pv_suffixes), -1)).T grp.create_dataset('bpm_offsets', data=bpm_offsets, compression='gzip') grp['bpm_offsets'].attrs['fields'] = bpm_offset_fields grp['bpm_offsets'].attrs['pv_suffixes'] = bpm_offset_pv_suffixes grp['bpm_offsets'].attrs['bpm_names'] = bpm_names grp.attrs["state_saved"] = t1.strftime("%Y-%m-%d %H:%M:%S.%f") fid.close() return groupName
def test_orbit(self): v = ap.getOrbit()
gamma = 3.0e3 / .511 eta = alphac - 1 / gamma / gamma # orbit at cell 3-6 BPMs bpmobj = ap.getElements('p*c0[3-6]*') bpmnames = [b.name for b in bpmobj] s1 = [b.sb for b in bpmobj] eta0 = ap.getDispersion(bpmnames) print "dispersion:", eta0 # f in MHz f0 = ap.getRfFrequency() f = np.linspace(f0 - 1e-5, f0 + 1e-5, 5) # avoid a bug in virtac obt0 = ap.getOrbit(bpmnames) x0, y0 = obt0[:, 0], obt0[:, 1] time.sleep(4) codx = np.zeros((len(f), len(bpmobj)), 'd') cody = np.zeros((len(f), len(bpmobj)), 'd') for i, f1 in enumerate(f): ap.putRfFrequency(f1) time.sleep(3) obt1 = ap.getOrbit() # repeat the put/get in case simulator did not response latest results ap.putRfFrequency(f1) time.sleep(6) obt2 = ap.getOrbit(bpmnames) print i, obt1[0, :2], obt2[0, :2]
#'cxm1g4c10a', #'cxm1g4c10b', 'cyl1g6c10b', 'cyl2g6c10b' ] hcor = ap.getElements(hclist) for h in hcor: print h beta = ap.getBeta(hclist) phi = ap.getPhase(hclist) for h in hcor: h.y = 0 time.sleep(6) x0 = ap.getOrbit(spos=True) #print type(beta), type(phi), type(x) #dphi = (phi - phi[0,:])*(2*np.pi) # the plane, x or y ic = 1 theta = [5e-6, -5e-6, 0, 0] b0, b1, b2, b3 = np.sqrt(beta[:, ic]) sp30 = np.sin((phi[3, ic] - phi[0, ic]) * 2 * np.pi) sp31 = np.sin((phi[3, ic] - phi[1, ic]) * 2 * np.pi) sp20 = np.sin((phi[2, ic] - phi[0, ic]) * 2 * np.pi) sp21 = np.sin((phi[2, ic] - phi[1, ic]) * 2 * np.pi) sp32 = np.sin((phi[3, ic] - phi[2, ic]) * 2 * np.pi) theta[2] = -(b0 * theta[0] * sp30 + b1 * theta[1] * sp31) / sp32 / b2