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

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

sst

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