24 #include "midiGlobal.h"
26 #include "imageProcessing.h"
27 #include "memoryHandling.h"
28 #include "createProdDspTrn.h"
29 #include "procDspTrn.h"
30 #include "errorHandling.h"
31 #include "midiFitsUtility.h"
32 #include "fitsAnalysisTec.h"
33 #include "diagnostics.h"
68 const char routine[] =
"procDspTrn";
69 ImageFormat *format=NULL;
70 DispersiveTrans *trans=NULL;
72 FILE *signaturePtr=NULL;
76 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
77 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
80 signaturePtr = fopen (
"MIDI_sig_trn.log",
"w");
81 fclose (signaturePtr);
88 format = callocImageFormat ();
90 analyseFitsDspTrn (fileNames, format, &numOfFiles, error);
93 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot analyse DSPTRN");
94 freeImageFormat (format);
98 trans = callocDspTrn (numOfFiles);
99 computeDspTrn (numOfFiles, fileNames, trans, error);
102 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot process DSPTRN");
104 freeImageFormat (format);
108 createDspTrnProd (fileNames, format, trans, error);
109 if (*error) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create DSPTRN products");
113 freeImageFormat (format);
133 image_filter_median(
const cpl_image *image,
int xwindow,
int ywindow )
135 int nx = cpl_image_get_size_x(image);
136 int ny = cpl_image_get_size_y(image);
137 cpl_image *result = cpl_image_new( nx, ny, CPL_TYPE_FLOAT );
145 for (y = 1; y <= ny; y++)
146 for (x = 1; x <= nx; x++)
149 int llx = x - (xwindow - 1) / 2;
150 int lly = y - (ywindow - 1) / 2;
151 int urx = x + (xwindow - 1) / 2;
152 int ury = y + (ywindow - 1) / 2;
153 if (llx < 1) llx = 1;
154 if (lly < 1) lly = 1;
155 if (urx > nx) urx = nx;
156 if (ury > ny) ury = ny;
157 median = cpl_image_get_median_window( image,
161 cpl_image_set( result, x, y, median );
218 MidiFiles *fileNames,
219 DispersiveTrans *dspTrn,
225 const char routine[] =
"computeDspTrn";
226 char *fileTemp, *classification;
227 FILE *inFitsBatchPtr;
229 int localError, fileNumber, extNumOfImagingDataFile;
233 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
234 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
237 classification = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
238 fileTemp = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
239 format = callocImageFormat ();
249 if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch,
"r")) == NULL)
251 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
252 "Cannot open input FITS file list\n No data preprocessing has been carried out for this batch");
253 freeImageFormat (format);
255 free (classification);
261 while (fgets (fileTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
263 sprintf (classification,
"%s",
"");
264 sscanf (fileTemp,
"%s%s", fileNames->inFitsName, classification);
265 if (diagnostic)cpl_msg_info(cpl_func,
"\n Processing file %s \n", fileNames->inFitsName);
266 fprintf(midiReportPtr,
"\n Processing file %s \n", fileNames->inFitsName);
269 extNumOfImagingDataFile = findImagingDataExtension (fileNames->inFitsName, TAB_IMAGING_DATA, &localError);
277 if (extNumOfImagingDataFile > 0)
279 getImageFormat (fileNames->inFitsName, extNumOfImagingDataFile, format, &localError);
286 else format->hasData = 0;
292 if ((strcmp (format->obsCatg,
"CALIB") == 0) &&
293 (strcmp (format->obsTech,
"SPECTRUM") == 0) &&
294 (strcmp (format->obsType,
"WAVE") == 0))
297 sprintf (dspTrn->beamCombiner[fileNumber],
"%s", format->beamCombiner);
298 sprintf (dspTrn->shutterId[fileNumber],
"%s", format->shutterId);
299 sprintf (dspTrn->cameraId[fileNumber],
"%s", format->cameraId);
300 sprintf (dspTrn->grismId[fileNumber],
"%s", format->grismId);
301 sprintf (dspTrn->filterName[fileNumber],
"%s", format->filterName);
302 if (diagnostic)cpl_msg_info(cpl_func,
" Beam combiner for file %d = %s\n", fileNumber+1, dspTrn->beamCombiner[fileNumber]);
303 if (diagnostic)cpl_msg_info(cpl_func,
" Shutter ID for file %d = %s\n", fileNumber+1, dspTrn->shutterId[fileNumber]);
304 if (diagnostic)cpl_msg_info(cpl_func,
" Camera ID for file %d = %s\n", fileNumber+1, dspTrn->cameraId[fileNumber]);
305 if (diagnostic)cpl_msg_info(cpl_func,
" Grism ID for file %d = %s\n", fileNumber+1, dspTrn->grismId[fileNumber]);
306 if (diagnostic)cpl_msg_info(cpl_func,
" Filter Name for file %d = %s\n", fileNumber+1, dspTrn->filterName[fileNumber]);
307 fprintf (midiReportPtr,
" Beam combiner for file %d = %s\n", fileNumber+1, dspTrn->beamCombiner[fileNumber]);
308 fprintf (midiReportPtr,
" Shutter ID for file %d = %s\n", fileNumber+1, dspTrn->shutterId[fileNumber]);
309 fprintf (midiReportPtr,
" Camera ID for file %d = %s\n", fileNumber+1, dspTrn->cameraId[fileNumber]);
310 fprintf (midiReportPtr,
" Grism ID for file %d = %s\n", fileNumber+1, dspTrn->grismId[fileNumber]);
311 fprintf (midiReportPtr,
" Filter Name for file %d = %s\n", fileNumber+1, dspTrn->filterName[fileNumber]);
314 computeIntegralFlux (fileNumber, fileNames->inFitsName, extNumOfImagingDataFile, format, dspTrn, &localError);
315 if (localError) *error = 1;
322 if (fileNumber > numOfFiles)
329 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__,
"The above file is not suitable for this task");
335 sprintf (midiMessage,
"No data tables in %s. Not processed", fileNames->inFitsName);
336 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
342 if (dspTrn->exists && !(*error) && (fileNumber == numOfFiles))
344 cpl_msg_info(cpl_func,
"\nDispersive Transmission Inventry: \n");
345 cpl_msg_info(cpl_func,
"================================ \n");
346 cpl_msg_info(cpl_func,
" Expected number of data files = %d\n", numOfFiles);
347 cpl_msg_info(cpl_func,
" Number of data files processed = %d\n", fileNumber);
348 cpl_msg_info(cpl_func,
"\n");
350 fprintf (midiReportPtr,
"\nDispersive Transmission Inventry: \n");
351 fprintf (midiReportPtr,
"================================ \n");
352 fprintf (midiReportPtr,
" Expected number of data files = %d\n", numOfFiles);
353 fprintf (midiReportPtr,
" Number of data files processed = %d\n", fileNumber);
354 fprintf (midiReportPtr,
"\n");
358 computeDispersivity (dspTrn, &localError);
361 if (*error || localError)
362 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot access Dispersive Transmission for this batch");
366 fclose (inFitsBatchPtr);
369 freeImageFormat (format);
371 free (classification);
392 void computeIntegralFlux (
397 DispersiveTrans *dspTrn,
404 const char routine[] =
"computeIntegralFlux";
405 qfits_table *pTable = NULL;
407 char *tempStr, *string, *title, *dataName;
408 float numOfSubInteg, subIntegTime, targetRegionFlux;
409 int i, foundData = 0, scalingOffset, indexData, subWindowSize,
414 cpl_image *pImage = NULL;
416 cpl_image *background = NULL;
423 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
424 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
428 subWindowSize = format->iXWidth * format->iYWidth;
431 pTable = qfits_table_open (fileName, extensionNumber);
434 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot load IMAGING_DATA");
440 for (i = 0; i < pTable->nc; i++)
442 if (strcmp (pTable->col[i].tlabel,
"DATA1") == 0)
450 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find requested columns in data FITS file");
451 qfits_table_close (pTable);
457 inData = (
short int*) qfits_query_column (pTable, indexData, NULL);
460 dataName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
461 for (i = 14; i < 25; i++)
463 sprintf (dataName,
"TZERO%d", i);
464 tempStr = qfits_query_ext (fileName, dataName, extensionNumber);
467 if (diagnostic)cpl_msg_info(cpl_func,
"Scaling Offset = %s\n", tempStr);
468 if (diagnostic) fprintf (midiReportPtr,
"Scaling Offset = %s\n", tempStr);
469 sscanf (tempStr,
"%d", &scalingOffset);
476 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot read Scaling Offset. It is set to 0");
481 aveImage = (
float *) calloc (subWindowSize,
sizeof(
float));
482 createAveragedImage (inData, scalingOffset, format, aveImage);
487 pImage = cpl_image_wrap_float(format->iXWidth, format->iYWidth, aveImage);
492 background = image_filter_median( pImage, 1, 2*ny );
493 cpl_image_subtract ( pImage, background );
495 cpl_image_unwrap(pImage);
497 cpl_image_delete(background);
504 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
505 string = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
506 sprintf (title,
"AveImg%d", fileNumber+1);
507 sprintf (
string,
"file %d", fileNumber+1);
508 createFitsImage (
string, title, fileName, format->iXWidth, format->iYWidth, aveImage);
515 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
516 string = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
517 sprintf (
string,
"3dAveImg%d", fileNumber+1);
518 sprintf (title,
"Averaged Image, filter %s", format->filterName);
519 midiCreatePlotFile3D (
string, title,
"X",
"Y",
"Flux",
520 0, aveImage, format->iXWidth, format->iYWidth,
"lines",
"3");
526 target = (MidiCoords *) calloc (1,
sizeof (MidiCoords));
527 getDspTrnTargetCoords (fileNumber+1, dspTrn->grismId[fileNumber], aveImage, format, target, error);
530 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot determine integral flux");
531 qfits_table_close (pTable);
536 dspTrn->target[fileNumber].xCoord = target->xCoord;
537 dspTrn->target[fileNumber].yCoord = target->yCoord;
538 dspTrn->target[fileNumber].dxCoord = target->dxCoord;
539 dspTrn->target[fileNumber].dyCoord = target->dyCoord;
541 cpl_msg_info(cpl_func,
"\nCoordinates and flux results in file %s: \n", fileName);
542 cpl_msg_info(cpl_func,
"==================================== \n");
543 cpl_msg_info(cpl_func,
" Target coordinates = %f %f %f %f\n", target->xCoord, target->yCoord,
544 target->dxCoord, target->dyCoord);
545 fprintf (midiReportPtr,
"\nCoordinates and flux results in file %s: \n", fileName);
546 fprintf (midiReportPtr,
"==================================== \n");
547 fprintf (midiReportPtr,
" Target coordinates = %f %f %f %f\n", target->xCoord, target->yCoord,
548 target->dxCoord, target->dyCoord);
551 computeImageFlux (aveImage, format, target, &targetRegionFlux, &targetPixelCount, error);
552 cpl_msg_info(cpl_func,
" Target flux with background = %f\n", targetRegionFlux);
553 cpl_msg_info(cpl_func,
" Target pixel count = %d\n", targetPixelCount);
554 fprintf (midiReportPtr,
" Target flux with background = %f\n", targetRegionFlux);
555 fprintf (midiReportPtr,
" Target pixel count = %d\n", targetPixelCount);
558 dspTrn->meanFlux[fileNumber] = targetRegionFlux / targetPixelCount;
559 cpl_msg_info(cpl_func,
" Target mean flux with background = %f\n", dspTrn->meanFlux[fileNumber]);
560 fprintf (midiReportPtr,
" Target mean flux with background = %f\n", dspTrn->meanFlux[fileNumber]);
563 tempStr = qfits_query_hdr (fileName,
"HIERARCH ESO DET DIT");
565 sscanf(tempStr,
"%f", &subIntegTime);
568 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot read Integration time");
569 qfits_table_close (pTable);
576 tempStr = qfits_query_hdr (fileName,
"HIERARCH ESO DET NDIT");
578 sscanf(tempStr,
"%f", &numOfSubInteg);
581 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot read Number of Integrations");
582 qfits_table_close (pTable);
590 dspTrn->integTime[fileNumber] = numOfSubInteg * subIntegTime;
591 dspTrn->integFlux[fileNumber] = dspTrn->meanFlux[fileNumber] / dspTrn->integTime[fileNumber];
593 cpl_msg_info(cpl_func,
" Integration time = %f\n", dspTrn->integTime[fileNumber]);
594 fprintf (midiReportPtr,
" Integration time = %f\n", dspTrn->integTime[fileNumber]);
596 cpl_msg_info(cpl_func,
" Total integral flux = %f\n", dspTrn->integFlux[fileNumber]);
597 fprintf (midiReportPtr,
" Total integral flux = %f\n", dspTrn->integFlux[fileNumber]);
600 qfits_table_close (pTable);
622 void computeDispersivity (
623 DispersiveTrans *dspTrn,
629 const char routine[] =
"computeDispersivity";
634 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
635 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
641 if ((strcmp (dspTrn->filterName[0], dspTrn->filterName[3]) == 0) &&
642 (strcmp (dspTrn->grismId[0],
"OPEN") == 0) &&
643 ((strcmp (dspTrn->grismId[3],
"PRISM") == 0) || (strcmp (dspTrn->grismId[3],
"GRISM") == 0)))
645 dspTrn->transmission[0] = dspTrn->integFlux[3] / dspTrn->integFlux[0];
646 cpl_msg_info(cpl_func,
" Dispersive Transmission for files 4 / 1 = %f\n", dspTrn->transmission[0]);
647 fprintf (midiReportPtr,
" Dispersive Transmission for files 4 / 1 = %f\n", dspTrn->transmission[0]);
651 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Files 1 and 4 are not compatible");
655 if ((strcmp (dspTrn->filterName[1], dspTrn->filterName[4]) == 0) &&
656 (strcmp (dspTrn->grismId[1],
"OPEN") == 0) &&
657 ((strcmp (dspTrn->grismId[4],
"PRISM") == 0) || (strcmp (dspTrn->grismId[4],
"GRISM") == 0)))
659 dspTrn->transmission[1] = dspTrn->integFlux[4] / dspTrn->integFlux[1];
660 cpl_msg_info(cpl_func,
" Dispersive Transmission for files 5 / 2 = %f\n", dspTrn->transmission[1]);
661 fprintf (midiReportPtr,
" Dispersive Transmission for files 5 / 2 = %f\n", dspTrn->transmission[1]);
665 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Files 2 and 5 are not compatible");
669 if ((strcmp (dspTrn->filterName[2], dspTrn->filterName[5]) == 0) &&
670 (strcmp (dspTrn->grismId[2],
"OPEN") == 0) &&
671 ((strcmp (dspTrn->grismId[5],
"PRISM") == 0) || (strcmp (dspTrn->grismId[5],
"GRISM") == 0)))
673 dspTrn->transmission[2] = dspTrn->integFlux[5] / dspTrn->integFlux[2];
674 cpl_msg_info(cpl_func,
" Dispersive Transmission for files 6 / 3 = %f\n", dspTrn->transmission[2]);
675 fprintf (midiReportPtr,
" Dispersive Transmission for files 6 / 3 = %f\n", dspTrn->transmission[2]);
679 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Files 3 and 6 are not compatible");
685 dummy = (
float *) calloc (3,
sizeof (
float));
690 midiCreatePlotFile2D2P (
"TransmissivityProfile",
"Transmissivity Profile",
691 "Spectroscopy / Photometry: 4/1, 5/2, 6/3",
"Transmissivity", 0, dummy, dspTrn->transmission, 0, 3, 1);
717 void getDspTrnTargetCoords (
728 const char routine[] =
"getDspTrnTargetCoords";
729 int sizeSearch, dimension, xPinhole, yPinhole;
730 double xTarget, yTarget, sizeXTarget, sizeYTarget;
734 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
735 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
741 if (strcmp (grismId,
"OPEN") == 0) dimension = 2;
742 else if ((strcmp (grismId,
"GRISM") == 0) || (strcmp (grismId,
"PRISM") == 0)) dimension = 1;
745 sprintf (midiMessage,
"Unknown Grism ID %s: ", grismId);
746 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
754 sizeSearch = SIZE_SEARCH_DSP_TRN;
755 xPinhole = X_DSP_TRN;
756 yPinhole = Y_DSP_TRN;
757 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
758 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
761 if (*error) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot determine target coordinates");
765 target->xCoord = xTarget - 7.;
766 target->yCoord = yTarget - 7.;
767 target->dxCoord = xTarget + 7.;
768 target->dyCoord = yTarget + 7.;