From 36d2ae1c2a2ed14e018384d437314374b1fd4627 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 22 Sep 2023 15:14:54 +0200 Subject: [PATCH] avoid repeated opening of files --- python/damask/util.py | 34 +++++++++++++++++++++------------- python/tests/test_util.py | 18 ++++++++++++------ 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/python/damask/util.py b/python/damask/util.py index d61ca221b..5e5495e43 100644 --- a/python/damask/util.py +++ b/python/damask/util.py @@ -698,7 +698,7 @@ def pass_on(keyword: str, return wrapper return decorator -def DREAM3D_base_group(fname: _Union[str, _Path]) -> str: +def DREAM3D_base_group(fname: _Union[str, _Path, _h5py.File]) -> str: """ Determine the base group of a DREAM.3D file. @@ -707,7 +707,7 @@ def DREAM3D_base_group(fname: _Union[str, _Path]) -> str: Parameters ---------- - fname : str or pathlib.Path + fname : str, pathlib.Path, or _h5py.File Filename of the DREAM.3D (HDF5) file. Returns @@ -716,15 +716,19 @@ def DREAM3D_base_group(fname: _Union[str, _Path]) -> str: Path to the base group. """ - with _h5py.File(_Path(fname).expanduser(),'r') as f: + def get_base_group(f: _h5py.File) -> str: base_group = f.visit(lambda path: path.rsplit('/',2)[0] if '_SIMPL_GEOMETRY/SPACING' in path else None) + if base_group is None: + raise ValueError(f'could not determine base group in file "{fname}"') + return base_group - if base_group is None: - raise ValueError(f'could not determine base group in file "{fname}"') + if isinstance(fname,_h5py.File): + return get_base_group(fname) - return base_group + with _h5py.File(_Path(fname).expanduser(),'r') as f: + return get_base_group(f) -def DREAM3D_cell_data_group(fname: _Union[str, _Path]) -> str: +def DREAM3D_cell_data_group(fname: _Union[str, _Path, _h5py.File]) -> str: """ Determine the cell data group of a DREAM.3D file. @@ -734,7 +738,7 @@ def DREAM3D_cell_data_group(fname: _Union[str, _Path]) -> str: Parameters ---------- - fname : str or pathlib.Path + fname : str, pathlib.Path, or h5py.File Filename of the DREAM.3D (HDF5) file. Returns @@ -743,17 +747,21 @@ def DREAM3D_cell_data_group(fname: _Union[str, _Path]) -> str: Path to the cell data group. """ - base_group = DREAM3D_base_group(fname) - with _h5py.File(_Path(fname).expanduser(),'r') as f: + def get_cell_data_group(f: _h5py.File) -> str: + base_group = DREAM3D_base_group(f) cells = tuple(f['/'.join([base_group,'_SIMPL_GEOMETRY','DIMENSIONS'])][()][::-1]) cell_data_group = f[base_group].visititems(lambda path,obj: path.split('/')[0] \ if isinstance(obj,_h5py._hl.dataset.Dataset) and _np.shape(obj)[:-1] == cells \ else None) + if cell_data_group is None: + raise ValueError(f'could not determine cell-data group in file "{fname}/{base_group}"') + return cell_data_group - if cell_data_group is None: - raise ValueError(f'could not determine cell-data group in file "{fname}/{base_group}"') + if isinstance(fname,_h5py.File): + return get_cell_data_group(fname) - return cell_data_group + with _h5py.File(_Path(fname).expanduser(),'r') as f: + return get_cell_data_group(f) def Bravais_to_Miller(*, diff --git a/python/tests/test_util.py b/python/tests/test_util.py index 1c765727c..28e90f9f3 100644 --- a/python/tests/test_util.py +++ b/python/tests/test_util.py @@ -146,21 +146,25 @@ class TestUtil: assert 'DAMASK' in style('DAMASK') @pytest.mark.parametrize('complete',[True,False]) - def test_D3D_base_group(self,tmp_path,complete): + @pytest.mark.parametrize('fhandle',[True,False]) + def test_D3D_base_group(self,tmp_path,complete,fhandle): base_group = ''.join(random.choices('DAMASK', k=10)) with h5py.File(tmp_path/'base_group.dream3d','w') as f: f.create_group('/'.join((base_group,'_SIMPL_GEOMETRY'))) if complete: f['/'.join((base_group,'_SIMPL_GEOMETRY'))].create_dataset('SPACING',data=np.ones(3)) + fname = tmp_path/'base_group.dream3d' + if fhandle: fname = h5py.File(fname) if complete: - assert base_group == util.DREAM3D_base_group(tmp_path/'base_group.dream3d') + assert base_group == util.DREAM3D_base_group(fname) else: with pytest.raises(ValueError): - util.DREAM3D_base_group(tmp_path/'base_group.dream3d') + util.DREAM3D_base_group(fname) @pytest.mark.parametrize('complete',[True,False]) - def test_D3D_cell_data_group(self,tmp_path,complete): + @pytest.mark.parametrize('fhandle',[True,False]) + def test_D3D_cell_data_group(self,tmp_path,complete,fhandle): base_group = ''.join(random.choices('DAMASK', k=10)) cell_data_group = ''.join(random.choices('KULeuven', k=10)) cells = np.random.randint(1,50,3) @@ -172,11 +176,13 @@ class TestUtil: if complete: f['/'.join((base_group,cell_data_group))].create_dataset('data',shape=np.append(cells,1)) + fname = tmp_path/'cell_data_group.dream3d' + if fhandle: fname = h5py.File(fname) if complete: - assert cell_data_group == util.DREAM3D_cell_data_group(tmp_path/'cell_data_group.dream3d') + assert cell_data_group == util.DREAM3D_cell_data_group(fname) else: with pytest.raises(ValueError): - util.DREAM3D_cell_data_group(tmp_path/'cell_data_group.dream3d') + util.DREAM3D_cell_data_group(fname) @pytest.mark.parametrize('full,reduced',[({}, {}),