diff --git a/aiida_flexpart/data/__init__.py b/aiida_flexpart/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/aiida_flexpart/data/nc_data.py b/aiida_flexpart/data/nc_data.py new file mode 100644 index 0000000..298b815 --- /dev/null +++ b/aiida_flexpart/data/nc_data.py @@ -0,0 +1,44 @@ +import os +from aiida.orm import RemoteData +from netCDF4 import Dataset + +class NetCDFData(RemoteData): + + def __init__(self, filepath=None, remote_path=None, **kwargs): + """ + Data plugin for Netcdf files. + """ + super().__init__(**kwargs) + if filepath is not None: + filename = os.path.basename(filepath) + self.set_remote_path(remote_path) + self.set_filename(filename) + + # open and read as NetCDF + nc_file = Dataset(filepath, mode="r") + self.set_global_attributes(nc_file) + + def set_filename(self, val): + self.base.attributes.set("filename", val) + + def set_global_attributes(self, nc_file): + + g_att = {} + for a in nc_file.ncattrs(): + g_att[a] = repr(nc_file.getncattr(a)) + self.base.attributes.set("global_attributes", g_att) + + nc_dimensions = {i: len(nc_file.dimensions[i]) for i in nc_file.dimensions} + self.base.attributes.set("dimensions", nc_dimensions) + + def ncdump(self): + """ + Small python version of ncdump. + """ + print("dimensions:") + for k, v in self.base.attributes.get("dimensions").items(): + print("\t%s =" % k, v) + + print("// global attributes:") + for k, v in self.base.attributes.get("global_attributes").items(): + print("\t:%s =" % k, v) \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 49e2b69..92a362a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,6 +65,10 @@ docs = [ [project.entry-points."aiida.workflows"] "flexpart.multi_dates" = "aiida_flexpart.workflows.multi_dates_workflow:FlexpartMultipleDatesWorkflow" +[project.entry-points."aiida.data"] +"netcdf.data" = "aiida_flexpart.data.nc_data:NetCDFData" + + [tool.pylint.format] max-line-length = 125