1 #include "WaveformCombiner.h" 2 #include "AntennaPositions.h" 4 #include "BasicFilters.h" 5 #include "FilteredAnitaEvent.h" 6 #include "AnitaVersion.h" 8 #include "ResponseManager.h" 9 #include "SystemResponse.h" 12 #include <sys/types.h> 15 UCorrelator::WaveformCombiner::WaveformCombiner(
int nantennas,
int npad,
bool useUnfiltered,
bool deconvolve,
const AnitaResponse::ResponseManager * response,
bool alfa_hack)
16 : coherent(260), deconvolved(260), alfa_hack(alfa_hack)
18 setNAntennas(nantennas);
20 setDeconvolve(deconvolve);
21 setUseUnfiltered(useUnfiltered);
22 setGroupDelayFlag(
true);
23 setRTimeShiftFlag(
true);
24 use_raw= useUnfiltered;
26 setBottomFirst(
false);
27 setDelayToCenter(
false);
29 extra_filters_deconvolved = 0;
30 enable_r_time_shift =
true;
31 enable_simulation_time_shift =
false;
40 UCorrelator::WaveformCombiner::~WaveformCombiner()
44 const AnalysisWaveform * UCorrelator::WaveformCombiner::getDeconvolved()
const 47 if (!do_deconvolution)
59 static void scaleGraph(TGraph * g,
double C)
64 for (
int i = 0; i < max; i++)
70 static void addToGraph(TGraph * g,
const TGraph * h)
72 int max = TMath::Min(g->GetN(), h->GetN());
73 for (
int i = 0; i < max; i++)
75 g->GetY()[i] += h->GetY()[i];
82 return use_raw ?
event->getRawGraph(ant, pol) :
event->getFilteredGraph(ant,pol);
93 std::vector<AnalysisWaveform> padded(nant);
94 const int numDeconv = do_deconvolution ? nant : 0;
95 std::vector<AnalysisWaveform> deconv(numDeconv);
102 if (antennas[0] < 32) {
103 int toMove = antennas[0];
104 if (antennas[1] > 32) {
105 antennas[0] = antennas[1];
106 antennas[1] = toMove; }
108 antennas[0] = antennas[2];
109 antennas[2] = toMove; }
114 for (
int i = 0; i < nant; i++)
117 (void) wf(event,antennas[i],pol)->freq();
120 padded[i].~AnalysisWaveform();
124 for(
int j = 0; j < (int) extra_filters->nOperations(); j++)
135 coherent_avg_spectrum.adopt(p);
139 addToGraph(&coherent_avg_spectrum,wf(event,antennas[0],pol)->power());
143 if (alfa_hack && AnitaVersion::get() == 3 && pol ==
AnitaPol::kHorizontal && (antennas[i] == 4 || antennas[i] == 12))
150 sum_peak += (use_hilbert ? padded[i].hilbertEnvelope() : padded[i].even())->peakVal();
154 padded[i].padFreq(npad);
156 if (do_deconvolution)
158 deconv[i].~AnalysisWaveform();
160 if(extra_filters_deconvolved)
162 for(
int j = 0; j < (int) extra_filters_deconvolved->nOperations(); j++)
169 responses->response(pol,antennas[i])->deconvolveInPlace(&deconv[i], responses->getDeconvolutionMethod(), theta );
173 deconvolved_avg_spectrum.adopt(p);
177 addToGraph(&deconvolved_avg_spectrum, deconv[i].power());
179 deconv[i].padFreq(npad);
182 if (delay_to_center) delays[i] =
getDeltaTtoCenter(antennas[i], phi, theta, pol, enable_group_delay, enable_r_time_shift, enable_simulation_time_shift);
183 else delays[i] = i == 0 ? 0 :
getDeltaT(antennas[i], antennas[0], phi, theta, pol, enable_group_delay);
187 max_vpp = combineWaveforms(nant, &padded[0], delays, 0, &coherent, t0, t1, check_vpp);
188 scaleGraph(&coherent_avg_spectrum, 1./nant);
189 if (do_deconvolution)
191 combineWaveforms(nant, &deconv[0], delays, 0, &deconvolved, t0, t1, 0);
192 scaleGraph(&deconvolved_avg_spectrum, 1./nant);
197 *avg_of_peaks = sum_peak / nant;
206 double dt = wf[0].
deltaT();
208 int N = ceil((max-min)/dt);
215 for (
int i = 0; i < N; i++)
217 gupdate->GetX()[i] = min + i * dt;
220 for (
int j = 0; j < nwf; j++)
222 double scale = scales ? scales[j] : 1;
224 val += wf[j].
evalEven(gupdate->GetX()[i] + delays[j])/nwf*scale;
229 tempvpp = wf[j].
even()->pk2pk();
230 if(maxvpp < tempvpp) maxvpp = tempvpp;
234 tempvpp = wf[j].
even()->pk2pk()/double(nwf);
241 gupdate->GetY()[i] = val;
249 if(extra_filters)
delete extra_filters;
250 extra_filters = extra;
255 if(extra_filters_deconvolved)
delete extra_filters_deconvolved;
256 extra_filters_deconvolved = extra;
virtual void processOne(AnalysisWaveform *, const RawAnitaHeader *=0, int=0, int pol=0)
double getDeltaTtoCenter(int ant1, double phi, double theta, AnitaPol::AnitaPol_t pol, bool includeGroupDelay=false, bool includeTimeShift=true, bool simulationTimeShift=false)
A filter strategy defines the sets of filters that are used and provides some introspection abilities...
double getDeltaT(int ant1, int ant2, double phi, double theta, AnitaPol::AnitaPol_t pol, bool includeGroupDelay=false)
int getClosestAntennas(double phi, int N, int *closest, ULong64_t disallowed=0, AnitaPol::AnitaPol_t pol=AnitaPol::kHorizontal) const
This class is intended to store all the necessary data about an ANITA event for filtering and analysi...
enum AnitaPol::EAnitaPol AnitaPol_t
Polarisation enumeration.
virtual void processOne(AnalysisWaveform *awf, const RawAnitaHeader *header=0, int ant=0, int pol=0)=0
const RawAnitaHeader * getHeader() const