MCPcopy
hub / github.com/mne-tools/mne-python / _otp

Function _otp

mne/preprocessing/otp.py:112–140  ·  view source on GitHub ↗

Perform OTP on one segment of data.

(data, picks_good, picks_bad, *, start=0, stop=None)

Source from the content-addressed store, hash-verified

110
111
112def _otp(data, picks_good, picks_bad, *, start=0, stop=None):
113 """Perform OTP on one segment of data."""
114 if not np.isfinite(data).all():
115 raise RuntimeError("non-finite data (inf or nan) found in raw instance")
116 # demean our data
117 data_means = np.mean(data, axis=-1, keepdims=True)
118 data -= data_means
119 # make a copy
120 data_good = data[picks_good]
121 # scale the copy that will be used to form the temporal basis vectors
122 # so that _orth_svdvals thresholding should work properly with
123 # different channel types (e.g., M-EEG)
124 norms = _normalize_vectors(data_good)
125 cov = np.dot(data_good, data_good.T)
126 if len(picks_bad) > 0:
127 full_basis = _svd_cov(cov, data_good)[2]
128 for mi, pick in enumerate(picks_good):
129 # operate on original data
130 idx = list(range(mi)) + list(range(mi + 1, len(data_good)))
131 # Equivalent: svd(data[idx], full_matrices=False)[2]
132 t_basis = _svd_cov(cov[np.ix_(idx, idx)], data_good[idx])[2]
133 x = np.dot(np.dot(data_good[mi], t_basis.T), t_basis)
134 x *= norms[mi]
135 x += data_means[pick]
136 data[pick] = x
137 for pick in picks_bad:
138 data[pick] = np.dot(np.dot(data[pick], full_basis.T), full_basis)
139 data[pick] += data_means[pick]
140 return [data]

Callers

nothing calls this directly

Calls 3

_normalize_vectorsFunction · 0.85
_svd_covFunction · 0.85
meanMethod · 0.45

Tested by

no test coverage detected