3 #include <fwk/CentralConfig.h>
5 #include <utl/ErrorLogger.h>
6 #include <utl/Reader.h>
7 #include <utl/config.h>
9 #include <utl/TraceAlgorithm.h>
10 #include <utl/TimeStamp.h>
11 #include <utl/TimeInterval.h>
12 #include <utl/AugerUnits.h>
13 #include <utl/PhysicalConstants.h>
14 #include <utl/AugerException.h>
15 #include <utl/FFTDataContainerAlgorithm.h>
17 #include <utl/RadioGeometryUtilities.h>
19 #include <evt/Event.h>
20 #include <evt/ShowerRecData.h>
21 #include <evt/ShowerRRecData.h>
22 #include <evt/ShowerRRecDataQuantities.h>
23 #include <revt/REvent.h>
24 #include <revt/Header.h>
25 #include <revt/Station.h>
26 #include <revt/StationRecData.h>
27 #include <revt/StationHeader.h>
28 #include <revt/StationTriggerData.h>
29 #include <revt/Channel.h>
31 #include <det/Detector.h>
32 #include <rdet/RDetector.h>
33 #include <rdet/Station.h>
34 #include <rdet/Channel.h>
39 #include "Minuit2/Minuit2Minimizer.h"
40 #include "Minuit2/MnMigrad.h"
41 #include "Minuit2/FunctionMinimum.h"
42 #include "Minuit2/MinimumParameters.h"
43 #include "Minuit2/MnPrint.h"
45 #include <boost/algorithm/string/case_conv.hpp>
52 #include <cuda_runtime_api.h>
53 #include <utl/cudaCheckErrors.h>
56 #define OUT(x) if ((x) <= fInfoLevel) cerr << " "
62 using std::stringstream;
63 using std::ostringstream;
74 Branch topBranch = CentralConfig::GetInstance()->
GetTopBranch(
"RdStationSignalReconstructor");
82 topBranch.
GetChild(
"SignalIntegrationWindowSize").
GetData(fSignalIntegrationWindowSize);
86 topBranch.
GetChild(
"AddNoiseToUncertainty").
GetData(fAddNoiseToUncertainty);
90 topBranch.
GetChild(
"AdjustSignalAmplitude").
GetData(fAdjustSignalAmplitude);
92 topBranch.
GetChild(
"RelativeAmplitudeUncertainty").
GetData(fRelativeAmplitudeUncertainty);
93 topBranch.
GetChild(
"DefaultAntennaUncertainty").
GetData(fDefaultAntennaUncertainty);
94 topBranch.
GetChild(
"ButterflyAntennaUncertainty").
GetData(fButterflyAntennaUncertainty);
95 topBranch.
GetChild(
"BlackSpiderAntennaUncertainty").
GetData(fBlackSpiderAntennaUncertainty);
98 info <<
"\n\t Vectorial component : " << fVectorialComponent
99 <<
"\n\t Use Envelope : " << fUseEnvelope
100 <<
"\n\t Signal definition (for SNR): " << fSignalDef
101 <<
"\n\t SNR definition : " << fSignalToNoiseDef
102 <<
"\n\t Min. SNR : " << fMinSignalToNoise
103 <<
"\n\t Subtract Noise (for peak) : " << fNoiseSubtraction
104 <<
"\n\t Signal inegration window : " << fSignalIntegrationWindowSize <<
"ns"
105 <<
"\n\t Add Noise to uncertainty : " << fAddNoiseToUncertainty
106 <<
"\n\t Rel. ampl. uncertainty / % : " << fRelativeAmplitudeUncertainty
107 <<
"\n\t Rel. antenna pattern uncertainty / %"
108 <<
"\n\t (LPDA / BF / Default): (" << fBlackSpiderAntennaUncertainty
109 <<
" / " << fButterflyAntennaUncertainty
110 <<
" / " << fDefaultAntennaUncertainty <<
")\n";
120 if(fInfoLevel >= eInfoIntermediate) {
121 INFO(
"RdStationSignalReconstructor::Run()");
126 WARNING(
"No radio event found!");
127 return eContinueLoop;
130 ++fTotalNumberOfEvents;
132 stringstream fMessage;
134 REvent& rEvent =
event.GetREvent();
137 int numberOfStationsWithPulseFound = 0;
145 cudaStream_t streams[3];
146 for (
int i = 0; i < 3; ++i)
147 cudaStreamCreate(&streams[i]);
148 cudaCheckErrors(
"cudaStreamCreate failed");
152 double*
const ts =
new double[3*n];
153 complex<double>*
const tts =
new complex<double>[3*n];
154 cudaHostRegister(ts, 3*n*
sizeof(
double), cudaHostRegisterPortable);
155 cudaHostRegister(tts, 3*n*
sizeof(complex<double>), cudaHostRegisterPortable);
156 cudaCheckErrors(
"cudaHostRegister failed");
158 double* d_ts =
nullptr;
159 complex<double>* d_tts =
nullptr;
160 cudaMalloc((
void**)&d_ts, 3*n*
sizeof(
double));
161 cudaMalloc((
void**)&d_tts, 3*n*
sizeof(complex<double>));
162 cudaCheckErrors(
"cudaMalloc failed");
167 FFTDataContainerAlgorithm::HilbertEnvelope(efieldData);
170 double* dummyTimeseries =
nullptr;
174 time_t timeAllStation = time(NULL);
178 time_t timeStation = time(NULL);
188 WARNING(
"Station has no RecData! Please call RdEventInitializer first!");
197 info <<
"Apply pulse finder on station " << station.
GetId();
206 dummyContainer = next->GetFFTDataContainer();
209 for (
size_t j = 0; j < 3; ++j) {
210 for (
size_t i = 0; i < n; ++i) {
211 ts[j*n+i] = dummyTimeseries[i*3 + j];
214 for (
int i = 0; i < 3*n; ++i) {
215 real(tts[i]) = ts[i];
218 FFTDataContainerAlgorithm::HilbertEnvelope(ts, tts, d_ts, d_tts, n, streams);
223 FFTDataContainerAlgorithm::HilbertEnvelope(efieldData);
224 OUT(eInfoDebug) <<
"size of efield trace = " << efieldData.GetConstTimeSeries().GetSize() << endl;
238 double NoiseWindowStart = recStation.
GetParameter(eNoiseWindowStart);
239 double NoiseWindowStop = recStation.
GetParameter(eNoiseWindowStop);
240 const double SignalSearchWindowStart = recStation.
GetParameter(eSignalSearchWindowStart);
241 const double SignalSearchWindowStop = recStation.
GetParameter(eSignalSearchWindowStop);
242 double SignalWindowStart = 0;
243 double SignalWindowStop = 0;
244 double SignalIntegrationWindowSize = fSignalIntegrationWindowSize;
245 recStation.
SetParameter(revt::eSignalIntegrationTime, fSignalIntegrationWindowSize);
247 bool PulseFound =
false;
248 double MeanNoise = 0;
251 unsigned int peak_bin = 0;
252 unsigned int sample = 0;
254 double PeakAmplitude = 0;
255 double IntegratedSignal = 0;
256 double SignalTimeFWHM = 0;
260 double PeakTimeError = 0;
261 double SignalToNoise = 0;
268 unsigned int NumComponents = 7;
271 for (
unsigned int iterator = 0; iterator < NumComponents; ++iterator) {
273 unsigned int component = (iterator + fVectorialComponent) % NumComponents;
274 channeltrace.ClearTrace();
275 channeltrace_noenvelope.ClearTrace();
279 if (component == 0) {
281 channeltrace.
PushBack(stationtrace[i].GetMag());
282 if (std::isnan(stationtrace[i].GetMag())) {
284 fMessage <<
"sample " << i <<
" of efield trace is nan";
287 channeltrace_noenvelope.
PushBack(stationtrace_noenvelope[i].GetMag());
288 if (std::isnan(stationtrace_noenvelope[i].GetMag())) {
290 fMessage <<
"sample " << i <<
" of efield trace is nan";
295 else if (component == 1 || component == 2 || component == 3) {
297 channeltrace.
PushBack(fabs(stationtrace[i][component - 1]));
298 channeltrace_noenvelope.
PushBack(fabs(stationtrace_noenvelope[i][component - 1]));
301 else if (component == 4) {
304 channeltrace_noenvelope.
PushBack(
sqrt(
Sqr(stationtrace_noenvelope[i][0]) +
305 Sqr(stationtrace_noenvelope[i][1])));
308 else if (component == 5 || component == 6) {
312 "Reference direction or core position not set. The electric-field can not be rotated into the vxB, vx(vxB) system. The calculation will be skipped");
323 for (
unsigned int i = 0; i < traceShowerPlane.GetSize(); ++i) {
324 channeltrace.
PushBack(traceShowerPlane[i][component - 5]);
325 channeltrace_noenvelope.
PushBack(traceShowerPlane_noenvelope[i][component - 5]);
330 ERROR(
"This component does not exist!");
336 NoiseWindowStart = min(
max(0.0, NoiseWindowStart), TraceStop);
337 NoiseWindowStop =
max(min(NoiseWindowStop, TraceStop), NoiseWindowStart);
340 Noisefinder(channeltrace, RMSNoise, MeanNoise, NoiseWindowStart, NoiseWindowStop);
341 Pulsefinder(channeltrace, PeakAmplitude, PeakTime, PeakTimeError,
342 SignalSearchWindowStart, SignalSearchWindowStop, sample);
344 if (component == fVectorialComponent)
348 PulseFWHMIntegrator(channeltrace, sample, PeakAmplitude, SignalTimeFWHM, IntegratedSignal,
349 SignalWindowStart, SignalWindowStop);
351 if (fSignalDef ==
"IntegralFixedWindow")
352 PulseFixedWindowIntegrator(channeltrace_noenvelope, sample, SignalIntegrationWindowSize,
353 IntegratedSignal, SignalWindowStart, SignalWindowStop,
false);
355 if (fSignalDef ==
"PowerIntegralSlidingWindow")
356 PulseSlidingWindowIntegrator(channeltrace, SignalIntegrationWindowSize, IntegratedSignal,
357 SignalWindowStart, SignalWindowStop, SignalSearchWindowStart, SignalSearchWindowStop);
360 double signalEnergyFluence = 0;
361 double integratedPowerFixedWidthStartTime = 0;
362 double integratedPowerFixedWidthStopTime = 0;
363 PulseFixedWindowIntegrator(channeltrace_noenvelope, peak_bin, SignalIntegrationWindowSize,
364 signalEnergyFluence, integratedPowerFixedWidthStartTime,
365 integratedPowerFixedWidthStopTime,
true);
368 double noiseEnergyFluence = 0;
369 double integratedNoisePowerFixedWidthStartTime = 0;
370 double integratedNoisePowerFixedWidthStopTime = 0;
371 double noiseWindowSize = NoiseWindowStop - NoiseWindowStart;
372 unsigned int meanNoiseSample = (NoiseWindowStart + noiseWindowSize * 0.5)
374 PulseFixedWindowIntegrator(channeltrace_noenvelope, meanNoiseSample, noiseWindowSize,
375 noiseEnergyFluence, integratedNoisePowerFixedWidthStartTime,
376 integratedNoisePowerFixedWidthStopTime,
true);
379 noiseEnergyFluence *= SignalIntegrationWindowSize / noiseWindowSize;
381 signalEnergyFluence = signalEnergyFluence - noiseEnergyFluence;
383 double signalEnergyFluenceError =
384 sqrt(4 * fabs(signalEnergyFluence) *
pow(RMSNoise, 2) * channeltrace_noenvelope.
GetBinning() +
385 2 * SignalIntegrationWindowSize *
pow(RMSNoise, 4) * channeltrace_noenvelope.
GetBinning());
391 double antennaToAntennaUncertainty = 0;
394 if (boost::algorithm::to_lower_copy(
395 det::Detector::GetInstance().GetRDetector().GetStation(station)
396 .GetChannel(channel.
GetId()).GetAntennaTypeName())
397 .find(
"butterfly") != std::string::npos ) {
398 if (antennaToAntennaUncertainty < fButterflyAntennaUncertainty)
399 antennaToAntennaUncertainty = fButterflyAntennaUncertainty;
400 }
else if (boost::algorithm::to_lower_copy(
401 det::Detector::GetInstance().GetRDetector().GetStation(station)
402 .GetChannel(channel.
GetId()).GetAntennaTypeName())
403 .find(
"blackspider") != std::string::npos ) {
404 if (antennaToAntennaUncertainty < fBlackSpiderAntennaUncertainty)
405 antennaToAntennaUncertainty = fBlackSpiderAntennaUncertainty;
407 if (antennaToAntennaUncertainty < fDefaultAntennaUncertainty)
408 antennaToAntennaUncertainty = fDefaultAntennaUncertainty;
413 info <<
"Station " << station.
GetId() <<
" component " << component <<
" signaltime (sample) "
414 << PeakTime <<
"(" << sample <<
") Integrating f around sample " << peak_bin
415 <<
" f = " << signalEnergyFluence <<
" f noise = " << noiseEnergyFluence
416 <<
" sigma_f = " << signalEnergyFluenceError
417 <<
" RelativeAmplitudeUncertainty = " << fRelativeAmplitudeUncertainty
418 <<
" antennaToAntennaUncertainty = " << antennaToAntennaUncertainty;
422 signalEnergyFluenceError =
sqrt(
pow(signalEnergyFluenceError, 2) +
423 pow(fRelativeAmplitudeUncertainty * 2 * signalEnergyFluence, 2) +
424 pow(antennaToAntennaUncertainty * 2 * signalEnergyFluence, 2));
427 if (fNoiseSubtraction ==
"Linear") {
428 if (fNoiseDef ==
"RMS") {
429 PeakAmplitude = PeakAmplitude - MeanNoise;
431 if (fSignalDef ==
"IntegralFWHM")
432 IntegratedSignal -= SignalTimeFWHM / channeltrace.
GetBinning() * MeanNoise;
433 if (fSignalDef ==
"IntegralFixedWindow" || fSignalDef ==
"PowerIntegralSlidingWindow")
434 IntegratedSignal -= SignalIntegrationWindowSize / channeltrace.
GetBinning() * MeanNoise;
443 if (fSignalDef ==
"Peak")
444 SignalToNoise = PeakAmplitude / RMSNoise;
445 if (fSignalDef ==
"IntegralFWHM")
446 SignalToNoise = IntegratedSignal / (RMSNoise * SignalTimeFWHM / channeltrace.
GetBinning());
447 if (fSignalDef ==
"IntegralFixedWindow")
449 IntegratedSignal / (RMSNoise * SignalIntegrationWindowSize / channeltrace.
GetBinning());
450 if (fSignalDef ==
"PowerIntegralSlidingWindow")
451 SignalToNoise =
pow(IntegratedSignal, 0.5) / RMSNoise;
455 if (component == fVectorialComponent) {
458 if (fSignalDef ==
"Peak" && fSignalToNoiseDef ==
"RatioOfSquares" && fNoiseDef ==
"RMS") {
459 PeakTimeError =
std::sqrt(
Sqr(PeakTimeError) +
Sqr(GetSignalTimeUncertainty(
Sqr(SignalToNoise))));
461 WARNING(
"A non-standard signal or SNR definition is used. "
462 "The uncertainty of the signal time due to noise can not be set");
468 if (fNoiseDef ==
"RMS") {
471 if (fSignalDef ==
"Peak") {
472 if (fAdjustSignalAmplitude) {
473 if (fSignalToNoiseDef !=
"RatioOfSquares" && fNoiseDef ==
"RMS") {
474 WARNING(
"A non-standard noise or SNR definition is used. "
475 "The adjustment of the signal amplitude can not be performed.");
477 PeakAmplitude = GetAdjustedSignalAmplitude(PeakAmplitude,
Sqr(SignalToNoise));
481 if (fSignalToNoiseDef !=
"RatioOfSquares" && fNoiseDef ==
"RMS") {
482 WARNING(
"A non-standard signal or SNR definition is used. "
483 "The uncertainty of the signal will be incorrect");
488 <<
Sqr(SignalToNoise)
489 <<
"\tsignal amplitude = "
491 <<
"\tUncertainty of SignalAmplitude = "
492 << GetSignalUncertainty(PeakAmplitude,
Sqr(SignalToNoise))
495 double tempUncertainty =
sqrt(
496 GetSignalUncertainty(PeakAmplitude,
Sqr(SignalToNoise))
497 * GetSignalUncertainty(PeakAmplitude,
Sqr(SignalToNoise))
498 + PeakAmplitude * fRelativeAmplitudeUncertainty * PeakAmplitude * fRelativeAmplitudeUncertainty
499 + PeakAmplitude * antennaToAntennaUncertainty * PeakAmplitude * antennaToAntennaUncertainty);
502 if (fSignalToNoiseDef ==
"SimpleRatio")
504 if (fSignalToNoiseDef ==
"RatioOfSquares")
508 if (fSignalDef ==
"IntegralFWHM" || fSignalDef ==
"IntegralFixedWindow") {
510 if (fSignalToNoiseDef ==
"SimpleRatio")
512 if (fSignalToNoiseDef ==
"RatioOfSquares")
516 if (fSignalDef ==
"PowerIntegralSlidingWindow") {
518 if (fSignalToNoiseDef ==
"SimpleRatio")
520 if (fSignalToNoiseDef ==
"RatioOfSquares")
531 OUT(eInfoDebug) <<
"Filling the primary parameters..." << endl;
541 if (fAddNoiseToUncertainty)
542 signalEnergyFluenceError =
sqrt(
pow(signalEnergyFluenceError, 2) +
pow(noiseEnergyFluence, 2));
545 if (component == 0) {
555 }
else if (component == 1) {
565 }
else if (component == 2) {
575 }
else if (component == 3) {
585 }
else if (component == 4) {
595 }
else if (component == 5) {
604 }
else if (component == 6) {
615 if (component == fVectorialComponent) {
618 && !fSelfTriggeredSNcut))
620 ++numberOfStationsWithPulseFound;
625 fMessage <<
"no signal pulse found for station " << station.
GetId();
638 if (fFitAnalyticSignal) {
657 double energy_fluence = 0;
658 double energy_fluence2 = 0;
659 for (
int polarization = 0; polarization < 2; ++polarization) {
661 tmpTrace.
SetBinning(traceShowerPlane.GetBinning());
667 traceShowerPlane.GetBinning();
670 traceShowerPlane.GetBinning();
671 if ((start - stop) % 2) {
674 unsigned int middle = (stop - start) / 2 + start;
675 for (
unsigned int i = middle; i < stop; ++i) {
676 tmpTrace.
PushBack(traceShowerPlane[i][polarization]);
678 for (
unsigned int i = start; i < middle; ++i) {
679 tmpTrace.
PushBack(traceShowerPlane[i][polarization]);
681 double phaseSlopeVxB = 0;
685 ROOT::Minuit2::MnUserParameterState minimum =
686 FitAnalyticSignal(tmpTrace, RMSNoise, station, polarization, (polarization == 1), phaseSlopeVxB);
687 const double p0 = minimum.Parameter(0).Value();
688 const double p1 = minimum.Parameter(1).Value();
694 det::Detector::GetInstance().GetRDetector().GetStation(*sIt).GetChannel(1).GetDesignLowerFreq();
696 det::Detector::GetInstance().GetRDetector().GetStation(*sIt).GetChannel(1).GetDesignUpperFreq();
709 double energy_fluence_tmp =
710 1. / 3. * (
pow(fup, 3) -
pow(flow, 3)) * p1 * p1 +
711 (fup * fup - flow * flow) * p0 * p1 + (fup - flow) * p0 * p0;
712 energy_fluence_tmp *= 2;
715 energy_fluence += energy_fluence_tmp;
717 if (polarization == 0) {
719 minimum.Parameter(0).Value());
721 minimum.Parameter(1).Value());
723 minimum.Parameter(2).Value());
725 minimum.Parameter(3).Value());
727 }
else if (polarization == 1) {
729 minimum.Parameter(0).Value());
731 minimum.Parameter(1).Value());
733 minimum.Parameter(2).Value());
735 minimum.Parameter(3).Value());
772 cout <<
"energy fluence " << station.
GetId() <<
": " << energy_fluence << endl;
773 cout <<
"energy fluence2 " << station.
GetId() <<
": " << energy_fluence2 << endl;
774 cout <<
"ratio " << station.
GetId() <<
": " << energy_fluence / energy_fluence2 << endl;
779 for (
int i = 0; i < 3; ++i)
780 cudaStreamSynchronize(streams[i]);
781 cudaCheckErrors(
"cudaStreamSynchronize failed");
784 for (
size_t j = 0; j < 3; ++j) {
785 for (
size_t i = 0; i < n; ++i) {
786 dummyTimeseries[i*3 + j] = ts[j*n + i];
789 efieldData = dummyContainer;
794 fMessage <<
"needed " << difftime(time(NULL), timeStation) <<
" seconds for Station " << station.
GetId();
799 fMessage <<
"needed " << difftime(time(NULL), timeAllStation) <<
" seconds for all stations";
810 rShower.
SetParameter(revt::eNumberOfStationsWithPulseFound, numberOfStationsWithPulseFound);
813 fMessage <<
"Found " << numberOfStationsWithPulseFound <<
" stations with signal pulse";
816 if (numberOfStationsWithPulseFound == 1)
817 ++fNumberOfEvents1SignalStations;
818 else if (numberOfStationsWithPulseFound == 2)
819 ++fNumberOfEvents2SignalStations;
820 else if (numberOfStationsWithPulseFound == 3)
821 ++fNumberOfEvents3SignalStations;
822 else if (numberOfStationsWithPulseFound == 4)
823 ++fNumberOfEvents4SignalStations;
824 else if (numberOfStationsWithPulseFound == 5)
825 ++fNumberOfEvents5SignalStations;
826 else if (numberOfStationsWithPulseFound >= 5)
827 ++fNumberOfEvents5plusSignalStations;
830 cudaHostUnregister(ts);
831 cudaHostUnregister(tts);
832 cudaCheckErrors(
"cudaHostUnregister failed");
834 for (
int i = 0; i < 3; ++i)
835 cudaStreamDestroy(streams[i]);
836 cudaCheckErrors(
"Destroying Stream failed");
839 cudaCheckErrors(
"cuda mem free fail");
849 RdStationSignalReconstructor::Finish()
852 sstr <<
"Event statistics:\n"
853 <<
"\t" << fTotalNumberOfEvents <<
" events\n"
854 <<
"\t" << fNumberOfEvents1SignalStations <<
" = "
855 << 100. * fNumberOfEvents1SignalStations/fTotalNumberOfEvents <<
"% events with 1 signal station\n"
856 <<
"\t" << fNumberOfEvents2SignalStations <<
" = "
857 << 100. * fNumberOfEvents2SignalStations/fTotalNumberOfEvents <<
"% events with 2 signal stations\n"
858 <<
"\t" << fNumberOfEvents3SignalStations <<
" = "
859 << 100. * fNumberOfEvents3SignalStations/fTotalNumberOfEvents <<
"% events with 3 signal stations\n"
860 <<
"\t" << fNumberOfEvents4SignalStations <<
" = "
861 << 100. * fNumberOfEvents4SignalStations/fTotalNumberOfEvents <<
"% events with 4 signal stations\n"
862 <<
"\t" << fNumberOfEvents5SignalStations <<
" = "
863 << 100. * fNumberOfEvents5SignalStations/fTotalNumberOfEvents <<
"% events with 5 signal stations\n"
864 <<
"\t" << fNumberOfEvents5plusSignalStations <<
" = "
865 << 100. * fNumberOfEvents5plusSignalStations/fTotalNumberOfEvents <<
"% events "
866 "with more than 5 signal stations\n";
874 double& RMSNoise,
double& MeanNoise,
double NoiseWindowStart,
875 double NoiseWindowStop)
878 unsigned int start = NoiseWindowStart / channeltrace.
GetBinning();
879 unsigned int stop = NoiseWindowStop / channeltrace.
GetBinning();
880 RMSNoise = TraceAlgorithm::RootMeanSquare(channeltrace, start, stop);
887 double& PeakAmplitude,
double& PeakTime,
double& PeakTimeError,
888 double SignalSearchWindowStart,
double SignalSearchWindowStop,
889 unsigned int& sample)
893 unsigned int start = SignalSearchWindowStart / channeltrace.
GetBinning();
894 unsigned int stop = SignalSearchWindowStop / channeltrace.
GetBinning();
896 OUT(eInfoDebug) <<
"Pulsefinder startsample = " << start <<
" lastsample = " << stop << endl;
898 for (
unsigned int i = start; i < stop; ++i) {
899 if (channeltrace[i] > PeakAmplitude) {
900 PeakAmplitude = channeltrace[i];
912 RdStationSignalReconstructor::GetAdjustedSignalAmplitude(
const double signalAmpitude,
const double SNR)
915 OUT(eInfoDebug) <<
"adjusting signal amplitude with a factor of " << 1 + 0.95 /
sqrt(
pow(SNR, 2.3))
917 return signalAmpitude / (1 + 1.55 /
sqrt(
pow(SNR, 2.43)));
922 RdStationSignalReconstructor::GetSignalUncertainty(
const double signalAmplitude,
const double SNR)
925 return (0.423/
sqrt(SNR) - 0.501/SNR + 3.395/
pow(SNR,1.5) ) * signalAmplitude;
930 RdStationSignalReconstructor::GetSignalTimeUncertainty(
const double SNR)
939 unsigned int sample,
const double PeakAmplitude,
940 double& SignalTimeFWHM,
double& IntegratedSignal,
941 double& SignalWindowStart,
double& SignalWindowStop)
945 IntegratedSignal = 0;
946 unsigned int tmp = sample;
948 while (sample < channeltrace.
GetSize() && channeltrace[sample] > 0.5 * PeakAmplitude) {
950 IntegratedSignal += channeltrace[sample];
953 SignalWindowStop = sample * channeltrace.
GetBinning();
956 while (sample > 0 && channeltrace[sample] > 0.5 * PeakAmplitude) {
958 IntegratedSignal += channeltrace[sample];
961 SignalWindowStart = sample * channeltrace.
GetBinning();
962 SignalTimeFWHM = SignalTimeFWHM * channeltrace.
GetBinning();
968 unsigned int sample,
double IntegrationTime,
969 double& IntegratedSignal,
double& SignalWindowStart,
970 double& SignalWindowStop,
const bool usePower)
973 IntegratedSignal = 0;
974 SignalWindowStart = sample * channeltrace.
GetBinning() - IntegrationTime / 2;
975 SignalWindowStop = sample * channeltrace.
GetBinning() + IntegrationTime / 2;
976 unsigned int start =
max(0.0, sample - IntegrationTime / 2 / channeltrace.
GetBinning());
977 unsigned int stop = min(channeltrace.
GetSize() * 1., sample + IntegrationTime / 2 / channeltrace.
GetBinning());
978 for (
unsigned int i = start; i <= stop; ++i) {
980 IntegratedSignal +=
Sqr(channeltrace[i]);
982 IntegratedSignal += fabs(channeltrace[i]);
985 IntegratedSignal *= channeltrace.
GetBinning();
991 double IntegrationTime,
double& IntegratedSignal,
992 double& SignalWindowStart,
double& SignalWindowStop,
993 double SignalSearchWindowStart,
994 double SignalSearchWindowStop)
998 IntegratedSignal = 0;
1000 int startSample = 0;
1002 for (
int windowStartPos = SignalSearchWindowStart / binning;
1003 windowStartPos <= (SignalSearchWindowStop - IntegrationTime) / binning; ++windowStartPos) {
1004 double newIntegratedSignal = 0;
1006 for (
int integratePos = 0; integratePos < IntegrationTime / binning; ++integratePos) {
1007 newIntegratedSignal +=
Sqr(channeltrace[windowStartPos + integratePos]);
1010 newIntegratedSignal /= count;
1011 if (newIntegratedSignal > IntegratedSignal) {
1012 IntegratedSignal = newIntegratedSignal;
1013 SignalWindowStart = windowStartPos * binning;
1014 startSample = windowStartPos;
1015 stopSample = windowStartPos + IntegrationTime / binning;
1018 SignalWindowStop = SignalWindowStart + IntegrationTime;
1022 <<
"RdStationSignalReconstructor::PulseSlidingWindowIntegrator():\n"
1023 <<
" IntegrationTime = " << IntegrationTime <<
" ns\n"
1024 <<
" SignalSearchWindowStart = " << SignalSearchWindowStart/
ns <<
" ns\n"
1025 <<
" SignalSearchWindowStop = " << SignalSearchWindowStop/
ns <<
" ns\n"
1026 <<
" SignalWindowStart = " << SignalWindowStart/
ns <<
" ns\n"
1027 <<
" SignalWindowStop = " << SignalWindowStop/
ns <<
" ns\n"
1028 <<
" startSample = " << startSample <<
" samples\n"
1029 <<
" stopSample = " << stopSample <<
" samples\n"
1031 <<
"(\\mu V)^2 / m^2" << endl;
1037 ROOT::Minuit2::MnUserParameterState
1039 const double noiseRMS,
1042 const bool fixPhaseSlope,
1043 const double phaseSlope)
1045 unsigned int nop = trace.
GetSize();
1046 if ((nop / 2) * 2 != nop) {
1052 unsigned int n = trace.
GetSize();
1053 unsigned int np = n / 2 + 1;
1059 TGraph gTrace = TGraph();
1060 for (
unsigned int i = 0; i < n; ++i) {
1062 gTrace.SetPoint(gTrace.GetN(), i * trace.
GetBinning(), trace[i]);
1067 const double timeBinning = trace.
GetBinning();
1069 unsigned int startBin =
static_cast<int>(std::ceil(30 *
utl::MHz * timeBinning * n));
1070 unsigned int stopBin =
static_cast<int>(std::floor(80 *
utl::MHz * timeBinning * n));
1071 const double frequencyBinning = 0.5 / timeBinning / (
static_cast<double>(np) - 1);
1074 TGraph gPhaseUnwrapped;
1075 for (
unsigned int i = startBin; i <= stopBin; ++i) {
1076 gAmplitude.SetPoint(gAmplitude.GetN(), i * frequencyBinning,
std::abs(g[i]));
1078 gPhase.SetPoint(gPhase.GetN(), startBin * frequencyBinning, std::arg(g[startBin]));
1079 gPhaseUnwrapped.SetPoint(gPhaseUnwrapped.GetN(), startBin * frequencyBinning,
1080 std::arg(g[startBin]));
1082 const double pi = M_PI;
1083 for (
unsigned int i = startBin + 1; i <= stopBin; ++i) {
1084 double previousPhase = std::arg(g[i - 1]);
1085 double phase = std::arg(g[i]);
1086 gPhase.SetPoint(gPhase.GetN(), i * frequencyBinning, phase);
1087 if ((phase - previousPhase) > pi) {
1090 if ((phase - previousPhase) < -1. * pi) {
1093 phase += k * 2. * pi;
1094 gPhaseUnwrapped.SetPoint(gPhaseUnwrapped.GetN(), i * frequencyBinning, phase);
1099 TFitResultPtr r_amp = gAmplitude.Fit(
"pol1",
"S");
1100 TFitResultPtr r_phase =gPhaseUnwrapped.Fit(
"pol1",
"S");
1118 ROOT::Minuit2::MnUserParameters upar;
1119 upar.Add(
"amplitude_p0", r_amp->Parameter(0), r_amp->ParError(0));
1120 upar.Add(
"amplitude_p1", r_amp->Parameter(1), r_amp->ParError(1));
1121 upar.Add(
"phase_p0", r_phase->Parameter(0), r_phase->ParError(0));
1122 upar.Add(
"phase_p1", r_phase->Parameter(1), r_phase->ParError(1));
1123 if (fixPhaseSlope) {
1124 upar.SetLimits(
"phase_p1", phaseSlope - 0.01 /
utl::MHz, phaseSlope + 0.01 /
utl::MHz);
1128 ROOT::Minuit2::MnMigrad migrad(fitFunction, upar);
1131 ROOT::Minuit2::FunctionMinimum minimum = migrad();
1133 info <<
"Result of analytic signal fit: " << minimum;
1136 ROOT::Minuit2::MnUserParameterState minUstate_tmp = minimum.UserState();
1137 return minUstate_tmp;
1142 SignalObjectiveFunction::operator()(
const std::vector<double>& pars)
1145 unsigned int n = fTrace.GetSize();
1146 unsigned int np = n / 2 + 1;
1154 double timeBinning = fTrace.GetBinning();
1156 unsigned int startBin =
static_cast<int>(std::ceil(30 *
utl::MHz * timeBinning * n));
1157 unsigned int stopBin =
static_cast<int>(std::floor(80 *
utl::MHz * timeBinning * n));
1158 const double frequencyBinning = 0.5 / timeBinning / (
static_cast<double>(np) - 1);
1159 for (
unsigned int i = 0; i < np; ++i) {
1160 if (i < startBin || i > stopBin) {
1163 g[i] = std::polar(pars[0] + pars[1] * i * frequencyBinning,
1164 pars[2] + pars[3] * i * frequencyBinning) * frequencyBinning;
1171 for (
unsigned int i = 0; i < n; ++i) {
1172 chi2 += (fTrace[i] - f[i]) * (fTrace[i] - f[i]) / (fSigma * fSigma);
Branch GetTopBranch() const
Class to access station level reconstructed data.
void SetParameter(Parameter i, double value, bool lock=true)
void SetParameterError(Parameter i, double value, bool lock=true)
utl::Point GetReferenceCorePosition(const Event &event) const
Returning the reference core position depending on the corresponding flag.
constexpr T Sqr(const T &x)
boost::filter_iterator< CandidateStationFilter, AllStationIterator > CandidateStationIterator
Iterator over all CandidateStations (i.e., HasSignal, HasNoSignal)
int GetId() const
Return Id of the Channel.
StationTriggerData & GetTriggerData()
Get Trigger data for the station.
boost::indirect_iterator< InternalChannelIterator, Channel & > ChannelIterator
Iterator over station for read/write.
void SetPulseFound(const bool pulsefound)
StationRecData & GetRecData()
Get station level reconstructed data.
Interface class to access Shower Reconstructed parameters.
bool HasRecShower() const
CandidateStationIterator CandidateStationsEnd()
Interface class to access to the Radio part of an event.
Interface class to access to the RD Reconstruction of a Shower.
double GetParameterError(const Parameter i) const
bool HasReferenceAxis(const Event &event) const
Return always true for SD and FD if RecShower exsist, asking for min. rec stage could fix this...
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.
ChannelIterator ChannelsBegin()
begin Channel iterator for read/write
double pow(const double x, const unsigned int i)
ShowerRRecData & GetRRecShower()
ChannelIterator ChannelsEnd()
end Channel iterator for read/write
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
Iterator next(Iterator it)
#define INFOIntermediate(y)
Class representing a document branch.
class to hold data at the radio Station level.
std::vector< T >::size_type SizeType
void PopBack()
Remove one value at the end of the trace.
void fft(Complex *in, Complex *out=NULL)
double abs(const SVector< n, T > &v)
bool HasRRecShower() const
C< T > & GetTimeSeries()
read out the time series (write access)
CandidateStationIterator CandidateStationsBegin()
#define WARNING(message)
Macro for logging warning messages.
void GetData(bool &b) const
Overloads of the GetData member template function.
int GetId() const
Get the station Id.
double GetParameter(const Parameter i) const
void SetBinning(const double binning)
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.
bool HasParameter(const Parameter i) const
bool HasReferenceCorePosition(const Event &event) const
Return always true for SD and FD if RecShower exsist, asking for min. rec stage could fix this...
const StationFFTDataContainer & GetFFTDataContainer() const
retrieve Station FFTDataContainer (read access)
Template class for a FADC data or calibrated data container. Use the typedefs (TraceD, TraceI, etc.) defined in Trace-fwd.h.
TriggerSource GetTriggerSource() const
Get the Trigger Source of the station, i.e. if it triggered itself or was triggered by the central st...
void SetParameter(Parameter i, double value, bool lock=true)
Class that holds the data associated to an individual radio channel.
constexpr double kConversionRadioSignalToEnergyFluence
utl::Vector GetReferenceAxis(const Event &event) const
Returning the referencedirection depending on the corresponding flag.
double Mean(const std::vector< double > &v)
bool HasRecData() const
Check whether station reconstructed data exists.
static Policy::type Create(const utl::Point &theOrigin)
Create the standard local coordinate system for a Point.
void PushBack(const T &value)
Insert a single value at the end.
utl::Vector GetMagneticFieldVector() const
returns the magnetic field vector from the components stored in the parameter storage ...
#define ERROR(message)
Macro for logging error messages.
utl::TraceV3D GetTraceInShowerPlaneVxB(const utl::TraceV3D &trace) const