3 #include <fwk/CentralConfig.h>
4 #include <fwk/LocalCoordinateSystem.h>
5 #include <fwk/CoordinateSystemRegistry.h>
6 #include <fwk/MagneticFieldModel.h>
8 #include <det/Detector.h>
9 #include <rdet/RDetector.h>
12 #include <utl/MathConstants.h>
13 #include <utl/PhysicalConstants.h>
14 #include <utl/Vector.h>
15 #include <utl/CoordinateSystem.h>
16 #include <utl/AnalyticCoordinateTransformator.h>
18 #include <evt/Event.h>
19 #include <evt/ShowerRecData.h>
20 #include <evt/ShowerRRecData.h>
22 #include <revt/REvent.h>
23 #include <revt/Header.h>
24 #include <revt/Station.h>
25 #include <revt/StationRecData.h>
39 topB.GetChild(
"constantChargeExcess").GetData(fConstantChargeExcess);
40 topB.GetChild(
"maxChargeExcess").GetData(fMaxChargeExcess);
41 topB.GetChild(
"minChargeExcess").GetData(fMinChargeExcess);
42 topB.GetChild(
"percentile").GetData(fProbability);
43 topB.GetChild(
"polStandardDeviations").GetData(fMaxSigmaBeta);
44 topB.GetChild(
"InfoLevel").GetData(fInfoLevel);
45 topB.GetChild(
"zenithCut").GetData(fZenithCut);
46 topB.GetChild(
"noiseErrorModel").GetData(fNoiseErrorModel);
47 SetProbability(GetProbability());
65 WARNING(
"Shower has to be reconstructed before RdStationPolarizationRejector is used... aborting");
80 double covarianceMatrix[3];
81 GetCovarianceMatrix(event, covarianceMatrix, rShower, localCS);
84 const double zenith = showerAxis.
GetTheta(localCS);
85 const double azimuth = showerAxis.
GetPhi(localCS);
88 if (!CheckZenith(zenith, azimuth)) {
90 sstr <<
"Incoming direction zenith = " << zenith /
utl::deg
91 <<
" azimuth = " << azimuth /
utl::deg
92 <<
". Direction does not allow for polarization rejection";
100 const double angleToMagneticField =
utl::Angle(magneticField, showerAxis);
119 corePosition, showerAxis,
121 magneticField, 0.14);
123 stationRecEfieldVector = -stationRecEfieldVector;
129 sstr <<
"Event: " <<
event.GetHeader().GetId() <<
" Station: " << station.
GetId();
132 const double peakAmpMag = stationRecData.
GetParameter(revt::ePeakAmplitudeMag);
133 const double noiseRmsMag = stationRecData.
GetParameter(revt::eNoiseRmsMag);
134 const double snr = peakAmpMag * peakAmpMag / noiseRmsMag / noiseRmsMag;
135 const double distToShowerAxis = rdGeometryUtilities.
GetDistanceToAxis(showerAxis, corePosition, stationPosition);
137 GetCoreErrorEllipse(semiMajorAxis, semiMinorAxis, corePosition, covarianceMatrix, localCS);
140 sstr <<
"Covariance Matrix: [" << covarianceMatrix[0] <<
", " << covarianceMatrix[1] <<
", "
141 << covarianceMatrix[2] <<
"]"
142 <<
", semi major axis: [" << semiMajorAxis.
GetX(localCS) <<
", " << semiMajorAxis.
GetY(localCS) <<
"]"
143 <<
", semi minor axis: [" << semiMinorAxis.
GetX(localCS) <<
", " << semiMinorAxis.
GetY(localCS) <<
"]";
146 TVector3 semiMajorAxisvxBvxvxB, semiMinorAxisvxBvxvxB;
147 double rotationAngle;
148 GetCoreErrorEllipsevxBvxvxB(semiMajorAxisvxBvxvxB, semiMinorAxisvxBvxvxB, rotationAngle, semiMajorAxis,
149 semiMinorAxis, corePosition, rdGeometryUtilities);
152 sstr <<
"semi minor axis vxb-vxvxb ["
153 << semiMajorAxisvxBvxvxB.X() <<
", " << semiMajorAxisvxBvxvxB.Y() <<
"]"
154 <<
", semi minor axis vxb-vxvxb ["
155 << semiMinorAxisvxBvxvxB.X() <<
", " << semiMinorAxisvxBvxvxB.Y() <<
"]";
158 const double absSemiMajorAxisvxBvxvxB =
sqrt(
utl::Sqr(semiMajorAxisvxBvxvxB.X()) +
159 utl::Sqr(semiMajorAxisvxBvxvxB.Y()));
161 const double maxChargeExcess = GetMaxChargeExcess(zenith, distToShowerAxis, absSemiMajorAxisvxBvxvxB);
162 const double minChargeExcess = GetMinChargeExcess(zenith, distToShowerAxis, absSemiMajorAxisvxBvxvxB);
164 const TVector3 EfieldInShowerPlane = GetEfieldInShowerPlane(stationRecEfieldVector, localCS, rdGeometryUtilities);
165 const double noiseVxB = stationRecData.
GetParameter(revt::eNoiseRmsVxB);
166 const double noiseVxVxB = stationRecData.
GetParameter(revt::eNoiseRmsVxVxB);
167 const double polarizationUncertainty = GetPolAngleUncertainty(snr, EfieldInShowerPlane, noiseVxB, noiseVxVxB);
170 sstr <<
"Angle to EField Expectation: " << angleToEfieldExpectation /
utl::degree
171 <<
", Angle tolerance based on uncertainty: " << fMaxSigmaBeta * polarizationUncertainty /
utl::degree
172 <<
", sin(alpha): " << sin(angleToMagneticField)
173 <<
", Max charge excess: " << maxChargeExcess
174 <<
", Min charge excess: " << minChargeExcess;
177 if ((angleToEfieldExpectation > fMaxBeta) && (sin(angleToMagneticField) > maxChargeExcess) &&
178 (angleToEfieldExpectation > fMaxSigmaBeta * polarizationUncertainty)) {
179 TVector3 stationPositionvxBvxvxB = GetStationPositionvxBvxvxB(stationPosition, corePosition,
180 rdGeometryUtilities);
183 sstr <<
"pol reconstruction"
184 << stationPositionvxBvxvxB.X() <<
" station x"
185 << stationPositionvxBvxvxB.Y() <<
" station y";
188 double localPol1, localPol2;
189 GetLocalPolMaxima(localPol1, localPol2, angleToMagneticField, maxChargeExcess);
191 const double measuredEfieldPol = atan2(EfieldInShowerPlane.Y(), -EfieldInShowerPlane.X());
192 if (IsStationInErrorEllipse(stationPositionvxBvxvxB, semiMajorAxisvxBvxvxB, semiMinorAxisvxBvxvxB,
194 const double maxPol =
std::max(localPol1, localPol2);
195 const double minPol = std::min(localPol1, localPol2);
198 sstr <<
"station inside ellipse: measured Efield-angle: " << measuredEfieldPol /
utl::degree
203 if ((maxPol + fMaxSigmaBeta * polarizationUncertainty < measuredEfieldPol) ||
204 (minPol - fMaxSigmaBeta * polarizationUncertainty > measuredEfieldPol)) {
206 sstr <<
"rejecting station: " << station.
GetId();
211 TVector3 tangentPoint1, tangentPoint2;
212 GetErrorEllipseTangentPoints(tangentPoint1, tangentPoint2, stationPositionvxBvxvxB, semiMajorAxisvxBvxvxB,
213 semiMinorAxisvxBvxvxB, rotationAngle);
215 const double tangentPolMaxChargeExcess1 = GetTangentPol(stationPositionvxBvxvxB, tangentPoint1, maxChargeExcess,
216 angleToMagneticField);
217 const double tangentPolMinChargeExcess1 = GetTangentPol(stationPositionvxBvxvxB, tangentPoint1, minChargeExcess,
218 angleToMagneticField);
219 const double tangentPolMaxChargeExcess2 = GetTangentPol(stationPositionvxBvxvxB, tangentPoint2, maxChargeExcess,
220 angleToMagneticField);
221 const double tangentPolMinChargeExcess2 = GetTangentPol(stationPositionvxBvxvxB, tangentPoint2, minChargeExcess,
222 angleToMagneticField);
226 std::max(tangentPolMaxChargeExcess2, tangentPolMinChargeExcess2));
228 std::min(std::min(tangentPolMaxChargeExcess1, tangentPolMinChargeExcess1),
229 std::min(tangentPolMaxChargeExcess2, tangentPolMinChargeExcess2));
231 const double ellipseTanAngle1 = atan2(tangentPoint1.Y() - stationPositionvxBvxvxB.Y(),
232 tangentPoint1.X() - stationPositionvxBvxvxB.X());
233 const double ellipseTanAngle2 = atan2(tangentPoint2.Y() - stationPositionvxBvxvxB.Y(),
234 tangentPoint2.X() - stationPositionvxBvxvxB.X());
237 sstr <<
"station outside of ellipse. Tangent points: "
238 <<
"[" << tangentPoint1.X() <<
", " << tangentPoint1.Y() <<
"]"
239 <<
", [" << tangentPoint2.X() <<
", " << tangentPoint2.Y() <<
"]"
240 <<
", measured Efield-angle: " << measuredEfieldPol /
utl::degree
241 <<
", max Efield-angle: " << maxPol /
utl::degree <<
"\n"
242 <<
", min Efield-angle: " << minPol /
utl::degree <<
"\n";
245 if ((
std::max(ellipseTanAngle1, ellipseTanAngle2) > acos(maxChargeExcess / sin(angleToMagneticField))) &&
246 (std::min(ellipseTanAngle1, ellipseTanAngle2) < acos(maxChargeExcess / sin(angleToMagneticField)))) {
247 maxPol =
std::max(maxPol, localPol1);
248 minPol = std::min(minPol, localPol1);
251 if ((
std::max(ellipseTanAngle1, ellipseTanAngle2) > -acos(maxChargeExcess / sin(angleToMagneticField))) &&
252 (std::min(ellipseTanAngle1, ellipseTanAngle2) < -acos(maxChargeExcess / sin(angleToMagneticField)))) {
253 maxPol =
std::max(maxPol, localPol2);
254 minPol = std::min(minPol, localPol2);
257 if ((maxPol + fMaxSigmaBeta * polarizationUncertainty < measuredEfieldPol) ||
258 (minPol - fMaxSigmaBeta * polarizationUncertainty > measuredEfieldPol)) {
260 sstr <<
"rejecting station: " << station.
GetId();
274 RdStationPolarizationRejector::GetMaxChargeExcess(
const double zenith,
275 const double distToAxis,
276 const double semiMajorAxisLength)
278 if (fConstantChargeExcess) {
279 return fMaxChargeExcess;
283 double minDistToAxis = distToAxis - semiMajorAxisLength;
284 double maxDistToAxis = distToAxis + semiMajorAxisLength;
285 while (minDistToAxis > 12.5) {
287 minDistToAxis = minDistToAxis - 25.0;
290 while (maxDistToAxis > 12.5) {
292 maxDistToAxis = maxDistToAxis - 25.0;
295 double maxChargeExcess = 0;
296 double currentChargeExcess;
297 while (minIndex <= maxIndex) {
299 currentChargeExcess = fMaxChargeExcess30[minIndex];
301 currentChargeExcess = fMaxChargeExcess40[minIndex];
303 currentChargeExcess = fMaxChargeExcess50[minIndex];
305 currentChargeExcess = fMaxChargeExcess60[minIndex];
310 if (currentChargeExcess > maxChargeExcess) {
311 maxChargeExcess = currentChargeExcess;
317 return maxChargeExcess;
323 RdStationPolarizationRejector::GetMinChargeExcess(
const double zenith,
324 const double distToAxis,
325 const double semiMajorAxisLength)
327 if (fConstantChargeExcess) {
328 return fMinChargeExcess;
332 double minDistToAxis = distToAxis - semiMajorAxisLength;
333 double maxDistToAxis = distToAxis + semiMajorAxisLength;
334 while (minDistToAxis > 12.5) {
336 minDistToAxis = minDistToAxis - 25.0;
339 while (maxDistToAxis > 12.5) {
341 maxDistToAxis = maxDistToAxis - 25.0;
344 double minChargeExcess = 1;
345 double currentChargeExcess;
346 while (minIndex <= maxIndex) {
348 currentChargeExcess = fMinChargeExcess30[minIndex];
350 currentChargeExcess = fMinChargeExcess40[minIndex];
352 currentChargeExcess = fMinChargeExcess50[minIndex];
354 currentChargeExcess = fMinChargeExcess60[minIndex];
359 if (currentChargeExcess < minChargeExcess) {
360 minChargeExcess = currentChargeExcess;
366 return minChargeExcess;
373 RdStationPolarizationRejector::CheckZenith(
const double zenith,
double azimuth)
375 int azimuth_index = 0;
385 if (fMaxZenith[azimuth_index] > zenith) {
395 RdStationPolarizationRejector::GetCovarianceMatrix(
const evt::Event& event,
396 double covarianceMatrix[3],
402 const double sigmaX = coreError.
GetX(cs);
403 const double sigmaY = coreError.
GetY(cs);
404 covarianceMatrix[0] = sigmaX * sigmaX;
405 covarianceMatrix[1] = sigmaX * sigmaY * correlation;
406 covarianceMatrix[2] = sigmaY * sigmaY;
410 RdStationPolarizationRejector::SetProbability(
const double prob)
413 fChiSquared = TMath::ChisquareQuantile(prob, 2);
419 RdStationPolarizationRejector::GetCoreErrorEllipse(
utl::Point& semiMajorAxis,
422 const double covarianceMatrix[3],
425 double coreErrorEllipseSemiMajorAxis[2];
426 double coreErrorEllipseSemiMinorAxis[2];
427 if (covarianceMatrix[1] == 0) {
428 if (
abs(covarianceMatrix[0]) >
abs(covarianceMatrix[2])) {
429 coreErrorEllipseSemiMajorAxis[0] =
sqrt(covarianceMatrix[0] * fChiSquared);
430 coreErrorEllipseSemiMajorAxis[1] = 0;
431 coreErrorEllipseSemiMinorAxis[0] = 0;
432 coreErrorEllipseSemiMinorAxis[1] =
sqrt(covarianceMatrix[2] * fChiSquared);
434 coreErrorEllipseSemiMinorAxis[0] =
sqrt(covarianceMatrix[0] * fChiSquared);
435 coreErrorEllipseSemiMinorAxis[1] = 0;
436 coreErrorEllipseSemiMajorAxis[0] = 0;
437 coreErrorEllipseSemiMajorAxis[1] =
sqrt(covarianceMatrix[2] * fChiSquared);
440 double trace = covarianceMatrix[0] + covarianceMatrix[2];
441 double determinant = covarianceMatrix[0] * covarianceMatrix[2] - covarianceMatrix[1] * covarianceMatrix[1];
442 double eigenValue1 = trace / 2 +
sqrt(trace * trace / 4 - determinant);
443 double eigenValue2 = trace / 2 -
sqrt(trace * trace / 4 - determinant);
444 if (
abs(eigenValue1) >
abs(eigenValue2)) {
445 double eigenVector1Norm =
sqrt(
446 (eigenValue1 - covarianceMatrix[2]) * (eigenValue1 - covarianceMatrix[2]) + covarianceMatrix[1] *
447 covarianceMatrix[1]);
448 coreErrorEllipseSemiMajorAxis[0] =
sqrt(eigenValue1 * fChiSquared) * (eigenValue1 - covarianceMatrix[2]) /
450 coreErrorEllipseSemiMajorAxis[1] =
sqrt(eigenValue1 * fChiSquared) * covarianceMatrix[1] / eigenVector1Norm;
451 double eigenVector2Norm =
sqrt(
452 (eigenValue2 - covarianceMatrix[2]) * (eigenValue2 - covarianceMatrix[2]) + covarianceMatrix[1] *
453 covarianceMatrix[1]);
454 coreErrorEllipseSemiMinorAxis[0] =
sqrt(eigenValue2 * fChiSquared) * (eigenValue2 - covarianceMatrix[2]) /
456 coreErrorEllipseSemiMinorAxis[1] =
sqrt(eigenValue2 * fChiSquared) * covarianceMatrix[1] / eigenVector2Norm;
458 double eigenVector1Norm =
sqrt(
459 (eigenValue1 - covarianceMatrix[2]) * (eigenValue1 - covarianceMatrix[2]) + covarianceMatrix[1] *
460 covarianceMatrix[1]);
461 coreErrorEllipseSemiMinorAxis[0] =
sqrt(eigenValue1 * fChiSquared) * (eigenValue1 - covarianceMatrix[2]) /
463 coreErrorEllipseSemiMinorAxis[1] =
sqrt(eigenValue1 * fChiSquared) * covarianceMatrix[1] / eigenVector1Norm;
464 double eigenVector2Norm =
sqrt(
465 (eigenValue2 - covarianceMatrix[2]) * (eigenValue2 - covarianceMatrix[2]) + covarianceMatrix[1] *
466 covarianceMatrix[1]);
467 coreErrorEllipseSemiMajorAxis[0] =
sqrt(eigenValue2 * fChiSquared) * (eigenValue2 - covarianceMatrix[2]) /
469 coreErrorEllipseSemiMajorAxis[1] =
sqrt(eigenValue2 * fChiSquared) * covarianceMatrix[1] / eigenVector2Norm;
473 semiMajorAxis =
utl::Point(coreErrorEllipseSemiMajorAxis[0] + corePosition.
GetX(
474 cs), coreErrorEllipseSemiMajorAxis[1] + corePosition.
GetY(cs), corePosition.
GetZ(
476 semiMinorAxis =
utl::Point(coreErrorEllipseSemiMinorAxis[0] + corePosition.
GetX(
477 cs), coreErrorEllipseSemiMinorAxis[1] + corePosition.
GetY(cs), corePosition.
GetZ(
484 RdStationPolarizationRejector::GetCoreErrorEllipsevxBvxvxB(TVector3& semiMajorAxisvxBvxvxB,
485 TVector3& semiMinorAxisvxBvxvxB,
486 double& rotationAngleInVxB,
494 double coreX, coreY, coreZ;
507 double aDotB = ax * bx + ay * by;
509 if (ax * ax + ay * ay > bx * bx + by * by) {
510 semiMajorAxisvxBvxvxB = TVector3(ax, ay, 0);
511 semiMinorAxisvxBvxvxB = TVector3(bx, by, 0);
513 semiMinorAxisvxBvxvxB = TVector3(ax, ay, 0);
514 semiMajorAxisvxBvxvxB = TVector3(bx, by, 0);
517 const double aSquared = ax * ax + ay * ay;
518 const double bSquared = bx * bx + by * by;
519 const double tanPhi1 = -0.5 * (aSquared - bSquared) / aDotB +
520 sqrt(0.25 * ((aSquared - bSquared) * (aSquared - bSquared) / aDotB / aDotB) + 1);
521 const double tanPhi2 = -0.5 * (aSquared - bSquared) / aDotB -
522 sqrt(0.25 * ((aSquared - bSquared) * (aSquared - bSquared) / aDotB / aDotB) + 1);
523 const double phi1 = atan(tanPhi1);
524 const double phi2 = atan(tanPhi2);
525 const TVector3 axis1 = TVector3(ax * cos(phi1) + bx * sin(phi1), ay * cos(phi1) + by * sin(phi1), 0);
526 const TVector3 axis2 = TVector3(ax * cos(phi2) + bx * sin(phi2), ay * cos(phi2) + by * sin(phi2), 0);
527 if (axis1.X() * axis1.X() + axis1.Y() * axis1.Y() > axis2.X() * axis2.X() + axis2.Y() * axis2.Y()) {
528 semiMajorAxisvxBvxvxB = axis1;
529 semiMinorAxisvxBvxvxB = axis2;
530 rotationAngleInVxB = atan2(axis1.Y(), axis1.X());
532 semiMajorAxisvxBvxvxB = axis2;
533 semiMinorAxisvxBvxvxB = axis1;
534 rotationAngleInVxB = atan2(axis2.Y(), axis2.X());
537 if (rotationAngleInVxB >
utl::kPi / 2.0) {
538 rotationAngleInVxB = rotationAngleInVxB -
utl::kPi;
539 }
else if (rotationAngleInVxB < -
utl::kPi / 2.0) {
540 rotationAngleInVxB = rotationAngleInVxB +
utl::kPi;
546 RdStationPolarizationRejector::GetStationPositionvxBvxvxB(
const utl::Point stationPosition,
551 double coreX, coreY, coreZ;
557 return TVector3(x, y, z);
561 RdStationPolarizationRejector::IsStationInErrorEllipse(
const TVector3& stationPositionvxBvxvxB,
562 const TVector3& semiMajorAxisVxB,
563 const TVector3& semiMinorAxisVxB,
564 const double rotationAngle)
566 TVector3 rotatedPosition = stationPositionvxBvxvxB;
567 rotatedPosition.RotateZ(-rotationAngle);
568 const double xStation = rotatedPosition.X();
569 const double yStation = rotatedPosition.Y();
570 if (xStation * xStation /
571 (semiMajorAxisVxB.X() * semiMajorAxisVxB.X() + semiMajorAxisVxB.Y() * semiMajorAxisVxB.Y()) + yStation *
573 (semiMinorAxisVxB.X() * semiMinorAxisVxB.X() + semiMinorAxisVxB.Y() * semiMinorAxisVxB.Y()) > 1) {
583 RdStationPolarizationRejector::GetErrorEllipseTangentPoints(TVector3& ellipseTangentPoint1,
584 TVector3& ellipseTangentPoint2,
585 const TVector3& stationPositionvxBvxvxB,
586 const TVector3& semiMajorAxisVxB,
587 const TVector3& semiMinorAxisVxB,
588 const double rotationAngle)
590 TVector3 rotatedStationPosition = stationPositionvxBvxvxB;
591 rotatedStationPosition.RotateZ(-rotationAngle);
592 const double semiMajorAxisLength2 = semiMajorAxisVxB.X() * semiMajorAxisVxB.X() + semiMajorAxisVxB.Y() *
593 semiMajorAxisVxB.Y();
594 const double semiMinorAxisLength2 = semiMinorAxisVxB.X() * semiMinorAxisVxB.X() + semiMinorAxisVxB.Y() *
595 semiMinorAxisVxB.Y();
596 const double divisor = rotatedStationPosition.Y() * rotatedStationPosition.Y() * semiMajorAxisLength2 +
597 rotatedStationPosition.X() * rotatedStationPosition.X() * semiMinorAxisLength2;
598 const double squareRootTerm =
pow(
599 semiMinorAxisLength2 * semiMajorAxisLength2 * rotatedStationPosition.X() / divisor,
601 (
pow(rotatedStationPosition.Y() * semiMajorAxisLength2,
602 2) -
pow(semiMajorAxisLength2, 2) * semiMinorAxisLength2) / divisor;
603 const double x1 = semiMinorAxisLength2 * rotatedStationPosition.X() / divisor +
sqrt(squareRootTerm);
604 const double x2 = semiMinorAxisLength2 * rotatedStationPosition.X() / divisor -
sqrt(squareRootTerm);
605 const double y1 = semiMinorAxisLength2 / rotatedStationPosition.Y() - semiMinorAxisLength2 / semiMajorAxisLength2 *
606 x1 * rotatedStationPosition.X() / rotatedStationPosition.Y();
607 const double y2 = semiMinorAxisLength2 / rotatedStationPosition.Y() - semiMinorAxisLength2 / semiMajorAxisLength2 *
608 x2 * rotatedStationPosition.X() / rotatedStationPosition.Y();
609 ellipseTangentPoint1 = TVector3(x1, y1, 0);
610 ellipseTangentPoint1.RotateZ(rotationAngle);
611 ellipseTangentPoint2 = TVector3(x2, y2, 0);
612 ellipseTangentPoint2.RotateZ(rotationAngle);
618 RdStationPolarizationRejector::GetLocalPolMaxima(
double& pol1,
620 const double angleToMagneticField,
621 double maxChargeExcess)
623 const double phi = acos(maxChargeExcess / sin(angleToMagneticField));
624 pol1 = atan2(maxChargeExcess * sin(phi), -maxChargeExcess * cos(phi) + sin(angleToMagneticField));
625 pol2 = atan2(-maxChargeExcess * sin(phi), -maxChargeExcess * cos(phi) + sin(angleToMagneticField));
631 RdStationPolarizationRejector::GetTangentPol(
const TVector3& stationPositionvxBvxvxB,
632 const TVector3& tangentPoint,
633 const double chargeExcess,
634 const double angleToMagneticField)
636 const TVector3 diff = TVector3(stationPositionvxBvxvxB.X() - tangentPoint.X(),
637 stationPositionvxBvxvxB.Y() - tangentPoint.Y(), 0);
638 const double absDiff =
sqrt(diff.X() * diff.X() + diff.Y() * diff.Y());
639 TVector3 EFieldGeomagnetic = TVector3(-sin(angleToMagneticField), 0, 0);
640 TVector3 EFieldChargeExcess = TVector3(-chargeExcess * diff.X() / absDiff, -chargeExcess * diff.Y() / absDiff, 0);
641 TVector3 EField = EFieldGeomagnetic + EFieldChargeExcess;
642 return atan2(EField.Y(), -EField.X());
646 RdStationPolarizationRejector::GetEfieldInShowerPlane(
const utl::Vector& efield,
655 return TVector3(x, y, z);
660 RdStationPolarizationRejector::GetPolAngleUncertainty(
const double signalToNoise,
661 const TVector3 efield,
662 const double noiseVxB,
663 const double noiseVxVxB)
665 if (fNoiseErrorModel) {
666 std::stringstream sstr;
667 sstr <<
"EField is [" << efield[0] <<
", " << efield[1] <<
"]. vxB noise RMS is " << noiseVxB
668 <<
", vxvxB noise RMS is " << noiseVxVxB <<
".";
670 double vxBError = (13.89 /
pow(10., 6) + .594 * noiseVxB) * efield[1] / efield.Mag() / efield.Mag();
671 double vxvxBError = (21.14 /
pow(10., 6) + .487 * noiseVxVxB) * efield[0] / efield.Mag() / efield.Mag();
674 const double sigma1 = (23.6 /
sqrt(signalToNoise) - 4.3 / signalToNoise + 41.8 /
pow(signalToNoise, 1.5)) *
utl::degree;
676 return sqrt(sigma1 * sigma1 + sigma2 * sigma2);
681 RdStationPolarizationRejector::Finish()
Class to access station level reconstructed data.
utl::Point GetReferenceCorePosition(const Event &event) const
Returning the reference core position depending on the corresponding flag.
constexpr T Sqr(const T &x)
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...
double GetPhi(const CoordinateSystemPtr &coordinateSystem) const
azimuth (phi) angle in spherical and cylindrical coordinates
StationRecData & GetRecData()
Get station level reconstructed data.
bool HasRecShower() const
Interface class to access to the Radio part of an event.
double GetTheta(const CoordinateSystemPtr &coordinateSystem) const
zenith (theta) angle in spherical coordinates
Interface class to access to the RD Reconstruction of a Shower.
void Init()
Initialise the registry.
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
double pow(const double x, const unsigned int i)
utl::Vector GetReferenceCoreError(const Event &event) const
Returning the reference core position error depending on the corresponding flag.
double GetReferenceCoreErrorCorrelationXY(const Event &event) const
Returning the reference core position error correlation xy depending on the corresponding flag...
A TimeStamp holds GPS second and nanosecond for some event.
Detector description interface for RDetector-related data.
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
class to hold data at the radio Station level.
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 MagneticFieldModel & instance()
double abs(const SVector< n, T > &v)
Top of the hierarchy of the detector description interface.
static utl::Vector GetMagneticFieldVector(const utl::Point &position, const utl::TimeStamp &time)
returns the magnetic field at a specific place at a specific time
#define WARNING(message)
Macro for logging warning messages.
void GetData(bool &b) const
Overloads of the GetData member template function.
void SetRejectedReason(const unsigned long long int reason)
int GetId() const
Get the station Id.
double GetParameter(const Parameter i) const
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
ResultFlag
Flag returned by module methods to the RunController.
static CentralConfig * GetInstance()
Use this the first time you get an instance of central configuration.
utl::CoordinateSystemPtr GetReferenceCoordinateSystem() const
Get the reference coordinate system used for analysis (usually PampaAmarilla for Auger) ...
double Angle(const Vector &left, const Vector &right)
Get the magnetic field of the earth dependent on location and time.
utl::Vector GetReferenceAxis(const Event &event) const
Returning the referencedirection depending on the corresponding flag.
const rdet::RDetector & GetRDetector() const
SignalStationIterator SignalStationsEnd()
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
utl::Point GetPosition() const
Tank position in Site Cartesian Coordinates.
static Policy::type Create(const utl::Point &theOrigin)
Create the standard local coordinate system for a Point.
const Station & GetStation(const int stationId) const
Get station by Station Id.
utl::Branch GetTopBranch(const std::string &id)
Get top branch for moduleConfigLink with given id (XML files)
boost::filter_iterator< SignalStationFilter, AllStationIterator > SignalStationIterator
Iterator over all signal stations.
SignalStationIterator SignalStationsBegin()