MIDI Pipeline Reference Manual  2.8.3
createProdDetRon.c
1 
2 /******************************************************************************
3 *******************************************************************************
4 * European Southern Observatory
5 * VLTI MIDI Maintenance Templates Software
6 *
7 * Module name: createProdDetRon.c
8 * Description: Contains routines for the 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 "fileHandling.h"
31 #include "createProdDetRon.h"
32 #include "qfits.h"
33 
34 /**********************************************************
35 * Global Variables
36 **********************************************************/
37 
38 /*============================ C O D E A R E A ===========================*/
39 
40 
41 
42 /******************************************************************************
43 * European Southern Observatory
44 * VLTI MIDI Maintenance Templates Software
45 *
46 * Module name: createDetRonProd
47 * Input/Output: See function arguments to avoid duplication
48 * Description: Creates MIDI product files
49 *
50 * History:
51 * 15-Jun-04 (csabet) Created
52 ******************************************************************************/
53 void createDetRonProd (
54  MidiFiles *fileNames, // In: Pointer to the file structure
55  ImageFormat *size, // In: Pointer to the image format structure
56  DetRonNoise *noise, // In: Pointer to the noise data structure
57  int *error) // Ou: Error status
58 {
59 
60  // Local Declarations
61  // ------------------
62  const char routine[] = "createDetRonProd";
63  qfitsdumper qdNoisePattern;
64 
65  // Algorithm
66  // ---------
67  if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
68  if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
69 
70  cpl_msg_info(cpl_func,"\nCreating Product files for DET_RON from batch %d \n", batchNumber);
71  cpl_msg_info(cpl_func,"--------------------------------------------- \n");
72  fprintf (midiReportPtr, "\nCreating Product files for DET_RON from batch %d \n", batchNumber);
73  fprintf (midiReportPtr, "--------------------------------------------- \n");
74 
75  // Reset parameters
76  *error = 0;
77 
78  // Create the primary header extension
79  createDetRonPrimHead (fileNames, size, noise, error);
80  if (*error)
81  {
82  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot create Primary Header extension");
83  return;
84  }
85 
86  // Dumps data into the Detector Readout Noise file
87  qdNoisePattern.filename = fileNames->outFitsName;
88  qdNoisePattern.npix = size->iXWidth * size->iYWidth;
89  qdNoisePattern.ptype = PTYPE_FLOAT;
90  qdNoisePattern.fbuf = noise->pattern;
91  qdNoisePattern.out_ptype = BPP_IEEE_FLOAT;
92 
93  qfits_pixdump (&qdNoisePattern);
94 
95  // Copy keywords from the raw FITS file into the QC log
96  createDetRonQcLog (fileNames->inFitsName, error);
97  if (*error) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot copy keywords to QC log");
98 
99  // Add output product to QC log
100  addProdInfoToDetRonQcLog (size, fileNames, noise->median, error);
101 
102  return;
103 }
104 /*****************************************************************************/
105 
106 
107 
108 /******************************************************************************
109 * European Southern Observatory
110 * VLTI MIDI Data Reduction Software
111 *
112 * Module name: createDetRonPrimHead
113 * Input/Output: See function arguments to avoid duplication
114 * Description: Creates the primary header
115 *
116 *
117 * History:
118 * 10-Mar-05 (csabet) Created
119 ******************************************************************************/
120 void createDetRonPrimHead (
121  MidiFiles *fileNames,
122  ImageFormat *size,
123  DetRonNoise *noise, // In: Pointer to the noise data structure
124  int *error)
125 {
126 
127  // Local Declarations
128  // ------------------
129  const char routine[] = "createDetRonPrimHead";
130  qfits_header *outFitsHeader;
131  FILE *inFitsBatchPtr=NULL, *outFitsPtr;
132  int i;
133  char *textBuff, *stringQfits, *messageBuffer, *currentTime, *cleanString,
134  *stringTemp, *classification, *sWidthX, *sWidthY;
135  time_t now;
136  struct tm *newTime;
137  struct stat buf;
138 
139  // Algorithm
140  // ---------
141  if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
142  if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
143 
144  // Reset parameters
145  *error = 0;
146  if (diagnostic)cpl_msg_info(cpl_func,"Creating Primary FITS Header \n");
147  fprintf (midiReportPtr, "Creating Primary FITS Header \n");
148 
149  // Open list of files
150  if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch, "r")) == NULL)
151  {
152  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open input FITS file list");
153  *error = 1;
154  return;
155  }
156 
157  // Allocate memory
158  textBuff = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
159  classification = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
160  stringTemp = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
161  cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
162  messageBuffer = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
163  currentTime = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
164  sWidthX = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
165  sWidthY = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
166 
167  // Get current time/date
168  now = time(NULL);
169  newTime = gmtime (&now);
170  strftime (currentTime, MIN_STRING_LENGTH, "%a %d %b %Y at %H:%M:%S", newTime);
171 
172  // Read the name of the first file in the list and get it's full path name
173  fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr);
174  sprintf (classification, "%s", "");
175  sscanf (stringTemp, "%s%s", fileNames->inFitsName, classification);
176 
177  // Copy primary header from the raw file to the output header
178  outFitsHeader = qfits_header_read (fileNames->inFitsName);
179  if (outFitsHeader == NULL)
180  {
181  *error = 1;
182  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot load header from the input FITS file");
183  free (messageBuffer);
184  free (currentTime);
185  free (cleanString);
186  free (stringTemp);
187  free (classification);
188  free (textBuff);
189  free (sWidthX);
190  free (sWidthY);
191  return;
192  }
193 
194  // Write all NAXIS values as character strings
195  sprintf (sWidthY, "%d", size->iYWidth);
196  sprintf (sWidthX, "%d", size->iXWidth);
197 
198  // Updates header for the DetRon output file
199  qfits_header_mod (outFitsHeader, "BITPIX", "-32", "number of bits per pixel");
200  qfits_header_mod (outFitsHeader, "NAXIS", "2", "number of data axes");
201  qfits_header_add (outFitsHeader, "NAXIS1", sWidthX, "", NULL);
202  qfits_header_add (outFitsHeader, "NAXIS2", sWidthY, "", NULL);
203  qfits_header_mod (outFitsHeader, "INSTRUME", "MIDI", "MIDI Raw Data Display FITS created by DRS pipeline" );
204 
205  // Now write all the required product keaywords to the output header
206  // -----------------------------------------------------------------
207  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO TYPE", size->obsType, "MIDI pipeline product type", NULL);
208  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO CATG", "REDUCED_DETRON", "Pipeline product category", NULL);
209  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO ARCFILE", fileNames->archFileName, "Arcfile name of first raw file", NULL);
210  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO PIPEDATE", currentTime, "Pipeline run date", "");
211  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO VERSION", MIDI_PIPE_VERSION, "Pipeline version", NULL);
212  qfits_header_add (outFitsHeader, "PIPEFILE", fileNames->pipeFileName, "Pipeline product file name", NULL);
213  qfits_header_add (outFitsHeader, "HIERARCH ESO PRO DID", MIDI_QC_DIC_VERSION, "QC dictionary version", NULL);
214 
215  // Rewind the list of files
216  rewind (inFitsBatchPtr);
217 
218  // Loop through the list of files and write into the primary header
219  i = 1;
220  while (fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
221  {
222  sprintf (classification, "%s", "");
223  sscanf (stringTemp, "%s%s", messageBuffer, classification);
224 
225  // If classification is not given get it from the raw file
226  if (strcmp (classification, "") == 0)
227  {
228  stringQfits = qfits_query_hdr (messageBuffer, "HIERARCH ESO DPR CATG");
229  if (stringQfits == NULL)
230  {
231  sprintf (classification, "%s", "UNKNOWN");
232  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get Observation Category");
233  }
234  else
235  {
236  cleanUpString (stringQfits, cleanString);
237  sprintf (classification, "%s", cleanString);
238  }
239  }
240  removePathName (messageBuffer, midiReportPtr);
241  sprintf (textBuff, "HIERARCH ESO PRO REC1 RAW%d NAME", i);
242  qfits_header_add (outFitsHeader, textBuff, messageBuffer, "FITS file name", "");
243  sprintf (textBuff, "HIERARCH ESO PRO REC1 RAW%d CATG", i++);
244  qfits_header_add (outFitsHeader, textBuff, classification, "Observation Categoty", "");
245  }
246  fclose (inFitsBatchPtr);
247 
248  // Add the required QC keywords
249  sprintf (messageBuffer, "%f", noise->median);
250  qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETRON MEDIAN", messageBuffer, "Median of noise pattern", "");
251 
252  // Place Holders
253  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH1", "TBD", "TBD", "");
254  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH2", "TBD", "TBD", "");
255  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH3", "TBD", "TBD", "");
256  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH4", "TBD", "TBD", "");
257  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH5", "TBD", "TBD", "");
258  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH6", "TBD", "TBD", "");
259  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH7", "TBD", "TBD", "");
260  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH8", "TBD", "TBD", "");
261  qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH9", "TBD", "TBD", "");
262 
263  // Create the output fits file. If the file exist delete it
264  if (diagnostic)cpl_msg_info(cpl_func,"Creating Product FITS file %s \n", fileNames->outFitsName);
265  fprintf (midiReportPtr, "Creating Product FITS file %s \n", fileNames->outFitsName);
266  if (stat (fileNames->outFitsName, &buf) == 0) remove (fileNames->outFitsName);
267  outFitsPtr = fopen (fileNames->outFitsName, "w");
268  if (!outFitsPtr)
269  {
270  *error = 1;
271  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot create output FITS file");
272  free (messageBuffer);
273  free (currentTime);
274  free (cleanString);
275  free (stringTemp);
276  free (classification);
277  free (textBuff);
278  free (sWidthX);
279  free (sWidthY);
280  return;
281  }
282 
283  cpl_msg_info(cpl_func,"Created Product FITS file: %s \n", fileNames->outFitsName);
284  fprintf (midiReportPtr, "Created Product FITS file: %s \n", fileNames->outFitsName);
285 
286  // Write header into the output file
287  qfits_header_sort (&outFitsHeader);
288  qfits_header_dump (outFitsHeader, outFitsPtr);
289  fclose (outFitsPtr);
290  qfits_header_destroy (outFitsHeader);
291 
292  // release memory
293  free (messageBuffer);
294  free (currentTime);
295  free (cleanString);
296  free (stringTemp);
297  free (classification);
298  free (textBuff);
299  free (sWidthX);
300  free (sWidthY);
301 
302  return;
303 }
304 /*****************************************************************************/
305 
306 
307 
308 
309 /******************************************************************************
310 * European Southern Observatory
311 * VLTI MIDI Data Reduction Software
312 *
313 * Module name: createDetRonQcLog
314 * Input/Output: See function arguments to avoid duplication
315 * Description: Copies keywords from the raw input FITS primary header to the
316 * QC log and adds additional product keywords
317 *
318 * History:
319 * 30-Aug-04 (csabet) Created
320 ******************************************************************************/
321 void createDetRonQcLog (
322  char *inFitsName,
323  int *error)
324 
325 {
326 
327  /* Local Declarations
328  --------------------*/
329  const char routine[] = "createDetRonQcLog";
330  char *qfitsString, *emptyString, *cleanString;
331 
332  /* Algorithm
333  -----------*/
334  if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
335  if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
336 
337  /* Reset status */
338  *error = 0;
339 
340  /* Allocate memory */
341  emptyString = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
342  cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
343 
344  /* Initialise empty string */
345  strcpy (emptyString, "\"UNKNOWN\"");
346 
347  /* Get all the keywords */
348  qfitsString = qfits_query_hdr (inFitsName, "ARCFILE");
349  if (qfitsString == NULL)
350  fprintf (midiQcLogPtr, "ARCFILE %s \n", emptyString);
351  else {cleanUpString (qfitsString, cleanString);
352  fprintf (midiQcLogPtr, "ARCFILE \"%s\" \n", cleanString);}
353 
354  qfitsString = qfits_query_hdr (inFitsName, "TELESCOP");
355  if (qfitsString == NULL)
356  fprintf (midiQcLogPtr, "TELESCOP %s \n", emptyString);
357  else {cleanUpString (qfitsString, cleanString);
358  fprintf (midiQcLogPtr, "TELESCOP \"%s\" \n", cleanString);}
359 
360  qfitsString = qfits_query_hdr (inFitsName, "INSTRUME");
361  if (qfitsString == NULL)
362  fprintf (midiQcLogPtr, "INSTRUME %s \n", emptyString);
363  else {cleanUpString (qfitsString, cleanString);
364  fprintf (midiQcLogPtr, "INSTRUME \"%s\" \n", cleanString);}
365 
366  qfitsString = qfits_query_hdr (inFitsName, "MJD-OBS");
367  if (qfitsString == NULL)
368  fprintf (midiQcLogPtr, "MJD-OBS %s \n", emptyString);
369  else {cleanUpString (qfitsString, cleanString);
370  fprintf (midiQcLogPtr, "MJD-OBS \"%s\" \n", cleanString);}
371 
372  qfitsString = qfits_query_hdr (inFitsName, "DATE-OBS");
373  if (qfitsString == NULL)
374  fprintf (midiQcLogPtr, "DATE-OBS %s \n", emptyString);
375  else {cleanUpString (qfitsString, cleanString);
376  fprintf (midiQcLogPtr, "DATE-OBS \"%s\" \n", cleanString);}
377 
378  qfitsString = qfits_query_hdr (inFitsName, "UTC");
379  if (qfitsString == NULL)
380  fprintf (midiQcLogPtr, "UTC %s \n", emptyString);
381  else {cleanUpString (qfitsString, cleanString);
382  fprintf (midiQcLogPtr, "UTC %s \n", cleanString);}
383 
384  qfitsString = qfits_query_hdr (inFitsName, "LST");
385  if (qfitsString == NULL)
386  fprintf (midiQcLogPtr, "LST %s \n", emptyString);
387  else {cleanUpString (qfitsString, cleanString);
388  fprintf (midiQcLogPtr, "LST %s \n", cleanString);}
389 
390  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET CHIP NX");
391  if (qfitsString == NULL)
392  fprintf (midiQcLogPtr, "DET.CHIP.NX %s \n", emptyString);
393  else {cleanUpString (qfitsString, cleanString);
394  fprintf (midiQcLogPtr, "DET.CHIP.NX %s \n", cleanString);}
395 
396  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET CHIP NY");
397  if (qfitsString == NULL)
398  fprintf (midiQcLogPtr, "DET.CHIP.NY %s \n", emptyString);
399  else {cleanUpString (qfitsString, cleanString);
400  fprintf (midiQcLogPtr, "DET.CHIP.NY %s \n", cleanString);}
401 
402  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET DIT");
403  if (qfitsString == NULL)
404  fprintf (midiQcLogPtr, "DET.DIT %s \n", emptyString);
405  else {cleanUpString (qfitsString, cleanString);
406  fprintf (midiQcLogPtr, "DET.DIT %s \n", cleanString);}
407 
408  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET DITDELAY");
409  if (qfitsString == NULL)
410  fprintf (midiQcLogPtr, "DET.DITDELAY %s \n", emptyString);
411  else {cleanUpString (qfitsString, cleanString);
412  fprintf (midiQcLogPtr, "DET.DITDELAY %s \n", cleanString);}
413 
414  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET INT MODE");
415  if (qfitsString == NULL)
416  fprintf (midiQcLogPtr, "DET.INT.MODE %s \n", emptyString);
417  else {cleanUpString (qfitsString, cleanString);
418  fprintf (midiQcLogPtr, "DET.INT.MODE \"%s\" \n", cleanString);}
419 
420  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET NDIT");
421  if (qfitsString == NULL)
422  fprintf (midiQcLogPtr, "DET.NDIT %s \n", emptyString);
423  else {cleanUpString (qfitsString, cleanString);
424  fprintf (midiQcLogPtr, "DET.NDIT %s \n", cleanString);}
425 
426  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET NRTS MODE");
427  if (qfitsString == NULL)
428  fprintf (midiQcLogPtr, "DET.NRTS.MODE %s \n", emptyString);
429  else {cleanUpString (qfitsString, cleanString);
430  fprintf (midiQcLogPtr, "DET.NRTS.MODE \"%s\" \n", cleanString);}
431 
432  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN1 NX");
433  if (qfitsString == NULL)
434  fprintf (midiQcLogPtr, "DET.WIN1.NX %s \n", emptyString);
435  else {cleanUpString (qfitsString, cleanString);
436  fprintf (midiQcLogPtr, "DET.WIN1.NX %s \n", cleanString);}
437 
438  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN1 NY");
439  if (qfitsString == NULL)
440  fprintf (midiQcLogPtr, "DET.WIN1.NY %s \n", emptyString);
441  else {cleanUpString (qfitsString, cleanString);
442  fprintf (midiQcLogPtr, "DET.WIN1.NY %s \n", cleanString);}
443 
444  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN2 NX");
445  if (qfitsString == NULL)
446  fprintf (midiQcLogPtr, "DET.WIN2.NX %s \n", emptyString);
447  else {cleanUpString (qfitsString, cleanString);
448  fprintf (midiQcLogPtr, "DET.WIN2.NX %s \n", cleanString);}
449 
450  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN2 NY");
451  if (qfitsString == NULL)
452  fprintf (midiQcLogPtr, "DET.WIN2.NY %s \n", emptyString);
453  else {cleanUpString (qfitsString, cleanString);
454  fprintf (midiQcLogPtr, "DET.WIN2.NY %s \n", cleanString);}
455 
456  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR CATG");
457  if (qfitsString == NULL)
458  fprintf (midiQcLogPtr, "DPR.CATG %s \n", emptyString);
459  else {cleanUpString (qfitsString, cleanString);
460  fprintf (midiQcLogPtr, "DPR.CATG \"%s\" \n", cleanString);}
461 
462  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR TECH");
463  if (qfitsString == NULL)
464  fprintf (midiQcLogPtr, "DPR.TECH %s \n", emptyString);
465  else {cleanUpString (qfitsString, cleanString);
466  fprintf (midiQcLogPtr, "DPR.TECH \"%s\" \n", cleanString);}
467 
468  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR TYPE");
469  if (qfitsString == NULL)
470  fprintf (midiQcLogPtr, "DPR.TYPE %s \n", emptyString);
471  else {cleanUpString (qfitsString, cleanString);
472  fprintf (midiQcLogPtr, "DPR.TYPE \"%s\" \n", cleanString);}
473 
474  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS CAM NAME");
475  if (qfitsString == NULL)
476  fprintf (midiQcLogPtr, "INS.CAM.NAME %s \n", emptyString);
477  else {cleanUpString (qfitsString, cleanString);
478  fprintf (midiQcLogPtr, "INS.CAM.NAME \"%s\" \n", cleanString);}
479 
480  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS FILT NAME");
481  if (qfitsString == NULL)
482  fprintf (midiQcLogPtr, "INS.FILT.NAME %s \n", emptyString);
483  else {cleanUpString (qfitsString, cleanString);
484  fprintf (midiQcLogPtr, "INS.FILT.NAME \"%s\" \n", cleanString);}
485 
486  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS GRIS NAME");
487  if (qfitsString == NULL)
488  fprintf (midiQcLogPtr, "INS.GRIS.NAME %s \n", emptyString);
489  else {cleanUpString (qfitsString, cleanString);
490  fprintf (midiQcLogPtr, "INS.GRIS.NAME \"%s\" \n", cleanString);}
491 
492  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS MODE");
493  if (qfitsString == NULL)
494  fprintf (midiQcLogPtr, "INS.MODE %s \n", emptyString);
495  else {cleanUpString (qfitsString, cleanString);
496  fprintf (midiQcLogPtr, "INS.MODE \"%s\" \n", cleanString);}
497 
498  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS OPT1 NAME");
499  if (qfitsString == NULL)
500  fprintf (midiQcLogPtr, "INS.OPT1.NAME %s \n", emptyString);
501  else {cleanUpString (qfitsString, cleanString);
502  fprintf (midiQcLogPtr, "INS.OPT1.NAME \"%s\" \n", cleanString);}
503 
504  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS OPT1 TYPE");
505  if (qfitsString == NULL)
506  fprintf (midiQcLogPtr, "INS.OPT1.TYPE %s \n", emptyString);
507  else {cleanUpString (qfitsString, cleanString);
508  fprintf (midiQcLogPtr, "INS.OPT1.TYPE \"%s\" \n", cleanString);}
509 
510  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS SHUT NAME");
511  if (qfitsString == NULL)
512  fprintf (midiQcLogPtr, "INS.SHUT.NAME %s \n", emptyString);
513  else {cleanUpString (qfitsString, cleanString);
514  fprintf (midiQcLogPtr, "INS.SHUT.NAME \"%s\" \n", cleanString);}
515 
516  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS SLIT NAME");
517  if (qfitsString == NULL)
518  fprintf (midiQcLogPtr, "INS.SLIT.NAME %s \n", emptyString);
519  else {cleanUpString (qfitsString, cleanString);
520  fprintf (midiQcLogPtr, "INS.SLIT.NAME \"%s\" \n", cleanString);}
521 
522  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS ID");
523  if (qfitsString == NULL)
524  fprintf (midiQcLogPtr, "OBS.ID %s \n", emptyString);
525  else {cleanUpString (qfitsString, cleanString);
526  fprintf (midiQcLogPtr, "OBS.ID \"%s\" \n", cleanString);}
527 
528  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS NAME");
529  if (qfitsString == NULL)
530  fprintf (midiQcLogPtr, "OBS.NAME %s \n", emptyString);
531  else {cleanUpString (qfitsString, cleanString);
532  fprintf (midiQcLogPtr, "OBS.NAME \"%s\" \n", cleanString);}
533 
534  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PI-COI ID");
535  if (qfitsString == NULL)
536  fprintf (midiQcLogPtr, "OBS.PI-COI.ID %s \n", emptyString);
537  else {cleanUpString (qfitsString, cleanString);
538  fprintf (midiQcLogPtr, "OBS.PI-COI.ID \"%s\" \n", cleanString);}
539 
540  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PI-COI NAME");
541  if (qfitsString == NULL)
542  fprintf (midiQcLogPtr, "OBS.PI-COI.NAME %s \n", emptyString);
543  else {cleanUpString (qfitsString, cleanString);
544  fprintf (midiQcLogPtr, "OBS.PI-COI.NAME \"%s\" \n", cleanString);}
545 
546  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PROG ID");
547  if (qfitsString == NULL)
548  fprintf (midiQcLogPtr, "OBS.PROG.ID %s \n", emptyString);
549  else {cleanUpString (qfitsString, cleanString);
550  fprintf (midiQcLogPtr, "OBS.PROG.ID \"%s\" \n", cleanString);}
551 
552  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS START");
553  if (qfitsString == NULL)
554  fprintf (midiQcLogPtr, "OBS.START %s \n", emptyString);
555  else {cleanUpString (qfitsString, cleanString);
556  fprintf (midiQcLogPtr, "OBS.START \"%s\" \n", cleanString);}
557 
558  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS TARG NAME");
559  if (qfitsString == NULL)
560  fprintf (midiQcLogPtr, "OBS.TARG.NAME %s \n", emptyString);
561  else {cleanUpString (qfitsString, cleanString);
562  fprintf (midiQcLogPtr, "OBS.TARG.NAME \"%s\" \n", cleanString);}
563 
564  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OCS EXPO1 FNAME1");
565  if (qfitsString == NULL)
566  fprintf (midiQcLogPtr, "OCS.EXPO1.FNAME1 %s \n", emptyString);
567  else {cleanUpString (qfitsString, cleanString);
568  fprintf (midiQcLogPtr, "OCS.EXPO1.FNAME1 \"%s\" \n", cleanString);}
569 
570  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO TPL ID");
571  if (qfitsString == NULL)
572  fprintf (midiQcLogPtr, "TPL.ID %s \n", emptyString);
573  else {cleanUpString (qfitsString, cleanString);
574  fprintf (midiQcLogPtr, "TPL.ID \"%s\" \n", cleanString);}
575 
576  qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO TPL START");
577  if (qfitsString == NULL)
578  fprintf (midiQcLogPtr, "TPL.START %s \n", emptyString);
579  else {cleanUpString (qfitsString, cleanString);
580  fprintf (midiQcLogPtr, "TPL.START \"%s\" \n", cleanString);}
581 
582 
583  /* Release memory */
584  free (emptyString);
585  free (cleanString);
586 
587  return;
588 }
589 /*****************************************************************************/
590 
591 
592 /******************************************************************************
593 * European Southern Observatory
594 * VLTI MIDI Data Reduction Software
595 *
596 * Module name: addProdInfoToDetRonQcLog
597 * Input/Output: See function arguments to avoid duplication
598 * Description: Adds product information to QC log
599 *
600 *
601 * History:
602 * 16-Jan-04 (csabet) Created
603 ******************************************************************************/
604 void addProdInfoToDetRonQcLog (
605  ImageFormat *format, // In: Image format
606  MidiFiles *fileNames,
607  float median,
608  int *error)
609 {
610 
611  /* Local Declarations
612  --------------------*/
613  const char routine[] = "addProdInfoToDetRonQcLog";
614  int i;
615  FILE *inFitsBatchPtr;
616  char *stringQfits, *messageBuffer, *currentTime, *textBuff, *cleanString,
617  *stringTemp, *classification;
618  time_t now;
619  struct tm *newTime;
620 
621  /* Algorithm
622  -----------*/
623  if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
624  if (diagnostic > 4) fprintf (midiReportPtr, "Invoking routine '%s' \n", routine);
625 
626  /* Reset parameters */
627  *error = 0;
628 
629  /* Allocate memory */
630  classification = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
631  stringTemp = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
632  cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
633  textBuff = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
634  messageBuffer = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
635  currentTime = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
636 
637  /* Get current time/date */
638  now = time(NULL);
639  newTime = gmtime (&now);
640  strftime (currentTime, MIN_STRING_LENGTH, "%a %d %b %Y at %H:%M:%S", newTime);
641 
642  // Add keyword to QC log file
643  fprintf (midiQcLogPtr, "PRO.TYPE \"%s\" \n", format->obsType);
644  fprintf (midiQcLogPtr, "PRO.CATG \"REDUCED_DETRON\" \n");
645  fprintf (midiQcLogPtr, "PRO.ARCFILE \"%s\" \n", fileNames->archFileName);
646  fprintf (midiQcLogPtr, "PRO.PIPEDATE \"%s\" \n", currentTime);
647  fprintf (midiQcLogPtr, "PRO.VERSION \"%s\" \n", MIDI_PIPE_VERSION);
648  fprintf (midiQcLogPtr, "PRO.PIPEFILE \"%s\" \n", fileNames->pipeFileName);
649  fprintf (midiQcLogPtr, "PRO.DID \"%s\" \n", MIDI_QC_DIC_VERSION);
650 
651  /* Open the list of files */
652  if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch, "r")) == NULL)
653  {
654  *error = 1;
655  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open input FITS file list");
656  free (messageBuffer);
657  free (currentTime);
658  free (cleanString);
659  free (stringTemp);
660  free (classification);
661  free (textBuff);
662  return;
663  }
664 
665  /* Loop through the list of files and write into the QC log */
666  i = 1;
667  while (fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
668  {
669  sprintf (classification, "%s", "");
670  sscanf (stringTemp, "%s%s", messageBuffer, classification);
671 
672  /* If classification is not given get it from the raw file */
673  if (strcmp (classification, "") == 0)
674  {
675  stringQfits = qfits_query_hdr (messageBuffer, "HIERARCH ESO DPR CATG");
676  if (stringQfits == NULL)
677  {
678  sprintf (classification, "%s", "UNKNOWN");
679  midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get Observation Category");
680  }
681  else
682  {
683  cleanUpString (stringQfits, cleanString);
684  sprintf (classification, "%s", cleanString);
685  }
686  }
687  removePathName (messageBuffer, midiReportPtr);
688  fprintf (midiQcLogPtr, "PRO.REC1.RAW%d.NAME \"%s\" \n", i, messageBuffer);
689  fprintf (midiQcLogPtr, "PRO.REC1.RAW%d.CATG \"%s\" \n", i++, classification);
690  }
691  fclose (inFitsBatchPtr);
692 
693  fprintf (midiQcLogPtr, "QC.DETRON.MEDIAN %f \n", median);
694 
695  /* release memory */
696  free (messageBuffer);
697  free (currentTime);
698  free (textBuff);
699  free (cleanString);
700  free (stringTemp);
701  free (classification);
702 
703  return;
704 }
705 /*****************************************************************************/
706