Skip to content

Commit ec44384

Browse files
authored
Always keep EEG data in Volts instead of converting to mV (#102)
* Remove unnecessary V -> mV conversions * Remove immediately overwritten variable * Remove additional internal conversions * Fix black style * Update whats_new.rst
1 parent 7ad292c commit ec44384

File tree

4 files changed

+20
-22
lines changed

4 files changed

+20
-22
lines changed

docs/whats_new.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ API
7373
- The permissible parameters for the following methods were removed and/or reordered: `NoisyChannels.ransac_correlations`, `NoisyChannels.run_ransac`, and `NoisyChannels.get_ransac_pred` methods, by `Austin Hurst`_ and `Yorguin Mantilla`_ (:gh:`43`)
7474
- Changed the meaning of the argument `channel_wise` in :meth:`~pyprep.NoisyChannels.find_bad_by_ransac` to mean 'perform RANSAC across chunks of channels instead of window-wise', from its original meaning of 'perform channel-wise RANSAC one channel at a time', by `Austin Hurst`_ (:gh:`66`)
7575
- The arguments `fraction_bad` and `fraction_good` were renamed to `frac_bad` and `sample_prop`, respectively, for :meth:`~pyprep.NoisyChannels.find_bad_by_ransac` and :func:`~pyprep.ransac.find_bad_by_ransac`, by `Austin Hurst`_ (:gh:`88`)
76-
76+
- The units of all user-facing EEG data attributes in :obj:`~pyprep.PrepPipeline` and :obj:`~pyprep.Reference` were changed from mV to Volts to better match MNE convention, by `Austin Hurst`_ (:gh:`102`)
7777

7878
.. _changes_0_3_1:
7979

pyprep/prep_pipeline.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ def __init__(
147147
# raw_non_eeg may not be compatible with the montage
148148
# so it is not set for that object
149149

150-
self.EEG_raw = self.raw_eeg.get_data() * 1e6
150+
self.EEG_raw = self.raw_eeg.get_data()
151151
self.prep_params = prep_params
152152
if self.prep_params["ref_chs"] == "eeg":
153153
self.prep_params["ref_chs"] = self.ch_names_eeg
@@ -210,7 +210,7 @@ def fit(self):
210210

211211
# Add Trend back
212212
self.EEG = self.EEG_raw - self.EEG_new + self.EEG_clean
213-
self.raw_eeg._data = self.EEG * 1e-6
213+
self.raw_eeg._data = self.EEG
214214

215215
# Step 3: Referencing
216216
reference = Reference(

pyprep/reference.py

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def __init__(
8080
self.ch_names = self.raw.ch_names
8181
self.raw.pick_types(eeg=True, eog=False, meg=False)
8282
self.ch_names_eeg = self.raw.ch_names
83-
self.EEG = self.raw.get_data() * 1e6
83+
self.EEG = self.raw.get_data()
8484
self.reference_channels = params["ref_chs"]
8585
self.rereferenced_channels = params["reref_chs"]
8686
self.sfreq = self.raw.info["sfreq"]
@@ -122,8 +122,8 @@ def perform_reference(self, max_iterations=4):
122122
_eeglab_interpolate_bads(dummy)
123123
else:
124124
dummy.interpolate_bads()
125-
self.reference_signal = (
126-
np.nanmean(dummy.get_data(picks=self.reference_channels), axis=0) * 1e6
125+
self.reference_signal = np.nanmean(
126+
dummy.get_data(picks=self.reference_channels), axis=0
127127
)
128128
del dummy
129129
rereferenced_index = [
@@ -134,7 +134,7 @@ def perform_reference(self, max_iterations=4):
134134
)
135135

136136
# Phase 2: Find the bad channels and interpolate
137-
self.raw._data = self.EEG * 1e-6
137+
self.raw._data = self.EEG
138138
noisy_detector = NoisyChannels(
139139
self.raw, random_state=self.random_state, matlab_strict=self.matlab_strict
140140
)
@@ -152,17 +152,17 @@ def perform_reference(self, max_iterations=4):
152152
_eeglab_interpolate_bads(self.raw)
153153
else:
154154
self.raw.interpolate_bads()
155-
reference_correct = (
156-
np.nanmean(self.raw.get_data(picks=self.reference_channels), axis=0) * 1e6
155+
reference_correct = np.nanmean(
156+
self.raw.get_data(picks=self.reference_channels), axis=0
157157
)
158-
self.EEG = self.raw.get_data() * 1e6
158+
self.EEG = self.raw.get_data()
159159
self.EEG = self.remove_reference(
160160
self.EEG, reference_correct, rereferenced_index
161161
)
162162
# reference signal after interpolation
163163
self.reference_signal_new = self.reference_signal + reference_correct
164164
# MNE Raw object after interpolation
165-
self.raw._data = self.EEG * 1e-6
165+
self.raw._data = self.EEG
166166

167167
# Still noisy channels after interpolation
168168
self.interpolated_channels = bad_channels
@@ -236,9 +236,9 @@ def robust_reference(self, max_iterations=4):
236236
}
237237

238238
# Get initial estimate of the reference by the specified method
239-
signal = raw.get_data() * 1e6
240-
self.reference_signal = (
241-
np.nanmedian(raw.get_data(picks=reference_channels), axis=0) * 1e6
239+
signal = raw.get_data()
240+
self.reference_signal = np.nanmedian(
241+
raw.get_data(picks=reference_channels), axis=0
242242
)
243243
reference_index = [self.ch_names_eeg.index(ch) for ch in reference_channels]
244244
signal_tmp = self.remove_reference(
@@ -251,7 +251,7 @@ def robust_reference(self, max_iterations=4):
251251
previous_bads = set()
252252

253253
while True:
254-
raw_tmp._data = signal_tmp * 1e-6
254+
raw_tmp._data = signal_tmp
255255
noisy_detector = NoisyChannels(
256256
raw_tmp,
257257
do_detrend=False,
@@ -297,17 +297,15 @@ def robust_reference(self, max_iterations=4):
297297
)
298298

299299
if len(bad_chans) > 0:
300-
raw_tmp._data = signal * 1e-6
300+
raw_tmp._data = signal.copy()
301301
raw_tmp.info["bads"] = list(bad_chans)
302302
if self.matlab_strict:
303303
_eeglab_interpolate_bads(raw_tmp)
304304
else:
305305
raw_tmp.interpolate_bads()
306-
signal_tmp = raw_tmp.get_data() * 1e6
307-
else:
308-
signal_tmp = signal
309-
self.reference_signal = (
310-
np.nanmean(raw_tmp.get_data(picks=reference_channels), axis=0) * 1e6
306+
307+
self.reference_signal = np.nanmean(
308+
raw_tmp.get_data(picks=reference_channels), axis=0
311309
)
312310

313311
signal_tmp = self.remove_reference(

tests/test_matprep_compare.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ def test_remaining_bads(self, pyprep_reference, matprep_info):
378378
def test_reference_signal(self, pyprep_reference, matprep_info):
379379
"""Compare the final reference signal between PyPREP and MatPREP."""
380380
TOL = 1e-4 # NOTE: Some diffs > 1e-5, maybe rounding error?
381-
pyprep_ref = pyprep_reference.reference_signal_new
381+
pyprep_ref = pyprep_reference.reference_signal_new * 1e6
382382
assert np.allclose(pyprep_ref, matprep_info["ref_signal"], atol=TOL)
383383

384384
def test_full_signal(self, pyprep_reference, matprep_reference):

0 commit comments

Comments
 (0)