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

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