5 from nucleus_multiple_class
import nucleus_multiple
13 Minimalistic class to lazily read WinNet data.
19 - path: Path to the WinNet data
25 self.
filename = os.path.join(path,
"WinNet_data.h5")
28 if not os.path.exists(self.
filename):
40 if not hasattr(self,
"_wreader__A"):
46 Read the mass number A
52 self.
__N, self.
__Z = np.loadtxt(os.path.join(self.
__snapshot_path,
"snapsh_0001.dat"),unpack=
True, usecols=(0,1),
56 with h5py.File(self.
filename,
'r')
as hf:
57 self.
__A = hf[
'snapshots/A'][:]
58 self.
__Z = hf[
'snapshots/Z'][:]
59 self.
__N = hf[
'snapshots/N'][:]
61 error_msg =
'Failed to read A, Z, and N in "'+str(self.
path)+
'". '+\
62 'Snapshots not present as Ascii nor as Hdf5!'
63 raise ValueError(error_msg)
70 if not hasattr(self,
"_wreader__Z"):
79 if not hasattr(self,
"_wreader__N"):
95 snapshot_files = [f
for f
in snapshot_files
if f.startswith(
'snapsh_')]
99 for i, f
in enumerate(tqdm(snapshot_files, desc=
'Reading snapshots')):
100 fname =
'snapsh_' + str(i+1).zfill(4) +
'.dat'
102 lines = file.readlines()
104 for j, line
in enumerate(lines[3:]):
108 with h5py.File(self.
filename,
'r')
as hf:
113 error_msg =
'Failed to read timescales in "'+str(self.
path)+
'". '+\
114 'Not present as Ascii nor as Hdf5!'
115 raise ValueError(error_msg)
121 Check whether an entry is in the hdf5 format (return 1),
122 or in the ascii format (return 2), or does not exist (return 0)
124 if (entry ==
'mainout'):
126 elif (entry ==
'timescales'):
128 elif (entry ==
'energy'):
130 elif (entry ==
'tracked_nuclei'):
131 value = self.
__check_files(
'tracked_nuclei.dat',
'tracked_nuclei')
132 elif (entry ==
'snapshot'):
133 value = self.
__check_files(
'snaps/snapsh_0001.dat',
'snapshots')
134 elif (entry ==
'flows'):
136 elif (entry ==
'finab'):
138 elif (entry ==
'finabsum'):
140 elif (entry ==
'finabelem'):
143 error_msg =
'Checked for unknown entry "'+str(entry)+
'". '
144 raise ValueError(error_msg)
151 Check if something exists in hdf5 or ascii
154 if not os.path.exists(self.
filename):
155 if not os.path.exists(os.path.join(self.
path, ascii_file_path)):
160 with h5py.File(self.
filename,
'r')
as hf:
161 if hdf5_key
in hf.keys():
163 elif os.path.exists(os.path.join(self.
path, ascii_file_path)):
175 if not hasattr(self,
"_wreader__nr_of_snaps"):
181 Read the number of snapshots
188 snapshot_files = [f
for f
in snapshot_files
if f.startswith(
'snapsh_')]
191 with h5py.File(self.
filename,
'r')
as hf:
194 error_msg =
'Failed to read nr of snapshots in "'+str(self.
path)+
'". '+\
195 'Not present as Ascii nor as Hdf5!'
196 raise ValueError(error_msg)
201 Get the tracked nuclei
203 if not hasattr(self,
"_wreader__tracked_nuclei"):
209 Read the tracked nuclei
217 path = os.path.join(self.
path,
"tracked_nuclei.dat")
218 with open(path,
'r')
as f:
219 first_line = f.readline()
221 first_line = first_line.replace(
'Y(',
'')
222 first_line = first_line.replace(
')',
'')
223 first_line = first_line.replace(
'#',
'')
224 track_nuclei_names = first_line.split()[1:]
225 track_nuclei_data = np.loadtxt(path, skiprows=1)
230 Xnuclei = track_nuclei_data[:,1:]*A
237 self.
__tracked_nuclei[
'latex_names'] = [
r"$^{"+str(A[i])+
r"}$"+elnames[i].title()
for i
in range(len(A))]
238 for i, name
in enumerate(track_nuclei_names):
241 with h5py.File(self.
filename,
'r')
as hf:
249 for i, name
in enumerate(nm.names):
254 self.
__tracked_nuclei[
'latex_names'] = [
r"$^{"+str(A[i])+
r"}$"+elnames[i].title()
for i
in range(len(A))]
256 error_msg =
'Failed to read tracked nuclei in "'+str(self.
path)+
'". '+\
257 'Not present as Ascii nor as Hdf5!'
258 raise ValueError(error_msg)
263 Get abundance at snapshot idx
265 if not hasattr(self,
"_wreader__snapshots_time"):
272 Get mass fraction at snapshot idx
274 if not hasattr(self,
"_wreader__snapshots_time"):
281 Get time at snapshot idx
283 if not hasattr(self,
"_wreader__snapshots_time"):
290 Get the timescale of "tau", e.g., "tau_ag"
292 if not hasattr(self,
"_wreader__timescales"):
306 with open(os.path.join(self.
path,
"timescales.dat"),
'r')
as f:
307 lines = f.readlines()
309 header = header.replace(
'#',
'').replace(
'[s]',
'').replace(
'[GK]',
'')
311 data = np.loadtxt(os.path.join(self.
path,
"timescales.dat"), unpack=
True)
312 for i, k
in enumerate(key):
316 with h5py.File(self.
filename,
'r')
as hf:
318 for key
in hf[
'timescales'].keys():
321 error_msg =
'Failed to read timescales in "'+str(self.
path)+
'". '+\
322 'Not present as Ascii nor as Hdf5!'
323 raise ValueError(error_msg)
329 Get an entry from the mainout
331 if not hasattr(self,
"_wreader__mainout"):
343 columns = [
'iteration',
'time',
'temp',
'dens',
'ye',
344 'rad',
'yn',
'yp',
'ya',
'ylight',
'yheavy',
345 'zbar',
'abar',
'entr']
346 data = np.loadtxt(os.path.join(self.
path,
"mainout.dat"), unpack=
True)
348 for i, col
in enumerate(columns):
351 with h5py.File(self.
filename,
'r')
as hf:
353 for key
in hf[
'mainout'].keys():
354 self.
__mainout[key] = hf[
'mainout'][key][:]
356 error_msg =
'Failed to read mainout in "'+str(self.
path)+
'". '+\
357 'Not present as Ascii nor as Hdf5!'
358 raise ValueError(error_msg)
366 if not hasattr(self,
"_wreader__energy"):
378 columns = [
'time',
'engen_tot',
'S_src',
'engen_beta',
'engen_ng_gn',
'engen_pg_gp',
379 'engen_ag_ga',
'engen_np_pn',
'engen_na_an',
'engen_ap_pa',
'engen_fiss']
380 data = np.loadtxt(os.path.join(self.
path,
"generated_energy.dat"), unpack=
True)
382 for i, col
in enumerate(columns):
385 with h5py.File(self.
filename,
'r')
as hf:
387 for key
in hf[
'energy'].keys():
388 self.
__energy[key] = hf[
'energy'][key][:]
390 error_msg =
'Failed to read energy in "'+str(self.
path)+
'". '+\
391 'Not present as Ascii nor as Hdf5!'
392 raise ValueError(error_msg)
397 Get the final abundances from the finab.dat file
399 if not hasattr(self,
"_wreader__finab"):
410 A,Z,N,Y,X = np.loadtxt(os.path.join(self.
path,
"finab.dat"), unpack=
True)
412 with h5py.File(self.
filename,
'r')
as hf:
413 A = hf[
'finab/finab/A'][:]
414 Z = hf[
'finab/finab/Z'][:]
416 Y = hf[
'finab/finab/Y'][:]
417 X = hf[
'finab/finab/X'][:]
419 error_msg =
'Failed to read finab in "'+str(self.
path)+
'". '+\
420 'Not present as Ascii nor as Hdf5!'
421 raise ValueError(error_msg)
422 self.
__finab = {
"A": A,
"Z": Z,
"N": N,
"Y": Y,
"X": X}
428 Get the final abundances from the finabsum.dat file
430 if not hasattr(self,
"_wreader__finabsum"):
436 Reader of the finabsum
441 A,Y,X = np.loadtxt(os.path.join(self.
path,
"finabsum.dat"), unpack=
True)
443 with h5py.File(self.
filename,
'r')
as hf:
444 A = hf[
'finab/finabsum/A'][:]
445 Y = hf[
'finab/finabsum/Y'][:]
446 X = hf[
'finab/finabsum/X'][:]
448 error_msg =
'Failed to read finabsum in "'+str(self.
path)+
'". '+\
449 'Not present as Ascii nor as Hdf5!'
450 raise ValueError(error_msg)
457 Get the final abundances from the finabelem.dat file
459 if not hasattr(self,
"_wreader__finabelem"):
465 Reader of the finabsum
470 Z, Y = np.loadtxt(os.path.join(self.
path,
"finabelem.dat"), unpack=
True)
472 with h5py.File(self.
filename,
'r')
as hf:
473 Z = hf[
'finab/finabelem/Z'][:]
474 Y = hf[
'finab/finabelem/Y'][:]
476 error_msg =
'Failed to read finabelem in "'+str(self.
path)+
'". '+\
477 'Not present as Ascii nor as Hdf5!'
478 raise ValueError(error_msg)
488 fname = os.path.join(self.
path,
"flow/flow_" + str(iteration).zfill(4) +
".dat")
489 with open(fname,
'r')
as f:
490 lines = f.readlines()
492 time, temp, dens = np.array(header.split()).astype(float)
495 nin,zin,yin,nout,zout,yout,flows = np.loadtxt(fname, unpack=
True, skiprows=3)
496 nin = nin.astype(int)
497 zin = zin.astype(int)
498 nout = nout.astype(int)
499 zout = zout.astype(int)
512 with h5py.File(self.
filename,
'r')
as hf:
514 for key
in hf[flow_group][str(iteration)].keys():
515 flow[key] = hf[flow_group][str(iteration)][key][:]
517 error_msg =
'Failed to read flow in "'+str(self.
path)+
'". '+\
518 'Not present as Ascii nor as Hdf5!'
519 raise ValueError(error_msg)
523 if __name__ ==
"__main__":
524 w =
wreader(
'/home/mreichert/data/Networks/comparison_winNet/WinNet-dev/runs/Example_MRSN_r_process_winteler')