Esempio n. 1
0
def read_files(FDF_filename, freq_filename):
    """
    Read in the files needed for peak fitting. Files assumed to be the standard
    outputs of RMsynth3D (and, optionally, RMclean3D). also, freq file.
    """

    HDUreal = pf.open(FDF_filename.replace('_tot',
                                           '_real').replace('_im', '_real'),
                      "readonly",
                      memmap=True)
    head = HDUreal[0].header.copy()
    FDFreal = HDUreal[0].data

    HDUimag = pf.open(FDF_filename.replace('_tot',
                                           '_im').replace('_real', '_im'),
                      "readonly",
                      memmap=True)
    FDFimag = HDUimag[0].data
    complex_cube = FDFreal + 1j * FDFimag

    #Identify Faraday depth axis (assumed to be last one if not explicitly found)
    Ndim, FD_axis = find_axes(head)

    #Move FD axis to first place in numpy order.
    if FD_axis != Ndim:
        complex_cube = np.moveaxis(complex_cube, Ndim - FD_axis, 0)

    #Remove degenerate axes to prevent problems with later steps.
    complex_cube = complex_cube.squeeze()

    lam0Sq = head['LAMSQ0']

    freqArr_Hz = np.loadtxt(freq_filename, dtype=float)
    lambdaSqArr_m2 = np.power(C / freqArr_Hz, 2.0)

    phiArr_radm2 = fits_make_lin_axis(head, axis=FD_axis - 1)

    HDUfwhm = pf.open(FDF_filename.replace(
        'FDF_tot_dirty',
        'RMSF_FWHM').replace('FDF_real_dirty', 'RMSF_FWHM').replace(
            'FDF_im_dirty',
            'RMSF_FWHM').replace('FDF_clean_tot', 'RMSF_FWHM').replace(
                'FDF_clean_real', 'RMSF_FWHM').replace('FDF_clean_im',
                                                       'RMSF_FWHM'),
                      "readonly",
                      memmap=True)
    fwhmRMSF = HDUfwhm[0].data.squeeze()

    return complex_cube, phiArr_radm2, fwhmRMSF, lambdaSqArr_m2, lam0Sq, head
Esempio n. 2
0
def run_rmclean(fitsFDF,
                fitsRMSF,
                cutoff_mJy,
                maxIter=1000,
                gain=0.1,
                prefixOut="",
                outDir="",
                nBits=32):
    """Run RM-CLEAN on a FDF cube given a RMSF cube."""

    # Default data types
    dtFloat = "float" + str(nBits)
    dtComplex = "complex" + str(2 * nBits)

    # Read the FDF
    HDULst = pf.open(fitsFDF, "readonly", memmap=True)
    head = HDULst[0].header.copy()
    FDFreal = HDULst[0].data
    FDFimag = HDULst[1].data
    dirtyFDF = FDFreal + 1j * FDFimag
    phiArr_radm2 = fits_make_lin_axis(HDULst[0].header, axis=2, dtype=dtFloat)

    # Read the RMSF
    HDULst = pf.open(fitsRMSF, "readonly", memmap=True)
    RMSFreal = HDULst[0].data
    RMSFimag = HDULst[1].data
    fwhmRMSFArr = HDULst[3].data
    RMSFArr = RMSFreal + 1j * RMSFimag
    phi2Arr_radm2 = fits_make_lin_axis(HDULst[0].header, axis=2, dtype=dtFloat)

    startTime = time.time()

    # Do the clean
    cleanFDF, ccArr, iterCountArr = \
        do_rmclean_hogbom(dirtyFDF         = dirtyFDF * 1e3,
                          phiArr_radm2     = phiArr_radm2,
                          RMSFArr          = RMSFArr,
                          phi2Arr_radm2    = phi2Arr_radm2,
                          fwhmRMSFArr      = fwhmRMSFArr,
                          cutoff           = cutoff_mJy,
                          maxIter          = maxIter,
                          gain             = gain,
                          verbose          = True,
                          doPlots          = False)
    cleanFDF /= 1e3
    ccArr /= 1e3

    endTime = time.time()
    cputime = (endTime - startTime)
    print "> RM-clean completed in %.2f seconds." % cputime
    print "Saving the clean FDF and ancillary FITS files"

    # Save the clean FDF
    fitsFileOut = outDir + "/" + prefixOut + "FDF_clean.fits"
    print "> %s" % fitsFileOut
    hdu0 = pf.PrimaryHDU(cleanFDF.real.astype(dtFloat), head)
    hdu1 = pf.ImageHDU(cleanFDF.imag.astype(dtFloat), head)
    hdu2 = pf.ImageHDU(np.abs(cleanFDF).astype(dtFloat), head)
    hdu3 = pf.ImageHDU(ccArr.astype(dtFloat), head)
    hduLst = pf.HDUList([hdu0, hdu1, hdu2, hdu3])
    hduLst.writeto(fitsFileOut, output_verify="fix", clobber=True)
    hduLst.close()

    # Save the iteration count mask
    fitsFileOut = outDir + "/" + prefixOut + "CLEAN_nIter.fits"
    print "> %s" % fitsFileOut
    head["BUNIT"] = "Iterations"
    hdu0 = pf.PrimaryHDU(iterCountArr.astype(dtFloat), head)
    hduLst = pf.HDUList([hdu0])
    hduLst.writeto(fitsFileOut, output_verify="fix", clobber=True)
    hduLst.close()
Esempio n. 3
0
def run_rmclean(fitsFDF,
                fitsRMSF,
                cutoff_mJy,
                maxIter=1000,
                gain=0.1,
                prefixOut="",
                outDir="",
                nBits=32,
                write_separate_FDF=False,
                verbose=True,
                log=print):
    """Run RM-CLEAN on a FDF cube given a RMSF cube."""

    # Default data types
    dtFloat = "float" + str(nBits)
    dtComplex = "complex" + str(2 * nBits)

    # Read the FDF
    dirtyFDF, head, FD_axis = read_FDF_cube(fitsFDF)

    phiArr_radm2 = fits_make_lin_axis(head, axis=FD_axis - 1, dtype=dtFloat)

    # Read the RMSF

    RMSFArr, headRMSF, FD_axis = read_FDF_cube(fitsRMSF)
    HDULst = pf.open(fitsRMSF, "readonly", memmap=True)
    fwhmRMSFArr = HDULst[3].data
    HDULst.close()
    phi2Arr_radm2 = fits_make_lin_axis(headRMSF,
                                       axis=FD_axis - 1,
                                       dtype=dtFloat)

    startTime = time.time()

    # Do the clean
    cleanFDF, ccArr, iterCountArr = \
        do_rmclean_hogbom(dirtyFDF         = dirtyFDF * 1e3,
                          phiArr_radm2     = phiArr_radm2,
                          RMSFArr          = RMSFArr,
                          phi2Arr_radm2    = phi2Arr_radm2,
                          fwhmRMSFArr      = fwhmRMSFArr,
                          cutoff           = cutoff_mJy,
                          maxIter          = maxIter,
                          gain             = gain,
                          verbose          = verbose,
                          doPlots          = False)
    cleanFDF /= 1e3
    ccArr /= 1e3

    endTime = time.time()
    cputime = (endTime - startTime)
    if (verbose): log("> RM-clean completed in %.2f seconds." % cputime)
    if (verbose): log("Saving the clean FDF and ancillary FITS files")

    if outDir == '':  #To prevent code breaking if file is in current directory
        outDir = '.'

    #Move FD axis back to original position:
    Ndim = head['NAXIS']
    cleanFDF = np.moveaxis(cleanFDF, 0, Ndim - FD_axis)
    ccArr = np.moveaxis(ccArr, 0, Ndim - FD_axis)

    # Save the clean FDF
    if not write_separate_FDF:
        fitsFileOut = outDir + "/" + prefixOut + "FDF_clean.fits"
        if (verbose): log("> %s" % fitsFileOut)
        hdu0 = pf.PrimaryHDU(cleanFDF.real.astype(dtFloat), head)
        hdu1 = pf.ImageHDU(cleanFDF.imag.astype(dtFloat), head)
        hdu2 = pf.ImageHDU(np.abs(cleanFDF).astype(dtFloat), head)
        hduLst = pf.HDUList([hdu0, hdu1, hdu2])
        hduLst.writeto(fitsFileOut, output_verify="fix", overwrite=True)
        hduLst.close()
    else:
        hdu0 = pf.PrimaryHDU(cleanFDF.real.astype(dtFloat), head)
        fitsFileOut = outDir + "/" + prefixOut + "FDF_clean_real.fits"
        hdu0.writeto(fitsFileOut, output_verify="fix", overwrite=True)
        if (verbose): log("> %s" % fitsFileOut)
        hdu1 = pf.PrimaryHDU(cleanFDF.imag.astype(dtFloat), head)
        fitsFileOut = outDir + "/" + prefixOut + "FDF_clean_im.fits"
        hdu1.writeto(fitsFileOut, output_verify="fix", overwrite=True)
        if (verbose): log("> %s" % fitsFileOut)
        hdu2 = pf.PrimaryHDU(np.abs(cleanFDF).astype(dtFloat), head)
        fitsFileOut = outDir + "/" + prefixOut + "FDF_clean_tot.fits"
        hdu2.writeto(fitsFileOut, output_verify="fix", overwrite=True)
        if (verbose): log("> %s" % fitsFileOut)

    if not write_separate_FDF:
        #Save the complex clean components as another file.
        fitsFileOut = outDir + "/" + prefixOut + "FDF_CC.fits"
        if (verbose): log("> %s" % fitsFileOut)
        hdu0 = pf.PrimaryHDU(ccArr.real.astype(dtFloat), head)
        hdu1 = pf.ImageHDU(ccArr.imag.astype(dtFloat), head)
        hdu2 = pf.ImageHDU(np.abs(ccArr).astype(dtFloat), head)
        hduLst = pf.HDUList([hdu0, hdu1, hdu2])
        hduLst.writeto(fitsFileOut, output_verify="fix", overwrite=True)
        hduLst.close()
    else:
        hdu0 = pf.PrimaryHDU(ccArr.real.astype(dtFloat), head)
        fitsFileOut = outDir + "/" + prefixOut + "FDF_CC_real.fits"
        hdu0.writeto(fitsFileOut, output_verify="fix", overwrite=True)
        if (verbose): log("> %s" % fitsFileOut)
        hdu1 = pf.PrimaryHDU(ccArr.imag.astype(dtFloat), head)
        fitsFileOut = outDir + "/" + prefixOut + "FDF_CC_im.fits"
        hdu1.writeto(fitsFileOut, output_verify="fix", overwrite=True)
        if (verbose): log("> %s" % fitsFileOut)
        hdu2 = pf.PrimaryHDU(np.abs(ccArr).astype(dtFloat), head)
        fitsFileOut = outDir + "/" + prefixOut + "FDF_CC_tot.fits"
        hdu2.writeto(fitsFileOut, output_verify="fix", overwrite=True)
        if (verbose): log("> %s" % fitsFileOut)

    # Save the iteration count mask
    fitsFileOut = outDir + "/" + prefixOut + "CLEAN_nIter.fits"
    if (verbose): log("> %s" % fitsFileOut)
    head["BUNIT"] = "Iterations"
    hdu0 = pf.PrimaryHDU(iterCountArr.astype(dtFloat), head)
    hduLst = pf.HDUList([hdu0])
    hduLst.writeto(fitsFileOut, output_verify="fix", overwrite=True)
    hduLst.close()
Esempio n. 4
0
def run_rmclean(fitsFDF,
                fitsRMSF,
                cutoff,
                maxIter=1000,
                gain=0.1,
                nBits=32,
                pool=None,
                chunksize=None,
                verbose=True,
                log=print):
    """Run RM-CLEAN on a 2/3D FDF cube given an RMSF cube stored as FITS.

    If you want to run RM-CLEAN on arrays, just use util_RM.do_rmclean_hogbom.

    Args:
        fitsFDF (str): Name of FDF FITS file.
        fitsRMSF (str): Name of RMSF FITS file
        cutoff (float): CLEAN cutoff in flux units

    Kwargs:
        maxIter (int): Maximum number of CLEAN iterations per pixel.
        gain (float): CLEAN loop gain.
        nBits (int): Precision of floating point numbers.
        pool (multiprocessing Pool): Pool function from multiprocessing
            or schwimmbad
        chunksize (int): Number of chunks which it submits to the process pool
            as separate tasks. The (approximate) size of these chunks can be
            specified by setting chunksize to a positive integer.
        verbose (bool): Verbosity.
        log (function): Which logging function to use.

    Returns:
        cleanFDF (ndarray): Cube of RMCLEANed FDFs.
        ccArr (ndarray): Cube of RMCLEAN components (i.e. the model).
        iterCountArr (ndarray): Cube of number of RMCLEAN iterations.
        residFDF (ndarray): Cube of residual RMCLEANed FDFs.
        head (fits.header): Header of FDF FITS file for template.

    """

    # Default data types
    dtFloat = "float" + str(nBits)
    dtComplex = "complex" + str(2 * nBits)

    # Read the FDF
    dirtyFDF, head, FD_axis = read_FDF_cubes(fitsFDF)

    phiArr_radm2 = fits_make_lin_axis(head, axis=FD_axis - 1, dtype=dtFloat)

    # Read the RMSF

    RMSFArr, headRMSF, FD_axis = read_FDF_cubes(fitsRMSF)
    HDULst = pf.open(fitsRMSF.replace('_real', '_FWHM').replace(
        '_im', '_FWHM').replace('_tot', '_FWHM'),
                     "readonly",
                     memmap=True)
    fwhmRMSFArr = np.squeeze(HDULst[0].data)
    HDULst.close()
    phi2Arr_radm2 = fits_make_lin_axis(headRMSF,
                                       axis=FD_axis - 1,
                                       dtype=dtFloat)

    startTime = time.time()

    # Do the clean
    cleanFDF, ccArr, iterCountArr, residFDF  = \
        do_rmclean_hogbom(dirtyFDF         = dirtyFDF,
                          phiArr_radm2     = phiArr_radm2,
                          RMSFArr          = RMSFArr,
                          phi2Arr_radm2    = phi2Arr_radm2,
                          fwhmRMSFArr      = fwhmRMSFArr,
                          cutoff           = cutoff,
                          maxIter          = maxIter,
                          gain             = gain,
                          verbose          = verbose,
                          doPlots          = False,
                          pool             = pool,
                          chunksize        = chunksize)

    endTime = time.time()
    cputime = (endTime - startTime)
    if (verbose): log("> RM-clean completed in %.2f seconds." % cputime)
    if (verbose): log("Saving the clean FDF and ancillary FITS files")

    #Move FD axis back to original position:
    Ndim = cleanFDF.ndim
    cleanFDF = np.moveaxis(cleanFDF, 0, Ndim - FD_axis)
    ccArr = np.moveaxis(ccArr, 0, Ndim - FD_axis)

    return cleanFDF, ccArr, iterCountArr, residFDF, head