Пример #1
0
import copy
import matplotlib.pyplot as plt
import os
import numpy as np
from spydiff import import_difmap_model, modelfit_difmap, clean_difmap
from uv_data import UVData
from model import Model
from from_fits import create_clean_image_from_fits_file
from mojave import (download_mojave_uv_fits, get_mojave_mdl_file,
                    mojave_uv_fits_fname)

data_dir = '/home/ilya/vlbi_errors/model_cov/check_image_add'
tsv_table = os.path.join(data_dir, 'asu.tsv')
source = '2230+114'
epoch = '2005-02-05'
uv_fits = mojave_uv_fits_fname(source, 'u', epoch.replace('-', '_'))
path_to_script = '/home/ilya/github/vlbi_errors/difmap/final_clean_nw'
mdl_fname = '{}_{}.mdl'.format(source, epoch)

# Fetch uv-fits
download_mojave_uv_fits(source, [epoch.replace('-', '_')],
                        bands=['u'],
                        download_dir=data_dir)
# Fetch model file
get_mojave_mdl_file(tsv_table, source, epoch, outdir=data_dir)
# Clean uv-fits
clean_difmap(uv_fits,
             'cc.fits',
             'I', [1024, 0.1],
             path=data_dir,
             path_to_script=path_to_script,
Пример #2
0
def coverage_of_model(original_uv_fits,
                      original_mdl_file,
                      outdir=None,
                      n_cov=100,
                      n_boot=300,
                      mapsize=(1024, 0.1),
                      path_to_script=None):
    """
    Conduct coverage analysis of uv-data & model

    :param original_uv_fits:
        Self-calibrated uv-fits file.
    :param original_mdl_file:
        Difmap txt-file with model.
    :param outdir:
        Output directory to store results.
    :param n_cov:
        Number of samples to create.
    """
    # Create sample of 100 uv-fits data & models
    sample_uv_fits_paths, sample_model_paths = create_sample(original_uv_fits,
                                                             original_mdl_file,
                                                             outdir=outdir,
                                                             n_sample=n_cov)

    # For each sample uv-fits & model find 1) conventional errors & 2) bootstrap
    # errors
    for j, (sample_uv_fits_path, sample_mdl_path) in enumerate(
            zip(sample_uv_fits_paths, sample_model_paths)):
        sample_uv_fits, dir = os.path.split(sample_uv_fits_path)
        sample_mdl_file, dir = os.path.split(sample_mdl_path)
        try:
            comps = import_difmap_model(sample_mdl_file, dir)
        except ValueError:
            print('Problem import difmap model')
        model = Model(stokes='I')
        model.add_components(*comps)

        # Find errors by using Fomalont way
        # 1. Clean uv-data
        clean_difmap(sample_uv_fits,
                     'sample_cc_{}.fits'.format(j),
                     'I',
                     mapsize,
                     path=dir,
                     path_to_script=path_to_script,
                     outpath=dir)
        # 2. Get beam
        ccimage = create_clean_image_from_fits_file(
            os.path.join(dir, 'sample_cc_{}.fits'.format(j)))
        beam = ccimage.beam_image

        # 2. Subtract components convolved with beam
        ccimage.substract_model(model)

        # Find errors by using Lee way
        # a) fit uv-data and find model
        # b) CLEAN uv-data
        # c) substract model from CLEAN image
        # d) find errors
        pass

        # Find errors by using bootstrap
        # FT model to uv-plane
        uvdata = UVData(sample_uv_fits_path)
        try:
            boot = CleanBootstrap([model], uvdata)
        # If uv-data contains only one Stokes parameter (e.g. `0838+133`)
        except IndexError:
            print('Problem bootstrapping')
        curdir = os.getcwd()
        os.chdir(dir)
        boot.run(n=n_boot, nonparametric=True, outname=[outname, '.fits'])
        os.chdir(curdir)

        booted_uv_paths = sorted(
            glob.glob(os.path.join(data_dir, outname + "*")))
        # Modelfit bootstrapped uvdata
        for booted_uv_path in booted_uv_paths:
            path, booted_uv_file = os.path.split(booted_uv_path)
            i = booted_uv_file.split('_')[-1].split('.')[0]
            modelfit_difmap(booted_uv_file,
                            dfm_model_fname,
                            dfm_model_fname + '_' + i,
                            path=path,
                            mdl_path=data_dir,
                            out_path=data_dir)

        # Get params of initial model used for bootstrap
        comps = import_difmap_model(dfm_model_fname, data_dir)
        comps_params0 = {i: [] for i in range(len(comps))}
        for i, comp in enumerate(comps):
            comps_params0[i].extend(list(comp.p))

        # Load bootstrap models
        booted_mdl_paths = glob.glob(
            os.path.join(data_dir, dfm_model_fname + "_*"))
        comps_params = {i: [] for i in range(len(comps))}
        for booted_mdl_path in booted_mdl_paths:
            path, booted_mdl_file = os.path.split(booted_mdl_path)
            comps = import_difmap_model(booted_mdl_file, path)
            for i, comp in enumerate(comps):
                comps_params[i].extend(list(comp.p))

        # Print 65-% intervals (1 sigma)
        for i, comp in enumerate(comps):
            errors_fname = '68_{}_{}_comp{}.txt'.format(source, last_epoch, i)
            fn = open(os.path.join(data_dir, errors_fname), 'w')
            print "Component #{}".format(i + 1)
            for j in range(len(comp)):
                low, high, mean, median = hdi_of_mcmc(np.array(
                    comps_params[i]).reshape((n_boot, len(comp))).T[j],
                                                      cred_mass=0.68,
                                                      return_mean_median=True)
                fn.write("{} {} {} {} {}".format(comp.p[j], low, high, mean,
                                                 median))
                fn.write("\n")
            fn.close()

    # For source in sources with component close to core
    # 1. Find residuals or estimate noise
    # 2. N times add resampled residuals (or just gaussian noise) to model and
    # create N new datasets
    # 3. Fit them using difmap.
    # 4. Find errors using Fomalont, Yee and using bootstrap. Check coverage.
    base_dir = '/home/ilya/vlbi_errors/model_cov'
    n_boot = 300
    outname = 'boot_uv'
    names = [
        'source', 'id', 'trash', 'epoch', 'flux', 'r', 'pa', 'bmaj', 'e', 'bpa'
    ]
    df = pd.read_table(os.path.join(base_dir, 'asu.tsv'),
                       sep=';',
                       header=None,
                       names=names,
                       dtype={key: str
                              for key in names},
                       index_col=False)

    # Mow for all sources get the latest epoch and create directory for analysis
    for source in df['source'].unique():
        epochs = df.loc[df['source'] == source]['epoch']
        last_epoch_ = list(epochs)[-1]
        last_epoch = last_epoch_.replace('-', '_')
        data_dir = os.path.join(base_dir, source, last_epoch)
        if not os.path.exists(data_dir):
            os.makedirs(data_dir)
        try:
            download_mojave_uv_fits(source,
                                    epochs=[last_epoch],
                                    bands=['u'],
                                    download_dir=data_dir)
        except:
            open(
                'problem_download_from_mojave_{}_{}'.format(
                    source, last_epoch), 'a').close()
            continue
        uv_fits_fname = mojave_uv_fits_fname(source, 'u', last_epoch)

        # Create instance of Model and bootstrap uv-data
        dfm_model_fname = 'dfmp_original_model.mdl'
        fn = open(os.path.join(data_dir, dfm_model_fname), 'w')
        model_df = df.loc[np.logical_and(df['source'] == source,
                                         df['epoch'] == last_epoch_)]
        for (flux, r, pa, bmaj, e, bpa) in np.asarray(
                model_df[['flux', 'r', 'pa', 'bmaj', 'e', 'bpa']]):
            print flux, r, pa, bmaj, e, bpa
            if not r.strip(' '):
                r = '0.0'
            if not pa.strip(' '):
                pa = '0.0'

            if not bmaj.strip(' '):
                bmaj = '0.0'
            if not e.strip(' '):
                e = "1.0"

            if np.isnan(float(bpa)):
                bpa = "0.0"
            else:
                bpa = bpa + 'v'

            if bmaj == '0.0':
                type_ = 0
                bpa = "0.0"
            else:
                bmaj = bmaj + 'v'
                type_ = 1
            fn.write("{}v {}v {}v {} {} {} {} {} {}".format(
                flux, r, pa, bmaj, e, bpa, type_, "0", "0\n"))
        fn.close()
Пример #3
0
def download_mojave_models(base_dir):
    """
    Download MOJAVE models & uv-fits files.
    :param base_dir:
        Directory with MOJAVE table.
    """
    names = [
        'source', 'id', 'trash', 'epoch', 'flux', 'r', 'pa', 'bmaj', 'e', 'bpa'
    ]
    df = pd.read_table(os.path.join(base_dir, 'asu.tsv'),
                       sep=';',
                       header=None,
                       names=names,
                       dtype={key: str
                              for key in names},
                       index_col=False)

    # Mow for all sources get the latest epoch and create directory for analysis
    for source in df['source'].unique():
        epochs = df.loc[df['source'] == source]['epoch']
        last_epoch_ = list(epochs)[-1]
        last_epoch = last_epoch_.replace('-', '_')
        data_dir = os.path.join(base_dir, source, last_epoch)
        if not os.path.exists(data_dir):
            os.makedirs(data_dir)
        try:
            download_mojave_uv_fits(source,
                                    epochs=[last_epoch],
                                    bands=['u'],
                                    download_dir=data_dir)
        except:
            open(
                'problem_download_from_mojave_{}_{}'.format(
                    source, last_epoch), 'a').close()
            continue
        uv_fits_fname = mojave_uv_fits_fname(source, 'u', last_epoch)

        # Create instance of Model and bootstrap uv-data
        dfm_model_fname = 'dfmp_original_model.mdl'
        fn = open(os.path.join(data_dir, dfm_model_fname), 'w')
        model_df = df.loc[np.logical_and(df['source'] == source,
                                         df['epoch'] == last_epoch_)]
        for (flux, r, pa, bmaj, e, bpa) in np.asarray(
                model_df[['flux', 'r', 'pa', 'bmaj', 'e', 'bpa']]):
            print flux, r, pa, bmaj, e, bpa
            if not r.strip(' '):
                r = '0.0'
            if not pa.strip(' '):
                pa = '0.0'

            if not bmaj.strip(' '):
                bmaj = '0.0'
            if not e.strip(' '):
                e = "1.0"

            if np.isnan(float(bpa)):
                bpa = "0.0"
            else:
                bpa = bpa + 'v'

            if bmaj == '0.0':
                type_ = 0
                bpa = "0.0"
            else:
                bmaj = bmaj + 'v'
                type_ = 1
            fn.write("{}v {}v {}v {} {} {} {} {} {}".format(
                flux, r, pa, bmaj, e, bpa, type_, "0", "0\n"))
        fn.close()
Пример #4
0
    if len(source_dict[source]) > 5:
        epoch = source_dict[source][0][5]
        source_dir = os.path.join(base_dir, source, epoch)
        if not os.path.exists(source_dir):
            os.makedirs(source_dir)

        get_mojave_mdl_file(os.path.join(base_dir, 'asu.tsv'),
                            source,
                            epoch,
                            outdir=source_dir)
        epoch_ = "{}_{}_{}".format(*epoch.split('-'))
        download_mojave_uv_fits(source,
                                epochs=[epoch_],
                                download_dir=source_dir,
                                bands=['u'])
        fname = mojave_uv_fits_fname(source, 'u', epoch_)
        uvdata = UVData(os.path.join(source_dir, fname))
        print(uvdata.stokes)
        if 'RR' not in uvdata.stokes or 'LL' not in uvdata.stokes:
            continue

        # Refit difmap model
        modelfit_difmap(fname,
                        "{}_{}.mdl".format(source, epoch),
                        "{}_{}.mdl".format(source, epoch),
                        niter=200,
                        path=source_dir,
                        mdl_path=source_dir,
                        out_path=source_dir,
                        show_difmap_output=True)
Пример #5
0
            raise Exception("ci_type must be rms or boot!")

        data_dir = os.path.join(base_dir, source, stokes, ci_type, str(perc))
        print "Calculating {} CI with nominal coverage {}".format(
            ci_type, perc)
        print "Using directory {}".format(data_dir)

        if not os.path.exists(data_dir):
            os.makedirs(data_dir)
        download_mojave_uv_fits(source,
                                epochs=epochs,
                                bands=bands,
                                download_dir=data_dir)

        # Classic coverage analysis
        fname = mojave_uv_fits_fname(source, bands[0], epochs[0])
        original_uv_fits_path = os.path.join(data_dir, fname)
        # sample_uv_fits_paths, sample_cc_fits_paths =\
        #     create_sample(original_uv_fits_path, imsize=imsize, outdir=data_dir,
        #                   path_to_script=path_to_script)
        sample_cc_fits_paths = sorted(
            glob.glob(os.path.join(data_dir, 'sample_cc_*.fits')))
        # sample_cc_fits_paths = None
        sample_uv_fits_paths = sorted(
            glob.glob(os.path.join(data_dir, 'sample_uv_*.uvf')))
        # sample_uv_fits_paths = None
        original_cc_fits_path = os.path.join(data_dir, 'original_cc.fits')
        # original_cc_fits_path = None
        coverage_map =\
            create_coverage_map_classic(original_uv_fits_path, ci_type=ci_type,
                                        original_cc_fits_path=original_cc_fits_path,
Пример #6
0
import corner
from components import CGComponent
from model import Model
from uv_data import UVData
from mojave import mojave_uv_fits_fname, download_mojave_uv_fits
from spydiff import modelfit_difmap, import_difmap_model
from bootstrap import bootstrap_uvfits_with_difmap_model

source = '1514-241'
epoch = '2006_04_28'
data_dir = '/home/ilya/Dropbox/papers/boot/bias/new/stationary'
# download_mojave_uv_fits(source, epochs=[epoch], bands=['u'],
#                         download_dir=data_dir)

uv_fits_fnames = {
    freq: mojave_uv_fits_fname(source, freq, epoch)
    for freq in ('x', 'j', 'u')
}
for freq, uv_fits_fname in uv_fits_fnames.items():
    uv_fits_path = os.path.join(data_dir, uv_fits_fname)
    cg1 = CGComponent(2.0, 0., 0., 0.2)
    cg2 = CGComponent(1.0, 0., 0.3, 0.3)
    cg3 = CGComponent(0.5, 0., 1.5, 0.4)
    mdl = Model(stokes='I')
    mdl.add_components(cg1, cg2, cg3)
    uvdata = UVData(uv_fits_path)
    noise = uvdata.noise()
    for i in range(1, 101):
        uvdata = UVData(uv_fits_path)
        uvdata.substitute([mdl])
        uvdata.noise_add(noise)
Пример #7
0
# FIXME: Cutting IFs results in different uvw
import os
import numpy as np
from mojave import mojave_uv_fits_fname
from spydiff import import_difmap_model, modelfit_difmap
from model import Model
from uv_data import UVData
import astropy.io.fits as pf

data_dir = '/home/ilya/silke/if'
boot_dir = '/home/ilya/silke/if/boot'
epoch = '2017_01_28'

uv_fits_fname = mojave_uv_fits_fname('0851+202', 'u', epoch)
uv_fits_path = os.path.join(data_dir, uv_fits_fname)

# # Create sequence of FITS files with different number of bands - from 1 to 7
# for i in range(1, 8):
#     uvdata = UVData(uv_fits_path)
#     imdata = uvdata.hdu.data['DATA'][:, :, :, :i, :, :, :]
#     pardata = [uvdata.hdu.data[key] for key in uvdata.hdu.data.parnames]
#     pardata[5] = np.zeros(len(pardata[4]))
#     pardata[0] *= uvdata.frequency
#     pardata[1] *= uvdata.frequency
#     pardata[2] *= uvdata.frequency
#     pscales = [uvdata.hdu.header['PSCAL{}'.format(i)] for i in
#                range(1, len(uvdata.hdu.parnames)+1)]
#     pzeros = [uvdata.hdu.header['PZERO{}'.format(i)] for i in
#               range(1, len(uvdata.hdu.parnames)+1)]
#     x = pf.GroupData(imdata, parnames=uvdata.hdu.data.parnames, pardata=pardata,
#                      bitpix=-32, parbzeros=pzeros)
Пример #8
0
# for epoch_ready in epochs_ready:
#     dir, fname = os.path.split(epoch_ready)
#     epochs_ready_.append(fname[7:-4])
# epochs_ready = ['2001_04_01', '2001_01_04', '1998_10_30', '2007_08_09',
#                 '1999_01_09', '2002_11_23']
epochs_ready = []
for path in original_dfm_models:
    fname = os.path.split(path)[-1]
    epoch = fname[:-4]
    print("Processing epoch : {}".format(epoch))
    if epoch in epochs_ready:
        print("Skipping epoch {}".format(epoch))
        continue
    original_model_fname = fname
    original_model_path = os.path.join(data_dir, original_model_fname)
    uv_fits_fname = mojave_uv_fits_fname('0316+413', 'u', epoch)
    uv_fits_path = os.path.join(data_dir, uv_fits_fname)

    uvdata = UVData(uv_fits_path)
    try:
        del uvdata.hdu.header['HISTORY']
        uvdata.save(rewrite=True, downscale_by_freq=False)
    except KeyError:
        pass

    out_txt_file = os.path.join(txt_file_dir, 'errors_{}.mod'.format(epoch))
    out_png_file = os.path.join(txt_file_dir, 'errors_{}.png'.format(epoch))
    try:
        bootstrap_uvfits_with_difmap_model(uv_fits_path,
                                           original_model_path,
                                           n_boot=100,
Пример #9
0
import corner
from components import CGComponent
from model import Model
from uv_data import UVData
from mojave import mojave_uv_fits_fname, download_mojave_uv_fits
from spydiff import modelfit_difmap, import_difmap_model
from bootstrap import bootstrap_uvfits_with_difmap_model


source = '1514-241'
epoch = '2006_04_28'
data_dir = '/home/ilya/Dropbox/papers/boot/bias/new/stationary'
# download_mojave_uv_fits(source, epochs=[epoch], bands=['u'],
#                         download_dir=data_dir)

uv_fits_fnames = {freq: mojave_uv_fits_fname(source, freq, epoch) for freq in
                  ('x', 'j', 'u')}
for freq, uv_fits_fname in uv_fits_fnames.items():
    uv_fits_path = os.path.join(data_dir, uv_fits_fname)
    cg1 = CGComponent(2.0, 0., 0., 0.2)
    cg2 = CGComponent(1.0, 0., 0.3, 0.3)
    cg3 = CGComponent(0.5, 0., 1.5, 0.4)
    mdl = Model(stokes='I')
    mdl.add_components(cg1, cg2, cg3)
    uvdata = UVData(uv_fits_path)
    noise = uvdata.noise()
    for i in range(1, 101):
        uvdata = UVData(uv_fits_path)
        uvdata.substitute([mdl])
        uvdata.noise_add(noise)
        art_fits_fname = 'art_{}_{}.fits'.format(freq, i)
Пример #10
0
        'y': (512, 0.1),
        'j': (512, 0.1),
        'u': (512, 0.1)
    }
    mapsize_common = (512, 0.1)
    data_dir = os.path.join(base_dir, source, epoch)
    bands = ['x', 'y', 'j', 'u']
    if not os.path.exists(data_dir):
        os.makedirs(data_dir)
    from mojave import download_mojave_uv_fits
    download_mojave_uv_fits(source,
                            epochs=[epoch],
                            bands=bands,
                            download_dir=data_dir)
    from mojave import mojave_uv_fits_fname
    uv_fits_fnames = [
        mojave_uv_fits_fname(source, band, epoch) for band in bands
    ]
    uv_fits_paths = [
        os.path.join(data_dir, uv_fits_fname)
        for uv_fits_fname in uv_fits_fnames
    ]

    analyze_source(uv_fits_paths,
                   n_boot=30,
                   outdir=data_dir,
                   path_to_script=path_to_script,
                   imsizes=mapsize_dict.values(),
                   common_imsize=mapsize_common,
                   find_shifts=False)