source: Sophya/trunk/Poubelle/archTOI.old/templocator.cc@ 534

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

V2

File size: 5.9 KB
RevLine 
[419]1#include "templocator.h"
2#include <math.h>
3extern "C" {
4#include "aa_hadec.h"
5}
6
[423]7#include "fitsio.h"
8#include "plgalcross.h"
[534]9#include "archparam.h"
[423]10
[419]11#ifndef M_PI
12#define M_PI 3.14159265358979323846
13#endif
14
15TempLocator tempLocator;
16
17TempLocator::TempLocator()
18{
19 lon = lat = ts = 0;
[436]20 raZ = decZ = -99999;
[423]21 xSampleNum = -99999;
22 fitsfile* fptr;
23 int status=0;
24 fits_open_file(&fptr, "samplenum_gal_cross.fits", READONLY, &status);
25 int simple, bitpix, naxis;
26 long naxes;
27 long pcount, gcount;
28 int extend;
29 fits_read_imghdr(fptr, 1, &simple, &bitpix, &naxis, &naxes, &pcount, &gcount, &extend, &status);
30 nGalCross = naxes;
31 crossings = new long[nGalCross];
32 int anynul;
33 fits_read_img_lng(fptr, 0, 1, nGalCross, 0, crossings, &anynul, &status);
34 fits_close_file(fptr, &status);
35 fits_report_error(stderr, status); /* print out any error messages */
[419]36}
[423]37
38
[419]39void TempLocator::setEarthPos(double lon, double lat) {
[423]40 if (this->lon == lon && this->lat == lat) return;
[419]41 this->lon = lon;
42 this->lat = lat;
[436]43 raZ = decZ = -99999; xSampleNum = -99999;
[419]44}
[423]45
[419]46void TempLocator::setTSid(double ts) {
[423]47 if (this->ts == ts) return;
[419]48 this->ts = ts;
[436]49 raZ = decZ = -99999; xSampleNum = -99999;
[419]50}
51
[423]52void TempLocator::ComputeZenith() {
53 double ha;
[436]54 aa_hadec (lat * M_PI/180, .5 * M_PI, 0, &ha, &decZ);
55 raZ = - (ha * 180. / M_PI / 15) + (ts/3600.);
56 if (raZ>24) raZ -= 24;
57 if (raZ<0) raZ += 24;
58 decZ = decZ * 180. / M_PI;
[423]59}
60
[419]61double TempLocator::getAlphaZenith() {
[436]62 if (raZ < -100) ComputeZenith();
63 return raZ;
[419]64}
65
66double TempLocator::getDeltaZenith() {
[436]67 if (decZ < -100) ComputeZenith();
68 return decZ;
[419]69}
70
[436]71#define altbolo1 41.5
72
[423]73void TempLocator::findGeomFromGC(int sampleNum) // pour le bolo qui voit les xing
74{
75 if (sampleNum == xSampleNum) return;
[436]76 if (decZ < -100) ComputeZenith();
[423]77
78 azimBolGC = -9999;
79
80 // On trouve les croisements juste avant et juste apres notre sampleNum
81 for (icross=0; icross<nGalCross; icross++) {
82 if (crossings[icross] > sampleNum) break;
83 }
[424]84 if (icross == 0 || icross >= nGalCross) return;
[423]85
[424]86 // On trouve l'azimut du croisement principal pour notre position actuelle
87 double alpG = 12. + 51./60. + 30./3600.;
88 double delG = 27. + 07./60. + 42./3600.;
89 double azCr1, azCr2;
[436]90 int rc = PlGalCross(ts/3600., lat, (90. - altbolo1), alpG, delG, azCr1, azCr2);
[426]91 if (rc != 0) return; // pas deux points d'intersection
[423]92
[426]93 // Il faut determiner le croisement principal, ie le plus proche
94 // du centre galactique. Pendant le vol de Trapani, c'etait celui
95 // le plus proche de 220° d'azimut.
96
97 double azCross = azCr1;
98 if (fabs(azCr2-220) < fabs(azCr1-220)) azCross = azCr2;
99
[534]100 rotSpeed = 360./(crossings[icross] - crossings[icross-1]); // °/sample
[426]101
[435]102 azimBolGC = azCross - (sampleNum - (crossings[icross-1]+12))*rotSpeed;
[436]103 // azimut bolo 1 from crossing, for sampleNum
[426]104 if (azimBolGC > 360) azimBolGC -= 360;
[423]105}
[419]106
[534]107double TempLocator::getRotSpeed(int sampleNum) {
108 findGeomFromGC(sampleNum);
109 return rotSpeed / archParam.acq.perEch;
110}
111
112int TempLocator::getCrossSamples(int sampleNum, int& SN1, int& SN2) {
113 findGeomFromGC(sampleNum);
114 if (icross == 0 || icross >= nGalCross) return -1;
115 SN1 = crossings[icross-1];
116 SN2 = crossings[icross];
117 return 0;
118}
119
120
[426]121void TempLocator::getAltAzBolo(int sampleNum, int ibolo, double& elv, double& az) {
122 findGeomFromGC(sampleNum);
123 double delElv = 0;
[435]124 double delAz = 0; // relative to ch1-bolo1
[426]125 elv = -99999;
126 az = -99999;
127 switch (ibolo) {
128 case 11:
129 delElv = 0;
[435]130 delAz = 0;
[426]131 break;
132 case 8:
133 delElv = 0.78 * sqrt(3.)/2.;
[435]134 delAz = 0.78 * 1./2.;
[426]135 break;
136 case 13:
137 delElv = - 0.78 * sqrt(3.)/2.;
[435]138 delAz = 0.78 * 1./2.;
[426]139 break;
140 case 9:
[436]141 delElv = 0.78 * sqrt(3.)/2.;
142 delAz = - 0.78 * 1./2.;
[426]143 break;
144 case 4:
145 delElv = 0.;
[435]146 delAz = 0.78;
[426]147 break;
148 case 15:
149 delElv = 0.;
[435]150 delAz = - 0.78;
[426]151 break;
152 default:
153 return;
154 }
155 delAz /= cos(41 * M_PI/180);
[436]156 elv = altbolo1 + delElv;
[426]157 az = azimBolGC + delAz;
[436]158 if (az>360) az -= 360;
159 if (az<0) az += 360;
[426]160 return;
161}
[423]162
[426]163double TempLocator::getAzimutBolo(int sampleNum, int ibolo) {
164 double elv, az;
165 getAltAzBolo(sampleNum, ibolo, elv, az);
166 return az;
167}
168
169double TempLocator::getElvBolo(int sampleNum, int ibolo) {
170 double elv, az;
171 getAltAzBolo(sampleNum, ibolo, elv, az);
172 return elv;
173}
174
175double TempLocator::getAlphaBolo(int sampleNum, int ibolo) {
176 double elv, az;
177 getAltAzBolo(sampleNum, ibolo, elv, az);
178 double ha;
[436]179 double ra,dec;
[426]180 aa_hadec (lat * M_PI/180, elv * M_PI/180, az * M_PI/180, &ha, &dec);
181 ra = - (ha * 180. / M_PI / 15) + (ts/3600.);
[534]182 while (ra>24) ra -= 24;
183 while (ra<0) ra += 24;
[426]184 dec = dec * 180. / M_PI;
185 return ra;
186}
187
188double TempLocator::getDeltaBolo(int sampleNum, int ibolo) {
189 double elv, az;
190 getAltAzBolo(sampleNum, ibolo, elv, az);
191 double ha;
[436]192 double ra,dec;
[426]193 aa_hadec (lat * M_PI/180, elv * M_PI/180, az * M_PI/180, &ha, &dec);
194 ra = - (ha * 180. / M_PI / 15) + (ts/3600.);
195 dec = dec * 180. / M_PI;
196 return dec;
197}
198
[432]199double TempLocator::getAlphaCenter(int sampleNum) {
200 return getAlphaBolo(sampleNum, 11);
201}
[426]202
[432]203double TempLocator::getDeltaCenter(int sampleNum) {
204 return getDeltaBolo(sampleNum, 11);
205}
[426]206
[534]207double TempLocator::getAzimutCenter(int sampleNum) {
208 return getAzimutBolo(sampleNum, 11);
209}
[432]210
[534]211double TempLocator::getElvCenter(int sampleNum) {
212 return getElvBolo(sampleNum, 11);
213}
[432]214
215
[534]216
217
[423]218 // ;
219 // ; /\ 4 2
220 // ; elevation || positive scanning, clockwise
221 // ; || 6 1 5 ---------->
222 // ; || == positive azimut
223 // ; || x 3
224 // |----| = 0.78 deg / cos(elev)
225 // bol 1 = 41° elevation
[433]226
Note: See TracBrowser for help on using the repository browser.