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 | }
|
---|