testCorrelator.cxx
1 /*****************************************************************************************************************
2  Author: Ben Strutt
3  Email: b.strutt.12@ucl.ac.uk
4 
5  Description:
6  Program to test the functionality of the CrossCorrelator class, nothing more complicated than that. Writes some output to /tmp.
7 
8 *************************************************************************************************************** */
9 
10 
11 #include "CrossCorrelator.h"
12 #include "RootTools.h"
13 #include "FFTtools.h"
14 
15 #include "TGraph.h"
16 #include "TFile.h"
17 #include "TTree.h"
18 #include "TChain.h"
19 
20 #include <RawAnitaHeader.h>
21 #include <UsefulAnitaEvent.h>
22 #include <CalibratedAnitaEvent.h>
23 
24 //void testImageGPUStyle();
25 void testNewCombinatorics();
26 void testImageFullStyle();
27 void writeCorrelationGraphs(CrossCorrelator* cc);
28 void testCoherentlySummedWaveform();
29 void testNormalization();
30 void testHackyFilter();
31 void testOffAxisDelay();
32 // void testFileWriting();
33 
34 int main(){
35 
36  // testImageGPUStyle();
37  // testNewCombinatorics();
38  // testImageFullStyle();
39  // testCoherentlySummedWaveform();
40  // testNormalization();
41  // testHackyFilter();
42  testOffAxisDelay();
43  // testFileWriting();
44 
45  return 0;
46 
47 }
48 
49 void testOffAxisDelay(){
50 
51  CrossCorrelator* cc = new CrossCorrelator();
52  AnitaPol::AnitaPol_t pol = AnitaPol::kHorizontal;
53 
54 
55  char eventFileName[1024];
56 
57  Int_t run = 352;
58  sprintf(eventFileName, "~/UCL/ANITA/calibratedFlight1415/run%d/calEventFile%d.root", run, run);
59 
60  TFile* eventFile = TFile::Open(eventFileName);
61  TTree* eventTree = (TTree*) eventFile->Get("eventTree");
62 
63  char rawHeaderFileName[1024];
64  sprintf(rawHeaderFileName, "~/UCL/ANITA/flight1415/root/run%d/headFile%d.root", run, run);
65 
66  TFile* rawHeaderFile = TFile::Open(rawHeaderFileName);
67  TTree* headTree = (TTree*) rawHeaderFile->Get("headTree");
68 
69  CalibratedAnitaEvent* event = NULL;
70  eventTree->SetBranchAddress("event", &event);
71 
72  RawAnitaHeader* header = NULL;
73  headTree->SetBranchAddress("header", &header);
74 
75 
76  headTree->BuildIndex("eventNumber");
77  eventTree->BuildIndex("eventNumber");
78 
79  const Long64_t eventNumber = 60832108;
80  headTree->GetEntryWithIndex(eventNumber);
81  eventTree->GetEntryWithIndex(eventNumber);
82  std::cout << header->eventNumber << "\t" << event->eventNumber << std::endl;
83 
84  UsefulAnitaEvent* usefulEvent = new UsefulAnitaEvent(event);
85  cc->kUseOffAxisDelay = 1;
86  cc->reconstructEvent(usefulEvent, 2, 2);
87 
88 
89  TFile* outFile = new TFile("/tmp/testOffAxisDelay.root","recreate");
90 
91  Double_t peakValue, imagePeak, peakPhiDeg, peakThetaDeg;
92  TH2D* hCoarse = cc->getMap(pol, peakValue, peakPhiDeg, peakThetaDeg);
93  // hCoarse->Write();
94 
95 
96  for(int i=0; i < 2; i++){
97  std::cout << i << "\t" << cc->coarseMapPeakValues[pol][i] << "\t"
98  << cc->coarseMapPeakPhiDegs[pol][i] << "\t"
99  << cc->coarseMapPeakThetaDegs[pol][i] << std::endl;
100  }
101 
102  cc->kUseOffAxisDelay = 1;
103  TH2D* hWithOffAxisDelay = cc->makeZoomedImage(pol, imagePeak, peakPhiDeg, peakThetaDeg,
104  cc->coarseMapPeakPhiDegs[pol][0],
105  cc->coarseMapPeakThetaDegs[pol][0]);
106  hWithOffAxisDelay->SetName("hWithOffAxisDelay");
107  hWithOffAxisDelay->SetTitle("With Off-Axis Delay");
108 
109  cc->kUseOffAxisDelay = 0;
110  TH2D* hWithOutOffAxisDelay = cc->makeZoomedImage(pol, imagePeak, peakPhiDeg, peakThetaDeg,
111  cc->coarseMapPeakPhiDegs[pol][0],
112  cc->coarseMapPeakThetaDegs[pol][0]);
113 
114  hWithOutOffAxisDelay->SetName("hWithOutOffAxisDelay");
115  hWithOutOffAxisDelay->SetTitle("Without Off-Axis Delay");
116 
117 
118 
119  Int_t ant1 = 1;
120 
121  for(int antInd=0; antInd < 2; antInd++){
122  Int_t ant2 = 2 + antInd;
123  const double dPhi = RootTools::getDeltaAngleDeg(cc->phiArrayDeg[pol].at(ant2),
124  cc->phiArrayDeg[pol].at(ant1));
125  const double mp = cc->phiArrayDeg[pol].at(ant1) + 0.5*dPhi;
126 
127  std::cout << cc->phiArrayDeg[pol].at(ant1) << "\t" << mp
128  << "\t" << cc->phiArrayDeg[pol].at(ant2) << "\t" << dPhi << std::endl;
129 
130  TGraph* grOffAxisDelay = new TGraph();
131  for(Double_t phiFromMidPoint = -90; phiFromMidPoint <= 90; phiFromMidPoint += 1){
132  Double_t delay = cc->relativeOffAxisDelay(pol, ant1, ant2, phiFromMidPoint+mp);
133  grOffAxisDelay->SetPoint(grOffAxisDelay->GetN(), phiFromMidPoint, delay);
134  }
135 
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();
141 
142  delete grOffAxisDelay;
143  }
144 
145 
146 
147 
148 
149  delete cc;
150 
151  outFile->Write();
152  outFile->Close();
153 }
154 
155 
156 
157 
158 void testNormalization(){
159  char eventFileName[1024];
160 
161  Int_t run = 352;
162  sprintf(eventFileName, "~/UCL/ANITA/calibratedFlight1415/run%d/calEventFile%d.root", run, run);
163 
164  TFile* eventFile = TFile::Open(eventFileName);
165  TTree* eventTree = (TTree*) eventFile->Get("eventTree");
166 
167  char rawHeaderFileName[1024];
168  sprintf(rawHeaderFileName, "~/UCL/ANITA/flight1415/root/run%d/headFile%d.root", run, run);
169 
170  TFile* rawHeaderFile = TFile::Open(rawHeaderFileName);
171  TTree* headTree = (TTree*) rawHeaderFile->Get("headTree");
172 
173  CalibratedAnitaEvent* event = NULL;
174  eventTree->SetBranchAddress("event", &event);
175 
176  RawAnitaHeader* header = NULL;
177  headTree->SetBranchAddress("header", &header);
178 
179  TFile* outFile = new TFile("/tmp/testNormalization.root","recreate");
180 
181  CrossCorrelator* cc = new CrossCorrelator();
182 
183  headTree->BuildIndex("eventNumber");
184  eventTree->BuildIndex("eventNumber");
185 
186  const Long64_t eventNumber = 60832108;
187  headTree->GetEntryWithIndex(eventNumber);
188  eventTree->GetEntryWithIndex(eventNumber);
189  std::cout << header->eventNumber << "\t" << event->eventNumber << std::endl;
190 
191  // UsefulAnitaEvent* realEvent(new UsefulAnitaEvent(event, WaveCalType::kDefault, header));
192  UsefulAnitaEvent* realEvent = new UsefulAnitaEvent(event);
193  cc->correlateEvent(realEvent);
194 
195  if(cc->grsResampled[0][1]){
196  delete cc->grsResampled[0][1];
197  cc->grsResampled[0][1] = (TGraph*) cc->grsResampled[0][0]->Clone("grCopy");
198  }
199 
200  cc->doFFTs(AnitaPol::kHorizontal);
201  cc->doAllCrossCorrelationsThreaded(AnitaPol::kHorizontal);
202  cc->doUpsampledCrossCorrelationsThreaded(AnitaPol::kHorizontal, 0);
203 
204  TGraph* grCrossCorr = cc->getCrossCorrelationGraph(AnitaPol::kHorizontal, 0, 1);
205  grCrossCorr->Write();
206 
207  TGraph* grCrossCorr2 = cc->getUpsampledCrossCorrelationGraph(AnitaPol::kHorizontal, 0, 1);
208  grCrossCorr2->Write();
209 
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++){
213  RootTools::getMeanAndRms(cc->grsResampled[pol][ant], mean, rms);
214  // std::cout << pol << "\t" << ant << "\t" << mean << "\t" << rms << std::endl;
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"
217  << pow(cc->interpRMS[pol][ant],2)/pow(cc->interpRMS2[pol][ant],2) << "\t"
218  << std::endl;
219  }
220  }
221 
222  Double_t* volts = FancyFFTs::doInvFFT(cc->numSamples, cc->ffts[0][0], true);
223  Double_t* voltsUpsampled = FancyFFTs::doInvFFT(cc->numSamplesUpsampled, cc->fftsPadded[0][0], true);
224 
225  std::vector<Double_t> times(cc->numSamples, 0);
226  for(int samp=0; samp < cc->numSamples; samp++){
227  times.at(samp) = cc->nominalSamplingDeltaT*samp;
228  }
229 
230  std::vector<Double_t> timesUpsampled(cc->numSamplesUpsampled, 0);
231  for(int samp=0; samp < cc->numSamplesUpsampled; samp++){
232  timesUpsampled.at(samp) = cc->correlationDeltaT*samp;
233  }
234 
235  TGraph* grVolts = new TGraph(cc->numSamples, &times[0], volts);
236  TGraph* grVoltsUpsampled = new TGraph(cc->numSamplesUpsampled, &timesUpsampled[0], voltsUpsampled);
237 
238  {
239  Double_t mean, rms;
240  RootTools::getMeanAndRms(grVolts, mean, rms);
241  std::cout << "grVolts\t" << mean << "\t" << rms << std::endl;
242  RootTools::getMeanAndRms(grVoltsUpsampled, mean, rms);
243  std::cout << "grVoltsUpsampled\t" << mean << "\t" << rms << std::endl;
244  }
245 
246  grVolts->SetName("grVolts");
247  grVoltsUpsampled->SetName("grVoltsUpsampled");
248 
249  grVolts->Write();
250  grVoltsUpsampled->Write();
251 
252  delete [] volts;
253  delete [] voltsUpsampled;
254 
255  const int numFreqs = FancyFFTs::getNumFreqs(cc->numSamples);
256  const int numFreqsPadded = FancyFFTs::getNumFreqs(cc->numSamplesUpsampled);
257 
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;
264  }
265  // if(freqInd == numFreqs - 1){
266  // sumSquaredPadded += std::norm(cc->fftsPadded[pol][ant][freqInd])/2;
267  // }
268  else{
269  sumSquaredPadded += std::norm(cc->fftsPadded[pol][ant][freqInd]);
270  }
271  }
272  std::cout << pol << "\t" << ant << "\t" << sumSquaredPadded << "\t" << cc->numSamplesUpsampled << "\t" << sumSquaredPadded/cc->numSamplesUpsampled << std::endl;
273 
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;
278  }
279  else{
280  sumSquared += std::norm(cc->ffts[pol][ant][freqInd]);
281  }
282  }
283  std::cout << pol << "\t" << ant << "\t" << sumSquared << "\t" << cc->numSamples << "\t" << sumSquared/cc->numSamples << std::endl;
284  }
285  }
286 
287 
288  outFile->Write();
289  outFile->Close();
290 }
291 
292 
293 
294 
295 void testHackyFilter(){
296  char eventFileName[1024];
297 
298  Int_t run = 352;
299  sprintf(eventFileName, "~/UCL/ANITA/calibratedFlight1415/run%d/calEventFile%d.root", run, run);
300 
301  TFile* eventFile = TFile::Open(eventFileName);
302  TTree* eventTree = (TTree*) eventFile->Get("eventTree");
303 
304  char rawHeaderFileName[1024];
305  sprintf(rawHeaderFileName, "~/UCL/ANITA/flight1415/root/run%d/headFile%d.root", run, run);
306 
307  TFile* rawHeaderFile = TFile::Open(rawHeaderFileName);
308  TTree* headTree = (TTree*) rawHeaderFile->Get("headTree");
309 
310  CalibratedAnitaEvent* event = NULL;
311  eventTree->SetBranchAddress("event", &event);
312 
313  RawAnitaHeader* header = NULL;
314  headTree->SetBranchAddress("header", &header);
315 
316  TFile* outFile = new TFile("/tmp/testHackyFilter.root","recreate");
317 
318  CrossCorrelator* cc = new CrossCorrelator();
320 
321  headTree->BuildIndex("eventNumber");
322  eventTree->BuildIndex("eventNumber");
323 
324  const Long64_t eventNumber = 60832108;
325  headTree->GetEntryWithIndex(eventNumber);
326  eventTree->GetEntryWithIndex(eventNumber);
327  std::cout << header->eventNumber << "\t" << event->eventNumber << std::endl;
328 
329  // UsefulAnitaEvent* realEvent(new UsefulAnitaEvent(event, WaveCalType::kDefault, header));
330  UsefulAnitaEvent* realEvent = new UsefulAnitaEvent(event);
331  cc->correlateEvent(realEvent);
332 
333  if(cc->grsResampled[0][1]){
334  delete cc->grsResampled[0][1];
335  cc->grsResampled[0][1] = (TGraph*) cc->grsResampled[0][0]->Clone("grCopy");
336  }
337 
338  Double_t mean = 0;
339  Double_t rms = 0;
340  Int_t n = cc->grsResampled[0][1]->GetN();
341  for(int samp=0; samp < n; samp++){
342  Double_t y = cc->grsResampled[0][1]->GetY()[samp];
343  mean += y;
344  rms += y*y;
345  }
346 
347  mean /= n;
348  rms = rms / n - mean*mean;
349  std::cout << "mean, rms, n: " << mean << "\t" << rms << "\t" << n << std::endl;
350 
351  cc->doFFTs(AnitaPol::kHorizontal);
352  cc->doAllCrossCorrelationsThreaded(AnitaPol::kHorizontal);
353  cc->doUpsampledCrossCorrelationsThreaded(AnitaPol::kHorizontal, 0);
354 
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++){
358  cc->simple260MHzSatelliteNotch(pol, ant);
359  }
360  }
361  const int numFreqs = FancyFFTs::getNumFreqs(cc->numSamples);
362  std::vector<Double_t> powSpec(numFreqs, 0);
363  std::vector<Double_t> freqsMHz(numFreqs, 0);
364 
365  for(int freqInd=0; freqInd < numFreqs; freqInd++){
366  freqsMHz.at(freqInd) = freqInd*1e3/(cc->nominalSamplingDeltaT*cc->numSamples);
367  powSpec.at(freqInd) = std::norm(cc->ffts[0][0][freqInd]);
368 
369  if(powSpec.at(freqInd) >= 1e-10){
370  powSpec.at(freqInd) = 10*TMath::Log10(powSpec.at(freqInd));
371  }
372  else{
373  powSpec.at(freqInd) = -10;
374  }
375  std::cout << powSpec.at(freqInd) << "\t" << cc->ffts[0][0][freqInd] << std::endl;
376  }
377 
378  TGraph* grPowSpec = new TGraph(numFreqs, &freqsMHz[0], &powSpec[0]);
379  grPowSpec->SetName("grPowSpecTest");
380  grPowSpec->Write();
381 
382  outFile->Write();
383  outFile->Close();
384 }
385 
386 
387 
388 void testCoherentlySummedWaveform(){
389  /*
390  This function tests the full +-2 phi-sector reconstruction.
391  */
392 
393  char eventFileName[1024];
394 
395  Int_t run = 352;
396  sprintf(eventFileName, "~/UCL/ANITA/calibratedFlight1415/run%d/calEventFile%d.root", run, run);
397 
398  TFile* eventFile = TFile::Open(eventFileName);
399  TTree* eventTree = (TTree*) eventFile->Get("eventTree");
400 
401  char rawHeaderFileName[1024];
402  sprintf(rawHeaderFileName, "~/UCL/ANITA/flight1415/root/run%d/headFile%d.root", run, run);
403 
404  TFile* rawHeaderFile = TFile::Open(rawHeaderFileName);
405  TTree* headTree = (TTree*) rawHeaderFile->Get("headTree");
406 
407  CalibratedAnitaEvent* event = NULL;
408  eventTree->SetBranchAddress("event", &event);
409 
410  RawAnitaHeader* header = NULL;
411  headTree->SetBranchAddress("header", &header);
412 
413  TFile* outFile = new TFile("/tmp/testCoherentlySummedWaveform.root","recreate");
414  TTree* corrTree = new TTree("corrTree","corrTree");
415  Double_t imagePeak;
416  Double_t imagePeakZoom;
417  corrTree->Branch("imagePeak", &imagePeak);
418 
419  CrossCorrelator* cc = new CrossCorrelator();
420 
421  headTree->BuildIndex("eventNumber");
422  eventTree->BuildIndex("eventNumber");
423 
424  imagePeak = -1;
425  imagePeakZoom = -1;
426  Double_t peakPhiDeg = -1;
427  Double_t peakThetaDeg = -1;
428  Double_t peakPhiDegZoom = -1;
429  Double_t peakThetaDegZoom = -1;
430 
431  const Long64_t eventNumber = 60832108;
432  headTree->GetEntryWithIndex(eventNumber);
433  eventTree->GetEntryWithIndex(eventNumber);
434  std::cout << header->eventNumber << "\t" << event->eventNumber << std::endl;
435 
436 
437  // UsefulAnitaEvent* realEvent(new UsefulAnitaEvent(event, WaveCalType::kDefault, header));
438  UsefulAnitaEvent* realEvent = new UsefulAnitaEvent(event);
439  cc->correlateEvent(realEvent);
440 
441 
442  // writeCorrelationGraphs(cc);
443 
444  std::vector<TH2D*> hImages;
445  std::vector<TH2D*> hZoomedImages;
446 
447  AnitaPol::AnitaPol_t pol = AnitaPol::kHorizontal;
448 
449  UInt_t l3TrigPattern = 0;
450  if(pol==AnitaPol::kHorizontal){
451  l3TrigPattern = header->l3TrigPatternH;
452  }
453  else if(pol==AnitaPol::kVertical){
454  l3TrigPattern = header->l3TrigPattern;
455  }
456  else{
457  std::cerr << "??????????????????????" << std::endl;
458  }
459  std::cout << l3TrigPattern << std::endl;
460 
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));
464 
465  Double_t snr = 0;
466  TGraph* grCoherent = cc->makeCoherentlySummedWaveform(pol, peakPhiDegZoom, peakThetaDegZoom,
467  l3TrigPattern, snr);
468 
469  if(grCoherent){
470  grCoherent->Write();
471  TGraph* grHilbert = FFTtools::getHilbertEnvelope(grCoherent);
472 
473 
474  grHilbert->SetName("grHilbert");
475  grHilbert->Write();
476 
477  delete grCoherent;
478  grCoherent = NULL;
479  delete grHilbert;
480  grHilbert = NULL;
481  }
482 
483 
484  for(Int_t phiSector=0; phiSector<NUM_PHI; phiSector++){
485  Int_t doPhiSector = RootTools::getBit(phiSector, l3TrigPattern);
486  if(doPhiSector > 0){
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];
492  }
493  gr->SetName(TString::Format("grInterp_%d", ant));
494  gr->Write();
495  }
496  }
497  }
498 
499 
500  delete realEvent;
501 
502  outFile->Write();
503  outFile->Close();
504 
505  delete cc;
506 
507 }
508 
509 
510 
511 void testNewCombinatorics(){
512  /*
513  This function tests the combinatorics for cross-correlating channels within +- 2 phi-sectors.
514  */
515 
516  char eventFileName[1024];
517 
518  Int_t run = 11672;
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");
522 
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");
527 
528  RawAnitaEvent* event = NULL;
529  eventTree->SetBranchAddress("event", &event);
530  RawAnitaHeader* header = NULL;
531  headTree->SetBranchAddress("header", &header);
532 
533  Int_t entry = 107;
534 
535  CrossCorrelator* cc = new CrossCorrelator();
536 
537  headTree->GetEntry(entry);
538  eventTree->GetEntry(entry);
539 
540  UsefulAnitaEvent* realEvent(new UsefulAnitaEvent(event, WaveCalType::kDefault, header));
541  cc->correlateEvent(realEvent);
542 
543  TFile* outFile = new TFile("/tmp/testNewCombinatorics.root","recreate");
544  Double_t imagePeak = -1;
545  Double_t peakPhiDeg = -1;
546  Double_t peakThetaDeg = -1;
547 
548  // TH2D* hImage = cc->makeGlobalImage(AnitaPol::kVertical, imagePeak, peakPhiDeg, peakThetaDeg);
549  TH2D* hImage = cc->makeTriggeredImage(AnitaPol::kVertical, imagePeak, peakPhiDeg, peakThetaDeg, header->l3TrigPatternH);
550  hImage->Write();
551  delete hImage;
552 
553  outFile->Write();
554  outFile->Close();
555 
556  delete cc;
557 
558 }
559 
560 void testImageFullStyle(){
561  /*
562  This function tests the full +-2 phi-sector reconstruction.
563  */
564 
565  char eventFileName[1024];
566 
567  Int_t run = 352;
568  sprintf(eventFileName, "~/UCL/ANITA/calibratedFlight1415/run%d/calEventFile%d.root", run, run);
569 
570  TFile* eventFile = TFile::Open(eventFileName);
571  TTree* eventTree = (TTree*) eventFile->Get("eventTree");
572 
573  char rawHeaderFileName[1024];
574  sprintf(rawHeaderFileName, "~/UCL/ANITA/flight1415/root/run%d/headFile%d.root", run, run);
575 
576  TFile* rawHeaderFile = TFile::Open(rawHeaderFileName);
577  TTree* headTree = (TTree*) rawHeaderFile->Get("headTree");
578 
579  CalibratedAnitaEvent* event = NULL;
580  eventTree->SetBranchAddress("event", &event);
581 
582  RawAnitaHeader* header = NULL;
583  headTree->SetBranchAddress("header", &header);
584 
585  TFile* outFile = new TFile("/tmp/testImageFullStyle.root","recreate");
586  TTree* corrTree = new TTree("corrTree","corrTree");
587  Double_t imagePeak;
588  corrTree->Branch("imagePeak", &imagePeak);
589 
590  // Long64_t numEntries = eventTree->GetEntries();
591  Long64_t numEntries = 200; //eventTree->GetEntries();
592  numEntries = 408;
593 
594  CrossCorrelator* cc = new CrossCorrelator();
595 
596  for(Long64_t entry=407; entry<numEntries; entry++){
597 
598  imagePeak = -1;
599  Double_t peakPhiDeg = -1;
600  Double_t peakThetaDeg = -1;
601 
602  headTree->GetEntry(entry);
603  eventTree->GetEntry(entry);
604 
605  // UsefulAnitaEvent* realEvent(new UsefulAnitaEvent(event, WaveCalType::kDefault, header));
606  UsefulAnitaEvent* realEvent = new UsefulAnitaEvent(event);
607  cc->correlateEvent(realEvent);
608 
609  writeCorrelationGraphs(cc);
610 
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));
614  }
615 
616  // hImages.push_back(cc->makeTriggeredImage(AnitaPol::kHorizontal, imagePeak, peakPhiDeg, peakThetaDeg,
617  // header->l3TrigPatternH));
618  // hImages.push_back(cc->makeTriggeredImage(AnitaPol::kVertical, imagePeak, peakPhiDeg, peakThetaDeg,
619  // header->l3TrigPattern));
620 
621 
622  delete realEvent;
623  }
624 
625  outFile->Write();
626  outFile->Close();
627 
628  delete cc;
629 
630 }
631 
632 
633 
634 void writeCorrelationGraphs(CrossCorrelator* cc){
635  /* for debugging */
636 
637  for(Int_t ant1=0; ant1<NUM_SEAVEYS; ant1++){
638  char name[1024];
639  sprintf(name, "grsInterp_%d", ant1);
640  // cc->grsInterp[AnitaPol::kVertical][ant1]->SetName(name);
641  // cc->grsInterp[AnitaPol::kVertical][ant1]->SetTitle(name);
642  // cc->grsInterp[AnitaPol::kVertical][ant1]->Write();
643  for(Int_t ant2=0; ant2<NUM_SEAVEYS; ant2++){
644  TGraph* grCorr = cc->getCrossCorrelationGraph(AnitaPol::kVertical, ant1, ant2);
645  if(grCorr){
646  grCorr->Write();
647  }
648  }
649  }
650 }
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.
Definition: FancyFFTs.cxx:416
void doFFTs(AnitaPol::AnitaPol_t pol)
Takes FFTs of the normalized, evenly resampled waveforms and puts them in memory. ...
Int_t getBit(UInt_t bitIndex, UInt_t bitMask)
For decoding bit masks.
Definition: RootTools.cxx:1242
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_t getDeltaAngleDeg(Double_t angle1, Double_t angle2)
Do angle1-angle2 (in degrees) and +- 360 such that the result lies in -180 < deltaAngle < 180...
Definition: RootTools.cxx:267
void getMeanAndRms(TGraph *gr, Double_t &mean, Double_t &rms)
Get mean and rms of gr.
Definition: RootTools.cxx:381
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.
Definition: FancyFFTs.cxx:288
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...