source: trunk/MagicSoft/Mars/mgeom/MGeomPix.cc@ 9223

Last change on this file since 9223 was 9219, checked in by tbretz, 16 years ago
*** empty log message ***
File size: 6.5 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, 12/2000 <mailto:tbretz@astro.uni-wuerzburg.de>
19! Author(s): Harald Kornmayer 1/2001
20!
21! Copyright: MAGIC Software Development, 2000-2008
22!
23!
24\* ======================================================================== */
25
26//////////////////////////////////////////////////////////////////////////////
27//
28// MGeomPix
29//
30// This container stores the geometry (position) information of
31// a single pixel together with the information about next neighbors.
32//
33//
34// Version 1:
35// ----------
36// - first implementation
37//
38// Version 2:
39// ----------
40// - added fA
41//
42// Version 3:
43// ----------
44// - added fAidx
45//
46// Version 4:
47// ----------
48// - added fUserBits
49//
50//
51// FIXME: According to an agreement we have to change the name 'Id' to 'idx'
52//
53////////////////////////////////////////////////////////////////////////////
54#include "MGeomPix.h"
55
56#include <TMath.h>
57#include <TVector2.h>
58
59#include "MLog.h"
60#include "MLogManip.h"
61
62#include "MGeomCam.h"
63
64ClassImp(MGeomPix);
65
66using namespace std;
67
68const Float_t MGeomPix::gsTan30 = tan(30/kRad2Deg);
69const Float_t MGeomPix::gsTan60 = tan(60/kRad2Deg);
70
71// --------------------------------------------------------------------------
72//
73// Initializes one pixel
74//
75MGeomPix::MGeomPix(Float_t x, Float_t y, Float_t r, UInt_t s, UInt_t a)
76{
77 // default constructor
78 Set(x, y, r, s, a);
79 SetNeighbors();
80}
81
82// --------------------------------------------------------------------------
83//
84// Return position as TVector2(fX, fY)
85//
86TVector2 MGeomPix::GetP() const
87{
88 return TVector2(fX, fY);
89}
90
91// --------------------------------------------------------------------------
92//
93// Initializes Next Neighbors.
94//
95// WARNING: This function is public, but it is not meant for user access.
96// It should only be used from geometry classes (like MGeomCam)
97//
98void MGeomPix::SetNeighbors(Short_t i0, Short_t i1, Short_t i2,
99 Short_t i3, Short_t i4, Short_t i5)
100{
101 fNeighbors[0] = i0;
102 fNeighbors[1] = i1;
103 fNeighbors[2] = i2;
104 fNeighbors[3] = i3;
105 fNeighbors[4] = i4;
106 fNeighbors[5] = i5;
107
108 int i;
109 for (i=0; i<6; i++)
110 if (fNeighbors[i]<0)
111 break;
112
113 fNumNeighbors = i;
114
115 fNumNeighbors<5 ? SETBIT(fUserBits, kIsInOutermostRing) : CLRBIT(fUserBits, kIsInOutermostRing);
116}
117
118// --------------------------------------------------------------------------
119//
120// Set the kIsOuterRing flag if this pixel has a outermost pixel
121// as Next Neighbor and don't have the kIsOutermostRing flag itself.
122//
123void MGeomPix::CheckOuterRing(const MGeomCam &cam)
124{
125 if (IsInOutermostRing())
126 return;
127
128 CLRBIT(fUserBits, kIsInOuterRing);
129
130 for (int i=0; i<fNumNeighbors; i++)
131 if (cam[fNeighbors[i]].IsInOutermostRing())
132 {
133 SETBIT(fUserBits, kIsInOuterRing);
134 return;
135 }
136}
137
138// --------------------------------------------------------------------------
139//
140// Print the geometry information of one pixel.
141//
142void MGeomPix::Print(Option_t *opt) const
143{
144 // information about a pixel
145 *fLog << all << "MPixGeom: x/y=" << fX << "/" << fY << "mm ";
146 *fLog << "d= " << fD << "mm A= " << fA << "mm² (";
147 for (int i=0; i<fNumNeighbors; i++)
148 *fLog << fNeighbors[i] << (i<fNumNeighbors-1?",":"");
149 *fLog << ")" << endl;
150}
151
152// ------------------------------------------------------------------------
153//
154// Return distance of center to coordinate origin: hypot(fX,fY)
155//
156Float_t MGeomPix::GetDist() const
157{
158 return TMath::Hypot(fX, fY);
159}
160
161// ------------------------------------------------------------------------
162//
163// Return distance of center to center of pix: hypot(fX-pix.fX,fY-pix.fY)
164//
165Float_t MGeomPix::GetDist(const MGeomPix &pix) const
166{
167 return TMath::Hypot(fX-pix.fX, fY-pix.fY);
168}
169
170// ------------------------------------------------------------------------
171//
172// Return angle defined by the center and the center of pix:
173// atan2(fX-pix.fX,fY-pix.fY)
174//
175Float_t MGeomPix::GetAngle(const MGeomPix &pix) const
176{
177 return TMath::ATan2(fX - pix.GetX(), fY - pix.GetY());
178}
179
180// ------------------------------------------------------------------------
181//
182// compute the distance of a point (px,py) to the Hexagon center in
183// MGeomPix coordinates. Return kTRUE if inside.
184//
185Bool_t MGeomPix::IsInside(Float_t px, Float_t py) const
186{
187 //
188 // compute the distance of the Point to the center of the Hexagon
189 //
190 const Double_t dx = px-fX;
191
192 //
193 // Now check if point is outside of hexagon; just check x coordinate
194 // in three coordinate systems: the default one, in which two sides of
195 // the hexagon are paralel to the y axis (see camera displays) and two
196 // more, rotated with respect to that one by +- 60 degrees.
197 //
198 if (TMath::Abs(dx)>fD/2)
199 return kFALSE;
200
201 const Double_t dy = py-fY;
202
203 const static Double_t cos60 = TMath::Cos(60/kRad2Deg);
204 const static Double_t sin60 = TMath::Sin(60/kRad2Deg);
205
206 const Double_t dxc = dx*cos60;
207 const Double_t dys = dy*sin60;
208
209 if (TMath::Abs(dxc + dys)>fD/2)
210 return kFALSE;
211
212 if (TMath::Abs(dxc - dys)>fD/2)
213 return kFALSE;
214
215 return kTRUE;
216}
217
218// ------------------------------------------------------------------------
219//
220// Return the direction of the pixel pix w.r.t. this pixel.
221// Remark: This function assumes a simple geometry.
222//
223Int_t MGeomPix::GetDirection(const MGeomPix &pix) const
224{
225 const Double_t x1 = GetX();
226 const Double_t y1 = GetY();
227
228 const Double_t x2 = pix.GetX();
229 const Double_t y2 = pix.GetY();
230
231 if (x1<=x2 && y1<y2) return kRightTop;
232 if (x1<=x2 && y1>y2) return kRightBottom;
233 if (x1>=x2 && y1<y2) return kLeftTop;
234 if (x1>=x2 && y1>y2) return kLeftBottom;
235 if (x1<x2) return kRight;
236 if (x1>x2) return kLeft;
237
238 cout << -1 << endl;
239
240 return -1;
241}
Note: See TracBrowser for help on using the repository browser.