00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #define NEW_PBL_x
00018
00019
00020
00021
00022 #include <sys/types.h>
00023 #include <sys/stat.h>
00024 #include <unistd.h>
00025 #include <stdio.h>
00026 #include <cpl.h>
00027 #include <string.h>
00028 #include <math.h>
00029 #include "midiGlobal.h"
00030 #include "midiLib.h"
00031 #include "qfits.h"
00032 #include "errorHandling.h"
00033 #include "diagnostics.h"
00034 #include "fileHandling.h"
00035 #include "transferFunction.h"
00036 #include "midi_dfs.h"
00037
00038
00039
00040
00041 #define START_MIDI_RECORD (173)
00042 #define END_MIDI_RECORD (620)
00043 #define CALIB_DB_LEN (30)
00044 #define UNWANTED_ELEMENTS (27)
00045 #define CALIBRATOR_MIN_THRESHOLD (0.000290888)
00046 #define DIAMETER_FACTOR (4.848136958e-9)
00047 #define INVERSE_WAVELENGTH (100000.0)
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 void estimateTransferFunction (
00079 ImageFormat *formatInterf,
00080 MidiFiles *fileNames,
00081 DispersedResult *dispResult,
00082 CalibratorParam *calibrator,
00083 int *error,
00084 cpl_parameterlist *parlist,
00085 cpl_frameset *frameset)
00086 {
00087
00088
00089
00090 const char routine[] = "estimateTransferFunction";
00091 FILE * trfPtr, *trfHistoryPtr;
00092 int X;
00093 struct stat buf;
00094 cpl_table * trftable=NULL;
00095 cpl_propertylist * qclist=NULL;
00096 char * dataname=NULL;
00097 char * system_call=NULL;
00098
00099
00100
00101
00102 if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
00103 if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
00104
00105 cpl_msg_info(cpl_func,"\nComputing Transfer Functions for batch %d \n", batchNumber);
00106 cpl_msg_info(cpl_func,"-------------------------------------- \n");
00107 fprintf (midiReportPtr, "\nComputing Transfer Functions for batch %d \n", batchNumber);
00108 fprintf (midiReportPtr, "-------------------------------------- \n");
00109
00110
00111 *error = 0;
00112 dispResult->trfExists = 0;
00113
00114
00115 if (stat (fileNames->trfNameWrite, &buf) == 0)
00116 remove (fileNames->trfNameWrite);
00117
00118 identifyCalibrator (fileNames, calibrator, error, parlist, frameset);
00119 if (*error)
00120 {
00121 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot identify Calibrator");
00122 return;
00123 }
00124
00125 computeExpectedVis (calibrator, error);
00126 if (*error)
00127 {
00128 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot compute Expected Visibilities");
00129 return;
00130 }
00131
00132
00133 if (calibrator->calibVis == 0 || calibrator->calibVisSqrd == 0)
00134 {
00135 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
00136 "A singularity encountered\n Cannot compute transfer functions");
00137 *error = 1;
00138 return;
00139 }
00140 else
00141 {
00142
00143 if ((trfPtr = fopen (fileNames->trfNameWrite, "w")) == NULL)
00144 {
00145 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open file to store transfer functions");
00146 *error = 1;
00147 return;
00148 }
00149
00150
00151 trfHistoryPtr = fopen (fileNames->trfHistoryName, "a");
00152 fprintf (trfHistoryPtr, "Transfer Functions (DISPERSED) for batch %d \n", batchNumber);
00153 fprintf (trfHistoryPtr, "---------------------------------------- \n");
00154 fprintf (trfHistoryPtr, "Grism ID = %s \n", formatInterf->grismId);
00155 fprintf (trfHistoryPtr, "Number of Valid Channels = %d \n", formatInterf->iXWidth);
00156
00157 if (diagnostic)cpl_msg_info(cpl_func,"Grism ID = %s \n", formatInterf->grismId);
00158 if (diagnostic)cpl_msg_info(cpl_func,"Number of Channels = %d \n", formatInterf->iXWidth);
00159
00160 fprintf (midiReportPtr, "\nTransfer Functions (DISPERSED) for batch %d QCLOG \n", batchNumber);
00161 fprintf (midiReportPtr, "---------------------------------------- QCLOG \n");
00162 fprintf (midiReportPtr, "Grism ID = %s QCLOG \n", formatInterf->grismId);
00163 fprintf (midiReportPtr, "Number of Valid Channels = %d QCLOG \n", formatInterf->iXWidth);
00164
00165 fprintf (trfPtr, "%s \n", formatInterf->grismId);
00166 fprintf (trfPtr, "%d \n", formatInterf->iXWidth);
00167
00168 for (X = 0; X < formatInterf->iXWidth; X++)
00169 {
00170 if (badChannelList[X])
00171 {
00172 if (diagnostic)cpl_msg_info(cpl_func,"%3d <-- %s --> \n", X, UNAV);
00173 fprintf (midiReportPtr, "%3d <-- %s --> QCLOG \n", X, UNAV);
00174 fprintf (trfHistoryPtr, "%3d <-- %s --> \n", X, UNAV);
00175 fprintf (trfPtr, "%f %f \n", (dispResult->trf)[X], (dispResult->trfErr)[X]);
00176 continue;
00177 }
00178
00179 dispResult->trf[X] = dispResult->normVis2[X] / calibrator->calibVis;
00180 dispResult->trfErr[X] = dispResult->normVis2Err[X] / (fabs (calibrator->calibVis)) +
00181 calibrator->calibVisErr * (fabs (dispResult->normVis2[X]) /
00182 (calibrator->calibVis * calibrator->calibVis));
00183
00184 if (diagnostic)cpl_msg_info(cpl_func,"%3d %f %f \n", X, (dispResult->trf)[X], (dispResult->trfErr)[X]);
00185 fprintf (midiReportPtr, "%3d %f %f QCLOG \n", X, (dispResult->trf)[X], (dispResult->trfErr)[X]);
00186 fprintf (trfHistoryPtr, "%3d %f %f \n", X, (dispResult->trf)[X], (dispResult->trfErr)[X]);
00187 fprintf (trfPtr, "%f %f \n", (dispResult->trf)[X], (dispResult->trfErr)[X]);
00188 }
00189
00190 fclose (trfPtr);
00191 fclose (trfHistoryPtr);
00192 if (diagnostic)cpl_msg_info(cpl_func,"Created Transfer Function file %s\n", fileNames->trfNameWrite);
00193 fprintf (midiReportPtr, "Created Transfer Function file %s\n", fileNames->trfNameWrite);
00194 dispResult->trfExists = 1;
00195
00196
00197
00198
00199 trftable=cpl_table_new(formatInterf->iXWidth);
00200 cpl_table_new_column(trftable,"CHANNEL",CPL_TYPE_INT);
00201 cpl_table_new_column(trftable,"TRF",CPL_TYPE_FLOAT);
00202 cpl_table_new_column(trftable,"TRF_ERROR",CPL_TYPE_FLOAT);
00203
00204 for (X = 0; X < formatInterf->iXWidth; X++)
00205 {
00206 cpl_table_set_int(trftable,"CHANNEL",X, X+1);
00207 cpl_table_set_float(trftable,"TRF",X, (dispResult->trf)[X]);
00208 cpl_table_set_float(trftable,"TRF_ERROR",X, (dispResult->trfErr)[X]);
00209 if (badChannelList[X])
00210 {
00211 cpl_table_set_invalid(trftable, "TRF", X);
00212 cpl_table_set_invalid(trftable, "TRF_ERROR", X);
00213 }
00214 }
00215
00216
00217
00218
00219 qclist=cpl_propertylist_new();
00220
00221 if (strcmp(formatInterf->grismId,"GRISM")==0) {
00222 cpl_propertylist_update_string(qclist, CPL_DFS_PRO_CATG, "TRF_GRISM");
00223 dataname=cpl_sprintf("MIDI_trf_grism.fits");
00224 }
00225 if (strcmp(formatInterf->grismId,"PRISM")==0) {
00226 cpl_propertylist_update_string(qclist, CPL_DFS_PRO_CATG, "TRF_PRISM");
00227 dataname=cpl_sprintf("MIDI_trf_prism.fits");
00228 }
00229 cpl_propertylist_append_string(qclist, "EXTNAME", "TRANSFER_FUNCTION");
00230
00231
00232 cpl_propertylist_update_float(qclist, "ESO QC OBS CAL RA" , calibrator->calibRA);
00233 cpl_propertylist_update_float(qclist, "ESO QC OBS CAL DEC" , calibrator->calibDEC);
00234 cpl_propertylist_update_float(qclist, "ESO QC OBS AVR PBL " , calibrator->calibPblAverage);
00235 cpl_propertylist_update_float(qclist, "ESO QC OBS AVR PARANG" , calibrator->calibParangAverage);
00236 cpl_propertylist_update_string(qclist, "ESO QC DB NAME" , calibrator->calibName);
00237 cpl_propertylist_update_float(qclist, "ESO QC DB DIAM" , calibrator->calibDiameter);
00238 cpl_propertylist_update_float(qclist, "ESO QC DB DIAM ERR " , calibrator->calibDiameterErr);
00239 cpl_propertylist_update_float(qclist, "ESO QC DB DIST" , RAD_TO_ARCSEC * calibrator->calibDistance);
00240 cpl_propertylist_update_double(qclist, "ESO QC DB MAG NBAND" , calibrator->calibFlux);
00241 cpl_propertylist_update_int (qclist, "ESO QC DB FLAG" , calibrator->calibFlag);
00242 cpl_propertylist_update_float(qclist, "ESO QC EXP VIS" , calibrator->calibVis);
00243 cpl_propertylist_update_float(qclist, "ESO QC EXP VIS ERR" , calibrator->calibVisErr);
00244 cpl_propertylist_update_float(qclist, "ESO QC EXP VIS2" , calibrator->calibVisSqrd);
00245 cpl_propertylist_update_float(qclist, "ESO QC EXP VIS2 ERR" , calibrator->calibVisSqrdErr);
00246
00247 cpl_propertylist_set_comment (qclist, "ESO QC OBS CAL RA" , "Observed Calibrator RA in radians");
00248 cpl_propertylist_set_comment (qclist, "ESO QC OBS CAL DEC" , "Observed Calibrator DEC in radians");
00249 cpl_propertylist_set_comment (qclist, "ESO QC OBS AVR PBL " , "Observed Calibrator Average PBL in meter");
00250 cpl_propertylist_set_comment (qclist, "ESO QC OBS AVR PARANG" , "Observed Calibrator Average PARANG in degrees");
00251 cpl_propertylist_set_comment (qclist, "ESO QC DB NAME" , "Closest Calibrator in the database");
00252 cpl_propertylist_set_comment (qclist, "ESO QC DB DIAM" , "Calibrator Diameter in marcsec");
00253 cpl_propertylist_set_comment (qclist, "ESO QC DB DIAM ERR " , "Calibrator Diameter error in marcsec");
00254 cpl_propertylist_set_comment (qclist, "ESO QC DB DIST" , "Computed Distance to Observed Calibrator in arcsec");
00255 cpl_propertylist_set_comment (qclist, "ESO QC DB MAG NBAND" , "Calibrator Magnitude in the N-Band");
00256 cpl_propertylist_set_comment (qclist, "ESO QC DB FLAG" , "Calibrator Quality Flag");
00257 cpl_propertylist_set_comment (qclist, "ESO QC EXP VIS" , "Expected Visibility");
00258 cpl_propertylist_set_comment (qclist, "ESO QC EXP VIS ERR" , "Expected Visibility Error");
00259 cpl_propertylist_set_comment (qclist, "ESO QC EXP VIS2" , "Expected Squared Visibility");
00260 cpl_propertylist_set_comment (qclist, "ESO QC EXP VIS2 ERR" , "Expected Squared Visibility Error");
00261
00262
00263 cpl_dfs_save_table(frameset, NULL, parlist, frameset, NULL, trftable,
00264 qclist, "midi_fringe_all",
00265 qclist, NULL,
00266 PACKAGE "/" PACKAGE_VERSION,
00267 dataname);
00268
00269
00270
00271
00272 system_call=cpl_sprintf("cp %s /tmp/MIDI_trf.fits", dataname);
00273 cpl_msg_info(cpl_func, "Copying the file into the tmp directory ...");
00274 cpl_msg_info(cpl_func,system_call);
00275 system(system_call);
00276
00277 cpl_table_delete(trftable);
00278 cpl_propertylist_delete(qclist);
00279 cpl_free(dataname);
00280 cpl_free(system_call);
00281
00282
00283
00284
00285
00286
00287 computeBinnedTrf (formatInterf, dispResult, error);
00288 if (*error)
00289 {
00290 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot compute Binned Transfer Function");
00291 return;
00292 }
00293
00294
00295 }
00296
00297
00298
00299
00300 if (plotFile && diagnostic)
00301 {
00302 midiCreatePlotFile2D ("TransferFunctionConbined", "Combined Transfer Function",
00303 "Channel", "Transfer Function", 0, dispResult->trf, 0, formatInterf->iXWidth, 1, 0);
00304
00305 midiCreatePlotFile2D ("TransferFunctionErrConbined", "Combined Transfer Function",
00306 "Channel", "Transfer Function Error", 0, dispResult->trfErr, 0, formatInterf->iXWidth, 1, 0);
00307 }
00308
00309 return;
00310 }
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343 void estimateTransferFunctionUndisp (
00344 MidiFiles *fileNames,
00345 RawVisibility *measVis,
00346 TransferFunction *trf,
00347 CalibratorParam *calibrator,
00348 int *error,
00349 cpl_parameterlist *parlist,
00350 cpl_frameset *frameset)
00351 {
00352
00353
00354
00355 const char routine[] = "estimateTransferFunctionUndisp";
00356 FILE *trfPtr;
00357 int i;
00358 FILE *trfHistoryPtr;
00359 struct stat buf;
00360
00361
00362
00363 if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
00364 if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
00365
00366 cpl_msg_info(cpl_func,"\nComputing Transfer Functions for batch %d \n", batchNumber);
00367 cpl_msg_info(cpl_func,"-------------------------------------- \n");
00368 fprintf (midiReportPtr, "\nComputing Transfer Functions for batch %d \n", batchNumber);
00369 fprintf (midiReportPtr, "-------------------------------------- \n");
00370
00371
00372 *error = 0;
00373 trf->exists = 0;
00374
00375
00376 if (stat (fileNames->trfNameWrite, &buf) == 0)
00377 remove (fileNames->trfNameWrite);
00378
00379 identifyCalibrator (fileNames, calibrator, error, parlist, frameset);
00380 if (*error)
00381 {
00382 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot identify Calibrator");
00383 return;
00384 }
00385
00386 computeExpectedVis (calibrator, error);
00387 if (*error)
00388 {
00389 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot compute Expected Visibilities");
00390 return;
00391 }
00392
00393
00394 if (calibrator->calibVis == 0 || calibrator->calibVisSqrd == 0)
00395 {
00396 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
00397 "A singularity encountered. Cannot compute transfer functions");
00398 *error = 1;
00399 return;
00400 }
00401 else
00402 {
00403 trf->trf[0] = measVis->vis / calibrator->calibVis;
00404 trf->trfErr[0] = measVis->visErr / (fabs (calibrator->calibVis)) +
00405 calibrator->calibVisErr * (fabs (measVis->vis) / (calibrator->calibVis * calibrator->calibVis));
00406
00407 trf->trf[1] = measVis->vis1 / calibrator->calibVis;
00408 trf->trfErr[1] = measVis->vis1Err / (fabs (calibrator->calibVis)) +
00409 calibrator->calibVisErr * (fabs (measVis->vis1) / (calibrator->calibVis * calibrator->calibVis));
00410
00411 trf->trf[2] = measVis->vis2 / calibrator->calibVis;
00412 trf->trfErr[2] = measVis->vis2Err / (fabs (calibrator->calibVis)) +
00413 calibrator->calibVisErr * (fabs (measVis->vis2) / (calibrator->calibVis * calibrator->calibVis));
00414
00415 trf->trf[3] = measVis->visSqrd / calibrator->calibVisSqrd;
00416 trf->trfErr[3] = measVis->visSqrdErr / (fabs (calibrator->calibVisSqrd)) +
00417 calibrator->calibVisSqrdErr * (fabs (measVis->visSqrd) / (calibrator->calibVisSqrd * calibrator->calibVisSqrd));
00418
00419 trf->trf[4] = measVis->visSqrd1 / calibrator->calibVisSqrd;
00420 trf->trfErr[4] = measVis->visSqrd1Err / (fabs (calibrator->calibVisSqrd)) +
00421 calibrator->calibVisSqrdErr * (fabs (measVis->visSqrd1) / (calibrator->calibVisSqrd * calibrator->calibVisSqrd));
00422
00423 trf->trf[5] = measVis->visSqrd2 / calibrator->calibVisSqrd;
00424 trf->trfErr[5] = measVis->visSqrd2Err / (fabs (calibrator->calibVisSqrd)) +
00425 calibrator->calibVisSqrdErr * (fabs (measVis->visSqrd2) / (calibrator->calibVisSqrd * calibrator->calibVisSqrd));
00426 }
00427
00428
00429 if ((trfPtr = fopen (fileNames->trfNameWrite, "w")) == NULL)
00430 {
00431 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open file to store transfer functions");
00432 *error = 1;
00433 return;
00434 }
00435 else
00436 {
00437 cpl_msg_info(cpl_func,"Transfer Function region 0 = %f \n", trf->trf[0]);
00438 cpl_msg_info(cpl_func,"Transfer Function region 0 Error = %f \n", trf->trfErr[0]);
00439 cpl_msg_info(cpl_func,"Transfer Function region 1 = %f \n", trf->trf[1]);
00440 cpl_msg_info(cpl_func,"Transfer Function region 1 Error = %f \n", trf->trfErr[1]);
00441 cpl_msg_info(cpl_func,"Transfer Function region 2 = %f \n", trf->trf[2]);
00442 cpl_msg_info(cpl_func,"Transfer Function region 2 Error = %f \n", trf->trfErr[2]);
00443 cpl_msg_info(cpl_func,"Transfer Function Squared region 0 = %f \n", trf->trf[3]);
00444 cpl_msg_info(cpl_func,"Transfer Function Squared region 0 Error = %f \n", trf->trfErr[3]);
00445 cpl_msg_info(cpl_func,"Transfer Function Squared region 1 = %f \n", trf->trf[4]);
00446 cpl_msg_info(cpl_func,"Transfer Function Squared region 1 Error = %f \n", trf->trfErr[4]);
00447 cpl_msg_info(cpl_func,"Transfer Function Squared region 2 = %f \n", trf->trf[5]);
00448 cpl_msg_info(cpl_func,"Transfer Function Squared region 2 Error = %f \n", trf->trfErr[5]);
00449 fprintf (midiReportPtr, "Transfer Function region 0 = %f (QCLOG)\n", trf->trf[0]);
00450 fprintf (midiReportPtr, "Transfer Function region 0 Error = %f (QCLOG)\n", trf->trfErr[0]);
00451 fprintf (midiReportPtr, "Transfer Function region 1 = %f (QCLOG)\n", trf->trf[1]);
00452 fprintf (midiReportPtr, "Transfer Function region 1 Error = %f (QCLOG)\n", trf->trfErr[1]);
00453 fprintf (midiReportPtr, "Transfer Function region 2 = %f (QCLOG)\n", trf->trf[2]);
00454 fprintf (midiReportPtr, "Transfer Function region 2 Error = %f (QCLOG)\n", trf->trfErr[2]);
00455 fprintf (midiReportPtr, "Transfer Function Squared region 0 = %f (QCLOG)\n", trf->trf[3]);
00456 fprintf (midiReportPtr, "Transfer Function Squared region 0 Error = %f (QCLOG)\n", trf->trfErr[3]);
00457 fprintf (midiReportPtr, "Transfer Function Squared region 1 = %f (QCLOG)\n", trf->trf[4]);
00458 fprintf (midiReportPtr, "Transfer Function Squared region 1 Error = %f (QCLOG)\n", trf->trfErr[4]);
00459 fprintf (midiReportPtr, "Transfer Function Squared region 2 = %f (QCLOG)\n", trf->trf[5]);
00460 fprintf (midiReportPtr, "Transfer Function Squared region 2 Error = %f (QCLOG)\n", trf->trfErr[5]);
00461
00462
00463 for (i = 0; i < 6; i++)
00464 {
00465 fprintf (trfPtr, "%f\n", trf->trf[i]);
00466 fprintf (trfPtr, "%f\n", trf->trfErr[i]);
00467 }
00468 fclose (trfPtr);
00469 if (diagnostic)cpl_msg_info(cpl_func,"Created Transfer Function file %s\n", fileNames->trfNameWrite);
00470 fprintf (midiReportPtr, "Created Transfer Function file %s\n", fileNames->trfNameWrite);
00471 trf->exists = 1;
00472 }
00473
00474
00475 trfHistoryPtr = fopen (fileNames->trfHistoryName, "a");
00476 fprintf (trfHistoryPtr, "Transfer Functions (UNDISPERSED) Batch %d \n", batchNumber);
00477 fprintf (trfHistoryPtr, "-------------------------------------- \n");
00478 for (i = 0; i < 6; i++) fprintf (trfHistoryPtr, "%f %f \n", trf->trf[i], trf->trfErr[i]);
00479 fprintf (trfHistoryPtr, "\n");
00480 fclose (trfHistoryPtr);
00481
00482 return;
00483 }
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498 void identifyCalibrator (
00499 MidiFiles *fileNames,
00500 CalibratorParam *calibrator,
00501 int *error,
00502 cpl_parameterlist *parlist,
00503 cpl_frameset *frameset)
00504 {
00505
00506
00507
00508 const char routine[] = "identifyCalibrator";
00509 char *fileNameStr, *qfitsString, *cleanString, *stringTemp, *classification;
00510 int fileNum;
00511 float floatDummy, pblStart, pblEnd, parangStart, parangEnd;
00512 FILE *inFitsBatchPtr = NULL;
00513
00514
00515
00516 if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
00517 if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
00518
00519
00520 *error = 0;
00521 pblStart = 0.0;
00522 pblEnd = 0.0;
00523 parangStart = 0.0;
00524 parangEnd = 0.0;
00525 fileNum = 0;
00526
00527
00528 classification = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00529 stringTemp = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00530 cleanString = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00531 fileNameStr = (char *) calloc (MAX_STRING_LENGTH, sizeof (char));
00532
00533
00534 if ((inFitsBatchPtr = fopen (fileNames->inFitsBatch, "r")) == NULL)
00535 {
00536 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot open input FITS file list");
00537 free (cleanString);
00538 free (fileNameStr);
00539 free (classification);
00540 free (stringTemp);
00541 *error = 1;
00542 return;
00543 }
00544
00545
00546 while (fgets (stringTemp, MAX_STRING_LENGTH, inFitsBatchPtr) != NULL)
00547 {
00548 sprintf (classification, "%s", "");
00549 sscanf (stringTemp, "%s%s", fileNameStr, classification);
00550
00551
00552 qfitsString = qfits_query_ext (fileNameStr, "HIERARCH ESO DPR TYPE", 0);
00553 if (qfitsString == NULL)
00554 {
00555 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get DPR TYPE from");
00556 *error = 1;
00557 free (cleanString);
00558 free (fileNameStr);
00559 free (classification);
00560 free (stringTemp);
00561 fclose (inFitsBatchPtr);
00562 return;
00563 }
00564 else
00565 {
00566 cleanUpString (qfitsString, cleanString);
00567 if (strcmp (cleanString, "OTHER") != 0)
00568 {
00569 fileNum++;
00570
00571
00572 if (fileNum == 1)
00573 {
00574
00575 qfitsString = qfits_query_ext (fileNameStr, "RA", 0);
00576 if (qfitsString == NULL)
00577 {
00578 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get RA from");
00579 *error = 1;
00580 free (cleanString);
00581 free (fileNameStr);
00582 free (classification);
00583 free (stringTemp);
00584 fclose (inFitsBatchPtr);
00585 return;
00586 }
00587 else
00588 {
00589 cleanUpString (qfitsString, cleanString);
00590 if (qfits_is_float (cleanString))
00591 {
00592 sscanf(cleanString, "%f", &(calibrator->calibRA));
00593 calibrator->calibRA *= DEG_TO_RAD;
00594 }
00595 else
00596 {
00597 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Found non-float RA");
00598 *error = 1;
00599 free (cleanString);
00600 free (fileNameStr);
00601 free (classification);
00602 free (stringTemp);
00603 fclose (inFitsBatchPtr);
00604 return;
00605 }
00606 }
00607
00608
00609 qfitsString = qfits_query_ext (fileNameStr, "DEC", 0);
00610 if (qfitsString == NULL)
00611 {
00612 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get DEC");
00613 *error = 1;
00614 free (cleanString);
00615 free (fileNameStr);
00616 free (classification);
00617 free (stringTemp);
00618 fclose (inFitsBatchPtr);
00619 return;
00620 }
00621 else
00622 {
00623 cleanUpString (qfitsString, cleanString);
00624 if (qfits_is_float (cleanString))
00625 {
00626 sscanf(cleanString, "%f", &(calibrator->calibDEC));
00627 calibrator->calibDEC *= DEG_TO_RAD;
00628 }
00629 else
00630 {
00631 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Found non-float DEC");
00632 *error = 1;
00633 free (cleanString);
00634 free (fileNameStr);
00635 free (classification);
00636 free (stringTemp);
00637 fclose (inFitsBatchPtr);
00638 return;
00639 }
00640 }
00641
00642
00643 qfitsString = qfits_query_ext (fileNameStr, "HIERARCH ESO OBS TARG NAME", 0);
00644 if (qfitsString == NULL)
00645 {
00646 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get target name");
00647 *error = 1;
00648 free (cleanString);
00649 free (fileNameStr);
00650 free (classification);
00651 free (stringTemp);
00652 fclose (inFitsBatchPtr);
00653 return;
00654 }
00655 else
00656 {
00657 cleanUpString (qfitsString, cleanString);
00658 sscanf (cleanString, "%s", calibrator->calibName);
00659 }
00660 }
00661
00662
00663 qfitsString = qfits_query_ext (fileNameStr, "HIERARCH ESO ISS PBL12 START", 0);
00664 if (qfitsString == NULL)
00665 {
00666 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get PBL12 START");
00667 *error = 1;
00668 free (cleanString);
00669 free (fileNameStr);
00670 free (classification);
00671 free (stringTemp);
00672 fclose (inFitsBatchPtr);
00673 return;
00674 }
00675 else
00676 {
00677 cleanUpString (qfitsString, cleanString);
00678 if (qfits_is_float (cleanString))
00679 {
00680 sscanf(cleanString, "%f", &floatDummy);
00681 if (floatDummy > 0.0)
00682 pblStart += floatDummy;
00683 else
00684 {
00685 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Found non-positive PBL12 START");
00686 *error = 1;
00687 free (cleanString);
00688 free (fileNameStr);
00689 free (classification);
00690 free (stringTemp);
00691 fclose (inFitsBatchPtr);
00692 return;
00693 }
00694 }
00695 else
00696 {
00697 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Found non-float PBL12 START");
00698 *error = 1;
00699 free (cleanString);
00700 free (fileNameStr);
00701 free (classification);
00702 free (stringTemp);
00703 fclose (inFitsBatchPtr);
00704 return;
00705 }
00706 }
00707
00708
00709 qfitsString = qfits_query_ext (fileNameStr, "HIERARCH ESO ISS PBL12 END", 0);
00710 if (qfitsString == NULL)
00711 {
00712 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get PBL12 END");
00713 *error = 1;
00714 free (cleanString);
00715 free (fileNameStr);
00716 free (classification);
00717 free (stringTemp);
00718 fclose (inFitsBatchPtr);
00719 return;
00720 }
00721 else
00722 {
00723 cleanUpString (qfitsString, cleanString);
00724 if (qfits_is_float (cleanString))
00725 {
00726 sscanf(cleanString, "%f", &floatDummy);
00727 if (floatDummy > 0.0)
00728 pblEnd += floatDummy;
00729 else
00730 {
00731 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Found non-positive PBL12 END");
00732 *error = 1;
00733 free (cleanString);
00734 free (fileNameStr);
00735 free (classification);
00736 free (stringTemp);
00737 fclose (inFitsBatchPtr);
00738 return;
00739 }
00740 }
00741 else
00742 {
00743 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Found non-float PBL12 END");
00744 *error = 1;
00745 free (cleanString);
00746 free (fileNameStr);
00747 free (classification);
00748 free (stringTemp);
00749 fclose (inFitsBatchPtr);
00750 return;
00751 }
00752 }
00753
00754
00755 qfitsString = qfits_query_ext (fileNameStr, "HIERARCH ESO ISS PARANG START", 0);
00756 if (qfitsString == NULL)
00757 {
00758 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get PARANG START");
00759 *error = 1;
00760 free (cleanString);
00761 free (fileNameStr);
00762 free (classification);
00763 free (stringTemp);
00764 fclose (inFitsBatchPtr);
00765 return;
00766 }
00767 else
00768 {
00769 cleanUpString (qfitsString, cleanString);
00770 if (qfits_is_float (cleanString))
00771 {
00772 sscanf(cleanString, "%f", &floatDummy);
00773
00774 parangStart += floatDummy;
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786 }
00787 else
00788 {
00789 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Found non-float PARANG START in");
00790 *error = 1;
00791 free (cleanString);
00792 free (fileNameStr);
00793 free (classification);
00794 free (stringTemp);
00795 fclose (inFitsBatchPtr);
00796 return;
00797 }
00798 }
00799
00800
00801 qfitsString = qfits_query_ext (fileNameStr, "HIERARCH ESO ISS PARANG END", 0);
00802 if (qfitsString == NULL)
00803 {
00804 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get PARANG END");
00805 *error = 1;
00806 free (cleanString);
00807 free (fileNameStr);
00808 free (classification);
00809 free (stringTemp);
00810 fclose (inFitsBatchPtr);
00811 return;
00812 }
00813 else
00814 {
00815 cleanUpString (qfitsString, cleanString);
00816 if (qfits_is_float (cleanString))
00817 {
00818 sscanf(cleanString, "%f", &floatDummy);
00819
00820 parangEnd += floatDummy;
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832 }
00833 else
00834 {
00835 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Found non-float PARANG END");
00836 *error = 1;
00837 free (cleanString);
00838 free (fileNameStr);
00839 free (classification);
00840 free (stringTemp);
00841 fclose (inFitsBatchPtr);
00842 return;
00843 }
00844 }
00845 }
00846 }
00847 }
00848
00849
00850 pblStart /= fileNum;
00851 pblEnd /= fileNum;
00852 calibrator->calibPblAverage = 0.5 * (pblStart + pblEnd);
00853 parangStart /= fileNum;
00854 parangEnd /= fileNum;
00855 calibrator->calibParangAverage = 0.5 * (parangStart + parangEnd);
00856
00857 cpl_msg_info(cpl_func,"Observed Calibrator = %s \n", calibrator->calibName);
00858 cpl_msg_info(cpl_func,"Observed Calibrator RA = %f radians \n", calibrator->calibRA);
00859 cpl_msg_info(cpl_func,"Observed Calibrator DEC = %f radians \n", calibrator->calibDEC);
00860 cpl_msg_info(cpl_func,"Observed Calibrator Average PBL = %f metres \n", calibrator->calibPblAverage);
00861 cpl_msg_info(cpl_func,"Observed Calibrator Average PARANG = %f degrees \n", calibrator->calibParangAverage);
00862 fprintf (midiReportPtr, "Observed Calibrator = %s (QCLOG)\n", calibrator->calibName);
00863 fprintf (midiReportPtr, "Observed Calibrator RA = %f radians (QCLOG)\n", calibrator->calibRA);
00864 fprintf (midiReportPtr, "Observed Calibrator DEC = %f radians (QCLOG)\n", calibrator->calibDEC);
00865 fprintf (midiReportPtr, "Observed Calibrator Average PBL = %f metres (QCLOG)\n", calibrator->calibPblAverage);
00866 fprintf (midiReportPtr, "Observed Calibrator Average PARANG = %f degrees (QCLOG)\n", calibrator->calibParangAverage);
00867
00868
00869 getCalibratorDiameter (fileNames, calibrator, error, parlist, frameset);
00870 if (*error)
00871 {
00872 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot get Calibrator Diameter");
00873 free (cleanString);
00874 free (fileNameStr);
00875 free (classification);
00876 free (stringTemp);
00877 fclose (inFitsBatchPtr);
00878 return;
00879 }
00880
00881
00882 free (fileNameStr);
00883 fclose (inFitsBatchPtr);
00884 free (cleanString);
00885 free (classification);
00886 free (stringTemp);
00887
00888 return;
00889 }
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907 void getCalibratorDiameter (
00908 MidiFiles *fileNames,
00909 CalibratorParam *calibrator,
00910 int *error,
00911 cpl_parameterlist *parlist,
00912 cpl_frameset *frameset)
00913 {
00914
00915
00916
00917 const char routine[] = "getCalibratorDiameter";
00918 int i;
00919 double searchRA, searchDEC, diffAngle;
00920
00921 cpl_errorstate prestate = cpl_errorstate_get();
00922
00923 cpl_frame * cur_frame;
00924
00925 cpl_table * table;
00926
00927 char ** Name=NULL;
00928 int * hourRA=NULL;
00929 int * minuteRA=NULL;
00930 double * secondRA=NULL;
00931 int * signDEC=NULL;
00932 int * degreeDEC=NULL;
00933 int * minuteDEC=NULL;
00934 double * secondDEC=NULL;
00935 double * flux=NULL;
00936 int * flag=NULL;
00937 double * diameter=NULL;
00938 double * diameterErr=NULL;
00939
00940 int ext_calibrator_data=0;
00941 int dimen_calibrator_data=0;
00942 char * tag=NULL;
00943
00944
00945
00946
00947
00948 if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
00949 if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
00950
00951
00952
00953 cur_frame = cpl_frameset_get_first(frameset);
00954 if (cur_frame == NULL) {
00955 cpl_msg_error(cpl_func, "No frame found in the SOF");
00956 *error = 1;
00957 return ;
00958
00959 }
00960
00961
00962 while(cur_frame)
00963 {
00964
00965 tag = (char*)cpl_frame_get_tag(cur_frame);
00966 if (strcmp(tag, MIDI_CALIB_DATABASE)) {
00967 cur_frame = cpl_frameset_get_next( frameset );
00968 continue;
00969 }
00970 else{
00971 cpl_msg_info(cpl_func, "Calibrator database found in the SOF: %s",cpl_frame_get_filename(cur_frame));
00972 break;
00973 }
00974 }
00975
00976 if (strcmp(tag, MIDI_CALIB_DATABASE)) {
00977 cpl_msg_warning(cpl_func, "No calibrator database file found in the SOF!");
00978 cpl_msg_warning(cpl_func, "Transfer function can not be calculated!");
00979 *error = 1;
00980 return;
00981 }
00982
00983
00984
00985
00986 prestate = cpl_errorstate_get();
00987
00988 cpl_msg_info(cpl_func, "Reading %s",cpl_frame_get_filename(cur_frame));
00989
00990 ext_calibrator_data=cpl_fits_find_extension(cpl_frame_get_filename(cur_frame),"CALIBRATOR_DATA");
00991
00992
00993 if((table = cpl_table_load(cpl_frame_get_filename(cur_frame), ext_calibrator_data, 1))==NULL)
00994 {
00995 cpl_msg_info(cpl_func, "No siutable table found in the file: %s",cpl_frame_get_filename(cur_frame));
00996 cpl_msg_warning(cpl_func, "Transfer function can not be calculated!");
00997 cpl_errorstate_set(prestate);
00998 *error = 1;
00999 return;
01000 }
01001
01002
01003 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;};
01004 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;};
01005 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;};
01006 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;};
01007 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;};
01008 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;};
01009 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;};
01010 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;};
01011 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;};
01012 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;};
01013 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;};
01014 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;};
01015
01016 dimen_calibrator_data=cpl_table_get_nrow(table);
01017
01018 cpl_msg_info(cpl_func, "Total number of Calibrators in the table: %d", dimen_calibrator_data);
01019
01020 calibrator->calibDistance =FLT_MAX;
01021
01022
01023 for (i=0; i<dimen_calibrator_data;i++)
01024 {
01025
01026 searchRA = HOUR_TO_RAD * ((double) hourRA[i] + minuteRA[i]/60.0 + secondRA[i]/3600.0);
01027 searchDEC = DEG_TO_RAD * (((double) degreeDEC[i] + minuteDEC[i]/60.0 + secondDEC[i]/3600.0) * signDEC[i]);
01028 diffAngle = acos ( sin(searchDEC) * sin(calibrator->calibDEC) +
01029 cos(searchDEC) * cos(calibrator->calibDEC) * cos(searchRA - calibrator->calibRA) );
01030
01031
01032 if (diffAngle < calibrator->calibDistance)
01033 {
01034 calibrator->calibDistance = (float)diffAngle;
01035 calibrator->calibDiameter = (float)diameter[i];
01036 calibrator->calibDiameterErr = (float)diameterErr[i];
01037 strcpy (calibrator->calibName, Name[i]);
01038 calibrator->calibFlux = flux[i];
01039 calibrator->calibFlag = flag[i];
01040
01041 }
01042
01043 }
01044
01045
01046
01047 if (calibrator->calibDistance <= CALIBRATOR_MIN_THRESHOLD)
01048 {
01049 cpl_msg_info(cpl_func,"Closest Calibrator in the database = %s \n", calibrator->calibName);
01050 cpl_msg_info(cpl_func,"Calibrator Diameter = %f marcsec \n", calibrator->calibDiameter);
01051 cpl_msg_info(cpl_func,"Calibrator Diameter error = %f marcsec \n", calibrator->calibDiameterErr);
01052 cpl_msg_info(cpl_func,"Computed Distance to Observed Calibrator = %f arcsec \n", RAD_TO_ARCSEC * calibrator->calibDistance);
01053 cpl_msg_info(cpl_func,"Calibrator Flux in the N-Band = %g mag \n", calibrator->calibFlux);
01054 cpl_msg_info(cpl_func,"Calibrator quality flag = %d \n", calibrator->calibFlag);
01055
01056 fprintf (midiReportPtr, "Closest Calibrator in the database = %s (QCLOG)\n", calibrator->calibName);
01057 fprintf (midiReportPtr, "Calibrator Diameter = %f marcsec (QCLOG)\n", calibrator->calibDiameter);
01058 fprintf (midiReportPtr, "Calibrator Diameter error = %f marcsec (QCLOG)\n", calibrator->calibDiameterErr);
01059 fprintf (midiReportPtr, "Computed Distance to Observed Calibrator = %f arcsec (QCLOG)\n", RAD_TO_ARCSEC * calibrator->calibDistance);
01060 fprintf (midiReportPtr, "Calibrator Flux in the N-Band = %g mag (QCLOG)\n", calibrator->calibFlux);
01061 fprintf (midiReportPtr, "Calibrator quality flag = %d (QCLOG)\n", calibrator->calibFlag);
01062 }
01063 else
01064 {
01065 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, "Cannot find a close match in the database");
01066 *error = 1;
01067 }
01068
01069
01070 if(table !=NULL) cpl_table_delete(table);
01071
01072
01073
01074
01075
01076
01077
01078 return;
01079 }
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182
01183
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246
01247 void computeExpectedVis (
01248 CalibratorParam *calibrator,
01249 int *error)
01250 {
01251
01252
01253 const char routine[] = "computeExpectedVis";
01254 double besselK1o1, besselK1o1Err, xArg, xArgErr;
01255
01256
01257
01258 if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
01259 if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
01260
01261
01262 *error = 0;
01263
01264
01265
01266 xArg = (double) (MIDI_PI * DIAMETER_FACTOR * calibrator->calibDiameter * calibrator->calibPblAverage * INVERSE_WAVELENGTH);
01267 xArgErr = (double) (MIDI_PI * DIAMETER_FACTOR * calibrator->calibDiameterErr * calibrator->calibPblAverage * INVERSE_WAVELENGTH);
01268 besselK1o1 = computeBesselK1o1 (xArg, xArgErr, &besselK1o1Err);
01269
01270
01271 calibrator->calibVis = (float) (2.0 * (besselK1o1 / xArg));
01272 calibrator->calibVisSqrd = calibrator->calibVis * calibrator->calibVis;
01273
01274
01275 calibrator->calibVisErr = (float) (2.0 * (besselK1o1Err/fabs(xArg) + xArgErr * (fabs(besselK1o1)/(xArg * xArg))));
01276 calibrator->calibVisSqrdErr = 2.0 * (calibrator->calibVisErr * fabs (calibrator->calibVis));
01277
01278 cpl_msg_info(cpl_func,"Expected Visibility = %f \n", calibrator->calibVis);
01279 cpl_msg_info(cpl_func,"Expected Visibility Error = %f \n", calibrator->calibVisErr);
01280 cpl_msg_info(cpl_func,"Expected Squared Visibility = %f \n", calibrator->calibVisSqrd);
01281 cpl_msg_info(cpl_func,"Expected Squared Visibility Error = %f \n", calibrator->calibVisSqrdErr);
01282 fprintf (midiReportPtr, "Expected Visibility = %f (QCLOG)\n", calibrator->calibVis);
01283 fprintf (midiReportPtr, "Expected Visibility Error = %f (QCLOG)\n", calibrator->calibVisErr);
01284 fprintf (midiReportPtr, "Expected Squared Visibility = %f (QCLOG)\n", calibrator->calibVisSqrd);
01285 fprintf (midiReportPtr, "Expected Squared Visibility Error = %f (QCLOG)\n", calibrator->calibVisSqrdErr);
01286
01287 return;
01288 }
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305 double computeBesselK1o1 (
01306 double xArg,
01307 double xArgErr,
01308 double *besselK1o1Err)
01309 {
01310
01311
01312 const char routine[] = "computeBesselK1o1";
01313
01314
01315
01316 if (diagnostic > 4)cpl_msg_info(cpl_func,"Invoking routine '%s' \n", routine);
01317 if (diagnostic > 4) fprintf(midiReportPtr, "Invoking routine '%s' \n", routine);
01318
01319 *besselK1o1Err = (
01320 0.5 * xArgErr +
01321 0.062500000000 * xArgErr * fabs (3.0 * xArg * xArg) +
01322 0.002604166666 * xArgErr * fabs (5.0 * xArg * xArg * xArg * xArg) +
01323 0.000054253472 * xArgErr * fabs (7.0 * xArg * xArg * xArg * xArg * xArg * xArg));
01324
01325 return (
01326 0.5 * xArg -
01327 0.062500000000 * xArg * xArg * xArg +
01328 0.002604166666 * xArg * xArg * xArg * xArg * xArg -
01329 0.000054253472 * xArg * xArg * xArg * xArg * xArg * xArg * xArg);
01330 }
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357 void computeBinnedTrf (
01358 ImageFormat *format,
01359 DispersedResult *dispResult,
01360 int *error)
01361 {
01362
01363
01364
01365 const char routine[] = "computeBinnedTrf";
01366 int i, n;
01367
01368
01369
01370 cpl_msg_info(cpl_func,"\nBinned Transfer Function for batch %d \n", batchNumber);
01371 cpl_msg_info(cpl_func,"------------------------------------------ \n");
01372 fprintf (midiReportPtr, "\nBinned Transfer Function for batch %d QCLOG \n", batchNumber);
01373 fprintf (midiReportPtr, "------------------------------------------ QCLOG \n");
01374
01375
01376 *error = 0;
01377 n = 0;
01378
01379 dispResult->trfBinned1 = 0.0;
01380 dispResult->trfBinned2 = 0.0;
01381 dispResult->trfBinned3 = 0.0;
01382 dispResult->trfBinned4 = 0.0;
01383 dispResult->trfBinned5 = 0.0;
01384
01385 if (strcmp(format->grismId, "PRISM") == 0)
01386 {
01387 n = 0;
01388 for (i = 36; i < 51; i++)
01389 {
01390 if (badChannelList[i])
01391 continue;
01392
01393 dispResult->trfBinned5 += (dispResult->trf)[i];
01394 n++;
01395 }
01396 if(n>0){
01397 dispResult->trfBinned5 /= n;
01398 }
01399 else{
01400 dispResult->trfBinned5= -1.;
01401 }
01402
01403 n = 0;
01404 for (i = 60; i < 73; i++)
01405 {
01406 if (badChannelList[i])
01407 continue;
01408
01409 dispResult->trfBinned4 += (dispResult->trf)[i];
01410 n++;
01411 }
01412 if(n>0){
01413 dispResult->trfBinned4 /= n;
01414 }
01415 else{
01416 dispResult->trfBinned4= -1.;
01417 }
01418
01419 n = 0;
01420 for (i = 88; i < 99; i++)
01421 {
01422 if (badChannelList[i])
01423 continue;
01424
01425 dispResult->trfBinned3 += (dispResult->trf)[i];
01426 n++;
01427 }
01428 if(n>0){
01429 dispResult->trfBinned3 /= n;
01430 }
01431 else{
01432 dispResult->trfBinned3= -1.;
01433 }
01434
01435 n = 0;
01436 for (i = 113; i < 122; i++)
01437 {
01438 if (badChannelList[i])
01439 continue;
01440
01441 dispResult->trfBinned2 += (dispResult->trf)[i];
01442 n++;
01443 }
01444 if(n>0){
01445 dispResult->trfBinned2 /= n;
01446 }
01447 else{
01448 dispResult->trfBinned2= -1.;
01449 }
01450
01451 n = 0;
01452 for (i = 120; i < 127; i++)
01453 {
01454 if (badChannelList[i])
01455 continue;
01456
01457 dispResult->trfBinned1 += (dispResult->trf)[i];
01458 n++;
01459 }
01460
01461 if(n>0){
01462 dispResult->trfBinned1 /= n;
01463 }
01464 else{
01465 dispResult->trfBinned1= -1.;
01466 }
01467 }
01468 else if (strcmp(format->grismId, "GRISM") == 0)
01469 {
01470 n = 0;
01471 for (i = 38; i < 51; i++)
01472 {
01473 if (badChannelList[i])
01474 continue;
01475
01476 dispResult->trfBinned1 += (dispResult->trf)[i];
01477 n++;
01478 }
01479 if(n>0){
01480 dispResult->trfBinned1 /= n;
01481 }
01482 else{
01483 dispResult->trfBinned1= -1.;
01484 }
01485
01486 n = 0;
01487 for (i = 52; i < 69; i++)
01488 {
01489 if (badChannelList[i])
01490 continue;
01491
01492 dispResult->trfBinned2 += (dispResult->trf)[i];
01493 n++;
01494 }
01495 if(n>0){
01496 dispResult->trfBinned2 /= n;
01497 }
01498 else{
01499 dispResult->trfBinned2= -1.;
01500 }
01501
01502 n = 0;
01503 for (i = 116; i < 137; i++)
01504 {
01505 if (badChannelList[i])
01506 continue;
01507
01508 dispResult->trfBinned3 += (dispResult->trf)[i];
01509 n++;
01510 }
01511 if(n>0){
01512 dispResult->trfBinned3 /= n;
01513 }
01514 else{
01515 dispResult->trfBinned3= -1.;
01516 }
01517
01518 n = 0;
01519 for (i = 176; i < 201; i++)
01520 {
01521 if (badChannelList[i])
01522 continue;
01523
01524 dispResult->trfBinned4 += (dispResult->trf)[i];
01525 n++;
01526 }
01527 if(n>0){
01528 dispResult->trfBinned4 /= n;
01529 }
01530 else{
01531 dispResult->trfBinned4= -1.;
01532 }
01533
01534 n = 0;
01535 for (i = 217; i < 246; i++)
01536 {
01537 if (badChannelList[i])
01538 continue;
01539
01540 dispResult->trfBinned5 += (dispResult->trf)[i];
01541 n++;
01542 }
01543 if(n>0){
01544 dispResult->trfBinned5 /= n;
01545 }
01546 else{
01547 dispResult->trfBinned5= -1.;
01548 }
01549 }
01550 else
01551 {
01552 sprintf (midiMessage, "Unknown GRISM ID ... %s", format->grismId);
01553 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__, midiMessage);
01554 *error = 1;
01555 return;
01556 }
01557
01558
01559 cpl_msg_info(cpl_func,"Grism ID: %s \n", format->grismId);
01560 fprintf (midiReportPtr, "Grism ID: %s QCLOG \n", format->grismId);
01561 if (strcmp(format->grismId, "PRISM") == 0)
01562 {
01563 cpl_msg_info(cpl_func," 8.64 micron (Channel 120 -> 126) = %0.4f \n", dispResult->trfBinned1);
01564 cpl_msg_info(cpl_func," 9.00 micron (Channel 113 -> 121) = %0.4f \n", dispResult->trfBinned2);
01565 cpl_msg_info(cpl_func,"10.46 micron (Channel 88 -> 98) = %0.4f \n", dispResult->trfBinned3);
01566 cpl_msg_info(cpl_func,"11.79 micron (Channel 60 -> 72) = %0.4f \n", dispResult->trfBinned4);
01567 cpl_msg_info(cpl_func,"12.80 micron (Channel 36 -> 50) = %0.4f \n", dispResult->trfBinned5);
01568
01569 fprintf (midiReportPtr, " 8.64 micron (Channel 120 -> 126) = %0.4f QCLOG \n", dispResult->trfBinned1);
01570 fprintf (midiReportPtr, " 9.00 micron (Channel 113 -> 121) = %0.4f QCLOG \n", dispResult->trfBinned2);
01571 fprintf (midiReportPtr, "10.46 micron (Channel 88 -> 98) = %0.4f QCLOG \n", dispResult->trfBinned3);
01572 fprintf (midiReportPtr, "11.79 micron (Channel 60 -> 72) = %0.4f QCLOG \n", dispResult->trfBinned4);
01573 fprintf (midiReportPtr, "12.80 micron (Channel 36 -> 50) = %0.4f QCLOG \n", dispResult->trfBinned5);
01574 }
01575 else
01576 {
01577 cpl_msg_info(cpl_func," 8.64 micron (Channel 38 -> 50) = %0.4f \n", dispResult->trfBinned1);
01578 cpl_msg_info(cpl_func," 9.00 micron (Channel 52 -> 68) = %0.4f \n", dispResult->trfBinned2);
01579 cpl_msg_info(cpl_func,"10.46 micron (Channel 116 -> 136) = %0.4f \n", dispResult->trfBinned3);
01580 cpl_msg_info(cpl_func,"11.79 micron (Channel 176 -> 200) = %0.4f \n", dispResult->trfBinned4);
01581 cpl_msg_info(cpl_func,"12.80 micron (Channel 217 -> 245) = %0.4f \n", dispResult->trfBinned5);
01582
01583 fprintf (midiReportPtr, " 8.64 micron (Channel 38 -> 50) = %0.4f QCLOG \n", dispResult->trfBinned1);
01584 fprintf (midiReportPtr, " 9.00 micron (Channel 52 -> 68) = %0.4f QCLOG \n", dispResult->trfBinned2);
01585 fprintf (midiReportPtr, "10.46 micron (Channel 116 -> 136) = %0.4f QCLOG \n", dispResult->trfBinned3);
01586 fprintf (midiReportPtr, "11.79 micron (Channel 176 -> 200) = %0.4f QCLOG \n", dispResult->trfBinned4);
01587 fprintf (midiReportPtr, "12.80 micron (Channel 217 -> 245) = %0.4f QCLOG \n", dispResult->trfBinned5);
01588 }
01589
01590 return;
01591 }
01592
01593
01594
01595
01596
01597 #ifdef NEW_PBL
01598 From: Anders Wallander [awalland@eso.org]
01599 Sent: Wednesday, 12 July, 2006 10:46
01600 To: Isabelle Percheron
01601 Cc: tlicha@eso.org; csabet@eso.org; awalland@eso.org
01602 Subject: Re: VLTI header keyword ISS PBLAxy START/END
01603
01604 Attachments: VLTSW20060066.PDF
01605 Isabelle at al,
01606
01607 The keyword still represents the value of projected baseline at the beginning and end of integration.
01608 The format is the same, but the definition of projected baseline is different, hence a new algorithm.
01609 Attached is the change request. The plan is to install this at Paranal end of September.
01610 The point is that pipelines should not break. I am waiting for your comments on this
01611
01612 Below the 2 different algorithms (GIP is current, RMA is future) to compute PBLA.
01613
01614 Cheers,
01615 Anders
01616
01617 double pblaGIP (double alt, double az, double T1[3], double T2[3])
01618 {
01619
01620 vltDOUBLE star[] = {0.0, 0.0, 0.0};
01621 vltDOUBLE baseline[] = {0.0, 0.0, 0.0};
01622 vltDOUBLE projBaseline[] = {0.0, 0.0, 0.0};
01623 vltDOUBLE sidOpd = 0.0;
01624 vltDOUBLE cosAlt = 0.0;
01625 vltDOUBLE sinAlt = 0.0;
01626 vltDOUBLE cosAz = 0.0;
01627 vltDOUBLE sinAz = 0.0;
01628
01629 double gip;
01630
01631 cosAlt = cos(alt * DDEG2RAD);
01632 sinAlt = sin(alt * DDEG2RAD);
01633 cosAz = cos(az * DDEG2RAD);
01634 sinAz = sin(az * DDEG2RAD);
01635
01636 star[0] = sinAz * cosAlt;
01637 star[1] = (- cosAz) * cosAlt;
01638 star[2] = sinAlt;
01639
01640 baseline[0] = T2[0] - T1[0];
01641 baseline[1] = T2[1] - T1[1];
01642 baseline[2] = T2[2] - T1[2];
01643
01644
01645 sidOpd = star[0] * baseline[0] + star[1] * baseline[1] + star[2] * baseline[2];
01646
01647 projBaseline[0] = baseline[0] - sidOpd * star[0];
01648 projBaseline[1] = baseline[1] - sidOpd * star[1];
01649 projBaseline[2] = baseline[2] - sidOpd * star[2];
01650
01651 gip = atan(projBaseline[0]/projBaseline[1]) * DRAD2DEG;
01652
01653 return gip;
01654
01655 }
01656
01657
01658 double pblaRMA (double alt, double az, double prltic, double T1[3], double T2[3])
01659 {
01660
01661 vltDOUBLE a, A, A_b, p;
01662 vltDOUBLE sinpsi, cospsi, psi;
01663
01664 double rma;
01665
01666
01667
01668
01669
01670 A = (360 - az) * DDEG2RAD;
01671
01672
01673
01674
01675
01676
01677
01678
01679
01680
01681 A_b = atan2( (T2[0] - T1[0]), (T2[1] - T1[1]) );
01682
01683
01684
01685
01686
01687 a = alt * DDEG2RAD;
01688
01689
01690
01691
01692 sinpsi = sin(A_b - A);
01693 cospsi = cos(A_b - A) * sin(a);
01694 psi = atan2(sinpsi,cospsi);
01695
01696
01697
01698
01699
01700 p = prltic * DDEG2RAD;
01701
01702
01703
01704
01705
01706 rma = slaDranrm(p + psi + DPI) * DRAD2DEG;
01707
01708 return rma;
01709
01710 }
01711
01712 Isabelle Percheron wrote:
01713 Anders
01714
01715 I was checking with Cyrus about the uses of the keywords, the pipelines (MIDI
01716 and AMBER for sure) read it and in the case of MIDI uses it, I am stilll not
01717 sure if AMBER pipeline just retrieves it or uses it for other calculations, I
01718 guess they have to retrieve the baseline from somewhere maybe from the stations,
01719 object ...
01720
01721 So just to be sure, could you confirm if this keyword will still represent the
01722 value of the projected baseline at the beginning of the integration and at the
01723 end. How is the format affected (still the same?). And last could you please
01724 tell us when this is implemented on Paranal for Cyrus to check.
01725 Thanks
01726 Isabelle
01727
01728 #endif
01729