source: trunk/MagicSoft/Mars/mgeom/MGeomCam.cc@ 2466

Last change on this file since 2466 was 2463, checked in by tbretz, 22 years ago
*** empty log message ***
File size: 5.9 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@uni-sw.gwdg.de>
19! Author(s): Harald Kornmayer 1/2001
20!
21! Copyright: MAGIC Software Development, 2000-2002
22!
23!
24\* ======================================================================== */
25
26///////////////////////////////////////////////////////////////////////
27//
28// MGeomCam
29//
30// This is the base class of different camera geometries. It creates
31// a pixel object for a given number of pixels and defines the
32// interface of how to acccess the geometry information.
33//
34//
35// Version 1:
36// ----------
37// - first implementation
38//
39// Version 2:
40// ----------
41// - added fPixRatio
42// - added fPixRatioSqrt
43//
44//
45///////////////////////////////////////////////////////////////////////
46#include "MGeomCam.h"
47
48#include <TClass.h> // IsA()->New()
49
50#include "MLog.h"
51#include "MLogManip.h"
52
53#include "MGeomPix.h"
54
55ClassImp(MGeomCam);
56
57using namespace std;
58
59MGeomCam::MGeomCam()
60 : fNumPixels(0), fCamDist(0), fConvMm2Deg(0)
61{
62}
63
64
65
66// --------------------------------------------------------------------------
67//
68// Initializes a Camera Geometry with npix pixels. All pixels
69// are deleted when the corresponding array is deleted.
70//
71MGeomCam::MGeomCam(UInt_t npix, Float_t dist, const char *name, const char *title)
72 : fNumPixels(npix), fCamDist(dist), fConvMm2Deg(kRad2Deg/(dist*1000)), fPixels(npix), fPixRatio(npix), fPixRatioSqrt(npix)
73{
74 fName = name ? name : "MGeomCam";
75 fTitle = title ? title : "Storage container for a camera geometry";
76
77 //
78 // make sure that the destructor delete all contained objects
79 //
80 fPixels.SetOwner();
81
82 for (UInt_t i=0; i<npix; i++)
83 fPixels[i] = new MGeomPix;
84
85 SetReadyToSave();
86}
87
88MGeomPix &MGeomCam::operator[](Int_t i)
89{
90 return *static_cast<MGeomPix*>(fPixels.UncheckedAt(i));
91}
92
93MGeomPix &MGeomCam::operator[](Int_t i) const
94{
95 return *static_cast<MGeomPix*>(fPixels.UncheckedAt(i));
96}
97
98// --------------------------------------------------------------------------
99//
100// Calculate and fill the arrays storing the ratio of the area of a pixel
101// i to the pixel 0 and its square root.
102// The precalculation is done for speed reasons. Having an event the
103// ratio would be calculated at least once for each pixel which is
104// an enormous amount of numerical calculations, which are time
105// consuming and which can be avoided doing the precalculation.
106//
107void MGeomCam::CalcPixRatio()
108{
109 const Double_t a0 = (*this)[0].GetA();
110
111 for (UInt_t i=0; i<fNumPixels; i++)
112 {
113 fPixRatio[i] = a0/(*this)[i].GetA();
114 fPixRatioSqrt[i] = TMath::Sqrt(fPixRatio[i]);
115 }
116}
117
118// --------------------------------------------------------------------------
119//
120// Set the kIsOuterRing flag for all pixels which have a outermost pixel
121// as Next Neighbor and don't have the kIsOutermostRing flag itself.
122//
123void MGeomCam::InitOuterRing()
124{
125 fPixels.ForEach(MGeomPix, CheckOuterRing)(*this);
126}
127
128// --------------------------------------------------------------------------
129//
130// Calculate the highest sector index+1 of all pixels, please make sure
131// the the sector numbers are continous.
132//
133void MGeomCam::CalcNumSectors()
134{
135 fNumSectors = 0;
136
137 for (UInt_t i=0; i<fNumPixels; i++)
138 {
139 const UInt_t s = (*this)[i].GetSector();
140
141 if (s>fNumSectors)
142 fNumSectors = s;
143 }
144
145 fNumSectors++;
146}
147
148// --------------------------------------------------------------------------
149//
150// Calculate the maximum radius of the camera. This is ment for GUI layout.
151//
152void MGeomCam::CalcMaxRadius()
153{
154 fMaxRadius = 0;
155
156 for (UInt_t i=0; i<fNumPixels; i++)
157 {
158 const MGeomPix &pix = (*this)[i];
159
160 const Float_t x = pix.GetX();
161 const Float_t y = pix.GetY();
162 const Float_t d = pix.GetD();
163
164 const Float_t maxr = sqrt(x*x+y*y) + d;
165
166 if (maxr>fMaxRadius)
167 fMaxRadius = maxr;
168 }
169}
170
171// --------------------------------------------------------------------------
172//
173// returns the ratio of the area of the pixel with index 0 to the pixel
174// with the specified index i. 0 Is returned if the index argument is
175// out of range.
176//
177Float_t MGeomCam::GetPixRatio(UInt_t i) const
178{
179 // Former: (*this)[0].GetA()/(*this)[i].GetA();
180 // The const_cast is necessary to support older root version
181 return i<fNumPixels ? const_cast<TArrayF&>(fPixRatio)[i] : 0;
182}
183
184// --------------------------------------------------------------------------
185//
186// returns the square root of the ratio of the area of the pixel with
187// index 0 to the pixel with the specified index i. 0 Is returned if
188// the index argument is out of range.
189//
190Float_t MGeomCam::GetPixRatioSqrt(UInt_t i) const
191{
192 // The const_cast is necessary to support older root version
193 return i<fNumPixels ? const_cast<TArrayF&>(fPixRatioSqrt)[i] : 0;
194}
195
196// --------------------------------------------------------------------------
197//
198// Prints the Geometry information of all pixels in the camera
199//
200void MGeomCam::Print(Option_t *) const
201{
202 //
203 // Print Information about the Geometry of the camera
204 //
205 *fLog << all << " Number of Pixels (" << GetTitle() << "): " << fNumPixels << endl;
206
207 fPixels.Print();
208}
209
210TObject *MGeomCam::Clone(const char *newname) const
211{
212 return (TObject*)IsA()->New();
213}
Note: See TracBrowser for help on using the repository browser.