Figure 5: Retained Flux#

1. Imports#

[1]:
import json
from pathlib import Path

import numpy as np

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import seaborn as sns

from applefy.detections.contrast import Contrast
from applefy.utils.file_handling import load_adi_data
from applefy.utils import flux_ratio2mag
from applefy.utils.photometry import AperturePhotometryMode

from fours.detection_limits.applefy_wrapper import PCADataReductionGPU
from fours.utils.data_handling import read_fours_root_dir
from fours.utils.setups import contrast_grid_setup_1

2. Load the dataset#

[2]:
dataset_name = "HD22049_303_199_C-0065_C_"
root_dir = Path(read_fours_root_dir())
json_file = root_dir / Path("30_data/" + dataset_name + ".json")
Data in the FOURS_ROOT_DIR found. Location: /fast/mbonse/s4
[3]:
experiment_root_dir = root_dir / Path("70_results/x1_fake_planet_experiments/" + dataset_name)
experiment_root_dir.mkdir(exist_ok=True)
[4]:
with open(json_file) as f:
    parameter_config = json.load(f)

dit_psf_template = float(parameter_config["dit_psf"])
dit_science = float(parameter_config["dit_science"])
fwhm = float(parameter_config["fwhm"])
scaling_factor = float(parameter_config["nd_scaling"])
lambda_reg = float(parameter_config["lambda_reg"])
svd_approx = int(parameter_config["svd_approx"])
pixel_scale=0.02718
[5]:
dataset_file = root_dir / Path("30_data/" + dataset_name + ".hdf5")
[6]:
science_data, angles, raw_psf_template_data = load_adi_data(
    dataset_file,
    data_tag="object_stacked_05",
    psf_template_tag="psf_template",
    para_tag="header_object_stacked_05/PARANG")

psf_template = np.median(raw_psf_template_data, axis=0)
[7]:
# we want the image to show the innermost 1.2 arcsec
print(1.2 / pixel_scale * 2)
88.30022075055187
[8]:
# we cut the image to 91 x 91 pixel to be slightly larger than 1.2 arcsec
cut_off = int((science_data.shape[1] - 91) / 2)
science_data = science_data[:, cut_off:-cut_off, cut_off:-cut_off]

3. Create Contrast Instance#

[9]:
contrast_instance = Contrast(
    science_sequence=science_data,
    psf_template=psf_template,
    parang_rad=angles,
    psf_fwhm_radius=fwhm / 2,
    dit_psf_template=dit_psf_template,
    dit_science=dit_science,
    scaling_factor=scaling_factor,
    checkpoint_dir=experiment_root_dir)
[10]:
# get fake planet setup
flux_ratios, separations, num_fake_planets = contrast_grid_setup_1(fwhm)
[11]:
contrast_instance.design_fake_planet_experiments(
    flux_ratios=flux_ratios,
    num_planets=num_fake_planets,
    separations=separations,
    overwrite=True)
Overwriting existing config files.

4. Restore PCA results#

[12]:
pca_algorithm_function = PCADataReductionGPU(
        approx_svd=8000,
        pca_numbers=[10, 50, 60, 70, 80, 90, 100],
        device="cpu",
        work_dir=None,
        special_name="stacked_05",
        verbose=False)
[13]:
contrast_instance.run_fake_planet_experiments(
    algorithm_function=pca_algorithm_function,
    num_parallel=1)
Running fake planet experiments...
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 946/946 [00:55<00:00, 17.07it/s]
[DONE]

5. Compute the throughput#

[14]:
# Use pixel values spaced by the FWHM
photometry_mode_planet = AperturePhotometryMode("F")
photometry_mode_noise = AperturePhotometryMode("P")
[15]:
contrast_instance.prepare_contrast_results(
    photometry_mode_planet=photometry_mode_planet,
    photometry_mode_noise=photometry_mode_noise)
[16]:
contrast_results_1 = contrast_instance.contrast_results["stacked_05_PCA_080_components"]
throughput_results_1 = contrast_results_1.compute_throughput().T

6. Create the Plot#

[17]:
throughput_results_1.index = np.round(flux_ratio2mag(throughput_results_1.index), 2)
throughput_results_1.columns = np.round((throughput_results_1.columns/3.6), 2)
throughput_results = throughput_results_1.iloc[:19, :].iloc[::2, ::2]
[18]:
from matplotlib.colors import LogNorm
[20]:
def plot_throughput(axis_in,
                    tmp_throughput_results,
                    color_bar):

    c_bar_kargs = dict(orientation = "vertical",
                       label = r"Retained flux")

    heat = sns.heatmap(tmp_throughput_results,
                       vmax=0.0, vmin=0.4,
                       annot=True,
                       cmap="YlGnBu",
                       ax=axis_in,
                       norm=LogNorm(),
                       cbar_ax=colorbar_ax,
                       annot_kws={"fontsize":11},
                       cbar_kws=c_bar_kargs)

    ylabels = ['{:d}'.format(int(float(x.get_text()))) for x in heat.get_yticklabels()]
    _=heat.set_yticklabels(ylabels)
[22]:
# 1. Create the plot layout ---------------------------------------
fig = plt.figure(constrained_layout=False, figsize=(8, 5))

gs0 = fig.add_gridspec(1, 2, width_ratios = [1, 0.05])
gs0.update(wspace=0.05)

gs1 = gridspec.GridSpecFromSubplotSpec(
    1, 1, subplot_spec = gs0[0],
    hspace=0.12)
gs2 = gridspec.GridSpecFromSubplotSpec(
    3, 1, subplot_spec = gs0[1],
    height_ratios=[0.1, 0.8, 0.1])

throughput_ax1 = fig.add_subplot(gs1[0])
colorbar_ax = fig.add_subplot(gs2[1])

# 2. Plot the throughput table ------------------------------------
plot_throughput(throughput_ax1, throughput_results,
                color_bar=False)
throughput_ax1.tick_params(
    axis='both', which='major', labelsize=12)

# 3. Create the colorbar ------------------------------------------
cbar = throughput_ax1.collections[0].colorbar
cbar.ax.tick_params(labelsize=14)
throughput_ax1.figure.axes[-1].yaxis.label.set_size(14)

# 4. Labels -------------------------------------------------------
throughput_ax1.set_ylabel(
    r"Fake Planet Contrast [mag]", size=14)
throughput_ax1.set_xlabel(
    r"Separation [$\lambda /D$]", size=14)

throughput_ax1.set_title("Retained flux of PCA (80 components)", y=1.02, size=16, fontweight="bold")

fig.patch.set_facecolor('white')
plt.savefig("./final_plots/04_Throughput.pdf", bbox_inches='tight')
../../_images/04_use_the_fours_paper_experiments_05_throughput_26_0.png