00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 void createDetLinProd (
00056 MidiFiles *fileNames,
00057 ImageFormat *format,
00058 int numOfFiles,
00059 DetLinearity *linearity,
00060 int *error)
00061 {
00062
00063
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
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
00084 *error = 0;
00085 arraySize = 10 * numOfFiles;
00086
00087
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
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
00102
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])
00122 {
00123 detLinImage[k] = 1.0;
00124 detLinImage[k+1] = 1.0;
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
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
00150 fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr);
00151 sprintf (classification, "%s", "");
00152 sscanf (stringTemp, "%s%s", fileNames->inFitsName, classification);
00153
00154
00155 createDetLinQcLog (fileNames->inFitsName, error);
00156 if (*error)
00157 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot copy keywords to QC log");
00158
00159
00160 addProdInfoToDetLinQcLog (format, fileNames, linearity, error);
00161
00162
00163 fclose (inFitsBatchPtr);
00164 free (classification);
00165 free (stringTemp);
00166
00167 return;
00168 }
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 void createDetLinPrimHead (
00186 MidiFiles *fileNames,
00187 ImageFormat *format,
00188 int size,
00189 DetLinearity *linearity,
00190 int *error)
00191 {
00192
00193
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
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
00211 *error = 0;
00212
00213
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
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
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
00238 fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr);
00239 sprintf (classification, "%s", "");
00240 sscanf (stringTemp, "%s%s", fileNames->inFitsName, classification);
00241
00242
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
00260 sprintf (sWidthY, "%d", size);
00261 sprintf (sWidthX, "%d", size);
00262
00263
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
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
00281 rewind (inFitsBatchPtr);
00282
00283
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
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
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
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
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
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
00455 qfits_header_sort (&outFitsHeader);
00456 qfits_header_dump (outFitsHeader, outFitsPtr);
00457 fclose (outFitsPtr);
00458 qfits_header_destroy (outFitsHeader);
00459
00460
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
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489 void createDetLinQcLog (
00490 char *inFitsName,
00491 int *error)
00492
00493 {
00494
00495
00496
00497 const char routine[] = "createDetLinQcLog";
00498 char *qfitsString, *emptyString, *cleanString;
00499
00500
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
00506 *error = 0;
00507
00508
00509 emptyString = (char *) calloc (MIN_STRING_LENGTH, sizeof (char));
00510 cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00511
00512
00513 strcpy (emptyString, "\"UNKNOWN\"");
00514
00515
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
00751 free (emptyString);
00752 free (cleanString);
00753
00754 return;
00755 }
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772 void addProdInfoToDetLinQcLog (
00773 ImageFormat *format,
00774 MidiFiles *fileNames,
00775 DetLinearity *linearity,
00776 int *error)
00777 {
00778
00779
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
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
00795 *error = 0;
00796
00797
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
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
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
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
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
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
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
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