27 #include "iauExchange.h"
29 #include "midiGlobal.h"
31 #include "qfits_header.h"
65 const char routine[] =
"writeOiArray";
67 qfits_table *oiArrayTable;
68 int tableWidth, numOfColumns, numOfRows, numOfElemStaIndex,
69 numOfElemStaName, numOfElemTelName, numOfElemDiameter, numOfElemStaxyz;
71 qfits_header *oiArrayHeader;
72 const void **outArrayPtr;
73 char *telName, *staName, *telPtr, *staPtr;
75 int i, j, k, arrayStatus;
87 numOfRows = array->nelement;
90 numOfElemTelName = 16;
91 numOfElemStaName = 16;
92 numOfElemStaIndex = 1;
93 numOfElemDiameter = 1;
97 tempString = (
char *) calloc ( MAX_STRING_LENGTH,
sizeof (
char));
100 outFitsPtr = fopen (outFitsName,
"a");
101 if (outFitsPtr == NULL)
104 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot open output FITS file for writing %s\n", routine, outFitsName);
110 oiArrayTable = qfits_table_new (outFitsName, QFITS_BINTABLE, tableWidth, numOfColumns, numOfRows);
114 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot create OI_ARRAY table \n", routine);
117 remove (outFitsName);
122 colPtr = oiArrayTable->col;
123 qfits_col_fill (colPtr, numOfElemTelName, 0,
sizeof(
char), TFITS_BIN_TYPE_A,
"TEL_NAME",
" ",
" ",
" ",
126 qfits_col_fill (colPtr, numOfElemStaName, 0,
sizeof(
char), TFITS_BIN_TYPE_A,
"STA_NAME",
" ",
" ",
" ",
129 qfits_col_fill (colPtr, numOfElemStaIndex, 0,
sizeof(
short), TFITS_BIN_TYPE_I,
"STA_INDEX",
" ",
" ",
" ",
132 qfits_col_fill (colPtr, numOfElemDiameter, 0,
sizeof(
float), TFITS_BIN_TYPE_E,
"DIAMETER",
"m",
" ",
" ",
135 qfits_col_fill (colPtr, numOfElemStaxyz, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"STAXYZ",
"m",
" ",
" ",
139 oiArrayHeader = qfits_table_ext_header_default (oiArrayTable);
140 qfits_header_add (oiArrayHeader,
"EXTNAME",
"OI_ARRAY",
"Name of this binary table extension",
"");
141 qfits_header_add (oiArrayHeader,
"OI_REVN", array->revision,
"Revision number of the table definition",
"");
142 qfits_header_add (oiArrayHeader,
"ARRNAME", array->arrname,
"Array name",
"");
143 qfits_header_add (oiArrayHeader,
"FRAME", array->frame,
"Coordinate frame",
"");
144 sprintf (tempString,
"%f", array->arrayx);
145 qfits_header_add (oiArrayHeader,
"ARRAYX", tempString,
"Array centre x coordinate",
"");
146 sprintf (tempString,
"%f", array->arrayy);
147 qfits_header_add (oiArrayHeader,
"ARRAYY", tempString,
"Array centre y coordinate",
"");
148 sprintf (tempString,
"%f", array->arrayz);
149 qfits_header_add (oiArrayHeader,
"ARRAYZ", tempString,
"Array centre z coordinate",
"");
152 if (diagnostic > 2) qfits_header_dump (oiArrayHeader, midiReportPtr);
155 outArrayPtr = (
const void **) calloc (numOfColumns,
sizeof(
const void *));
156 telName = (
char *) calloc (numOfRows * MAX_STRING_LENGTH,
sizeof(
char));
157 staName = (
char *) calloc (numOfRows * MAX_STRING_LENGTH,
sizeof(
char));
158 staIndex = (
short *) calloc (numOfRows,
sizeof(
short));
159 diameter = (
float *) calloc (numOfRows,
sizeof(
float));
160 staxyz = (
double *) calloc (numOfRows * numOfElemStaxyz,
sizeof(
double));
164 for (i = 0; i < numOfRows; i++)
166 sprintf (telPtr,
"%s", array->elem[i].tel_name);
167 telPtr += numOfElemTelName;
171 for (i = 0; i < numOfRows; i++)
173 sprintf (staPtr,
"%s", array->elem[i].sta_name);
174 staPtr += numOfElemStaName;
178 for (i = 0; i < numOfRows; i++)
180 staIndex[i] = array->elem[i].sta_index;
181 diameter[i] = array->elem[i].diameter;
182 for (j = 0; j < numOfElemStaxyz; j++)
184 staxyz[k++] = array->elem[i].staxyz[j];
189 outArrayPtr[0] = (
void *) telName;
190 outArrayPtr[1] = (
void *) staName;
191 outArrayPtr[2] = (
void *) staIndex;
192 outArrayPtr[3] = (
void *) diameter;
193 outArrayPtr[4] = (
void *) staxyz;
195 arrayStatus = qfits_table_append_xtension_hdr (outFitsPtr, oiArrayTable, outArrayPtr, oiArrayHeader);
196 if (arrayStatus == - 1)
199 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot write into OI_ARRAY table \n", routine);
200 remove (outFitsName);
204 qfits_header_destroy (oiArrayHeader);
205 qfits_table_close (oiArrayTable);
240 const char routine[] =
"writeOiTarget";
242 qfits_table *oiTargetTable;
243 int tableWidth, numOfColumns, numOfRows, numOfElements, numOfElemTargetName,
244 numOfElemVeltyp, numOfElemVeldef, numOfElemSpectyp, arrayStatus;
246 qfits_header *oiTargetHeader;
247 const void **outTargetPtr;
256 numOfRows = targets->ntarget;
260 numOfElemTargetName = 16;
263 numOfElemSpectyp = 16;
266 tempString = (
char *) calloc ( MAX_STRING_LENGTH,
sizeof (
char));
269 outFitsPtr = fopen (outFitsName,
"a");
270 if (outFitsPtr == NULL)
273 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot open output FITS file for writing %s\n", routine, outFitsName);
279 oiTargetTable = qfits_table_new (outFitsName, QFITS_BINTABLE, tableWidth, numOfColumns, numOfRows);
283 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot create OI_TARGET table \n", routine);
286 remove (outFitsName);
291 colPtr = oiTargetTable->col;
292 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
short), TFITS_BIN_TYPE_I,
"TARGET_ID",
" ",
" ",
" ",
295 qfits_col_fill (colPtr, numOfElemTargetName, 0,
sizeof(
char), TFITS_BIN_TYPE_A,
"TARGET",
" ",
" ",
" ",
298 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"RAEP0",
"deg",
" ",
" ",
301 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"DECEP0",
"deg",
" ",
" ",
304 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
float), TFITS_BIN_TYPE_E,
"EQUINOX",
"year",
" ",
" ",
307 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"RA_ERR",
"deg",
" ",
" ",
310 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"DEC_ERR",
"deg",
" ",
" ",
313 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"SYSVEL",
"m/s",
" ",
" ",
316 qfits_col_fill (colPtr, numOfElemVeltyp, 0,
sizeof(
char), TFITS_BIN_TYPE_A,
"VELTYP",
" ",
" ",
" ",
319 qfits_col_fill (colPtr, numOfElemVeldef, 0,
sizeof(
char), TFITS_BIN_TYPE_A,
"VELDEF",
" ",
" ",
" ",
322 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"PMRA",
"deg/year",
" ",
" ",
325 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"PMDEC",
"deg/year",
" ",
" ",
328 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"PMRA_ERR",
"deg/year",
" ",
" ",
331 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"PMDEC_ERR",
"deg/year",
" ",
" ",
334 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
float), TFITS_BIN_TYPE_E,
"PARALLAX",
"deg",
" ",
" ",
337 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
float), TFITS_BIN_TYPE_E,
"PARA_ERR",
"deg",
" ",
" ",
340 qfits_col_fill (colPtr, numOfElemSpectyp, 0,
sizeof(
char), TFITS_BIN_TYPE_A,
"SPECTYP",
" ",
" ",
" ",
344 oiTargetHeader = qfits_table_ext_header_default (oiTargetTable);
345 qfits_header_add (oiTargetHeader,
"EXTNAME",
"OI_TARGET",
"Name of this binary table extension",
"");
346 qfits_header_add (oiTargetHeader,
"OI_REVN", targets->revision,
"Revision number of the table definition",
"");
349 if (diagnostic > 2) qfits_header_dump (oiTargetHeader, midiReportPtr);
352 outTargetPtr = (
const void **) calloc (numOfColumns,
sizeof(
const void *));
355 outTargetPtr[0] = (
void *) &(targets->targ->target_id);
356 outTargetPtr[1] = (
void *) targets->targ->target;
357 outTargetPtr[2] = (
void *) &(targets->targ->raep0);
358 outTargetPtr[3] = (
void *) &(targets->targ->decep0);
359 outTargetPtr[4] = (
void *) &(targets->targ->equinox);
360 outTargetPtr[5] = (
void *) &(targets->targ->ra_err);
361 outTargetPtr[6] = (
void *) &(targets->targ->dec_err);
362 outTargetPtr[7] = (
void *) &(targets->targ->sysvel);
363 outTargetPtr[8] = (
void *) targets->targ->veltyp;
364 outTargetPtr[9] = (
void *) targets->targ->veldef;
365 outTargetPtr[10] = (
void *) &(targets->targ->pmra);
366 outTargetPtr[11] = (
void *) &(targets->targ->pmdec);
367 outTargetPtr[12] = (
void *) &(targets->targ->pmra_err);
368 outTargetPtr[13] = (
void *) &(targets->targ->pmdec_err);
369 outTargetPtr[14] = (
void *) &(targets->targ->parallax);
370 outTargetPtr[15] = (
void *) &(targets->targ->para_err);
371 outTargetPtr[16] = (
void *) targets->targ->spectyp;
373 arrayStatus = qfits_table_append_xtension_hdr (outFitsPtr, oiTargetTable, outTargetPtr, oiTargetHeader);
374 if (arrayStatus == - 1)
377 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot write into OI_TARGET table \n", routine);
378 remove (outFitsName);
382 qfits_header_destroy (oiTargetHeader);
383 qfits_table_close (oiTargetTable);
405 void writeOiWavelength (
413 const char routine[] =
"writeOiWavelength";
415 qfits_table *oiWaveTable;
416 int i, tableWidth, numOfColumns, numOfRows, numOfElements, arrayStatus;
418 qfits_header *oiWaveHeader;
419 const void **outWavePtr;
421 float *effWave, *effBand;
429 numOfRows = wave->nwave;
435 tempString = (
char *) calloc ( MAX_STRING_LENGTH,
sizeof (
char));
438 outFitsPtr = fopen (outFitsName,
"a");
439 if (outFitsPtr == NULL)
442 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot open output FITS file for writing %s\n", routine, outFitsName);
448 oiWaveTable = qfits_table_new (outFitsName, QFITS_BINTABLE, tableWidth, numOfColumns, numOfRows);
452 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot create OI_WAVELENGTH table \n", routine);
455 remove (outFitsName);
460 colPtr = oiWaveTable->col;
461 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
float), TFITS_BIN_TYPE_E,
"EFF_WAVE",
"m",
" ",
" ",
464 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
float), TFITS_BIN_TYPE_E,
"EFF_BAND",
"m",
" ",
" ",
468 oiWaveHeader = qfits_table_ext_header_default (oiWaveTable);
469 qfits_header_add (oiWaveHeader,
"EXTNAME",
"OI_WAVELENGTH",
"Name of this binary table extension",
"");
470 qfits_header_add (oiWaveHeader,
"OI_REVN", wave->revision,
"Revision number of the table definition",
"");
471 qfits_header_add (oiWaveHeader,
"INSNAME", wave->insname,
"Detector name",
"");
474 if (diagnostic > 2) qfits_header_dump (oiWaveHeader, midiReportPtr);
477 outWavePtr = (
const void **) calloc (numOfColumns,
sizeof(
const void *));
478 effWave = (
float *) calloc (numOfRows * numOfElements,
sizeof(
float));
479 effBand = (
float *) calloc (numOfRows * numOfElements,
sizeof(
float));
482 for (i = 0; i < numOfRows; i++)
484 effWave[i] = wave->eff_wave[i];
485 effBand[i] = wave->eff_band[i];
489 outWavePtr[0] = (
void *) effWave;
490 outWavePtr[1] = (
void *) effBand;
492 arrayStatus = qfits_table_append_xtension_hdr (outFitsPtr, oiWaveTable, outWavePtr, oiWaveHeader);
493 if (arrayStatus == - 1)
496 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot write into OI_TARGET table \n", routine);
497 remove (outFitsName);
501 qfits_header_destroy (oiWaveHeader);
502 qfits_table_close (oiWaveTable);
535 const char routine[] =
"writeOiVis";
537 qfits_table *oiVisTable;
538 int tableWidth, numOfColumns, numOfRows, numOfElements, numOfElemStaIndex, numOfElemVis;
540 qfits_header *oiVisHeader;
541 const void **outVisPtr;
542 char *tempString, *flag, *stringPtr;
543 int i, j, k, l, m, *targetId, arrayStatus;
544 double *time, *mjd, *integTime, *visAmp, *visAmapErr, *visPhi, *visPhiErr,
554 numOfRows = vis->numrec;
558 numOfElemStaIndex = 2;
559 numOfElemVis = vis->nwave;
562 tempString = (
char *) calloc ( MAX_STRING_LENGTH,
sizeof (
char));
565 outFitsPtr = fopen (outFitsName,
"a");
566 if (outFitsPtr == NULL)
569 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot open output FITS file for writing %s\n", routine, outFitsName);
575 oiVisTable = qfits_table_new (outFitsName, QFITS_BINTABLE, tableWidth, numOfColumns, numOfRows);
579 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot create OI_VIS table \n", routine);
582 remove (outFitsName);
587 colPtr = oiVisTable->col;
588 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
short), TFITS_BIN_TYPE_I,
"TARGET_ID",
" ",
" ",
" ",
591 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"TIME",
"s",
" ",
" ",
594 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"MJD",
"day",
" ",
" ",
597 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"INT_TIME",
"s",
" ",
" ",
600 qfits_col_fill (colPtr, numOfElemVis, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"VISAMP",
" ",
" ",
" ",
603 qfits_col_fill (colPtr, numOfElemVis, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"VISAMPERR",
" ",
" ",
" ",
606 qfits_col_fill (colPtr, numOfElemVis, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"VISPHI",
"deg",
" ",
" ",
609 qfits_col_fill (colPtr, numOfElemVis, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"VISPHIERR",
"deg",
" ",
" ",
612 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"UCOORD",
"m",
" ",
" ",
615 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"VCOORD",
"m",
" ",
" ",
618 qfits_col_fill (colPtr, numOfElemStaIndex, 0,
sizeof(
short), TFITS_BIN_TYPE_I,
"STA_INDEX",
" ",
" ",
" ",
621 qfits_col_fill (colPtr, numOfElemVis, 0,
sizeof(
char), TFITS_BIN_TYPE_L,
"FLAG",
" ",
" ",
" ",
626 oiVisHeader = qfits_table_ext_header_default (oiVisTable);
627 qfits_header_add (oiVisHeader,
"EXTNAME",
"OI_VIS",
"Name of this binary table extension",
"");
628 qfits_header_add (oiVisHeader,
"OI_REVN", vis->revision,
"Revision number of the table definition",
"");
629 qfits_header_add (oiVisHeader,
"DATE-OBS", vis->date_obs,
"UTC start date of observations",
"");
630 if (strlen(vis->arrname) > 0)
631 qfits_header_add (oiVisHeader,
"ARRNAME", vis->arrname,
"Array name",
"");
633 qfits_header_add (oiVisHeader,
"INSNAME", vis->insname,
"Detector name",
"");
636 if (diagnostic > 2) qfits_header_dump (oiVisHeader, midiReportPtr);
639 outVisPtr = (
const void **) calloc (numOfColumns,
sizeof(
const void *));
640 targetId = (
int *) calloc (numOfRows * numOfElements,
sizeof (
int));
641 time = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
642 mjd = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
643 integTime = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
644 visAmp = (
double *) calloc (numOfRows * numOfElemVis,
sizeof (
double));
645 visAmapErr = (
double *) calloc (numOfRows * numOfElemVis,
sizeof (
double));
646 visPhi = (
double *) calloc (numOfRows * numOfElemVis,
sizeof (
double));
647 visPhiErr = (
double *) calloc (numOfRows * numOfElemVis,
sizeof (
double));
648 uCoord = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
649 vCoord = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
650 staIndex = (
short *) calloc (numOfRows * numOfElemStaIndex,
sizeof (
short));
651 flag = (
char *) calloc (numOfRows * numOfElemVis+1,
sizeof (
char));
658 for (i = 0; i < numOfRows; i++)
660 for (j = 0; j < numOfElements; j++)
662 targetId[k] = vis->record[j].target_id;
663 time[k] = vis->record[j].time;
664 mjd[k] = vis->record[j].mjd;
665 integTime[k] = vis->record[j].int_time;
666 uCoord[k] = vis->record[j].ucoord;
667 vCoord[k++] = vis->record[j].vcoord;
672 for (j = 0; j < numOfElemVis; j++)
674 visAmp[l] = vis->record[i].visamp[j];
675 visAmapErr[l] = vis->record[i].visamperr[j];
676 visPhi[l] = vis->record[i].visphi[j];
677 visPhiErr[l++] = vis->record[i].visphierr[j];
679 if (strcmp (vis->record[i].flag,
"FALSE") == 0)
680 sprintf (stringPtr,
"%s",
"F");
682 sprintf (stringPtr,
"%s",
"T");
683 stringPtr += numOfElements;
688 for (j = 0; j < numOfElemStaIndex; j++)
690 staIndex[m++] = vis->record[i].sta_index[j];
695 outVisPtr[0] = (
void *) targetId;
696 outVisPtr[1] = (
void *) time;
697 outVisPtr[2] = (
void *) mjd;
698 outVisPtr[3] = (
void *) integTime;
699 outVisPtr[4] = (
void *) visAmp;
700 outVisPtr[5] = (
void *) visAmapErr;
701 outVisPtr[6] = (
void *) visPhi;
702 outVisPtr[7] = (
void *) visPhiErr;
703 outVisPtr[8] = (
void *) uCoord;
704 outVisPtr[9] = (
void *) vCoord;
705 outVisPtr[10] = (
void *) staIndex;
706 outVisPtr[11] = (
void *) flag;
708 arrayStatus = qfits_table_append_xtension_hdr (outFitsPtr, oiVisTable, outVisPtr, oiVisHeader);
709 if (arrayStatus == - 1)
712 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot write into OI_VIS table \n", routine);
713 remove (outFitsName);
717 qfits_header_destroy (oiVisHeader);
718 qfits_table_close (oiVisTable);
762 const char routine[] =
"writeOiVis2";
764 qfits_table *oiVis2Table;
765 int tableWidth, numOfColumns, numOfRows, numOfElements, numOfElemStaIndex, numOfElemVis2;
767 qfits_header *oiVis2Header;
768 const void **outVis2Ptr;
769 char *tempString, *flag, *stringPtr;
770 int i, j, k, l, m, *targetId, arrayStatus;
771 double *time, *mjd, *integTime, *vis2Data, *vis2Err, *uCoord, *vCoord;
780 numOfRows = vis2->numrec;
784 numOfElemStaIndex = 2;
785 numOfElemVis2 = vis2->nwave;
788 tempString = (
char *) calloc ( MAX_STRING_LENGTH,
sizeof (
char));
791 outFitsPtr = fopen (outFitsName,
"a");
792 if (outFitsPtr == NULL)
795 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot open output FITS file for writing %s\n", routine, outFitsName);
801 oiVis2Table = qfits_table_new (outFitsName, QFITS_BINTABLE, tableWidth, numOfColumns, numOfRows);
805 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot create OI_VIS2 table \n", routine);
808 remove (outFitsName);
813 colPtr = oiVis2Table->col;
814 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
short), TFITS_BIN_TYPE_I,
"TARGET_ID",
" ",
" ",
" ",
817 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"TIME",
"s",
" ",
" ",
820 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"MJD",
"day",
" ",
" ",
823 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"INT_TIME",
"s",
" ",
" ",
826 qfits_col_fill (colPtr, numOfElemVis2, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"VIS2DATA",
" ",
" ",
" ",
829 qfits_col_fill (colPtr, numOfElemVis2, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"VIS2ERR",
" ",
" ",
" ",
832 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"UCOORD",
"m",
" ",
" ",
835 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"VCOORD",
"m",
" ",
" ",
838 qfits_col_fill (colPtr, numOfElemStaIndex, 0,
sizeof(
short), TFITS_BIN_TYPE_I,
"STA_INDEX",
" ",
" ",
" ",
841 qfits_col_fill (colPtr, numOfElemVis2, 0,
sizeof(
char), TFITS_BIN_TYPE_L,
"FLAG",
" ",
" ",
" ",
846 oiVis2Header = qfits_table_ext_header_default (oiVis2Table);
847 qfits_header_add (oiVis2Header,
"EXTNAME",
"OI_VIS2",
"Name of this binary table extension",
"");
848 qfits_header_add (oiVis2Header,
"OI_REVN", vis2->revision,
"Revision number of the table definition",
"");
849 qfits_header_add (oiVis2Header,
"DATE-OBS", vis2->date_obs,
"UTC start date of observations",
"");
850 if (strlen(vis2->arrname) > 0)
851 qfits_header_add (oiVis2Header,
"ARRNAME", vis2->arrname,
"Array name",
"");
853 qfits_header_add (oiVis2Header,
"INSNAME", vis2->insname,
"Detector name",
"");
856 if (diagnostic > 2) qfits_header_dump (oiVis2Header, midiReportPtr);
859 outVis2Ptr = (
const void **) calloc (numOfColumns,
sizeof(
const void *));
860 targetId = (
int *) calloc (numOfRows * numOfElements,
sizeof (
int));
861 time = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
862 mjd = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
863 integTime = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
864 vis2Data = (
double *) calloc (numOfRows * numOfElemVis2,
sizeof (
double));
865 vis2Err = (
double *) calloc (numOfRows * numOfElemVis2,
sizeof (
double));
866 uCoord = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
867 vCoord = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
868 staIndex = (
short *) calloc (numOfRows * numOfElemStaIndex,
sizeof (
short));
869 flag = (
char *) calloc (numOfRows * numOfElemVis2+1,
sizeof (
char));
876 for (i = 0; i < numOfRows; i++)
878 for (j = 0; j < numOfElements; j++)
880 targetId[k] = vis2->record[j].target_id;
881 time[k] = vis2->record[j].time;
882 mjd[k] = vis2->record[j].mjd;
883 integTime[k] = vis2->record[j].int_time;
884 uCoord[k] = vis2->record[j].ucoord;
885 vCoord[k++] = vis2->record[j].vcoord;
889 for (j = 0; j < numOfElemVis2; j++)
891 vis2Data[l] = vis2->record[i].vis2data[j];
892 vis2Err[l++] = vis2->record[i].vis2err[j];
894 if (strcmp (vis2->record[i].flag,
"FALSE") == 0)
895 sprintf (stringPtr,
"%s",
"F");
897 sprintf (stringPtr,
"%s",
"T");
898 stringPtr += numOfElements;
902 for (j = 0; j < numOfElemStaIndex; j++)
904 staIndex[m++] = vis2->record[i].sta_index[j];
909 outVis2Ptr[0] = (
void *) targetId;
910 outVis2Ptr[1] = (
void *) time;
911 outVis2Ptr[2] = (
void *) mjd;
912 outVis2Ptr[3] = (
void *) integTime;
913 outVis2Ptr[4] = (
void *) vis2Data;
914 outVis2Ptr[5] = (
void *) vis2Err;
915 outVis2Ptr[6] = (
void *) uCoord;
916 outVis2Ptr[7] = (
void *) vCoord;
917 outVis2Ptr[8] = (
void *) staIndex;
918 outVis2Ptr[9] = (
void *) flag;
920 arrayStatus = qfits_table_append_xtension_hdr (outFitsPtr, oiVis2Table, outVis2Ptr, oiVis2Header);
921 if (arrayStatus == - 1)
924 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot write into OI_VIS2 table \n", routine);
925 remove (outFitsName);
929 qfits_header_destroy (oiVis2Header);
930 qfits_table_close (oiVis2Table);
971 const char routine[] =
"writeOiT3";
973 qfits_table *oiT3Table;
974 int tableWidth, numOfColumns, numOfRows, numOfElements, numOfElemStaIndex, numOfElemT3;
976 qfits_header *oiT3Header;
977 const void **outT3Ptr;
978 char *tempString, *flag, *stringPtr;
979 int i, j, k, l, m, *targetId, *staIndex;
980 double *time, *mjd, *integTime, *t3Amp, *t3AmpErr, *t3Phi, *t3PhiErr,
981 *u1Coord, *v1Coord, *u2Coord, *v2Coord;
988 numOfRows = t3->numrec;
992 numOfElemStaIndex = 1;
993 numOfElemT3 = t3->nwave;
996 tempString = (
char *) calloc ( MAX_STRING_LENGTH,
sizeof (
char));
999 outFitsPtr = fopen (outFitsName,
"a");
1000 if (outFitsPtr == NULL)
1003 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot open output FITS file for writing %s\n", routine, outFitsName);
1009 oiT3Table = qfits_table_new (outFitsName, QFITS_BINTABLE, tableWidth, numOfColumns, numOfRows);
1013 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot create OI_T3 table \n", routine);
1015 fclose (outFitsPtr);
1016 remove (outFitsName);
1021 colPtr = oiT3Table->col;
1022 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
short), TFITS_BIN_TYPE_I,
"TARGET_ID",
" ",
" ",
" ",
1025 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"TIME",
"s",
" ",
" ",
1028 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"MJD",
"day",
" ",
" ",
1031 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"INT_TIME",
"s",
" ",
" ",
1034 qfits_col_fill (colPtr, numOfElemT3, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"T3AMP",
" ",
" ",
" ",
1037 qfits_col_fill (colPtr, numOfElemT3, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"T3AMPERR",
" ",
" ",
" ",
1040 qfits_col_fill (colPtr, numOfElemT3, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"T3PHI",
" ",
" ",
" ",
1043 qfits_col_fill (colPtr, numOfElemT3, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"T3PHIERR",
" ",
" ",
" ",
1046 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"U1COORD",
"m",
" ",
" ",
1049 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"V1COORD",
"m",
" ",
" ",
1052 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"U2COORD",
"m",
" ",
" ",
1055 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
double), TFITS_BIN_TYPE_D,
"V2COORD",
"m",
" ",
" ",
1058 qfits_col_fill (colPtr, numOfElemStaIndex, 0,
sizeof(
short), TFITS_BIN_TYPE_I,
"STA_INDEX",
" ",
" ",
" ",
1061 qfits_col_fill (colPtr, numOfElements, 0,
sizeof(
char), TFITS_BIN_TYPE_A,
"FLAG",
" ",
" ",
" ",
1066 oiT3Header = qfits_table_ext_header_default (oiT3Table);
1067 qfits_header_add (oiT3Header,
"EXTNAME",
"OI_T3",
"Name of this binary table extension",
"");
1068 qfits_header_add (oiT3Header,
"OI_REVN", t3->revision,
"Revision number of the table definition",
"");
1069 qfits_header_add (oiT3Header,
"DATE-OBS", t3->date_obs,
"UTC start date of observations",
"");
1070 if (strlen(t3->arrname) > 0)
1071 qfits_header_add (oiT3Header,
"ARRNAME", t3->arrname,
"Array name",
"");
1073 qfits_header_add (oiT3Header,
"INSNAME", t3->insname,
"Detector name",
"");
1076 if (diagnostic > 2) qfits_header_dump (oiT3Header, midiReportPtr);
1079 outT3Ptr = (
const void **) calloc (numOfColumns,
sizeof(
const void *));
1080 targetId = (
int *) calloc (numOfRows * numOfElements,
sizeof (
int));
1081 time = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
1082 mjd = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
1083 integTime = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
1084 t3Amp = (
double *) calloc (numOfRows * numOfElemT3,
sizeof (
double));
1085 t3AmpErr = (
double *) calloc (numOfRows * numOfElemT3,
sizeof (
double));
1086 t3Phi = (
double *) calloc (numOfRows * numOfElemT3,
sizeof (
double));
1087 t3PhiErr = (
double *) calloc (numOfRows * numOfElemT3,
sizeof (
double));
1088 u1Coord = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
1089 v1Coord = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
1090 u2Coord = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
1091 v2Coord = (
double *) calloc (numOfRows * numOfElements,
sizeof (
double));
1092 staIndex = (
int *) calloc (numOfRows * numOfElemStaIndex,
sizeof (
int));
1093 flag = (
char *) calloc (numOfRows * MAX_STRING_LENGTH,
sizeof (
char));
1100 for (i = 0; i < numOfRows; i++)
1102 for (j = 0; j < numOfElements; j++)
1104 targetId[k] = t3->record[j].target_id;
1105 time[k] = t3->record[j].time;
1106 mjd[k] = t3->record[j].mjd;
1107 integTime[k] = t3->record[j].int_time;
1108 u1Coord[k] = t3->record[j].u1coord;
1109 v1Coord[k++] = t3->record[j].v1coord;
1110 u2Coord[k] = t3->record[j].u2coord;
1111 v2Coord[k++] = t3->record[j].v2coord;
1114 cpl_msg_info(cpl_func,
"flag = %s\n", t3->record[i].flag);
1115 if (strcmp (t3->record[i].flag,
"FALSE") == 0)
1116 sprintf (stringPtr,
"%s",
"F");
1118 sprintf (stringPtr,
"%s",
"T");
1119 stringPtr += numOfElements;
1121 for (j = 0; j < numOfElemT3; j++)
1123 t3Amp[l] = t3->record[i].t3amp[j];
1124 t3AmpErr[l] = t3->record[i].t3amperr[j];
1125 t3Phi[l] = t3->record[i].t3phi[j];
1126 t3PhiErr[l] = t3->record[i].t3phierr[j];
1129 for (j = 0; j < numOfElemStaIndex; j++)
1131 staIndex[m++] = t3->record[i].sta_index[j];
1136 outT3Ptr[0] = (
void *) targetId;
1137 outT3Ptr[1] = (
void *) time;
1138 outT3Ptr[2] = (
void *) mjd;
1139 outT3Ptr[3] = (
void *) integTime;
1140 outT3Ptr[4] = (
void *) t3Amp;
1141 outT3Ptr[5] = (
void *) t3AmpErr;
1142 outT3Ptr[6] = (
void *) t3Phi;
1143 outT3Ptr[7] = (
void *) t3PhiErr;
1144 outT3Ptr[8] = (
void *) u1Coord;
1145 outT3Ptr[9] = (
void *) v1Coord;
1146 outT3Ptr[10] = (
void *) u2Coord;
1147 outT3Ptr[11] = (
void *) v2Coord;
1148 outT3Ptr[12] = (
void *) staIndex;
1149 outT3Ptr[13] = (
void *) flag;
1151 if (qfits_table_append_xtension_hdr (outFitsPtr, oiT3Table, outT3Ptr, oiT3Header) == -1)
1154 cpl_msg_info(cpl_func,
"<<Warning>> from '%s'. Cannot write into OI_T3 table \n", routine);
1155 remove (outFitsName);
1159 qfits_header_destroy (oiT3Header);
1160 qfits_table_close (oiT3Table);
1163 fclose (outFitsPtr);