| 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 | bool AuxInterpGPS::canGetLocation(double mjd) { | 
|---|
| 23 | return (mjd > (*elems.begin()).mjd && mjd < (*--elems.end()).mjd); | 
|---|
| 24 | } | 
|---|
| 25 |  | 
|---|
| 26 | double AuxInterpGPS::getStartMJD() { | 
|---|
| 27 | return (*elems.begin()).mjd; | 
|---|
| 28 | } | 
|---|
| 29 |  | 
|---|
| 30 | double AuxInterpGPS::getEndMJD() { | 
|---|
| 31 | return (*--elems.end()).mjd; | 
|---|
| 32 | } | 
|---|
| 33 |  | 
|---|
| 34 |  | 
|---|
| 35 | int AuxInterpGPS::getLocation(double mjd, double& lat, double& lon, double& alt) { | 
|---|
| 36 | if (!ilastok || | 
|---|
| 37 | (mjd > (*ilast).mjd)) { | 
|---|
| 38 | FindElem(mjd); | 
|---|
| 39 | } else { | 
|---|
| 40 | set<elem>::const_iterator i = ilast; i--; | 
|---|
| 41 | if (mjd <= (*i).mjd) FindElem(mjd); | 
|---|
| 42 | } | 
|---|
| 43 |  | 
|---|
| 44 |  | 
|---|
| 45 |  | 
|---|
| 46 | if (!ilastok) return -1; | 
|---|
| 47 | double lastmjd = (*ilast).mjd; | 
|---|
| 48 | if (mjd > lastmjd) return -1; | 
|---|
| 49 | if (ilast == elems.begin()) return -1; | 
|---|
| 50 | set<elem>::const_iterator i = ilast; i--; | 
|---|
| 51 | double prevmjd = (*i).mjd; | 
|---|
| 52 | if (mjd < prevmjd) return -1; | 
|---|
| 53 |  | 
|---|
| 54 | double x = (mjd - prevmjd) / (lastmjd - prevmjd); | 
|---|
| 55 |  | 
|---|
| 56 | lat = (*i).lat*(1-x) + (*ilast).lat*x; | 
|---|
| 57 | lon = (*i).lon*(1-x) + (*ilast).lon*x; | 
|---|
| 58 | alt = (*i).alt*(1-x) + (*ilast).alt*x; | 
|---|
| 59 |  | 
|---|
| 60 | return 0; | 
|---|
| 61 | } | 
|---|
| 62 |  | 
|---|
| 63 | void AuxInterpGPS::FitsDump(string const& filename) { | 
|---|
| 64 | int fitsStatus=0; | 
|---|
| 65 | fitsfile* fptr; | 
|---|
| 66 | remove(filename.c_str()); | 
|---|
| 67 | fits_create_file(&fptr, filename.c_str(), &fitsStatus); | 
|---|
| 68 | char* colnames[4] = {"MJD","LATITUDE","LONGITUDE","ALTITUDE"}; | 
|---|
| 69 | char* coltypes[4] = {"1D","1D","1D","1D"}; | 
|---|
| 70 | char* colunits[4] = {" ", " " , " ", " "}; | 
|---|
| 71 | fits_create_tbl(fptr, BINARY_TBL, 0, 4, colnames, coltypes, colunits, NULL, &fitsStatus); | 
|---|
| 72 | fits_write_date(fptr, &fitsStatus); | 
|---|
| 73 | fits_write_comment(fptr, "Generated with archtoi " ARCHTOI_VERS, &fitsStatus); | 
|---|
| 74 | int fitsLine = 1; | 
|---|
| 75 | for (set<elem>::iterator i = elems.begin(); i != elems.end(); i++,fitsLine++) { | 
|---|
| 76 | fits_write_col_dbl(fptr, 1, fitsLine, 1, 1, (double*) &(*i).mjd, &fitsStatus); | 
|---|
| 77 | fits_write_col_dbl(fptr, 2, fitsLine, 1, 1, (double*) &(*i).lat, &fitsStatus); | 
|---|
| 78 | fits_write_col_dbl(fptr, 3, fitsLine, 1, 1, (double*) &(*i).lon, &fitsStatus); | 
|---|
| 79 | fits_write_col_dbl(fptr, 4, fitsLine, 1, 1, (double*) &(*i).alt, &fitsStatus); | 
|---|
| 80 | } | 
|---|
| 81 |  | 
|---|
| 82 | fits_close_file(fptr, &fitsStatus); | 
|---|
| 83 | fits_report_error(stderr, fitsStatus);  /* print out any error messages */ | 
|---|
| 84 | } | 
|---|