Exemplo n.º 1
0
def _meas4CorBump(cors, bpmins, bpmouts, bpmdx, **kwargs):
    """
    superposition of two 3Cor bumps
    
    cors - list of correctors (4)
    bpmins - BPMs inside the bump
    bpmouts - 
    bpmdx - desired change of orbit for bpmins

    dA1 - change of one cor for ORM fitting, default 0.2
    dA2 - change of one cor for ORM fitting, default 0.2

    """
    dA1 = kwargs.pop("dA1", 0.2)
    dA2 = kwargs.pop("dA2", 0.2)
    plane = kwargs.get("plane", 'x')

    # two bpms
    if len(bpmins) != 2 or len(cors) != 4:
        raise RuntimeError("wrong number of bpms/cors, {0}/{1}".format(
            len(bpmins), len(cors)))

    xv0 = fget(bpmins, plane, unitsys=None, sample=5)
    cv0 = fget(cors, plane, unitsys=None, handle="setpoint")

    m = np.zeros((2, 2), 'd')
    dxout1, dxin1, dcls1 = set3CorBump(cors[:3], dA1, bpmins, bpmouts,
                                       **kwargs)
    fput([(cors[i], plane, cv0[i]) for i in range(len(cors))], unitsys=None)
    time.sleep(0.5)
    xv1 = fget(bpmins, plane, unitsys=None, sample=5)
    cv1 = fget(cors, plane, unitsys=None, handle="setpoint")

    dxout2, dxin2, dcls2 = set3CorBump(cors[1:], dA2, bpmins, bpmouts,
                                       **kwargs)
    fput([(cors[i], plane, cv0[i]) for i in range(len(cors))], unitsys=None)
    time.sleep(0.5)
    xv2 = fget(bpmins, plane, unitsys=None, sample=5)
    cv2 = fget(cors, plane, unitsys=None, handle="setpoint")

    m[:, 0] = dxin1 / dA1
    m[:, 1] = dxin2 / dA2

    mdet = np.linalg.det(m)
    if mdet == 0.0:
        raise RuntimeError("singular config of ({0},{1}) vs ({2},{3})".format(
            bpmins[0].name, bpmins[1].name, cors[0].name, cors[1].name))
    dc1 = (m[1, 1] * bpmdx[0] - m[0, 1] * bpmdx[1]) / mdet
    dc2 = (-m[1, 0] * bpmdx[0] + m[0, 0] * bpmdx[1]) / mdet
    dcs = np.zeros(4, 'd')
    for i in range(3):
        dcs[i] = dcs[i] + dcls1[i] / dA1 * dc1
        dcs[i + 1] = dcs[i + 1] + dcls2[i] / dA2 * dc2
    return dcs
Exemplo n.º 2
0
    def measure(self, respfields, kfield, **kwargs):
        """
        Measure the RM by change one kicker.

        :param respfields: response fields, a list

        """
        verbose = kwargs.get('verbose', 0)
        dklst = kwargs.get('dklst', None)

        kx0 = self.kicker.get(kfield, unitsys=self.unit) # get EPICS value
        wait = (self.minwait, self.stepwait, 0)
        if verbose:
            print("kicker: '%s.%s'= %e" % (self.kicker.name, kfield, kx0) )

        points = self.points
        if dklst is not None:
            points = len(dklst)
            print(("Using external dklst:", dklst))
        else:
            dklst = np.linspace(-self.maxdk, self.maxdk, points)

        # bpm read out
        ret = np.zeros((points+2, len(self.resplst)*len(respfields)), 'd')
        # initial bpm data
        v0, h = eget(self.resplst, respfields, unitsys=self.unit, header=True)
        #print "v=", v0
        #print "fields=", respfields, h
        ret[0,:] = np.ravel(v0)
        self.header = np.reshape(np.ravel(h), (-1, 2))

        kstrength = np.ones(points+2, 'd') * kx0
        kstrength[1:-1] = [dklst[i] + kx0 for i in range(points)]
        print(("Kicker sp:", kstrength))
        for i,kx in enumerate(kstrength[1:]):
            v0 = np.ravel(eget(self.resplst, respfields, unitsys=self.unit))
            #self.kicker.put(kfield, kx, unitsys=self.unit)
            #st = waitChanged(self.resplst, respfields, v0,
            #                 wait=wait, diffstd=self.bpmdiffstd)
            fput([(self.kicker, kfield, kx),],
                 unitsys=self.unit, wait_readback = True)
            v1 = np.ravel(eget(self.resplst, respfields, unitsys=self.unit))
            ret[i+1,:] = v1[:]

            if verbose:
                print("kx= % .2e  resp= [% .4e, % .4e], stable= %s" % (
                    kx, min(ret[i+1,:] - ret[0,:]), max(ret[i+1,:]-ret[0,:]),
                    str(st)))

            sys.stdout.flush()

        # fit the lines
        p, self.residuals, rank, singular_values, rcond = np.polyfit(
            kstrength[1:-1], ret[1:-1,:], 1, full=True)

        # reset the kicker
        #self.kicker.put(kfield, kx0, unitsys=self.unit)
        fput([(self.kicker, kfield, kx0),],
             unitsys=self.unit, wait_readback=True)
        self.rawkick = kstrength
        self.rawresp = ret
        self.m = p[0,:] # the slope
        self._c = p[1,:] # the constant
Exemplo n.º 3
0
    def measure(self, respfields, kfield, **kwargs):
        """
        Measure the RM by change one kicker. 

        :param respfields: response fields, a list
        
        """
        verbose = kwargs.get('verbose', 0)
        dklst = kwargs.get('dklst', None)

        kx0 = self.kicker.get(kfield, unitsys=self.unit) # get EPICS value
        wait = (self.minwait, self.stepwait, 0)
        if verbose:
            print "kicker: '%s.%s'= %e" % (self.kicker.name, kfield, kx0) 

        points = self.points
        if dklst is not None:
            points = len(dklst)
            print "Using external dklst:", dklst
        else:
            dklst = np.linspace(-self.maxdk, self.maxdk, points)

        # bpm read out
        ret = np.zeros((points+2, len(self.resplst)*len(respfields)), 'd')
        # initial bpm data
        v0, h = eget(self.resplst, respfields, unitsys=self.unit, header=True)
        #print "v=", v0
        #print "fields=", respfields, h
        ret[0,:] = np.ravel(v0)
        self.header = np.reshape(np.ravel(h), (-1, 2))

        kstrength = np.ones(points+2, 'd') * kx0
        kstrength[1:-1] = [dklst[i] + kx0 for i in range(points)]
        print "Kicker sp:", kstrength
        for i,kx in enumerate(kstrength[1:]):
            v0 = np.ravel(eget(self.resplst, respfields, unitsys=self.unit))
            #self.kicker.put(kfield, kx, unitsys=self.unit)
            #st = waitChanged(self.resplst, respfields, v0, 
            #                 wait=wait, diffstd=self.bpmdiffstd)
            fput([(self.kicker, kfield, kx),],
                 unitsys=self.unit, wait_readback = True)
            v1 = np.ravel(eget(self.resplst, respfields, unitsys=self.unit))
            ret[i+1,:] = v1[:]
            
            if verbose:
                print "kx= % .2e  resp= [% .4e, % .4e], stable= %s" % (
                    kx, min(ret[i+1,:] - ret[0,:]), max(ret[i+1,:]-ret[0,:]),
                    str(st))

            sys.stdout.flush()

        # fit the lines
        p, self.residuals, rank, singular_values, rcond = np.polyfit(
            kstrength[1:-1], ret[1:-1,:], 1, full=True)

        # reset the kicker
        #self.kicker.put(kfield, kx0, unitsys=self.unit)
        fput([(self.kicker, kfield, kx0),],
             unitsys=self.unit, wait_readback=True)
        self.rawkick = kstrength
        self.rawresp = ret
        self.m = p[0,:] # the slope
        self._c = p[1,:] # the constant 
Exemplo n.º 4
0
def measRmCol(resp, kker, kfld, dklst, **kwargs):
    """
    measure the response matrix of `resp` from `kicker`

    :param list resp: list of the response (elem, field)
    :param kker: the kicker object
    :param kfld: the kicker field
    :param list dklst: the kicker setpoints (ki0, ki1, ...)
    :param int sample: observatins per kicker setpoint
    :param int deg: degree of the fitting polynomial
    :param int verbose:

    returns slope, klst(readback), rawdata (nk, nresp, nsamle)
    """
    unitsys = kwargs.pop("unitsys", None)
    sample = kwargs.pop("sample", 3)
    deg = kwargs.pop("deg", 1)
    minwait = kwargs.pop("minwait", 0.0)

    dat = np.zeros((len(dklst), len(resp), sample), 'd')
    klstrb = np.zeros((len(dklst), sample), 'd')
    k0 = kker.get(kfld, handle="setpoint", unitsys=None)
    for i, dki in enumerate(dklst):
        try:
            fput([
                (kker, kfld, k0 + dki),
            ],
                 unitsys=unitsys,
                 wait_readback=True,
                 verbose=1)
        except:
            #kker.put(kfld, k0, unitsys=None)
            _logger.error("{0}".format(sys.exc_info()[0]))
            _logger.error("{0}".format(sys.exc_info()[1]))
            #_logger.error("{0}".format(sys.exc_info()[2]))
            msg = "Timeout at setting {0}.{1}= {2}, i= {3}, delta= {4}".format(
                kker.name, kfld, k0 + dki, i, dki)
            _logger.warn(msg)
            time.sleep(5.0)
            print("{0}.{1}= {2} (set:{3}). continued after 5.0 second".format(
                kker.name, kfld, kker.get(kfld, unitsys=unitsys), k0 + dki))
            sys.stdout.flush()

        time.sleep(minwait)
        for j in range(sample):
            klstrb[i, j] = kker.get(kfld, handle="readback", unitsys=unitsys)
            if kwargs.get("verbose", 0) > 0:
                print("Reading", kker, klstrb[i, j])
            dat[i, :, j] = fget(resp, unitsys=None, **kwargs)

    # nonblocking
    kker.put(kfld, k0, unitsys=None)
    p, resi, rank, sv, rcond = np.polyfit(dklst,
                                          np.average(dat, axis=-1),
                                          deg,
                                          full=True)
    # blocking
    try:
        fput([
            (kker, kfld, k0),
        ], unitsys=None, wait_readback=True)
    except:
        kker.put(kfld, k0, unitsys=None)
        msg = "Timeout at restoring {0}.{1}= {2}".format(kker.name, kfld, k0)
        _logger.warn(msg)
        print(msg)
        sys.stdout.flush()

    return p[-2, :], klstrb, dat