createProdDetLin.c

00001 
00002 /******************************************************************************
00003 *******************************************************************************
00004 *               European Southern Observatory
00005 *          VLTI MIDI Maintenance Templates Software
00006 *
00007 * Module name:  createProdDetLin.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 "createProdDetLin.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:  createDetLinProd
00049 * Input/Output: See function arguments to avoid duplication
00050 * Description:  Creates MIDI product files
00051 *
00052 * History:      
00053 * 15-Jun-04     (csabet) Created
00054 ******************************************************************************/
00055 void createDetLinProd (
00056     MidiFiles       *fileNames,    // In: Pointer to the file structure
00057     ImageFormat        *format,    // In: Image format
00058     int                numOfFiles,    // In: Number of files
00059     DetLinearity    *linearity,    // Ou: Pointer to the detector linearity data structure
00060     int                *error)        // Ou: Error status
00061 {
00062  
00063     //  Local Declarations
00064     //    ------------------
00065     const char  routine[] = "createDetLinProd";
00066     char        *classification, *stringTemp;
00067     int         i, j, k;
00068     FILE        *inFitsBatchPtr;
00069     float        *detLinImage, max;
00070     int            *select, arraySize, min;
00071     qfitsdumper    qdDetLin;
00072     
00073     //  Algorithm
00074     //    ---------
00075     if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking      routine   '%s' \n", routine);
00076     if (diagnostic > 4) fprintf (midiReportPtr, "Invoking      routine   '%s' \n", routine);
00077 
00078    cpl_msg_info(cpl_func,"\nCreating Product files for DET_LIN from batch  %d \n", batchNumber);
00079    cpl_msg_info(cpl_func,"--------------------------------------------- \n");
00080     fprintf (midiReportPtr, "\nCreating Product files for DET_LIN from batch  %d \n", batchNumber);
00081     fprintf (midiReportPtr, "--------------------------------------------- \n");
00082 
00083     // Reset status
00084     *error = 0;
00085     arraySize = 10 * numOfFiles;
00086     
00087     //    Create the primary header extension
00088     createDetLinPrimHead (fileNames, format, arraySize, linearity, error);
00089     if (*error)
00090     {
00091         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot create Primary Header extension");
00092         return;
00093     }
00094 
00095     //    Allocate memory
00096     stringTemp = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00097     classification = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00098     detLinImage = (float *) calloc (arraySize * arraySize, sizeof (float));
00099     select = (int *) calloc (arraySize, sizeof (int));
00100 
00101     //    Convert Linearity vector into an image and write 
00102     //    into the FITS file. Rather tedious and long-handed method!
00103     max = linearity->mean[0];
00104     for (i = 0; i < numOfFiles; i++)
00105         if (linearity->mean[i] > max) max = linearity->mean[i];
00106 
00107     for (i = 0; i < arraySize; i++)
00108         select[i] = (int) ((100 * linearity->mean[i/10]) / max);
00109         
00110     min = select[0];
00111     for (i = 0; i < arraySize; i++)
00112         if (select[i] < min) min = select[i];
00113     for (i = 0; i < arraySize; i++)
00114         select[i] -= min;
00115 
00116     for (i = 0; i < arraySize; i++)
00117     {
00118         for (j = 0; j < arraySize; j++)
00119         {
00120             k = i * arraySize + j;
00121             if (i+1 == select[j])    // i+1 in order to include last element
00122             {
00123                 detLinImage[k] = 1.0;
00124                 detLinImage[k+1] = 1.0;    // This is safe since arraySize > 2 * numOfFiles
00125                 break;
00126             }
00127         }
00128     }
00129     qdDetLin.filename  = fileNames->outFitsName;
00130     qdDetLin.npix      = arraySize * arraySize;
00131     qdDetLin.ptype     = PTYPE_FLOAT;
00132     qdDetLin.fbuf      = detLinImage;
00133     qdDetLin.out_ptype = BPP_IEEE_FLOAT;
00134     qfits_pixdump (&qdDetLin);
00135 
00136     free (select);
00137     free (detLinImage);
00138 
00139     //  Open the list of files
00140     if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch, "r")) == NULL)
00141     {
00142         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open input FITS file list");
00143         free (stringTemp);
00144         free (classification);
00145         *error = 1;
00146         return;
00147     }
00148         
00149     //  Read the name of the first file in the list and get it's full path name
00150     fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr);
00151     sprintf (classification, "%s", "");
00152     sscanf (stringTemp, "%s%s", fileNames->inFitsName, classification);
00153 
00154     // Copy keywords from the raw FITS file into the QC log
00155     createDetLinQcLog (fileNames->inFitsName, error);
00156     if (*error)
00157         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot copy keywords to QC log");
00158 
00159     //    Add Product info to QC log
00160     addProdInfoToDetLinQcLog (format, fileNames, linearity, error);
00161 
00162     //  Release memory
00163     fclose (inFitsBatchPtr);
00164     free (classification);
00165     free (stringTemp);
00166  
00167     return; 
00168 }
00169 /*****************************************************************************/
00170 
00171 
00172 
00173 /******************************************************************************
00174 *               European Southern Observatory
00175 *            VLTI MIDI Data Reduction Software
00176 *
00177 * Module name:  createDetLinPrimHead
00178 * Input/Output: See function arguments to avoid duplication
00179 * Description:  Creates the primary header
00180 *
00181 *
00182 * History:
00183 * 08-Jun-05     (csabet) Created
00184 ******************************************************************************/
00185 void createDetLinPrimHead (
00186     MidiFiles       *fileNames,    // In: Pointer to the file structure
00187     ImageFormat        *format,    // In: Image format
00188     int                size,        // In: Number of files
00189     DetLinearity    *linearity,    // Ou: Pointer to the detector linearity data structure
00190     int                *error)        // Ou: Error status
00191 {
00192 
00193     //    Local Declarations
00194     //    ------------------
00195     const char      routine[] = "createDetLinPrimHead";
00196     qfits_header    *outFitsHeader;
00197     FILE            *inFitsBatchPtr=NULL, *outFitsPtr;
00198     int             i;
00199     char            *textBuff, *stringQfits, *messageBuffer, *currentTime, *cleanString,
00200                     *stringTemp, *classification, *sWidthX, *sWidthY, *tech;
00201     time_t          now;
00202     struct tm       *newTime;
00203     struct stat     buf;
00204 
00205     //    Algorithm
00206     //    ---------
00207     if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking      routine   '%s' \n", routine);
00208     if (diagnostic > 4) fprintf(midiReportPtr, "Invoking      routine   '%s' \n", routine);
00209 
00210     //    Reset parameters
00211     *error = 0;
00212 
00213     //    Open list of files
00214     if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch, "r")) == NULL)
00215     {
00216         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open input FITS file list");
00217         *error = 1;
00218         return;
00219     }
00220 
00221     //    Allocate memory
00222     tech = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00223     textBuff = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00224     classification = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00225     stringTemp = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00226     cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00227     messageBuffer = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00228     currentTime = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
00229     sWidthX = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
00230     sWidthY = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
00231 
00232     //    Get current time/date
00233     now = time(NULL);
00234     newTime = gmtime (&now);
00235     strftime (currentTime, MIN_STRING_LENGTH, "%a %d %b %Y at %H:%M:%S", newTime);
00236 
00237     //    Read the name of the first file in the list and get it's full path name
00238     fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr);
00239     sprintf (classification, "%s", "");
00240     sscanf (stringTemp, "%s%s", fileNames->inFitsName, classification);
00241 
00242     //    Copy primary header from the raw file to the output header
00243     outFitsHeader = qfits_header_read (fileNames->inFitsName);
00244     if (outFitsHeader == NULL)
00245     {
00246         *error = 1;
00247         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot load header from the input FITS file");
00248         free (messageBuffer);
00249         free (currentTime);
00250         free (cleanString);
00251         free (stringTemp);
00252         free (classification);
00253         free (textBuff);
00254         free (sWidthX);
00255         free (sWidthY);
00256         return;
00257     }
00258 
00259     //    Write all NAXIS values as character strings
00260     sprintf (sWidthY, "%d", size);
00261     sprintf (sWidthX, "%d", size);
00262 
00263     //    Updates header for the DetRon output file
00264     qfits_header_mod (outFitsHeader, "BITPIX", "-32", "number of bits per pixel"); 
00265     qfits_header_mod (outFitsHeader, "NAXIS", "2", "number of data axes"); 
00266     qfits_header_add (outFitsHeader, "NAXIS1", sWidthX, "", NULL);
00267     qfits_header_add (outFitsHeader, "NAXIS2", sWidthY, "", NULL);
00268     qfits_header_mod (outFitsHeader, "INSTRUME", "MIDI", "MIDI Raw Data Display FITS created by DRS pipeline" );  
00269 
00270     //    Now write all the required product keaywords to the output header
00271     //    -----------------------------------------------------------------
00272     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO TYPE", format->obsType, "MIDI pipeline product type", NULL);
00273     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO CATG", "REDUCED_DETLIN", "Pipeline product category", NULL);
00274     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO ARCFILE", fileNames->archFileName, "Arcfile name of first raw file", NULL);
00275     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO PIPEDATE", currentTime, "Pipeline run date", "");
00276     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO VERSION", MIDI_PIPE_VERSION, "Pipeline version", NULL);
00277     qfits_header_add (outFitsHeader, "PIPEFILE", fileNames->pipeFileName, "Pipeline product file name", NULL);
00278     qfits_header_add (outFitsHeader, "HIERARCH ESO PRO DID", MIDI_QC_DIC_VERSION, "QC dictionary version", NULL);
00279 
00280     //    Rewind the list of files
00281     rewind (inFitsBatchPtr);
00282     
00283     //    Loop through the list of files and write into the primary header
00284     i = 0;
00285     while (fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
00286     {
00287         sprintf (classification, "%s", "");
00288         sscanf (stringTemp, "%s%s", messageBuffer, classification);
00289 
00290         //    Get Technique
00291         stringQfits = qfits_query_hdr (messageBuffer, "HIERARCH ESO DPR TECH");
00292         if (stringQfits == NULL)
00293         {
00294             sprintf (tech, "%s", "UNKNOWN");
00295             midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get Observation Technique");
00296         }
00297         else
00298         {
00299             cleanUpString (stringQfits, cleanString);
00300             sprintf (tech, "%s", cleanString);
00301         }
00302         
00303         //    If classification is not given get it from the raw file
00304         if (strcmp (classification, "") == 0)
00305         {
00306             stringQfits = qfits_query_hdr (messageBuffer, "HIERARCH ESO DPR CATG");
00307             if (stringQfits == NULL)
00308             {
00309                 sprintf (classification, "%s", "UNKNOWN");
00310                 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get Observation Category");
00311             }
00312             else
00313             {
00314                 cleanUpString (stringQfits, cleanString);
00315                 sprintf (classification, "%s", cleanString);
00316             }
00317         }
00318         removePathName (messageBuffer, midiReportPtr);
00319         sprintf (textBuff, "HIERARCH ESO PRO REC1 RAW%d NAME", i+1);
00320         qfits_header_add (outFitsHeader, textBuff, messageBuffer, "FITS file name", "");
00321         sprintf (textBuff, "HIERARCH ESO PRO REC1 RAW%d CATG", i+1);
00322         qfits_header_add (outFitsHeader, textBuff, classification, "Observation Categoty", "");
00323 
00324         if (strcmp (tech, "OTHER") != 0)
00325         {
00326             sprintf (messageBuffer, "%d", linearity->saturated[i]);
00327             sprintf (textBuff, "HIERARCH ESO PRO REC1 RAW%d STATUS", i+1);
00328             qfits_header_add (outFitsHeader, textBuff, messageBuffer, "1 means saturated", "");
00329             sprintf (messageBuffer, "%f", linearity->integTime[i]);
00330             sprintf (textBuff, "HIERARCH ESO PRO REC1 RAW%d DIT", i+1);
00331             qfits_header_add (outFitsHeader, textBuff, messageBuffer, "Integration time", "");
00332         }
00333         i++;
00334     }
00335     fclose (inFitsBatchPtr);
00336 
00337     //    Add Image parameters
00338     if (strcmp (linearity->grismId, "OPEN") == 0)
00339     {
00340         sprintf (messageBuffer, "%s", linearity->grismId);
00341         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN IM NAME", messageBuffer, "Grism Name", "");
00342         sprintf (messageBuffer, "%d", linearity->winx);
00343         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN IM WINX", messageBuffer, "x coordinate", "");
00344         sprintf (messageBuffer, "%d", linearity->windx);
00345         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN IM WINDX", messageBuffer, "dx coordinate", "");
00346         sprintf (messageBuffer, "%d", linearity->winy);
00347         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN IM WINY", messageBuffer, "y coordinate", "");
00348         sprintf (messageBuffer, "%d", linearity->windy);
00349         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN IM WINDX", messageBuffer, "dx coordinate", "");
00350         sprintf (messageBuffer, "%f", linearity->meanCoeffA0);
00351         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN IM A0", messageBuffer, "Linearity Coefficient", "");
00352         sprintf (messageBuffer, "%f", linearity->meanCoeffA1);
00353         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN IM A1", messageBuffer, "Linearity Coefficient", "");
00354         sprintf (messageBuffer, "%f", linearity->meanCoeffA2);
00355         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN IM A2", messageBuffer, "Linearity Coefficient", "");
00356         sprintf (messageBuffer, "%f", linearity->meanCoeffA3);
00357         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN IM A3", messageBuffer, "Linearity Coefficient", "");
00358         sprintf (messageBuffer, "%f", linearity->meanSigma);
00359         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN IM SIG", messageBuffer, "Mean linearity standard deviation", "");
00360     }
00361     else if (strcmp (linearity->grismId, "PRISM") == 0)
00362     {
00363         sprintf (messageBuffer, "%s", linearity->grismId);
00364         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN PR NAME", messageBuffer, "Grism Name", "");
00365         sprintf (messageBuffer, "%d", linearity->winx);
00366         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN PR WINX", messageBuffer, "x coordinate", "");
00367         sprintf (messageBuffer, "%d", linearity->windx);
00368         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN PR WINDX", messageBuffer, "dx coordinate", "");
00369         sprintf (messageBuffer, "%d", linearity->winy);
00370         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN PR WINY", messageBuffer, "y coordinate", "");
00371         sprintf (messageBuffer, "%d", linearity->windy);
00372         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN PR WINDX", messageBuffer, "dx coordinate", "");
00373         sprintf (messageBuffer, "%f", linearity->meanCoeffA0);
00374         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN PR A0", messageBuffer, "Linearity Coefficient", "");
00375         sprintf (messageBuffer, "%f", linearity->meanCoeffA1);
00376         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN PR A1", messageBuffer, "Linearity Coefficient", "");
00377         sprintf (messageBuffer, "%f", linearity->meanCoeffA2);
00378         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN PR A2", messageBuffer, "Linearity Coefficient", "");
00379         sprintf (messageBuffer, "%f", linearity->meanCoeffA3);
00380         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN PR A3", messageBuffer, "Linearity Coefficient", "");
00381         sprintf (messageBuffer, "%f", linearity->meanSigma);
00382         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN PR SIG", messageBuffer, "Mean linearity standard deviation", "");
00383     }
00384     else if (strcmp (linearity->grismId, "GRISM") == 0)
00385     {
00386         sprintf (messageBuffer, "%s", linearity->grismId);
00387         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN GR NAME", messageBuffer, "Grism Name", "");
00388         sprintf (messageBuffer, "%d", linearity->winx);
00389         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN GR WINX", messageBuffer, "x coordinate", "");
00390         sprintf (messageBuffer, "%d", linearity->windx);
00391         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN GR WINDX", messageBuffer, "dx coordinate", "");
00392         sprintf (messageBuffer, "%d", linearity->winy);
00393         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN GR WINY", messageBuffer, "y coordinate", "");
00394         sprintf (messageBuffer, "%d", linearity->windy);
00395         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN GR WINDX", messageBuffer, "dx coordinate", "");
00396         sprintf (messageBuffer, "%f", linearity->meanCoeffA0);
00397         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN GR A0", messageBuffer, "Linearity Coefficient", "");
00398         sprintf (messageBuffer, "%f", linearity->meanCoeffA1);
00399         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN GR A1", messageBuffer, "Linearity Coefficient", "");
00400         sprintf (messageBuffer, "%f", linearity->meanCoeffA2);
00401         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN GR A2", messageBuffer, "Linearity Coefficient", "");
00402         sprintf (messageBuffer, "%f", linearity->meanCoeffA3);
00403         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN GR A3", messageBuffer, "Linearity Coefficient", "");
00404         sprintf (messageBuffer, "%f", linearity->meanSigma);
00405         qfits_header_add (outFitsHeader, "HIERARCH ESO QC DETLIN GR SIG", messageBuffer, "Mean linearity standard deviation", "");
00406     }
00407     else
00408     {
00409         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Unknown Dispersive element");
00410         *error = 1;
00411         free (messageBuffer);
00412         free (currentTime);
00413         free (cleanString);
00414         free (stringTemp);
00415         free (classification);
00416         free (textBuff);
00417         return;
00418     }
00419 
00420 
00421     //    Place Holders
00422     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH1", "TBD", "TBD", "");
00423     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH2", "TBD", "TBD", "");
00424     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH3", "TBD", "TBD", "");
00425     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH4", "TBD", "TBD", "");
00426     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH5", "TBD", "TBD", "");
00427     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH6", "TBD", "TBD", "");
00428     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH7", "TBD", "TBD", "");
00429     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH8", "TBD", "TBD", "");
00430     qfits_header_add (outFitsHeader, "HIERARCH ESO QC PLACEH9", "TBD", "TBD", "");
00431     
00432     //    Create the output fits file. If the file exist delete it
00433     if (stat (fileNames->outFitsName, &buf) == 0) remove (fileNames->outFitsName);
00434 
00435     outFitsPtr = fopen (fileNames->outFitsName, "w");
00436     if (!outFitsPtr)
00437     {
00438         *error = 1;
00439         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot create output FITS file");
00440         free (messageBuffer);
00441         free (currentTime);
00442         free (cleanString);
00443         free (stringTemp);
00444         free (classification);
00445         free (textBuff);
00446         free (sWidthX);
00447         free (sWidthY);        
00448         return;
00449     }
00450 
00451    cpl_msg_info(cpl_func,"Created Product FITS file: %s \n", fileNames->outFitsName);
00452     fprintf (midiReportPtr, "Created Product FITS file: %s \n", fileNames->outFitsName);
00453 
00454     //    Write header into the output file
00455     qfits_header_sort (&outFitsHeader);
00456     qfits_header_dump (outFitsHeader, outFitsPtr);
00457     fclose (outFitsPtr);
00458     qfits_header_destroy (outFitsHeader);
00459 
00460     //    release memory
00461     free (messageBuffer);
00462     free (currentTime);
00463     free (cleanString);
00464     free (stringTemp);
00465     free (classification);
00466     free (tech);
00467     free (textBuff);
00468     free (sWidthX);    
00469     free (sWidthY);
00470 
00471     return;
00472 }
00473 /*****************************************************************************/
00474 
00475 
00476 
00477 /******************************************************************************
00478 *                European Southern Observatory
00479 *              VLTI MIDI Data Reduction Software 
00480 *
00481 * Module name:    createDetLinQcLog
00482 * Input/Output:    See function arguments to avoid duplication
00483 * Description:    Copies keywords from the raw input FITS primary header to the 
00484 *               QC log and adds additional product keywords
00485 *
00486 * History:        
00487 * 30-Aug-04        (csabet) Created
00488 ******************************************************************************/
00489 void createDetLinQcLog (
00490     char    *inFitsName,//    In:    Name of the raw FITS file
00491     int        *error)        //    Ou:    Status
00492     
00493 {
00494 
00495     /*    Local Declarations
00496     --------------------*/
00497     const char         routine[] = "createDetLinQcLog";
00498     char            *qfitsString, *emptyString, *cleanString;
00499 
00500     /*    Algorithm
00501     -----------*/
00502     if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking      routine   '%s' \n", routine);
00503     if (diagnostic > 4) fprintf(midiReportPtr, "Invoking      routine   '%s' \n", routine);
00504 
00505     /* Reset status */
00506     *error = 0;
00507 
00508     /* Allocate memory */
00509     emptyString = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
00510     cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00511 
00512     /*    Initialise empty string */
00513     strcpy (emptyString, "\"UNKNOWN\"");
00514 
00515     /* Get all the keywords */
00516     qfitsString = qfits_query_hdr (inFitsName, "ARCFILE");
00517     if (qfitsString == NULL) 
00518         fprintf (midiQcLogPtr, "ARCFILE             %s \n", emptyString);
00519     else {cleanUpString (qfitsString, cleanString); 
00520         fprintf (midiQcLogPtr, "ARCFILE             \"%s\" \n", cleanString);}
00521 
00522     qfitsString = qfits_query_hdr (inFitsName, "TELESCOP");
00523     if (qfitsString == NULL) 
00524         fprintf (midiQcLogPtr, "TELESCOP            %s \n", emptyString);
00525     else {cleanUpString (qfitsString, cleanString); 
00526         fprintf (midiQcLogPtr, "TELESCOP            \"%s\" \n", cleanString);}
00527     
00528     qfitsString = qfits_query_hdr (inFitsName, "INSTRUME");
00529     if (qfitsString == NULL) 
00530         fprintf (midiQcLogPtr, "INSTRUME            %s \n", emptyString);
00531     else {cleanUpString (qfitsString, cleanString); 
00532         fprintf (midiQcLogPtr, "INSTRUME            \"%s\" \n", cleanString);}
00533     
00534     qfitsString = qfits_query_hdr (inFitsName, "MJD-OBS");
00535     if (qfitsString == NULL) 
00536         fprintf (midiQcLogPtr, "MJD-OBS             %s \n", emptyString);
00537     else {cleanUpString (qfitsString, cleanString); 
00538         fprintf (midiQcLogPtr, "MJD-OBS             \"%s\" \n", cleanString);}
00539     
00540     qfitsString = qfits_query_hdr (inFitsName, "DATE-OBS");
00541     if (qfitsString == NULL) 
00542         fprintf (midiQcLogPtr, "DATE-OBS            %s \n", emptyString);
00543     else {cleanUpString (qfitsString, cleanString); 
00544         fprintf (midiQcLogPtr, "DATE-OBS            \"%s\" \n", cleanString);}
00545     
00546     qfitsString = qfits_query_hdr (inFitsName, "UTC");
00547     if (qfitsString == NULL) 
00548         fprintf (midiQcLogPtr, "UTC                 %s \n", emptyString);
00549     else {cleanUpString (qfitsString, cleanString); 
00550         fprintf (midiQcLogPtr, "UTC                 %s \n", cleanString);}
00551     
00552     qfitsString = qfits_query_hdr (inFitsName, "LST");
00553     if (qfitsString == NULL) 
00554         fprintf (midiQcLogPtr, "LST                 %s \n", emptyString);
00555     else {cleanUpString (qfitsString, cleanString); 
00556         fprintf (midiQcLogPtr, "LST                 %s \n", cleanString);}
00557     
00558     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET CHIP NX");
00559     if (qfitsString == NULL) 
00560         fprintf (midiQcLogPtr, "DET.CHIP.NX         %s \n", emptyString);
00561     else {cleanUpString (qfitsString, cleanString); 
00562         fprintf (midiQcLogPtr, "DET.CHIP.NX         %s \n", cleanString);}
00563     
00564     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET CHIP NY");
00565     if (qfitsString == NULL) 
00566         fprintf (midiQcLogPtr, "DET.CHIP.NY         %s \n", emptyString);
00567     else {cleanUpString (qfitsString, cleanString); 
00568         fprintf (midiQcLogPtr, "DET.CHIP.NY         %s \n", cleanString);}
00569     
00570     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET DIT");
00571     if (qfitsString == NULL) 
00572         fprintf (midiQcLogPtr, "DET.DIT             %s \n", emptyString);
00573     else {cleanUpString (qfitsString, cleanString); 
00574         fprintf (midiQcLogPtr, "DET.DIT             %s \n", cleanString);}
00575     
00576     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET DITDELAY");
00577     if (qfitsString == NULL) 
00578         fprintf (midiQcLogPtr, "DET.DITDELAY        %s \n", emptyString);
00579     else {cleanUpString (qfitsString, cleanString); 
00580         fprintf (midiQcLogPtr, "DET.DITDELAY        %s \n", cleanString);}
00581     
00582     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET INT MODE");
00583     if (qfitsString == NULL) 
00584         fprintf (midiQcLogPtr, "DET.INT.MODE        %s \n", emptyString);
00585     else {cleanUpString (qfitsString, cleanString); 
00586         fprintf (midiQcLogPtr, "DET.INT.MODE        \"%s\" \n", cleanString);}
00587     
00588     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET NDIT");
00589     if (qfitsString == NULL) 
00590         fprintf (midiQcLogPtr, "DET.NDIT            %s \n", emptyString);
00591     else {cleanUpString (qfitsString, cleanString); 
00592         fprintf (midiQcLogPtr, "DET.NDIT            %s \n", cleanString);}
00593     
00594     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET NRTS MODE");
00595     if (qfitsString == NULL) 
00596         fprintf (midiQcLogPtr, "DET.NRTS.MODE       %s \n", emptyString);
00597     else {cleanUpString (qfitsString, cleanString); 
00598         fprintf (midiQcLogPtr, "DET.NRTS.MODE       \"%s\" \n", cleanString);}
00599     
00600     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN1 NX");
00601     if (qfitsString == NULL) 
00602         fprintf (midiQcLogPtr, "DET.WIN1.NX         %s \n", emptyString);
00603     else {cleanUpString (qfitsString, cleanString); 
00604         fprintf (midiQcLogPtr, "DET.WIN1.NX         %s \n", cleanString);}
00605     
00606     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN1 NY");
00607     if (qfitsString == NULL) 
00608         fprintf (midiQcLogPtr, "DET.WIN1.NY         %s \n", emptyString);
00609     else {cleanUpString (qfitsString, cleanString); 
00610         fprintf (midiQcLogPtr, "DET.WIN1.NY         %s \n", cleanString);}
00611     
00612     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN2 NX");
00613     if (qfitsString == NULL) 
00614         fprintf (midiQcLogPtr, "DET.WIN2.NX         %s \n", emptyString);
00615     else {cleanUpString (qfitsString, cleanString); 
00616         fprintf (midiQcLogPtr, "DET.WIN2.NX         %s \n", cleanString);}
00617     
00618     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DET WIN2 NY");
00619     if (qfitsString == NULL) 
00620         fprintf (midiQcLogPtr, "DET.WIN2.NY         %s \n", emptyString);
00621     else {cleanUpString (qfitsString, cleanString); 
00622         fprintf (midiQcLogPtr, "DET.WIN2.NY         %s \n", cleanString);}
00623     
00624     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR CATG");
00625     if (qfitsString == NULL) 
00626         fprintf (midiQcLogPtr, "DPR.CATG            %s \n", emptyString);
00627     else {cleanUpString (qfitsString, cleanString); 
00628         fprintf (midiQcLogPtr, "DPR.CATG            \"%s\" \n", cleanString);}
00629     
00630     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR TECH");
00631     if (qfitsString == NULL) 
00632         fprintf (midiQcLogPtr, "DPR.TECH            %s \n", emptyString);
00633     else {cleanUpString (qfitsString, cleanString); 
00634         fprintf (midiQcLogPtr, "DPR.TECH            \"%s\" \n", cleanString);}
00635     
00636     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO DPR TYPE");
00637     if (qfitsString == NULL) 
00638         fprintf (midiQcLogPtr, "DPR.TYPE            %s \n", emptyString);
00639     else {cleanUpString (qfitsString, cleanString); 
00640         fprintf (midiQcLogPtr, "DPR.TYPE            \"%s\" \n", cleanString);}
00641     
00642     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS CAM NAME");
00643     if (qfitsString == NULL) 
00644         fprintf (midiQcLogPtr, "INS.CAM.NAME        %s \n", emptyString);
00645     else {cleanUpString (qfitsString, cleanString); 
00646         fprintf (midiQcLogPtr, "INS.CAM.NAME        \"%s\" \n", cleanString);}
00647     
00648     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS FILT NAME");
00649     if (qfitsString == NULL) 
00650         fprintf (midiQcLogPtr, "INS.FILT.NAME       %s \n", emptyString);
00651     else {cleanUpString (qfitsString, cleanString); 
00652         fprintf (midiQcLogPtr, "INS.FILT.NAME       \"%s\" \n", cleanString);}
00653 
00654     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS GRIS NAME");
00655     if (qfitsString == NULL) 
00656         fprintf (midiQcLogPtr, "INS.GRIS.NAME       %s \n", emptyString);
00657     else {cleanUpString (qfitsString, cleanString); 
00658         fprintf (midiQcLogPtr, "INS.GRIS.NAME       \"%s\" \n", cleanString);}
00659         
00660     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS MODE");
00661     if (qfitsString == NULL) 
00662         fprintf (midiQcLogPtr, "INS.MODE            %s \n", emptyString);
00663     else {cleanUpString (qfitsString, cleanString); 
00664         fprintf (midiQcLogPtr, "INS.MODE            \"%s\" \n", cleanString);}
00665     
00666     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS OPT1 NAME");
00667     if (qfitsString == NULL) 
00668         fprintf (midiQcLogPtr, "INS.OPT1.NAME       %s \n", emptyString);
00669     else {cleanUpString (qfitsString, cleanString); 
00670         fprintf (midiQcLogPtr, "INS.OPT1.NAME       \"%s\" \n", cleanString);}
00671     
00672     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS OPT1 TYPE");
00673     if (qfitsString == NULL) 
00674         fprintf (midiQcLogPtr, "INS.OPT1.TYPE       %s \n", emptyString);
00675     else {cleanUpString (qfitsString, cleanString); 
00676         fprintf (midiQcLogPtr, "INS.OPT1.TYPE       \"%s\" \n", cleanString);}
00677     
00678     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS SHUT NAME");
00679     if (qfitsString == NULL) 
00680         fprintf (midiQcLogPtr, "INS.SHUT.NAME       %s \n", emptyString);
00681     else {cleanUpString (qfitsString, cleanString); 
00682         fprintf (midiQcLogPtr, "INS.SHUT.NAME       \"%s\" \n", cleanString);}
00683     
00684     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO INS SLIT NAME");
00685     if (qfitsString == NULL) 
00686         fprintf (midiQcLogPtr, "INS.SLIT.NAME       %s \n", emptyString);
00687     else {cleanUpString (qfitsString, cleanString); 
00688         fprintf (midiQcLogPtr, "INS.SLIT.NAME       \"%s\" \n", cleanString);}
00689     
00690     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS ID");
00691     if (qfitsString == NULL) 
00692         fprintf (midiQcLogPtr, "OBS.ID              %s \n", emptyString);
00693     else {cleanUpString (qfitsString, cleanString); 
00694         fprintf (midiQcLogPtr, "OBS.ID              \"%s\" \n", cleanString);}
00695     
00696     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS NAME");
00697     if (qfitsString == NULL) 
00698         fprintf (midiQcLogPtr, "OBS.NAME            %s \n", emptyString);
00699     else {cleanUpString (qfitsString, cleanString); 
00700         fprintf (midiQcLogPtr, "OBS.NAME            \"%s\" \n", cleanString);}
00701     
00702     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PI-COI ID");
00703     if (qfitsString == NULL) 
00704         fprintf (midiQcLogPtr, "OBS.PI-COI.ID       %s \n", emptyString);
00705     else {cleanUpString (qfitsString, cleanString); 
00706         fprintf (midiQcLogPtr, "OBS.PI-COI.ID       %s \n", cleanString);}
00707     
00708     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PI-COI NAME");
00709     if (qfitsString == NULL) 
00710         fprintf (midiQcLogPtr, "OBS.PI-COI.NAME     %s \n", emptyString);
00711     else {cleanUpString (qfitsString, cleanString); 
00712         fprintf (midiQcLogPtr, "OBS.PI-COI.NAME     \"%s\" \n", cleanString);}
00713     
00714     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS PROG ID");
00715     if (qfitsString == NULL) 
00716         fprintf (midiQcLogPtr, "OBS.PROG.ID         %s \n", emptyString);
00717     else {cleanUpString (qfitsString, cleanString); 
00718         fprintf (midiQcLogPtr, "OBS.PROG.ID         \"%s\" \n", cleanString);}
00719     
00720     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS START");
00721     if (qfitsString == NULL) 
00722         fprintf (midiQcLogPtr, "OBS.START           %s \n", emptyString);
00723     else {cleanUpString (qfitsString, cleanString); 
00724         fprintf (midiQcLogPtr, "OBS.START           \"%s\" \n", cleanString);}
00725     
00726     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OBS TARG NAME");
00727     if (qfitsString == NULL) 
00728         fprintf (midiQcLogPtr, "OBS.TARG.NAME       %s \n", emptyString);
00729     else {cleanUpString (qfitsString, cleanString); 
00730         fprintf (midiQcLogPtr, "OBS.TARG.NAME       \"%s\" \n", cleanString);}
00731     
00732     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO OCS EXPO1 FNAME1");
00733     if (qfitsString == NULL) 
00734         fprintf (midiQcLogPtr, "OCS.EXPO1.FNAME1    %s \n", emptyString);
00735     else {cleanUpString (qfitsString, cleanString); 
00736         fprintf (midiQcLogPtr, "OCS.EXPO1.FNAME1    \"%s\" \n", cleanString);}
00737     
00738     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO TPL ID");
00739     if (qfitsString == NULL) 
00740         fprintf (midiQcLogPtr, "TPL.ID              %s \n", emptyString);
00741     else {cleanUpString (qfitsString, cleanString); 
00742         fprintf (midiQcLogPtr, "TPL.ID              \"%s\" \n", cleanString);}
00743     
00744     qfitsString = qfits_query_hdr (inFitsName, "HIERARCH ESO TPL START");
00745     if (qfitsString == NULL) 
00746         fprintf (midiQcLogPtr, "TPL.START           %s \n", emptyString);
00747     else {cleanUpString (qfitsString, cleanString); 
00748         fprintf (midiQcLogPtr, "TPL.START           \"%s\" \n", cleanString);}
00749     
00750     /* Release memory */
00751     free (emptyString);
00752     free (cleanString);
00753     
00754     return;
00755 }
00756 /*****************************************************************************/
00757 
00758 
00759 
00760 /******************************************************************************
00761 *                European Southern Observatory
00762 *              VLTI MIDI Data Reduction Software 
00763 *
00764 * Module name:    addProdInfoToDetLinQcLog
00765 * Input/Output:    See function arguments to avoid duplication
00766 * Description:    Adds product information to QC log
00767 *
00768 *
00769 * History:        
00770 * 16-Jan-04        (csabet) Created
00771 ******************************************************************************/
00772 void addProdInfoToDetLinQcLog (
00773     ImageFormat        *format,    // In: Image format
00774     MidiFiles        *fileNames,
00775     DetLinearity    *linearity,    // Ou: Pointer to the detector linearity data structure
00776     int                *error)
00777 {
00778 
00779     /*    Local Declarations
00780     --------------------*/
00781     const char         routine[] = "addProdInfoToDetLinQcLog";
00782     int             i;
00783     FILE            *inFitsBatchPtr;
00784     char            *stringQfits, *messageBuffer, *currentTime, *textBuff, *cleanString,
00785                     *stringTemp, *classification, *tech;
00786     time_t          now;
00787     struct tm        *newTime;
00788     
00789     /*    Algorithm
00790     -----------*/
00791     if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking      routine   '%s' \n", routine);
00792     if (diagnostic > 4) fprintf (midiReportPtr, "Invoking      routine   '%s' \n", routine);
00793 
00794     /* Reset parameters */
00795     *error = 0;
00796 
00797     /*    Allocate memory */
00798     tech = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00799     classification = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00800     stringTemp = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00801     cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00802     textBuff = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00803     messageBuffer = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00804     currentTime = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
00805     
00806     /*    Get current time/date */
00807     now = time(NULL);
00808     newTime = gmtime (&now);
00809     strftime (currentTime, MIN_STRING_LENGTH, "%a %d %b %Y at %H:%M:%S", newTime);
00810 
00811     //    Add keyword to QC log file
00812     fprintf (midiQcLogPtr, "PRO.TYPE            \"%s\" \n", format->obsType);
00813     fprintf (midiQcLogPtr, "PRO.CATG            \"REDUCED_DETLIN\" \n");
00814     fprintf (midiQcLogPtr, "PRO.ARCFILE         \"%s\" \n", fileNames->archFileName);
00815     fprintf (midiQcLogPtr, "PRO.PIPEDATE        \"%s\" \n", currentTime);
00816     fprintf (midiQcLogPtr, "PRO.VERSION         \"%s\" \n", MIDI_PIPE_VERSION);
00817     fprintf (midiQcLogPtr, "PRO.PIPEFILE        \"%s\" \n", fileNames->pipeFileName);
00818     fprintf (midiQcLogPtr, "PRO.DID             \"%s\" \n", MIDI_QC_DIC_VERSION);
00819 
00820     /*  Open the list of files */
00821     if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch, "r")) == NULL)
00822     {
00823         *error = 1;
00824         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open input FITS file list");
00825         free (messageBuffer);
00826         free (currentTime);
00827         free (cleanString);
00828         free (stringTemp);
00829         free (classification);
00830         free (textBuff);
00831         return;
00832     }
00833 
00834     /* Loop through the list of files and write into the QC log */
00835     i = 0;
00836     while (fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
00837     {
00838         sprintf (classification, "%s", "");
00839         sscanf (stringTemp, "%s%s", messageBuffer, classification);
00840 
00841         //    Get Technique
00842         stringQfits = qfits_query_hdr (messageBuffer, "HIERARCH ESO DPR TECH");
00843         if (stringQfits == NULL)
00844         {
00845             sprintf (tech, "%s", "UNKNOWN");
00846             midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get Observation Technique");
00847         }
00848         else
00849         {
00850             cleanUpString (stringQfits, cleanString);
00851             sprintf (tech, "%s", cleanString);
00852         }
00853         
00854         /* If classification is not given get it from the raw file */
00855         if (strcmp (classification, "") == 0)
00856         {
00857             stringQfits = qfits_query_hdr (messageBuffer, "HIERARCH ESO DPR CATG");
00858             if (stringQfits == NULL) 
00859             {
00860                 sprintf (classification, "%s", "UNKNOWN");
00861                 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get Observation Category");
00862             }
00863             else
00864             {
00865                 cleanUpString (stringQfits, cleanString);
00866                 sprintf (classification, "%s", cleanString);
00867             }
00868         }
00869         removePathName (messageBuffer, midiReportPtr);
00870         fprintf (midiQcLogPtr, "PRO.REC1.RAW%d.NAME        \"%s\" \n", i+1, messageBuffer);
00871         fprintf (midiQcLogPtr, "PRO.REC1.RAW%d.CATG        \"%s\" \n", i+1, classification);
00872         if (strcmp (tech, "OTHER") != 0)
00873         {
00874             fprintf (midiQcLogPtr, "PRO.REC1.RAW%d.STATUS      %d \n", i+1, linearity->saturated[i]);
00875             fprintf (midiQcLogPtr, "PRO.REC1.RAW%d.DIT         %f \n", i+1, linearity->integTime[i]);
00876         }
00877         i++;
00878     }
00879     fclose (inFitsBatchPtr);
00880 
00881     if (strcmp (linearity->grismId, "OPEN") == 0)
00882     {
00883 
00884         fprintf (midiQcLogPtr, "QC.DETLIN.IM.NAME  \"%s\" \n", linearity->grismId);
00885         fprintf (midiQcLogPtr, "QC.DETLIN.IM.WINX  %d \n", linearity->winx);
00886         fprintf (midiQcLogPtr, "QC.DETLIN.IM.WINDX %d \n", linearity->windx);
00887         fprintf (midiQcLogPtr, "QC.DETLIN.IM.WINY  %d \n", linearity->winy);
00888         fprintf (midiQcLogPtr, "QC.DETLIN.IM.WINDY %d \n", linearity->windy);
00889         fprintf (midiQcLogPtr, "QC.DETLIN.IM.A0    %f \n", linearity->meanCoeffA0);
00890         fprintf (midiQcLogPtr, "QC.DETLIN.IM.A1    %f \n", linearity->meanCoeffA1);
00891         fprintf (midiQcLogPtr, "QC.DETLIN.IM.A2    %f \n", linearity->meanCoeffA2);
00892         fprintf (midiQcLogPtr, "QC.DETLIN.IM.A3    %f \n", linearity->meanCoeffA3);
00893         fprintf (midiQcLogPtr, "QC.DETLIN.IM.SIG   %f \n", linearity->meanSigma);
00894     }
00895     else if (strcmp (linearity->grismId, "PRISM") == 0)
00896     {
00897         fprintf (midiQcLogPtr, "QC.DETLIN.PR.NAME  \"%s\" \n", linearity->grismId);
00898         fprintf (midiQcLogPtr, "QC.DETLIN.PR.WINX  %d \n", linearity->winx);
00899         fprintf (midiQcLogPtr, "QC.DETLIN.PR.WINDX %d \n", linearity->windx);
00900         fprintf (midiQcLogPtr, "QC.DETLIN.PR.WINY  %d \n", linearity->winy);
00901         fprintf (midiQcLogPtr, "QC.DETLIN.PR.WINDY %d \n", linearity->windy);
00902         fprintf (midiQcLogPtr, "QC.DETLIN.PR.A0    %f \n", linearity->meanCoeffA0);
00903         fprintf (midiQcLogPtr, "QC.DETLIN.PR.A1    %f \n", linearity->meanCoeffA1);
00904         fprintf (midiQcLogPtr, "QC.DETLIN.PR.A2    %f \n", linearity->meanCoeffA2);
00905         fprintf (midiQcLogPtr, "QC.DETLIN.PR.A3    %f \n", linearity->meanCoeffA3);
00906         fprintf (midiQcLogPtr, "QC.DETLIN.PR.SIG   %f \n", linearity->meanSigma);
00907     }
00908     else if (strcmp (linearity->grismId, "GRISM") == 0)
00909     {
00910         fprintf (midiQcLogPtr, "QC.DETLIN.GR.NAME  \"%s\" \n", linearity->grismId);
00911         fprintf (midiQcLogPtr, "QC.DETLIN.GR.WINX  %d \n", linearity->winx);
00912         fprintf (midiQcLogPtr, "QC.DETLIN.GR.WINDX %d \n", linearity->windx);
00913         fprintf (midiQcLogPtr, "QC.DETLIN.GR.WINY  %d \n", linearity->winy);
00914         fprintf (midiQcLogPtr, "QC.DETLIN.GR.WINDY %d \n", linearity->windy);
00915         fprintf (midiQcLogPtr, "QC.DETLIN.GR.A0    %f \n", linearity->meanCoeffA0);
00916         fprintf (midiQcLogPtr, "QC.DETLIN.GR.A1    %f \n", linearity->meanCoeffA1);
00917         fprintf (midiQcLogPtr, "QC.DETLIN.GR.A2    %f \n", linearity->meanCoeffA2);
00918         fprintf (midiQcLogPtr, "QC.DETLIN.GR.A3    %f \n", linearity->meanCoeffA3);
00919         fprintf (midiQcLogPtr, "QC.DETLIN.GR.SIG   %f \n", linearity->meanSigma);
00920     }
00921     else
00922     {
00923         midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Unknown Dispersive element");
00924         *error = 1;
00925         free (messageBuffer);
00926         free (currentTime);
00927         free (cleanString);
00928         free (stringTemp);
00929         free (classification);
00930         free (textBuff);
00931         return;
00932     }
00933 
00934     /*    release memory */
00935     free (tech);
00936     free (messageBuffer);
00937     free (currentTime);
00938     free (textBuff);
00939     free (cleanString);
00940     free (stringTemp);
00941     free (classification);
00942         
00943     return;
00944 }
00945 /*****************************************************************************/
00946 

Generated on 11 Feb 2011 for MIDI Pipeline Reference Manual by  doxygen 1.6.1