RadioGeometryUtilities.cc
Go to the documentation of this file.
2 
3 #include <utl/Math.h>
4 #include <utl/Vector.h>
5 #include <utl/Point.h>
6 #include <utl/Line.h>
7 #include <utl/Plane.h>
8 #include <utl/GeometryUtilities.h>
9 #include <utl/AxialVector.h>
10 
11 #include <utl/CoordinateSystem.h>
12 #include <utl/CoordinateSystemPtr.h>
13 #include <utl/TransformationMatrix.h>
14 #include <utl/ReferenceEllipsoid.h>
15 #include <utl/AugerUnits.h>
16 
17 #include <boost/numeric/ublas/matrix.hpp>
18 #include <boost/numeric/ublas/vector.hpp>
19 #include <boost/numeric/ublas/io.hpp>
20 
21 #include <TVector3.h>
22 
23 #include <vector>
24 #include <sstream>
25 
26 using namespace utl;
27 
28 
30  const CoordinateSystemPtr cs,
31  const Vector& magneticField) :
32  fcs(cs),
33  fMagneticField(magneticField),
34  fTransformationMatrix(3, 3),
35  fInverseTransformationMatrix(3, 3)
36 {
37  const Vector showerdirection = -showeraxis;
38  const Vector vxB = Normalized(Cross(showerdirection, magneticField));
39  const Vector vxvxB = Normalized(Cross(showerdirection, vxB));
40  const Vector e3 = Normalized(Cross(vxB, vxvxB));
41 
42  fTransformationMatrix(0, 0) = vxB.GetX(cs);
43  fTransformationMatrix(0, 1) = vxB.GetY(cs);
44  fTransformationMatrix(0, 2) = vxB.GetZ(cs);
45  fTransformationMatrix(1, 0) = vxvxB.GetX(cs);
46  fTransformationMatrix(1, 1) = vxvxB.GetY(cs);
47  fTransformationMatrix(1, 2) = vxvxB.GetZ(cs);
48  fTransformationMatrix(2, 0) = e3.GetX(cs);
49  fTransformationMatrix(2, 1) = e3.GetY(cs);
50  fTransformationMatrix(2, 2) = e3.GetZ(cs);
51 
52  fInverseTransformationMatrix = boost::numeric::ublas::trans(fTransformationMatrix);
53 }
54 
55 
56 double
58  const utl::Point& stationPosition,
59  const utl::Point& showerMax,
60  const utl::Vector& showerAxis)
61 {
62  const utl::Vector& showerDirection = -1 * showerAxis;
63  const double dist = (showerMax - showerCore).GetMag();
64  return 1 + (stationPosition - showerCore) * showerDirection / dist;
65 }
66 
67 
69 Vector
71  const Vector& showeraxis,
72  const Point& stationPosition)
73 {
74  const Vector showeraxisUnit = Normalized(showeraxis);
75  const Vector chargeExcessVector =
76  core - stationPosition + showeraxisUnit * ((stationPosition - core) * showeraxisUnit); // showeraxis has to be normalized
77  return Normalized(chargeExcessVector);
78 }
79 
80 
82 Vector
83 RadioGeometryUtilities::GetLorentzVector(const Vector& showeraxis, const Vector& vMagField)
84 {
85  return Cross(Normalized(showeraxis), Normalized(vMagField));
86 }
87 
88 
89 double
91  const Vector& showeraxis,
92  const Vector& vMagField)
93 {
94  return Angle(measuredEField, RadioGeometryUtilities::GetLorentzVector(showeraxis, vMagField));
95 }
96 
97 
99 double
101  const Point& CorePosition,
102  const Point& AntennaPosition)
103 {
104  const Line line = Line(CorePosition, ShowerAxis);
105  return Distance(line, AntennaPosition);
106 }
107 
108 
109 double
111  const Vector& showeraxis,
112  const Point& stationPosition,
113  const Vector& vMagField,
114  const double chargeExcessStrength)
115 {
116  return 1 / (RadioGeometryUtilities::GetChargeExcessVector(core, showeraxis, stationPosition)
117  * chargeExcessStrength
118  + RadioGeometryUtilities::GetLorentzVector(showeraxis, vMagField)).GetMag();
119 }
120 
121 
122 Vector
124  const Vector& showeraxis,
125  const Point& stationPosition,
126  const Vector& vMagField,
127  const double chargeExcessStrength)
128 {
129  return RadioGeometryUtilities::GetLorentzVector(showeraxis, vMagField) +
130  chargeExcessStrength * RadioGeometryUtilities::GetChargeExcessVector(core, showeraxis, stationPosition);
131 }
132 
133 
134 double
136  const Point& core,
137  const Vector& showeraxis,
138  const Point& stationPosition,
139  const Vector& vMagField,
140  const double chargeExcessStrength)
141 {
142  return
143  Angle(
144  measuredEField,
145  RadioGeometryUtilities::GetExpectedEFieldVector(core, showeraxis, stationPosition, vMagField, chargeExcessStrength)
146  );
147 }
148 
149 
150 const Point
152  const Vector& showerAxis,
153  const CoordinateSystemPtr cs,
154  const double altitudeObsLvl)
155 {
156  const std::vector<Point> intersections =
157  Intersection(ReferenceEllipsoid::Get(ReferenceEllipsoid::eWGS84), altitudeObsLvl, Line(core, showerAxis));
158 
159  if (intersections.empty())
160  WARNING("Shower does not intersect observation level.");
161 
162  // pick closest point (there are typically two solutions)
163  Vector toPlane;
164  double closest2 = 0;
165  bool first = true;
166 
167  for (const auto& inter : intersections) {
168  const Vector coreToPoint = inter - core;
169  const double dist2 = coreToPoint.GetMag2();
170  if (first || dist2 < closest2) {
171  closest2 = dist2;
172  toPlane = coreToPoint;
173  first = false;
174  }
175  }
176 
177  const Point newCore = Point(0, 0, 0, CoordinateSystem::Translation(toPlane, cs));
178 
179  std::ostringstream inf;
180  inf << "Get new core displaced by " << (toPlane * showerAxis) / m << "m "
181  "along shower axis for an observation level of " << altitudeObsLvl / m << "m";
182  INFO(inf);
183 
184  return newCore;
185 }
186 
187 
188 void
189 RadioGeometryUtilities::GetVectorInShowerPlaneVxB(double& x, double& y, double& z, const Point& point)
190  const
191 {
192  boost::numeric::ublas::vector<double> v(3);
193  v(0) = point.GetX(fcs);
194  v(1) = point.GetY(fcs);
195  v(2) = point.GetZ(fcs);
196  const boost::numeric::ublas::vector<double> w = boost::numeric::ublas::prod(fTransformationMatrix, v);
197  x = w(0);
198  y = w(1);
199  z = w(2);
200 }
201 
202 
203 void
204 RadioGeometryUtilities::GetVectorInShowerPlaneVxB(double& x, double& y, double& z, const TVector3& vector)
205  const
206 {
207  boost::numeric::ublas::vector<double> v(3);
208  v(0) = vector[0];
209  v(1) = vector[1];
210  v(2) = vector[2];
211  const boost::numeric::ublas::vector<double> w = boost::numeric::ublas::prod(fTransformationMatrix, v);
212  x = w(0);
213  y = w(1);
214  z = w(2);
215 }
216 
217 
218 TraceV3D
220  const
221 {
222  TraceV3D rotatedTrace;
223  rotatedTrace.SetBinning(trace.GetBinning());
224  //double max1 = 0;
225  //double max2 = 0;
226  for (unsigned int i = 0; i < trace.GetSize(); ++i) {
227  boost::numeric::ublas::vector<double> v(3);
228  v(0) = trace[i][0];
229  v(1) = trace[i][1];
230  v(2) = trace[i][2];
231  const boost::numeric::ublas::vector<double> w = boost::numeric::ublas::prod(fTransformationMatrix, v);
232  /*const double max_tmp1 = sqrt(v(0)*v(0) + v(1)*v(1) + v(2)*v(2));
233  const double max_tmp2 = sqrt(w(0)*w(0) + w(1)*w(1) + w(2)*w(2));
234  if (max_tmp1 > max1)
235  max1 = max_tmp1;
236  if (max_tmp2 > max2)
237  max2 = max_tmp2;*/
238  Vector3D ww;
239  ww = w(0), w(1), w(2);
240  rotatedTrace.PushBack(ww);
241  }
242  return rotatedTrace;
243 }
244 
245 
246 TraceV3D
248  const
249 {
250  TraceV3D rotatedTrace;
251  rotatedTrace.SetBinning(trace.GetBinning());
252  for (unsigned int i = 0; i < trace.GetSize(); ++i) {
253  boost::numeric::ublas::vector<double> v(3);
254  v(0) = trace[i][0];
255  v(1) = trace[i][1];
256  v(2) = trace[i][2];
257  const boost::numeric::ublas::vector<double> w = boost::numeric::ublas::prod(fInverseTransformationMatrix, v);
258  Vector3D ww;
259  ww = w(0), w(1), w(2);
260  rotatedTrace.PushBack(ww);
261  }
262  return rotatedTrace;
263 }
264 
265 
266 Point
267 RadioGeometryUtilities::GetVectorFromShowerPlaneVxB(const double x, const double y, const double z,
268  const bool verticalZero)
269  const
270 {
271  boost::numeric::ublas::vector<double> v(3);
272  v(0) = x;
273  v(1) = y;
274  v(2) = z;
275  boost::numeric::ublas::vector<double> w = boost::numeric::ublas::prod(fInverseTransformationMatrix, v);
276  if (verticalZero)
277  w(2) = 0;
278 
279  return Point(w(0), w(1), w(2), fcs);
280 }
281 
282 
283 Point
285  const
286 {
287  boost::numeric::ublas::vector<double> v(3);
288  v(0) = x;
289  v(1) = y;
290  v(2) = GetHeightInShowerPlane(x, y);
291  const boost::numeric::ublas::vector<double> w = boost::numeric::ublas::prod(fInverseTransformationMatrix, v);
292 
293  return Point(w(0), w(1), w(2), fcs);
294 }
295 
296 
297 double
298 RadioGeometryUtilities::GetHeightInShowerPlane(const double x, const double y)
299  const
300 {
301  return -1. * (fTransformationMatrix(0, 2) * x + fTransformationMatrix(1, 2) * y) / fTransformationMatrix(2, 2);
302 }
303 
304 
305 double
307  const Point& core, const Vector& showeraxis,
308  const Point& stationPosition, const Vector& vMagField,
309  const double chargeExcessStrength, const CoordinateSystemPtr localCS)
310 {
311  const Vector vxB = Normalized(Cross(showeraxis, -vMagField));
312  const Vector vxvxB = Normalized(Cross(showeraxis, vxB));
313  const Vector e3 = Normalized(Cross(vxB, vxvxB));
314 
315  double transfomationMatix[3][3];
316  transfomationMatix[0][0] = vxB.GetX(localCS);
317  transfomationMatix[1][0] = vxB.GetY(localCS);
318  transfomationMatix[2][0] = vxB.GetZ(localCS);
319  transfomationMatix[0][1] = vxvxB.GetX(localCS);
320  transfomationMatix[1][1] = vxvxB.GetY(localCS);
321  transfomationMatix[2][1] = vxvxB.GetZ(localCS);
322  transfomationMatix[0][2] = e3.GetX(localCS);
323  transfomationMatix[1][2] = e3.GetY(localCS);
324  transfomationMatix[2][2] = e3.GetZ(localCS);
325 
326  //TransformationMatrix transM =
327  // TransformationMatrix::TransformToBasis(vxB.GetX(localCS), vxvxB.GetX(localCS), e3.GetX(localCS),
328  // vxB.GetY(localCS), vxvxB.GetY(localCS), e3.GetY(localCS),
329  // vxB.GetZ(localCS), vxvxB.GetZ(localCS), e3.GetZ(localCS));
330  const Vector exp_efield =
331  RadioGeometryUtilities::GetExpectedEFieldVector(core, showeraxis, stationPosition, vMagField, chargeExcessStrength);
332  const double v_exp_efield[3] =
333  { exp_efield.GetX(localCS), exp_efield.GetY(localCS), exp_efield.GetZ(localCS) };
334  double v[3] = { 0 };
335  for (int i = 0; i < 3; ++i)
336  for (int j = 0; j < 3; ++j)
337  v[i] += transfomationMatix[j][i] * v_exp_efield[j];
338  const TVector3 exp_efield_transformed(v);
339 
340  const double v_measured_efield[3] =
341  { measuredEField.GetX(localCS), measuredEField.GetY(localCS), measuredEField.GetZ(localCS) };
342  for (int i = 0; i < 3; ++i) {
343  v[i] = 0;
344  for (int j = 0; j < 3; ++j) {
345  v[i] += transfomationMatix[j][i] * v_measured_efield[j];
346  }
347  }
348  TVector3 measured_efield_transformed(v);
349  if (measured_efield_transformed.x() > 0)
350  measured_efield_transformed *= -1;
351 
352  const double diff = NormalizeAngleMinusPiPi(exp_efield_transformed.Phi() - measured_efield_transformed.Phi());
353  return diff;
354 }
AxialVector Cross(const Vector &l, const Vector &r)
Definition: OperationsAV.h:25
double NormalizeAngleMinusPiPi(const double x)
Normalize angle to lie between -pi and pi (-180 and 180 deg)
Point object.
Definition: Point.h:32
boost::numeric::ublas::matrix< double > fInverseTransformationMatrix
const utl::CoordinateSystemPtr fcs
static double GetDistanceToAxis(const utl::Vector &ShowerAxis, const utl::Point &CorePosition, const utl::Point &AntennaPosition)
computes the distance from the antenna position to the shower &quot;line&quot; defined by the core position and...
static double GetEarlyLateCorrectionFactor(const utl::Point &showerCore, const utl::Point &stationPosition, const utl::Point &showerMax, const utl::Vector &showerAxis)
static double GetAngleToEFieldExpectation2D(const utl::Vector &measuredEField, const utl::Point &core, const utl::Vector &showeraxis, const utl::Point &stationPosition, const utl::Vector &vMagField, const double chargeExcessStrength, const utl::CoordinateSystemPtr localCS)
boost::numeric::ublas::matrix< double > fTransformationMatrix
double GetBinning() const
size of one slot
Definition: Trace.h:138
#define INFO(message)
Macro for logging informational messages.
Definition: ErrorLogger.h:161
static utl::Vector GetChargeExcessVector(const utl::Point &core, const utl::Vector &showeraxis, const utl::Point &stationPosition)
returns the charge excess vector normalized to unity
static const ReferenceEllipsoid & Get(const EllipsoidID theID)
Get known ellipsoid by registered ID.
double Distance(const Line &line1, const Line &line2)
Line Intersection(const Plane &p1, const Plane &p2)
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
utl::Point GetVectorFromShowerPlaneVxB(const double x, const double y, const double z, const bool verticalZero) const
in case of positions, the positions has to be relative to the core positions!!!
static double GetAngleToEFieldExpectation(const utl::Vector &measuredEField, const utl::Point &core, const utl::Vector &showeraxis, const utl::Point &stationPosition, const utl::Vector &vMagField, const double chargeExcessStrength)
double GetX(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:206
static utl::Vector GetLorentzVector(const utl::Vector &showeraxis, const utl::Vector &vMagField)
returns the Lorentz force vector normalized to length = 1 for maximal emission (showeraxis vertical t...
static const Point GetCoreAtObservationLevel(const Point &core, const Vector &showerAxis, const CoordinateSystemPtr cs, const double altitudeObsLvl)
SizeType GetSize() const
Definition: Trace.h:156
RadioGeometryUtilities(const utl::Vector &showeraxis, const utl::CoordinateSystemPtr cs, const utl::Vector &magneticField)
#define WARNING(message)
Macro for logging warning messages.
Definition: ErrorLogger.h:163
AxialVector Normalized(const AxialVector &v)
Definition: AxialVector.h:81
static Policy::type Translation(const Vector &theTranslation, const CoordinateSystemPtr &theCS)
Construct from translation by vector.
void SetBinning(const double binning)
Definition: Trace.h:139
void GetVectorInShowerPlaneVxB(double &x, double &y, double &z, const utl::Point &point) const
in case of positions, the positions has to be relative to the core positions!!!
double GetY(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:209
static utl::Vector GetExpectedEFieldVector(const utl::Point &core, const utl::Vector &showeraxis, const utl::Point &stationPosition, const utl::Vector &vMagField, const double chargeExcessStrength)
Template class for a FADC data or calibrated data container. Use the typedefs (TraceD, TraceI, etc.) defined in Trace-fwd.h.
Definition: Trace-fwd.h:19
double Angle(const Vector &left, const Vector &right)
Definition: OperationsVV.h:82
Vector object.
Definition: Vector.h:30
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:212
void PushBack(const T &value)
Insert a single value at the end.
Definition: Trace.h:119
constexpr double m
Definition: AugerUnits.h:121
static double GetAngleToLorentzVector(const utl::Vector &measuredEField, const utl::Vector &showeraxis, const utl::Vector &vMagField)
utl::TraceV3D GetTraceInShowerPlaneVxB(const utl::TraceV3D &trace) const
double GetHeightInShowerPlane(const double x, const double y) const
static double GetSignalCorrectionFactor(const utl::Point &core, const utl::Vector &showeraxis, const utl::Point &stationPosition, const utl::Vector &vMagField, const double chargeExcessStrength)
Definition: Line.h:17
utl::TraceV3D GetTraceFromShowerPlaneVxB(const utl::TraceV3D &trace) const
double GetMag2() const
Definition: Vector.h:61

, generated on Tue Sep 26 2023.