UVES Pipeline Reference Manual  5.4.6
uves_physmod_stability_check.c
1 /* *
2  * This file is part of the ESO UVES Pipeline *
3  * Copyright (C) 2004,2005 European Southern Observatory *
4  * *
5  * This library is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public License *
16  * along with this program; if not, write to the Free Software *
17  * Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 USA *
18  * */
19 
20 /*
21  * $Author: amodigli $
22  * $Date: 2010-09-24 09:32:07 $
23  * $Revision: 1.17 $
24  * $Name: not supported by cvs2svn $
25  * $Log: not supported by cvs2svn $
26  * Revision 1.15 2007/12/17 07:56:36 amodigli
27  * we now compute a clean median as in MIDAS
28  *
29  * Revision 1.14 2007/12/03 17:00:14 amodigli
30  * removed dependency from flames and fixed a warning
31  *
32  * Revision 1.13 2007/12/03 10:39:36 amodigli
33  * added uves_physmod_align_tables flames_align_table_column
34  *
35  * Revision 1.12 2007/06/26 15:08:42 amodigli
36  * commented table dumping
37  *
38  * Revision 1.11 2007/06/25 16:34:52 amodigli
39  * cleaned
40  *
41  * Revision 1.10 2007/06/06 08:17:33 amodigli
42  * replace tab with 4 spaces
43  *
44  * Revision 1.9 2006/11/06 15:19:41 jmlarsen
45  * Removed unused include directives
46  *
47  * Revision 1.8 2006/08/24 06:36:10 amodigli
48  * fixed doxygen warning
49  *
50  * Revision 1.7 2006/08/22 14:17:00 amodigli
51  * fixed bug on computing MedDY
52  *
53  * Revision 1.6 2006/08/08 15:41:19 amodigli
54  * fixed bug in aligning actual and ref tables
55  *
56  * Revision 1.5 2006/08/02 07:02:05 amodigli
57  * stability check more robust: size of actual and ref table may differ
58  *
59  * Revision 1.4 2006/07/31 06:29:26 amodigli
60  * added QC on stability test
61  *
62  * Revision 1.3 2006/07/28 14:51:26 amodigli
63  * fixed some bugs on improper table selection
64  *
65  * Revision 1.2 2006/06/28 13:28:29 amodigli
66  * improved output
67  *
68  * Revision 1.1 2006/02/03 07:46:30 jmlarsen
69  * Moved recipe implementations to ./uves directory
70  *
71  * Revision 1.4 2006/01/20 10:36:25 amodigli
72  *
73  * Fixed warings from doxigen
74  *
75  * Revision 1.3 2006/01/19 08:47:24 jmlarsen
76  * Inserted missing doxygen end tag
77  *
78  * Revision 1.2 2006/01/16 13:52:58 jmlarsen
79  * Removed memory leak
80  *
81  * Revision 1.1 2006/01/16 08:02:50 amodigli
82  *
83  * Added
84  *
85  * Revision 1.4 2006/01/09 14:05:42 amodigli
86  * Fixed doxigen warnings
87  *
88  * Revision 1.3 2005/12/20 08:11:44 jmlarsen
89  * Added CVS entry
90  *
91  */
92 
93 /*----------------------------------------------------------------------------*/
97 /*---------------------------------------------------------------------------*/
99 #ifdef HAVE_CONFIG_H
100 # include <config.h>
101 #endif
102 
103 
104 /*-----------------------------------------------------------------------------
105  Includes
106  ----------------------------------------------------------------------------*/
107 #include <uves_physmod_stability_check.h>
108 #include <uves_utils_wrappers.h>
109 #include <uves_msg.h>
110 #include <uves_error.h>
111 
112 /*-----------------------------------------------------------------------------
113  Defines
114  ----------------------------------------------------------------------------*/
115 /*-----------------------------------------------------------------------------
116  Functions prototypes
117  ----------------------------------------------------------------------------*/
118 /*-----------------------------------------------------------------------------
119  Static variables
120  ----------------------------------------------------------------------------*/
121 
122 static int
123 uves_physmod_align_tables(cpl_table** m_tbl,
124  cpl_table** r_tbl);
125 
126 
127 static int
128 flames_align_table_column(cpl_table** m_tbl,cpl_table** r_tbl,const char* col);
129 
130 /*-----------------------------------------------------------------------------
131  Functions code
132  ----------------------------------------------------------------------------*/
133 
134 /*---------------------------------------------------------------------------*/
150 /*---------------------------------------------------------------------------*/
151 
152 int uves_physmod_stability_check(cpl_table* m_tbl,
153  cpl_table* r_tbl,
154  double* med_dx,
155  double* med_dy,
156  double* avg_dx,
157  double* avg_dy)
158 
159 {
160 
161 
162  cpl_table* tmp_tbl1=NULL;
163  cpl_table* tmp_tbl2=NULL;
164  cpl_table* tmp_tbl3=NULL;
165  cpl_table* tmp_tbl4=NULL;
166 
167  cpl_table* tmp_tbl5=NULL;
168 
169 
170  double std_dx=0;
171  double std_dy=0;
172 
173  int msz=0;
174  int rsz=0;
175  int ref=0;
176  int status=0; /* note those are swapped */
177  check_nomsg(cpl_table_duplicate_column(m_tbl,"X",m_tbl,"XMES"));
178  check_nomsg(cpl_table_duplicate_column(m_tbl,"Y",m_tbl,"YMES"));
179  check_nomsg(cpl_table_duplicate_column(m_tbl,"S",m_tbl,"STATUS"));
180  check_nomsg(cpl_table_duplicate_column(m_tbl,"O",m_tbl,"ORDER"));
181  check_nomsg(cpl_table_duplicate_column(m_tbl,"ID",m_tbl,"IDENT"));
182 
183  check_nomsg(cpl_table_duplicate_column(r_tbl,"X",r_tbl,"XMES"));
184  check_nomsg(cpl_table_duplicate_column(r_tbl,"Y",r_tbl,"YMES"));
185  check_nomsg(cpl_table_duplicate_column(r_tbl,"S",r_tbl,"STATUS"));
186  check_nomsg(cpl_table_duplicate_column(r_tbl,"O",r_tbl,"ORDER"));
187  check_nomsg(cpl_table_duplicate_column(r_tbl,"ID",r_tbl,"IDENT"));
188 
189  check_nomsg(msz=cpl_table_get_nrow(m_tbl));
190  check_nomsg(rsz=cpl_table_get_nrow(r_tbl));
191 
192  cpl_table_save(m_tbl, NULL, NULL, "m_tbl.fits", CPL_IO_DEFAULT);
193  cpl_table_save(r_tbl, NULL, NULL, "r_tbl.fits", CPL_IO_DEFAULT);
194  if(msz > rsz) {
195  check_nomsg(cpl_table_set_size(r_tbl,msz));
196  uves_msg_warning("Actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
197  uves_physmod_align_tables(&m_tbl,&r_tbl);
198 
199  check_nomsg(msz=cpl_table_get_nrow(m_tbl));
200  check_nomsg(rsz=cpl_table_get_nrow(r_tbl));
201  uves_msg_warning("After correction actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
202 
203  } else if (msz < rsz) {
204  check_nomsg(cpl_table_set_size(m_tbl,rsz));
205  uves_msg_warning("Actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
206  uves_physmod_align_tables(&m_tbl,&r_tbl);
207  check_nomsg(msz=cpl_table_get_nrow(m_tbl));
208  check_nomsg(rsz=cpl_table_get_nrow(r_tbl));
209  uves_msg_warning("After correction actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
210 
211  }
212  cpl_table_save(m_tbl, NULL, NULL, "after_m_tbl.fits", CPL_IO_DEFAULT);
213  cpl_table_save(r_tbl, NULL, NULL, "after_r_tbl.fits", CPL_IO_DEFAULT);
214 
215  /* copy values measured on actual frame into table from reference frame */
216  check_nomsg(cpl_table_duplicate_column(r_tbl,"Xm",m_tbl,"X"));
217  check_nomsg(cpl_table_duplicate_column(r_tbl,"Ym",m_tbl,"Y"));
218  check_nomsg(cpl_table_duplicate_column(r_tbl,"Sm",m_tbl,"S"));
219  check_nomsg(cpl_table_duplicate_column(r_tbl,"Om",m_tbl,"O"));
220  check_nomsg(cpl_table_duplicate_column(r_tbl,"IDm",m_tbl,"ID"));
221  check_nomsg(cpl_table_duplicate_column(r_tbl,"WAVEm",m_tbl,"WAVE"));
222 
223  /* initialize difference columns with values from actual frame measures */
224  check_nomsg(cpl_table_duplicate_column(r_tbl,"DX",r_tbl,"Xm"));
225  check_nomsg(cpl_table_duplicate_column(r_tbl,"DY",r_tbl,"Ym"));
226  check_nomsg(cpl_table_duplicate_column(r_tbl,"DO",r_tbl,"Om"));
227  check_nomsg(cpl_table_duplicate_column(r_tbl,"DID",r_tbl,"IDm"));
228  check_nomsg(cpl_table_duplicate_column(r_tbl,"DW",r_tbl,"WAVEm"));
229 
230  /* subtract values measured on reference frame */
231  check_nomsg(cpl_table_subtract_columns(r_tbl,"DX","X"));
232  check_nomsg(cpl_table_subtract_columns(r_tbl,"DY","Y"));
233  check_nomsg(cpl_table_subtract_columns(r_tbl,"DO","O"));
234  check_nomsg(cpl_table_subtract_columns(r_tbl,"DID","ID"));
235  check_nomsg(cpl_table_subtract_columns(r_tbl,"DW","WAVE"));
236 
237  /* WE GET THE ABSOLUTE VALUE: sqrt(X^2)*/
238  check(cpl_table_power_column(r_tbl,"DW",2.),"Error computing power column");
239  check(cpl_table_power_column(r_tbl,"DW",0.5),"Error computing power column");
240 
241  /* select proper values */
242  check(tmp_tbl1=uves_extract_table_rows(r_tbl,"DO",CPL_EQUAL_TO,
243  0),"Error selecting DO");
244  check(tmp_tbl2=uves_extract_table_rows(tmp_tbl1,"DW",CPL_LESS_THAN,
245  0.001),"Error selecting DW");
246  check(tmp_tbl3=uves_extract_table_rows(tmp_tbl2,"DID",CPL_LESS_THAN,
247  0.001),"Error selecting DID");
248  check(tmp_tbl4=uves_extract_table_rows(tmp_tbl3,"S",CPL_EQUAL_TO,
249  0),"Error selecting S");
250  check(tmp_tbl5=uves_extract_table_rows(tmp_tbl4,"Sm",CPL_EQUAL_TO,
251  0),"Error selecting Sm");
252  check_nomsg(ref=cpl_table_get_nrow(tmp_tbl5)/2);
253  //cpl_table_dump(tmp_tbl5,1,2,stdout);
254  check_nomsg(*med_dx=cpl_table_get_column_median(tmp_tbl5,"DX"));
255  check_nomsg(*med_dy=cpl_table_get_column_median(tmp_tbl5,"DY"));
256  check_nomsg(*avg_dx=cpl_table_get_column_mean(tmp_tbl5,"DX"));
257  check_nomsg(*avg_dy=cpl_table_get_column_mean(tmp_tbl5,"DY"));
258  check_nomsg(std_dx=cpl_table_get_column_stdev(tmp_tbl5,"DX"));
259  check_nomsg(std_dy=cpl_table_get_column_stdev(tmp_tbl5,"DY"));
260  /*
261  uves_msg("Stability check results: Median DX = %5.3f Median DY = %5.3f",
262  *med_dx,*med_dy);
263  */
264  uves_msg("Stability check results: Mean DX = %5.3f Mean DY = %5.3f",
265  *avg_dx,*avg_dy);
266  check_nomsg(uves_sort_table_1(tmp_tbl5,"DX",0));
267  check_nomsg(*med_dx=cpl_table_get_double(tmp_tbl5,"DX",ref,&status));
268 
269  uves_free_table(&tmp_tbl1);
270  uves_free_table(&tmp_tbl2);
271 
272  if(std_dx > 0) {
273  check(tmp_tbl1=uves_extract_table_rows(tmp_tbl5,"DX",CPL_GREATER_THAN,
274  *avg_dx-3*std_dx),"Error selecting DO");
275 
276  check(tmp_tbl2=uves_extract_table_rows(tmp_tbl1,"DX",CPL_LESS_THAN,
277  *avg_dx+3*std_dx),"Error selecting DO");
278 
279  check_nomsg(*med_dx=cpl_table_get_column_median(tmp_tbl2,"DX"));
280 
281  uves_free_table(&tmp_tbl1);
282  uves_free_table(&tmp_tbl2);
283  }
284 
285 
286 
287  check_nomsg(uves_sort_table_1(tmp_tbl5,"DY",0));
288  check_nomsg(*med_dy=cpl_table_get_double(tmp_tbl5,"DY",ref,&status));
289 
290 
291 
292 
293  if(std_dy > 0) {
294  check(tmp_tbl1=uves_extract_table_rows(tmp_tbl5,"DY",CPL_GREATER_THAN,
295  *avg_dy-3*std_dy),"Error selecting DO");
296 
297  check(tmp_tbl2=uves_extract_table_rows(tmp_tbl1,"DY",CPL_LESS_THAN,
298  *avg_dy+3*std_dy),"Error selecting DO");
299 
300  check_nomsg(*med_dy=cpl_table_get_column_median(tmp_tbl2,"DY"));
301 
302  uves_free_table(&tmp_tbl1);
303  uves_free_table(&tmp_tbl2);
304  }
305  /* median computed as in UVES-MIDAS */
306  uves_msg("Stability check results: Median DX = %5.3f Median DY = %5.3f",
307  *med_dx,*med_dy);
308 
309  cleanup:
310  uves_free_table(&tmp_tbl1);
311  uves_free_table(&tmp_tbl2);
312  uves_free_table(&tmp_tbl3);
313  uves_free_table(&tmp_tbl4);
314  uves_free_table(&tmp_tbl5);
315 
316  return 0;
317 
318 
319 }
320 
321 /*---------------------------------------------------------------------------*/
332 /*---------------------------------------------------------------------------*/
333 
334 
335 static int
336 flames_align_table_column(cpl_table** m_tbl,cpl_table** r_tbl,const char* col)
337 {
338 
339  double* pmw=NULL;
340  double* prw=NULL;
341  int* pmc=NULL;
342  int* prc=NULL;
343  int* pmo=NULL;
344  int* pro=NULL;
345  int nm=0;
346  int nr=0;
347  int i=0;
348  int j=0;
349 
350 
351  check_nomsg(pmw=cpl_table_get_data_double(*m_tbl,col));
352  check_nomsg(prw=cpl_table_get_data_double(*r_tbl,col));
353  check_nomsg(pmc=cpl_table_get_data_int(*m_tbl,"CHECK"));
354  check_nomsg(prc=cpl_table_get_data_int(*r_tbl,"CHECK"));
355  check_nomsg(pmo=cpl_table_get_data_int(*m_tbl,"CHECK"));
356  check_nomsg(pro=cpl_table_get_data_int(*r_tbl,"CHECK"));
357  check_nomsg(nm=cpl_table_get_nrow(*m_tbl));
358  check_nomsg(nr=cpl_table_get_nrow(*r_tbl));
359  for(i=0;i<nm;i++) {
360  for(j=0;j<nr;j++) {
361 
362  if((pmw[i]==prw[j]) && (pmo[i]==pro[j])) {
363  pmc[i]=1;
364  prc[j]=1;
365  }
366 
367  }
368  }
369  cleanup:
370 
371  return 0;
372 
373 }
374 
375 /*---------------------------------------------------------------------------*/
385 /*---------------------------------------------------------------------------*/
386 
387 static int
388 uves_physmod_align_tables(cpl_table** m_tbl,
389  cpl_table** r_tbl)
390 {
391  cpl_table* tmp=NULL;
392 
393  uves_propertylist* plist=NULL;
394  int ord_min=0;
395  int ord_max=0;
396  double wav_min=0;
397  double wav_max=0;
398  int i=0;
399  int nm=0;
400  int nr=0;
401  int nsel=0;
402 
403 
404  check_nomsg(nm=cpl_table_get_nrow(*m_tbl));
405  check_nomsg(nr=cpl_table_get_nrow(*r_tbl));
406 
408  check_nomsg(uves_propertylist_append_bool(plist,"ORDER",0)); /* 1 for descending order */
409  check_nomsg(uves_propertylist_append_bool(plist,"WAVE",0)); /* 0 for ascending order */
410  check_nomsg(uves_table_sort(*m_tbl,plist));
411  check_nomsg(uves_table_sort(*r_tbl,plist));
412  uves_free_propertylist(&plist);
413 
414 
415  ord_min=(cpl_table_get_column_min(*m_tbl,"ORDER")>
416  cpl_table_get_column_min(*r_tbl,"ORDER")) ?
417  cpl_table_get_column_min(*m_tbl,"ORDER") :
418  cpl_table_get_column_min(*r_tbl,"ORDER");
419 
420 
421 
422  ord_max=(cpl_table_get_column_max(*m_tbl,"ORDER")<
423  cpl_table_get_column_max(*r_tbl,"ORDER")) ?
424  cpl_table_get_column_max(*m_tbl,"ORDER") :
425  cpl_table_get_column_max(*r_tbl,"ORDER");
426 
427 
428 
429 
430  uves_msg_warning("ord_min=%d",ord_min);
431  uves_msg_warning("ord_max=%d",ord_max);
432 
433 
434  wav_min=(cpl_table_get_column_min(*m_tbl,"WAVE")>
435  cpl_table_get_column_min(*r_tbl,"WAVE")) ?
436  cpl_table_get_column_min(*m_tbl,"WAVE") :
437  cpl_table_get_column_min(*r_tbl,"WAVE");
438 
439 
440 
441  wav_max=(cpl_table_get_column_max(*m_tbl,"WAVE")<
442  cpl_table_get_column_max(*r_tbl,"WAVE")) ?
443  cpl_table_get_column_max(*m_tbl,"WAVE") :
444  cpl_table_get_column_max(*r_tbl,"WAVE");
445 
446 
447  uves_msg_warning("wav_min=%g",wav_min);
448  uves_msg_warning("wav_max=%g",wav_max);
449 
450 
451  check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,"ORDER",CPL_NOT_LESS_THAN,ord_min));
452  check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,"ORDER",CPL_NOT_GREATER_THAN,ord_max));
453  check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_LESS_THAN,wav_min));
454  check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_GREATER_THAN,wav_max));
455  uves_msg_warning("nsel=%d",nsel);
456  check_nomsg(tmp=cpl_table_extract_selected(*m_tbl));
457  uves_free_table(m_tbl);
458  check_nomsg(*m_tbl=cpl_table_duplicate(tmp));
459 
460 
461 
462 
463  check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,"ORDER",CPL_NOT_LESS_THAN,ord_min));
464  check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,"ORDER",CPL_NOT_GREATER_THAN,ord_max));
465  check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_LESS_THAN,wav_min));
466  check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_GREATER_THAN,wav_max));
467  uves_msg_warning("nsel=%d",nsel);
468  check_nomsg(tmp=cpl_table_extract_selected(*r_tbl));
469  uves_free_table(r_tbl);
470  check_nomsg(*r_tbl=cpl_table_duplicate(tmp));
471 
472 
473 
474  cpl_table_new_column(*m_tbl,"CHECK",CPL_TYPE_INT);
475  cpl_table_new_column(*r_tbl,"CHECK",CPL_TYPE_INT);
476  cpl_table_fill_column_window_int(*r_tbl,"CHECK",0,nr,0);
477  cpl_table_fill_column_window_int(*m_tbl,"CHECK",0,nm,0);
478 
479 
480  for(i=ord_min;i<=ord_max;i++) {
481 
482  cpl_table_and_selected_int(*m_tbl,"ORDER",CPL_EQUAL_TO,i);
483  cpl_table_and_selected_int(*r_tbl,"ORDER",CPL_EQUAL_TO,i);
484  flames_align_table_column(m_tbl,r_tbl,"WAVE");
485 
486 
487  }
488  cpl_table_select_all(*m_tbl);
489  cpl_table_select_all(*r_tbl);
490 
491 
492  wav_min=(cpl_table_get_column_min(*m_tbl,"WAVE")>
493  cpl_table_get_column_min(*r_tbl,"WAVE")) ?
494  cpl_table_get_column_min(*m_tbl,"WAVE") :
495  cpl_table_get_column_min(*r_tbl,"WAVE");
496 
497 
498 
499  wav_max=(cpl_table_get_column_max(*m_tbl,"WAVE")<
500  cpl_table_get_column_max(*r_tbl,"WAVE")) ?
501  cpl_table_get_column_max(*m_tbl,"WAVE") :
502  cpl_table_get_column_max(*r_tbl,"WAVE");
503 
504 
505  uves_msg_warning("wav_min=%g",wav_min);
506  uves_msg_warning("wav_max=%g",wav_max);
507 
508  check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,"ORDER",CPL_NOT_LESS_THAN,ord_min));
509  check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,"ORDER",CPL_NOT_GREATER_THAN,ord_max));
510  check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_LESS_THAN,wav_min));
511  check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_GREATER_THAN,wav_max));
512  check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,"CHECK",CPL_EQUAL_TO,1));
513  uves_msg_warning("nsel=%d",nsel);
514  check_nomsg(tmp=cpl_table_extract_selected(*m_tbl));
515  uves_free_table(m_tbl);
516  check_nomsg(*m_tbl=cpl_table_duplicate(tmp));
517 
518  check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,"ORDER",CPL_NOT_LESS_THAN,ord_min));
519  check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,"ORDER",CPL_NOT_GREATER_THAN,ord_max));
520  check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_LESS_THAN,wav_min));
521  check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_GREATER_THAN,wav_max));
522  check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,"CHECK",CPL_EQUAL_TO,1));
523  uves_msg_warning("nsel=%d",nsel);
524  check_nomsg(tmp=cpl_table_extract_selected(*r_tbl));
525  uves_free_table(r_tbl);
526  check_nomsg(*r_tbl=cpl_table_duplicate(tmp));
527 
528 
529 
530  cleanup:
531 
532 
533 
534  //uves_free_string_const(&rout);
535  //uves_free_string_const(&mout);
536 
537  return 0;
538 }
539 
540 
int uves_physmod_stability_check(cpl_table *m_tbl, cpl_table *r_tbl, double *med_dx, double *med_dy, double *avg_dx, double *avg_dy)
This procedure run a stability check.
#define uves_msg_warning(...)
Print an warning message.
Definition: uves_msg.h:87
#define check_nomsg(CMD)
Definition: uves_error.h:204
static int uves_physmod_align_tables(cpl_table **m_tbl, cpl_table **r_tbl)
This procedure compares two input tables and eventually alignes them.
uves_propertylist * uves_propertylist_new(void)
Create an empty property list.
#define uves_msg(...)
Print a message on 'info' or 'debug' level.
Definition: uves_msg.h:119
static int flames_align_table_column(cpl_table **m_tbl, cpl_table **r_tbl, const char *col)
This procedure compares two input tables and eventually alignes them.
#define check(CMD,...)
Definition: uves_error.h:198