| 1 | #include "TPointStar.h" | 
|---|
| 2 |  | 
|---|
| 3 | #include <iostream> | 
|---|
| 4 | #include <TMath.h> | 
|---|
| 5 |  | 
|---|
| 6 | #include "MPointing.h" | 
|---|
| 7 |  | 
|---|
| 8 | using namespace std; | 
|---|
| 9 |  | 
|---|
| 10 | void TPointStar::Init(const char *name, const char *title) | 
|---|
| 11 | { | 
|---|
| 12 | fName  = name  ? name  : "TPointStar"; | 
|---|
| 13 | fTitle = title ? title : "A set of TPoints"; | 
|---|
| 14 | } | 
|---|
| 15 |  | 
|---|
| 16 | TPointStar::TPointStar(Double_t sel, Double_t saz, Double_t rel, Double_t raz) : | 
|---|
| 17 | fStarAz(saz*TMath::DegToRad()), | 
|---|
| 18 | fStarEl(sel*TMath::DegToRad()), | 
|---|
| 19 | fRawAz(raz*TMath::DegToRad()), | 
|---|
| 20 | fRawEl(rel*TMath::DegToRad()), fMag(-25) | 
|---|
| 21 | { | 
|---|
| 22 | Init(); | 
|---|
| 23 | } | 
|---|
| 24 |  | 
|---|
| 25 | Double_t TPointStar::GetDEl() const     { return (fRawEl-fStarEl)*TMath::RadToDeg(); } | 
|---|
| 26 | Double_t TPointStar::GetDZd() const     { return -GetDEl(); } | 
|---|
| 27 | Double_t TPointStar::GetDAz() const     { return (fRawAz-fStarAz)*TMath::RadToDeg(); } | 
|---|
| 28 | Double_t TPointStar::GetStarEl() const  { return fStarEl*TMath::RadToDeg(); } | 
|---|
| 29 | Double_t TPointStar::GetStarZd() const  { return 90.-fStarEl*TMath::RadToDeg(); } | 
|---|
| 30 | Double_t TPointStar::GetStarAz() const  { return fStarAz*TMath::RadToDeg(); } | 
|---|
| 31 | Double_t TPointStar::GetRawEl() const   { return fRawEl*TMath::RadToDeg(); } | 
|---|
| 32 | Double_t TPointStar::GetRawAz() const   { return fRawAz*TMath::RadToDeg(); } | 
|---|
| 33 | Double_t TPointStar::GetRawZd() const   { return 90.-fRawEl*TMath::RadToDeg(); } | 
|---|
| 34 |  | 
|---|
| 35 | ZdAz  TPointStar::GetStarZdAz() const   { return ZdAz(TMath::Pi()/2-fStarEl, fStarAz); } | 
|---|
| 36 | AltAz TPointStar::GetStarAltAz() const  { return AltAz(fStarEl, fStarAz); } | 
|---|
| 37 |  | 
|---|
| 38 | ZdAz  TPointStar::GetRawZdAz() const    { return ZdAz(TMath::Pi()/2-fRawEl, fRawAz); } | 
|---|
| 39 | AltAz TPointStar::GetRawAltAz() const   { return AltAz(fRawEl, fRawAz); } | 
|---|
| 40 |  | 
|---|
| 41 | void TPointStar::Adjust(const MPointing &bend) | 
|---|
| 42 | { | 
|---|
| 43 | AltAz p = bend(GetStarAltAz()); | 
|---|
| 44 | fStarEl = p.Alt(); | 
|---|
| 45 | fStarAz = p.Az(); | 
|---|
| 46 | } | 
|---|
| 47 |  | 
|---|
| 48 | void TPointStar::AdjustBack(const MPointing &bend) | 
|---|
| 49 | { | 
|---|
| 50 | AltAz p = bend.CorrectBack(GetRawAltAz()); | 
|---|
| 51 | fRawEl = p.Alt(); | 
|---|
| 52 | fRawAz = p.Az(); | 
|---|
| 53 | } | 
|---|
| 54 |  | 
|---|
| 55 | Double_t TPointStar::GetResidual(Double_t *err) const | 
|---|
| 56 | { | 
|---|
| 57 | const Double_t del = fRawEl-fStarEl; | 
|---|
| 58 | const Double_t daz = fRawAz-fStarAz; | 
|---|
| 59 |  | 
|---|
| 60 | const double x = cos(fRawEl) * cos(fStarEl) * cos(fStarAz-fRawAz); | 
|---|
| 61 | const double y = sin(fRawEl) * sin(fStarEl); | 
|---|
| 62 |  | 
|---|
| 63 | const Double_t d = x + y; | 
|---|
| 64 |  | 
|---|
| 65 | if (err) | 
|---|
| 66 | { | 
|---|
| 67 | // Error of one pixel in the CCD | 
|---|
| 68 | const Double_t e1 = 45./3600*TMath::DegToRad()  /4 * 0.5; | 
|---|
| 69 |  | 
|---|
| 70 | // Error of the SE readout | 
|---|
| 71 | const Double_t e2 = 360./16384*TMath::DegToRad()/4 * 0.5; | 
|---|
| 72 |  | 
|---|
| 73 | const Double_t e11 =  sin(del)+cos(fRawEl)*sin(fStarEl)*(1-cos(daz)); | 
|---|
| 74 | const Double_t e12 =  cos(fRawEl)*cos(fStarEl)*sin(daz); | 
|---|
| 75 |  | 
|---|
| 76 | const Double_t e21 = -sin(del)+sin(fRawEl)*cos(fStarEl)*(1-cos(daz)); | 
|---|
| 77 | const Double_t e22 = -cos(fRawEl)*cos(fStarEl)*sin(daz); | 
|---|
| 78 |  | 
|---|
| 79 | const Double_t err1  = sqrt(1-d*d); | 
|---|
| 80 | const Double_t err2  = (e11*e11 + e12*e12)*e1*e1; | 
|---|
| 81 | const Double_t err3  = (e21*e21 + e22*e22)*e2*e2; | 
|---|
| 82 |  | 
|---|
| 83 | *err = sqrt(err2+err3)/err1 * TMath::RadToDeg(); | 
|---|
| 84 | } | 
|---|
| 85 |  | 
|---|
| 86 | const Double_t dist = acos(d); | 
|---|
| 87 | return dist * TMath::RadToDeg(); | 
|---|
| 88 | } | 
|---|
| 89 |  | 
|---|
| 90 | istream &operator>>(istream &fin, TPointStar &set) | 
|---|
| 91 | { | 
|---|
| 92 | TString str; | 
|---|
| 93 | do | 
|---|
| 94 | { | 
|---|
| 95 | str.ReadLine(fin); | 
|---|
| 96 | if (!fin) | 
|---|
| 97 | return fin; | 
|---|
| 98 | } while (str[0]=='#'); | 
|---|
| 99 |  | 
|---|
| 100 | Float_t v[4], mag; | 
|---|
| 101 | Int_t n = sscanf(str.Data(), "%f %f %f %f %*f %*f %*f %*f %*f %*f %f", v, v+1, v+2, v+3, &mag); | 
|---|
| 102 | if (n<4) | 
|---|
| 103 | { | 
|---|
| 104 | cout << "Read: ERROR - Not enough numbers" << endl; | 
|---|
| 105 | return fin; | 
|---|
| 106 | } | 
|---|
| 107 | set.fMag = n<5 ? -25 : mag; | 
|---|
| 108 |  | 
|---|
| 109 | set.fStarAz = v[0]*TMath::DegToRad(); | 
|---|
| 110 | set.fStarEl = v[1]*TMath::DegToRad(); | 
|---|
| 111 |  | 
|---|
| 112 | set.fRawAz  = v[2]*TMath::DegToRad(); | 
|---|
| 113 | set.fRawEl  = v[3]*TMath::DegToRad(); | 
|---|
| 114 |  | 
|---|
| 115 |  | 
|---|
| 116 |  | 
|---|
| 117 | if (fin) | 
|---|
| 118 | { | 
|---|
| 119 | Double_t res, err; | 
|---|
| 120 | res = set.GetResidual(&err); | 
|---|
| 121 | cout << "Read: " << v[0] << " " << v[1] << "  :  " << v[2] << " " << v[3] << "  :  " << v[2]-v[0] << " " << v[3]-v[1] << "  :  " << res << " " << err << " " << err/res << endl; | 
|---|
| 122 | } | 
|---|
| 123 |  | 
|---|
| 124 | return fin; | 
|---|
| 125 | } | 
|---|
| 126 |  | 
|---|
| 127 | ostream &operator<<(ostream &out, TPointStar &set) | 
|---|
| 128 | { | 
|---|
| 129 | out << Form("%8.3f", set.fStarAz*TMath::RadToDeg()) << " "; | 
|---|
| 130 | out << Form("%7.3f", set.fStarEl*TMath::RadToDeg()) << "   "; | 
|---|
| 131 | out << Form("%8.3f", set.fRawAz*TMath::RadToDeg()) << " "; | 
|---|
| 132 | out << Form("%7.3f", set.fRawEl*TMath::RadToDeg()) << "   "; | 
|---|
| 133 | out << Form("%6.3f", set.fMag); | 
|---|
| 134 |  | 
|---|
| 135 | return out; | 
|---|
| 136 | } | 
|---|