public software.sextractor

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

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

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