AntennaPositions.cc
1 #include "AntennaPositions.h"
2 #include "AnitaGeomTool.h"
3 #include "assert.h"
4 #include "FFTtools.h"
5 #include <map>
6 #include "TMutex.h"
7 
8 
9 #ifndef RAD2DEG
10 #define RAD2DEG (180/M_PI)
11 #endif
12 
13 #ifndef NUM_ANITAS
14 #define NUM_ANITAS 4
15 #endif
16 
17 
18 
19 static const UCorrelator::AntennaPositions *instances[NUM_ANITAS+1] = {0,0,0,0,0};
20 
21 
22 UCorrelator::AntennaPositions::AntennaPositions(int version)
23 {
24  v = version;
25  printf("AntennaPositions(%d)\n",version);
26 
27 #ifdef MULTIVERSION_ANITA_ENABLED
28  AnitaGeomTool * geom = AnitaGeomTool::Instance(version);
29 #else
30  int old_ver = AnitaVersion::get();
31  AnitaVersion::set(version);
33  AnitaVersion::set(old_ver);
34 #endif
35 
36 
37 
38  for (int pol = AnitaPol::kHorizontal; pol <= AnitaPol::kVertical; pol++)
39  {
40  for (int ant = 0; ant < NUM_SEAVEYS; ant++)
41  {
42 // printf("%d %d\n",pol,ant);
43 //
44  phiAnt[pol][ant] = geom->getAntPhiPositionRelToAftFore(ant,(AnitaPol::AnitaPol_t)pol) * RAD2DEG;
45  rAnt[pol][ant] = geom->getAntR(ant,(AnitaPol::AnitaPol_t) pol);
46  zAnt[pol][ant] = geom->getAntZ(ant,(AnitaPol::AnitaPol_t) pol);
47  }
48  }
49 
50 }
51 
52 UCorrelator::AntennaPositions::AntennaPositions(int version, AnitaGeomTool *geom)
53 {
54 
55  v = version;
56  printf("AntennaPositions(%d)\n",version);
57 
58  for (int pol = AnitaPol::kHorizontal; pol <= AnitaPol::kVertical; pol++)
59  {
60  for (int ant = 0; ant < NUM_SEAVEYS; ant++)
61  {
62 // printf("%d %d\n",pol,ant);
63 //
64  phiAnt[pol][ant] = geom->getAntPhiPositionRelToAftFore(ant,(AnitaPol::AnitaPol_t)pol) * RAD2DEG;
65  rAnt[pol][ant] = geom->getAntR(ant,(AnitaPol::AnitaPol_t) pol);
66  zAnt[pol][ant] = geom->getAntZ(ant,(AnitaPol::AnitaPol_t) pol);
67  }
68  }
69 
70 }
71 
72 int UCorrelator::AntennaPositions::getClosestAntennas(double phi, int N, int * closest, ULong64_t disallowed , AnitaPol::AnitaPol_t pol) const
73 {
74 
75  assert(N < NUM_SEAVEYS);
76 
77  int pol_ind = pol == AnitaPol::kHorizontal ? 0 : 1;
78  std::multimap<double,int> dphis;
79  for (int i = 0; i < NUM_SEAVEYS; i++)
80  {
81 
82  double dphi = disallowed & (1ul << i) ? 360 : fabs(FFTtools::wrap(phi-phiAnt[pol_ind][i], 360, 0));
83  dphis.insert(std::pair<double,int>(dphi,i));
84  }
85 
86  int Nused = 0;
87 
88 // printf("Closest antennas to %f: ",phi);
89  for (std::multimap<double,int>::const_iterator it = dphis.begin(); it !=dphis.end(); it++)
90  {
91 // printf(" %d %f\n", (*it).second, (*it).first);
92 
93  if ((*it).second >=360) break;
94  closest[Nused++] = (*it).second;
95  if (Nused == N) break;
96  }
97 // printf("\n");
98  return Nused;
99 }
100 
101 
102 
103 double UCorrelator::AntennaPositions::distance(int i, int j, AnitaPol::AnitaPol_t pol) const
104 {
105 
106 #ifdef MULTIVERSION_ANITA_ENABLED
108 #else
109  int old_ver = AnitaVersion::get();
110  AnitaVersion::set(v);
112  AnitaVersion::set(old_ver);
113 #endif
114 
115  double x0,y0,z0;
116  double x1,y1,z1;
117  geom->getAntXYZ(i,x0,y0,z0, pol);
118  geom->getAntXYZ(j,x1,y1,z1, pol);
119 
120 
121  double dx = x0-x1;
122  double dy = y0-y1;
123  double dz = z0-z1;
124  return sqrt( dx*dx + dy*dy + dz*dz);
125 
126 }
127 
128 static TMutex instance_lock;
129 
130 const UCorrelator::AntennaPositions * UCorrelator::AntennaPositions::instance(int v)
131 {
132  if (!v) v = AnitaVersion::get();
133 
134  const AntennaPositions * tmp = instances[v];
135  __asm__ __volatile__ ("" ::: "memory"); //memory fence!
136  if (!tmp)
137  {
138  instance_lock.Lock();
139  tmp = instances[v];
140  if (!tmp)
141  {
142  tmp = new AntennaPositions(v);
143  __asm__ __volatile__ ("" ::: "memory");
144  instances[v] = tmp;
145  }
146  instance_lock.UnLock();
147  }
148 
149  return instances[v];
150 
151 
152 }
153 
154 const UCorrelator::AntennaPositions * UCorrelator::AntennaPositions::instance(int v, AnitaGeomTool *geom)
155 {
156 
157  if (!v) v = AnitaVersion::get();
158 
159  const AntennaPositions * tmp = instances[v];
160  __asm__ __volatile__ ("" ::: "memory"); //memory fence!
161  if (!tmp)
162  {
163  instance_lock.Lock();
164  tmp = instances[v];
165  if (!tmp)
166  {
167  tmp = new AntennaPositions(v, geom);
168  __asm__ __volatile__ ("" ::: "memory");
169  instances[v] = tmp;
170  }
171  instance_lock.UnLock();
172  }
173 
174  return instances[v];
175 
176 
177 }
Double_t getAntPhiPositionRelToAftFore(Int_t ant, AnitaPol::AnitaPol_t pol=AnitaPol::kVertical)
get antenna phi position relative to ADU5 AFT-FORE line
Double_t getAntZ(Int_t ant, AnitaPol::AnitaPol_t pol=AnitaPol::kVertical)
get antenna z position
Double_t getAntR(Int_t ant, AnitaPol::AnitaPol_t pol=AnitaPol::kVertical)
get antenna r position
void getAntXYZ(Int_t ant, Double_t &x, Double_t &y, Double_t &z, AnitaPol::AnitaPol_t pol=AnitaPol::kVertical)
get antenna cartesian coordinates (from photogrammetry)
double zAnt[2][NUM_SEAVEYS]
int getClosestAntennas(double phi, int N, int *closest, ULong64_t disallowed=0, AnitaPol::AnitaPol_t pol=AnitaPol::kHorizontal) const
double rAnt[2][NUM_SEAVEYS]
void wrap(size_t N, double *vals, double period=360)
Definition: FFTtools.cxx:2851
double phiAnt[2][NUM_SEAVEYS]
Vertical Polarisation.
Horizontal Polarisation.
enum AnitaPol::EAnitaPol AnitaPol_t
Polarisation enumeration.
static AnitaGeomTool * Instance(int anita_version=0)
Instance generator. If version_number == 0, uses AnitaVersion::get();.
AnitaGeomTool – The ANITA Geometry Tool.
Definition: AnitaGeomTool.h:48