update
This commit is contained in:
+28
-14
@@ -122,10 +122,10 @@ class Comparator(Aggregator, HDF5Container):
|
|||||||
def _time_series(self, getter, arg=None):
|
def _time_series(self, getter, arg=None):
|
||||||
series = {}
|
series = {}
|
||||||
for run in self.runs:
|
for run in self.runs:
|
||||||
series[run] = np.zeros(len(self.nums[run]))
|
series[run] = []
|
||||||
for i, num in enumerate(self.nums[run]):
|
for i, num in enumerate(self.nums[run]):
|
||||||
series[run][i] = getter(run, num, arg=arg)
|
series[run].apend(getter(run, num, arg=arg))
|
||||||
return series
|
return np.array(series)
|
||||||
|
|
||||||
def _comp(self, getter, use_num=True):
|
def _comp(self, getter, use_num=True):
|
||||||
prop = np.zeros(len(self.runs))
|
prop = np.zeros(len(self.runs))
|
||||||
@@ -137,9 +137,7 @@ class Comparator(Aggregator, HDF5Container):
|
|||||||
prop[i] = getter(run)
|
prop[i] = getter(run)
|
||||||
return prop
|
return prop
|
||||||
|
|
||||||
def _time_avg(
|
def _time_avg(self, name, start=None, end=None, span=None, group="/series"):
|
||||||
self, name, start=None, end=None, span=None, ergodic=False, group="/series"
|
|
||||||
):
|
|
||||||
mean = np.zeros(len(self.runs))
|
mean = np.zeros(len(self.runs))
|
||||||
median = np.zeros(len(self.runs))
|
median = np.zeros(len(self.runs))
|
||||||
std = np.zeros(len(self.runs))
|
std = np.zeros(len(self.runs))
|
||||||
@@ -169,15 +167,11 @@ class Comparator(Aggregator, HDF5Container):
|
|||||||
|
|
||||||
mask = mask & (time >= start_r) & (time <= end_r) & np.isfinite(serie)
|
mask = mask & (time >= start_r) & (time <= end_r) & np.isfinite(serie)
|
||||||
|
|
||||||
mean[i] = np.mean(serie[mask])
|
mean[i] = np.mean(serie[mask], axis=0)
|
||||||
std[i] = np.std(serie[mask])
|
std[i] = np.std(serie[mask], axis=0)
|
||||||
v_min[i], q025[i], median[i], q975[i], v_max[i] = np.percentile(
|
v_min[i], q025[i], median[i], q975[i], v_max[i] = np.percentile(
|
||||||
serie[mask], [0, 2.5, 50, 97.5, 100]
|
serie[mask], [0, 2.5, 50, 97.5, 100], axis=0
|
||||||
)
|
)
|
||||||
if ergodic: # If the process is ergodic ...
|
|
||||||
std[i] = std[i] / np.sqrt(len(serie[mask]))
|
|
||||||
else:
|
|
||||||
std[i] = std[i]
|
|
||||||
return {
|
return {
|
||||||
"runs": self.runs,
|
"runs": self.runs,
|
||||||
"mean": mean,
|
"mean": mean,
|
||||||
@@ -195,6 +189,12 @@ class Comparator(Aggregator, HDF5Container):
|
|||||||
node_name = node_name + "_" + str(arg)
|
node_name = node_name + "_" + str(arg)
|
||||||
return pp.get_attribute(node_name, attr_name)
|
return pp.get_attribute(node_name, attr_name)
|
||||||
|
|
||||||
|
def get_pp_value(self, name, run, num, arg=None):
|
||||||
|
pp = self.pp[run][num]
|
||||||
|
if not arg is None:
|
||||||
|
name = name + "_" + str(arg)
|
||||||
|
return pp.get_value(name)
|
||||||
|
|
||||||
def get_global(self, node_name, run, num, arg=None, unload_cells=False):
|
def get_global(self, node_name, run, num, arg=None, unload_cells=False):
|
||||||
if not arg is None:
|
if not arg is None:
|
||||||
node_name = node_name + "_" + str(arg)
|
node_name = node_name + "_" + str(arg)
|
||||||
@@ -509,6 +509,14 @@ class Comparator(Aggregator, HDF5Container):
|
|||||||
unit="unit_time",
|
unit="unit_time",
|
||||||
dependencies=["time_num"],
|
dependencies=["time_num"],
|
||||||
),
|
),
|
||||||
|
"time_rho_prof": Rule(
|
||||||
|
self,
|
||||||
|
partial(
|
||||||
|
self._time_series, partial(self.get_pp_value, "/profile/rho_prof")
|
||||||
|
),
|
||||||
|
group="/series",
|
||||||
|
dependencies={"time": None, "rho_prof": "__parent__"},
|
||||||
|
),
|
||||||
"time_pdf_slope_coldens": Rule(
|
"time_pdf_slope_coldens": Rule(
|
||||||
self,
|
self,
|
||||||
partial(
|
partial(
|
||||||
@@ -535,7 +543,13 @@ class Comparator(Aggregator, HDF5Container):
|
|||||||
self._gen_rule_time_global("mwa_sigma", "time_sigma", unit="unit_velocity")
|
self._gen_rule_time_global("mwa_sigma", "time_sigma", unit="unit_velocity")
|
||||||
self._gen_rule_time_global("max_fluct_coldens")
|
self._gen_rule_time_global("max_fluct_coldens")
|
||||||
|
|
||||||
for name in ["issfr", "time_sigma", "time_pdf_slope_coldens", "turb_power"]:
|
for name in [
|
||||||
|
"issfr",
|
||||||
|
"time_sigma",
|
||||||
|
"time_pdf_slope_coldens",
|
||||||
|
"turb_power",
|
||||||
|
"time_rho_prof",
|
||||||
|
]:
|
||||||
self._gen_rule_avg(name)
|
self._gen_rule_avg(name)
|
||||||
|
|
||||||
self._gen_rule_avg("sinks_from_log", "mass_sink")
|
self._gen_rule_avg("sinks_from_log", "mass_sink")
|
||||||
|
|||||||
+31
-5
@@ -129,6 +129,8 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
if rule.kind == "classic":
|
if rule.kind == "classic":
|
||||||
try:
|
try:
|
||||||
runs = kwargs.pop("runs")
|
runs = kwargs.pop("runs")
|
||||||
|
if isinstance(runs, RunSelector):
|
||||||
|
runs = runs.runs
|
||||||
except KeyError:
|
except KeyError:
|
||||||
runs = self.runs
|
runs = self.runs
|
||||||
|
|
||||||
@@ -150,7 +152,12 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
run=run,
|
run=run,
|
||||||
**kwargs
|
**kwargs
|
||||||
)
|
)
|
||||||
except TypeError:
|
except TypeError as e:
|
||||||
|
if (
|
||||||
|
str(e)
|
||||||
|
!= "'LocatableAxes' object does not support indexing"
|
||||||
|
):
|
||||||
|
raise
|
||||||
self._plot_rule(
|
self._plot_rule(
|
||||||
rule,
|
rule,
|
||||||
save,
|
save,
|
||||||
@@ -207,7 +214,7 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
tag_name = "_" + tag_name
|
tag_name = "_" + tag_name
|
||||||
|
|
||||||
if not run is None and not num is None:
|
if not run is None and not num is None:
|
||||||
fmt = "{out}/{run}/{name}{tag}_{run}_{num:05}_{ext}"
|
fmt = "{out}/{run}/{name}{tag}_{run}_{num:05}{ext}"
|
||||||
elif not run is None:
|
elif not run is None:
|
||||||
fmt = "{out}/{run}/{name}{tag}_{run}{ext}"
|
fmt = "{out}/{run}/{name}{tag}_{run}{ext}"
|
||||||
else:
|
else:
|
||||||
@@ -300,6 +307,7 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
overlays=[],
|
overlays=[],
|
||||||
overlays_kwargs=[],
|
overlays_kwargs=[],
|
||||||
title=None,
|
title=None,
|
||||||
|
put_title=True,
|
||||||
nml_key=None,
|
nml_key=None,
|
||||||
put_time=True,
|
put_time=True,
|
||||||
time_unit=cst.Myr,
|
time_unit=cst.Myr,
|
||||||
@@ -352,6 +360,7 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
if not label is None:
|
if not label is None:
|
||||||
cbar.set_label(label)
|
cbar.set_label(label)
|
||||||
|
|
||||||
|
if put_title:
|
||||||
title = self._label_run(run, node, title, nml_key)
|
title = self._label_run(run, node, title, nml_key)
|
||||||
|
|
||||||
if put_time:
|
if put_time:
|
||||||
@@ -470,6 +479,7 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
xlog=None,
|
xlog=None,
|
||||||
ylog=False,
|
ylog=False,
|
||||||
kind="bar",
|
kind="bar",
|
||||||
|
color=None,
|
||||||
colors=None,
|
colors=None,
|
||||||
nml_color=None,
|
nml_color=None,
|
||||||
**kwargs
|
**kwargs
|
||||||
@@ -505,8 +515,7 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
|
|
||||||
P.title(title)
|
P.title(title)
|
||||||
|
|
||||||
color = None
|
if color is None and not colors is None:
|
||||||
if not colors is None:
|
|
||||||
if nml_color is None:
|
if nml_color is None:
|
||||||
color = colors[run]
|
color = colors[run]
|
||||||
else:
|
else:
|
||||||
@@ -547,6 +556,7 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
self,
|
self,
|
||||||
name_x,
|
name_x,
|
||||||
name_y,
|
name_y,
|
||||||
|
node_arg=None,
|
||||||
xlabel=None,
|
xlabel=None,
|
||||||
ylabel=None,
|
ylabel=None,
|
||||||
label=None,
|
label=None,
|
||||||
@@ -558,14 +568,19 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
fitlabel=None,
|
fitlabel=None,
|
||||||
smooth=0,
|
smooth=0,
|
||||||
nml_key=None,
|
nml_key=None,
|
||||||
|
run=None,
|
||||||
runs=None,
|
runs=None,
|
||||||
yerr_kind="std",
|
yerr_kind="std",
|
||||||
sigma_err=2.0,
|
sigma_err=2.0,
|
||||||
|
grid=True,
|
||||||
colors=None,
|
colors=None,
|
||||||
nml_color=None,
|
nml_color=None,
|
||||||
**kwargs
|
**kwargs
|
||||||
):
|
):
|
||||||
|
|
||||||
|
if not node_arg is None:
|
||||||
|
name_x, name_y = name_x + "_" + node_arg, name_y + "_" + node_arg
|
||||||
|
|
||||||
node_x = self.save.get_node(name_x)
|
node_x = self.save.get_node(name_x)
|
||||||
node_y = self.save.get_node(name_y)
|
node_y = self.save.get_node(name_y)
|
||||||
|
|
||||||
@@ -578,6 +593,8 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
|
|
||||||
P.xlabel(xlabel)
|
P.xlabel(xlabel)
|
||||||
P.ylabel(ylabel)
|
P.ylabel(ylabel)
|
||||||
|
|
||||||
|
if grid:
|
||||||
P.grid()
|
P.grid()
|
||||||
|
|
||||||
yerr = None
|
yerr = None
|
||||||
@@ -588,7 +605,9 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
x, y = x[mask], y[mask]
|
x, y = x[mask], y[mask]
|
||||||
if smooth > 0:
|
if smooth > 0:
|
||||||
y = gaussian_filter1d(y, sigma=smooth)
|
y = gaussian_filter1d(y, sigma=smooth)
|
||||||
(base_line,) = P.plot(x, y, "*", **kwargs)
|
if not run is None:
|
||||||
|
label = self._label_run(run, node_y, label, nml_key)
|
||||||
|
(base_line,) = P.plot(x, y, label=label, **kwargs)
|
||||||
elif "mean" in node_y:
|
elif "mean" in node_y:
|
||||||
x = node_x.read() * xunit_old.express(xunit)
|
x = node_x.read() * xunit_old.express(xunit)
|
||||||
y = node_y.mean.read() * yunit_old.express(yunit)
|
y = node_y.mean.read() * yunit_old.express(yunit)
|
||||||
@@ -616,6 +635,8 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
yerr_min[mask],
|
yerr_min[mask],
|
||||||
yerr_max[mask],
|
yerr_max[mask],
|
||||||
)
|
)
|
||||||
|
if not run is None:
|
||||||
|
label = self._label_run(run, node_y, label, nml_key)
|
||||||
base_line, _, _ = P.errorbar(
|
base_line, _, _ = P.errorbar(
|
||||||
x, y, yerr=[y - yerr_min, yerr_max - y], label=label, **kwargs
|
x, y, yerr=[y - yerr_min, yerr_max - y], label=label, **kwargs
|
||||||
)
|
)
|
||||||
@@ -806,6 +827,11 @@ class Plotter(Aggregator, BaseProcessor):
|
|||||||
"P_pdf": PlotRule(
|
"P_pdf": PlotRule(
|
||||||
self, partial(self._plot_hist, "P_pdf"), "P-PDF", dependencies=["P_pdf"]
|
self, partial(self._plot_hist, "P_pdf"), "P-PDF", dependencies=["P_pdf"]
|
||||||
),
|
),
|
||||||
|
"rho_prof": PlotRule(
|
||||||
|
self,
|
||||||
|
partial(self._plot, "/profile/axis", "/profile/rho_prof"),
|
||||||
|
dependencies=["axis", "rho_prof"],
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
averageables = ["coldens", "rho", "T", "Q"]
|
averageables = ["coldens", "rho", "T", "Q"]
|
||||||
|
|||||||
+51
-1
@@ -1,5 +1,5 @@
|
|||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
import pandas as pd
|
||||||
from baseprocessor import *
|
from baseprocessor import *
|
||||||
|
|
||||||
mass_func = lambda dset: dset["rho"] * dset["dx"] ** 3 # Mass function
|
mass_func = lambda dset: dset["rho"] * dset["dx"] ** 3 # Mass function
|
||||||
@@ -141,6 +141,7 @@ class PostProcessor(HDF5Container):
|
|||||||
for key in cells_pymses.fields:
|
for key in cells_pymses.fields:
|
||||||
self.cells[key] = cells_pymses[key]
|
self.cells[key] = cells_pymses[key]
|
||||||
self.cells["dx"] = cells_pymses.get_sizes()
|
self.cells["dx"] = cells_pymses.get_sizes()
|
||||||
|
self.cells["pos"] = cells_pymses.points
|
||||||
|
|
||||||
if self.pp_params.process.save_cells:
|
if self.pp_params.process.save_cells:
|
||||||
cells_hdf5 = tables.open_file(self.cells_filename, mode="w")
|
cells_hdf5 = tables.open_file(self.cells_filename, mode="w")
|
||||||
@@ -195,6 +196,7 @@ class PostProcessor(HDF5Container):
|
|||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
Map of the average of a quantity (given by getter) along an axis (ax_los)
|
Map of the average of a quantity (given by getter) along an axis (ax_los)
|
||||||
|
Return 2D array
|
||||||
"""
|
"""
|
||||||
if mass_weighted:
|
if mass_weighted:
|
||||||
|
|
||||||
@@ -216,6 +218,38 @@ class PostProcessor(HDF5Container):
|
|||||||
datamap = rt.process(self._cam[ax_los], surf_qty=surf_qty)
|
datamap = rt.process(self._cam[ax_los], surf_qty=surf_qty)
|
||||||
return datamap.map.T
|
return datamap.map.T
|
||||||
|
|
||||||
|
def _get_axis(self, axis):
|
||||||
|
|
||||||
|
if isinstance(axis, str):
|
||||||
|
axis = self._ax_nb[axis]
|
||||||
|
|
||||||
|
self.load_cells()
|
||||||
|
return np.sort(np.unique(self.cells["pos"][:, axis]))
|
||||||
|
|
||||||
|
def _plane_avg_uniform(
|
||||||
|
self, getter, axis, unit=cst.none, mass_weighted=True, surf_qty=False
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Profile of the average of a quantity (given by getter) perpendicular to an axis
|
||||||
|
WARNING : This version only works on an uniform grid, need of a box version for AMR
|
||||||
|
"""
|
||||||
|
self.load_cells()
|
||||||
|
if isinstance(axis, str):
|
||||||
|
axis = self._ax_nb[axis]
|
||||||
|
axis_data = self.cells["pos"][:, axis]
|
||||||
|
value = getter(self.cells)
|
||||||
|
|
||||||
|
df = pd.DataFrame({"axis": axis_data})
|
||||||
|
if mass_weighted:
|
||||||
|
mass = mass_func(self.cells)
|
||||||
|
tot_mass = np.sum(mass)
|
||||||
|
df["value"] = value * mass / tot_mass
|
||||||
|
else:
|
||||||
|
df["value"] = value
|
||||||
|
|
||||||
|
df.sort_values("axis", inplace=True)
|
||||||
|
return df.groupby("axis").mean().values[:, 0]
|
||||||
|
|
||||||
def _vol_avg(self, getter, mass_weighted=True):
|
def _vol_avg(self, getter, mass_weighted=True):
|
||||||
self.load_cells()
|
self.load_cells()
|
||||||
value = getter(self.cells)
|
value = getter(self.cells)
|
||||||
@@ -685,6 +719,22 @@ class PostProcessor(HDF5Container):
|
|||||||
"/hist",
|
"/hist",
|
||||||
unit=self.info["unit_pressure"],
|
unit=self.info["unit_pressure"],
|
||||||
),
|
),
|
||||||
|
# Profiles
|
||||||
|
"axis": Rule(
|
||||||
|
self,
|
||||||
|
partial(self._get_axis),
|
||||||
|
"Axis",
|
||||||
|
"/profile",
|
||||||
|
unit=self.info["unit_length"],
|
||||||
|
),
|
||||||
|
"rho_prof": Rule(
|
||||||
|
self,
|
||||||
|
partial(self._plane_avg_uniform, partial(simple_getter, "rho")),
|
||||||
|
"Rho profile",
|
||||||
|
"/profile",
|
||||||
|
unit=self.info["unit_density"],
|
||||||
|
dependencies=["axis"],
|
||||||
|
),
|
||||||
# globals
|
# globals
|
||||||
"time_num": Rule(
|
"time_num": Rule(
|
||||||
self,
|
self,
|
||||||
|
|||||||
+1547
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user