25 #include "midiGlobal.h"
27 #include "memoryHandling.h"
28 #include "statistics.h"
29 #include "createProdDetRon.h"
30 #include "cpl_image_stats.h"
31 #include "cpl_image_io.h"
32 #include "imageProcessing.h"
33 #include "midiFitsUtility.h"
34 #include "fitsAnalysisTec.h"
35 #include "procDetRon.h"
36 #include "errorHandling.h"
37 #include "diagnostics.h"
71 const char routine[] =
"procDetRon";
72 ImageFormat *format=NULL;
73 DetRonNoise *noiseProfile=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);
83 signaturePtr = fopen (
"MIDI_sig_ron.log",
"w");
84 fclose (signaturePtr);
91 format = callocImageFormat ();
93 analyseFitsDetRon (fileNames, format, &numOfFiles, error);
96 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot analyse DETRON");
97 freeImageFormat (format);
101 noiseProfile = callocDetRon (format);
102 computeDetRon (numOfFiles, format, fileNames, noiseProfile, error);
105 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot process DETRON");
106 freeDetRon (noiseProfile);
107 freeImageFormat (format);
111 createDetRonProd (fileNames, format, noiseProfile, error);
112 if (*error) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create DETRON products");
115 freeDetRon (noiseProfile);
116 freeImageFormat (format);
151 ImageFormat *maxFormat,
152 MidiFiles *fileNames,
153 DetRonNoise *noiseProfile,
159 const char routine[] =
"computeDetRon";
160 char *fileTemp, *classification, *firstFile;
161 FILE *inFitsBatchPtr;
163 int fileNumber, extNumOfImagingDataFile, subWindowSize;
168 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
169 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
174 noiseProfile->exists = 0;
175 subWindowSize = maxFormat->iXWidth * maxFormat->iYWidth;
178 classification = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
179 firstFile = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
180 fileTemp = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
181 format = callocImageFormat ();
182 arrayPixel = (
float *) calloc (subWindowSize * maxFormat->numOfFrames, sizeof (
float));
188 if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch,
"r")) == NULL)
190 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
191 "Cannot open input FITS file list\n No preprocessing has been carried out for this batch");
192 freeImageFormat (format);
194 free (classification);
202 while (fgets (fileTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
204 sprintf (classification,
"%s",
"");
205 sscanf (fileTemp,
"%s%s", fileNames->inFitsName, classification);
206 if (diagnostic)cpl_msg_info(cpl_func,
"\n Processing file %s \n", fileNames->inFitsName);
207 fprintf(midiReportPtr,
"\n Processing file %s \n", fileNames->inFitsName);
210 extNumOfImagingDataFile = findImagingDataExtension (fileNames->inFitsName, TAB_IMAGING_DATA, error);
214 if (extNumOfImagingDataFile > 0)
216 getImageFormat (fileNames->inFitsName, extNumOfImagingDataFile, format, error);
219 else format->hasData = 0;
225 if ((strcmp (format->obsCatg,
"CALIB") == 0) &&
226 (strcmp (format->obsTech,
"IMAGE") == 0) &&
227 (strcmp (format->obsType,
"BIAS") == 0))
231 if (fileNumber > numOfFiles)
234 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Inconsistent file quantity");
239 if (fileNumber == 1) sprintf (firstFile,
"%s", fileNames->inFitsName);
242 compressDetRon (fileNumber, numOfFiles, maxFormat->numOfFrames, fileNames->inFitsName,
243 extNumOfImagingDataFile, format, arrayPixel, noiseProfile, error);
246 sprintf (midiMessage,
"Cannot compress data in %s", fileNames->inFitsName);
247 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
252 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__,
"The above file is not suitable for this task");
258 sprintf (midiMessage,
"No data tables in %s. Not processed", fileNames->inFitsName);
259 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
266 if (*error || (fileNumber != numOfFiles))
267 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create a noise pattern for this batch");
270 cpl_msg_info(cpl_func,
"\nDetector Readout Noise Inventry: \n");
271 cpl_msg_info(cpl_func,
"=============================== \n");
272 cpl_msg_info(cpl_func,
" Expected number of data files = %d\n", numOfFiles);
273 cpl_msg_info(cpl_func,
" Number of data files processed = %d\n", fileNumber);
274 cpl_msg_info(cpl_func,
"\n");
276 fprintf (midiReportPtr,
"\nDetector Readout Noise Inventry: \n");
277 fprintf (midiReportPtr,
"=============================== \n");
278 fprintf (midiReportPtr,
" Expected number of data files = %d\n", numOfFiles);
279 fprintf (midiReportPtr,
" Number of data files processed = %d\n", fileNumber);
280 fprintf (midiReportPtr,
"\n");
284 fclose (inFitsBatchPtr);
288 createNoisePattern (fileNumber, firstFile, maxFormat, noiseProfile, error);
291 if (!(*error)) noiseProfile->exists = 1;
294 freeImageFormat (format);
296 free (classification);
316 void compressDetRon (
324 DetRonNoise *noiseProfile,
331 const char routine[] =
"compressDetRon";
332 qfits_table *pTable=NULL;
334 char *tempStr, *dataName;
335 int i, k, frame, foundData = 0, indexData, pixel, subWindowSize, scalingOffset;
336 static int indexFrame;
337 float *arrayFrame, standDev, variance;
342 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
343 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
347 subWindowSize = format->iXWidth * format->iYWidth;
348 if (fileNumber == 1) indexFrame = 0;
351 pTable = qfits_table_open (fileName, extensionNumber);
354 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot load IMAGING_DATA");
360 for (i = 0; i < pTable->nc; i++)
362 if (strcmp (pTable->col[i].tlabel,
"DATA1") == 0)
370 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find requested columns in data FITS file");
371 qfits_table_close (pTable);
377 inData = (
short int*) qfits_query_column (pTable, indexData, NULL);
380 dataName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
381 for (i = 14; i < 25; i++)
383 sprintf (dataName,
"TZERO%d", i);
384 tempStr = qfits_query_ext (fileName, dataName, extensionNumber);
387 if (diagnostic)cpl_msg_info(cpl_func,
"Scaling Offset = %s\n", tempStr);
388 if (diagnostic) fprintf (midiReportPtr,
"Scaling Offset = %s\n", tempStr);
389 sscanf (tempStr,
"%d", &scalingOffset);
396 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot read Scaling Offset. It is set to 0");
401 for (pixel = 0; pixel < subWindowSize; pixel++)
404 for (frame = 0; frame < format->numOfFrames; frame++)
407 i = frame * subWindowSize + pixel;
408 k = (frame+indexFrame) * subWindowSize + pixel;
409 if (isnan (inData[i]))
411 sprintf (midiMessage,
"inData has an INVALID value at frame %d", (indexFrame+frame));
412 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
414 noiseProfile->aveImage[pixel] += (float) (inData[i] + scalingOffset);
415 arrayPixel[k] = (float) (inData[i] + scalingOffset);
421 if (fileNumber == numOfFiles)
423 arrayFrame = (
float *) calloc (maxNumOfFrames,
sizeof (
float));
424 for (pixel = 0; pixel < subWindowSize; pixel++)
426 noiseProfile->aveImage[pixel] /= maxNumOfFrames;
429 for (frame = 0; frame < maxNumOfFrames; frame++)
432 i = frame * subWindowSize + pixel;
433 arrayFrame[frame] = arrayPixel[i];
437 variance = signalVariance (arrayFrame, 0, maxNumOfFrames, &standDev);
438 noiseProfile->pattern[pixel] = standDev;
444 indexFrame += format->numOfFrames;
447 qfits_table_close (pTable);
467 void createNoisePattern (
471 DetRonNoise *noiseProfile,
478 const char routine[] =
"createNoisePattern";
479 char *title, *fileName;
486 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
487 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
491 subWindowSize = format->iXWidth * format->iYWidth;
494 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
495 fileName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
496 sprintf (title,
"AveImg");
497 sprintf (fileName,
"file %d", fileNumber);
498 createFitsImage (fileName, title, inFile, format->iXWidth, format->iYWidth, noiseProfile->aveImage);
503 cplImage = cpl_image_wrap_float (format->iXWidth, format->iYWidth, noiseProfile->pattern);
504 noiseProfile->median = cpl_image_get_median (cplImage);
505 cpl_image_unwrap (cplImage);
507 if (diagnostic)cpl_msg_info(cpl_func,
" Median of the noise pattern = %8.4f\n", noiseProfile->median);
508 fprintf (midiReportPtr,
" Median of the noise pattern = %8.4f\n", noiseProfile->median);
511 if (plotFile) midiCreatePlotFile3D (
"3dSigmaMap",
"Sigma Map",
"X",
"Y",
"Sigma",
512 0, noiseProfile->pattern, format->iXWidth, format->iYWidth,
"lines",
"0");