v2.0.0
Loading...
Searching...
No Matches
ecd_set.cpp
Go to the documentation of this file.
1//=============================================================================================================
36
37//=============================================================================================================
38// INCLUDES
39//=============================================================================================================
40
41#include "ecd_set.h"
42#include <fiff/fiff_types.h>
43
44//ToDo don't use access and unlink -> use QT stuff instead -> QFile
45#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
46#include <io.h>
47#else
48#include <unistd.h>
49#endif
50
51//=============================================================================================================
52// QT INCLUDES
53//=============================================================================================================
54
55#include <QDebug>
56#include <QFile>
57#include <QString>
58#include <QRegularExpression>
59
60//=============================================================================================================
61// EIGEN INCLUDES
62//=============================================================================================================
63
64//=============================================================================================================
65// USED NAMESPACES
66//=============================================================================================================
67
68using namespace INVERSELIB;
69using namespace FIFFLIB;
70
71//=============================================================================================================
72// DEFINES
73//=============================================================================================================
74
75#define X 0
76#define Y 1
77#define Z 2
78
79//=============================================================================================================
80// DEFINE STATIC METHODS
81//=============================================================================================================
82
83//TODO OBSOLETE - USE ALREADY DEFINED ONE
84static fiff_int_t swap_int (fiff_int_t source)
85{
86 unsigned char *csource = (unsigned char *)(&source);
87 fiff_int_t result;
88 unsigned char *cresult = (unsigned char *)(&result);
89
90 cresult[0] = csource[3];
91 cresult[1] = csource[2];
92 cresult[2] = csource[1];
93 cresult[3] = csource[0];
94 return (result);
95}
96
97//=============================================================================================================
98//TODO OBSOLETE - USE ALREADY DEFINED ONE
99static float swap_float (float source)
100{
101 unsigned char *csource = (unsigned char *)(&source);
102 float result;
103 unsigned char *cresult = (unsigned char *)(&result);
104
105 cresult[0] = csource[3];
106 cresult[1] = csource[2];
107 cresult[2] = csource[1];
108 cresult[3] = csource[0];
109 return result;
110}
111
112//=============================================================================================================
113
114namespace INVERSELIB {
115
119typedef struct {
120 int dipole; /* Which dipole in a multi-dipole set */
121 float begin,end; /* Fitting time range */
122 float r0[3]; /* Sphere model origin */
123 float rd[3]; /* Dipole location */
124 float Q[3]; /* Dipole amplitude */
125 float goodness; /* Goodness-of-fit */
126 int errors_computed; /* Have we computed the errors */
127 float noise_level; /* Noise level used for error computations */
128 float single_errors[5]; /* Single parameter error limits */
129 float error_matrix[5][5]; /* This fully describes the conf. ellipsoid */
130 float conf_vol; /* The xyz confidence volume */
131 float khi2; /* The khi^2 value */
132 float prob; /* Probability to exceed khi^2 by chance */
133 float noise_est; /* Total noise estimate */
135
136} // Namespace
137
138//=============================================================================================================
139// DEFINE MEMBER METHODS
140//=============================================================================================================
141
143{
144}
145
146//=============================================================================================================
147
148ECDSet::ECDSet(const ECDSet &p_ECDSet)
149: dataname(p_ECDSet.dataname)
150, m_qListDips(p_ECDSet.m_qListDips)
151{
152}
153
154//=============================================================================================================
155
157{
158}
159
160//=============================================================================================================
161
162void ECDSet::addEcd(const ECD& p_ecd)
163{
164 m_qListDips.append(p_ecd);
165}
166
167//=============================================================================================================
168
169ECDSet ECDSet::read_dipoles_dip(const QString& fileName)
170{
171 ECDSet set;
172
173 QFile inputFile(fileName);
174 if (inputFile.open(QIODevice::ReadOnly|QIODevice::Text))
175 {
176 QTextStream in(&inputFile);
177 while (!in.atEnd())
178 {
179 QString line = in.readLine();
180 QStringList list = line.split(QRegularExpression("\\s+"));
181
182 if(list[0].contains("#") || list.size() != 11) {
183 continue;
184 }
185 else {
186 ECD one;
187 one.valid = true;
188 one.time = list[1].toFloat() / 1000.0f;
189 one.rd[X] = list[3].toFloat() / 1000.0f;
190 one.rd[Y] = list[4].toFloat() / 1000.0f;
191 one.rd[Z] = list[5].toFloat() / 1000.0f;
192 one.Q[X] = list[7].toFloat() / 1e9f;
193 one.Q[Y] = list[8].toFloat() / 1e9f;
194 one.Q[Z] = list[9].toFloat() / 1e9f;
195 one.good = list[10].toFloat() / 100.0f;
196 set << one;
197 }
198 }
199 inputFile.close();
200
201 printf("Read %d dipoles in dip format from %s\n",set.size(),fileName.toUtf8().data());
202 }
203 else {
204 printf("Not able to read from: %s\n", fileName.toUtf8().data());
205 }
206
207 return set;
208}
209
210//=============================================================================================================
211
212bool ECDSet::save_dipoles_bdip(const QString& fileName)
213/*
214 * Save dipoles in the bdip format employed by xfit
215 */
216{
217 FILE *out = NULL;
218 bdipEcdRec one_out;
219 ECD one;
220 int k,p;
221 int nsave;
222
223 if (fileName.isEmpty() || this->size() == 0)
224 return true;
225
226 if ((out = fopen(fileName.toUtf8().data(),"w")) == NULL) {
227 printf(fileName.toUtf8().data());
228 return false;
229 }
230
231 for (k = 0, nsave = 0; k < this->size(); k++) {
232 one = m_qListDips[k];
233 if (one.valid) {
234 one_out.dipole = swap_int(1);
235 one_out.begin = swap_float(one.time);
236 for (p = 0; p < 3; p++) {
237 one_out.r0[p] = swap_float(0.0);
238 one_out.rd[p] = swap_float(one.rd[p]);
239 one_out.Q[p] = swap_float(one.Q[p]);
240 }
241 one_out.goodness = swap_float(one.good);
242 one_out.errors_computed = swap_int(0);
243 one_out.khi2 = swap_float(one.khi2);
244 if (fwrite(&one_out,sizeof(bdipEcdRec),1,out) != 1) {
245 printf("Failed to write a dipole");
246 goto bad;
247 }
248 nsave++;
249 }
250 }
251 if (fclose(out) != 0) {
252 out = NULL;
253 printf(fileName.toUtf8().data());
254 return false;
255 }
256 printf("Save %d dipoles in bdip format to %s\n",nsave,fileName.toUtf8().data());
257 return true;
258
259bad : {
260 if (out) {
261 fclose(out);
262 unlink(fileName.toUtf8().data());
263 }
264 return false;
265 }
266}
267
268//=============================================================================================================
269
270bool ECDSet::save_dipoles_dip(const QString& fileName) const
271{
272 FILE *out = NULL;
273 int k,nsave;
274 ECD one;
275
276 if (fileName.isEmpty() || this->size() == 0)
277 return true;
278 if ((out = fopen(fileName.toUtf8().data(),"w")) == NULL) {
279 printf(fileName.toUtf8().data());
280 return false;
281 }
282 fprintf(out,"# CoordinateSystem \"Head\"\n");
283 fprintf (out,"# %7s %7s %8s %8s %8s %8s %8s %8s %8s %6s\n",
284 "begin","end","X (mm)","Y (mm)","Z (mm)","Q(nAm)","Qx(nAm)","Qy(nAm)","Qz(nAm)","g/%");
285 for (k = 0, nsave = 0; k < this->size(); k++) {
286 one = this->m_qListDips[k];
287 if (one.valid) {
288 fprintf(out," %7.1f %7.1f %8.2f %8.2f %8.2f %8.3f %8.3f %8.3f %8.3f %6.1f\n",
289 1000*one.time,1000*one.time,
290 1000*one.rd[X],1000*one.rd[Y],1000*one.rd[Z],
291 1e9*one.Q.norm(),1e9*one.Q[X],1e9*one.Q[Y],1e9*one.Q[Z],100.0*one.good);
292 nsave++;
293 }
294 }
295 fprintf(out,"## Name \"%s dipoles\" Style \"Dipoles\"\n","ALL");
296 if (fclose(out) != 0) {
297 out = NULL;
298 printf(fileName.toUtf8().data());
299 goto bad;
300 }
301 printf("Save %d dipoles in dip format to %s\n",nsave,fileName.toUtf8().data());
302 return true;
303
304bad : {
305 if (out) {
306 fclose(out);
307 unlink(fileName.toUtf8().data());
308 }
309 return false;
310 }
311}
312
313//=============================================================================================================
314
315const ECD& ECDSet::operator[] (int idx) const
316{
317 if (idx>=m_qListDips.length())
318 {
319 qWarning("Warning: Required ECD doesn't exist! Returning ECD '0'.");
320 idx=0;
321 }
322 return m_qListDips[idx];
323}
324
325//=============================================================================================================
326
328{
329 if (idx >= m_qListDips.length())
330 {
331 qWarning("Warning: Required ECD doesn't exist! Returning ECD '0'.");
332 idx = 0;
333 }
334 return m_qListDips[idx];
335}
336
337//=============================================================================================================
338
340{
341 this->m_qListDips.append(p_ecd);
342 return *this;
343}
Old fiff_type declarations - replace them.
#define X
#define Z
#define Y
FiffDigPointSet class declaration.
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
qint32 fiff_int_t
Definition fiff_types.h:89
Inverse source estimation (MNE, dSPM, sLORETA, dipole fitting).
struct INVERSELIB::bdipEcd bdipEcdRec
Single equivalent current dipole with position, orientation, amplitude, and goodness-of-fit.
Definition ecd.h:73
Eigen::Vector3f rd
Definition ecd.h:109
float time
Definition ecd.h:108
float good
Definition ecd.h:111
bool valid
Definition ecd.h:107
float khi2
Definition ecd.h:112
Eigen::Vector3f Q
Definition ecd.h:110
Binary-format dipole record for file I/O, storing fitted dipole parameters and error estimates.
Definition ecd_set.cpp:119
float error_matrix[5][5]
Definition ecd_set.cpp:129
float single_errors[5]
Definition ecd_set.cpp:128
static ECDSet read_dipoles_dip(const QString &fileName)
Definition ecd_set.cpp:169
const ECD & operator[](int idx) const
Definition ecd_set.cpp:315
bool save_dipoles_dip(const QString &fileName) const
Definition ecd_set.cpp:270
bool save_dipoles_bdip(const QString &fileName)
Definition ecd_set.cpp:212
ECDSet & operator<<(const ECD &p_ecd)
Definition ecd_set.cpp:339
void addEcd(const ECD &p_ecd)
Definition ecd_set.cpp:162
qint32 size() const
Definition ecd_set.h:193