def read_frdata(frdata, epoch, start, end, scaled=True,<EOL>series_class=TimeSeries):
datastart = epoch + frdata.GetTimeOffset()<EOL>try:<EOL><INDENT>trange = frdata.GetTRange()<EOL><DEDENT>except AttributeError:  <EOL><INDENT>trange = <NUM_LIT:0.><EOL><DEDENT>if (end and datastart >= end) or (trange and datastart + trange < start):<EOL><INDENT>raise _Skip()<EOL><DEDENT>try:<EOL><INDENT>slope = frdata.GetSlope()<EOL>bias = frdata.GetBias()<EOL><DEDENT>except AttributeError:  <EOL><INDENT>slope = None<EOL>bias = None<EOL>null_scaling = True<EOL><DEDENT>else:<EOL><INDENT>null_scaling = slope == <NUM_LIT:1.> and bias == <NUM_LIT:0.><EOL><DEDENT>out = None<EOL>for j in range(frdata.data.size()):<EOL><INDENT>try:<EOL><INDENT>new = read_frvect(frdata.data[j], datastart, start, end,<EOL>name=frdata.GetName(),<EOL>series_class=series_class)<EOL><DEDENT>except _Skip:<EOL><INDENT>continue<EOL><DEDENT>if scaled and not null_scaling:<EOL><INDENT>new *= slope<EOL>new += bias<EOL><DEDENT>if slope is not None:<EOL><INDENT>new.override_unit('<STR_LIT:count>')<EOL><DEDENT>if out is None:<EOL><INDENT>out = new<EOL><DEDENT>else:<EOL><INDENT>out.append(new)<EOL><DEDENT><DEDENT>return out<EOL>
Read a series from an `FrData` structure

    Parameters
    ----------
    frdata : `LDAStools.frameCPP.FrAdcData` or similar
        the data structure to read

    epoch : `float`
        the GPS start time of the containing frame
        (`LDAStools.frameCPP.FrameH.GTime`)

    start : `float`
        the GPS start time of the user request

    end : `float`
        the GPS end time of the user request

    scaled : `bool`, optional
        apply slope and bias calibration to ADC data.

    series_class : `type`, optional
        the `Series` sub-type to return.

    Returns
    -------
    series : `~gwpy.timeseries.TimeSeriesBase`
        the formatted data series

    Raises
    ------
    _Skip
        if this data structure doesn't overlap with the requested
        ``[start, end)`` interval.