def test_trim_bpm(self): trims = [e.name for e in ap.getElements('COR')] for trim in trims: self.assertTrue(self.ormdata.hasTrim(trim)) bpmx = ap.getGroupMembers(['BPM', 'C0[2-4]'], op='intersection') self.assertEqual(len(bpmx), 18) for bpm in bpmx: self.assertTrue(self.ormdata.hasBpm(bpm.name))
def test_trim_bpm(self): self.assertTrue(ap.conf.has(self.h5filename)) ormdata = ap.OrmData(ap.conf.filename(self.h5filename)) trimx = ["fxl2g1c07a", "cxh1g6c15b"] for trim in trimx: self.assertTrue(ormdata.hasTrim(trim)) bpmx = ap.getGroupMembers(["BPM", "C0[2-4]"], op="intersection") self.assertEqual(len(bpmx), 18) for bpm in bpmx: self.assertTrue(ormdata.hasBpm(bpm.name))
def test_trim_bpm(self): self.assertTrue(ap.conf.has(self.h5filename)) ormdata = ap.OrmData(ap.conf.filename(self.h5filename)) trimx = ['fxl2g1c07a', 'cxh1g6c15b'] for trim in trimx: self.assertTrue(ormdata.hasTrim(trim)) bpmx = ap.getGroupMembers(['BPM', 'C0[2-4]'], op='intersection') self.assertEqual(len(bpmx), 18) for bpm in bpmx: self.assertTrue(ormdata.hasBpm(bpm.name))
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 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 test_meas_beta_l2(self): qs = ap.getGroupMembers(['C30', 'QUAD']) beta, k1, nu = ap.measBeta(qs, full=True) self.assertEqual(np.shape(beta), (len(qs), 3)) #self.assertEqual(np.shape(k1)[1], 3) self.assertEqual(np.shape(k1)[0], len(qs)) self.assertEqual(np.shape(nu)[0], len(qs)) self.assertEqual(np.shape(k1)[1], np.shape(nu)[1]) #self.assertEqual(np.shape(k1)[0], len(qs)) if PLOTTING: for i,q in enumerate(qs): plt.clf() plt.subplot(211) plt.plot(k1[i,:], nu[i,:,0], 'r-v') plt.subplot(212) plt.plot(k1[i,:], nu[i,:,1], 'r-v') plt.savefig(figname("meas_beta_nu_%s.png" % q.name)) plt.clf() plt.plot(beta[:,-1], beta[:,0], 'r-v') plt.plot(beta[:,-1], beta[:,1], 'b-o') plt.savefig(figname("meas_beta_beta.png"))
def measBeta(self): p = ApMdiSubPlot(live=False) p.setAttribute(Qt.WA_DeleteOnClose) curves = [p.aplot.curve1, p.aplot.addCurve(), # x and xref p.aplot.addCurve(), p.aplot.addCurve() # y and yref ] for curv in curves: curv.setStyle(Qwt.QwtPlotCurve.Lines) curves[0].setPen(QPen(Qt.red, 1.3, Qt.DashLine)) curves[0].setZ(curves[1].z() + 2) curves[1].setPen(QPen(Qt.red, 1.5)) curves[2].setPen(QPen(Qt.blue, 1.3, Qt.DashLine)) curves[2].setZ(curves[3].z() + 2) curves[2].setSymbol(Qwt.QwtSymbol(Qwt.QwtSymbol.Triangle, QBrush(Qt.blue), QPen(Qt.black, 1), QSize(8, 8))) curves[3].setPen(QPen(Qt.blue, 1.5)) #p.aplot.curve1.setStyle(Qwt.QwtPlotCurve.) #p.setWindowTitle("[%s.%s] %s %s" % (mach, lat, title, fld)) self.mdiarea.addSubWindow(p) #print "Show" p.show() #plots.append(p) qs = ap.getGroupMembers(['C20', 'QUAD']) + \ ap.getGroupMembers(['C21', 'QUAD']) xl = min([q.sb for q in qs]) xr = max([q.se for q in qs]) s, btx, bty = [], [], [] try: betaref = ap.getBeta([q.name for q in qs], spos=True) curves[1].setData(betaref[:,-1], betaref[:,0], None) curves[3].setData(betaref[:,-1], betaref[:,1], None) fullmagprof = ap.machines.getLattice().getBeamlineProfile() magprof = [v for v in fullmagprof if max(v[0]) > xl \ and min(v[0]) < xr] p.aplot.setMagnetProfile(magprof) p.wid.autoScaleXY() p.aplot.replot() for q in qs[:3]: tbeta, tk1, tnu = ap.measBeta(q, full=True) #print tk1, tnu, tbeta QApplication.processEvents() s.append(tbeta[0,-1]) btx.append(tbeta[0,0]) bty.append(tbeta[0,1]) curves[0].setData(s, btx, None) curves[2].setData(s, bty, None) p.wid.autoScaleXY() p.aplot.replot() _logger.info("beta measured for {0} " \ "(s={1}, btx={2}, bty={3})".format( q.name, s[-1], btx[-1], bty[-1])) except: _logger.error("error at measBeta") raise _logger.info("finished beta measurement.")
def _updatelocalbump(self): # print "start local bump computing for %s" % self.selecteddevice if self.selecteddevice == "NULL": self._cleanlocalbump() self.bpms = None self.cors = None self.idobj = None try: ca.caput([self.pvmapping.__srcposition__, self.pvmapping.__srcposition__ + ".DRVH"], [0.0, 0.0]) except ca.ca_nothing: print traceback.print_exc() try: ca.caput(self.pvmapping.__status__, "No device selected", datatype=DBR_CHAR_STR) except ca.ca_nothing: print "Could not set status pv." return else: try: self.idobj = ap.getElements(self.selecteddevice.lower())[0] allbpms = ap.getGroupMembers(["BPM", "UBPM"], op="union") leftbpms = [b for b in allbpms if b.se < self.idobj.sb] rightbpms = [b for b in allbpms if b.sb > self.idobj.se] bpms = leftbpms[-self.bpmcounts / 2:] + rightbpms[:self.bpmcounts / 2] #bpms = ap.getNeighbors(self.selecteddevice.lower(), "BPM", self.bpmcounts / 2) cors = ap.getNeighbors(self.selecteddevice.lower(), "COR", self.corscount / 2) try: #assert len(bpms) == self.bpmcounts + 1 assert len(bpms) == self.bpmcounts assert len(cors) == self.corscount + 1 except AssertionError: print "wrong devices" return orbx = [] orby = [] bpm_s = [] # delete the element in the middle, which is the insertion device itself #bpms.pop(self.bpmcounts / 2) self.bpms = bpms[:] for bpm in self.bpms: bpm_s.append(bpm.se) orbx.append(bpm.x) orby.append(bpm.y) hcor = [] vcor = [] cor_s = [] # delete the element in the middle, which is the insertion device itself cors.pop(self.corscount / 2) self.cors = cors[:] for cor in self.cors: hcor.append(cor.get("x", unitsys=None, handle="setpoint")) vcor.append(cor.get("y", unitsys=None, handle="setpoint")) cor_s.append(cor.se) ca.caput([self.pvmapping.__srcposition__, self.pvmapping.__srcposition__+".DRVH", self.pvmapping.__idposinfo__, self.pvmapping.__bpmposition__, self.pvmapping.__bpmorbitx__, self.pvmapping.__bpmorbity__, self.pvmapping.__correctorposition__, self.pvmapping.__hcorrectorcurrent__, self.pvmapping.__vcorrectorcurrent__], [(self.idobj.se - self.idobj.sb)/2.0, (self.idobj.se - self.idobj.sb), [self.idobj.sb, (self.idobj.sb+self.idobj.se)/2.0, self.idobj.se], bpm_s, orbx, orby, cor_s, hcor, vcor]) # Stop previous existing thread. if self.continuelocalbumporbitthread: self.continuelocalbumporbitthread = False if self.localbumporbitthread is not None: self.localbumporbitthread.Wait() self.continuelocalbumporbitthread = True self.localbumporbitthread = cothread.Spawn(self._monitororbit) except AttributeError: print traceback.format_exc() print "AttributeError" return except TypeError: print traceback.format_exc() print "Get a type error in monitor device selection"
def measBeta(self): p = ApMdiSubPlot(live=False) p.setAttribute(Qt.WA_DeleteOnClose) curves = [ p.aplot.curve1, p.aplot.addCurve(), # x and xref p.aplot.addCurve(), p.aplot.addCurve() # y and yref ] for curv in curves: curv.setStyle(Qwt.QwtPlotCurve.Lines) curves[0].setPen(QPen(Qt.red, 1.3, Qt.DashLine)) curves[0].setZ(curves[1].z() + 2) curves[1].setPen(QPen(Qt.red, 1.5)) curves[2].setPen(QPen(Qt.blue, 1.3, Qt.DashLine)) curves[2].setZ(curves[3].z() + 2) curves[2].setSymbol( Qwt.QwtSymbol(Qwt.QwtSymbol.Triangle, QBrush(Qt.blue), QPen(Qt.black, 1), QSize(8, 8))) curves[3].setPen(QPen(Qt.blue, 1.5)) #p.aplot.curve1.setStyle(Qwt.QwtPlotCurve.) #p.setWindowTitle("[%s.%s] %s %s" % (mach, lat, title, fld)) self.mdiarea.addSubWindow(p) #print "Show" p.show() #plots.append(p) qs = ap.getGroupMembers(['C20', 'QUAD']) + \ ap.getGroupMembers(['C21', 'QUAD']) xl = min([q.sb for q in qs]) xr = max([q.se for q in qs]) s, btx, bty = [], [], [] try: betaref = ap.getBeta([q.name for q in qs], spos=True) curves[1].setData(betaref[:, -1], betaref[:, 0], None) curves[3].setData(betaref[:, -1], betaref[:, 1], None) fullmagprof = ap.machines.getLattice().getBeamlineProfile() magprof = [v for v in fullmagprof if max(v[0]) > xl \ and min(v[0]) < xr] p.aplot.setMagnetProfile(magprof) p.wid.autoScaleXY() p.aplot.replot() for q in qs[:3]: tbeta, tk1, tnu = ap.measBeta(q, full=True) #print tk1, tnu, tbeta QApplication.processEvents() s.append(tbeta[0, -1]) btx.append(tbeta[0, 0]) bty.append(tbeta[0, 1]) curves[0].setData(s, btx, None) curves[2].setData(s, bty, None) p.wid.autoScaleXY() p.aplot.replot() _logger.info("beta measured for {0} " \ "(s={1}, btx={2}, bty={3})".format( q.name, s[-1], btx[-1], bty[-1])) except: _logger.error("error at measBeta") raise _logger.info("finished beta measurement.")