createProdWavCal.c

00001 
00002 /******************************************************************************
00003 *******************************************************************************
00004 *               European Southern Observatory
00005 *          VLTI MIDI Maintenance Templates Software
00006 *
00007 * Module name:  createProdWavCal.c
00008 * Description:  Contains routines for the product files handling
00009 *
00010 * History:      
00011 * 10-Jun-05     (csabet)
00012 *******************************************************************************
00013 ******************************************************************************/
00014 
00015 /******************************************************************************
00016 *   Compiler directives
00017 ******************************************************************************/
00018 
00019 /******************************************************************************
00020 *   Include files
00021 ******************************************************************************/
00022 #include <sys/stat.h>
00023 #include <stdio.h>
00024 #include <cpl.h>
00025 #include <time.h>
00026 #include "midiGlobal.h"
00027 #include "midiLib.h"
00028 #include "errorHandling.h"
00029 #include "midiFitsUtility.h"
00030 #include "fileHandling.h"
00031 #include "createProdWavCal.h"
00032 #include "cpl_table.h"
00033 #include "qfits.h"
00034 
00035 /**********************************************************
00036 *   Global Variables 
00037 **********************************************************/
00038 
00039 /*============================ C O D E    A R E A ===========================*/
00040 
00041 
00042 
00043 
00044 /******************************************************************************
00045 *               European Southern Observatory
00046 *          VLTI MIDI Maintenance Templates Software
00047 *
00048 * Module name:  createWaveCalProd
00049 * Input/Output: See function arguments to avoid duplication
00050 * Description:  Creates MIDI product files
00051 *
00052 * History:      
00053 * 10-Jun-05     (csabet) Created
00054 ******************************************************************************/
00055 void createWaveCalProd (
00056     int                processing,
00057     MidiFiles       *fileNames,    // In: Pointer to the file structure
00058     ImageFormat        *format,    // In: Image format
00059     WaveCalibration    *waveCal,    // Ou: Pointer to the detector waveCal data structure
00060     int                *error)        // Ou: Error status
00061 {
00062  
00063     //  Local Declarations
00064     //    ------------------
00065     const char  routine[] = "createWaveCalProd";
00066     char        *classification, *stringTemp;
00067     FILE        *inFitsBatchPtr;
00068     float        *wavCalImage;
00069     qfitsdumper    qdWavCal;
00070     
00071     //  Algorithm
00072     //    ---------
00073     if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking      routine   '%s' \n", routine);
00074     if (diagnostic > 4) fprintf (midiReportPtr, "Invoking      routine   '%s' \n", routine);
00075 
00076    cpl_msg_info(cpl_func,"\nCreating Product files for WAV_CAL from batch  %d \n", batchNumber);
00077    cpl_msg_info(cpl_func,"--------------------------------------------- \n");
00078     fprintf (midiReportPtr, "\nCreating Product files for WAV_CAL from batch  %d \n", batchNumber);
00079     fprintf (midiReportPtr, "--------------------------------------------- \n");
00080 
00081     // Reset status
00082     *error = 0;
00083     
00084     //    Create the primary header extension
00085     createWaveCalPrimHead (processing, fileNames, format, waveCal, error);
00086     if (*error)
00087     {
00088         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot create Primary Header extension");
00089         return;
00090     }
00091 
00092     //    Allocate memory
00093     stringTemp = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00094     classification = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00095     wavCalImage = (float *) calloc (format->iXWidth * format->iYWidth, sizeof (float));
00096     
00097     //    Create a dummp image
00098     qdWavCal.filename  = fileNames->outFitsName;
00099     qdWavCal.npix      = format->iXWidth * format->iYWidth;
00100     qdWavCal.ptype     = PTYPE_FLOAT;
00101     qdWavCal.fbuf      = wavCalImage;
00102     qdWavCal.out_ptype = BPP_IEEE_FLOAT;
00103     qfits_pixdump (&qdWavCal);
00104 
00105     free (wavCalImage);
00106     
00107     //  Open the list of files
00108     if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch, "r")) == NULL)
00109     {
00110         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open input FITS file list");
00111         free (stringTemp);
00112         free (classification);
00113         *error = 1;
00114         return;
00115     }
00116         
00117     //  Read the name of the first file in the list and get it's full path name
00118     fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr);
00119     sprintf (classification, "%s", "");
00120     sscanf (stringTemp, "%s%s", fileNames->inFitsName, classification);
00121 
00122     // Copy keywords from the raw FITS file into the QC log
00123     createWaveCalQcLog (fileNames->inFitsName, error);
00124     if (*error)    midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot copy keywords to QC log");
00125 
00126     //    Add Product info to QC log
00127     addProdInfoToWaveCalQcLog (processing, format, fileNames, waveCal, error);
00128 
00129     //  Release memory
00130     fclose (inFitsBatchPtr);
00131     free (classification);
00132     free (stringTemp);
00133  
00134     return; 
00135 }
00136 /*****************************************************************************/
00137 
00138 
00139 
00140 /******************************************************************************
00141 *               European Southern Observatory
00142 *            VLTI MIDI Data Reduction Software
00143 *
00144 * Module name:  createWaveCalPrimHead
00145 * Input/Output: See function arguments to avoid duplication
00146 * Description:  Creates the primary header
00147 *
00148 *
00149 * History:
00150 * 08-Jun-05     (csabet) Created
00151 ******************************************************************************/
00152 void createWaveCalPrimHead (
00153     int                processing,
00154     MidiFiles       *fileNames,    // In: Pointer to the file structure
00155     ImageFormat        *format,    // In: Image format
00156     WaveCalibration    *waveCal,    // Ou: Pointer to the detector waveCal data structure
00157     int                *error)        // Ou: Error status
00158 {
00159 
00160     //    Local Declarations
00161     //    ------------------
00162     const char      routine[] = "createWaveCalPrimHead";
00163     qfits_header    *outFitsHeader;
00164     FILE            *inFitsBatchPtr=NULL, *outFitsPtr;
00165     int             i, region;
00166     char            *textBuff, *stringQfits, *messageBuffer, *currentTime, *cleanString,
00167                     *stringTemp, *classification, *sWidthX, *sWidthY;
00168     time_t          now;
00169     struct tm       *newTime;
00170     struct stat     buf;
00171 
00172     //    Algorithm
00173     //    ---------
00174     if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking      routine   '%s' \n", routine);
00175     if (diagnostic > 4) fprintf(midiReportPtr, "Invoking      routine   '%s' \n", routine);
00176 
00177     //    Reset parameters
00178     *error = 0;
00179 
00180     //    Open list of files
00181     if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch, "r")) == NULL)
00182     {
00183         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open input FITS file list");
00184         *error = 1;
00185         return;
00186     }
00187 
00188     //    Allocate memory
00189     textBuff = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00190     classification = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00191     stringTemp = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00192     cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00193     messageBuffer = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00194     currentTime = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
00195     sWidthX = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
00196     sWidthY = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
00197 
00198     //    Get current time/date
00199     now = time(NULL);
00200     newTime = gmtime (&now);
00201     strftime (currentTime, MIN_STRING_LENGTH, "%a %d %b %Y at %H:%M:%S", newTime);
00202 
00203     //    Read the name of the first file in the list and get it's full path name
00204     fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr);
00205     sprintf (classification, "%s", "");
00206     sscanf (stringTemp, "%s%s", fileNames->inFitsName, classification);
00207 
00208     //    Copy primary header from the raw file to the output header
00209     outFitsHeader = qfits_header_read (fileNames->inFitsName);
00210     if (outFitsHeader == NULL)
00211     {
00212         *error = 1;
00213         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot load header from the input FITS file");
00214         free (messageBuffer);
00215         free (currentTime);
00216         free (cleanString);
00217         free (stringTemp);
00218         free (classification);
00219         free (textBuff);
00220         free (sWidthX);
00221         free (sWidthY);
00222         return;
00223     }
00224 
00225     //    Write all NAXIS values as character strings
00226     sprintf (sWidthY, "%d", format->iYWidth);
00227     sprintf (sWidthX, "%d", format->iXWidth);
00228 
00229     //    Updates header for the DetRon output file
00230     qfits_header_mod (outFitsHeader, "BITPIX", "-32", "number of bits per pixel"); 
00231     qfits_header_mod (outFitsHeader, "NAXIS", "2", "number of data axes"); 
00232     qfits_header_add (outFitsHeader, "NAXIS1", sWidthX, "", NULL);
00233     qfits_header_add (outFitsHeader, "NAXIS2", sWidthY, "", NULL);
00234     qfits_header_mod (outFitsHeader, "INSTRUME", "MIDI", "MIDI Raw Data Display FITS created by DRS pipeline" );  
00235 
00236     //    Now write all the required product keaywords to the output header
00237     //    -----------------------------------------------------------------
00238     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO TYPE", format->obsType, "MIDI pipeline product type", NULL);
00239     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO CATG", "REDUCED_WAVECAL", "Pipeline product category", NULL);
00240     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO ARCFILE", fileNames->archFileName, "Arcfile name of first raw file", NULL);
00241     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO PIPEDATE", currentTime, "Pipeline run date", "");
00242     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO VERSION", MIDI_PIPE_VERSION, "Pipeline version", NULL);
00243     qfits_header_add (outFitsHeader, "PIPEFILE", fileNames->pipeFileName, "Pipeline product file name", NULL);
00244     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO DID", MIDI_QC_DIC_VERSION, "QC dictionary version", NULL);
00245 
00246     //    Rewind the list of files
00247     rewind (inFitsBatchPtr);
00248     
00249     //    Loop through the list of files and write into the primary header
00250     i = 1;
00251     while (fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
00252     {
00253         sprintf (classification, "%s", "");
00254         sscanf (stringTemp, "%s%s", messageBuffer, classification);
00255 
00256         //    If classification is not given get it from the raw file
00257         if (strcmp (classification, "") == 0)
00258         {
00259             stringQfits = qfits_query_hdr (messageBuffer, "HIERARCH ESO DPR CATG");
00260             if (stringQfits == NULL)
00261             {
00262                 sprintf (classification, "%s", "UNKNOWN");
00263                 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get Observation Category");
00264             }
00265             else
00266             {
00267                 cleanUpString (stringQfits, cleanString);
00268                 sprintf (classification, "%s", cleanString);
00269             }
00270         }
00271         removePathName (messageBuffer, midiReportPtr);
00272         sprintf (textBuff, "HIERARCH ESO PRO REC1 RAW%d NAME", i);
00273         qfits_header_add (outFitsHeader, textBuff, messageBuffer, "FITS file name", "");
00274         sprintf (textBuff, "HIERARCH ESO PRO REC1 RAW%d CATG", i++);
00275         qfits_header_add (outFitsHeader, textBuff, classification, "Observation Categoty", "");
00276     }
00277     fclose (inFitsBatchPtr);
00278 
00279     //    Add Wavelength parameters
00280     for (region = 0; region < format->numOfDetectorRegions; region++)
00281     {
00282         for (i = 0; i < format->iXWidth; i++)
00283         {
00284             sprintf (textBuff, "HIERARCH ESO QC WCAL CH%d R%d", i, region+1);
00285             sprintf (messageBuffer, "%f", waveCal->calibratedWave[region][i]);
00286             qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Channel Wavelength assignment", "");
00287         }
00288     }
00289 
00290     //    If correlation is requested, add correlation errors
00291     if (processing == 1)
00292     {
00293         for (region = 0; region < format->numOfDetectorRegions; region++)
00294         {
00295             sprintf (textBuff, "HIERARCH ESO QC WCAL VAR R%d", region+1);
00296             sprintf (messageBuffer, "%f", waveCal->variance[region]);
00297             qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Correlation Variance", "");
00298         }
00299     }
00300     
00301     //    Place Holders
00302     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH1", "TBD", "TBD", "");
00303     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH2", "TBD", "TBD", "");
00304     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH3", "TBD", "TBD", "");
00305     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH4", "TBD", "TBD", "");
00306     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH5", "TBD", "TBD", "");
00307     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH6", "TBD", "TBD", "");
00308     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH7", "TBD", "TBD", "");
00309     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH8", "TBD", "TBD", "");
00310     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH9", "TBD", "TBD", "");
00311     
00312     //    Create the output fits file. If the file exist delete it
00313     if (stat (fileNames->outFitsName, &buf) == 0) remove (fileNames->outFitsName);
00314 
00315     outFitsPtr = fopen (fileNames->outFitsName, "w");
00316     if (!outFitsPtr)
00317     {
00318         *error = 1;
00319         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot create output FITS file");
00320         free (messageBuffer);
00321         free (currentTime);
00322         free (cleanString);
00323         free (stringTemp);
00324         free (classification);
00325         free (textBuff);
00326         free (sWidthX);
00327         free (sWidthY);        
00328         return;
00329     }
00330 
00331    cpl_msg_info(cpl_func,"Created Product FITS file: %s \n", fileNames->outFitsName);
00332     fprintf (midiReportPtr, "Created Product FITS file: %s \n", fileNames->outFitsName);
00333 
00334     //    Write header into the output file
00335     qfits_header_sort (&outFitsHeader);
00336     qfits_header_dump (outFitsHeader, outFitsPtr);
00337     fclose (outFitsPtr);
00338     qfits_header_destroy (outFitsHeader);
00339 
00340     //    release memory
00341     free (messageBuffer);
00342     free (currentTime);
00343     free (cleanString);
00344     free (stringTemp);
00345     free (classification);
00346     free (textBuff);
00347     free (sWidthX);    
00348     free (sWidthY);
00349 
00350     return;
00351 }
00352 /*****************************************************************************/
00353 
00354 
00355 
00356 /******************************************************************************
00357 *                European Southern Observatory
00358 *              VLTI MIDI Data Reduction Software 
00359 *
00360 * Module name:    createWaveCalQcLog
00361 * Input/Output:    See function arguments to avoid duplication
00362 * Description:    Copies keywords from the raw input FITS primary header to the 
00363 *               QC log and adds additional product keywords
00364 *
00365 * History:        
00366 * 30-Aug-04        (csabet) Created
00367 ******************************************************************************/
00368 void createWaveCalQcLog (
00369     char    *inFitsName,//    In:    Name of the raw FITS file
00370     int        *error)        //    Ou:    Status
00371     
00372 {
00373 
00374     /*    Local Declarations
00375     --------------------*/
00376     const char         routine[] = "createWaveCalQcLog";
00377     char            *qfitsString, *emptyString, *cleanString;
00378 
00379     /*    Algorithm
00380     -----------*/
00381     if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking      routine   '%s' \n", routine);
00382     if (diagnostic > 4) fprintf(midiReportPtr, "Invoking      routine   '%s' \n", routine);
00383 
00384     /* Reset status */
00385     *error = 0;
00386 
00387     /* Allocate memory */
00388     emptyString = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
00389     cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00390 
00391     /*    Initialise empty string */
00392     strcpy (emptyString, "\"UNKNOWN\"");
00393 
00394     /* Get all the keywords */
00395     qfitsString = qfits_query_hdr (inFitsName, "ARCFILE");
00396     if (qfitsString == NULL) 
00397         fprintf (midiQcLogPtr, "ARCFILE             %s \n", emptyString);
00398     else {cleanUpString (qfitsString, cleanString); 
00399         fprintf (midiQcLogPtr, "ARCFILE             \"%s\" \n", cleanString);}
00400 
00401     qfitsString = qfits_query_hdr (inFitsName, "TELESCOP");
00402     if (qfitsString == NULL) 
00403         fprintf (midiQcLogPtr, "TELESCOP            %s \n", emptyString);
00404     else {cleanUpString (qfitsString, cleanString); 
00405         fprintf (midiQcLogPtr, "TELESCOP            \"%s\" \n", cleanString);}
00406     
00407     qfitsString = qfits_query_hdr (inFitsName, "INSTRUME");
00408     if (qfitsString == NULL) 
00409         fprintf (midiQcLogPtr, "INSTRUME            %s \n", emptyString);
00410     else {cleanUpString (qfitsString, cleanString); 
00411         fprintf (midiQcLogPtr, "INSTRUME            \"%s\" \n", cleanString);}
00412     
00413     qfitsString = qfits_query_hdr (inFitsName, "MJD-OBS");
00414     if (qfitsString == NULL) 
00415         fprintf (midiQcLogPtr, "MJD-OBS             %s \n", emptyString);
00416     else {cleanUpString (qfitsString, cleanString); 
00417         fprintf (midiQcLogPtr, "MJD-OBS             \"%s\" \n", cleanString);}
00418     
00419     qfitsString = qfits_query_hdr (inFitsName, "DATE-OBS");
00420     if (qfitsString == NULL) 
00421         fprintf (midiQcLogPtr, "DATE-OBS            %s \n", emptyString);
00422     else {cleanUpString (qfitsString, cleanString); 
00423         fprintf (midiQcLogPtr, "DATE-OBS            \"%s\" \n", cleanString);}
00424     
00425     qfitsString = qfits_query_hdr (inFitsName, "UTC");
00426     if (qfitsString == NULL) 
00427         fprintf (midiQcLogPtr, "UTC                 %s \n", emptyString);
00428     else {cleanUpString (qfitsString, cleanString); 
00429         fprintf (midiQcLogPtr, "UTC                 %s \n", cleanString);}
00430     
00431     qfitsString = qfits_query_hdr (inFitsName, "LST");
00432     if (qfitsString == NULL) 
00433         fprintf (midiQcLogPtr, "LST                 %s \n", emptyString);
00434     else {cleanUpString (qfitsString, cleanString); 
00435         fprintf (midiQcLogPtr, "LST                 %s \n", cleanString);}
00436     
00437     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET CHIP NX");
00438     if (qfitsString == NULL) 
00439         fprintf (midiQcLogPtr, "DET.CHIP.NX         %s \n", emptyString);
00440     else {cleanUpString (qfitsString, cleanString); 
00441         fprintf (midiQcLogPtr, "DET.CHIP.NX         %s \n", cleanString);}
00442     
00443     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET CHIP NY");
00444     if (qfitsString == NULL) 
00445         fprintf (midiQcLogPtr, "DET.CHIP.NY         %s \n", emptyString);
00446     else {cleanUpString (qfitsString, cleanString); 
00447         fprintf (midiQcLogPtr, "DET.CHIP.NY         %s \n", cleanString);}
00448     
00449     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET DIT");
00450     if (qfitsString == NULL) 
00451         fprintf (midiQcLogPtr, "DET.DIT             %s \n", emptyString);
00452     else {cleanUpString (qfitsString, cleanString); 
00453         fprintf (midiQcLogPtr, "DET.DIT             %s \n", cleanString);}
00454     
00455     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET DITDELAY");
00456     if (qfitsString == NULL) 
00457         fprintf (midiQcLogPtr, "DET.DITDELAY        %s \n", emptyString);
00458     else {cleanUpString (qfitsString, cleanString); 
00459         fprintf (midiQcLogPtr, "DET.DITDELAY        %s \n", cleanString);}
00460     
00461     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET INT MODE");
00462     if (qfitsString == NULL) 
00463         fprintf (midiQcLogPtr, "DET.INT.MODE        %s \n", emptyString);
00464     else {cleanUpString (qfitsString, cleanString); 
00465         fprintf (midiQcLogPtr, "DET.INT.MODE        \"%s\" \n", cleanString);}
00466     
00467     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET NDIT");
00468     if (qfitsString == NULL) 
00469         fprintf (midiQcLogPtr, "DET.NDIT            %s \n", emptyString);
00470     else {cleanUpString (qfitsString, cleanString); 
00471         fprintf (midiQcLogPtr, "DET.NDIT            %s \n", cleanString);}
00472     
00473     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET NRTS MODE");
00474     if (qfitsString == NULL) 
00475         fprintf (midiQcLogPtr, "DET.NRTS.MODE       %s \n", emptyString);
00476     else {cleanUpString (qfitsString, cleanString); 
00477         fprintf (midiQcLogPtr, "DET.NRTS.MODE       \"%s\" \n", cleanString);}
00478     
00479     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN1 NX");
00480     if (qfitsString == NULL) 
00481         fprintf (midiQcLogPtr, "DET.WIN1.NX         %s \n", emptyString);
00482     else {cleanUpString (qfitsString, cleanString); 
00483         fprintf (midiQcLogPtr, "DET.WIN1.NX         %s \n", cleanString);}
00484     
00485     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN1 NY");
00486     if (qfitsString == NULL) 
00487         fprintf (midiQcLogPtr, "DET.WIN1.NY         %s \n", emptyString);
00488     else {cleanUpString (qfitsString, cleanString); 
00489         fprintf (midiQcLogPtr, "DET.WIN1.NY         %s \n", cleanString);}
00490     
00491     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN2 NX");
00492     if (qfitsString == NULL) 
00493         fprintf (midiQcLogPtr, "DET.WIN2.NX         %s \n", emptyString);
00494     else {cleanUpString (qfitsString, cleanString); 
00495         fprintf (midiQcLogPtr, "DET.WIN2.NX         %s \n", cleanString);}
00496     
00497     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN2 NY");
00498     if (qfitsString == NULL) 
00499         fprintf (midiQcLogPtr, "DET.WIN2.NY         %s \n", emptyString);
00500     else {cleanUpString (qfitsString, cleanString); 
00501         fprintf (midiQcLogPtr, "DET.WIN2.NY         %s \n", cleanString);}
00502     
00503     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR CATG");
00504     if (qfitsString == NULL) 
00505         fprintf (midiQcLogPtr, "DPR.CATG            %s \n", emptyString);
00506     else {cleanUpString (qfitsString, cleanString); 
00507         fprintf (midiQcLogPtr, "DPR.CATG            \"%s\" \n", cleanString);}
00508     
00509     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR TECH");
00510     if (qfitsString == NULL) 
00511         fprintf (midiQcLogPtr, "DPR.TECH            %s \n", emptyString);
00512     else {cleanUpString (qfitsString, cleanString); 
00513         fprintf (midiQcLogPtr, "DPR.TECH            \"%s\" \n", cleanString);}
00514     
00515     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR TYPE");
00516     if (qfitsString == NULL) 
00517         fprintf (midiQcLogPtr, "DPR.TYPE            %s \n", emptyString);
00518     else {cleanUpString (qfitsString, cleanString); 
00519         fprintf (midiQcLogPtr, "DPR.TYPE            \"%s\" \n", cleanString);}
00520     
00521     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS CAM NAME");
00522     if (qfitsString == NULL) 
00523         fprintf (midiQcLogPtr, "INS.CAM.NAME        %s \n", emptyString);
00524     else {cleanUpString (qfitsString, cleanString); 
00525         fprintf (midiQcLogPtr, "INS.CAM.NAME        \"%s\" \n", cleanString);}
00526     
00527     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS FILT NAME");
00528     if (qfitsString == NULL) 
00529         fprintf (midiQcLogPtr, "INS.FILT.NAME       %s \n", emptyString);
00530     else {cleanUpString (qfitsString, cleanString); 
00531         fprintf (midiQcLogPtr, "INS.FILT.NAME       \"%s\" \n", cleanString);}
00532 
00533     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS GRIS NAME");
00534     if (qfitsString == NULL) 
00535         fprintf (midiQcLogPtr, "INS.GRIS.NAME       %s \n", emptyString);
00536     else {cleanUpString (qfitsString, cleanString); 
00537         fprintf (midiQcLogPtr, "INS.GRIS.NAME       \"%s\" \n", cleanString);}
00538         
00539     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS MODE");
00540     if (qfitsString == NULL) 
00541         fprintf (midiQcLogPtr, "INS.MODE            %s \n", emptyString);
00542     else {cleanUpString (qfitsString, cleanString); 
00543         fprintf (midiQcLogPtr, "INS.MODE            \"%s\" \n", cleanString);}
00544     
00545     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS OPT1 NAME");
00546     if (qfitsString == NULL) 
00547         fprintf (midiQcLogPtr, "INS.OPT1.NAME       %s \n", emptyString);
00548     else {cleanUpString (qfitsString, cleanString); 
00549         fprintf (midiQcLogPtr, "INS.OPT1.NAME       %s \n", cleanString);}
00550     
00551     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS OPT1 TYPE");
00552     if (qfitsString == NULL) 
00553         fprintf (midiQcLogPtr, "INS.OPT1.TYPE       %s \n", emptyString);
00554     else {cleanUpString (qfitsString, cleanString); 
00555         fprintf (midiQcLogPtr, "INS.OPT1.TYPE       \"%s\" \n", cleanString);}
00556     
00557     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS SHUT NAME");
00558     if (qfitsString == NULL) 
00559         fprintf (midiQcLogPtr, "INS.SHUT.NAME       %s \n", emptyString);
00560     else {cleanUpString (qfitsString, cleanString); 
00561         fprintf (midiQcLogPtr, "INS.SHUT.NAME       \"%s\" \n", cleanString);}
00562     
00563     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS SLIT NAME");
00564     if (qfitsString == NULL) 
00565         fprintf (midiQcLogPtr, "INS.SLIT.NAME       %s \n", emptyString);
00566     else {cleanUpString (qfitsString, cleanString); 
00567         fprintf (midiQcLogPtr, "INS.SLIT.NAME       \"%s\" \n", cleanString);}
00568     
00569     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS ID");
00570     if (qfitsString == NULL) 
00571         fprintf (midiQcLogPtr, "OBS.ID              %s \n", emptyString);
00572     else {cleanUpString (qfitsString, cleanString); 
00573         fprintf (midiQcLogPtr, "OBS.ID              \"%s\" \n", cleanString);}
00574     
00575     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS NAME");
00576     if (qfitsString == NULL) 
00577         fprintf (midiQcLogPtr, "OBS.NAME            %s \n", emptyString);
00578     else {cleanUpString (qfitsString, cleanString); 
00579         fprintf (midiQcLogPtr, "OBS.NAME            \"%s\" \n", cleanString);}
00580     
00581     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PI-COI ID");
00582     if (qfitsString == NULL) 
00583         fprintf (midiQcLogPtr, "OBS.PI-COI.ID       %s \n", emptyString);
00584     else {cleanUpString (qfitsString, cleanString); 
00585         fprintf (midiQcLogPtr, "OBS.PI-COI.ID       \"%s\" \n", cleanString);}
00586     
00587     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PI-COI NAME");
00588     if (qfitsString == NULL) 
00589         fprintf (midiQcLogPtr, "OBS.PI-COI.NAME     %s \n", emptyString);
00590     else {cleanUpString (qfitsString, cleanString); 
00591         fprintf (midiQcLogPtr, "OBS.PI-COI.NAME     \"%s\" \n", cleanString);}
00592     
00593     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PROG ID");
00594     if (qfitsString == NULL) 
00595         fprintf (midiQcLogPtr, "OBS.PROG.ID         %s \n", emptyString);
00596     else {cleanUpString (qfitsString, cleanString); 
00597         fprintf (midiQcLogPtr, "OBS.PROG.ID         \"%s\" \n", cleanString);}
00598     
00599     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS START");
00600     if (qfitsString == NULL) 
00601         fprintf (midiQcLogPtr, "OBS.START           %s \n", emptyString);
00602     else {cleanUpString (qfitsString, cleanString); 
00603         fprintf (midiQcLogPtr, "OBS.START           \"%s\" \n", cleanString);}
00604     
00605     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS TARG NAME");
00606     if (qfitsString == NULL) 
00607         fprintf (midiQcLogPtr, "OBS.TARG.NAME       %s \n", emptyString);
00608     else {cleanUpString (qfitsString, cleanString); 
00609         fprintf (midiQcLogPtr, "OBS.TARG.NAME       \"%s\" \n", cleanString);}
00610     
00611     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OCS EXPO1 FNAME1");
00612     if (qfitsString == NULL) 
00613         fprintf (midiQcLogPtr, "OCS.EXPO1.FNAME1    %s \n", emptyString);
00614     else {cleanUpString (qfitsString, cleanString); 
00615         fprintf (midiQcLogPtr, "OCS.EXPO1.FNAME1    \"%s\" \n", cleanString);}
00616     
00617     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO TPL ID");
00618     if (qfitsString == NULL) 
00619         fprintf (midiQcLogPtr, "TPL.ID              %s \n", emptyString);
00620     else {cleanUpString (qfitsString, cleanString); 
00621         fprintf (midiQcLogPtr, "TPL.ID              \"%s\" \n", cleanString);}
00622     
00623     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO TPL START");
00624     if (qfitsString == NULL) 
00625         fprintf (midiQcLogPtr, "TPL.START           %s \n", emptyString);
00626     else {cleanUpString (qfitsString, cleanString); 
00627         fprintf (midiQcLogPtr, "TPL.START           \"%s\" \n", cleanString);}
00628     
00629     /* Release memory */
00630     free (emptyString);
00631     free (cleanString);
00632     
00633     return;
00634 }
00635 /*****************************************************************************/
00636 
00637 
00638 
00639 /******************************************************************************
00640 *                European Southern Observatory
00641 *              VLTI MIDI Data Reduction Software 
00642 *
00643 * Module name:    addProdInfoToWaveCalQcLog
00644 * Input/Output:    See function arguments to avoid duplication
00645 * Description:    Adds product information to QC log
00646 *
00647 *
00648 * History:        
00649 * 16-Jan-04        (csabet) Created
00650 ******************************************************************************/
00651 void addProdInfoToWaveCalQcLog (
00652     int                processing,
00653     ImageFormat        *format,    // In: Image format
00654     MidiFiles        *fileNames,
00655     WaveCalibration    *waveCal,    // Ou: Pointer to the waveCal data structure
00656     int                *error)
00657 {
00658 
00659     //    Local Declarations
00660     //    ------------------
00661     const char         routine[] = "addProdInfoToWaveCalQcLog";
00662     int             i, region;
00663     FILE            *inFitsBatchPtr;
00664     char            *stringQfits, *messageBuffer, *currentTime, *textBuff, *cleanString,
00665                     *stringTemp, *classification;
00666     time_t          now;
00667     struct tm        *newTime;
00668     
00669     //    Algorithm
00670     //    ---------
00671     if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking      routine   '%s' \n", routine);
00672     if (diagnostic > 4) fprintf (midiReportPtr, "Invoking      routine   '%s' \n", routine);
00673 
00674     //    Reset parameters
00675     *error = 0;
00676 
00677     //    Allocate memory
00678     classification = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00679     stringTemp = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00680     cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00681     textBuff = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00682     messageBuffer = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00683     currentTime = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
00684     
00685     //    Get current time/date
00686     now = time(NULL);
00687     newTime = gmtime (&now);
00688     strftime (currentTime, MIN_STRING_LENGTH, "%a %d %b %Y at %H:%M:%S", newTime);
00689 
00690     //    Add keyword to QC log file
00691     fprintf (midiQcLogPtr, "PRO.TYPE            \"%s\" \n", format->obsType);
00692     fprintf (midiQcLogPtr, "PRO.CATG            \"REDUCED_WAVECAL\" \n");
00693     fprintf (midiQcLogPtr, "PRO.ARCFILE         \"%s\" \n", fileNames->archFileName);
00694     fprintf (midiQcLogPtr, "PRO.PIPEDATE        \"%s\" \n", currentTime);
00695     fprintf (midiQcLogPtr, "PRO.VERSION         \"%s\" \n", MIDI_PIPE_VERSION);
00696     fprintf (midiQcLogPtr, "PRO.PIPEFILE        \"%s\" \n", fileNames->pipeFileName);
00697     fprintf (midiQcLogPtr, "PRO.DID             \"%s\" \n", MIDI_QC_DIC_VERSION);
00698 
00699     //    Open the list of files
00700     if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch, "r")) == NULL)
00701     {
00702         *error = 1;
00703         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open input FITS file list");
00704         free (messageBuffer);
00705         free (currentTime);
00706         free (cleanString);
00707         free (stringTemp);
00708         free (classification);
00709         free (textBuff);
00710         return;
00711     }
00712 
00713     //    Loop through the list of files and write into the QC log
00714     i = 1;
00715     while (fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
00716     {
00717         sprintf (classification, "%s", "");
00718         sscanf (stringTemp, "%s%s", messageBuffer, classification);
00719         
00720         //    If classification is not given get it from the raw file
00721         if (strcmp (classification, "") == 0)
00722         {
00723             stringQfits = qfits_query_hdr (messageBuffer, "HIERARCH ESO DPR CATG");
00724             if (stringQfits == NULL) 
00725             {
00726                 sprintf (classification, "%s", "UNKNOWN");
00727                 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get Observation Category");
00728             }
00729             else
00730             {
00731                 cleanUpString (stringQfits, cleanString);
00732                 sprintf (classification, "%s", cleanString);
00733             }
00734         }
00735         removePathName (messageBuffer, midiReportPtr);
00736         fprintf (midiQcLogPtr, "PRO.REC1.RAW%d.NAME        \"%s\" \n", i, messageBuffer);
00737         fprintf (midiQcLogPtr, "PRO.REC1.RAW%d.CATG        \"%s\" \n", i++, classification);
00738     }
00739     fclose (inFitsBatchPtr);
00740 
00741     //    Add wavelength parameters
00742     for (region = 0; region < format->numOfDetectorRegions; region++)
00743     {
00744         for (i = 0; i < format->iXWidth; i++)
00745             fprintf (midiQcLogPtr, "QC.WCAL.CH%d.R%d   %f \n", i, region+1, waveCal->calibratedWave[region][i]);
00746     }
00747 
00748     //    If correlation is requested, add correlation errors
00749     if (processing == 1)
00750     {
00751         for (region = 0; region < format->numOfDetectorRegions; region++)
00752             fprintf (midiQcLogPtr, "QC.WCAL.VAR.R%d   %f \n", region+1, waveCal->variance[region]);
00753     }
00754 
00755     //    Release memory
00756     free (messageBuffer);
00757     free (currentTime);
00758     free (textBuff);
00759     free (cleanString);
00760     free (stringTemp);
00761     free (classification);
00762         
00763     return;
00764 }
00765 /*****************************************************************************/
00766 

Generated on 5 Mar 2013 for MIDI Pipeline Reference Manual by  doxygen 1.6.1