27 #include "midiGlobal.h"
30 #include "imageProcessing.h"
31 #include "midiFitsUtility.h"
32 #include "createProdAcq.h"
33 #include "diagnostics.h"
34 #include "memoryHandling.h"
35 #include "errorHandling.h"
69 const char routine[] =
"procAcq";
70 char *fileTemp, *classification;
73 int extNumOfImagingDataFile;
74 ImageQuality *image=NULL;
75 FILE *signaturePtr=NULL;
79 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
80 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
82 cpl_msg_info(cpl_func,
"\nProcessing Image Quality for batch %d \n", batchNumber);
83 cpl_msg_info(cpl_func,
"---------------------------------- \n");
84 fprintf (midiReportPtr,
"\nProcessing Image Quality for batch %d \n", batchNumber);
85 fprintf (midiReportPtr,
"---------------------------------- \n");
88 signaturePtr = fopen (
"MIDI_sig_acq.log",
"w");
89 fclose (signaturePtr);
92 classification = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
93 fileTemp = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
94 format = callocImageFormat ();
100 if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch,
"r")) == NULL)
102 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot open input FITS file list");
103 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"No data preprocessing has been carried out for this batch");
104 freeImageFormat (format);
106 free (classification);
112 fgets (fileTemp, MAX_STRING_LENGTH, inFitsBatchPtr);
113 sprintf (classification,
"%s",
"");
114 sscanf (fileTemp,
"%s%s", fileNames->inFitsName, classification);
115 if (diagnostic)cpl_msg_info(cpl_func,
"\n Processing file %s \n", fileNames->inFitsName);
116 fprintf(midiReportPtr,
"\n Processing file %s \n", fileNames->inFitsName);
119 extNumOfImagingDataFile = findImagingDataExtension (fileNames->inFitsName, TAB_IMAGING_DATA, error);
120 if (*error || !extNumOfImagingDataFile)
122 fclose (inFitsBatchPtr);
123 freeImageFormat (format);
125 free (classification);
130 getImageFormat (fileNames->inFitsName, extNumOfImagingDataFile, format, error);
131 if (*error || !(format->hasData))
133 fclose (inFitsBatchPtr);
134 freeImageFormat (format);
136 free (classification);
141 if (((strcmp (format->obsCatg,
"CALIB") == 0) ||
142 (strcmp (format->obsCatg,
"SCIENCE") == 0)) &&
143 ((strcmp (format->obsTech,
"IMAGE,WINDOW") == 0) ||
144 (strcmp (format->obsType,
"COARSE,OBJECT") == 0)))
147 image = callocImageQuality (format);
148 compressAcq (fileNames->inFitsName, extNumOfImagingDataFile, image, format, error);
151 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot compress data in FITS file");
152 fclose (inFitsBatchPtr);
153 freeImageQuality (format, image);
154 freeImageFormat (format);
156 free (classification);
161 assessImageQuality (fileNames->inFitsName, image, format, error);
164 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot assess image quality in FITS file");
165 fclose (inFitsBatchPtr);
166 freeImageQuality (format, image);
167 freeImageFormat (format);
169 free (classification);
174 createAcqProd (fileNames, format, image, error);
177 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create product FITS file");
178 fclose (inFitsBatchPtr);
179 freeImageQuality (format, image);
180 freeImageFormat (format);
182 free (classification);
185 freeImageQuality (format, image);
190 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Unknown Catg, Type, or Tech");
194 fclose (inFitsBatchPtr);
197 freeImageFormat (format);
199 free (classification);
220 int extNumOfImagingDataFile,
221 ImageQuality *compressed,
228 const char routine[] =
"compressAcq";
229 qfits_table *pTable=NULL;
231 char *inTarType=NULL, *tempStr, *dataName, lastTT;
232 int i, pixel, *foundData, scalingOffset, *indexData, numOfSkyFrames, numOfFramesUsed,
233 frame, region, indexTarType, foundTarType=0, transitions, numOfUndefinedFrames, numOfBadFrames,
243 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
244 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
250 inData = (
short int **) calloc (format->numOfDetectorRegions, sizeof (
short int *));
251 foundData = (
int *) calloc (format->numOfDetectorRegions, sizeof (
int));
252 indexData = (
int *) calloc (format->numOfDetectorRegions, sizeof (
int));
253 dataName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
255 pTable = qfits_table_open (inFitsFile, extNumOfImagingDataFile);
258 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot load IMAGING_DATA from");
268 for (region = 0; region < format->numOfDetectorRegions; region++)
270 foundData[region] = 0;
271 indexData[region] = 0;
273 for (i = 0; i < pTable->nc; i++)
275 for (region = 0; region < format->numOfDetectorRegions; region++)
277 sprintf (dataName,
"DATA%d", region+1);
278 if (strcmp (pTable->col[i].tlabel, dataName) == 0)
280 foundData[region] = 1;
281 indexData[region] = i;
282 if (diagnostic)cpl_msg_info(cpl_func,
"Found 'DATA%d' at column %d in data file %s \n", region+1, i+1, inFitsFile);
283 if (diagnostic) fprintf(midiReportPtr,
"Found 'DATA%d' at column %d in data file %s \n", region+1, i+1, inFitsFile);
286 if (strcmp (pTable->col[i].tlabel,
"TARTYP2") == 0)
294 if (foundTarType == 0)
296 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find TARTYP2 in data FITS file");
299 for (region = 0; region < format->numOfDetectorRegions; region++)
301 if (foundData[region] == 0)
303 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find requested DATA column in data FITS file");
311 qfits_table_close (pTable);
320 inTarType = (
char *) qfits_query_column (pTable, indexTarType, NULL);
321 for (frame = 0; frame < format->numOfFrames; frame++)
322 compressed->tarType[frame] = inTarType[frame*tartypMult];
326 lastTT = compressed->tarType[0];
327 for (frame = 0; frame < format->numOfFrames; frame++)
329 if (compressed->tarType[frame] == lastTT)
continue;
331 lastTT = compressed->tarType[frame];
333 if ((format->chopped = (transitions > 3)))
335 if (diagnostic)cpl_msg_info(cpl_func,
"\nAcquision data is CHOPPED, since %d 'TARTYP2' transitions were found \n", transitions);
336 fprintf (midiReportPtr,
"\nAcquision data is CHOPPED, since %d 'TARTYP2' transitions were found \n", transitions);
340 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Acquisition data is NOT chopped");
342 qfits_table_close (pTable);
351 for (region = 0; region < format->numOfDetectorRegions; region++)
352 inData[region] = (
short int*) qfits_query_column (pTable, indexData[region], NULL);
355 for (i = 14; i < 25; i++)
357 sprintf (dataName,
"TZERO%d", i);
358 tempStr = qfits_query_ext (inFitsFile, dataName, extNumOfImagingDataFile);
361 if (diagnostic)cpl_msg_info(cpl_func,
"Scaling Offset = %s\n", tempStr);
362 if (diagnostic) fprintf (midiReportPtr,
"Scaling Offset = %s\n", tempStr);
363 sscanf (tempStr,
"%d", &scalingOffset);
370 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot read Scaling Offset. It is set to 0");
374 for (region = 0; region < format->numOfDetectorRegions; region++)
376 for (pixel = 0; pixel < format->subWindowSize; pixel++)
379 numOfUndefinedFrames = 0;
383 (compressed->aveImage)[region][pixel] = 0.0;
384 (compressed->aveImageSky)[region][pixel] = 0.0;
385 for (frame = 0; frame < format->numOfFrames; frame++)
388 if (compressed->tarType[frame] ==
'U')
390 if (diagnostic > 2 && !pixel)
392 sprintf (midiMessage,
"Found undefined, 'U' 'TARTYP2' at frame %d of DATA%d in %s \n",
393 frame+1, region+1, inFitsFile);
394 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
396 numOfUndefinedFrames++;
401 i = frame * format->subWindowSize + pixel;
402 if (isnan (inData[region][i]))
405 sprintf (midiMessage,
"Found bad pixel %d of DATA%d in %s \n", i, region, inFitsFile);
406 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
411 (compressed->aveImage)[region][pixel] += (
float) (inData[region][i]);
412 if (compressed->tarType[frame] ==
'S')
415 (compressed->aveImageSky)[region][pixel] += (
float) (inData[region][i]);
421 if (diagnostic && !pixel)
423 cpl_msg_info(cpl_func,
"\nData Statistics \n");
424 cpl_msg_info(cpl_func,
"--------------- \n");
425 cpl_msg_info(cpl_func,
"Number of frames used in DATA%d = %d \n", region+1, numOfFramesUsed);
426 cpl_msg_info(cpl_func,
"Number of Sky frames in DATA%d = %d \n", region+1, numOfSkyFrames);
427 cpl_msg_info(cpl_func,
"Number of Bad frames in DATA%d = %d \n", region+1, numOfBadFrames);
428 cpl_msg_info(cpl_func,
"Number of Undefined frames in DATA%d = %d \n", region+1, numOfUndefinedFrames);
429 fprintf (midiReportPtr,
"\nData Statistics \n");
430 fprintf (midiReportPtr,
"--------------- \n");
431 fprintf (midiReportPtr,
"Number of frames used in DATA%d = %d \n", region+1, numOfFramesUsed);
432 fprintf (midiReportPtr,
"Number of Sky frames in DATA%d = %d \n", region+1, numOfSkyFrames);
433 fprintf (midiReportPtr,
"Number of Bad frames in DATA%d = %d \n", region+1, numOfBadFrames);
434 fprintf (midiReportPtr,
"Number of Undefined frames in DATA%d = %d \n", region+1, numOfUndefinedFrames);
436 if (numOfFramesUsed) (compressed->aveImage)[region][pixel] /= numOfFramesUsed;
437 (compressed->aveImage)[region][pixel] += scalingOffset;
438 if (numOfSkyFrames) (compressed->aveImageSky)[region][pixel] /= numOfSkyFrames;
439 (compressed->aveImageSky)[region][pixel] += scalingOffset;
440 (compressed->aveImage)[region][pixel] -= (compressed->aveImageSky)[region][pixel];
445 for (region = 0; region < format->numOfDetectorRegions; region++) free (inData[region]);
446 if (pTable) qfits_table_close (pTable);
447 if (inTarType) free(inTarType);
470 void assessImageQuality (
472 ImageQuality *compressed,
480 const char routine[] =
"assessImageQuality";
481 int region, searchSize;
482 char *title=NULL, *fileString=NULL;
487 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
488 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
492 searchSize = SIZE_SEARCH_ACQ;
495 target = (MidiCoords *) calloc (1,
sizeof (MidiCoords));
498 for (region = 0; region < format->numOfDetectorRegions; region++)
503 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
504 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
505 sprintf (title ,
"AveImgSkyDATA%d", region+1);
506 sprintf (fileString ,
"region %d", region+1);
507 createFitsImage (fileString, title, fileName, format->iXWidth, format->iYWidth,
508 (compressed->aveImageSky)[region]);
509 sprintf (title ,
"AveImgDATA%d", region+1);
510 createFitsImage (fileString, title, fileName, format->iXWidth, format->iYWidth,
511 (compressed->aveImage)[region]);
518 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
519 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
520 sprintf (fileString,
"3dImgDATA%d", region+1);
521 sprintf (title,
"Dark removed, region %d", region+1);
522 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
523 (compressed->aveImage)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
526 sprintf (fileString,
"3dImgSkyDATA%d", region+1);
527 sprintf (title,
"Sky, region %d", region+1);
528 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
529 (compressed->aveImageSky)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
536 midiGetFWHM (region+1, (compressed->aveImage)[region],
537 format->iXWidth, format->iYWidth, searchSize, &(compressed->coordX[region]),
538 &(compressed->coordY[region]), &(compressed->sizeX[region]), &(compressed->sizeY[region]), error);
539 cpl_msg_info(cpl_func,
"Target Coordinates and size (X, Y, X-Width, Y-Width): %0.2f, %0.2f, %0.2f %0.2f \n",
540 compressed->coordX[region], compressed->coordY[region], compressed->sizeX[region], compressed->sizeY[region]);
541 fprintf (midiReportPtr,
"Target Coordinates and size (X, Y, X-Width, Y-Width): %0.2f, %0.2f, %0.2f %0.2f \n",
542 compressed->coordX[region], compressed->coordY[region], compressed->sizeX[region], compressed->sizeY[region]);
545 target->xCoord = compressed->coordX[region] - (0.5 * compressed->sizeX[region]);
546 target->yCoord = compressed->coordY[region] - (0.5 * compressed->sizeY[region]);
547 target->dxCoord = compressed->coordX[region] + (0.5 * compressed->sizeX[region]);
548 target->dyCoord = compressed->coordY[region] + (0.5 * compressed->sizeY[region]);
554 computeImageFlux ((compressed->aveImage)[region], format, target, &((compressed->targetFlux)[region]),
555 &((compressed->targetPixelCount)[region]), error);
556 cpl_msg_info(cpl_func,
"Target flux in region %d = %0.2f \n", region+1, (compressed->targetFlux)[region]);
557 cpl_msg_info(cpl_func,
"Target pixel count in region %d = %d \n", region+1, (compressed->targetPixelCount)[region]);
558 fprintf (midiReportPtr,
"Target flux in region %d = %0.2f \n", region+1, (compressed->targetFlux)[region]);
559 fprintf (midiReportPtr,
"Target pixel count in region %d = %d \n", region+1, (compressed->targetPixelCount)[region]);