Source code for pymchelper.writers.hdf

import logging
import numpy as np

logger = logging.getLogger(__name__)


[docs]class HdfWriter: """ Supports writing HDF file format. HDF is designed to store large amounts of data organized in convenient way. One HDF file can handle many single- or multi-dimensional tables. """ def __init__(self, filename, options): self.filename = filename if not self.filename.endswith(".h5"): self.filename += ".h5"
[docs] def write(self, estimator): if len(estimator.pages) > 1: print("Conversion of data with multiple pages not supported yet") return False try: import h5py except ImportError as e: logger.error("Generating HDF5 files not available on your platform (please install h5py).") raise e with h5py.File(self.filename, 'w') as f: # change units for LET from MeV/cm to keV/um if necessary # a copy of data table is made here # from pymchelper.shieldhit.detector.detector_type import SHDetType # if estimator.dettyp in (SHDetType.dlet, SHDetType.dletg, SHDetType.tlet, SHDetType.tletg): # data = estimator.data * np.float64(0.1) # 1 MeV / cm = 0.1 keV / um # if not np.all(np.isnan(estimator.error_raw)) and np.any(estimator.error_raw): # error = estimator.error * np.float64(0.1) # 1 MeV / cm = 0.1 keV / um # else: # data = estimator.data # error = estimator.error # TODO move to reader page = estimator.pages[0] data = page.data error = page.error # save data dset = f.create_dataset("data", data=data, compression="gzip", compression_opts=9) # save error (if present) if not np.all(np.isnan(page.error_raw)) and np.any(page.error_raw): f.create_dataset("error", data=error, compression="gzip", compression_opts=9) # save metadata dset.attrs['name'] = page.name dset.attrs['unit'] = page.unit dset.attrs['nstat'] = estimator.number_of_primaries dset.attrs['counter'] = estimator.file_counter dset.attrs['xaxis_n'] = estimator.x.n dset.attrs['xaxis_min'] = estimator.x.min_val dset.attrs['xaxis_max'] = estimator.x.max_val dset.attrs['xaxis_name'] = estimator.x.name dset.attrs['xaxis_unit'] = estimator.x.unit dset.attrs['yaxis_n'] = estimator.y.n dset.attrs['yaxis_min'] = estimator.y.min_val dset.attrs['yaxis_max'] = estimator.y.max_val dset.attrs['yaxis_name'] = estimator.y.name dset.attrs['yaxis_unit'] = estimator.y.unit dset.attrs['zaxis_n'] = estimator.z.n dset.attrs['zaxis_min'] = estimator.z.min_val dset.attrs['zaxis_max'] = estimator.z.max_val dset.attrs['zaxis_name'] = estimator.z.name dset.attrs['zaxis_unit'] = estimator.z.unit return 0