let the computer do the work
This commit is contained in:
parent
e0e088eaa8
commit
572c3204d0
|
@ -99,7 +99,7 @@ class ConfigMaterial(Config):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def load_DREAM3D(fname,
|
def load_DREAM3D(fname,
|
||||||
grain_data=None,cell_data='CellData',cell_ensemble_data='CellEnsembleData',
|
grain_data=None,cell_data=None,cell_ensemble_data='CellEnsembleData',
|
||||||
phases='Phases',Euler_angles='EulerAngles',phase_names='PhaseName',
|
phases='Phases',Euler_angles='EulerAngles',phase_names='PhaseName',
|
||||||
base_group=None):
|
base_group=None):
|
||||||
"""
|
"""
|
||||||
|
@ -120,7 +120,8 @@ class ConfigMaterial(Config):
|
||||||
Name of the group (folder) containing grain-wise data. Defaults
|
Name of the group (folder) containing grain-wise data. Defaults
|
||||||
to None, in which case cell-wise data is used.
|
to None, in which case cell-wise data is used.
|
||||||
cell_data : str
|
cell_data : str
|
||||||
Name of the group (folder) containing cell-wise data. Defaults to 'CellData'.
|
Name of the group (folder) containing cell-wise data. Defaults to
|
||||||
|
None in wich case it is automatically detected.
|
||||||
cell_ensemble_data : str
|
cell_ensemble_data : str
|
||||||
Name of the group (folder) containing data of cell ensembles. This
|
Name of the group (folder) containing data of cell ensembles. This
|
||||||
group is used to inquire the name of the phases. Phases will get
|
group is used to inquire the name of the phases. Phases will get
|
||||||
|
@ -141,11 +142,12 @@ class ConfigMaterial(Config):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
b = util.DREAM3D_base_group(fname) if base_group is None else base_group
|
b = util.DREAM3D_base_group(fname) if base_group is None else base_group
|
||||||
|
c = util.DREAM3D_cell_data_group(fname) if cell_data is None else cell_data
|
||||||
f = h5py.File(fname,'r')
|
f = h5py.File(fname,'r')
|
||||||
|
|
||||||
if grain_data is None:
|
if grain_data is None:
|
||||||
phase = f[os.path.join(b,cell_data,phases)][()].flatten()
|
phase = f[os.path.join(b,c,phases)][()].flatten()
|
||||||
O = Rotation.from_Euler_angles(f[os.path.join(b,cell_data,Euler_angles)]).as_quaternion().reshape(-1,4) # noqa
|
O = Rotation.from_Euler_angles(f[os.path.join(b,c,Euler_angles)]).as_quaternion().reshape(-1,4) # noqa
|
||||||
_,idx = np.unique(np.hstack([O,phase.reshape(-1,1)]),return_index=True,axis=0)
|
_,idx = np.unique(np.hstack([O,phase.reshape(-1,1)]),return_index=True,axis=0)
|
||||||
idx = np.sort(idx)
|
idx = np.sort(idx)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -257,7 +257,7 @@ class Grid:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def load_DREAM3D(fname,
|
def load_DREAM3D(fname,
|
||||||
feature_IDs=None,cell_data='CellData',
|
feature_IDs=None,cell_data=None,
|
||||||
phases='Phases',Euler_angles='EulerAngles',
|
phases='Phases',Euler_angles='EulerAngles',
|
||||||
base_group=None):
|
base_group=None):
|
||||||
"""
|
"""
|
||||||
|
@ -279,7 +279,8 @@ class Grid:
|
||||||
grain-wise data. Defaults to 'None', in which case cell-wise
|
grain-wise data. Defaults to 'None', in which case cell-wise
|
||||||
data is used.
|
data is used.
|
||||||
cell_data : str
|
cell_data : str
|
||||||
Name of the group (folder) containing cell-wise data. Defaults to 'CellData'.
|
Name of the group (folder) containing cell-wise data. Defaults to
|
||||||
|
None in wich case it is automatically detected.
|
||||||
phases : str
|
phases : str
|
||||||
Name of the dataset containing the phase ID. It is not used for
|
Name of the dataset containing the phase ID. It is not used for
|
||||||
grain-wise data, i.e. when feature_IDs is not None.
|
grain-wise data, i.e. when feature_IDs is not None.
|
||||||
|
@ -296,19 +297,21 @@ class Grid:
|
||||||
|
|
||||||
"""
|
"""
|
||||||
b = util.DREAM3D_base_group(fname) if base_group is None else base_group
|
b = util.DREAM3D_base_group(fname) if base_group is None else base_group
|
||||||
|
c = util.DREAM3D_cell_data_group(fname) if cell_data is None else cell_data
|
||||||
f = h5py.File(fname, 'r')
|
f = h5py.File(fname, 'r')
|
||||||
|
|
||||||
cells = f[os.path.join(b,'_SIMPL_GEOMETRY','DIMENSIONS')][()]
|
cells = f[os.path.join(b,'_SIMPL_GEOMETRY','DIMENSIONS')][()]
|
||||||
size = f[os.path.join(b,'_SIMPL_GEOMETRY','SPACING')] * cells
|
size = f[os.path.join(b,'_SIMPL_GEOMETRY','SPACING')] * cells
|
||||||
origin = f[os.path.join(b,'_SIMPL_GEOMETRY','ORIGIN')][()]
|
origin = f[os.path.join(b,'_SIMPL_GEOMETRY','ORIGIN')][()]
|
||||||
|
|
||||||
if feature_IDs is None:
|
if feature_IDs is None:
|
||||||
phase = f[os.path.join(b,cell_data,phases)][()].reshape(-1,1)
|
phase = f[os.path.join(b,c,phases)][()].reshape(-1,1)
|
||||||
O = Rotation.from_Euler_angles(f[os.path.join(b,cell_data,Euler_angles)]).as_quaternion().reshape(-1,4) # noqa
|
O = Rotation.from_Euler_angles(f[os.path.join(b,c,Euler_angles)]).as_quaternion().reshape(-1,4) # noqa
|
||||||
unique,unique_inverse = np.unique(np.hstack([O,phase]),return_inverse=True,axis=0)
|
unique,unique_inverse = np.unique(np.hstack([O,phase]),return_inverse=True,axis=0)
|
||||||
ma = np.arange(cells.prod()) if len(unique) == cells.prod() else \
|
ma = np.arange(cells.prod()) if len(unique) == cells.prod() else \
|
||||||
np.arange(unique.size)[np.argsort(pd.unique(unique_inverse))][unique_inverse]
|
np.arange(unique.size)[np.argsort(pd.unique(unique_inverse))][unique_inverse]
|
||||||
else:
|
else:
|
||||||
ma = f[os.path.join(b,cell_data,feature_IDs)][()].flatten()
|
ma = f[os.path.join(b,c,feature_IDs)][()].flatten()
|
||||||
|
|
||||||
return Grid(ma.reshape(cells,order='F'),size,origin,util.execution_stamp('Grid','load_DREAM3D'))
|
return Grid(ma.reshape(cells,order='F'),size,origin,util.execution_stamp('Grid','load_DREAM3D'))
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ __all__=[
|
||||||
'execution_stamp',
|
'execution_stamp',
|
||||||
'shapeshifter', 'shapeblender',
|
'shapeshifter', 'shapeblender',
|
||||||
'extend_docstring', 'extended_docstring',
|
'extend_docstring', 'extended_docstring',
|
||||||
'DREAM3D_base_group'
|
'DREAM3D_base_group', 'DREAM3D_cell_data_group'
|
||||||
]
|
]
|
||||||
|
|
||||||
####################################################################################################
|
####################################################################################################
|
||||||
|
@ -379,14 +379,52 @@ def extended_docstring(f,extra_docstring):
|
||||||
|
|
||||||
|
|
||||||
def DREAM3D_base_group(fname):
|
def DREAM3D_base_group(fname):
|
||||||
|
"""
|
||||||
|
Determine the base group of a DREAM.3D file.
|
||||||
|
|
||||||
|
The base group is defined as the group (folder) that contains
|
||||||
|
a 'SPACING' dataset in a '_SIMPL_GEOMETRY' group.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fname : str
|
||||||
|
Filename of the DREAM.3D (HDF5) file.
|
||||||
|
|
||||||
|
"""
|
||||||
with h5py.File(fname,'r') as f:
|
with h5py.File(fname,'r') as f:
|
||||||
base_group = f.visit(lambda path: path.rsplit('/',2)[0] if '_SIMPL_GEOMETRY/SPACING' in path else None)
|
base_group = f.visit(lambda path: path.rsplit('/',2)[0] if '_SIMPL_GEOMETRY/SPACING' in path else None)
|
||||||
|
|
||||||
if base_group is None:
|
if base_group is None:
|
||||||
raise ValueError
|
raise ValueError('Could not determine base group in file {fname}.')
|
||||||
|
|
||||||
return base_group
|
return base_group
|
||||||
|
|
||||||
|
def DREAM3D_cell_data_group(fname):
|
||||||
|
"""
|
||||||
|
Determine the cell data group of a DREAM.3D file.
|
||||||
|
|
||||||
|
The cell data group is defined as the group (folder) that contains
|
||||||
|
a dataset in the base group whose length matches the total number
|
||||||
|
of points as specified in '_SIMPL_GEOMETRY/DIMENSIONS'.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fname : str
|
||||||
|
Filename of the DREAM.3D (HDF5) file.
|
||||||
|
|
||||||
|
"""
|
||||||
|
base_group = DREAM3D_base_group(fname)
|
||||||
|
with h5py.File(fname,'r') as f:
|
||||||
|
N_points = np.prod(f[os.path.join(base_group,'_SIMPL_GEOMETRY','DIMENSIONS')])
|
||||||
|
cell_data_group = f[base_group].visititems(lambda path,obj: path.split('/')[0] \
|
||||||
|
if isinstance(obj,h5py._hl.dataset.Dataset) and np.prod(np.shape(obj)) == N_points \
|
||||||
|
else None)
|
||||||
|
|
||||||
|
if cell_data_group is None:
|
||||||
|
raise ValueError('Could not determine cell data group in file {fname}.')
|
||||||
|
|
||||||
|
return cell_data_group
|
||||||
|
|
||||||
####################################################################################################
|
####################################################################################################
|
||||||
# Classes
|
# Classes
|
||||||
####################################################################################################
|
####################################################################################################
|
||||||
|
|
|
@ -133,7 +133,7 @@ class TestConfigMaterial:
|
||||||
|
|
||||||
|
|
||||||
def test_load_DREAM3D_reference(self,tmp_path,ref_path,update):
|
def test_load_DREAM3D_reference(self,tmp_path,ref_path,update):
|
||||||
config = ConfigMaterial.load_DREAM3D(ref_path/'measured.dream3d',cell_data='EBSD Scan Data')
|
config = ConfigMaterial.load_DREAM3D(ref_path/'measured.dream3d')
|
||||||
config.save(tmp_path/'material.yaml')
|
config.save(tmp_path/'material.yaml')
|
||||||
if update:
|
if update:
|
||||||
config.save(ref_path/'measured.material_yaml')
|
config.save(ref_path/'measured.material_yaml')
|
||||||
|
|
|
@ -442,7 +442,7 @@ class TestGrid:
|
||||||
|
|
||||||
|
|
||||||
def test_load_DREAM3D_reference(self,ref_path,update):
|
def test_load_DREAM3D_reference(self,ref_path,update):
|
||||||
current = Grid.load_DREAM3D(ref_path/'measured.dream3d',cell_data='EBSD Scan Data')
|
current = Grid.load_DREAM3D(ref_path/'measured.dream3d')
|
||||||
reference = Grid.load(ref_path/'measured')
|
reference = Grid.load(ref_path/'measured')
|
||||||
if update:
|
if update:
|
||||||
current.save(ref_path/'measured.vtr')
|
current.save(ref_path/'measured.vtr')
|
||||||
|
|
Loading…
Reference in New Issue