1 #include "Polarimetry.h" 2 #include "AnalysisWaveform.h" 4 #include "TMultiGraph.h" 8 polarimetry::StokesAnalysis::StokesAnalysis(
const StokesAnalysis & other)
16 dI =
new TGraph(*other.dI);
17 dQ =
new TGraph(*other.dQ);
18 dU =
new TGraph(*other.dU);
19 dV =
new TGraph(*other.dV);
21 cI =
new TGraph(*other.cI);
22 cQ =
new TGraph(*other.cQ);
23 cU =
new TGraph(*other.cU);
24 cV =
new TGraph(*other.cV);
26 instantaneous.Add(dI,
"lp");
27 instantaneous.Add(dQ,
"lp");
28 instantaneous.Add(dU,
"lp");
29 instantaneous.Add(dV,
"lp");
30 instantaneous.SetTitle(
"Instantaneous Stokes; Time (ns); Powerish");
32 cumulative.Add(cI,
"lp");
33 cumulative.Add(cQ,
"lp");
34 cumulative.Add(cU,
"lp");
35 cumulative.Add(cV,
"lp");
36 cumulative.SetTitle(
"Cumulative Stokes; Time (ns);Powerish");
49 bool need_to_resample =V->
deltaT() != H->
deltaT() || H->
even()->GetX()[0] != V->
even()->GetX()[0] ;
52 if ( need_to_resample || xcorr)
57 double t0 = TMath::Max(H->
even()->GetX()[0], V->
even()->GetX()[0]);
58 double t1 = TMath::Min(H->
even()->GetX()[H->
Neven()-1], V->
even()->GetX()[V->
Neven()-1]);
68 H->
evalEven(N, gHre->GetX(), gHre->GetY());
69 V->
evalEven(N, gVre->GetX(), gVre->GetY());
94 int half = xc->
Neven()/2;
95 int min = TMath::Max(0,
int(half-ceil(xcorr/dt)));
96 int max = TMath::Min(
int(half+ceil(xcorr/dt)), xc->
Neven()-1);
99 xc->
even()->peakVal(&loc,min,max,
true);
111 dI =
new TGraph(N, H->
even()->GetX(), H->
even()->GetY());
112 dI->SetTitle(
"Instantaneous I");
113 dQ =
new TGraph(N, H->
even()->GetX(), H->
even()->GetY());
114 dQ->SetTitle(
"Instantaneous Q");
115 dU =
new TGraph(N, H->
even()->GetX(), H->
even()->GetY());
116 dU->SetTitle(
"Instantaneous U");
117 dV =
new TGraph(N, H->
even()->GetX(), H->
even()->GetY());
118 dV->SetTitle(
"Instantaneous V");
123 &avgI,&avgQ,&avgU,&avgV,
124 dI->GetY(), dQ->GetY(), dU->GetY(), dV->GetY(),
127 cI =
new TGraph(dI->GetN(), dI->GetX(), dI->GetY());
128 cI->SetTitle(
"Cumulative I");
129 cQ =
new TGraph(dQ->GetN(), dQ->GetX(), dQ->GetY());
130 cQ->SetTitle(
"Cumulative Q");
131 cU =
new TGraph(dU->GetN(), dU->GetX(), dU->GetY());
132 cU->SetTitle(
"Cumulative U");
133 cV =
new TGraph(dV->GetN(), dV->GetX(), dV->GetY());
134 cV->SetTitle(
"Cumulative V");
137 for (
int i = 1; i < N; i++)
139 cI->GetY()[i] += cI->GetY()[i-1];
140 cQ->GetY()[i] += cQ->GetY()[i-1];
141 cU->GetY()[i] += cU->GetY()[i-1];
142 cV->GetY()[i] += cV->GetY()[i-1];
146 instantaneous.Add(dI,
"lp");
147 instantaneous.Add(dQ,
"lp");
148 instantaneous.Add(dU,
"lp");
149 instantaneous.Add(dV,
"lp");
150 instantaneous.SetTitle(
"Instantaneous Stokes; Time (ns); Powerish");
152 cumulative.Add(cI,
"lp");
153 cumulative.Add(cQ,
"lp");
154 cumulative.Add(cU,
"lp");
155 cumulative.Add(cV,
"lp");
156 cumulative.SetTitle(
"Cumulative Stokes; Time (ns);Powerish");
166 int Imax = TMath::LocMax(dI->GetN(), dI->GetY());
167 double I0 = dI->GetY()[Imax];
169 double thresh = dI->GetY()[Imax] * Ifrac;
183 for (
int i = Imax; i < dI->GetN(); i++)
186 if (dI->GetY()[i] < thresh)
break;
187 Isum += dI->GetY()[i];
188 Qsum += dQ->GetY()[i];
189 Usum += dU->GetY()[i];
190 Vsum += dV->GetY()[i];
194 for (
int i = Imax-1; i >= 0; i--)
196 if (dI->GetY()[i] < thresh)
break;
197 Isum += dI->GetY()[i];
198 Qsum += dQ->GetY()[i];
199 Usum += dU->GetY()[i];
200 Vsum += dV->GetY()[i];
212 for (
int i = Imax; i < dI->GetN(); i++)
214 if (dI->GetY()[i] < thresh)
break;
215 I2sum += (dI->GetY()[i]/I0 - Isum/I0)*(dI->GetY()[i]/I0 - Isum/I0);
216 Q2sum += (dQ->GetY()[i]/I0 - Qsum/I0)*(dQ->GetY()[i]/I0 - Qsum/I0);
217 U2sum += (dU->GetY()[i]/I0 - Usum/I0)*(dU->GetY()[i]/I0 - Usum/I0);
218 V2sum += (dV->GetY()[i]/I0 - Vsum/I0)*(dV->GetY()[i]/I0 - Vsum/I0);
221 for (
int i = Imax-1; i >= 0; i--)
223 if (dI->GetY()[i] < thresh)
break;
224 I2sum += (dI->GetY()[i]/I0 - Isum/I0)*(dI->GetY()[i]/I0 - Isum/I0);
225 Q2sum += (dQ->GetY()[i]/I0 - Qsum/I0)*(dQ->GetY()[i]/I0 - Qsum/I0);
226 U2sum += (dU->GetY()[i]/I0 - Usum/I0)*(dU->GetY()[i]/I0 - Usum/I0);
227 V2sum += (dV->GetY()[i]/I0 - Vsum/I0)*(dV->GetY()[i]/I0 - Vsum/I0);
236 double Qc = TMath::Abs(cQ->GetY()[Iend])/cI->GetY()[Iend];
237 double Uc = TMath::Abs(cU->GetY()[Iend])/cI->GetY()[Iend];
239 ret_err = U2sum * pow(.5 * Qc/((Qc * Qc) + (Uc * Uc)), 2) + Q2sum * pow(.5 * Uc/((Qc * Qc) + (Uc * Uc)), 2);
248 if (PoPerr) *PoPerr = sqrt(ret_err) * 180./TMath::Pi();
int computeWindowedAverage(double minIfrac, double *I=0, double *Q=0, double *U=0, double *V=0, double *PoPerr=0) const