Perform OTP on one segment of data.
(data, picks_good, picks_bad, *, start=0, stop=None)
| 110 | |
| 111 | |
| 112 | def _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] |
nothing calls this directly
no test coverage detected