"""Outputs using HDF5 format."""importdatetimeimporttypingastimporth5pyimportnumpyasnpfromtaurex.mpiimportonly_master_rankfromtaurex.typesimportArrayTypefromtaurex.typesimportScalarTypefrom.outputimportMetadataTypefrom.outputimportOutputfrom.outputimportOutputGroup
[docs]classHDF5OutputGroup(OutputGroup):"""Stores output data in the HDF5 hierarchical structure."""def__init__(self,entry:t.Optional[h5py.Group]=None,name:t.Optional[str]=None)->None:"""Initialize HDF5 output group."""super().__init__(name=nameor"HDF5Group")self._entry=entry
[docs]@only_master_rankdefwrite_array(self,array_name:str,array:ArrayType,metadata:t.Optional[MetadataType]=None,)->None:"""Write array to HDF5 group."""array=np.array(array)ds=self._entry.create_dataset(str(array_name),data=array,shape=array.shape,dtype=array.dtype)ifmetadata:fork,vinmetadata.items():ds.attrs[k]=v
[docs]@only_master_rankdefwrite_scalar(self,scalar_name:str,scalar:ScalarType,metadata:t.Optional[MetadataType]=None,)->None:"""Write scalar to HDF5 group."""ds=self._entry.create_dataset(str(scalar_name),data=scalar)ifmetadata:fork,vinmetadata.items():ds.attrs[k]=v
[docs]@only_master_rankdefwrite_string(self,string_name:str,string:str,metadata:t.Optional[MetadataType]=None)->None:"""Write string to HDF5 group."""ds=self._entry.create_dataset(str(string_name),data=string)ifmetadata:fork,vinmetadata.items():ds.attrs[k]=v
[docs]defcreate_group(self,group_name:str)->"HDF5OutputGroup":"""Create a group."""entry=Noneifself._entryisnotNone:entry=self._entry.create_group(str(group_name))returnHDF5OutputGroup(entry=entry,name=group_name)else:returnHDF5OutputGroup(name=group_name,entry=None)
[docs]@only_master_rankdefwrite_string_array(self,string_name:str,string_array:t.Sequence[str],metadata:t.Dict[str,t.Any]=None,)->None:"""Write a string array to the output."""ascii_lst=[n.encode("ascii","ignore")forninstring_array]ds=self._entry.create_dataset(str(string_name),(len(ascii_lst),1),"S64",ascii_lst)ifmetadata:fork,vinmetadata.items():ds.attrs[k]=v
[docs]classHDF5Output(Output,HDF5OutputGroup):"""Output using HDF5 format."""def__init__(self,filename,append=False):"""Initialize HDF5 output."""Output.__init__(self,"HDF5Output")HDF5OutputGroup.__init__(self,name="HDF5Output",entry=None)self.filename=filenameself._append=appendself.fd:h5py.File=None
def_open_file(self,fname:str)->h5py.File:"""Open file and write header."""fromtaurex._versionimport__version__mode="w"ifself._append:mode="a"fd=h5py.File(fname,mode=mode)fd.attrs["file_name"]=fnamefd.attrs["file_time"]=datetime.datetime.now().isoformat()fd.attrs["creator"]=self.__class__.__name__fd.attrs["HDF5_Version"]=h5py.version.hdf5_versionfd.attrs["h5py_version"]=h5py.version.versionfd.attrs["program_name"]="TauREx"fd.attrs["program_version"]=__version__returnfd