def align(self, **kwargs): """align""" # [12:43 PM] (sandbox/venv) $ caget "SR:C30-MG:G02A{Quad:H1}Fld-SP" # SR:C30-MG:G02A{Quad:H1}Fld-SP -0.633004 # <lyyang@svd>-{/home/lyyang/devel/nsls2-hla # [12:45 PM] (sandbox/venv) $ caget "SR:C30-MG:G02A{HCor:H2}Fld-SP" # SR:C30-MG:G02A{HCor:H2}Fld-SP 0 from cothread.catools import caget, caput #print __file__, "BBA align", caget('V:2-SR:C30-BI:G2{PH1:11}SA:X') self._measure(**kwargs) self._analyze() if not self.cor_fitted: _logger.warn("no cor fitted. abort.") return # # change cor if kwargs.get("noset", False): self._c.put(self._cf, self.cor_fitted, unitsys=None) waitRamping(self._c, wait = self.wait) self.bpm_fitted = self._b.get(self._bf, unitsys = None) # use new values ? or the original one self._c.put(self._cf, self._vc0, unitsys=None) waitRamping(self._c, wait = self.wait)
def _measure(self, **kwargs): """ - if dkick is set, kick will be renewed. - if dqk1 is set, qk1 will be renewed. - Ieps, compare readback and setpoint """ #print __file__, "measuring bba" verbose = kwargs.get('verbose', 0) sample = kwargs.get('sample', 1) # record the initial values self._vb0 = self._b.get(self._bf, unitsys=None) self._vq0 = self._q.get(self._qf, handle="setpoint", unitsys=None) self._vc0 = self._c.get(self._cf, handle="setpoint", unitsys=None) if verbose > 0: print "getting q={0} c={1}".format(self._vq0, self._vc0) # ignore kick list if dkick is provided. self.cor_kick = [self._vc0 + dk for dk in self.cor_dkicks] if not self.cor_kick: _logger.warn("no cor setpoints specified") return if verbose > 0: print "cor setpoints: {0}".format(self.cor_kick) obt00 = self._get_orbit() #print "obtshape:", np.shape(obt00) self.orbit = np.zeros((len(obt00), 1+2*len(self.cor_kick)), 'd') # one more for original orbit ## ## initial orbit-quad for i,dqk in enumerate([0.0, self.quad_dkick]): # change quad self._q.put(self._qf, self._vq0 + dqk, unitsys=None) time.sleep(self.wait) #self._q.put(self._qf, self._vq0 + dqk, unitsys=None) waitRamping(self._q, wait = self.wait) _logger.info("{0} Quad sp= {1} rb= {2}".format(i, self._q.get(self._qf, handle="setpoint", unitsys=None), self._q.get(self._qf, unitsys=None))) if verbose > 0: print "setting {0}.{1} to {2} (delta={3})".format( self._q.name, self._qf, self._vq0 + dqk, self.quad_dkick) for j,dck in enumerate(self.cor_kick): self._c.put(self._cf, dck, unitsys=None) time.sleep(self.wait) #self._c.put(self._cf, dck, unitsys=None) waitRamping(self._c, wait = self.wait) time.sleep(0.5) c1sp = self._c.get(self._cf, handle="setpoint", unitsys=None) c1rb = self._c.get(self._cf, unitsys=None) _logger.info("{0}.{1} sp= {2} rb= {3}".format(i, j, c1sp, c1rb)) if verbose > 0: print "setting {0}.{1} to {2} (rb= {3})".format( self._c.name, self._cf, dck, c1rb) tobt = np.zeros(len(obt00), 'd') for jj in range(sample): tobt[:] = tobt[:] + self._get_orbit() k = i * len(self.cor_kick) + j self.orbit[:,k] = tobt/sample #print np.min(tobt/sample), np.max(tobt/sample) self.bpm_cob.append(self._b.get(self._bf, unitsys=None)) # reset qk if verbose > 0: print "reset quad and trim to %f %f" % (self._vq0, self._vc0) #caput(self.quad_pvsp, qk0) #caput(self.trim_pvsp, xp0) self._q.put(self._qf, self._vq0, unitsys=None) self._c.put(self._cf, self._vc0, unitsys=None) waitRamping([self._c, self._q], wait = self.wait) _logger.info("restoring {0} Quad sp= {1} rb= {2}".format( self._q.name, self._q.get(self._qf, handle="setpoint", unitsys=None), self._q.get(self._qf, unitsys=None))) _logger.info("restoring {0} Cor sp= {1} rb= {2}".format( self._c.name, self._c.get(self._cf, handle="setpoint", unitsys=None), self._c.get(self._cf, unitsys=None))) self.orbit[:,-1] = self._get_orbit() self.bpm_cob.append(self._b.get(self._bf, unitsys=None)) _logger.info("measurement done: " \ "q={0}, dq={1}, b={2}, c={3}, dc={4}".format( self._q.name, self.quad_dkick, self._b.name, self._c.name, self.cor_dkicks))