1 #include "TimeDependentAverage.h" 2 #include "AnitaVersion.h" 4 #include "UCImageTools.h" 6 #include "AnalysisWaveform.h" 7 #include "FilterStrategy.h" 9 #include "RawAnitaHeader.h" 10 #include "AnitaDataset.h" 12 #include "FilteredAnitaEvent.h" 14 #include "BasicFilters.h" 20 #define DEBUG_SPEC_AVG 23 UCorrelator::TimeDependentAverage::~TimeDependentAverage()
26 for (
int i = 0; i < NUM_SEAVEYS; i++)
28 for (
int j = 0; j < 2; j++)
31 delete avgs_minbias[i][j];
33 if (peakiness[i][j])
delete peakiness[i][j];
34 if (peakiness_minbias[i][j])
delete peakiness_minbias[i][j];
44 int UCorrelator::TimeDependentAverage::computeAverage(
double max_r,
int min_norm,
double max_power)
54 double startTime = d.header()->triggerTime;
56 double endTime = d.header()->triggerTime+1;
58 int nbins = (endTime-startTime) / nsecs;
62 name.Form(
"nblasts%d_%d",run,nsecs);
63 title.Form(
"N Blast Candidates run %d, nsec=%d", run,nsecs);
64 nblasts =
new TH1I(name, title, nbins, startTime,endTime) ;
65 nblasts->SetDirectory(0);
66 nblasts->GetYaxis()->SetTitle(
"NBlasts");
67 nblasts->GetXaxis()->SetTitle(
"Time");
68 nblasts->GetXaxis()->SetTimeDisplay(
true);
69 nblasts->GetXaxis()->SetTimeOffset(0);
71 name.Form(
"norm_%d_%d",run,nsecs);
72 title.Form(
"RF Normalization run %d, nsec=%d", run,nsecs);
74 norms =
new TH1I(name, title,nbins,startTime,endTime);
75 norms->SetDirectory(0);
76 norms->GetYaxis()->SetTitle(
"NEvents");
77 norms->GetXaxis()->SetTitle(
"Time");
78 norms->GetXaxis()->SetTimeDisplay(
true);
79 norms->GetXaxis()->SetTimeOffset(0);
81 name.Form(
"norm_minbias_%d_%d",run,nsecs);
82 title.Form(
"MinBias Normalization run %d, nsec=%d", run,nsecs);
84 norms_minbias =
new TH1I(name, title,nbins,startTime,endTime);
85 norms_minbias->SetDirectory(0);
86 norms_minbias->GetYaxis()->SetTitle(
"NEvents");
87 norms_minbias->GetXaxis()->SetTitle(
"Time");
88 norms_minbias->GetXaxis()->SetTimeDisplay(
true);
89 norms_minbias->GetXaxis()->SetTimeOffset(0);
94 for (
int ant = 0; ant < NUM_SEAVEYS; ant++)
96 for (
int pol = 0; pol < 2; pol++)
99 name.Form(
"specavg_%d_%d_%d_%d",run,nsecs,ant,pol);
100 title.Form(
"RF Spectrum Average ant=%d, pol=%d, run %d, nsec=%d", ant,pol,run,nsecs);
103 avgs[ant][pol] =
new TH2F(name, title,
105 nbins, startTime,endTime) ;
106 avgs[ant][pol]->SetDirectory(0);
107 avgs[ant][pol]->GetYaxis()->SetTitle(
"Time");
108 avgs[ant][pol]->GetYaxis()->SetTimeDisplay(
true);
109 avgs[ant][pol]->GetYaxis()->SetTimeOffset(0);
110 avgs[ant][pol]->GetXaxis()->SetTitle(
"Frequency");
113 name.Form(
"specavg_minbias_%d_%d_%d_%d",run,nsecs,ant,pol);
114 title.Form(
"MinBias Spectrum Average ant=%d, pol=%d, run %d, nsec=%d", ant,pol,run,nsecs);
116 avgs_minbias[ant][pol] =
new TH2F(name, title,
118 nbins, startTime,endTime) ;
119 avgs_minbias[ant][pol]->SetDirectory(0);
120 avgs_minbias[ant][pol]->GetYaxis()->SetTitle(
"Time");
121 avgs_minbias[ant][pol]->GetYaxis()->SetTimeDisplay(
true);
122 avgs_minbias[ant][pol]->GetYaxis()->SetTimeOffset(0);
123 avgs_minbias[ant][pol]->GetXaxis()->SetTitle(
"Frequency");
125 name.Form(
"rms_%d_%d_%d_%d",run,nsecs,ant,pol);
126 title.Form(
"MinBias RMS ant=%d, pol=%d, run %d, nsec=%d", ant,pol,run,nsecs);
127 rms[ant][pol] =
new TH1D(name, title, nbins, startTime,endTime) ;
128 rms[ant][pol]->SetDirectory(0);
129 rms[ant][pol]->GetYaxis()->SetTitle(
"RMS (mVish)");
130 rms[ant][pol]->GetXaxis()->SetTitle(
"Time");
131 rms[ant][pol]->GetXaxis()->SetTimeDisplay(
true);
132 rms[ant][pol]->GetXaxis()->SetTimeOffset(0);
150 for (
int i = 0; i < N; i++)
158 double max_ratio_hpol, max_ratio_vpol;
172 bool isRF = d.header()->trigType & 1;
174 (isRF ? norms : norms_minbias)->Fill(t);
175 int tbin = norms->FindFixBin(t);
177 #ifdef UCORRELATOR_OPENMP 178 #pragma omp parallel for 180 for (
int j = 0; j < NUM_SEAVEYS * 2; j++)
189 rms[ant][pol]->SetBinContent(tbin, rms[ant][pol]->GetBinContent(tbin) + wf->
even()->GetRMS(2));
193 for (
int k = 0; k<avgs[ant][pol]->GetNbinsX() ; k++)
195 TH2F * h = isRF ? avgs[ant][pol] : avgs_minbias[ant][pol];
196 h->SetBinContent(k,tbin,h->GetBinContent(k,tbin) + g->GetY()[k]);
202 printf(
"\r%d/%d",i,N);
213 for (
int isRF = 0; isRF <=1; isRF++)
215 for (
int j = 0; j < NUM_SEAVEYS * 2; j++)
220 TH2F * h = isRF ? avgs[ant][pol] : avgs_minbias[ant][pol];
221 TH1I * hnorm = isRF ? norms : norms_minbias;
224 for (
int ybin = 1; ybin <= h->GetNbinsY(); ybin++)
226 if (hnorm->GetBinContent(ybin) < min_norm)
231 for (
int k = 0; k<h->GetNbinsX() ; k++)
233 h->SetBinContent(k,ybin, h->GetBinContent(k,ybin) / hnorm->GetBinContent(ybin));
238 rms[ant][pol]->SetBinContent(ybin, rms[ant][pol]->GetBinContent(ybin) / hnorm->GetBinContent(ybin));
244 for (
int ybin = 1; ybin <= h->GetNbinsY(); ybin++)
247 if (hnorm->GetBinContent(ybin) < min_norm)
249 int last_bin = ybin-1;
250 while(hnorm->GetBinContent(last_bin) < min_norm && last_bin > 0) last_bin--;
252 int next_bin = ybin+1;
253 while (!hnorm->GetBinContent(next_bin) && next_bin <= h->GetNbinsY()) next_bin++;
256 if (last_bin == 0 && next_bin > h->GetNbinsY())
break;
260 for (
int k = 0; k<h->GetNbinsX() ; k++)
262 h->SetBinContent(k,ybin, h->GetBinContent(k,next_bin));
263 if (!isRF) rms[ant][pol]->SetBinContent(ybin, rms[ant][pol]->GetBinContent(next_bin));
266 else if (next_bin > h->GetNbinsY())
268 for (
int k = 0; k<h->GetNbinsX() ; k++)
270 h->SetBinContent(k,ybin, h->GetBinContent(k,last_bin));
271 if (!isRF) rms[ant][pol]->SetBinContent(ybin, rms[ant][pol]->GetBinContent(last_bin));
276 double last_frac = double(ybin - last_bin) / (next_bin-last_bin);
278 for (
int k = 0; k<h->GetNbinsX() ; k++)
280 h->SetBinContent(k,ybin, last_frac * h->GetBinContent(k,last_bin) + (1-last_frac) * h->GetBinContent(k,next_bin));
281 if (!isRF) rms[ant][pol]->SetBinContent(ybin, last_frac * rms[ant][pol]->GetBinContent(last_bin) + (1-last_frac) * rms[ant][pol]->GetBinContent(next_bin));
298 gSystem->mkdir(dir,
true);
301 fstr.Form(
"%s/%d_%d.root", dir, run,nsecs);
302 TFile f(fstr.Data(),
"RECREATE");
312 for (
int ant = 0; ant < NUM_SEAVEYS; ant++)
314 avgs[ant][0]->Write(TString::Format(
"h%d",ant));
315 avgs[ant][1]->Write(TString::Format(
"v%d",ant));
320 f.mkdir(
"specavg_minbias");
321 f.cd(
"specavg_minbias");
322 for (
int ant = 0; ant < NUM_SEAVEYS; ant++)
324 avgs_minbias[ant][0]->Write(TString::Format(
"h%d",ant));
325 avgs_minbias[ant][1]->Write(TString::Format(
"v%d",ant));
331 for (
int ant = 0; ant < NUM_SEAVEYS; ant++)
333 rms[ant][0]->Write(TString::Format(
"h%d",ant));
334 rms[ant][1]->Write(TString::Format(
"v%d",ant));
338 nblasts->Write(
"nblasts");
339 norms->Write(
"norms");
340 norms_minbias->Write(
"norms_minbias");
345 const TH2F * UCorrelator::TimeDependentAverage::getSpectrogram(
AnitaPol::AnitaPol_t pol,
int ant,
bool minbias)
const 349 __sync_synchronize();
358 for (
int ant = 0; ant < NUM_SEAVEYS; ant++)
360 TH2F * found_hpol = (TH2F*) gDirectory->Get(TString::Format(
"h%d",ant));
361 avgs[ant][0] =
new TH2F(*found_hpol);
362 avgs[ant][0]->SetDirectory(0);
364 TH2F * found_vpol = (TH2F*) gDirectory->Get(TString::Format(
"v%d",ant));
365 avgs[ant][1] =
new TH2F(*found_vpol);
366 avgs[ant][1]->SetDirectory(0);
369 f.cd(
"specavg_minbias");
371 for (
int ant = 0; ant < NUM_SEAVEYS; ant++)
374 TH2F * found_hpol = (TH2F*) gDirectory->Get(TString::Format(
"h%d",ant));
375 avgs_minbias[ant][0] =
new TH2F(*found_hpol);
376 avgs_minbias[ant][0]->SetDirectory(0);
378 TH2F * found_vpol = (TH2F*) gDirectory->Get(TString::Format(
"v%d",ant));
379 avgs_minbias[ant][1] =
new TH2F(*found_vpol);
380 avgs_minbias[ant][1]->SetDirectory(0);
382 __sync_synchronize();
389 return minbias ? avgs_minbias[ant][pol] : avgs[ant][pol];
395 __sync_synchronize();
405 for (
int ant = 0; ant < NUM_SEAVEYS; ant++)
408 TH1D * found_hpol = (TH1D*) gDirectory->Get(TString::Format(
"h%d",ant));
409 rms[ant][0] =
new TH1D(*found_hpol);
410 rms[ant][0]->SetDirectory(0);
412 TH1D * found_vpol = (TH1D*) gDirectory->Get(TString::Format(
"v%d",ant));
413 rms[ant][1] =
new TH1D(*found_vpol);
414 rms[ant][1]->SetDirectory(0);
416 __sync_synchronize();
422 return rms[ant][pol];
427 double max_bottom_top_ratio,
int min_norm,
double max_power)
428 : nsecs(nsecs) , run(run)
430 bool foundit =
false;
432 peakiness_loaded =
false;
435 const char * check_dir = persistdir ?: getenv(
"UCORRELATOR_TIMEAVG_DIR") ?: getenv(
"UCORRELATOR_SPECAVG_DIR") ?: 0;
440 fname.Form(
"%s/%d_%d.root", check_dir, run,nsecs);
446 if (gDirectory->Get(
"norms") && gDirectory->Get(
"norms_minbias") && gDirectory->Get(
"nblasts"))
448 TH1I * found= (TH1I*) gDirectory->Get(
"norms");
449 norms =
new TH1I(*found);
450 norms->SetDirectory(0);
452 found= (TH1I*) gDirectory->Get(
"norms_minbias");
453 norms_minbias =
new TH1I(*found);
454 norms_minbias->SetDirectory(0);
456 found= (TH1I*) gDirectory->Get(
"nblasts");
457 nblasts =
new TH1I(*found);
458 nblasts->SetDirectory(0);
464 fprintf(stderr,
"Could not find one or more of norms, norms_minbias or nblasts inside %s/%d_%d.root. Are your spectrum averages out of date? ", check_dir,run,nsecs);
470 printf(
"Could not open %s/%d_%d.root", check_dir, run, nsecs);
472 memset(rms,0,
sizeof(rms));
474 memset(avgs,0,
sizeof(avgs));
475 memset(avgs_minbias,0,
sizeof(avgs_minbias));
480 printf(
"Didn't find spectrum_averages... creating!\n");
483 printf(
"Define UCORRELATOR_TIMEAVG_DIR to persist somewhere.\n");
485 computeAverage( max_bottom_top_ratio, min_norm, max_power);
489 memset(peakiness,0,
sizeof(peakiness));
490 memset(peakiness_minbias,0,
sizeof(peakiness_minbias));
495 TH1* UCorrelator::TimeDependentAverage::getSpectrumAverage(
AnitaPol::AnitaPol_t pol,
int ant,
double t,
bool db,
bool minbias)
const 498 const TH2 * h =getSpectrogram(pol,ant,minbias);
500 int bin = h->GetYaxis()->FindFixBin(t);
502 if (bin == 0 || bin == h->GetNbinsY()+1)
return 0 ;
507 name.Form(
"specavg_%d_%d_%g",ant,pol,t);
508 TH1D * answer =
new TH1D(name,title, 131,0,1.31);
510 for (
int i = 1; i <= answer->GetNbinsX(); i++)
512 answer->SetBinContent(i, h->GetBinContent(i,bin));
515 answer->GetXaxis()->SetTitle(
"Frequency");
516 answer->GetYaxis()->SetTitle(db ?
"Power (dBish)" :
"Power (linear)");
521 for (
int i = 1; i <= answer->GetNbinsX(); i++)
523 answer->SetBinContent(i, 10 * TMath::Log10(answer->GetBinContent(i)));
533 TH1 *UCorrelator::TimeDependentAverage::getSpectrumPercentile(
AnitaPol::AnitaPol_t pol,
int ant,
double pct ,
bool db,
bool minbias )
const 536 TH1 * answer = UCorrelator::image::getPctileProjection( getSpectrogram(pol,ant,minbias), 1, pct,
true, getNorms(minbias));
538 answer->GetXaxis()->SetTitle(
"Frequency");
539 answer->GetYaxis()->SetTitle(db ?
"Pctile Power (dBish)" :
"Pctile Power (linear)");
541 answer->SetTitle(TString::Format(
"Ant%d %c-Pol %gth Pctile", ant, pol ==
AnitaPol::kHorizontal ?
'H' :
'V', pct*100));
545 for (
int i = 1; i <= answer->GetNbinsX(); i++)
547 answer->SetBinContent(i, 10 * TMath::Log10(answer->GetBinContent(i)));
557 double UCorrelator::TimeDependentAverage::getStartTime()
const 560 return norms ? norms->GetXaxis()->GetXmin() : -1;
563 double UCorrelator::TimeDependentAverage::getEndTime()
const 565 return norms ? norms->GetXaxis()->GetXmax() : -1;
575 if (AnitaVersion::get() == 4)
577 fprintf(stderr,
"warning: using default terminated thermal spectrum for A3 for peakiness\n");
581 dir.Form(
"%s/share/UCorrelator/terminated_noise/", getenv(
"ANITA_UTIL_INSTALL_DIR"));
596 return ThermalAverageWrapper::get().avg;
604 if (!thermalSpec) thermalSpec = defaultThermal();
610 for (
int ant = 0; ant < NUM_SEAVEYS; ant++)
613 for (
int ipol = 0; ipol < 2; ipol++)
616 for (
int minbias = 0; minbias < 2; minbias++)
622 TH1 * thermal = thermalSpec->getSpectrumPercentile(
AnitaPol::AnitaPol_t(ipol),ant,0.5,
false,minbias);
625 int index_spec[median->GetNbinsX()];
626 int index_therm[thermal->GetNbinsX()];
628 TMath::Sort(thermal->GetNbinsX(),((TH1F*) thermal)->GetArray()+1, index_therm);
629 TMath::Sort(median->GetNbinsX(), ((TH1F*)median)->GetArray()+1, index_spec);
634 for (
int i = 0; i <= thermal->GetNbinsX()*fractionForNormalization; i++)
636 sum_therm+=thermal->GetBinContent(index_therm[ (
int) (i + (thermal->GetNbinsX() * (0.5-fractionForNormalization))) ]);
639 for (
int i = 0; i <= median->GetNbinsX()*fractionForNormalization; i++)
641 sum_spec+=median->GetBinContent(index_spec[ (
int) (i + median->GetNbinsX() * (0.5-fractionForNormalization))]);
644 sum_therm /= thermal->GetNbinsX();
645 sum_spec /= median->GetNbinsX();
646 double ratio = sum_spec / sum_therm;
649 name.Form(
"peakiness_%d_%d_%s\n", ant,ipol, minbias ?
"minbias" :
"rf");
651 title.Form(
"%s peakiness ant=%d pol=%d\n", minbias ?
"minbias" :
"RF" , ant,ipol);
654 TH2D * peaky =
new TH2D(name,title,
655 avg->GetNbinsX(), avg->GetXaxis()->GetXmin(), avg->GetXaxis()->GetXmax(),
656 avg->GetNbinsY(), avg->GetYaxis()->GetXmin(), avg->GetYaxis()->GetXmax());
659 peaky->SetDirectory(0);
661 for (
int ii = 1; ii < peaky->GetNbinsX(); ii++)
663 for (
int jj = 1; jj < peaky->GetNbinsY(); jj++)
665 peaky->SetBinContent(ii,jj, avg->GetBinContent(ii,jj) / ( ratio * thermal->GetBinContent(ii)));
666 if (std::isnan(peaky->GetBinContent(ii,jj)))
667 peaky->SetBinContent(ii,jj,0);
670 (minbias ? peakiness_minbias[ant][ipol] : peakiness[ant][ipol]) = peaky;
680 UCorrelator:: TimeDependentAverageLoader::TimeDependentAverageLoader(
const char * the_dir,
int secs)
681 : dir(the_dir), nsecs(secs)
694 if (tavg && t >= tavg->getStartTime()-5 && t <= tavg->getEndTime()+5 )
702 if (tavg)
delete tavg;
703 tavg =
new TimeDependentAverage(run,nsecs, dir);
709 double UCorrelator::TimeDependentAverage::getBlastFraction(
double t)
const 712 int bin = nblasts->GetXaxis()->FindFixBin(t);
715 int other_bin = t < nblasts->GetXaxis()->GetBinCenter(bin) ? bin-1 : bin+1;
719 double blast_frac_bin = nblasts->GetBinContent(bin) / (nblasts->GetBinContent(bin) + norms->GetBinContent(bin));
722 double f = norms->GetBinContent(other_bin) == 0 ? 1 : 1-fabs(t-nblasts->GetXaxis()->GetBinCenter(bin)) / nsecs;
725 double blast_frac_other_bin = nblasts->GetBinContent(other_bin) / (nblasts->GetBinContent(other_bin) + norms->GetBinContent(other_bin));
726 return f * blast_frac_bin + (1-f) * blast_frac_other_bin;
729 return blast_frac_bin;
733 TMutex loader_map_lock;
734 std::map<int,UCorrelator::TimeDependentAverageLoader*> loader_map;
738 TLockGuard l(&loader_map_lock);
740 if (loader_map.count(nsecs))
742 return loader_map[nsecs];
746 loader_map[nsecs] = ldr;
750 double UCorrelator::TimeDependentAverage::getRMS(
AnitaPol::AnitaPol_t pol,
int ant,
double t)
const 752 return ((TH1*) getRMS(pol,ant))->Interpolate(t);
762 double UCorrelator::TimeDependentAverageLoader::getPayloadBlastFraction(
double t,
int nsecs)
764 return getLoader(nsecs)->avg(t)->getBlastFraction(t);
768 const TH2D * UCorrelator::TimeDependentAverage::getPeakiness(
AnitaPol::AnitaPol_t pol,
int ant,
bool minbias)
const 774 __sync_synchronize();
775 if (!peakiness_loaded)
778 if (!peakiness_loaded)
781 __sync_synchronize();
782 peakiness_loaded =
true;
787 return minbias ? peakiness_minbias[ant][pol] : peakiness[ant][pol];
static int getRunAtTime(double t)
A filter strategy defines the sets of filters that are used and provides some introspection abilities...
TimeDependentAverage(int run, int nsecs=10, const char *persistdir=0, double max_bottom_top_ratio=4.0, int min_norm=5, double max_power=1e6)
void saveToDir(const char *dir)
void computePeakiness(const TimeDependentAverage *thermal=0, double fractionForNormalization=0.5) 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.
void addOperation(FilterOperation *f, bool enable_output=false)
static double getRMS(double t, int ipol, int ant, int nsecs=10)