Informativity of IRAM 30m EMIR observations

[1]:
import os
import sys
import yaml

sys.path.insert(0, os.path.join(".."))

import matplotlib.pyplot as plt

from infobs.informativity import Infobs
from infobs.instruments import IRAM30mEMIR
from infobs.graphics import Settings
from infobs.sampling import Constant, LogUniform

Settings.rotational_only = True

transitions = True  # Set to False to hide line transitions

Instrument

[2]:
linewidth = 10  # km/s

instrument = IRAM30mEMIR(linewidth)

Simulator

[3]:
n_samples = 10_000

samplers = {
    "Av": LogUniform(1, 25),
    "G0": LogUniform(1e1, 1e3),
    "Pth": LogUniform(1e5, 5e6),
    "angle": Constant(0.0),
}
[4]:
with open(os.path.join("informativity", "regimes.yaml"), "r") as f:
    regimes = yaml.safe_load(f)

print("Physical regimes")
for name, desc in regimes.items():
    print(f"{name}: {desc}")
Physical regimes
all: {'Av': [None, None]}
diffuse: {'Av': [None, 3]}
translucent: {'Av': [3, 6]}
filamentary: {'Av': [6, 12]}
dense: {'Av': [12, None]}

Studied lines

[5]:
instrument.available_molecules()
[5]:
['c_c3h2',
 'so',
 'c2h',
 'hcn',
 'hcop',
 'hnc',
 'cs',
 '13c_18o',
 'c_18o',
 '13c_o',
 'cn',
 'co',
 'h2o',
 'h2_18o',
 'n']
[6]:
lines = instrument.available_lines(["co", "13c_o", "c_18o"])
lines.sort()
lines
[6]:
['13c_o_j1__j0',
 '13c_o_j2__j1',
 '13c_o_j3__j2',
 'c_18o_j1__j0',
 'c_18o_j2__j1',
 'c_18o_j3__j2',
 'co_v0_j1__v0_j0',
 'co_v0_j2__v0_j1',
 'co_v0_j3__v0_j2',
 'co_v1_j1__v1_j0',
 'co_v1_j2__v1_j1',
 'co_v1_j3__v1_j2']
[7]:
lines = [line for line in lines if "v1" not in line]
lines
[7]:
['13c_o_j1__j0',
 '13c_o_j2__j1',
 '13c_o_j3__j2',
 'c_18o_j1__j0',
 'c_18o_j2__j1',
 'c_18o_j3__j2',
 'co_v0_j1__v0_j0',
 'co_v0_j2__v0_j1',
 'co_v0_j3__v0_j2']

Definition of instances of Infobs

Reference use case

[8]:
infobs = Infobs(instrument, n_samples, samplers, obstime=30)

infobs.set_path(os.path.join("informativity", "data"))

infobs.set_regimes(regimes)

Deep integration

[9]:
infobs_integ = Infobs(instrument, n_samples, samplers, obstime=300)

infobs_integ.set_path(os.path.join("informativity", "data-integration"))

infobs_integ.set_regimes(regimes)

Excellent observing conditions

[10]:
infobs_ipwv = Infobs(IRAM30mEMIR(linewidth, ipwv=0), n_samples, samplers, obstime=30)

infobs_ipwv.set_path(os.path.join("informativity", "data-ipwv"))

infobs_ipwv.set_regimes(regimes)

Informativity of CO isotopologues lines

Simple informativity plot

[11]:
plt.figure(figsize=(1.6 * 6.4, 1.6 * 0.4 * 4.8), dpi=150)

infobs.plot_info_bars(
    lines,
    "Av",
    restriction="all",
    errorbars=True,
    nfirst=None,
    transitions=True,
)

plt.show()
_images/informativity_20_0.png

Influence of integration time

[12]:
plt.figure(figsize=(1.6 * 6.4, 1.6 * 0.4 * 4.8), dpi=150)

infobs_integ.plot_info_bars_comparison(
    infobs,
    lines,
    "Av",
    restriction="all",
    errorbars=True,
    labels=["Deeper integration", "Reference"],
    transitions=True,
)

plt.show()
_images/informativity_22_0.png

Influence of observing conditions

[13]:
plt.figure(figsize=(1.6 * 6.4, 1.6 * 0.4 * 4.8), dpi=150)

infobs_ipwv.plot_info_bars_comparison(
    infobs,
    lines,
    "Av",
    restriction="all",
    errorbars=True,
    labels=["Excellent conditions", "Normal conditions"],
    transitions=True,
)

plt.show()
_images/informativity_24_0.png

Influence of combining lines

[14]:
import itertools as itt
[15]:
plt.figure(figsize=(1.6 * 6.4, 1.6 * 0.4 * 4.8), dpi=150)

infobs.plot_info_bars(
    itt.combinations(lines, 2),
    "Av",
    restriction="all",
    errorbars=True,
    nfirst=15,  # Display only the 20 most informative lines
    transitions=True,
    bottom_val=2.0,
)

plt.show()
_images/informativity_27_0.png
[16]:
plt.figure(figsize=(1.6 * 6.4, 1.6 * 0.4 * 4.8), dpi=150)

infobs.plot_info_matrix(lines, "Av", restriction="all", transitions=True)

plt.show()
_images/informativity_28_0.png

Influence of physical regime

[17]:
regimes = ["diffuse", "translucent", "filamentary", "dense"]
for regime in regimes:

    plt.figure(figsize=(1.6 * 6.4, 1.6 * 0.4 * 4.8), dpi=150)

    infobs.plot_info_bars(
        lines,
        "Av",
        restriction=regime,
        errorbars=True,
        nfirst=None,
        transitions=True,
    )
    plt.title(f"{regime.capitalize()} gas", fontsize=20, pad=10)

    plt.show()
_images/informativity_30_0.png
_images/informativity_30_1.png
_images/informativity_30_2.png
_images/informativity_30_3.png

Note: The Infobs.plot_info_bars method should be seen as a simple, easy-to-use helpers for displaying mutual information values and the associated error bars. For more specific scripts, feel free to implement your own function by taking Infobs.plot_info_bars as a template.

Information maps

[18]:
n_samples = 200_000

samplers = {
    "Av": LogUniform(1, 40),
    "G0": LogUniform(1, 1e5),
    "Pth": Constant(1e5),
    "angle": Constant(0.0),
}

global_kwargs = {
    "parameters": "Av",
    "xaxis_param": "Av",
    "yaxis_param": "G0",
}

computation_kwargs = {"points": 50, "progress_bar": True}

plot_kwargs = {"cmap": "jet"}

Reference use case

[19]:
infobs_maps = Infobs(instrument, n_samples, samplers, obstime=30)

infobs_maps.set_path(os.path.join("informativity", "maps"))

infobs_maps.set_regimes(regimes)

Deep integration

[20]:
infobs_maps_integ = Infobs(instrument, n_samples, samplers, obstime=300)

infobs_maps_integ.set_path(os.path.join("informativity", "maps-integration"))

infobs_maps_integ.set_regimes(regimes)

Information maps for single lines

[21]:
# Pre-compute maps to be able to get the pixel-wise maximum for colormaps

for line in ["co_v0_j1__v0_j0", "13c_o_j1__j0", "c_18o_j1__j0"]:

    infobs_maps.compute_map(line, **global_kwargs, **computation_kwargs)

# Get maximum mutual information

vmax = infobs_maps.get_info_maps_max(
    ["co_v0_j1__v0_j0", "13c_o_j1__j0", "c_18o_j1__j0"], **global_kwargs
)
[22]:
fig, axs = plt.subplots(1, 3, figsize=(3 * 6.4, 4.8), dpi=150)
axs = axs.flatten()

# 12C0

line = "co_v0_j1__v0_j0"
plt.sca(axs[0])

infobs_maps.plot_info_map(line, **global_kwargs, **plot_kwargs, vmax=vmax)
plt.title(f"${infobs_maps.plotter.line_formatter(line)}$", fontsize=20, pad=10)

# 13C0

line = "13c_o_j1__j0"
plt.sca(axs[1])

infobs_maps.plot_info_map(line, **global_kwargs, **plot_kwargs, vmax=vmax)
plt.title(f"${infobs_maps.plotter.line_formatter(line)}$", fontsize=20, pad=10)

# C180

line = "c_18o_j1__j0"
plt.sca(axs[2])

infobs_maps.plot_info_map(line, **global_kwargs, **plot_kwargs, vmax=vmax)
plt.title(f"${infobs_maps.plotter.line_formatter(line)}$", fontsize=20, pad=10)

plt.tight_layout()
plt.show()
_images/informativity_40_0.png

Influence of integration time

[23]:
line = "c_18o_j1__j0"

# Pre-compute maps to be able to get the pixel-wise maximum for colormaps

infobs_maps.compute_map(line, **global_kwargs, **computation_kwargs)

infobs_integ.compute_map(line, **global_kwargs, **computation_kwargs)

# Get maximum mutual information

vmax = max(
    infobs_maps.get_info_maps_max(
        [line],
        **global_kwargs,
    ),
    infobs_maps_integ.get_info_maps_max(
        [line],
        **global_kwargs,
    ),
)

[24]:
fig, axs = plt.subplots(1, 2, figsize=(2 * 6.4, 4.8), dpi=150)
axs = axs.flatten()

# Reference

plt.sca(axs[0])

infobs_maps.plot_info_map(line, **global_kwargs, **plot_kwargs, vmax=vmax)
plt.title(f"${infobs_maps.plotter.line_formatter(line)}$", fontsize=20, pad=10)

# 10 times longer integration

plt.sca(axs[1])

infobs_maps_integ.plot_info_map(line, **global_kwargs, **plot_kwargs, vmax=vmax)
plt.title(f"${infobs_maps_integ.plotter.line_formatter(line)}$", fontsize=20, pad=10)

plt.tight_layout()
plt.show()
_images/informativity_43_0.png

Influence of combining lines

[26]:
lines = ["co_v0_j1__v0_j0", "13c_o_j1__j0", "c_18o_j1__j0"]

infobs_maps.compute_map(lines, **global_kwargs, **computation_kwargs)

[29]:
fig = plt.figure(dpi=100)

infobs_maps.plot_info_map(lines, **global_kwargs, **plot_kwargs, vmax=vmax)
plt.title(f"${infobs_maps.plotter.lines_comb_formatter(lines)}$", fontsize=20, pad=10)

plt.show()
_images/informativity_46_0.png

Note: The Infobs.plot_info_map method should be seen as a simple, easy-to-use helpers for displaying mutual information maps. For more specific scripts, feel free to implement your own function by taking Infobs.plot_info_map as a template.