Пример #1
0
def _saveBrBpmData(fname, waveform, data, **kwargs):
    group = kwargs.get("h5group", "/")
    dcct_data = kwargs.get("dcct_data", None)
    pvpref = kwargs.get("pvpref", None)

    # open with default 'a' mode: rw if exists, create otherwise
    h5f = h5py.File(fname)
    if group != "/":
        grp = h5f.create_group(group)
    grp = h5f[group]
    grp["%s_name" % waveform] = data[0]
    grp["%s_x" % waveform] = data[1]
    grp["%s_y" % waveform] = data[2]
    grp["%s_sum" % waveform] = data[3]
    grp["%s_ts" % waveform] = data[4]
    grp["%s_offset" % waveform] = data[5]
    grp.attrs["timespan"] = _maxTimeSpan(data[4])

    if dcct_data:
        for i, d in enumerate(dcct_data):
            grp["dcct_%d" % i] = np.array(d, 'd')
    for i, t in enumerate(kwargs.get("ts", [])):
        grp.attrs["%s_t%d" % (waveform, i)] = t.strftime("%Y_%m_%d_%H%M%S.%f")

    if pvpref is not None:
        pvs = [p + "DDR:WfmSel-SP" for p in pvpref]
        grp["wfm_type"] = caget(pvs)
        pvs = [p + "ddrAdcWfEnable" for p in pvpref]
        grp["wfm_Adc_enabled"] = caget(pvs)
        pvs = [p + "ddrTbtWfEnable" for p in pvpref]
        grp["wfm_Tbt_enabled"] = caget(pvs)
        pvs = [p + "ddrFaWfEnable" for p in pvpref]
        grp["wfm_Fa_enabled"] = caget(pvs)

    h5f.close()
Пример #2
0
def _saveBrBpmData(fname, waveform, data, **kwargs):
    group = kwargs.get("h5group", "/")
    dcct_data = kwargs.get("dcct_data", None)
    pvpref = kwargs.get("pvpref", None)

    # open with default 'a' mode: rw if exists, create otherwise
    h5f = h5py.File(fname)
    if group != "/":
        grp = h5f.create_group(group)
    grp = h5f[group]
    grp["%s_name" % waveform]   = data[0]
    grp["%s_x" % waveform]      = data[1]
    grp["%s_y" % waveform]      = data[2]
    grp["%s_sum" % waveform]    = data[3]
    grp["%s_ts" % waveform]     = data[4]
    grp["%s_offset" % waveform] = data[5]
    grp.attrs["timespan"] = _maxTimeSpan(data[4])

    if dcct_data:
        for i,d in enumerate(dcct_data):
            grp["dcct_%d" % i] = np.array(d, 'd')
    for i,t in enumerate(kwargs.get("ts", [])):
        grp.attrs["%s_t%d" % (waveform,i)] = t.strftime("%Y_%m_%d_%H%M%S.%f")

    if pvpref is not None:
        pvs = [ p + "DDR:WfmSel-SP" for p in pvpref]
        grp["wfm_type"] = caget(pvs)
        pvs = [ p + "ddrAdcWfEnable" for p in pvpref]
        grp["wfm_Adc_enabled"] = caget(pvs)
        pvs = [ p + "ddrTbtWfEnable" for p in pvpref]
        grp["wfm_Tbt_enabled"] = caget(pvs)
        pvs = [ p + "ddrFaWfEnable" for p in pvpref]
        grp["wfm_Fa_enabled"] = caget(pvs)

    h5f.close()
Пример #3
0
def _release_lock(tag):
    if caget('SVR:LOCKED') == 0:
        raise ValueError("some one already reset the lock")
    if caget('SVR:LOCKED') != tag:
        raise ValueError("it is not locked by me, abort")

    caput('SVR:LOCKED', 0)
    print "released the lock for userid=%d" % tag
Пример #4
0
def _release_lock(tag):
    if caget('SVR:LOCKED') == 0:
        raise ValueError("some one already reset the lock")
    if caget('SVR:LOCKED') != tag:
        raise ValueError("it is not locked by me, abort")

    caput('SVR:LOCKED', 0)
    print "released the lock for userid=%d" % tag
Пример #5
0
    def checkOrbitReproduce(self, bpm, trim):
        print "checking ..."
        print "    bpm:", len(bpm)
        print "    trim:", trim

        # skip the masked value
        itrim, ibpm = [], []
        for i, b in enumerate(self.bpm):
            if b[0] in bpm: ibpm.append(i)
        for i, t in enumerate(self.trim):
            if t[0] in trim: itrim.append(i)
        if len(itrim) == 0:
            # No trim specified.
            return
        
        kick0 = np.zeros(len(itrim), 'd')
        for j,jt in enumerate(itrim):
            # read the setpoint
            kick0[j] = caget(self.trim[jt][3])
        dkick = np.random.rand(len(itrim))*5e-5 + 6e-5

        # get the initial orbit
        x0 = np.zeros(len(ibpm), 'd')
        for i,ib in enumerate(ibpm):
            x0[i] = caget(self.bpm[ib][2])
        
        dx = np.zeros(len(ibpm), 'd')
        for i,ib in enumerate(ibpm):
            for j,jt in enumerate(itrim):
                # skip the masked ORM elements
                if self._mask[ib, jt]: continue
                dx[i] = dx[i] + self.m[ib, jt]*dkick[j]
        for j, jt in enumerate(itrim):
            caput(self.trim[jt][3], kick0[j] + dkick[j])
        time.sleep(self.TSLEEP)

        # get the final orbit
        x1 = np.zeros(len(ibpm), 'd')
        for i,ib in enumerate(ibpm):
            x1[i] = caget(self.bpm[ib][2])
        #print x1

        # reset the trims
        for j,jt in enumerate(itrim):
            caput(self.trim[jt][3], kick0[j])
        time.sleep(self.TSLEEP)

        # return experiment and theory
        return x0, x1, dx
Пример #6
0
    def checkOrbitReproduce(self, bpm, trim):
        print("checking ...")
        print(("    bpm:", len(bpm)))
        print(("    trim:", trim))

        # skip the masked value
        itrim, ibpm = [], []
        for i, b in enumerate(self.bpm):
            if b[0] in bpm: ibpm.append(i)
        for i, t in enumerate(self.trim):
            if t[0] in trim: itrim.append(i)
        if len(itrim) == 0:
            # No trim specified.
            return

        kick0 = np.zeros(len(itrim), 'd')
        for j,jt in enumerate(itrim):
            # read the setpoint
            kick0[j] = caget(self.trim[jt][3])
        dkick = np.random.rand(len(itrim))*5e-5 + 6e-5

        # get the initial orbit
        x0 = np.zeros(len(ibpm), 'd')
        for i,ib in enumerate(ibpm):
            x0[i] = caget(self.bpm[ib][2])

        dx = np.zeros(len(ibpm), 'd')
        for i,ib in enumerate(ibpm):
            for j,jt in enumerate(itrim):
                # skip the masked ORM elements
                if self._mask[ib, jt]: continue
                dx[i] = dx[i] + self.m[ib, jt]*dkick[j]
        for j, jt in enumerate(itrim):
            caput(self.trim[jt][3], kick0[j] + dkick[j])
        time.sleep(self.TSLEEP)

        # get the final orbit
        x1 = np.zeros(len(ibpm), 'd')
        for i,ib in enumerate(ibpm):
            x1[i] = caget(self.bpm[ib][2])
        #print x1

        # reset the trims
        for j,jt in enumerate(itrim):
            caput(self.trim[jt][3], kick0[j])
        time.sleep(self.TSLEEP)

        # return experiment and theory
        return x0, x1, dx
Пример #7
0
def getBpmStatus(bpms):
    """
    returns the BPM status.

    bpms : list of BPM object

    it saves
      - event code: `Trig:EventNo-SP`
      - trig source: `Trig:TrigSrc-SP`
      - waveform selection: `DDR:WfmSel-SP`
      - offsets: `ddrAdcOffset`, `ddrTbtOffset`, `ddrFaOffset`
      - burst length: `Burst:AdcEnableLen-SP`, `Burst:TbtEnableLen-SP`, `Burst:FaEnableLen-SP`
      - record length: `ERec:AdcEnableLen-SP`, `ERec:TbtEnableLen-SP`, `ERec:FaEnableLen-SP`

    see also `restoreBpmStatus`
    """
    pvprefs = [e.pv(field="x")[0].replace("Pos:XwUsrOff-Calc", "")
               for e in bpms]
    info = {}
    for pat in ["Trig:TrigSrc-SP", "DDR:WfmSel-SP",
                "ddrAdcOffset", "ddrTbtOffset", "ddrFaOffset",
                "Burst:AdcEnableLen-SP", "Burst:TbtEnableLen-SP", "Burst:FaEnableLen-SP",
                "ERec:AdcEnableLen-SP", "ERec:TbtEnableLen-SP", "ERec:FaEnableLen-SP",
                "Trig:EventNo-SP",]:
        pvs = [pvx + pat for pvx in pvprefs]
        info[pat] = [pvs, caget(pvs, throw=False)]

    return info
Пример #8
0
def _fget_2(elst, field, **kwargs):
    """get elements field values for a family

    Parameters
    -----------
    elem : list. element name, name list, pattern or object list
    fields : list. field name or name list
    handle : str, optional, default "readback"
    unitsys : str, optional, default "phy", unit system, 

    returns a flat 1D array. 

    Examples
    ---------
    >>> fget('DCCT', 'value')
    >>> fget('BPM', 'x')
    >>> fget('p*c30*', 'x')

    >>> bpm = getElements('p*c30*')
    >>> fget(bpm, 'x', handle="readback", unitsys = None)

    Note
    -----

    if handle is not specified, try readback pvs first, if not exist, use
    setpoint.

    It will be confusing if the (elem,field) has other than one output value.
    """

    unitsys = kwargs.pop("unitsys", "phy")
    handle = kwargs.get('handle', "readback")

    if "handle" in kwargs:
        v = [e.pv(field=fld, handle=handle) for e, fld in zip(elst, field)]
        assert len(set([len(pvl) for pvl in v])) <= 1, \
            "Must be exact one pv for each field"
        pvl = reduce(lambda x, y: x + y, v)
    else:
        # if handle is not specified, try readback and setpoint
        pvlrb, pvlsp = [], []
        for e, fld in zip(elst, field):
            pvlrb.extend(e.pv(field=fld, handle="readback"))
            pvlsp.extend(e.pv(field=fld, handle="setpoint"))
        if pvlrb:
            pvl = pvlrb
        else:
            pvl = pvlsp

    kwargs.pop("handle", None)
    dat = caget(pvl, **kwargs)
    if unitsys is None: return dat

    ret = [
        e.convertUnit(field[i], dat[i], None, unitsys)
        for i, e in enumerate(elst)
    ]
    return ret
Пример #9
0
def _getFastOrbit(**kwargs):
    """
    return fast 10kHz turn-by-turn BPM data.

    - *field* ['A', 'B', 'C', 'D', 'X', 'Y', 'S', 'Q'], each has the RMS value: 'rmsA'-'rmsQ'
    """
    field = kwargs.get('field', 'X')
    pref = 'LTB:BI{BPM:1}' + 'FA-'
    return caget(pref + field)
Пример #10
0
def _wait_for_lock(tag, maxwait=60):
    """
    wait until the virtual accelerator is available to me.
    """
    print "# Locking the mathine for userid=%d" % tag
    if tag == 0:
        raise ValueError("you tag (=%d)  must be > 0." % tag)

    t0 = time.time()
    while caget('SVR:LOCKED') > 0:
        print "# waiting ... for user %d ..." % int(caget('SVR:LOCKED'))
        time.sleep(1)
        if time.time() - t0 > maxwait: break

    if caget('SVR:LOCKED') == 0:
        caput('SVR:LOCKED', tag)
    else:
        raise ValueError("can not get the writting permission to virtual accelerator")
Пример #11
0
def _getFastOrbit(**kwargs):
    """
    return fast 10kHz turn-by-turn BPM data.

    - *field* ['A', 'B', 'C', 'D', 'X', 'Y', 'S', 'Q'], each has the RMS value: 'rmsA'-'rmsQ'
    """
    field = kwargs.get('field', 'X')
    pref = 'LTB:BI{BPM:1}' + 'FA-'
    return caget(pref + field)
Пример #12
0
def _fget_2(elst, field, **kwargs):
    """get elements field values for a family

    Parameters
    -----------
    elem : list. element name, name list, pattern or object list
    fields : list. field name or name list
    handle : str, optional, default "readback"
    unitsys : str, optional, default "phy", unit system, 

    returns a flat 1D array. 

    Examples
    ---------
    >>> fget('DCCT', 'value')
    >>> fget('BPM', 'x')
    >>> fget('p*c30*', 'x')

    >>> bpm = getElements('p*c30*')
    >>> fget(bpm, 'x', handle="readback", unitsys = None)

    Note
    -----

    if handle is not specified, try readback pvs first, if not exist, use
    setpoint.

    It will be confusing if the (elem,field) has other than one output value.
    """

    unitsys = kwargs.pop("unitsys", "phy")
    handle = kwargs.get('handle', "readback")

    if "handle" in kwargs:
        v = [e.pv(field=fld, handle=handle) for e,fld in zip(elst, field)]
        assert len(set([len(pvl) for pvl in v])) <= 1, \
            "Must be exact one pv for each field"
        pvl = reduce(lambda x,y: x + y, v)
    else:
        # if handle is not specified, try readback and setpoint
        pvlrb, pvlsp = [], []
        for e,fld in zip(elst, field):
            pvlrb.extend(e.pv(field=fld, handle="readback"))
            pvlsp.extend(e.pv(field=fld, handle="setpoint"))
        if pvlrb:
            pvl = pvlrb
        else:
            pvl = pvlsp

    kwargs.pop("handle", None)
    dat = caget(pvl, **kwargs)
    if unitsys is None: return dat

    ret = [e.convertUnit(field[i], dat[i], None, unitsys)
               for i,e in enumerate(elst)]
    return ret
Пример #13
0
def _wait_for_lock(tag, maxwait=60):
    """
    wait until the virtual accelerator is available to me.
    """
    print "# Locking the mathine for userid=%d" % tag
    if tag == 0:
        raise ValueError("you tag (=%d)  must be > 0." % tag)

    t0 = time.time()
    while caget('SVR:LOCKED') > 0:
        print "# waiting ... for user %d ..." % int(caget('SVR:LOCKED'))
        time.sleep(1)
        if time.time() - t0 > maxwait: break

    if caget('SVR:LOCKED') == 0:
        caput('SVR:LOCKED', tag)
    else:
        raise ValueError(
            "can not get the writting permission to virtual accelerator")
Пример #14
0
def _reset_trims(verbose=False):
    """reset all trims in group *HCOR* and *VCOR* """
    trimx = machines._lat.getGroupMembers(['*', 'HCOR'], op='intersection')
    trimy = machines._lat.getGroupMembers(['*', 'VCOR'], op='intersection')
    pv = []
    for e in trimx:
        pv.extend(e.pv(field='x', handle='setpoint'))
    for e in trimy:
        pv.extend(e.pv(field='y', handle='setpoint'))
    if not pv:
        raise ValueError("no pv for trims found")
    
    if verbose:
        for p in pv: 
            print p, caget(p),
            caput(p, 0.0, wait=True)
            print caget(p)
    else:
        caput(pv, 0.0)

    _logger.info("reset all trims")
Пример #15
0
def _reset_trims(verbose=False):
    """reset all trims in group *HCOR* and *VCOR* """
    trimx = machines._lat.getGroupMembers(['*', 'HCOR'], op='intersection')
    trimy = machines._lat.getGroupMembers(['*', 'VCOR'], op='intersection')
    pv = []
    for e in trimx:
        pv.extend(e.pv(field='x', handle='setpoint'))
    for e in trimy:
        pv.extend(e.pv(field='y', handle='setpoint'))
    if not pv:
        raise ValueError("no pv for trims found")

    if verbose:
        for p in pv:
            print p, caget(p),
            caput(p, 0.0, wait=True)
            print caget(p)
    else:
        caput(pv, 0.0)

    _logger.info("reset all trims")
Пример #16
0
def restoreBpmStatus(bpmstats):
    """
    restore BPM status from the output of getBpmStatus

    see also `getBpmStatus`
    """
    for k, v in bpmstats.items():
        v0 = caget(v[0])
        idx = [i for i in range(len(v[1])) if v[1][i] != v0[i]]
        pvs = [v[0][i] for i in idx]
        vals = [v[1][i] for i in idx]
        try:
            caput(pvs, vals, throw=True, timeout=5)
        except:
            for i, pv in numerate(pvs):
                caput(pv, vals, timeout=5)
Пример #17
0
def restoreBpmStatus(bpmstats):
    """
    restore BPM status from the output of getBpmStatus

    see also `getBpmStatus`
    """
    for k,v in bpmstats.items():
        v0 = caget(v[0])
        idx = [i for i in range(len(v[1])) if v[1][i] != v0[i]]
        pvs = [v[0][i] for i in idx]
        vals = [v[1][i] for i in idx]
        try:
            caput(pvs, vals, throw = True, timeout=5)
        except:
            for i,pv in numerate(pvs):
                caput(pv, vals, timeout=5)
Пример #18
0
def putLattice(h5fname, **kwargs):
    """
    elemflds : list of (elementfam, list_of_fields), e.g. [("COR", ("x", "y"))]
    nstep : 3, split each setpoint in steps
    tspan : 3.0, span over tspan seconds when set magnet in several steps.

    ::

    >>> putLattice("sr_snapshot.hdf5", elemflds=[("COR", ("x", "y"))])
    """
    nstep = kwargs.get("nstep", 3)
    tspan = kwargs.get("tspan", 3.0)
    elemflds = kwargs.get("elemflds", [])

    lat = machines._lat
    pvspl, pvs = [], []
    for elfam,flds in elemflds:
        el = lat.getElementList(elfam, virtual=False)
        for fld in flds:
            pvs.extend(
                reduce(lambda a,b: a+b, [e.pv(field=fld) for e in el]))
            pvspl.extend(
                reduce(lambda a,b: a+b,
                       [e.pv(field=fld, handle="setpoint") for e in el]))
    import h5py
    h5f = h5py.File(h5fname, 'r')
    grp = h5f[lat.name]
    if not pvspl:
        print "Please select element family and fields in this snapshot:"
        for famflds in grp.attrs.get("_query_", []):
            m =re.match(r"([^(]+)\((.+)\)", famflds)
            if not m:
                print famflds
                continue
            print m.group(1), m.group(2).split(",")
        #print grp.attrs.get("_query_", [])
    else:
        vals = [grp[pv].value for pv in pvspl]
        dv = [(vals[j] - v) / nstep for j,v in enumerate(caget(pvspl))]
        for i in range(nstep):
            t0 = datetime.now()
            vi = [vals[j] - (nstep - 1 - i)*dv[j] for j in range(len(vals))]
            caput(pvspl, vi, timeout=tspan)
            dt = (datetime.now() - t0).total_seconds()
            if dt < tspan * 1.0 / nstep:
                time.sleep(tspan * 1.0 / nstep - dt + 0.1)
    h5f.close()
Пример #19
0
def putLattice(h5fname, **kwargs):
    """
    elemflds : list of (elementfam, list_of_fields), e.g. [("COR", ("x", "y"))]
    nstep : 3, split each setpoint in steps
    tspan : 3.0, span over tspan seconds when set magnet in several steps.

    ::

    >>> putLattice("sr_snapshot.hdf5", elemflds=[("COR", ("x", "y"))])
    """
    nstep = kwargs.get("nstep", 3)
    tspan = kwargs.get("tspan", 3.0)
    elemflds = kwargs.get("elemflds", [])

    lat = machines._lat
    pvspl, pvs = [], []
    for elfam, flds in elemflds:
        el = lat.getElementList(elfam, virtual=False)
        for fld in flds:
            pvs.extend(
                reduce(lambda a, b: a + b, [e.pv(field=fld) for e in el]))
            pvspl.extend(
                reduce(lambda a, b: a + b,
                       [e.pv(field=fld, handle="setpoint") for e in el]))
    import h5py
    h5f = h5py.File(h5fname, 'r')
    grp = h5f[lat.name]
    if not pvspl:
        print "Please select element family and fields in this snapshot:"
        for famflds in grp.attrs.get("_query_", []):
            m = re.match(r"([^(]+)\((.+)\)", famflds)
            if not m:
                print famflds
                continue
            print m.group(1), m.group(2).split(",")
        #print grp.attrs.get("_query_", [])
    else:
        vals = [grp[pv].value for pv in pvspl]
        dv = [(vals[j] - v) / nstep for j, v in enumerate(caget(pvspl))]
        for i in range(nstep):
            t0 = datetime.now()
            vi = [vals[j] - (nstep - 1 - i) * dv[j] for j in range(len(vals))]
            caput(pvspl, vi, timeout=tspan)
            dt = (datetime.now() - t0).total_seconds()
            if dt < tspan * 1.0 / nstep:
                time.sleep(tspan * 1.0 / nstep - dt + 0.1)
    h5f.close()
Пример #20
0
def plotLattice(fname,
                h5group="/",
                pvs=[],
                elemflds=[],
                withLive=False,
                figsize=(16, 4)):
    """
    pvs
    elemflds - use readback of this set of (elemobj, field)

    >>> elemflds = [(e, 'b1') for e in ap.getElements("QUAD")]
    >>> plotLattice("snapshot.hdf5", h5group="SR", elemflds=elemflds)
    """
    h5g = h5py.File(fname, 'r')[h5group]
    # assumes scalar, not waveform
    data = np.zeros((len(pvs) + len(elemflds), 2), 'd')
    for i, pv in enumerate(pvs):
        try:
            data[i, 0] = h5g[pv]
        except:
            data[i, 0] = np.nan
    # from (elemname, field) to "element.field" as in h5ds.attrs
    slst = ["%s.%s" % (e.name, fld) for e, fld in elemflds]
    for pv, val in h5g.items():
        if all([v not in slst for v in val.attrs.get("element.field", [])]) or \
                val.size > 1:
            continue
        i = slst.index(val.attrs["element.field"])
        #print i, pv, np.shape(val), val
        data[i + len(pvs), 0] = val.value
    import matplotlib.pylab as plt
    fig = plt.figure(figsize=figsize)
    if withLive:
        data[:len(pvs), 1] = caget(pvs)
        data[len(pvs):, 1] = fget(elemflds, unitsys=None)
        ax1 = plt.subplot(2, 1, 1)
        ax1.plot(data[:, 0], '-x', label="snapshot")
        ax1.plot(data[:, 1], '-o', label="Live")
        ax2 = plt.subplot(2, 1, 2)
        ax2.plot(data[:, 1] - data[:, 0], '-o', label="diff")
        ax2.set_ylabel("Live-snapshot")
    else:
        plt.plot(data[:, 0], '-x', label="snapshot")

    plt.grid(True)
    return fig
Пример #21
0
def _saveSrBpmData(fname, waveform, names, x, y, Is, **kwargs):
    group = kwargs.get("h5group", "/")
    dcct_data = kwargs.get("dcct_data", None)
    pvpref = kwargs.get("pvpref", None)

    # open with default 'a' mode: rw if exists, create otherwise
    h5f = h5py.File(fname)
    if group != "/":
        grp = h5f.create_group(group)
    grp = h5f[group]
    grp["%s_name" % waveform] = names
    grp["%s_x" % waveform] = x
    grp["%s_y" % waveform] = y
    grp["%s_sum" % waveform] = Is
    if "ddr_timestamp" in kwargs:
        grp["%s_ts" % waveform] = kwargs["ddr_timestamp"]
    if "ddr_offset" in kwargs:
        grp["%s_offset" % waveform] = kwargs["ddr_offset"]
    if "bba_xoffset" in kwargs:
        grp["bba_x_offset"] = kwargs["bba_xoffset"]
    if "bba_yoffset" in kwargs:
        grp["bba_y_offset"] = kwargs["bba_yoffset"]
    if "event_code" in kwargs:
        grp["event_code"] = kwargs["event_code"]

    #grp.attrs["timespan"] = _maxTimeSpan(data[4])

    if dcct_data:
        for i, d in enumerate(dcct_data):
            grp["dcct_%d" % i] = np.array(d, 'd')
    for i, t in enumerate(kwargs.get("ts", [])):
        grp.attrs["%s_t%d" % (waveform, i)] = t.strftime("%Y_%m_%d_%H%M%S.%f")

    if pvpref is not None:
        pvs = [p + "DDR:WfmSel-SP" for p in pvpref]
        grp["wfm_type"] = np.array(caget(pvs), 'i')
        #pvs = [ p + "ddrAdcWfEnable" for p in pvpref]
        #grp["wfm_Adc_enabled"] = np.array(caget(pvs), 'i')
        #pvs = [ p + "ddrTbtWfEnable" for p in pvpref]
        #grp["wfm_Tbt_enabled"] = np.array(caget(pvs), 'i')
        #pvs = [ p + "ddrFaWfEnable" for p in pvpref]
        #grp["wfm_Fa_enabled"] = np.array(caget(pvs), 'i')

    h5f.close()
Пример #22
0
def _saveSrBpmData(fname, waveform, names, x, y, Is, **kwargs):
    group = kwargs.get("h5group", "/")
    dcct_data = kwargs.get("dcct_data", None)
    pvpref = kwargs.get("pvpref", None)

    # open with default 'a' mode: rw if exists, create otherwise
    h5f = h5py.File(fname)
    if group != "/":
        grp = h5f.create_group(group)
    grp = h5f[group]
    grp["%s_name" % waveform]   = names
    grp["%s_x" % waveform]      = x
    grp["%s_y" % waveform]      = y
    grp["%s_sum" % waveform]    = Is
    if "ddr_timestamp" in kwargs:
        grp["%s_ts" % waveform] = kwargs["ddr_timestamp"]
    if "ddr_offset" in kwargs:
        grp["%s_offset" % waveform] = kwargs["ddr_offset"]
    if "bba_xoffset" in kwargs:
        grp["bba_x_offset"] = kwargs["bba_xoffset"]
    if "bba_yoffset" in kwargs:
        grp["bba_y_offset"] = kwargs["bba_yoffset"]
    if "event_code" in kwargs:
        grp["event_code"]  = kwargs["event_code"]

    #grp.attrs["timespan"] = _maxTimeSpan(data[4])

    if dcct_data:
        for i,d in enumerate(dcct_data):
            grp["dcct_%d" % i] = np.array(d, 'd')
    for i,t in enumerate(kwargs.get("ts", [])):
        grp.attrs["%s_t%d" % (waveform,i)] = t.strftime("%Y_%m_%d_%H%M%S.%f")

    if pvpref is not None:
        pvs = [ p + "DDR:WfmSel-SP" for p in pvpref]
        grp["wfm_type"] = np.array(caget(pvs), 'i')
        #pvs = [ p + "ddrAdcWfEnable" for p in pvpref]
        #grp["wfm_Adc_enabled"] = np.array(caget(pvs), 'i')
        #pvs = [ p + "ddrTbtWfEnable" for p in pvpref]
        #grp["wfm_Tbt_enabled"] = np.array(caget(pvs), 'i')
        #pvs = [ p + "ddrFaWfEnable" for p in pvpref]
        #grp["wfm_Fa_enabled"] = np.array(caget(pvs), 'i')

    h5f.close()
Пример #23
0
def plotLattice(fname, h5group="/", pvs=[], elemflds=[], withLive=False, figsize=(16, 4)):
    """
    pvs
    elemflds - use readback of this set of (elemobj, field)

    >>> elemflds = [(e, 'b1') for e in ap.getElements("QUAD")]
    >>> plotLattice("snapshot.hdf5", h5group="SR", elemflds=elemflds)
    """
    h5g = h5py.File(fname, "r")[h5group]
    # assumes scalar, not waveform
    data = np.zeros((len(pvs) + len(elemflds), 2), "d")
    for i, pv in enumerate(pvs):
        try:
            data[i, 0] = h5g[pv]
        except:
            data[i, 0] = np.nan
    # from (elemname, field) to "element.field" as in h5ds.attrs
    slst = ["%s.%s" % (e.name, fld) for e, fld in elemflds]
    for pv, val in h5g.items():
        if all([v not in slst for v in val.attrs.get("element.field", [])]) or val.size > 1:
            continue
        i = slst.index(val.attrs["element.field"])
        # print i, pv, np.shape(val), val
        data[i + len(pvs), 0] = val.value
    import matplotlib.pylab as plt

    fig = plt.figure(figsize=figsize)
    if withLive:
        data[: len(pvs), 1] = caget(pvs)
        data[len(pvs) :, 1] = fget(elemflds, unitsys=None)
        ax1 = plt.subplot(2, 1, 1)
        ax1.plot(data[:, 0], "-x", label="snapshot")
        ax1.plot(data[:, 1], "-o", label="Live")
        ax2 = plt.subplot(2, 1, 2)
        ax2.plot(data[:, 1] - data[:, 0], "-o", label="diff")
        ax2.set_ylabel("Live-snapshot")
    else:
        plt.plot(data[:, 0], "-x", label="snapshot")

    plt.grid(True)
    return fig
Пример #24
0
def getBpmStatus(bpms):
    """
    returns the BPM status.

    bpms : list of BPM object

    it saves
      - event code: `Trig:EventNo-SP`
      - trig source: `Trig:TrigSrc-SP`
      - waveform selection: `DDR:WfmSel-SP`
      - offsets: `ddrAdcOffset`, `ddrTbtOffset`, `ddrFaOffset`
      - burst length: `Burst:AdcEnableLen-SP`, `Burst:TbtEnableLen-SP`, `Burst:FaEnableLen-SP`
      - record length: `ERec:AdcEnableLen-SP`, `ERec:TbtEnableLen-SP`, `ERec:FaEnableLen-SP`

    see also `restoreBpmStatus`
    """
    pvprefs = [
        e.pv(field="x")[0].replace("Pos:XwUsrOff-Calc", "") for e in bpms
    ]
    info = {}
    for pat in [
            "Trig:TrigSrc-SP",
            "DDR:WfmSel-SP",
            "ddrAdcOffset",
            "ddrTbtOffset",
            "ddrFaOffset",
            "Burst:AdcEnableLen-SP",
            "Burst:TbtEnableLen-SP",
            "Burst:FaEnableLen-SP",
            "ERec:AdcEnableLen-SP",
            "ERec:TbtEnableLen-SP",
            "ERec:FaEnableLen-SP",
            "Trig:EventNo-SP",
    ]:
        pvs = [pvx + pat for pvx in pvprefs]
        info[pat] = [pvs, caget(pvs, throw=False)]

    return info
Пример #25
0
def correctBrOrbit(kker, m, **kwarg):
    """correct the resp using kker and response matrix.

    Parameters
    ------------
    kker : PV list of the controllers, e.g. corrector
    m : response matrix where :math:`m_{ij}=\Delta orbit_i/\Delta kker_j`
    scale : scaling factor applied to the calculated kker
    ref : the targeting value of orbit
    rcond : the rcond for cutting singular values. 
    check : stop if the orbit gets worse.
    wait : waiting (seconds) before check.

    Returns
    --------
    err : converged or not checked (0), error (>0).
    msg : error message or None

    """
    scale = kwarg.get('scale', 0.68)
    ref = kwarg.get('ref', None)
    check = kwarg.get('check', True)
    wait = kwarg.get('wait', 6)
    rcond = kwarg.get('rcond', 1e-2)
    verb = kwarg.get('verbose', 0)
    bc = kwarg.get('bc', None)
    wfmslice = kwarg.get("wfmslice", (10, 100))
    wfm = kwarg.pop("waveform", "Fa")
    exrows = kwarg.pop("exclude_rows", [])
    test = kwarg.pop("test", False)
    #u, s, v = np.linalg.svd(m)
    #plt.semilogy(s/s[0], 'x-')
    #plt.show()

    i0, i1 = wfmslice
    nbpm, ncor = np.shape(m)
    mask_row = np.ones(nbpm, 'i')
    for i in exrows:
        mask_row[i] = 0
    m = np.compress(mask_row, m, axis=0)

    print "New m shape:", np.shape(m)

    name, x0, y0, Isum0, ts, offset = getBrBpmData(waveform=wfm, trig=0)

    # save initial orbit in vx0
    vl0 = np.compress(mask_row, np.vstack((x0, y0)), axis=0)
    v0 = np.average(vl0[:, i0:i1], axis=1)
    if np.max(v0) > 10000 or np.min(v0) < -10000:
        plt.plot(v0)
        plt.show()
        raise RuntimeError("orbit is not stable, too large: %.2f, %.2f" %
                           (np.min(v0), np.max(v0)))

    if ref is not None: v0 = v0 - ref
    if len(v0) != len(m):
        raise RuntimeError("inconsistent BPM and ORM size")

    # the initial norm
    norm0 = np.linalg.norm(v0)

    # solve for m*dk + (v0 - ref) = 0
    dk, resids, rank, s = np.linalg.lstsq(m, -1.0 * v0, rcond=rcond)

    norm1 = np.linalg.norm(m.dot(dk * scale) + v0)

    # get the DC kicker
    kl0 = np.array(caget(kker), 'd')
    k0 = np.average(kl0, axis=1)
    print np.shape(kl0)
    #print k0, dk, scale
    k1 = k0 + dk * scale
    vk1 = [[k] * len(kl0[i]) for i, k in enumerate(k1)]
    plt.plot(k0, 'r-', label="initial")
    plt.plot(k1, 'b-', label="new")
    plt.legend()
    plt.show()
    if not test:
        caput(kker, vk1, wait=True)
    else:
        for i, pv in enumerate(kker):
            print i, pv, k1[i], "dk=", dk[i]

    time.sleep(wait)
    name, x1, y1, Isum1, ts, offset = getBrBpmData(waveform=wfm, trig=0)

    vl1 = np.compress(mask_row, np.vstack((x1, y1)), axis=0)
    v1 = np.average(vl1[:, i0:i1], axis=1)

    print norm0, "predicted norm= ", norm1, "realized:", np.linalg.norm(v1)

    return v0, v1, k0, k1
Пример #26
0
def getBrBpmData(**kwargs):
    """
    timeout - 6sec
    sleep - 4sec
    output - True, use default file name, str - user specified filename

    returns name, x, y, Isum, timestamp, offset

    There will be warning if timestamp differs more than 1 second
    """
    trig_src = kwargs.get("trig", 0)
    verbose = kwargs.get("verbose", 0)
    waveform = kwargs.pop("waveform", "Tbt")
    name = kwargs.pop("name", "BPM")
    #timeout  = kwargs.get("timeout", 6)

    lat = machines.getLattice()
    if lat.name != "BR":
        raise RuntimeError("the current lattice is not 'BR': %s" % lat.name)

    t0 = datetime.now()

    pv_dcct = "BR-BI{DCCT:1}I-Wf"
    dcct1 = caget(pv_dcct, count=1000)

    pvpref = [
        bpm.pv(field="x")[0].replace("Pos:X-I", "")
        for bpm in getElements(name)
    ]
    names = [bpm.name for bpm in getElements(name)]

    if trig_src == 0 and waveform in ["Tbt", "Fa"]:
        ret = _brBpmTrigData(pvpref, waveform, **kwargs)
        x, y, Is, ts, offset = ret
    else:
        if waveform == "Tbt":
            pv_x = [pv + "TBT-X" for pv in pvpref]
            pv_y = [pv + "TBT-Y" for pv in pvpref]
            pv_S = [pv + "TBT-S" for pv in pvpref]
            pv_offset = [pv + "ddrTbtOffset" for pv in pvpref]
        elif waveform == "Fa":
            pv_x = [pv + "FA-X" for pv in pvpref]
            pv_y = [pv + "FA-Y" for pv in pvpref]
            pv_S = [pv + "FA-S" for pv in pvpref]
            pv_offset = [pv + "ddrFaOffset" for pv in pvpref]

        pv_ts = [pv + "TS:DdrTrigDate-I" for pv in pvpref]
        x = np.array(caget(pv_x), 'd')
        y = np.array(caget(pv_y), 'd')
        Is = np.array(caget(pv_S), 'd')
        ts = caget(pv_ts)
        offset = caget(pv_offset)

    # get dcct
    dcct2 = caget(pv_dcct, count=1000)
    t1 = datetime.now()

    data = (names, x, y, Is, ts, offset)

    if kwargs.get("output", None):
        # default output dir and file
        output_file = kwargs["output"]
        if output_file is True:
            # use the default file name
            output_dir = os.path.join(machines.getOutputDir(),
                                      t0.strftime("%Y_%m"), "bpm")
            if not os.path.exists(output_dir):
                os.makedirs(output_dir)
            fopt = "bpm_%s_%d_" % (waveform, trig_src) + \
                t0.strftime("%Y_%m_%d_%H%M%S.hdf5")
            output_file = os.path.join(output_dir, fopt)

        # save the data
        _saveBrBpmData(output_file,
                       waveform,
                       data,
                       h5group=kwargs.get("h5group", "/"),
                       dcct_data=(dcct1, dcct2),
                       ts=(t0, t1),
                       pvpref=pvpref)
        return data, output_file
    else:
        return data
Пример #27
0
def _srBpmTrigData(pvprefs, waveform, **kwargs):
    """
    """
    offset = kwargs.pop("offset", 0)
    sleep  = kwargs.pop("sleep", 0.5)
    count  = kwargs.pop("count", 0)
    tc = kwargs.get("timeout", 6)
    verbose = kwargs.get("verbose", 0)

    t0 = datetime.now()

    # prepare the triggers
    pv_evg = "SR-BI{BPM}Evt:Single-Cmd"
    pv_trig = []
    pv_wfmsel, pv_adcwfm, pv_tbtwfm, pv_fawfm = [], [], [], []
    pv_adcoffset, pv_tbtoffset, pv_faoffset = [], [], []
    # available data points
    pv_adclen, pv_tbtlen, pv_falen = [], [], []
    # available data points in CA
    pv_adccalen, pv_tbtcalen, pv_facalen = [], [], []
    #
    pv_bbaxoff, pv_bbayoff = [], []
    pv_ddrts = [] # timestamp
    pv_ts, pv_tsns = [], [] # timestamp second and nano sec
    pv_trigts, pv_trigtsns = [], [] # trigger timestamp
    pv_ddrtx = [] # DDR transfer busy
    pv_evtcode = []
    # did not consider the 'ddrTbtWfEnable' PV
    for i,pvx in enumerate(pvprefs):
        #print bpm.name, pvh, caget(pvh)
        #
        pv_bbaxoff.append( pvx + "BbaXOff-SP")
        pv_bbayoff.append( pvx + "BbaYOff-SP")
        # 
        pv_trig.append(  pvx + "Trig:TrigSrc-SP")
        pv_wfmsel.append(pvx + "DDR:WfmSel-SP")
        pv_ddrts.append( pvx + "TS:DdrTrigDate-I")
        #pv_adcwfm.append(pvx + "ddrAdcWfEnable")
        #pv_tbtwfm.append(pvx + "ddrTbtWfEnable")
        #pv_fawfm.append( pvx + "ddrFaWfEnable")
        #
        pv_adcoffset.append(pvx + "ddrAdcOffset")
        pv_tbtoffset.append(pvx + "ddrTbtOffset")
        pv_faoffset.append( pvx + "ddrFaOffset")
        pv_trigts.append(  pvx + "Trig:TsSec-I")
        pv_trigtsns.append(pvx + "Trig:TsOff-I")
        #
        pv_adclen.append(  pvx + "Burst:AdcEnableLen-SP")
        pv_tbtlen.append(  pvx + "Burst:TbtEnableLen-SP")
        pv_falen.append(   pvx + "Burst:FaEnableLen-SP")
        #
        pv_adccalen.append(pvx + "ERec:AdcEnableLen-SP")
        pv_tbtcalen.append(pvx + "ERec:TbtEnableLen-SP")
        pv_facalen.append( pvx + "ERec:FaEnableLen-SP")

        pv_ddrtx.append(pvx + "DDR:TxStatus-I")
        pv_evtcode.append(pvx + "Trig:EventNo-I")

    # save initial val
    wfsel0   = caget(pv_wfmsel, timeout=tc)
    trig0 = caget(pv_trig, timeout=tc)

    # set the trigger internal, TBT waveform
    prf = ""
    if waveform == "Adc":
        caput(pv_wfmsel, 0, wait=True)
        #caput(pv_adcwfm, 1, wait=True)
        caput(pv_adcoffset, 0, wait=True)
        pv_ddroffset = pv_adcoffset
        prf = ""
    elif waveform == "Tbt":
        caput(pv_wfmsel, 1, wait=True)
        #caput(pv_tbtwfm, 1, wait=True)
        caput(pv_tbtoffset, 0, wait=True)
        pv_ddroffset = pv_tbtoffset
        prf = "TBT"
    elif waveform == "Fa":
        caput(pv_wfmsel, 2, wait=True)
        #caput(pv_fawfm,  1, wait=True)
        caput(pv_faoffset, 0, wait=True)
        pv_ddroffset = pv_faoffset
        prf = "FA"
    else:
        raise RuntimeError("unknow waveform '%s'" % waveform)

    pv_x, pv_y, pv_S = [], [], []
    pv_A, pv_B, pv_C, pv_D = [], [], [], []
    for i,pvx in enumerate(pvprefs):
        pv_x.append( pvx + "%s-X" % prf)
        pv_y.append( pvx + "%s-Y" % prf)
        pv_S.append( pvx + "%s-S" % prf)
        pv_A.append( pvx + "%s-A" % prf)
        pv_B.append( pvx + "%s-B" % prf)
        pv_C.append( pvx + "%s-C" % prf)
        pv_D.append( pvx + "%s-D" % prf)

    # set 0 - internal trig, 1 - external trig
    caput(pv_trig, 0, wait=True, timeout=tc)

    # set the event
    caput(pv_evg, 1, wait=True)

    time.sleep(1.2)

    # check timestamp
    n = 0
    while any(caget(pv_ddrtx, timeout=tc)) and n < 20:
        time.sleep(0.5)
        n += 1
    tss_r  = caget(pv_trigts, timeout=tc)
    tss = [t - min(tss_r) for t in tss_r]
    tsns = caget(pv_trigtsns, timeout=tc)
    ts = [s*1e9 + tsns[i] for i,s in enumerate(tss)]
    mdt = max(ts) - min(ts)
    if mdt > 8.0:
        raise RuntimeError("BPMs are not ready after {0} trials, dt={1}: "
                           "{2}\n{3}".format(n, mdt, ts, caget(pv_ddrtx)))

    if verbose > 0:
        print "Trials: %d, Trig=%.2e ns." % (n, mdt)
        print "Sec:", tss_r
        print "dSec: ", [s - min(tss) for s in tss]
        print "dNsec:", [s - min(tsns) for s in tsns]
        print "NSec", tsns

    # redundent check
    #ddrts0 = caget(pv_ddrts)
    ddrts0 = [datetime.fromtimestamp(v).strftime("%m/%d/%Y,%H:%M:%S") +
              ".%09d" % tsns[i] for i,v in enumerate(tss_r)]
    ddroffset = caget(pv_ddroffset, timeout=tc)
    data = (caget(pv_x, count=count), caget(pv_y, count=count),
            caget(pv_S, count=count))
    xbbaofst = caget(pv_bbaxoff, timeout=tc)
    ybbaofst = caget(pv_bbayoff, timeout=tc)
    #
    # set 0 - internal trig, 1 - external trig
    #caput(pv_trig, 1, wait=True)
    caput(pv_wfmsel, wfsel0, wait=True, timeout=tc)
    caput(pv_trig, trig0, wait=True, timeout=tc)
    ext_data = {
        "ddr_timestamp": ddrts0,
        "ddr_offset": ddroffset,
        "bba_xoffset": xbbaofst,
        "bba_yoffset": ybbaofst,
        "event_code": caget(pv_evtcode)}
    #return data[0], data[1], data[2], ddrts0, ddroffset, ts
    return (data[0], data[1], data[2], ext_data)
Пример #28
0
def _brBpmTrigData(pvprefs, waveform, **kwargs):
    """
    """
    offset = kwargs.pop("offset", 0)
    sleep = kwargs.pop("sleep", 0.5)
    tc = kwargs.get("timeout", 6)
    verbose = kwargs.get("verbose", 0)

    t0 = datetime.now()

    # prepare the triggers
    pv_evg = "BR-BI{BPM}Evt:Single-Cmd"
    pv_trig = []
    pv_wfmsel, pv_adcwfm, pv_tbtwfm, pv_fawfm = [], [], [], []
    pv_adcoffset, pv_tbtoffset, pv_faoffset = [], [], []
    pv_ddrts = []  # timestamp
    pv_ts, pv_tsns = [], []  # timestamp second and nano sec
    pv_trigts, pv_trigtsns = [], []  # trigger timestamp
    # did not consider the 'ddrTbtWfEnable' PV
    for i, pvx in enumerate(pvprefs):
        #print bpm.name, pvh, caget(pvh)
        pv_trig.append(pvx + "Trig:TrigSrc-SP")
        pv_wfmsel.append(pvx + "DDR:WfmSel-SP")
        pv_ddrts.append(pvx + "TS:DdrTrigDate-I")
        pv_adcwfm.append(pvx + "ddrAdcWfEnable")
        pv_tbtwfm.append(pvx + "ddrTbtWfEnable")
        pv_fawfm.append(pvx + "ddrFaWfEnable")
        #
        pv_adcoffset.append(pvx + "ddrAdcOffset")
        pv_tbtoffset.append(pvx + "ddrTbtOffset")
        pv_faoffset.append(pvx + "ddrFaOffset")
        pv_ts.append(pvx + "Trig:TsSec-I")
        pv_tsns.append(pvx + "Trig:TsOff-I")
        pv_trigts.append(pvx + "Trig:TsSec-I")
        pv_trigtsns.append(pvx + "Trig:TsOff-I")
        #

    # save initial val
    wfsel0 = caget(pv_wfmsel, timeout=tc)
    trig0 = caget(pv_trig, timeout=tc)

    # set the trigger internal, TBT waveform
    prf = ""
    if waveform == "Adc":
        caput(pv_wfmsel, 0, wait=True)
        caput(pv_adcwfm, 1, wait=True)
        caput(pv_adcoffset, offset, wait=True)
        pv_ddroffset = pv_adcoffset
        prf = ""
    elif waveform == "Tbt":
        caput(pv_wfmsel, 1, wait=True)
        caput(pv_tbtwfm, 1, wait=True)
        caput(pv_tbtoffset, offset, wait=True)
        pv_ddroffset = pv_tbtoffset
        prf = "TBT"
    elif waveform == "Fa":
        caput(pv_wfmsel, 2, wait=True)
        caput(pv_fawfm, 1, wait=True)
        caput(pv_faoffset, offset, wait=True)
        pv_ddroffset = pv_faoffset
        prf = "FA"
    else:
        raise RuntimeError("unknow waveform '%s'" % waveform)

    time.sleep(1.5)
    pv_x, pv_y, pv_S = [], [], []
    pv_A, pv_B, pv_C, pv_D = [], [], [], []
    for i, pvx in enumerate(pvprefs):
        pv_x.append(pvx + "%s-X" % prf)
        pv_y.append(pvx + "%s-Y" % prf)
        pv_S.append(pvx + "%s-S" % prf)
        pv_A.append(pvx + "%s-A" % prf)
        pv_B.append(pvx + "%s-B" % prf)
        pv_C.append(pvx + "%s-C" % prf)
        pv_D.append(pvx + "%s-D" % prf)

    # set 0 - internal trig, 1 - external trig
    caput(pv_trig, 0, wait=True, timeout=tc)

    # set the event
    caput(pv_evg, 1, wait=True)

    time.sleep(sleep)

    # check timestamp
    n = 0
    while True:
        tss_r = caget(pv_trigts, timeout=tc)
        tss = [t - min(tss_r) for t in tss_r]
        tsns = caget(pv_trigtsns, timeout=tc)
        ts = [s + 1.0e-9 * tsns[i] for i, s in enumerate(tss)]
        mdt = max(ts) - min(ts)
        ddrts0 = caget(pv_ddrts)
        mdt_s = _maxTimeSpan(caget(pv_ddrts, timeout=tc))
        n = n + 1
        if mdt < 1.0 and mdt_s < 1.0:
            #print "Max dt=", mdt, mdt_s, "tried %d times" % n
            break
        time.sleep(0.6)
        # quit if failed too many times
        if n > 20:
            caput(pv_trig, [1] * len(pv_trig), wait=True)
            raise RuntimeError("BPMs are not ready after %d trials" % n)

    if verbose > 0:
        print "Trials: %d, Trig=%.2e, DDR Trig=%.2e seconds." % (n, mdt, mdt_s)

    # redundent check
    ddrts0 = caget(pv_ddrts, timeout=tc)
    mdt = _maxTimeSpan(ddrts0)
    if mdt > 1.0:
        print "ERROR: Timestamp does not agree (max dt= %f), wait ..." % mdt

    ddroffset = caget(pv_ddroffset, timeout=tc)
    data = (caget(pv_x), caget(pv_y), caget(pv_S))
    #
    data = np.array(data, 'd')

    # set 0 - internal trig, 1 - external trig
    caput(pv_trig, 1, wait=True)

    return data[0], data[1], data[2], ddrts0, ddroffset
Пример #29
0
def getSrBpmData(**kwargs):
    """
    NSLS-II SR BPM data acquisition.

    Parameters
    -----------
    trig : int, optional
        Internal(0) or external(1) trigger.
    verbose : int
    waveform : str
        Waveform selection: ``"Tbt"``, ``"Fa"``
    bpms : list
        A list of BPM object.
    name : str
        BPM name or pattern, overwritten by parameter *bpms*
    count : int
        Waveform length. default all (0).
    output : str, True, False
        output file name, or default name (True), or no output (False).
    h5group : str
        output HDF5 group

    Returns
    --------
    name : list
        a list of BPM name
    x : array (nbpm, count)
        x orbit, shape (nbpm, waveform_length).
    y : array (nbpm, count)
        y orbit
    Isum : array (nbpm, count)
        Sum signal
    timestamp : list
    offset : list
        offset from the FPGA buffer.

    There will be warning if timestamp differs more than 1 second
    """
    trig_src = kwargs.get("trig", 0)
    verbose = kwargs.get("verbose", 0)
    waveform = kwargs.pop("waveform", "Tbt")
    name = kwargs.pop("bpms", kwargs.pop("name", "BPM"))
    count = kwargs.get("count", 0)
    #timeout  = kwargs.get("timeout", 6)
    output = kwargs.get("output", None)

    lat = machines.getLattice()
    if lat.name != "SR":
        raise RuntimeError("the current lattice is not 'BR': %s" % lat.name)

    t0 = datetime.now()

    #pv_dcct = "BR-BI{DCCT:1}I-Wf"
    #dcct1 = caget(pv_dcct, count=1000)
    elems = [e for e in getElements(name) if e.pv(field="x")]
    pvpref = [
        bpm.pv(field="x")[0].replace("Pos:XwUsrOff-Calc", "") for bpm in elems
    ]
    names = [bpm.name for bpm in elems]

    if trig_src == 0 and waveform in ["Tbt", "Fa"]:
        # internal trig
        # ret = _srBpmTrigData(pvpref, waveform, **kwargs)
        # x, y, Is, ts, offset, xbbaofst, ybbaofst, extdata = ret
        x, y, Is, extdata = _srBpmTrigData(pvpref, waveform, **kwargs)
    else:
        if waveform == "Tbt":
            pv_x = [pv + "TBT-X" for pv in pvpref]
            pv_y = [pv + "TBT-Y" for pv in pvpref]
            pv_S = [pv + "TBT-S" for pv in pvpref]
            pv_offset = [pv + "ddrTbtOffset" for pv in pvpref]
        elif waveform == "Fa":
            pv_x = [pv + "FA-X" for pv in pvpref]
            pv_y = [pv + "FA-Y" for pv in pvpref]
            pv_S = [pv + "FA-S" for pv in pvpref]
            pv_offset = [pv + "ddrFaOffset" for pv in pvpref]

        pv_ts = [pv + "TS:DdrTrigDate-I" for pv in pvpref]
        pv_bbaxoff = [pv + "BbaXOff-SP" for pv in pvpref]
        pv_bbayoff = [pv + "BbaYOff-SP" for pv in pvpref]
        pv_evtcode = [pv + "Trig:EventNo-I" for pv in pvpref]

        x = caget(pv_x, count=count, throw=False)
        y = caget(pv_y, count=count, throw=False)
        Is = caget(pv_S, count=count, throw=False)
        # check srBpmTrigData, key must agrees
        extdata = {
            "ddr_timestamp": np.array(caget(pv_ts)),
            "ddr_offset": np.array(caget(pv_offset), 'i'),
            "bba_xoffset": np.array(caget(pv_bbaxoff)),
            "bba_yoffset": np.array(caget(pv_bbayoff)),
            "event_code": np.array(caget(pv_evtcode))
        }
    # in case they have difference size
    d = []
    for v in [x, y, Is]:
        nx = max([len(r) for r in v if not isinstance(r, ca_nothing)])
        rec = np.zeros((len(v), nx), 'd')
        for i in range(len(v)):
            rec[i, :len(v[i])] = v[i]
        d.append(rec)
    x, y, Is = d
    # get dcct
    #dcct2 = caget(pv_dcct, count=1000)
    #t1 = datetime.now()

    data = (names, x, y, Is, extdata["ddr_timestamp"], extdata["ddr_offset"])

    if not output: return data

    if output is True:
        # use the default file name
        output_dir = os.path.join(machines.getOutputDir(),
                                  t0.strftime("%Y_%m"), "bpm")
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        fopt = "bpm_%s_%d_" % (waveform, trig_src) + \
            t0.strftime("%Y_%m_%d_%H%M%S.hdf5")
        output = os.path.join(output_dir, fopt)

    t1 = datetime.now()
    # save the data
    _saveSrBpmData(output,
                   waveform,
                   names,
                   x,
                   y,
                   Is,
                   h5group=kwargs.get("h5group", "/"),
                   ts=(t0, t1),
                   pvpref=pvpref,
                   **extdata)
    return data, output
Пример #30
0
def measKickedTbtData(idriver, ampl, **kwargs):
    """
    take turn-by-turn BPM data after kicking the beam.

    Parameters
    -----------
    idriver : int
        which driver used to kick the beam: injection kicker 3(3) or 4(4),
        vertical pinger(5), horizontal pinger(6), both H/V pingers(7).
    ampl : float, tuple
        kicking amplitude.
    bpms : list of element objects.
        provide the BPMs to take data from, default ["BPM" or "UBPM"]
    count : int
        number of turns.
    output : str, True, False
        output file name, or default (True), or no output (False)
    verbose : int

    it will set kicker/pinger and wait 100sec or readback-setpoint agree.

    event code 47 will be used for kicker 3 and 4, 35 used for pingers.

    Same returns as `getSrBpmData`

    Examples
    ---------
    >>> (name, x, y, Isum, ts, offset) = measKickedTbtData(7, (0.15, 0.2))
    >>> (name, x, y, Isum, ts, offset), output = measKickedTbtData(7, (0.15, 0.2), output=True)
    """

    verbose = kwargs.get("verbose", 0)
    output = kwargs.get("output", True)
    sleep = kwargs.get("sleep", 5)
    count = kwargs.get("count", 2000)
    bpms  = [ b for b in kwargs.get("bpms",
                                   getGroupMembers(["BPM", "UBPM"], op="union"))
              if b.isEnabled()]

    bpmstats = getBpmStatus(bpms)

    kpvsp, kpvrb = None, None
    # 0 - both off, 1 - V-on, 2-H-on, 3-both-on
    pv_pinger_mode = "SR:C21-PS{Pinger}Mode:Trig-Sel"
    if idriver in [3,4,5,6]:
        if idriver in [3, 4]:
            kpvsp = 'SR:IS-PS{Kick:%d}V-Sp' % idriver
            kpvrb = 'SR:IS-PS{Kick:%d}Hvps-V-Rb-1st' % idriver
            kpvon = 'SR:IS-PS{Kick:%d}HvpsOnOff_Cmd' % idriver
        elif idriver in [5,]:
            # vertical pinger
            kpvsp = 'SR:C21-PS{Pinger:V}V-Sp'
            kpvrb = 'SR:C21-PS{Pinger:V}Setpoint-Rb.VALA'
            kpvon = 'SR:C21-PS{Pinger:V}HvpsOnOff_Cmd'
            caput(pv_pinger_mode, 1)
        elif idriver in [6,]:
            # horizontal pinger
            kpvsp = 'SR:C21-PS{Pinger:H}V-Sp'
            kpvrb = 'SR:C21-PS{Pinger:H}Setpoint-Rb.VALA'
            kpvon = 'SR:C21-PS{Pinger:H}HvpsOnOff_Cmd'
            caput(pv_pinger_mode, 2)
        #
        caput(kpvsp, 0.0)
        for i in range(100):
            if caget(kpvrb, count=1) < 0.001: break
            time.sleep(1)
        caput(kpvon, 1)
    elif idriver in [7,]:
        # both pinger
        kpvsp = ['SR:C21-PS{Pinger:H}V-Sp', 'SR:C21-PS{Pinger:V}V-Sp']
        kpvrb = ['SR:C21-PS{Pinger:H}Setpoint-Rb.VALA', 'SR:C21-PS{Pinger:V}Setpoint-Rb.VALA']
        kpvon = ['SR:C21-PS{Pinger:H}HvpsOnOff_Cmd', 'SR:C21-PS{Pinger:V}HvpsOnOff_Cmd']
        caput(pv_pinger_mode, 3)
        caput(kpvsp, [0.0, 0.0])
        for i in range(100):
            rb = caget(kpvrb, count=1)
            if rb[0] < 0.001 and rb[1] < 0.001: break
            time.sleep(0.5)
        caput(kpvon, [1, 1])

    # set the kicker/pinger voltage
    caput(kpvsp, ampl, wait=True)
    #(name, x, y, Isum, ts, offset), output = ap.nsls2.getSrBpmData(
    #    trig=1, count=5000, output=True, h5group="k_%d" % idriver)
    h5g = "k_%d" % idriver
    Idcct0 = caget('SR:C03-BI{DCCT:1}I:Total-I')
    time.sleep(sleep)

    # request an injection:
    if idriver in [3,4,]:
        resetSrBpm(bpms=bpms, evcode=47)
        time.sleep(1)
        caput('ACC-TS{EVG-SSC}Request-Sel', 1)
    elif idriver in [5,6,7]:
        resetSrBpms(bpms=bpms, evcode=35)
        # do it twice
        caput('SR:C21-PS{Pinger}Ping-Cmd', 1)
        time.sleep(1)
        caput('SR:C21-PS{Pinger}Ping-Cmd', 1)
    time.sleep(2)
    Idcct1 = caget('SR:C03-BI{DCCT:1}I:Total-I')
    bpmdata = getSrBpmData(trig=1, bpms=bpms, count=count,
                           output=output, h5group=h5g)
    # record pinger wave, V-chan1, H-chan2
    pinger_delay, pinger_wave, pinger_mode = None, None, None
    if idriver in [5,6,7]:
        pinger_wave = caget(["SR:C21-PS{Dig:Png1}TimeScale-I",
                             "SR:C21-PS{Dig:Png1}Data:Chan2-I",
                             "SR:C21-PS{Dig:Png1}Data:Chan1-I"])
        pinger_delay = caget(["SR:C21-PS{Pinger:H}Delay-SP",
                              "SR:C21-PS{Pinger:V}Delay-SP"])
        pinger_mode = caget("SR:C21-PS{Pinger}Mode:Trig-Sts")
        
    # repeat_value=True
    caput(kpvon, 0)
    caput(kpvsp, 0.0)
    
    if output:
        (name, x, y, Isum, ts, offset), output = bpmdata
        
        f = h5py.File(output)
        g = f[h5g]
        g["I"]  = Idcct1
        g["I"].attrs["dI"] = Idcct1 - Idcct0
        g["RF_SP"] = float(caget('RF{Osc:1}Freq:SP'))
        g["RF_I"]  = float(caget('RF{Osc:1}Freq:I'))
        g.attrs["ampl"]  = ampl
        g.attrs["idriver"] = idriver
        g.attrs["pvsp"] = kpvsp
        g.attrs["pvrb"] = kpvrb
        g.attrs["pvon"] = kpvon
        if pinger_wave is not None:
            g["pinger_wave"] = np.array(pinger_wave, 'd').transpose()
        if pinger_delay is not None:
            g["pinger_delay"] = pinger_delay
        if pinger_mode is not None:
            g["pinger_mode"] = pinger_mode
        f.close()

    # restore
    restoreBpmStatus(bpmstats)

    return bpmdata
Пример #31
0
def correctBrOrbit(kker, m, **kwarg):
    """correct the resp using kker and response matrix.

    Parameters
    ------------
    kker : PV list of the controllers, e.g. corrector
    m : response matrix where :math:`m_{ij}=\Delta orbit_i/\Delta kker_j`
    scale : scaling factor applied to the calculated kker
    ref : the targeting value of orbit
    rcond : the rcond for cutting singular values. 
    check : stop if the orbit gets worse.
    wait : waiting (seconds) before check.

    Returns
    --------
    err : converged or not checked (0), error (>0).
    msg : error message or None

    """
    scale = kwarg.get('scale', 0.68)
    ref   = kwarg.get('ref', None)
    check = kwarg.get('check', True)
    wait  = kwarg.get('wait', 6)
    rcond = kwarg.get('rcond', 1e-2)
    verb  = kwarg.get('verbose', 0)
    bc    = kwarg.get('bc', None)
    wfmslice = kwarg.get("wfmslice", (10, 100))
    wfm   = kwarg.pop("waveform", "Fa")
    exrows = kwarg.pop("exclude_rows", [])
    test = kwarg.pop("test", False)
    #u, s, v = np.linalg.svd(m)
    #plt.semilogy(s/s[0], 'x-')
    #plt.show()
    
    i0, i1 = wfmslice
    nbpm, ncor = np.shape(m)
    mask_row = np.ones(nbpm, 'i')
    for i in exrows: mask_row[i] = 0
    m = np.compress(mask_row, m, axis=0)

    print "New m shape:", np.shape(m)

    name, x0, y0, Isum0, ts, offset = getBrBpmData(waveform=wfm, trig=0)

    # save initial orbit in vx0
    vl0 = np.compress(mask_row, np.vstack((x0, y0)), axis=0)
    v0 = np.average(vl0[:,i0:i1], axis=1)
    if np.max(v0) > 10000 or np.min(v0) < -10000:
        plt.plot(v0)
        plt.show()
        raise RuntimeError("orbit is not stable, too large: %.2f, %.2f" % (
                np.min(v0), np.max(v0)))

    if ref is not None: v0 = v0 - ref
    if len(v0) != len(m):
        raise RuntimeError("inconsistent BPM and ORM size")
    
    # the initial norm
    norm0 = np.linalg.norm(v0)

    # solve for m*dk + (v0 - ref) = 0
    dk, resids, rank, s = np.linalg.lstsq(m, -1.0*v0, rcond = rcond)

    norm1 = np.linalg.norm(m.dot(dk*scale) + v0)

    # get the DC kicker
    kl0 = np.array(caget(kker), 'd')
    k0 = np.average(kl0, axis=1)
    print np.shape(kl0)
    #print k0, dk, scale
    k1 = k0 + dk*scale
    vk1 = [[k] * len(kl0[i]) for i,k in enumerate(k1)]
    plt.plot(k0, 'r-', label="initial")
    plt.plot(k1, 'b-', label="new")
    plt.legend()
    plt.show()
    if not test:
        caput(kker, vk1, wait=True)
    else:
        for i,pv in enumerate(kker):
            print i, pv, k1[i], "dk=", dk[i]

    time.sleep(wait)
    name, x1, y1, Isum1, ts, offset = getBrBpmData(waveform=wfm, trig=0)

    vl1 = np.compress(mask_row, np.vstack((x1, y1)), axis=0)
    v1 = np.average(vl1[:,i0:i1], axis=1)

    print norm0, "predicted norm= ", norm1, "realized:", np.linalg.norm(v1)

    return v0, v1, k0, k1
Пример #32
0
def measBrCaRmCol(kker, **kwargs):
    """measure the response matrix column between PVs (DC)

    kker - SP PV for corrector (waveform)
    waveform - "Fa" or "Tbt"
    timeout - 6 sec, EPICS CA timeout
    npoints - number of orbits for each kick.
    dxlst - a list of kick (raw unit), overwrite the choice of dxmax
    dxmax - range of kick [-dxmax, dxmax]
    ndx - default 4. Specify kicks in [-dxmax, dxmax].
    wait - default 1.5 second
    output - save the results
    verbose - default 0

    return the output file name. The output will be in HDF5 file format.
    """
    timeout = kwargs.pop("timeout", 6)
    wait    = kwargs.pop("wait", 1.5)
    verbose = kwargs.pop("verbose", 0)
    npt     = kwargs.pop("npoints", 4)
    wfm     = kwargs.pop("waveform", "Fa")
    
    t0 = datetime.now()
    dxlst, x0 = [], np.array(caget(kker, timeout=timeout), 'd')
    if "dxlst" in kwargs:
        dxlst = kwargs.get("dxlst")
    elif "dxmax" in kwargs:
        dxmax = np.abs(kwargs.get("dxmax"))
        nx    = kwargs.pop("ndx", 4)
        dxlst = list(np.linspace(-dxmax, dxmax, nx))
    else:
        raise RuntimeError("need input for at least of the parameters: "
                           "dxlst, xlst, dxmax")

    # use the provided filename or default datetimed filename
    output_file = kwargs.pop(
        "output",
        os.path.join(machines.getOutputDir(),
                     t0.strftime("%Y_%m"),
                     "orm",
                     t0.strftime("orm_%Y_%m_%d_%H%M%S.hdf5")))

    # save dx list
    h5f = h5py.File(output_file)
    grp = h5f.create_group(kker)
    grp.attrs["orm_t0"] = t0.strftime("%Y_%m_%d_%H:%M:%S.%f")
    grp["dxlst"] = dxlst
    h5f.close()
    
    # save the initial orbit
    getBrBpmData(waveform=wfm,
                 verbose=verbose-1,
                 output_file=output_file,
                 h5group="%s/%s0" % (kker, wfm),
                 **kwargs)
    
    n1 = len(dxlst)
    for i,dx in enumerate(dxlst):
        if verbose > 0:
            print "%d/%d: Setting %s " % (i, n1, kker), dx
            sys.stdout.flush()
        try:
            nx0 = len(x0)
            xi = [x0i + dx for x0i in x0]
        except:
            # should never happen for booster
            xi = x0 + dx
        caput(kker, xi, wait=True, timeout=timeout)
        time.sleep(wait*3)
        for j in range(npt):
            obt, fname = getBrBpmData(
                waveform=wfm, verbose=verbose-1,
                output_file=output_file,
                h5group="%s/%s_dx%d__pt%d" % (kker, wfm, i, j),
                **kwargs)    
            if verbose > 1:
                name, x, y, Is, ts, ddroffset = obt
                print "  %d/%d" % (j,npt), np.average(x[0]), np.std(x[0])
                sys.stdout.flush()
            time.sleep(wait)
        time.sleep(wait)

    caput(kker, x0, wait=True, timeout=timeout)
    
    t1 = datetime.now()

    h5f = h5py.File(output_file)
    h5f[kker].attrs["orm_t1"] = t1.strftime("%Y_%m_%d_%H:%M:%S.%f")
    h5f.close()
    return output_file
Пример #33
0
def compareLattice(*argv, **kwargs):
    """
    - group, HDF5 file group, default lattice name
    - sponly, True, compare only the setpoint PVs
    - elements, None, or a list of family names ["QUAD"]
    - ignore, regular expression

    returns same and diff. Each is a list of (pv, values).

    >>> same, diff = compareLattice("file1.hdf5", elements=["QUAD"])
    >>> sm, df = compareLattice("file1.hdf5", elements=["COR", "BPM", "UBPM"])
    >>> sm, df = compareLattice("file1.hdf5", sponly=True)
    >>> sm, df = compareLattice("file1.hdf5", sponly=True, ignore=["SR:.+BPM.*Ampl.*"])
    """
    group = kwargs.get("group", machines._lat.name)
    sponly = kwargs.get("sponly", False)
    elements = kwargs.get("elements", None)
    ignore = kwargs.get("ignore", None)

    # filter the PVs
    if elements is not None:
        pvlst = []
        for fam in elements:
            for e in machines._lat.getElementList(fam):
                pvlst.extend(e.pv())
    else:
        pvlst = None

    dat = {}
    nset = len(argv)
    import h5py
    for i,fname in enumerate(argv):
        h5f = h5py.File(fname, 'r')
        g = h5f[group]
        for pv,val in g.items():
            if pvlst is not None and pv not in pvlst:
                continue
            if sponly and val.attrs.get("setpoint", 0) != 1:
                continue
            if ignore and any([re.match(p,pv) for p in ignore]):
                continue
            dat.setdefault(pv, [])
            if g[pv].dtype in ['float64']:
                dat[pv].append(float(val.value))
            elif g[pv].dtype in ['int32', 'int64']:
                dat[pv].append(int(val.value))
            else:
                print "unknown {0} data type: {1}, value: {2}".format(
                    pv, g[pv].dtype, g[pv].value)
        h5f.close()
    if len(dat) > 0 and kwargs.get("withlive", False):
        pvs = dat.keys()
        vals = caget(pvs)
        for i,pv in enumerate(pvs):
            dat[pv].insert(0, vals[i])
        nset = nset + 1

    same, diff = [], []
    i = 0
    for pv,vals in dat.items():
        i = i + 1
        if len(vals) < nset:
            diff.append([pv, vals])
        elif all([v == vals[0] for v in vals[1:]]):
            same.append([pv, vals])
            continue
        else:
            diff.append([pv, vals])
        #print i, pv, vals
    return same, diff
Пример #34
0
def _srBpmTrigData(pvprefs, waveform, **kwargs):
    """
    """
    offset = kwargs.pop("offset", 0)
    sleep = kwargs.pop("sleep", 0.5)
    count = kwargs.pop("count", 0)
    tc = kwargs.get("timeout", 6)
    verbose = kwargs.get("verbose", 0)

    t0 = datetime.now()

    # prepare the triggers
    pv_evg = "SR-BI{BPM}Evt:Single-Cmd"
    pv_trig = []
    pv_wfmsel, pv_adcwfm, pv_tbtwfm, pv_fawfm = [], [], [], []
    pv_adcoffset, pv_tbtoffset, pv_faoffset = [], [], []
    # available data points
    pv_adclen, pv_tbtlen, pv_falen = [], [], []
    # available data points in CA
    pv_adccalen, pv_tbtcalen, pv_facalen = [], [], []
    #
    pv_bbaxoff, pv_bbayoff = [], []
    pv_ddrts = []  # timestamp
    pv_ts, pv_tsns = [], []  # timestamp second and nano sec
    pv_trigts, pv_trigtsns = [], []  # trigger timestamp
    pv_ddrtx = []  # DDR transfer busy
    pv_evtcode = []
    # did not consider the 'ddrTbtWfEnable' PV
    for i, pvx in enumerate(pvprefs):
        #print bpm.name, pvh, caget(pvh)
        #
        pv_bbaxoff.append(pvx + "BbaXOff-SP")
        pv_bbayoff.append(pvx + "BbaYOff-SP")
        #
        pv_trig.append(pvx + "Trig:TrigSrc-SP")
        pv_wfmsel.append(pvx + "DDR:WfmSel-SP")
        pv_ddrts.append(pvx + "TS:DdrTrigDate-I")
        #pv_adcwfm.append(pvx + "ddrAdcWfEnable")
        #pv_tbtwfm.append(pvx + "ddrTbtWfEnable")
        #pv_fawfm.append( pvx + "ddrFaWfEnable")
        #
        pv_adcoffset.append(pvx + "ddrAdcOffset")
        pv_tbtoffset.append(pvx + "ddrTbtOffset")
        pv_faoffset.append(pvx + "ddrFaOffset")
        pv_trigts.append(pvx + "Trig:TsSec-I")
        pv_trigtsns.append(pvx + "Trig:TsOff-I")
        #
        pv_adclen.append(pvx + "Burst:AdcEnableLen-SP")
        pv_tbtlen.append(pvx + "Burst:TbtEnableLen-SP")
        pv_falen.append(pvx + "Burst:FaEnableLen-SP")
        #
        pv_adccalen.append(pvx + "ERec:AdcEnableLen-SP")
        pv_tbtcalen.append(pvx + "ERec:TbtEnableLen-SP")
        pv_facalen.append(pvx + "ERec:FaEnableLen-SP")

        pv_ddrtx.append(pvx + "DDR:TxStatus-I")
        pv_evtcode.append(pvx + "Trig:EventNo-I")

    # save initial val
    wfsel0 = caget(pv_wfmsel, timeout=tc)
    trig0 = caget(pv_trig, timeout=tc)

    # set the trigger internal, TBT waveform
    prf = ""
    if waveform == "Adc":
        caput(pv_wfmsel, 0, wait=True)
        #caput(pv_adcwfm, 1, wait=True)
        caput(pv_adcoffset, 0, wait=True)
        pv_ddroffset = pv_adcoffset
        prf = ""
    elif waveform == "Tbt":
        caput(pv_wfmsel, 1, wait=True)
        #caput(pv_tbtwfm, 1, wait=True)
        caput(pv_tbtoffset, 0, wait=True)
        pv_ddroffset = pv_tbtoffset
        prf = "TBT"
    elif waveform == "Fa":
        caput(pv_wfmsel, 2, wait=True)
        #caput(pv_fawfm,  1, wait=True)
        caput(pv_faoffset, 0, wait=True)
        pv_ddroffset = pv_faoffset
        prf = "FA"
    else:
        raise RuntimeError("unknow waveform '%s'" % waveform)

    pv_x, pv_y, pv_S = [], [], []
    pv_A, pv_B, pv_C, pv_D = [], [], [], []
    for i, pvx in enumerate(pvprefs):
        pv_x.append(pvx + "%s-X" % prf)
        pv_y.append(pvx + "%s-Y" % prf)
        pv_S.append(pvx + "%s-S" % prf)
        pv_A.append(pvx + "%s-A" % prf)
        pv_B.append(pvx + "%s-B" % prf)
        pv_C.append(pvx + "%s-C" % prf)
        pv_D.append(pvx + "%s-D" % prf)

    # set 0 - internal trig, 1 - external trig
    caput(pv_trig, 0, wait=True, timeout=tc)

    # set the event
    caput(pv_evg, 1, wait=True)

    time.sleep(1.2)

    # check timestamp
    n = 0
    while any(caget(pv_ddrtx, timeout=tc)) and n < 20:
        time.sleep(0.5)
        n += 1
    tss_r = caget(pv_trigts, timeout=tc)
    tss = [t - min(tss_r) for t in tss_r]
    tsns = caget(pv_trigtsns, timeout=tc)
    ts = [s * 1e9 + tsns[i] for i, s in enumerate(tss)]
    mdt = max(ts) - min(ts)
    if mdt > 8.0:
        raise RuntimeError("BPMs are not ready after {0} trials, dt={1}: "
                           "{2}\n{3}".format(n, mdt, ts, caget(pv_ddrtx)))

    if verbose > 0:
        print "Trials: %d, Trig=%.2e ns." % (n, mdt)
        print "Sec:", tss_r
        print "dSec: ", [s - min(tss) for s in tss]
        print "dNsec:", [s - min(tsns) for s in tsns]
        print "NSec", tsns

    # redundent check
    #ddrts0 = caget(pv_ddrts)
    ddrts0 = [
        datetime.fromtimestamp(v).strftime("%m/%d/%Y,%H:%M:%S") +
        ".%09d" % tsns[i] for i, v in enumerate(tss_r)
    ]
    ddroffset = caget(pv_ddroffset, timeout=tc)
    data = (caget(pv_x,
                  count=count), caget(pv_y,
                                      count=count), caget(pv_S, count=count))
    xbbaofst = caget(pv_bbaxoff, timeout=tc)
    ybbaofst = caget(pv_bbayoff, timeout=tc)
    #
    # set 0 - internal trig, 1 - external trig
    #caput(pv_trig, 1, wait=True)
    caput(pv_wfmsel, wfsel0, wait=True, timeout=tc)
    caput(pv_trig, trig0, wait=True, timeout=tc)
    ext_data = {
        "ddr_timestamp": ddrts0,
        "ddr_offset": ddroffset,
        "bba_xoffset": xbbaofst,
        "bba_yoffset": ybbaofst,
        "event_code": caget(pv_evtcode)
    }
    #return data[0], data[1], data[2], ddrts0, ddroffset, ts
    return (data[0], data[1], data[2], ext_data)
Пример #35
0
def getSrBpmData(**kwargs):
    """
    NSLS-II SR BPM data acquisition.

    Parameters
    -----------
    trig : int, optional
        Internal(0) or external(1) trigger.
    verbose : int
    waveform : str
        Waveform selection: ``"Tbt"``, ``"Fa"``
    bpms : list
        A list of BPM object.
    name : str
        BPM name or pattern, overwritten by parameter *bpms*
    count : int
        Waveform length. default all (0).
    output : str, True, False
        output file name, or default name (True), or no output (False).
    h5group : str
        output HDF5 group

    Returns
    --------
    name : list
        a list of BPM name
    x : array (nbpm, count)
        x orbit, shape (nbpm, waveform_length).
    y : array (nbpm, count)
        y orbit
    Isum : array (nbpm, count)
        Sum signal
    timestamp : list
    offset : list
        offset from the FPGA buffer.

    There will be warning if timestamp differs more than 1 second
    """
    trig_src = kwargs.get("trig", 0)
    verbose  = kwargs.get("verbose", 0)
    waveform = kwargs.pop("waveform", "Tbt")
    name     = kwargs.pop("bpms", kwargs.pop("name", "BPM"))
    count    = kwargs.get("count", 0)
    #timeout  = kwargs.get("timeout", 6)
    output   = kwargs.get("output", None)

    lat = machines.getLattice()
    if lat.name != "SR":
        raise RuntimeError("the current lattice is not 'BR': %s" % lat.name)

    t0 = datetime.now()

    #pv_dcct = "BR-BI{DCCT:1}I-Wf"
    #dcct1 = caget(pv_dcct, count=1000)
    elems = [e for e in getElements(name) if e.pv(field="x")]
    pvpref = [bpm.pv(field="x")[0].replace("Pos:XwUsrOff-Calc", "")
              for bpm in elems]
    names = [bpm.name for bpm in elems]

    if trig_src == 0 and waveform in ["Tbt", "Fa"]:
        # internal trig
        # ret = _srBpmTrigData(pvpref, waveform, **kwargs)
        # x, y, Is, ts, offset, xbbaofst, ybbaofst, extdata = ret
        x, y, Is, extdata = _srBpmTrigData(pvpref, waveform, **kwargs)
    else:
        if waveform == "Tbt":
            pv_x = [pv + "TBT-X" for pv in pvpref]
            pv_y = [pv + "TBT-Y" for pv in pvpref]
            pv_S = [pv + "TBT-S" for pv in pvpref]
            pv_offset = [pv + "ddrTbtOffset" for pv in pvpref]
        elif waveform == "Fa":
            pv_x = [pv + "FA-X" for pv in pvpref]
            pv_y = [pv + "FA-Y" for pv in pvpref]
            pv_S = [pv + "FA-S" for pv in pvpref]
            pv_offset = [pv + "ddrFaOffset" for pv in pvpref]

        pv_ts = [pv + "TS:DdrTrigDate-I" for pv in pvpref]
        pv_bbaxoff = [ pv + "BbaXOff-SP" for pv in pvpref]
        pv_bbayoff = [ pv + "BbaYOff-SP" for pv in pvpref]
        pv_evtcode = [ pv + "Trig:EventNo-I" for pv in pvpref]

        x  = caget(pv_x, count=count, throw=False)
        y  = caget(pv_y, count=count, throw=False)
        Is = caget(pv_S, count=count, throw=False)
        # check srBpmTrigData, key must agrees
        extdata = {
            "ddr_timestamp": np.array(caget(pv_ts)),
            "ddr_offset": np.array(caget(pv_offset), 'i'),
            "bba_xoffset": np.array(caget(pv_bbaxoff)),
            "bba_yoffset": np.array(caget(pv_bbayoff)),
            "event_code": np.array(caget(pv_evtcode))}
    # in case they have difference size
    d = []
    for v in [x, y, Is]:
        nx = max([len(r) for r in v if not isinstance(r, ca_nothing)])
        rec = np.zeros((len(v), nx), 'd')
        for i in range(len(v)):
            rec[i,:len(v[i])] = v[i]
        d.append(rec)
    x, y, Is = d
    # get dcct
    #dcct2 = caget(pv_dcct, count=1000)
    #t1 = datetime.now()

    data = (names, x, y, Is, extdata["ddr_timestamp"], extdata["ddr_offset"])

    if not output: return data
    
    if output is True:
        # use the default file name
        output_dir = os.path.join(machines.getOutputDir(),
                                  t0.strftime("%Y_%m"),
                                  "bpm")
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        fopt = "bpm_%s_%d_" % (waveform, trig_src) + \
            t0.strftime("%Y_%m_%d_%H%M%S.hdf5")
        output = os.path.join(output_dir, fopt)

    t1 = datetime.now()
    # save the data
    _saveSrBpmData(output, waveform, names, x, y, Is,
                   h5group=kwargs.get("h5group", "/"),
                   ts = (t0, t1),
                   pvpref = pvpref,
                   **extdata)
    return data, output
Пример #36
0
def getBrBpmData(**kwargs):
    """
    timeout - 6sec
    sleep - 4sec
    output - True, use default file name, str - user specified filename

    returns name, x, y, Isum, timestamp, offset

    There will be warning if timestamp differs more than 1 second
    """
    trig_src = kwargs.get("trig", 0)
    verbose  = kwargs.get("verbose", 0)
    waveform = kwargs.pop("waveform", "Tbt")
    name     = kwargs.pop("name", "BPM")
    #timeout  = kwargs.get("timeout", 6)

    lat = machines.getLattice()
    if lat.name != "BR":
        raise RuntimeError("the current lattice is not 'BR': %s" % lat.name)

    t0 = datetime.now()

    pv_dcct = "BR-BI{DCCT:1}I-Wf"
    dcct1 = caget(pv_dcct, count=1000)

    pvpref = [bpm.pv(field="x")[0].replace("Pos:X-I", "")
              for bpm in getElements(name)]
    names = [bpm.name for bpm in getElements(name)]

    if trig_src == 0 and waveform in ["Tbt", "Fa"]:
        ret = _brBpmTrigData(pvpref, waveform, **kwargs)
        x, y, Is, ts, offset = ret
    else:
        if waveform == "Tbt":
            pv_x = [pv + "TBT-X" for pv in pvpref]
            pv_y = [pv + "TBT-Y" for pv in pvpref]
            pv_S = [pv + "TBT-S" for pv in pvpref]
            pv_offset = [pv + "ddrTbtOffset" for pv in pvpref]
        elif waveform == "Fa":
            pv_x = [pv + "FA-X" for pv in pvpref]
            pv_y = [pv + "FA-Y" for pv in pvpref]
            pv_S = [pv + "FA-S" for pv in pvpref]
            pv_offset = [pv + "ddrFaOffset" for pv in pvpref]

        pv_ts = [pv + "TS:DdrTrigDate-I" for pv in pvpref]
        x  = np.array(caget(pv_x), 'd')
        y  = np.array(caget(pv_y), 'd') 
        Is = np.array(caget(pv_S), 'd')
        ts = caget(pv_ts)
        offset = caget(pv_offset)

    # get dcct
    dcct2 = caget(pv_dcct, count=1000)
    t1 = datetime.now()

    data = (names, x, y, Is, ts, offset)

    if kwargs.get("output", None):
        # default output dir and file
        output_file = kwargs["output"]
        if output_file is True:
            # use the default file name
            output_dir = os.path.join(machines.getOutputDir(),
                                      t0.strftime("%Y_%m"),
                                      "bpm")
            if not os.path.exists(output_dir):
                os.makedirs(output_dir)
            fopt = "bpm_%s_%d_" % (waveform, trig_src) + \
                t0.strftime("%Y_%m_%d_%H%M%S.hdf5")
            output_file = os.path.join(output_dir, fopt)

        # save the data
        _saveBrBpmData(output_file, waveform, data,
                       h5group=kwargs.get("h5group", "/"),
                       dcct_data = (dcct1, dcct2),
                       ts = (t0, t1),
                       pvpref = pvpref)
        return data, output_file
    else:
        return data
Пример #37
0
def measBrCaRmCol(kker, **kwargs):
    """measure the response matrix column between PVs (DC)

    kker - SP PV for corrector (waveform)
    waveform - "Fa" or "Tbt"
    timeout - 6 sec, EPICS CA timeout
    npoints - number of orbits for each kick.
    dxlst - a list of kick (raw unit), overwrite the choice of dxmax
    dxmax - range of kick [-dxmax, dxmax]
    ndx - default 4. Specify kicks in [-dxmax, dxmax].
    wait - default 1.5 second
    output - save the results
    verbose - default 0

    return the output file name. The output will be in HDF5 file format.
    """
    timeout = kwargs.pop("timeout", 6)
    wait = kwargs.pop("wait", 1.5)
    verbose = kwargs.pop("verbose", 0)
    npt = kwargs.pop("npoints", 4)
    wfm = kwargs.pop("waveform", "Fa")

    t0 = datetime.now()
    dxlst, x0 = [], np.array(caget(kker, timeout=timeout), 'd')
    if "dxlst" in kwargs:
        dxlst = kwargs.get("dxlst")
    elif "dxmax" in kwargs:
        dxmax = np.abs(kwargs.get("dxmax"))
        nx = kwargs.pop("ndx", 4)
        dxlst = list(np.linspace(-dxmax, dxmax, nx))
    else:
        raise RuntimeError("need input for at least of the parameters: "
                           "dxlst, xlst, dxmax")

    # use the provided filename or default datetimed filename
    output_file = kwargs.pop(
        "output",
        os.path.join(machines.getOutputDir(), t0.strftime("%Y_%m"), "orm",
                     t0.strftime("orm_%Y_%m_%d_%H%M%S.hdf5")))

    # save dx list
    h5f = h5py.File(output_file)
    grp = h5f.create_group(kker)
    grp.attrs["orm_t0"] = t0.strftime("%Y_%m_%d_%H:%M:%S.%f")
    grp["dxlst"] = dxlst
    h5f.close()

    # save the initial orbit
    getBrBpmData(waveform=wfm,
                 verbose=verbose - 1,
                 output_file=output_file,
                 h5group="%s/%s0" % (kker, wfm),
                 **kwargs)

    n1 = len(dxlst)
    for i, dx in enumerate(dxlst):
        if verbose > 0:
            print "%d/%d: Setting %s " % (i, n1, kker), dx
            sys.stdout.flush()
        try:
            nx0 = len(x0)
            xi = [x0i + dx for x0i in x0]
        except:
            # should never happen for booster
            xi = x0 + dx
        caput(kker, xi, wait=True, timeout=timeout)
        time.sleep(wait * 3)
        for j in range(npt):
            obt, fname = getBrBpmData(waveform=wfm,
                                      verbose=verbose - 1,
                                      output_file=output_file,
                                      h5group="%s/%s_dx%d__pt%d" %
                                      (kker, wfm, i, j),
                                      **kwargs)
            if verbose > 1:
                name, x, y, Is, ts, ddroffset = obt
                print "  %d/%d" % (j, npt), np.average(x[0]), np.std(x[0])
                sys.stdout.flush()
            time.sleep(wait)
        time.sleep(wait)

    caput(kker, x0, wait=True, timeout=timeout)

    t1 = datetime.now()

    h5f = h5py.File(output_file)
    h5f[kker].attrs["orm_t1"] = t1.strftime("%Y_%m_%d_%H:%M:%S.%f")
    h5f.close()
    return output_file
Пример #38
0
def measKickedTbtData(idriver, ampl, **kwargs):
    """
    take turn-by-turn BPM data after kicking the beam.

    Parameters
    -----------
    idriver : int
        which driver used to kick the beam: injection kicker 3(3) or 4(4),
        vertical pinger(5), horizontal pinger(6), both H/V pingers(7).
    ampl : float, tuple
        kicking amplitude.
    bpms : list of element objects.
        provide the BPMs to take data from, default ["BPM" or "UBPM"]
    count : int
        number of turns.
    output : str, True, False
        output file name, or default (True), or no output (False)
    verbose : int

    it will set kicker/pinger and wait 100sec or readback-setpoint agree.

    event code 47 will be used for kicker 3 and 4, 35 used for pingers.

    Same returns as `getSrBpmData`

    Examples
    ---------
    >>> (name, x, y, Isum, ts, offset) = measKickedTbtData(7, (0.15, 0.2))
    >>> (name, x, y, Isum, ts, offset), output = measKickedTbtData(7, (0.15, 0.2), output=True)
    """

    verbose = kwargs.get("verbose", 0)
    output = kwargs.get("output", True)
    sleep = kwargs.get("sleep", 5)
    count = kwargs.get("count", 2000)
    bpms = [
        b for b in kwargs.get("bpms",
                              getGroupMembers(["BPM", "UBPM"], op="union"))
        if b.isEnabled()
    ]

    bpmstats = getBpmStatus(bpms)

    kpvsp, kpvrb = None, None
    # 0 - both off, 1 - V-on, 2-H-on, 3-both-on
    pv_pinger_mode = "SR:C21-PS{Pinger}Mode:Trig-Sel"
    if idriver in [3, 4, 5, 6]:
        if idriver in [3, 4]:
            kpvsp = 'SR:IS-PS{Kick:%d}V-Sp' % idriver
            kpvrb = 'SR:IS-PS{Kick:%d}Hvps-V-Rb-1st' % idriver
            kpvon = 'SR:IS-PS{Kick:%d}HvpsOnOff_Cmd' % idriver
        elif idriver in [
                5,
        ]:
            # vertical pinger
            kpvsp = 'SR:C21-PS{Pinger:V}V-Sp'
            kpvrb = 'SR:C21-PS{Pinger:V}Setpoint-Rb.VALA'
            kpvon = 'SR:C21-PS{Pinger:V}HvpsOnOff_Cmd'
            caput(pv_pinger_mode, 1)
        elif idriver in [
                6,
        ]:
            # horizontal pinger
            kpvsp = 'SR:C21-PS{Pinger:H}V-Sp'
            kpvrb = 'SR:C21-PS{Pinger:H}Setpoint-Rb.VALA'
            kpvon = 'SR:C21-PS{Pinger:H}HvpsOnOff_Cmd'
            caput(pv_pinger_mode, 2)
        #
        caput(kpvsp, 0.0)
        for i in range(100):
            if caget(kpvrb, count=1) < 0.001: break
            time.sleep(1)
        caput(kpvon, 1)
    elif idriver in [
            7,
    ]:
        # both pinger
        kpvsp = ['SR:C21-PS{Pinger:H}V-Sp', 'SR:C21-PS{Pinger:V}V-Sp']
        kpvrb = [
            'SR:C21-PS{Pinger:H}Setpoint-Rb.VALA',
            'SR:C21-PS{Pinger:V}Setpoint-Rb.VALA'
        ]
        kpvon = [
            'SR:C21-PS{Pinger:H}HvpsOnOff_Cmd',
            'SR:C21-PS{Pinger:V}HvpsOnOff_Cmd'
        ]
        caput(pv_pinger_mode, 3)
        caput(kpvsp, [0.0, 0.0])
        for i in range(100):
            rb = caget(kpvrb, count=1)
            if rb[0] < 0.001 and rb[1] < 0.001: break
            time.sleep(0.5)
        caput(kpvon, [1, 1])

    # set the kicker/pinger voltage
    caput(kpvsp, ampl, wait=True)
    #(name, x, y, Isum, ts, offset), output = ap.nsls2.getSrBpmData(
    #    trig=1, count=5000, output=True, h5group="k_%d" % idriver)
    h5g = "k_%d" % idriver
    Idcct0 = caget('SR:C03-BI{DCCT:1}I:Total-I')
    time.sleep(sleep)

    # request an injection:
    if idriver in [
            3,
            4,
    ]:
        resetSrBpm(bpms=bpms, evcode=47)
        time.sleep(1)
        caput('ACC-TS{EVG-SSC}Request-Sel', 1)
    elif idriver in [5, 6, 7]:
        resetSrBpms(bpms=bpms, evcode=35)
        # do it twice
        caput('SR:C21-PS{Pinger}Ping-Cmd', 1)
        time.sleep(1)
        caput('SR:C21-PS{Pinger}Ping-Cmd', 1)
    time.sleep(2)
    Idcct1 = caget('SR:C03-BI{DCCT:1}I:Total-I')
    bpmdata = getSrBpmData(trig=1,
                           bpms=bpms,
                           count=count,
                           output=output,
                           h5group=h5g)
    # record pinger wave, V-chan1, H-chan2
    pinger_delay, pinger_wave, pinger_mode = None, None, None
    if idriver in [5, 6, 7]:
        pinger_wave = caget([
            "SR:C21-PS{Dig:Png1}TimeScale-I",
            "SR:C21-PS{Dig:Png1}Data:Chan2-I",
            "SR:C21-PS{Dig:Png1}Data:Chan1-I"
        ])
        pinger_delay = caget(
            ["SR:C21-PS{Pinger:H}Delay-SP", "SR:C21-PS{Pinger:V}Delay-SP"])
        pinger_mode = caget("SR:C21-PS{Pinger}Mode:Trig-Sts")

    # repeat_value=True
    caput(kpvon, 0)
    caput(kpvsp, 0.0)

    if output:
        (name, x, y, Isum, ts, offset), output = bpmdata

        f = h5py.File(output)
        g = f[h5g]
        g["I"] = Idcct1
        g["I"].attrs["dI"] = Idcct1 - Idcct0
        g["RF_SP"] = float(caget('RF{Osc:1}Freq:SP'))
        g["RF_I"] = float(caget('RF{Osc:1}Freq:I'))
        g.attrs["ampl"] = ampl
        g.attrs["idriver"] = idriver
        g.attrs["pvsp"] = kpvsp
        g.attrs["pvrb"] = kpvrb
        g.attrs["pvon"] = kpvon
        if pinger_wave is not None:
            g["pinger_wave"] = np.array(pinger_wave, 'd').transpose()
        if pinger_delay is not None:
            g["pinger_delay"] = pinger_delay
        if pinger_mode is not None:
            g["pinger_mode"] = pinger_mode
        f.close()

    # restore
    restoreBpmStatus(bpmstats)

    return bpmdata
Пример #39
0
def _brBpmTrigData(pvprefs, waveform, **kwargs):
    """
    """
    offset = kwargs.pop("offset", 0)
    sleep  = kwargs.pop("sleep", 0.5)
    tc = kwargs.get("timeout", 6)
    verbose = kwargs.get("verbose", 0)

    t0 = datetime.now()

    # prepare the triggers
    pv_evg = "BR-BI{BPM}Evt:Single-Cmd"
    pv_trig = []
    pv_wfmsel, pv_adcwfm, pv_tbtwfm, pv_fawfm = [], [], [], []
    pv_adcoffset, pv_tbtoffset, pv_faoffset = [], [], []
    pv_ddrts = [] # timestamp
    pv_ts, pv_tsns = [], [] # timestamp second and nano sec
    pv_trigts, pv_trigtsns = [], [] # trigger timestamp
    # did not consider the 'ddrTbtWfEnable' PV
    for i,pvx in enumerate(pvprefs):
        #print bpm.name, pvh, caget(pvh)
        pv_trig.append(  pvx + "Trig:TrigSrc-SP")
        pv_wfmsel.append(pvx + "DDR:WfmSel-SP")
        pv_ddrts.append( pvx + "TS:DdrTrigDate-I")
        pv_adcwfm.append(pvx + "ddrAdcWfEnable")
        pv_tbtwfm.append(pvx + "ddrTbtWfEnable")
        pv_fawfm.append( pvx + "ddrFaWfEnable")
        #
        pv_adcoffset.append(pvx + "ddrAdcOffset")
        pv_tbtoffset.append(pvx + "ddrTbtOffset")
        pv_faoffset.append( pvx + "ddrFaOffset")
        pv_ts.append(  pvx + "Trig:TsSec-I")
        pv_tsns.append(pvx + "Trig:TsOff-I")
        pv_trigts.append(  pvx + "Trig:TsSec-I")
        pv_trigtsns.append(pvx + "Trig:TsOff-I")
        #

    # save initial val
    wfsel0   = caget(pv_wfmsel, timeout=tc)
    trig0 = caget(pv_trig, timeout=tc)

    # set the trigger internal, TBT waveform
    prf = ""
    if waveform == "Adc":
        caput(pv_wfmsel, 0, wait=True)
        caput(pv_adcwfm, 1, wait=True)
        caput(pv_adcoffset, offset, wait=True)
        pv_ddroffset = pv_adcoffset
        prf = ""
    elif waveform == "Tbt":
        caput(pv_wfmsel, 1, wait=True)
        caput(pv_tbtwfm, 1, wait=True)
        caput(pv_tbtoffset, offset, wait=True)
        pv_ddroffset = pv_tbtoffset
        prf = "TBT"
    elif waveform == "Fa":
        caput(pv_wfmsel, 2, wait=True)
        caput(pv_fawfm,  1, wait=True)
        caput(pv_faoffset, offset, wait=True)
        pv_ddroffset = pv_faoffset
        prf = "FA"
    else:
        raise RuntimeError("unknow waveform '%s'" % waveform)

    time.sleep(1.5)
    pv_x, pv_y, pv_S = [], [], []
    pv_A, pv_B, pv_C, pv_D = [], [], [], []
    for i,pvx in enumerate(pvprefs):
        pv_x.append( pvx + "%s-X" % prf)
        pv_y.append( pvx + "%s-Y" % prf)
        pv_S.append( pvx + "%s-S" % prf)
        pv_A.append( pvx + "%s-A" % prf)
        pv_B.append( pvx + "%s-B" % prf)
        pv_C.append( pvx + "%s-C" % prf)
        pv_D.append( pvx + "%s-D" % prf)

    # set 0 - internal trig, 1 - external trig
    caput(pv_trig, 0, wait=True, timeout=tc)

    # set the event
    caput(pv_evg, 1, wait=True)

    time.sleep(sleep)

    # check timestamp
    n = 0
    while True:
        tss_r  = caget(pv_trigts, timeout=tc)
        tss = [t - min(tss_r) for t in tss_r]
        tsns = caget(pv_trigtsns, timeout=tc)
        ts = [s + 1.0e-9*tsns[i] for i,s in enumerate(tss)]
        mdt = max(ts) - min(ts)
        ddrts0 = caget(pv_ddrts)
        mdt_s  = _maxTimeSpan(caget(pv_ddrts, timeout=tc))
        n = n + 1
        if mdt < 1.0 and mdt_s < 1.0:
            #print "Max dt=", mdt, mdt_s, "tried %d times" % n
            break
        time.sleep(0.6)
        # quit if failed too many times
        if n > 20:
            caput(pv_trig, [1] * len(pv_trig), wait=True)
            raise RuntimeError("BPMs are not ready after %d trials" % n)

    if verbose > 0:
        print "Trials: %d, Trig=%.2e, DDR Trig=%.2e seconds." % (n, mdt, mdt_s)

    # redundent check
    ddrts0   = caget(pv_ddrts, timeout=tc)
    mdt = _maxTimeSpan(ddrts0)
    if mdt > 1.0:
        print "ERROR: Timestamp does not agree (max dt= %f), wait ..." % mdt

    ddroffset = caget(pv_ddroffset, timeout=tc)
    data = (caget(pv_x),
            caget(pv_y),
            caget(pv_S))
    #
    data = np.array(data, 'd')

    # set 0 - internal trig, 1 - external trig
    caput(pv_trig, 1, wait=True)

    return data[0], data[1], data[2], ddrts0, ddroffset
Пример #40
0
def compareLattice(*argv, **kwargs):
    """
    - group, HDF5 file group, default lattice name
    - sponly, True, compare only the setpoint PVs
    - elements, None, or a list of family names ["QUAD"]
    - ignore, regular expression

    returns same and diff. Each is a list of (pv, values).

    >>> same, diff = compareLattice("file1.hdf5", elements=["QUAD"])
    >>> sm, df = compareLattice("file1.hdf5", elements=["COR", "BPM", "UBPM"])
    >>> sm, df = compareLattice("file1.hdf5", sponly=True)
    >>> sm, df = compareLattice("file1.hdf5", sponly=True, ignore=["SR:.+BPM.*Ampl.*"])
    """
    group = kwargs.get("group", machines._lat.name)
    sponly = kwargs.get("sponly", False)
    elements = kwargs.get("elements", None)
    ignore = kwargs.get("ignore", None)

    # filter the PVs
    if elements is not None:
        pvlst = []
        for fam in elements:
            for e in machines._lat.getElementList(fam):
                pvlst.extend(e.pv())
    else:
        pvlst = None

    dat = {}
    nset = len(argv)
    import h5py
    for i, fname in enumerate(argv):
        h5f = h5py.File(fname, 'r')
        g = h5f[group]
        for pv, val in g.items():
            if pvlst is not None and pv not in pvlst:
                continue
            if sponly and val.attrs.get("setpoint", 0) != 1:
                continue
            if ignore and any([re.match(p, pv) for p in ignore]):
                continue
            dat.setdefault(pv, [])
            if g[pv].dtype in ['float64']:
                dat[pv].append(float(val.value))
            elif g[pv].dtype in ['int32', 'int64']:
                dat[pv].append(int(val.value))
            else:
                print "unknown {0} data type: {1}, value: {2}".format(
                    pv, g[pv].dtype, g[pv].value)
        h5f.close()
    if len(dat) > 0 and kwargs.get("withlive", False):
        pvs = dat.keys()
        vals = caget(pvs)
        for i, pv in enumerate(pvs):
            dat[pv].insert(0, vals[i])
        nset = nset + 1

    same, diff = [], []
    i = 0
    for pv, vals in dat.items():
        i = i + 1
        if len(vals) < nset:
            diff.append([pv, vals])
        elif all([v == vals[0] for v in vals[1:]]):
            same.append([pv, vals])
            continue
        else:
            diff.append([pv, vals])
        #print i, pv, vals
    return same, diff