MIDI Pipeline Reference Manual  2.8.3
createProdKappa.c
1 
2 /******************************************************************************
3 *******************************************************************************
4 * European Southern Observatory
5 * VLTI MIDI Maintenance Templates Software
6 *
7 * Module name: createProdKappa.c
8 * Description: Contains routines for the product files handling
9 *
10 * History:
11 * 07-Dec-05 (csabet)
12 *******************************************************************************
13 ******************************************************************************/
14 
15 /******************************************************************************
16 * Compiler directives
17 ******************************************************************************/
18 
19 /******************************************************************************
20 * Include files
21 ******************************************************************************/
22 #include <sys/stat.h>
23 #include <stdio.h>
24 #include <cpl.h>
25 #include <time.h>
26 #include "midiGlobal.h"
27 #include "midiLib.h"
28 #include "errorHandling.h"
29 #include "midiFitsUtility.h"
30 #include "fileHandling.h"
31 #include "createProdKappa.h"
32 #include "qfits.h"
33 
34 /**********************************************************
35 * Global Variables
36 **********************************************************/
37 
38 /*============================ C O D E A R E A ===========================*/
39 
40 
41 
42 /******************************************************************************
43 * European Southern Observatory
44 * VLTI MIDI Maintenance Templates Software
45 *
46 * Module name: createKappaProd
47 * Input/Output: See function arguments to avoid duplication
48 * Description: Creates MIDI product files
49 *
50 * History:
51 * 15-Jun-04 (csabet) Created
52 ******************************************************************************/
53 void createKappaProd (
54  int update, // In: Indicates local or database
55  MidiFiles *fileNames, // In: Pointer to the file structure
56  ImageFormat *size, // In: Pointer to the image format structure
57  TransferRatios *trRatios, // In: Transfer Ratios
58  int *error) // Ou: Error status
59 {
60 
61  // Local Declarations
62  // ------------------
63  const char routine[] = "createKappaProd";
64  float *spkImage;
65  qfitsdumper qdSpk;
66 
67  // Algorithm
68  // ---------
69  if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
70  if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
71 
72  cpl_msg_info(cpl_func,"\nCreating Product files for SCI_PHOT_KAPPA from batch %d \n", batchNumber);
73  cpl_msg_info(cpl_func,"---------------------------------------------------- \n");
74  fprintf (midiReportPtr, "\nCreating Product files for SCI_PHOT_KAPPA from batch %d \n", batchNumber);
75  fprintf (midiReportPtr, "---------------------------------------------------- \n");
76 
77  // Create the Transfer Ratios files. Do not create is there has been an error
78  if (!(*error))
79  createTransferRatiosFile (update, size, fileNames, trRatios, error);
80 
81  // Reset parameters
82  *error = 0;
83 
84  // Create the primary header extension
85  createKappaPrimHead (fileNames, size, trRatios, error);
86  if (*error)
87  {
88  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot create Primary Header extension");
89  return;
90  }
91 
92  // Create a dummy image
93  spkImage = (float *) calloc (size->iXWidth * size->iYWidth, sizeof (float));
94  qdSpk.filename = fileNames->outFitsName;
95  qdSpk.npix = size->iXWidth * size->iYWidth;
96  qdSpk.ptype = PTYPE_FLOAT;
97  qdSpk.fbuf = spkImage;
98  qdSpk.out_ptype = BPP_IEEE_FLOAT;
99  qfits_pixdump (&qdSpk);
100  free (spkImage);
101 
102  // Copy keywords from the raw FITS file into the QC log
103  createKappaQcLog (fileNames->inFitsName, error);
104  if (*error) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot copy keywords to QC log");
105 
106  // Add output product to QC log
107  addProdInfoToKappaQcLog (size, fileNames, trRatios, error);
108 
109  return;
110 }
111 /*****************************************************************************/
112 
113 
114 
115 /******************************************************************************
116 * European Southern Observatory
117 * VLTI MIDI Data Reduction Software
118 *
119 * Module name: createKappaPrimHead
120 * Input/Output: See function arguments to avoid duplication
121 * Description: Creates the primary header
122 *
123 *
124 * History:
125 * 08-Dec-05 (csabet) Created
126 ******************************************************************************/
127 void createKappaPrimHead (
128  MidiFiles *fileNames,
129  ImageFormat *size,
130  TransferRatios *trRatios, // In: Transfer Ratios
131  int *error)
132 {
133 
134  // Local Declarations
135  // ------------------
136  const char routine[] = "createKappaPrimHead";
137  qfits_header *outFitsHeader;
138  FILE *inFitsBatchPtr=NULL, *outFitsPtr;
139  int i;
140  char *textBuff, *stringQfits, *messageBuffer, *currentTime, *cleanString,
141  *stringTemp, *classification, *sWidthX, *sWidthY;
142  time_t now;
143  struct tm *newTime;
144  struct stat buf;
145 
146  // Algorithm
147  // ---------
148  if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
149  if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
150 
151  // Reset parameters
152  *error = 0;
153 
154  // Open list of files
155  if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch, "r")) == NULL)
156  {
157  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open input FITS file list");
158  *error = 1;
159  return;
160  }
161 
162  // Allocate memory
163  textBuff = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
164  classification = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
165  stringTemp = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
166  cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
167  messageBuffer = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
168  currentTime = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
169  sWidthX = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
170  sWidthY = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
171 
172  // Get current time/date
173  now = time(NULL);
174  newTime = gmtime (&now);
175  strftime (currentTime, MIN_STRING_LENGTH, "%a %d %b %Y at %H:%M:%S", newTime);
176 
177  // Read the name of the first file in the list and get it's full path name
178  fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr);
179  sprintf (classification, "%s", "");
180  sscanf (stringTemp, "%s%s", fileNames->inFitsName, classification);
181 
182  // Copy primary header from the raw file to the output header
183  outFitsHeader = qfits_header_read (fileNames->inFitsName);
184  if (outFitsHeader == NULL)
185  {
186  *error = 1;
187  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot load header from the input FITS file");
188  free (messageBuffer);
189  free (currentTime);
190  free (cleanString);
191  free (stringTemp);
192  free (classification);
193  free (textBuff);
194  free (sWidthX);
195  free (sWidthY);
196  return;
197  }
198 
199  // Write all NAXIS values as character strings
200  sprintf (sWidthY, "%d", size->iYWidth);
201  sprintf (sWidthX, "%d", size->iXWidth);
202 
203  // Updates header for the Transfer Ratios output file
204  qfits_header_mod (outFitsHeader, "BITPIX", "-32", "number of bits per pixel");
205  qfits_header_mod (outFitsHeader, "NAXIS", "2", "number of data axes");
206  qfits_header_add (outFitsHeader, "NAXIS1", sWidthX, "", NULL);
207  qfits_header_add (outFitsHeader, "NAXIS2", sWidthY, "", NULL);
208  qfits_header_mod (outFitsHeader, "INSTRUME", "MIDI", "MIDI Raw Data Display FITS created by DRS pipeline" );
209 
210  // Now write all the required product keaywords to the output header
211  // -----------------------------------------------------------------
212  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO TYPE", size->obsType, "MIDI pipeline product type", NULL);
213  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO CATG", "KAPPA_MATRIX", "Pipeline product category", NULL);
214  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO ARCFILE", fileNames->archFileName, "Arcfile name of first raw file", NULL);
215  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO PIPEDATE", currentTime, "Pipeline run date", "");
216  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO VERSION", MIDI_PIPE_VERSION, "Pipeline version", NULL);
217  qfits_header_add (outFitsHeader, "PIPEFILE", fileNames->pipeFileName, "Pipeline product file name", NULL);
218  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO DID", MIDI_QC_DIC_VERSION, "QC dictionary version", NULL);
219 
220  // Rewind the list of files
221  rewind (inFitsBatchPtr);
222 
223  // Loop through the list of files and write into the primary header
224  i = 1;
225  while (fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
226  {
227  sprintf (classification, "%s", "");
228  sscanf (stringTemp, "%s%s", messageBuffer, classification);
229 
230  // If classification is not given get it from the raw file
231  if (strcmp (classification, "") == 0)
232  {
233  stringQfits = qfits_query_hdr (messageBuffer, "HIERARCH ESO DPR CATG");
234  if (stringQfits == NULL)
235  {
236  sprintf (classification, "%s", "UNKNOWN");
237  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get Observation Category");
238  }
239  else
240  {
241  cleanUpString (stringQfits, cleanString);
242  sprintf (classification, "%s", cleanString);
243  }
244  }
245  removePathName (messageBuffer, midiReportPtr);
246  sprintf (textBuff, "HIERARCH ESO PRO REC1 RAW%d NAME", i);
247  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "FITS file name", "");
248  sprintf (textBuff, "HIERARCH ESO PRO REC1 RAW%d CATG", i++);
249  qfits_header_add (outFitsHeader, textBuff, classification, "Observation Categoty", "");
250  }
251  fclose (inFitsBatchPtr);
252 
253  // Add the required QC keywords
254  sprintf (messageBuffer, "%d", trRatios->exists);
255  qfits_header_add (outFitsHeader, "HIERARCH ESO QC KAPPA_EXISTS", messageBuffer, "1 = Transfer Ratios exist", "");
256  if (trRatios->exists)
257  {
258  for (i = 0; i < size->iXWidth; i++)
259  {
260  if (badChannelList[i])
261  {
262  sprintf (messageBuffer, "%s", UNAV);
263  sprintf (textBuff, "HIERARCH ESO QC KA1 CH%d", i);
264  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio", "");
265  sprintf (messageBuffer, "%s", UNAV);
266  sprintf (textBuff, "HIERARCH ESO QC SIGA1 CH%d", i);
267  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio Error", "");
268 
269  sprintf (messageBuffer, "%s", UNAV);
270  sprintf (textBuff, "HIERARCH ESO QC KA2 CH%d", i);
271  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio", "");
272  sprintf (messageBuffer, "%s", UNAV);
273  sprintf (textBuff, "HIERARCH ESO QC SIGA2 CH%d", i);
274  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio Error", "");
275 
276  sprintf (messageBuffer, "%s", UNAV);
277  sprintf (textBuff, "HIERARCH ESO QC KB1 CH%d", i);
278  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio", "");
279  sprintf (messageBuffer, "%s", UNAV);
280  sprintf (textBuff, "HIERARCH ESO QC SIGB1 CH%d", i);
281  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio Error", "");
282 
283  sprintf (messageBuffer, "%s", UNAV);
284  sprintf (textBuff, "HIERARCH ESO QC KB2 CH%d", i);
285  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio", "");
286  sprintf (messageBuffer, "%s", UNAV);
287  sprintf (textBuff, "HIERARCH ESO QC SIGB2 CH%d", i);
288  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio Error", "");
289  }
290  else
291  {
292  sprintf (messageBuffer, "%f", trRatios->ka1[i]);
293  sprintf (textBuff, "HIERARCH ESO QC KA1 CH%d", i);
294  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio", "");
295  sprintf (messageBuffer, "%f", trRatios->siga1[i]);
296  sprintf (textBuff, "HIERARCH ESO QC SIGA1 CH%d", i);
297  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio Error", "");
298 
299  sprintf (messageBuffer, "%f", trRatios->ka2[i]);
300  sprintf (textBuff, "HIERARCH ESO QC KA2 CH%d", i);
301  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio", "");
302  sprintf (messageBuffer, "%f", trRatios->siga2[i]);
303  sprintf (textBuff, "HIERARCH ESO QC SIGA2 CH%d", i);
304  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio Error", "");
305 
306  sprintf (messageBuffer, "%f", trRatios->kb1[i]);
307  sprintf (textBuff, "HIERARCH ESO QC KB1 CH%d", i);
308  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio", "");
309  sprintf (messageBuffer, "%f", trRatios->sigb1[i]);
310  sprintf (textBuff, "HIERARCH ESO QC SIGB1 CH%d", i);
311  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio Error", "");
312 
313  sprintf (messageBuffer, "%f", trRatios->kb2[i]);
314  sprintf (textBuff, "HIERARCH ESO QC KB2 CH%d", i);
315  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio", "");
316  sprintf (messageBuffer, "%f", trRatios->sigb2[i]);
317  sprintf (textBuff, "HIERARCH ESO QC SIGB2 CH%d", i);
318  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Transfer Ratio Error", "");
319  }
320  }
321  }
322 
323  // Place Holders
324  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH1", "TBD", "TBD", "");
325  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH2", "TBD", "TBD", "");
326  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH3", "TBD", "TBD", "");
327  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH4", "TBD", "TBD", "");
328  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH5", "TBD", "TBD", "");
329  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH6", "TBD", "TBD", "");
330  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH7", "TBD", "TBD", "");
331  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH8", "TBD", "TBD", "");
332  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH9", "TBD", "TBD", "");
333 
334  // Create the output fits file. If the file exist delete it
335  if (stat (fileNames->outFitsName, &buf) == 0) remove (fileNames->outFitsName);
336  outFitsPtr = fopen (fileNames->outFitsName, "w");
337  if (!outFitsPtr)
338  {
339  *error = 1;
340  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot create output FITS file");
341  free (messageBuffer);
342  free (currentTime);
343  free (cleanString);
344  free (stringTemp);
345  free (classification);
346  free (textBuff);
347  free (sWidthX);
348  free (sWidthY);
349  return;
350  }
351 
352  cpl_msg_info(cpl_func,"Created Product FITS file: %s \n", fileNames->outFitsName);
353  fprintf (midiReportPtr, "Created Product FITS file: %s \n", fileNames->outFitsName);
354 
355  // Write header into the output file
356  qfits_header_sort (&outFitsHeader);
357  qfits_header_dump (outFitsHeader, outFitsPtr);
358  fclose (outFitsPtr);
359  qfits_header_destroy (outFitsHeader);
360 
361  // release memory
362  free (messageBuffer);
363  free (currentTime);
364  free (cleanString);
365  free (stringTemp);
366  free (classification);
367  free (textBuff);
368  free (sWidthX);
369  free (sWidthY);
370 
371  return;
372 }
373 /*****************************************************************************/
374 
375 
376 
377 
378 /******************************************************************************
379 * European Southern Observatory
380 * VLTI MIDI Data Reduction Software
381 *
382 * Module name: createKappaQcLog
383 * Input/Output: See function arguments to avoid duplication
384 * Description: Copies keywords from the raw input FITS primary header to the
385 * QC log and adds additional product keywords
386 *
387 * History:
388 * 08-Dec-05 (csabet) Created
389 ******************************************************************************/
390 void createKappaQcLog (
391  char *inFitsName,
392  int *error)
393 
394 {
395 
396  /* Local Declarations
397  --------------------*/
398  const char routine[] = "createKappaQcLog";
399  char *qfitsString, *emptyString, *cleanString;
400 
401  /* Algorithm
402  -----------*/
403  if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
404  if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
405 
406  /* Reset status */
407  *error = 0;
408 
409  /* Allocate memory */
410  emptyString = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
411  cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
412 
413  /* Initialise empty string */
414  strcpy (emptyString, "\"UNKNOWN\"");
415 
416  /* Get all the keywords */
417  qfitsString = qfits_query_hdr (inFitsName, "ARCFILE");
418  if (qfitsString == NULL)
419  fprintf (midiQcLogPtr, "ARCFILE %s \n", emptyString);
420  else {cleanUpString (qfitsString, cleanString);
421  fprintf (midiQcLogPtr, "ARCFILE \"%s\" \n", cleanString);}
422 
423  qfitsString = qfits_query_hdr (inFitsName, "TELESCOP");
424  if (qfitsString == NULL)
425  fprintf (midiQcLogPtr, "TELESCOP %s \n", emptyString);
426  else {cleanUpString (qfitsString, cleanString);
427  fprintf (midiQcLogPtr, "TELESCOP \"%s\" \n", cleanString);}
428 
429  qfitsString = qfits_query_hdr (inFitsName, "INSTRUME");
430  if (qfitsString == NULL)
431  fprintf (midiQcLogPtr, "INSTRUME %s \n", emptyString);
432  else {cleanUpString (qfitsString, cleanString);
433  fprintf (midiQcLogPtr, "INSTRUME \"%s\" \n", cleanString);}
434 
435  qfitsString = qfits_query_hdr (inFitsName, "MJD-OBS");
436  if (qfitsString == NULL)
437  fprintf (midiQcLogPtr, "MJD-OBS %s \n", emptyString);
438  else {cleanUpString (qfitsString, cleanString);
439  fprintf (midiQcLogPtr, "MJD-OBS \"%s\" \n", cleanString);}
440 
441  qfitsString = qfits_query_hdr (inFitsName, "DATE-OBS");
442  if (qfitsString == NULL)
443  fprintf (midiQcLogPtr, "DATE-OBS %s \n", emptyString);
444  else {cleanUpString (qfitsString, cleanString);
445  fprintf (midiQcLogPtr, "DATE-OBS \"%s\" \n", cleanString);}
446 
447  qfitsString = qfits_query_hdr (inFitsName, "UTC");
448  if (qfitsString == NULL)
449  fprintf (midiQcLogPtr, "UTC %s \n", emptyString);
450  else {cleanUpString (qfitsString, cleanString);
451  fprintf (midiQcLogPtr, "UTC %s \n", cleanString);}
452 
453  qfitsString = qfits_query_hdr (inFitsName, "LST");
454  if (qfitsString == NULL)
455  fprintf (midiQcLogPtr, "LST %s \n", emptyString);
456  else {cleanUpString (qfitsString, cleanString);
457  fprintf (midiQcLogPtr, "LST %s \n", cleanString);}
458 
459  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU GUID DEC");
460  if (qfitsString == NULL)
461  fprintf (midiQcLogPtr, "COU.GUID.DEC %s \n", emptyString);
462  else {cleanUpString (qfitsString, cleanString);
463  fprintf (midiQcLogPtr, "COU.GUID.DEC %s \n", cleanString);}
464 
465  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU GUID RA");
466  if (qfitsString == NULL)
467  fprintf (midiQcLogPtr, "COU.GUID.RA %s \n", emptyString);
468  else {cleanUpString (qfitsString, cleanString);
469  fprintf (midiQcLogPtr, "COU.GUID.RA %s \n", cleanString);}
470 
471  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU GUID MAG");
472  if (qfitsString == NULL)
473  fprintf (midiQcLogPtr, "COU.GUID.MAG %s \n", emptyString);
474  else {cleanUpString (qfitsString, cleanString);
475  fprintf (midiQcLogPtr, "COU.GUID.MAG %s \n", cleanString);}
476 
477  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 STREHL_MEAN");
478  if (qfitsString == NULL)
479  fprintf (midiQcLogPtr, "COU.AO1.STREHL_MEAN %s \n", emptyString);
480  else {cleanUpString (qfitsString, cleanString);
481  fprintf (midiQcLogPtr, "COU.AO1.STREHL_MEAN %s \n", cleanString);}
482 
483  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 STREHL_MEAN");
484  if (qfitsString == NULL)
485  fprintf (midiQcLogPtr, "COU.AO2.STREHL_MEAN %s \n", emptyString);
486  else {cleanUpString (qfitsString, cleanString);
487  fprintf (midiQcLogPtr, "COU.AO2.STREHL_MEAN %s \n", cleanString);}
488 
489  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 STREHL_RMS");
490  if (qfitsString == NULL)
491  fprintf (midiQcLogPtr, "COU.AO1.STREHL_RMS %s \n", emptyString);
492  else {cleanUpString (qfitsString, cleanString);
493  fprintf (midiQcLogPtr, "COU.AO1.STREHL_RMS %s \n", cleanString);}
494 
495  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 STREHL_RMS");
496  if (qfitsString == NULL)
497  fprintf (midiQcLogPtr, "COU.AO2.STREHL_RMS %s \n", emptyString);
498  else {cleanUpString (qfitsString, cleanString);
499  fprintf (midiQcLogPtr, "COU.AO2.STREHL_RMS %s \n", cleanString);}
500 
501  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 WFE_MEAN");
502  if (qfitsString == NULL)
503  fprintf (midiQcLogPtr, "COU.AO1.WFE_MEAN %s \n", emptyString);
504  else {cleanUpString (qfitsString, cleanString);
505  fprintf (midiQcLogPtr, "COU.AO1.WFE_MEAN %s \n", cleanString);}
506 
507  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 WFE_MEAN");
508  if (qfitsString == NULL)
509  fprintf (midiQcLogPtr, "COU.AO2.WFE_MEAN %s \n", emptyString);
510  else {cleanUpString (qfitsString, cleanString);
511  fprintf (midiQcLogPtr, "COU.AO2.WFE_MEAN %s \n", cleanString);}
512 
513  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 WFE_RMS");
514  if (qfitsString == NULL)
515  fprintf (midiQcLogPtr, "COU.AO1.WFE_RMS %s \n", emptyString);
516  else {cleanUpString (qfitsString, cleanString);
517  fprintf (midiQcLogPtr, "COU.AO1.WFE_RMS %s \n", cleanString);}
518 
519  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 WFE_RMS");
520  if (qfitsString == NULL)
521  fprintf (midiQcLogPtr, "COU.AO2.WFE_RMS %s \n", emptyString);
522  else {cleanUpString (qfitsString, cleanString);
523  fprintf (midiQcLogPtr, "COU.AO2.WFE_RMS %s \n", cleanString);}
524 
525  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 ENC_MEAN");
526  if (qfitsString == NULL)
527  fprintf (midiQcLogPtr, "COU.AO1.ENC_MEAN %s \n", emptyString);
528  else {cleanUpString (qfitsString, cleanString);
529  fprintf (midiQcLogPtr, "COU.AO1.ENC_MEAN %s \n", cleanString);}
530 
531  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 ENC_MEAN");
532  if (qfitsString == NULL)
533  fprintf (midiQcLogPtr, "COU.AO2.ENC_MEAN %s \n", emptyString);
534  else {cleanUpString (qfitsString, cleanString);
535  fprintf (midiQcLogPtr, "COU.AO2.ENC_MEAN %s \n", cleanString);}
536 
537  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 ENC_RMS");
538  if (qfitsString == NULL)
539  fprintf (midiQcLogPtr, "COU.AO1.ENC_RMS %s \n", emptyString);
540  else {cleanUpString (qfitsString, cleanString);
541  fprintf (midiQcLogPtr, "COU.AO1.ENC_RMS %s \n", cleanString);}
542 
543  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 ENC_RMS");
544  if (qfitsString == NULL)
545  fprintf (midiQcLogPtr, "COU.AO2.ENC_RMS %s \n", emptyString);
546  else {cleanUpString (qfitsString, cleanString);
547  fprintf (midiQcLogPtr, "COU.AO2.ENC_RMS %s \n", cleanString);}
548 
549  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 FWHM_MEAN");
550  if (qfitsString == NULL)
551  fprintf (midiQcLogPtr, "COU.AO1.FWHM_MEAN %s \n", emptyString);
552  else {cleanUpString (qfitsString, cleanString);
553  fprintf (midiQcLogPtr, "COU.AO1.FWHM_MEAN %s \n", cleanString);}
554 
555  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 FWHM_MEAN");
556  if (qfitsString == NULL)
557  fprintf (midiQcLogPtr, "COU.AO2.FWHM_MEAN %s \n", emptyString);
558  else {cleanUpString (qfitsString, cleanString);
559  fprintf (midiQcLogPtr, "COU.AO2.FWHM_MEAN %s \n", cleanString);}
560 
561  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 FWHM_RMS");
562  if (qfitsString == NULL)
563  fprintf (midiQcLogPtr, "COU.AO1.FWHM_RMS %s \n", emptyString);
564  else {cleanUpString (qfitsString, cleanString);
565  fprintf (midiQcLogPtr, "COU.AO1.FWHM_RMS %s \n", cleanString);}
566 
567  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 FWHM_RMS");
568  if (qfitsString == NULL)
569  fprintf (midiQcLogPtr, "COU.AO2.FWHM_RMS %s \n", emptyString);
570  else {cleanUpString (qfitsString, cleanString);
571  fprintf (midiQcLogPtr, "COU.AO2.FWHM_RMS %s \n", cleanString);}
572 
573  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 L0_MEAN");
574  if (qfitsString == NULL)
575  fprintf (midiQcLogPtr, "COU.AO1.L0_MEAN %s \n", emptyString);
576  else {cleanUpString (qfitsString, cleanString);
577  fprintf (midiQcLogPtr, "COU.AO1.L0_MEAN %s \n", cleanString);}
578 
579  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 L0_MEAN");
580  if (qfitsString == NULL)
581  fprintf (midiQcLogPtr, "COU.AO2.L0_MEAN %s \n", emptyString);
582  else {cleanUpString (qfitsString, cleanString);
583  fprintf (midiQcLogPtr, "COU.AO2.L0_MEAN %s \n", cleanString);}
584 
585  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 L0_RMS");
586  if (qfitsString == NULL)
587  fprintf (midiQcLogPtr, "COU.AO1.L0_RMS %s \n", emptyString);
588  else {cleanUpString (qfitsString, cleanString);
589  fprintf (midiQcLogPtr, "COU.AO1.L0_RMS %s \n", cleanString);}
590 
591  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 L0_RMS");
592  if (qfitsString == NULL)
593  fprintf (midiQcLogPtr, "COU.AO2.L0_RMS %s \n", emptyString);
594  else {cleanUpString (qfitsString, cleanString);
595  fprintf (midiQcLogPtr, "COU.AO2.L0_RMS %s \n", cleanString);}
596 
597  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 R0_MEAN");
598  if (qfitsString == NULL)
599  fprintf (midiQcLogPtr, "COU.AO1.R0_MEAN %s \n", emptyString);
600  else {cleanUpString (qfitsString, cleanString);
601  fprintf (midiQcLogPtr, "COU.AO1.R0_MEAN %s \n", cleanString);}
602 
603  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 R0_MEAN");
604  if (qfitsString == NULL)
605  fprintf (midiQcLogPtr, "COU.AO2.R0_MEAN %s \n", emptyString);
606  else {cleanUpString (qfitsString, cleanString);
607  fprintf (midiQcLogPtr, "COU.AO2.R0_MEAN %s \n", cleanString);}
608 
609  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 R0_RMS");
610  if (qfitsString == NULL)
611  fprintf (midiQcLogPtr, "COU.AO1.R0_RMS %s \n", emptyString);
612  else {cleanUpString (qfitsString, cleanString);
613  fprintf (midiQcLogPtr, "COU.AO1.R0_RMS %s \n", cleanString);}
614 
615  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 R0_RMS");
616  if (qfitsString == NULL)
617  fprintf (midiQcLogPtr, "COU.AO2.R0_RMS %s \n", emptyString);
618  else {cleanUpString (qfitsString, cleanString);
619  fprintf (midiQcLogPtr, "COU.AO2.R0_RMS %s \n", cleanString);}
620 
621  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 T0_MEAN");
622  if (qfitsString == NULL)
623  fprintf (midiQcLogPtr, "COU.AO1.T0_MEAN %s \n", emptyString);
624  else {cleanUpString (qfitsString, cleanString);
625  fprintf (midiQcLogPtr, "COU.AO1.T0_MEAN %s \n", cleanString);}
626 
627  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 T0_MEAN");
628  if (qfitsString == NULL)
629  fprintf (midiQcLogPtr, "COU.AO2.T0_MEAN %s \n", emptyString);
630  else {cleanUpString (qfitsString, cleanString);
631  fprintf (midiQcLogPtr, "COU.AO2.T0_MEAN %s \n", cleanString);}
632 
633  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO1 T0_RMS");
634  if (qfitsString == NULL)
635  fprintf (midiQcLogPtr, "COU.AO1.T0_RMS %s \n", emptyString);
636  else {cleanUpString (qfitsString, cleanString);
637  fprintf (midiQcLogPtr, "COU.AO1.T0_RMS %s \n", cleanString);}
638 
639  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO COU AO2 T0_RMS");
640  if (qfitsString == NULL)
641  fprintf (midiQcLogPtr, "COU.AO2.T0_RMS %s \n", emptyString);
642  else {cleanUpString (qfitsString, cleanString);
643  fprintf (midiQcLogPtr, "COU.AO2.T0_RMS %s \n", cleanString);}
644 
645  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET CHIP NX");
646  if (qfitsString == NULL)
647  fprintf (midiQcLogPtr, "DET.CHIP.NX %s \n", emptyString);
648  else {cleanUpString (qfitsString, cleanString);
649  fprintf (midiQcLogPtr, "DET.CHIP.NX %s \n", cleanString);}
650 
651  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET CHIP NY");
652  if (qfitsString == NULL)
653  fprintf (midiQcLogPtr, "DET.CHIP.NY %s \n", emptyString);
654  else {cleanUpString (qfitsString, cleanString);
655  fprintf (midiQcLogPtr, "DET.CHIP.NY %s \n", cleanString);}
656 
657  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET DIT");
658  if (qfitsString == NULL)
659  fprintf (midiQcLogPtr, "DET.DIT %s \n", emptyString);
660  else {cleanUpString (qfitsString, cleanString);
661  fprintf (midiQcLogPtr, "DET.DIT %s \n", cleanString);}
662 
663  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET DITDELAY");
664  if (qfitsString == NULL)
665  fprintf (midiQcLogPtr, "DET.DITDELAY %s \n", emptyString);
666  else {cleanUpString (qfitsString, cleanString);
667  fprintf (midiQcLogPtr, "DET.DITDELAY %s \n", cleanString);}
668 
669  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET INT MODE");
670  if (qfitsString == NULL)
671  fprintf (midiQcLogPtr, "DET.INT.MODE %s \n", emptyString);
672  else {cleanUpString (qfitsString, cleanString);
673  fprintf (midiQcLogPtr, "DET.INT.MODE \"%s\" \n", cleanString);}
674 
675  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET NDIT");
676  if (qfitsString == NULL)
677  fprintf (midiQcLogPtr, "DET.NDIT %s \n", emptyString);
678  else {cleanUpString (qfitsString, cleanString);
679  fprintf (midiQcLogPtr, "DET.NDIT %s \n", cleanString);}
680 
681  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET NRTS MODE");
682  if (qfitsString == NULL)
683  fprintf (midiQcLogPtr, "DET.NRTS.MODE %s \n", emptyString);
684  else {cleanUpString (qfitsString, cleanString);
685  fprintf (midiQcLogPtr, "DET.NRTS.MODE \"%s\" \n", cleanString);}
686 
687  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN1 NX");
688  if (qfitsString == NULL)
689  fprintf (midiQcLogPtr, "DET.WIN1.NX %s \n", emptyString);
690  else {cleanUpString (qfitsString, cleanString);
691  fprintf (midiQcLogPtr, "DET.WIN1.NX %s \n", cleanString);}
692 
693  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN1 NY");
694  if (qfitsString == NULL)
695  fprintf (midiQcLogPtr, "DET.WIN1.NY %s \n", emptyString);
696  else {cleanUpString (qfitsString, cleanString);
697  fprintf (midiQcLogPtr, "DET.WIN1.NY %s \n", cleanString);}
698 
699  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN2 NX");
700  if (qfitsString == NULL)
701  fprintf (midiQcLogPtr, "DET.WIN2.NX %s \n", emptyString);
702  else {cleanUpString (qfitsString, cleanString);
703  fprintf (midiQcLogPtr, "DET.WIN2.NX %s \n", cleanString);}
704 
705  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN2 NY");
706  if (qfitsString == NULL)
707  fprintf (midiQcLogPtr, "DET.WIN2.NY %s \n", emptyString);
708  else {cleanUpString (qfitsString, cleanString);
709  fprintf (midiQcLogPtr, "DET.WIN2.NY %s \n", cleanString);}
710 
711  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR CATG");
712  if (qfitsString == NULL)
713  fprintf (midiQcLogPtr, "DPR.CATG %s \n", emptyString);
714  else {cleanUpString (qfitsString, cleanString);
715  fprintf (midiQcLogPtr, "DPR.CATG \"%s\" \n", cleanString);}
716 
717  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR TECH");
718  if (qfitsString == NULL)
719  fprintf (midiQcLogPtr, "DPR.TECH %s \n", emptyString);
720  else {cleanUpString (qfitsString, cleanString);
721  fprintf (midiQcLogPtr, "DPR.TECH \"%s\" \n", cleanString);}
722 
723  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR TYPE");
724  if (qfitsString == NULL)
725  fprintf (midiQcLogPtr, "DPR.TYPE %s \n", emptyString);
726  else {cleanUpString (qfitsString, cleanString);
727  fprintf (midiQcLogPtr, "DPR.TYPE \"%s\" \n", cleanString);}
728 
729  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS CAM NAME");
730  if (qfitsString == NULL)
731  fprintf (midiQcLogPtr, "INS.CAM.NAME %s \n", emptyString);
732  else {cleanUpString (qfitsString, cleanString);
733  fprintf (midiQcLogPtr, "INS.CAM.NAME \"%s\" \n", cleanString);}
734 
735  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS FILT NAME");
736  if (qfitsString == NULL)
737  fprintf (midiQcLogPtr, "INS.FILT.NAME %s \n", emptyString);
738  else {cleanUpString (qfitsString, cleanString);
739  fprintf (midiQcLogPtr, "INS.FILT.NAME \"%s\" \n", cleanString);}
740 
741  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS GRIS NAME");
742  if (qfitsString == NULL)
743  fprintf (midiQcLogPtr, "INS.GRIS.NAME %s \n", emptyString);
744  else {cleanUpString (qfitsString, cleanString);
745  fprintf (midiQcLogPtr, "INS.GRIS.NAME \"%s\" \n", cleanString);}
746 
747  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS MODE");
748  if (qfitsString == NULL)
749  fprintf (midiQcLogPtr, "INS.MODE %s \n", emptyString);
750  else {cleanUpString (qfitsString, cleanString);
751  fprintf (midiQcLogPtr, "INS.MODE \"%s\" \n", cleanString);}
752 
753  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS OPT1 NAME");
754  if (qfitsString == NULL)
755  fprintf (midiQcLogPtr, "INS.OPT1.NAME %s \n", emptyString);
756  else {cleanUpString (qfitsString, cleanString);
757  fprintf (midiQcLogPtr, "INS.OPT1.NAME \"%s\" \n", cleanString);}
758 
759  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS OPT1 TYPE");
760  if (qfitsString == NULL)
761  fprintf (midiQcLogPtr, "INS.OPT1.TYPE %s \n", emptyString);
762  else {cleanUpString (qfitsString, cleanString);
763  fprintf (midiQcLogPtr, "INS.OPT1.TYPE \"%s\" \n", cleanString);}
764 
765  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS SHUT NAME");
766  if (qfitsString == NULL)
767  fprintf (midiQcLogPtr, "INS.SHUT.NAME %s \n", emptyString);
768  else {cleanUpString (qfitsString, cleanString);
769  fprintf (midiQcLogPtr, "INS.SHUT.NAME \"%s\" \n", cleanString);}
770 
771  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS SLIT NAME");
772  if (qfitsString == NULL)
773  fprintf (midiQcLogPtr, "INS.SLIT.NAME %s \n", emptyString);
774  else {cleanUpString (qfitsString, cleanString);
775  fprintf (midiQcLogPtr, "INS.SLIT.NAME \"%s\" \n", cleanString);}
776 
777  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AIRM END");
778  if (qfitsString == NULL)
779  fprintf (midiQcLogPtr, "ISS.AIRM.END %s \n", emptyString);
780  else {cleanUpString (qfitsString, cleanString);
781  fprintf (midiQcLogPtr, "ISS.AIRM.END %s \n", cleanString);}
782 
783  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AIRM START");
784  if (qfitsString == NULL)
785  fprintf (midiQcLogPtr, "ISS.AIRM.START %s \n", emptyString);
786  else {cleanUpString (qfitsString, cleanString);
787  fprintf (midiQcLogPtr, "ISS.AIRM.START %s \n", cleanString);}
788 
789  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS ALT");
790  if (qfitsString == NULL)
791  fprintf (midiQcLogPtr, "ISS.ALT %s \n", emptyString);
792  else {cleanUpString (qfitsString, cleanString);
793  fprintf (midiQcLogPtr, "ISS.ALT %s \n", cleanString);}
794 
795  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AMBI FWHM END");
796  if (qfitsString == NULL)
797  fprintf (midiQcLogPtr, "ISS.AMBI.FWHM.END %s \n", emptyString);
798  else {cleanUpString (qfitsString, cleanString);
799  fprintf (midiQcLogPtr, "ISS.AMBI.FWHM.END %s \n", cleanString);}
800 
801  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AMBI FWHM START");
802  if (qfitsString == NULL)
803  fprintf (midiQcLogPtr, "ISS.AMBI.FWHM.START %s \n", emptyString);
804  else {cleanUpString (qfitsString, cleanString);
805  fprintf (midiQcLogPtr, "ISS.AMBI.FWHM.START %s \n", cleanString);}
806 
807  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AMBI PRES");
808  if (qfitsString == NULL)
809  fprintf (midiQcLogPtr, "ISS.AMBI.PRES %s \n", emptyString);
810  else {cleanUpString (qfitsString, cleanString);
811  fprintf (midiQcLogPtr, "ISS.AMBI.PRES %s \n", cleanString);}
812 
813  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AMBI RHUM");
814  if (qfitsString == NULL)
815  fprintf (midiQcLogPtr, "ISS.AMBI.RHUM %s \n", emptyString);
816  else {cleanUpString (qfitsString, cleanString);
817  fprintf (midiQcLogPtr, "ISS.AMBI.RHUM %s \n", cleanString);}
818 
819  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AMBI TAU0 END");
820  if (qfitsString == NULL)
821  fprintf (midiQcLogPtr, "ISS.AMBI.TAU0.END %s \n", emptyString);
822  else {cleanUpString (qfitsString, cleanString);
823  fprintf (midiQcLogPtr, "ISS.AMBI.TAU0.END %s \n", cleanString);}
824 
825  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AMBI TAU0 START");
826  if (qfitsString == NULL)
827  fprintf (midiQcLogPtr, "ISS.AMBI.TAU0.START %s \n", emptyString);
828  else {cleanUpString (qfitsString, cleanString);
829  fprintf (midiQcLogPtr, "ISS.AMBI.TAU0.START %s \n", cleanString);}
830 
831  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AMBI TEMP");
832  if (qfitsString == NULL)
833  fprintf (midiQcLogPtr, "ISS.AMBI.TEMP %s \n", emptyString);
834  else {cleanUpString (qfitsString, cleanString);
835  fprintf (midiQcLogPtr, "ISS.AMBI.TEMP %s \n", cleanString);}
836 
837  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AMBI WINDDIR");
838  if (qfitsString == NULL)
839  fprintf (midiQcLogPtr, "ISS.AMBI.WINDDIR %s \n", emptyString);
840  else {cleanUpString (qfitsString, cleanString);
841  fprintf (midiQcLogPtr, "ISS.AMBI.WINDDIR %s \n", cleanString);}
842 
843  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AMBI WINDSP");
844  if (qfitsString == NULL)
845  fprintf (midiQcLogPtr, "ISS.AMBI.WINDSP %s \n", emptyString);
846  else {cleanUpString (qfitsString, cleanString);
847  fprintf (midiQcLogPtr, "ISS.AMBI.WINDSP %s \n", cleanString);}
848 
849  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS AZ");
850  if (qfitsString == NULL)
851  fprintf (midiQcLogPtr, "ISS.AZ %s \n", emptyString);
852  else {cleanUpString (qfitsString, cleanString);
853  fprintf (midiQcLogPtr, "ISS.AZ %s \n", cleanString);}
854 
855  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS CONF STATION1");
856  if (qfitsString == NULL)
857  fprintf (midiQcLogPtr, "ISS.CONF.STATION1 %s \n", emptyString);
858  else {cleanUpString (qfitsString, cleanString);
859  fprintf (midiQcLogPtr, "ISS.CONF.STATION1 \"%s\" \n", cleanString);}
860 
861  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS CONF STATION2");
862  if (qfitsString == NULL)
863  fprintf (midiQcLogPtr, "ISS.CONF.STATION2 %s \n", emptyString);
864  else {cleanUpString (qfitsString, cleanString);
865  fprintf (midiQcLogPtr, "ISS.CONF.STATION2 \"%s\" \n", cleanString);}
866 
867  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS CONF T1X");
868  if (qfitsString == NULL)
869  fprintf (midiQcLogPtr, "ISS.CONF.T1X %s \n", emptyString);
870  else {cleanUpString (qfitsString, cleanString);
871  fprintf (midiQcLogPtr, "ISS.CONF.T1X %s \n", cleanString);}
872 
873  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS CONF T1Y");
874  if (qfitsString == NULL)
875  fprintf (midiQcLogPtr, "ISS.CONF.T1Y %s \n", emptyString);
876  else {cleanUpString (qfitsString, cleanString);
877  fprintf (midiQcLogPtr, "ISS.CONF.T1Y %s \n", cleanString);}
878 
879  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS CONF T1Z");
880  if (qfitsString == NULL)
881  fprintf (midiQcLogPtr, "ISS.CONF.T1Z %s \n", emptyString);
882  else {cleanUpString (qfitsString, cleanString);
883  fprintf (midiQcLogPtr, "ISS.CONF.T1Z %s \n", cleanString);}
884 
885  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS CONF T2X");
886  if (qfitsString == NULL)
887  fprintf (midiQcLogPtr, "ISS.CONF.T2X %s \n", emptyString);
888  else {cleanUpString (qfitsString, cleanString);
889  fprintf (midiQcLogPtr, "ISS.CONF.T2X %s \n", cleanString);}
890 
891  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS CONF T2Y");
892  if (qfitsString == NULL)
893  fprintf (midiQcLogPtr, "ISS.CONF.T2Y %s \n", emptyString);
894  else {cleanUpString (qfitsString, cleanString);
895  fprintf (midiQcLogPtr, "ISS.CONF.T2Y %s \n", cleanString);}
896 
897  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS CONF T2Z");
898  if (qfitsString == NULL)
899  fprintf (midiQcLogPtr, "ISS.CONF.T2Z %s \n", emptyString);
900  else {cleanUpString (qfitsString, cleanString);
901  fprintf (midiQcLogPtr, "ISS.CONF.T2Z %s \n", cleanString);}
902 
903  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS PARANG END");
904  if (qfitsString == NULL)
905  fprintf (midiQcLogPtr, "ISS.PARANG.END %s \n", emptyString);
906  else {cleanUpString (qfitsString, cleanString);
907  fprintf (midiQcLogPtr, "ISS.PARANG.END %s \n", cleanString);}
908 
909  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS PARANG START");
910  if (qfitsString == NULL)
911  fprintf (midiQcLogPtr, "ISS.PARANG.START %s \n", emptyString);
912  else {cleanUpString (qfitsString, cleanString);
913  fprintf (midiQcLogPtr, "ISS.PARANG.START %s \n", cleanString);}
914 
915  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS PBL12 END");
916  if (qfitsString == NULL)
917  fprintf (midiQcLogPtr, "ISS.PBL12.END %s \n", emptyString);
918  else {cleanUpString (qfitsString, cleanString);
919  fprintf (midiQcLogPtr, "ISS.PBL12.END %s \n", cleanString);}
920 
921  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO ISS PBL12 START");
922  if (qfitsString == NULL)
923  fprintf (midiQcLogPtr, "ISS.PBL12.START %s \n", emptyString);
924  else {cleanUpString (qfitsString, cleanString);
925  fprintf (midiQcLogPtr, "ISS.PBL12.START %s \n", cleanString);}
926 
927  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS ID");
928  if (qfitsString == NULL)
929  fprintf (midiQcLogPtr, "OBS.ID %s \n", emptyString);
930  else {cleanUpString (qfitsString, cleanString);
931  fprintf (midiQcLogPtr, "OBS.ID \"%s\" \n", cleanString);}
932 
933  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS NAME");
934  if (qfitsString == NULL)
935  fprintf (midiQcLogPtr, "OBS.NAME %s \n", emptyString);
936  else {cleanUpString (qfitsString, cleanString);
937  fprintf (midiQcLogPtr, "OBS.NAME \"%s\" \n", cleanString);}
938 
939  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PI-COI ID");
940  if (qfitsString == NULL)
941  fprintf (midiQcLogPtr, "OBS.PI-COI.ID %s \n", emptyString);
942  else {cleanUpString (qfitsString, cleanString);
943  fprintf (midiQcLogPtr, "OBS.PI-COI.ID \"%s\" \n", cleanString);}
944 
945  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PI-COI NAME");
946  if (qfitsString == NULL)
947  fprintf (midiQcLogPtr, "OBS.PI-COI.NAME %s \n", emptyString);
948  else {cleanUpString (qfitsString, cleanString);
949  fprintf (midiQcLogPtr, "OBS.PI-COI.NAME \"%s\" \n", cleanString);}
950 
951  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PROG ID");
952  if (qfitsString == NULL)
953  fprintf (midiQcLogPtr, "OBS.PROG.ID %s \n", emptyString);
954  else {cleanUpString (qfitsString, cleanString);
955  fprintf (midiQcLogPtr, "OBS.PROG.ID \"%s\" \n", cleanString);}
956 
957  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS START");
958  if (qfitsString == NULL)
959  fprintf (midiQcLogPtr, "OBS.START %s \n", emptyString);
960  else {cleanUpString (qfitsString, cleanString);
961  fprintf (midiQcLogPtr, "OBS.START \"%s\" \n", cleanString);}
962 
963  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS TARG NAME");
964  if (qfitsString == NULL)
965  fprintf (midiQcLogPtr, "OBS.TARG.NAME %s \n", emptyString);
966  else {cleanUpString (qfitsString, cleanString);
967  fprintf (midiQcLogPtr, "OBS.TARG.NAME \"%s\" \n", cleanString);}
968 
969  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OCS EXPO1 FNAME1");
970  if (qfitsString == NULL)
971  fprintf (midiQcLogPtr, "OCS.EXPO1.FNAME1 %s \n", emptyString);
972  else {cleanUpString (qfitsString, cleanString);
973  fprintf (midiQcLogPtr, "OCS.EXPO1.FNAME1 \"%s\" \n", cleanString);}
974 
975  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO TPL ID");
976  if (qfitsString == NULL)
977  fprintf (midiQcLogPtr, "TPL.ID %s \n", emptyString);
978  else {cleanUpString (qfitsString, cleanString);
979  fprintf (midiQcLogPtr, "TPL.ID \"%s\" \n", cleanString);}
980 
981  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO TPL START");
982  if (qfitsString == NULL)
983  fprintf (midiQcLogPtr, "TPL.START %s \n", emptyString);
984  else {cleanUpString (qfitsString, cleanString);
985  fprintf (midiQcLogPtr, "TPL.START \"%s\" \n", cleanString);}
986 
987 
988  /* Release memory */
989  free (emptyString);
990  free (cleanString);
991 
992  return;
993 }
994 /*****************************************************************************/
995 
996 
997 /******************************************************************************
998 * European Southern Observatory
999 * VLTI MIDI Data Reduction Software
1000 *
1001 * Module name: addProdInfoToKappaQcLog
1002 * Input/Output: See function arguments to avoid duplication
1003 * Description: Adds product information to QC log
1004 *
1005 *
1006 * History:
1007 * 08-Dec-05 (csabet) Created
1008 ******************************************************************************/
1009 void addProdInfoToKappaQcLog (
1010  ImageFormat *format, // In: Image format
1011  MidiFiles *fileNames,
1012  TransferRatios *trRatios, // In: Transfer Ratios
1013  int *error)
1014 {
1015 
1016  /* Local Declarations
1017  --------------------*/
1018  const char routine[] = "addProdInfoToKappaQcLog";
1019  int i;
1020  FILE *inFitsBatchPtr;
1021  char *stringQfits, *messageBuffer, *currentTime, *textBuff, *cleanString,
1022  *stringTemp, *classification;
1023  time_t now;
1024  struct tm *newTime;
1025 
1026  /* Algorithm
1027  -----------*/
1028  if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
1029  if (diagnostic > 4) fprintf (midiReportPtr, "Invoking routine '%s' \n", routine);
1030 
1031  /* Reset parameters */
1032  *error = 0;
1033 
1034  /* Allocate memory */
1035  classification = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
1036  stringTemp = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
1037  cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
1038  textBuff = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
1039  messageBuffer = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
1040  currentTime = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
1041 
1042  /* Get current time/date */
1043  now = time(NULL);
1044  newTime = gmtime (&now);
1045  strftime (currentTime, MIN_STRING_LENGTH, "%a %d %b %Y at %H:%M:%S", newTime);
1046 
1047  // Add keyword to QC log file
1048  fprintf (midiQcLogPtr, "PRO.TYPE \"%s\" \n", format->obsType);
1049  fprintf (midiQcLogPtr, "PRO.CATG \"KAPPA_MATRIX\" \n");
1050  fprintf (midiQcLogPtr, "PRO.ARCFILE \"%s\" \n", fileNames->archFileName);
1051  fprintf (midiQcLogPtr, "PRO.PIPEDATE \"%s\" \n", currentTime);
1052  fprintf (midiQcLogPtr, "PRO.VERSION \"%s\" \n", MIDI_PIPE_VERSION);
1053  fprintf (midiQcLogPtr, "PRO.PIPEFILE \"%s\" \n", fileNames->pipeFileName);
1054  fprintf (midiQcLogPtr, "PRO.DID \"%s\" \n", MIDI_QC_DIC_VERSION);
1055 
1056  /* Open the list of files */
1057  if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch, "r")) == NULL)
1058  {
1059  *error = 1;
1060  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open input FITS file list");
1061  free (messageBuffer);
1062  free (currentTime);
1063  free (cleanString);
1064  free (stringTemp);
1065  free (classification);
1066  free (textBuff);
1067  return;
1068  }
1069 
1070  fprintf (midiQcLogPtr, "QC.KAPPA_EXISTS %d \n", trRatios->exists);
1071  if (trRatios->exists)
1072  {
1073  for (i = 0; i < format->iXWidth; i++)
1074  {
1075  if (badChannelList[i])
1076  {
1077  fprintf (midiQcLogPtr, "QC.KA1.CH%d %s \n", i, UNAV);
1078  fprintf (midiQcLogPtr, "QC.SIGA1.CH%d %s \n", i, UNAV);
1079  fprintf (midiQcLogPtr, "QC.KA2.CH%d %s \n", i, UNAV);
1080  fprintf (midiQcLogPtr, "QC.SIGA2.CH%d %s \n", i, UNAV);
1081  fprintf (midiQcLogPtr, "QC.KB1.CH%d %s \n", i, UNAV);
1082  fprintf (midiQcLogPtr, "QC.SIGB1.CH%d %s \n", i, UNAV);
1083  fprintf (midiQcLogPtr, "QC.KB2.CH%d %s \n", i, UNAV);
1084  fprintf (midiQcLogPtr, "QC.SIGB2.CH%d %s \n", i, UNAV);
1085  }
1086  else
1087  {
1088  fprintf (midiQcLogPtr, "QC.KA1.CH%d %f \n", i, trRatios->ka1[i]);
1089  fprintf (midiQcLogPtr, "QC.SIGA1.CH%d %f \n", i, trRatios->siga1[i]);
1090  fprintf (midiQcLogPtr, "QC.KA2.CH%d %f \n", i, trRatios->ka2[i]);
1091  fprintf (midiQcLogPtr, "QC.SIGA2.CH%d %f \n", i, trRatios->siga2[i]);
1092  fprintf (midiQcLogPtr, "QC.KB1.CH%d %f \n", i, trRatios->kb1[i]);
1093  fprintf (midiQcLogPtr, "QC.SIGB1.CH%d %f \n", i, trRatios->sigb1[i]);
1094  fprintf (midiQcLogPtr, "QC.KB2.CH%d %f \n", i, trRatios->kb2[i]);
1095  fprintf (midiQcLogPtr, "QC.SIGB2.CH%d %f \n", i, trRatios->sigb2[i]);
1096  }
1097  }
1098  }
1099 
1100  /* Loop through the list of files and write into the QC log */
1101  i = 1;
1102  while (fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
1103  {
1104  sprintf (classification, "%s", "");
1105  sscanf (stringTemp, "%s%s", messageBuffer, classification);
1106 
1107  /* If classification is not given get it from the raw file */
1108  if (strcmp (classification, "") == 0)
1109  {
1110  stringQfits = qfits_query_hdr (messageBuffer, "HIERARCH ESO DPR CATG");
1111  if (stringQfits == NULL)
1112  {
1113  sprintf (classification, "%s", "UNKNOWN");
1114  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get Observation Category");
1115  }
1116  else
1117  {
1118  cleanUpString (stringQfits, cleanString);
1119  sprintf (classification, "%s", cleanString);
1120  }
1121  }
1122  removePathName (messageBuffer, midiReportPtr);
1123  fprintf (midiQcLogPtr, "PRO.REC1.RAW%d.NAME \"%s\" \n", i, messageBuffer);
1124  fprintf (midiQcLogPtr, "PRO.REC1.RAW%d.CATG \"%s\" \n", i++, classification);
1125  }
1126  fclose (inFitsBatchPtr);
1127 
1128  /* release memory */
1129  free (messageBuffer);
1130  free (currentTime);
1131  free (textBuff);
1132  free (cleanString);
1133  free (stringTemp);
1134  free (classification);
1135 
1136  return;
1137 }
1138 /*****************************************************************************/
1139 
1140 
1141 /******************************************************************************
1142 * European Southern Observatory
1143 * VLTI MIDI Data Reduction Software
1144 *
1145 * Module name: createTransferRatiosFile
1146 * Input/Output: See function arguments to avoid duplication
1147 * Description: Creates a file for the transfer Matrix in the current directory
1148 * If update = 2, this process also creates or updates the
1149 * database
1150 *
1151 * History:
1152 * 07-Dec-05 (csabet) Created
1153 ******************************************************************************/
1154 void createTransferRatiosFile (
1155  int update, // In: Indicates local or database
1156  ImageFormat *format, // In: Image format
1157  MidiFiles *fileNames, // In: Pointer to midi files structure
1158  TransferRatios *trRatios, // In: Transfer Ratios
1159  int *error) // Ou: Status
1160 {
1161 
1162  // Local Declarations
1163  // ------------------
1164  const char routine[] = "createTransferRatiosFile";
1165  FILE *trrPtr=NULL, *trrHistoryPtr=NULL;
1166  char *fileString;
1167  int x;
1168  struct stat buf;
1169 
1170  // Algorithm
1171  // ---------
1172  if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
1173  if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
1174 
1175  // Reset status
1176  *error = 0;
1177 
1178  if (!(trRatios->exists))
1179  {
1180  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot create Transfer Ratios file");
1181  *error = 1;
1182  return;
1183  }
1184 
1185  // Check if transfer matrix file exist. If so delete it
1186  if (stat (fileNames->trrNameWrite, &buf) == 0)
1187  remove (fileNames->trrNameWrite);
1188 
1189  // Open the transfer matrix file for writing
1190  if ((trrPtr = fopen (fileNames->trrNameWrite, "w")) == NULL)
1191  {
1192  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open file to store transfer matrix");
1193  *error = 1;
1194  return;
1195  }
1196 
1197  // Open a file for Transfer Ratios history
1198  trrHistoryPtr = fopen (fileNames->trrHistoryName, "a");
1199  fprintf (trrHistoryPtr, "Transfer Ratios for batch %d \n", batchNumber);
1200  fprintf (trrHistoryPtr, "------------------------- \n");
1201  fprintf (trrHistoryPtr, "Channel ka1 siga1 ka2 siga2 kb1 sigb1 kb2 sigb2 \n");
1202 
1203  // Record the number of channels
1204  fprintf (trrPtr, "%d \n", format->iXWidth);
1205  for (x = 0; x < format->iXWidth; x++)
1206  {
1207  fprintf (trrPtr, "%f %f %f %f %f %f %f %f \n", trRatios->ka1[x], trRatios->siga1[x],
1208  trRatios->ka2[x], trRatios->siga2[x], trRatios->kb1[x], trRatios->sigb1[x],
1209  trRatios->kb2[x], trRatios->sigb2[x]);
1210  fprintf (trrHistoryPtr, "%3d %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f \n", x,
1211  trRatios->ka1[x], trRatios->siga1[x], trRatios->ka2[x], trRatios->siga2[x],
1212  trRatios->kb1[x], trRatios->sigb1[x], trRatios->kb2[x], trRatios->sigb2[x]);
1213  }
1214 
1215  fclose (trrPtr);
1216  fclose (trrHistoryPtr);
1217  cpl_msg_info(cpl_func,"Created Transfer Ratios file %s\n", fileNames->trrNameWrite);
1218  fprintf (midiReportPtr, "Created Transfer Ratios file %s\n", fileNames->trrNameWrite);
1219 
1220  // If update = 2, create or update the static database
1221  if (update == 2)
1222  {
1223  // Open the transfer matrix file for writing
1224  fileString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
1225  sprintf (fileString , "%s_%s.dat", fileNames->transferRatiosName, format->grismId);
1226  if ((trrPtr = fopen (fileString, "w")) == NULL)
1227  {
1228  sprintf (midiMessage, "Cannot open Transfer Ratios database file %s", fileString);
1229  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
1230  *error = 1;
1231  free (fileString);
1232  return;
1233  }
1234 
1235  // Record the number of channels
1236  fprintf (trrPtr, "%d \n", format->iXWidth);
1237  for (x = 0; x < format->iXWidth; x++)
1238  {
1239  fprintf (trrPtr, "%f %f %f %f %f %f %f %f \n", trRatios->ka1[x], trRatios->siga1[x],
1240  trRatios->ka2[x], trRatios->siga2[x], trRatios->kb1[x], trRatios->sigb1[x],
1241  trRatios->kb2[x], trRatios->sigb2[x]);
1242  }
1243 
1244  cpl_msg_info(cpl_func,"Updated Transfer Ratios database \n");
1245  fprintf (midiReportPtr, "Updated Transfer Ratios database \n");
1246  fclose (trrPtr);
1247  free (fileString);
1248  }
1249 
1250  return;
1251 }
1252 /*****************************************************************************/
1253