8 #include <FairLogger.h>
12 #include <TVirtualFFT.h>
21 for (
int i = 0; i < 512 / 2 + 1; ++i)
22 AddFreqRange({i, getFilterKernel(i, order, cutoff), i, getFilterKernel(i, order, cutoff)});
30 double AtFilterFFT::getFilterKernel(
int freq,
int fFilterOrder,
int fCutoffFreq)
33 if (fFilterOrder == 0)
36 return 1.0 / (1.0 + std::pow(freq * freq / fCutoffFreq, fFilterOrder));
41 auto canAdd = isValidFreqRange(range);
62 fFFT = std::unique_ptr<TVirtualFFT>(TVirtualFFT::FFT(1, dimSize.data(),
"R2C M K"));
66 fFFTbackward = std::unique_ptr<TVirtualFFT>(TVirtualFFT::FFT(1, dimSize.data(),
"C2R M K"));
85 LOG(error) <<
"Skipping FFT on pad " << pad->
GetPadNum() <<
" at " << pad <<
" because not pedestal subtracted.";
100 auto inputFFT = std::make_unique<AtPadFFT>();
101 inputFFT->GetDataFromFFT(
fFFT.get());
109 for (
int i = 0; i < 20; ++i)
114 for (
int i = 0; i < pad->
GetADC().size(); ++i)
120 bool AtFilterFFT::isValidFreqRange(
const AtFreqRange &range)
123 isValid &= range.fBeginFreq <= range.fEndFreq;
125 isValid &= range.fBeginFact >= 0 && range.fBeginFact <= 1;
126 isValid &= range.fEndFact >= 0 && range.fEndFact <= 1;
127 isValid &= !doesFreqRangeOverlap(range);
131 bool AtFilterFFT::doesFreqRangeOverlap(
const AtFreqRange &newRange)
137 if (newRange.fBeginFreq >= range.fBeginFreq && newRange.fBeginFreq < range.fEndFreq)
139 if (newRange.fBeginFreq == range.fEndFreq && newRange.fBeginFact != range.fEndFact)
144 if (newRange.fEndFreq > range.fBeginFreq && newRange.fEndFreq <= range.fEndFreq)
146 if (newRange.fEndFreq == range.fBeginFreq && newRange.fEndFact != range.fBeginFreq)
159 auto ret = std::make_unique<AtPadFFT>();
160 for (
int i = 0; i < 512 / 2 + 1; ++i) {
163 fFFT->GetPointComplex(i, re, im);
168 ret->SetPoint(i, {re, im});
182 std::cout << pair.first <<
" " << pair.second << std::endl;