[556] | 1 | // gondolageom.cc
|
---|
| 2 | // Eric Aubourg CEA/DAPNIA/SPP octobre 1999
|
---|
| 3 |
|
---|
| 4 | #include <math.h>
|
---|
| 5 | #include "gondolageom.h"
|
---|
[612] | 6 |
|
---|
| 7 |
|
---|
[556] | 8 | extern "C" {
|
---|
| 9 | #include "aa_hadec.h"
|
---|
| 10 | }
|
---|
| 11 |
|
---|
| 12 | #ifndef M_PI
|
---|
| 13 | #define M_PI 3.1415926535
|
---|
| 14 | #endif
|
---|
| 15 |
|
---|
[622] | 16 | double GondolaGeom::elevFPC = 41.5833;
|
---|
| 17 | double GondolaGeom::azFPC = 0.264411 + 0.78/cos(41.5833*M_PI/180);
|
---|
[556] | 18 | double GondolaGeom::elevSST0 = 39.6567;
|
---|
[581] | 19 | double GondolaGeom::sstPixelHeight = 0.031359;
|
---|
[556] | 20 |
|
---|
| 21 | // ;
|
---|
| 22 | // ; /\ 4 2
|
---|
| 23 | // ; elevation || positive scanning, clockwise
|
---|
| 24 | // ; || 6 1 5 ---------->
|
---|
| 25 | // ; || == positive azimut
|
---|
| 26 | // ; || x 3
|
---|
| 27 | // |----| = 0.78 deg / cos(elev)
|
---|
[622] | 28 | // bol 1 = 41.5833° elevation
|
---|
[556] | 29 |
|
---|
| 30 |
|
---|
[612] | 31 | GondolaGeom::GondolaGeom()
|
---|
| 32 | : fit(200, 2)
|
---|
| 33 | {
|
---|
[556] | 34 | azPend = 0;
|
---|
| 35 | angPend = 0;
|
---|
| 36 |
|
---|
| 37 | nstars = -1;
|
---|
| 38 | }
|
---|
| 39 |
|
---|
| 40 | void GondolaGeom::setEarthPos(double lon, double lat) {
|
---|
| 41 | this->lon = lon;
|
---|
| 42 | this->lat = lat;
|
---|
| 43 | }
|
---|
| 44 |
|
---|
| 45 | void GondolaGeom::setTSid(double ts) {
|
---|
| 46 | this->ts = ts;
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | void GondolaGeom::setPendulation(double azimuth, double ampl) {
|
---|
| 50 | azPend = azimuth;
|
---|
| 51 | angPend = ampl;
|
---|
| 52 | }
|
---|
| 53 |
|
---|
| 54 | void GondolaGeom::addStar(double deltasn, double az, double elv, double /*diod*/) {
|
---|
| 55 | if (nstars<0) {
|
---|
| 56 | nstars = 0;
|
---|
[612] | 57 | fit.clear();
|
---|
[556] | 58 | }
|
---|
| 59 |
|
---|
| 60 | nstars++;
|
---|
| 61 | double azCor = (az - angPend * cos((az - azPend) * M_PI/180) * tan(elv * M_PI/180));
|
---|
| 62 | if (nstars == 1) {
|
---|
| 63 | az0 = azCor;
|
---|
| 64 | }
|
---|
| 65 | if (azCor - az0 > 180) azCor -= 360;
|
---|
| 66 | if (azCor - az0 < -180) azCor += 360;
|
---|
[612] | 67 |
|
---|
| 68 | fit.addData(deltasn, azCor);
|
---|
[556] | 69 | }
|
---|
| 70 |
|
---|
[577] | 71 | // $CHECK$ do a higher order fit ?
|
---|
| 72 | int GondolaGeom::solveStars() {
|
---|
| 73 | if (nstars<2) return -1;
|
---|
[612] | 74 | fit.doFit();
|
---|
| 75 | azimut = fit.value(0);
|
---|
[556] | 76 |
|
---|
| 77 | if (azimut > 360) azimut -= 360;
|
---|
| 78 | if (azimut < 0) azimut += 360;
|
---|
[577] | 79 |
|
---|
[612] | 80 | nstars = -1;
|
---|
| 81 |
|
---|
[577] | 82 | return 0;
|
---|
[556] | 83 | }
|
---|
| 84 |
|
---|
| 85 | void GondolaGeom::getPointing(double elv, double az, double& trueElv, double& trueAz) {
|
---|
| 86 | trueElv = elv - angPend * sin((az - azPend) * M_PI/180);
|
---|
| 87 | trueAz = az + angPend * cos((az - azPend) * M_PI/180) * tan(elv * M_PI/180);
|
---|
| 88 | }
|
---|
| 89 |
|
---|
| 90 | void GondolaGeom::getSkyPointing(double elv, double az, double& ra, double& dec) {
|
---|
| 91 | double trueElv, trueAz;
|
---|
| 92 | getPointing(elv, az, trueElv, trueAz);
|
---|
| 93 |
|
---|
| 94 | double ha;
|
---|
| 95 | aa_hadec (lat * M_PI/180, elv * M_PI/180, az * M_PI/180, &ha, &dec);
|
---|
| 96 | ra = - (ha * 180. / M_PI / 15) + (ts/3600.);
|
---|
| 97 | while (ra>24) ra -= 24;
|
---|
| 98 | while (ra<0) ra += 24;
|
---|
| 99 | dec = dec * 180. / M_PI;
|
---|
| 100 | }
|
---|
| 101 |
|
---|
| 102 | double GondolaGeom::getAzimutSST() {
|
---|
| 103 | double elv, az;
|
---|
| 104 | getPointing(elevSST0, azimut, elv, az);
|
---|
| 105 | return az;
|
---|
| 106 | }
|
---|
| 107 |
|
---|
| 108 | double GondolaGeom::getElvSST() {
|
---|
| 109 | double elv, az;
|
---|
| 110 | getPointing(elevSST0, azimut, elv, az);
|
---|
| 111 | return elv;
|
---|
| 112 | }
|
---|
| 113 |
|
---|
| 114 | double GondolaGeom::getAlphaSST() {
|
---|
| 115 | double ra, dec;
|
---|
| 116 | getSkyPointing(elevSST0, azimut, ra, dec);
|
---|
| 117 | return ra;
|
---|
| 118 | }
|
---|
| 119 |
|
---|
| 120 | double GondolaGeom::getDeltaSST() {
|
---|
| 121 | double ra, dec;
|
---|
| 122 | getSkyPointing(elevSST0, azimut, ra, dec);
|
---|
| 123 | return dec;
|
---|
| 124 | }
|
---|
| 125 |
|
---|
| 126 | void GondolaGeom::getAltAzBolo(int ibolo, double& elv, double& az) { // azimut relative to SST.
|
---|
| 127 | double delElv = 0;
|
---|
| 128 | double delAz = 0; // relative to ch1-bolo1
|
---|
| 129 | switch (ibolo) {
|
---|
[622] | 130 | case 11: // ch1-bolo1
|
---|
[556] | 131 | delElv = 0;
|
---|
| 132 | delAz = 0;
|
---|
| 133 | break;
|
---|
[622] | 134 | case 8: // ch1-bolo2
|
---|
[556] | 135 | delElv = 0.78 * sqrt(3.)/2.;
|
---|
| 136 | delAz = 0.78 * 1./2.;
|
---|
| 137 | break;
|
---|
[622] | 138 | case 13: // ch1-bolo3
|
---|
[556] | 139 | delElv = - 0.78 * sqrt(3.)/2.;
|
---|
| 140 | delAz = 0.78 * 1./2.;
|
---|
| 141 | break;
|
---|
[622] | 142 | case 9: // ch2-bolo4
|
---|
[556] | 143 | delElv = 0.78 * sqrt(3.)/2.;
|
---|
| 144 | delAz = - 0.78 * 1./2.;
|
---|
| 145 | break;
|
---|
[622] | 146 | case 4: // ch2-bolo5
|
---|
[556] | 147 | delElv = 0.;
|
---|
| 148 | delAz = 0.78;
|
---|
| 149 | break;
|
---|
[622] | 150 | case 15: // ch3-bolo6
|
---|
[556] | 151 | delElv = 0.;
|
---|
| 152 | delAz = - 0.78;
|
---|
| 153 | break;
|
---|
| 154 | default:
|
---|
| 155 | return;
|
---|
| 156 | }
|
---|
| 157 | elv = elevFPC + delElv;
|
---|
| 158 | delAz /= cos(elv * M_PI/180);
|
---|
| 159 | az = azFPC + delAz;
|
---|
| 160 | return;
|
---|
| 161 | }
|
---|
| 162 |
|
---|
| 163 | double GondolaGeom::getAzimutBolo(int ibolo) {
|
---|
| 164 | double elv, az;
|
---|
| 165 | getAltAzBolo(ibolo, elv, az);
|
---|
| 166 | double trueelv, trueaz;
|
---|
| 167 | getPointing(elv, az, trueelv, trueaz);
|
---|
| 168 | return trueaz;
|
---|
| 169 | }
|
---|
| 170 |
|
---|
| 171 | double GondolaGeom::getElvBolo(int ibolo) {
|
---|
| 172 | double elv, az;
|
---|
| 173 | getAltAzBolo(ibolo, elv, az);
|
---|
| 174 | double trueelv, trueaz;
|
---|
| 175 | getPointing(elv, az, trueelv, trueaz);
|
---|
| 176 | return trueelv;
|
---|
| 177 | }
|
---|
| 178 |
|
---|
| 179 |
|
---|
| 180 | double GondolaGeom::getAlphaBolo(int ibolo) {
|
---|
| 181 | double elv, az;
|
---|
| 182 | getAltAzBolo(ibolo, elv, az);
|
---|
| 183 | double ra, dec;
|
---|
| 184 | getSkyPointing(elv, az, ra, dec);
|
---|
| 185 | return ra;
|
---|
| 186 | }
|
---|
| 187 |
|
---|
| 188 |
|
---|
| 189 | double GondolaGeom::getDeltaBolo(int ibolo) {
|
---|
| 190 | double elv, az;
|
---|
| 191 | getAltAzBolo(ibolo, elv, az);
|
---|
| 192 | double ra, dec;
|
---|
| 193 | getSkyPointing(elv, az, ra, dec);
|
---|
| 194 | return dec;
|
---|
| 195 | }
|
---|
| 196 |
|
---|
| 197 |
|
---|
| 198 | double GondolaGeom::getAlphaCenter() {
|
---|
| 199 | return getAlphaBolo(11);
|
---|
| 200 | }
|
---|
| 201 |
|
---|
| 202 | double GondolaGeom::getDeltaCenter() {
|
---|
| 203 | return getDeltaBolo(11);
|
---|
| 204 | }
|
---|
| 205 |
|
---|
| 206 | double GondolaGeom::getAzimutCenter() {
|
---|
| 207 | return getAzimutBolo(11);
|
---|
| 208 | }
|
---|
| 209 |
|
---|
| 210 | double GondolaGeom::getElvCenter() {
|
---|
| 211 | return getElvBolo(11);
|
---|
| 212 | }
|
---|
| 213 |
|
---|
| 214 | double GondolaGeom::getAzimutAxis() {
|
---|
| 215 | return azPend;
|
---|
| 216 | }
|
---|
| 217 |
|
---|
| 218 | double GondolaGeom::getElvAxis() {
|
---|
| 219 | return 90-angPend;
|
---|
| 220 | }
|
---|
| 221 |
|
---|
| 222 | double GondolaGeom::getAlphaAxis() {
|
---|
| 223 | double elv = getElvAxis();
|
---|
| 224 | double az = getAzimutAxis();
|
---|
| 225 | double ha;
|
---|
| 226 | double ra, dec;
|
---|
| 227 | aa_hadec (lat * M_PI/180, elv * M_PI/180, az * M_PI/180, &ha, &dec);
|
---|
| 228 | ra = - (ha * 180. / M_PI / 15) + (ts/3600.);
|
---|
| 229 | while (ra>24) ra -= 24;
|
---|
| 230 | while (ra<0) ra += 24;
|
---|
| 231 | dec = dec * 180. / M_PI;
|
---|
| 232 | return ra;
|
---|
| 233 | }
|
---|
| 234 |
|
---|
| 235 | double GondolaGeom::getDeltaAxis() {
|
---|
| 236 | double elv = getElvAxis();
|
---|
| 237 | double az = getAzimutAxis();
|
---|
| 238 | double ha;
|
---|
| 239 | double ra, dec;
|
---|
| 240 | aa_hadec (lat * M_PI/180, elv * M_PI/180, az * M_PI/180, &ha, &dec);
|
---|
| 241 | ra = - (ha * 180. / M_PI / 15) + (ts/3600.);
|
---|
| 242 | while (ra>24) ra -= 24;
|
---|
| 243 | while (ra<0) ra += 24;
|
---|
| 244 | dec = dec * 180. / M_PI;
|
---|
| 245 | return dec;
|
---|
| 246 | }
|
---|