Source code for clevar.clv_yaml.match_metrics_recovery_rate

"""@file match_metrics_recovery_rate.py
Matching metrics - recovery rate functions for command line execution
"""
import os
import numpy as np
import pylab as plt

import clevar
from .helper_funcs import loadconf, make_catalog, make_cosmology, make_bins
[docs]def run(config_file): """Main plot function Parameters ---------- config_file: str Yaml file with configuration to run """ # Create clevar objects from yml config config = loadconf(config_file, load_configs=['catalog1', 'catalog2', 'cosmology', 'masks', 'mt_metrics_recovery'], add_new_configs=['mt_metrics_recovery'], check_matching=True, ) if config is None: return print("\n# Reading Catalog 1") cat1 = make_catalog(config['catalog1']) cat1.load_match(f"{config['outpath']}/match1.fits") ftpt_qt_file1 = f"{config['outpath']}/ftpt_quantities1.fits" _ = cat1.load_footprint_quantities(ftpt_qt_file1) if os.path.isfile(ftpt_qt_file1) else None print("\n# Reading Catalog 2") cat2 = make_catalog(config['catalog2']) cat2.load_match(f"{config['outpath']}/match2.fits") ftpt_qt_file2 = f"{config['outpath']}/ftpt_quantities2.fits" _ = cat2.load_footprint_quantities(ftpt_qt_file2) if os.path.isfile(ftpt_qt_file2) else None print("\n# Creating Cosmology") cosmo = make_cosmology(config['cosmology']) # Print metrics from clevar.match_metrics import recovery # prep configurations rec_conf = {} rec_conf.update(config['mt_metrics_recovery']) # Format values rec_conf['figsize'] = np.array(rec_conf['figsize'].split(' '), dtype=float)/2.54 rec_conf['dpi'] = int(rec_conf['dpi']) str_none = lambda x: None if str(x)=='None' else x for cat in ('catalog1', 'catalog2'): rec_conf[cat]['redshift_bins'] = make_bins(rec_conf[cat]['redshift_bins']) rec_conf[cat]['mass_bins'] = make_bins(rec_conf[cat]['mass_bins'], rec_conf[cat]['log_mass']) rec_conf[cat] = {k: str_none(v) for k, v in rec_conf[cat].items()} ### Plots for cat, ind in zip((cat1, cat2), ('1', '2')): rec_conf_cat = rec_conf[f'catalog{ind}'] kwargs = dict( matching_type=rec_conf['matching_type'], shape=rec_conf['line_type'], redshift_bins=rec_conf_cat['redshift_bins'], mass_bins=rec_conf_cat['mass_bins'], log_mass=rec_conf_cat['log_mass'], recovery_label=rec_conf_cat['recovery_label'], ) mask = np.zeros(cat.size, dtype=bool) mask_case = rec_conf_cat['masks']['case'].lower() if mask_case is not None: for mtype, mconf in rec_conf_cat['masks'].items(): if mtype[:12]=='in_footprint' and mconf.get('use', False): print(f" # Adding footprint mask: {mconf}") mask += ~cat[f"ft_{mconf['name']}"] print(f" * {mask[mask].size:,} clusters masked in total") if mtype[:13]=='coverfraction': print(f" # Adding coverfrac: {mconf}") mask += cat[f"cf_{mconf['name']}"] <= float(mconf['min']) print(f" * {mask[mask].size:,} clusters masked in total") # Add mask to args kwargs[{'all': 'mask', 'unmatched': 'mask_unmatched'}[mask_case]] = mask rec_name = f'{config["outpath"]}/rec_mt{rec_conf["matching_type"]}' rec_suf = {'all':'_0mask', 'unmatched':'_0ummask', 'none':''}[mask_case] # Simple plot if any(case in rec_conf['plot_case'] for case in ('simple', 'all')): # by redshift print(f"\n# Simple recovery catalog {ind} by redshift") fig = plt.figure(figsize=rec_conf['figsize']) ax = plt.axes() recovery.plot(cat, **kwargs, ax=ax, add_legend=rec_conf['add_mass_label'], legend_fmt=rec_conf_cat['mass_num_fmt'], ) ax.set_xlim(rec_conf_cat['redshift_lim']) ax.set_ylim(rec_conf_cat['recovery_lim']) plt.savefig(f'{rec_name}_cat{ind}_simple_redshift{rec_suf}.png', dpi=rec_conf['dpi']) plt.close(fig) # by mass print(f"\n# Simple recovery catalog {ind} by mass") fig = plt.figure(figsize=rec_conf['figsize']) ax = plt.axes() recovery.plot( cat, **kwargs, transpose=True, ax=ax, add_legend=rec_conf['add_redshift_label'], legend_fmt=rec_conf_cat['redshift_num_fmt'], ) ax.set_xlim(rec_conf_cat['mass_lim']) ax.set_ylim(rec_conf_cat['recovery_lim']) plt.savefig(f'{rec_name}_cat{ind}_simple_mass{rec_suf}.png', dpi=rec_conf['dpi']) plt.close(fig) # Panels plots if any(case in rec_conf['plot_case'] for case in ('panel', 'all')): # by redshift print(f"\n# Panel recovery catalog {ind} by redshift") info = recovery.plot_panel( cat, **kwargs, add_label=rec_conf['add_mass_label'], label_fmt=rec_conf_cat['mass_num_fmt'], fig_kwargs={'figsize': rec_conf['figsize']}, ) ax = info['axes'].flatten()[0] ax.set_xlim(rec_conf_cat['redshift_lim']) ax.set_ylim(rec_conf_cat['recovery_lim']) plt.savefig(f'{rec_name}_cat{ind}_panel_redshift{rec_suf}.png', dpi=rec_conf['dpi']) plt.close(info['fig']) # by mass print(f"\n# Panel recovery catalog {ind} by mass") info = recovery.plot_panel( cat, **kwargs, transpose=True, add_label=rec_conf['add_redshift_label'], label_fmt=rec_conf_cat['redshift_num_fmt'], fig_kwargs={'figsize': rec_conf['figsize']},) ax = info['axes'].flatten()[0] ax.set_xlim(rec_conf_cat['mass_lim']) ax.set_ylim(rec_conf_cat['recovery_lim']) plt.savefig(f'{rec_name}_cat{ind}_panel_mass{rec_suf}.png', dpi=rec_conf['dpi']) plt.close(info['fig']) # 2D plots kwargs.pop('shape') kwargs['add_cb'] = rec_conf['add_cb'] if any(case in rec_conf['plot_case'] for case in ('2D', 'all')): # basic print(f"\n# 2D recovery catalog {ind}") fig = plt.figure(figsize=rec_conf['figsize']) ax = plt.axes() recovery.plot2D(cat, **kwargs, ax=ax) ax.set_xlim(rec_conf_cat['redshift_lim']) ax.set_ylim(rec_conf_cat['mass_lim']) plt.savefig(f'{rec_name}_cat{ind}_2D{rec_suf}.png', dpi=rec_conf['dpi']) plt.close(fig) # with number print(f"\n# 2D recovery catalog {ind} with numbers") fig = plt.figure(figsize=rec_conf['figsize']) ax = plt.axes() recovery.plot2D(cat, **kwargs, ax=ax, add_num=True) ax.set_xlim(rec_conf_cat['redshift_lim']) ax.set_ylim(rec_conf_cat['mass_lim']) plt.savefig(f'{rec_name}_cat{ind}_2D_num{rec_suf}.png', dpi=rec_conf['dpi']) plt.close(fig)