11 #include <fwk/CentralConfig.h>
12 #include <fwk/CoordinateSystemRegistry.h>
14 #include <utl/ErrorLogger.h>
15 #include <utl/Reader.h>
16 #include <utl/config.h>
17 #include <utl/Trace.h>
18 #include <utl/TraceAlgorithm.h>
19 #include <utl/TimeStamp.h>
20 #include <utl/TimeInterval.h>
21 #include <utl/AugerUnits.h>
22 #include <utl/AugerException.h>
23 #include <utl/FFTDataContainerAlgorithm.h>
25 #include <utl/Vector.h>
26 #include <utl/AxialVector.h>
27 #include <utl/AugerCoordinateSystem.h>
28 #include <utl/CoordinateSystemPtr.h>
29 #include <utl/UTMPoint.h>
31 #include <evt/Event.h>
32 #include <revt/REvent.h>
33 #include <revt/Header.h>
34 #include <evt/ShowerRecData.h>
35 #include <evt/ShowerSimData.h>
36 #include <evt/ShowerRRecData.h>
37 #include <evt/ShowerFRecData.h>
38 #include <evt/ShowerSRecData.h>
39 #include <revt/Channel.h>
41 #include <rdet/RDetector.h>
42 #include <rdet/Station.h>
44 #include <fwk/LocalCoordinateSystem.h>
46 #define OUT(x) if ((x) <= fInfoLevel) cerr << " "
71 const UTMPoint rodrigoOrigin(6113924.83*
m, 448375.63*
m, 1560.0*
m, 19,
'H', wgs84);
72 return AugerBaseCoordinateSystem::Create(rodrigoOrigin, ecef);
80 RawStokesParameters::GetSliceX(SizeType pos, SizeType size)
82 return BoostVecRangeC(fSliceX, boost::numeric::ublas::range(pos, pos + size));
87 RawStokesParameters::GetSliceY(SizeType pos, SizeType size)
89 return BoostVecRangeC(fSliceY, boost::numeric::ublas::range(pos, pos + size));
94 RawStokesParameters::GetIndex(
char channel,
int index)
98 case 'X':
return fSliceX[index];
99 case 'Y':
return fSliceY[index];
100 case 'A':
return fSliceA[index];
101 case 'B':
return fSliceB[index];
102 case 'L':
return fSliceL[index];
103 case 'R':
return fSliceR[index];
105 ERROR(
"The channel parameters should be one of the letters in \"XYABLR\"");
112 StokesParameters::StokesParameters(
const BoostVecRangeC& signal_x,
const BoostVecRangeC& signal_y,
113 const BoostVecRangeC& noise_x,
const BoostVecRangeC& noise_y,
114 bool subtract_noise) :
115 fSignal(signal_x, signal_y),
116 fNoise(noise_x, noise_y),
117 fStokesI(subtract_noise ? fSignal.GetRawStokesI() - fNoise.GetRawStokesI() : fSignal.GetRawStokesI()),
118 fStokesQ(subtract_noise ? fSignal.GetRawStokesQ() - fNoise.GetRawStokesQ() : fSignal.GetRawStokesQ()),
119 fStokesU(subtract_noise ? fSignal.GetRawStokesU() - fNoise.GetRawStokesU() : fSignal.GetRawStokesU()),
120 fStokesV(subtract_noise ? fSignal.GetRawStokesV() - fNoise.GetRawStokesV() : fSignal.GetRawStokesV()),
121 fStokesRatioQdivI(fStokesQ/fStokesI),
122 fStokesRatioUdivI(fStokesU/fStokesI),
123 fStokesRatioVdivI(fStokesV/fStokesI)
129 fSignal(signal_x, signal_y),
130 fStokesI(fSignal.GetRawStokesI() - multiply_noise*noise.GetRawStokesI()),
131 fStokesQ(fSignal.GetRawStokesQ() - multiply_noise*noise.GetRawStokesQ()),
132 fStokesU(fSignal.GetRawStokesU() - multiply_noise*noise.GetRawStokesU()),
133 fStokesV(fSignal.GetRawStokesV() - multiply_noise*noise.GetRawStokesV()),
134 fStokesRatioQdivI(fStokesQ/fStokesI),
135 fStokesRatioUdivI(fStokesU/fStokesI),
136 fStokesRatioVdivI(fStokesV/fStokesI)
145 switch (quantity_enum) {
147 quantities[index] = sliding_stokes.
GetStokesI();
150 quantities[index] = sliding_stokes.
GetStokesQ();
153 quantities[index] = sliding_stokes.
GetStokesU();
156 quantities[index] = sliding_stokes.
GetStokesV();
158 case eStokesRatioQdivI:
161 case eStokesRatioUdivI:
164 case eStokesRatioVdivI:
167 case ePolarizationAngle:
171 ERROR(
"Incorrect enum.");
198 const StationRRecDataQuantities quantity_enum2)
200 using namespace boost::numeric::ublas;
202 ERROR(
"(Co)variances can't be calculated if no noise has been provided.");
206 BoostVecD quantities1(num_sliding_windows);
207 BoostVecD quantities2(num_sliding_windows);
208 for (
SizeType i = 0; i < num_sliding_windows; ++i) {
213 BoostVecC double_noise_signal_x = signal_x + sliding_noise_window_x;
214 BoostVecC double_noise_signal_y = signal_y + sliding_noise_window_y;
223 for (
SizeType i = 0; i < num_sliding_windows; ++i) {
224 double q1i = quantities1[i];
225 double q2i = quantities2[i];
226 if (quantity_enum1 == ePolarizationAngle) {
229 if (quantity_enum2 == ePolarizationAngle) {
235 mean1 /= num_sliding_windows;
236 mean2 /= num_sliding_windows;
239 for (
SizeType i = 0; i < num_sliding_windows; ++i) {
240 quantities1[i] -= mean1;
241 quantities2[i] -= mean2;
242 if (quantity_enum1 == ePolarizationAngle) {
245 if (quantity_enum2 == ePolarizationAngle) {
251 return inner_prod(quantities1, quantities2) / (num_sliding_windows - 1);
269 covariances[i] =
Complex(0, 0);
270 for (
SizeType j = 0; j < Mn - Ms; ++j) {
273 covariances[i] /= Mn - Ms;
280 pair<char, char>(channel1, channel2),
286 ERROR(
"Requested index out of range.");
306 result +=
Complex(2, 0)*Vi*Vjc*Covccij;
321 #define VAR(x) AnalyticMethodOneChannelVarianceHelper(x)
326 switch (quantity_enum) {
328 ERROR(
"This enum is not allowed.");
329 return std::numeric_limits<double>::infinity();
334 return VAR(
'X') +
VAR(
'Y');
335 case eStokesRatioQdivI:
337 case eStokesRatioUdivI:
339 case eStokesRatioVdivI:
341 case ePolarizationAngle:
354 fProjectOntoGroundPlane(1),
355 fQuadraticNoiseSubtraction(true),
356 fGeometrySource(
"ShowerRRecData"),
357 fErrorCalculationType(
"NoiseAddition"),
358 fSignalWindowStartOverride(0.0),
359 fSignalWindowStopOverride(0.0),
360 fNoiseWindowStartOverride(0.0),
361 fNoiseWindowStopOverride(0.0)
376 RdPolarizationReconstructor::GetArrivalDirection(
const evt::Event& event)
380 ERROR(
"Event doesn't have a ShowerRecData object!");
384 ERROR(
"Event doesn't have a ShowerRRecData object!");
385 axis =
event.GetRecShower().GetRRecShower().GetAxis();
388 ERROR(
"Event doesn't have a ShowerSRecData object!");
389 axis =
event.GetRecShower().GetSRecShower().GetAxis();
392 ERROR(
"Event doesn't have a ShowerSimData object!");
393 axis =
event.GetSimShower().GetDirection();
395 return -axis / axis.
GetMag();
404 ERROR(
"Event doesn't have a ShowerRecData object!");
407 ERROR(
"Event doesn't have a ShowerRRecData object!");
411 ERROR(
"Event doesn't have a ShowerSRecData object!");
415 ERROR(
"Event doesn't have a ShowerSimData object!");
416 return event.GetSimShower().GetLocalCoordinateSystem();
422 RdPolarizationReconstructor::GetCoreXY(
const evt::Event& event,
427 ERROR(
"Event doesn't have a ShowerRecData object!");
431 ERROR(
"Event doesn't have a ShowerRRecData object!");
432 position =
event.GetRecShower().GetRRecShower().GetCorePosition();
435 ERROR(
"Event doesn't have a ShowerSRecData object!");
436 position =
event.GetRecShower().GetSRecShower().GetBarycenter();
439 ERROR(
"Event doesn't have a ShowerSimData object!");
440 position =
event.GetSimShower().GetPosition();
442 CoreX = position.
GetX(CS);
443 CoreY = position.
GetY(CS);
448 RdPolarizationReconstructor::GetCore(
const evt::Event& event)
452 ERROR(
"Event doesn't have a ShowerRecData object!");
455 ERROR(
"Event doesn't have a ShowerRRecData object!");
456 return event.GetRecShower().GetRRecShower().GetCorePosition();
459 ERROR(
"Event doesn't have a ShowerSRecData object!");
460 return event.GetRecShower().GetSRecShower().GetBarycenter();
463 ERROR(
"Event doesn't have a ShowerSimData object!");
464 return event.GetSimShower().GetPosition();
470 RdPolarizationReconstructor::GetPerpVector(
const Point& point,
const Line& line)
484 INFO(
"RdPolarizationReconstructor::Init()");
488 CentralConfig::GetInstance()->
GetTopBranch(
"RdPolarizationReconstructor");
507 INFO(
"RdPolarizationReconstructor::Run()");
511 WARNING(
"No radio event found!");
518 REvent& rEvent =
event.GetREvent();
519 const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
526 FFTDataContainerAlgorithm::HilbertTransform(eFieldDataImag);
527 const StationTimeSeries &TimeSeriesReal = sIt->GetFFTDataContainer().GetConstTimeSeries();
530 for (
unsigned int i = 0; i < TimeSeriesReal.
GetSize(); ++i) {
532 c[0] =
Complex(TimeSeriesReal[i][0], TimeSeriesImag[i][0]);
533 c[1] =
Complex(TimeSeriesReal[i][1], TimeSeriesImag[i][1]);
534 c[2] =
Complex(TimeSeriesReal[i][2], TimeSeriesImag[i][2]);
543 double observerAngle;
548 observerAngle, alpha);
566 RdPolarizationReconstructor::GetRotatedPolarizationTraces(
const evt::Event& event,
const Station& station,
581 OUT(3) <<
"Event: " <<
event.GetREvent().GetHeader().GetId() <<
" Station: " << station.
GetId() << endl;
582 OUT(3) <<
"arrivalDirection = " << arrivalDirection.
GetX(CS) <<
" " << arrivalDirection.
GetY(CS) <<
" " << arrivalDirection.
GetZ(CS) << endl;
584 arrivalDirection /= arrivalDirection.
GetMag();
586 utl::Vector bfield =
event.GetRecShower().GetRRecShower().GetMagneticFieldVector();
591 OUT(3) <<
"bfield = " << bfield.
GetX(CS) <<
" " << bfield.
GetY(CS) <<
" " << bfield.
GetZ(CS) << endl;
592 OUT(3) <<
"-vxB (normalized v and B) = " << -baseVectorX.
GetX(CS) <<
" " << -baseVectorX.
GetY(CS) <<
" " << -baseVectorX.
GetZ(CS) << endl;
594 baseVectorX /= baseVectorX.
GetMag();
596 baseVectorY /= baseVectorY.
GetMag();
606 projectedVectorX /= projectedVectorX.
GetMag();
607 projectedVectorY /= projectedVectorY.GetMag();
608 baseVectorX = projectedVectorX;
609 baseVectorY = projectedVectorY;
610 OUT(3) <<
"projected -vxB (normalized v and B) = " << -baseVectorX.
GetX(CS) <<
" " << -baseVectorX.
GetY(CS) <<
" " << -baseVectorX.
GetZ(CS) << endl;
627 Vector vectorPointingToStation;
630 vectorPointingToStation =
GetPerpVector(stationPos,
Line(core, arrivalDirection));
636 Vector stationProj(stationPos.
GetX(CS), stationPos.
GetY(CS), 0, CS);
637 vectorPointingToStation = stationProj - coreProj;
639 vectorPointingToStation /= vectorPointingToStation.
GetMag();
642 alpha =
Angle(arrivalDirection, bfield/bfield.
GetMag());
649 observerAngle =
Angle(baseVectorX, vectorPointingToStation);
651 OUT(3) <<
"" << endl;
652 OUT(3) <<
"baseVectorX = " << baseVectorX.
GetX(CS) <<
" " << baseVectorX.
GetY(CS) <<
" " << baseVectorX.
GetZ(CS) << endl;
653 OUT(3) <<
"baseVectorY = " << baseVectorY.
GetX(CS) <<
" " << baseVectorY.
GetY(CS) <<
" " << baseVectorY.
GetZ(CS) << endl;
654 OUT(3) <<
"vectorPointingToStation = " << vectorPointingToStation.
GetX(CS) <<
" " << vectorPointingToStation.
GetY(CS) <<
" " << vectorPointingToStation.
GetZ(CS) << endl;
655 OUT(3) <<
"observerAngle = " << observerAngle << endl;
658 if (baseVectorY * vectorPointingToStation < 0) {
659 observerAngle = 2*
kPi - observerAngle;
662 OUT(3) <<
"observerAngle in [0, 2*Pi) = " << observerAngle << endl;
665 Vector3C electricField3C = analyticSignal[i];
667 Vector electricFieldVectorRe(electricField3C[0].real(), electricField3C[1].real(), electricField3C[2].real(), CS);
668 Vector electricFieldVectorIm(electricField3C[0].imag(), electricField3C[1].imag(), electricField3C[2].imag(), CS);
670 double electricFieldXRe = electricFieldVectorRe*baseVectorX;
671 double electricFieldYRe = electricFieldVectorRe*baseVectorY;
672 double electricFieldXIm = electricFieldVectorIm*baseVectorX;
673 double electricFieldYIm = electricFieldVectorIm*baseVectorY;
677 traceX[i] =
Complex(electricFieldXRe, electricFieldXIm);
678 traceY[i] =
Complex(electricFieldYRe, electricFieldYIm);
684 RdPolarizationReconstructor::CheckSignalAndNoiseRanges(
SizeType signal_start_bin,
SizeType signal_stop_bin,
688 OUT(2) <<
"Ranges for extracting polarization information:" << endl;
689 OUT(2) <<
" - signal range = [" << signal_start_bin <<
", " << signal_stop_bin <<
") samples" << endl;
690 OUT(2) <<
" - noise range = [" << noise_start_bin <<
", " << noise_stop_bin <<
") samples" << endl;
692 if (signal_start_bin > size)
693 ERROR(
"signal_start_bin out of bounds.");
694 if (signal_stop_bin > size)
695 ERROR(
"signal_stop_bin out of bounds.");
696 if (noise_start_bin > size)
697 ERROR(
"noise_start_bin out of bounds.");
698 if (noise_stop_bin > size)
699 ERROR(
"noise_stop_bin out of bounds.");
700 if (signal_start_bin >= signal_stop_bin)
701 ERROR(
"invalid values: can't allow: signal_start_bin >= signal_stop_bin");
702 if (noise_start_bin >= noise_stop_bin)
703 ERROR(
"invalid values: can't allow: noise_start_bin >= noise_top_bin");
704 if (signal_stop_bin - signal_start_bin > noise_stop_bin - noise_start_bin)
705 ERROR(
"the signal region should not be larger than the noise region");
706 if (((noise_start_bin >= signal_start_bin) && (noise_start_bin < signal_stop_bin)) ||
707 ((noise_stop_bin >= signal_start_bin) && (noise_stop_bin < signal_stop_bin)) ||
708 ((noise_start_bin <= signal_start_bin) && (noise_stop_bin > signal_stop_bin)))
709 ERROR(
"the signal and noise regions may not overlap");
710 if ((signal_stop_bin - signal_start_bin)*5 > noise_stop_bin - noise_start_bin)
711 WARNING(
"for accurate error determination the signal region should be much smaller than the noise region");
716 RdPolarizationReconstructor::CalculateAndFillStokesParameters(
Station& station,
BoostVecC& traceX,
717 BoostVecC& traceY,
double observerAngle,
double alpha)
719 using namespace boost::numeric::ublas;
734 OUT(3) <<
"signal_start_time = " << signal_start_time/
ns <<
" ns" << endl;
735 OUT(3) <<
"signal_stop_time = " << signal_stop_time/
ns <<
" ns" << endl;
736 OUT(3) <<
"noise_start_time = " << noise_start_time/
ns <<
" ns" << endl;
737 OUT(3) <<
"noise_stop_time = " << noise_stop_time/
ns <<
" ns" << endl;
738 OUT(3) <<
"binning = " << binning/
ns <<
" ns" << endl;
740 SizeType signal_start_bin = round(signal_start_time / binning);
741 SizeType signal_stop_bin = round(signal_stop_time / binning);
742 SizeType noise_start_bin = round(noise_start_time / binning);
743 SizeType noise_stop_bin = round(noise_stop_time / binning);
747 BoostVecRangeC signal_x(traceX, range(signal_start_bin, signal_stop_bin));
748 BoostVecRangeC signal_y(traceY, range(signal_start_bin, signal_stop_bin));
749 BoostVecRangeC noise_x(traceX, range(noise_start_bin, noise_stop_bin));
750 BoostVecRangeC noise_y(traceY, range(noise_start_bin, noise_stop_bin));
757 recData.SetParameter(eStokesQ, stokes.
GetStokesQ());
758 recData.SetParameter(eStokesU, stokes.
GetStokesU());
759 recData.SetParameter(eStokesV, stokes.
GetStokesV());
765 recData.SetParameter(eObserverAngle, observerAngle);
766 recData.SetParameter(
eAlpha, alpha);
770 StationRRecDataQuantities quantities1[8] = {
781 for (
int i = 0; i < 8; ++i) {
782 for (
int j = i; j < 8; ++j) {
783 StationRRecDataQuantities ei = quantities1[i];
784 StationRRecDataQuantities ej = quantities1[j];
791 for (
int i = 0; i < 8; ++i) {
792 StationRRecDataQuantities ei = quantities1[i];
800 RdPolarizationReconstructor::CalculateAndFillChargeExcessFraction(
Station& station,
double& alpha,
double& chxfraction)
807 chxfraction = (sin(alpha) * tan(polAngle)) / (sin(obsAngle) - cos(obsAngle)*tan(polAngle));
811 double chxFracError =
abs((sin(alpha)*tan(polAngle + polAngErr))/(sin(obsAngle) - cos(obsAngle)*tan(polAngle + polAngErr)) - (sin(alpha)*tan(polAngle - polAngErr))/(sin(obsAngle) - cos(obsAngle)*tan(polAngle - polAngErr)))/2;
816 recData.SetParameterError(eCxxFraction, chxFracError);
821 RdPolarizationReconstructor::Finish()
823 INFO(
"RdPolarizationReconstructor::Finish()");
Complex GetIndex(char channel, int index) const
Branch GetTopBranch() const
AxialVector Cross(const Vector &l, const Vector &r)
CoordinateSystemPtr GetRodrigoCS()
double AnalyticMethodOneChannelVarianceHelper(char channel)
Class to access station level reconstructed data.
void GetRotatedPolarizationTraces(const evt::Event &event, const revt::Station &station, const rdet::RDetector &rDetector, const utl::TraceV3C &stationTimeSeries, BoostVecC &traceX, BoostVecC &traceY, double &observerAngle, double &alpha) const
double Angle(const double theta1, const double phi1, const double theta2, const double phi2)
double fSignalWindowStopOverride
boost::numeric::ublas::vector< double > BoostVecD
RawStokesParameters fNoise
void CalculateAndFillStokesParameters(revt::Station &station, BoostVecC &traceX, BoostVecC &traceY, double observerAngle, double alpha)
void NoiseAdditionCovariancePolarizationAngleHelper(double &angle, double origval) const
Report success to RunController.
SampleCovariancesT sampleCovariances
double GetStokesV() const
const Complex I(0.0, 1.0)
double GetNoiseAdditionCovariance(const revt::StationRRecDataQuantities, revt::StationRRecDataQuantities)
StationRecData & GetRecData()
Get station level reconstructed data.
bool HasRecShower() const
Interface class to access to the Radio part of an event.
OneChannelPulseVariancesT oneChannelPulseVariances
double GetPolarizationAngle() const
RdPolarizationReconstructor()
Class to hold and convert a point in geodetic coordinates.
bool fQuadraticNoiseSubtraction
Skip remaining modules in the current loop and continue with next iteration of the loop...
ShowerRecData & GetRecShower()
bool HasSimShower() const
double GetAnalyticMethodVariance(const revt::StationRRecDataQuantities)
double GetParameterError(const Parameter i) const
double GetBinning() const
size of one slot
#define INFO(message)
Macro for logging informational messages.
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)
double GetStokesRatioQdivI() const
ShowerRRecData & GetRRecShower()
StationTimeSeries & GetStationTimeSeries()
retrieve Station Time Series (write access, only use this if you intend to change the data) ...
BoostVecRangeC GetSliceX(SizeT pos, SizeT size)
ShowerSRecData & GetSRecShower()
double GetStokesQ() const
Detector description interface for RDetector-related data.
std::string fErrorCalculationType
double GetStokesRatioVdivI() const
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
utl::Point GetCore(const evt::Event &event) const
Class representing a document branch.
std::complex< double > Complex
utl::Point GetCoordinateOrigin() const
class to hold data at the radio Station level.
Reference ellipsoids for UTM transformations.
double GetX(const CoordinateSystemPtr &coordinateSystem) const
std::vector< T >::size_type SizeType
utl::Vector GetPerpVector(const utl::Point &point, const utl::Line &line) const
boost::numeric::ublas::vector< Complex > BoostVecC
Static (small and dense) vector class.
RawStokesParameters fSignal
double abs(const SVector< n, T > &v)
void CalculateAndFillChargeExcessFraction(revt::Station &station, double &alpha, double &chxfraction)
bool HasRRecShower() const
const utl::Point & GetBarycenter() const
double fSignalWindowStartOverride
constexpr double kPiOnTwo
void NoiseAdditionCovarianceHelper(BoostVecD &quanities, const revt::StationRRecDataQuantities quantity_enum, const StokesParameters &sliding_stokes, SizeT index)
const CoordinateSystemPtr GetECEF() const
Get the ECEF.
utl::Vector GetArrivalDirection(const evt::Event &event) const
#define WARNING(message)
Macro for logging warning messages.
void GetData(bool &b) const
Overloads of the GetData member template function.
Complex AnalyticMethodSampleCovarianceHelper(char channel1, char channel2, SizeT index)
int GetId() const
Get the station Id.
void CheckSignalAndNoiseRanges(SizeT signal_start_bin, SizeT signal_stop_bin, SizeT noise_start_bin, SizeT noise_stop_bin, SizeT size) const
double GetParameter(const Parameter i) const
utl::CoordinateSystemPtr GetCS(const evt::Event &event) const
double GetY(const CoordinateSystemPtr &coordinateSystem) const
Template class for a data container that offers and takes both time series and corresponding frequenc...
ResultFlag
Flag returned by module methods to the RunController.
StokesParameters(const BoostVecRangeC &signal_x, const BoostVecRangeC &signal_y, const BoostVecRangeC &noise_x, const BoostVecRangeC &noise_y, bool subtract_noise)
int fProjectOntoGroundPlane
Template class for a FADC data or calibrated data container. Use the typedefs (TraceD, TraceI, etc.) defined in Trace-fwd.h.
boost::numeric::ublas::vector_range< BoostVecC > BoostVecRangeC
void SetParameter(Parameter i, double value, bool lock=true)
const Vector & GetDirection() const
utl::CoordinateSystemPtr Get(const std::string &id)
Get a well-known Coordinate System.
double GetStokesRatioUdivI() const
TraceV3C::SizeType SizeType
SignalStationIterator SignalStationsEnd()
const Point & GetAnchor() const
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
double fNoiseWindowStartOverride
utl::Point GetPosition() const
Tank position in Site Cartesian Coordinates.
double GetStokesI() const
void PushBack(const T &value)
Insert a single value at the end.
#define ERROR(message)
Macro for logging error messages.
const Station & GetStation(const int stationId) const
Get station by Station Id.
bool HasSRecShower() const
std::string fGeometrySource
double fNoiseWindowStopOverride
boost::filter_iterator< SignalStationFilter, AllStationIterator > SignalStationIterator
Iterator over all signal stations.
BoostVecRangeC GetSliceY(SizeT pos, SizeT size)
double GetStokesU() const
SignalStationIterator SignalStationsBegin()
bool fAssumeGroundPlaneIsHorizontalAndFlat