def METHOD_NAME(self, reader, sourcename):
    previous_pos = reader.tell()
    ihdr = guppi_raw.read_header(reader)
    header_size = reader.tell() - previous_pos
    self.header_buf = bytearray(header_size)
    nbit      = ihdr['NBITS']
    assert(nbit in set([4, 8, 16, 32, 64]))
    nchan     = ihdr['OBSNCHAN']
    bw_MHz    = ihdr['OBSBW']
    cfreq_MHz = ihdr['OBSFREQ']
    df_MHz = bw_MHz / nchan
    f0_MHz = cfreq_MHz - 0.5 * (nchan - 1) * df_MHz
    # Note: This will be negative if OBSBW is negative, which is correct
    dt_s   = 1. / df_MHz / 1e6
    # Derive the timestamp of this block
    byte_offset   = ihdr['PKTIDX'] * ihdr['PKTSIZE']
    frame_nbyte   = ihdr['BLOCSIZE'] / ihdr['NTIME']
    bytes_per_sec = frame_nbyte / dt_s
    offset_secs   = byte_offset / bytes_per_sec
    tstart_mjd    = ihdr['STT_IMJD'] + (ihdr['STT_SMJD'] + offset_secs) / 86400.
    tstart_unix   = _mjd2unix(tstart_mjd)
    ohdr = {
        '_tensor': {
            'dtype':  'ci' + str(nbit),
            'shape':  [-1, nchan, ihdr['NTIME'], ihdr['NPOL']],
            # Note: 'time' (aka block) is the frame axis
            'labels': ['time', 'freq', 'fine_time', 'pol'],
            'scales': [(tstart_unix, abs(dt_s) * ihdr['NTIME']),
                       (f0_MHz, df_MHz),
                       (0, dt_s),
                       None],
            'units':  ['s', 'MHz', 's', None],
            'gulp_nframe': 1,
        },
        'az_start':      _get_with_default(ihdr, 'AZ'),                # Decimal degrees
        'za_start':      _get_with_default(ihdr, 'ZA'),                # Decimal degrees
        'raj':           _get_with_default(ihdr, 'RA') * (24. / 360.), # Decimal hours
        'dej':           _get_with_default(ihdr, 'DEC'),               # Decimal degrees
        'source_name':   _get_with_default(ihdr, 'SRC_NAME'),
        'refdm':         _get_with_default(ihdr, 'CHAN_DM'),
        'refdm_units':   'pc cm^-3',
        'telescope':     _get_with_default(ihdr, 'TELESCOP'),
        'machine':       _get_with_default(ihdr, 'BACKEND'),
        'rawdatafile':   sourcename,
        'coord_frame':   'topocentric',
    }
    # Note: This gives 32 bits to the fractional part of a second,
    #         corresponding to ~0.233ns resolution. The whole part
    #         gets at least 31 bits, which will overflow in 2038.
    time_tag  = int(round(tstart_unix * 2**32))
    ohdr['time_tag'] = time_tag
    self.already_read_header = True
    ohdr['name'] = sourcename
    return [ohdr]