2 #include "AnalysisConfig.h" 3 #include "Polarimetry.h" 5 #include "AnalysisWaveform.h" 6 #include "AnitaVersion.h" 7 #include "AnitaFlightInfo.h" 9 #include "ImpulsivityMeasure.h" 10 #include "BandwidthMeasure.h" 14 #include "FilteredAnitaEvent.h" 15 #include "UsefulAnitaEvent.h" 17 #include "DigitalFilter.h" 19 #include "UsefulAdu5Pat.h" 20 #include "RawAnitaHeader.h" 21 #include "PeakFinder.h" 23 #include "ShapeParameters.h" 24 #include "SpectrumParameters.h" 26 #include "TGraphErrors.h" 27 #include "simpleStructs.h" 28 #include "UCImageTools.h" 30 #include "TimeDependentAverage.h" 32 #ifdef UCORRELATOR_OPENMP 36 #define SECTIONS _Pragma("omp parallel sections") 37 #define SECTION _Pragma("omp section") 41 #define SECTIONS if(true) 42 #define SECTION if(true) 47 static int instance_counter = 0;
50 #define DEG2RAD (TMath::Pi()/ 180) 54 #define RAD2DEG (180 / TMath::Pi()) 63 : cfg(conf ? conf: &defaultConfig),
64 corr(cfg->correlator_nphi,0,360, cfg->correlator_ntheta, -cfg->correlator_theta_lowest, cfg->correlator_theta_highest, cfg->use_bin_center, cfg->scale_by_cos_theta, cfg->baseline_weight, cfg->correlation_gain_correction ) ,
65 responses(cfg->response_option ==
AnalysisConfig::ResponseCustomString ? cfg->response_string :
AnalysisConfig::getResponseString(cfg->response_option), cfg->response_npad, cfg->deconvolution_method),
66 wfcomb(cfg->combine_nantennas, cfg->combine_npad, true, cfg->response_option!=
AnalysisConfig::ResponseNone, &responses),
67 wfcomb_xpol(cfg->combine_nantennas, cfg->combine_npad, true, cfg->response_option!=
AnalysisConfig::ResponseNone, &responses),
68 wfcomb_filtered(cfg->combine_nantennas, cfg->combine_npad, false, cfg->response_option!=
AnalysisConfig::ResponseNone, &responses),
69 wfcomb_xpol_filtered(cfg->combine_nantennas, cfg->combine_npad, false, cfg->response_option!=
AnalysisConfig::ResponseNone, &responses),
70 interactive(interactive_mode)
72 #ifdef UCORRELATOR_OPENMP 73 TThread::Initialize();
74 ROOT::EnableThreadSafety();
76 zoomed =
new TH2D(TString::Format(
"zoomed_%d", instance_counter),
"Zoomed!", cfg->
zoomed_nphi, 0 ,1, cfg->
zoomed_ntheta, 0, 1);
77 zoomed->SetDirectory(0);
82 disallowedAnts[0] = 0;
83 disallowedAnts[1] = 0;
94 sourceLon = 0; sourceLat = 0; sourceAlt = 0;
114 wfcomb.setRTimeShiftFlag(cfg->r_time_shift_correction);
115 wfcomb_xpol.setRTimeShiftFlag(cfg->r_time_shift_correction);
116 wfcomb_filtered.setRTimeShiftFlag(cfg->r_time_shift_correction);
117 wfcomb_xpol_filtered.setRTimeShiftFlag(cfg->r_time_shift_correction);
118 wfcomb.setSimulationTimeShiftFlag(cfg->simulation_time_shift_correction);
119 wfcomb_xpol.setSimulationTimeShiftFlag(cfg->simulation_time_shift_correction);
120 wfcomb_filtered.setSimulationTimeShiftFlag(cfg->simulation_time_shift_correction);
121 wfcomb_xpol_filtered.setSimulationTimeShiftFlag(cfg->simulation_time_shift_correction);
130 correlation_maps[0] = 0;
131 correlation_maps[1] = 0;
133 for (
int i = 0; i < cfg->nmaxima; i++)
135 zoomed_correlation_maps[0].push_back(0);
136 zoomed_correlation_maps[1].push_back(0);
138 for (
int ipol =0; ipol <2;ipol++)
140 for (
int ifilt = 0; ifilt <2; ifilt++)
148 coherent_power_xpol[ipol][ifilt].push_back(
new TGraphAligned);
149 deconvolved_power_xpol[ipol][ifilt].push_back(
new TGraphAligned);
162 for (
int ant =0; ant < wfcomb->getNAntennas(); ant++)
165 if(use_antenna_level_snr) rms += ant_rms;
166 else rms += ant_rms * ant_rms;
169 if(use_antenna_level_snr) rms = rms / wfcomb->getNAntennas();
170 else rms = sqrt(rms) / wfcomb->getNAntennas();
196 phiRange[0] *= 180./TMath::Pi();
197 thetaRange[0] *= -180./TMath::Pi();
198 phiRange[1] = phiRange[0] + dPhi;
199 thetaRange[1] = thetaRange[0] + dTheta;
201 thetaRange[0] -= dTheta;
207 phiRange[0] = summary->
sun.phi - dPhi;
208 phiRange[1] = summary->
sun.phi + dPhi;
209 thetaRange[0] = -summary->
sun.theta - dTheta;
210 thetaRange[1] = -summary->
sun.theta + dTheta;
214 ULong64_t saturated[2] = {0,0};
217 cfg->saturation_threshold);
223 for (
int pol = cfg->start_pol; pol <= cfg->end_pol; pol++)
230 UShort_t maskedL2 = 0;
231 UShort_t maskedPhi = 0 ;
232 UShort_t maskedL2Xpol = 0;
233 UShort_t maskedPhiXpol = 0 ;
235 if (cfg->use_offline_mask)
240 if (AnitaVersion::get() == 3)
249 #ifdef MULTIVERSION_ANITA_ENABLED 250 maskedL2 =
event->getHeader()->getL2Mask();
252 #if VER_EVENT_HEADER>=40 253 maskedL2 =
event->getHeader()->l2TrigMask;
255 maskedL2 =
event->getHeader()->l1TrigMask;
258 maskedL2Xpol = maskedL2;
267 if (AnitaVersion::get() == 3)
276 #ifdef MULTIVERSION_ANITA_ENABLED 277 maskedL2 =
event->getHeader()->getL2Mask();
279 #if VER_EVENT_HEADER>=40 280 maskedL2 =
event->getHeader()->l2TrigMask;
282 maskedL2 =
event->getHeader()->l1TrigMask;
286 maskedL2Xpol = maskedL2;
304 #ifdef __cpp_static_assert 305 static_assert(
sizeof(maskedPhi == NUM_PHI),
"masked phi must be same size as num phi ");
308 maskedPhi |= ( (maskedPhi >> 1) | ( maskedPhi << (NUM_PHI-1))) ;
310 maskedPhi |= maskedL2;
313 #ifdef __cpp_static_assert 314 static_assert(
sizeof(maskedPhiXpol == NUM_PHI),
"masked phi xpol must be same size as num phi ");
318 maskedPhiXpol |= (maskedPhiXpol >> 1) | ((maskedPhiXpol << (NUM_PHI-1)));
319 maskedPhiXpol |= maskedL2Xpol;
322 TVector2 triggerAngle(0,0);
324 int ntriggered = __builtin_popcount(triggeredPhi);
325 int ntriggered_xpol = __builtin_popcount(triggeredPhiXpol);
327 UShort_t which_trigger = ntriggered ? triggeredPhi : triggeredPhiXpol;
328 int which_ntriggered = ntriggered ?: ntriggered_xpol;
330 const double phi_sector_width = 360. / NUM_PHI;
332 for (
int i = 0; i < NUM_PHI; i++)
334 if (which_trigger & (1 << i))
337 double ang = (i * phi_sector_width - 45) * TMath::Pi()/180;
338 triggerAngle += TVector2(cos(ang), sin(ang)) / which_ntriggered;
342 double avgHwAngle = triggerAngle.Phi() * RAD2DEG;
345 saturated[pol] |= disallowedAnts[pol];
350 uint64_t maskedAnts= 0;
351 if (cfg->min_peak_distance_from_unmasked >=0)
353 for (uint64_t iphi = 0; iphi < 16; iphi++)
355 bool unmasked = !(maskedPhi & (1ul << iphi)) ;
357 for (
int neighboring = 0; neighboring < cfg->min_peak_distance_from_unmasked; neighboring++)
360 unmasked = unmasked || !(maskedPhi & (1ul << ( (iphi + neighboring) % NUM_PHI)));
361 unmasked = unmasked || !(maskedPhi & (1ul << ( (iphi + neighboring + NUM_PHI - 1) % NUM_PHI)));
366 maskedAnts |= 1ul << iphi;
367 maskedAnts |= 1ul << (iphi+NUM_PHI);
368 maskedAnts |= 1ul << (iphi+2*NUM_PHI);
373 corr.setDisallowedAntennas(saturated[pol] | disallowedAnts[pol] | maskedAnts);
380 if (cfg->max_peak_trigger_angle)
382 phiRange[0] =
FFTtools::wrap(avgHwAngle - cfg->max_peak_trigger_angle,360);
383 phiRange[1] =
FFTtools::wrap(avgHwAngle + cfg->max_peak_trigger_angle,360);
388 int npeaks = UCorrelator::peakfinder::findIsolatedMaxima((
const TH2D*) corr.getHist(),
389 cfg->peak_isolation_requirement,
390 cfg->nmaxima, maxima, phiRange[0], phiRange[1],
391 thetaRange[0], thetaRange[1], exclude, cfg->use_bin_center);
393 summary->
nPeaks[pol] = npeaks;
395 rough_peaks[pol].clear();
399 if (!avg_spectra[pol])
401 avg_spectra[pol] =
new TGraph;
402 avg_spectra[pol]->GetXaxis()->SetTitle(
"Frequency (GHz)");
403 avg_spectra[pol]->GetYaxis()->SetTitle(
"Power (dBish)");
404 avg_spectra[pol]->SetTitle(TString::Format(
"Average spectra for %s", pol ==
AnitaPol::kHorizontal ?
"HPol" :
"VPol"));
410 if (cfg->fill_channel_info)
412 fillChannelInfo(event, summary);
418 rms_lims[0] = (cfg->correlator_nphi/6 + maxima[0].xbin) % cfg->correlator_nphi;
419 rms_lims[1] = (-cfg->correlator_nphi/6 + maxima[0].xbin) % cfg->correlator_nphi;
421 rms_lims[3] = cfg->correlator_ntheta;
422 maprms = UCorrelator::getZRMS(corr.getHist(), rms_lims);
425 for (
int i = 0; i < npeaks; i++)
431 fillPointingInfo(maxima[i].x, maxima[i].y, &summary->
peak[pol][i], pat, avgHwAngle, triggeredPhi, maskedPhi, triggeredPhiXpol, maskedPhiXpol);
435 if (zoomed_correlation_maps[pol][i])
delete zoomed_correlation_maps[pol][i];
437 zoomed_correlation_maps[pol][i]->SetName(TString::Format(
"zoomed_%d_%d", pol,i));
443 for (
int j = 0; j < i; j++)
453 for (
int i = 0; i < npeaks; i++)
455 rough_peaks[pol].push_back(std::pair<double,double>(maxima[i].x, maxima[i].y));
457 if(cfg->use_antenna_level_snr > 0)
459 wfcomb.setCheckVpp(cfg->use_antenna_level_snr);
460 wfcomb_xpol.setCheckVpp(cfg->use_antenna_level_snr);
461 wfcomb_filtered.setCheckVpp(cfg->use_antenna_level_snr);
462 wfcomb_xpol_filtered.setCheckVpp(cfg->use_antenna_level_snr);
470 cfg->combine_t0, cfg->combine_t1, &summary->
peak[pol][i].
antennaPeakAverage, cfg->use_hilbert_for_antenna_average);
472 wfcomb_xpol.combine(summary->
peak[pol][i].phi, summary->
peak[pol][i].
theta, event, (
AnitaPol::AnitaPol_t) (1-pol), saturated[pol], cfg->combine_t0, cfg->combine_t1);
474 wfcomb_filtered.combine(summary->
peak[pol][i].phi, summary->
peak[pol][i].
theta, event, (
AnitaPol::AnitaPol_t) pol, saturated[pol], cfg->combine_t0, cfg->combine_t1);
476 wfcomb_xpol_filtered.combine(summary->
peak[pol][i].phi, summary->
peak[pol][i].
theta, event, (
AnitaPol::AnitaPol_t) (1-pol), saturated[pol], cfg->combine_t0, cfg->combine_t1);
484 fillWaveformInfo(wfcomb.getCoherent(), wfcomb_xpol.getCoherent(), wfcomb.getCoherentAvgSpectrum(), &summary->
coherent[pol][i], (
AnitaPol::AnitaPol_t) pol, rms, wfcomb.getMaxAntennaVpp());
486 fillWaveformInfo(wfcomb.getDeconvolved(), wfcomb_xpol.getDeconvolved(), wfcomb.getDeconvolvedAvgSpectrum(), &summary->
deconvolved[pol][i], (
AnitaPol::AnitaPol_t)pol, 0);
488 fillWaveformInfo(wfcomb_filtered.getCoherent(), wfcomb_xpol_filtered.getCoherent(), wfcomb_filtered.getCoherentAvgSpectrum(), &summary->
coherent_filtered[pol][i], (
AnitaPol::AnitaPol_t) pol, rms, wfcomb_filtered.getMaxAntennaVpp());
490 fillWaveformInfo(wfcomb_filtered.getDeconvolved(), wfcomb_xpol_filtered.getDeconvolved(), wfcomb_filtered.getDeconvolvedAvgSpectrum(), &summary->
deconvolved_filtered[pol][i], (
AnitaPol::AnitaPol_t)pol, 0);
496 coherent[pol][0][i]->~AnalysisWaveform();
497 coherent[pol][0][i] =
new (coherent[pol][0][i])
AnalysisWaveform(*wfcomb.getCoherent());
499 coherent[pol][1][i]->~AnalysisWaveform();
500 coherent[pol][1][i] =
new (coherent[pol][1][i])
AnalysisWaveform(*wfcomb_filtered.getCoherent());
502 coherent_power[pol][0][i]->~TGraphAligned();
503 coherent_power[pol][0][i] =
new (coherent_power[pol][0][i])
TGraphAligned(*wfcomb.getCoherentAvgSpectrum());
504 coherent_power[pol][0][i]->dBize();
506 coherent_power[pol][1][i]->~TGraphAligned();
507 coherent_power[pol][1][i] =
new (coherent_power[pol][1][i])
TGraphAligned(*wfcomb_filtered.getCoherentAvgSpectrum());
508 coherent_power[pol][1][i]->dBize();
511 if (wfcomb.getDeconvolved())
513 deconvolved[pol][0][i]->~AnalysisWaveform();
514 deconvolved[pol][0][i] =
new (deconvolved[pol][0][i])
AnalysisWaveform(*wfcomb.getDeconvolved());
515 deconvolved[pol][0][i]->
updateEven()->SetLineColor(2);
516 deconvolved[pol][0][i]->updateEven()->SetMarkerColor(2);
518 deconvolved[pol][1][i]->~AnalysisWaveform();
519 deconvolved[pol][1][i] =
new (deconvolved[pol][1][i])
AnalysisWaveform(*wfcomb_filtered.getDeconvolved());
520 deconvolved[pol][1][i]->
updateEven()->SetLineColor(2);
521 deconvolved[pol][1][i]->updateEven()->SetMarkerColor(2);
524 deconvolved_power[pol][0][i] =
new (deconvolved_power[pol][0][i])
TGraphAligned(*wfcomb.getDeconvolvedAvgSpectrum());
525 deconvolved_power[pol][0][i]->dBize();
526 deconvolved_power[pol][0][i]->SetLineColor(2);
528 deconvolved_power[pol][1][i]->~TGraphAligned();
529 deconvolved_power[pol][1][i] =
new (deconvolved_power[pol][1][i])
TGraphAligned(*wfcomb_filtered.getDeconvolvedAvgSpectrum());
530 deconvolved_power[pol][1][i]->dBize();
531 deconvolved_power[pol][1][i]->SetLineColor(2);
533 interactive_deconvolved =
true;
537 interactive_deconvolved =
false;
541 coherent_xpol[pol][0][i]->~AnalysisWaveform();
542 coherent_xpol[pol][0][i] =
new (coherent_xpol[pol][0][i])
AnalysisWaveform(*wfcomb_xpol.getCoherent());
543 coherent_xpol[pol][0][i]->
updateEven()->SetLineColor(11);
544 coherent_xpol[pol][0][i]->updateEven()->SetLineStyle(3);
546 coherent_xpol[pol][1][i]->~AnalysisWaveform();
547 coherent_xpol[pol][1][i] =
new (coherent_xpol[pol][1][i])
AnalysisWaveform(*wfcomb_xpol_filtered.getCoherent());
548 coherent_xpol[pol][1][i]->
updateEven()->SetLineColor(11);
549 coherent_xpol[pol][1][i]->updateEven()->SetLineStyle(3);
553 coherent_power_xpol[pol][0][i] =
new (coherent_power_xpol[pol][0][i])
TGraphAligned(*wfcomb_xpol.getCoherentAvgSpectrum());
554 coherent_power_xpol[pol][0][i]->dBize();
555 coherent_power_xpol[pol][0][i]->SetLineStyle(3);
556 coherent_power_xpol[pol][0][i]->SetLineColor(11);
558 coherent_power_xpol[pol][1][i]->~TGraphAligned();
559 coherent_power_xpol[pol][1][i] =
new (coherent_power_xpol[pol][1][i])
TGraphAligned(*wfcomb_xpol_filtered.getCoherentAvgSpectrum());
560 coherent_power_xpol[pol][1][i]->dBize();
561 coherent_power_xpol[pol][1][i]->SetLineStyle(3);
562 coherent_power_xpol[pol][1][i]->SetLineColor(11);
565 if (wfcomb_xpol.getDeconvolved())
567 deconvolved_xpol[pol][0][i]->~AnalysisWaveform();
568 deconvolved_xpol[pol][0][i] =
new (deconvolved_xpol[pol][0][i])
AnalysisWaveform(*wfcomb_xpol.getDeconvolved());
569 deconvolved_xpol[pol][0][i]->
updateEven()->SetLineColor(45);
570 deconvolved_xpol[pol][0][i]->updateEven()->SetMarkerColor(45);
571 deconvolved_xpol[pol][0][i]->updateEven()->SetLineStyle(3);
574 deconvolved_power_xpol[pol][0][i] =
new (deconvolved_power_xpol[pol][0][i])
TGraphAligned(*wfcomb_xpol.getDeconvolvedAvgSpectrum());
575 deconvolved_power_xpol[pol][0][i]->dBize();
576 deconvolved_power_xpol[pol][0][i]->SetLineStyle(3);
577 deconvolved_power_xpol[pol][0][i]->SetLineColor(46);
579 deconvolved_xpol[pol][1][i]->~AnalysisWaveform();
580 deconvolved_xpol[pol][1][i] =
new (deconvolved_xpol[pol][1][i])
AnalysisWaveform(*wfcomb_xpol_filtered.getDeconvolved());
581 deconvolved_xpol[pol][1][i]->
updateEven()->SetLineColor(45);
582 deconvolved_xpol[pol][1][i]->updateEven()->SetMarkerColor(45);
583 deconvolved_xpol[pol][1][i]->updateEven()->SetLineStyle(3);
586 deconvolved_power_xpol[pol][1][i] =
new (deconvolved_power_xpol[pol][1][i])
TGraphAligned(*wfcomb_xpol_filtered.getDeconvolvedAvgSpectrum());
587 deconvolved_power_xpol[pol][1][i]->dBize();
588 deconvolved_power_xpol[pol][1][i]->SetLineStyle(3);
589 deconvolved_power_xpol[pol][1][i]->SetLineColor(46);
593 interactive_xpol_deconvolved =
true;
597 interactive_xpol_deconvolved =
false;
603 if (correlation_maps[pol])
delete correlation_maps[pol];
608 fillFlags(event, summary, pat);
616 if(cfg->use_antenna_level_snr > 0)
618 wfcomb.setCheckVpp(cfg->use_antenna_level_snr);
619 wfcomb_xpol.setCheckVpp(cfg->use_antenna_level_snr);
624 wfcomb_xpol.combine(summary->
mc.phi, summary->
mc.theta, event,
AnitaPol::kVertical, 0, cfg->combine_t0, cfg->combine_t1);
635 fillWaveformInfo(wfcomb_xpol.getCoherent(), wfcomb.getCoherent(), wfcomb_xpol.getCoherentAvgSpectrum(), &(summary->
mc.wf[
AnitaPol::kVertical]),
AnitaPol::kVertical, vpol_rms, wfcomb_xpol.getMaxAntennaVpp());
639 if (interactive) last = *summary;
643 static bool outside(
const TH2 * h,
double x,
double y)
646 return x > h->GetXaxis()->GetXmax() ||
647 x < h->GetXaxis()->GetXmin() ||
648 y < h->GetYaxis()->GetXmin() ||
649 y > h->GetYaxis()->GetXmax();
654 UsefulAdu5Pat * pat,
double hwPeakAngle, UShort_t triggered_sectors, UShort_t masked_sectors, UShort_t triggered_sectors_xpol, UShort_t masked_sectors_xpol)
656 corr.computeZoomed(rough_phi, rough_theta, cfg->zoomed_nphi, cfg->zoomed_dphi, cfg->zoomed_ntheta, cfg->zoomed_dtheta, cfg->zoomed_nant, zoomed);
662 peakfinder::FineMaximum max;
663 switch (cfg->fine_peak_finding_option)
665 case AnalysisConfig::FinePeakFindingAbby:
666 UCorrelator::peakfinder::doInterpolationPeakFindingAbby(zoomed, &max);
669 UCorrelator::peakfinder::doInterpolationPeakFindingBicubic(zoomed, &max);
672 UCorrelator::peakfinder::doPeakFindingHistogram(zoomed, &max);
675 UCorrelator::peakfinder::doPeakFindingQuadratic16(zoomed, &max);
678 UCorrelator::peakfinder::doPeakFindingQuadratic25(zoomed, &max);
681 UCorrelator::peakfinder::doPeakFindingGaussian(zoomed, &max);
685 UCorrelator::peakfinder::doPeakFindingQuadratic9(zoomed, &max);
693 if (outside(zoomed, max.x, max.y))
701 max.copyToPointingHypothesis(point);
712 int sector = 2+fmod(point->phi + 11.25,360) / 22.5;
714 point->
masked = masked_sectors & ( 1 << sector);
715 point->
triggered = triggered_sectors & ( 1 << sector);
716 point->
masked_xpol = masked_sectors_xpol & ( 1 << sector);
719 if(cfg->trace_to_continent)
751 if (!wf || wf->
Neven() == 0)
753 if (wf && !wf->
Neven())
754 fprintf(stderr,
"wf passed to fillWaveformInfo has no points\n");
770 info->numAntennasInCoherent = cfg->combine_nantennas;
774 info->
peakTime = even->GetX()[peakHilbertBin];
776 double hilbertRange = info->peakHilbert - minHilbert;
778 if(cfg->compute_shape_parameters)
780 info->riseTime_10_90 = shape::getRiseTime((TGraph*) wf->
hilbertEnvelope(), minHilbert + 0.1*hilbertRange, minHilbert + 0.9*hilbertRange,peakHilbertBin);
781 info->riseTime_10_50 = shape::getRiseTime((TGraph*) wf->
hilbertEnvelope(), minHilbert + 0.1*hilbertRange, minHilbert + 0.5*hilbertRange,peakHilbertBin);
782 info->fallTime_90_10 = shape::getFallTime((TGraph*) wf->
hilbertEnvelope(), minHilbert + 0.1*hilbertRange, minHilbert + 0.9*hilbertRange,peakHilbertBin);
783 info->fallTime_50_10 = shape::getFallTime((TGraph*) wf->
hilbertEnvelope(), minHilbert + 0.1*hilbertRange, minHilbert + 0.5*hilbertRange,peakHilbertBin);
786 info->width_50_50 = shape::getWidth((TGraph*) wf->
hilbertEnvelope(), minHilbert + 0.5*hilbertRange, &ifirst, &ilast,peakHilbertBin);
788 even->getMoments(
sizeof(info->peakMoments)/
sizeof(
double), info->
peakTime, info->peakMoments);
789 info->width_10_10 = shape::getWidth((TGraph*) wf->
hilbertEnvelope(), minHilbert + 0.1*hilbertRange, &ifirst, &ilast,peakHilbertBin);
790 info->power_10_10 = even->getSumV2(ifirst, ilast);
792 if(!cfg->compute_shape_parameters)
794 info->riseTime_10_90 = 0;
795 info->riseTime_10_50 = 0;
796 info->fallTime_90_10 = 0;
797 info->fallTime_50_10 = 0;
799 info->width_50_50 = 0;
801 info->width_10_10 = 0;
802 info->power_10_10 = 0;
806 info->I = stokes.getAvgI();
807 info->Q = stokes.getAvgQ();
808 info->U = stokes.getAvgU();
809 info->V = stokes.getAvgV();
810 info->
NPointsMaxStokes = stokes.computeWindowedAverage(cfg->stokes_fracI, &info->
max_dI, &info->max_dQ, &info->max_dU, &info->max_dV, &info->polErr);
814 info->bandwidthMeasure = bandwidth::lowness(wf);
819 int half_width = TMath::BinarySearch(distance_cdf.GetN(), distance_cdf.GetY(), 0.1 * (iw+1));
820 info->fracPowerWindowBegins[iw] = peakHilbertBin < half_width ? wf->
even()->GetX()[0] : wf->
even()->GetX()[peakHilbertBin - half_width];
821 info->fracPowerWindowEnds[iw] = peakHilbertBin + half_width >= distance_cdf.GetN() ? wf->
even()->GetX()[distance_cdf.GetN()-1] : wf->
even()->GetX()[half_width + peakHilbertBin];
827 double t0 = even->GetX()[0];
829 int i0 = TMath::Max(0.,floor((cfg->noise_estimate_t0 - t0)/dt));
830 int i1 = TMath::Min(even->GetN()-1.,ceil((cfg->noise_estimate_t1 - t0)/dt));
833 if (n < 0 || n > even->GetN()) n = even->GetN();
834 rms = TMath::RMS(n, even->GetY() + i0);
837 info->snr = info->peakHilbert / rms;
838 if(vpp > 0 && cfg->use_antenna_level_snr) info->snr = vpp/(2*rms);
840 if(cfg->use_coherent_spectra) pwr = wf->
powerdB();
844 if (!cfg->use_coherent_spectra) power.dBize();
848 power_filter->filterGraph(&power);
851 spectrum::fillSpectrumParameters(&power, avg_spectra[pol], info, cfg);
860 #ifdef UCORRELATOR_OPENMP 861 #pragma omp parallel for 863 for (
int ant=0; ant<NUM_SEAVEYS; ant++)
870 summary->
channels[polInd][ant].rms = rms;
871 summary->
channels[polInd][ant].avgPower = gr->getSumV2() / gr->GetN();
872 summary->
channels[polInd][ant].peakHilbert = hilbertEnvelope->peakVal();
885 delete correlation_maps[0];
886 delete correlation_maps[1];
889 for (
int pol = 0; pol < 2; pol++)
891 for (
int i = 0; i < cfg->nmaxima; i++)
893 delete zoomed_correlation_maps[pol][i];
895 for (
int ifilt = 0; ifilt < 2; ifilt++)
898 delete coherent[pol][ifilt][i];
899 delete deconvolved[pol][ifilt][i];
901 delete coherent_xpol[pol][ifilt][i];
902 delete deconvolved_xpol[pol][ifilt][i];
904 delete coherent_power[pol][ifilt][i];
905 delete deconvolved_power[pol][ifilt][i];
907 delete coherent_power_xpol[pol][ifilt][i];
908 delete deconvolved_power_xpol[pol][ifilt][i];
914 clearInteractiveMemory(1);
921 void UCorrelator::Analyzer::clearInteractiveMemory(
double frac)
const 924 for (
unsigned i = (1-frac) * delete_list.size(); i < delete_list.size(); i++)
926 delete delete_list[i];
946 TPad * pads[2] = {ch,cv};
948 clearInteractiveMemory();
951 for (
int ipol = cfg->start_pol; ipol <= cfg->end_pol; ipol++)
955 pads[ipol] =
new TCanvas(ipol == 0 ?
"analyzer_ch" :
"analyzer_cv", ipol == 0 ?
"hpol" :
"vpol",1920,500);
959 pads[ipol]->Divide(2,1);
961 pads[ipol]->cd(1)->Divide(1,2);
963 pads[ipol]->cd(1)->cd(1);
964 correlation_maps[ipol]->SetTitle(ipol == 0 ?
"HPol map" :
"VPol map" );
965 correlation_maps[ipol]->addRough(rough_peaks[ipol]);
966 correlation_maps[ipol]->Draw(
"colz");
968 for (
int i = 0; i < last.nPeaks[ipol]; i++)
970 pads[ipol]->cd(1)->cd(2);
972 delete_list.push_back(pt);
977 pads[ipol]->cd(2)->Divide(last.nPeaks[ipol], interactive_deconvolved ? 5 : 3);
979 for (
int i = 0; i < last.nPeaks[ipol]; i++)
981 pads[ipol]->cd(2)->cd(i+1);
983 zoomed_correlation_maps[ipol][i]->SetTitle(TString::Format(
"Zoomed peak %d", i+1));
984 zoomed_correlation_maps[ipol][i]->addFine(last.peak[ipol][i]);
985 zoomed_correlation_maps[ipol][i]->Draw(
"colz");
987 pads[ipol]->cd(2)->cd(i+last.nPeaks[ipol]+1);
989 ((TGraph*) coherent[ipol][draw_filtered][i]->even())->SetTitle(TString::Format (
"Coherent (+ xpol) %d", i+1));
990 coherent[ipol][draw_filtered][i]->drawEven(
"al");
993 coherent_xpol[ipol][draw_filtered][i]->drawEven(
"lsame");
996 pads[ipol]->cd(2)->cd(i+2*last.nPeaks[ipol]+1);
999 if (cfg->use_coherent_spectra)
1001 ((TGraph*) coherent[ipol][draw_filtered][i]->powerdB())->SetTitle(TString::Format (
"Power Coherent (+ xpol) %d", i+1));
1002 ((TGraph*) coherent[ipol][draw_filtered][i]->powerdB())->GetXaxis()->SetRangeUser(0,1.3);
1003 coherent[ipol][draw_filtered][i]->drawPowerdB(
"al");
1004 ((TGraph*)coherent_xpol[ipol][draw_filtered][i]->powerdB())->SetLineColor(15);
1005 ((TGraph*)coherent_xpol[ipol][draw_filtered][i]->powerdB())->SetName(
"powerdBXpol");
1006 coherent_xpol[ipol][draw_filtered][i]->drawPowerdB(
"lsame");
1010 (((TGraph*)coherent_power[ipol][draw_filtered][i]))->SetTitle(TString::Format (
"Power Coherent (+ xpol) %d", i+1));
1011 ((TGraph*)coherent_power[ipol][draw_filtered][i])->Draw(
"al");
1012 ((TGraph*)coherent_power[ipol][draw_filtered][i])->GetXaxis()->SetRangeUser(0,1.3);
1013 coherent_power_xpol[ipol][draw_filtered][i]->Draw(
"lsame");
1014 ((TGraph*)avg_spectra[ipol])->SetLineColor(2);
1015 ((TGraph*)avg_spectra[ipol])->Draw(
"lsame");
1044 if (interactive_deconvolved)
1046 pads[ipol]->cd(2)->cd(i+3*last.nPeaks[ipol]+1);
1047 ((TGraph*) deconvolved[ipol][draw_filtered][i]->even())->SetTitle(TString::Format (
"Deconvolved (+ xpol) %d", i+1));
1048 deconvolved[ipol][draw_filtered][i]->drawEven(
"alp");
1049 if (interactive_xpol_deconvolved)
1051 deconvolved_xpol[ipol][draw_filtered][i]->drawEven(
"lsame");
1054 pads[ipol]->cd(2)->cd(i+4*last.nPeaks[ipol]+1);
1056 if (cfg->use_coherent_spectra)
1059 ((TGraph*) deconvolved[ipol][draw_filtered][i]->powerdB())->SetTitle(TString::Format (
"Power Deconvolved (+ xpol) %d", i+1));
1060 ((TGraph*) deconvolved[ipol][draw_filtered][i]->powerdB())->GetXaxis()->SetRangeUser(0,1.3);
1061 (deconvolved[ipol][draw_filtered][i])->drawPowerdB();;
1062 if (interactive_xpol_deconvolved)
1064 ((TGraph*) deconvolved_xpol[ipol][draw_filtered][i]->powerdB())->SetLineColor(15);
1065 ((TGraph*) deconvolved_xpol[ipol][draw_filtered][i]->powerdB())->SetName(
"powerdBXpol");
1066 (deconvolved_xpol[ipol][draw_filtered][i])->drawPowerdB(
"lsame");
1072 (((TGraph*)deconvolved_power[ipol][draw_filtered][i]))->SetTitle(TString::Format (
"Power Deconvolved (+ xpol) %d", i+1));
1073 ((TGraph*)deconvolved_power[ipol][draw_filtered][i])->Draw();;
1074 if (interactive_xpol_deconvolved)
1076 ((TGraph*)deconvolved_power_xpol[ipol][draw_filtered][i])->Draw(
"lsame");
1090 flags->nadirFlag =
true;
1092 if (cfg->fill_blast_fraction)
1095 flags->
meanPower[0] = fae->getAveragePower();
1096 flags->medianPower[0] = fae->getMedianPower();
1109 flags->nSectorsWhereBottomExceedsTop = 0;
1112 int n_above_this_pol;
1114 flags->nSectorsWhereBottomExceedsTop += n_above_this_pol;
1120 flags->pulser = AnitaEventSummary::EventFlags::LDB;
1124 flags->pulser = AnitaEventSummary::EventFlags::WAIS;
1127 flags->pulser = AnitaEventSummary::EventFlags::WAIS_V;
1131 flags->pulser = AnitaEventSummary::EventFlags::NONE;
1135 flags->strongCWFlag = flags->medianPowerFiltered[0] / flags->medianPower[0] < 0.2;
1137 if(AnitaVersion::get() == 4){
1140 flags->isPayloadBlast =
1142 flags->maxBottomToTopRatio[0] <0.9 || flags->maxBottomToTopRatio[0] >2.6 ||
1143 flags->maxBottomToTopRatio[1] <0.9 || flags->maxBottomToTopRatio[1] >2.6 ||
1146 flags->isPayloadBlast =
1147 (cfg->max_mean_power_filtered && flags->meanPowerFiltered[0] > cfg->max_mean_power_filtered) ||
1148 (cfg->max_median_power_filtered && flags->medianPowerFiltered[0] > cfg->max_median_power_filtered) ||
1149 (cfg->max_bottom_to_top_ratio && flags->maxBottomToTopRatio[0] > cfg->max_bottom_to_top_ratio) ||
1150 (cfg->max_bottom_to_top_ratio && flags->maxBottomToTopRatio[1] > cfg->max_bottom_to_top_ratio);
1153 flags->isVarner =
false;
1154 flags->isVarner2 =
false;
1156 flags->isGood = !flags->isVarner && !flags->isVarner2 && !flags->strongCWFlag;
1160 if(AnitaVersion::get() == 4)
1163 flags->isStepFunction |= (fae->checkSurfForGlitch(0 , 1, 500)<<1);
1164 flags->isStepFunction |= (fae->checkSurfForGlitch(0 , 2, 500)<<2);
1165 flags->isStepFunction |= (fae->checkSurfForGlitch(11, 2, 500)<<2);
1166 flags->isStepFunction |= (fae->checkSurfForGlitch(8, 2, 500)<<2);
1167 flags->isStepFunction |= (fae->checkSurfForGlitch(6, 3, 500)<<3);
1169 if(fae->checkSaturation( 0, 0, cfg->saturation_threshold) > 0)
1171 flags->isStepFunction |= (1<<4);
1175 else flags->isStepFunction = 0;
1178 const double bandsLowGHz[AnitaEventSummary::numBlastPowerBands] = {0.15-1e-10, 1.1-1e-10, 0};
1179 const double bandsHighGHz[AnitaEventSummary::numBlastPowerBands] = {0.26-1e-10, 999, 999};
1182 for(
int band = 0; band < AnitaEventSummary::numBlastPowerBands; band++)
1184 flags->middleOrBottomPower[band] = 0;
1185 flags->middleOrBottomAnt[band] = -1;
1186 flags->middleOrBottomPol[band] = 2;
1187 flags->topPower[band] = 0;
1193 for(UInt_t phi = 0; phi < NUM_PHI; phi++)
1197 Int_t ant = ring*NUM_PHI + phi;
1201 const double df_GHz = grPow->GetX()[1] - grPow->GetX()[0];
1203 Double_t powThisAnt[AnitaEventSummary::numBlastPowerBands] = {0};
1204 for(
int i = 0; i < grPow->GetN(); i++)
1206 const double f_GHz = grPow->GetX()[i];
1207 for(
int band = 0; band < AnitaEventSummary::numBlastPowerBands; band++)
1209 if(f_GHz >= bandsLowGHz[band] && f_GHz < bandsHighGHz[band])
1211 powThisAnt[band] += grPow->GetY()[i]*df_GHz;
1216 for(
int band = 0; band < AnitaEventSummary::numBlastPowerBands; band++)
1218 if(powThisAnt[band] > flags->middleOrBottomPower[band])
1220 flags->middleOrBottomPower[band] = powThisAnt[band];
1221 flags->middleOrBottomAnt[band] = ant;
1222 flags->middleOrBottomPol[band] = polInd;
1229 for(
int band = 0; band < AnitaEventSummary::numBlastPowerBands; band++)
1231 int ant = flags->middleOrBottomAnt[band] % NUM_PHI;
1235 const double df_GHz = grPow->GetX()[1] - grPow->GetX()[0];
1237 for(
int i = 0; i < grPow->GetN(); i++)
1239 const double f_GHz = grPow->GetX()[i];
1240 for(
int band = 0; band < AnitaEventSummary::numBlastPowerBands; band++)
1242 if(f_GHz >= bandsLowGHz[band] && f_GHz < bandsHighGHz[band])
1244 flags->topPower[band] += grPow->GetY()[i]*df_GHz;
1253 wfcomb_filtered.setExtraFilters(extra);
1254 wfcomb_xpol_filtered.setExtraFilters(extra);
1259 wfcomb_filtered.setExtraFiltersDeconvolved(extra);
1260 wfcomb_xpol_filtered.setExtraFiltersDeconvolved(extra);
void update(const Adu5Pat *pat)
bool isLDB(const RawAnitaHeader *hdr, const AnalysisConfig *cfg=0)
WaveformInfo deconvolved[AnitaPol::kNotAPol][maxDirectionsPerPol]
Summaries of the (unfiltered) coherently summed waveforms, array index correponds to entry in peak[][...
Bool_t masked_xpol
was this in a masked phi sector?
void analyze(const FilteredAnitaEvent *event, AnitaEventSummary *summary, const TruthAnitaEvent *truth=0)
Bicubic interpolation (not implemented yet)
const UsefulAnitaEvent * getUsefulAnitaEvent() const
PointingHypothesis peak[AnitaPol::kNotAPol][maxDirectionsPerPol]
Number of peaks stored in this AnitaEventSummary (might be less than maxDirectionsPerPol) ...
bool isWAISVPol(const UsefulAdu5Pat *pat, const RawAnitaHeader *hdr, const AnalysisConfig *cfg=0)
Int_t countChannelAboveThreshold(int threshold=100) const
bool isWAISHPol(const UsefulAdu5Pat *pat, const RawAnitaHeader *hdr, const AnalysisConfig *cfg=0)
Analyzer(const AnalysisConfig *cfg=0, bool interactive=false)
Double_t dphi_rough
angular separation from higher value peak in same event. 1000 if highest value event (i...
Double_t phi_separation
If an event barely missed the ground, it is useful to see the coordinates at which it would hit if th...
double correlation_gain_correction
exponent for baseline weighting of correlation maps (since longer baselines give you better resolutio...
Double_t hwAngle
value of average of the peak location over the past 60 min-bias events
MCTruth mc
Contains location of LDB cal pulser in map coordinates at time of event.
Double_t meanPower[1+AnitaRing::kNotARing]
void setExtraFiltersDeconvolved(FilterStrategy *extra)
static const Int_t numFracPowerWindows
The maximum number of frequency peaks per waveform spectrum.
WaveformInfo coherent_filtered[AnitaPol::kNotAPol][maxDirectionsPerPol]
Summaries of the (unfiltered) de-dispersed coherently summed waveforms, array index correponds to ent...
A filter strategy defines the sets of filters that are used and provides some introspection abilities...
void doPeakFindingHistogram(const TH2D *hist, FineMaximum *peak)
Abby's interpolation method.
Bool_t triggered
theta - theta rough
void getThetaAndPhiWave(Double_t sourceLon, Double_t sourceLat, Double_t sourceAlt, Double_t &thetaWave, Double_t &phiWave)
const UsefulAdu5Pat * getGPS() const
EventFlags flags
Summaries of each channel's waveform.
Bool_t masked
was this in a triggered xpol phi sector?
int zoomed_ntheta
number of phi bins in zoomed correlation map
int zoomed_nphi
enable group delay in interferometer
enum AnitaRing::EAnitaRing AnitaRing_t
Ring enumeration.
quadratic fit near peak, using 16 bins
void setGroupDelayFlag(bool flag)
Double_t antennaPeakAverage
was this in a masked phi xpol sector?
Double_t mapRMS
snr of peak
const AnalysisWaveform * getRawGraph(UInt_t i) const
Double_t theta_adjustment_needed
chisq/ndof of peak finding process, if available (otherwise zero)
quadratic fit near peak, using 9 bins
void getSunPosition(Double_t &phiDeg, Double_t &thetaDeg) const
Uses realTime, latitude, longitude to calculate the sun's position.
Bivariate gaussian fit (slow)
TruthAnitaEvent – The Truth ANITA Event.
quadratic fit near peak, using 25 bins
As UsefulAnitaEvent is to RawAnitaEvent, UsefulAdu5Pat is to Adu5Pat. Well not quite as useful but yo...
PayloadLocation anitaLocation
Contains summary information about MC truth, if real data then this filled with constant, unphysical values.
Double_t longitude
on continent, or -9999 if doesn't intersect
Double_t theta
peak phi, degrees
ChannelInfo channels[AnitaPol::kNotAPol][NUM_SEAVEYS]
Summaries of the filtered, de-dispersed, coherently summed waveforms, array index correponds to entry...
Double_t dtheta_rough
phi - phi rough
bool enable_group_delay
Highest elevation considered, measured as positive above horizon. (negative would be below horizon) ...
Double_t getDistanceFromSource(Double_t sourceLat, Double_t sourceLong, Double_t sourceAlt) const
Gets time of flight from any source.
Int_t fRFSpike
Flag raised if the ADC value is too large or small in RF.
void setExtraFilters(FilterStrategy *extra)
Double_t value
peak theta, degrees
Common analysis format between UCorrelator and Acclaim.
int traceBackToContinent3(Double_t phiWave, Double_t thetaWave, Double_t *lon, Double_t *lat, Double_t *alt, Double_t *theta_adjustment_required) const
void setMaxAntennaMaxPhiDistance(double max_ant_phi)
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.
SourceHypothesis sun
Flags corresponding the event quality, trigger type, calibration pulser timing, etc.
Int_t nPeaks[AnitaPol::kNotAPol]
Time of the event.
WaveformInfo coherent[AnitaPol::kNotAPol][maxDirectionsPerPol]
Summaries of the event peak directions (indices of all WaveformInfo member arrays match peak index) ...
Bool_t triggered_xpol
was this in a triggered phi sector?
Double_t latitude
angle with respect to triggering phi sector in opposite polarisation
void drawSummary(TPad *chpol=0, TPad *cvpol=0, int draw_filtered=0) const
Double_t distanceToSource
on continent, or -9999 if doesn't intersect
static double getRMS(double t, int ipol, int ant, int nsecs=10)
WaveformInfo deconvolved_filtered[AnitaPol::kNotAPol][maxDirectionsPerPol]
Summaries of the filtered, coherently summed waveforms, array index correponds to entry in peak[][]...
const RawAnitaHeader * getHeader() const
Double_t altitude
on continent, or -9999 if doesn't intersect