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 ();