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