26 #include "midiGlobal.h"
28 #include "complex_midi.h"
29 #include "statistics.h"
30 #include "diagnostics.h"
31 #include "errorHandling.h"
33 #include "estimationFrgHSUndisp.h"
34 #include "photometry.h"
35 #include "visibility.h"
36 #include "calibration.h"
60 void estimateFrgHSUndisp (
61 CompressedData *compressedInterf,
62 CompressedData *compressedPhotA,
63 CompressedData *compressedPhotB,
64 FilterData *filterInfo,
65 ImageFormat *formatInterf,
66 ImageFormat *formatPhotomA,
67 ImageFormat *formatPhotomB,
68 RawVisibility *rawVis,
69 PhotometryResult *photometry)
74 const char routine[] =
"estimateFrgHSUndisp";
75 float *accumPS, *accumPS1, *accumPS2;
76 float photomA[2], photomB[2], *photomErrA, *photomErrB;
77 float photomChop2ChopA[2];
78 float photomChop2ChopB[2];
79 float fractionalBandwidth;
81 float ratio_photA0_to_photA1, ratio_errA0_to_photA0, ratio_errA1_to_photA1, ratio_photB0_to_photB1,
82 ratio_errB0_to_photB0, ratio_errB1_to_photB1;
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);
89 cpl_msg_info(cpl_func,
"\nComputing Normalized visibilities from batch %d \n", batchNumber);
90 cpl_msg_info(cpl_func,
"-------------------------------------------- \n");
91 fprintf(midiReportPtr,
"\nComputing Normalized visibilities from batch %d \n", batchNumber);
92 fprintf(midiReportPtr,
"-------------------------------------------- \n");
95 photomErrA = (
float *) calloc (2,
sizeof (
float));
96 photomErrB = (
float *) calloc (2,
sizeof (
float));
98 if (diagnostic) cpl_msg_info(cpl_func,
"Running photometric files...\n" );
99 fprintf (midiReportPtr,
"Running photometric files...\n" );
100 estimatePhotomUndisp (formatPhotomA, compressedPhotA, photomErrA, photomChop2ChopA, photomA);
101 estimatePhotomUndisp (formatPhotomB, compressedPhotB, photomErrB, photomChop2ChopB, photomB);
104 if (photomA[1] != 0.)
106 ratio_photA0_to_photA1 = photomA[0]/photomA[1];
107 ratio_errA1_to_photA1 = 100.F*photomErrA[1]/photomA[1];
111 ratio_photA0_to_photA1 = NOT_A_NUMBER;
112 ratio_errA1_to_photA1 = NOT_A_NUMBER;
115 if (photomA[0] != 0.)
116 ratio_errA0_to_photA0 = 100.F*photomErrA[0]/photomA[0];
118 ratio_errA0_to_photA0 = NOT_A_NUMBER;
120 if (photomB[1] != 0.)
122 ratio_photB0_to_photB1 = photomB[0]/photomB[1];
123 ratio_errB1_to_photB1 = 100.F*photomErrB[1]/photomB[1];
127 ratio_photB0_to_photB1 = NOT_A_NUMBER;
128 ratio_errB1_to_photB1 = NOT_A_NUMBER;
132 if (photomB[0] != 0.)
133 ratio_errB0_to_photB0 = 100.F*photomErrB[0]/photomB[0];
135 ratio_errB0_to_photB0 = NOT_A_NUMBER;
137 if (diagnostic)cpl_msg_info(cpl_func,
138 "\nPhotometric results \n"
139 "------------------- \n"
140 " region0 region1 ratio RMS chop-to-chop net photometric err \n"
141 "Aopen %8.0f %8.0f %5.4f %4.1f%% %4.1f%% %4.1f%% %4.1f%% \n"
142 "Bopen %8.0f %8.0f %5.4f %4.1f%% %4.1f%% %4.1f%% %4.1f%% \n",
143 photomA[0], photomA[1], ratio_photA0_to_photA1, 100.F*photomChop2ChopA[0], 100.F*photomChop2ChopA[1],
144 ratio_errA0_to_photA0, ratio_errA1_to_photA1,
145 photomB[0], photomB[1], ratio_photB0_to_photB1, 100.F*photomChop2ChopB[0], 100.F*photomChop2ChopB[1],
146 ratio_errB0_to_photB0, ratio_errB1_to_photB1);
148 fprintf(midiReportPtr,
149 "\nPhotometric results QCLOG \n"
150 "------------------- QCLOG \n"
151 " region0 region1 ratio RMS chop-to-chop net photometric err QCLOG \n"
152 "Aopen %8.0f %8.0f %5.4f %4.1f%% %4.1f%% %4.1f%% %4.1f%% QCLOG \n"
153 "Bopen %8.0f %8.0f %5.4f %4.1f%% %4.1f%% %4.1f%% %4.1f%% QCLOG \n",
154 photomA[0], photomA[1], ratio_photA0_to_photA1, 100.F*photomChop2ChopA[0], 100.F*photomChop2ChopA[1],
155 ratio_errA0_to_photA0, ratio_errA1_to_photA1,
156 photomB[0], photomB[1], ratio_photB0_to_photB1, 100.F*photomChop2ChopB[0], 100.F*photomChop2ChopB[1],
157 ratio_errB0_to_photB0, ratio_errB1_to_photB1);
160 photometry->photomA[0] = photomA[0];
161 photometry->photomAErr[0] = photomErrA[0];
162 photometry->photomA[1] = photomA[1];
163 photometry->photomAErr[1] = photomErrA[1];
165 photometry->photomB[0] = photomB[0];
166 photometry->photomBErr[0] = photomErrB[0];
167 photometry->photomB[1] = photomB[1];
168 photometry->photomBErr[1] = photomErrB[1];
170 photometry->ratioPhotomA0toA1 = ratio_photA0_to_photA1;
171 photometry->ratioPhotomB0toB1 = ratio_photB0_to_photB1;
173 photometry->chop2ChopAErr[0] = photomChop2ChopA[0];
174 photometry->chop2ChopAErr[1] = photomChop2ChopA[1];
175 photometry->chop2ChopBErr[0] = photomChop2ChopB[0];
176 photometry->chop2ChopBErr[1] = photomChop2ChopB[1];
179 if (photomA[1] == 0. || photomA[0] == 0. || photomB[1] == 0. || photomB[0] == 0.)
181 sprintf (midiMessage,
"A value of %.4f is a reject result. QCLOG", (
float)NOT_A_NUMBER);
182 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
186 if (diagnostic) cpl_msg_info(cpl_func,
"FFT size = %d\n",formatInterf->fftsize);
187 fprintf (midiReportPtr,
"FFT size = %d\n",formatInterf->fftsize);
188 SetFFTsize (formatInterf->fftsize);
191 accumPS = (
float *) calloc (formatInterf->fftsize/2,
sizeof(
float));
192 accumPS1 = (
float *) calloc (formatInterf->fftsize/2,
sizeof(
float));
193 accumPS2 = (
float *) calloc (formatInterf->fftsize/2,
sizeof(
float));
196 fractionalBandwidth = 2.0F * (filterInfo->optFreqHi - filterInfo->optFreqLo)/formatInterf->optFreqCal;
197 lofreq = (
int) ((0.9F * ((float) formatInterf->fftsize) * filterInfo->optFreqLo)/formatInterf->optFreqCal);
198 hifreq = (int) ((1.1F * ((
float) formatInterf->fftsize) * filterInfo->optFreqHi)/formatInterf->optFreqCal);
200 if (hifreq >= (formatInterf->fftsize/2))
201 hifreq = formatInterf->fftsize/2 - 1;
203 if (lofreq >= hifreq)
206 if (diagnostic)cpl_msg_info(cpl_func,
207 "\nBandwidth used \n"
209 "Specified (Min, Max) THz = %6.3f, %6.3f \n"
210 "Integer (Min, Max) = %d, %d \n"
211 "Fractional THz = %6.3f \n"
212 "Folding frequency THz = %6.3f at %2d \n\n",
213 filterInfo->optFreqLo, filterInfo->optFreqHi, lofreq, hifreq,
214 fractionalBandwidth, .5F*formatInterf->optFreqCal, formatInterf->fftsize/2);
215 fprintf (midiReportPtr,
216 "\nBandwidth used QCLOG \n"
217 "-------------- QCLOG \n"
218 "Specified (Min, Max) THz = %6.3f, %6.3f QCLOG \n"
219 "Integer (Min, Max) = %d, %d QCLOG \n"
220 "Fractional THz = %6.3f QCLOG \n"
221 "Folding frequency THz = %6.3f at %2d QCLOG \n\n",
222 filterInfo->optFreqLo, filterInfo->optFreqHi, lofreq, hifreq,
223 fractionalBandwidth, .5F*formatInterf->optFreqCal, formatInterf->fftsize/2);
225 accumulatePowerSpectra (0, formatInterf, compressedInterf->allSpectrum, compressedInterf->badScanList,
226 formatInterf->numOfScansProcessed, accumPS);
228 rawVis->visSqrd = estimateCorrelatedFlux2 (formatInterf, accumPS, fractionalBandwidth,
229 lofreq, hifreq, 0.F);
231 rawVis->vis = estimateCorrelatedFlux (formatInterf, accumPS, lofreq, hifreq, 0.F);
233 accumulatePowerSpectra (1, formatInterf, compressedInterf->allSpectrum, compressedInterf->badScanList,
234 formatInterf->numOfScansProcessed, accumPS1);
236 rawVis->visSqrd1= estimateCorrelatedFlux2 (formatInterf, accumPS1, fractionalBandwidth,
237 lofreq, hifreq, 0.F);
239 rawVis->vis1 = estimateCorrelatedFlux (formatInterf, accumPS1, lofreq, hifreq, 0.F);
241 accumulatePowerSpectra (2, formatInterf, compressedInterf->allSpectrum, compressedInterf->badScanList,
242 formatInterf->numOfScansProcessed, accumPS2);
244 rawVis->visSqrd2 = estimateCorrelatedFlux2 (formatInterf, accumPS2, fractionalBandwidth,
245 lofreq, hifreq, 0.F);
247 rawVis->vis2 = estimateCorrelatedFlux (formatInterf, accumPS2, lofreq, hifreq, 0.F);
250 normalizeVis (rawVis, photomA, photomB);
274 void accumulatePowerSpectra (
276 ImageFormat *imageformat,
279 int numOfScansProcessed,
285 const char routine[] =
"accumulatePowerSpectra";
286 int i, j, fftSizeHalf;
287 float *floatPtr, norm, plotfreqcal;
292 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s'\n", routine);
293 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s'\n", routine);
296 fftSizeHalf = 0.5 * imageformat->fftsize;
297 plotfreqcal = imageformat->optFreqCal/((float)imageformat->fftsize);
298 if (imageformat->optFreqCal == 0.F) plotfreqcal = 1.F;
301 floatPtr = allSpectrum + (region * imageformat->numOfScans * fftSizeHalf);
302 for (j = 0; j < imageformat->numOfScans; j++)
304 if (badScanList[j] == 0)
306 for (i = 0; i < fftSizeHalf; i++)
307 accumPS[i] += *floatPtr++;
311 for (i = 0; i < fftSizeHalf; i++)
317 if (numOfScansProcessed > 0)
318 norm = 1.0 / ((float) numOfScansProcessed);
322 for (i = 0; i < fftSizeHalf; i++)
326 fprintf (midiReportPtr,
"\n--------------------------------------------------------\n"
327 "Region %d incoh power spectral amplitude, including noise\n\n", region);
328 for (i = 0; i < fftSizeHalf; i++)
329 fprintf (midiReportPtr,
"%4.1f %8.1f\n", plotfreqcal * ((
float)i), sqrtp(accumPS[i]));
331 fprintf (midiReportPtr,
"\n--------------------------------------------------------\n\n");
350 float estimateCorrelatedFlux (
351 ImageFormat *imageFormat,
360 const char routine[] =
"estimateCorrelatedFlux";
362 float Accum = 0.0, result;
366 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
367 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
370 fftSizeHalf = 0.5 * imageFormat->fftsize;
374 for (i = hiFreq; i < fftSizeHalf; i++)
377 if ((fftSizeHalf - hiFreq) != 0)
378 noiselev = Accum/((float) (fftSizeHalf - hiFreq));
380 noiselev = Accum/VERY_SMALL_FLOAT;
382 cpl_msg_info(cpl_func,
"Estimated noise power level = %f\n", noiselev);
383 fprintf (midiReportPtr,
"Estimated noise power level = %f\n", noiselev);
388 for (i = loFreq; i <= hiFreq; i++)
389 Accum += sqrtp (accumPS[i] - noiselev);
392 cpl_msg_info(cpl_func,
"Unnormalized vis amplitude = %7f \n\n", result);
393 fprintf (midiReportPtr,
"Unnormalized vis amplitude = %7f \n\n", result);
413 float estimateCorrelatedFlux2 (
414 ImageFormat *imageFormat,
424 const char routine[] =
"estimateCorrelatedFlux2";
426 float Accum = 0.0, result;
430 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
431 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
434 fftSizeHalf = 0.5 * imageFormat->fftsize;
438 for (i = hiFreq; i < fftSizeHalf; i++)
441 if ((fftSizeHalf - hiFreq) != 0)
442 noiselev = Accum/((float) (fftSizeHalf - hiFreq));
444 noiselev = Accum/VERY_SMALL_FLOAT;
446 cpl_msg_info(cpl_func,
"Estimated noise power level = %f\n", noiselev);
447 fprintf (midiReportPtr,
"Estimated noise power level = %f\n", noiselev);
452 for (i = loFreq; i <= hiFreq; i++)
455 result = 0.5 * ((float) imageFormat->fftsize) * bandwidth * (Accum - noiselev * (hiFreq - loFreq + 1));
457 cpl_msg_info(cpl_func,
"Unnormalized vis^2 = %7f \n\n", result);
458 fprintf (midiReportPtr,
"Unnormalized vis^2 = %7f \n\n", result);