mode.h
1//-*-C++-*-
2/***************************************************************************
3 *
4 * Copyright (C) 2016 by Willem van Straten
5 * Licensed under the Academic Free License version 2.1
6 *
7 ***************************************************************************/
8
9// epsic/src/mode.h
10
11#ifndef __epsic_mode_h
12#define __epsic_mode_h
13
14#include "Stokes.h"
15#include "Spinor.h"
16#include "Matrix.h"
17#include "BoxMuller.h"
18#include "Minkowski.h"
19
20#include <iostream>
21
22namespace epsic
23{
24
25 /***************************************************************************
26 *
27 * a single source of electromagnetic radiation
28 *
29 ***************************************************************************/
30
31 class mode
32 {
33 public:
34 mode ();
35 virtual ~mode () { }
36
37 virtual void set_Stokes (const Stokes<double>& mean);
38 virtual Stokes<double> get_Stokes () { return mean; }
39
41 virtual Stokes<double> get_mean () const { return mean; }
42
44 virtual Matrix<4,4, double> get_covariance () const
45 { return Minkowski::outer (mean, mean); }
46
48 virtual Matrix<4,4, double> get_crosscovariance (unsigned ilag) const
49 { if (ilag>0) return 0; else return get_covariance(); }
50
52 virtual Spinor<double> get_field ();
53
55 virtual BoxMuller* get_normal () { return normal; }
56 virtual void set_normal (BoxMuller* n) { normal = n; }
57
59 const Jones<double>& get_polarizer () const { return polarizer; }
60
61 private:
62 Stokes<double> mean;
63 Jones<double> polarizer;
64
65 BoxMuller* normal;
66 double rms;
67 };
68
69 class mode_decorator : public mode
70 {
71 protected:
72 mode* source;
73
74 public:
75 mode_decorator (mode* s) { source = s; }
76 mode* get_source () { return source; }
77
78 void set_Stokes (const Stokes<double>& mean) { source->set_Stokes(mean); }
79 Stokes<double> get_Stokes () { return source->get_Stokes(); }
80
81 Matrix<4,4,double> get_covariance() const { return source->get_covariance(); }
82 Stokes<double> get_mean () const { return source->get_mean(); }
83
84 Spinor<double> get_field () { return source->get_field(); }
85 BoxMuller* get_normal () { return source->get_normal(); }
86 void set_normal (BoxMuller* n) { source->set_normal(n); }
87 };
88
89 class field_transformer : public mode_decorator
90 {
91 public:
92 field_transformer (mode* s) : mode_decorator (s) { }
93
94 Spinor<double> get_field () { return transform( source->get_field() ); }
95
96 virtual Spinor<double> transform ( const Spinor<double>& ) = 0;
97 };
98
99} // namespace epsic
100
101#endif // ! defined __epsic_mode_h

Generated using doxygen 1.14.0