11#ifndef __epsic_sample_h
12#define __epsic_sample_h
34 sample() { sample_size = 1; }
38 virtual Stokes<double> get_Stokes () = 0;
39 virtual Vector<4, double> get_mean () = 0;
40 virtual Matrix<4,4, double> get_covariance () = 0;
41 virtual Matrix<4,4, double> get_crosscovariance (
unsigned ilag) = 0;
43 Matrix<4,4, double> get_covariance (mode* s,
unsigned sample_size);
45 Matrix<4,4, double> get_crosscovariance (mode* s,
unsigned at_lag,
46 unsigned sample_size);
55 class single :
public sample
60 single (mode* s) { source = s; }
62 ~single () {
delete source; }
64 virtual Stokes<double> get_Stokes_instance ()
66 Spinor<double> e = source->get_field();
67 Vector<4, double> tmp;
68 compute_stokes (tmp, e);
72 Stokes<double> get_Stokes ()
74 Stokes<double> result;
75 for (
unsigned i=0; i<sample_size; i++)
76 result += get_Stokes_instance();
77 result /= sample_size;
81 Vector<4, double> get_mean ()
83 return source->get_mean();
86 Matrix<4,4, double> get_covariance ()
88 return sample::get_covariance (source, sample_size);
91 Matrix<4,4, double> get_crosscovariance (
unsigned ilag)
93 return sample::get_crosscovariance (source, ilag, sample_size);
105 class combination :
public sample
108 double intensity_covariance;
114 combination () { A =
new mode; B =
new mode; intensity_covariance = 0; }
116 virtual void set_normal (BoxMuller* n)
117 { A->set_normal(n); B->set_normal(n); }
120 void set_intensity_covariance (
double covar) { intensity_covariance = covar; }
122 Matrix<4,4, double> get_crosscovariance (
unsigned ilag)
125 return get_covariance();
127 return sample::get_crosscovariance (A, ilag, sample_size)
128 + sample::get_crosscovariance (B, ilag, sample_size);
138 class superposed :
public combination
140 Stokes<double> get_Stokes ();
141 Vector<4, double> get_mean ();
142 Matrix<4,4, double> get_covariance ();
151 class composite :
public combination
157 composite (
double fraction) { A_fraction = fraction; }
159 Stokes<double> get_Stokes ();
160 Vector<4, double> get_mean ();
161 Matrix<4,4, double> get_covariance ();
170 class disjoint :
public combination
176 disjoint (
double fraction) { A_fraction = fraction; }
178 Stokes<double> get_Stokes ();
179 Vector<4, double> get_mean ();
180 Matrix<4,4, double> get_covariance ();
181 Matrix<4,4, double> get_crosscovariance (
unsigned ilag);
191 class boxcar_sample :
public single
193 std::vector< Stokes<double> > instances;
200 instances.resize (smooth);
201 for (
unsigned i=1; i<smooth; i++)
202 instances[i] = single::get_Stokes_instance();
207 boxcar_sample (mode* s,
unsigned n) : single(s) { smooth = n; }
209 Stokes<double> get_Stokes_instance ()
211 if (instances.size() < smooth)
214 instances[current] = single::get_Stokes_instance();
215 current = (current + 1) % smooth;
217 Stokes<double> result;
218 for (
unsigned i=0; i<smooth; i++)
219 result += instances[i];
227 class coherent :
public combination
232 field_transformer* a_xform;
233 field_transformer* b_xform;
244 coherent (
double coherence);
245 void set_normal (BoxMuller*);
247 Stokes<double> get_Stokes ();
248 Vector<4, double> get_mean ();
249 Matrix<4,4, double> get_covariance ();