AntennaType.h
Go to the documentation of this file.
1 #ifndef _rdet_AntennaType_h_
2 #define _rdet_AntennaType_h_
3 
4 #include <utl/Validated.h>
5 #include <det/Detector.h>
6 
7 #include <boost/tuple/tuple.hpp>
8 #include <boost/tuple/tuple_comparison.hpp> // operator<() needed for keys in maps
9 #include <vector>
10 #include <map>
11 #include <string>
12 #include <complex>
13 
14 
15 namespace rdet {
16 
17  class RDetector;
18 
19 
28  typedef boost::tuple<int, int, int> ResponseKey;
29 
30 
32  std::complex<float> Theta;
33  std::complex<float> Phi;
34  };
35 
36 
37  struct AntennaPattern {
38  int nPhi = 0;
39  int nTheta = 0;
40  int nFrequency = 0;
41  double phi_lower_bound = 0;
42  double phi_upper_bound = 0;
43  double theta_lower_bound = 0;
44  double theta_upper_bound = 0;
47  std::vector<double> frequencies;
48  std::vector<double> thetaAngles;
49  std::vector<double> phiAngles;
50  std::vector<double> meanTransfer;
51  std::map<ResponseKey, VectorEffectiveLength> AntennaResponse;
52  };
53 
54 
65  class AntennaType {
66 
67  private:
68  AntennaType& operator=(const AntennaType&); // forbid assignment
69  AntennaType(const AntennaType&); // forbid copying
70  AntennaType(const std::string& fAntennaType_);
73 
74  friend class RDetector; //we will have to decide if the AntennaType object will be held at the instance of the RDetector
75  friend class Channel; //or at the level of the channels
76  friend class utl::Validated<AntennaType>;
77 
79  mutable std::string fAntennaType;
80 
82  std::pair<std::complex<double>, std::complex<double>>
83  GetElectricFieldResponse(const double theta, const double phi, const double freq, const std::string& interpolationMode);
84 
86  double GetIntegratedEffectiveAntennaHeight(const double freq);
87 
88  double CalculateIntegratedEffectiveAntennaHeight(const std::map<ResponseKey, VectorEffectiveLength>& antennaResponse,
89  const int iFreq, const int nTheta, const int nPhi);
90 
91  // new antenna pattern interpolation
92  static std::map<std::string, AntennaPattern> fgAntennaPattern; // global variable that holds the antenna pattern
93 
94  void BufferAntennaPattern();
95 
96  std::pair<std::complex<double>, std::complex<double>>
97  GetElectricFieldResponse_lookup(const double fTheta, const double fPhi, const double fFreq);
98 
99  std::pair<std::complex<double>, std::complex<double>>
100  GetElectricFieldResponse_LinearInterpolation(const double fTheta, const double fPhi, const double fFreq);
101 
102  double InterpolateLinear(const double x, const double x_low, const double x_up, const double y_low, const double y_up);
103 
104  std::complex<float>
105  InterpolateLinear(const float x, const float x_low, const float x_up,
106  const std::complex<float>& y_low, const std::complex<float>& y_up);
107 
109  InterpolateLinear(const double x, const double x_low, const double x_up,
110  const VectorEffectiveLength& VEL_low, const VectorEffectiveLength& VEL_up);
111 
112  std::pair<std::complex<double>, std::complex<double>>
114 
115  // Helper method to do the redundant work of preparing requests for AntennaType data,
116  // sending it to the manager and reporting any errors.
117  template<typename T>
118  const T&
119  GetAntennaData(utl::Validated<T>& requestedData, const std::string& antennaProp,
120  const std::string& propIndex = "")
121  const
122  {
123  if (!requestedData.IsValid()) {
124  det::VManager::IndexMap propIndexMap;
125  // this is not general, but fit the needs of the AntennaType class up to now:
126  if (!propIndex.empty())
127  propIndexMap["idfreq"] = propIndex;
128 
129  // Fetch the data:
130  const det::VManager& manager = det::Detector::GetInstance().GetRManagerRegister();
131  const det::VManager::Status foundFlag =
132  manager.GetData(requestedData.Get(), antennaProp, fAntennaType, propIndexMap);
133  // just result flag
134  if (foundFlag == det::VManager::eNotFound)
135  NotFoundAndExit(antennaProp + " " + propIndex);
136  requestedData.SetValid();
137  }
138  return requestedData.Get();
139  }
140 
141  // Called by GetAntennaData:
142  void NotFoundAndExit(const std::string& msg) const;
143 
144  };
145 
146 }
147 
148 
149 #endif
const T & GetAntennaData(utl::Validated< T > &requestedData, const std::string &antennaProp, const std::string &propIndex="") const
Definition: AntennaType.h:119
std::pair< std::complex< double >, std::complex< double > > GetElectricFieldResponse_LinearInterpolation(const double fTheta, const double fPhi, const double fFreq)
Definition: AntennaType.cc:305
static std::map< std::string, AntennaPattern > fgAntennaPattern
Definition: AntennaType.h:92
std::complex< float > Theta
Definition: AntennaType.h:32
std::map< ResponseKey, VectorEffectiveLength > AntennaResponse
Definition: AntennaType.h:51
int freq
Definition: dump1090.h:244
std::pair< std::complex< double >, std::complex< double > > GetElectricFieldResponse(const double theta, const double phi, const double freq, const std::string &interpolationMode)
Get GetElectricFieldResponse returns the response of the antenna for a certain incoming direction of ...
Definition: AntennaType.cc:190
double GetIntegratedEffectiveAntennaHeight(const double freq)
Get GetIntegratedEffectiveAntennaHeight returns the response of the antenna integrated over the full ...
Definition: AntennaType.cc:406
Detector description interface for Channel-related data.
Interface for detector managers.
Definition: VManager.h:115
Interface to access antenna characteristics.
Definition: AntennaType.h:65
Wrapper class for initially unset data.
Definition: ResponseMap.h:17
Detector description interface for RDetector-related data.
Definition: RDetector.h:46
double CalculateIntegratedEffectiveAntennaHeight(const std::map< ResponseKey, VectorEffectiveLength > &antennaResponse, const int iFreq, const int nTheta, const int nPhi)
Definition: AntennaType.cc:441
virtual Status GetData(double &returnData, const std::string &componentProperty, const std::string &componentName, const IndexMap &componentIndex) const =0
std::pair< std::complex< double >, std::complex< double > > GetElectricFieldResponse_lookup(const double fTheta, const double fPhi, const double fFreq)
Definition: AntennaType.cc:277
std::vector< double > meanTransfer
Definition: AntennaType.h:50
bool IsValid() const
Definition: Validated.h:64
std::vector< double > frequencies
Definition: AntennaType.h:47
std::string fAntennaType
The AntennaType has to know its id string which is kept here. This is needed as the AntennaType insta...
Definition: AntennaType.h:79
double frequency_upper_bound
Definition: AntennaType.h:46
boost::tuple< int, int, int > ResponseKey
Definition: AntennaType.h:17
std::pair< std::complex< double >, std::complex< double > > GetComplexRepresentationOfVectorEffectiveLength(const VectorEffectiveLength &vel)
Definition: AntennaType.cc:212
void BufferAntennaPattern()
Definition: AntennaType.cc:26
std::complex< float > Phi
Definition: AntennaType.h:33
std::map< std::string, std::string > IndexMap
Definition: VManager.h:133
std::vector< double > thetaAngles
Definition: AntennaType.h:48
void SetValid(const bool valid=true)
Definition: Validated.h:66
double InterpolateLinear(const double x, const double x_low, const double x_up, const double y_low, const double y_up)
Definition: AntennaType.cc:219
std::vector< double > phiAngles
Definition: AntennaType.h:49
double frequency_lower_bound
Definition: AntennaType.h:45
AntennaType & operator=(const AntennaType &)
void NotFoundAndExit(const std::string &msg) const
Definition: AntennaType.cc:457
Status
Specifies success or (eventually) various possible failure modes.
Definition: VManager.h:127

, generated on Tue Sep 26 2023.