Build a reference DataFrame cataloging material, MT numbers, and nuclear-data libraries.
Cataloging nuclear data libraries
├── 1. Read `cross_sections.xml` from each library
├── 2. Extract MT numbers from HDF5 files
├── 3. Rearrange dataframe to one MT per row
├── 4. Build materials-MT-libraries catalog
└── 5. Save df and catalog for future reference1. Read cross_sections.xml from each library¶
import h5py
import openmc
from pathlib import Path
import pandas as pd
import xml.etree.ElementTree as ET
from openmc_workbench_config import DATA_ROOT
rows = []
for neutron_dir in sorted(DATA_ROOT.glob('*/neutron')):
library = neutron_dir.parent.name
xs_xml = neutron_dir.parent / 'cross_sections.xml'
root = ET.parse(xs_xml).getroot()
for element in root.findall('library'):
if element.get('type') != 'neutron':
continue
rows.append({
'materials': element.attrib['materials'],
'path': Path(library) / element.attrib['path'],
'library': library,
})
df = pd.DataFrame(rows)
dfLoading...
2. Extract MT numbers from HDF5 files¶
def get_reactions(filename):
with h5py.File(DATA_ROOT / filename) as ff:
nuclide_name = list(ff.keys())[0]
reactions = ff[nuclide_name]['reactions']
mts = []
for name in reactions:
if name.startswith('reaction_'):
mt = int(name.removeprefix('reaction_'))
mts.append(mt)
return sorted(mts)
df = df.assign(MTs=df['path'].map(get_reactions))
dfLoading...
3. Rearrange dataframe to one MT per row¶
df = df.explode('MTs', ignore_index=True)
df = df.rename(columns={'MTs': 'MT'})
df['MT'] = df['MT'].astype(int)
assert not df.duplicated(['materials', 'MT', 'library']).any()
dfLoading...
4. Build materials-MT-libraries catalog¶
catalog = (
df.groupby(['materials', 'MT'], as_index=False)
.agg(libraries=('library', ', '.join))
.assign(
reaction_name=lambda x: x['MT'].map(openmc.data.REACTION_NAME)
)
)
catalogLoading...
5. Save df and catalog for future reference¶
df_to_save = df.copy()
df_to_save['path'] = df_to_save['path'].astype(str)
df_to_save.to_feather('0_2_catalog_nuclear_data_libraries_df.feather')
catalog.to_feather(
'0_2_catalog_nuclear_data_libraries_catalog.feather',
)Feather in context.
| Format | Size | Speed | Advantages / limitations |
|---|---|---|---|
| Parquet | Small | Fast | Preserves data types, compression, cross-language support |
| Pickle | Variable | Fast | Convenient Python serialization, but unsafe from untrusted sources |
| CSV | Larger | Slower | Human-readable, universal, loses type information |
| Feather | Small | Very fast | Good for quick DataFrame exchange |
| SQLite | Variable | Query-dependent | Useful for SQL searches without loading the full catalog |