public software.sextractor

[/] [trunk/] [src/] [xml.c] - Blame information for rev 220

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 8 bertin
 /*
2
                                xml.c
3
 
4
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5
*
6 22 bertin
*       Part of:        SExtractor
7 8 bertin
*
8
*       Author:         E.BERTIN (IAP)
9
*
10
*       Contents:       XML logging.
11
*
12 220 bertin
*       Last modify:    05/02/2010
13 8 bertin
*
14
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15
*/
16
 
17
#ifdef HAVE_CONFIG_H
18
#include        "config.h"
19
#endif
20
 
21
#include <math.h>
22
#include <stdio.h>
23
#include <stdlib.h>
24
#include <string.h>
25
#include <time.h>
26
 
27
#include "define.h"
28
#include "globals.h"
29
#include "fits/fitscat.h"
30
#include "field.h"
31 9 bertin
#include "key.h"
32 8 bertin
#include "prefs.h"
33
#include "xml.h"
34
 
35 12 bertin
extern time_t           thetimet,thetimet2;     /* from makeit.c */
36
extern pkeystruct       key[];                  /* from preflist.h */
37
extern char             keylist[][32];          /* from preflist.h */
38 11 bertin
xmlstruct               *xmlstack = NULL;
39 12 bertin
int                     nxml=0, nxmlmax=0;
40 8 bertin
 
41
/****** init_xml ************************************************************
42
PROTO   int     init_xml(void)
43
PURPOSE Initialize a set of meta-data kept in memory before being written to the
44
        XML file
45
INPUT   Number of image extensions.
46
OUTPUT  RETURN_OK if everything went fine, RETURN_ERROR otherwise.
47
NOTES   -.
48
AUTHOR  E. Bertin (IAP)
49
VERSION 03/07/2006
50
 ***/
51
int     init_xml(int next)
52
  {
53
  QMALLOC(xmlstack, xmlstruct, next);
54
  nxml = 0;
55
  nxmlmax = next;
56
 
57
  return EXIT_SUCCESS;
58
  }
59
 
60 15 bertin
 
61
/****** end_xml ************************************************************
62
PROTO   int     end_xml(void)
63
PURPOSE Free the set of meta-data kept in memory.
64
INPUT   -.
65
OUTPUT  RETURN_OK if everything went fine, RETURN_ERROR otherwise.
66
NOTES   -.
67
AUTHOR  E. Bertin (IAP)
68
VERSION 12/07/2006
69
 ***/
70
int     end_xml(void)
71
  {
72
  free(xmlstack);
73
 
74
  return EXIT_SUCCESS;
75
  }
76
 
77 8 bertin
/****** update_xml ***********************************************************
78
PROTO   int     update_xml(void)
79
PURPOSE Update a set of meta-data kept in memory before being written to the
80
        XML file
81
INPUT   -.
82
OUTPUT  RETURN_OK if everything went fine, RETURN_ERROR otherwise.
83
NOTES   -.
84
AUTHOR  E. Bertin (IAP)
85 220 bertin
VERSION 05/02/2010
86 8 bertin
 ***/
87 9 bertin
int     update_xml(sexcatstruct *sexcat, picstruct *dfield, picstruct *field,
88
                picstruct *dwfield, picstruct *wfield)
89 8 bertin
  {
90 9 bertin
   xmlstruct    *x;
91
 
92
  if (nxml >= nxmlmax)
93 8 bertin
    error(EXIT_FAILURE, "*Internal Error*: too many extensions in XML stack",
94
                        "");
95 9 bertin
  x = &xmlstack[nxml++];
96
  x->currext = sexcat->currext;
97 220 bertin
  x->headflag[0] = dfield->headflag;
98
  x->headflag[1] = field->headflag;
99 9 bertin
  x->ndetect = sexcat->ndetect;
100
  x->ntotal = sexcat->ntotal;
101
  strcpy(x->ext_date, sexcat->ext_date);
102
  strcpy(x->ext_time, sexcat->ext_time);
103
  x->ext_elapsed = sexcat->ext_elapsed;
104 14 bertin
  strcpy(x->ident[0], dfield->ident);
105
  strcpy(x->ident[1], field->ident);
106
  x->backmean[0] = dfield->backmean;
107
  x->backmean[1] = field->backmean;
108
  x->backsig[0] = dfield->backsig;
109
  x->backsig[1] = field->backsig;
110
  x->sigfac[0] = dfield->sigfac;
111
  x->sigfac[1] = field->sigfac;
112
  x->thresh[0] = dfield->dthresh;
113
  x->thresh[1] = field->thresh;
114
  x->pixscale[0] = dfield->pixscale;
115
  x->pixscale[1] = field->pixscale;
116
  x->epoch[0] = dfield->epoch;
117
  x->epoch[1] = field->epoch;
118 173 bertin
  x->gain[0] = dfield->gain;
119
  x->gain[1] = field->gain;
120
  x->satur_level[0] = dfield->satur_level;
121
  x->satur_level[1] = field->satur_level;
122 8 bertin
 
123
  return EXIT_SUCCESS;
124
  }
125
 
126 17 bertin
 
127 8 bertin
/****** write_xml ************************************************************
128 17 bertin
PROTO   int     write_xml(char *filename)
129
PURPOSE Save meta-data to an XML file/stream.
130 16 bertin
INPUT   XML file name.
131 8 bertin
OUTPUT  RETURN_OK if everything went fine, RETURN_ERROR otherwise.
132
NOTES   -.
133
AUTHOR  E. Bertin (IAP)
134 17 bertin
VERSION 14/07/2006
135 8 bertin
 ***/
136 17 bertin
int     write_xml(char *filename)
137 8 bertin
  {
138 17 bertin
   FILE         *file;
139 8 bertin
 
140 17 bertin
  if (!(file = fopen(prefs.xml_name, "w")))
141
    return RETURN_ERROR;
142 14 bertin
 
143 17 bertin
  write_xml_header(file);
144
  write_vo_fields(file);
145 14 bertin
 
146 17 bertin
  fprintf(file, "   <DATA>\n");
147
  if (prefs.cat_type == FITS_LDAC || prefs.cat_type == FITS_TPX
148
        || prefs.cat_type == FITS_10)
149
    fprintf(file,
150
        "   <FITS extnum=\"%d\"><STREAM href=\"%s%s\" /> </FITS>",
151
        prefs.cat_type == FITS_10? 1:2,
152
        prefs.cat_name[0] == '/'? "file://" : "file:",
153
        prefs.cat_name);
154
  fprintf(file, "   </DATA>\n");
155
  fprintf(file, "  </TABLE>\n");
156 12 bertin
 
157 17 bertin
  write_xml_meta(file, (char *)NULL);
158 14 bertin
 
159 17 bertin
  fprintf(file, "</RESOURCE>\n");
160
  fprintf(file, "</VOTABLE>\n");
161 12 bertin
 
162 17 bertin
  fclose(file);
163
 
164
  return RETURN_OK;
165
  }
166
 
167
 
168
/****** write_xml_header ******************************************************
169
PROTO   int     write_xml_header(FILE *file)
170
PURPOSE Save an XML-VOtable header to an XML file/stream
171
INPUT   file or stream pointer.
172
OUTPUT  RETURN_OK if everything went fine, RETURN_ERROR otherwise.
173
NOTES   -.
174
AUTHOR  E. Bertin (IAP)
175
VERSION 14/07/2006
176
 ***/
177
int     write_xml_header(FILE *file)
178
  {
179
   char         *filename, *rfilename;
180
 
181 16 bertin
/* A short, "relative" version of the filename */
182
  filename = prefs.image_name[prefs.nimage_name>1? 1:0];
183
  if (!(rfilename = strrchr(filename, '/')))
184
    rfilename = filename;
185
  else
186
    rfilename++;
187
 
188
  fprintf(file, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
189 17 bertin
  fprintf(file, "<?xml-stylesheet type=\"text/xsl\" href=\"%s\"?>\n",
190
        prefs.xsl_name);
191 13 bertin
  fprintf(file, "<VOTABLE "
192
        "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
193
        "xsi:noNamespaceSchemaLocation="
194 17 bertin
        "\"http://www.ivoa.net/xml/VOTable/v1.1\">\n");
195 16 bertin
  fprintf(file, "<DESCRIPTION>produced by %s</DESCRIPTION>\n", BANNER);
196
  fprintf(file, "<!-- VOTable description at "
197
        "http://www.ivoa.net/Documents/latest/VOT.html -->\n");
198 17 bertin
  fprintf(file, "<RESOURCE ID=\"%s\" name=\"%s\">\n", BANNER, rfilename);
199 16 bertin
  fprintf(file, " <DESCRIPTION>Catalog of sources extracted with %s"
200
        "</DESCRIPTION>\n", BANNER);
201
  fprintf(file, " <INFO name=\"QUERY_STATUS\" value=\"OK\" />\n");
202
  fprintf(file, " <COOSYS ID=\"J2000\" equinox=\"J2000\""
203
        " epoch=\"J%.10g\" system=\"%s\"/>\n", prefs.epoch, prefs.coosys);
204
  fprintf(file, " <TABLE ID=\"Source_List\" name=\"%s/out\">\n", rfilename);
205
  fprintf(file,
206
        "  <DESCRIPTION>Table of sources detected in image</DESCRIPTION>\n");
207
  fprintf(file,
208
        "  <!-- Now comes the definition of each %s parameter -->\n", BANNER);
209
 
210 15 bertin
  return RETURN_OK;
211
  }
212
 
213
 
214
/****** write_xml_meta ********************************************************
215 16 bertin
PROTO   int     write_xml_meta(FILE *file, char *error)
216 15 bertin
PURPOSE Save meta-data to an XML-VOTable file or stream
217 16 bertin
INPUT   Pointer to the output file (or stream),
218
        Pointer to an error msg (or NULL).
219 15 bertin
OUTPUT  RETURN_OK if everything went fine, RETURN_ERROR otherwise.
220
NOTES   -.
221
AUTHOR  E. Bertin (IAP)
222 220 bertin
VERSION 05/02/2010
223 15 bertin
 ***/
224 16 bertin
int     write_xml_meta(FILE *file, char *error)
225 15 bertin
  {
226
   char                 *pspath,*psuser, *pshost, *str;
227 16 bertin
   struct tm            *tm;
228 15 bertin
   int                  n;
229
 
230 16 bertin
/* Processing date and time if msg error present */
231
  if (error)
232
    {
233
    thetimet2 = time(NULL);
234
    tm = localtime(&thetimet2);
235
    sprintf(prefs.sdate_end,"%04d-%02d-%02d",
236
        tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday);
237
    sprintf(prefs.stime_end,"%02d:%02d:%02d",
238
        tm->tm_hour, tm->tm_min, tm->tm_sec);
239
    prefs.time_diff = difftime(thetimet2, thetimet);
240
    }
241
 
242 15 bertin
/* Username */
243
  psuser = pspath = pshost = NULL;
244
#ifdef HAVE_GETENV
245
  if (!(psuser=getenv("USERNAME")))     /* Cygwin,... */
246
    psuser = getenv("LOGNAME");         /* Linux,... */
247
  pspath = getenv("PWD");
248
  pshost = getenv("HOSTNAME");
249
#endif
250
 
251 16 bertin
  fprintf(file, " <RESOURCE ID=\"MetaData\" name=\"MetaData\">\n");
252 13 bertin
  fprintf(file, "  <DESCRIPTION>%s meta-data</DESCRIPTION>\n", BANNER);
253 15 bertin
  fprintf(file, "  <INFO name=\"QUERY_STATUS\" value=\"OK\" />\n");
254 16 bertin
  fprintf(file, "  <PARAM name=\"Software\" datatype=\"char\" arraysize=\"*\""
255 13 bertin
        " ucd=\"meta.title;meta.software\" value=\"%s\"/>\n",
256
        BANNER);
257 16 bertin
  fprintf(file, "  <PARAM name=\"Version\" datatype=\"char\" arraysize=\"*\""
258 13 bertin
        " ucd=\"meta.version;meta.software\" value=\"%s\"/>\n",
259
        MYVERSION);
260 16 bertin
  fprintf(file, "  <PARAM name=\"Soft_URL\" datatype=\"char\" arraysize=\"*\""
261 13 bertin
        " ucd=\"meta.ref.url;meta.software\" value=\"%s\"/>\n",
262
        WEBSITE);
263 16 bertin
  fprintf(file, "  <PARAM name=\"Soft_Auth\" datatype=\"char\" arraysize=\"*\""
264 13 bertin
        " ucd=\"meta.bib.author;meta.software\" value=\"%s\"/>\n",
265
        "Emmanuel Bertin");
266 16 bertin
  fprintf(file, "  <PARAM name=\"Soft_Ref\" datatype=\"char\" arraysize=\"*\""
267 13 bertin
        " ucd=\"meta.bib.bibcode;meta.software\" value=\"%s\"/>\n",
268 16 bertin
        "1996A&amp;AS..117..393B");
269
  fprintf(file, "  <PARAM name=\"NThreads\" datatype=\"int\""
270 14 bertin
        " ucd=\"meta.number;meta.software\" value=\"%d\"/>\n",
271 13 bertin
        prefs.nthreads);
272 16 bertin
  fprintf(file, "  <PARAM name=\"Date\" datatype=\"char\" arraysize=\"*\""
273 13 bertin
        " ucd=\"time.event.end;meta.software\" value=\"%s\"/>\n",
274
        prefs.sdate_end);
275 16 bertin
  fprintf(file, "  <PARAM name=\"Time\" datatype=\"char\" arraysize=\"*\""
276 13 bertin
        " ucd=\"time.event.end;meta.software\" value=\"%s\"/>\n",
277
        prefs.stime_end);
278 16 bertin
  fprintf(file, "  <PARAM name=\"Duration\" datatype=\"float\""
279 13 bertin
        " ucd=\"time.event;meta.software\" value=\"%.0f\" unit=\"s\"/>\n",
280
        prefs.time_diff);
281
 
282 16 bertin
  fprintf(file, "  <PARAM name=\"User\" datatype=\"char\" arraysize=\"*\""
283 13 bertin
        " ucd=\"meta.curation\" value=\"%s\"/>\n",
284
        psuser);
285 16 bertin
  fprintf(file, "  <PARAM name=\"Host\" datatype=\"char\" arraysize=\"*\""
286 13 bertin
        " ucd=\"meta.curation\" value=\"%s\"/>\n",
287
        pshost);
288 16 bertin
  fprintf(file, "  <PARAM name=\"Path\" datatype=\"char\" arraysize=\"*\""
289 13 bertin
        " ucd=\"meta.dataset\" value=\"%s\"/>\n",
290
        pspath);
291
 
292 15 bertin
  fprintf(file,
293 17 bertin
        "  <PARAM name=\"Image_Name\" datatype=\"char\" arraysize=\"*\""
294 15 bertin
        " ucd=\"obs.image;meta.fits\" value=\"%s", prefs.image_name[0]);
295
  if (prefs.nimage_name>1)
296
    fprintf(file, ",%s", prefs.image_name[1]);
297
  fprintf(file, "\"/>\n");
298 16 bertin
 
299
  if (error)
300 17 bertin
    {
301
    fprintf(file, "\n  <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
302
        "!!!!!!!!!!!!!!!!!!!! -->\n");
303
    fprintf(file, "  <!-- !!!!!!!!!!!!!!!!!!!!!! an Error occured"
304
        " !!!!!!!!!!!!!!!!!!!!! -->\n");
305
    fprintf(file, "  <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
306
        "!!!!!!!!!!!!!!!!!!!! -->\n");
307 16 bertin
    fprintf(file,"  <PARAM name=\"Error_Msg\" datatype=\"char\" arraysize=\"*\""
308
        " ucd=\"meta\" value=\"%s\"/>\n", error);
309 17 bertin
    fprintf(file, "  <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
310
        "!!!!!!!!!!!!!!!!!!!! -->\n");
311
    fprintf(file, "  <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
312
        "!!!!!!!!!!!!!!!!!!!! -->\n\n");
313
    }
314 16 bertin
 
315
/* Meta-data for each extension */
316
  fprintf(file, "  <TABLE ID=\"Extension_Data\" name=\"Extension_Data\">\n");
317
  fprintf(file, "   <DESCRIPTION>Data gathered by %s for every FITS"
318
        " extension</DESCRIPTION>\n", BANNER);
319
  fprintf(file, "   <!-- NExtensions may be 0"
320
        " if an error occurred early in the processing -->\n");
321
  fprintf(file, "   <PARAM name=\"NExtensions\" datatype=\"int\""
322
        " ucd=\"meta.number;meta.dataset\" value=\"%d\"/>\n",
323
        nxmlmax);
324 220 bertin
  fprintf(file, "   <!-- CurrExtension may differ from Nextensions"
325 16 bertin
        " if an error occurred -->\n");
326
  fprintf(file, "   <PARAM name=\"CurrExtension\" datatype=\"int\""
327
        " ucd=\"meta.number;meta.dataset\" value=\"%d\"/>\n",
328
        nxml);
329
  fprintf(file, "   <FIELD name=\"Extension\" datatype=\"int\""
330
        " ucd=\"meta.record\"/>\n");
331 220 bertin
  fprintf(file, "   <FIELD name=\"External_Header\" datatype=\"boolean\""
332
        " arraysize=\"%d\" ucd=\"meta.code\"/>\n",
333
        prefs.nimage_name);
334 16 bertin
  fprintf(file, "   <FIELD name=\"Date\" datatype=\"char\" arraysize=\"*\""
335
        " ucd=\"meta.record;time.event.end\"/>\n");
336
  fprintf(file, "   <FIELD name=\"Time\" datatype=\"char\" arraysize=\"*\""
337
        " ucd=\"meta.record;time.event.end\"/>\n");
338
  fprintf(file, "   <FIELD name=\"Duration\" datatype=\"float\""
339
        " ucd=\"meta.record;time.event.end\"/>\n");
340
  fprintf(file, "   <FIELD name=\"NDetect\" datatype=\"int\""
341
        " ucd=\"meta.number;src.sample\"/>\n");
342
  fprintf(file, "   <FIELD name=\"NSextracted\" datatype=\"int\""
343
        " ucd=\"meta.number;src.sample\"/>\n");
344
  fprintf(file, "   <FIELD name=\"Image_Ident\" datatype=\"char\""
345 17 bertin
        " arraysize=\"*\" ucd=\"meta.id;obs\"/>\n");
346 16 bertin
  fprintf(file, "   <FIELD name=\"Background_Mean\" datatype=\"float\""
347
        " arraysize=\"%d\" ucd=\"instr.skyLevel;obs.image;stat.median\""
348
        " unit=\"ct\"/>\n", prefs.nimage_name);
349
  fprintf(file, "   <FIELD name=\"Background_StDev\" datatype=\"float\""
350
        " arraysize=\"%d\" ucd=\"stat.stdev;obs.image;stat.median\""
351
        " unit=\"ct\"/>\n", prefs.nimage_name);
352
  fprintf(file, "   <FIELD name=\"Threshold\" datatype=\"float\""
353
        " arraysize=\"%d\" ucd=\"instr.sensitivity;obs.image;stat.median\""
354
        " unit=\"ct\"/>\n", prefs.nimage_name);
355
  fprintf(file, "   <FIELD name=\"Weight_Scaling\" datatype=\"float\""
356
        " arraysize=\"%d\" ucd=\"arith.factor;obs.image;stat.median\"/>\n",
357
        prefs.nimage_name);
358
  fprintf(file, "   <FIELD name=\"Pixel_Scale\" datatype=\"float\""
359
        " arraysize=\"%d\" ucd=\"instr.scale;obs.image;stat.mean\""
360
        " unit=\"arcsec\"/>\n", prefs.nimage_name);
361
  fprintf(file, "   <FIELD name=\"Epoch\" datatype=\"float\""
362
        " arraysize=\"%d\" ucd=\"time.epoch;obs\" unit=\"yr\"/>\n",
363
        prefs.nimage_name);
364 173 bertin
  fprintf(file, "   <FIELD name=\"Gain\" datatype=\"float\""
365
        " arraysize=\"%d\" ucd=\"instr.param;obs.param\"/>\n",
366
        prefs.nimage_name);
367
  fprintf(file, "   <FIELD name=\"Satur_Level\" datatype=\"float\""
368
        " arraysize=\"%d\" ucd=\"instr.saturation;phot.count\" unit=\"ct\"/>\n",
369
        prefs.nimage_name);
370 16 bertin
  fprintf(file, "   <DATA><TABLEDATA>\n");
371
  for (n=0; n<nxml; n++)
372
    if (prefs.nimage_name>1)
373
      fprintf(file, "     <TR>\n"
374 220 bertin
        "      <TD>%d</TD><TD>%c %c</TD><TD>%s</TD><TD>%s</TD><TD>%.0f</TD>"
375 16 bertin
        "<TD>%d</TD><TD>%d</TD>\n"
376 173 bertin
        "      <TD>%s,%s</TD><TD>%g %g</TD>\n"
377 16 bertin
        "      <TD>%g %g</TD><TD>%g %g</TD><TD>%g %g</TD>"
378 173 bertin
        "<TD>%g %g</TD><TD>%f %f</TD>\n"
379
        "      <TD>%g %g</TD><TD>%g %g</TD>\n"
380 16 bertin
        "     </TR>\n",
381
        xmlstack[n].currext,
382 220 bertin
        xmlstack[n].headflag[0]?'T':'F',xmlstack[n].headflag[1]?'T':'F',
383 16 bertin
        xmlstack[n].ext_date,
384
        xmlstack[n].ext_time,
385
        xmlstack[n].ext_elapsed,
386
        xmlstack[n].ndetect,
387
        xmlstack[n].ntotal,
388
        xmlstack[n].ident[0], xmlstack[n].ident[1],
389
        xmlstack[n].backmean[0], xmlstack[n].backmean[1],
390
        xmlstack[n].backsig[0], xmlstack[n].backsig[1],
391
        xmlstack[n].sigfac[0], xmlstack[n].sigfac[1],
392
        xmlstack[n].thresh[0], xmlstack[n].thresh[1],
393 173 bertin
        xmlstack[n].pixscale[0], xmlstack[n].pixscale[1],
394
        xmlstack[n].epoch[0], xmlstack[n].epoch[1],
395
        xmlstack[n].gain[0], xmlstack[n].gain[1],
396
        xmlstack[n].satur_level[0], xmlstack[n].satur_level[1]);
397 16 bertin
    else
398
      fprintf(file, "    <TR>\n"
399 220 bertin
        "     <TD>%d</TD><TD>%c</TD><TD>%s</TD><TD>%s</TD><TD>%.0f</TD>"
400 16 bertin
        "<TD>%d</TD><TD>%d</TD>\n"
401 173 bertin
        "     <TD>%s</TD><TD>%g</TD>\n"
402
        "     <TD>%g</TD><TD>%g</TD><TD>%g</TD><TD>%g</TD><TD>%f</TD>\n"
403
        "     <TD>%g</TD><TD>%g</TD>\n"
404 16 bertin
        "    </TR>\n",
405
        xmlstack[n].currext,
406 220 bertin
        xmlstack[n].headflag[0]?'T':'F',
407 16 bertin
        xmlstack[n].ext_date,
408
        xmlstack[n].ext_time,
409
        xmlstack[n].ext_elapsed,
410
        xmlstack[n].ndetect,
411
        xmlstack[n].ntotal,
412
        xmlstack[n].ident[0],
413
        xmlstack[n].backmean[0],
414
        xmlstack[n].backsig[0],
415
        xmlstack[n].sigfac[0],
416
        xmlstack[n].thresh[0],
417 173 bertin
        xmlstack[n].pixscale[0],
418
        xmlstack[n].epoch[0],
419
        xmlstack[n].gain[0],
420
        xmlstack[n].satur_level[0]);
421 16 bertin
  fprintf(file, "   </TABLEDATA></DATA>\n");
422
  fprintf(file, "  </TABLE>\n");
423
 
424
/* Warnings */
425
  fprintf(file, "  <TABLE ID=\"Warnings\" name=\"Warnings\">\n");
426
  fprintf(file,
427
        "   <DESCRIPTION>%s warnings (limited to the last %d)</DESCRIPTION>\n",
428
        BANNER, WARNING_NMAX);
429
  fprintf(file, "   <FIELD name=\"Date\" datatype=\"char\" arraysize=\"*\""
430
        " ucd=\"meta;time.event.end\"/>\n");
431
  fprintf(file, "   <FIELD name=\"Time\" datatype=\"char\" arraysize=\"*\""
432
        " ucd=\"meta;time.event.end\"/>\n");
433
  fprintf(file, "   <FIELD name=\"Msg\" datatype=\"char\" arraysize=\"*\""
434
        " ucd=\"meta\"/>\n");
435
  fprintf(file, "   <DATA><TABLEDATA>\n");
436
  for (str = warning_history(); *str; str = warning_history())
437
    fprintf(file, "    <TR><TD>%10.10s</TD><TD>%8.8s</TD><TD>%s</TD></TR>\n",
438
        str, str+11, str+22);
439
  fprintf(file, "   </TABLEDATA></DATA>\n");
440
  fprintf(file, "  </TABLE>\n");
441
 
442
/* Configuration file */
443
  fprintf(file, "  <RESOURCE ID=\"Config\" name=\"Config\">\n");
444 13 bertin
  fprintf(file, "   <DESCRIPTION>%s configuration</DESCRIPTION>\n", BANNER);
445
  fprintf(file,
446 16 bertin
        "   <PARAM name=\"Command_Line\" datatype=\"char\" arraysize=\"*\""
447 14 bertin
        " ucd=\"obs.param\" value=\"%s",
448 13 bertin
        prefs.command_line[0]);
449
  for (n=1; n<prefs.ncommand_line; n++)
450
    fprintf(file, " %s", prefs.command_line[n]);
451
  fprintf(file, "\"/>\n");
452
  fprintf(file,
453 16 bertin
        "   <PARAM name=\"Prefs_Name\" datatype=\"char\" arraysize=\"*\""
454 14 bertin
        " ucd=\"obs.param;meta.file\" value=\"%s\"/>\n",
455 13 bertin
        prefs.prefs_name);
456 16 bertin
 
457
  if (!error)
458
    {
459
    fprintf(file,
460
        "   <PARAM name=\"Catalog_Type\" datatype=\"char\" arraysize=\"*\""
461 13 bertin
        " ucd=\"meta\" value=\"%s\"/>\n",
462
        key[findkeys("CATALOG_TYPE",keylist,
463
                        FIND_STRICT)].keylist[prefs.cat_type]);
464 16 bertin
    fprintf(file,
465
        "   <PARAM name=\"Catalog_Name\" datatype=\"char\" arraysize=\"*\""
466 14 bertin
        " ucd=\"meta.dataset;meta.file\" value=\"%s\"/>\n",
467 13 bertin
        prefs.cat_name);
468 16 bertin
    fprintf(file,
469
        "   <PARAM name=\"Parameters_Name\" datatype=\"char\" arraysize=\"*\""
470 14 bertin
        " ucd=\"obs.param;meta.file\" value=\"%s\"/>\n",
471 13 bertin
        prefs.param_name);
472 16 bertin
    fprintf(file,
473
        "   <PARAM name=\"Detect_Type\" datatype=\"char\" arraysize=\"*\""
474 14 bertin
        " ucd=\"meta.code;instr.det;obs.param\" value=\"%s\"/>\n",
475 13 bertin
        key[findkeys("DETECT_TYPE", keylist,
476
                        FIND_STRICT)].keylist[prefs.detect_type]);
477 16 bertin
    fprintf(file, "   <PARAM name=\"Detect_MinArea\" datatype=\"int\""
478 219 bertin
        " ucd=\"phys.area;stat.min;obs.param;\" value=\"%d\" unit=\"pix2\"/>\n",
479 13 bertin
        prefs.ext_minarea);
480 14 bertin
 
481 219 bertin
    fprintf(file, "   <PARAM name=\"Detect_MaxArea\" datatype=\"int\""
482
        " ucd=\"phys.area;stat.max;obs.param\" value=\"%d\" unit=\"pix2\"/>\n",
483
        prefs.ext_maxarea);
484
 
485 16 bertin
    fprintf(file,
486 17 bertin
        "   <PARAM name=\"Thresh_Type\" datatype=\"char\" arraysize=\"*\""
487 14 bertin
        " ucd=\"meta.code;instr.sensitivity;obs.param\" value=\"%s",
488
        key[findkeys("THRESH_TYPE", keylist,
489
                        FIND_STRICT)].keylist[prefs.thresh_type[0]]);
490 16 bertin
    if (prefs.nthresh_type>1)
491
      fprintf(file, ",%s", key[findkeys("THRESH_TYPE", keylist,
492 14 bertin
                        FIND_STRICT)].keylist[prefs.thresh_type[1]]);
493 16 bertin
    fprintf(file, "\"/>\n");
494 14 bertin
 
495 16 bertin
    fprintf(file, "   <PARAM name=\"Detect_Thresh\" datatype=\"float\""
496 14 bertin
        " arraysize=\"%d\" ucd=\"instr.sensitivity;obs.param\" value=\"%g",
497
        prefs.ndthresh, prefs.dthresh[0]);
498 16 bertin
    if (prefs.ndthresh>1)
499
      fprintf(file, " %g", prefs.dthresh[1]);
500
    fprintf(file, "\"/>\n");
501 14 bertin
 
502 16 bertin
    fprintf(file, "   <PARAM name=\"Analysis_Thresh\" datatype=\"float\""
503 14 bertin
        " arraysize=\"%d\" ucd=\"instr.sensitivity;obs.param\" value=\"%g",
504
        prefs.nthresh, prefs.thresh[0]);
505 16 bertin
    if (prefs.nthresh>1)
506
      fprintf(file, " %g", prefs.thresh[1]);
507
    fprintf(file, "\"/>\n");
508 14 bertin
 
509 16 bertin
    fprintf(file,
510
        "   <PARAM name=\"Filter\" datatype=\"boolean\""
511 14 bertin
        " ucd=\"meta.code;obs.param\" value=\"%c\"/>\n",
512
        prefs.filter_flag? 'T':'F');
513 16 bertin
    fprintf(file,
514
        "   <PARAM name=\"Filter_Name\" datatype=\"char\" arraysize=\"*\""
515 14 bertin
        " ucd=\"meta.dataset;meta.file;obs.param\" value=\"%s\"/>\n",
516
        prefs.filter_name);
517
 
518 16 bertin
    if (prefs.nfilter_thresh)
519
      {
520
      fprintf(file, "   <PARAM name=\"Filter_Thresh\" datatype=\"float\""
521 14 bertin
        " arraysize=\"%d\" ucd=\"instr.sensitivity;obs.param\" value=\"%g",
522
        prefs.nfilter_thresh, prefs.filter_thresh[0]);
523 16 bertin
      if (prefs.nfilter_thresh>1)
524
        fprintf(file, " %g", prefs.filter_thresh[1]);
525
      fprintf(file, "\"/>\n");
526
      }
527 14 bertin
 
528 16 bertin
    fprintf(file, "   <PARAM name=\"Deblend_NThresh\" datatype=\"int\""
529 14 bertin
        " ucd=\"meta.number;obs.param\" value=\"%d\"/>\n",
530 13 bertin
        prefs.deblend_nthresh);
531 16 bertin
    fprintf(file, "   <PARAM name=\"Deblend_MinCont\" datatype=\"float\""
532 14 bertin
        " ucd=\"obs.param;arith.ratio\" value=\"%g\"/>\n",
533 13 bertin
        prefs.deblend_mincont);
534 16 bertin
    fprintf(file,
535
        "   <PARAM name=\"Clean\" datatype=\"boolean\""
536 14 bertin
        " ucd=\"meta.code;obs.param\" value=\"%c\"/>\n",
537
        prefs.clean_flag? 'T':'F');
538 16 bertin
    fprintf(file, "   <PARAM name=\"Clean_Param\" datatype=\"float\""
539 14 bertin
        " ucd=\"meta\" value=\"%g\"/>\n",
540
        prefs.clean_param);
541 16 bertin
    fprintf(file,
542
        "   <PARAM name=\"Mask_Type\" datatype=\"char\" arraysize=\"*\""
543 14 bertin
        " ucd=\"meta.code;obs.param;\" value=\"%s\"/>\n",
544
        key[findkeys("MASK_TYPE", keylist,
545
                        FIND_STRICT)].keylist[prefs.mask_type]);
546 13 bertin
 
547 16 bertin
    fprintf(file,
548 17 bertin
        "   <PARAM name=\"Weight_Type\" datatype=\"char\" arraysize=\"*\""
549 14 bertin
        " ucd=\"meta.code;obs.param\" value=\"%s",
550
        key[findkeys("WEIGHT_TYPE", keylist,
551
                        FIND_STRICT)].keylist[prefs.weight_type[0]]);
552 16 bertin
    if (prefs.nweight_type>1)
553
      fprintf(file, ",%s", key[findkeys("WEIGHT_TYPE", keylist,
554 14 bertin
                        FIND_STRICT)].keylist[prefs.weight_type[1]]);
555 16 bertin
    fprintf(file, "\"/>\n");
556 14 bertin
 
557 16 bertin
    fprintf(file, "   <PARAM name=\"Weight_Thresh\" datatype=\"float\""
558 14 bertin
        " arraysize=\"%d\" ucd=\"instr.sensitivity;obs.param\" value=\"%g",
559
        prefs.nweight_thresh, prefs.weight_thresh[0]);
560 16 bertin
    if (prefs.nweight_thresh>1)
561
      fprintf(file, " %g", prefs.weight_thresh[1]);
562
    fprintf(file, "\"/>\n");
563 14 bertin
 
564 16 bertin
    if ((prefs.weight_type[0] != WEIGHT_NONE
565 14 bertin
                && prefs.weight_type[0] != WEIGHT_FROMBACK)
566
        || (prefs.weight_type[1] != WEIGHT_NONE
567
                && prefs.weight_type[1] != WEIGHT_FROMBACK))
568 16 bertin
      {
569
      fprintf(file,
570 17 bertin
        "   <PARAM name=\"Weight_Image\" datatype=\"char\" arraysize=\"*\""
571 14 bertin
        " ucd=\"obs.image;meta.fits;obs.param\" value=\"%s",
572
        (prefs.weight_type[0] != WEIGHT_NONE
573
        && prefs.weight_type[0] != WEIGHT_FROMBACK) ?
574
                prefs.wimage_name[0] : NULL);
575 16 bertin
      if (prefs.weight_type[1] != WEIGHT_NONE
576 14 bertin
                && prefs.weight_type[1] != WEIGHT_FROMBACK)
577 16 bertin
        fprintf(file, ",%s", prefs.wimage_name[1]);
578
      fprintf(file, "\"/>\n");
579
      }
580 14 bertin
 
581 16 bertin
    fprintf(file,
582
        "   <PARAM name=\"Weight_Gain\" datatype=\"boolean\""
583 14 bertin
        " ucd=\"meta.code;obs.param\" value=\"%c\"/>\n",
584
        prefs.weightgain_flag? 'T':'F');
585
 
586 16 bertin
    if (prefs.nimaflag)
587
      {
588
      fprintf(file,
589 17 bertin
        "   <PARAM name=\"Flag_Image\" datatype=\"char\" arraysize=\"*\""
590 14 bertin
        " ucd=\"obs.image;meta.fits\" value=\"%s",
591
        prefs.fimage_name[0]);
592 16 bertin
      for (n=1; n<prefs.nimaflag; n++)
593
        fprintf(file, ",%s", prefs.fimage_name[n]);
594
      fprintf(file, "\"/>\n");
595
      fprintf(file,
596 17 bertin
        "   <PARAM name=\"Flag_Type\" datatype=\"char\" arraysize=\"*\""
597 14 bertin
        " ucd=\"meta.code\" value=\"%s",
598
        key[findkeys("FLAG_TYPE", keylist,
599
                        FIND_STRICT)].keylist[prefs.flag_type[0]]);
600 16 bertin
      for (n=1; n<prefs.nimaflag; n++)
601
        fprintf(file, ",%s", key[findkeys("FLAG_TYPE", keylist,
602 14 bertin
                        FIND_STRICT)].keylist[prefs.flag_type[n]]);
603 16 bertin
      fprintf(file, "\"/>\n");
604
      }
605 14 bertin
 
606 16 bertin
    fprintf(file, "   <PARAM name=\"Phot_Apertures\" datatype=\"float\""
607 14 bertin
        " arraysize=\"%d\" ucd=\"obs.param\" value=\"%g",
608
        prefs.naper, prefs.apert[0]);
609 16 bertin
    for (n=1; n<prefs.naper; n++)
610
      fprintf(file, " %g", prefs.apert[n]);
611
    fprintf(file, "\" unit=\"pix\"/>\n");
612 14 bertin
 
613 16 bertin
    fprintf(file, "   <PARAM name=\"Phot_AutoParams\" datatype=\"float\""
614 14 bertin
        " arraysize=\"%d\" ucd=\"obs.param;phot\" value=\"%g",
615
        prefs.nautoparam, prefs.autoparam[0]);
616 16 bertin
    for (n=1; n<prefs.nautoparam; n++)
617
      fprintf(file, " %g", prefs.autoparam[n]);
618
    fprintf(file, "\"/>\n");
619 14 bertin
 
620 16 bertin
    fprintf(file, "   <PARAM name=\"Phot_PetroParams\" datatype=\"float\""
621 14 bertin
        " arraysize=\"%d\" ucd=\"obs.param;phot\" value=\"%g",
622
        prefs.npetroparam, prefs.petroparam[0]);
623 16 bertin
    for (n=1; n<prefs.npetroparam; n++)
624
      fprintf(file, " %g", prefs.petroparam[n]);
625
    fprintf(file, "\"/>\n");
626 14 bertin
 
627 16 bertin
    fprintf(file, "   <PARAM name=\"Phot_AutoApers\" datatype=\"float\""
628 14 bertin
        " arraysize=\"%d\" ucd=\"obs.param;phot\" value=\"%g",
629
        prefs.nautoaper, prefs.autoaper[0]);
630 16 bertin
    for (n=1; n<prefs.nautoaper; n++)
631
      fprintf(file, " %g", prefs.autoaper[n]);
632
    fprintf(file, "\"/>\n");
633 14 bertin
 
634 16 bertin
    fprintf(file, "   <PARAM name=\"Phot_FluxFrac\" datatype=\"float\""
635 14 bertin
        " arraysize=\"%d\" ucd=\"arith.factor;obs.param;phot\" value=\"%g",
636
        prefs.nflux_frac, prefs.flux_frac[0]);
637 16 bertin
    for (n=1; n<prefs.nflux_frac; n++)
638
      fprintf(file, " %g", prefs.flux_frac[n]);
639
    fprintf(file, "\"/>\n");
640 14 bertin
 
641 16 bertin
    fprintf(file, "   <PARAM name=\"Satur_Level\" datatype=\"float\""
642 14 bertin
        " ucd=\"instr.saturation;phot.count;obs.param\" value=\"%g\""
643
        " unit=\"ct\"/>\n", prefs.satur_level);
644 16 bertin
    fprintf(file, "   <PARAM name=\"Mag_ZeroPoint\" datatype=\"float\""
645 14 bertin
        " ucd=\"phot.calib;phot.mag;obs.param\" value=\"%g\" unit=\"mag\"/>\n",
646
        prefs.mag_zeropoint);
647 16 bertin
    fprintf(file, "   <PARAM name=\"Mag_Gamma\" datatype=\"float\""
648 14 bertin
        " ucd=\"phot.calib;obs.param\" value=\"%g\"/>\n",
649
        prefs.mag_gamma);
650 16 bertin
    fprintf(file, "   <PARAM name=\"Gain\" datatype=\"float\""
651 14 bertin
        " ucd=\"instr.param;obs.param\" value=\"%g\"/>\n",
652
        prefs.gain);
653 16 bertin
    fprintf(file, "   <PARAM name=\"Pixel_Scale\" datatype=\"float\""
654 14 bertin
        " ucd=\"instr.scale;obs.param\" value=\"%g\" unit=\"arcsec\"/>\n",
655
        prefs.pixel_scale);
656 16 bertin
    fprintf(file, "   <PARAM name=\"Seeing_FWHM\" datatype=\"float\""
657 14 bertin
        " ucd=\"instr.det.psf;stat.mean;obs.param\" value=\"%g\""
658
        " unit=\"pix\"/>\n", prefs.seeing_fwhm);
659 16 bertin
    fprintf(file,
660
        "   <PARAM name=\"StarNNW_Name\" datatype=\"char\" arraysize=\"*\""
661 14 bertin
        " ucd=\"meta.dataset;meta.file;obs.param\" value=\"%s\"/>\n",
662
        prefs.nnw_name);
663
 
664 16 bertin
    fprintf(file, "   <PARAM name=\"Back_Size\" datatype=\"int\""
665 14 bertin
        " arraysize=\"%d\" ucd=\"obs.param\" value=\"%d",
666
        prefs.nbacksize, prefs.backsize[0]);
667 16 bertin
    for (n=1; n<prefs.nbacksize; n++)
668
      fprintf(file, " %d", prefs.backsize[n]);
669
    fprintf(file, "\" unit=\"pix\"/>\n");
670 14 bertin
 
671 16 bertin
    fprintf(file, "   <PARAM name=\"Back_FilterSize\" datatype=\"int\""
672 14 bertin
        " arraysize=\"%d\" ucd=\"obs.param\" value=\"%d",
673
        prefs.nbackfsize, prefs.backfsize[0]);
674 16 bertin
    for (n=1; n<prefs.nbackfsize; n++)
675
      fprintf(file, " %d", prefs.backfsize[n]);
676
    fprintf(file, "\"/>\n");
677 14 bertin
 
678 16 bertin
    fprintf(file,
679
        "   <PARAM name=\"BackPhoto_Type\" datatype=\"char\" arraysize=\"*\""
680 14 bertin
        " ucd=\"meta.code;obs.param;\" value=\"%s\"/>\n",
681
        key[findkeys("BACKPHOTO_TYPE", keylist,
682
                        FIND_STRICT)].keylist[prefs.pback_type]);
683
 
684 16 bertin
    fprintf(file, "   <PARAM name=\"BackPhoto_Thick\" datatype=\"int\""
685 14 bertin
        " ucd=\"obs.param\" value=\"%d\" unit=\"pix\"/>\n",
686
        prefs.pback_size);
687
 
688 16 bertin
    fprintf(file, "   <PARAM name=\"Back_FiltThresh\" datatype=\"float\""
689 14 bertin
        " ucd=\"phot.count;arith.ratio;obs.param\" value=\"%g\"/>\n",
690
        prefs.backfthresh);
691
 
692 16 bertin
    fprintf(file,
693 17 bertin
        "   <PARAM name=\"CheckImage_Type\" datatype=\"char\" arraysize=\"*\""
694 14 bertin
        " ucd=\"meta.code\" value=\"%s",
695
        key[findkeys("CHECKIMAGE_TYPE", keylist,
696
                        FIND_STRICT)].keylist[prefs.check_type[0]]);
697 16 bertin
    for (n=1; n<prefs.ncheck_type; n++)
698
      fprintf(file,
699 14 bertin
        ",%s",
700
        key[findkeys("CHECKIMAGE_TYPE", keylist,
701
                        FIND_STRICT)].keylist[prefs.check_type[n]]);
702 16 bertin
    fprintf(file, "\"/>\n");
703 14 bertin
 
704 16 bertin
    fprintf(file,
705 17 bertin
        "   <PARAM name=\"CheckImage_Name\" datatype=\"char\" arraysize=\"*\""
706 14 bertin
        " ucd=\"meta.file\" value=\"%s",
707
        prefs.check_name[0]);
708 16 bertin
    for (n=1; n<prefs.ncheck_type; n++)
709
      if (prefs.check_type[n] != CHECK_NONE)
710
        fprintf(file, ",%s", prefs.check_name[n]);
711
    fprintf(file, "\"/>\n");
712 14 bertin
 
713 16 bertin
    fprintf(file, "   <PARAM name=\"Memory_ObjStack\" datatype=\"int\""
714 14 bertin
        " ucd=\"meta.number;src;obs.param\" value=\"%d\"/>\n",
715
        prefs.clean_stacksize);
716 16 bertin
    fprintf(file, "   <PARAM name=\"Memory_PixStack\" datatype=\"int\""
717 14 bertin
        " ucd=\"meta.number;obs.param\" value=\"%d\"/>\n",
718
        prefs.mem_pixstack);
719 16 bertin
    fprintf(file, "   <PARAM name=\"Memory_BufSize\" datatype=\"int\""
720 14 bertin
        " ucd=\"meta.number;obs.param\" value=\"%d\"/>\n",
721
        prefs.mem_bufsize);
722
 
723 16 bertin
    fprintf(file,
724
        "   <PARAM name=\"Assoc_Name\" datatype=\"char\" arraysize=\"*\""
725 14 bertin
        " ucd=\"meta.dataset;meta.file\" value=\"%s\"/>\n",
726
        prefs.assoc_name);
727 16 bertin
    if (prefs.nassoc_data)
728
      {
729
      fprintf(file, "   <PARAM name=\"Assoc_Data\" datatype=\"int\""
730 14 bertin
        " arraysize=\"%d\" ucd=\"meta.code;obs.param\" value=\"%d",
731
        prefs.nassoc_data, prefs.assoc_data[0]);
732 16 bertin
      for (n=1; n<prefs.nassoc_data; n++)
733
        fprintf(file, " %d", prefs.assoc_data[n]);
734
      fprintf(file, "\"/>\n");
735
      }
736
    if (prefs.nassoc_param)
737
      {
738
      fprintf(file, "   <PARAM name=\"Assoc_Params\" datatype=\"int\""
739 14 bertin
        " arraysize=\"%d\" ucd=\"meta.code;obs.param\" value=\"%d",
740 16 bertin
        prefs.nassoc_param, prefs.assoc_param[0]);
741
      for (n=1; n<prefs.nassoc_param; n++)
742
        fprintf(file, " %d", prefs.assoc_param[n]);
743
      fprintf(file, "\"/>\n");
744
      }
745
    fprintf(file, "   <PARAM name=\"Assoc_Radius\" datatype=\"float\""
746 14 bertin
        " ucd=\"phys.size.radius;obs.param\" value=\"%g\" unit=\"pix\"/>\n",
747
        prefs.assoc_radius);
748 16 bertin
    fprintf(file,
749
        "   <PARAM name=\"Assoc_Type\" datatype=\"char\" arraysize=\"*\""
750 14 bertin
        " ucd=\"meta.code;obs.param\" value=\"%s\"/>\n",
751
        key[findkeys("ASSOC_TYPE", keylist,
752
                        FIND_STRICT)].keylist[prefs.assoc_type]);
753 16 bertin
    fprintf(file,
754
        "   <PARAM name=\"AssocSelec_Type\" datatype=\"char\" arraysize=\"*\""
755 14 bertin
        " ucd=\"meta.code;obs.param\" value=\"%s\"/>\n",
756
        key[findkeys("ASSOCSELEC_TYPE", keylist,
757
                        FIND_STRICT)].keylist[prefs.assocselec_type]);
758
 
759 16 bertin
    fprintf(file,
760
        "   <PARAM name=\"Verbose_Type\" datatype=\"char\" arraysize=\"*\""
761 14 bertin
        " ucd=\"meta.code\" value=\"%s\"/>\n",
762
        key[findkeys("VERBOSE_TYPE", keylist,
763
                        FIND_STRICT)].keylist[prefs.verbose_type]);
764
 
765 16 bertin
    fprintf(file,
766 220 bertin
        "   <PARAM name=\"Header_Suffix\" datatype=\"char\" arraysize=\"*\""
767
        " ucd=\"meta.dataset;meta.file\" value=\"%s\"/>\n",
768
        prefs.head_suffix);
769
    fprintf(file,
770 16 bertin
        "   <PARAM name=\"FITS_Unsigned\" datatype=\"boolean\""
771 14 bertin
        " ucd=\"meta.code;obs.param\" value=\"%c\"/>\n",
772
        prefs.fitsunsigned_flag? 'T':'F');
773
 
774 16 bertin
    fprintf(file,
775
        "   <PARAM name=\"PSF_Name\" datatype=\"char\" arraysize=\"*\""
776 14 bertin
        " ucd=\"meta.dataset;meta.file;obs.param\" value=\"%s\"/>\n",
777
        prefs.psf_name[0]);
778 16 bertin
    fprintf(file, "   <PARAM name=\"PSF_NMax\" datatype=\"int\""
779 14 bertin
        " ucd=\"meta.number;obs.param\" value=\"%d\"/>\n",
780
        prefs.psf_npsfmax);
781
 
782 16 bertin
    fprintf(file,
783
        "   <PARAM name=\"SOM_Name\" datatype=\"char\" arraysize=\"*\""
784 14 bertin
        " ucd=\"meta.dataset;meta.file;obs.param\" value=\"%s\"/>\n",
785
        prefs.som_name);
786 16 bertin
    }
787 14 bertin
 
788 13 bertin
  fprintf(file, "  </RESOURCE>\n");
789
  fprintf(file, " </RESOURCE>\n");
790 8 bertin
 
791
  return RETURN_OK;
792
  }
793 16 bertin
 
794
 
795
 
796
 
797 15 bertin
/****** write_xmlerror ******************************************************
798 16 bertin
PROTO   int     write_xmlerror(char *error)
799 11 bertin
PURPOSE Save meta-data to a simplified XML file in case of a catched error
800 16 bertin
INPUT   a character string.
801 11 bertin
OUTPUT  RETURN_OK if everything went fine, RETURN_ERROR otherwise.
802
NOTES   -.
803
AUTHOR  E. Bertin (IAP)
804 17 bertin
VERSION 14/07/2006
805 11 bertin
 ***/
806 16 bertin
void    write_xmlerror(char *filename, char *error)
807 11 bertin
  {
808
   FILE                 *file;
809
 
810 17 bertin
  if (!(file = fopen(filename, "w")))
811
    return;
812 15 bertin
 
813 17 bertin
  write_xml_header(file);
814 15 bertin
 
815 17 bertin
  fprintf(file, " </TABLE>\n");
816
 
817
  write_xml_meta(file, error);
818
 
819
  fprintf(file, "</RESOURCE>\n");
820
  fprintf(file, "</VOTABLE>\n");
821
 
822
  fclose(file);
823
 
824 11 bertin
  return;
825
  }
826
 
827 16 bertin