27 #include "midiGlobal.h"
29 #include "imageProcessing.h"
30 #include "memoryHandling.h"
31 #include "createProdWavCal.h"
32 #include "procWavCal.h"
33 #include "errorHandling.h"
34 #include "midiFitsUtility.h"
35 #include "fitsAnalysisTec.h"
36 #include "diagnostics.h"
37 #include "statistics.h"
38 #include "cpl_polynomial.h"
40 #include "midi_cplutils.h"
41 #include "midi_cplupgrade.h"
74 const char routine[] =
"procWaveCal";
75 FILE *signaturePtr=NULL, *filePtr=NULL;
76 int numOfFiles, numOfRecords;
77 ImageFormat *format=NULL;
78 WaveCalibration *waveCal=NULL;
80 float record1, record2, record3, record4;
84 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
85 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
88 signaturePtr = fopen (
"MIDI_sig_wav.log",
"w");
89 fclose (signaturePtr);
96 format = callocImageFormat ();
98 analyseFitsWaveCal (fileNames, format, &numOfFiles, error);
101 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot analyse WAVECAL");
102 freeImageFormat (format);
110 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
111 sprintf (fileString ,
"%s_%s_%s.dat", fileNames->waveCalibName, format->grismId, format->beamCombiner);
112 if ((filePtr = fopen (fileString,
"r")) != NULL)
115 cpl_msg_info(cpl_func,
"\nChecking consistency of Wavelength Calibration file ... %s \n", fileString);
116 fprintf (midiReportPtr,
"\nChecking consistency of Wavelength Calibration file ... %s \n", fileString);
118 if (strcmp (format->beamCombiner,
"SCI_PHOT") == 0)
119 while (fscanf (filePtr,
"%f %f %f %f\n", &record1, &record2, &record3, &record4) != EOF) numOfRecords++;
121 while (fscanf (filePtr,
"%f %f\n", &record1, &record2) != EOF) numOfRecords++;
124 if (numOfRecords == format->iXWidth)
127 cpl_msg_info(cpl_func,
"Found a wavelength calibration file %s with %d pairs of floats \n",
128 fileString, numOfRecords);
129 fprintf (midiReportPtr,
"Found a wavelength calibration file %s with %d pairs of floats \n",
130 fileString, numOfRecords);
135 sprintf (midiMessage,
"Inconsistent calibration data in %s. Nothing to correlate", fileString);
136 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
142 sprintf (midiMessage,
"Cannot find calibration data file ... %s. Nothing to correlate", fileString);
143 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
149 freeImageFormat (format);
155 numOfRecords = getWlCalib2Spectra (fileNames, error);
158 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get Wavelength Calibration data");
159 freeImageFormat (format);
164 if (numOfRecords < format->iXWidth) numOfRecords = format->iXWidth;
167 waveCal = callocWaveCal (numOfFiles, numOfRecords, format);
168 computeWaveCal (processing, numOfFiles, fileNames, waveCal, error);
171 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot process WAVECAL");
172 freeWaveCal (format, waveCal);
173 freeImageFormat (format);
178 createWaveCalProd (processing, fileNames, format, waveCal, error);
179 if (*error) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create WAVECAL products");
182 freeWaveCal (format, waveCal);
183 freeImageFormat (format);
203 void computeWaveCal (
206 MidiFiles *fileNames,
207 WaveCalibration *waveCal,
213 const char routine[] =
"computeWaveCal";
214 char *fileTemp, *classification;
215 FILE *inFitsBatchPtr;
217 int localError, fileNumber, extNumOfImagingDataFile;
221 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
222 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
225 classification = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
226 fileTemp = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
227 format = callocImageFormat ();
237 if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch,
"r")) == NULL)
239 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
240 "Cannot open input FITS file list. No compression has been carried out for this batch");
241 freeImageFormat (format);
243 free (classification);
249 while (fgets (fileTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
251 sprintf (classification,
"%s",
"");
252 sscanf (fileTemp,
"%s%s", fileNames->inFitsName, classification);
253 if (diagnostic)cpl_msg_info(cpl_func,
"\n Processing file %s \n", fileNames->inFitsName);
254 fprintf(midiReportPtr,
"\n Processing file %s \n", fileNames->inFitsName);
257 extNumOfImagingDataFile = findImagingDataExtension (fileNames->inFitsName, TAB_IMAGING_DATA, &localError);
265 if (extNumOfImagingDataFile > 0)
267 getImageFormat (fileNames->inFitsName, extNumOfImagingDataFile, format, &localError);
274 else format->hasData = 0;
280 if ((strcmp (format->obsCatg,
"CALIB") == 0) &&
281 (strcmp (format->obsTech,
"SPECTRUM") == 0) &&
282 (strcmp (format->obsType,
"WAVE,SPECTEMPL") == 0))
286 if (fileNumber > numOfFiles)
289 sprintf (midiMessage,
"Inconsistent number of files. Expected %d. Found %d", numOfFiles, fileNumber);
290 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
295 sprintf (waveCal->shutterId[fileNumber-1],
"%s", format->shutterId);
296 sprintf (waveCal->filterName[fileNumber-1],
"%s", format->filterName);
299 compressWaveCal (fileNumber-1, fileNames->inFitsName, extNumOfImagingDataFile, format, waveCal, &localError);
303 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot preprocess");
308 validateWaveCalData (fileNumber-1, fileNames->inFitsName, waveCal, format, &localError);
312 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot validate data");
317 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__,
"The above file is not suitable for this task");
323 sprintf (midiMessage,
"No data tables in %s. Not processed", fileNames->inFitsName);
324 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
330 if ((*error) || (fileNumber != numOfFiles))
332 sprintf (midiMessage,
"Cannot do Wavelength Calibration. error=%d, numOfFiles=%d. Expected %d",
333 *error, fileNumber, numOfFiles);
334 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
335 fclose (inFitsBatchPtr);
336 freeImageFormat (format);
338 free (classification);
344 cpl_msg_info(cpl_func,
"\nWavelength Calibration 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");
349 fprintf (midiReportPtr,
"\nWavelength Calibration Inventry: \n");
350 fprintf (midiReportPtr,
"=============================== \n");
351 fprintf (midiReportPtr,
" Expected number of data files = %d\n", numOfFiles);
352 fprintf (midiReportPtr,
" Number of data files processed = %d\n", fileNumber);
353 fprintf (midiReportPtr,
"\n");
356 removeDark (format, waveCal, error);
359 calibrateWaveChannels (processing, fileNames, waveCal, format, error);
362 fclose (inFitsBatchPtr);
365 freeImageFormat (format);
367 free (classification);
385 void compressWaveCal (
390 WaveCalibration *waveCal,
397 const char routine[] =
"compressWaveCal";
398 qfits_table *pTable=NULL;
400 char *inTarType=NULL, *tempStr, *dataName, lastTT;
401 int i, pixel, *foundData, scalingOffset, *indexData, numOfSkyFrames, numOfFramesUsed,
402 frame, region, indexTarType, foundTarType, transitions, numOfUndefinedFrames,
403 numOfBadFrames, tartypMult;
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);
422 inData = (
short int **) calloc (format->numOfDetectorRegions, sizeof (
short int *));
423 foundData = (
int *) calloc (format->numOfDetectorRegions, sizeof (
int));
424 indexData = (
int *) calloc (format->numOfDetectorRegions, sizeof (
int));
425 dataName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
428 pTable = qfits_table_open (inFitsName, extensionNumber);
431 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot load IMAGING_DATA");
432 for (region = 0; region < format->numOfDetectorRegions; region++) free (inData[region]);
441 for (region = 0; region < format->numOfDetectorRegions; region++)
443 foundData[region] = 0;
444 indexData[region] = 0;
446 for (i = 0; i < pTable->nc; i++)
448 for (region = 0; region < format->numOfDetectorRegions; region++)
450 sprintf (dataName,
"DATA%d", region+1);
451 if (strcmp (pTable->col[i].tlabel, dataName) == 0)
453 foundData[region] = 1;
454 indexData[region] = i;
455 if (diagnostic)cpl_msg_info(cpl_func,
"Found 'DATA%d' at column %d in data file %s \n", region+1, i+1, inFitsName);
456 if (diagnostic) fprintf(midiReportPtr,
"Found 'DATA%d' at column %d in data file %s \n", region+1, i+1, inFitsName);
459 if (strcmp (pTable->col[i].tlabel,
"TARTYP2") == 0)
467 if (foundTarType == 0)
469 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find TARTYP2 in data FITS file");
472 for (region = 0; region < format->numOfDetectorRegions; region++)
474 if (foundData[region] == 0)
476 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find requested DATA column in data FITS file");
484 qfits_table_close (pTable);
485 for (region = 0; region < format->numOfDetectorRegions; region++) free (inData[region]);
493 inTarType = (
char *) qfits_query_column (pTable, indexTarType, NULL);
494 for (frame = 0; frame < format->numOfFrames; frame++)
495 waveCal->tarType[frame] = inTarType[frame*tartypMult];
499 lastTT = waveCal->tarType[0];
500 for (frame = 0; frame < format->numOfFrames; frame++)
502 if (waveCal->tarType[frame] == lastTT)
continue;
504 lastTT = waveCal->tarType[frame];
506 if ((format->chopped = (transitions > 10)))
508 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Wavelength Calibration data is chopped");
510 qfits_table_close (pTable);
511 for (region = 0; region < format->numOfDetectorRegions; region++) free (inData[region]);
519 for (region = 0; region < format->numOfDetectorRegions; region++)
520 inData[region] = (
short int*) qfits_query_column (pTable, indexData[region], NULL);
523 for (i = 14; i < 25; i++)
525 sprintf (dataName,
"TZERO%d", i);
526 tempStr = qfits_query_ext (inFitsName, dataName, extensionNumber);
529 if (diagnostic)cpl_msg_info(cpl_func,
"Scaling Offset = %s\n", tempStr);
530 if (diagnostic) fprintf (midiReportPtr,
"Scaling Offset = %s\n", tempStr);
531 sscanf (tempStr,
"%d", &scalingOffset);
538 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot read Scaling Offset. It is set to 0");
542 for (region = 0; region < format->numOfDetectorRegions; region++)
544 for (pixel = 0; pixel < format->subWindowSize; pixel++)
547 numOfUndefinedFrames = 0;
551 if (strcmp (waveCal->filterName[fileNumber],
"[ArIII]") == 0)
552 (waveCal->ArIII->image)[region][pixel] = 0.0;
553 else if (strcmp (waveCal->filterName[fileNumber],
"[NeII]") == 0)
554 (waveCal->NeII->image)[region][pixel] = 0.0;
555 else if (strcmp (waveCal->filterName[fileNumber],
"[SIV]") == 0)
556 (waveCal->SIV->image)[region][pixel] = 0.0;
557 else if (strcmp (waveCal->filterName[fileNumber],
"WL-CALIB_2") == 0)
558 (waveCal->foil->image)[region][pixel] = 0.0;
559 else if (strcmp (waveCal->filterName[fileNumber],
"OPEN") == 0)
560 (waveCal->open->image)[region][pixel] = 0.0;
561 else if (strcmp (waveCal->filterName[fileNumber],
"CLOSED") == 0)
562 (waveCal->dark->image)[region][pixel] = 0.0;
565 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Unknown Filter ID");
567 qfits_table_close (pTable);
568 for (region = 0; region < format->numOfDetectorRegions; region++) free (inData[region]);
575 for (frame = 0; frame < format->numOfFrames; frame++)
578 if (waveCal->tarType[frame] ==
'U')
580 if (diagnostic && !pixel)
582 sprintf (midiMessage,
"Found undefined, 'U' 'TARTYP2' at frame %d of DATA%d in %s",
583 frame+1, region+1, inFitsName);
584 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
586 numOfUndefinedFrames++;
591 i = frame * format->subWindowSize + pixel;
592 if (isnan (inData[region][i]))
595 sprintf (midiMessage,
"Found bad pixel %d of DATA%d in %s", i, region, inFitsName);
596 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
600 if (waveCal->tarType[frame] ==
'S') numOfSkyFrames++;
603 if (strcmp (waveCal->filterName[fileNumber],
"[ArIII]") == 0)
604 (waveCal->ArIII->image)[region][pixel] += (
float) (inData[region][i]);
605 else if (strcmp (waveCal->filterName[fileNumber],
"[NeII]") == 0)
606 (waveCal->NeII->image)[region][pixel] += (float) (inData[region][i]);
607 else if (strcmp (waveCal->filterName[fileNumber],
"[SIV]") == 0)
608 (waveCal->SIV->image)[region][pixel] += (float) (inData[region][i]);
609 else if (strcmp (waveCal->filterName[fileNumber],
"WL-CALIB_2") == 0)
610 (waveCal->foil->image)[region][pixel] += (float) (inData[region][i]);
611 else if (strcmp (waveCal->filterName[fileNumber],
"OPEN") == 0)
612 (waveCal->open->image)[region][pixel] += (float) (inData[region][i]);
613 else if (strcmp (waveCal->filterName[fileNumber],
"CLOSED") == 0)
614 (waveCal->dark->image)[region][pixel] += (float) (inData[region][i]);
617 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Unknown Filter ID");
619 qfits_table_close (pTable);
620 for (region = 0; region < format->numOfDetectorRegions; region++) free (inData[region]);
630 if (diagnostic && !pixel)
632 cpl_msg_info(cpl_func,
"\nData Statistics \n");
633 cpl_msg_info(cpl_func,
"--------------- \n");
634 cpl_msg_info(cpl_func,
"Number of frames used in DATA%d = %d \n", region+1, numOfFramesUsed);
635 cpl_msg_info(cpl_func,
"Number of Sky frames in DATA%d = %d \n", region+1, numOfSkyFrames);
636 cpl_msg_info(cpl_func,
"Number of Bad frames in DATA%d = %d \n", region+1, numOfBadFrames);
637 cpl_msg_info(cpl_func,
"Number of Undefined frames in DATA%d = %d \n", region+1, numOfUndefinedFrames);
638 fprintf (midiReportPtr,
"\nData Statistics \n");
639 fprintf (midiReportPtr,
"--------------- \n");
640 fprintf (midiReportPtr,
"Number of frames used in DATA%d = %d \n", region+1, numOfFramesUsed);
641 fprintf (midiReportPtr,
"Number of Sky frames in DATA%d = %d \n", region+1, numOfSkyFrames);
642 fprintf (midiReportPtr,
"Number of Bad frames in DATA%d = %d \n", region+1, numOfBadFrames);
643 fprintf (midiReportPtr,
"Number of Undefined frames in DATA%d = %d \n", region+1, numOfUndefinedFrames);
647 if (strcmp (waveCal->filterName[fileNumber],
"[ArIII]") == 0)
649 (waveCal->ArIII->image)[region][pixel] /= numOfFramesUsed;
650 (waveCal->ArIII->image)[region][pixel] += scalingOffset;
652 else if (strcmp (waveCal->filterName[fileNumber],
"[NeII]") == 0)
654 (waveCal->NeII->image)[region][pixel] /= numOfFramesUsed;
655 (waveCal->NeII->image)[region][pixel] += scalingOffset;
657 else if (strcmp (waveCal->filterName[fileNumber],
"[SIV]") == 0)
659 (waveCal->SIV->image)[region][pixel] /= numOfFramesUsed;
660 (waveCal->SIV->image)[region][pixel] += scalingOffset;
662 else if (strcmp (waveCal->filterName[fileNumber],
"WL-CALIB_2") == 0)
664 (waveCal->foil->image)[region][pixel] /= numOfFramesUsed;
665 (waveCal->foil->image)[region][pixel] += scalingOffset;
667 else if (strcmp (waveCal->filterName[fileNumber],
"OPEN") == 0)
669 (waveCal->open->image)[region][pixel] /= numOfFramesUsed;
670 (waveCal->open->image)[region][pixel] += scalingOffset;
672 else if (strcmp (waveCal->filterName[fileNumber],
"CLOSED") == 0)
674 (waveCal->dark->image)[region][pixel] /= numOfFramesUsed;
675 (waveCal->dark->image)[region][pixel] += scalingOffset;
679 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Unknown Filter ID");
681 qfits_table_close (pTable);
682 for (region = 0; region < format->numOfDetectorRegions; region++) free (inData[region]);
693 for (region = 0; region < format->numOfDetectorRegions; region++) free (inData[region]);
694 if (pTable) qfits_table_close (pTable);
695 if (inTarType) free(inTarType);
717 void validateWaveCalData (
720 WaveCalibration *compressed,
728 const char routine[] =
"validateWaveCalData";
730 char *title=NULL, *fileString=NULL;
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 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
742 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
745 if (strcmp (compressed->filterName[fileNumber],
"[ArIII]") == 0)
748 sprintf (compressed->ArIII->fileName,
"%s", fileName);
750 for (region = 0; region < format->numOfDetectorRegions; region++)
756 sprintf (fileString ,
"region %d", region+1);
757 sprintf (title ,
"AveRawImgArIIIDATA%d", region+1);
758 createFitsImage (fileString, title, fileName, format->iXWidth, format->iYWidth,
759 (compressed->ArIII->image)[region]);
763 sprintf (fileString,
"3dAveRawImgArIIIDATA%d", region+1);
764 sprintf (title,
"[ArIII] Raw, averaged along time, Region %d", region+1);
765 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
766 (compressed->ArIII->image)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
771 else if (strcmp (compressed->filterName[fileNumber],
"[NeII]") == 0)
774 sprintf (compressed->NeII->fileName,
"%s", fileName);
776 for (region = 0; region < format->numOfDetectorRegions; region++)
781 sprintf (fileString ,
"region %d", region+1);
782 sprintf (title ,
"AveRawImgNeIIDATA%d", region+1);
783 createFitsImage (fileString, title, fileName, format->iXWidth, format->iYWidth,
784 (compressed->NeII->image)[region]);
788 sprintf (fileString,
"3dAveRawImgNeIIDATA%d", region+1);
789 sprintf (title,
"[NeII] Raw, averaged along time, Region %d", region+1);
790 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
791 (compressed->NeII->image)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
796 else if (strcmp (compressed->filterName[fileNumber],
"[SIV]") == 0)
799 sprintf (compressed->SIV->fileName,
"%s", fileName);
801 for (region = 0; region < format->numOfDetectorRegions; region++)
806 sprintf (fileString ,
"region %d", region+1);
807 sprintf (title ,
"AveRawImgSIVDATA%d", region+1);
808 createFitsImage (fileString, title, fileName, format->iXWidth, format->iYWidth,
809 (compressed->SIV->image)[region]);
813 sprintf (fileString,
"3dAveRawImgSIVDATA%d", region+1);
814 sprintf (title,
"[SIV] Raw, averaged along time, Region %d", region+1);
815 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
816 (compressed->SIV->image)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
821 else if (strcmp (compressed->filterName[fileNumber],
"WL-CALIB_2") == 0)
824 sprintf (compressed->foil->fileName,
"%s", fileName);
826 for (region = 0; region < format->numOfDetectorRegions; region++)
831 sprintf (fileString ,
"region %d", region+1);
832 sprintf (title ,
"AveRawImgFoilDATA%d", region+1);
833 createFitsImage (fileString, title, fileName, format->iXWidth, format->iYWidth,
834 (compressed->foil->image)[region]);
838 sprintf (fileString,
"3dAveRawImgFoilDATA%d", region+1);
839 sprintf (title,
"Foil Raw, averaged along time, Region %d", region+1);
840 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
841 (compressed->foil->image)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
846 else if (strcmp (compressed->filterName[fileNumber],
"OPEN") == 0)
849 sprintf (compressed->open->fileName,
"%s", fileName);
851 for (region = 0; region < format->numOfDetectorRegions; region++)
856 sprintf (fileString ,
"region %d", region+1);
857 sprintf (title ,
"AveRawImgOpenDATA%d", region+1);
858 createFitsImage (fileString, title, fileName, format->iXWidth, format->iYWidth,
859 (compressed->open->image)[region]);
863 sprintf (fileString,
"3dAveRawImgOpenDATA%d", region+1);
864 sprintf (title,
"Open Raw, averaged along, Region %d", region+1);
865 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
866 (compressed->open->image)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
871 else if (strcmp (compressed->filterName[fileNumber],
"CLOSED") == 0)
874 sprintf (compressed->dark->fileName,
"%s", fileName);
876 for (region = 0; region < format->numOfDetectorRegions; region++)
881 sprintf (fileString ,
"region %d", region+1);
882 sprintf (title ,
"AveRawImgDarkDATA%d", region+1);
883 createFitsImage (fileString, title, fileName, format->iXWidth, format->iYWidth,
884 (compressed->dark->image)[region]);
888 sprintf (fileString,
"3dAveRawImgDarkDATA%d", region+1);
889 sprintf (title,
"Dark Raw, averaged along time, Region %d", region+1);
890 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
891 (compressed->dark->image)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
898 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Unknown Filter ID");
926 int getWlCalib2Spectra (
927 MidiFiles *fileNames,
934 const char routine[] =
"getWlCalib2Spectra";
935 FILE *wlFilePtr=NULL;
937 char *filePath, *tempString;
942 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
943 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
950 filePath = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
951 tempString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
955 sprintf (filePath,
"%swl-calib_2.dat", fileNames->calibDbDir);
956 if ((wlFilePtr = fopen (filePath,
"r")) == NULL)
958 sprintf (midiMessage,
"Cannot Open %s", filePath);
959 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
966 fgets (tempString, MAX_STRING_LENGTH, wlFilePtr);
967 sprintf (midiMessage,
"Counting elements in %s", tempString);
968 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
969 while (fscanf (wlFilePtr,
"%f %f\n", &elem1, &elem2) != EOF)
971 sprintf (midiMessage,
"WL-CALIB_2 has %d pairs of 'float'(s)", numOfRecords);
972 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
979 return (numOfRecords);
998 WaveCalibration *waveCal,
1005 const char routine[] =
"removeDark";
1007 char *title=NULL, *fileString=NULL;
1011 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1012 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
1018 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1019 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1022 for (region = 0; region < format->numOfDetectorRegions; region++)
1024 for (pixel = 0; pixel < format->subWindowSize; pixel++)
1026 (waveCal->ArIII->image)[region][pixel] -= (waveCal->dark->image)[region][pixel];
1027 (waveCal->NeII->image)[region][pixel] -= (waveCal->dark->image)[region][pixel];
1028 (waveCal->SIV->image)[region][pixel] -= (waveCal->dark->image)[region][pixel];
1029 (waveCal->foil->image)[region][pixel] -= (waveCal->dark->image)[region][pixel];
1030 (waveCal->open->image)[region][pixel] -= (waveCal->dark->image)[region][pixel];
1035 for (region = 0; region < format->numOfDetectorRegions; region++)
1037 sprintf (fileString ,
"region %d", region+1);
1038 sprintf (title ,
"AveImgArIIIDATA%d", region+1);
1039 createFitsImage (fileString, title, waveCal->ArIII->fileName, format->iXWidth, format->iYWidth,
1040 (waveCal->ArIII->image)[region]);
1043 for (region = 0; region < format->numOfDetectorRegions; region++)
1045 sprintf (fileString ,
"region %d", region+1);
1046 sprintf (title ,
"AveImgNeIIDATA%d", region+1);
1047 createFitsImage (fileString, title, waveCal->NeII->fileName, format->iXWidth, format->iYWidth,
1048 (waveCal->NeII->image)[region]);
1051 for (region = 0; region < format->numOfDetectorRegions; region++)
1053 sprintf (fileString ,
"region %d", region+1);
1054 sprintf (title ,
"AveImgSIVDATA%d", region+1);
1055 createFitsImage (fileString, title, waveCal->SIV->fileName, format->iXWidth, format->iYWidth,
1056 (waveCal->SIV->image)[region]);
1059 for (region = 0; region < format->numOfDetectorRegions; region++)
1061 sprintf (fileString ,
"region %d", region+1);
1062 sprintf (title ,
"AveImgFoilDATA%d", region+1);
1063 createFitsImage (fileString, title, waveCal->foil->fileName, format->iXWidth, format->iYWidth,
1064 (waveCal->foil->image)[region]);
1067 for (region = 0; region < format->numOfDetectorRegions; region++)
1069 sprintf (fileString ,
"region %d", region+1);
1070 sprintf (title ,
"AveImgOpenDATA%d", region+1);
1071 createFitsImage (fileString, title, waveCal->open->fileName, format->iXWidth, format->iYWidth,
1072 (waveCal->open->image)[region]);
1078 for (region = 0; region < format->numOfDetectorRegions; region++)
1080 sprintf (fileString,
"3dAveImgArIIIDATA%d", region+1);
1081 sprintf (title,
"[ArIII] Dark removed, averaged along time, Region %d", region+1);
1082 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
1083 (waveCal->ArIII->image)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
1086 for (region = 0; region < format->numOfDetectorRegions; region++)
1088 sprintf (fileString,
"3dAveImgNeIIDATA%d", region+1);
1089 sprintf (title,
"[NeII] Dark removed, averaged along time, Region %d", region+1);
1090 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
1091 (waveCal->NeII->image)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
1094 for (region = 0; region < format->numOfDetectorRegions; region++)
1096 sprintf (fileString,
"3dAveImgSIVDATA%d", region+1);
1097 sprintf (title,
"[SIV] Dark removed, averaged along time, Region %d", region+1);
1098 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
1099 (waveCal->SIV->image)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
1102 for (region = 0; region < format->numOfDetectorRegions; region++)
1104 sprintf (fileString,
"3dAveImgFoilDATA%d", region+1);
1105 sprintf (title,
"Foil Dark removed, averaged along time, Region %d", region+1);
1106 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
1107 (waveCal->foil->image)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
1110 for (region = 0; region < format->numOfDetectorRegions; region++)
1112 sprintf (fileString,
"3dAveImgOpenDATA%d", region+1);
1113 sprintf (title,
"Open Dark removed, averaged along time, Region %d", region+1);
1114 midiCreatePlotFile3D (fileString, title,
"X",
"Y",
"Flux", 0,
1115 (waveCal->open->image)[region], format->iXWidth, format->iYWidth,
"lines",
"3");
1155 void calibrateWaveChannels (
1157 MidiFiles *fileNames,
1158 WaveCalibration *waveCal,
1159 ImageFormat *format,
1166 const char routine[] =
"calibrateWaveChannels";
1170 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1171 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
1177 fitFilterSpectra (waveCal, format, error);
1180 calibrateWaveFromNBF (waveCal, format, error);
1184 fitFoilSpectra (fileNames, waveCal, format, error);
1187 fitOpenSpectra (error);
1190 if (processing == 2) createWaveCalibDB (fileNames, waveCal, format, error);
1191 else correlateWaveCalibDB (fileNames, waveCal, format, error);
1210 void calibrateWaveFromNBF (
1211 WaveCalibration *waveCal,
1212 ImageFormat *format,
1219 const char routine[] =
"calibrateWaveFromNBF";
1220 int region, *channel, chA, chN, chS, numOfNBF, order;
1221 float *wave, *chFloat;
1222 char *fileString, *title;
1226 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1227 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
1234 channel = (
int *) calloc (numOfNBF,
sizeof (
int));
1235 wave = (
float *) calloc (numOfNBF,
sizeof (
float));
1237 for (region = 0; region < format->numOfDetectorRegions; region++)
1240 channel[0] = (waveCal->ArIII->xCoord)[region];
1241 channel[1] = (waveCal->NeII->xCoord)[region];
1242 channel[2] = (waveCal->SIV->xCoord)[region];
1243 chA = (waveCal->ArIII->xCoord)[region];
1244 chN = (waveCal->NeII->xCoord)[region];
1245 chS = (waveCal->SIV->xCoord)[region];
1246 signalSortInt (channel, 0, numOfNBF);
1249 if (channel[0] == chA) wave[0] = (waveCal->ArIII->wavelength)[region];
1250 else if (channel[0] == chN) wave[0] = (waveCal->NeII->wavelength)[region];
1251 else wave[0] = (waveCal->SIV->wavelength)[region];
1253 if (channel[1] == chA) wave[1] = (waveCal->ArIII->wavelength)[region];
1254 else if (channel[1] == chN) wave[1] = (waveCal->NeII->wavelength)[region];
1255 else wave[1] = (waveCal->SIV->wavelength)[region];
1257 if (channel[2] == chA) wave[2] = (waveCal->ArIII->wavelength)[region];
1258 else if (channel[2] == chN) wave[2] = (waveCal->NeII->wavelength)[region];
1259 else wave[2] = (waveCal->SIV->wavelength)[region];
1263 chFloat = (
float *) calloc (3,
sizeof (
float));
1264 chFloat[0] = (float) channel[0];
1265 chFloat[1] = (float) channel[1];
1266 chFloat[2] = (float) channel[2];
1267 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1268 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1269 sprintf (fileString ,
"NarrowBandFilterSectionalProfileDATA%d", region+1);
1270 sprintf (title ,
"Narrow Band Filter Sectional Profile Region %d", region+1);
1271 midiCreatePlotFile2D2P (fileString, title,
"Detector Channel",
"Wavelength in micron", 0, chFloat, wave, 0, 3, 1);
1278 cpl_msg_info(cpl_func,
"\nCalibrating wavelength for region %d \n", region+1);
1279 cpl_msg_info(cpl_func,
"--------------------------------- \n");
1280 fprintf (midiReportPtr,
"\nCalibrating wavelength for region %d \n", region+1);
1281 fprintf (midiReportPtr,
"--------------------------------- \n");
1283 midiPolyFit (order, channel, wave, numOfNBF, format->iXWidth, waveCal->calibratedWave[region], error);
1286 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot Calibrate");
1294 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1295 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1296 sprintf (fileString ,
"CalibrationUsingPoly%dFitDATA%d", order/10, region+1);
1297 sprintf (title ,
"Calibration using a Polynomial fit of order %d for Region %d", order/10, region+1);
1298 midiCreatePlotFile2D (fileString, title,
"Detector Channel",
"Wavelength in micron",
1299 0, waveCal->calibratedWave[region], 0, format->iXWidth, 1, 0);
1345 const char routine[] =
"midiPolyFit";
1346 float x1, x1s, x2, x2s, x3, x3s, y1, y2, y3, d, d1, d2, d3,
1347 coeff1, coeff2, coeff3, q, chi2, siga, sigb, sigc, sigData;
1348 cpl_polynomial *coeffPoly;
1349 cpl_vector *xPoly, *yPoly;
1350 int i, degPoly, sigDataAvailable;
1352 double *valuePloy, *positionPoly, mse;
1357 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1358 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
1362 coeff1=coeff2=coeff3=0.0;
1363 siga=sigb=sigc=chi2=q=mse=-1;
1368 cpl_msg_info(cpl_func,
"Fitting %d points to %d points using Fast-Simple 1st order polynomial \n", numOfIn, numOfOut);
1369 fprintf (midiReportPtr,
"Fitting %d points to %d points using Fast-Simple 1st order polynomial \n", numOfIn, numOfOut);
1380 coeff1 = y1 - x1 * ((y3 - y1) / (x3 - x1));
1381 coeff2 = (y3 - y1) / (x3 - x1);
1382 if (diagnostic)cpl_msg_info(cpl_func,
"Initial coefficients are: %f %f \n", coeff1, coeff2);
1383 if (diagnostic) fprintf (midiReportPtr,
"Initial coefficients are: %f %f \n", coeff1, coeff2);
1386 d = fabs ((coeff2 * x2 - y2 + coeff1) / sqrt (coeff2 * coeff2 + 1));
1389 coeff1 = 0.5 * d * sqrt(coeff2 * coeff2 + 1) - coeff2 * x2 + y2;
1391 else if (order == 20)
1393 cpl_msg_info(cpl_func,
"Fitting %d points to %d points using Fast-Simple 2nd order polynomial \n", numOfIn, numOfOut);
1394 fprintf (midiReportPtr,
"Fitting %d points to %d points using Fast-Simple 2nd order polynomial \n", numOfIn, numOfOut);
1400 x1s = xCoord[0] * xCoord[0];
1401 x2s = xCoord[1] * xCoord[1];
1402 x3s = xCoord[2] * xCoord[2];
1407 d = (x2 * x3s - x2s * x3) - x1 * (x3s - x2s) + x1s * (x3 - x2);
1408 d1 = y1 * (x2 * x3s - x2s * x3) - x1 * (y2 * x3s - x2s * y3) + x1s * (y2 * x3 - x2 * y3);
1409 d2 = (y2 * x3s - x2s * y3) - y1 * (x3s - x2s) + x1s * (y3 - y2);
1410 d3 = (x2 * y3 - y2 * x3) - x1 * (y3 - y2) + y1 * (x3 - x2);
1416 else if (order == 11)
1418 cpl_msg_info(cpl_func,
"Fitting %d points to %d points using 1st order polynomial \n", numOfIn, numOfOut);
1419 fprintf (midiReportPtr,
"Fitting %d points to %d points using 1st order polynomial \n", numOfIn, numOfOut);
1422 valuePloy = (
double *) calloc (numOfIn,
sizeof (
double));
1423 positionPoly = (
double *) calloc (numOfIn,
sizeof (
double));
1424 for (i = 0; i < numOfIn; i++)
1426 positionPoly[i] = (double) (xCoord[i]);
1427 valuePloy[i] = (double) (yCoord[i]);
1432 sigDataAvailable = 0;
1433 midiGetLinearFit (positionPoly, valuePloy, numOfIn, sigData, sigDataAvailable,
1434 &coeff1, &coeff2, &siga, &sigb, &chi2, &q, error);
1435 free (positionPoly);
1439 sprintf (midiMessage,
"Cannot compute linear fit in routine '%s'", routine);
1440 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
1444 else if (order == 22)
1446 cpl_msg_info(cpl_func,
"Fitting %d points to %d points using 2nd order polynomial \n", numOfIn, numOfOut);
1447 fprintf (midiReportPtr,
"Fitting %d points to %d points using 2nd order polynomial \n", numOfIn, numOfOut);
1450 valuePloy = (
double *) calloc (numOfIn,
sizeof (
double));
1451 positionPoly = (
double *) calloc (numOfIn,
sizeof (
double));
1452 for (i = 0; i < numOfIn; i++)
1454 positionPoly[i] = (double) (xCoord[i]);
1455 valuePloy[i] = (double) (yCoord[i]);
1459 xPoly = cpl_vector_wrap (numOfIn, positionPoly);
1460 yPoly = cpl_vector_wrap (numOfIn, valuePloy);
1461 coeffPoly = cpl_polynomial_fit_1d_create (xPoly, yPoly, degPoly, &mse);
1463 coeff1 = cpl_polynomial_get_coeff (coeffPoly, &power);
1465 coeff2 = cpl_polynomial_get_coeff (coeffPoly, &power);
1467 coeff3 = cpl_polynomial_get_coeff (coeffPoly, &power);
1470 cpl_vector_unwrap (xPoly);
1471 cpl_vector_unwrap (yPoly);
1472 cpl_polynomial_delete (coeffPoly);
1473 free (positionPoly);
1479 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Invalid polynomial order");
1483 cpl_msg_info(cpl_func,
"Coeffient 1, Uncertainty = (%f, %f) \n", coeff1, siga);
1484 cpl_msg_info(cpl_func,
"Coeffient 2, Uncertainty = (%f, %f) \n", coeff2, sigb);
1485 cpl_msg_info(cpl_func,
"Coeffient 3, Uncertainty = (%f, %f) \n", coeff3, sigc);
1486 cpl_msg_info(cpl_func,
"Mean Squared Error = %g \n", mse);
1487 cpl_msg_info(cpl_func,
"Chi-squared = %f \n", chi2);
1488 cpl_msg_info(cpl_func,
"Goodness-of-fit = %f \n", q);
1489 fprintf (midiReportPtr,
"Coeffient 1, Uncertainty = (%f, %f) \n", coeff1, siga);
1490 fprintf (midiReportPtr,
"Coeffient 2, Uncertainty = (%f, %f) \n", coeff2, sigb);
1491 fprintf (midiReportPtr,
"Coeffient 3, Uncertainty = (%f, %f) \n", coeff3, sigc);
1492 fprintf (midiReportPtr,
"Mean Squared Error = %g \n", mse);
1493 fprintf (midiReportPtr,
"Chi-squared = %f \n", chi2);
1494 fprintf (midiReportPtr,
"Goodness-of-fit = %f \n", q);
1496 cpl_msg_info(cpl_func,
"NB. negative values for the statistics indicate unavailability \n");
1497 fprintf (midiReportPtr,
"NB. negative values for the statistics indicate unavailability \n");
1501 for (i = 0; i < numOfOut; i++)
1502 yOut[i] = (coeff1) + (coeff2 * i) + (coeff3 * i * i);
1521 void correlateWaveCalibDB (
1522 MidiFiles *fileNames,
1523 WaveCalibration *waveCal,
1524 ImageFormat *format,
1531 const char routine[] =
"correlateWaveCalibDB";
1533 float *arrayError, **waveTable, standDev;
1534 char *fileString, *title, *fileName;
1539 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1540 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
1545 cpl_msg_info(cpl_func,
"\nCorrelating template with the database \n");
1546 cpl_msg_info(cpl_func,
"-------------------------------------- \n");
1547 fprintf (midiReportPtr,
"\nCorrelating template with the database \n");
1548 fprintf (midiReportPtr,
"-------------------------------------- \n");
1551 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1552 arrayError = (
float *) calloc (format->iXWidth, sizeof (
float));
1553 waveTable = (
float **) calloc (format->numOfDetectorRegions, sizeof (
float *));
1554 for (region = 0; region < format->numOfDetectorRegions; region++)
1555 waveTable[region] = calloc (format->iXWidth, sizeof (
float));
1558 sprintf (fileString ,
"%s_%s_%s.dat", fileNames->waveCalibName, format->grismId, format->beamCombiner);
1559 if ((filePtr = fopen (fileString,
"r")) != NULL)
1562 cpl_msg_info(cpl_func,
"Reading Wavelength Calibration file ... %s \n", fileString);
1563 fprintf (midiReportPtr,
"Reading Wavelength Calibration file ... %s \n", fileString);
1566 if (strcmp (format->beamCombiner,
"SCI_PHOT") == 0)
1568 while (fscanf (filePtr,
"%f %f %f %f\n", &(waveTable[0][i]), &(waveTable[1][i]),
1569 &(waveTable[2][i]), &(waveTable[3][i])) != EOF) i++;
1573 while (fscanf (filePtr,
"%f %f \n", &(waveTable[0][i]), &(waveTable[1][i])) != EOF) i++;
1577 cpl_msg_info(cpl_func,
"Read %d wavelength values in micron \n", i*format->numOfDetectorRegions);
1578 fprintf (midiReportPtr,
"Read %d pairs of wavelengths in micron \n", i);
1581 for (region = 0; region < format->numOfDetectorRegions; region++)
1584 for (i = 0; i < format->iXWidth; i++)
1585 arrayError[i] = waveCal->calibratedWave[region][i] - waveTable[region][i];
1589 fileName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1590 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1592 sprintf (fileName ,
"WavelengthCalibDataBaseDATA%d", region+1);
1593 sprintf (title ,
"Wavelength Calibration from Database, Region %d", region+1);
1594 midiCreatePlotFile2D (fileName, title,
"Channel",
"Wavelength in micro", 0,
1595 waveTable[region], 0, format->iXWidth, 1, 0);
1597 sprintf (fileName ,
"WavelengthCalibCurrentTemplateDATA%d", region+1);
1598 sprintf (title ,
"Wavelength Calibration for Current template, Region %d", region+1);
1599 midiCreatePlotFile2D (fileName, title,
"Channel",
"Wavelength in micron", 0,
1600 waveCal->calibratedWave[region], 0, format->iXWidth, 1, 0);
1602 sprintf (fileName ,
"CorrelationErrorDATA%d", region+1);
1603 sprintf (title ,
"Correlation Error of Region %d", region+1);
1604 midiCreatePlotFile2D (fileName, title,
"Channel",
"Wavelength in micron", 0,
1605 arrayError, 0, format->iXWidth, 1, 0);
1611 waveCal->variance[region] = signalVariance (arrayError, 0, format->iXWidth, &standDev);
1612 cpl_msg_info(cpl_func,
"Error Variance for region %d = %f \n", region+1, waveCal->variance[region]);
1613 fprintf (midiReportPtr,
"Error Variance for region %d = %f \n", region+1, waveCal->variance[region]);
1619 sprintf (midiMessage,
"Cannot find calibration data file ... %s. Nothing to correlate", fileString);
1620 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
1626 for (region = 0; region < format->numOfDetectorRegions; region++) free (waveTable[region]);
1646 void createWaveCalibDB (
1647 MidiFiles *fileNames,
1648 WaveCalibration *waveCal,
1649 ImageFormat *format,
1656 const char routine[] =
"createWaveCalibDB";
1657 char *fileString, *title;
1663 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1664 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
1670 if (plotFile && diagnostic)
1672 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1673 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1674 for (region = 0; region < format->numOfDetectorRegions; region++)
1676 sprintf (fileString ,
"WavelengthCalib_%s_%sDATA%d", format->grismId, format->beamCombiner, region+1);
1677 sprintf (title ,
"Wavelength Calibration for %s %s, Region %d", format->grismId, format->beamCombiner, region+1);
1678 midiCreatePlotFile2D (fileString, title,
"Channel",
"Wavelength in micron", 0,
1679 waveCal->calibratedWave[region], 0, format->iXWidth, 1, 0);
1686 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1687 sprintf (fileString ,
"%s_%s_%s.dat", fileNames->waveCalibName, format->grismId, format->beamCombiner);
1688 if ((filePtr = fopen (fileString,
"w")) == NULL)
1690 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create wavelength calibration file");
1697 for (i = 0; i < format->iXWidth; i++)
1699 for (region = 0; region < format->numOfDetectorRegions; region++)
1700 fprintf (filePtr,
"%3.10f ", waveCal->calibratedWave[region][i]);
1701 fprintf (filePtr,
"\n");
1704 cpl_msg_info(cpl_func,
"\nCreated wavelength calibration file ... %s \n", fileString);
1705 fprintf (midiReportPtr,
"\nCreated wavelength calibration file ... %s \n", fileString);
1739 void fitFilterSpectra (
1740 WaveCalibration *waveCal,
1741 ImageFormat *format,
1748 const char routine[] =
"fitFilterSpectra";
1753 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1754 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
1760 for (region = 0; region < format->numOfDetectorRegions; region++)
1761 getFilterSpectra (region,
"NeII", (waveCal->NeII->image)[region], format,
1762 &(waveCal->NeII->xCoord[region]), &(waveCal->NeII->yCoord[region]), error);
1765 for (region = 0; region < format->numOfDetectorRegions; region++)
1766 getFilterSpectra (region,
"SIV", (waveCal->SIV->image)[region], format,
1767 &(waveCal->SIV->xCoord[region]), &(waveCal->SIV->yCoord[region]), error);
1770 for (region = 0; region < format->numOfDetectorRegions; region++)
1771 getFilterSpectra (region,
"ArIII", (waveCal->ArIII->image)[region], format,
1772 &(waveCal->ArIII->xCoord[region]), &(waveCal->ArIII->yCoord[region]), error);
1775 for (region = 0; region < format->numOfDetectorRegions; region++)
1777 cpl_msg_info(cpl_func,
"\nComputed Centre Pinholes for region %d: \n", region+1);
1778 cpl_msg_info(cpl_func,
"----------------------------------- \n");
1779 cpl_msg_info(cpl_func,
"NeII Centre Pinhole = (%f, %f) \n", (waveCal->NeII->xCoord)[region], (waveCal->NeII->yCoord)[region]);
1780 cpl_msg_info(cpl_func,
"SIV Centre Pinhole = (%f, %f) \n", (waveCal->SIV->xCoord)[region], (waveCal->SIV->yCoord)[region]);
1781 cpl_msg_info(cpl_func,
"ArIII Centre Pinhole = (%f, %f) \n", (waveCal->ArIII->xCoord)[region], (waveCal->ArIII->yCoord)[region]);
1783 fprintf (midiReportPtr,
"\nComputed Centre Pinholes for region %d: \n", region+1);
1784 fprintf (midiReportPtr,
"----------------------------------- \n");
1785 fprintf (midiReportPtr,
"NeII Centre Pinhole = (%f, %f) \n",
1786 (waveCal->NeII->xCoord)[region], (waveCal->NeII->yCoord)[region]);
1787 fprintf (midiReportPtr,
"SIV Centre Pinhole = (%f, %f) \n",
1788 (waveCal->SIV->xCoord)[region], (waveCal->SIV->yCoord)[region]);
1789 fprintf (midiReportPtr,
"ArIII Centre Pinhole = (%f, %f) \n",
1790 (waveCal->ArIII->xCoord)[region], (waveCal->ArIII->yCoord)[region]);
1794 for (region = 0; region < format->numOfDetectorRegions; region++)
1796 cpl_msg_info(cpl_func,
"\nDetector Channel Assignment for region %d: \n", region+1);
1797 cpl_msg_info(cpl_func,
"-------------------------------------- \n");
1798 cpl_msg_info(cpl_func,
"Channel %3d = %f THz %f micron \n", (
int) ((waveCal->NeII->xCoord)[region]),
1799 FREQ_PEAK_NeII, WAVELENGTH_PEAK_NeII);
1800 cpl_msg_info(cpl_func,
"Channel %3d = %f THz %f micron \n", (
int) ((waveCal->SIV->xCoord)[region]),
1801 FREQ_PEAK_SIV, WAVELENGTH_PEAK_SIV);
1802 cpl_msg_info(cpl_func,
"Channel %3d = %f THz %f micron \n", (
int) ((waveCal->ArIII->xCoord)[region]),
1803 FREQ_PEAK_ArIII, WAVELENGTH_PEAK_ArIII);
1805 fprintf (midiReportPtr,
"\nDetector Channel Assignment for region %d: \n", region+1);
1806 fprintf (midiReportPtr,
"-------------------------------------- \n");
1807 fprintf (midiReportPtr,
"Channel %3d = %f THz %f micron \n", (
int) ((waveCal->NeII->xCoord)[region]),
1808 FREQ_PEAK_NeII, WAVELENGTH_PEAK_NeII);
1809 fprintf (midiReportPtr,
"Channel %3d = %f THz %f micron \n", (
int) ((waveCal->SIV->xCoord)[region]),
1810 FREQ_PEAK_SIV, WAVELENGTH_PEAK_SIV);
1811 fprintf (midiReportPtr,
"Channel %3d = %f THz %f micron \n", (
int) ((waveCal->ArIII->xCoord)[region]),
1812 FREQ_PEAK_ArIII, WAVELENGTH_PEAK_ArIII);
1814 (waveCal->NeII->wavelength)[region] = WAVELENGTH_PEAK_NeII;
1815 (waveCal->SIV->wavelength)[region] = WAVELENGTH_PEAK_SIV;
1816 (waveCal->ArIII->wavelength)[region] = WAVELENGTH_PEAK_ArIII;
1835 void getFilterSpectra (
1839 ImageFormat *format,
1848 const char routine[] =
"getFilterSpectra";
1849 int i, j, frame, span, quartSpan;
1850 float *array, *arrayPeak, maxFlux, peak, fluxMax;
1851 char *fileString, *title;
1855 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1856 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
1862 span = EXPECTED_PINHOLE_WIDTH;
1863 quartSpan = span / 4;
1866 cpl_msg_info(cpl_func,
"\nComputing Coordinates for %s filter region %d \n", filter, region+1);
1867 cpl_msg_info(cpl_func,
"-------------------------------------------- \n");
1868 fprintf (midiReportPtr,
"\nComputing Coordinates for %s filter region %d\n", filter, region+1);
1869 fprintf (midiReportPtr,
"-------------------------------------------- \n");
1875 array = (
float *) calloc (format->iXWidth, sizeof (
float));
1878 for (i = 0; i < format->iYWidth; i++)
1880 frame = i * format->iXWidth;
1881 for (j = 0; j < format->iXWidth; j++)
1882 array[j] += image[frame + j];
1887 for (i = 0; i < format->iXWidth; i++)
1888 if (array[i] > fluxMax) fluxMax = array[i];
1889 for (i = 0; i < format->iXWidth; i++)
1890 array[i] /= fluxMax;
1892 if (plotFile && diagnostic)
1894 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1895 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1897 sprintf (fileString ,
"%sSpectraAveAlongYDATA%d", filter, region+1);
1898 sprintf (title ,
"%s Spectra averaged along Y region %d", filter, region+1);
1899 midiCreatePlotFile2D (fileString, title,
"Channel",
"Flux", 0, array, 0, format->iXWidth, 1, 0);
1907 for (i = 0; i < format->iXWidth; i++)
1909 if (array[i] > maxFlux)
1917 *xCPH = midiGaussianSmooth (array, format->iXWidth, peak, span, error);
1918 cpl_msg_info(cpl_func,
"Found apprximate X at %f \n", *xCPH);
1919 fprintf (midiReportPtr,
"Found apprximate X at %f \n", *xCPH);
1931 array = (
float *) calloc (format->iYWidth, sizeof (
float));
1932 arrayPeak = (
float *) calloc (3,
sizeof (
float));
1935 for (i = 0; i < format->iYWidth; i++)
1937 frame = i * format->iXWidth;
1938 for (j = 0; j < format->iXWidth; j++)
1939 array[i] += image[frame + j];
1944 for (i = 0; i < format->iYWidth; i++)
1945 if (array[i] > fluxMax) fluxMax = array[i];
1946 for (i = 0; i < format->iYWidth; i++)
1947 array[i] /= fluxMax;
1949 if (plotFile && diagnostic)
1951 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1952 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1954 sprintf (fileString ,
"%sSpectraAveAlongXDATA%d", filter, region+1);
1955 sprintf (title ,
"%s Spectra averaged along X region %d", filter, region+1);
1956 midiCreatePlotFile2D (fileString, title,
"Sub-frame",
"Flux", 0, array, 0, format->iYWidth, 1, 0);
1965 for (i = 0; i < format->iYWidth; i++)
1967 if (array[i] > maxFlux)
1973 cpl_msg_info(cpl_func,
"Found first Y at %f \n", arrayPeak[0]);
1974 fprintf (midiReportPtr,
"Found first Y at %f \n", arrayPeak[0]);
1979 for (i = 0; i < format->iYWidth; i++)
1981 if ( !((i > arrayPeak[0]-quartSpan) && (i < arrayPeak[0]+quartSpan)) )
1983 if (array[i] > maxFlux)
1990 cpl_msg_info(cpl_func,
"Found second Y at %f \n", arrayPeak[1]);
1991 fprintf (midiReportPtr,
"Found second Y at %f \n", arrayPeak[1]);
1996 for (i = 0; i < format->iYWidth; i++)
1998 if ( !((i > arrayPeak[0]-quartSpan) && (i < arrayPeak[0]+quartSpan)) &&
1999 !((i > arrayPeak[1]-quartSpan) && (i < arrayPeak[1]+quartSpan)) )
2001 if (array[i] > maxFlux)
2008 cpl_msg_info(cpl_func,
"Found third Y at %f \n", arrayPeak[2]);
2009 fprintf (midiReportPtr,
"Found third Y at %f \n", arrayPeak[2]);
2012 peak = signalMedian (arrayPeak, 0, 3);
2014 cpl_msg_info(cpl_func,
"Found median Y at %f \n", peak);
2015 fprintf (midiReportPtr,
"Found median Y at %f \n", peak);
2021 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find median");
2026 if (quartSpan > peak)
2029 for (i = peak-quartSpan; i <= peak+quartSpan; i++)
2030 if (array[i] > fluxMax) fluxMax = array[i];
2031 for (i = peak-quartSpan; i <= peak+quartSpan; i++)
2032 array[i] /= fluxMax;
2034 if (plotFile && diagnostic)
2036 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
2037 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
2039 sprintf (fileString ,
"%sCentrePinholeAlongYDATA%d", filter, region+1);
2040 sprintf (title ,
"%s Centre Pinhole along Y region %d", filter, region+1);
2041 midiCreatePlotFile2D (fileString, title,
"Sub-frame",
"Flux", 0, array, peak-quartSpan, peak+quartSpan+1, 1, 0);
2047 *yCPH = midiGaussianSmooth (array, format->iYWidth, peak, quartSpan, error);
2048 cpl_msg_info(cpl_func,
"Found exact Y at %f \n", *yCPH);
2049 fprintf (midiReportPtr,
"Found exact Y at %f \n", *yCPH);
2059 array = (
float *) calloc (format->iXWidth, sizeof (
float));
2062 for (i = *yCPH-quartSpan; i < *yCPH+quartSpan; i++)
2064 frame = i * format->iXWidth;
2065 for (j = 0; j < format->iXWidth; j++)
2066 array[j] += image[frame + j];
2071 for (i = 0; i < format->iXWidth; i++)
2072 if (array[i] > fluxMax) fluxMax = array[i];
2073 for (i = 0; i < format->iXWidth; i++)
2074 array[i] /= fluxMax;
2076 if (plotFile && diagnostic)
2078 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
2079 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
2081 sprintf (fileString ,
"%sCentrePinholeAveAlongYDATA%d", filter, region+1);
2082 sprintf (title ,
"%s Centre pinhole averaged along Y region %d", filter, region+1);
2083 midiCreatePlotFile2D (fileString, title,
"Channel",
"Flux", 0, array, 0, format->iXWidth, 1, 0);
2091 for (i = 0; i < format->iXWidth; i++)
2093 if (array[i] > maxFlux)
2101 *xCPH = midiGaussianSmooth (array, format->iXWidth, peak, span, error);
2102 cpl_msg_info(cpl_func,
"Found exact X at %f \n", *xCPH);
2103 fprintf (midiReportPtr,
"Found exact X at %f \n", *xCPH);
2126 void fitFoilSpectra (
2127 MidiFiles *fileNames,
2128 WaveCalibration *waveCal,
2129 ImageFormat *format,
2136 const char routine[] =
"fitFoilSpectra";
2137 float **foilSpectra, **openSpectra, fluxMax;
2138 int i, region, length;
2139 char *fileString, *title;
2140 FILE *wlFilePtr=NULL;
2144 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
2145 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
2150 midiReportTbd (midiReportPtr, routine, __FILE__, __LINE__,
"Entire code to be designed");
2153 foilSpectra = (
float **) calloc (format->numOfDetectorRegions, sizeof (
float *));
2154 openSpectra = (
float **) calloc (format->numOfDetectorRegions, sizeof (
float *));
2155 for (region = 0; region < format->numOfDetectorRegions; region++)
2157 foilSpectra[region] = (
float *) calloc (format->iXWidth, sizeof (
float));
2158 openSpectra[region] = (
float *) calloc (format->iXWidth, sizeof (
float));
2162 for (region = 0; region < format->numOfDetectorRegions; region++)
2163 getFoilSpectra (region,
"Foil", waveCal->foil->image[region], format, foilSpectra[region], error);
2166 for (region = 0; region < format->numOfDetectorRegions; region++)
2167 getFoilSpectra (region,
"Open", waveCal->open->image[region], format, openSpectra[region], error);
2170 for (region = 0; region < format->numOfDetectorRegions; region++)
2172 for (i = 0; i < format->iXWidth; i++)
2173 foilSpectra[region][i] /= openSpectra[region][i];
2176 fluxMax = foilSpectra[region][0];
2177 for (i = 0; i < format->iXWidth; i++)
2178 if (foilSpectra[region][i] > fluxMax) fluxMax = foilSpectra[region][i];
2179 for (i = 0; i < format->iXWidth; i++)
2180 foilSpectra[region][i] /= fluxMax;
2183 if (plotFile && diagnostic)
2185 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
2186 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
2187 sprintf (fileString ,
"FoilDivideOpenAveAlongYDATA%d", region+1);
2188 sprintf (title ,
"Foil divided by Open Averaged along Y region %d", region+1);
2189 midiCreatePlotFile2D (fileString, title,
"Channel",
"Flux", 0, foilSpectra[region], 0, format->iXWidth, 1, 0);
2196 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
2197 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
2198 sprintf (fileString,
"%swl-calib_2.dat", fileNames->calibDbDir);
2199 if ((wlFilePtr = fopen (fileString,
"r")) == NULL)
2201 sprintf (midiMessage,
"Cannot Open %s", fileString);
2202 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
2210 fgets (title, MAX_STRING_LENGTH, wlFilePtr);
2213 while (fscanf (wlFilePtr,
"%f %f\n", &(waveCal->foil->actualWavelength[length]),
2214 &(waveCal->foil->actualTransmission[length])) != EOF) length++;
2217 for (i = 0; i < length; i++)
2218 waveCal->foil->actualWavelength[i] = 10000.0 * (1.0 / waveCal->foil->actualWavelength[i]);
2220 sprintf (midiMessage,
"Read %d pairs of 'float'(s) from %s", length, fileString);
2221 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
2227 midiCreatePlotFile2D2P (
"FoilTransmission",
"Foil Transmission Versus Wavelength",
2228 "Wavelength in micron",
"Transmission", 0, waveCal->foil->actualWavelength, waveCal->foil->actualTransmission, 0, length, 1);
2231 for (region = 0; region < format->numOfDetectorRegions; region++)
2233 free (foilSpectra[region]);
2234 free (openSpectra[region]);
2255 void getFoilSpectra (
2259 ImageFormat *format,
2267 const char routine[] =
"getFoilSpectra";
2268 char *fileString, *title;
2274 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
2275 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
2280 midiReportTbd (midiReportPtr, routine, __FILE__, __LINE__,
"Entire code to be designed");
2282 cpl_msg_info(cpl_func,
"\nObtaining %s Spectra for region %d \n", filter, region+1);
2283 cpl_msg_info(cpl_func,
"------------------------------- \n");
2284 fprintf (midiReportPtr,
"\nObtaining %s Spectra for region %d \n", filter, region+1);
2285 fprintf (midiReportPtr,
"------------------------------- \n");
2288 for (i = 0; i < format->iYWidth; i++)
2290 frame = i * format->iXWidth;
2291 for (j = 0; j < format->iXWidth; j++)
2292 spectra[j] += image[frame + j];
2296 fluxMax = spectra[0];
2297 for (i = 0; i < format->iXWidth; i++)
2298 if (spectra[i] > fluxMax) fluxMax = spectra[i];
2299 for (i = 0; i < format->iXWidth; i++)
2300 spectra[i] /= fluxMax;
2303 if (plotFile && diagnostic)
2305 fileString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
2306 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
2308 sprintf (fileString ,
"%sSpectraAveAlongYDATA%d", filter, region+1);
2309 sprintf (title ,
"%s Spectra Averaged along Y region %d", filter, region+1);
2310 midiCreatePlotFile2D (fileString, title,
"Channel",
"Flux", 0, spectra, 0, format->iXWidth, 1, 0);
2331 void fitOpenSpectra (
2338 const char routine[] =
"fitOpenSpectra";
2342 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
2343 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
2348 midiReportTbd (midiReportPtr, routine, __FILE__, __LINE__,
"Entire code to be designed");