11 #include "CrossCorrelator.h" 12 #include "RootTools.h" 20 #include <RawAnitaHeader.h> 21 #include <UsefulAnitaEvent.h> 22 #include <CalibratedAnitaEvent.h> 25 void testNewCombinatorics();
26 void testImageFullStyle();
28 void testCoherentlySummedWaveform();
29 void testNormalization();
30 void testHackyFilter();
31 void testOffAxisDelay();
49 void testOffAxisDelay(){
52 AnitaPol::AnitaPol_t pol = AnitaPol::kHorizontal;
55 char eventFileName[1024];
58 sprintf(eventFileName,
"~/UCL/ANITA/calibratedFlight1415/run%d/calEventFile%d.root", run, run);
60 TFile* eventFile = TFile::Open(eventFileName);
61 TTree* eventTree = (TTree*) eventFile->Get(
"eventTree");
63 char rawHeaderFileName[1024];
64 sprintf(rawHeaderFileName,
"~/UCL/ANITA/flight1415/root/run%d/headFile%d.root", run, run);
66 TFile* rawHeaderFile = TFile::Open(rawHeaderFileName);
67 TTree* headTree = (TTree*) rawHeaderFile->Get(
"headTree");
69 CalibratedAnitaEvent*
event = NULL;
70 eventTree->SetBranchAddress(
"event", &event);
72 RawAnitaHeader* header = NULL;
73 headTree->SetBranchAddress(
"header", &header);
76 headTree->BuildIndex(
"eventNumber");
77 eventTree->BuildIndex(
"eventNumber");
79 const Long64_t eventNumber = 60832108;
80 headTree->GetEntryWithIndex(eventNumber);
81 eventTree->GetEntryWithIndex(eventNumber);
82 std::cout << header->eventNumber <<
"\t" <<
event->eventNumber << std::endl;
84 UsefulAnitaEvent* usefulEvent =
new UsefulAnitaEvent(event);
89 TFile* outFile =
new TFile(
"/tmp/testOffAxisDelay.root",
"recreate");
91 Double_t peakValue, imagePeak, peakPhiDeg, peakThetaDeg;
92 TH2D* hCoarse = cc->
getMap(pol, peakValue, peakPhiDeg, peakThetaDeg);
96 for(
int i=0; i < 2; i++){
103 TH2D* hWithOffAxisDelay = cc->
makeZoomedImage(pol, imagePeak, peakPhiDeg, peakThetaDeg,
106 hWithOffAxisDelay->SetName(
"hWithOffAxisDelay");
107 hWithOffAxisDelay->SetTitle(
"With Off-Axis Delay");
110 TH2D* hWithOutOffAxisDelay = cc->
makeZoomedImage(pol, imagePeak, peakPhiDeg, peakThetaDeg,
114 hWithOutOffAxisDelay->SetName(
"hWithOutOffAxisDelay");
115 hWithOutOffAxisDelay->SetTitle(
"Without Off-Axis Delay");
121 for(
int antInd=0; antInd < 2; antInd++){
122 Int_t ant2 = 2 + antInd;
125 const double mp = cc->
phiArrayDeg[pol].at(ant1) + 0.5*dPhi;
127 std::cout << cc->
phiArrayDeg[pol].at(ant1) <<
"\t" << mp
128 <<
"\t" << cc->
phiArrayDeg[pol].at(ant2) <<
"\t" << dPhi << std::endl;
130 TGraph* grOffAxisDelay =
new TGraph();
131 for(Double_t phiFromMidPoint = -90; phiFromMidPoint <= 90; phiFromMidPoint += 1){
133 grOffAxisDelay->SetPoint(grOffAxisDelay->GetN(), phiFromMidPoint, delay);
136 TString name = TString::Format(
"grOffAxisDelay_%d_%d_%d", pol, ant1, ant2);
137 grOffAxisDelay->SetName(name);
138 TString title = TString::Format(
"Antennas %d and %d", ant1, ant2);
139 grOffAxisDelay->SetTitle(title);
140 grOffAxisDelay->Write();
142 delete grOffAxisDelay;
158 void testNormalization(){
159 char eventFileName[1024];
162 sprintf(eventFileName,
"~/UCL/ANITA/calibratedFlight1415/run%d/calEventFile%d.root", run, run);
164 TFile* eventFile = TFile::Open(eventFileName);
165 TTree* eventTree = (TTree*) eventFile->Get(
"eventTree");
167 char rawHeaderFileName[1024];
168 sprintf(rawHeaderFileName,
"~/UCL/ANITA/flight1415/root/run%d/headFile%d.root", run, run);
170 TFile* rawHeaderFile = TFile::Open(rawHeaderFileName);
171 TTree* headTree = (TTree*) rawHeaderFile->Get(
"headTree");
173 CalibratedAnitaEvent*
event = NULL;
174 eventTree->SetBranchAddress(
"event", &event);
176 RawAnitaHeader* header = NULL;
177 headTree->SetBranchAddress(
"header", &header);
179 TFile* outFile =
new TFile(
"/tmp/testNormalization.root",
"recreate");
183 headTree->BuildIndex(
"eventNumber");
184 eventTree->BuildIndex(
"eventNumber");
186 const Long64_t eventNumber = 60832108;
187 headTree->GetEntryWithIndex(eventNumber);
188 eventTree->GetEntryWithIndex(eventNumber);
189 std::cout << header->eventNumber <<
"\t" <<
event->eventNumber << std::endl;
192 UsefulAnitaEvent* realEvent =
new UsefulAnitaEvent(event);
200 cc->
doFFTs(AnitaPol::kHorizontal);
205 grCrossCorr->Write();
208 grCrossCorr2->Write();
210 Double_t mean=0, rms=1;
211 for(
int pol=0; pol < AnitaPol::kNotAPol; pol++){
212 for(
int ant=0; ant < NUM_SEAVEYS; ant++){
215 std::cout << pol <<
"\t" << ant <<
"\t" << mean <<
"\t" << rms <<
"\t";
216 std::cout << pow(cc->
interpRMS[pol][ant], 2) <<
"\t" << pow(cc->
interpRMS2[pol][ant], 2) <<
"\t" 225 std::vector<Double_t> times(cc->
numSamples, 0);
226 for(
int samp=0; samp < cc->
numSamples; samp++){
235 TGraph* grVolts =
new TGraph(cc->
numSamples, ×[0], volts);
236 TGraph* grVoltsUpsampled =
new TGraph(cc->
numSamplesUpsampled, ×Upsampled[0], voltsUpsampled);
241 std::cout <<
"grVolts\t" << mean <<
"\t" << rms << std::endl;
243 std::cout <<
"grVoltsUpsampled\t" << mean <<
"\t" << rms << std::endl;
246 grVolts->SetName(
"grVolts");
247 grVoltsUpsampled->SetName(
"grVoltsUpsampled");
250 grVoltsUpsampled->Write();
253 delete [] voltsUpsampled;
258 for(
int pol=0; pol < AnitaPol::kNotAPol; pol++){
259 for(
int ant=0; ant < NUM_SEAVEYS; ant++){
260 Double_t sumSquaredPadded = 0;
261 for(
int freqInd=0; freqInd < numFreqsPadded; freqInd++){
262 if(freqInd == numFreqsPadded - 1){
263 sumSquaredPadded += std::norm(cc->
fftsPadded[pol][ant][freqInd])/2;
269 sumSquaredPadded += std::norm(cc->
fftsPadded[pol][ant][freqInd]);
274 Double_t sumSquared = 0;
275 for(
int freqInd=0; freqInd < numFreqs; freqInd++){
276 if(freqInd == numFreqs - 1){
277 sumSquared += std::norm(cc->
ffts[pol][ant][freqInd])/2;
280 sumSquared += std::norm(cc->
ffts[pol][ant][freqInd]);
283 std::cout << pol <<
"\t" << ant <<
"\t" << sumSquared <<
"\t" << cc->
numSamples <<
"\t" << sumSquared/cc->
numSamples << std::endl;
295 void testHackyFilter(){
296 char eventFileName[1024];
299 sprintf(eventFileName,
"~/UCL/ANITA/calibratedFlight1415/run%d/calEventFile%d.root", run, run);
301 TFile* eventFile = TFile::Open(eventFileName);
302 TTree* eventTree = (TTree*) eventFile->Get(
"eventTree");
304 char rawHeaderFileName[1024];
305 sprintf(rawHeaderFileName,
"~/UCL/ANITA/flight1415/root/run%d/headFile%d.root", run, run);
307 TFile* rawHeaderFile = TFile::Open(rawHeaderFileName);
308 TTree* headTree = (TTree*) rawHeaderFile->Get(
"headTree");
310 CalibratedAnitaEvent*
event = NULL;
311 eventTree->SetBranchAddress(
"event", &event);
313 RawAnitaHeader* header = NULL;
314 headTree->SetBranchAddress(
"header", &header);
316 TFile* outFile =
new TFile(
"/tmp/testHackyFilter.root",
"recreate");
321 headTree->BuildIndex(
"eventNumber");
322 eventTree->BuildIndex(
"eventNumber");
324 const Long64_t eventNumber = 60832108;
325 headTree->GetEntryWithIndex(eventNumber);
326 eventTree->GetEntryWithIndex(eventNumber);
327 std::cout << header->eventNumber <<
"\t" <<
event->eventNumber << std::endl;
330 UsefulAnitaEvent* realEvent =
new UsefulAnitaEvent(event);
341 for(
int samp=0; samp < n; samp++){
348 rms = rms / n - mean*mean;
349 std::cout <<
"mean, rms, n: " << mean <<
"\t" << rms <<
"\t" << n << std::endl;
351 cc->
doFFTs(AnitaPol::kHorizontal);
355 for(Int_t polInd=0; polInd < AnitaPol::kNotAPol; polInd++){
356 AnitaPol::AnitaPol_t pol = (AnitaPol::AnitaPol_t) polInd;
357 for(Int_t ant=0; ant < NUM_SEAVEYS; ant++){
362 std::vector<Double_t> powSpec(numFreqs, 0);
363 std::vector<Double_t> freqsMHz(numFreqs, 0);
365 for(
int freqInd=0; freqInd < numFreqs; freqInd++){
367 powSpec.at(freqInd) = std::norm(cc->
ffts[0][0][freqInd]);
369 if(powSpec.at(freqInd) >= 1e-10){
370 powSpec.at(freqInd) = 10*TMath::Log10(powSpec.at(freqInd));
373 powSpec.at(freqInd) = -10;
375 std::cout << powSpec.at(freqInd) <<
"\t" << cc->
ffts[0][0][freqInd] << std::endl;
378 TGraph* grPowSpec =
new TGraph(numFreqs, &freqsMHz[0], &powSpec[0]);
379 grPowSpec->SetName(
"grPowSpecTest");
388 void testCoherentlySummedWaveform(){
393 char eventFileName[1024];
396 sprintf(eventFileName,
"~/UCL/ANITA/calibratedFlight1415/run%d/calEventFile%d.root", run, run);
398 TFile* eventFile = TFile::Open(eventFileName);
399 TTree* eventTree = (TTree*) eventFile->Get(
"eventTree");
401 char rawHeaderFileName[1024];
402 sprintf(rawHeaderFileName,
"~/UCL/ANITA/flight1415/root/run%d/headFile%d.root", run, run);
404 TFile* rawHeaderFile = TFile::Open(rawHeaderFileName);
405 TTree* headTree = (TTree*) rawHeaderFile->Get(
"headTree");
407 CalibratedAnitaEvent*
event = NULL;
408 eventTree->SetBranchAddress(
"event", &event);
410 RawAnitaHeader* header = NULL;
411 headTree->SetBranchAddress(
"header", &header);
413 TFile* outFile =
new TFile(
"/tmp/testCoherentlySummedWaveform.root",
"recreate");
414 TTree* corrTree =
new TTree(
"corrTree",
"corrTree");
416 Double_t imagePeakZoom;
417 corrTree->Branch(
"imagePeak", &imagePeak);
421 headTree->BuildIndex(
"eventNumber");
422 eventTree->BuildIndex(
"eventNumber");
426 Double_t peakPhiDeg = -1;
427 Double_t peakThetaDeg = -1;
428 Double_t peakPhiDegZoom = -1;
429 Double_t peakThetaDegZoom = -1;
431 const Long64_t eventNumber = 60832108;
432 headTree->GetEntryWithIndex(eventNumber);
433 eventTree->GetEntryWithIndex(eventNumber);
434 std::cout << header->eventNumber <<
"\t" <<
event->eventNumber << std::endl;
438 UsefulAnitaEvent* realEvent =
new UsefulAnitaEvent(event);
444 std::vector<TH2D*> hImages;
445 std::vector<TH2D*> hZoomedImages;
447 AnitaPol::AnitaPol_t pol = AnitaPol::kHorizontal;
449 UInt_t l3TrigPattern = 0;
450 if(pol==AnitaPol::kHorizontal){
451 l3TrigPattern = header->l3TrigPatternH;
453 else if(pol==AnitaPol::kVertical){
454 l3TrigPattern = header->l3TrigPattern;
457 std::cerr <<
"??????????????????????" << std::endl;
459 std::cout << l3TrigPattern << std::endl;
461 hImages.push_back(cc->
makeTriggeredImage(pol, imagePeak, peakPhiDeg, peakThetaDeg, l3TrigPattern));
462 hZoomedImages.push_back(cc->
makeZoomedImage(pol, imagePeakZoom, peakPhiDegZoom, peakThetaDegZoom,
463 l3TrigPattern, peakPhiDeg, peakThetaDeg));
471 TGraph* grHilbert = FFTtools::getHilbertEnvelope(grCoherent);
474 grHilbert->SetName(
"grHilbert");
484 for(Int_t phiSector=0; phiSector<NUM_PHI; phiSector++){
487 for(
int ring=0; ring<NUM_RING; ring++){
488 int ant = phiSector + NUM_PHI*ring;
489 TGraph* gr = (TGraph*) cc->
grsResampled[pol][ant]->Clone();
490 for(Int_t samp=0; samp<gr->GetN(); samp++){
491 gr->GetY()[samp]*=cc->
interpRMS[pol][ant];
493 gr->SetName(TString::Format(
"grInterp_%d", ant));
511 void testNewCombinatorics(){
516 char eventFileName[1024];
519 sprintf(eventFileName,
"../antarctica2014/PrioritizerdCalib/localData/run%d/eventFile%d.root", run, run);
520 TFile* eventFile = TFile::Open(eventFileName);
521 TTree* eventTree = (TTree*) eventFile->Get(
"eventTree");
523 char rawHeaderFileName[1024];
524 sprintf(rawHeaderFileName,
"../antarctica2014/PrioritizerdCalib/localData/run%d/headFile%d.root", run, run);
525 TFile* rawHeaderFile = TFile::Open(rawHeaderFileName);
526 TTree* headTree = (TTree*) rawHeaderFile->Get(
"headTree");
528 RawAnitaEvent*
event = NULL;
529 eventTree->SetBranchAddress(
"event", &event);
530 RawAnitaHeader* header = NULL;
531 headTree->SetBranchAddress(
"header", &header);
537 headTree->GetEntry(entry);
538 eventTree->GetEntry(entry);
540 UsefulAnitaEvent* realEvent(
new UsefulAnitaEvent(event, WaveCalType::kDefault, header));
543 TFile* outFile =
new TFile(
"/tmp/testNewCombinatorics.root",
"recreate");
544 Double_t imagePeak = -1;
545 Double_t peakPhiDeg = -1;
546 Double_t peakThetaDeg = -1;
549 TH2D* hImage = cc->
makeTriggeredImage(AnitaPol::kVertical, imagePeak, peakPhiDeg, peakThetaDeg, header->l3TrigPatternH);
560 void testImageFullStyle(){
565 char eventFileName[1024];
568 sprintf(eventFileName,
"~/UCL/ANITA/calibratedFlight1415/run%d/calEventFile%d.root", run, run);
570 TFile* eventFile = TFile::Open(eventFileName);
571 TTree* eventTree = (TTree*) eventFile->Get(
"eventTree");
573 char rawHeaderFileName[1024];
574 sprintf(rawHeaderFileName,
"~/UCL/ANITA/flight1415/root/run%d/headFile%d.root", run, run);
576 TFile* rawHeaderFile = TFile::Open(rawHeaderFileName);
577 TTree* headTree = (TTree*) rawHeaderFile->Get(
"headTree");
579 CalibratedAnitaEvent*
event = NULL;
580 eventTree->SetBranchAddress(
"event", &event);
582 RawAnitaHeader* header = NULL;
583 headTree->SetBranchAddress(
"header", &header);
585 TFile* outFile =
new TFile(
"/tmp/testImageFullStyle.root",
"recreate");
586 TTree* corrTree =
new TTree(
"corrTree",
"corrTree");
588 corrTree->Branch(
"imagePeak", &imagePeak);
591 Long64_t numEntries = 200;
596 for(Long64_t entry=407; entry<numEntries; entry++){
599 Double_t peakPhiDeg = -1;
600 Double_t peakThetaDeg = -1;
602 headTree->GetEntry(entry);
603 eventTree->GetEntry(entry);
606 UsefulAnitaEvent* realEvent =
new UsefulAnitaEvent(event);
609 writeCorrelationGraphs(cc);
611 std::vector<TH2D*> hImages;
612 for(Int_t pol = AnitaPol::kHorizontal; pol < AnitaPol::kNotAPol; pol++){
613 hImages.push_back(cc->
makeGlobalImage(AnitaPol::AnitaPol_t(pol), imagePeak, peakPhiDeg, peakThetaDeg));
637 for(Int_t ant1=0; ant1<NUM_SEAVEYS; ant1++){
639 sprintf(name,
"grsInterp_%d", ant1);
643 for(Int_t ant2=0; ant2<NUM_SEAVEYS; ant2++){
TH2D * makeGlobalImage(AnitaPol::AnitaPol_t pol, Double_t &imagePeak, Double_t &peakPhiDeg, Double_t &peakThetaDeg)
Creates an interferometric map using plane wave deltaTs and antenna pairs from all phi-sectors...
Int_t numSamplesUpsampled
Number of samples in waveform after padding and up sampling.
A class to take in UsefulAnitaEvents and get interferometric maps with a single function.
TGraph * getUpsampledCrossCorrelationGraph(AnitaPol::AnitaPol_t pol, Int_t ant1, Int_t ant2)
Turns internal upsampled correlation arrays into TGraphs to be seen by humans.
void reconstructEvent(UsefulAnitaEvent *usefulEvent, Int_t numFinePeaks=MAX_NUM_PEAKS, Int_t numCoarsePeaks=MAX_NUM_PEAKS)
Reconstruct event.
Double_t coarseMapPeakThetaDegs[NUM_POL][MAX_NUM_PEAKS]
Stores the peak theta (degrees) of the interally stored map.
TGraph * grsResampled[NUM_POL][NUM_SEAVEYS]
Evenly resampled TGraphs.
TH2D * getMap(AnitaPol::AnitaPol_t pol, Double_t &peakValue, Double_t &peakPhiDeg, Double_t &peakThetaDeg, UShort_t l3TrigPattern=ALL_PHI_TRIGS)
Gets an actual histogram of the zoomed in map.
Int_t kDoSimpleSatelliteFiltering
Does a simple 52MHz wide notch at 260 if flag is greater than 0.
void correlateEvent(UsefulAnitaEvent *realEvent)
Correlate the event.
Int_t kUseOffAxisDelay
Flag for whether or not to apply off axis delay to deltaT expected.
Double_t interpRMS[NUM_POL][NUM_SEAVEYS]
RMS of interpolated TGraphs.
std::complex< Double_t > ffts[NUM_POL][NUM_SEAVEYS][GETNUMFREQS(NUM_SAMPLES *PAD_FACTOR)]
FFTs of evenly resampled waveforms.
std::complex< Double_t > fftsPadded[NUM_POL][NUM_SEAVEYS][GETNUMFREQS(NUM_SAMPLES *PAD_FACTOR *UPSAMPLE_FACTOR)]
FFTs of evenly resampled waveforms, padded with zeros so that the inverse fourier transform is interp...
void doAllCrossCorrelationsThreaded(AnitaPol::AnitaPol_t pol)
Wrapper function which launches the threads for generating all the cross correlations.
TGraph * getCrossCorrelationGraph(AnitaPol::AnitaPol_t pol, Int_t ant1, Int_t ant2)
Turns internal correlation arrays into TGraphs to be seen by humans.
TH2D * makeTriggeredImage(AnitaPol::AnitaPol_t pol, Double_t &imagePeak, Double_t &peakPhiDeg, Double_t &peakThetaDeg, UShort_t l3TrigPattern)
Creates an interferometric map using plane wave deltaTs and l3Triggered pairs from all phi-sectors...
Double_t interpRMS2[NUM_POL][NUM_SEAVEYS]
RMS of interpolated TGraphs with extra zero padding.
Double_t correlationDeltaT
nominalSamplingDeltaT/UPSAMPLE_FACTOR, deltaT of for interpolation.
int getNumFreqs(int len)
Get the number of frequencies from the number of samples.
void doFFTs(AnitaPol::AnitaPol_t pol)
Takes FFTs of the normalized, evenly resampled waveforms and puts them in memory. ...
TGraph * makeCoherentlySummedWaveform(AnitaPol::AnitaPol_t pol, Double_t phiDeg, Double_t thetaDeg, Int_t maxDeltaPhiSect, Double_t &snr)
Creates the coherently summed waveform from the FFTs held in memory.
Double_t coarseMapPeakValues[NUM_POL][MAX_NUM_PEAKS]
Stores the peak of the interally stored map.
Int_t numSamples
Number of samples in waveform after padding.
Double_t relativeOffAxisDelay(AnitaPol::AnitaPol_t pol, Int_t ant1, Int_t ant2, Double_t phiDeg)
Get the relative off-axis delay between an antenna pair.
TH2D * makeZoomedImage(AnitaPol::AnitaPol_t pol, UShort_t l3TrigPattern, Double_t zoomCenterPhiDeg, Double_t zoomCenterThetaDeg)
Creates an interferometric map using plane wave deltaTs centered around a particular phi/theta...
Double_t coarseMapPeakPhiDegs[NUM_POL][MAX_NUM_PEAKS]
Stores the peak phi (degrees) of the interally stored map.
Double_t nominalSamplingDeltaT
ANITA-3 => 1./2.6 ns, deltaT for evenly resampling.
double * doInvFFT(int len, complex< double > *input, bool copyOutputToNewArray, int threadInd=0)
Does an inverse fast fourier transform on an array of complex<double>s.
void doUpsampledCrossCorrelationsThreaded(AnitaPol::AnitaPol_t pol, Int_t phiSector)
Static member function which generates the finely binned set of cross correlations from the FFTs held...
std::vector< Double_t > phiArrayDeg[NUM_POL]
Vector of antenna azimuth positions.
void simple260MHzSatelliteNotch(AnitaPol::AnitaPol_t pol, Int_t ant)
Applies a 52MHz wide notch centered at 260 MHz to filter the most problematic satellite frequency...