v2.0.0
Loading...
Searching...
No Matches
mne_meas_data_set.cpp
Go to the documentation of this file.
1//=============================================================================================================
36
37//=============================================================================================================
38// INCLUDES
39//=============================================================================================================
40
41#include "mne_meas_data_set.h"
42
43#include <fiff/fiff_file.h>
44
45#include <cmath>
46
47//=============================================================================================================
48// USED NAMESPACES
49//=============================================================================================================
50
51using namespace Eigen;
52using namespace MNELIB;
53using namespace FIFFLIB;
54
55//=============================================================================================================
56// DEFINE MEMBER METHODS
57//=============================================================================================================
58
60: first(0)
61, np(0)
62, nave(1)
64, tmin(0.0f)
65, tstep(0.0f)
66{
67}
68
69//=============================================================================================================
70
74
75//=============================================================================================================
76
77int MNEMeasDataSet::getValuesAtTime(float time, float integ, int nch, bool use_abs, float *value) const
78{
79 constexpr float EPS = 0.05f;
80 const float sfreq = 1.0f / tstep;
81
82 for (int ch = 0; ch < nch; ch++) {
83 float sum;
84 if (std::fabs(sfreq * integ) < EPS) {
85 /* Single-sample case */
86 float s1 = sfreq * (time - tmin);
87 int n1 = static_cast<int>(std::floor(s1));
88 float f1 = 1.0f + n1 - s1;
89 if (n1 < 0 || n1 > np - 1) {
90 qWarning("Sample value out of range %d (0..%d)", n1, np - 1);
91 return -1;
92 }
93 if (n1 == np - 1) {
94 if (std::fabs(f1 - 1.0f) < 1e-3f)
95 f1 = 1.0f;
96 }
97 if (f1 < 1.0f && n1 > np - 2) {
98 qWarning("Sample value out of range %d (0..%d) %.4f", n1, np - 1, f1);
99 return -1;
100 }
101 if (f1 < 1.0f) {
102 if (use_abs)
103 sum = f1 * std::fabs(data(n1, ch)) + (1.0f - f1) * std::fabs(data(n1 + 1, ch));
104 else
105 sum = f1 * data(n1, ch) + (1.0f - f1) * data(n1 + 1, ch);
106 } else {
107 sum = use_abs ? std::fabs(data(n1, ch)) : data(n1, ch);
108 }
109 } else {
110 /* Multiple samples */
111 float s1 = sfreq * (time - 0.5f * integ - tmin);
112 float s2 = sfreq * (time + 0.5f * integ - tmin);
113 int n1 = static_cast<int>(std::ceil(s1));
114 int n2 = static_cast<int>(std::floor(s2));
115 if (n2 < n1) {
116 /* Within one sample interval */
117 n1 = static_cast<int>(std::floor(s1));
118 if (n1 < 0 || n1 > np - 2)
119 return -1;
120 float f1 = s1 - n1;
121 float f2 = s2 - n1;
122 if (use_abs)
123 sum = 0.5f * ((f1 + f2) * std::fabs(data(n1 + 1, ch)) + (2.0f - f1 - f2) * std::fabs(data(n1, ch)));
124 else
125 sum = 0.5f * ((f1 + f2) * data(n1 + 1, ch) + (2.0f - f1 - f2) * data(n1, ch));
126 } else {
127 float f1 = n1 - s1;
128 float f2 = s2 - n2;
129 if (n1 < 0 || n1 > np - 1) {
130 qWarning("Sample value out of range %d (0..%d)", n1, np - 1);
131 return -1;
132 }
133 if (n2 < 0 || n2 > np - 1) {
134 qWarning("Sample value out of range %d (0..%d)", n2, np - 1);
135 return -1;
136 }
137 if (f1 != 0.0f && n1 < 1)
138 return -1;
139 if (f2 != 0.0f && n2 > np - 2)
140 return -1;
141 sum = 0.0f;
142 float width = 0.0f;
143 if (n2 > n1) {
144 if (use_abs) {
145 sum = 0.5f * std::fabs(data(n1, ch));
146 for (int k = n1 + 1; k < n2; k++)
147 sum += std::fabs(data(k, ch));
148 sum += 0.5f * std::fabs(data(n2, ch));
149 } else {
150 sum = 0.5f * data(n1, ch);
151 for (int k = n1 + 1; k < n2; k++)
152 sum += data(k, ch);
153 sum += 0.5f * data(n2, ch);
154 }
155 width = static_cast<float>(n2 - n1);
156 }
157 if (use_abs) {
158 if (f1 != 0.0f)
159 sum += 0.5f * f1 * (f1 * std::fabs(data(n1 - 1, ch)) + (2.0f - f1) * std::fabs(data(n1, ch)));
160 if (f2 != 0.0f)
161 sum += 0.5f * f2 * (f2 * std::fabs(data(n2 + 1, ch)) + (2.0f - f2) * std::fabs(data(n2, ch)));
162 } else {
163 if (f1 != 0.0f)
164 sum += 0.5f * f1 * (f1 * data(n1 - 1, ch) + (2.0f - f1) * data(n1, ch));
165 if (f2 != 0.0f)
166 sum += 0.5f * f2 * (f2 * data(n2 + 1, ch) + (2.0f - f2) * data(n2, ch));
167 }
168 width += f1 + f2;
169 sum /= width;
170 }
171 }
172 value[ch] = sum;
173 }
174 return 0;
175}
176
177//=============================================================================================================
178
179int MNEMeasDataSet::getValuesFromChannelData(float time, float integ, float **data, int nsamp, int nch,
180 float tmin, float sfreq, bool use_abs, float *value)
181{
182 constexpr float EPS = 0.05f;
183
184 for (int ch = 0; ch < nch; ch++) {
185 float sum;
186 if (std::fabs(sfreq * integ) < EPS) {
187 float s1 = sfreq * (time - tmin);
188 int n1 = static_cast<int>(std::floor(s1));
189 float f1 = 1.0f + n1 - s1;
190 if (n1 < 0 || n1 > nsamp - 1)
191 return -1;
192 if (f1 < 1.0f && n1 > nsamp - 2)
193 return -1;
194 if (f1 < 1.0f) {
195 if (use_abs)
196 sum = f1 * std::fabs(data[ch][n1]) + (1.0f - f1) * std::fabs(data[ch][n1 + 1]);
197 else
198 sum = f1 * data[ch][n1] + (1.0f - f1) * data[ch][n1 + 1];
199 } else {
200 sum = use_abs ? std::fabs(data[ch][n1]) : data[ch][n1];
201 }
202 } else {
203 float s1 = sfreq * (time - 0.5f * integ - tmin);
204 float s2 = sfreq * (time + 0.5f * integ - tmin);
205 int n1 = static_cast<int>(std::ceil(s1));
206 int n2 = static_cast<int>(std::floor(s2));
207 if (n2 < n1) {
208 n1 = static_cast<int>(std::floor(s1));
209 if (n1 < 0 || n1 > nsamp - 2)
210 return -1;
211 float f1 = s1 - n1;
212 float f2 = s2 - n1;
213 if (use_abs)
214 sum = 0.5f * ((f1 + f2) * std::fabs(data[ch][n1 + 1]) + (2.0f - f1 - f2) * std::fabs(data[ch][n1]));
215 else
216 sum = 0.5f * ((f1 + f2) * data[ch][n1 + 1] + (2.0f - f1 - f2) * data[ch][n1]);
217 } else {
218 float f1 = n1 - s1;
219 float f2 = s2 - n2;
220 if (n1 < 0 || n1 > nsamp - 1 || n2 < 0 || n2 > nsamp - 1)
221 return -1;
222 if (f1 != 0.0f && n1 < 1)
223 return -1;
224 if (f2 != 0.0f && n2 > nsamp - 2)
225 return -1;
226 sum = 0.0f;
227 float width = 0.0f;
228 if (n2 > n1) {
229 if (use_abs) {
230 sum = 0.5f * std::fabs(data[ch][n1]);
231 for (int k = n1 + 1; k < n2; k++)
232 sum += std::fabs(data[ch][k]);
233 sum += 0.5f * std::fabs(data[ch][n2]);
234 } else {
235 sum = 0.5f * data[ch][n1];
236 for (int k = n1 + 1; k < n2; k++)
237 sum += data[ch][k];
238 sum += 0.5f * data[ch][n2];
239 }
240 width = static_cast<float>(n2 - n1);
241 }
242 if (use_abs) {
243 if (f1 != 0.0f)
244 sum += 0.5f * f1 * (f1 * std::fabs(data[ch][n1 - 1]) + (2.0f - f1) * std::fabs(data[ch][n1]));
245 if (f2 != 0.0f)
246 sum += 0.5f * f2 * (f2 * std::fabs(data[ch][n2 + 1]) + (2.0f - f2) * std::fabs(data[ch][n2]));
247 } else {
248 if (f1 != 0.0f)
249 sum += 0.5f * f1 * (f1 * data[ch][n1 - 1] + (2.0f - f1) * data[ch][n1]);
250 if (f2 != 0.0f)
251 sum += 0.5f * f2 * (f2 * data[ch][n2 + 1] + (2.0f - f2) * data[ch][n2]);
252 }
253 width += f1 + f2;
254 sum /= width;
255 }
256 }
257 value[ch] = sum;
258 }
259 return 0;
260}
Header file describing the numerical values used in fif files.
#define FIFFV_ASPECT_AVERAGE
Definition fiff_file.h:438
#define EPS
MNEMeasDataSet class declaration.
Core MNE data structures (source spaces, source estimates, hemispheres).
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
static int getValuesFromChannelData(float time, float integ, float **data, int nsamp, int nch, float tmin, float sfreq, bool use_abs, float *value)
~MNEMeasDataSet()
Destroys the measurement data set and frees all owned C-style arrays.
MNEMeasDataSet()
Constructs an empty measurement data set.
int getValuesAtTime(float time, float integ, int nch, bool use_abs, float *value) const