2 #include <utl/ErrorLogger.h>
4 #include <fwk/CentralConfig.h>
7 #include <revt/REvent.h>
8 #include <evt/ShowerRecData.h>
9 #include <evt/ShowerRRecData.h>
10 #include <revt/Header.h>
11 #include <revt/Station.h>
12 #include <revt/Channel.h>
13 #include <revt/StationRecData.h>
15 #include <rdet/RDetector.h>
16 #include <rdet/Channel.h>
18 #include <utl/Trace.h>
19 #include <utl/TraceAlgorithm.h>
20 #include <utl/Reader.h>
21 #include <utl/config.h>
22 #include <utl/AugerUnits.h>
37 REvent* RdChannelSineWaveSuppressor::fgCurrentREvent;
38 int RdChannelSineWaveSuppressor::fgCurrentStation;
39 int RdChannelSineWaveSuppressor::fgCurrentChannel;
40 int RdChannelSineWaveSuppressor::fgFitWindow;
41 unsigned int RdChannelSineWaveSuppressor::fgSignalStart;
42 unsigned int RdChannelSineWaveSuppressor::fgSignalStop;
43 unsigned int RdChannelSineWaveSuppressor::fgNoiseStart;
44 unsigned int RdChannelSineWaveSuppressor::fgNoiseStop;
50 INFO(
"RdChannelSineWaveSuppressor::Init()");
53 Branch topBranch = CentralConfig::GetInstance()->
GetTopBranch(
"RdChannelSineWaveSuppressor");
60 if (fNoiseInterval >= 1.0) {
61 ERROR(
"<NoiseInterval> must be a fraction smaller than one");
65 if (fgFitWindow > 3) {
66 ERROR(
"<FitWindow> out of bounds");
76 INFO(
"RdChannelSineWaveSuppressor::Run()");
78 REvent& rEvent =
event.GetREvent();
79 fgCurrentREvent = &rEvent;
83 for (
auto& station : rEvent.StationsRange()) {
85 fgCurrentStation = station.GetId();
87 for (
auto& channel : station.ChannelsRange()) {
89 if (!channel.IsActive())
92 fgCurrentChannel = channel.GetId();
95 double spectrumBinning = spectrum.
GetBinning();
96 const rdet::RDetector& rDetector = det::Detector::GetInstance().GetRDetector();
98 rDetector.
GetStation(station.GetId()).GetChannel(channel.GetId());
101 unsigned int lowerBin = (int)(lowerDesignFreq/spectrumBinning);
102 unsigned int upperBin = (int)(upperDesignFreq/spectrumBinning);
105 if (fScanWindowSize > upperBin-lowerBin) {
107 warn <<
"<ScanWindowSize> too big, window size set to full spectrum width ("
108 << (upperBin - lowerBin) <<
" bins)";
110 WindowSize = upperBin - lowerBin;
112 WindowSize = fScanWindowSize;
114 const unsigned int centralBin = WindowSize/2 + 1;
115 vector<double> vSlidingWindow;
116 vector<double> vThreshold;
117 vector<double> vMaxLikelihood;
118 vector<int> vRFIBins;
119 double RFIThreshold = 0;
120 double squaredSum = 0;
121 double maxLikelihood = 0;
124 double InvSampleProp = 1 -
pow(fNoiseInterval, 1. / (upperBin - lowerBin));
125 double CDFarg = -log(InvSampleProp);
129 vSlidingWindow.push_back(
abs(spectrum[i]));
130 squaredSum +=
Sqr(
abs(spectrum[i]));
133 maxLikelihood =
sqrt(squaredSum / (2*WindowSize));
134 RFIThreshold =
sqrt(CDFarg * 2 *
Sqr(maxLikelihood));
136 for (vector<double>::size_type i = 0; i <= centralBin; ++i) {
137 if (vSlidingWindow[i] > RFIThreshold) {
138 vRFIBins.push_back(lowerBin + i);
139 vThreshold.push_back(RFIThreshold);
140 vMaxLikelihood.push_back(maxLikelihood);
145 squaredSum +=
Sqr(vSlidingWindow.front()) +
Sqr(
abs(spectrum[i]));
146 maxLikelihood =
sqrt(squaredSum / (2 * WindowSize));
147 RFIThreshold =
sqrt(CDFarg * 2 *
Sqr(maxLikelihood));
148 vSlidingWindow.erase(vSlidingWindow.begin());
149 vSlidingWindow.push_back(
abs(spectrum[i]));
151 if (vSlidingWindow[centralBin] > RFIThreshold) {
152 vRFIBins.push_back(i - WindowSize + centralBin + 1);
153 vThreshold.push_back(RFIThreshold);
154 vMaxLikelihood.push_back(maxLikelihood);
158 for (vector<double>::size_type i = centralBin; i < vSlidingWindow.size(); ++i) {
159 if (vSlidingWindow[i] > RFIThreshold) {
160 vRFIBins.push_back(upperBin - WindowSize + i + 1);
161 vThreshold.push_back(RFIThreshold);
162 vMaxLikelihood.push_back(maxLikelihood);
167 if (vRFIBins.empty()) {
168 info <<
"No RFI identified in channel " << channel.GetId();
175 vector<int> vFitBins;
178 for (vector<int>::size_type i = 0; i < vRFIBins.size(); ++i) {
179 if (i < vRFIBins.size() - 1) {
180 if (vRFIBins[i+1] - vRFIBins[i] == 1)
183 PeakBin = vRFIBins[i - PeakWidth + 1];
184 for (vector<int>::size_type j = i - PeakWidth + 1; j <= i; ++j) {
185 if (
abs(spectrum[vRFIBins[j]]) >
abs(spectrum[PeakBin]))
186 PeakBin = vRFIBins[j];
188 vFitBins.push_back(PeakBin);
192 PeakBin = vRFIBins[i - PeakWidth + 1];
193 for (vector<int>::size_type j = i - PeakWidth + 1; j <= i; ++j) {
194 if (
abs(spectrum[vRFIBins[j]]) >
abs(spectrum[PeakBin]))
195 PeakBin = vRFIBins[j];
197 vFitBins.push_back(PeakBin);
202 if (vFitBins.size() > 1) {
203 RdChannelSineWaveSuppressor::RFISort(vFitBins, 0, vFitBins.size() - 1);
206 info <<
"Identified RFI frequencies in channel " << channel.GetId()
207 <<
" of station " << station.GetId() <<
" in decreasing order of strength:";
210 for (
auto& elem : vFitBins) {
211 info << elem * spectrumBinning/
MHz <<
" MHz ";
217 double samplingFrequency = 1. / trace.
GetBinning();
220 fgSignalStart = station.GetRecData().GetParameter(revt::eSignalSearchWindowStart)*samplingFrequency;
221 fgSignalStop = station.GetRecData().GetParameter(revt::eSignalSearchWindowStop)*samplingFrequency;
222 fgNoiseStart = station.GetRecData().GetParameter(revt::eNoiseWindowStart)*samplingFrequency;
223 fgNoiseStop = station.GetRecData().GetParameter(revt::eNoiseWindowStop)*samplingFrequency;
226 for (
unsigned int j = 0; j < vFitBins.size(); ++j) {
229 double FitThreshold = 0;
231 for (vector<int>::size_type i = 0; i < vRFIBins.size(); ++i) {
232 if (vFitBins[j] == vRFIBins[i]) {
233 FitThreshold = vThreshold[i];
234 FitNoise = vMaxLikelihood[i];
240 double FitFreq = vFitBins[j] * spectrumBinning;
241 double Freqmin = FitFreq - 0.5*spectrumBinning;
242 double Freqmax = FitFreq + 0.5*spectrumBinning;
245 double AmpEst = (
abs(spectrum[vFitBins[j]]) - FitNoise)*spectrumBinning*2.0;
247 double Ampmin = FitNoise * spectrumBinning;
249 double Ampmax =
abs(spectrum[vFitBins[j]]) * spectrumBinning*TMath::Pi() - FitNoise*spectrumBinning*2.0;
251 double PhaseEst = arg(spectrum[vFitBins[j]]) + FitFreq/samplingFrequency*2*TMath::Pi();
258 if (fInfoLevel >= eInfoDebug) {
259 minuit.mnexcm(
"SET PRINTOUT", argList, 1, errFlag);
260 minuit.mnexcm(
"SET NOWARNINGS", argList, 0, errFlag);
264 minuit.SetFCN(RdChannelSineWaveSuppressor::SineFitFnc);
266 minuit.mnexcm(
"SET ERRORDEF", argList, 1, errFlag);
267 minuit.mnparm(0,
"amp", AmpEst, 0.00001, Ampmin, Ampmax, errFlag);
268 minuit.mnparm(1,
"freq", FitFreq, 0.000001, Freqmin, Freqmax, errFlag);
269 minuit.mnparm(2,
"phase", PhaseEst, 0.00001, 0, 0, errFlag);
273 minuit.mnexcm(
"CALI", argList, 1, errFlag);
275 minuit.mnexcm(
"MINIMIZE", argList, 1, errFlag);
283 minuit.GetParameter(0, amp, foo);
284 minuit.GetParameter(1, freq, foo);
285 minuit.GetParameter(2, phase, foo);
288 if (amp > FitThreshold * spectrumBinning) {
290 trace[i] = trace[i] - amp*sin(i/samplingFrequency*freq*2*TMath::Pi() + phase);
292 info <<
"Substracted sine wave from channel " << channel.GetId()
293 <<
" of station " << station.GetId() <<
" with frequency "
294 << freq/
MHz <<
" MHz, amplitude " << amp*1e6
295 <<
" muV/m and phase " << phase/TMath::Pi() <<
" pi.";
298 info <<
"Fit failed for RFI source from channel " << channel.GetId()
299 <<
" of station " << station.GetId() <<
" with frequency "
300 << FitFreq/
MHz <<
" MHz. Fitted amplitude of " << amp*1e6
301 <<
" muV/m is lower than RFI threshold of "
302 << FitThreshold*spectrumBinning*1e6 <<
" muV/m.";
313 RdChannelSineWaveSuppressor::Finish()
315 INFO(
"RdChannelSineWaveSuppressor::Finish()");
322 RdChannelSineWaveSuppressor::SineFitFnc(
int& ,
double*
const ,
double& value,
323 double*
const par,
const int )
325 const double& amp = par[0];
326 const double&
freq = par[1];
327 const double& phase = par[2];
330 fgCurrentREvent->GetStation(fgCurrentStation).GetChannel(fgCurrentChannel).GetChannelTimeSeries();
331 double samplingFrequency = 1./trace.
GetBinning();
334 if ((i > fgSignalStart && i < fgSignalStop && fgFitWindow > 1) ||
335 (i > fgNoiseStart && i < fgNoiseStop && fgFitWindow == 3) ||
336 (i < fgNoiseStart && i > fgNoiseStop && fgFitWindow == 1))
339 Chi2 += (trace[i] - amp*sin(i/samplingFrequency*freq*2*TMath::Pi() + phase)) *
340 (trace[i] - amp*sin(i/samplingFrequency*freq*2*TMath::Pi() + phase));
346 RdChannelSineWaveSuppressor::RFISort(std::vector<int> &v,
int left,
int right)
349 fgCurrentREvent->GetStation(fgCurrentStation).GetChannel(fgCurrentChannel).GetChannelFrequencySpectrum();
350 int i = left, j = right;
352 double pivot =
abs(spectrum[v[(left + right) / 2]]);
355 while (
abs(spectrum[v[i]]) > pivot)
357 while (
abs(spectrum[v[j]]) < pivot)
368 RdChannelSineWaveSuppressor::RFISort(v, left, j);
370 RdChannelSineWaveSuppressor::RFISort(v, i, right);
Branch GetTopBranch() const
constexpr T Sqr(const T &x)
double GetDesignUpperFreq() const
Get design value of the freq-band.
Interface class to access to the Radio part of an event.
double GetDesignLowerFreq() const
Get design value of the freq-band.
double GetBinning() const
size of one slot
#define INFO(message)
Macro for logging informational messages.
void Init()
Initialise the registry.
Detector description interface for Channel-related data.
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
double pow(const double x, const unsigned int i)
void Chi2(int &, double *const , double &value, double *const par, const int)
Detector description interface for RDetector-related data.
#define INFOIntermediate(y)
Class representing a document branch.
std::vector< std::complex< double > >::size_type SizeType
double abs(const SVector< n, T > &v)
#define WARNING(message)
Macro for logging warning messages.
void GetData(bool &b) const
Overloads of the GetData member template function.
ResultFlag
Flag returned by module methods to the RunController.
#define ERROR(message)
Macro for logging error messages.
const Station & GetStation(const int stationId) const
Get station by Station Id.