コード例 #1
0
ファイル: filwriter.py プロジェクト: wcfiore/your
def write_fil(data,
              y,
              nchans=None,
              chan_freq=None,
              filename=None,
              outdir=None,
              nstart=None):
    """
    Write Filterbank file given the Your object

    Args:

        data: Data to write to the Filterbank file

        y: Your object for the PSRFITS files

        nchans: No. of channels in the frequency range

        chan_freq: Required frequency channel range

        filename: Output name of the Filterbank file

        outdir: Output directory for the Filterbank file

        nstart: Start sample number

    """

    filfile = outdir + '/' + filename

    # Add checks for an existing fil file
    logger.info(f'Trying to write data to filterbank file: {filfile}')
    try:
        if os.stat(
                filfile
        ).st_size > 8192:  # check and replace with the size of header
            logger.warning(
                f'Filterbank file already exists at {filfile}. Appending spectra to it.'
            )
            logger.info(f'Writing {data.shape[0]} spectra to file: {filfile}')
            SigprocFile.append_spectra(data, filfile)
        else:
            logger.warning(f'Filterbank file already exists at {filfile}')
            logger.info(
                'Size of the Filerbank file is too small. Overwriting it.')
            fil_obj = make_sigproc_obj(filfile, y, nchans, chan_freq, nstart)
            fil_obj.write_header(filfile)
            logger.info(f'Writing {data.shape[0]} spectra to file: {filfile}')
            fil_obj.append_spectra(data, filfile)
    except FileNotFoundError:
        logger.info(
            f'Output file does not already exist. Creating a new Filterbank file.'
        )
        fil_obj = make_sigproc_obj(filfile, y, nchans, chan_freq, nstart)
        fil_obj.write_header(filfile)
        logger.info(f'Writing {data.shape[0]} spectra to file: {filfile}')
        fil_obj.append_spectra(data, filfile)
    logger.info(f'Successfully written data to Filterbank file: {filfile}')
コード例 #2
0
def write_fil(data, lowband_obj, upband_obj, filename=None, outdir=None):
    """
    Write Filterbank file given the upper and lower band Your
    objects and combined data

    Args:
        lowband_obj: Your object for the lower frequency band
        upband_obj: Your object for the upper frequency band
        upband_obj: Your object for the upper frequency band
        data: Combined data from two bands
        filename: Output name of the Filterbank file
        outdir: Output directory for the Filterbank file

    """

    original_dir, orig_lowband_basename = os.path.split(
        lowband_obj.your_header.filename
    )
    if not filename:
        filename = ".".join(orig_lowband_basename.split(".")[:-3]) + ".fil"

    if not outdir:
        outdir = original_dir

    filfile = outdir + "/" + filename

    # Add checks for an existing fil file
    logger.info("Trying to write data to filterbank file: %s", filfile)
    try:
        if os.stat(filfile).st_size > 8192:  # check and replace with the size of header
            logger.info("Writing %i spectra to file: %s", data.shape[0], filfile)
            SigprocFile.append_spectra(data, filfile)

        else:
            nchan = data.shape[1]
            fch1 = upband_obj.chan_freqs.max()
            foff = lowband_obj.foff if lowband_obj.foff < 0 else -1 * lowband_obj.foff
            fil_obj = make_sigproc_obj(filfile, lowband_obj, nchan, fch1, foff)
            fil_obj.write_header(filfile)
            logger.info("Writing %i spectra to file: %s", data.shape[0], filfile)
            fil_obj.append_spectra(data, filfile)

    except FileNotFoundError:
        nchan = data.shape[1]
        fch1 = upband_obj.chan_freqs.max()
        foff = lowband_obj.foff if lowband_obj.foff < 0 else -1 * lowband_obj.foff
        fil_obj = make_sigproc_obj(filfile, lowband_obj, nchan, fch1, foff)
        fil_obj.write_header(filfile)
        logger.info("Writing %i spectra to file: %s", data.shape[0], filfile)
        fil_obj.append_spectra(data, filfile)
    logger.info("Successfully written data to Filterbank file: %s", filfile)
コード例 #3
0
ファイル: your_combine_mocks.py プロジェクト: wcfiore/your
def write_fil(data, lowband_obj, upband_obj, filename=None, outdir=None):
    '''
    Write Filterbank file given the upper and lower band Your 
    objects and combined data
    :param lowband_obj: Your object for the lower frequency band
    :param upband_obj: Your object for the upper frequency band
    :param upband_obj: Your object for the upper frequency band
    :param data: Combined data from two bands 
    :param filename: Output name of the Filterbank file
    :param outdir: Output directory for the Filterbank file
    '''

    original_dir, orig_lowband_basename = os.path.split(lowband_obj.your_header.filename)
    if not filename:
        filename = '.'.join(orig_lowband_basename.split('.')[:-3]) + '.fil'

    if not outdir:
        outdir = original_dir

    filfile = outdir + '/' + filename

    # Add checks for an existing fil file
    logger.info(f'Trying to write data to filterbank file: {filfile}')
    try:
        if os.stat(filfile).st_size > 8192:  # check and replace with the size of header
            logger.info(f'Writing {data.shape[0]} spectra to file: {filfile}')
            SigprocFile.append_spectra(data, filfile)

        else:
            nchan = data.shape[1]
            fch1 = upband_obj.chan_freqs.max()
            foff = lowband_obj.foff if lowband_obj.foff < 0 else -1 * lowband_obj.foff
            fil_obj = make_sigproc_obj(filfile, lowband_obj, nchan, fch1, foff)
            fil_obj.write_header(filfile)
            logger.info(f'Writing {data.shape[0]} spectra to file: {filfile}')
            fil_obj.append_spectra(data, filfile)

    except FileNotFoundError:
        nchan = data.shape[1]
        fch1 = upband_obj.chan_freqs.max()
        foff = lowband_obj.foff if lowband_obj.foff < 0 else -1 * lowband_obj.foff
        fil_obj = make_sigproc_obj(filfile, lowband_obj, nchan, fch1, foff)
        fil_obj.write_header(filfile)
        logger.info(f'Writing {data.shape[0]} spectra to file: {filfile}')
        fil_obj.append_spectra(data, filfile)
    logger.info(f'Successfully written data to Filterbank file: {filfile}')
コード例 #4
0
ファイル: filwriter.py プロジェクト: knut0815/your
def sigproc_object_from_writer(your_writer):
    """

    Convert a `your_writer` object to Sigproc object for writing

    Args:
        your_writer: `your_writer` object

    Returns:
        sigproc object

    """
    logger.debug(f"Generating Sigproc object")
    fil_obj = SigprocFile()
    fil_obj.rawdatafile = your_writer.outname
    fil_obj.source_name = your_writer.your_object.your_header.source_name

    fil_obj.machine_id = 0  # use "Fake" for now
    fil_obj.barycentric = 0  # by default the data isn't barycentered
    fil_obj.pulsarcentric = 0
    fil_obj.telescope_id = 6  # use only GBT for now
    fil_obj.data_type = 0

    fil_obj.nchans = your_writer.nchans
    fil_obj.foff = your_writer.your_object.your_header.foff
    fil_obj.fch1 = your_writer.chan_freqs[0]
    fil_obj.nbeams = 1
    fil_obj.ibeam = 0
    fil_obj.nbits = your_writer.your_object.your_header.nbits
    fil_obj.tsamp = your_writer.your_object.your_header.tsamp

    fil_obj.tstart = your_writer.tstart
    fil_obj.nifs = 1  # Only use Intensity values

    if (your_writer.your_object.your_header.ra_deg
            and your_writer.your_object.your_header.dec_deg):
        ra = your_writer.your_object.your_header.ra_deg
        dec = your_writer.your_object.your_header.dec_deg
    else:
        ra = 0
        dec = 0

    from astropy.coordinates import SkyCoord
    import numpy as np

    loc = SkyCoord(ra, dec, unit="deg")
    ra_hms = loc.ra.hms
    dec_dms = loc.dec.dms

    fil_obj.src_raj = float(
        f"{int(ra_hms[0]):02d}{np.abs(int(ra_hms[1])):02d}{np.abs(ra_hms[2]):07.4f}"
    )
    fil_obj.src_dej = float(
        f"{int(dec_dms[0]):02d}{np.abs(int(dec_dms[1])):02d}{np.abs(dec_dms[2]):07.4f}"
    )

    fil_obj.az_start = -1
    fil_obj.za_start = -1
    return fil_obj
コード例 #5
0
ファイル: filwriter.py プロジェクト: knut0815/your
def make_sigproc_object(
    rawdatafile: str,
    source_name: str,
    nchans: int,
    foff: float,
    fch1: float,
    tsamp: float,
    tstart: float,
    src_raj: float = 112233.44,
    src_dej: float = 112233.44,
    machine_id: int = 0,
    nbeams: int = 0,
    ibeam: int = 0,
    nbits: int = 8,
    nifs: int = 1,
    barycentric: int = 0,
    pulsarcentric: int = 0,
    telescope_id: int = 6,
    data_type: int = 0,
    az_start: float = -1,
    za_start: float = -1,
):
    """
    Create a Sigprocfile from scratch.

    Args:
        rawdatafile (str) : Raw file name
        source_name (str) : Source Name
        nchans (int) : Number of channels
        foff (float) : Channel Bandwidth (MHz)
        fch1 (float) : Frequncy of first channel (MHz)
        tsamp (float) : Sampling interval (seconds)
        tstart (float) : MJD of the start sample
        src_raj (float) : RA of the source in format HHMMSS.SS
        src_dej (float) : Dec of source in format DDMMSS.SS
        machine_id (int) : Machine ID
        nbeams (int) : Number of beams in the rcvr
        ibeam (int) : Beam number
        nbits (int) : Number of bits
        nifs (int) : Number of IFs
        barycentric (int) : 0 for not barycentered data, 1 otherwise.
        pulsarcentric (int) : 0 for not pulsarcentered data, 1 otherwise.
        telescope_id (int) : Telescope ID
        data_type (int) : Data Type
        az_start (float) : Azimuth Angle start
        za_start (float):  Zenith Angle start

    Returns:
        sigproc object

    """
    logger.debug(f"Generating Sigproc object")

    fil_obj = SigprocFile()
    fil_obj.rawdatafile = rawdatafile
    fil_obj.source_name = source_name

    fil_obj.machine_id = machine_id
    fil_obj.barycentric = barycentric
    fil_obj.pulsarcentric = pulsarcentric
    fil_obj.telescope_id = telescope_id
    fil_obj.data_type = data_type

    fil_obj.nchans = nchans
    fil_obj.foff = foff
    fil_obj.fch1 = fch1
    fil_obj.nbeams = nbeams
    fil_obj.ibeam = ibeam
    fil_obj.nbits = nbits
    fil_obj.tsamp = tsamp

    fil_obj.tstart = tstart
    fil_obj.nifs = nifs

    fil_obj.src_raj = src_raj
    fil_obj.src_dej = src_dej

    fil_obj.az_start = az_start
    fil_obj.za_start = za_start

    return fil_obj
コード例 #6
0
def test_pysigproc_obj():
    fil_file = os.path.join(_install_dir, 'data/28.fil')
    fil_obj = SigprocFile(fil_file)
    assert fil_obj.nchans == 336
コード例 #7
0
def test_get_data_fil():
    fil_file = os.path.join(_install_dir, 'data/28.fil')
    fil_obj = SigprocFile(fil_file)
    data = fil_obj.get_data(0, 10)
    assert np.isclose(np.mean(data), 128, atol=1)
コード例 #8
0
ファイル: test_pysigproc.py プロジェクト: xiggystardust/your
def test_pol():
    fil_file = os.path.join(_install_dir, "data/28.fil")
    fil_obj = SigprocFile(fil_file)
    assert fil_obj.poln_order == "I"
    with pytest.raises(AssertionError):
        d = fil_obj.get_data(0, 10, npoln=3)
コード例 #9
0
ファイル: filwriter.py プロジェクト: wcfiore/your
def make_sigproc_obj(filfile, y, nchans, chan_freq, nstart):
    """
    Use Your class to make Sigproc class object with relevant parameters

    Args:

        filfile: Name of the Filterbank file

        y: Your object for the PSRFITS files

        nchans: No. of channels in the frequency range

        chan_freq: Required frequency channel range


    Returns:

        obj: Object of class SigprocFile

    """
    logger.debug(f'Generating Sigproc object')
    fil_obj = SigprocFile()

    logger.debug(f'Setting attributes of Sigproc object from Your object.')
    fil_obj.rawdatafile = filfile
    fil_obj.source_name = y.your_header.source_name

    # Verify the following parameters
    fil_obj.machine_id = 0  # use "Fake" for now
    fil_obj.barycentric = 0  # by default the data isn't barycentered
    fil_obj.pulsarcentric = 0
    fil_obj.telescope_id = 6  # use only GBT for now
    fil_obj.data_type = 0

    fil_obj.nchans = nchans
    fil_obj.foff = y.your_header.foff
    fil_obj.fch1 = chan_freq[0]
    fil_obj.nbeams = 1
    fil_obj.ibeam = 0
    fil_obj.nbits = y.your_header.nbits
    fil_obj.tsamp = y.your_header.tsamp
    if not nstart:
        nstart = 0
    fil_obj.tstart = y.your_header.tstart + nstart * y.your_header.tsamp / (
        60 * 60 * 24)
    fil_obj.nifs = 1  # Only use Intensity values

    if y.your_header.ra_deg and y.your_header.dec_deg:
        ra = y.your_header.ra_deg
        dec = y.your_header.dec_deg
    else:
        ra = 0
        dec = 0

    from astropy.coordinates import SkyCoord
    loc = SkyCoord(ra, dec, unit='deg')
    ra_hms = loc.ra.hms
    dec_dms = loc.dec.dms

    fil_obj.src_raj = float(
        f'{int(ra_hms[0]):02d}{np.abs(int(ra_hms[1])):02d}{np.abs(ra_hms[2]):07.4f}'
    )
    fil_obj.src_dej = float(
        f'{int(dec_dms[0]):02d}{np.abs(int(dec_dms[1])):02d}{np.abs(dec_dms[2]):07.4f}'
    )

    fil_obj.az_start = -1
    fil_obj.za_start = -1
    return fil_obj
コード例 #10
0
ファイル: your_combine_mocks.py プロジェクト: knut0815/your
def make_sigproc_obj(filfile, lowband_obj, nchan, fch1, foff):
    """
    Use Your class object of the lower band to make Sigproc
    class object with the relevant parameters
    :param filfile: Name of the Filterbank file
    :param lowband_obj: Your object for the lower frequency band
    :param nchan: Number of channels in the combined data
    :param fch1: Frequency of the first channel
    :return fil_obj: Sigproc class object
    """
    logger.debug(f"Generating Sigproc object")
    fil_obj = SigprocFile()

    logger.debug(f"Setting attributes of Sigproc object from Your object.")
    fil_obj.rawdatafile = filfile
    fil_obj.source_name = lowband_obj.your_header.source_name

    # Verify the following parameters
    fil_obj.machine_id = (
        0  # since mock isn't a machine in the standard list, we use fake
    )
    fil_obj.barycentric = 0  # by default the data isn't barycentered
    fil_obj.pulsarcentric = 0
    fil_obj.telescope_id = 1  # its always Arecibo
    fil_obj.data_type = 0

    fil_obj.nchans = (
        nchan  # lowband_obj.your_header.nchans * 2 - lowchanskip - upchanskip
    )
    fil_obj.foff = foff
    fil_obj.fch1 = fch1
    fil_obj.nbeams = 1
    fil_obj.ibeam = 0
    fil_obj.nbits = lowband_obj.your_header.nbits
    fil_obj.tsamp = lowband_obj.your_header.tsamp
    fil_obj.tstart = lowband_obj.your_header.tstart
    fil_obj.nifs = 1  # always write single pol should use "lowband_obj.your_header.npol" if needed otherwise

    from astropy.coordinates import SkyCoord

    loc = SkyCoord(
        lowband_obj.your_header.ra_deg, lowband_obj.your_header.dec_deg, unit="deg"
    )
    ra_hms = loc.ra.hms
    dec_dms = loc.dec.dms

    fil_obj.src_raj = float(
        f"{int(ra_hms[0]):02d}{int(np.abs(ra_hms[1])):02d}{np.abs(ra_hms[2]):07.4f}"
    )
    fil_obj.src_dej = float(
        f"{int(dec_dms[0]):02d}{int(np.abs(dec_dms[1])):02d}{np.abs(dec_dms[2]):07.4f}"
    )

    fil_obj.az_start = -1
    fil_obj.za_start = -1
    return fil_obj