PandaRoot
FTSCAHits.h
Go to the documentation of this file.
1 //****************************************************************************
2 //* This file is part of PandaRoot. *
3 //* *
4 //* PandaRoot is distributed under the terms of the *
5 //* GNU General Public License (GPL) version 3, *
6 //* copied verbatim in the file "LICENSE". *
7 //* *
8 //* Copyright (C) 2006 - 2024 FAIR GmbH and copyright holders of PandaRoot *
9 //* The copyright holders are listed in the file "COPYRIGHTHOLDERS". *
10 //* The authors are listed in the file "AUTHORS". *
11 //****************************************************************************
12 
13 //-*- Mode: C++ -*-
14 // *****************************************************************************
15 // *
16 // @Autors: I.Kulakov; M.Pugach; M.Zyzak; I.Kisel *
17 // @e-mail: I.Kulakov@gsi.de; M.Pugach@gsi.de; M.Zyzak@gsi.de; I.Kisel@compeng.uni-frankfurt.de *
18 // *
19 // *****************************************************************************
20 
21 #ifndef FTSCAHITS_H
22 #define FTSCAHITS_H
23 
24 #include <vector>
25 using std::vector;
26 
27 #include "PndFTSCADef.h"
28 #include "PndFTSCAMath.h"
29 #include "PndFTSCAGBHit.h"
30 #include "FTSCATES.h"
31 #include "FTSCAStrip.h"
33 #include "PndFTSCAParameters.h"
34 
35 class FTSCAHit {
36  public:
37  FTSCAHit() {}
38  FTSCAHit(const PndFTSCAGBHit &h, int id)
39  : fIStation(h.IRow()), fId(id), fErr2X1(h.Err2X1()), fErrX12(h.ErrX12()), fErr2X2(h.Err2X2()),
40 #ifdef DRIFT_TUBES
41  fR(h.R()), fErr2R(h.Err2R()), fErr2A(h.Err2A()), fBeta(h.Beta()), fIsLeft(h.IsLeft()),
42 #endif
43  fAngle(h.Angle()), fFStripP(h.FStripP()), fBStripP(h.BStripP())
44  {
46  };
47  char IStation() const { return fIStation; }
48  void SetId(int id) { fId = id; }
49  int Id() const { return fId; };
50 
51 #ifdef DRIFT_TUBES
52  float_v X1Corrected(const PndFTSCATrackParamVector &p) const;
53 #endif
54 
55  float X0() const { return fX0; }
56  float X1() const { return fX1; }
57  float X2() const { return fX2; }
58 
59  float FStrip() const { return *fFStripP; };
60  float BStrip() const { return *fBStripP; };
61  FTSCAStrip *FStripP() const { return fFStripP; };
62  FTSCAStrip *BStripP() const { return fBStripP; };
63 
64  float Err2X1() const { return fErr2X1; }
65  float ErrX12() const { return fErrX12; }
66  float Err2X2() const { return fErr2X2; }
67 
68 #ifdef DRIFT_TUBES
69  float XWire0() const { return fX0; }
70  float XWire1() const { return fX1; }
71  float XWire2() const { return fX2; }
72 
73  float R() const { return fR; }
74  float RSigned() const { return fIsLeft ? -fR : fR; }
75  float Err2R() const { return fErr2R; }
76  float Err2A() const { return fErr2A; }
77  float Beta() const { return fBeta; }
78  bool IsLeft() const { return fIsLeft; }
79 
80  void SetR(float v) { fR = v; }
81 
82 #endif
83 
84  float Angle() const { return fAngle; }
85 
86  bool IsUsed() const { return fFStripP->IsUsed() || fBStripP->IsUsed(); }
87  void SetAsUsed()
88  {
91  }
92 
93  // comparison of hits on one station, needed for std::sort, returns true if a must be before b.
94  friend bool operator<(const FTSCAHit &a, const FTSCAHit &b)
95  {
96 #ifdef DRIFT_TUBES
97  if (a.fIStation >= PndFTSCAParameters::NMVDStations)
98  return (a.Angle() < b.Angle()) || ((a.Angle() == b.Angle()) && (a.X1() < b.X1()));
99  else
100  return a.X2() / abs(a.X0()) < b.X2() / abs(b.X0()); // check why x0 < 0 is possible
101 #else
102  return a.X2() / abs(a.X0()) < b.X2() / abs(b.X0()); // check why x0 < 0 is possible
103 #endif
104  }
105 
106  // private:
107  char fIStation; // index of the station
108  int fId; // index of hits in an input array
109 
110  float fX1, fX2, fX0; // local coordinates. fX2 is vertical, along radial direction
111  float fErr2X1, fErrX12, fErr2X2; // errors squared
112 
113 #ifdef DRIFT_TUBES
114  float fR;
115  float fErr2R;
116  float fErr2A; // error along the tube
117  float fBeta;
118  bool fIsLeft; // left side or right side
119 #endif
120 
121  float fAngle; // direction of hit station. Angle between normal and vertical axis. This angle defines local CS of the hit
122 
124 };
125 
126 #ifdef DRIFT_TUBES
127 inline float_v FTSCAHit::X1Corrected(const PndFTSCATrackParamVector &p) const
128 {
129  const float_v xCorr = fR - fR * rsqrt(1 - p.SinPhi() * p.SinPhi());
130  // xCorr /= cos(3.f/180.f*3.141592); // currently neglect stereo angle
131  return (fIsLeft) ? fX1 + xCorr : fX1 - xCorr;
132 }
133 #endif
134 
135 template <typename T>
137 
138 template <>
139 class FTSCAElementsOnStation<FTSCAHit> : public vector<FTSCAHit> {
140  public:
141  char &IStation() { return fISta; }
142  const char &IStation() const { return fISta; }
143 
144  private:
145  char fISta;
146 };
147 
148 class FTSCAHits { // same as in FTSCAStationArray
149  public:
150  typedef FTSCAHit T;
151 
153  {
154  assert((unsigned char)i < fElement.size());
155  return fElement[i];
156  }
158  {
159  assert((unsigned char)i < fElement.size());
160  return fElement[i];
161  }
163  {
164  assert((unsigned char)i < fElement.size());
165  return fElement[i];
166  }
168  {
169  assert((unsigned char)i < fElement.size());
170  return fElement[i];
171  }
173  {
174  assert((unsigned char)i < fElement.size());
175  return fElement[i];
176  }
177 
179  FTSCAHits(int nSta, int nHitsPerStation = 1)
180  {
181  fElement.resize(nSta);
182  for (int i = 0; i < nSta; ++i) {
183  fElement[i].IStation() = i;
184  fElement[i].reserve(nHitsPerStation);
185  }
186  }
187 
188  T &operator[](TES i) { return fElement[i.s][i.e]; }
189  const T &operator[](TES i) const { return fElement[i.s][i.e]; }
190 
191  char NStations() const { return fElement.size(); }
192 
193  void Add(const T &hit)
194  {
195  const int iSta = hit.IStation();
196  fElement[iSta].push_back(hit);
197  }
198 
199  void Sort()
200  {
201  for (unsigned int i = 0; i < fElement.size(); ++i) {
202  FTSCAElementsOnStation<T> &hits = fElement[i];
203  std::sort(hits.begin(), hits.end());
204  }
205  }
206 
207  void Clean()
208  { // remove used hits
209  for (unsigned int i = 0; i < fElement.size(); ++i) {
210  FTSCAElementsOnStation<T> &hits = fElement[i];
212  tmp.IStation() = i;
213  // tmp.reserve( hits.size() );
214  for (unsigned int iH = 0; iH < hits.size(); ++iH) {
215  if (hits[iH].IsUsed())
216  continue;
217  tmp.push_back(hits[iH]);
218  }
219  hits.clear();
220  hits = tmp;
221  tmp.clear();
222  }
223  }
224 
225  protected:
226  vector<FTSCAElementsOnStation<T>> fElement; // hits on stations
227 };
228 
229 #endif
const char & IStation() const
Definition: FTSCAHits.h:142
float fErrX12
Definition: FTSCAHits.h:111
FTSCAElementsOnStation< T > & operator[](char i)
Definition: FTSCAHits.h:167
const T & operator[](TES i) const
Definition: FTSCAHits.h:189
char fIStation
Definition: FTSCAHits.h:107
bool IsUsed() const
Definition: FTSCAStrip.h:32
friend bool operator<(const FTSCAHit &a, const FTSCAHit &b)
Definition: FTSCAHits.h:94
const FTSCAElementsOnStation< T > & operator[](char i) const
Definition: FTSCAHits.h:172
int Id() const
Definition: FTSCAHits.h:49
int fId
Definition: FTSCAHits.h:108
const char & IStation() const
FTSCAHit(const PndFTSCAGBHit &h, int id)
Definition: FTSCAHits.h:38
float FStrip() const
Definition: FTSCAHits.h:59
vector< FTSCAElementsOnStation< T > > fElement
Definition: FTSCAHits.h:226
FTSCAStrip * BStripP() const
Definition: FTSCAHits.h:62
float fErr2X2
Definition: FTSCAHits.h:111
float BStrip() const
Definition: FTSCAHits.h:60
float fX0
Definition: FTSCAHits.h:110
__m128 v
Definition: P4_F32vec4.h:15
const FTSCAElementsOnStation< T > & OnStation(char i) const
Definition: FTSCAHits.h:162
unsigned int i
Definition: P4_F32vec4.h:33
FTSCAStrip * FStripP() const
Definition: FTSCAHits.h:61
FTSCAHits(int nSta, int nHitsPerStation=1)
Definition: FTSCAHits.h:179
FTSCAStrip * fBStripP
Definition: FTSCAHits.h:123
void GetLocalX0X1X2(float &x0, float &x1, float &x2) const
char NStations() const
Definition: FTSCAHits.h:191
FTSCAElementsOnStation< T > & OnStation(char i)
Definition: FTSCAHits.h:157
float X2() const
Definition: FTSCAHits.h:57
friend F32vec4 rsqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:43
void SetAsUsed()
Definition: FTSCAStrip.h:34
float X1() const
Definition: FTSCAHits.h:56
float Angle() const
Definition: FTSCAHits.h:84
FTSCAHit()
Definition: FTSCAHits.h:37
float fX2
Definition: FTSCAHits.h:110
char s
Definition: FTSCATES.h:33
const FTSCAElementsOnStation< T > & OnStationConst(char i) const
Definition: FTSCAHits.h:152
float fAngle
Definition: FTSCAHits.h:121
bool IsUsed() const
Definition: FTSCAHits.h:86
float Err2X2() const
Definition: FTSCAHits.h:66
float ErrX12() const
Definition: FTSCAHits.h:65
void SetId(int id)
Definition: FTSCAHits.h:48
void SetAsUsed()
Definition: FTSCAHits.h:87
void Sort()
Definition: FTSCAHits.h:199
char IStation() const
Definition: FTSCAHits.h:47
void Add(const T &hit)
Definition: FTSCAHits.h:193
FTSCAStrip * fFStripP
Definition: FTSCAHits.h:123
float X0() const
Definition: FTSCAHits.h:55
void Clean()
Definition: FTSCAHits.h:207
FTSCAHit T
Definition: FTSCAHits.h:150
float fX1
Definition: FTSCAHits.h:110
unsigned int e
Definition: FTSCATES.h:34
float Err2X1() const
Definition: FTSCAHits.h:64
float fErr2X1
Definition: FTSCAHits.h:111
Definition: FTSCATES.h:24
T & operator[](TES i)
Definition: FTSCAHits.h:188