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