public software.sextractor

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

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