Skip to content

Commit

Permalink
Fix tests for v2
Browse files Browse the repository at this point in the history
  • Loading branch information
jomy-kk committed Mar 11, 2024
1 parent d23101c commit 9d97dc6
Show file tree
Hide file tree
Showing 9 changed files with 31 additions and 26 deletions.
2 changes: 1 addition & 1 deletion src/ltbio/biosignals/modalities/Biosignal.py
Original file line number Diff line number Diff line change
Expand Up @@ -628,7 +628,7 @@ def to_array(self) -> np.ndarray:
if channel.sampling_frequency != max_sf: # Resample the channel, if necessary
channel._resample(max_sf)
# Convert channel to array
channels_as_arrays.append(channel.to_array())
channels_as_arrays.append(channel.samples)

# Get the length of the samples axes
n_samples = ceil((self.final_datetime - self.initial_datetime).total_seconds() * max_sf)
Expand Down
6 changes: 3 additions & 3 deletions src/ltbio/biosignals/modalities/MultimodalBiosignal.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,8 @@ def source(self) -> BiosignalSource | Set[BiosignalSource]:

@property
def acquisition_location(self) -> Set[BodyLocation]:
if self.__acquision_location is not None:
return self.__acquision_location
if super().acquisition_location is not None:
return super().acquisition_location
else:
return {biosignal.acquisition_location for biosignal in self.__biosignals.values()}

Expand All @@ -114,7 +114,7 @@ def __getitem__(self, item):
def __contains__(self, item):
if isinstance(item, Biosignal) and item in self.__biosignals.values():
return True
super().__contains__(item)
return super().__contains__(item)

def __str__(self):
'''Returns a textual description of the MultimodalBiosignal.'''
Expand Down
2 changes: 1 addition & 1 deletion src/ltbio/features/FeatureSelector.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def apply(self, features:Dict[str, Timeseries]) -> Dict[str, Timeseries]:
for feature_name in features:
ts = features[feature_name]
assert len(ts.segments) == 1 # Feature Timeseries should have only 1 Segment
if self.__selection_function(ts.to_array()[0]):
if self.__selection_function(ts.samples):
selected_features[feature_name] = ts

return selected_features
4 changes: 2 additions & 2 deletions src/ltbio/ml/datasets/SegmentToSegmentDataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ def __init__(self, object, target, name: str = None):
raise AssertionError("All target Timeseries must have the same sampling frequency in a SegmentToSegmentDataset.")

# Gets samples from each Segment of each Timeseries.
object_all_segments = np.array([timeseries.to_array() for timeseries in object])
target_all_segments = np.array([timeseries.to_array() for timeseries in target])
object_all_segments = np.array([timeseries.samples for timeseries in object])
target_all_segments = np.array([timeseries.samples for timeseries in target])

# VStacks the segments of all Timeseries. Each item is a sample to be fed to the model.
self._BiosignalDataset__objects = object_all_segments.swapaxes(0, 1)
Expand Down
4 changes: 2 additions & 2 deletions src/ltbio/ml/datasets/ValueToValueDataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ def __init__(self, object, target, name: str = None):
raise AssertionError("All target Timeseries must have the same sampling frequency in a SegmentToSegmentDataset.")

# Gets samples from each Segment of each Timeseries.
object_all_segments = np.array([timeseries.to_array() for timeseries in object])
target_all_segments = np.array([timeseries.to_array() for timeseries in target])
object_all_segments = np.array([timeseries.samples for timeseries in object])
target_all_segments = np.array([timeseries.samples for timeseries in target])

# VStacks the segments of all Timeseries. Each item is a sample to be fed to the model.
self._BiosignalDataset__objects = object_all_segments.swapaxes(0, 1)
Expand Down
29 changes: 16 additions & 13 deletions tests/biosignals/modalities/test_MultimodalBiosignal.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def setUpClass(cls):
cls.name = "Union of 'Ecg from Hospital', 'Ecg from Band', 'Sweat release', 'Wrist movement'"

def test_create_multimodal_biosignal(self):
multi = MultimodalBiosignal(ecg1=self.ecg1, ecg2=self.ecg2, eda=self.eda1, acc=self.acc1)
multi = MultimodalBiosignal.from_biosignals(ecg1=self.ecg1, ecg2=self.ecg2, eda=self.eda1, acc=self.acc1)
self.assertEqual(multi.type, {ECG, EDA, ACC})
self.assertEqual(multi.acquisition_location, {BodyLocation.CHEST, BodyLocation.WRIST_L})
self.assertEqual(multi.source, {HSM, Sense})
Expand All @@ -47,39 +47,42 @@ def test_create_multimodal_biosignal(self):
self.assertEqual(multi.patient_conditions[0], self.condition)
self.assertEqual(multi.name, self.name)

def test_create_multimodal_biosignal_only_with_one_modality_raises_error(self):
with self.assertRaises(TypeError):
multi = MultimodalBiosignal(ecg1=self.ecg1, ecg2=self.ecg2)
#def test_create_multimodal_biosignal_only_with_one_modality_raises_error(self):
# with self.assertRaises(TypeError):
# multi = MultimodalBiosignal.from_biosignals(ecg1=self.ecg1, ecg2=self.ecg2)

def test_indexing_one_biosignal(self):
multi = MultimodalBiosignal(ecg1=self.ecg1, ecg2=self.ecg2, eda=self.eda1, acc=self.acc1)
multi = MultimodalBiosignal.from_biosignals(ecg1=self.ecg1, ecg2=self.ecg2, eda=self.eda1, acc=self.acc1)
x = multi['ecg2']
self.assertEqual(x, self.ecg2)

def test_indexing_one_channel(self):
multi = MultimodalBiosignal(ecg1=self.ecg1, ecg2=self.ecg2, eda=self.eda1, acc=self.acc1)
multi = MultimodalBiosignal.from_biosignals(ecg1=self.ecg1, ecg2=self.ecg2, eda=self.eda1, acc=self.acc1)
x = multi['ecg1', 'V1']
y = self.ecg1['V1']
self.assertEqual(x.type, x.type)
self.assertEqual(x.channel_names, y.channel_names)

def test_set_name(self):
multi = MultimodalBiosignal(ecg1=self.ecg1, ecg2=self.ecg2, eda=self.eda1, acc=self.acc1)
multi = MultimodalBiosignal.from_biosignals(ecg1=self.ecg1, ecg2=self.ecg2, eda=self.eda1, acc=self.acc1)
self.assertEqual(multi.name, self.name)
multi.name = "New Name"
self.assertEqual(multi.name, "New Name")

def test_contains(self):
multi = MultimodalBiosignal(ecg1=self.ecg1, ecg2=self.ecg2, eda=self.eda1, acc=self.acc1)
self.assertTrue('ecg1' in multi)
self.assertTrue('ecg2' in multi)
self.assertTrue('eda' in multi)
self.assertTrue('acc' in multi)
self.assertFalse('other' in multi)
multi = MultimodalBiosignal.from_biosignals(ecg1=self.ecg1, ecg2=self.ecg2, eda=self.eda1, acc=self.acc1)
self.assertTrue(self.ecg1 in multi)
self.assertTrue('ecg1:V1' in multi)
self.assertTrue('ecg1:V2' in multi)
self.assertTrue(self.ecg2 in multi)
self.assertTrue('ecg2:Band' in multi)
self.assertTrue(self.eda1 in multi)
self.assertTrue('eda:Sweat' in multi)
self.assertTrue(self.acc1 in multi)
self.assertTrue('acc:x' in multi)
self.assertTrue('acc:y' in multi)
self.assertTrue('acc:z' in multi)
self.assertFalse('other' in multi)


if __name__ == '__main__':
Expand Down
2 changes: 1 addition & 1 deletion tests/biosignals/modalities/test_conversions.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def test_discontiguous_timeseries_to_array(self):

def test_single_channel_biosignal_to_array(self):
biosignal = ECG({'ch1': self.ch1})
expected = np.array([[0, 1, 2, 3, 4], ])
expected = np.array([[0, 1, 2, 3, 4, np.nan], ])
converted = biosignal.to_array()
self.assertEqual(converted.shape, expected.shape)
assert_array_equal(converted, expected)
Expand Down
4 changes: 2 additions & 2 deletions tests/features/test_FeatureSelector.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ def selection_function(samples: ndarray) -> bool:
self.assertEqual(len(selected_features), 2)
self.assertTrue('variance' in selected_features)
self.assertTrue('deviation' in selected_features)
self.assertTrue(all(selected_features['variance'].to_array()[0] == self.samples[1]))
self.assertTrue(all(selected_features['deviation'].to_array()[0] == self.samples[2]))
self.assertTrue(all(selected_features['variance'].samples == self.samples[1]))
self.assertTrue(all(selected_features['deviation'].samples == self.samples[2]))



Expand Down
4 changes: 3 additions & 1 deletion tests/integration/test_pipeline.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import unittest
from datetime import timedelta, datetime

import numpy as np

from ltbio.biosignals.modalities.ACC import ACC
from ltbio.biosignals.modalities.ECG import ECG
from ltbio.biosignals.modalities.EDA import EDA
Expand Down Expand Up @@ -95,7 +97,7 @@ def test_pipeline_with_three_single_units(self):
# 1. Create pipeline units
unit1 = Segmenter(window_length = timedelta(seconds=2))
unit2 = FeatureExtractor((TimeFeatures.mean, TimeFeatures.variance))
unit3 = FeatureSelector(lambda x: x[0] > 0.4) # random function; it will only select 'mean'
unit3 = FeatureSelector(lambda x: np.all(np.array(x) > 0.4)) # random function; it will only select 'mean'

# 2. Create pipeline and add units
pipeline = Pipeline(name = 'My first pipeline')
Expand Down

0 comments on commit 9d97dc6

Please sign in to comment.