def flag_ms(visname):  # , rawname1, rawname2, rawname3):
    print("Flagging antennas affected by shadowing...")
    # importatca(
    #     vis=visname, files=[rawname1, rawname2, rawname3], options="birdie,noac", edge=4
    # )
    flagmanager(vis=visname, mode="save", versionname="before_online_flagging")
    print("Flagging antennas affected by shadowing...")
    flagdata(vis=visname, mode="shadow", tolerance=0.0, flagbackup=False)
    print("Flagging visibilities with zero amplitudes...")
    flagdata(vis=visname, mode="clip", clipzeros=True, flagbackup=False)
    print("Quacking visibilities ...")
    flagdata(
        vis=visname, mode="quack", quackinterval=5.0, quackmode="beg", flagbackup=False
    )
    flagmanager(vis=visname, mode="save", versionname="after_online_flagging")
    flagdata(
        vis=visname,
        mode="tfcrop",
        datacolumn="data",
        action="apply",
        display="report",
        flagbackup=True,
        extendpols=True,
        correlation="",
        flagdimension="freqtime",
        growtime=95.0,
        growfreq=95.0,
        timecutoff=4.0,
        timefit="line",
        freqfit="poly",
        maxnpieces=5,
        combinescans=False,
        ntime="scan",
        extendflags=False,
    )
    print("Extending flags to all correlations")
    flagdata(
        vis=visname,
        mode="extend",
        action="apply",
        display="report",
        flagbackup=False,
        extendpols=True,
        correlation="",
        growtime=95.0,
        growfreq=95.0,
        growaround=True,
        flagneartime=False,
        flagnearfreq=False,
        combinescans=False,
        ntime="scan",
    )
    return
def flagcal_ms(img_dir, msname, ATCA_band, pri, sec):
    flagmanager(vis=msname, mode="save", versionname="before_rflag")
    flagdata(
        vis=msname,
        mode="rflag",
        field=pri,
        datacolumn="corrected",
        action="apply",
        display="report",
        correlation="ABS_ALL",
        timedevscale=3.0,
        freqdevscale=3.0,
        winsize=3,
        combinescans=True,
        ntime="9999999min",
        extendflags=False,
        flagbackup=False,
    )
    flagdata(
        vis=msname,
        mode="rflag",
        field=sec,
        datacolumn="corrected",
        action="apply",
        display="report",
        correlation="ABS_ALL",
        timedevscale=3.0,
        freqdevscale=3.0,
        winsize=3,
        combinescans=True,
        ntime="9999999min",
        extendflags=False,
        flagbackup=False,
    )
    flagdata(
        vis=msname,
        mode="extend",
        field=pri + "," + sec,
        action="apply",
        display="report",
        flagbackup=False,
        extendpols=True,
        correlation="",
        growtime=95.0,
        growfreq=95.0,
        growaround=True,
        flagneartime=False,
        flagnearfreq=False,
        combinescans=True,
        ntime="9999999min",
    )

    return
示例#3
0
def apply_apriori_flagging(project: project.Project):
    """Applies the flags stored in the file associated with the project.
    """
    return
    casatasks.flagdata(vis=str(project.msfile),
                       inpfile=str(project.caldir /
                                   f"{project.project_name}.flag"),
                       reason='any',
                       action='apply',
                       flagbackup=False,
                       savepars=False)
    casatasks.flagmanager(vis=str(project.msfile),
                          mode='save',
                          versionname='apriori_flags',
                          comment='A-priori flags prior to any calibration.')
def split_ms(src_dir, img_dir, visname, msname, ATCA_band, pri, sec, tar, n_spw):
    os.system(f"rm -r {msname}")
    os.system(f"rm -r {msname}.flagversions")
    os.system("rm -r *.last")
    # have removed n_spw for mstransform and included it in the split just before imaging
    mstransform(
        vis=visname,
        outputvis=msname,
        datacolumn="data",
        field=f"{pri},{sec},{tar}",
        # nspw=n_spw,
        regridms=True,
        # field=f"{sec},{tar}",
        # scan="3,>90"
    )
    listobs(
        vis=msname,
        listfile=f"{src_dir}/listobs_{ATCA_band}_{tar}.dat",
        overwrite=True,
    )
    flagmanager(vis=msname, mode="save", versionname="after_transform")
    return
示例#5
0
def avg_cont(
    msfile,
    outputvis,
    flagchannels="",
    maxchanwidth=125,
    datacolumn="data",
    spws=None,
    width_array=None,
):
    """
    Produce spectrally averaged continuum measurement sets

    Args:
        msfile (string): input file name
        outputvis (string): output file name
        flagchannels: Argument to be passed for flagchannels parameter in
            flagdata task
        maxchanwidth: Maximum width of channel (MHz). This is the value
            recommended by ALMA for Band 6 to avoid bandwidth smearing
        datacolumn: Column to pull from for continuum averaging (usually will
            be 'data', but may sometimes be 'corrected' if there was flux
            rescaling applied)
        width_array (array): Argument to be passed to CASA for the width
            parameter in split. If not set, all SPWs will be selected by default.

    Returns:
        None
    """
    tb = table()

    tb.open(msfile + "/SPECTRAL_WINDOW")
    total_bw = tb.getcol("TOTAL_BANDWIDTH")
    num_chan = tb.getcol("NUM_CHAN")
    tb.close()

    timebin = "0s"  # default in CASA

    if os.path.isdir(msfile + ".flagversions/flags.before_cont_flags"):
        # clear out old versions of the flags
        flagmanager(vis=msfile, mode="delete", versionname="before_cont_flags")

    # save flag state before flagging spectral lines
    flagmanager(
        vis=msfile,
        mode="save",
        versionname="before_cont_flags",
        comment="Flag states before spectral lines are flagged",
    )
    # flag spectral lines
    flagdata(
        vis=msfile,
        mode="manual",
        spw=flagchannels,
        flagbackup=False,
    )

    os.system("rm -rf " + outputvis)
    split(
        vis=msfile,
        outputvis=outputvis,
        spw=spws,
        width=width_array,
        timebin=timebin,
        datacolumn=datacolumn,
        intent="OBSERVE_TARGET#ON_SOURCE",
        keepflags=False,
    )

    # restore flagged spectral line channels
    flagmanager(vis=msfile, mode="restore", versionname="before_cont_flags")

    print("#Averaged continuum dataset saved to %s" % outputvis)
def slefcal_ms(src_dir, imagems, imagename, ATCA_band, n_spw):
    print(
        "+ + + + + + + + + + + + + + + + +\n+  Self Cal Round 1  +\n+ + + + + + + + + + + + + + + + +"
    )
    mode = "mfs"
    nterms = 2
    niter = 3000
    antenna = "0~6,0~6"
    n_spw = n_spw
    if ATCA_band == "L":
        imsize = 2250
        solint = "60s"
        minsnr = 3.0
        cell = "1arcsec"
        minblperant = 3
    if ATCA_band == "C":
        imsize = 2250
        solint = "60s"
        minsnr = 3.0
        minblperant = 3
        cell = "0.5arcsec"
    if ATCA_band == "X":
        imsize = 1152
        solint = "60s"
        minsnr = 3.0
        minblperant = 3
        cell = "0.2arcsec"
    uvrange = ""
    stokes = "I"
    weighting = "briggs"
    robust = 0.5
    interactive = False
    gain = 0.01
    threshold = "5e-4Jy"
    # if os.path.exists(f"{src_dir}/cal_tables/pcal1_{imagename}"):
    rmtables(f"{src_dir}/cal_tables/pcal1_{imagename}")
    gaincal(
        vis=imagems,
        caltable=f"{src_dir}/cal_tables/pcal1_{imagename}",
        combine="scan,spw",
        spwmap=[0] * n_spw,
        gaintype="G",
        calmode="p",
        solint=solint,
        minsnr=minsnr,
        minblperant=minblperant,
    )
    applycal(
        vis=imagems,
        gaintable=f"{src_dir}/cal_tables/pcal1_{imagename}",
        spwmap=[0] * n_spw,
        parang=True,
        applymode="calonly",
        flagbackup=False,
    )
    flagmanager(vis=imagems, mode="save", versionname="post self1")

    for i in range(0, n_spw):
        spw = str(i)
        # if os.path.exists(f"{src_dir}/casa_files/{imagename}_{spw}_self1*"):
        os.system(
            f"rm -r {src_dir}/casa_files/{imagename}_{spw}_self1*"
        )
        print("Cleaning on band: " + str(spw))
        tclean(
            vis=imagems,
            imagename=f"{src_dir}/casa_files/{imagename}_{spw}_self1",
            selectdata=True,
            mask=f"{src_dir}/casa_files/{imagename}_mfs.mask",
            spw=spw,
            startmodel=f"{src_dir}/casa_files/{imagename}_{spw}_preself.model",
            gain=gain,
            specmode=mode,
            nterms=nterms,
            niter=niter,
            threshold=threshold,
            imsize=imsize,
            cell=cell,
            stokes=stokes,
            weighting=weighting,
            robust=robust,
            antenna=antenna,
            interactive=interactive,
            savemodel="modelcolumn",
            pbcor=False,
            uvrange=uvrange,
        )
        tclean(
            vis=imagems,
            imagename=f"{src_dir}/casa_files/{imagename}_{spw}_self1",
            selectdata=True,
            mask="",
            spw=spw,
            gain=gain,
            specmode=mode,
            nterms=nterms,
            niter=0,
            threshold=threshold,
            imsize=imsize,
            cell=cell,
            stokes=stokes,
            weighting=weighting,
            robust=robust,
            antenna=antenna,
            interactive=interactive,
            pbcor=False,
            savemodel="modelcolumn",
            calcres=False,
            calcpsf=False,
            uvrange=uvrange,
        )

    threshold = "5e-5Jy"
    # if os.path.exists(f"{src_dir}/cal_tables/pcal2_{imagename}"):
    rmtables(f"{src_dir}/cal_tables/pcal2_{imagename}")
    print(
        "+ + + + + + + + + + + + + + + + +\n+  Self Cal Round 2  +\n+ + + + + + + + + + + + + + + + +"
    )

    gaincal(
        vis=imagems,
        caltable=f"{src_dir}/cal_tables/pcal2_{imagename}",
        gaintable=f"{src_dir}/cal_tables/pcal1_{imagename}",
        combine="scan,spw",
        spwmap=[0] * n_spw,
        gaintype="G",
        calmode="p",
        solint=solint,
        minsnr=minsnr,
        minblperant=minblperant,
    )
    applycal(
        vis=imagems,
        gaintable=[
            f"{src_dir}/cal_tables/pcal1_{imagename}",
            f"{src_dir}/cal_tables/pcal2_{imagename}",
        ],
        spwmap=[[0] * n_spw, [0] * n_spw],
        parang=True,
        applymode="calonly",
        flagbackup=False,
    )
    flagmanager(vis=imagems, mode="save", versionname="post self2")
    for i in range(0, n_spw):
        spw = str(i)
        # if os.path.exists(f"{src_dir}/casa_files/{imagename}_{spw}_self2*"):
        os.system(f"rm -r {src_dir}/casa_files/{imagename}_{spw}_self2*")
        print("Cleaning on band: " + str(spw))
        tclean(
            vis=imagems,
            imagename=f"{src_dir}/casa_files/{imagename}_{spw}_self2",
            selectdata=True,
            mask=f"{src_dir}/casa_files/{imagename}_mfs.mask",
            spw=spw,
            startmodel=f"{src_dir}/casa_files/{imagename}_{spw}_self1.model",
            gain=gain,
            specmode=mode,
            nterms=nterms,
            niter=niter,
            threshold=threshold,
            imsize=imsize,
            cell=cell,
            stokes=stokes,
            weighting=weighting,
            robust=robust,
            antenna=antenna,
            interactive=interactive,
            savemodel="modelcolumn",
            pbcor=False,
            uvrange=uvrange,
        )
        tclean(
            vis=imagems,
            imagename=f"{src_dir}/casa_files/{imagename}_{spw}_self2",
            selectdata=True,
            mask="",
            spw=spw,
            gain=gain,
            specmode=mode,
            nterms=nterms,
            niter=0,
            threshold=threshold,
            imsize=imsize,
            cell=cell,
            stokes=stokes,
            weighting=weighting,
            robust=robust,
            antenna=antenna,
            interactive=interactive,
            pbcor=False,
            savemodel="modelcolumn",
            calcres=False,
            calcpsf=False,
            uvrange=uvrange,
        )

    threshold = "5e-6Jy"
    print(
        "+ + + + + + + + + + + + + + + + +\n+  Self Cal Round 3  +\n+ + + + + + + + + + + + + + + + +"
    )

    rmtables(f"{src_dir}/cal_tables/pcal3_{imagename}")
    gaincal(
        vis=imagems,
        caltable=f"{src_dir}/cal_tables/pcal3_{imagename}",
        gaintable=[
            f"{src_dir}/cal_tables/pcal1_{imagename}",
            f"{src_dir}/cal_tables/pcal2_{imagename}",
        ],
        combine="scan,spw",
        spwmap=[[0] * n_spw, [0] * n_spw],
        gaintype="G",
        calmode="p",
        solint=solint,
        minsnr=minsnr,
        minblperant=minblperant,
    )
    applycal(
        vis=imagems,
        gaintable=[
            f"{src_dir}/cal_tables/pcal1_{imagename}",
            f"{src_dir}/cal_tables/pcal2_{imagename}",
            f"{src_dir}/cal_tables/pcal3_{imagename}",
        ],
        spwmap=[[0] * n_spw, [0] * n_spw, [0] * n_spw],
        parang=True,
        applymode="calonly",
        flagbackup=False,
    )
    flagmanager(vis=imagems, mode="save", versionname="post self3")
    for i in range(0, n_spw):
        spw = str(i)
        # if os.path.exists(f"{src_dir}/casa_files/{imagename}_{spw}_self3*"):
        os.system(f"rm -r {src_dir}/casa_files/{imagename}_{spw}_self3*")
        print("Cleaning on band: " + str(spw))
        # imagename = f"{src_dir}/casa_files/{imagename}_{spw}"
        tclean(
            vis=imagems,
            imagename=f"{src_dir}/casa_files/{imagename}_{spw}_self3",
            selectdata=True,
            mask=f"{src_dir}/casa_files/{imagename}_mfs.mask",
            startmodel=f"{src_dir}/casa_files/{imagename}_{spw}_self2.model",
            spw=spw,
            gain=gain,
            specmode=mode,
            nterms=nterms,
            niter=niter,
            threshold=threshold,
            imsize=imsize,
            cell=cell,
            stokes=stokes,
            weighting=weighting,
            robust=robust,
            antenna=antenna,
            interactive=interactive,
            savemodel="modelcolumn",
            pbcor=False,
            uvrange=uvrange,
        )
        tclean(
            vis=imagems,
            imagename=f"{src_dir}/casa_files/{imagename}_{spw}_self3",
            selectdata=True,
            mask="",
            spw=spw,
            gain=gain,
            specmode=mode,
            nterms=nterms,
            niter=0,
            threshold=threshold,
            imsize=imsize,
            cell=cell,
            stokes=stokes,
            weighting=weighting,
            robust=robust,
            antenna=antenna,
            interactive=interactive,
            pbcor=False,
            savemodel="modelcolumn",
            calcres=False,
            calcpsf=False,
            uvrange=uvrange,
        )
    return
def imgmfs_ms(src_dir, imagems, imagename, ATCA_band, n_spw):
    mode = "mfs"
    nterms = 1
    niter = 3000
    antenna = "0~6,0~6"
    uvrange = ""
    n_spw = n_spw
    if ATCA_band == "L":
        imsize = 2250
        cell = "1arcsec"
        threshold = "2e-2Jy"
    if ATCA_band == "C":
        imsize = 2250
        cell = "0.5arcsec"
        threshold = "2e-2Jy"
    if ATCA_band == "X":
        imsize = 2250
        cell = "0.2arcsec"
        threshold = "2e-2Jy"
    stokes = "I"
    weighting = "briggs"
    robust = 0.5
    interactive = True
    gain = 0.01
    # if os.path.exists(f"{src_dir}/casa_files/{imagename}_mfs*"):
    os.system(f"rm -r {src_dir}/casa_files/{imagename}_mfs*")
    flagmanager(vis=imagems, mode="save", versionname="before_selfcal")
    print("Initiating interactive cleaning on {0}".format(imagename))

    tclean(
        vis=imagems,
        imagename=f"{src_dir}/casa_files/{imagename}_mfs",
        gain=gain,
        specmode=mode,
        nterms=nterms,
        niter=niter,
        threshold=threshold,
        imsize=imsize,
        cell=cell,
        stokes=stokes,
        weighting=weighting,
        robust=robust,
        antenna=antenna,
        interactive=interactive,
        savemodel="modelcolumn",
        pbcor=False,
        uvrange=uvrange,
    )
    tclean(
        vis=imagems,
        imagename=f"{src_dir}/casa_files/{imagename}_mfs",
        gain=gain,
        specmode=mode,
        nterms=nterms,
        niter=0,
        threshold=threshold,
        imsize=imsize,
        cell=cell,
        stokes=stokes,
        weighting=weighting,
        robust=robust,
        antenna=antenna,
        interactive=interactive,
        savemodel="modelcolumn",
        pbcor=False,
        calcres=False,
        calcpsf=False,
        uvrange=uvrange,
    )
    return
def calibrate_ms(src_dir, msname, ATCA_band, ref, pri, sec, tar):
    os.system(f"rm -r {src_dir}/cal_tables/cal_{pri}_{ATCA_band}.F0")
    setjy(
        vis=msname,
        field=pri,
        scalebychan=True,
        standard="Perley-Butler 2010",
        usescratch=True,
    )
    print(f"Performing gain calibration on {pri}")
    gaincal(
        vis=msname,
        caltable=f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.G0",
        field=pri,
        refant=ref,
        gaintype="G",
        calmode="p",
        parang=True,
        # minblperant=3,
        solint="60s",
    )
    print(f"Performing bandpass calibration on {pri}")
    bandpass(
        vis=msname,
        caltable=f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.B0",
        field=pri,
        refant=ref,
        solnorm=True,
        solint="120s",
        bandtype="B",
        gaintable=[f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.G0"],
        parang=True,
    )
    print(f"Determining gains on {sec}")
    gaincal(
        vis=msname,
        caltable=f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.G1",
        field=pri + "," + sec,
        refant=ref,
        gaintype="G",
        calmode="ap",
        parang=True,
        solint="120s",
        gaintable=[f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.B0"],
    )
    bandpass(
        vis=msname,
        caltable=f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.B1",
        field=pri,
        refant=ref,
        solnorm=True,
        solint="120s",
        bandtype="B",
        gaintable=[f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.G1"],
        parang=True,
    )
    print(f"Deriving gain calibration using {pri}")
    gaincal(
        vis=msname,
        caltable=f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.G2",
        field=pri,
        refant=ref,
        gaintype="G",
        calmode="ap",
        parang=True,
        solint="60s",
        # minblperant=3,
        gaintable=[f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.B1"],
    )
    print(f"Deriving gain calibration using {sec}")
    gaincal(
        vis=msname,
        caltable=f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.G2",
        field=sec,
        refant=ref,
        gaintype="G",
        calmode="ap",
        parang=True,
        solint="60s",
        # minblperant=3,
        gaintable=[f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.B1"],
        append=True,
    )
    print(
        "Correcting the flux scale using comparison between the primary and secondary calibrator."
    )
    fluxscale(
        vis=msname,
        caltable=f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.G2",
        fluxtable=f"{src_dir}/cal_tables/cal_{pri}_{ATCA_band}.F0",
        reference=pri,
    )
    flagmanager(vis=msname, mode="save", versionname="before_applycal")
    return
示例#9
0
def flag_hi_foreground(myvis,
                       calibrator_line_range_kms,
                       hi_spw_num,
                       cal_intents=["CALIBRATE*"],
                       test_print=False,
                       test_run=False):
    '''
    Define velocity regions to flag for all (or chosen) calibration
    fields based on intent.

    Parameters
    ----------
    myvis : str
        MS name.
    calibrator_line_range_kms : dict
        Dictionary with velocity range (in LSRK; radio) to flag.
    hi_spw_num : int
        The SPW of HI in the MS. If None is given, the context is used to
        identify the SPW overlapping the HI line (where we can ignore wideband
        continuum SPWs).
    cal_intents : list, optional
        List of the calibrator field intents to apply flagging to.
    test_print : bool, optional
        Print out additional information for testing purposes.

    '''

    # Check context for the calibration sources given the list of intents
    # to flag.

    # Loop through calibrator sources, calling target_foreground_hi_ranges
    # Flag the requested range.

    # Make a new flagging version marking these calls at the end.

    # from taskinit import msmdtool, mstool
    from casatools import ms

    from casatasks import flagdata, flagmanager

    # msmd = msmdtool()
    # ms = mstool()

    # mymsmd = msmd()
    myms = ms()

    # if no fields are provided use observe_target intent
    # I saw once a calibrator also has this intent so check carefully
    # mymsmd.open(myvis)
    myms.open(myvis)

    mymsmd = myms.metadata()

    # Loop through field intents. Default is all calibrators.
    field_nums = []
    for cal_intent in cal_intents:
        field_num = mymsmd.fieldsforintent(cal_intent)

        field_nums.extend(list(field_num))

    # Unique mapping
    field_nums = np.array(list(set(field_nums)))

    field_names = np.asarray(mymsmd.fieldnames())[field_nums]

    mymsmd.close()

    # Loop through the field names, identify in calibrator_line_range_kms,
    # and convert mapping from velocity -> freq (LSRK) -> channel.
    # myms.open(myvis)

    freqs_lsrk = myms.cvelfreqs(spwids=[hi_spw_num], outframe='LSRK')

    myms.close()

    # in Hz
    hi_restfreq = 1.420405752e9
    vels_lsrk = lines_freq2vels(freqs_lsrk, hi_restfreq)

    for field in field_names:

        if field not in calibrator_line_range_kms:
            casalog.post('Unable to locate calibrator {} in calibrator list.'.format(field))
            casalog.post('Check `calibrator_setup.py` to see if this source is missing')

            continue

        vel_start = calibrator_line_range_kms[field]['HI'][0]
        vel_stop = calibrator_line_range_kms[field]['HI'][1]

        # Keep red to blue shifted order.
        if vel_start < vel_stop:
            vel_stop, vel_start = vel_start, vel_stop

        chan_start = np.abs(vels_lsrk - vel_start).argmin()
        chan_stop = np.abs(vels_lsrk - vel_stop).argmin()

        # Do the flagging and save a new version

        if test_print:
            print('Field {0} flagging region {1}:{2}~{3}'.format(field, hi_spw_num,
                                                                 chan_start, chan_stop))
            print('Velocity: {0}, {1}'.format(vel_start, vel_stop))

        if test_run:
            continue

        flagdata(myvis, mode='manual', field=field,
                 spw='{0}:{1}~{2}'.format(hi_spw_num, chan_start, chan_stop),
                 flagbackup=False)

    if not test_run:
        flagmanager(myvis, mode='save', versionname='MW_HI_abs_flagging',
                    comment='Flag Milky Way HI absorption for calibrators.')