Skip to content
This repository was archived by the owner on Nov 6, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 23 additions & 8 deletions src/pymodaq_data/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -3210,15 +3210,15 @@ def get_dim_presents(self) -> List[str]:

return dims

def get_data_from_source(self, source: DataSource, deepcopy=False) -> DataToExport:
def get_data_from_source(self, source: DataSource, deepcopy=False, sort_by_name=False) -> DataToExport:
"""Get the data matching the given DataSource

Returns
-------
DataToExport: filtered with data matching the dimensionality
"""
source = enum_checker(DataSource, source)
return self.get_data_from_attribute('source', source, deepcopy=deepcopy)
return self.get_data_from_attribute('source', source, deepcopy=deepcopy, sort_by_name=sort_by_name)

def get_data_from_missing_attribute(self, attribute: str, deepcopy=False) -> DataToExport:
""" Get the data matching a given attribute value
Expand All @@ -3238,33 +3238,48 @@ def get_data_from_missing_attribute(self, attribute: str, deepcopy=False) -> Dat
else:
return DataToExport(self.name, data=[dwa for dwa in self if not hasattr(dwa, attribute)])

def get_data_from_attribute(self, attribute: str, attribute_value: Any, deepcopy=False) -> DataToExport:
def get_data_from_attribute(self, attribute: str,
attribute_value: Any,
deepcopy=False,
sort_by_name=False) -> DataToExport:
"""Get the data matching a given attribute value

Parameters
----------
attribute: str
The name of the attribute to sort data with
attribute_value: Any
The value of the attribute
deepcopy: bool
If True, the returned data are deepcopied from the original
sort_by_name: bool
If True the returned data are sorted alphabetically using their name, default is False
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here


Returns
-------
DataToExport: filtered with data matching the attribute presence and value
"""
selection = find_objects_in_list_from_attr_name_val(self.data, attribute, attribute_value,
return_first=False)
selection.sort(key=lambda elt: elt[0].name)
if sort_by_name:
selection.sort(key=lambda elt: elt[0].name)
if deepcopy:
data = [sel[0].deepcopy() for sel in selection]
else:
data = [sel[0] for sel in selection]
return DataToExport(name=self.name, data=data)

def get_data_from_dim(self, dim: DataDim, deepcopy=False) -> DataToExport:
def get_data_from_dim(self, dim: DataDim, deepcopy=False, sort_by_name=False) -> DataToExport:
"""Get the data matching the given DataDim

Returns
-------
DataToExport: filtered with data matching the dimensionality
"""
dim = enum_checker(DataDim, dim)
return self.get_data_from_attribute('dim', dim, deepcopy=deepcopy)
return self.get_data_from_attribute('dim', dim, deepcopy=deepcopy, sort_by_name=sort_by_name)

def get_data_from_dims(self, dims: List[DataDim], deepcopy=False) -> DataToExport:
def get_data_from_dims(self, dims: List[DataDim], deepcopy=False, sort_by_name=False) -> DataToExport:
"""Get the data matching the given DataDim

Returns
Expand All @@ -3273,7 +3288,7 @@ def get_data_from_dims(self, dims: List[DataDim], deepcopy=False) -> DataToExpor
"""
data = DataToExport(name=self.name)
for dim in dims:
data.append(self.get_data_from_dim(dim, deepcopy=deepcopy))
data.append(self.get_data_from_dim(dim, deepcopy=deepcopy, sort_by_name=sort_by_name))
return data

def get_data_from_sig_axes(self, Naxes: int, deepcopy: bool = False) -> DataToExport:
Expand Down
14 changes: 8 additions & 6 deletions tests/data_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1224,20 +1224,22 @@ def test_get_data_from_missing_attribute(self):

def test_get_data_by_dim(self, ini_data_to_export):
dat1, dat2, data = ini_data_to_export
assert len(data.get_data_from_dim(data_mod.DataDim['Data0D'])) == 0
assert len(data.get_data_from_dim(data_mod.DataDim.Data0D)) == 0

dat3 = init_data(data=DATA0D, Ndata=1, name='data0D')
data.append(dat3)
assert isinstance(data.get_data_from_dim('Data0D'), data_mod.DataToExport)
assert data.get_data_from_dim('Data0D').data == [dat3]
assert data.get_data_from_dim(data_mod.DataDim['Data0D']).data == [dat3]
assert data.get_data_from_dim(data_mod.DataDim.Data0D).data == [dat3]

assert data.get_data_from_dim(data_mod.DataDim['Data1D']).data == [dat2]
assert data.get_data_from_dim(data_mod.DataDim['Data2D']).data == [dat1]
assert data.get_data_from_dim(data_mod.DataDim.Data1D).data == [dat2]
assert data.get_data_from_dim(data_mod.DataDim.Data2D).data == [dat1]

dat4 = init_data(data=DATA2D, Ndata=1, name='data2Dbis')
dat4 = init_data(data=DATA2D, Ndata=1, name='0_data2Dbis')
# '0_data2Dbis' 0 is meant for the name to show first if filtered data are sorted
data.append(dat4)
assert data.get_data_from_dim(data_mod.DataDim['Data2D']).data == [dat1, dat4]
assert data.get_data_from_dim(data_mod.DataDim.Data2D).data == [dat1, dat4]
assert data.get_data_from_dim(data_mod.DataDim.Data2D, sort_by_name=True).data == [dat4, dat1]

def test_get_data_from_name(self, ini_data_to_export):
dat1, dat2, data = ini_data_to_export
Expand Down