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