74 QList<QVector<double> > &outputPoints,
75 const QStringList &names,
92 float xmin,xmax,ymin,ymax;
94 int nchan = inputPoints.size();
96 MatrixXf rrs(nchan,3);
101 std::cout<<
"No input points to lay out.";
106 for(k = 0; k<nchan; k++) {
107 rrs(k,0) = inputPoints.at(k)[0];
108 rrs(k,1) = inputPoints.at(k)[1];
109 rrs(k,2) = inputPoints.at(k)[2];
112 std::cout<<
"Channels found for layout: "<<nchan<<std::endl;
116 std::cout<<
"Using default origin:"<<r0[0]<<r0[1]<<r0[2]<<std::endl;
118 if(fit_sphere_to_points(rrs,nchan,0.05,r0,rad) == FAIL) {
119 std::cout<<
"Using default origin:"<<r0[0]<<r0[1]<<r0[2]<<std::endl;
122 std::cout<<
"best fitting sphere:"<<std::endl;
123 std::cout<<
"torigin: "<<r0[0]<<r0[1]<<r0[2]<<rad<<std::endl<<
"tradius: "<<rad<<std::endl;
130 for (k = 0; k < nchan; k++) {
131 rr = r0 -
static_cast<VectorXf
>(rrs.row(k));
132 sphere_coord(rr[0],rr[1],rr[2],&rad,&th,&phi);
133 xx[k] = prad*(2.0*th/M_PI)*cos(phi);
134 yy[k] = prad*(2.0*th/M_PI)*sin(phi);
143 for(k = 1; k < nchan; k++) {
146 else if (xx[k] < xmin)
150 else if (yy[k] < ymin)
154 if(xmin == xmax || ymin == ymax) {
155 std::cout<<
"Cannot make a layout. All positions are identical"<<std::endl;
168 QVector<double> point;
172 if (!outFile.open(QIODevice::WriteOnly)) {
173 std::cout<<
"could not open output file";
174 qDebug()<<
"could not open output file";
178 out.setDevice(&outFile);
181 for(k = 0; k < nchan; k++) {
183 point.append(xx[k]-0.5*w);
184 point.append(-(yy[k]-0.5*h));
185 outputPoints.append(point);
188 out << k+1 <<
" " << point[0] <<
" " << point[1] <<
" " << w <<
" " << h <<
" " << names.at(k)<<endl;
192 std::cout<<
"success while wrtiting to output file";
205 void LayoutMaker::sphere_coord (
float x,
213 float rxy = sqrt(x*x+y*y);
220 *r = sqrt(x*x+y*y+z*z);
221 *theta = acos(z/(*r));
224 *phi = *phi + 2.0*M_PI;
231 int LayoutMaker::report_func(
int loop,
232 const VectorXf &fitpar,
239 VectorXf r0 = fitpar;
241 std::cout<<
"loop: "<<loop<<
"r0: "<<1000*r0[0]<<1000*r0[1]<<1000*r0[2]<<
"fval: "<<fval<<std::endl;
249 float LayoutMaker::fit_eval(
const VectorXf &fitpar,
258 VectorXf r0 = fitpar;
261 float sum,sum2,one,F;
263 for (k = 0, sum = sum2 = 0.0; k < user->np; k++) {
264 diff = r0 -
static_cast<VectorXf
>(user->rr.row(k));
265 one = sqrt(pow(diff(0),2) + pow(diff(1),2) + pow(diff(2),2));
269 F = sum2 - sum*sum/user->np;
272 std::cout<<
"r0: "<<1000*r0[0]<<1000*r0[1]<<1000*r0[2]<<
"R: "<<1000*sum/user->np<<
"fval: "<<F<<std::endl;
280 float LayoutMaker::opt_rad(VectorXf &r0,
fitUser user)
286 for (k = 0, sum = 0.0; k < user->np; k++) {
287 diff = r0 -
static_cast<VectorXf
>(user->rr.row(k));
288 one = sqrt(pow(diff(0),2) + pow(diff(1),2) + pow(diff(2),2));
298 void LayoutMaker::calculate_cm_ave_dist(MatrixXf &rr,
307 for (q = 0; q < 3; q++)
310 for (k = 0; k < np; k++)
311 for (q = 0; q < 3; q++)
315 for (q = 0; q < 3; q++)
318 for (k = 0, ave = 0.0; k < np; k++) {
319 for (q = 0; q < 3; q++)
320 diff[q] = rr(k,q) - cm[q];
321 ave += sqrt(pow(diff(0),2) + pow(diff(1),2) + pow(diff(2),2));
330 MatrixXf LayoutMaker::make_initial_simplex(VectorXf &pars,
337 MatrixXf simplex(npar+1,npar);
340 for (k = 0; k < npar+1; k++)
341 simplex.row(k) = pars;
343 for (k = 1; k < npar+1; k++)
344 simplex(k,k-1) = simplex(k,k-1) + size;
352 int LayoutMaker::fit_sphere_to_points(MatrixXf &rr,
364 int report_interval = -1;
366 MatrixXf init_simplex;
367 VectorXf init_vals(4);
379 calculate_cm_ave_dist(rr,np,cm,R0);
381 init_simplex = make_initial_simplex(cm,3,simplex_size);
383 std::cout <<
"sphere origin calcuated" << cm[0] <<
" " << cm[1] <<
" " << cm[2] << std::endl;
387 for (k = 0; k < 4; k++)
388 init_vals[k] = fit_eval(static_cast<VectorXf>(init_simplex.row(k)),3,&user);
393 if(MinimizerSimplex::mne_simplex_minimize(init_simplex,
405 r0[0] = init_simplex(0,0);
406 r0[1] = init_simplex(0,1);
407 r0[2] = init_simplex(0,2);
408 R = opt_rad(r0,&user);
LayoutLoader class declaration.
static bool makeLayout(const QList< QVector< double > > &inputPoints, QList< QVector< double > > &outputPoints, const QStringList &names, QFile &outFile, bool do_fit, float prad, float w, float h, bool writeFile=false)