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

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

vendredi soir...

File size: 5.3 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"
9
[419]10#ifndef M_PI
11#define M_PI 3.14159265358979323846
12#endif
13
14TempLocator tempLocator;
15
16TempLocator::TempLocator()
17{
18 lon = lat = ts = 0;
[436]19 raZ = decZ = -99999;
[423]20 xSampleNum = -99999;
21 fitsfile* fptr;
22 int status=0;
23 fits_open_file(&fptr, "samplenum_gal_cross.fits", READONLY, &status);
24 int simple, bitpix, naxis;
25 long naxes;
26 long pcount, gcount;
27 int extend;
28 fits_read_imghdr(fptr, 1, &simple, &bitpix, &naxis, &naxes, &pcount, &gcount, &extend, &status);
29 nGalCross = naxes;
30 crossings = new long[nGalCross];
31 int anynul;
32 fits_read_img_lng(fptr, 0, 1, nGalCross, 0, crossings, &anynul, &status);
33 fits_close_file(fptr, &status);
34 fits_report_error(stderr, status); /* print out any error messages */
[419]35}
[423]36
37
[419]38void TempLocator::setEarthPos(double lon, double lat) {
[423]39 if (this->lon == lon && this->lat == lat) return;
[419]40 this->lon = lon;
41 this->lat = lat;
[436]42 raZ = decZ = -99999; xSampleNum = -99999;
[419]43}
[423]44
[419]45void TempLocator::setTSid(double ts) {
[423]46 if (this->ts == ts) return;
[419]47 this->ts = ts;
[436]48 raZ = decZ = -99999; xSampleNum = -99999;
[419]49}
50
[423]51void TempLocator::ComputeZenith() {
52 double ha;
[436]53 aa_hadec (lat * M_PI/180, .5 * M_PI, 0, &ha, &decZ);
54 raZ = - (ha * 180. / M_PI / 15) + (ts/3600.);
55 if (raZ>24) raZ -= 24;
56 if (raZ<0) raZ += 24;
57 decZ = decZ * 180. / M_PI;
[423]58}
59
[419]60double TempLocator::getAlphaZenith() {
[436]61 if (raZ < -100) ComputeZenith();
62 return raZ;
[419]63}
64
65double TempLocator::getDeltaZenith() {
[436]66 if (decZ < -100) ComputeZenith();
67 return decZ;
[419]68}
69
[436]70#define altbolo1 41.5
71
[423]72void TempLocator::findGeomFromGC(int sampleNum) // pour le bolo qui voit les xing
73{
74 if (sampleNum == xSampleNum) return;
[436]75 if (decZ < -100) ComputeZenith();
[423]76
77 azimBolGC = -9999;
78
79 // On trouve les croisements juste avant et juste apres notre sampleNum
80 int icross;
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
100 double rotSpeed = 360./(crossings[icross] - crossings[icross-1]); // °/sample
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
[426]107void TempLocator::getAltAzBolo(int sampleNum, int ibolo, double& elv, double& az) {
108 findGeomFromGC(sampleNum);
109 double delElv = 0;
[435]110 double delAz = 0; // relative to ch1-bolo1
[426]111 elv = -99999;
112 az = -99999;
113 switch (ibolo) {
114 case 11:
115 delElv = 0;
[435]116 delAz = 0;
[426]117 break;
118 case 8:
119 delElv = 0.78 * sqrt(3.)/2.;
[435]120 delAz = 0.78 * 1./2.;
[426]121 break;
122 case 13:
123 delElv = - 0.78 * sqrt(3.)/2.;
[435]124 delAz = 0.78 * 1./2.;
[426]125 break;
126 case 9:
[436]127 delElv = 0.78 * sqrt(3.)/2.;
128 delAz = - 0.78 * 1./2.;
[426]129 break;
130 case 4:
131 delElv = 0.;
[435]132 delAz = 0.78;
[426]133 break;
134 case 15:
135 delElv = 0.;
[435]136 delAz = - 0.78;
[426]137 break;
138 default:
139 return;
140 }
141 delAz /= cos(41 * M_PI/180);
[436]142 elv = altbolo1 + delElv;
[426]143 az = azimBolGC + delAz;
[436]144 if (az>360) az -= 360;
145 if (az<0) az += 360;
[426]146 return;
147}
[423]148
[426]149double TempLocator::getAzimutBolo(int sampleNum, int ibolo) {
150 double elv, az;
151 getAltAzBolo(sampleNum, ibolo, elv, az);
152 return az;
153}
154
155double TempLocator::getElvBolo(int sampleNum, int ibolo) {
156 double elv, az;
157 getAltAzBolo(sampleNum, ibolo, elv, az);
158 return elv;
159}
160
161double TempLocator::getAlphaBolo(int sampleNum, int ibolo) {
162 double elv, az;
163 getAltAzBolo(sampleNum, ibolo, elv, az);
164 double ha;
[436]165 double ra,dec;
[426]166 aa_hadec (lat * M_PI/180, elv * M_PI/180, az * M_PI/180, &ha, &dec);
167 ra = - (ha * 180. / M_PI / 15) + (ts/3600.);
168 dec = dec * 180. / M_PI;
169 return ra;
170}
171
172double TempLocator::getDeltaBolo(int sampleNum, int ibolo) {
173 double elv, az;
174 getAltAzBolo(sampleNum, ibolo, elv, az);
175 double ha;
[436]176 double ra,dec;
[426]177 aa_hadec (lat * M_PI/180, elv * M_PI/180, az * M_PI/180, &ha, &dec);
178 ra = - (ha * 180. / M_PI / 15) + (ts/3600.);
179 dec = dec * 180. / M_PI;
180 return dec;
181}
182
[432]183double TempLocator::getAlphaCenter(int sampleNum) {
184 return getAlphaBolo(sampleNum, 11);
185}
[426]186
[432]187double TempLocator::getDeltaCenter(int sampleNum) {
188 return getDeltaBolo(sampleNum, 11);
189}
[426]190
[432]191
192
193
[423]194 // ;
195 // ; /\ 4 2
196 // ; elevation || positive scanning, clockwise
197 // ; || 6 1 5 ---------->
198 // ; || == positive azimut
199 // ; || x 3
200 // |----| = 0.78 deg / cos(elev)
201 // bol 1 = 41° elevation
[433]202
Note: See TracBrowser for help on using the repository browser.