| 1 | // auxinterpgps.cc
 | 
|---|
| 2 | // Eric Aubourg         CEA/DAPNIA/SPP   aout 1999
 | 
|---|
| 3 | 
 | 
|---|
| 4 | #include "auxinterpgps.h"
 | 
|---|
| 5 | #include "fitsio.h"
 | 
|---|
| 6 | #include "archvers.h"
 | 
|---|
| 7 | 
 | 
|---|
| 8 | AuxInterpGPS::AuxInterpGPS() {
 | 
|---|
| 9 |   ilastok = false;
 | 
|---|
| 10 | }
 | 
|---|
| 11 | 
 | 
|---|
| 12 | void AuxInterpGPS::AddValue(double mjd, double lat, double lon, double alt) {
 | 
|---|
| 13 |   elems.insert(elem(mjd, lat, lon, alt));
 | 
|---|
| 14 |   ilastok = false;
 | 
|---|
| 15 | }
 | 
|---|
| 16 | 
 | 
|---|
| 17 | void AuxInterpGPS::FindElem(double mjd) {
 | 
|---|
| 18 |   ilast = elems.upper_bound(elem(mjd,0,0,0));
 | 
|---|
| 19 |   ilastok = (ilast != elems.end() && ilast != elems.begin());
 | 
|---|
| 20 | }
 | 
|---|
| 21 | 
 | 
|---|
| 22 | 
 | 
|---|
| 23 | int AuxInterpGPS::getLocation(double mjd, double& lat, double& lon, double& alt) {
 | 
|---|
| 24 |   if (!ilastok ||
 | 
|---|
| 25 |       (mjd > (*ilast).mjd)) {
 | 
|---|
| 26 |     FindElem(mjd);
 | 
|---|
| 27 |   } else {
 | 
|---|
| 28 |     set<elem>::const_iterator i = ilast; i--;
 | 
|---|
| 29 |     if (mjd <= (*i).mjd) FindElem(mjd);
 | 
|---|
| 30 |   }
 | 
|---|
| 31 |   
 | 
|---|
| 32 |   
 | 
|---|
| 33 | 
 | 
|---|
| 34 |   if (!ilastok) return -1;
 | 
|---|
| 35 |   double lastmjd = (*ilast).mjd;
 | 
|---|
| 36 |   if (mjd > lastmjd) return -1;
 | 
|---|
| 37 |   if (ilast == elems.begin()) return -1;
 | 
|---|
| 38 |   set<elem>::const_iterator i = ilast; i--;
 | 
|---|
| 39 |   double prevmjd = (*i).mjd;
 | 
|---|
| 40 |   if (mjd < prevmjd) return -1;
 | 
|---|
| 41 |   
 | 
|---|
| 42 |   double x = (mjd - prevmjd) / (lastmjd - prevmjd);
 | 
|---|
| 43 |   
 | 
|---|
| 44 |   lat = (*i).lat*(1-x) + (*ilast).lat*x;
 | 
|---|
| 45 |   lon = (*i).lon*(1-x) + (*ilast).lon*x;
 | 
|---|
| 46 |   alt = (*i).alt*(1-x) + (*ilast).alt*x;
 | 
|---|
| 47 |   
 | 
|---|
| 48 |   return 0;
 | 
|---|
| 49 | }
 | 
|---|
| 50 | 
 | 
|---|
| 51 | void AuxInterpGPS::FitsDump(string const& filename) {
 | 
|---|
| 52 |   int fitsStatus=0;
 | 
|---|
| 53 |   fitsfile* fptr;
 | 
|---|
| 54 |   remove(filename.c_str());
 | 
|---|
| 55 |   fits_create_file(&fptr, filename.c_str(), &fitsStatus);
 | 
|---|
| 56 |   char* colnames[4] = {"MJD","LATITUDE","LONGITUDE","ALTITUDE"};
 | 
|---|
| 57 |   char* coltypes[4] = {"1D","1D","1D","1D"};
 | 
|---|
| 58 |   char* colunits[4] = {" ", " " , " ", " "};
 | 
|---|
| 59 |   fits_create_tbl(fptr, BINARY_TBL, 0, 4, colnames, coltypes, colunits, NULL, &fitsStatus);
 | 
|---|
| 60 |   fits_write_date(fptr, &fitsStatus);
 | 
|---|
| 61 |   fits_write_comment(fptr, "Generated with archtoi " ARCHTOI_VERS, &fitsStatus);
 | 
|---|
| 62 |   int fitsLine = 1;
 | 
|---|
| 63 |   for (set<elem>::iterator i = elems.begin(); i != elems.end(); i++,fitsLine++) {
 | 
|---|
| 64 |     fits_write_col_dbl(fptr, 1, fitsLine, 1, 1, (double*) &(*i).mjd, &fitsStatus);
 | 
|---|
| 65 |     fits_write_col_dbl(fptr, 2, fitsLine, 1, 1, (double*) &(*i).lat, &fitsStatus);
 | 
|---|
| 66 |     fits_write_col_dbl(fptr, 3, fitsLine, 1, 1, (double*) &(*i).lon, &fitsStatus);
 | 
|---|
| 67 |     fits_write_col_dbl(fptr, 4, fitsLine, 1, 1, (double*) &(*i).alt, &fitsStatus);
 | 
|---|
| 68 |   }
 | 
|---|
| 69 | 
 | 
|---|
| 70 |   fits_close_file(fptr, &fitsStatus);
 | 
|---|
| 71 |   fits_report_error(stderr, fitsStatus);  /* print out any error messages */
 | 
|---|
| 72 | }
 | 
|---|