source: trunk/MagicSoft/Mars/mpointing/MSrcPosCalc.cc@ 6084

Last change on this file since 6084 was 6082, checked in by tbretz, 20 years ago
*** empty log message ***
File size: 9.2 KB
Line 
1/* ======================================================================== *\
2!
3! *
4! * This file is part of MARS, the MAGIC Analysis and Reconstruction
5! * Software. It is distributed to you in the hope that it can be a useful
6! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
7! * It is distributed WITHOUT ANY WARRANTY.
8! *
9! * Permission to use, copy, modify and distribute this software and its
10! * documentation for any purpose is hereby granted without fee,
11! * provided that the above copyright notice appear in all copies and
12! * that both that copyright notice and this permission notice appear
13! * in supporting documentation. It is provided "as is" without express
14! * or implied warranty.
15! *
16!
17!
18! Author(s): Thomas Bretz 3/2004 <mailto:tbretz@astro.uni-wuerzburg.de>
19! Abelardo Moralejo 1/2005 <mailto:moralejo@pd.infn.it>
20!
21! Copyright: MAGIC Software Development, 2000-2004
22!
23!
24\* ======================================================================== */
25
26//////////////////////////////////////////////////////////////////////////////
27//
28// MSrcPosCalc
29//
30// Calculate the current source position in the camera from the (possibly already
31// corrected, by starguider) J2000 sky coordinates of the camera center (contained
32// in MPointingPos), and the source J2000 sky coordinates contained in MSourcePos
33// (of type MPointingPos as well). If no MSourcePos is found in the parameter list,
34// source position is assumed to be the same for all events, that specified in
35// MSrcPosCam (if it already existed in the parameter list), or (0,0), the center
36// of the camera, if no MSrcPosCam was present in the parameter list. In both cases,
37// no calculation is necessary and then the PreProcess returns kSKIP so that the task
38// is removed from the task list.
39//
40// The conversion factor between the camera plain (mm) and the
41// sky (deg) is taken from MGeomCam. The time is taken from MTime, and the coordinates
42// of the observatory from MObservatory.
43//
44// Input Container:
45// MPointingPos
46// MObservatory
47// MGeomCam
48// MTime
49// [MSourcePos] (of type MPointingPos)
50//
51// Output Container:
52// MSrcPosCam
53//
54// To be done:
55// - wobble mode missing /// NOTE, A. Moralejo: I see no need for special code
56//
57// - a switch between using sky-coordinates and time or local-coordinates
58// from MPointingPos for determine the rotation angle
59///// NOTE, A. Moralejo: the above is not possible if MAstroSky2Local does not
60///// account for precession and nutation.
61//
62// - the center of rotation need not to be the camera center
63///// NOTE, A. Moralejo: I don't see the need for special code either.
64//
65//////////////////////////////////////////////////////////////////////////////
66#include "MSrcPosCalc.h"
67
68#include "MParList.h"
69
70#include "MLog.h"
71#include "MLogManip.h"
72
73#include "MRawRunHeader.h"
74#include "MObservatory.h"
75#include "MSrcPosCam.h"
76#include "MAstroSky2Local.h"
77#include "MPointingPos.h"
78#include "MGeomCam.h"
79#include "MVector3.h"
80
81ClassImp(MSrcPosCalc);
82
83using namespace std;
84
85// --------------------------------------------------------------------------
86//
87// Initialize fY and fY with 0
88//
89MSrcPosCalc::MSrcPosCalc(const char *name, const char *title)
90 : fObservatory(0), fPointPos(0), fSourcePos(0), fSrcPosCam(0),
91 fGeom(0), fTime(0)
92{
93 fName = name ? name : "MSrcPosCalc";
94 fTitle = title ? title : "Derotates the source position in the camera";
95}
96
97// --------------------------------------------------------------------------
98//
99// Search and if necessary create MSrcPosCam in the parameter list. Search MSourcePos.
100// If not found, do nothing else, and skip the task. If MSrcPosCam did not exist
101// before and has been created here, it will contain as source position the camera
102// center (0,0).
103// In the case that MSourcePos is found, go ahead in searching the rest of necessary
104// containers. The source position will be calculated for each event in Process.
105//
106Int_t MSrcPosCalc::PreProcess(MParList *pList)
107{
108 fSrcPosCam = (MSrcPosCam*)pList->FindCreateObj("MSrcPosCam");
109 if (!fSrcPosCam)
110 return kFALSE;
111
112
113 fSourcePos = (MPointingPos*)pList->FindObject("MSourcePos", "MPointingPos");
114 if (!fSourcePos)
115 {
116 *fLog << warn << "MSourcePos [MPointPos] not found... The source position" << endl;
117 *fLog << warn << "set in MSrcPosCam (camera center if not set explicitely) will" << endl;
118 *fLog << warn << "be left unchanged, same for all events." << endl;
119 return kSKIP;
120 }
121
122 fGeom = (MGeomCam*)pList->FindObject("MGeomCam");
123 if (!fGeom)
124 {
125 *fLog << err << "MGeomCam not found... aborting." << endl;
126 return kFALSE;
127 }
128
129 fPointPos = (MPointingPos*)pList->FindObject("MPointingPos");
130 if (!fPointPos)
131 {
132 *fLog << err << "MPointingPos not found... aborting." << endl;
133 return kFALSE;
134 }
135
136 fObservatory = (MObservatory*)pList->FindObject("MObservatory");
137 if (!fObservatory)
138 {
139 *fLog << err << "MObservatory not found... aborting." << endl;
140 return kFALSE;
141 }
142
143 fTime = (MTime*)pList->FindObject("MTime");
144 if (!fTime)
145 {
146 *fLog << err << "MTime not found... aborting." << endl;
147 return kFALSE;
148 }
149
150 return kTRUE;
151}
152
153// --------------------------------------------------------------------------
154//
155// Loc0LocToCam
156//
157// Input : (theta0, phi0) direction for the position (0,0) in the camera
158// ( theta, phi) some other direction
159//
160// Output : (X, Y) position in the camera corresponding to (theta, phi)
161//
162TVector2 MSrcPosCalc::CalcXYinCamera(const MVector3 &pos0, const MVector3 &pos) const
163{
164 const Double_t theta0 = pos0.Theta();
165 const Double_t phi0 = pos0.Phi();
166
167 const Double_t theta = pos.Theta();
168 const Double_t phi = pos.Phi();
169
170 //--------------------------------------------
171
172 // pos0[3] = TMath::Cos(theta0)
173
174 const Double_t YC0 = TMath::Cos(theta0)*TMath::Tan(theta)*TMath::Cos(phi-phi0) - TMath::Sin(theta0);
175 const Double_t YC1 = TMath::Cos(theta0) + TMath::Sin(theta0)*TMath::Tan(theta);
176 const Double_t YC = YC0 / YC1;
177
178 //--------------------------------------------
179
180 const Double_t XC0 = TMath::Cos(theta0) - YC*TMath::Sin(theta0);
181 const Double_t XC = -TMath::Sin(phi-phi0) * TMath::Tan(theta) * XC0;
182
183 //--------------------------------------------
184 return TVector2(XC, YC);
185}
186
187// --------------------------------------------------------------------------
188//
189// Derotate fX/fY by the current rotation angle, set MSrcPosCam
190//
191Int_t MSrcPosCalc::Process()
192{
193 // *fLog << dbg << "Camera center : Zd=" << fPointPos->GetZd() << " Az=" << fPointPos->GetAz() << endl;
194 // *fLog << dbg << "Camera center : RA=" << fPointPos->GetRa() << " Dec=" << fPointPos->GetDec() << endl;
195 // *fLog << dbg << "MJD: " << fTime->GetMjd() << ", time [ms]: " << fTime->GetTime() << endl;
196
197 MVector3 pos, pos0; // pos: source position; pos0: camera center
198
199 if (fSourcePos)
200 {
201 // Set Sky coordinates of source, taken from container "MSourcePos" of type MPointingPos. The sky
202 // coordinates must be J2000, as the sky coordinates of the camera center that we get from the container
203 // "MPointingPos" filled by the Drive.
204
205 pos.SetRaDec(fSourcePos->GetRaRad(), fSourcePos->GetDecRad());
206
207 // *fLog << dbg << "Sky position of source: Ra=" << fSourcePos->GetRa() <<
208 // " Dec=" << fSourcePos->GetDec() << endl;
209 }
210
211 // Convert sky coordinates of source to local coordinates. Warning! These are not the "true" local
212 // coordinates, since this transformation ignores precession and nutation effects.
213 pos *= MAstroSky2Local(*fTime, *fObservatory);
214
215
216 // Set sky coordinates of camera center in pos0, and then convert to local. Same comment as above. These
217 // coordinates differ from the true local coordinates of the camera center that one could get from
218 // "MPointingPos", calculated by the Drive: the reason is that the Drive takes into account precession
219 // and nutation corrections, while MAstroSky2Local (as of Jan 27 2005 at least) does not. Since we just
220 // want to get the source position on the camera from the local coordinates of the center and the source,
221 // it does not matter that the coordinates contained in pos and pos0 ignore precession and nutation...
222 // since the shift would be the same in both cases. What would be wrong is to set in pos0 directly the
223 // local coordinates found in MPointingPos!
224
225 pos0.SetRaDec(fPointPos->GetRaRad(), fPointPos->GetDecRad());
226 pos0 *= MAstroSky2Local(*fTime, *fObservatory);
227
228 // *fLog << dbg << "From MAstroSky2Local, without precession and nutation corrections:" << endl;
229 // *fLog << dbg << "- Camera center (2) from RA,dec and time : Zd=" << pos0.Theta()*180./TMath::Pi()
230 // << " Az=" << pos0.Phi()*180./TMath::Pi() << endl;
231 // *fLog << dbg << "- Local position of source: Zd=" << pos.Theta()*TMath::RadToDeg() << " Az=" << pos.Phi()*TMath::RadToDeg() << endl;
232
233
234 // Calculate source position in camera, and convert to mm:
235 TVector2 v = CalcXYinCamera(pos0, pos)*fGeom->GetCameraDist()*1000;
236
237 fSrcPosCam->SetXY(v);
238
239 // v *= fGeom->GetConvMm2Deg();
240 // *fLog << dbg << "X=" << v.X() << " deg, Y=" << v.Y() << " deg" << endl;
241 // *fLog << *fTime << endl;
242 // *fLog << endl;
243
244 return kTRUE;
245}
Note: See TracBrowser for help on using the repository browser.