import os
import matplotlib
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from .comparison import Comparison
from .modelplot import Plot
from ..log import debugLogging, warningLogging
from ..util.util import query_yes_no
# some global matplotlib vars
mpl.rcParams['axes.labelsize'] = 11 # set the value globally
mpl.rcParams['axes.linewidth'] = 1 # set the value globally
mpl.rcParams['text.antialiased'] = True
mpl.rcParams['errorbar.capsize'] = 2
prop_cycle = plt.rcParams['axes.prop_cycle']
prop_colors = prop_cycle.by_key()['color']
[docs]
def main():
import argparse
parser = argparse.ArgumentParser(description='Pytmosph3R-Plotter')
parser.add_argument("-i", "--input", dest='input_files', nargs='+', type=str, required=True,
help="Input hdf5 file from pytmosph3r")
parser.add_argument("-o", "--output-dir", dest="output_dir", type=str, required=True,
help="output directory to store plots")
parser.add_argument("-a", "--all", dest="all", default=False, action='store_true',
help="Generate all (relevant) plots")
parser.add_argument("-aa", "--absolutely-all", dest="all", const=2, action='store_const',
help="Plot absolutely everything (probably too much information!)")
parser.add_argument("-x", "--plot-xprofile", dest="xprofile", default=False,
help="Plot molecular profiles", action='store_true')
parser.add_argument("-aer", "--aerosols", dest="aprofile", default=False, help="Plot aerosol profiles",
action='store_true')
parser.add_argument("-t", "--plot-tpprofile", dest="tpprofile", default=False,
help="Plot Temperature profiles", action='store_true')
parser.add_argument("-z", "--plot-zpprofile", dest="zpprofile", default=False,
help="Plot Altitude-Pressure profiles", action='store_true')
parser.add_argument("-d", "--plot-tau", dest="tau", default=False, help="Plot optical depth contribution",
action="store_true")
parser.add_argument("-s", "--plot-spectrum", dest="spectrum", nargs='*', default=False,
help="Plot spectrum")
parser.add_argument("-tr", "--transmittance", dest="transmittance", nargs='*', default=False,
help="Plot transmittance (optional: choose wavenumbers)")
parser.add_argument("-e", "--emission", dest="emission", nargs='*', default=False,
help="Plot emission (optional: choose wavenumbers)")
parser.add_argument("-L", "--lightcurve", dest="lightcurve", nargs='*', default=False,
help="Plot lightcurves (and select phases)")
parser.add_argument("-P", "--phasecurve", dest="phasecurve", nargs='*', default=False,
help="Plot phasecurves (and select phases)")
parser.add_argument("-wns", "--wavenumbers", dest="wns", nargs='*', default=None,
help="Wavenumbers to plot")
parser.add_argument("-wls", "--wavelengths", dest="wls", nargs='*', default=None,
help="Wavelengths to plot")
parser.add_argument("-sl", "--substellar-longitude", dest="substellar_longitude", default=None,
type=float, help="Define longitude of the substellar point.")
parser.add_argument("-2D", "--plot-2D", dest="plot_2D", default=False,
help="Plot all 2D profiles (T, P, gases, aerosols)", action="store_true")
parser.add_argument("-g", "--debug", dest='debug', default=False, action="store_true",
help="Force to stop on fail.")
parser.add_argument("-int", "--interactive", dest="interactive", default=False, help="Interactive plot",
action='store_true')
parser.add_argument("-c", "--compare", dest="compare", default=None, nargs='+',
help="Override the list of models to compare in spectra difference. By default, compares every model to the first.",
action='append')
parser.add_argument("-neg", "--negative", dest="negative", default=True,
help="Turn off absolute value of spectra difference (to differentiate negative from positive differences).",
action='store_false')
parser.add_argument("-T", "--title", dest="title", type=str, help="Title of plots")
parser.add_argument("-sx", "--suffix", dest="suffix", type=str, help="File suffix for outputs")
parser.add_argument("-alt", "--altitudes", dest='altitudes', nargs='+', type=str,
default=["surface", "top", "middle"], help="Altitudes to print")
parser.add_argument("-lat", "--latitudes", dest='latitudes', nargs='+', type=str, default=["equator"],
help="Latitudes to print")
parser.add_argument("-lon", "--longitudes", dest='longitudes', nargs='+', type=str,
default=["day", "terminator", "night"], help="Longitudes to print")
parser.add_argument("-m", "--color-map", dest="cmap", type=str, default="Paired",
help="Matplotlib colormap to use")
parser.add_argument("-l", "--labels", dest="labels", nargs='+', type=str, default=None,
help="Set model name for labels")
parser.add_argument("-R", "--resolution", dest="resolution", type=float, default=None,
help="Resolution to bin spectra to")
parser.add_argument("-rad", "--radius-factor", dest="r_factor", default=1., type=float,
help="Radius factor. Should be between 0 and 1 (to make atmosphere bigger).")
parser.add_argument("-zmax", "--max-altitude", dest="zmax", default=np.inf, type=float,
help="Max altitude to plot. By default, max altitude of the model.")
parser.add_argument("-r", "--rays", dest="plot_rays", default=False, help="Plot Rays",
action="store_true")
parser.add_argument("-rr", "--rays-coords", dest="rays", default=False, help="Plot rays coordinates",
action='store_true')
parser.add_argument("-nrp", "--no-rays-points", dest="points", default=True,
help="Plot intersection points", action='store_false')
parser.add_argument("-rm", "--rays-midpoints", dest="mid_points", default=False,
help="Plot mid-subray points", action='store_true')
args = parser.parse_args()
warningLogging()
if args.debug:
debugLogging()
wns = args.wns
wls = args.wls
plot_xprofile = args.xprofile or args.all
plot_aprofile = args.aprofile or args.all
plot_tp_profile = args.tpprofile or args.all
plot_zp_profile = args.zpprofile or args.all
plot_spectrum = args.spectrum or (
not isinstance(args.spectrum, bool) and not len(args.spectrum)) or args.all
transmittance = args.transmittance or (
not isinstance(args.transmittance, bool) and not len(args.transmittance)) or args.all
emission = args.emission or (not isinstance(args.emission, bool) and not len(args.emission)) or args.all
phasecurve = args.phasecurve or (
not isinstance(args.phasecurve, bool) and not len(args.phasecurve)) or args.all
lightcurve = args.lightcurve or (
not isinstance(args.lightcurve, bool) and not len(args.lightcurve)) or args.all
plot_rays = args.plot_rays or (args.all == 2) or args.mid_points
if not (
plot_xprofile or plot_tp_profile or plot_zp_profile or plot_spectrum or transmittance or args.plot_2D or plot_rays):
plot_spectrum = True # if no plot, then plot spectrum
print("Plotting %s" % args.input_files)
if len(args.input_files) > 1:
# Superimpose multiple plots
plots = []
labels = args.labels
if args.labels is None:
labels = args.input_files
for idx, file in enumerate(args.input_files):
if args.labels is None:
labels[idx] = os.path.splitext(file)[0]
plot = Plot(file, cmap=args.cmap, interactive=args.interactive,
title=args.title, suffix=args.suffix,
out_folder=args.output_dir,
zmax=args.zmax,
r_factor=args.r_factor,
substellar_longitude=args.substellar_longitude,
label=labels[idx])
plot.altitudes = args.altitudes
plot.longitudes = args.longitudes
plot.latitudes = args.latitudes
plots.append(plot)
comparison = Comparison(plots, interactive=args.interactive, cmap=args.cmap,
title=args.title, suffix=args.suffix, out_folder=args.output_dir)
comparison.altitudes = args.altitudes
comparison.longitudes = args.longitudes
comparison.latitudes = args.latitudes
if plot_spectrum:
comparison.plot_diff_spectra(resolution=args.resolution, compares=args.compare,
abs=(not args.negative))
comparison.plot_spectra(resolution=args.resolution)
comparison.diff_spectra(resolution=args.resolution, ids=args.compare, abs=(not args.negative))
if plot_xprofile:
comparison.plot_xprofiles()
if plot_tp_profile:
comparison.plot_tps()
if plot_zp_profile:
comparison.plot_zps()
if phasecurve:
comparison.plot_diff_spectra(mode="phasecurve", phase=phasecurve, resolution=args.resolution,
compares=args.compare, abs=(not args.negative))
comparison.plot_phasecurves(wl=wls, wn=wns)
comparison.plot_diff_phasecurves(wl=wls, wn=wns)
if lightcurve:
comparison.plot_diff_spectra(mode="lightcurve", phase=lightcurve, resolution=args.resolution,
compares=args.compare, abs=(not args.negative))
comparison.plot_lightcurves(wl=wls, wn=wns)
comparison.plot_diff_lightcurves(wl=wls, wn=wns)
comparison.plot_2d_lightcurves_residuals()
return
if not args.interactive:
matplotlib.use('Agg')
file = args.input_files[0] # only one plot
plot = Plot(file, cmap=args.cmap, interactive=args.interactive,
title=args.title, suffix=args.suffix,
out_folder=args.output_dir,
zmax=args.zmax,
r_factor=args.r_factor,
substellar_longitude=args.substellar_longitude,
)
plot.altitudes = args.altitudes
plot.longitudes = args.longitudes
plot.latitudes = args.latitudes
if plot_spectrum:
plot.plot_spectrum(resolution=args.resolution)
if transmittance:
if wls is None and wns is None and not isinstance(transmittance, bool):
wls = transmittance
plot.transmittance_map(wl=wls, wn=wns)
if emission:
if wls is None and wns is None and not isinstance(emission, bool):
wls = emission
plot.emission_map(wl=wls, wn=wns)
if phasecurve:
plot.plot_spectrum(mode="phasecurve", phase=phasecurve, resolution=args.resolution)
plot.plot_phasecurve(wl=wls, wn=wns)
plot.plot_2d_phasecurve()
if emission:
plot.emission_map(wl=wls, wn=wns, mode="phasecurve")
if lightcurve:
plot.plot_lightcurve(wl=wls, wn=wns)
plot.plot_spectrum(mode="lightcurve", phase=lightcurve, resolution=args.resolution)
plot.plot_2d_lightcurve()
if transmittance:
if wls is None and wns is None and not isinstance(transmittance, bool):
wls = transmittance
if isinstance(lightcurve, (float, int, str)) or len(lightcurve) < 10 or query_yes_no(
"Number of phases is %s. Computing transmittance maps could take a while. Do you want to continue?" % len(
lightcurve)):
plot.transmittance_map(wl=wls, wn=wns, phase=lightcurve,
mode="lightcurve",
save_name="transmittances/transmittance")
plot.transmittance_animation(wl=wls, wn=wns, phase=lightcurve)
if plot_xprofile:
plot.plot_xprofiles()
if plot_tp_profile:
plot.plot_tps()
if plot_zp_profile:
plot.plot_zps()
if args.plot_2D or plot_tp_profile or args.all:
plot.t_maps()
if args.plot_2D or plot_tp_profile or (args.all > 1):
plot.t_maps(dim="longitude")
plot.t_maps(dim="altitude")
if args.plot_2D or plot_xprofile or args.all:
plot.x_maps()
if args.plot_2D or plot_xprofile or (args.all > 1):
plot.x_maps(dim="longitude")
plot.x_maps(dim="altitude")
if args.plot_2D or plot_aprofile or args.all:
plot.a_maps()
if args.plot_2D or plot_aprofile or (args.all > 1):
plot.a_maps(dim="longitude")
plot.a_maps(dim="altitude")
if plot_rays:
plot.plot_rays(points=args.points, mid_points=args.mid_points, rays=args.rays)
if __name__ == "__main__":
main()