v2.0.0
Loading...
Searching...
No Matches
mne_meas_data_set.cpp
Go to the documentation of this file.
1//=============================================================================================================
15
16//=============================================================================================================
17// INCLUDES
18//=============================================================================================================
19
20#include "mne_meas_data_set.h"
21
22#include <fiff/fiff_file.h>
23
24#include <cmath>
25
26//=============================================================================================================
27// USED NAMESPACES
28//=============================================================================================================
29
30using namespace Eigen;
31using namespace MNELIB;
32using namespace FIFFLIB;
33
34//=============================================================================================================
35// DEFINE MEMBER METHODS
36//=============================================================================================================
37
39: first(0)
40, np(0)
41, nave(1)
43, tmin(0.0f)
44, tstep(0.0f)
45{
46}
47
48//=============================================================================================================
49
53
54//=============================================================================================================
55
56int MNEMeasDataSet::getValuesAtTime(float time, float integ, int nch, bool use_abs, float *value) const
57{
58 constexpr float EPS = 0.05f;
59 const float sfreq = 1.0f / tstep;
60
61 for (int ch = 0; ch < nch; ch++) {
62 float sum;
63 if (std::fabs(sfreq * integ) < EPS) {
64 /* Single-sample case */
65 float s1 = sfreq * (time - tmin);
66 int n1 = static_cast<int>(std::floor(s1));
67 float f1 = 1.0f + n1 - s1;
68 if (n1 < 0 || n1 > np - 1) {
69 qWarning("Sample value out of range %d (0..%d)", n1, np - 1);
70 return -1;
71 }
72 if (n1 == np - 1) {
73 if (std::fabs(f1 - 1.0f) < 1e-3f)
74 f1 = 1.0f;
75 }
76 if (f1 < 1.0f && n1 > np - 2) {
77 qWarning("Sample value out of range %d (0..%d) %.4f", n1, np - 1, f1);
78 return -1;
79 }
80 if (f1 < 1.0f) {
81 if (use_abs)
82 sum = f1 * std::fabs(data(n1, ch)) + (1.0f - f1) * std::fabs(data(n1 + 1, ch));
83 else
84 sum = f1 * data(n1, ch) + (1.0f - f1) * data(n1 + 1, ch);
85 } else {
86 sum = use_abs ? std::fabs(data(n1, ch)) : data(n1, ch);
87 }
88 } else {
89 /* Multiple samples */
90 float s1 = sfreq * (time - 0.5f * integ - tmin);
91 float s2 = sfreq * (time + 0.5f * integ - tmin);
92 int n1 = static_cast<int>(std::ceil(s1));
93 int n2 = static_cast<int>(std::floor(s2));
94 if (n2 < n1) {
95 /* Within one sample interval */
96 n1 = static_cast<int>(std::floor(s1));
97 if (n1 < 0 || n1 > np - 2)
98 return -1;
99 float f1 = s1 - n1;
100 float f2 = s2 - n1;
101 if (use_abs)
102 sum = 0.5f * ((f1 + f2) * std::fabs(data(n1 + 1, ch)) + (2.0f - f1 - f2) * std::fabs(data(n1, ch)));
103 else
104 sum = 0.5f * ((f1 + f2) * data(n1 + 1, ch) + (2.0f - f1 - f2) * data(n1, ch));
105 } else {
106 float f1 = n1 - s1;
107 float f2 = s2 - n2;
108 if (n1 < 0 || n1 > np - 1) {
109 qWarning("Sample value out of range %d (0..%d)", n1, np - 1);
110 return -1;
111 }
112 if (n2 < 0 || n2 > np - 1) {
113 qWarning("Sample value out of range %d (0..%d)", n2, np - 1);
114 return -1;
115 }
116 if (f1 != 0.0f && n1 < 1)
117 return -1;
118 if (f2 != 0.0f && n2 > np - 2)
119 return -1;
120 sum = 0.0f;
121 float width = 0.0f;
122 if (n2 > n1) {
123 if (use_abs) {
124 sum = 0.5f * std::fabs(data(n1, ch));
125 for (int k = n1 + 1; k < n2; k++)
126 sum += std::fabs(data(k, ch));
127 sum += 0.5f * std::fabs(data(n2, ch));
128 } else {
129 sum = 0.5f * data(n1, ch);
130 for (int k = n1 + 1; k < n2; k++)
131 sum += data(k, ch);
132 sum += 0.5f * data(n2, ch);
133 }
134 width = static_cast<float>(n2 - n1);
135 }
136 if (use_abs) {
137 if (f1 != 0.0f)
138 sum += 0.5f * f1 * (f1 * std::fabs(data(n1 - 1, ch)) + (2.0f - f1) * std::fabs(data(n1, ch)));
139 if (f2 != 0.0f)
140 sum += 0.5f * f2 * (f2 * std::fabs(data(n2 + 1, ch)) + (2.0f - f2) * std::fabs(data(n2, ch)));
141 } else {
142 if (f1 != 0.0f)
143 sum += 0.5f * f1 * (f1 * data(n1 - 1, ch) + (2.0f - f1) * data(n1, ch));
144 if (f2 != 0.0f)
145 sum += 0.5f * f2 * (f2 * data(n2 + 1, ch) + (2.0f - f2) * data(n2, ch));
146 }
147 width += f1 + f2;
148 sum /= width;
149 }
150 }
151 value[ch] = sum;
152 }
153 return 0;
154}
155
156//=============================================================================================================
157
158int MNEMeasDataSet::getValuesFromChannelData(float time, float integ, float **data, int nsamp, int nch,
159 float tmin, float sfreq, bool use_abs, float *value)
160{
161 constexpr float EPS = 0.05f;
162
163 for (int ch = 0; ch < nch; ch++) {
164 float sum;
165 if (std::fabs(sfreq * integ) < EPS) {
166 float s1 = sfreq * (time - tmin);
167 int n1 = static_cast<int>(std::floor(s1));
168 float f1 = 1.0f + n1 - s1;
169 if (n1 < 0 || n1 > nsamp - 1)
170 return -1;
171 if (f1 < 1.0f && n1 > nsamp - 2)
172 return -1;
173 if (f1 < 1.0f) {
174 if (use_abs)
175 sum = f1 * std::fabs(data[ch][n1]) + (1.0f - f1) * std::fabs(data[ch][n1 + 1]);
176 else
177 sum = f1 * data[ch][n1] + (1.0f - f1) * data[ch][n1 + 1];
178 } else {
179 sum = use_abs ? std::fabs(data[ch][n1]) : data[ch][n1];
180 }
181 } else {
182 float s1 = sfreq * (time - 0.5f * integ - tmin);
183 float s2 = sfreq * (time + 0.5f * integ - tmin);
184 int n1 = static_cast<int>(std::ceil(s1));
185 int n2 = static_cast<int>(std::floor(s2));
186 if (n2 < n1) {
187 n1 = static_cast<int>(std::floor(s1));
188 if (n1 < 0 || n1 > nsamp - 2)
189 return -1;
190 float f1 = s1 - n1;
191 float f2 = s2 - n1;
192 if (use_abs)
193 sum = 0.5f * ((f1 + f2) * std::fabs(data[ch][n1 + 1]) + (2.0f - f1 - f2) * std::fabs(data[ch][n1]));
194 else
195 sum = 0.5f * ((f1 + f2) * data[ch][n1 + 1] + (2.0f - f1 - f2) * data[ch][n1]);
196 } else {
197 float f1 = n1 - s1;
198 float f2 = s2 - n2;
199 if (n1 < 0 || n1 > nsamp - 1 || n2 < 0 || n2 > nsamp - 1)
200 return -1;
201 if (f1 != 0.0f && n1 < 1)
202 return -1;
203 if (f2 != 0.0f && n2 > nsamp - 2)
204 return -1;
205 sum = 0.0f;
206 float width = 0.0f;
207 if (n2 > n1) {
208 if (use_abs) {
209 sum = 0.5f * std::fabs(data[ch][n1]);
210 for (int k = n1 + 1; k < n2; k++)
211 sum += std::fabs(data[ch][k]);
212 sum += 0.5f * std::fabs(data[ch][n2]);
213 } else {
214 sum = 0.5f * data[ch][n1];
215 for (int k = n1 + 1; k < n2; k++)
216 sum += data[ch][k];
217 sum += 0.5f * data[ch][n2];
218 }
219 width = static_cast<float>(n2 - n1);
220 }
221 if (use_abs) {
222 if (f1 != 0.0f)
223 sum += 0.5f * f1 * (f1 * std::fabs(data[ch][n1 - 1]) + (2.0f - f1) * std::fabs(data[ch][n1]));
224 if (f2 != 0.0f)
225 sum += 0.5f * f2 * (f2 * std::fabs(data[ch][n2 + 1]) + (2.0f - f2) * std::fabs(data[ch][n2]));
226 } else {
227 if (f1 != 0.0f)
228 sum += 0.5f * f1 * (f1 * data[ch][n1 - 1] + (2.0f - f1) * data[ch][n1]);
229 if (f2 != 0.0f)
230 sum += 0.5f * f2 * (f2 * data[ch][n2 + 1] + (2.0f - f2) * data[ch][n2]);
231 }
232 width += f1 + f2;
233 sum /= width;
234 }
235 }
236 value[ch] = sum;
237 }
238 return 0;
239}
constexpr double EPS
One condition / averaging slice within a legacy MNELIB::MNEMeasData.
FIFF tag-kind, block-kind and type-code numerical definitions, authoritative for FIFFLIB.
#define FIFFV_ASPECT_AVERAGE
Definition fiff_file.h:431
Core MNE data structures (source spaces, source estimates, hemispheres).
FIFF file I/O, in-memory data structures and high-level readers/writers.
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