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

Last change on this file since 6076 was 6076, checked in by moralejo, 21 years ago
*** empty log message ***
File size: 9.1 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
80ClassImp(MSrcPosCalc);
81
82using namespace std;
83
84// --------------------------------------------------------------------------
85//
86// Initialize fY and fY with 0
87//
88MSrcPosCalc::MSrcPosCalc(const char *name, const char *title)
89{
90 fName = name ? name : "MSrcPosCalc";
91 fTitle = title ? title : "Derotates the source position in the camera";
92}
93
94// --------------------------------------------------------------------------
95//
96// Search and if necessary create MSrcPosCam in the parameter list. Search MSourcePos.
97// If not found, do nothing else, and skip the task. If MSrcPosCam did not exist
98// before and has been created here, it will contain as source position the camera
99// center (0,0).
100// In the case that MSourcePos is found, go ahead in searching the rest of necessary
101// containers. The source position will be calculated for each event in Process.
102//
103Int_t MSrcPosCalc::PreProcess(MParList *pList)
104{
105 fSrcPosCam = (MSrcPosCam*)pList->FindCreateObj("MSrcPosCam");
106 if (!fSrcPosCam)
107 return kFALSE;
108
109
110 fSourcePos = (MPointingPos*)pList->FindObject("MSourcePos", "MPointingPos");
111 if (!fSourcePos)
112 {
113 *fLog << warn << "MSourcePos [MPointPos] not found... The source position" << endl;
114 *fLog << warn << "set in MSrcPosCam (camera center if not set explicitely) will" << endl;
115 *fLog << warn << "be left unchanged, same for all events." << endl;
116 return kSKIP;
117 }
118
119 fGeom = (MGeomCam*)pList->FindObject("MGeomCam");
120 if (!fGeom)
121 {
122 *fLog << err << "MGeomCam not found... aborting." << endl;
123 return kFALSE;
124 }
125
126 fPointPos = (MPointingPos*)pList->FindObject("MPointingPos");
127 if (!fPointPos)
128 {
129 *fLog << err << "MPointingPos not found... aborting." << endl;
130 return kFALSE;
131 }
132
133 fObservatory = (MObservatory*)pList->FindObject("MObservatory");
134 if (!fObservatory)
135 {
136 *fLog << err << "MObservatory not found... aborting." << endl;
137 return kFALSE;
138 }
139
140 fTime = (MTime*)pList->FindObject("MTime");
141 if (!fTime)
142 {
143 *fLog << err << "MTime not found... aborting." << endl;
144 return kFALSE;
145 }
146
147 return kTRUE;
148}
149
150// --------------------------------------------------------------------------
151//
152// Loc0LocToCam
153//
154// Input : (theta0, phi0) direction for the position (0,0) in the camera
155// ( theta, phi) some other direction
156//
157// Output : (X, Y) position in the camera corresponding to (theta, phi)
158//
159TVector2 MSrcPosCalc::CalcXYinCamera(const MVector3 &pos0, const MVector3 &pos) const
160{
161 const Double_t theta0 = pos0.Theta();
162 const Double_t phi0 = pos0.Phi();
163
164 const Double_t theta = pos.Theta();
165 const Double_t phi = pos.Phi();
166
167 //--------------------------------------------
168
169 // pos0[3] = TMath::Cos(theta0)
170
171 const Double_t YC0 = TMath::Cos(theta0)*TMath::Tan(theta)*TMath::Cos(phi-phi0) - TMath::Sin(theta0);
172 const Double_t YC1 = TMath::Cos(theta0) + TMath::Sin(theta0)*TMath::Tan(theta);
173 const Double_t YC = YC0 / YC1;
174
175 //--------------------------------------------
176
177 const Double_t XC0 = TMath::Cos(theta0) - YC*TMath::Sin(theta0);
178 const Double_t XC = -TMath::Sin(phi-phi0) * TMath::Tan(theta) * XC0;
179
180 //--------------------------------------------
181 return TVector2(XC, YC);
182}
183
184// --------------------------------------------------------------------------
185//
186// Derotate fX/fY by the current rotation angle, set MSrcPosCam
187//
188Int_t MSrcPosCalc::Process()
189{
190 // *fLog << dbg << "Camera center : Zd=" << fPointPos->GetZd() << " Az=" << fPointPos->GetAz() << endl;
191 // *fLog << dbg << "Camera center : RA=" << fPointPos->GetRa() << " Dec=" << fPointPos->GetDec() << endl;
192 // *fLog << dbg << "MJD: " << fTime->GetMjd() << ", time [ms]: " << fTime->GetTime() << endl;
193
194 MVector3 pos, pos0; // pos: source position; pos0: camera center
195
196 if (fSourcePos)
197 {
198 // Set Sky coordinates of source, taken from container "MSourcePos" of type MPointingPos. The sky
199 // coordinates must be J2000, as the sky coordinates of the camera center that we get from the container
200 // "MPointingPos" filled by the Drive.
201
202 pos.SetRaDec(fSourcePos->GetRaRad(), fSourcePos->GetDecRad());
203
204 // *fLog << dbg << "Sky position of source: Ra=" << fSourcePos->GetRa() <<
205 // " Dec=" << fSourcePos->GetDec() << endl;
206 }
207
208 // Convert sky coordinates of source to local coordinates. Warning! These are not the "true" local
209 // coordinates, since this transformation ignores precession and nutation effects.
210 pos *= MAstroSky2Local(*fTime, *fObservatory);
211
212
213 // Set sky coordinates of camera center in pos0, and then convert to local. Same comment as above. These
214 // coordinates differ from the true local coordinates of the camera center that one could get from
215 // "MPointingPos", calculated by the Drive: the reason is that the Drive takes into account precession
216 // and nutation corrections, while MAstroSky2Local (as of Jan 27 2005 at least) does not. Since we just
217 // want to get the source position on the camera from the local coordinates of the center and the source,
218 // it does not matter that the coordinates contained in pos and pos0 ignore precession and nutation...
219 // since the shift would be the same in both cases. What would be wrong is to set in pos0 directly the
220 // local coordinates found in MPointingPos!
221
222 pos0.SetRaDec(fPointPos->GetRaRad(), fPointPos->GetDecRad());
223 pos0 *= MAstroSky2Local(*fTime, *fObservatory);
224
225 // *fLog << dbg << "From MAstroSky2Local, without precession and nutation corrections:" << endl;
226 // *fLog << dbg << "- Camera center (2) from RA,dec and time : Zd=" << pos0.Theta()*180./TMath::Pi()
227 // << " Az=" << pos0.Phi()*180./TMath::Pi() << endl;
228 // *fLog << dbg << "- Local position of source: Zd=" << pos.Theta()*TMath::RadToDeg() << " Az=" << pos.Phi()*TMath::RadToDeg() << endl;
229
230
231 // Calculate source position in camera, and convert to mm:
232 TVector2 v = CalcXYinCamera(pos0, pos)*fGeom->GetCameraDist()*1000;
233
234 fSrcPosCam->SetXY(v);
235
236 // v *= fGeom->GetConvMm2Deg();
237 // *fLog << dbg << "X=" << v.X() << " deg, Y=" << v.Y() << " deg" << endl;
238 // *fLog << *fTime << endl;
239 // *fLog << endl;
240
241 return kTRUE;
242}
Note: See TracBrowser for help on using the repository browser.