KaliVeda
Toolkit for HIC analysis
KVPosition.h
1 /***************************************************************************
2  kvposition.h - description
3  -------------------
4  begin : Sun May 19 2002
5  copyright : (C) 2002 by J.D. Frankland
6  email : frankland@ganil.fr
7 
8 $Id: KVPosition.h,v 1.20 2009/01/19 14:36:57 ebonnet Exp $
9  ***************************************************************************/
10 
11 /***************************************************************************
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * *
18  ***************************************************************************/
19 
20 #ifndef KVPOSITION_H
21 #define KVPOSITION_H
22 #include "TMath.h"
23 #include "KVBase.h"
24 #include "TVector3.h"
25 #include "TRotation.h"
26 class TGeoHMatrix;
27 class TGeoBBox;
28 
91 class KVPosition {
92 private:
94  mutable Double_t fPhi;
100 
101  /* ROOT Geometry */
105 
107  {
108  return GetVolumeCentre() - GetSurfaceCentre();
109  }
111  {
112  return GetVolumeCentre().Unit().Dot(GetSCVector().Unit());
113  }
114 
115 public:
116  KVPosition();
117  KVPosition(Double_t thmin, Double_t thmax, Double_t phmin, Double_t phmax, Double_t dist = 0.0);
118  void init();
119  virtual ~KVPosition();
120  virtual void SetAzimuthalAngle(Double_t ph);
121  virtual void SetPolarAngle(Double_t th);
122  virtual void SetPolarWidth(Double_t pw);
123  virtual void SetPolarMinMax(Double_t min, Double_t max);
124  virtual void SetAzimuthalWidth(Double_t aw);
125  virtual void SetAzimuthalMinMax(Double_t min, Double_t max);
127  {
129  }
130  virtual TVector3 GetRandomDirection(Option_t* t = "isotropic");
132  virtual void GetRandomAngles(Double_t& th, Double_t& ph, Option_t* t = "isotropic");
133  void CalculateEstimatedAngularLimits(int N=10000);
134  virtual TVector3 GetDirection();
135 
136  Bool_t IsInPolarRange(const Double_t theta);
137  Bool_t IsInPhiRange(const Double_t phi);
142 
144  {
145  if(ROOTGeo() && fPhi_min==fPhi_max)
146  const_cast<KVPosition*>(this)->CalculateEstimatedAngularLimits();
147  return fPhi_min;
148  }
150  {
151  if(ROOTGeo() && fPhi_min==fPhi_max)
152  const_cast<KVPosition*>(this)->CalculateEstimatedAngularLimits();
153  return fPhi_max;
154  }
156  {
157  if(ROOTGeo() && fTheta_min==fTheta_max)
158  const_cast<KVPosition*>(this)->CalculateEstimatedAngularLimits();
159  return fTheta_min;
160  }
162  {
163  if(ROOTGeo() && fTheta_min==fTheta_max)
164  const_cast<KVPosition*>(this)->CalculateEstimatedAngularLimits();
165  return fTheta_max;
166  }
167  Double_t GetAzimuthalWidth(Double_t phmin = -1., Double_t phimax =
168  -1.) const;
169  virtual Double_t GetTheta() const
170  {
171  return fTheta;
172  }
173  virtual Double_t GetSinTheta() const
174  {
175  return TMath::Sin(fTheta * TMath::DegToRad());
176  }
177  virtual Double_t GetCosTheta() const
178  {
179  return TMath::Cos(fTheta * TMath::DegToRad());
180  }
181  virtual Double_t GetPhi() const
182  {
183  if (fPhi >= 360.0)
184  fPhi -= 360.;
185  return fPhi;
186  }
188  {
189  SetPolarAngle(t);
190  }
191  void SetPhi(Double_t p)
192  {
194  }
196  {
197  fDistance = d;
198  }
199  virtual Double_t GetDistance(void) const
200  {
201  return fDistance;
202  }
203  void GetCornerCoordinates(TVector3*, Double_t /*depth*/ = 0);
204  void GetCornerCoordinatesInOwnFrame(TVector3*, Double_t /*depth*/ = 0);
205  void GetWidthsFromDimension(Double_t lin_dim);
206 
207  virtual Double_t GetSolidAngle(void) const;
208 
209  /* ROOT Geometry */
210  virtual Bool_t ROOTGeo() const
211  {
213  return (fMatrix && fShape);
214  }
215  virtual void SetMatrix(const TGeoHMatrix*);
216  virtual void SetShape(TGeoBBox*);
217  virtual TGeoHMatrix* GetMatrix() const;
218  virtual TGeoBBox* GetShape() const;
219  virtual TVector3 GetRandomPointOnSurface() const;
220  virtual TVector3 GetSurfaceCentre() const;
221  virtual TVector3 GetVolumeCentre() const;
222  virtual TVector3 GetSurfaceNormal() const;
223  virtual Double_t GetSurfaceArea(int npoints = 100000) const;
224  virtual Double_t GetMisalignmentAngle() const;
225 
226  ClassDef(KVPosition, 1)//Class handling geometry of detectors in a multidetector array
227 };
228 
229 #endif
#define d(i)
bool Bool_t
double Double_t
const char Option_t
#define ClassDef(name, id)
winID h TVirtualViewer3D TVirtualGLPainter p
Base class used for handling geometry in a multidetector array.
Definition: KVPosition.h:91
virtual void GetRandomAngles(Double_t &th, Double_t &ph, Option_t *t="isotropic")
Definition: KVPosition.cpp:280
Bool_t IsInPhiRange(const Double_t phi)
Definition: KVPosition.cpp:360
virtual void SetAzimuthalWidth(Double_t aw)
Definition: KVPosition.cpp:189
virtual TVector3 GetRandomDirection(Option_t *t="isotropic")
Definition: KVPosition.cpp:242
Bool_t IsAzimuthallyWiderThan(KVPosition *pos)
Definition: KVPosition.cpp:470
virtual void SetShape(TGeoBBox *)
Definition: KVPosition.cpp:758
virtual void SetAzimuthalMinMax(Double_t min, Double_t max)
Set min and max azimuthal angles and calculate (mean) phi.
Definition: KVPosition.cpp:216
virtual void SetAzimuthalAngle(Double_t ph)
Definition: KVPosition.cpp:117
virtual Double_t GetSolidAngle(void) const
Definition: KVPosition.cpp:591
virtual Double_t GetTheta() const
Definition: KVPosition.h:169
void GetCornerCoordinates(TVector3 *, Double_t=0)
Definition: KVPosition.cpp:520
Double_t fTheta
polar angle in degrees with respect to beam axis, corresponds to centre of telescope
Definition: KVPosition.h:93
virtual TVector3 GetSurfaceCentre() const
Definition: KVPosition.cpp:901
virtual TGeoHMatrix * GetMatrix() const
Definition: KVPosition.cpp:792
void GetWidthsFromDimension(Double_t lin_dim)
Definition: KVPosition.cpp:654
void SetDistance(Double_t d)
Definition: KVPosition.h:195
TRotation GetRandomIsotropicRotation()
Definition: KVPosition.cpp:680
virtual void SetPolarAngle(Double_t th)
Definition: KVPosition.cpp:96
virtual Double_t GetPhi() const
Definition: KVPosition.h:181
Double_t GetPhiMax() const
Definition: KVPosition.h:149
virtual Double_t GetDistance(void) const
Definition: KVPosition.h:199
Double_t fSolidAngle
solid angle = area of entrance window / distance**2
Definition: KVPosition.h:104
TGeoHMatrix * fMatrix
transform world<->detector coordinates
Definition: KVPosition.h:102
Double_t GetPhiMin() const
Definition: KVPosition.h:143
Bool_t IsSmallerThan(KVPosition *pos)
kTRUE if "this" is entirely contained within "pos"
Definition: KVPosition.cpp:403
virtual TVector3 GetVolumeCentre() const
Definition: KVPosition.cpp:930
virtual Double_t GetSurfaceArea(int npoints=100000) const
Definition: KVPosition.cpp:989
TVector3 GetSCVector() const
Definition: KVPosition.h:106
Double_t GetThetaMin() const
Definition: KVPosition.h:155
virtual Double_t GetSinTheta() const
Definition: KVPosition.h:173
Double_t GetOC_SC_CosAngle() const
Definition: KVPosition.h:110
virtual TVector3 GetSurfaceNormal() const
Definition: KVPosition.cpp:960
virtual Double_t GetMisalignmentAngle() const
Double_t fTheta_min
polar angle in degrees corresponding to edge of telescope closest to beam axis
Definition: KVPosition.h:95
Double_t GetAzimuthalWidth(Double_t phmin=-1., Double_t phimax=-1.) const
Definition: KVPosition.cpp:627
Bool_t IsInPolarRange(const Double_t theta)
kTRUE if given angle theta is within the polar range of this solid angle element
Definition: KVPosition.cpp:386
virtual void SetPolarWidth(Double_t pw)
Definition: KVPosition.cpp:147
Bool_t IsAlignedWith(KVPosition *pos)
kTRUE if one of the two solid angle elements is completely contained within the other.
Definition: KVPosition.cpp:419
Double_t fTheta_max
polar angle in degrees of the edge furthest from the beam axis
Definition: KVPosition.h:96
void SetTheta(Double_t t)
Definition: KVPosition.h:187
void CalculateEstimatedAngularLimits(int N=10000)
Definition: KVPosition.cpp:336
Double_t fPhi
azimuthal angle in degrees with respect to 12 o'clock (=0 deg.), corresponds to centre of telescope
Definition: KVPosition.h:94
TGeoBBox * fShape
shape of detector volume
Definition: KVPosition.h:103
void SetPhi(Double_t p)
Definition: KVPosition.h:191
void SetPhiMinMax(Double_t min, Double_t max)
Definition: KVPosition.h:126
virtual void SetPolarMinMax(Double_t min, Double_t max)
Set min and max polar angles and calculate (mean) theta.
Definition: KVPosition.cpp:171
virtual void SetMatrix(const TGeoHMatrix *)
Definition: KVPosition.cpp:717
virtual TGeoBBox * GetShape() const
Definition: KVPosition.cpp:805
Double_t fPhi_max
azimuthal angle in degrees corresponding to most clockwise edge of telescope
Definition: KVPosition.h:98
virtual Double_t GetCosTheta() const
Definition: KVPosition.h:177
Double_t fPhi_min
azimuthal angle in degrees corresponding to most anticlockwise edge of telescope
Definition: KVPosition.h:97
virtual ~KVPosition()
Definition: KVPosition.cpp:58
Bool_t IsOverlappingWith(KVPosition *pos)
kTRUE if there is at least partial overlap between two solid angle elements
Definition: KVPosition.cpp:432
virtual Bool_t ROOTGeo() const
Definition: KVPosition.h:210
Double_t fDistance
distance in cm from centre of solid angle element to coordinate system origin (target)
Definition: KVPosition.h:99
void GetCornerCoordinatesInOwnFrame(TVector3 *, Double_t=0)
Definition: KVPosition.cpp:568
void init()
default initialiser
Definition: KVPosition.cpp:43
Double_t GetThetaMax() const
Definition: KVPosition.h:161
virtual TVector3 GetDirection()
Definition: KVPosition.cpp:487
virtual TVector3 GetRandomPointOnSurface() const
Definition: KVPosition.cpp:828
Double_t Dot(const TVector3 &) const
TVector3 Unit() const
SVector< T, D > Unit(const SVector< T, D > &rhs)
double min(double x, double y)
double max(double x, double y)
constexpr Double_t DegToRad()
Double_t Cos(Double_t)
Double_t Sin(Double_t)