X-shooter Pipeline Reference Manual 3.8.15
xsh_model_metric.c
Go to the documentation of this file.
1/* $Id: xsh_model_metric.c,v 1.36 2012-12-18 16:09:26 amodigli Exp $
2 *
3 * This file is part of the ESO X-shooter Pipeline
4 * Copyright (C) 2006 European Southern Observatory
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21/*
22 * $Author: amodigli $
23 * $Date: 2012-12-18 16:09:26 $
24 * $Revision: 1.36 $
25 * $Name: not supported by cvs2svn $
26 */
27
28#ifdef HAVE_CONFIG_H
29#include <config.h>
30#endif
31/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
40/*-----------------------------------------------------------------------------
41 Includes
42 -----------------------------------------------------------------------------*/
43
44#include <cpl.h>
45
46#include "xsh_model_kernel.h"
47#include "xsh_model_io.h"
48#include "xsh_model_metric.h"
49
50#include <stdio.h>
51#include <stdlib.h>
52#include <math.h>
53#include <float.h>
54#include "xsh_model_sa.h"
55#include "xsh_model_r250.h"
56#include "xsh_model_cputime.h"
57#include "xsh_model_randlcg.h"
58
59#include <xsh_utils.h>
60#include <xsh_error.h>
61#include <xsh_msg.h>
62#include "xsh_pfits.h"
63#include "xsh_dfs.h"
64
65#ifdef _R250_H_
66#define uniform(a,b) ( a + (b - a) * xsh_dr250() )
67#endif
68
69/* #define MELT_ONLY */
70/* #define EQUIL_ONLY */
71
72#define BIG_VAL 400000.0
73
74/* for conversion from degree to radians */
75/* static const DOUBLE DEG2RAD=M_PI/180.0; */
76
77int n = 0;
78int* chip;
79int* x;
80int* y;
88
89DOUBLE p_obsx[10000],p_obsy[10000],p_obsf[10000];
92int p_obsarm[10000], p_obsorder[10000], sp_array[10000];
94int size, mm;
95
96/* the cost function */
97void xsh_3_assign(int loc, double val);
98void xsh_3_output_data(double*);
99
100/*----------------------------------------------------------------------------*/
120/*----------------------------------------------------------------------------*/
121
122cpl_table* xsh_model_anneal_comp(ann_all_par* p_all_par,
123 int nparam,double* abest,
124 double* amin,
125 double* amax,
126 int* aname,
127 struct xs_3* p_xs_3,
128 int DS_size,
129 coord* msp_coord,
130 DOUBLE* p_wlarray,
131 DOUBLE** ref_ind,
132 int maxit)
133{
134 int ii;
135 float z, t0, t;
136 cpl_table* conf_tab=NULL ;
137 double* a;
138 a=(DOUBLE*)cpl_malloc(nparam*sizeof(DOUBLE));
139
140#ifdef DEBUG
141 fprintf(stderr,"%d points read for analysis\n", DS_size);
142
143 xsh_report_cpu( stderr, NULL );
144 printf("%d nparam \n",nparam);
145#endif
146
147 if ( xsh_SAInit(xsh_3_energy,nparam) == 0 ) {
148 fprintf(stderr,"trouble initializing in xsh_SAInit\n");
149 abort();
150 }
151
152 local_p_abest=abest;
153 local_p_amax=amax;
154 local_p_amin=amin;
155 local_p_aname=aname;
156 local_nparam=nparam;
157 local_p_all_par=p_all_par;
158 local_p_xs=p_xs_3;
159 for (ii=0;ii<DS_size;ii++) {
160 p_obsx[ii]=msp_coord[ii].x;
161 p_obsy[ii]=msp_coord[ii].y;
162 p_obsarm[ii]=msp_coord[ii].arm;
163 p_obsf[ii]=msp_coord[ii].flux;
164 sp_array[ii]=msp_coord[ii].slit_pos;
165 p_obsorder[ii]=msp_coord[ii].order;
166#ifdef DEBUG
167 printf("%d obsx: %lf obsy:%lf, obsarm: %d sp: %d\n",
168 ii, p_obsx[ii],p_obsy[ii],p_obsarm[ii],
169 sp_array[ii]);
170#endif
171 }
172
173 p_wl=p_wlarray;
174 size = DS_size;
175 ref=ref_ind;
176
177 for (ii=0; ii<local_nparam ; ii++) {
178 a[ii]=local_p_abest[ii];
179 }
180#ifdef DEBUG
181 printf("bef ener %lf %lf %lf %lf %lf \n",a[0], a[1],a[2], a[3],a[4]);
182#endif
183
184 check(z = xsh_3_energy(a));
185
186#ifdef DEBUG
187 printf("bef init %lf %lf %lf %lf %lf \n",a[0], a[1],a[2], a[3],a[4]);
188#endif
189 xsh_SAinitial( a );
190 xsh_SABoltzmann( 0.5 );
191#ifdef DEBUG
192 printf("aft boltz %lf %lf %lf %lf %lf \n",a[0], a[1],a[2], a[3],a[4]);
193
194/* xsh_SAjump( 150.0 ); */
195
196 fprintf(stderr,"Boltzman constant: %f\tlearning rate:%f\n",
198
199 fprintf(stderr,"Initial values: ");
200 for (ii = 0; ii < local_nparam; ii++)
201 fprintf(stderr,"%g\t", a[ii]);
202 fprintf(stderr,"\t(energy = %g)\n", z);
203#endif
204
205 xsh_SAmelt( NO_VALUE ); /* melt the system */
206#ifdef DEBUG
207 printf("aft melt %lf %lf %lf %lf %lf \n",a[0], a[1],a[2], a[3],a[4]);
208#endif
209
210 xsh_SAcurrent( a );
211#ifdef DEBUG
212 printf("aft current %lf %lf %lf %lf %lf \n",a[0], a[1],a[2], a[3],a[4]);
213#endif
214
215 z = xsh_3_energy(a);
216
217#ifdef DEBUG
218 printf("aft energy %lf %lf %lf %lf %lf \n",a[0], a[1],a[2], a[3],a[4]);
219
220
221 fprintf(stderr,"melt values: ");
222 int i=0;
223 for (i = 0; i < local_nparam; i++)
224 fprintf(stderr,"%g\t", a[i]);
225 fprintf(stderr,"\t(energy = %g)\n", z);
226#endif
227
229
230#ifdef DEBUG
231 printf("aft temp %lf %lf %lf %lf %lf\n",a[0], a[1],a[2], a[3],a[4]);
232#endif
233
234 /* make it a bit warmer than melting temperature */
235 t0 = 1.2 * xsh_SAtemperature( NO_VALUE );
236
237 xsh_SAtemperature( t0 );
238#ifdef DEBUG
239 printf("aft temp t0 %lf %lf %lf %lf %lf \n",a[0], a[1],a[2], a[3],a[4]);
240#endif
241
242 t = xsh_SAanneal( maxit );
243#ifdef DEBUG
244 printf("aft anneal %lf %lf %lf %lf %lf \n",a[0], a[1],a[2], a[3],a[4]);
245#endif
246 xsh_SAcurrent( a );
247#ifdef DEBUG
248 printf("aft current %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \n",
249 a[0], a[1],a[2], a[3],a[4],a[5], a[6],a[7], a[8],a[9]);
250#endif
251 z = xsh_3_energy(a);
252#ifdef DEBUG
253 printf("aft energy %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \n",
254 a[0], a[1],a[2], a[3],a[4],a[5], a[6],a[7], a[8],a[9]);
255
256 fprintf(stderr,"Initial temperature: %f\tfinal temperature: %f\n", t0, t);
257 fprintf(stderr,"Estimated minimum at: ");
258 for (i = 0; i < local_nparam; i++)
259 fprintf(stderr,"%g\t", a[i]);
260 fprintf(stderr,"\t(energy = %g)\n", z);
261#endif
262
263 /* Below is commented out. To be honest its not clear to me what xsh_SAoptimum was ever supposed to do, however it is clear that it changes a[ii] from the values that gave the best solution during the anneal, so that the output solution is then different (and usually worse). Better to leave it out then */
264 /*xsh_SAoptimum( a );
265 printf("aft opt %lf %lf %lf %lf %lf \n",a[0], a[1],a[2], a[3],a[4]);
266 z = xsh_3_energy(a);
267 printf("aft energy %lf %lf %lf %lf %lf \n",a[0], a[1],a[2], a[3],a[4]);
268
269 fprintf(stderr,"Best minimum at: ");
270 for (i = 0; i < local_nparam; i++)
271 fprintf(stderr,"%g\t", a[i]);
272 fprintf(stderr,"\t(energy = %g)\n", z);*/
273
276
277 for (ii = 0; ii < nparam; ii++)
278 {
279 abest[ii]=local_p_abest[ii];
280 }
281 cpl_free(a);
282 xsh_report_cpu( stderr, NULL );
283
284 cleanup:
285 if(cpl_error_get_code() != CPL_ERROR_NONE) {
286 cpl_free(a);
287 xsh_SAfree();
288 return NULL;
289 } else {
290 xsh_SAfree();
291 return conf_tab ;
292 }
293}
294
295void xsh_3_output_data(double *a)
296{
297 static int counter;
298 //vec detvec;
299 int ii;
300
301 double quad_diff;
302
303 /*for (ii=0; ii<local_nparam; ii++) {
304 xsh_3_assign(local_p_aname[ii],local_p_abest[ii]+((local_p_amax[ii]-local_p_amin[ii])/2.0)*a[ii]);
305 printf("%lf ",a[ii]);
306 }*/
307
308 a[0]=a[0]+0.0;
310
311 quad_diff=0;
312 for (ii = 0; ii < size; ii++) {
314 mm=p_obsorder[ii];
318 quad_diff+=
319 ((p_obsx[ii]-local_p_xs->xpospix)*
322 (p_obsy[ii]-local_p_xs->ypospix));
323
324#ifdef DEBUG
325 printf("%d %lf %lf %lf %lf %lf %lf %d %d %d %lf %lf\n",
326 ii,p_obsx[ii]-local_p_xs->xpospix,
329 p_obsarm[ii],p_obsorder[ii], sp_array[ii], p_obsf[ii], p_wl[ii]*1000.0);
330#endif
331
332 // printf("%lf\n",quad_diff);
333 counter++;
334 }
335#ifdef DEBUG
336 printf("%lf\n",quad_diff);
337#endif
338 return;
339}
340
341/* evaluate the sum squared error, the "energy" */
342float xsh_3_energy(double *a) {
343 static int flux_wt;
344 //FILE * tempc;
345 static int counter;
346 static int first_time;
347 static float bestyet;
348 static int first_ann_flag;
349 double newval[100];
350 double size_use=0;
351 double blaze_wav=0.;
352 double blaze_ref=0.;
353 double blaze_off=0.;
354 double val_max=0.;
355 double x_max=0.;
356 double y_max=0.;
357 double fw_max=0.;
358 //float ** plotout=xsh_alloc2Darray_f(size,6);
359
360 int ii=0;
361 float sum_nw = 0.0, val = 0.0;
362 float sum_fw = 0.0, val_fw = 0.0;
363 float sum_x = 0.0, val_x = 0.0;
364 float sum_y = 0.0, val_y = 0.0;
365 float sum = 0.0;
366
367 if (first_ann_flag==0) {
368 if (size>33) {
369 first_ann_flag=1;
370 first_time=0;
371 counter=0;
372 }
373 }
374 // plot=fopen("plot.dat","a+");
375 double sin_min_nug_div_sg=(sin(-local_p_xs->nug))/local_p_xs->sg;
376 for (ii=0; ii<local_nparam; ii++) {
377 if(first_time >0) {
378 newval[ii]=local_p_abest[ii]+((local_p_amax[ii]-local_p_amin[ii])/2.0)*a[ii];
379 }
380 else {
381 newval[ii]=local_p_abest[ii];
382 }
383 if (newval[ii]>local_p_amax[ii] || newval[ii]<local_p_amin[ii]) {
384 sum_nw=HUGE_VAL;
385 sum_fw=HUGE_VAL;
386 }
387 xsh_3_assign(local_p_aname[ii],newval[ii]);
388 }
389
390 blaze_off=0.0;
391 for (mm=local_p_xs->morder_min;mm<=local_p_xs->morder_max;mm+=1) {
392 blaze_wav=2.0*sin_min_nug_div_sg/mm;
393 if (local_p_xs->arm==1) {
394 //blaze_ref=1.6180339887498949/(mm*99.4);
395 blaze_ref = 0.0162780076852276/mm;
396 }
397 else if (local_p_xs->arm==0) {
398 //blaze_ref=1.3322840971595746/(mm*180.0);
399 blaze_ref=0.0074015783175532/mm;
400 }
401 else if (local_p_xs->arm==2) {
402 //blaze_ref=1.44030324281136/(mm*55.0);
403 blaze_ref = 0.0261873316874793/mm;
404 }
405 if (fabs(blaze_wav-blaze_ref)>blaze_wav/200.0) {
406 //printf("out %lf %d %lf %lf %lf \n",blaze_wav,mm,(blaze_wav-blaze_ref)*500,local_p_xs->nug, local_p_xs->sg);
407 sum_nw=HUGE_VAL;
408 sum_fw=HUGE_VAL;
409 }
410 else {
411 double tmpval = fabs(blaze_wav-blaze_ref);
412 if (tmpval>blaze_off) {
413 blaze_off=tmpval;
414 }
415 }
416 }
418
419 val_max=0.0;
420 fw_max=0.0;
421 for (ii = 0; ii < size; ii++) {
422 if (sum_nw<HUGE_VAL) {
424 mm=p_obsorder[ii];
425
426 if (local_p_xs->arm==1) {
427 blaze_wav=2.0*sin_min_nug_div_sg/mm;
428 //blaze_ref=1.6180339887498949/(mm*99.4);
429 blaze_ref = 0.0162780076852276/mm;
430 }
431 else if (local_p_xs->arm==0) {
432 blaze_wav=2.0*sin_min_nug_div_sg/mm;
433 //blaze_ref=1.3322840971595746/(mm*180.0);
434 blaze_ref=0.0074015783175532/mm;
435 }
436
438
441 if (local_p_xs->chippix[0]==1) {
442 val_x=p_obsx[ii]-local_p_xs->xpospix;
443 if (val_x<0.0) val_x=-val_x;
444
445 val_y=p_obsy[ii]-local_p_xs->ypospix;
446 if (val_y<0.0) val_y=-val_y;
447
448 val=(val_x*val_x+val_y*val_y);
449 val_fw=val*p_obsf[ii];
450
451 //printf("%d %lf %f obsx %lf modx %lf obsy %lf mody %lf %lf \n",ii,1000.0*p_wl[ii],val,p_obsx[ii],local_p_xs->xpospix,p_obsy[ii],local_p_xs->ypospix,local_p_xs->es_y);
452 //printf("%4.4lf %4.4lf\n", local_p_xs->xpospix, local_p_xs->ypospix);
453 /*plotout[ii][0]=(float)(local_p_xs->chippix[0]);
454 plotout[ii][1]=sqrt(val);
455 plotout[ii][2]=p_obsx[ii]-local_p_xs->xpospix;
456 plotout[ii][3]=p_obsy[ii]-local_p_xs->ypospix;
457 plotout[ii][4]=local_p_xs->ypospix;
458 plotout[ii][5]=local_p_xs->xpospix+local_p_xs->chipx[local_p_xs->chippix[0]]/local_p_xs->pix;*/
459 }
460 else {
461 val=BIG_VAL;
462 val_fw=BIG_VAL;
463 }
464 if (val>val_max && val<BIG_VAL) {
465 val_max=val;
466 fw_max=val_fw;
467 x_max=val_x;
468 y_max=val_y;
469 }
470 sum_nw += val;
471 sum_fw += val_fw;
472 sum_x +=val_x;
473 sum_y +=val_y;
474 //printf("%d %f %lf %f %lf %lf %d %d\n",ii,val,p_obsy[ii],local_p_xs->xdet,p_obsx[ii],local_p_xs->ydet,p_obsarm[ii],local_p_xs->chippix[0]);
475 /*if(first_time==0)
476 printf("%4.4lf %4.4lf %4.4lf %4.4lf \n",p_obsx[i],x,p_obsy[i],y);*/
477 //printf("%f \n",val);
478 }
479 }
480 if (size>4 && val_max>0.5) {
481 sum_nw-=val_max;
482 sum_fw-=fw_max;
483 sum_x-=x_max;
484 sum_y-=y_max;
485 size_use=(float)(size-1);
486 }
487 else {
488 size_use=(float)(size);
489 }
490 if (flux_wt==2) {
491 sum=val_max;
492 size_use=1.0;
493 }
494 else if (flux_wt==1) {
495 sum=sum_fw;
496 }
497 else {
498 sum=sum_nw;
499 }
500
501 if (sqrt(sum/size_use)<bestyet && sum>0.0) {
502#ifdef DEBUG
503 xsh_msg("it: %d blaze off %lf nw %lf fw %lf",counter,blaze_off*1000000.0, sqrt(sum_nw/size_use), sqrt(sum_fw/size_use));
504 xsh_msg("x %lf y %lf max %lf T %lf last %lf", sum_x/size_use, sum_y/size_use, sqrt(val_max), local_p_xs->temper, bestyet);
505 for (ii=0; ii<local_nparam; ii++) {
506 xsh_msg("%s %f %f %f %f", (local_p_all_par+local_p_aname[ii])->name, newval[ii],local_p_amax[ii],local_p_amin[ii],2.0*((newval[ii]-local_p_amin[ii])/(local_p_amax[ii]-local_p_amin[ii]))-1.0);
507 }
508 //xsh_model_io_output_cfg_txt(local_p_xs);
509#endif
510 xsh_msg("Iteration No./10: %d; Mean x residual: %f; Mean y residual: %f", counter/10, sum_x/size_use, sum_y/size_use);
511
512 //printf("%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \n",a[0],a[1],a[2],a[3],a[4],a[5], a[6],a[7], a[8],a[9]);
513 bestyet=sqrt(sum/size_use);
514 if (bestyet<80.0) {
515 xsh_SAiterations(400);
516 //printf("%d %lf %lf %lf\n",mm, p_wl[ii]*1000.0,local_p_xs->xdet,local_p_xs->ydet);
517
518 /* for (ii = 0; ii < size; ii++) {
519 fprintf(plot,"%d %d %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \n",counter, ii, p_wl[ii], plotout[ii][0], plotout[ii][1], plotout[ii][2], plotout[ii][3], plotout[ii][4], plotout[ii][5], local_p_xs->es_x ,local_p_xs->es_y,local_p_xs->fcp,local_p_xs->mup1/DEG2RAD,local_p_xs->nup1/DEG2RAD,local_p_xs->taup1/DEG2RAD,local_p_xs->mup2/DEG2RAD,local_p_xs->nup2/DEG2RAD,local_p_xs->taup2/DEG2RAD, local_p_xs->mug/DEG2RAD, local_p_xs->nug/DEG2RAD, local_p_xs->taug/DEG2RAD,local_p_xs->fk,local_p_xs->mud/DEG2RAD, local_p_xs->nud/DEG2RAD,local_p_xs->taud/DEG2RAD,local_p_xs->offx,local_p_xs->offy);
520 //fprintf(plot,"%d %d %lf %lf %lf %lf %lf %lf %lf \n", counter, ii, p_wl[ii],plotout[ii][0], plotout[ii][1], plotout[ii][2], plotout[ii][3], plotout[ii][4], plotout[ii][5]);
521 }*/
522 }
523 /*if (bestyet<60.0 && flux_wt==3) {
524 bestyet=sqrt(val_max);
525 flux_wt=2;
526 }*/
527 }
528 counter++;
529 if(first_time==0) {
530 first_time++;
531 bestyet=1000000;
532 flux_wt=0;
533 }
534 //fclose(plot);
535 return sum;
536 // xsh_free2Darray_f(plotout,size);
537 /*}*/
538}
539
540void xsh_3_assign(int loc, double val)
541{
542 int compa,kk,indlen;
543 char tempstr[10];
544 compa=strncmp((local_p_all_par+loc)->name,"temper",6);
545 if (compa==0) local_p_xs->temper=val;
546 compa=strncmp((local_p_all_par+loc)->name,"t_ir_p2",7);
547 if (compa==0) local_p_xs->t_ir_p2=val;
548 compa=strncmp((local_p_all_par+loc)->name,"t_ir_p3",7);
549 if (compa==0) local_p_xs->t_ir_p3=val;
550 compa=strncmp((local_p_all_par+loc)->name,"es_x",4);
551 if (compa==0) local_p_xs->es_x=val;
552 compa=strncmp((local_p_all_par+loc)->name,"es_y",4);
553 if (compa==0) local_p_xs->es_y=val;
554 compa=strncmp((local_p_all_par+loc)->name,"mues",4);
555 if (compa==0) local_p_xs->mues=val*DEG2RAD;
556 compa=strncmp((local_p_all_par+loc)->name,"nues",4);
557 if (compa==0) local_p_xs->nues=val*DEG2RAD;
558 compa=strncmp((local_p_all_par+loc)->name,"taues",5);
559 if (compa==0) local_p_xs->taues=val*DEG2RAD;
560 compa=strncmp((local_p_all_par+loc)->name,"slit_scale",10);
561 if (compa==0) local_p_xs->slit_scale=val;
562 compa=strncmp((local_p_all_par+loc)->name,"es_s",4);
563 if (compa==0) local_p_xs->es_s=val;
564 compa=strncmp((local_p_all_par+loc)->name,"es_w",4);
565 if (compa==0) local_p_xs->es_w=val;
566 compa=strncmp((local_p_all_par+loc)->name,"fcol",4);
567 if (compa==0) local_p_xs->fcol=val;
568 compa=strncmp((local_p_all_par+loc)->name,"cmup1",5);
569 if (compa==0) local_p_xs->cmup1=val*DEG2RAD;
570 compa=strncmp((local_p_all_par+loc)->name,"mup1",4);
571 if (compa==0) local_p_xs->mup1=val*DEG2RAD;
572 compa=strncmp((local_p_all_par+loc)->name,"nup1",4);
573 if (compa==0) local_p_xs->nup1=val*DEG2RAD;
574 compa=strncmp((local_p_all_par+loc)->name,"taup1",5);
575 if (compa==0) local_p_xs->taup1=val*DEG2RAD;
576 compa=strncmp((local_p_all_par+loc)->name,"mup2",4);
577 if (compa==0) local_p_xs->mup2=val*DEG2RAD;
578 compa=strncmp((local_p_all_par+loc)->name,"nup2",4);
579 if (compa==0) local_p_xs->nup2=val*DEG2RAD;
580 compa=strncmp((local_p_all_par+loc)->name,"taup2",5);
581 if (compa==0) local_p_xs->taup2=val*DEG2RAD;
582 compa=strncmp((local_p_all_par+loc)->name,"mup3",4);
583 if (compa==0) local_p_xs->mup3=val*DEG2RAD;
584 compa=strncmp((local_p_all_par+loc)->name,"nup3",4);
585 if (compa==0) local_p_xs->nup3=val*DEG2RAD;
586 compa=strncmp((local_p_all_par+loc)->name,"taup3",5);
587 if (compa==0) local_p_xs->taup3=val*DEG2RAD;
588 compa=strncmp((local_p_all_par+loc)->name,"mup4",4);
589 if (compa==0) local_p_xs->mup4=val*DEG2RAD;
590 compa=strncmp((local_p_all_par+loc)->name,"nup4",4);
591 if (compa==0) local_p_xs->nup4=val*DEG2RAD;
592 compa=strncmp((local_p_all_par+loc)->name,"taup4",5);
593 if (compa==0) local_p_xs->taup4=val*DEG2RAD;
594 compa=strncmp((local_p_all_par+loc)->name,"mup5",4);
595 if (compa==0) local_p_xs->mup5=val*DEG2RAD;
596 compa=strncmp((local_p_all_par+loc)->name,"nup5",4);
597 if (compa==0) local_p_xs->nup5=val*DEG2RAD;
598 compa=strncmp((local_p_all_par+loc)->name,"taup5",5);
599 if (compa==0) local_p_xs->taup5=val*DEG2RAD;
600 compa=strncmp((local_p_all_par+loc)->name,"mup6",4);
601 if (compa==0) local_p_xs->mup6=val*DEG2RAD;
602 compa=strncmp((local_p_all_par+loc)->name,"nup6",4);
603 if (compa==0) local_p_xs->nup6=val*DEG2RAD;
604 compa=strncmp((local_p_all_par+loc)->name,"taup6",5);
605 if (compa==0) local_p_xs->taup6=val*DEG2RAD;
606 compa=strncmp((local_p_all_par+loc)->name,"mug",3);
607 if (compa==0) local_p_xs->mug=val*DEG2RAD;
608 compa=strncmp((local_p_all_par+loc)->name,"nug",3);
609 if (compa==0) local_p_xs->nug=val*DEG2RAD;
610 compa=strncmp((local_p_all_par+loc)->name,"taug",4);
611 if (compa==0) local_p_xs->taug=val*DEG2RAD;
612 compa=strncmp((local_p_all_par+loc)->name,"sg",2);
613 if (compa==0) local_p_xs->sg=val;
614 compa=strncmp((local_p_all_par+loc)->name,"fdet",4);
615 if (compa==0) local_p_xs->fdet=val;
616 compa=strncmp((local_p_all_par+loc)->name,"mud",3);
617 if (compa==0) local_p_xs->mud=val*DEG2RAD;
618 compa=strncmp((local_p_all_par+loc)->name,"nud",3);
619 if (compa==0) local_p_xs->nud=val*DEG2RAD;
620 compa=strncmp((local_p_all_par+loc)->name,"taud",4);
621 if (compa==0) local_p_xs->taud=val*DEG2RAD;
622 compa=strncmp((local_p_all_par+loc)->name,"pix",3);
623 if (compa==0) {
624 local_p_xs->pix=val;
627 }
628 compa=strncmp((local_p_all_par+loc)->name,"chipx",5);
629 if (compa==0) local_p_xs->chipx=val;
630 compa=strncmp((local_p_all_par+loc)->name,"chipy",5);
631 if (compa==0) local_p_xs->chipy=val;
632 compa=strncmp((local_p_all_par+loc)->name,"chiprot",7);
633 if (compa==0) local_p_xs->chiprot=val*DEG2RAD;
634 compa=strncmp((local_p_all_par+loc)->name,"pc_x_xx",7);
635 if (compa==0) local_p_xs->pc_x_xx=val;
636 compa=strncmp((local_p_all_par+loc)->name,"pc_x_x1",7);
637 if (compa==0) local_p_xs->pc_x_x1=val;
638 compa=strncmp((local_p_all_par+loc)->name,"pc_x_yy",7);
639 if (compa==0) local_p_xs->pc_x_yy=val;
640 compa=strncmp((local_p_all_par+loc)->name,"pc_x_y1",7);
641 if (compa==0) local_p_xs->pc_x_y1=val;
642 compa=strncmp((local_p_all_par+loc)->name,"pc_x_xy",7);
643 if (compa==0) local_p_xs->pc_x_xy=val;
644 compa=strncmp((local_p_all_par+loc)->name,"pc_x_x3",7);
645 if (compa==0) local_p_xs->pc_x_x3=val;
646 compa=strncmp((local_p_all_par+loc)->name,"pc_x_x2y",8);
647 if (compa==0) local_p_xs->pc_x_x2y=val;
648 compa=strncmp((local_p_all_par+loc)->name,"pc_x_y2x",8);
649 if (compa==0) local_p_xs->pc_x_y2x=val;
650 compa=strncmp((local_p_all_par+loc)->name,"pc_x_y3",7);
651 if (compa==0) local_p_xs->pc_x_y3=val;
652 compa=strncmp((local_p_all_par+loc)->name,"pc_y_xx",7);
653 if (compa==0) local_p_xs->pc_y_xx=val;
654 compa=strncmp((local_p_all_par+loc)->name,"pc_y_x1",7);
655 if (compa==0) local_p_xs->pc_y_x1=val;
656 compa=strncmp((local_p_all_par+loc)->name,"pc_y_yy",7);
657 if (compa==0) local_p_xs->pc_y_yy=val;
658 compa=strncmp((local_p_all_par+loc)->name,"pc_y_y1",7);
659 if (compa==0) local_p_xs->pc_y_y1=val;
660 compa=strncmp((local_p_all_par+loc)->name,"pc_y_xy",7);
661 if (compa==0) local_p_xs->pc_y_xy=val;
662 compa=strncmp((local_p_all_par+loc)->name,"pc_y_x3",7);
663 if (compa==0) local_p_xs->pc_y_x3=val;
664 compa=strncmp((local_p_all_par+loc)->name,"pc_y_x2y",8);
665 if (compa==0) local_p_xs->pc_y_x2y=val;
666 compa=strncmp((local_p_all_par+loc)->name,"pc_y_y2x",8);
667 if (compa==0) local_p_xs->pc_y_y2x=val;
668 compa=strncmp((local_p_all_par+loc)->name,"pc_y_y3",7);
669 if (compa==0) local_p_xs->pc_y_y3=val;
670 compa=strncmp((local_p_all_par+loc)->name,"pc4_x_xy3",9);
671 if (compa==0) local_p_xs->pc4_x_xy3=val;
672 compa=strncmp((local_p_all_par+loc)->name,"pc4_x_x3y",9);
673 if (compa==0) local_p_xs->pc4_x_x3y=val;
674 compa=strncmp((local_p_all_par+loc)->name,"pc4_x_x2y2",10);
675 if (compa==0) local_p_xs->pc4_x_x2y2=val;
676 compa=strncmp((local_p_all_par+loc)->name,"pc4_x_x4",8);
677 if (compa==0) local_p_xs->pc4_x_x4=val;
678 compa=strncmp((local_p_all_par+loc)->name,"pc4_x_y4",8);
679 if (compa==0) local_p_xs->pc4_x_y4=val;
680 compa=strncmp((local_p_all_par+loc)->name,"pc4_y_xy3",9);
681 if (compa==0) local_p_xs->pc4_y_xy3=val;
682 compa=strncmp((local_p_all_par+loc)->name,"pc4_y_x3y",9);
683 if (compa==0) local_p_xs->pc4_y_x3y=val;
684 compa=strncmp((local_p_all_par+loc)->name,"pc4_y_x2y2",10);
685 if (compa==0) local_p_xs->pc4_y_x2y2=val;
686 compa=strncmp((local_p_all_par+loc)->name,"pc4_y_x4",8);
687 if (compa==0) local_p_xs->pc4_y_x4=val;
688 compa=strncmp((local_p_all_par+loc)->name,"pc4_y_y4",8);
689 if (compa==0) local_p_xs->pc4_y_y4=val;
690 compa=strncmp((local_p_all_par+loc)->name,"ca_x0",5);
691 if (compa==0) local_p_xs->ca_x0=val;
692 compa=strncmp((local_p_all_par+loc)->name,"ca_x1",5);
693 if (compa==0) local_p_xs->ca_x1=val;
694 compa=strncmp((local_p_all_par+loc)->name,"ca_y0",5);
695 if (compa==0) local_p_xs->ca_y0=val;
696 compa=strncmp((local_p_all_par+loc)->name,"ca_y1",5);
697 if (compa==0) local_p_xs->ca_y1=val;
698 compa=strncmp((local_p_all_par+loc)->name,"d2_x1",5);
699 if (compa==0) local_p_xs->d2_x1=val;
700 compa=strncmp((local_p_all_par+loc)->name,"d2_x2",5);
701 if (compa==0) local_p_xs->d2_x2=val;
702 compa=strncmp((local_p_all_par+loc)->name,"d2_x3",5);
703 if (compa==0) local_p_xs->d2_x3=val;
704 compa=strncmp((local_p_all_par+loc)->name,"d2_y1x0",7);
705 if (compa==0) local_p_xs->d2_y1x0=val;
706 compa=strncmp((local_p_all_par+loc)->name,"d2_y1x1",7);
707 if (compa==0) local_p_xs->d2_y1x1=val;
708 compa=strncmp((local_p_all_par+loc)->name,"d2_y1x2",7);
709 if (compa==0) local_p_xs->d2_y1x2=val;
710 compa=strncmp((local_p_all_par+loc)->name,"d2_y1x3",7);
711 if (compa==0) local_p_xs->d2_y1x3=val;
712 compa=strncmp((local_p_all_par+loc)->name,"d2_y2x0",7);
713 if (compa==0) local_p_xs->d2_y2x0=val;
714 compa=strncmp((local_p_all_par+loc)->name,"d2_y2x1",7);
715 if (compa==0) local_p_xs->d2_y2x1=val;
716 compa=strncmp((local_p_all_par+loc)->name,"d2_y2x2",7);
717 if (compa==0) local_p_xs->d2_y2x2=val;
718 compa=strncmp((local_p_all_par+loc)->name,"d2_y2x3",7);
719 if (compa==0) local_p_xs->d2_y2x3=val;
720 compa=strncmp((local_p_all_par+loc)->name,"d2_y3x0",7);
721 if (compa==0) local_p_xs->d2_y3x0=val;
722 compa=strncmp((local_p_all_par+loc)->name,"d2_y3x1",7);
723 if (compa==0) local_p_xs->d2_y3x1=val;
724 compa=strncmp((local_p_all_par+loc)->name,"d2_y3x2",7);
725 if (compa==0) local_p_xs->d2_y3x2=val;
726 compa=strncmp((local_p_all_par+loc)->name,"d2_y3x3",7);
727 if (compa==0) local_p_xs->d2_y3x3=val;
728 for (kk=0;kk<9;kk++) {
729 sprintf(tempstr,"slit[%d]",kk);
730 indlen=strlen(tempstr);
731 compa=strncmp((local_p_all_par+loc)->name,tempstr,indlen);
732 if (compa==0) local_p_xs->slit[kk]=val;
733 }
734 compa=strncmp((local_p_all_par+loc)->name,"offx",4);
735 if (compa==0) local_p_xs->offx=val;
736 compa=strncmp((local_p_all_par+loc)->name,"offy",4);
737 if (compa==0) local_p_xs->offy=val;
738 compa=strncmp((local_p_all_par+loc)->name,"flipx",5);
739 if (compa==0) local_p_xs->flipx=val;
740 compa=strncmp((local_p_all_par+loc)->name,"flipy",5);
741 if (compa==0) local_p_xs->flipy=val;
742}
#define check(COMMAND)
Definition: xsh_error.h:71
cpl_table * xsh_model_io_output_cfg(struct xs_3 *p_xs_3)
void xsh_3_detpix(struct xs_3 *p_xs_3)
Takes the physical x,y position at the detector array and converts this to a pixel position.
void xsh_3_eval(DOUBLE lambda, int morder, DOUBLE **ref_ind, struct xs_3 *p_xs_3)
Compute the physical x,y position at the detector array for a given wavelength, order and parameter c...
void xsh_3_init(struct xs_3 *p_xs_3)
Pre-compute a number of non-wavelength dependent secondary parameters required by the model.
ann_all_par * local_p_all_par
float xsh_SAanneal(int iters)
Definition: xsh_model_sa.c:431
int * local_p_aname
int local_nparam
int mm
void xsh_SAinitial(double *xi)
Definition: xsh_model_sa.c:333
void xsh_SAfree(void)
Definition: xsh_model_sa.c:227
int * chip
double * local_p_abest
int size
float xsh_3_energy(double *a)
DOUBLE p_obsy[10000]
#define BIG_VAL
int * y
double * local_p_amin
void xsh_SAcurrent(double *xc)
Definition: xsh_model_sa.c:345
void xsh_3_output_data(double *)
DOUBLE * p_wl
float xsh_SABoltzmann(float k)
Definition: xsh_model_sa.c:267
float xsh_SAmelt(int iters)
Definition: xsh_model_sa.c:375
int n
int sp_array[10000]
float xsh_SAtemperature(float t)
Definition: xsh_model_sa.c:280
void xsh_3_assign(int loc, double val)
DOUBLE p_obsx[10000]
cpl_table * xsh_model_anneal_comp(ann_all_par *p_all_par, int nparam, double *abest, double *amin, double *amax, int *aname, struct xs_3 *p_xs_3, int DS_size, coord *msp_coord, DOUBLE *p_wlarray, DOUBLE **ref_ind, int maxit)
Use the simulated annealing algorithm to adjust the model parameters so that the metric (mean Euclide...
double * local_p_amax
int p_obsorder[10000]
int * p_chipmod
int p_obsarm[10000]
struct xs_3 * local_p_xs
void xsh_report_cpu(FILE *fp, char *str)
int xsh_SAiterations(int m)
Definition: xsh_model_sa.c:239
DOUBLE ** ref
int * x
DOUBLE p_obsf[10000]
float xsh_SAlearning_rate(float r)
Definition: xsh_model_sa.c:293
int xsh_SAInit(CostFunction f, int d)
Definition: xsh_model_sa.c:191
#define xsh_msg(...)
Print a message on info level.
Definition: xsh_msg.h:121
int slit_pos
double x
double y
double flux
DOUBLE mup2
DOUBLE taup1
double ca_x0
DOUBLE fcol
DOUBLE es_x
double d2_y1x0
double d2_y2x0
double d2_y1x3
double pc4_y_x3y
DOUBLE nup4
DOUBLE pix
DOUBLE mup1
double pc4_y_y4
DOUBLE mup5
DOUBLE mud
DOUBLE xpospix
double pc_x_y3
double d2_y1x2
DOUBLE pix_Y
double pc4_y_xy3
DOUBLE es_w
double chipx
DOUBLE nup3
DOUBLE taug
double pc_x_x3
double pc_x_x2y
double pc4_y_x4
double pc4_y_x2y2
double d2_y3x0
double pc_y_y1
double d2_y2x2
double d2_x1
double d2_y3x2
DOUBLE nud
int morder_max
double pc4_x_xy3
DOUBLE t_ir_p3
DOUBLE pix_X
double pc_x_xy
double pc_x_y1
double ca_x1
DOUBLE taud
DOUBLE fdet
DOUBLE nup1
DOUBLE taup5
double d2_y2x3
DOUBLE taup4
double d2_y1x1
DOUBLE nup2
double pc_y_x1
DOUBLE t_ir_p2
double d2_y2x1
DOUBLE cmup1
double pc4_x_x3y
DOUBLE slit[10]
DOUBLE flipy
double pc_x_y2x
double chipy
DOUBLE slit_scale
double pc_y_y3
DOUBLE mues
DOUBLE taup6
DOUBLE flipx
DOUBLE ypospix
DOUBLE offx
DOUBLE nues
double ca_y1
double pc_x_x1
DOUBLE mup3
DOUBLE es_y
double ca_y0
double pc_x_xx
DOUBLE mup4
DOUBLE temper
double pc4_x_x2y2
double d2_x2
int morder_min
double pc4_x_y4
DOUBLE nup6
DOUBLE offy
DOUBLE es_y_tot
double d2_x3
double pc4_x_x4
double d2_y3x1
DOUBLE nug
double chiprot
double pc_y_x3
detloc chippix
double d2_y3x3
double pc_y_y2x
double pc_y_x2y
DOUBLE sg
DOUBLE nup5
DOUBLE taup3
DOUBLE mup6
double pc_y_xx
double pc_x_yy
double pc_y_xy
DOUBLE es_s
DOUBLE taup2
double pc_y_yy
DOUBLE mug
DOUBLE taues
#define DEG2RAD
Definition: xsh_model_io.h:43
double DOUBLE
#define NO_VALUE
Definition: xsh_model_sa.h:33