MNE-CPP  0.1.9
A Framework for Electrophysiology
fwd_eeg_sphere_model_set.cpp
Go to the documentation of this file.
1 //=============================================================================================================
37 //=============================================================================================================
38 // INCLUDES
39 //=============================================================================================================
40 
42 
43 //=============================================================================================================
44 // QT INCLUDES
45 //=============================================================================================================
46 
47 #include <QString>
48 #include <QFile>
49 
50 #include <Eigen/Core>
51 
52 using namespace Eigen;
53 
54 //=============================================================================================================
55 // STATIC DEFINITIONS
56 //=============================================================================================================
57 
58 /*
59  * Basics...
60  */
61 #define MALLOC_2(x,t) (t *)malloc((x)*sizeof(t))
62 #define REALLOC_2(x,y,t) (t *)((x == NULL) ? malloc((y)*sizeof(t)) : realloc((x),(y)*sizeof(t)))
63 #define FREE_2(x) if ((char *)(x) != NULL) free((char *)(x))
64 
65 #define MAXLINE 500
66 
67 #ifndef FAIL
68 #define FAIL -1
69 #endif
70 
71 #ifndef OK
72 #define OK 0
73 #endif
74 
75 #define SEP ":\n\r"
76 
77 //=============================================================================================================
78 // EIGEN INCLUDES
79 //=============================================================================================================
80 
81 //=============================================================================================================
82 // USED NAMESPACES
83 //=============================================================================================================
84 
85 using namespace FWDLIB;
86 
87 //=============================================================================================================
88 // DEFINE MEMBER METHODS
89 //=============================================================================================================
90 
91 FwdEegSphereModelSet::FwdEegSphereModelSet()
92 {
93 }
94 
96 
97 //FwdEegSphereModelSet::FwdEegSphereModelSet(const FwdEegSphereModelSet &p_FwdEegSphereModelSet)
98 //: m_qListModels(p_FwdEegSphereModelSet.m_qListModels)
99 //{
100 
101 //}
102 
103 //=============================================================================================================
104 
105 FwdEegSphereModelSet::~FwdEegSphereModelSet()
106 {
107  for (int k = 0; k < this->nmodel(); k++)
108  delete this->models[k];
109 }
110 
111 //=============================================================================================================
112 
113 //void FwdEegSphereModelSet::fwd_free_eeg_sphere_model_set(FwdEegSphereModelSet* s)
114 
115 //{
116 // if (!s)
117 // return;
118 
119 // return;
120 //}
121 
122 //=============================================================================================================
123 
124 //FwdEegSphereModelSet* FwdEegSphereModelSet::fwd_new_eeg_sphere_model_set()
125 //{
126 // FwdEegSphereModelSet* s = new FwdEegSphereModelSet;
127 
128 // return s;
129 //}
130 
131 //=============================================================================================================
132 
133 FwdEegSphereModelSet* FwdEegSphereModelSet::fwd_add_to_eeg_sphere_model_set(FwdEegSphereModelSet* s, FwdEegSphereModel* m)
134 {
135  if (!s)
136  s = new FwdEegSphereModelSet;
137 
138  s->models.append(m);
139  return s;
140 }
141 
142 //=============================================================================================================
143 //fwd_eeg_sphere_models.c
144 FwdEegSphereModelSet* FwdEegSphereModelSet::fwd_add_default_eeg_sphere_model(FwdEegSphereModelSet* s)
145 {
146  static const int def_nlayer = 4;
147  VectorXf def_unit_rads(def_nlayer);
148  def_unit_rads << 0.90f,0.92f,0.97f,1.0f;
149  VectorXf def_sigmas(def_nlayer);
150  def_sigmas << 0.33f,1.0f,0.4e-2f,0.33f;
151 
152  return FwdEegSphereModelSet::fwd_add_to_eeg_sphere_model_set(s,FwdEegSphereModel::fwd_create_eeg_sphere_model("Default",
153  def_nlayer,def_unit_rads,def_sigmas));
154 }
155 
156 //=============================================================================================================
157 //fwd_eeg_sphere_models.c
158 FwdEegSphereModelSet* FwdEegSphereModelSet::fwd_load_eeg_sphere_models(const QString& filename, FwdEegSphereModelSet* now)
159 {
160  char line[MAXLINE];
161  FILE *fp = NULL;
162  QString name;
163  VectorXf rads;
164  VectorXf sigmas;
165  int nlayer = 0;
166  char *one, *two;
167  QString tag;
168 
169  if (!now)
170  now = fwd_add_default_eeg_sphere_model(now);
171 
172  if (filename.isEmpty())
173  return now;
174 
175  QFile t_file(filename);
176  if (!t_file.isReadable()) /* Never mind about an unaccesible file */
177  return now;
178 
179  if ((fp = fopen(filename.toUtf8().data(),"r")) == NULL) {
180  printf(filename.toUtf8().data());
181  goto bad;
182  }
183  while (fgets(line,MAXLINE,fp) != NULL) {
184  if (line[0] == '#')
185  continue;
186  one = strtok(line,SEP);
187  if (one != NULL) {
188  if (tag.isEmpty() || tag.size() == 0)
189  name = one;
190  else {
191  name = QString("%1 %2").arg(one).arg(tag);
192  }
193  while (1) {
194  one = strtok(NULL,SEP);
195  if (one == NULL)
196  break;
197  two = strtok(NULL,SEP);
198  if (two == NULL)
199  break;
200  rads.resize(nlayer+1);
201  sigmas.resize(nlayer+1);
202  if (sscanf(one,"%g",rads[nlayer]) != 1) {
203  nlayer = 0;
204  break;
205  }
206  if (sscanf(two,"%g",sigmas[nlayer]) != 1) {
207  nlayer = 0;
208  break;
209  }
210  nlayer++;
211  }
212  if (nlayer > 0)
213  now = fwd_add_to_eeg_sphere_model_set(now,FwdEegSphereModel::fwd_create_eeg_sphere_model(name,nlayer,rads,sigmas));
214  nlayer = 0;
215  }
216  }
217  if (ferror(fp)) {
218  printf(filename.toUtf8().data());
219  goto bad;
220  }
221  fclose(fp);
222  return now;
223 
224 bad : {
225  if (fp)
226  fclose(fp);
227  delete now;
228  return NULL;
229  }
230 }
231 
232 //=============================================================================================================
233 //fwd_eeg_sphere_models.c
234 FwdEegSphereModel* FwdEegSphereModelSet::fwd_select_eeg_sphere_model(const QString& p_sName)
235 {
236  int k;
237 
238  QString name("Default");
239 
240  if (!p_sName.isEmpty())
241  name = p_sName;
242 
243  if (this->nmodel() == 0) {
244  printf("No EEG sphere model definitions available");
245  return NULL;
246  }
247 
248  for (k = 0; k < this->nmodel(); k++) {
249  if (this->models[k]->name.compare(name) == 0) {
250  printf("Selected model: %s\n",this->models[k]->name.toUtf8().constData());
251  return new FwdEegSphereModel(*(this->models[k]));
252  }
253  }
254  printf("EEG sphere model %s not found.",name.toUtf8().constData());
255  return NULL;
256 }
257 
258 //=============================================================================================================
259 //dipole_fit_setup.c
260 void FwdEegSphereModelSet::fwd_list_eeg_sphere_models(FILE *f)
261 {
262  int k,p;
263  FwdEegSphereModel* this_model;
264 
265  if ( this->nmodel() < 0 )
266  return;
267  fprintf(f,"Available EEG sphere models:\n");
268  for (k = 0; k < this->nmodel(); k++) {
269  this_model = this->models[k];
270  fprintf(f,"\t%s : %d",this_model->name.toUtf8().constData(),this_model->nlayer());
271  for (p = 0; p < this_model->nlayer(); p++)
272  fprintf(f," : %7.3f : %7.3f",this_model->layers[p].rel_rad,this_model->layers[p].sigma);
273  fprintf(f,"\n");
274  }
275 }
276 
278 
279 //void FwdEegSphereModelSet::addFwdEegSphereModel(const FwdEegSphereModel &p_FwdEegSphereModel)
280 //{
281 // m_qListModels.append(p_FwdEegSphereModel);
282 //}
283 
285 
286 //const FwdEegSphereModel& FwdEegSphereModelSet::operator[] (qint32 idx) const
287 //{
288 // if (idx>=m_qListModels.length())
289 // {
290 // qWarning("Warning: Required FwdEegSphereModel doesn't exist! Returning FwdEegSphereModel '0'.");
291 // idx=0;
292 // }
293 // return m_qListModels[idx];
294 //}
295 
297 
298 //FwdEegSphereModel& FwdEegSphereModelSet::operator[] (qint32 idx)
299 //{
300 // if (idx >= m_qListModels.length())
301 // {
302 // qWarning("Warning: Required FwdEegSphereModel doesn't exist! Returning FwdEegSphereModel '0'.");
303 // idx = 0;
304 // }
305 // return m_qListModels[idx];
306 //}
307 
309 
310 //FwdEegSphereModelSet &FwdEegSphereModelSet::operator<<(const FwdEegSphereModel &p_FwdEegSphereModel)
311 //{
312 // this->m_qListModels.append(p_FwdEegSphereModel);
313 // return *this;
314 //}
FWDLIB::FwdEegSphereModelSet
Holds a set of Electric Current Dipoles.
Definition: fwd_eeg_sphere_model_set.h:80
FWDLIB::FwdEegSphereModelSet::models
QList< FwdEegSphereModel * > models
Definition: fwd_eeg_sphere_model_set.h:216
FWDLIB::FwdEegSphereModel
Electric Current Dipole description.
Definition: fwd_eeg_sphere_model.h:91
k
int k
Definition: fiff_tag.cpp:322
FWDLIB::FwdEegSphereModel::layers
QList< FwdEegSphereLayer > layers
Definition: fwd_eeg_sphere_model.h:327
FWDLIB::FwdEegSphereModel::name
QString name
Definition: fwd_eeg_sphere_model.h:326
fwd_eeg_sphere_model_set.h
FwdEegSphereModelSet class declaration.