source: Sophya/trunk/Poubelle/archTOI.old/gondolageom.cc@ 3997

Last change on this file since 3997 was 624, checked in by ansari, 26 years ago

jupiter

File size: 5.5 KB
RevLine 
[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]8extern "C" {
9#include "aa_hadec.h"
10}
11
12#ifndef M_PI
13#define M_PI 3.1415926535
14#endif
15
[622]16double GondolaGeom::elevFPC = 41.5833;
[623]17double GondolaGeom::azFPC = 0.264411;
[556]18double GondolaGeom::elevSST0 = 39.6567;
[581]19double 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]31GondolaGeom::GondolaGeom()
32: fit(200, 2)
33{
[556]34 azPend = 0;
35 angPend = 0;
36
37 nstars = -1;
38}
39
40void GondolaGeom::setEarthPos(double lon, double lat) {
41 this->lon = lon;
42 this->lat = lat;
43}
44
45void GondolaGeom::setTSid(double ts) {
46 this->ts = ts;
47}
48
49void GondolaGeom::setPendulation(double azimuth, double ampl) {
50 azPend = azimuth;
51 angPend = ampl;
52}
53
54void 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 ?
72int 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
85void 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
90void 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
102double GondolaGeom::getAzimutSST() {
103 double elv, az;
104 getPointing(elevSST0, azimut, elv, az);
105 return az;
106}
107
108double GondolaGeom::getElvSST() {
109 double elv, az;
110 getPointing(elevSST0, azimut, elv, az);
111 return elv;
112}
113
114double GondolaGeom::getAlphaSST() {
115 double ra, dec;
116 getSkyPointing(elevSST0, azimut, ra, dec);
117 return ra;
118}
119
120double GondolaGeom::getDeltaSST() {
121 double ra, dec;
122 getSkyPointing(elevSST0, azimut, ra, dec);
123 return dec;
124}
125
126void 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
163double GondolaGeom::getAzimutBolo(int ibolo) {
164 double elv, az;
165 getAltAzBolo(ibolo, elv, az);
166 double trueelv, trueaz;
[624]167 getPointing(elv, azimut+az, trueelv, trueaz);
[556]168 return trueaz;
169}
170
171double GondolaGeom::getElvBolo(int ibolo) {
172 double elv, az;
173 getAltAzBolo(ibolo, elv, az);
174 double trueelv, trueaz;
[624]175 getPointing(elv, azimut+az, trueelv, trueaz);
[556]176 return trueelv;
177}
178
179
180double GondolaGeom::getAlphaBolo(int ibolo) {
181 double elv, az;
182 getAltAzBolo(ibolo, elv, az);
183 double ra, dec;
[624]184 getSkyPointing(elv, azimut+az, ra, dec);
[556]185 return ra;
186}
187
188
189double GondolaGeom::getDeltaBolo(int ibolo) {
190 double elv, az;
191 getAltAzBolo(ibolo, elv, az);
192 double ra, dec;
[624]193 getSkyPointing(elv, azimut+az, ra, dec);
[556]194 return dec;
195}
196
197
198double GondolaGeom::getAlphaCenter() {
199 return getAlphaBolo(11);
200}
201
202double GondolaGeom::getDeltaCenter() {
203 return getDeltaBolo(11);
204}
205
206double GondolaGeom::getAzimutCenter() {
207 return getAzimutBolo(11);
208}
209
210double GondolaGeom::getElvCenter() {
211 return getElvBolo(11);
212}
213
214double GondolaGeom::getAzimutAxis() {
215 return azPend;
216}
217
218double GondolaGeom::getElvAxis() {
219 return 90-angPend;
220}
221
222double 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
235double 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}
Note: See TracBrowser for help on using the repository browser.