24 #include "midiGlobal.h"
26 #include "midiFitsUtility.h"
27 #include "diagnostics.h"
28 #include "memoryHandling.h"
29 #include "errorHandling.h"
30 #include "fileHandling.h"
59 int extNumOfImagingDataFile,
66 const char routine[] =
"getImageFormat";
67 char *sTemp, *cleanString, *stringQfits, *emptyString;
73 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
74 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
78 format->numOfPinholes = 0;
81 if (stat (inFitsFile, &buf) == -1)
84 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find requested FITS file");
88 else if ((qfits_is_fits (inFitsFile)) != 1)
90 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Non-FITS file");
96 numOfExtensions = qfits_query_n_ext (inFitsFile);
97 if (numOfExtensions < 1)
102 else format->hasData = 1;
105 cleanString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
106 emptyString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
107 strcpy (emptyString,
"UNKNOWN");
110 stringQfits = qfits_query_hdr (inFitsFile,
"HIERARCH ESO DPR CATG");
111 if (stringQfits == NULL)
113 sprintf (format->obsCatg,
"%s", emptyString);
114 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get 'DPR CATG'");
118 cleanUpString (stringQfits, cleanString);
119 sprintf (format->obsCatg,
"%s", cleanString);
123 stringQfits = qfits_query_hdr (inFitsFile,
"HIERARCH ESO DPR TECH");
124 if (stringQfits == NULL)
126 sprintf (format->obsTech,
"%s", emptyString);
127 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get 'DPR TECH'");
131 cleanUpString (stringQfits, cleanString);
132 sprintf (format->obsTech,
"%s", cleanString);
136 stringQfits = qfits_query_hdr (inFitsFile,
"HIERARCH ESO DPR TYPE");
137 if (stringQfits == NULL)
139 sprintf (format->obsType,
"%s", emptyString);
140 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get 'DPR TYPE'");
144 cleanUpString (stringQfits, cleanString);
145 sprintf (format->obsType,
"%s", cleanString);
149 stringQfits = qfits_query_ext (inFitsFile,
"HIERARCH ESO INS SHUT ID", 0);
150 if (stringQfits == NULL)
152 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get 'SHUT ID'");
153 sprintf (format->shutterId,
"%s", emptyString);
157 cleanUpString (stringQfits, cleanString);
158 sprintf (format->shutterId,
"%s", cleanString);
162 stringQfits = qfits_query_hdr (inFitsFile,
"HIERARCH ESO INS OPT1 ID");
163 if (stringQfits == NULL)
165 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get 'OPT1 ID'");
166 sprintf (format->beamCombiner,
"%s", emptyString);
170 cleanUpString (stringQfits, cleanString);
171 sprintf (format->beamCombiner,
"%s", cleanString);
175 if (strcmp (format->beamCombiner,
"HIGH_SENS") == 0)
177 else if (strcmp (cleanString,
"SCI_PHOT") == 0)
179 else if (strcmp (cleanString,
"OPEN") == 0)
183 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Unknown Beam Combiner 'OPT1 ID'");
184 sprintf (format->beamCombiner,
"%s", emptyString);
188 stringQfits = qfits_query_hdr (inFitsFile,
"HIERARCH ESO OBS TARG NAME");
189 if (stringQfits == NULL)
191 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get 'TARG NAME'");
192 sprintf (format->targetName,
"%s", emptyString);
196 cleanUpString (stringQfits, cleanString);
197 sprintf (format->targetName,
"%s", cleanString);
201 stringQfits = qfits_query_hdr (inFitsFile,
"HIERARCH ESO INS GRIS NAME");
202 if (stringQfits == NULL)
204 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get 'GRIS NAME'");
205 sprintf (format->grismId,
"%s", emptyString);
209 cleanUpString (stringQfits, cleanString);
210 sprintf (format->grismId,
"%s", cleanString);
214 stringQfits = qfits_query_hdr (inFitsFile,
"HIERARCH ESO INS CAM ID");
215 if (stringQfits == NULL)
217 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot read Camera ID");
218 sprintf (format->cameraId,
"%s", emptyString);
222 cleanUpString (stringQfits, cleanString);
223 sprintf (format->cameraId,
"%s", cleanString);
227 stringQfits = qfits_query_hdr (inFitsFile,
"HIERARCH ESO INS FILT NAME");
228 if (stringQfits == NULL)
230 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot read Filter Name");
231 sprintf (format->filterName,
"%s", emptyString);
235 cleanUpString (stringQfits, cleanString);
236 sprintf (format->filterName,
"%s", cleanString);
240 stringQfits = qfits_query_hdr (inFitsFile,
"HIERARCH ESO TPL START");
241 if (stringQfits == NULL)
243 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get 'TPL START'");
244 sprintf (format->tplStart,
"%s", emptyString);
248 cleanUpString (stringQfits, cleanString);
249 sprintf (format->tplStart,
"%s", cleanString);
253 stringQfits = qfits_query_hdr (inFitsFile,
"HIERARCH ESO TPL NAME");
254 if (stringQfits == NULL)
256 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get 'TPL NAME'");
257 sprintf (format->tplName,
"%s", emptyString);
261 cleanUpString (stringQfits, cleanString);
262 sprintf (format->tplName,
"%s", cleanString);
266 sTemp = qfits_query_ext (inFitsFile,
"TDIM14", extNumOfImagingDataFile);
267 if (sTemp == NULL) sTemp = qfits_query_ext (inFitsFile,
"TDIM17", extNumOfImagingDataFile);
268 if (sTemp == NULL) sTemp = qfits_query_ext (inFitsFile,
"TDIM20", extNumOfImagingDataFile);
271 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get TDIM14, TDIM17 or TDIM20");
274 else sscanf (sTemp,
"'(%d,%d) '", &(format->iXWidth), &(format->iYWidth));
277 sTemp = qfits_query_ext (inFitsFile,
"NAXIS2", extNumOfImagingDataFile);
278 if ((sTemp == NULL) || (!sscanf (sTemp,
"%d", &(format->numOfFrames))))
280 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get NAXIS2");
285 sTemp = qfits_query_ext (inFitsFile,
"MAXSTEP", extNumOfImagingDataFile);
286 if ((sTemp == NULL) || (!sscanf (sTemp,
"%d", &(format->framesPerScan))))
288 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get MAXSTEP");
293 format->subWindowSize = format->iXWidth * format->iYWidth;
297 stringQfits = qfits_query_hdr (inFitsFile,
"HIERARCH ESO INS SLIT NAME");
298 if (stringQfits == NULL)
300 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get 'SLIT NAME'");
301 cleanUpString (stringQfits, emptyString);
305 cleanUpString (stringQfits, cleanString);
306 sprintf (format->slitName,
"%s", cleanString);
307 if (strcmp (cleanString,
"SLIT_0.05") == 0) format->numOfPinholes = 1;
308 else if (strcmp (cleanString,
"SLIT_0.1") == 0) format->numOfPinholes = 1;
309 else if (strcmp (cleanString,
"SLIT_0.2") == 0) format->numOfPinholes = 1;
310 else if (strcmp (cleanString,
"S_0.4C") == 0) format->numOfPinholes = 1;
311 else if (strcmp (cleanString,
"T_0.07C") == 0) format->numOfPinholes = 3;
312 else if (strcmp (cleanString,
"T_0.11C") == 0) format->numOfPinholes = 3;
313 else if (strcmp (cleanString,
"T_0.17C") == 0) format->numOfPinholes = 3;
314 else if (strcmp (cleanString,
"OPEN") == 0) format->numOfPinholes = 0;
315 else if (strcmp (cleanString,
"FullField") == 0) format->numOfPinholes = 0;
318 if (diagnostic) midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Unknown 'SLIT NAME'");
319 cleanUpString (stringQfits, emptyString);
324 format->numOfRegionsToProcess = 2;
325 if (strcmp (format->beamCombiner,
"SCI_PHOT") == 0)
326 format->numOfDetectorRegions = 4;
328 format->numOfDetectorRegions = 2;
333 cpl_msg_info(cpl_func,
"FORMAT OF FILE %s \n", inFitsFile);
334 cpl_msg_info(cpl_func,
"-------------- \n");
335 cpl_msg_info(cpl_func,
"Batch Template Name = %s \n", batchTemplate);
336 cpl_msg_info(cpl_func,
"FITS TPL NAME = %s \n", format->tplName);
337 cpl_msg_info(cpl_func,
"Observation Category = %s \n", format->obsCatg);
338 cpl_msg_info(cpl_func,
"Observation Technique = %s \n", format->obsTech);
339 cpl_msg_info(cpl_func,
"Observation Type = %s \n", format->obsType);
340 cpl_msg_info(cpl_func,
"Beam Combiner = %s \n", format->beamCombiner);
341 cpl_msg_info(cpl_func,
"Filter Name = %s \n", format->filterName);
342 cpl_msg_info(cpl_func,
"Shutter ID = %s \n", format->shutterId);
343 cpl_msg_info(cpl_func,
"Grism ID = %s \n", format->grismId);
344 cpl_msg_info(cpl_func,
"Target Name = %s \n", format->targetName);
345 cpl_msg_info(cpl_func,
"Slit Name = %s \n", format->slitName);
346 cpl_msg_info(cpl_func,
"TPL Start = %s \n", format->tplStart);
347 cpl_msg_info(cpl_func,
"Number of Frames = %d \n", format->numOfFrames);
348 if (strcmp (format->shutterId,
"ABOPEN") == 0)
349 cpl_msg_info(cpl_func,
"Frames per scan = %d \n", format->framesPerScan);
350 cpl_msg_info(cpl_func,
"X, Column dimension = %d \n", format->iXWidth);
351 cpl_msg_info(cpl_func,
"Y, Column dimension = %d \n", format->iYWidth);
352 cpl_msg_info(cpl_func,
"Sub-window size = %d \n", format->subWindowSize);
353 cpl_msg_info(cpl_func,
"Number of Pinholes = %d \n", format->numOfPinholes);
354 cpl_msg_info(cpl_func,
"Number of Detector Regions = %d \n", format->numOfDetectorRegions);
355 if (strcmp(format->beamCombiner,
"SCI_PHOT") == 0)
357 cpl_msg_info(cpl_func,
"Number of Interf Regions = %d \n", format->numOfRegionsToProcess);
358 cpl_msg_info(cpl_func,
"Number of Photom A Regions = %d \n", format->numOfRegionsToProcess-1);
359 cpl_msg_info(cpl_func,
"Number of Photom B Regions = %d \n", format->numOfRegionsToProcess-1);
363 cpl_msg_info(cpl_func,
"Number of Regions to process = %d \n", format->numOfRegionsToProcess);
365 cpl_msg_info(cpl_func,
"\n");
368 fprintf (midiReportPtr,
"FORMAT OF FILE %s \n", inFitsFile);
369 fprintf (midiReportPtr,
"-------------- \n");
370 fprintf (midiReportPtr,
"Batch Template Name = %s \n", batchTemplate);
371 fprintf (midiReportPtr,
"FITS TPL NAME = %s \n", format->tplName);
372 fprintf (midiReportPtr,
"Observation Category = %s \n", format->obsCatg);
373 fprintf (midiReportPtr,
"Observation Technique = %s \n", format->obsTech);
374 fprintf (midiReportPtr,
"Observation Type = %s \n", format->obsType);
375 fprintf (midiReportPtr,
"Beam Combiner = %s \n", format->beamCombiner);
376 fprintf (midiReportPtr,
"Filter Name = %s \n", format->filterName);
377 fprintf (midiReportPtr,
"Shutter ID = %s \n", format->shutterId);
378 fprintf (midiReportPtr,
"Grism ID = %s \n", format->grismId);
379 fprintf (midiReportPtr,
"Target Name = %s \n", format->targetName);
380 fprintf (midiReportPtr,
"Slit Name = %s \n", format->slitName);
381 fprintf (midiReportPtr,
"TPL Start = %s \n", format->tplStart);
382 fprintf (midiReportPtr,
"Number of Frames = %d \n", format->numOfFrames);
383 if (strcmp (format->shutterId,
"ABOPEN") == 0)
384 fprintf (midiReportPtr,
"Frames per scan = %d \n", format->framesPerScan);
385 fprintf (midiReportPtr,
"X, Column dimension = %d \n", format->iXWidth);
386 fprintf (midiReportPtr,
"Y, Column dimension = %d \n", format->iYWidth);
387 fprintf (midiReportPtr,
"Sub-window size = %d \n", format->subWindowSize);
388 fprintf (midiReportPtr,
"Number of Pinholes = %d \n", format->numOfPinholes);
389 fprintf (midiReportPtr,
"Number of Detector Regions = %d \n", format->numOfDetectorRegions);
390 if (strcmp(format->beamCombiner,
"SCI_PHOT") == 0)
392 fprintf (midiReportPtr,
"Number of Interf Regions = %d \n", format->numOfRegionsToProcess);
393 fprintf (midiReportPtr,
"Number of Photom A Regions = %d \n", format->numOfRegionsToProcess-1);
394 fprintf (midiReportPtr,
"Number of Photom B Regions = %d \n", format->numOfRegionsToProcess-1);
398 fprintf (midiReportPtr,
"Number of Regions to process = %d \n", format->numOfRegionsToProcess);
400 fprintf (midiReportPtr,
"\n");
403 if (format->iXWidth <= 0 || format->iYWidth <= 0 || format->numOfFrames <= 0 || format->framesPerScan <= 0)
405 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Invalid file format");
431 FilterData *filterInfo,
437 const char routine[] =
"getFilterData";
438 char *tempStr, *cleanString;
442 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
443 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
449 cleanString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
452 filterInfo->optFreqLo = N_BAND_FILT_LONG;
453 filterInfo->optFreqHi = N_BAND_FILT_SHORT;
455 if (diagnostic)cpl_msg_info(cpl_func,
"Extracting filter data from %s \n", fileName);
456 if (diagnostic) fprintf (midiReportPtr,
"Extracting filter data from %s \n", fileName);
459 tempStr = qfits_query_hdr (fileName,
"HIERARCH ESO INS FILT NAME");
462 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Extracting filter name");
463 cpl_msg_info(cpl_func,
"Default Lower %f Higher and Lower %f micron are used \n", filterInfo->optFreqLo, filterInfo->optFreqHi);
464 fprintf(midiReportPtr,
"Default Higher %f micron and Lower %f micron are used \n", filterInfo->optFreqLo, filterInfo->optFreqHi);
470 cleanUpString (tempStr, cleanString);
471 sscanf (cleanString,
"%s", filterInfo->filterName);
474 if (strcmp (filterInfo->filterName,
"Nband") == 0)
476 filterInfo->optFreqLo = N_BAND_FILT_LONG;
477 filterInfo->optFreqHi = N_BAND_FILT_SHORT;
479 else if (strcmp (filterInfo->filterName,
"OPEN") == 0)
481 filterInfo->optFreqLo = N_BAND_FILT_LONG;
482 filterInfo->optFreqHi = N_BAND_FILT_SHORT;
484 else if (strcmp (filterInfo->filterName,
"SiC") == 0)
486 filterInfo->optFreqLo = SIC_FILT_LONG;
487 filterInfo->optFreqHi = SIC_FILT_SHORT;
489 else if (strcmp (filterInfo->filterName,
"N8.7") == 0)
491 filterInfo->optFreqLo = N8_7_FILT_LONG;
492 filterInfo->optFreqHi = N8_7_FILT_SHORT;
494 else if (strcmp (filterInfo->filterName,
"ArIII") == 0)
496 filterInfo->optFreqLo = ArIII_FILT_LONG;
497 filterInfo->optFreqHi = ArIII_FILT_SHORT;
499 else if (strcmp (filterInfo->filterName,
"SIV") == 0)
501 filterInfo->optFreqLo = SIV_FILT_LONG;
502 filterInfo->optFreqHi = SIV_FILT_SHORT;
504 else if (strcmp (filterInfo->filterName,
"N11.3") == 0)
506 filterInfo->optFreqLo = N11_3_FILT_LONG;
507 filterInfo->optFreqHi = N11_3_FILT_SHORT;
509 else if (strcmp (filterInfo->filterName,
"NeII") == 0)
511 filterInfo->optFreqLo = NEII_FILT_LONG;
512 filterInfo->optFreqHi = NEII_FILT_SHORT;
516 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Unknown Filter ID");
517 cpl_msg_info(cpl_func,
" Default Higher %f micron and Lower %f micron are used \n\n", filterInfo->optFreqLo, filterInfo->optFreqHi);
518 fprintf(midiReportPtr,
" Default Higher %f micron and Lower %f micron are used \n\n", filterInfo->optFreqLo, filterInfo->optFreqHi);
523 if (diagnostic)cpl_msg_info(cpl_func,
"Filter ID = %s \n", filterInfo->filterName);
524 if (diagnostic)cpl_msg_info(cpl_func,
"Lower optical filter wavelength = %f micron \n", filterInfo->optFreqHi);
525 if (diagnostic)cpl_msg_info(cpl_func,
"Upper optical filter wavelength = %f micron \n\n", filterInfo->optFreqLo);
526 fprintf (midiReportPtr,
"Filter ID = %s \n", filterInfo->filterName);
527 fprintf (midiReportPtr,
"Lower optical filter wavelength = %f micron \n", filterInfo->optFreqHi);
528 fprintf (midiReportPtr,
"Upper optical filter wavelength = %f micron \n\n", filterInfo->optFreqLo);
531 filterInfo->optFreqLo = SPEED_OF_LIGHT / filterInfo->optFreqLo;
532 filterInfo->optFreqHi = SPEED_OF_LIGHT / filterInfo->optFreqHi;
552 int getFitsExtensionNumber (
560 const char routine[] =
"getFitsExtensionNumber";
561 int i, numOfExtensions = 0, extNumber = -1, found = 0;
562 char *stringTemp, *cleanString;
566 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
567 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
573 cleanString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
576 numOfExtensions = qfits_query_n_ext (fileName);
578 if (diagnostic)cpl_msg_info(cpl_func,
"Number of extensions = %d\n", numOfExtensions);
579 if (diagnostic) fprintf(midiReportPtr,
"Number of extensions = %d\n", numOfExtensions);
581 for (i = 0; i < numOfExtensions+1; i++)
583 stringTemp = qfits_query_ext (fileName,
"EXTNAME", i);
584 if (stringTemp != NULL)
586 cleanUpString (stringTemp, cleanString);
588 if (strcmp (cleanString, extName) == 0)
590 if (diagnostic)cpl_msg_info(cpl_func,
"%s extension number = %d\n", extName, i);
591 if (diagnostic) fprintf (midiReportPtr,
"%s extension number = %d\n", extName, i);
601 sprintf (midiMessage,
"Cannot find FITS '%s' extension", extName);
602 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
627 void createMidiMaskFile (
641 const char routine[] =
"createMidiMaskFile";
642 float *outData1, *outData2;
643 qfits_header *primHeadMask;
649 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
650 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
655 if (diagnostic)cpl_msg_info(cpl_func,
"Creating mask FITS file %s \n", maskFileName);
656 fprintf (midiReportPtr,
"Creating mask FITS file %s \n", maskFileName);
659 if (diagnostic)cpl_msg_info(cpl_func,
"Extracting primary header from input FITS file %s \n", inFileName);
660 if (diagnostic) fprintf(midiReportPtr,
"Extracting primary header from input FITS file %s \n", inFileName);
661 primHeadMask = qfits_header_read (inFileName);
662 if (primHeadMask == NULL)
664 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot extract primary header from input FITS file");
665 cpl_msg_info(cpl_func,
"\nCannot Create mask FITS file for batch %d \n", batchNumber);
666 fprintf (midiReportPtr,
"\nCannot Create mask FITS file for batch %d \n", batchNumber);
672 dateTime = qfits_get_datetime_iso8601 ();
673 qfits_header_mod (primHeadMask,
"DATE", dateTime,
"Date and time this file was written");
674 qfits_header_mod (primHeadMask,
"INSTRUME",
"MIDI",
"MIDI Mask created by DRS pipeline" );
675 qfits_header_add (primHeadMask,
"EXTNAME",
"Primary",
"MIDI Mask primary header",
"" );
678 maskFitsPtr = fopen (maskFileName,
"w");
679 qfits_header_dump (primHeadMask, maskFitsPtr);
680 qfits_header_destroy (primHeadMask);
681 fclose (maskFitsPtr);
684 outData1 = (
float *) calloc (subWindowSize,
sizeof (
float));
685 outData2 = (
float *) calloc (subWindowSize,
sizeof (
float));
688 loadMidiMaskData (numOfFrames, subWindowSize, inData1, inData2, outData1, outData2, error);
691 writeMidiMaskFile (widthX, widthY, maskFileName, subWindowSize, outData1, outData2, error);
694 cpl_msg_info(cpl_func,
"Created Mask FITS file: %s \n", maskFileName);
695 fprintf (midiReportPtr,
"Created Mask FITS file: %s \n", maskFileName);
721 void loadMidiMaskData (
732 const char routine[] =
"loadMidiMaskData";
739 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
740 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
746 for (i = 0; i < subWindowSize; i++)
752 if (plotFile && diagnostic)
755 tempFileName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
757 sprintf (tempFileName,
"%s%s.AvePhotomData1.plt", outFileDir, outRootName);
758 tempFilePtr = fopen (tempFileName,
"w");
759 for (j = 0; j < numOfFrames; j++)
761 for (pixel = 0; pixel < subWindowSize; pixel++)
763 i = j * subWindowSize + pixel;
764 fprintf (tempFilePtr,
"%d ", inData1[i]);
766 fprintf (tempFilePtr,
"\n");
768 fclose (tempFilePtr);
770 sprintf (tempFileName,
"%s%s.AvePhotomData2.plt", outFileDir, outRootName);
771 tempFilePtr = fopen (tempFileName,
"w");
772 for (j = 0; j < numOfFrames; j++)
774 for (pixel = 0; pixel < subWindowSize; pixel++)
776 i = j * subWindowSize + pixel;
777 fprintf (tempFilePtr,
"%d ", inData2[i]);
779 fprintf (tempFilePtr,
"\n");
781 fclose (tempFilePtr);
783 sprintf (tempFileName,
"%s%s.maskData1.plt", outFileDir, outRootName);
784 tempFilePtr = fopen (tempFileName,
"w");
785 for (i = 0; i < subWindowSize; i++)
786 fprintf (tempFilePtr,
"%5.4f\n", outData1[i]);
787 fclose (tempFilePtr);
789 sprintf (tempFileName,
"%s%s.maskData2.plt", outFileDir, outRootName);
790 tempFilePtr = fopen (tempFileName,
"w");
791 for (i = 0; i < subWindowSize; i++)
792 fprintf (tempFilePtr,
"%5.4f\n", outData2[i]);
793 fclose (tempFilePtr);
816 void writeMidiMaskFile (
827 const char routine[] =
"writeMidiMaskFile";
828 int numOfRowsImagData = 1, numOfElementsImagData;
832 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
833 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
838 if (diagnostic)cpl_msg_info(cpl_func,
"Writing data into the mask FITS file \n\n");
839 fprintf (midiReportPtr,
"Writing data into the mask FITS file \n\n");
842 numOfElementsImagData = numOfElements;
843 writeMidiMaskImagData (widthX, widthY, maskFitsName, numOfElementsImagData, numOfRowsImagData,
844 data1, data2, error);
869 void writeMidiMaskImagData (
882 const char routine[] =
"writeMidiMaskImagData";
883 qfits_table *maskTable;
884 int tableWidth = -1, numOfColumns = 2;
887 qfits_header *imagDataHeader;
899 tdim1 = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
900 tdim2 = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
903 maskFitsPtr = fopen (maskFitsName,
"a");
904 if (maskFitsPtr == NULL)
906 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot open mask file");
914 maskTable = qfits_table_new (maskFitsName, QFITS_BINTABLE, tableWidth, numOfColumns, numOfRows);
917 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot create table");
921 fclose (maskFitsPtr);
926 col = maskTable->col;
927 qfits_col_fill (col, numOfElements, 2,
sizeof(
float), TFITS_BIN_TYPE_E,
"DATA1",
" ",
" ",
" ",
930 qfits_col_fill (col, numOfElements, 2,
sizeof(
float), TFITS_BIN_TYPE_E,
"DATA2",
" ",
" ",
" ",
931 0, 0.0, 0, 1.0, numOfElements*
sizeof(
float));
934 imagDataHeader = qfits_table_ext_header_default(maskTable);
935 qfits_header_add (imagDataHeader,
"EXTNAME",
"IMAGING_DATA",
"MIDI Mask Extension name",
"" );
939 sprintf (tdim1,
"'(%d,%d)'", iWidthX, iWidthY);
940 sprintf (tdim2,
"'(%d,%d)'", iWidthX, iWidthY);
941 qfits_header_add (imagDataHeader,
"TDIM1", tdim1,
"Column dimensionality",
"" );
942 qfits_header_add (imagDataHeader,
"TDIM2", tdim2,
"Column dimensionality",
"" );
948 array = (
float **) calloc (numOfColumns,
sizeof(
float *));
952 if (qfits_table_append_xtension_hdr (maskFitsPtr, maskTable, (
const void **)array, imagDataHeader) == -1)
955 qfits_header_destroy (imagDataHeader);
956 qfits_table_close (maskTable);
958 fclose (maskFitsPtr);
978 int findImagingDataExtension (
980 int defaultExtensionNumber,
985 const char routine[] =
"findImagingDataExtension";
986 int currentExtension = 0;
987 int lastExtensionNumber = 0;
988 char *stringTemp, *cleanString;
992 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
993 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
999 cleanString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
1003 sprintf (midiMessage,
"Searching for IMAGING_DATA extension in data file %s", fileName);
1004 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
1008 lastExtensionNumber = qfits_query_n_ext (fileName);
1012 sprintf (midiMessage,
"Number of extensions = %d", lastExtensionNumber);
1013 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
1016 if (defaultExtensionNumber <= lastExtensionNumber)
1018 stringTemp = qfits_query_ext (fileName,
"EXTNAME", defaultExtensionNumber);
1019 cleanUpString (stringTemp, cleanString);
1021 if (strcmp (cleanString,
"IMAGING_DATA") == 0)
1023 currentExtension = defaultExtensionNumber;
1026 sprintf (midiMessage,
"IMAGING_DATA extension number = %d", currentExtension);
1027 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
1032 return (currentExtension);
1037 for (currentExtension = 1; currentExtension <= lastExtensionNumber; ++currentExtension)
1039 stringTemp = qfits_query_ext (fileName,
"EXTNAME", currentExtension);
1040 cleanUpString (stringTemp, cleanString);
1041 if (strcmp (cleanString,
"IMAGING_DATA") == 0)
break;
1044 if (currentExtension <= lastExtensionNumber)
1048 sprintf (midiMessage,
"IMAGING_DATA extension number = %d", currentExtension);
1049 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
1052 return (currentExtension);
1058 sprintf (midiMessage,
"No IMAGING_DATA extension in %s", fileName);
1059 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
1067 sprintf (midiMessage,
"IMAGING_DATA extension number = %d", currentExtension);
1068 midiReportInfo (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
1074 return (currentExtension);
1095 enum MaskMode maskMode,
1096 MidiFiles *fileNames,
1103 const char routine[] =
"selectMask";
1104 char *qfitsTemp, *stringTemp;
1106 FILE *temp1Ptr = NULL, *temp2Ptr = NULL;
1107 size_t stringLength;
1109 char nextChar, *cleanString;
1113 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1114 if (diagnostic > 4) fprintf( midiReportPtr,
"Invoking routine '%s' \n", routine);
1120 stringTemp = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char ));
1121 cleanString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char ));
1130 sprintf (maskFile,
"%s", fileNames->maskFileName);
1131 cpl_msg_info(cpl_func,
"maskFile: %s",maskFile);
1135 qfitsTemp = qfits_query_hdr (fileNames->inFitsName,
"HIERARCH ESO DET FITSTPL");
1136 if (qfitsTemp != NULL)
1138 cleanUpString (qfitsTemp, cleanString);
1141 stringLength = strlen (cleanString);
1142 temp1Ptr = fopen(
"temp1.grb",
"w");
1143 fprintf (temp1Ptr,
"%s\n", cleanString);
1145 temp1Ptr = fopen(
"temp1.grb",
"r");
1146 temp2Ptr = fopen(
"temp2.grb",
"w");
1147 for (i = 0; i < stringLength; i++)
1149 fscanf (temp1Ptr,
"%c", &nextChar);
1150 if (i > 7) fprintf (temp2Ptr,
"%c", nextChar);
1154 temp2Ptr = fopen(
"temp2.grb",
"r");
1155 fscanf (temp2Ptr,
"%s\n", stringTemp);
1158 remove (
"temp1.grb");
1159 remove (
"temp2.grb");
1160 sprintf (maskFile,
"%s%s%s", fileNames->maskFileDir,
"minrtsMask", stringTemp);
1164 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot read mask name");
1170 sprintf (maskFile,
"%s%s", fileNames->maskFileDir, fileNames->maskFileName);
1178 sprintf (fileNames->maskFileName,
"%s", maskFile);
1181 if (strcmp (maskFile,
"") == 0)
1183 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find a suitable mask file");
1186 else if (stat (maskFile, &buf) == -1)
1188 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find mask file");
1191 else if ((qfits_is_fits (maskFile)) != 1)
1193 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Found Non-FITS file");
1217 void midiInitFormat (
1218 ImageFormat *format)
1223 const char routine[] =
"midiInitFormat";
1227 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1228 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
1230 format->hasData = 0;
1231 format->numOfDetectorRegions = 0;
1232 format->numOfRegionsToProcess = 0;
1233 format->numOfPinholes = 0;
1234 format->numOfFrames = 0;
1235 format->framesPerScan = 0;
1236 format->numOfScans = 0;
1237 format->subWindowSize = 0;
1238 format->iXWidth = 0;
1239 format->iYWidth = 0;
1258 void midiCopyFormat (
1259 ImageFormat *formatIn,
1260 ImageFormat *formatOut)
1265 const char routine[] =
"midiCopyFormat";
1269 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1270 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
1272 sprintf (formatOut->obsCatg,
"%s", formatIn->obsCatg);
1273 sprintf (formatOut->obsTech,
"%s", formatIn->obsTech);
1274 sprintf (formatOut->obsType,
"%s", formatIn->obsType);
1275 sprintf (formatOut->cameraId,
"%s", formatIn->cameraId);
1276 sprintf (formatOut->beamCombiner,
"%s", formatIn->beamCombiner);
1277 sprintf (formatOut->filterName,
"%s", formatIn->filterName);
1278 sprintf (formatOut->shutterId,
"%s", formatIn->shutterId);
1279 sprintf (formatOut->grismId,
"%s", formatIn->grismId);
1280 sprintf (formatOut->targetName,
"%s", formatIn->targetName);
1281 sprintf (formatOut->slitName,
"%s", formatIn->slitName);
1282 sprintf (formatOut->tplStart,
"%s", formatIn->tplStart);
1283 sprintf (formatOut->tplName,
"%s", formatIn->tplName);
1284 formatOut->numOfDetectorRegions = formatIn->numOfDetectorRegions;
1285 formatOut->numOfRegionsToProcess = formatIn->numOfRegionsToProcess;
1286 formatOut->numOfPinholes = formatIn->numOfPinholes;
1287 formatOut->framesPerScan = formatIn->framesPerScan;
1288 formatOut->subWindowSize = formatIn->subWindowSize;
1289 formatOut->iXWidth = formatIn->iXWidth;
1290 formatOut->iYWidth = formatIn->iYWidth;
1309 void midiReportFormat (
1312 ImageFormat *format)
1317 const char routine[] =
"midiReportFormat";
1321 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1322 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s' \n", routine);
1324 cpl_msg_info(cpl_func,
" \n");
1325 cpl_msg_info(cpl_func,
"%s FORMAT \n", type);
1326 cpl_msg_info(cpl_func,
"--------------------- \n");
1327 cpl_msg_info(cpl_func,
"FITS Template Name = %s \n", format->tplName);
1328 cpl_msg_info(cpl_func,
"Batch Template Name = %s \n", batchTemplate);
1329 cpl_msg_info(cpl_func,
"Observation Category = %s \n", format->obsCatg);
1330 cpl_msg_info(cpl_func,
"Observation Technique = %s \n", format->obsTech);
1331 cpl_msg_info(cpl_func,
"Observation Type = %s \n", format->obsType);
1332 cpl_msg_info(cpl_func,
"Camera ID = %s \n", format->cameraId);
1333 cpl_msg_info(cpl_func,
"Beam Combiner = %s \n", format->beamCombiner);
1334 cpl_msg_info(cpl_func,
"Filter ID = %s \n", format->filterName);
1335 cpl_msg_info(cpl_func,
"Shutter ID = %s \n", format->shutterId);
1336 cpl_msg_info(cpl_func,
"Grism ID = %s \n", format->grismId);
1337 cpl_msg_info(cpl_func,
"Slit Name = %s \n", format->slitName);
1338 cpl_msg_info(cpl_func,
"Target Name = %s \n", format->targetName);
1339 cpl_msg_info(cpl_func,
"TPL Start = %s \n", format->tplStart);
1341 cpl_msg_info(cpl_func,
"Data is = DISPERSED \n");
1343 cpl_msg_info(cpl_func,
"Data is = UNDISPERSED \n");
1344 cpl_msg_info(cpl_func,
"Number of Frames = %d \n", format->numOfFrames);
1345 if ((strcmp(format->beamCombiner,
"SCI_PHOT") == 0) || (strcmp (format->shutterId,
"ABOPEN") == 0))
1347 cpl_msg_info(cpl_func,
"Frames per scan = %d \n", format->framesPerScan);
1348 cpl_msg_info(cpl_func,
"Number of Scans = %d \n", format->numOfScans);
1350 cpl_msg_info(cpl_func,
"X, Column dimension = %d \n", format->iXWidth);
1351 cpl_msg_info(cpl_func,
"Y, Column dimension = %d \n", format->iYWidth);
1352 cpl_msg_info(cpl_func,
"Sub-window size = %d \n", format->subWindowSize);
1353 cpl_msg_info(cpl_func,
"Number of Pinholes = %d \n", format->numOfPinholes);
1354 cpl_msg_info(cpl_func,
"Number of Detector Regions = %d \n", format->numOfDetectorRegions);
1355 cpl_msg_info(cpl_func,
"Number of Regions to process = %d \n", format->numOfRegionsToProcess);
1356 cpl_msg_info(cpl_func,
"\n");
1358 fprintf (midiReportPtr,
" \n");
1359 fprintf (midiReportPtr,
"%s FORMAT \n", type);
1360 fprintf (midiReportPtr,
"--------------------- \n");
1361 fprintf (midiReportPtr,
"FITS Template Name = %s \n", format->tplName);
1362 fprintf (midiReportPtr,
"Batch Template Name = %s \n", batchTemplate);
1363 fprintf (midiReportPtr,
"Observation Category = %s \n", format->obsCatg);
1364 fprintf (midiReportPtr,
"Observation Technique = %s \n", format->obsTech);
1365 fprintf (midiReportPtr,
"Observation Type = %s \n", format->obsType);
1366 fprintf (midiReportPtr,
"Camera ID = %s \n", format->cameraId);
1367 fprintf (midiReportPtr,
"Beam Combiner = %s \n", format->beamCombiner);
1368 fprintf (midiReportPtr,
"Filter ID = %s \n", format->filterName);
1369 fprintf (midiReportPtr,
"Shutter ID = %s \n", format->shutterId);
1370 fprintf (midiReportPtr,
"Grism ID = %s \n", format->grismId);
1371 fprintf (midiReportPtr,
"Slit Name = %s \n", format->slitName);
1372 fprintf (midiReportPtr,
"Target Name = %s \n", format->targetName);
1373 fprintf (midiReportPtr,
"TPL Start = %s \n", format->tplStart);
1375 fprintf (midiReportPtr,
"Data is = DISPERSED \n");
1377 fprintf (midiReportPtr,
"Data is = UNDISPERSED \n");
1378 fprintf (midiReportPtr,
"Number of Frames = %d \n", format->numOfFrames);
1379 if ((strcmp(format->beamCombiner,
"SCI_PHOT") == 0) || (strcmp (format->shutterId,
"ABOPEN") == 0))
1381 fprintf (midiReportPtr,
"Frames per scan = %d \n", format->framesPerScan);
1382 fprintf (midiReportPtr,
"Number of Scans = %d \n", format->numOfScans);
1384 fprintf (midiReportPtr,
"X, Column dimension = %d \n", format->iXWidth);
1385 fprintf (midiReportPtr,
"Y, Column dimension = %d \n", format->iYWidth);
1386 fprintf (midiReportPtr,
"Sub-window size = %d \n", format->subWindowSize);
1387 fprintf (midiReportPtr,
"Number of Pinholes = %d \n", format->numOfPinholes);
1388 fprintf (midiReportPtr,
"Number of Detector Regions = %d \n", format->numOfDetectorRegions);
1389 fprintf (midiReportPtr,
"Number of Regions to process = %d \n", format->numOfRegionsToProcess);
1390 fprintf (midiReportPtr,
"\n");
1409 void selectChannels (
1412 ImageFormat *format,
1417 const char routine[] =
"selectChannels";
1418 int i, x, y, r, masked;
1423 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1424 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
1426 cpl_msg_info(cpl_func,
"\nSelecting active channels based on the given mask \n");
1427 cpl_msg_info(cpl_func,
"------------------------------------------------- \n");
1428 fprintf(midiReportPtr,
"\nSelecting active channels based on the given mask \n");
1429 fprintf(midiReportPtr,
"------------------------------------------------- \n");
1432 array = (
float *) calloc (format->iXWidth,
sizeof(
float));
1434 for (r = start; r < end; r++)
1436 for (y = 0; y < format->iYWidth; y++)
1438 for (x = 0; x < format->iXWidth; x++)
1440 i = x + y * format->iXWidth;
1441 if (mask[r][i] > array[x]) array[x] = mask[r][i];
1447 for (x = 0; x < format->iXWidth; x++)
1449 if (array[x] == 0.0)
1452 badChannelList[x] |= BSL_MASKED_CHANNEL;
1456 cpl_msg_info(cpl_func,
"Number of active channels = %3d \n\n", (format->iXWidth - masked));
1457 fprintf(midiReportPtr,
"Number of active channels = %3d QCLOG \n\n", (format->iXWidth - masked));
1460 if (plotFile && diagnostic > 1) midiCreatePlotFile2D (
"SelectedChannels",
"Selected Channels",
1461 "Wavelength Channel",
"Mask Profile", 0, array, 0, format->iXWidth, 1, 0);