23 #include <sys/types.h>
29 #include "midiGlobal.h"
31 #include "memoryHandling.h"
32 #include "calibration.h"
33 #include "diagnostics.h"
34 #include "errorHandling.h"
35 #include "statistics.h"
36 #include "midiFitsUtility.h"
37 #include "qfits_table.h"
69 void getCalibratedChWave (
79 const char routine[] =
"getCalibratedChWave";
80 char *fileString, *givenGrismId, *givenBeamCombiner;
86 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
87 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
94 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
95 sprintf (fileString ,
"%s_%s_%s.dat", fileNames->waveCalibName, format->grismId, format->beamCombiner);
96 if ((filePtr = fopen (fileString,
"r")) != NULL)
99 if (diagnostic)cpl_msg_info(cpl_func,
"Trying to extract Wavelength Calibration from %s \n", fileString);
100 fprintf (midiReportPtr,
"Trying to extract Wavelength Calibration from %s \n", fileString);
103 if (strcmp (format->beamCombiner,
"SCI_PHOT") == 0)
104 while (fscanf (filePtr,
"%f %f %f %f\n",
105 &(waveCal[0][numOfRecords]), &(waveCal[1][numOfRecords]),
106 &(waveCal[2][numOfRecords]), &(waveCal[3][numOfRecords])) != EOF) numOfRecords++;
108 while (fscanf (filePtr,
"%f %f\n",
109 &(waveCal[0][numOfRecords]), &(waveCal[1][numOfRecords])) != EOF) numOfRecords++;
112 if (numOfRecords == format->iXWidth)
115 if (diagnostic)cpl_msg_info(cpl_func,
"Found a wavelength calibration file %s with %d rows of floats \n",
116 fileString, numOfRecords);
117 fprintf (midiReportPtr,
"Found a wavelength calibration file %s with %d rows of floats \n",
118 fileString, numOfRecords);
123 sprintf (midiMessage,
"Inconsistent calibration data in %s. Data ignored", fileString);
124 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
130 sprintf (midiMessage,
"Cannot find calibration data file ... %s", fileString);
131 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
139 givenGrismId = (
char *) calloc (MIN_STRING_LENGTH,
sizeof (
char));
140 givenBeamCombiner = (
char *) calloc (MIN_STRING_LENGTH,
sizeof (
char));
143 if (diagnostic)cpl_msg_info(cpl_func,
"Trying to extract Wavelength Calibration from %s \n", fileNames->wclNameRead);
144 fprintf (midiReportPtr,
"Trying to extract Wavelength Calibration from %s \n", fileNames->wclNameRead);
145 if ((filePtr = fopen (fileNames->wclNameRead,
"r")) == NULL)
148 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
149 "Cannot find the Wavelength Calibration file\n Data will be computed from the interferometry file");
156 if (fscanf (filePtr,
"%s \n", givenGrismId) == EOF)
159 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
160 "Cannot read Grism ID from\n Data will be computed from the interferometry file");
162 if (strcmp (format->obsCatg,
"SCIENCE") == 0)
remove (fileNames->wclNameRead);
167 if (strcmp (format->grismId, givenGrismId) != 0)
170 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
171 "Inconsistent Grism ID\n Data will be computed from the interferometry file");
173 if (strcmp (format->obsCatg,
"SCIENCE") == 0)
remove (fileNames->wclNameRead);
176 cpl_msg_info(cpl_func,
"Given grism ID = %s. Expected %s \n", givenGrismId, format->grismId);
177 fprintf (midiReportPtr,
"Given grism ID = %s. Expected %s \n", givenGrismId, format->grismId);
183 if (fscanf (filePtr,
"%s \n", givenBeamCombiner) == EOF)
186 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
187 "Cannot read Beam Combiner from\n Data will be computed from the interferometry file");
189 if (strcmp (format->obsCatg,
"SCIENCE") == 0)
remove (fileNames->wclNameRead);
194 if (strcmp (format->beamCombiner, givenBeamCombiner) != 0)
197 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
198 "Inconsistent Beam Combiner\n Data will be computed from the interferometry file");
200 if (strcmp (format->obsCatg,
"SCIENCE") == 0)
remove (fileNames->wclNameRead);
203 cpl_msg_info(cpl_func,
"Given Beam Combiner = %s. Expected %s \n", givenBeamCombiner, format->beamCombiner);
204 fprintf (midiReportPtr,
"Given Beam Combiner = %s. Expected %s \n", givenBeamCombiner, format->beamCombiner);
210 if (fscanf (filePtr,
"%d\n", &numOfRecords) == EOF)
213 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
214 "Cannot read Number of Records\n Data will be computed from the interferometry file");
215 if (filePtr) fclose (filePtr);
216 if (strcmp (format->obsCatg,
"SCIENCE") == 0)
remove (fileNames->wclNameRead);
221 if (numOfRecords != format->iXWidth)
224 sprintf (midiMessage,
"Inconsistent Number of Records from %s. Expected %d \n",
225 fileNames->wclNameRead, format->iXWidth);
226 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
227 if (filePtr) fclose (filePtr);
228 if (strcmp (format->obsCatg,
"SCIENCE") == 0)
remove (fileNames->wclNameRead);
231 cpl_msg_info(cpl_func,
"Given Number of Records = %d. Expected %d \n", numOfRecords, format->iXWidth);
232 fprintf (midiReportPtr,
"Given Number of Records = %d. Expected %d \n", numOfRecords, format->iXWidth);
238 for (i = 0; i < format->iXWidth; i++)
240 if (strcmp (format->beamCombiner,
"SCI_PHOT") == 0)
242 if (fscanf (filePtr,
"%f %f %f %f \n", &(waveCal[0][i]), &(waveCal[1][i]),
243 &(waveCal[2][i]), &(waveCal[3][i])) == EOF)
246 sprintf (midiMessage,
"Read %d rows of wavelength values from %s. Expected %d \n",
247 i, fileNames->wclNameRead, format->iXWidth);
248 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
251 if (diagnostic)cpl_msg_info(cpl_func,
"Channel %3d %7.4f %7.4f %7.4f %7.4f \n",
252 i, waveCal[0][i], waveCal[1][i], waveCal[2][i], waveCal[3][i]);
253 fprintf (midiReportPtr,
"Channel %3d %7.4f %7.4f %7.4f %7.4f \n",
254 i, waveCal[0][i], waveCal[1][i], waveCal[2][i], waveCal[3][i]);
258 if (fscanf (filePtr,
"%f %f \n", &(waveCal[0][i]), &(waveCal[1][i])) == EOF)
261 sprintf (midiMessage,
"Read %d rows of wavelength values from %s. Expected %d \n",
262 i, fileNames->wclNameRead, format->iXWidth);
263 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
266 if (diagnostic)cpl_msg_info(cpl_func,
"Channel %3d %7.4f %7.4f \n", i, waveCal[0][i], waveCal[1][i]);
267 fprintf (midiReportPtr,
"Channel %3d %7.4f %7.4f \n", i, waveCal[0][i], waveCal[1][i]);
270 cpl_msg_info(cpl_func,
"\nRead %d rows of wavelength values from %s \n", format->iXWidth, fileNames->wclNameRead);
271 fprintf (midiReportPtr,
"\nRead %d rows of wavelength values from %s \n", format->iXWidth, fileNames->wclNameRead);
273 if (strcmp (format->obsCatg,
"SCIENCE") == 0)
remove (fileNames->wclNameRead);
276 free (givenBeamCombiner);
296 void calibrateWaveUsingPolynom (
297 MidiFiles *fileNames,
304 const char routine[] =
"calibrateWaveUsingPolynom";
305 int error, numOfRecords;
306 FILE *waveCalPtr=NULL;
308 float record1, record2, record3, record4;
312 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
313 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
318 cpl_msg_info(cpl_func,
"\nWavelength calibration for batch %d \n", batchNumber);
319 cpl_msg_info(cpl_func,
"-------------------------------- \n");
320 fprintf (midiReportPtr,
"\nWavelength calibration for batch %d \n", batchNumber);
321 fprintf (midiReportPtr,
"-------------------------------- \n");
324 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
325 sprintf (fileString ,
"%s_%s_%s.dat", fileNames->waveCalibName, format->grismId, format->beamCombiner);
326 if ((waveCalPtr = fopen (fileString,
"r")) != NULL)
328 if (diagnostic)cpl_msg_info(cpl_func,
"\nTrying to extract Wavelength Calibration from %s \n", fileString);
329 fprintf (midiReportPtr,
"\nTrying to extract Wavelength Calibration from %s \n", fileString);
331 if (strcmp (format->beamCombiner,
"SCI_PHOT") == 0)
332 while (fscanf (waveCalPtr,
"%f %f %f %f\n", &record1, &record2, &record3, &record4) != EOF) numOfRecords++;
334 while (fscanf (waveCalPtr,
"%f %f\n", &record1, &record2) != EOF) numOfRecords++;
336 if (numOfRecords == format->iXWidth)
338 if (diagnostic)cpl_msg_info(cpl_func,
"\nFound a wavelength calibration file %s with %d pairs of floats \n",
339 fileString, numOfRecords);
340 fprintf (midiReportPtr,
"\nFound a wavelength calibration file %s with %d pairs of floats \n",
341 fileString, numOfRecords);
346 sprintf (midiMessage,
"Inconsistent calibration data in %s. Data ignored", fileString);
347 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
353 sprintf (midiMessage,
"Cannot find calibration data file ... %s", fileString);
354 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
360 getWaveCalPoly (fileNames, format, &error);
361 if (error) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create wavelength calibration");
391 void getWaveCalPoly (
392 MidiFiles *fileNames,
393 ImageFormat *imageFormat,
399 const char routine[] =
"getWaveCalPoly";
400 float A[2], B[2], C[2], D[2], x, **waveCal=NULL;
401 int i, j, regions, useGrism;
407 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
408 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
410 cpl_msg_info(cpl_func,
"\nComputing wavelength calibration using Calibration Polynomial \n");
411 fprintf (midiReportPtr,
"\nComputing wavelength calibration using Calibration Polynomial \n");
414 if (stat (fileNames->wclNameWrite, &buf) == 0)
remove (fileNames->wclNameWrite);
420 waveCal = callocWaveCalibration (regions, imageFormat);
423 if ((waveCalPtr = fopen (fileNames->wclNameWrite,
"w")) == NULL)
425 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot open file to store wavelength calibrations");
426 freeWaveCalibration (regions, waveCal);
432 if (strcmp (imageFormat->grismId,
"GRISM") == 0) useGrism = 1;
437 A[0] = 1.9837227e-08;
438 A[1] = 3.0043738e-08;
439 B[0] = -7.7775886e-06;
440 B[1] = -1.2241891e-05;
445 for (i = 0; i < imageFormat->iXWidth; i++)
447 for (j = 0; j < regions; j++)
450 waveCal[j][i] = 299.8F/(A[j]*x*x*x + B[j]*x*x + C[j]*x + D[j]);
457 A[0] = -6.1780766e-07;
458 A[1] = -6.8179155e-07;
459 B[0] = -1.6145018e-06;
460 B[1] = 2.1291316e-05;
465 for (i = 0; i < imageFormat->iXWidth; i++)
467 for (j = 0; j < regions; j++)
470 waveCal[j][i] = 299.8F/(A[j]*x*x*x + B[j]*x*x + C[j]*x + D[j]);
476 for (j = 0; j < regions; j++)
478 for (i = 0; i < imageFormat->iXWidth; i++) waveCal[j][i] = SPEED_OF_LIGHT / waveCal[j][i];
482 if (diagnostic)cpl_msg_info(cpl_func,
"\nWavelength Calibration \n");
483 fprintf (midiReportPtr,
"\nWavelength Calibration \n");
484 for (i = 0; i < imageFormat->iXWidth; i++)
486 if (strcmp (imageFormat->beamCombiner,
"SCI_PHOT") == 0)
488 if (diagnostic)cpl_msg_info(cpl_func,
"%3d %7.4f %7.4f %7.4f %7.4f \n", i,
489 waveCal[0][i], waveCal[0][i], waveCal[1][i], waveCal[0][i]);
490 fprintf (midiReportPtr,
"%3d %7.4f %7.4f %7.4f %7.4f \n", i,
491 waveCal[0][i], waveCal[0][i], waveCal[1][i], waveCal[0][i]);
495 if (diagnostic)cpl_msg_info(cpl_func,
"%3d %7.4f %7.4f \n", i, waveCal[0][i], waveCal[1][i]);
496 fprintf (midiReportPtr,
"%3d %7.4f %7.4f \n", i, waveCal[0][i], waveCal[1][i]);
499 if (diagnostic)cpl_msg_info(cpl_func,
"\n");
500 fprintf (midiReportPtr,
"\n");
503 fprintf (waveCalPtr,
"%s \n", imageFormat->grismId);
504 fprintf (waveCalPtr,
"%s \n", imageFormat->beamCombiner);
505 fprintf (waveCalPtr,
"%d \n", imageFormat->iXWidth);
506 if (strcmp (imageFormat->beamCombiner,
"SCI_PHOT") == 0)
508 for (i = 0; i < imageFormat->iXWidth; i++)
509 fprintf (waveCalPtr,
"%f %f %f %f \n", waveCal[0][i], waveCal[0][i],
510 waveCal[1][i], waveCal[0][i]);
514 for (i = 0; i < imageFormat->iXWidth; i++)
515 fprintf (waveCalPtr,
"%f %f \n", waveCal[0][i], waveCal[1][i]);
520 cpl_msg_info(cpl_func,
"Created the wavelength calibration file ... %s \n", fileNames->wclNameWrite);
521 fprintf (midiReportPtr,
"Created the wavelength calibration file ... %s \n", fileNames->wclNameWrite);
524 freeWaveCalibration (regions, waveCal);
542 void checkDelayLineJumps (
545 CompressedData *compressed)
550 const char routine[] =
"checkDelayLineJumps";
551 int i, x, numSummed = 0;
552 float lastDL, diff, avg, rms, threshold, lastPiezo,
557 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
558 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
560 cpl_msg_info(cpl_func,
"\nChecking Delay Line Jumps within scans for %s \n", dataKey);
561 cpl_msg_info(cpl_func,
"-------------------------------------------- \n");
562 fprintf (midiReportPtr,
"\nChecking Delay Line Jumps within scans for %s \n", dataKey);
563 fprintf (midiReportPtr,
"-------------------------------------------- \n");
565 for (i = 0; i < format->numOfFrames; i++)
567 if ((i % format->framesPerScan) == 0)
568 lastDL = compressed->bigDL[i];
569 else if (lastDL != compressed->bigDL[i])
571 cpl_msg_info(cpl_func,
"<<Warning>>: Delay Line jump at scan %d, from %f to %f \n",
572 i/format->framesPerScan, lastDL, compressed->bigDL[i]);
573 fprintf (midiReportPtr,
"<<Warning>>: Delay Line jump at scan %d, from %f to %f \n",
574 i, lastDL, compressed->bigDL[i]);
575 compressed->badScanList[i/format->framesPerScan] |= BSL_DLJ_ERROR;
576 lastDL = (compressed->bigDL)[i];
581 for (i = 0; i < format->numOfFrames; i++)
583 if ((i % format->framesPerScan) == 0)
584 lastPiezo = (compressed->localOPD)[i];
588 if (!(isnan (compressed->localOPD[i])) &&
589 !(isnan (lastPiezo)) &&
590 !(compressed->badScanList[i/format->framesPerScan]))
592 diff = compressed->localOPD[i] - lastPiezo;
594 sumsqr += diff * diff;
596 lastPiezo = compressed->localOPD[i];
601 avg = sum/((float) numSummed);
602 rms = sqrtp(sumsqr/((
float) numSummed) - avg * avg);
603 if ( rms < (0.02 * fabs(avg))) rms = 0.02F * fabs(avg);
606 threshold = 5.F * rms;
607 for (i = 0; i < format->numOfFrames; i++)
609 if ((i % format->framesPerScan) == 0)
610 lastPiezo = compressed->localOPD[i];
613 if (!(isnan (compressed->localOPD[i])) &&
614 !(isnan (lastPiezo)) &&
615 !(compressed->badScanList[i/format->framesPerScan]))
617 diff = compressed->localOPD[i] - lastPiezo;
618 if (fabs(diff-avg) > threshold)
620 cpl_msg_info(cpl_func,
"<<Warning>>: PIEZO jump at scan %d, of %f microns. Expected %f \n",
621 i/format->framesPerScan, 1000000.F*diff, 1000000.F * avg);
622 fprintf (midiReportPtr,
"<<Warning>>: PIEZO jump at scan %d, of %f microns. Expected %f \n",
623 i/format->framesPerScan, 1000000.F*diff, 1000000.F * avg);
624 compressed->badScanList[i/format->framesPerScan] |= BSL_DLJ_ERROR;
631 lastPiezo = compressed->localOPD[i];
636 avg = sum/((float) numSummed);
637 if (diagnostic)cpl_msg_info(cpl_func,
"Average piezo step = %5.3f microns \n", 1000000.F*avg);
638 fprintf(midiReportPtr,
"Average piezo step = %5.3f microns \n", 1000000.F*avg);
640 format->optFreqCal = 1.F/(3335.F*fabs(avg));
642 if (diagnostic)cpl_msg_info(cpl_func,
"Setting optical wavelength calibration for this observation: %5.3f micron\n",
644 fprintf(midiReportPtr,
"Setting optical wavelength calibration for this observation: %5.3f micron\n",
648 for (x = 0; x < format->iXWidth; x++)
650 for (i = 0; i < format->numOfFrames; i++)
651 compressed->rejectList[x][i] |= compressed->badScanList[i/format->framesPerScan];
671 void checkDelayLineConsistencies (
672 const char *dataKey1,
673 const char *dataKey2,
674 CompressedData *compressedInterf,
675 CompressedData *compressedPhotom,
676 ImageFormat *formatInterf,
677 ImageFormat *formatPhotom,
684 const char routine[] =
"checkDelayLineConsistencies";
685 int j, type, numOfFrames, startFrame, toBeCounted;
686 CompressedData *thisData=NULL;
687 float frameTime100[ARB_NUM_OF_FRAMETIME];
693 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
694 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
696 cpl_msg_info(cpl_func,
"\nChecking Delay Line Consistencies between %s and %s \n", dataKey1, dataKey2);
697 cpl_msg_info(cpl_func,
"------------------------------------------- \n");
698 fprintf (midiReportPtr,
"\nChecking Delay Line Consistencies between %s and %s \n", dataKey1, dataKey2);
699 fprintf (midiReportPtr,
"------------------------------------------- \n");
705 for (type = 0; type < 2; type++)
707 if (type == 0) thisData = compressedInterf;
708 if (type == 1) thisData = compressedPhotom;
709 if (type == 0) numOfFrames = formatInterf->numOfFrames;
710 if (type == 1) numOfFrames = formatPhotom->numOfFrames;
711 if (numOfFrames < (ARB_NUM_OF_FRAMETIME + 101))
continue;
713 for (j = 0; j < ARB_NUM_OF_FRAMETIME; j++)
715 startFrame = j * ((numOfFrames-101)/ARB_NUM_OF_FRAMETIME);
716 if (!isnan (thisData->time[startFrame+100]) && !isnan (thisData->time[startFrame]))
719 frameTime100[j] = (thisData->time[startFrame+100] - thisData->time[startFrame]) * 864000.0;
723 makeStats (frameTime100, toBeCounted, mean+type, &rms);
724 if (diagnostic)cpl_msg_info(cpl_func,
"Found FRAME TIME for dataset %d = %7.2f ms (apparent rms = %f) \n",
725 type, mean[type], rms*10.0);
726 fprintf (midiReportPtr,
"Found FRAME TIME for dataset %d = %7.2f ms (apparent rms = %f) \n",
727 type, mean[type], rms*10.0);
728 if (rms > (0.01 * mean[type])) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
729 "Apparently an inconsistent FRAME TIME");
732 if (fabs(mean[1] - mean[0]) > (0.01 * mean[0]))
734 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
735 "Found inconsistent FRAME TIME between Interferometry & Photometry files");
756 void createMaskFile (
757 MidiFiles *fileNames,
763 const char routine[] =
"createMaskFile";
764 FILE *inFitsBatchPtr = NULL;
766 int imagingDataExtension;
767 char *stringTemp, *classification, *maskPath;
772 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
773 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
775 cpl_msg_info(cpl_func,
"\nCreating a mask file for batch %d \n", batchNumber);
776 cpl_msg_info(cpl_func,
"------------------------------ \n");
777 fprintf (midiReportPtr,
"\nCreating a mask file for batch %d \n", batchNumber);
778 fprintf (midiReportPtr,
"------------------------------ \n");
784 param = callocImageFormat ();
785 maskPath = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
786 stringTemp = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
787 classification = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
790 if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch,
"r")) == NULL)
792 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
793 "Cannot open input FITS file list\n This batch has been ignored");
794 freeImageFormat (param);
795 free (classification);
802 while (fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
804 sprintf (classification,
"%s",
"");
805 sscanf (stringTemp,
"%s%s", fileNames->inFitsName, classification);
806 if (diagnostic)cpl_msg_info(cpl_func,
"Processing file %s \n", fileNames->inFitsName);
807 fprintf(midiReportPtr,
"Processing file %s \n", fileNames->inFitsName);
810 imagingDataExtension = findImagingDataExtension (fileNames->inFitsName, TAB_IMAGING_DATA, error);
814 if (imagingDataExtension > 0)
816 getImageFormat (fileNames->inFitsName, imagingDataExtension, param, error);
819 else param->hasData = 0;
825 sprintf (fileNames->maskFileName,
"Mask_ONLINE_%s_%s.fits", param->grismId, param->beamCombiner);
826 sprintf (maskPath,
"%s%s", outFileDir, fileNames->maskFileName);
827 if ((stat (maskPath, &buf)) != 0)
830 if (((strcmp (param->obsCatg,
"CALIB") == 0) ||
831 (strcmp (param->obsCatg,
"SCIENCE") == 0)) &&
832 (strcmp (param->obsTech,
"IMAGE,WINDOW,CHOPNOD") == 0) &&
833 (strcmp (param->obsType,
"PHOTOMETRY,OBJECT") == 0))
835 preparePhotomAperMask (fileNames->inFitsName, maskPath, error);
836 if (*error) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create mask file from");
838 else if ((strcmp (param->beamCombiner,
"SCI_PHOT") == 0))
841 createMaskSP (fileNames->inFitsName, maskPath, error);
842 if (*error) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create mask file from");
845 else if (((strcmp (param->obsCatg,
"CALIB") == 0) || (strcmp (param->obsCatg,
"SCIENCE") == 0)) &&
846 (strcmp (param->obsTech,
"UNKNOWN_TECH") == 0) && (strcmp (param->obsType,
"UNKNOWN_TYPE") == 0))
847 prepareSpectroPhotomAperMask ();
848 else if (((strcmp (param->obsCatg,
"CALIB") == 0) || (strcmp (param->obsCatg,
"SCIENCE") == 0)) &&
849 (strcmp (param->obsTech,
"UNKNOWN_TECH") == 0) && (strcmp (param->obsType,
"UNKNOWN_TYPE") == 0))
850 prepareMasterFlat ();
851 else if (((strcmp (param->obsCatg,
"CALIB") == 0) || (strcmp (param->obsCatg,
"SCIENCE") == 0)) &&
852 (strcmp (param->obsTech,
"UNKNOWN_TECH") == 0) && (strcmp (param->obsType,
"UNKNOWN_TYPE") == 0))
853 prepareMasterDark ();
854 else if (((strcmp (param->obsCatg,
"CALIB") == 0) || (strcmp (param->obsCatg,
"SCIENCE") == 0)) &&
855 (strcmp (param->obsTech,
"UNKNOWN_TECH") == 0) && (strcmp (param->obsType,
"UNKNOWN_TYPE") == 0))
856 prepareDispersionRelation ();
857 else if (((strcmp (param->obsCatg,
"CALIB") == 0) || (strcmp (param->obsCatg,
"SCIENCE") == 0)) &&
858 (strcmp (param->obsTech,
"UNKNOWN_TECH") == 0) && (strcmp (param->obsType,
"UNKNOWN_TYPE") == 0))
860 else if (((strcmp (param->obsCatg,
"CALIB") == 0) || (strcmp (param->obsCatg,
"SCIENCE") == 0)) &&
861 (strcmp (param->obsTech,
"UNKNOWN_TECH") == 0) && (strcmp (param->obsType,
"UNKNOWN_TYPE") == 0))
862 prepareSpectralSensitivity ();
864 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__,
"The above file is not suitable for this task");
868 if (diagnostic)cpl_msg_info(cpl_func,
"Found mask FITS file %s \n", maskPath);
869 fprintf (midiReportPtr,
"Found mask FITS file %s \n", maskPath);
877 sprintf (midiMessage,
"No data tables in %s. Not processed", fileNames->inFitsName);
878 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
884 fclose (inFitsBatchPtr);
885 freeImageFormat (param);
886 free (classification);
905 void prepareMasterFlat (
void)
910 const char routine[] =
"prepareMasterFlat";
914 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
915 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
917 midiReportTbd (midiReportPtr, routine, __FILE__, __LINE__,
"Entire routine to be written");
936 void prepareMasterDark (
void)
941 const char routine[] =
"prepareMasterDark";
945 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
946 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
948 midiReportTbd (midiReportPtr, routine, __FILE__, __LINE__,
"Entire routine to be written");
967 void prepareDispersionRelation (
void)
972 const char routine[] =
"prepareDispersiveRelation";
976 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
977 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
979 midiReportTbd (midiReportPtr, routine, __FILE__, __LINE__,
"Entire routine to be written");
998 void prepareSpectroPhotomAperMask (
void)
1003 const char routine[] =
"prepareSpectroPhotomAperMask";
1007 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1008 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
1010 midiReportTbd (midiReportPtr, routine, __FILE__, __LINE__,
"Entire routine to be written");
1037 const char routine[] =
"createMaskSP";
1038 ImageFormat *format;
1039 int i, x, y, extNumOfImagingData, subWindowSize, tableWidth, numOfColumns,
1040 edgeLX, edgeRX, edgeFY, edgeBY, numOfRows;
1041 qfits_header *primHeadMask, *imagDataHeader;
1042 char *dateTime, *tdim1, *tdim2, *tdim3, *tdim4;
1044 qfits_table *maskTable;
1045 float **array, *data1, *data2, *data3, *data4;
1050 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1051 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
1059 cpl_msg_info(cpl_func,
"Creating mask FITS file %s \n", maskFitsName);
1060 fprintf (midiReportPtr,
"Creating mask FITS file %s \n", maskFitsName);
1063 extNumOfImagingData = findImagingDataExtension (inFitsName, TAB_IMAGING_DATA, error);
1066 format = callocImageFormat ();
1067 getImageFormat (inFitsName, extNumOfImagingData, format, error);
1068 subWindowSize = format->iXWidth * format->iYWidth;
1071 if (diagnostic)cpl_msg_info(cpl_func,
"Extracting primary header from input FITS file %s \n", inFitsName);
1072 if (diagnostic) fprintf(midiReportPtr,
"Extracting primary header from input FITS file %s \n", inFitsName);
1073 primHeadMask = qfits_header_read (inFitsName);
1074 if (primHeadMask == NULL)
1076 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot extract primary header from input FITS file");
1077 cpl_msg_info(cpl_func,
"\nCannot Create mask FITS file for batch %d \n", batchNumber);
1078 fprintf (midiReportPtr,
"\nCannot Create mask FITS file for batch %d \n", batchNumber);
1079 freeImageFormat (format);
1085 dateTime = qfits_get_datetime_iso8601 ();
1086 qfits_header_mod (primHeadMask,
"DATE", dateTime,
"Date and time this file was written");
1087 qfits_header_mod (primHeadMask,
"INSTRUME",
"MIDI",
"MIDI Mask created by DRS pipeline" );
1088 qfits_header_add (primHeadMask,
"EXTNAME",
"Primary",
"MIDI Mask primary header",
"" );
1091 maskFitsPtr = fopen (maskFitsName,
"w");
1092 qfits_header_dump (primHeadMask, maskFitsPtr);
1093 qfits_header_destroy (primHeadMask);
1094 fclose (maskFitsPtr);
1097 data1 = (
float *) calloc (subWindowSize,
sizeof (
float));
1098 data2 = (
float *) calloc (subWindowSize,
sizeof (
float));
1099 data3 = (
float *) calloc (subWindowSize,
sizeof (
float));
1100 data4 = (
float *) calloc (subWindowSize,
sizeof (
float));
1101 tdim1 = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1102 tdim2 = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1103 tdim3 = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1104 tdim4 = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1107 midiReportTbd (midiReportPtr, routine, __FILE__, __LINE__,
"This is a temporary rectangular mask");
1108 edgeFY = 0.30 * format->iYWidth;
1109 edgeBY = 0.50 * format->iYWidth;
1110 edgeLX = 0.20 * format->iXWidth;
1111 edgeRX = 0.20 * format->iXWidth;
1112 for (y = edgeFY; y < format->iYWidth-edgeBY; y++)
1114 for (x = edgeLX; x < format->iXWidth-edgeRX; x++)
1116 i = x + y * format->iXWidth;
1125 maskFitsPtr = fopen (maskFitsName,
"a");
1126 if (maskFitsPtr == NULL)
1128 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot open mask file");
1138 freeImageFormat (format);
1143 maskTable = qfits_table_new (maskFitsName, QFITS_BINTABLE, tableWidth, numOfColumns, numOfRows);
1146 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create table");
1156 freeImageFormat (format);
1157 fclose (maskFitsPtr);
1162 col = maskTable->col;
1163 qfits_col_fill (col, subWindowSize, 2,
sizeof(
float), TFITS_BIN_TYPE_E,
"DATA1",
" ",
" ",
" ",
1166 qfits_col_fill (col, subWindowSize, 2,
sizeof(
float), TFITS_BIN_TYPE_E,
"DATA2",
" ",
" ",
" ",
1169 qfits_col_fill (col, subWindowSize, 2,
sizeof(
float), TFITS_BIN_TYPE_E,
"DATA3",
" ",
" ",
" ",
1172 qfits_col_fill (col, subWindowSize, 2,
sizeof(
float), TFITS_BIN_TYPE_E,
"DATA4",
" ",
" ",
" ",
1173 0, 0.0, 0, 1.0, subWindowSize*
sizeof(
float));
1176 imagDataHeader = qfits_table_ext_header_default(maskTable);
1177 qfits_header_add (imagDataHeader,
"EXTNAME",
"IMAGING_DATA",
"MIDI Mask Extension name",
"" );
1181 sprintf (tdim1,
"'(%d,%d)'", format->iXWidth, format->iYWidth);
1182 sprintf (tdim2,
"'(%d,%d)'", format->iXWidth, format->iYWidth);
1183 sprintf (tdim3,
"'(%d,%d)'", format->iXWidth, format->iYWidth);
1184 sprintf (tdim4,
"'(%d,%d)'", format->iXWidth, format->iYWidth);
1185 qfits_header_add (imagDataHeader,
"TDIM1", tdim1,
"Column dimensionality",
"" );
1186 qfits_header_add (imagDataHeader,
"TDIM2", tdim2,
"Column dimensionality",
"" );
1187 qfits_header_add (imagDataHeader,
"TDIM3", tdim2,
"Column dimensionality",
"" );
1188 qfits_header_add (imagDataHeader,
"TDIM4", tdim2,
"Column dimensionality",
"" );
1191 array = (
float **) calloc (numOfColumns,
sizeof(
float *));
1197 if (qfits_table_append_xtension_hdr (maskFitsPtr, maskTable, (
const void **)array, imagDataHeader) == -1)
1200 qfits_header_destroy (imagDataHeader);
1201 qfits_table_close (maskTable);
1205 cpl_msg_info(cpl_func,
"Created Mask FITS file: %s \n", maskFitsName);
1206 fprintf (midiReportPtr,
"Created Mask FITS file: %s \n", maskFitsName);
1211 fclose (maskFitsPtr);
1220 freeImageFormat (format);
1239 void preparePhotomAperMask (
1247 const char routine[] =
"preparePhotomAperMask";
1248 static short int *aveData_1, *aveData_2;
1249 short int *inData_1, *inData_2;
1250 ImageFormat *format;
1251 int i, j, extNumOfImagingData, numOfElemets,
1252 scalingOffset, indexData1, indexData2, subWindowSize, pixel;
1253 static int aprioriNumOfElemets = 0, numOfFiles = 0;
1254 qfits_table *imagDataTable;
1255 char *tempStr, *dataName;
1256 int foundData1 = 0, foundData2 = 0;
1260 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1261 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
1268 extNumOfImagingData = findImagingDataExtension (inFileName, TAB_IMAGING_DATA, error);
1271 format = callocImageFormat ();
1272 getImageFormat (inFileName, extNumOfImagingData, format, error);
1273 subWindowSize = format->iXWidth * format->iYWidth;
1274 numOfElemets = subWindowSize * format->numOfFrames;
1277 if (numOfFiles == 1)
1279 aprioriNumOfElemets = numOfElemets;
1280 aveData_1 = (
short int *) calloc (numOfElemets,
sizeof (
short int));
1281 aveData_2 = (
short int *) calloc (numOfElemets,
sizeof (
short int));
1284 if (aprioriNumOfElemets != numOfElemets)
1286 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Inconsistent photometry files");
1288 freeImageFormat (format);
1295 imagDataTable = qfits_table_open (inFileName, extNumOfImagingData);
1298 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot load IMAGING_DATA");
1300 freeImageFormat (format);
1306 dataName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1308 for (i = 14; i < 25; i++)
1310 sprintf (dataName,
"TZERO%d", i);
1311 tempStr = qfits_query_ext (inFileName, dataName, extNumOfImagingData);
1312 if (tempStr != NULL)
1314 if (diagnostic)cpl_msg_info(cpl_func,
"Scaling Offset = %s\n", tempStr);
1315 fprintf( midiReportPtr,
"Scaling Offset = %s\n", tempStr);
1316 sscanf (tempStr,
"%d", &scalingOffset);
1320 if (tempStr == NULL)
1323 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot read Scaling Offset. It is set to 0");
1330 for (i = 0; i < imagDataTable->nc; i++)
1332 if (strcmp (imagDataTable->col[i].tlabel,
"DATA1") == 0)
1337 if (strcmp (imagDataTable->col[i].tlabel,
"DATA2") == 0)
1343 if (foundData1 == 0 || foundData2 == 0)
1345 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find requested columns in date FITS file");
1347 qfits_table_close (imagDataTable);
1349 freeImageFormat (format);
1355 inData_1 = (
short int *) (qfits_query_column (imagDataTable, indexData1, NULL));
1356 inData_2 = (
short int *) (qfits_query_column (imagDataTable, indexData2, NULL));
1359 for (j = 0; j < format->numOfFrames; j++)
1361 for (pixel = 0; pixel < subWindowSize; pixel++)
1363 i = j * subWindowSize + pixel;
1364 if (isnan (inData_1[i]) || isnan (inData_2[i]))
1366 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Corrupted DATA1 or DATA2");
1367 qfits_table_close (imagDataTable);
1370 freeImageFormat (format);
1374 aveData_1[i] += (inData_1[i] + scalingOffset);
1375 aveData_2[i] += (inData_2[i] + scalingOffset);
1382 if (numOfFiles == 2)
1384 for (i = 0; i < numOfElemets; i++)
1386 aveData_1[i] *= 0.5;
1387 aveData_2[i] *= 0.5;
1389 createMidiMaskFile(format->iXWidth, format->iYWidth, inFileName, (
short int *)(aveData_1), (
short int *)(aveData_2),
1390 format->numOfFrames, subWindowSize, maskFileName, error);
1392 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create mask file");
1403 freeImageFormat (format);
1405 qfits_table_close (imagDataTable);
1425 void prepareZeroPoint (
void)
1430 const char routine[] =
"prepareZeroPoint";
1434 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1435 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
1437 midiReportTbd (midiReportPtr, routine, __FILE__, __LINE__,
"Entire routine to be written");
1456 void prepareSpectralSensitivity (
void)
1461 const char routine[] =
"prepareSpectralSensitivity";
1465 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1466 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
1468 midiReportTbd (midiReportPtr, routine, __FILE__, __LINE__,
"Entire routine to be written");