source: branches/FACT++_lidctrl_usb/drive/MPointing.h@ 19092

Last change on this file since 19092 was 18618, checked in by tbretz, 10 years ago
Copied files from Mars and Cosy to compile toold which fit our current drivectrl.
File size: 10.6 KB
Line 
1#ifndef MARS_MPointing
2#define MARS_MPointing
3
4#ifndef ROOT_TArrayD
5#include <TArrayD.h>
6#endif
7
8#ifndef ROOT_TVector2
9#include <TVector2.h>
10#endif
11
12#ifndef ROOT_TVector3
13#include <TVector3.h>
14#endif
15
16#ifndef MARS_MParContainer
17#include "MParContainer.h"
18#endif
19
20// ---------------------------------------------------
21
22#define XY TVector2
23
24inline TVector2 Div(const TVector2 &v1, const TVector2 &v2)
25{
26 return TVector2(v1.X()/v2.X(), v1.Y()/v2.Y());
27}
28inline TVector2 Mul(const TVector2 &v1, const TVector2 &v2)
29{
30 return TVector2(v1.X()*v2.X(), v1.Y()*v2.Y());
31}
32
33inline TVector2 operator-(const TVector2 &v) { return TVector2(-v.X(), -v.Y()); }
34
35class AltAz : public XY
36{
37public:
38 AltAz(double alt=0, double az=0) : XY(alt, az) {}
39
40 double Alt() const { return fX; }
41 double Az() const { return fY; }
42
43 void operator*=(double c) { fX*=c; fY*=c; }
44 void operator/=(double c) { fX*=c; fY*=c; }
45
46 void Alt(double d) { fX=d; }
47 void Az(double d) { fY=d; }
48 void operator*=(const XY &c) { fX*=c.X(); fY*=c.Y(); }
49 void operator/=(const XY &c) { fX/=c.X(); fY/=c.Y(); }
50 void operator-=(const AltAz &c) { fX-=c.fX; fY-=c.fY; }
51 void operator+=(const AltAz &c) { fX+=c.fX; fY+=c.fY; }
52
53 AltAz operator/(double c) const { return AltAz(fX/c, fY/c); }
54 AltAz operator*(double c) const { return AltAz(fX*c, fY*c); }
55 AltAz operator*(const XY &c) const { return AltAz(fX*c.X(), fY*c.Y()); }
56 AltAz operator/(const XY &c) const { return AltAz(fX/c.X(), fY/c.Y()); }
57 AltAz operator+(const AltAz &c) const { return AltAz(fX+c.fX, fY+c.fY); }
58 AltAz operator-(const AltAz &c) const { return AltAz(fX-c.fX, fY-c.fY); }
59 AltAz operator-() const { return AltAz(-fX, -fY); }
60
61 ClassDef(AltAz, 0)
62};
63
64class ZdAz : public XY
65{
66public:
67 ZdAz(double zd=0, double az=0) : XY(zd, az) {}
68 ZdAz(const ZdAz &c) : XY(c) {}
69
70 void operator*=(double c) { fX*=c; fY*=c; }
71 void operator/=(double c) { fX*=c; fY*=c; }
72
73 double Zd() const { return fX; }
74 double Az() const { return fY; }
75
76 void Zd(double d) { fX=d; }
77 void Az(double d) { fY=d; }
78 void operator*=(const XY &c) { fX*=c.X(); fY*=c.Y(); }
79 void operator/=(const XY &c) { fX/=c.X(); fY/=c.Y(); }
80 void operator-=(const ZdAz &c) { fX-=c.fX; fY-=c.fY; }
81 void operator+=(const ZdAz &c) { fX+=c.fX; fY+=c.fY; }
82
83 ZdAz operator/(double c) const { return ZdAz(fX/c, fY/c); }
84 ZdAz operator*(double c) const { return ZdAz(fX*c, fY*c); }
85 ZdAz operator*(const XY &c) const { return ZdAz(fX*c.X(), fY*c.Y()); }
86 ZdAz operator/(const XY &c) const { return ZdAz(fX/c.X(), fY/c.Y()); }
87 ZdAz operator+(const ZdAz &c) const { return ZdAz(fX+c.fX, fY+c.fY); }
88 ZdAz operator-(const ZdAz &c) const { return ZdAz(fX-c.fX, fY-c.fY); }
89 ZdAz operator-() const { return ZdAz(-fX, -fY); }
90
91 // MSlewing only?!?
92 double Ratio() const { return fX/fY; }
93 void Round();
94 void Abs();
95
96 ClassDef(ZdAz, 0)
97};
98
99class RaDec : public XY
100{
101public:
102 RaDec(double ra=0, double dec=0) : XY(ra, dec) {}
103
104 double Ra() const { return fX; }
105 double Dec() const { return fY; }
106
107 void operator*=(double c) { fX*=c; fY*=c; }
108 void operator/=(double c) { fX*=c; fY*=c; }
109
110 void Ra(double x) { fX = x; }
111 void Dec(double y) { fY = y; }
112
113 RaDec operator/(double c) const { return RaDec(fX/c, fY/c); }
114 RaDec operator*(double c) const { return RaDec(fX*c, fY*c); }
115 RaDec operator*(const XY &c) const { return RaDec(fX*c.X(), fY*c.Y()); }
116 RaDec operator+(const RaDec &c) const { return RaDec(fX+c.fX, fY+c.fY); }
117 RaDec operator-(const RaDec &c) const { return RaDec(fX-c.fX, fY-c.fY); }
118 RaDec operator-() const { return RaDec(-fX, -fY); }
119
120 ClassDef(RaDec, 0)
121};
122
123// ---------------------------------------------------
124
125class TMinuit;
126
127class MPointing : public MParContainer
128{
129private:
130 enum {
131 kIA, // [rad] Index Error in Elevation
132 kIE, // [rad] Index Error in Azimuth
133 kFLOP, // [rad] Vertical Sag
134 kAN, // [rad] Az-El Nonperpendicularity
135 kAW, // [rad] Left-Right Collimation Error
136 kNPAE, // [rad] Azimuth Axis Misalignment (N-S)
137 kCA, // [rad] Azimuth Axis Misalignment (E-W)
138 kTF, // [rad] Tube fluxture (sin)
139 kTX, // [rad] Tube fluxture (tan)
140 kECES, // [rad] Nasmyth rotator displacement, horizontal
141 kACES, // [rad] Nasmyth rotator displacement, vertical
142 kECEC, // [rad] Alt/Az Coude Displacement (N-S)
143 kACEC, // [rad] Alt/Az Coude Displacement (E-W)
144 kNRX, // [rad] Elevation Centering Error (sin)
145 kNRY, // [rad] Azimuth Centering Error (sin)
146 kCRX, // [rad] Elevation Centering Error (cos)
147 kCRY, // [rad] Azimuth Centering Error (cos)
148 kMAGIC1, // [rad] Magic Term (what is it?)
149 kMAGIC2, // [rad] Magic Term (what is it?)
150 kPX, // [rad] Starguider calibration fixed offset x
151 kPY, // [rad] Starguider calibration fixed offset y
152 kDX, // [rad] Starguider calibration additional offset dx
153 kDY, // [rad] Starguider calibration additional offset dy
154 kNumPar // Number of elements
155 };
156
157
158 Double_t fIe ; // [rad] Index Error in Elevation
159 Double_t fIa ; // [rad] Index Error in Azimuth
160 Double_t fFlop ; // [rad] Vertical Sag
161 Double_t fNpae ; // [rad] Az-El Nonperpendicularity
162 Double_t fCa ; // [rad] Left-Right Collimation Error
163 Double_t fAn ; // [rad] Azimuth Axis Misalignment (N-S)
164 Double_t fAw ; // [rad] Azimuth Axis Misalignment (E-W)
165 Double_t fTf ; // [rad] Tube fluxture (sin)
166 Double_t fTx ; // [rad] Tube fluxture (tan)
167 Double_t fNrx ; // [rad] Nasmyth rotator displacement, horizontal
168 Double_t fNry ; // [rad] Nasmyth rotator displacement, vertical
169 Double_t fCrx ; // [rad] Alt/Az Coude Displacement (N-S)
170 Double_t fCry ; // [rad] Alt/Az Coude Displacement (E-W)
171 Double_t fEces ; // [rad] Elevation Centering Error (sin)
172 Double_t fAces ; // [rad] Azimuth Centering Error (sin)
173 Double_t fEcec ; // [rad] Elevation Centering Error (cos)
174 Double_t fAcec ; // [rad] Azimuth Centering Error (cos)
175 Double_t fMagic1; // [rad] Magic Term (what is it?)
176 Double_t fMagic2; // [rad] Magic Term (what is it?)
177
178 Double_t fPx; // [rad] Starguider calibration fixed offset x
179 Double_t fPy; // [rad] Starguider calibration fixed offset y
180 Double_t fDx; // [rad] Starguider calibration additional offset dx
181 Double_t fDy; // [rad] Starguider calibration additional offset dy
182
183 Double_t **fCoeff; //!
184 TString *fNames; //!
185 TString *fDescr; //!
186
187 TArrayD fError;
188
189 void Init(const char *name=0, const char *title=0);
190
191 void Clear(Option_t *o="")
192 {
193 for (int i=0; i<kNumPar; i++)
194 {
195 *fCoeff[i] = 0;
196 fError[i] = -1;
197 }
198 }
199
200 static Double_t Sign(Double_t val, Double_t alt);
201 AltAz CalcAnAw(const AltAz &p, Int_t sign) const;
202
203public:
204 MPointing() : fError(kNumPar) { Init(); Clear(); }
205 MPointing(const char *name) : fError(kNumPar) { Init(); Clear(); Load(name); }
206 virtual ~MPointing() { delete [] fNames; delete [] fCoeff; delete [] fDescr; }
207
208 Bool_t Load(const char *name);
209 Bool_t Save(const char *name);
210
211 void Reset();
212
213 ZdAz Correct(const ZdAz &zdaz) const;
214 AltAz Correct(const AltAz &aaz) const;
215 TVector3 Correct(const TVector3 &v) const;
216
217 ZdAz CorrectBack(const ZdAz &zdaz) const;
218 AltAz CorrectBack(const AltAz &aaz) const;
219 TVector3 CorrectBack(const TVector3 &v) const;
220
221 ZdAz operator()(const ZdAz &zdaz) const { return Correct(zdaz); }
222 AltAz operator()(const AltAz &aaz) const { return Correct(aaz); }
223 TVector3 operator()(const TVector3 &v) const { return Correct(v); }
224
225 ZdAz operator()(const ZdAz &zdaz, void (*fcn)(ZdAz &zdaz, Double_t *par)) const
226 {
227 Double_t par[kNumPar];
228 GetParameters(par);
229 ZdAz za = zdaz;
230 fcn(za, par);
231 return za;
232 }
233
234 AltAz operator()(const AltAz &aaz, void (*fcn)(AltAz &aaz, Double_t *par)) const
235 {
236 Double_t par[kNumPar];
237 GetParameters(par);
238 AltAz aa = aaz;
239 fcn(aa, par);
240 return aa;
241 }
242
243 TVector3 operator()(const TVector3 &aaz, void (*fcn)(TVector3 &aaz, Double_t *par)) const
244 {
245 Double_t par[kNumPar];
246 GetParameters(par);
247 TVector3 v = aaz;
248 fcn(v, par);
249 return v;
250 }
251
252 AltAz AddOffsets(const AltAz &aa) const;
253 ZdAz AddOffsets(const ZdAz &zdaz) const;
254 TVector3 AddOffsets(const TVector3 &v) const;
255
256 AltAz SubtractOffsets(const AltAz &aa) const;
257 ZdAz SubtractOffsets(const ZdAz &zdaz) const;
258 TVector3 SubtractOffsets(const TVector3 &v) const;
259
260 void SetParameters(const Double_t *par, Int_t n=kNumPar);
261 void GetParameters(Double_t *par, Int_t n=kNumPar) const;
262
263 void SetParameters(const TArrayD &par)
264 {
265 SetParameters(par.GetArray(), par.GetSize());
266 }
267 void GetParameters(TArrayD &par) const
268 {
269 par.Set(kNumPar);
270 GetParameters(par.GetArray());
271 }
272 void GetError(TArrayD &par) const;
273
274 Double_t &operator[](UInt_t i) { return *fCoeff[i]; }
275
276 void SetMinuitParameters(TMinuit &m, Int_t n=-1) const;
277 void GetMinuitParameters(TMinuit &m, Int_t n=-1);
278 void PrintMinuitParameters(TMinuit &m, Int_t n=-1) const;
279
280 const TString &GetVarName(int i) const { return fNames[i]; }
281 const TString &GetDescription(int i) const { return fDescr[i]; }
282
283 /*
284 Double_t GetIe() const { return fIe; }
285 Double_t GetIa() const { return fIa; }
286 Double_t GetCa() const { return fCa; }
287 Double_t GetAn() const { return fAn; }
288 Double_t GetAw() const { return fAw; }
289 Double_t GetNrx() const { return fNrx; }
290 Double_t GetNry() const { return fNry; }
291 Double_t GetCrx() const { return fNrx; }
292 Double_t GetCry() const { return fNry; }
293 Double_t GetEces() const { return fEces; }
294 Double_t GetEcec() const { return fEcec; }
295 Double_t GetAces() const { return fAces; }
296 Double_t GetAcec() const { return fAcec; }
297 Double_t GetNpae() const { return fNpae; }
298 */
299
300 TVector2 GetDxy() const;// { return TVector2(fDx, fDy)*TMath::RadToDeg(); }
301
302 Double_t GetPx() const;// { return fPx*TMath::RadToDeg(); }
303 Double_t GetPy() const;// { return fPy*TMath::RadToDeg(); }
304
305 Bool_t IsPxValid() const { return fError[kPX]>0; }
306 Bool_t IsPyValid() const { return fError[kPY]>0; }
307
308 static const Int_t GetNumPar() { return kNumPar; }
309
310 ClassDef(MPointing, 2) // Pointing Model for MAGIC
311};
312
313#endif
Note: See TracBrowser for help on using the repository browser.