25 #include "midiGlobal.h"
27 #include "imageProcessing.h"
28 #include "memoryHandling.h"
29 #include "createProdRefPix.h"
30 #include "procRefPix.h"
31 #include "errorHandling.h"
32 #include "midiFitsUtility.h"
33 #include "fitsAnalysisTec.h"
34 #include "diagnostics.h"
69 const char routine[] =
"procRefPix";
70 ImageFormat *format=NULL;
71 ReferencePixel *refPix=NULL;
72 int numOfExposures, maxNumOfBeams;
73 FILE *signaturePtr=NULL;
77 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
78 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
81 signaturePtr = fopen (
"MIDI_sig_pix.log",
"w");
82 fclose (signaturePtr);
90 format = callocImageFormat ();
92 analyseFitsRefPix (fileNames, format, &numOfExposures, &maxNumOfBeams, error);
95 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot analyse REFPIX");
96 freeImageFormat (format);
100 refPix = callocRefPix (numOfExposures, maxNumOfBeams);
101 computeRefPix (fileNames, refPix, error);
104 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot process REFPIX");
106 freeImageFormat (format);
110 createRefPixProd (fileNames, format, refPix, error);
111 if (*error) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create REFPIX products");
115 freeImageFormat (format);
144 MidiFiles *fileNames,
145 ReferencePixel *refPix,
151 const char routine[] =
"computeRefPix";
152 char *fileTemp, *classification;
153 FILE *inFitsBatchPtr;
155 int localError, fileNumber, extNumOfImagingDataFile;
159 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
160 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
163 classification = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
164 fileTemp = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
165 format = callocImageFormat ();
175 if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch,
"r")) == NULL)
177 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
178 "Cannot open input FITS file list\n No data preprocessing has been carried out for this batch");
179 freeImageFormat (format);
181 free (classification);
187 while (fgets (fileTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
189 sprintf (classification,
"%s",
"");
190 sscanf (fileTemp,
"%s%s", fileNames->inFitsName, classification);
191 if (diagnostic)cpl_msg_info(cpl_func,
"\n Processing file %s \n", fileNames->inFitsName);
192 fprintf(midiReportPtr,
"\n Processing file %s \n", fileNames->inFitsName);
195 extNumOfImagingDataFile = findImagingDataExtension (fileNames->inFitsName, TAB_IMAGING_DATA, &localError);
203 if (extNumOfImagingDataFile > 0)
205 getImageFormat (fileNames->inFitsName, extNumOfImagingDataFile, format, &localError);
212 else format->hasData = 0;
218 if ((strcmp (format->obsCatg,
"CALIB") == 0) &&
219 (strcmp (format->obsTech,
"IMAGE") == 0) &&
220 (strcmp (format->obsType,
"FMTCHCK") == 0))
223 sprintf (refPix->exposure[fileNumber].shutterId,
"%s", format->shutterId);
224 sprintf (refPix->exposure[fileNumber].beamCombiner,
"%s", format->beamCombiner);
225 if ((strcmp (format->beamCombiner,
"HIGH_SENS") == 0) ||
226 (strcmp (format->beamCombiner,
"OPEN") == 0))
227 refPix->exposure[fileNumber].numOfBeams = 2;
228 else if (strcmp (format->beamCombiner,
"SCI_PHOT") == 0)
229 refPix->exposure[fileNumber].numOfBeams = 3;
231 if (diagnostic)cpl_msg_info(cpl_func,
" Beam combiner for file %d = %s\n", fileNumber+1,
232 refPix->exposure[fileNumber].beamCombiner);
233 if (diagnostic)cpl_msg_info(cpl_func,
" Shutter ID for file %d = %s\n", fileNumber+1,
234 refPix->exposure[fileNumber].shutterId);
235 if (diagnostic)cpl_msg_info(cpl_func,
" Number of beams for file %d = %d\n", fileNumber+1,
236 refPix->exposure[fileNumber].numOfBeams);
237 fprintf (midiReportPtr,
" Beam combiner for file %d = %s\n", fileNumber+1,
238 refPix->exposure[fileNumber].beamCombiner);
239 fprintf (midiReportPtr,
" Shutter ID for file %d = %s\n", fileNumber+1,
240 refPix->exposure[fileNumber].shutterId);
241 fprintf (midiReportPtr,
" Number of beams for file %d = %d\n", fileNumber+1,
242 refPix->exposure[fileNumber].numOfBeams);
245 procCentroidsRefPix (fileNumber, fileNames->inFitsName, extNumOfImagingDataFile,
246 format, refPix, &localError);
247 if (localError) *error = 1;
254 if (fileNumber > refPix->numOfExposures)
261 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__,
"The above file is not suitable for this task");
267 sprintf (midiMessage,
"No data tables in %s. Not processed", fileNames->inFitsName);
268 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
274 if ((refPix->exists) && !(*error) && (fileNumber == refPix->numOfExposures))
276 cpl_msg_info(cpl_func,
"\nReference Pixel Position Inventry: \n");
277 cpl_msg_info(cpl_func,
"================================= \n");
278 cpl_msg_info(cpl_func,
" Expected number of data files = %d\n", refPix->numOfExposures);
279 cpl_msg_info(cpl_func,
" Number of data files processed = %d\n", fileNumber);
280 cpl_msg_info(cpl_func,
"\n");
282 fprintf (midiReportPtr,
"\nReference Pixel Position Inventry: \n");
283 fprintf (midiReportPtr,
"================================= \n");
284 fprintf (midiReportPtr,
" Expected number of data files = %d\n", refPix->numOfExposures);
285 fprintf (midiReportPtr,
" Number of data files processed = %d\n", fileNumber);
286 fprintf (midiReportPtr,
"\n");
290 evaluateBeamPosition ();
293 if (*error || localError)
294 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create an Image Centroid Data for this batch");
297 fclose (inFitsBatchPtr);
300 freeImageFormat (format);
302 free (classification);
337 void procCentroidsRefPix (
342 ReferencePixel *refPix,
349 const char routine[] =
"procCentroidsRefPix";
350 qfits_table *pTable = NULL;
352 char *tempStr, *string, *title, *dataName;
353 int i, foundData = 0, scalingOffset, indexData, subWindowSize;
359 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
360 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
366 pTable = qfits_table_open (inFitsName, extensionNumber);
369 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot load IMAGING_DATA");
375 for (i = 0; i < pTable->nc; i++)
377 if (strcmp (pTable->col[i].tlabel,
"DATA1") == 0)
385 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find requested columns in data FITS file");
386 qfits_table_close (pTable);
392 inData = (
short int*) qfits_query_column (pTable, indexData, NULL);
395 dataName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
396 for (i = 14; i < 25; i++)
398 sprintf (dataName,
"TZERO%d", i);
399 tempStr = qfits_query_ext (inFitsName, dataName, extensionNumber);
402 if (diagnostic)cpl_msg_info(cpl_func,
"Scaling Offset = %s\n", tempStr);
403 if (diagnostic) fprintf (midiReportPtr,
"Scaling Offset = %s\n", tempStr);
404 sscanf (tempStr,
"%d", &scalingOffset);
411 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot read Scaling Offset. It is set to 0");
416 subWindowSize = format->iXWidth * format->iYWidth;
417 aveImage = (
float *) calloc (subWindowSize,
sizeof(
float));
418 createAveragedImage (inData, scalingOffset, format, aveImage);
421 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
422 string = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
423 sprintf (title,
"AveImg%d", fileNumber+1);
424 sprintf (
string,
"file %d", fileNumber+1);
425 createFitsImage (
string, title, inFitsName, format->iXWidth, format->iYWidth, aveImage);
428 sprintf (
string,
"3dAveImg%d", fileNumber+1);
429 sprintf (title,
"Averaged Image, Beam Combiner %s", format->beamCombiner);
430 if (plotFile) midiCreatePlotFile3D (
string, title,
"X",
"Y",
"Flux",
431 0, aveImage, format->iXWidth, format->iYWidth,
"lines",
"3");
436 computeTargetCentroidsRefPix (fileNumber, format, aveImage, refPix, error);
437 if (*error) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot determine target centroid");
440 qfits_table_close (pTable);
469 void computeTargetCentroidsRefPix (
473 ReferencePixel *refPix,
479 const char routine[] =
"computeTargetCentroidsRefPix";
480 int dimension = 2, xPinhole, yPinhole, sizeSearch;
481 double xTarget, yTarget, sizeXTarget, sizeYTarget;
485 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
486 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
492 if ((strcmp (refPix->exposure[fileNumber].beamCombiner,
"HIGH_SENS") == 0) ||
493 (strcmp (refPix->exposure[fileNumber].beamCombiner,
"OPEN") == 0))
496 if (strcmp (refPix->exposure[fileNumber].shutterId,
"ABOPEN") == 0)
499 sizeSearch = SIZE_SEARCH_REF_PIX;
500 xPinhole = X1_REF_PIX_ABOPEN;
501 yPinhole = Y1_REF_PIX_ABOPEN;
502 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
503 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
506 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
510 refPix->exposure[fileNumber].centroid[0].xCoord = xTarget;
511 refPix->exposure[fileNumber].centroid[0].yCoord = yTarget;
512 refPix->exposure[fileNumber].centroid[0].size = 0.5 * (sizeXTarget + sizeYTarget);
515 xPinhole = X2_REF_PIX_ABOPEN;
516 yPinhole = Y2_REF_PIX_ABOPEN;
517 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
518 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
521 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
525 refPix->exposure[fileNumber].centroid[1].xCoord = xTarget;
526 refPix->exposure[fileNumber].centroid[1].yCoord = yTarget;
527 refPix->exposure[fileNumber].centroid[1].size = 0.5 * (sizeXTarget + sizeYTarget);
529 else if (strcmp (refPix->exposure[fileNumber].shutterId,
"AOPEN") == 0)
532 sizeSearch = SIZE_SEARCH_REF_PIX;
533 xPinhole = X1_REF_PIX_HS_AOPEN;
534 yPinhole = Y1_REF_PIX_HS_AOPEN;
535 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
536 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
539 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
543 refPix->exposure[fileNumber].centroid[0].xCoord = xTarget;
544 refPix->exposure[fileNumber].centroid[0].yCoord = yTarget;
545 refPix->exposure[fileNumber].centroid[0].size = 0.5 * (sizeXTarget + sizeYTarget);
548 xPinhole = X2_REF_PIX_HS_AOPEN;
549 yPinhole = Y2_REF_PIX_HS_AOPEN;
550 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
551 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
554 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
558 refPix->exposure[fileNumber].centroid[1].xCoord = xTarget;
559 refPix->exposure[fileNumber].centroid[1].yCoord = yTarget;
560 refPix->exposure[fileNumber].centroid[1].size = 0.5 * (sizeXTarget + sizeYTarget);
562 else if (strcmp (refPix->exposure[fileNumber].shutterId,
"BOPEN") == 0)
565 sizeSearch = SIZE_SEARCH_REF_PIX;
566 xPinhole = X1_REF_PIX_HS_BOPEN;
567 yPinhole = Y1_REF_PIX_HS_BOPEN;
568 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
569 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
572 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
576 refPix->exposure[fileNumber].centroid[0].xCoord = xTarget;
577 refPix->exposure[fileNumber].centroid[0].yCoord = yTarget;
578 refPix->exposure[fileNumber].centroid[0].size = 0.5 * (sizeXTarget + sizeYTarget);
581 xPinhole = X2_REF_PIX_HS_BOPEN;
582 yPinhole = Y2_REF_PIX_HS_BOPEN;
583 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
584 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
587 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
591 refPix->exposure[fileNumber].centroid[1].xCoord = xTarget;
592 refPix->exposure[fileNumber].centroid[1].yCoord = yTarget;
593 refPix->exposure[fileNumber].centroid[1].size = 0.5 * (sizeXTarget + sizeYTarget);
597 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Unknown Shutter ID");
602 else if (strcmp (refPix->exposure[fileNumber].beamCombiner,
"SCI_PHOT") == 0)
605 if (strcmp (refPix->exposure[fileNumber].shutterId,
"AOPEN") == 0)
607 sizeSearch = SIZE_SEARCH_REF_PIX;
608 xPinhole = X1_REF_PIX_SP_AOPEN;
609 yPinhole = Y1_REF_PIX_SP_AOPEN;
610 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
611 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
614 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
618 refPix->exposure[fileNumber].centroid[0].xCoord = xTarget;
619 refPix->exposure[fileNumber].centroid[0].yCoord = yTarget;
620 refPix->exposure[fileNumber].centroid[0].size = 0.5 * (sizeXTarget + sizeYTarget);
622 xPinhole = X2_REF_PIX_SP_AOPEN;
623 yPinhole = Y2_REF_PIX_SP_AOPEN;
624 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
625 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
628 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
632 refPix->exposure[fileNumber].centroid[1].xCoord = xTarget;
633 refPix->exposure[fileNumber].centroid[1].yCoord = yTarget;
634 refPix->exposure[fileNumber].centroid[1].size = 0.5 * (sizeXTarget + sizeYTarget);
636 xPinhole = X3_REF_PIX_SP_AOPEN;
637 yPinhole = Y3_REF_PIX_SP_AOPEN;
638 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
639 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
642 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
646 refPix->exposure[fileNumber].centroid[2].xCoord = xTarget;
647 refPix->exposure[fileNumber].centroid[2].yCoord = yTarget;
648 refPix->exposure[fileNumber].centroid[2].size = 0.5 * (sizeXTarget + sizeYTarget);
650 else if (strcmp (refPix->exposure[fileNumber].shutterId,
"BOPEN") == 0)
652 sizeSearch = SIZE_SEARCH_REF_PIX;
653 xPinhole = X1_REF_PIX_SP_BOPEN;
654 yPinhole = Y1_REF_PIX_SP_BOPEN;
655 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
656 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
659 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
663 refPix->exposure[fileNumber].centroid[0].xCoord = xTarget;
664 refPix->exposure[fileNumber].centroid[0].yCoord = yTarget;
665 refPix->exposure[fileNumber].centroid[0].size = 0.5 * (sizeXTarget + sizeYTarget);
667 xPinhole = X2_REF_PIX_SP_BOPEN;
668 yPinhole = Y2_REF_PIX_SP_BOPEN;
669 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
670 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
673 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
677 refPix->exposure[fileNumber].centroid[1].xCoord = xTarget;
678 refPix->exposure[fileNumber].centroid[1].yCoord = yTarget;
679 refPix->exposure[fileNumber].centroid[1].size = 0.5 * (sizeXTarget + sizeYTarget);
681 xPinhole = X3_REF_PIX_SP_BOPEN;
682 yPinhole = Y3_REF_PIX_SP_BOPEN;
683 midiGaussianFit (fileNumber, dimension, image, format->iXWidth, format->iYWidth, xPinhole, yPinhole,
684 sizeSearch, &xTarget, &yTarget, &sizeXTarget, &sizeYTarget, error);
687 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot perform a Gaussian fit");
691 refPix->exposure[fileNumber].centroid[2].xCoord = xTarget;
692 refPix->exposure[fileNumber].centroid[2].yCoord = yTarget;
693 refPix->exposure[fileNumber].centroid[2].size = 0.5 * (sizeXTarget + sizeYTarget);
697 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Unknown Shutter ID");
721 void evaluateBeamPosition (
void)
726 const char routine[] =
"evaluateBeamPosition";
730 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
731 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
733 midiReportTbd (midiReportPtr, routine, __FILE__, __LINE__,
"Entire routine to be written");