MNE-CPP 0.1.9
A Framework for Electrophysiology
Loading...
Searching...
No Matches
compute_fwd_settings.cpp
1
2
4
5#include <stdio.h>
6
7using namespace Eigen;
8using namespace FWDLIB;
9
10#define X 0
11#define Y 1
12#define Z 2
13
14#ifndef PROGRAM_VERSION
15#define PROGRAM_VERSION "2.10"
16#endif
17
18//=============================================================================================================
19// STATIC DEFINITIONS
20//=============================================================================================================
21
22//=============================================================================================================
23// DEFINE MEMBER METHODS
24//=============================================================================================================
25
27{
28 initMembers();
29}
30
31//=============================================================================================================
32
34{
35 initMembers();
36
37 if (!check_args(argc,argv))
38 return;
39
40// mne_print_version_info(stderr,argv[0],PROGRAM_VERSION,__DATE__,__TIME__);
41 printf("%s version %s compiled at %s %s\n",argv[0],PROGRAM_VERSION,__DATE__,__TIME__);
42
44}
45
46//=============================================================================================================
47
49{
50 //ToDo Garbage collection
51}
52
53//=============================================================================================================
54
56{
57 if (srcname.isEmpty()) {
58 qCritical("Source space name is missing. Use the --src option to specify it.");
59 return;
60 }
61 if (!mri_head_ident) {
62 if (mriname.isEmpty() && transname.isEmpty()) {
63 qCritical("MRI <-> head coordinate transformation is missing. Use the --mri or --trans option to specify it.");
64 return;
65 }
66 }
67 if (measname.isEmpty()) {
68 qCritical("Source of coil and electrode locations is missing. Use the --meas option to specify it.");
69 return;
70 }
71 if (solname.isEmpty()) {
72 qCritical("Solution name is missing. Use the --fwd option to specify it.");
73 return;
74 }
75 if (! (include_meg || include_eeg)) {
76 qCritical("Employ the --meg and --eeg options to select MEG and/or EEG");
77 return;
78 }
79}
80
81//=============================================================================================================
82
83void ComputeFwdSettings::initMembers()
84{
85 // Init origin
86 r0 << 0.0f,0.0f,0.04f;
87
88 filter_spaces = true;
89 accurate = false;
90 fixed_ori = false;
91 include_meg = false;
92 include_eeg = false;
93 compute_grad = false;
94 mindist = 0.0f;
95 coord_frame = FIFFV_COORD_HEAD;
96 do_all = false;
97 nlabel = 0;
98
99 eeg_sphere_rad = 0.09f;
100 scale_eeg_pos = false;
101 use_equiv_eeg = true;
102 use_threads = true;
103
104 pFiffInfo = Q_NULLPTR;
105 meg_head_t = Q_NULLPTR;
106}
107
108//=============================================================================================================
109
110void ComputeFwdSettings::usage(char *name)
111{
112 printf("usage : %s [options]\n",name);
113 printf("\t--meg to compute the MEG forward solution\n");
114 printf("\t--eeg to compute the EEG forward solution\n");
115 printf("\t--grad compute the gradient of the field with respect to the dipole coordinates as well\n");
116 printf("\t--fixed to calculate only for the source orientation given by the surface normals\n");
117 printf("\t--mricoord do calculations in MRI coordinates instead of head coordinates\n");
118 printf("\t--accurate use more accurate coil definitions in MEG forward computation\n");
119 printf("\t--src name specify the source space\n");
120 printf("\t--label name label file to select the sources (can have multiple of these)\n");
121 printf("\t--mri name take head/MRI coordinate transform from here (Neuromag MRI description file)\n");
122 printf("\t--trans name take head/MRI coordinate transform from here (text file)\n");
123 printf("\t--notrans head and MRI coordinate systems are identical.\n");
124 printf("\t--meas name take MEG sensor and EEG electrode locations from here\n");
125 printf("\t--bem name BEM model name\n");
126 printf("\t--origin x:y:z/mm use a sphere model with this origin (head coordinates/mm)\n");
127 printf("\t--eegscalp scale the electrode locations to the surface of the scalp when using a sphere model\n");
128 printf("\t--eegmodels name read EEG sphere model specifications from here.\n");
129 printf("\t--eegmodel name name of the EEG sphere model to use (default : Default)\n");
130 printf("\t--eegrad rad/mm radius of the scalp surface to use in EEG sphere model (default : %7.1f mm)\n",1000*eeg_sphere_rad);
131 printf("\t--mindist dist/mm minimum allowable distance of the sources from the inner skull surface.\n");
132 printf("\t--mindistout name Output the omitted source space points here.\n");
133 printf("\t--includeall Omit all source space checks\n");
134 printf("\t--all calculate forward solution in all nodes instead the selected ones only.\n");
135 printf("\t--fwd name save the solution here\n");
136 printf("\t--help print this info.\n");
137 printf("\t--version print version info.\n\n");
138 exit(1);
139}
140
141//=============================================================================================================
142
143QString ComputeFwdSettings::build_command_line(QString old, QString new_item)
144{
145 if (!new_item.isEmpty() && new_item.size() > 0) {
146 if (!old.isEmpty()) {
147 old += " ";
148 }
149 old += new_item;
150 }
151 return old;
152}
153
154//=============================================================================================================
155
156bool ComputeFwdSettings::check_unrecognized_args(int argc, char **argv)
157{
158 int k;
159
160 if (argc > 1) {
161 printf("Unrecognized arguments : ");
162 for (k = 1; k < argc; k++)
163 printf("%s ",argv[k]);
164 printf("\n");
165 qCritical("Check the command line.");
166 return false;
167 }
168 return true;
169}
170
171//=============================================================================================================
172
173bool ComputeFwdSettings::check_args (int *argc,char **argv)
174{
175 int found;
176 char *last;
177
178 if ((last = strrchr(argv[0],'/')) == NULL)
179 last = argv[0];
180 else
181 last++;
182 command = build_command_line(command,last);
183 for (int k = 0; k < *argc; k++) {
184 found = 0;
185 if (strcmp(argv[k],"--version") == 0) {
186 printf("%s version %s compiled at %s %s\n", argv[0],PROGRAM_VERSION,__DATE__,__TIME__);
187 exit(0);
188 }
189 else if (strcmp(argv[k],"--help") == 0) {
190 usage(argv[0]);
191 exit(1);
192 }
193 else if (strcmp(argv[k],"--meg") == 0) {
194 found = 1;
195 include_meg = true;
196 }
197 else if (strcmp(argv[k],"--eeg") == 0) {
198 found = 1;
199 include_eeg = true;
200 }
201 else if (strcmp(argv[k],"--grad") == 0) {
202 found = 1;
203 compute_grad = true;
204 }
205 else if (strcmp(argv[k],"--all") == 0) {
206 found = 1;
207 do_all = true;
208 }
209 else if (strcmp(argv[k],"--accurate") == 0) {
210 found = 1;
211 accurate = true;
212 }
213 else if (strcmp(argv[k],"--fixed") == 0) {
214 found = 1;
215 fixed_ori = true;
216 }
217 else if (strcmp(argv[k],"--src") == 0) {
218 found = 2;
219 if (k == *argc - 1) {
220 qCritical("--src: argument required.");
221 return false;
222 }
223 srcname = QString(argv[k+1]);
224 }
225 else if (strcmp(argv[k],"--mri") == 0) {
226 found = 2;
227 if (k == *argc - 1) {
228 qCritical("--mri: argument required.");
229 return false;
230 }
231 mri_head_ident = false;
232 mriname = QString(argv[k+1]);
233 transname.clear();
234 }
235 else if (strcmp(argv[k],"--trans") == 0) {
236 found = 2;
237 if (k == *argc - 1) {
238 qCritical("--trans: argument required.");
239 return false;
240 }
241 mri_head_ident = false;
242 transname = QString(argv[k+1]);
243 mriname.clear();
244 }
245 else if (strcmp(argv[k],"--notrans") == 0) {
246 found = 1;
247 mri_head_ident = true;
248 mriname.clear();
249 transname.clear();
250 }
251 else if (strcmp(argv[k],"--meas") == 0) {
252 found = 2;
253 if (k == *argc - 1) {
254 qCritical("--meas: argument required.");
255 return false;
256 }
257 measname = QString(argv[k+1]);
258 }
259 else if (strcmp(argv[k],"--bem") == 0) {
260 found = 2;
261 if (k == *argc - 1) {
262 qCritical("--bem: argument required.");
263 return false;
264 }
265 bemname = QString(argv[k+1]);
266 }
267 else if (strcmp(argv[k],"--origin") == 0) {
268 found = 2;
269 if (k == *argc - 1) {
270 qCritical("--origin: argument required.");
271 return false;
272 }
273 if (sscanf(argv[k+1],"%f:%f:%f",r0[X],r0[Y],r0[Z]) != 3) {
274 qCritical("Could not interpret the origin.");
275 return false;
276 }
277 r0[X] = r0[X]/1000.0f;
278 r0[Y] = r0[Y]/1000.0f;
279 r0[Z] = r0[Z]/1000.0f;
280 }
281 else if (strcmp(argv[k],"--eegrad") == 0) {
282 found = 2;
283 if (k == *argc - 1) {
284 qCritical("--eegrad: argument required.");
285 return false;
286 }
287 if (sscanf(argv[k+1],"%g",&eeg_sphere_rad) != 1) {
288 qCritical("Incomprehensible radius : %s",argv[k+1]);
289 return false;
290 }
291 if (eeg_sphere_rad <= 0) {
292 qCritical("Radius must be positive");
293 return false;
294 }
296 }
297 else if (strcmp(argv[k],"--eegmodels") == 0) {
298 found = 2;
299 if (k == *argc - 1) {
300 qCritical("--eegmodels: argument required.");
301 return false;
302 }
303 eeg_model_file = QString(argv[k+1]);
304 }
305 else if (strcmp(argv[k],"--eegmodel") == 0) {
306 found = 2;
307 if (k == *argc - 1) {
308 qCritical("--eegmodel: argument required.");
309 return false;
310 }
311 eeg_model_name = QString(argv[k+1]);
312 }
313 else if (strcmp(argv[k],"--eegscalp") == 0) {
314 found = 1;
315 scale_eeg_pos = true;
316 }
317 else if (strcmp(argv[k],"--mindist") == 0) {
318 found = 2;
319 if (k == *argc - 1) {
320 qCritical("--mindist: argument required.");
321 return false;
322 }
323 if (sscanf(argv[k+1],"%f",&mindist) != 1) {
324 qCritical("Could not interpret the distance.");
325 return false;
326 }
327 if (mindist <= 0.0)
328 mindist = 0.0f;
329 mindist = mindist/1000.0f;
330 }
331 else if (strcmp(argv[k],"--includeall") == 0) {
332 found = 1;
333 filter_spaces = false;
334 }
335 else if (strcmp(argv[k],"--mindistout") == 0) {
336 found = 2;
337 if (k == *argc - 1) {
338 qCritical("--mindistout: argument required.");
339 return false;
340 }
341 mindistoutname = QString(argv[k+1]);
342 }
343 else if (strcmp(argv[k],"--mricoord") == 0) {
344 found = 1;
345 coord_frame = FIFFV_COORD_MRI;
346 }
347 else if (strcmp(argv[k],"--fwd") == 0) {
348 found = 2;
349 if (k == *argc - 1) {
350 qCritical("--fwd: argument required.");
351 return false;
352 }
353 solname = QString(argv[k+1]);
354 }
355 else if (strcmp(argv[k],"--label") == 0) {
356 found = 2;
357 if (k == *argc - 1) {
358 qCritical("--label: argument required.");
359 return false;
360 }
361 labels.append(QString(argv[k+1]));
362 nlabel++;
363 }
364 if (found) {
365 for (int p = k; p < k + found; p++)
366 command = build_command_line(command,argv[p]);
367 for (int p = k; p < *argc-found; p++)
368 argv[p] = argv[p+found];
369 *argc = *argc - found;
370 k = k - found;
371 }
372 }
373 return check_unrecognized_args(*argc,argv);
374}
int k
Definition fiff_tag.cpp:324
Compute Forward Setting class declaration.
FIFFLIB::FiffCoordTransOld * meg_head_t
QSharedPointer< FIFFLIB::FiffInfo > pFiffInfo