black without mortimer
This commit is contained in:
+68
-52
@@ -38,12 +38,9 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
Creates the basic structures needed for the outputs
|
||||
"""
|
||||
|
||||
|
||||
# log id
|
||||
self.log_id = "study({})".format(tag)
|
||||
|
||||
|
||||
|
||||
super(StudyProcessor, self).__init__(path, path_out, params, tag)
|
||||
|
||||
# Open outfile
|
||||
@@ -60,7 +57,12 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
# Select runs
|
||||
if selector is None:
|
||||
selector = RunSelector(
|
||||
path, runs, nums, self.params.input.nml_filename, unit_time=unit_time, **kwargs
|
||||
path,
|
||||
runs,
|
||||
nums,
|
||||
self.params.input.nml_filename,
|
||||
unit_time=unit_time,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
# Save infos
|
||||
@@ -68,7 +70,6 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
self.runs = selector.runs
|
||||
self.nums = selector.nums
|
||||
|
||||
|
||||
run0 = self.runs[0]
|
||||
self.info = selector.info[run0][self.nums[run0][0]]
|
||||
self.namelist = selector.namelist
|
||||
@@ -90,8 +91,6 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
unit_time=unit_time,
|
||||
)
|
||||
|
||||
|
||||
|
||||
# Save namelist and logs
|
||||
if self.params.out.copy_info:
|
||||
for run in self.runs:
|
||||
@@ -158,7 +157,16 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
prop[run] = getter(run)
|
||||
return np.array(list(prop.values()))
|
||||
|
||||
def time_avg(self, name, start=None, end=None, span=None, unit_time=U.Myr, group="/series", select=None):
|
||||
def time_avg(
|
||||
self,
|
||||
name,
|
||||
start=None,
|
||||
end=None,
|
||||
span=None,
|
||||
unit_time=U.Myr,
|
||||
group="/series",
|
||||
select=None,
|
||||
):
|
||||
"""Do the time average and quantiles of a time series
|
||||
|
||||
Parameters
|
||||
@@ -273,18 +281,16 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
return value
|
||||
|
||||
def get_nml(self, nml_key=None, run=None):
|
||||
if run is not None:
|
||||
if nml_key is not None:
|
||||
return self.namelist[run][nml_key]
|
||||
else:
|
||||
return self.namelist[run]
|
||||
else:
|
||||
if nml_key is not None:
|
||||
return {run : self.namelist[run][nml_key] for run in self.runs}
|
||||
else:
|
||||
return self.namelist
|
||||
|
||||
|
||||
if run is not None:
|
||||
if nml_key is not None:
|
||||
return self.namelist[run][nml_key]
|
||||
else:
|
||||
return self.namelist[run]
|
||||
else:
|
||||
if nml_key is not None:
|
||||
return {run: self.namelist[run][nml_key] for run in self.runs}
|
||||
else:
|
||||
return self.namelist
|
||||
|
||||
def get_pdf_slope(self, name, run, num):
|
||||
snap = self.snaps[run][num]
|
||||
@@ -295,7 +301,7 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
def _extract_sinks_from_log(self, series, log_filename, run):
|
||||
cmd_grep = f"grep 'Number of sink' {log_filename} -A 2"
|
||||
content = os.popen(cmd_grep).readlines()
|
||||
block_err = [] # Block that will ill parsed
|
||||
block_err = [] # Block that will ill parsed
|
||||
for i in range(0, len(content), 4):
|
||||
try:
|
||||
nb_sink = np.int(content[i].split("=")[1])
|
||||
@@ -311,11 +317,11 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
|
||||
except (ValueError, IndexError):
|
||||
block_err.append(i)
|
||||
|
||||
|
||||
if len(block_err) > 0:
|
||||
self.logger.warning(
|
||||
f"Errors encountered in parsing {log_filename} (grepped blocks {block_err})"
|
||||
)
|
||||
f"Errors encountered in parsing {log_filename} (grepped blocks {block_err})"
|
||||
)
|
||||
return series
|
||||
|
||||
def _extract_stellar_from_log(self, stellar_objects, log_filename, run):
|
||||
@@ -324,7 +330,7 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
nb_stellar = list(map(lambda s: int(s.split()[1]), content))
|
||||
line_numbers = list(map(lambda s: int(s.split(":")[0]), content))
|
||||
current_line = 0
|
||||
block_err = [] # Block that will ill parsed
|
||||
block_err = [] # Block that will ill parsed
|
||||
logfile = open(log_filename)
|
||||
for i in range(0, len(line_numbers)):
|
||||
try:
|
||||
@@ -334,7 +340,9 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
for j in range(nb_stellar[i]):
|
||||
line_stellar = logfile.readline().split()
|
||||
current_line += 1
|
||||
while line_stellar[0] == "random": # random number outputs are ... random
|
||||
while (
|
||||
line_stellar[0] == "random"
|
||||
): # random number outputs are ... random
|
||||
line_stellar = logfile.readline().split()
|
||||
current_line += 1
|
||||
mass = float(line_stellar[3])
|
||||
@@ -349,11 +357,11 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
|
||||
except (ValueError, IndexError):
|
||||
block_err.append(i)
|
||||
|
||||
|
||||
if len(block_err) > 0:
|
||||
self.logger.warning(
|
||||
f"Errors encountered in parsing {log_filename} (grepped blocks {block_err})"
|
||||
)
|
||||
f"Errors encountered in parsing {log_filename} (grepped blocks {block_err})"
|
||||
)
|
||||
logfile.close()
|
||||
return stellar_objects
|
||||
|
||||
@@ -370,7 +378,7 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
def _extract_fine_step_from_log(self, series, log_filename, run):
|
||||
cmd_grep = "grep 'Fine step' {} ".format(log_filename)
|
||||
content = os.popen(cmd_grep).readlines()
|
||||
block_err = [] # Block that will ill parsed
|
||||
block_err = [] # Block that will ill parsed
|
||||
for i in range(0, len(content)):
|
||||
try:
|
||||
data = content[i].replace("=", " ").split()
|
||||
@@ -388,11 +396,11 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
series["mem_parts"][run].append(mempc2)
|
||||
except (ValueError, IndexError):
|
||||
block_err.append(i)
|
||||
|
||||
|
||||
if len(block_err) > 0:
|
||||
self.logger.warning(
|
||||
f"Error encountered in parsing {log_filename} (grepped blocks {block_err})"
|
||||
)
|
||||
f"Error encountered in parsing {log_filename} (grepped blocks {block_err})"
|
||||
)
|
||||
return series
|
||||
|
||||
def _extract_coarse_step_from_log(self, series, log_filename, run):
|
||||
@@ -462,20 +470,19 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
if content[i][1:5] == "Fine":
|
||||
data = content[i].replace("=", " ").split()
|
||||
time = np.float(data[4])
|
||||
elif content[i][1:3] == "SN" :
|
||||
elif content[i][1:3] == "SN":
|
||||
series["time"][run].append(time)
|
||||
series["SN_momentum"][run].append(np.float(content[i].split()[-1]))
|
||||
else:
|
||||
raise ValueError("Wrong start of line")
|
||||
except (AssertionError, ValueError, IndexError):
|
||||
block_err.append(i)
|
||||
|
||||
|
||||
if len(block_err) > 0:
|
||||
self.logger.warning(
|
||||
f"Error encountered in parsing {log_filename} (grepped blocks {block_err})"
|
||||
)
|
||||
f"Error encountered in parsing {log_filename} (grepped blocks {block_err})"
|
||||
)
|
||||
return series
|
||||
|
||||
|
||||
def get_logs(self, run):
|
||||
glob_str = f"{self.path}/{run}/{self.params.input.log_prefix}*"
|
||||
@@ -508,7 +515,7 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
# Always prefer data from last log, assuming they come in the right order
|
||||
time = series["time"][run]
|
||||
time_new = time[size]
|
||||
ind_overlap = np.searchsorted(time[:size], time_new, side='right')
|
||||
ind_overlap = np.searchsorted(time[:size], time_new, side="right")
|
||||
for key in series:
|
||||
del series[key][run][ind_overlap:size]
|
||||
|
||||
@@ -523,13 +530,13 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
return series
|
||||
|
||||
def get_coldens0(self, run):
|
||||
mp = 1.4 * 1.66 * 10**(-24) * U.g
|
||||
mp = 1.4 * 1.66 * 10 ** (-24) * U.g
|
||||
try:
|
||||
z0 = self.get_nml("galbox_params/height0", run) * U.pc
|
||||
n0 = self.get_nml("galbox_params/dens0", run) * U.cm**(-3)
|
||||
n0 = self.get_nml("galbox_params/dens0", run) * U.cm ** (-3)
|
||||
except KeyError:
|
||||
z0 = self.get_nml("cloud_params/height0", run) * U.pc
|
||||
n0 = self.get_nml("cloud_params/dens0", run) * U.cm**(-3)
|
||||
n0 = self.get_nml("cloud_params/dens0", run) * U.cm ** (-3)
|
||||
|
||||
return (np.sqrt(2 * np.pi) * mp * z0 * n0).express(U.coldens)
|
||||
|
||||
@@ -537,13 +544,13 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
"""
|
||||
Sum of gas plus sink mass
|
||||
"""
|
||||
|
||||
time_gas = self.get_value("/series/coarse_step_from_log/time")
|
||||
|
||||
time_gas = self.get_value("/series/coarse_step_from_log/time")
|
||||
mass_gas = self.get_value("/series/coarse_step_from_log/mcons")
|
||||
mass_sink = self.get_value("/series/sinks_from_log/mass_sink")
|
||||
time_sink = self.get_value("/series/sinks_from_log/time")
|
||||
time_sink = self.get_value("/series/sinks_from_log/time")
|
||||
|
||||
total_mass = dict()
|
||||
total_mass = {}
|
||||
for run in self.runs:
|
||||
|
||||
if time_sink[run][-1] > time_gas[run][-1]:
|
||||
@@ -552,11 +559,13 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
# A bit specific ... needs to be generalized (TODO)
|
||||
info = self.snaps[run][self.nums[run][0]].info
|
||||
surface = (info["unit_length"].express(U.pc)) ** 2
|
||||
m0 = self.get_coldens0(run) * surface # Initial mass in Msun
|
||||
m0 = self.get_coldens0(run) * surface # Initial mass in Msun
|
||||
offset = time_gas[run].size - time_sink[run].size
|
||||
mass_gas[run] = m0 + m0*mass_gas[run] # convert in Msun
|
||||
mass_gas[run] = m0 + m0 * mass_gas[run] # convert in Msun
|
||||
total_mass[run] = mass_gas[run].copy()
|
||||
total_mass[run][offset:] = mass_gas[run][offset:] + mass_sink[run] # re add sink_mass
|
||||
total_mass[run][offset:] = (
|
||||
mass_gas[run][offset:] + mass_sink[run]
|
||||
) # re add sink_mass
|
||||
return time_gas, total_mass, mass_gas
|
||||
|
||||
def _ssfr_from_mass_sink(self, avg_window=None):
|
||||
@@ -841,9 +850,16 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
},
|
||||
),
|
||||
"SN_momentum_from_log": Rule(
|
||||
partial(self._from_log, ["time", "SN_momentum"], self._extract_SN_Mom_from_log),
|
||||
partial(
|
||||
self._from_log,
|
||||
["time", "SN_momentum"],
|
||||
self._extract_SN_Mom_from_log,
|
||||
),
|
||||
group="/series",
|
||||
unit={"time": "unit_time", "SN_momentum" : {"unit_mass" : 1, "unit_velocity" : 1}},
|
||||
unit={
|
||||
"time": "unit_time",
|
||||
"SN_momentum": {"unit_mass": 1, "unit_velocity": 1},
|
||||
},
|
||||
description={
|
||||
"time": "Time",
|
||||
"SN_momentum": "Injected momentum",
|
||||
@@ -934,7 +950,7 @@ class StudyProcessor(Aggregator, HDF5Container):
|
||||
"turb_power",
|
||||
"time_rho_prof",
|
||||
"time_coldens_pdf",
|
||||
"time_rho_pdf"
|
||||
"time_rho_pdf",
|
||||
]:
|
||||
self._gen_rule_avg(name)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user