ImpulsivityMeasure.cc
1 #include "ImpulsivityMeasure.h"
2 #include "AnalysisWaveform.h"
3 #include "TH2.h"
4 #include <algorithm>
5 #include <cmath>
6 
7 
8 double impulsivity::impulsivityMeasure(const AnalysisWaveform * wf, TGraph * distance_cdf,int pt, bool hilbert)
9 {
10 
11  const TGraphAligned * g = hilbert ? wf->hilbertEnvelope() : wf->even();
12 
13  if (pt < 0)
14  {
15  g->peakVal(&pt,0,-1,true);
16  }
17 
18  int N = TMath::Max(pt+1, wf->Neven()-pt+1);
19 
20  if (distance_cdf) distance_cdf->Set(N);
21 
22 
23  double total = g->getSumV2();
24  double sumv2 = 0;
25 
26 
27  double v= g->GetY()[pt];
28  sumv2+=v*v;
29  if (distance_cdf)
30  {
31  distance_cdf->GetX()[0] = 0;
32  distance_cdf->GetY()[0] = sumv2/total;
33  }
34 
35  double ysum = sumv2;
36 
37  int i = 0;
38  while(++i < N)
39  {
40  if (pt+i < wf->Neven())
41  {
42  v= g->GetY()[pt+i];
43  sumv2+=v*v;
44  }
45 
46  if (pt -i >= 0)
47  {
48  v= g->GetY()[pt-i];
49  sumv2+=v*v;
50  }
51 
52  if (distance_cdf)
53  {
54  distance_cdf->GetY()[i] = sumv2 / total;
55  distance_cdf->GetX()[i] = i * wf->deltaT();
56  }
57 
58  ysum+= sumv2;
59  }
60 
61 
62  return 2 * ysum / (N*total)-1;
63 }
64 
65 
66 
67 TH2* impulsivity::envelopogram(const AnalysisWaveform * wf, TH2 * out, int min, int max, int step, bool hilbert)
68 {
69 
70  /* Sanity check inputs */
71 
72  //make sure positive
73  if (min < 0) min =-min;
74  if (max < 0) max =-max;
75  if (step < 0) step =-step;
76 
77  // make sure min less than max
78  if (min > max) std::swap(min,max);
79 
80 
81 
82 
83  /* Generate the output histogram */
84 
85  if (out)
86  {
87 
88  out->SetBins(wf->Neven(),
89  wf->even()->GetX()[0], wf->even()->GetX()[wf->Neven()-1],
90  (max-min)/step+1,
91  min,max);
92  }
93  else
94  {
95  out = new TH2D("envelopogram","Envelopogram",
96  wf->Neven(), wf->even()->GetX()[0], wf->even()->GetX()[wf->Neven()-1],
97  (max-min)/step+1, min,max);
98 
99  out->SetDirectory(0) ;
100  }
101 
102  /* loop over waveform bins */
103  for (int i = 0; i< wf->Neven(); i++)
104  {
105 
106  int j = 0;
107  double sumv2 = 0;
108  int ybin = 1;
109  int navg = 0;
110  while (abs(j) <= max)
111  {
112  int ii = i +j;
113  if (ii >=0 && ii < wf->Neven())
114  {
115  double v = ( hilbert ? wf->hilbertEnvelope() : wf->even() )->GetY()[i+j];
116  sumv2 += v*v;
117  navg++;
118  }
119 
120  if (j >= 0)
121  {
122  if ((j+1) >= min && ((j+1)-min) % step == 0)
123  {
124  out->SetBinContent(i,ybin++, sqrt(2*sumv2/navg));
125  }
126  j = -(j+1);
127  }
128  else
129  {
130  j=-j;
131  }
132  }
133  }
134 
135  return out;
136 
137 }
double deltaT() const
const TGraphAligned * hilbertEnvelope() const
const TGraphAligned * even() const
This class is intended to be the main storage vessel for ANITA waveforms. It is similar in principle ...