createProdDetRon.c

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

Generated on 15 Mar 2012 for MIDI Pipeline Reference Manual by  doxygen 1.6.1