4 #include <utl/Vector.h>
8 #include <utl/GeometryUtilities.h>
9 #include <utl/AxialVector.h>
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>
17 #include <boost/numeric/ublas/matrix.hpp>
18 #include <boost/numeric/ublas/vector.hpp>
19 #include <boost/numeric/ublas/io.hpp>
31 const Vector& magneticField) :
33 fMagneticField(magneticField),
34 fTransformationMatrix(3, 3),
35 fInverseTransformationMatrix(3, 3)
37 const Vector showerdirection = -showeraxis;
62 const utl::Vector& showerDirection = -1 * showerAxis;
63 const double dist = (showerMax - showerCore).GetMag();
64 return 1 + (stationPosition - showerCore) * showerDirection / dist;
72 const Point& stationPosition)
75 const Vector chargeExcessVector =
76 core - stationPosition + showeraxisUnit * ((stationPosition - core) * showeraxisUnit);
101 const Point& CorePosition,
102 const Point& AntennaPosition)
104 const Line line =
Line(CorePosition, ShowerAxis);
105 return Distance(line, AntennaPosition);
112 const Point& stationPosition,
114 const double chargeExcessStrength)
117 * chargeExcessStrength
125 const Point& stationPosition,
127 const double chargeExcessStrength)
138 const Point& stationPosition,
140 const double chargeExcessStrength)
154 const double altitudeObsLvl)
156 const std::vector<Point> intersections =
159 if (intersections.empty())
160 WARNING(
"Shower does not intersect observation level.");
167 for (
const auto& inter : intersections) {
168 const Vector coreToPoint = inter - core;
169 const double dist2 = coreToPoint.
GetMag2();
170 if (first || dist2 < closest2) {
172 toPlane = coreToPoint;
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";
192 boost::numeric::ublas::vector<double> v(3);
196 const boost::numeric::ublas::vector<double> w = boost::numeric::ublas::prod(
fTransformationMatrix, v);
207 boost::numeric::ublas::vector<double> v(3);
211 const boost::numeric::ublas::vector<double> w = boost::numeric::ublas::prod(
fTransformationMatrix, v);
226 for (
unsigned int i = 0; i < trace.
GetSize(); ++i) {
227 boost::numeric::ublas::vector<double> v(3);
231 const boost::numeric::ublas::vector<double> w = boost::numeric::ublas::prod(
fTransformationMatrix, v);
239 ww = w(0), w(1), w(2);
252 for (
unsigned int i = 0; i < trace.
GetSize(); ++i) {
253 boost::numeric::ublas::vector<double> v(3);
259 ww = w(0), w(1), w(2);
268 const bool verticalZero)
271 boost::numeric::ublas::vector<double> v(3);
279 return Point(w(0), w(1), w(2),
fcs);
287 boost::numeric::ublas::vector<double> v(3);
293 return Point(w(0), w(1), w(2),
fcs);
308 const Point& stationPosition,
const Vector& vMagField,
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);
332 const double v_exp_efield[3] =
333 { exp_efield.
GetX(localCS), exp_efield.
GetY(localCS), exp_efield.
GetZ(localCS) };
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);
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) {
344 for (
int j = 0; j < 3; ++j) {
345 v[i] += transfomationMatix[j][i] * v_measured_efield[j];
348 TVector3 measured_efield_transformed(v);
349 if (measured_efield_transformed.x() > 0)
350 measured_efield_transformed *= -1;
AxialVector Cross(const Vector &l, const Vector &r)
double NormalizeAngleMinusPiPi(const double x)
Normalize angle to lie between -pi and pi (-180 and 180 deg)
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 "line" 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
#define INFO(message)
Macro for logging informational messages.
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
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)
RadioGeometryUtilities(const utl::Vector &showeraxis, const utl::CoordinateSystemPtr cs, const utl::Vector &magneticField)
#define WARNING(message)
Macro for logging warning messages.
AxialVector Normalized(const AxialVector &v)
void SetBinning(const double binning)
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
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.
double Angle(const Vector &left, const Vector &right)
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
void PushBack(const T &value)
Insert a single value at the end.
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)
utl::TraceV3D GetTraceFromShowerPlaneVxB(const utl::TraceV3D &trace) const