22 #include <sys/types.h>
29 #include "midiGlobal.h"
32 #include "errorHandling.h"
33 #include "diagnostics.h"
34 #include "fileHandling.h"
35 #include "transferFunction.h"
41 #define START_MIDI_RECORD (173)
42 #define END_MIDI_RECORD (620)
43 #define CALIB_DB_LEN (30)
44 #define UNWANTED_ELEMENTS (27)
45 #define CALIBRATOR_MIN_THRESHOLD (0.000290888)
46 #define DIAMETER_FACTOR (4.848136958e-9)
47 #define INVERSE_WAVELENGTH (100000.0)
78 void estimateTransferFunction (
79 ImageFormat *formatInterf,
81 DispersedResult *dispResult,
82 CalibratorParam *calibrator,
84 cpl_parameterlist *parlist,
85 cpl_frameset *frameset)
90 const char routine[] =
"estimateTransferFunction";
91 FILE * trfPtr, *trfHistoryPtr;
94 cpl_table * trftable=NULL;
95 cpl_propertylist * qclist=NULL;
97 char * system_call=NULL;
102 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
103 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
105 cpl_msg_info(cpl_func,
"\nComputing Transfer Functions for batch %d \n", batchNumber);
106 cpl_msg_info(cpl_func,
"-------------------------------------- \n");
107 fprintf (midiReportPtr,
"\nComputing Transfer Functions for batch %d \n", batchNumber);
108 fprintf (midiReportPtr,
"-------------------------------------- \n");
112 dispResult->trfExists = 0;
115 if (stat (fileNames->trfNameWrite, &buf) == 0)
116 remove (fileNames->trfNameWrite);
118 identifyCalibrator (fileNames, calibrator, error, parlist, frameset);
121 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot identify Calibrator");
125 computeExpectedVis (calibrator, error);
128 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot compute Expected Visibilities");
133 if (calibrator->calibVis == 0 || calibrator->calibVisSqrd == 0)
135 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
136 "A singularity encountered\n Cannot compute transfer functions");
143 if ((trfPtr = fopen (fileNames->trfNameWrite,
"w")) == NULL)
145 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot open file to store transfer functions");
151 trfHistoryPtr = fopen (fileNames->trfHistoryName,
"a");
152 fprintf (trfHistoryPtr,
"Transfer Functions (DISPERSED) for batch %d \n", batchNumber);
153 fprintf (trfHistoryPtr,
"---------------------------------------- \n");
154 fprintf (trfHistoryPtr,
"Grism ID = %s \n", formatInterf->grismId);
155 fprintf (trfHistoryPtr,
"Number of Valid Channels = %d \n", formatInterf->iXWidth);
157 if (diagnostic)cpl_msg_info(cpl_func,
"Grism ID = %s \n", formatInterf->grismId);
158 if (diagnostic)cpl_msg_info(cpl_func,
"Number of Channels = %d \n", formatInterf->iXWidth);
160 fprintf (midiReportPtr,
"\nTransfer Functions (DISPERSED) for batch %d QCLOG \n", batchNumber);
161 fprintf (midiReportPtr,
"---------------------------------------- QCLOG \n");
162 fprintf (midiReportPtr,
"Grism ID = %s QCLOG \n", formatInterf->grismId);
163 fprintf (midiReportPtr,
"Number of Valid Channels = %d QCLOG \n", formatInterf->iXWidth);
165 fprintf (trfPtr,
"%s \n", formatInterf->grismId);
166 fprintf (trfPtr,
"%d \n", formatInterf->iXWidth);
168 for (X = 0; X < formatInterf->iXWidth; X++)
170 if (badChannelList[X])
172 if (diagnostic)cpl_msg_info(cpl_func,
"%3d <-- %s --> \n", X, UNAV);
173 fprintf (midiReportPtr,
"%3d <-- %s --> QCLOG \n", X, UNAV);
174 fprintf (trfHistoryPtr,
"%3d <-- %s --> \n", X, UNAV);
175 fprintf (trfPtr,
"%f %f \n", (dispResult->trf)[X], (dispResult->trfErr)[X]);
179 dispResult->trf[X] = dispResult->normVis2[X] / calibrator->calibVis;
180 dispResult->trfErr[X] = dispResult->normVis2Err[X] / (fabs (calibrator->calibVis)) +
181 calibrator->calibVisErr * (fabs (dispResult->normVis2[X]) /
182 (calibrator->calibVis * calibrator->calibVis));
184 if (diagnostic)cpl_msg_info(cpl_func,
"%3d %f %f \n", X, (dispResult->trf)[X], (dispResult->trfErr)[X]);
185 fprintf (midiReportPtr,
"%3d %f %f QCLOG \n", X, (dispResult->trf)[X], (dispResult->trfErr)[X]);
186 fprintf (trfHistoryPtr,
"%3d %f %f \n", X, (dispResult->trf)[X], (dispResult->trfErr)[X]);
187 fprintf (trfPtr,
"%f %f \n", (dispResult->trf)[X], (dispResult->trfErr)[X]);
191 fclose (trfHistoryPtr);
192 if (diagnostic)cpl_msg_info(cpl_func,
"Created Transfer Function file %s\n", fileNames->trfNameWrite);
193 fprintf (midiReportPtr,
"Created Transfer Function file %s\n", fileNames->trfNameWrite);
194 dispResult->trfExists = 1;
199 trftable=cpl_table_new(formatInterf->iXWidth);
200 cpl_table_new_column(trftable,
"CHANNEL",CPL_TYPE_INT);
201 cpl_table_new_column(trftable,
"TRF",CPL_TYPE_FLOAT);
202 cpl_table_new_column(trftable,
"TRF_ERROR",CPL_TYPE_FLOAT);
204 for (X = 0; X < formatInterf->iXWidth; X++)
206 cpl_table_set_int(trftable,
"CHANNEL",X, X+1);
207 cpl_table_set_float(trftable,
"TRF",X, (dispResult->trf)[X]);
208 cpl_table_set_float(trftable,
"TRF_ERROR",X, (dispResult->trfErr)[X]);
209 if (badChannelList[X])
211 cpl_table_set_invalid(trftable,
"TRF", X);
212 cpl_table_set_invalid(trftable,
"TRF_ERROR", X);
219 qclist=cpl_propertylist_new();
221 if (strcmp(formatInterf->grismId,
"GRISM")==0) {
222 cpl_propertylist_update_string(qclist, CPL_DFS_PRO_CATG,
"TRF_GRISM");
223 dataname=cpl_sprintf(
"MIDI_trf_grism.fits");
225 if (strcmp(formatInterf->grismId,
"PRISM")==0) {
226 cpl_propertylist_update_string(qclist, CPL_DFS_PRO_CATG,
"TRF_PRISM");
227 dataname=cpl_sprintf(
"MIDI_trf_prism.fits");
229 cpl_propertylist_append_string(qclist,
"EXTNAME",
"TRANSFER_FUNCTION");
232 cpl_propertylist_update_float(qclist,
"ESO QC OBS CAL RA" , calibrator->calibRA);
233 cpl_propertylist_update_float(qclist,
"ESO QC OBS CAL DEC" , calibrator->calibDEC);
234 cpl_propertylist_update_float(qclist,
"ESO QC OBS AVR PBL " , calibrator->calibPblAverage);
235 cpl_propertylist_update_float(qclist,
"ESO QC OBS AVR PARANG" , calibrator->calibParangAverage);
236 cpl_propertylist_update_string(qclist,
"ESO QC DB NAME" , calibrator->calibName);
237 cpl_propertylist_update_float(qclist,
"ESO QC DB DIAM" , calibrator->calibDiameter);
238 cpl_propertylist_update_float(qclist,
"ESO QC DB DIAM ERR " , calibrator->calibDiameterErr);
239 cpl_propertylist_update_float(qclist,
"ESO QC DB DIST" , RAD_TO_ARCSEC * calibrator->calibDistance);
240 cpl_propertylist_update_double(qclist,
"ESO QC DB MAG NBAND" , calibrator->calibFlux);
241 cpl_propertylist_update_int (qclist,
"ESO QC DB FLAG" , calibrator->calibFlag);
242 cpl_propertylist_update_float(qclist,
"ESO QC EXP VIS" , calibrator->calibVis);
243 cpl_propertylist_update_float(qclist,
"ESO QC EXP VIS ERR" , calibrator->calibVisErr);
244 cpl_propertylist_update_float(qclist,
"ESO QC EXP VIS2" , calibrator->calibVisSqrd);
245 cpl_propertylist_update_float(qclist,
"ESO QC EXP VIS2 ERR" , calibrator->calibVisSqrdErr);
247 cpl_propertylist_set_comment (qclist,
"ESO QC OBS CAL RA" ,
"Observed Calibrator RA in radians");
248 cpl_propertylist_set_comment (qclist,
"ESO QC OBS CAL DEC" ,
"Observed Calibrator DEC in radians");
249 cpl_propertylist_set_comment (qclist,
"ESO QC OBS AVR PBL " ,
"Observed Calibrator Average PBL in meter");
250 cpl_propertylist_set_comment (qclist,
"ESO QC OBS AVR PARANG" ,
"Observed Calibrator Average PARANG in degrees");
251 cpl_propertylist_set_comment (qclist,
"ESO QC DB NAME" ,
"Closest Calibrator in the database");
252 cpl_propertylist_set_comment (qclist,
"ESO QC DB DIAM" ,
"Calibrator Diameter in marcsec");
253 cpl_propertylist_set_comment (qclist,
"ESO QC DB DIAM ERR " ,
"Calibrator Diameter error in marcsec");
254 cpl_propertylist_set_comment (qclist,
"ESO QC DB DIST" ,
"Computed Distance to Observed Calibrator in arcsec");
255 cpl_propertylist_set_comment (qclist,
"ESO QC DB MAG NBAND" ,
"Calibrator Magnitude in the N-Band");
256 cpl_propertylist_set_comment (qclist,
"ESO QC DB FLAG" ,
"Calibrator Quality Flag");
257 cpl_propertylist_set_comment (qclist,
"ESO QC EXP VIS" ,
"Expected Visibility");
258 cpl_propertylist_set_comment (qclist,
"ESO QC EXP VIS ERR" ,
"Expected Visibility Error");
259 cpl_propertylist_set_comment (qclist,
"ESO QC EXP VIS2" ,
"Expected Squared Visibility");
260 cpl_propertylist_set_comment (qclist,
"ESO QC EXP VIS2 ERR" ,
"Expected Squared Visibility Error");
263 cpl_dfs_save_table(frameset, NULL, parlist, frameset, NULL, trftable,
264 qclist,
"midi_fringe_all",
266 PACKAGE
"/" PACKAGE_VERSION,
272 system_call=cpl_sprintf(
"cp %s /tmp/MIDI_trf.fits", dataname);
273 cpl_msg_info(cpl_func,
"Copying the file into the tmp directory ...");
274 cpl_msg_info(cpl_func,system_call);
277 cpl_table_delete(trftable);
278 cpl_propertylist_delete(qclist);
280 cpl_free(system_call);
287 computeBinnedTrf (formatInterf, dispResult, error);
290 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot compute Binned Transfer Function");
300 if (plotFile && diagnostic)
302 midiCreatePlotFile2D (
"TransferFunctionConbined",
"Combined Transfer Function",
303 "Channel",
"Transfer Function", 0, dispResult->trf, 0, formatInterf->iXWidth, 1, 0);
305 midiCreatePlotFile2D (
"TransferFunctionErrConbined",
"Combined Transfer Function",
306 "Channel",
"Transfer Function Error", 0, dispResult->trfErr, 0, formatInterf->iXWidth, 1, 0);
343 void estimateTransferFunctionUndisp (
344 MidiFiles *fileNames,
345 RawVisibility *measVis,
346 TransferFunction *trf,
347 CalibratorParam *calibrator,
349 cpl_parameterlist *parlist,
350 cpl_frameset *frameset)
355 const char routine[] =
"estimateTransferFunctionUndisp";
363 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
364 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
366 cpl_msg_info(cpl_func,
"\nComputing Transfer Functions for batch %d \n", batchNumber);
367 cpl_msg_info(cpl_func,
"-------------------------------------- \n");
368 fprintf (midiReportPtr,
"\nComputing Transfer Functions for batch %d \n", batchNumber);
369 fprintf (midiReportPtr,
"-------------------------------------- \n");
376 if (stat (fileNames->trfNameWrite, &buf) == 0)
377 remove (fileNames->trfNameWrite);
379 identifyCalibrator (fileNames, calibrator, error, parlist, frameset);
382 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot identify Calibrator");
386 computeExpectedVis (calibrator, error);
389 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot compute Expected Visibilities");
394 if (calibrator->calibVis == 0 || calibrator->calibVisSqrd == 0)
396 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
397 "A singularity encountered. Cannot compute transfer functions");
403 trf->trf[0] = measVis->vis / calibrator->calibVis;
404 trf->trfErr[0] = measVis->visErr / (fabs (calibrator->calibVis)) +
405 calibrator->calibVisErr * (fabs (measVis->vis) / (calibrator->calibVis * calibrator->calibVis));
407 trf->trf[1] = measVis->vis1 / calibrator->calibVis;
408 trf->trfErr[1] = measVis->vis1Err / (fabs (calibrator->calibVis)) +
409 calibrator->calibVisErr * (fabs (measVis->vis1) / (calibrator->calibVis * calibrator->calibVis));
411 trf->trf[2] = measVis->vis2 / calibrator->calibVis;
412 trf->trfErr[2] = measVis->vis2Err / (fabs (calibrator->calibVis)) +
413 calibrator->calibVisErr * (fabs (measVis->vis2) / (calibrator->calibVis * calibrator->calibVis));
415 trf->trf[3] = measVis->visSqrd / calibrator->calibVisSqrd;
416 trf->trfErr[3] = measVis->visSqrdErr / (fabs (calibrator->calibVisSqrd)) +
417 calibrator->calibVisSqrdErr * (fabs (measVis->visSqrd) / (calibrator->calibVisSqrd * calibrator->calibVisSqrd));
419 trf->trf[4] = measVis->visSqrd1 / calibrator->calibVisSqrd;
420 trf->trfErr[4] = measVis->visSqrd1Err / (fabs (calibrator->calibVisSqrd)) +
421 calibrator->calibVisSqrdErr * (fabs (measVis->visSqrd1) / (calibrator->calibVisSqrd * calibrator->calibVisSqrd));
423 trf->trf[5] = measVis->visSqrd2 / calibrator->calibVisSqrd;
424 trf->trfErr[5] = measVis->visSqrd2Err / (fabs (calibrator->calibVisSqrd)) +
425 calibrator->calibVisSqrdErr * (fabs (measVis->visSqrd2) / (calibrator->calibVisSqrd * calibrator->calibVisSqrd));
429 if ((trfPtr = fopen (fileNames->trfNameWrite,
"w")) == NULL)
431 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot open file to store transfer functions");
437 cpl_msg_info(cpl_func,
"Transfer Function region 0 = %f \n", trf->trf[0]);
438 cpl_msg_info(cpl_func,
"Transfer Function region 0 Error = %f \n", trf->trfErr[0]);
439 cpl_msg_info(cpl_func,
"Transfer Function region 1 = %f \n", trf->trf[1]);
440 cpl_msg_info(cpl_func,
"Transfer Function region 1 Error = %f \n", trf->trfErr[1]);
441 cpl_msg_info(cpl_func,
"Transfer Function region 2 = %f \n", trf->trf[2]);
442 cpl_msg_info(cpl_func,
"Transfer Function region 2 Error = %f \n", trf->trfErr[2]);
443 cpl_msg_info(cpl_func,
"Transfer Function Squared region 0 = %f \n", trf->trf[3]);
444 cpl_msg_info(cpl_func,
"Transfer Function Squared region 0 Error = %f \n", trf->trfErr[3]);
445 cpl_msg_info(cpl_func,
"Transfer Function Squared region 1 = %f \n", trf->trf[4]);
446 cpl_msg_info(cpl_func,
"Transfer Function Squared region 1 Error = %f \n", trf->trfErr[4]);
447 cpl_msg_info(cpl_func,
"Transfer Function Squared region 2 = %f \n", trf->trf[5]);
448 cpl_msg_info(cpl_func,
"Transfer Function Squared region 2 Error = %f \n", trf->trfErr[5]);
449 fprintf (midiReportPtr,
"Transfer Function region 0 = %f (QCLOG)\n", trf->trf[0]);
450 fprintf (midiReportPtr,
"Transfer Function region 0 Error = %f (QCLOG)\n", trf->trfErr[0]);
451 fprintf (midiReportPtr,
"Transfer Function region 1 = %f (QCLOG)\n", trf->trf[1]);
452 fprintf (midiReportPtr,
"Transfer Function region 1 Error = %f (QCLOG)\n", trf->trfErr[1]);
453 fprintf (midiReportPtr,
"Transfer Function region 2 = %f (QCLOG)\n", trf->trf[2]);
454 fprintf (midiReportPtr,
"Transfer Function region 2 Error = %f (QCLOG)\n", trf->trfErr[2]);
455 fprintf (midiReportPtr,
"Transfer Function Squared region 0 = %f (QCLOG)\n", trf->trf[3]);
456 fprintf (midiReportPtr,
"Transfer Function Squared region 0 Error = %f (QCLOG)\n", trf->trfErr[3]);
457 fprintf (midiReportPtr,
"Transfer Function Squared region 1 = %f (QCLOG)\n", trf->trf[4]);
458 fprintf (midiReportPtr,
"Transfer Function Squared region 1 Error = %f (QCLOG)\n", trf->trfErr[4]);
459 fprintf (midiReportPtr,
"Transfer Function Squared region 2 = %f (QCLOG)\n", trf->trf[5]);
460 fprintf (midiReportPtr,
"Transfer Function Squared region 2 Error = %f (QCLOG)\n", trf->trfErr[5]);
463 for (i = 0; i < 6; i++)
465 fprintf (trfPtr,
"%f\n", trf->trf[i]);
466 fprintf (trfPtr,
"%f\n", trf->trfErr[i]);
469 if (diagnostic)cpl_msg_info(cpl_func,
"Created Transfer Function file %s\n", fileNames->trfNameWrite);
470 fprintf (midiReportPtr,
"Created Transfer Function file %s\n", fileNames->trfNameWrite);
475 trfHistoryPtr = fopen (fileNames->trfHistoryName,
"a");
476 fprintf (trfHistoryPtr,
"Transfer Functions (UNDISPERSED) Batch %d \n", batchNumber);
477 fprintf (trfHistoryPtr,
"-------------------------------------- \n");
478 for (i = 0; i < 6; i++) fprintf (trfHistoryPtr,
"%f %f \n", trf->trf[i], trf->trfErr[i]);
479 fprintf (trfHistoryPtr,
"\n");
480 fclose (trfHistoryPtr);
498 void identifyCalibrator (
499 MidiFiles *fileNames,
500 CalibratorParam *calibrator,
502 cpl_parameterlist *parlist,
503 cpl_frameset *frameset)
508 const char routine[] =
"identifyCalibrator";
509 char *fileNameStr, *qfitsString, *cleanString, *stringTemp, *classification;
511 float floatDummy, pblStart, pblEnd, parangStart, parangEnd;
512 FILE *inFitsBatchPtr = NULL;
516 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
517 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
528 classification = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
529 stringTemp = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
530 cleanString = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
531 fileNameStr = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
534 if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch,
"r")) == NULL)
536 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot open input FITS file list");
539 free (classification);
546 while (fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
548 sprintf (classification,
"%s",
"");
549 sscanf (stringTemp,
"%s%s", fileNameStr, classification);
552 qfitsString = qfits_query_ext (fileNameStr,
"HIERARCH ESO DPR TYPE", 0);
553 if (qfitsString == NULL)
555 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get DPR TYPE from");
559 free (classification);
561 fclose (inFitsBatchPtr);
566 cleanUpString (qfitsString, cleanString);
567 if (strcmp (cleanString,
"OTHER") != 0)
575 qfitsString = qfits_query_ext (fileNameStr,
"RA", 0);
576 if (qfitsString == NULL)
578 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get RA from");
582 free (classification);
584 fclose (inFitsBatchPtr);
589 cleanUpString (qfitsString, cleanString);
590 if (qfits_is_float (cleanString))
592 sscanf(cleanString,
"%f", &(calibrator->calibRA));
593 calibrator->calibRA *= DEG_TO_RAD;
597 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Found non-float RA");
601 free (classification);
603 fclose (inFitsBatchPtr);
609 qfitsString = qfits_query_ext (fileNameStr,
"DEC", 0);
610 if (qfitsString == NULL)
612 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get DEC");
616 free (classification);
618 fclose (inFitsBatchPtr);
623 cleanUpString (qfitsString, cleanString);
624 if (qfits_is_float (cleanString))
626 sscanf(cleanString,
"%f", &(calibrator->calibDEC));
627 calibrator->calibDEC *= DEG_TO_RAD;
631 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Found non-float DEC");
635 free (classification);
637 fclose (inFitsBatchPtr);
643 qfitsString = qfits_query_ext (fileNameStr,
"HIERARCH ESO OBS TARG NAME", 0);
644 if (qfitsString == NULL)
646 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get target name");
650 free (classification);
652 fclose (inFitsBatchPtr);
657 cleanUpString (qfitsString, cleanString);
658 sscanf (cleanString,
"%s", calibrator->calibName);
663 qfitsString = qfits_query_ext (fileNameStr,
"HIERARCH ESO ISS PBL12 START", 0);
664 if (qfitsString == NULL)
666 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get PBL12 START");
670 free (classification);
672 fclose (inFitsBatchPtr);
677 cleanUpString (qfitsString, cleanString);
678 if (qfits_is_float (cleanString))
680 sscanf(cleanString,
"%f", &floatDummy);
681 if (floatDummy > 0.0)
682 pblStart += floatDummy;
685 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Found non-positive PBL12 START");
689 free (classification);
691 fclose (inFitsBatchPtr);
697 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Found non-float PBL12 START");
701 free (classification);
703 fclose (inFitsBatchPtr);
709 qfitsString = qfits_query_ext (fileNameStr,
"HIERARCH ESO ISS PBL12 END", 0);
710 if (qfitsString == NULL)
712 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get PBL12 END");
716 free (classification);
718 fclose (inFitsBatchPtr);
723 cleanUpString (qfitsString, cleanString);
724 if (qfits_is_float (cleanString))
726 sscanf(cleanString,
"%f", &floatDummy);
727 if (floatDummy > 0.0)
728 pblEnd += floatDummy;
731 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Found non-positive PBL12 END");
735 free (classification);
737 fclose (inFitsBatchPtr);
743 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Found non-float PBL12 END");
747 free (classification);
749 fclose (inFitsBatchPtr);
755 qfitsString = qfits_query_ext (fileNameStr,
"HIERARCH ESO ISS PARANG START", 0);
756 if (qfitsString == NULL)
758 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get PARANG START");
762 free (classification);
764 fclose (inFitsBatchPtr);
769 cleanUpString (qfitsString, cleanString);
770 if (qfits_is_float (cleanString))
772 sscanf(cleanString,
"%f", &floatDummy);
774 parangStart += floatDummy;
789 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Found non-float PARANG START in");
793 free (classification);
795 fclose (inFitsBatchPtr);
801 qfitsString = qfits_query_ext (fileNameStr,
"HIERARCH ESO ISS PARANG END", 0);
802 if (qfitsString == NULL)
804 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get PARANG END");
808 free (classification);
810 fclose (inFitsBatchPtr);
815 cleanUpString (qfitsString, cleanString);
816 if (qfits_is_float (cleanString))
818 sscanf(cleanString,
"%f", &floatDummy);
820 parangEnd += floatDummy;
835 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Found non-float PARANG END");
839 free (classification);
841 fclose (inFitsBatchPtr);
852 calibrator->calibPblAverage = 0.5 * (pblStart + pblEnd);
853 parangStart /= fileNum;
854 parangEnd /= fileNum;
855 calibrator->calibParangAverage = 0.5 * (parangStart + parangEnd);
857 cpl_msg_info(cpl_func,
"Observed Calibrator = %s \n", calibrator->calibName);
858 cpl_msg_info(cpl_func,
"Observed Calibrator RA = %f radians \n", calibrator->calibRA);
859 cpl_msg_info(cpl_func,
"Observed Calibrator DEC = %f radians \n", calibrator->calibDEC);
860 cpl_msg_info(cpl_func,
"Observed Calibrator Average PBL = %f metres \n", calibrator->calibPblAverage);
861 cpl_msg_info(cpl_func,
"Observed Calibrator Average PARANG = %f degrees \n", calibrator->calibParangAverage);
862 fprintf (midiReportPtr,
"Observed Calibrator = %s (QCLOG)\n", calibrator->calibName);
863 fprintf (midiReportPtr,
"Observed Calibrator RA = %f radians (QCLOG)\n", calibrator->calibRA);
864 fprintf (midiReportPtr,
"Observed Calibrator DEC = %f radians (QCLOG)\n", calibrator->calibDEC);
865 fprintf (midiReportPtr,
"Observed Calibrator Average PBL = %f metres (QCLOG)\n", calibrator->calibPblAverage);
866 fprintf (midiReportPtr,
"Observed Calibrator Average PARANG = %f degrees (QCLOG)\n", calibrator->calibParangAverage);
869 getCalibratorDiameter (fileNames, calibrator, error, parlist, frameset);
872 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot get Calibrator Diameter");
875 free (classification);
877 fclose (inFitsBatchPtr);
883 fclose (inFitsBatchPtr);
885 free (classification);
907 void getCalibratorDiameter (
908 MidiFiles *fileNames,
909 CalibratorParam *calibrator,
911 cpl_parameterlist *parlist,
912 cpl_frameset *frameset)
917 const char routine[] =
"getCalibratorDiameter";
919 double searchRA, searchDEC, diffAngle;
921 cpl_errorstate prestate = cpl_errorstate_get();
923 cpl_frame * cur_frame;
930 double * secondRA=NULL;
932 int * degreeDEC=NULL;
933 int * minuteDEC=NULL;
934 double * secondDEC=NULL;
937 double * diameter=NULL;
938 double * diameterErr=NULL;
940 int ext_calibrator_data=0;
941 int dimen_calibrator_data=0;
948 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
949 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
953 cur_frame = cpl_frameset_get_first(frameset);
954 if (cur_frame == NULL) {
955 cpl_msg_error(cpl_func,
"No frame found in the SOF");
965 tag = (
char*)cpl_frame_get_tag(cur_frame);
966 if (strcmp(tag, MIDI_CALIB_DATABASE)) {
967 cur_frame = cpl_frameset_get_next( frameset );
971 cpl_msg_info(cpl_func,
"Calibrator database found in the SOF: %s",cpl_frame_get_filename(cur_frame));
976 if (strcmp(tag, MIDI_CALIB_DATABASE)) {
977 cpl_msg_warning(cpl_func,
"No calibrator database file found in the SOF!");
978 cpl_msg_warning(cpl_func,
"Transfer function can not be calculated!");
986 prestate = cpl_errorstate_get();
988 cpl_msg_info(cpl_func,
"Reading %s",cpl_frame_get_filename(cur_frame));
990 ext_calibrator_data=cpl_fits_find_extension(cpl_frame_get_filename(cur_frame),
"CALIBRATOR_DATA");
993 if((table = cpl_table_load(cpl_frame_get_filename(cur_frame), ext_calibrator_data, 1))==NULL)
995 cpl_msg_info(cpl_func,
"No siutable table found in the file: %s",cpl_frame_get_filename(cur_frame));
996 cpl_msg_warning(cpl_func,
"Transfer function can not be calculated!");
997 cpl_errorstate_set(prestate);
1003 if (cpl_table_has_column(table,
"Name" )) {Name =cpl_table_get_data_string(table,
"Name" );}
else {cpl_msg_warning(cpl_func,
"Entry not found: Name" );*error = 1;};
1004 if (cpl_table_has_column(table,
"hourRA" )) {hourRA =cpl_table_get_data_int (table,
"hourRA" );}
else {cpl_msg_warning(cpl_func,
"Entry not found: hourRA" );*error = 1;};
1005 if (cpl_table_has_column(table,
"minuteRA" )) {minuteRA =cpl_table_get_data_int (table,
"minuteRA" );}
else {cpl_msg_warning(cpl_func,
"Entry not found: minuteRA" );*error = 1;};
1006 if (cpl_table_has_column(table,
"secondRA" )) {secondRA =cpl_table_get_data_double (table,
"secondRA" );}
else {cpl_msg_warning(cpl_func,
"Entry not found: secondRA" );*error = 1;};
1007 if (cpl_table_has_column(table,
"signDEC" )) {signDEC =cpl_table_get_data_int (table,
"signDEC" );}
else {cpl_msg_warning(cpl_func,
"Entry not found: signDEC" );*error = 1;};
1008 if (cpl_table_has_column(table,
"degreeDEC" )) {degreeDEC =cpl_table_get_data_int (table,
"degreeDEC" );}
else {cpl_msg_warning(cpl_func,
"Entry not found: degreeDEC" );*error = 1;};
1009 if (cpl_table_has_column(table,
"minuteDEC" )) {minuteDEC =cpl_table_get_data_int (table,
"minuteDEC" );}
else {cpl_msg_warning(cpl_func,
"Entry not found: minuteDEC" );*error = 1;};
1010 if (cpl_table_has_column(table,
"secondDEC" )) {secondDEC =cpl_table_get_data_double (table,
"secondDEC" );}
else {cpl_msg_warning(cpl_func,
"Entry not found: secondDEC" );*error = 1;};
1011 if (cpl_table_has_column(table,
"N_band" )) {flux =cpl_table_get_data_double(table,
"N_band" );}
else {cpl_msg_warning(cpl_func,
"Entry not found: N_band" );*error = 1;};
1012 if (cpl_table_has_column(table,
"flag" )) {flag =cpl_table_get_data_int (table,
"flag" );}
else {cpl_msg_warning(cpl_func,
"Entry not found: flag" );*error = 1;};
1013 if (cpl_table_has_column(table,
"diameter" )) {diameter =cpl_table_get_data_double (table,
"diameter" );}
else {cpl_msg_warning(cpl_func,
"Entry not found: diameter" );*error = 1;};
1014 if (cpl_table_has_column(table,
"diameterErr")) {diameterErr=cpl_table_get_data_double (table,
"diameterErr");}
else {cpl_msg_warning(cpl_func,
"Entry not found: diameterErr");*error = 1;};
1016 dimen_calibrator_data=cpl_table_get_nrow(table);
1018 cpl_msg_info(cpl_func,
"Total number of Calibrators in the table: %d", dimen_calibrator_data);
1020 calibrator->calibDistance =FLT_MAX;
1023 for (i=0; i<dimen_calibrator_data;i++)
1026 searchRA = HOUR_TO_RAD * ((double) hourRA[i] + minuteRA[i]/60.0 + secondRA[i]/3600.0);
1027 searchDEC = DEG_TO_RAD * (((double) degreeDEC[i] + minuteDEC[i]/60.0 + secondDEC[i]/3600.0) * signDEC[i]);
1028 diffAngle = acos ( sin(searchDEC) * sin(calibrator->calibDEC) +
1029 cos(searchDEC) * cos(calibrator->calibDEC) * cos(searchRA - calibrator->calibRA) );
1032 if (diffAngle < calibrator->calibDistance)
1034 calibrator->calibDistance = (float)diffAngle;
1035 calibrator->calibDiameter = (float)diameter[i];
1036 calibrator->calibDiameterErr = (float)diameterErr[i];
1037 strcpy (calibrator->calibName, Name[i]);
1038 calibrator->calibFlux = flux[i];
1039 calibrator->calibFlag = flag[i];
1047 if (calibrator->calibDistance <= CALIBRATOR_MIN_THRESHOLD)
1049 cpl_msg_info(cpl_func,
"Closest Calibrator in the database = %s \n", calibrator->calibName);
1050 cpl_msg_info(cpl_func,
"Calibrator Diameter = %f marcsec \n", calibrator->calibDiameter);
1051 cpl_msg_info(cpl_func,
"Calibrator Diameter error = %f marcsec \n", calibrator->calibDiameterErr);
1052 cpl_msg_info(cpl_func,
"Computed Distance to Observed Calibrator = %f arcsec \n", RAD_TO_ARCSEC * calibrator->calibDistance);
1053 cpl_msg_info(cpl_func,
"Calibrator Flux in the N-Band = %g mag \n", calibrator->calibFlux);
1054 cpl_msg_info(cpl_func,
"Calibrator quality flag = %d \n", calibrator->calibFlag);
1056 fprintf (midiReportPtr,
"Closest Calibrator in the database = %s (QCLOG)\n", calibrator->calibName);
1057 fprintf (midiReportPtr,
"Calibrator Diameter = %f marcsec (QCLOG)\n", calibrator->calibDiameter);
1058 fprintf (midiReportPtr,
"Calibrator Diameter error = %f marcsec (QCLOG)\n", calibrator->calibDiameterErr);
1059 fprintf (midiReportPtr,
"Computed Distance to Observed Calibrator = %f arcsec (QCLOG)\n", RAD_TO_ARCSEC * calibrator->calibDistance);
1060 fprintf (midiReportPtr,
"Calibrator Flux in the N-Band = %g mag (QCLOG)\n", calibrator->calibFlux);
1061 fprintf (midiReportPtr,
"Calibrator quality flag = %d (QCLOG)\n", calibrator->calibFlag);
1065 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"Cannot find a close match in the database");
1070 if(table !=NULL) cpl_table_delete(table);
1247 void computeExpectedVis (
1248 CalibratorParam *calibrator,
1253 const char routine[] =
"computeExpectedVis";
1254 double besselK1o1, besselK1o1Err, xArg, xArgErr;
1258 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1259 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
1266 xArg = (double) (MIDI_PI * DIAMETER_FACTOR * calibrator->calibDiameter * calibrator->calibPblAverage * INVERSE_WAVELENGTH);
1267 xArgErr = (double) (MIDI_PI * DIAMETER_FACTOR * calibrator->calibDiameterErr * calibrator->calibPblAverage * INVERSE_WAVELENGTH);
1268 besselK1o1 = computeBesselK1o1 (xArg, xArgErr, &besselK1o1Err);
1271 calibrator->calibVis = (float) (2.0 * (besselK1o1 / xArg));
1272 calibrator->calibVisSqrd = calibrator->calibVis * calibrator->calibVis;
1275 calibrator->calibVisErr = (float) (2.0 * (besselK1o1Err/fabs(xArg) + xArgErr * (fabs(besselK1o1)/(xArg * xArg))));
1276 calibrator->calibVisSqrdErr = 2.0 * (calibrator->calibVisErr * fabs (calibrator->calibVis));
1278 cpl_msg_info(cpl_func,
"Expected Visibility = %f \n", calibrator->calibVis);
1279 cpl_msg_info(cpl_func,
"Expected Visibility Error = %f \n", calibrator->calibVisErr);
1280 cpl_msg_info(cpl_func,
"Expected Squared Visibility = %f \n", calibrator->calibVisSqrd);
1281 cpl_msg_info(cpl_func,
"Expected Squared Visibility Error = %f \n", calibrator->calibVisSqrdErr);
1282 fprintf (midiReportPtr,
"Expected Visibility = %f (QCLOG)\n", calibrator->calibVis);
1283 fprintf (midiReportPtr,
"Expected Visibility Error = %f (QCLOG)\n", calibrator->calibVisErr);
1284 fprintf (midiReportPtr,
"Expected Squared Visibility = %f (QCLOG)\n", calibrator->calibVisSqrd);
1285 fprintf (midiReportPtr,
"Expected Squared Visibility Error = %f (QCLOG)\n", calibrator->calibVisSqrdErr);
1305 double computeBesselK1o1 (
1308 double *besselK1o1Err)
1312 const char routine[] =
"computeBesselK1o1";
1316 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s' \n", routine);
1317 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s' \n", routine);
1321 0.062500000000 * xArgErr * fabs (3.0 * xArg * xArg) +
1322 0.002604166666 * xArgErr * fabs (5.0 * xArg * xArg * xArg * xArg) +
1323 0.000054253472 * xArgErr * fabs (7.0 * xArg * xArg * xArg * xArg * xArg * xArg));
1327 0.062500000000 * xArg * xArg * xArg +
1328 0.002604166666 * xArg * xArg * xArg * xArg * xArg -
1329 0.000054253472 * xArg * xArg * xArg * xArg * xArg * xArg * xArg);
1357 void computeBinnedTrf (
1358 ImageFormat *format,
1359 DispersedResult *dispResult,
1365 const char routine[] =
"computeBinnedTrf";
1370 cpl_msg_info(cpl_func,
"\nBinned Transfer Function for batch %d \n", batchNumber);
1371 cpl_msg_info(cpl_func,
"------------------------------------------ \n");
1372 fprintf (midiReportPtr,
"\nBinned Transfer Function for batch %d QCLOG \n", batchNumber);
1373 fprintf (midiReportPtr,
"------------------------------------------ QCLOG \n");
1379 dispResult->trfBinned1 = 0.0;
1380 dispResult->trfBinned2 = 0.0;
1381 dispResult->trfBinned3 = 0.0;
1382 dispResult->trfBinned4 = 0.0;
1383 dispResult->trfBinned5 = 0.0;
1385 if (strcmp(format->grismId,
"PRISM") == 0)
1388 for (i = 36; i < 51; i++)
1390 if (badChannelList[i])
1393 dispResult->trfBinned5 += (dispResult->trf)[i];
1397 dispResult->trfBinned5 /= n;
1400 dispResult->trfBinned5= -1.;
1404 for (i = 60; i < 73; i++)
1406 if (badChannelList[i])
1409 dispResult->trfBinned4 += (dispResult->trf)[i];
1413 dispResult->trfBinned4 /= n;
1416 dispResult->trfBinned4= -1.;
1420 for (i = 88; i < 99; i++)
1422 if (badChannelList[i])
1425 dispResult->trfBinned3 += (dispResult->trf)[i];
1429 dispResult->trfBinned3 /= n;
1432 dispResult->trfBinned3= -1.;
1436 for (i = 113; i < 122; i++)
1438 if (badChannelList[i])
1441 dispResult->trfBinned2 += (dispResult->trf)[i];
1445 dispResult->trfBinned2 /= n;
1448 dispResult->trfBinned2= -1.;
1452 for (i = 120; i < 127; i++)
1454 if (badChannelList[i])
1457 dispResult->trfBinned1 += (dispResult->trf)[i];
1462 dispResult->trfBinned1 /= n;
1465 dispResult->trfBinned1= -1.;
1468 else if (strcmp(format->grismId,
"GRISM") == 0)
1471 for (i = 38; i < 51; i++)
1473 if (badChannelList[i])
1476 dispResult->trfBinned1 += (dispResult->trf)[i];
1480 dispResult->trfBinned1 /= n;
1483 dispResult->trfBinned1= -1.;
1487 for (i = 52; i < 69; i++)
1489 if (badChannelList[i])
1492 dispResult->trfBinned2 += (dispResult->trf)[i];
1496 dispResult->trfBinned2 /= n;
1499 dispResult->trfBinned2= -1.;
1503 for (i = 116; i < 137; i++)
1505 if (badChannelList[i])
1508 dispResult->trfBinned3 += (dispResult->trf)[i];
1512 dispResult->trfBinned3 /= n;
1515 dispResult->trfBinned3= -1.;
1519 for (i = 176; i < 201; i++)
1521 if (badChannelList[i])
1524 dispResult->trfBinned4 += (dispResult->trf)[i];
1528 dispResult->trfBinned4 /= n;
1531 dispResult->trfBinned4= -1.;
1535 for (i = 217; i < 246; i++)
1537 if (badChannelList[i])
1540 dispResult->trfBinned5 += (dispResult->trf)[i];
1544 dispResult->trfBinned5 /= n;
1547 dispResult->trfBinned5= -1.;
1552 sprintf (midiMessage,
"Unknown GRISM ID ... %s", format->grismId);
1553 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
1559 cpl_msg_info(cpl_func,
"Grism ID: %s \n", format->grismId);
1560 fprintf (midiReportPtr,
"Grism ID: %s QCLOG \n", format->grismId);
1561 if (strcmp(format->grismId,
"PRISM") == 0)
1563 cpl_msg_info(cpl_func,
" 8.64 micron (Channel 120 -> 126) = %0.4f \n", dispResult->trfBinned1);
1564 cpl_msg_info(cpl_func,
" 9.00 micron (Channel 113 -> 121) = %0.4f \n", dispResult->trfBinned2);
1565 cpl_msg_info(cpl_func,
"10.46 micron (Channel 88 -> 98) = %0.4f \n", dispResult->trfBinned3);
1566 cpl_msg_info(cpl_func,
"11.79 micron (Channel 60 -> 72) = %0.4f \n", dispResult->trfBinned4);
1567 cpl_msg_info(cpl_func,
"12.80 micron (Channel 36 -> 50) = %0.4f \n", dispResult->trfBinned5);
1569 fprintf (midiReportPtr,
" 8.64 micron (Channel 120 -> 126) = %0.4f QCLOG \n", dispResult->trfBinned1);
1570 fprintf (midiReportPtr,
" 9.00 micron (Channel 113 -> 121) = %0.4f QCLOG \n", dispResult->trfBinned2);
1571 fprintf (midiReportPtr,
"10.46 micron (Channel 88 -> 98) = %0.4f QCLOG \n", dispResult->trfBinned3);
1572 fprintf (midiReportPtr,
"11.79 micron (Channel 60 -> 72) = %0.4f QCLOG \n", dispResult->trfBinned4);
1573 fprintf (midiReportPtr,
"12.80 micron (Channel 36 -> 50) = %0.4f QCLOG \n", dispResult->trfBinned5);
1577 cpl_msg_info(cpl_func,
" 8.64 micron (Channel 38 -> 50) = %0.4f \n", dispResult->trfBinned1);
1578 cpl_msg_info(cpl_func,
" 9.00 micron (Channel 52 -> 68) = %0.4f \n", dispResult->trfBinned2);
1579 cpl_msg_info(cpl_func,
"10.46 micron (Channel 116 -> 136) = %0.4f \n", dispResult->trfBinned3);
1580 cpl_msg_info(cpl_func,
"11.79 micron (Channel 176 -> 200) = %0.4f \n", dispResult->trfBinned4);
1581 cpl_msg_info(cpl_func,
"12.80 micron (Channel 217 -> 245) = %0.4f \n", dispResult->trfBinned5);
1583 fprintf (midiReportPtr,
" 8.64 micron (Channel 38 -> 50) = %0.4f QCLOG \n", dispResult->trfBinned1);
1584 fprintf (midiReportPtr,
" 9.00 micron (Channel 52 -> 68) = %0.4f QCLOG \n", dispResult->trfBinned2);
1585 fprintf (midiReportPtr,
"10.46 micron (Channel 116 -> 136) = %0.4f QCLOG \n", dispResult->trfBinned3);
1586 fprintf (midiReportPtr,
"11.79 micron (Channel 176 -> 200) = %0.4f QCLOG \n", dispResult->trfBinned4);
1587 fprintf (midiReportPtr,
"12.80 micron (Channel 217 -> 245) = %0.4f QCLOG \n", dispResult->trfBinned5);
1598 From: Anders Wallander [awalland@eso.org]
1599 Sent: Wednesday, 12 July, 2006 10:46
1600 To: Isabelle Percheron
1601 Cc: tlicha@eso.org; csabet@eso.org; awalland@eso.org
1602 Subject: Re: VLTI header keyword ISS PBLAxy START/END
1604 Attachments: VLTSW20060066.PDF
1607 The keyword still represents the value of projected baseline at the beginning and end of integration.
1608 The format is the same, but the definition of projected baseline is different, hence a
new algorithm.
1609 Attached is the change request. The plan is to install
this at Paranal end of September.
1610 The point is that pipelines should not
break. I am waiting
for your comments on
this
1612 Below the 2 different algorithms (GIP is current, RMA is future) to compute PBLA.
1617 double pblaGIP (
double alt,
double az,
double T1[3],
double T2[3])
1620 vltDOUBLE star[] = {0.0, 0.0, 0.0};
1621 vltDOUBLE baseline[] = {0.0, 0.0, 0.0};
1622 vltDOUBLE projBaseline[] = {0.0, 0.0, 0.0};
1623 vltDOUBLE sidOpd = 0.0;
1624 vltDOUBLE cosAlt = 0.0;
1625 vltDOUBLE sinAlt = 0.0;
1626 vltDOUBLE cosAz = 0.0;
1627 vltDOUBLE sinAz = 0.0;
1631 cosAlt = cos(alt * DDEG2RAD);
1632 sinAlt = sin(alt * DDEG2RAD);
1633 cosAz = cos(az * DDEG2RAD);
1634 sinAz = sin(az * DDEG2RAD);
1636 star[0] = sinAz * cosAlt;
1637 star[1] = (- cosAz) * cosAlt;
1640 baseline[0] = T2[0] - T1[0];
1641 baseline[1] = T2[1] - T1[1];
1642 baseline[2] = T2[2] - T1[2];
1645 sidOpd = star[0] * baseline[0] + star[1] * baseline[1] + star[2] * baseline[2];
1647 projBaseline[0] = baseline[0] - sidOpd * star[0];
1648 projBaseline[1] = baseline[1] - sidOpd * star[1];
1649 projBaseline[2] = baseline[2] - sidOpd * star[2];
1651 gip = atan(projBaseline[0]/projBaseline[1]) * DRAD2DEG;
1658 double pblaRMA (
double alt,
double az,
double prltic,
double T1[3],
double T2[3])
1661 vltDOUBLE a, A, A_b, p;
1662 vltDOUBLE sinpsi, cospsi, psi;
1670 A = (360 - az) * DDEG2RAD;
1681 A_b = atan2( (T2[0] - T1[0]), (T2[1] - T1[1]) );
1692 sinpsi = sin(A_b - A);
1693 cospsi = cos(A_b - A) * sin(a);
1694 psi = atan2(sinpsi,cospsi);
1700 p = prltic * DDEG2RAD;
1706 rma = slaDranrm(p + psi + DPI) * DRAD2DEG;
1712 Isabelle Percheron wrote:
1715 I was checking with Cyrus about the uses of the keywords, the pipelines (MIDI
1716 and AMBER
for sure) read it and in the
case of MIDI uses it, I am stilll not
1717 sure
if AMBER pipeline just retrieves it or uses it
for other calculations, I
1718 guess they have to retrieve the baseline from somewhere maybe from the stations,
1721 So just to be sure, could you confirm
if this keyword will still represent the
1722 value of the projected baseline at the beginning of the integration and at the
1723 end. How is the format affected (still the same?). And last could you please
1724 tell us when
this is implemented on Paranal
for Cyrus to check.