EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
TrkrClusterv2.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file TrkrClusterv2.cc
1 
7 #include "TrkrClusterv2.h"
8 
9 #include <cmath>
10 #include <utility> // for swap
11 
12 namespace
13 {
14 
15  // square convenience function
16  template<class T> inline constexpr T square( const T& x ) { return x*x; }
17 
18  // get unique index in cov. matrix array from i and j
19  inline unsigned int covarIndex(unsigned int i, unsigned int j)
20  {
21  if (i > j) std::swap(i, j);
22  return i + 1 + (j + 1) * (j) / 2 - 1;
23  }
24 
25  // rotate size or covariant matrix to polar coordinates and return the phi component
26  template<float (TrkrClusterv2::*accessor)(unsigned int, unsigned int) const>
27  float rotate( const TrkrClusterv2* cluster )
28  {
29  const auto phi = -std::atan2(cluster->getY(), cluster->getX());
30  const auto cosphi = std::cos(phi);
31  const auto sinphi = std::sin(phi);
32 
33  return
34  square(sinphi)*(cluster->*accessor)(0,0) +
35  square(cosphi)*(cluster->*accessor)(1,1) +
36  2.*cosphi*sinphi*(cluster->*accessor)(0,1);
37  }
38 
39 }
40 
42  : m_cluskey(TrkrDefs::CLUSKEYMAX)
43  , m_subsurfkey(TrkrDefs::SUBSURFKEYMAX)
44  , m_isGlobal(true)
45  , m_adc(0xFFFFFFFF)
46 {
47  for (int i = 0; i < 3; ++i) m_pos[i] = NAN;
48 
49  for (int j = 0; j < 6; ++j)
50  {
51  m_err[j] = NAN;
52  m_size[j] = NAN;
53  }
54  for (int i = 0; i < 2; i++)
55  {
56  m_local[i] = NAN;
57  for(int j = 0; j < 2; j ++)
58  {
59  m_actsLocalErr[i][j] = NAN;
60  }
61  }
62 }
63 
64 void TrkrClusterv2::identify(std::ostream& os) const
65 {
66  os << "---TrkrClusterv2--------------------" << std::endl;
67  os << "clusid: " << getClusKey() << std::dec << std::endl;
68 
69  os << " (x,y,z) = (" << getPosition(0);
70  os << ", " << getPosition(1) << ", ";
71  os << getPosition(2) << ") cm";
72  if (m_isGlobal)
73  os << " - global coordinates" << std::endl;
74  else
75  os << " - local coordinates" << std::endl;
76 
77  os << " adc = " << getAdc() << std::endl;
78 
79  os << " size phi = " << getPhiSize();
80  os << " cm, size z = " << getZSize() << " cm" << std::endl;
81 
82  os << " ( ";
83  os << getSize(0, 0) << " , ";
84  os << getSize(0, 1) << " , ";
85  os << getSize(0, 2) << " )" << std::endl;
86  os << " size = ( ";
87  os << getSize(1, 0) << " , ";
88  os << getSize(1, 1) << " , ";
89  os << getSize(1, 2) << " )" << std::endl;
90  os << " ( ";
91  os << getSize(2, 0) << " , ";
92  os << getSize(2, 1) << " , ";
93  os << getSize(2, 2) << " )" << std::endl;
94 
95  os << " ( ";
96  os << getError(0, 0) << " , ";
97  os << getError(0, 1) << " , ";
98  os << getError(0, 2) << " )" << std::endl;
99  os << " err = ( ";
100  os << getError(1, 0) << " , ";
101  os << getError(1, 1) << " , ";
102  os << getError(1, 2) << " )" << std::endl;
103  os << " ( ";
104  os << getError(2, 0) << " , ";
105  os << getError(2, 1) << " , ";
106  os << getError(2, 2) << " )" << std::endl;
107 
108  os << std::endl;
109  os << "-----------------------------------------------" << std::endl;
110 
111  return;
112 }
113 
115 {
116  if (m_cluskey == TrkrDefs::CLUSKEYMAX) return 0;
117  for (int i = 0; i < 3; ++i)
118  {
119  if (std::isnan(getPosition(i))) return 0;
120  }
121  if (m_adc == 0xFFFFFFFF) return 0;
122  for (int j = 0; j < 3; ++j)
123  {
124  for (int i = j; i < 3; ++i)
125  {
126  if (std::isnan(getSize(i, j))) return 0;
127  if (std::isnan(getError(i, j))) return 0;
128  }
129  }
130 
131  return 1;
132 }
133 
135 {
136  // do nothing if copying onto oneself
137  if( this == &source ) return;
138 
139  // parent class method
140  TrkrCluster::CopyFrom( source );
141 
142  setClusKey( source.getClusKey() );
143  setX( source.getX() );
144  setY( source.getY() );
145  setZ( source.getZ() );
146  m_isGlobal = source.isGlobal();
147  setAdc( source.getAdc() );
148 
149  for (int j = 0; j < 3; ++j)
150  for (int i = 0; i < 3; ++i)
151  {
152  setSize(i, j, source.getSize(i, j));
153  setError(i, j, source.getError(i, j));
154  }
155 
156  setSubSurfKey( source.getSubSurfKey() );
157  setLocalX( source.getLocalX() );
158  setLocalY( source.getLocalY() );
159 
160  for (int j = 0; j < 2; ++j)
161  for (int i = 0; i < 2; ++i)
162  { setActsLocalError(i, j, source.getActsLocalError(i, j)); }
163 }
164 
165 void TrkrClusterv2::setSize(unsigned int i, unsigned int j, float value)
166 {
167  m_size[covarIndex(i, j)] = value;
168  return;
169 }
170 
171 float TrkrClusterv2::getSize(unsigned int i, unsigned int j) const
172 { return m_size[covarIndex(i, j)]; }
173 
174 void TrkrClusterv2::setError(unsigned int i, unsigned int j, float value)
175 {
176  m_err[covarIndex(i, j)] = value;
177  return;
178 }
179 
180 float TrkrClusterv2::getError(unsigned int i, unsigned int j) const
181 { return m_err[covarIndex(i, j)]; }
182 
184 { return 2*std::sqrt(rotate<&TrkrClusterv2::getSize>(this)); }
185 
187 { return 2.*sqrt(getSize(2, 2)); }
188 
190 {
191  const float rad = std::sqrt(square(m_pos[0])+square(m_pos[1]));
192  if (rad > 0) return getRPhiError() / rad;
193  return 0;
194 }
195 
197 { return std::sqrt(rotate<&TrkrClusterv2::getError>( this )); }
198 
200 { return std::sqrt(getError(2, 2)); }
201 
202 void TrkrClusterv2::setActsLocalError(unsigned int i, unsigned int j,
203  float value)
204 {
205  m_actsLocalErr[i][j] = value;
206 }