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