PandaRoot
FTSCATracks.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 FTSCATRACKS_H
22 #define FTSCATRACKS_H
23 
24 #include "FTSCAHits.h"
25 #include "CAFunctionality.h"
26 
27 class FTSCATrack {
28 
29  //* Track's parameters
30 
31  public:
32  FTSCATrack() : fChi2(0), fNDF(-5), fIHits(), fLevel(0) { fIHits.reserve(PndFTSCAParameters::MaxNStations); };
33 
34  int NHits() const { return fIHits.size(); }
35 
36  vector<TES> &IHits() { return fIHits; }
37  const vector<TES> &IHits() const { return fIHits; }
38 
39  void RemoveHit(int iH)
40  {
41  fIHits.erase(IHits().begin() + iH);
42 #ifdef DRIFT_TUBES
43  fNDF--;
44 #else
45  fNDF -= 2;
46 #endif
47  }
48 
49  void AddHit(char iS, int iH)
50  {
51  fIHits.push_back(TES(iS, iH));
52 #ifdef DRIFT_TUBES
53  fNDF++;
54 #else
55  fNDF += 2;
56 #endif
57  }
58  void AddHit(const TES &iH)
59  {
60  fIHits.push_back(iH);
61 #ifdef DRIFT_TUBES
62  fNDF++;
63 #else
64  fNDF += 2;
65 #endif
66  }
67 
68  void AddHitsToTheBeginning(vector<TES> &hits)
69  {
70  fIHits.insert(IHits().begin(), hits.begin(), hits.end());
71 #ifdef DRIFT_TUBES
72  fNDF += hits.size();
73 #else
74  fNDF += 2 * hits.size();
75 #endif
76  }
77 
78  float &Chi2() { return fChi2; }
79  const float &Chi2() const { return fChi2; }
80  char &NDF() { return fNDF; }
81  const char &NDF() const { return fNDF; }
82  char &Level() { return fLevel; }
83  const char &Level() const { return fLevel; }
84 
85  static bool Compare(const FTSCATrack *a, const FTSCATrack *b)
86  {
87  // return (a->fIHits.size() > b->fIHits.size()) ||
88  // ( (a->fIHits.size() == b->fIHits.size()) &&
89  // ( (a->fIHits[0].s < b->fIHits[0].s) ||
90  // ( (a->fIHits[0].s == b->fIHits[0].s) && (a->fChi2 < b->fChi2)
91  // )
92  // )
93  // );
94  return (a->fIHits.size() > b->fIHits.size()) || ((a->fIHits.size() == b->fIHits.size()) && (a->fChi2 < b->fChi2));
95  }
96 
97  int NUsedHits(const FTSCAHits &hits) const
98  {
99  int nused = 0;
100  for (unsigned int iH = 0; iH < fIHits.size(); ++iH) {
101  const FTSCAHit &h = hits[fIHits[iH]];
102  if (h.IsUsed())
103  nused++;
104  }
105  return nused;
106  }
107 
108  void SetHitsAsUsed(FTSCAHits &hits) const
109  {
110  for (unsigned int iH = 0; iH < fIHits.size(); ++iH) {
111  FTSCAHit &h = hits[fIHits[iH]];
112  h.SetAsUsed();
113  }
114  }
115  // const PndFTSCATrackParam GetPar() { return fPar; }
116  const PndFTSCATrackParam Fit(const FTSCAHits &hits, const FTSCATarget &target, const PndFTSCAParam &caParam, bool dir = true, bool usePar = false,
117  PndFTSCATrackParam outerParam = PndFTSCATrackParam()); // dir = true - get outer parameters, dir = false - get inner ones
118 
119  const PndFTSCATrackParam Fit2Times(const FTSCAHits &hits, const FTSCATarget &target0, const PndFTSCAParam &caParam, bool dir);
120 
121  private:
122  float fChi2;
123  char fNDF;
124  vector<TES> fIHits; // index in FTSCATracks::fHits array
125 
126  char fLevel; // n of track segments
127  // PndFTSCATrackParam fPar;
128 };
129 
130 // typedef vector<FTSCATrack> FTSCATracks;
131 
132 class FTSCATracks;
133 
134 class FTSCATracks : public vector<FTSCATrack> {
135  public:
136  FTSCATracks(FTSCAHits *hits) : fHitsRef(hits){};
137 
138  const FTSCAHit &Hit(int iH, int iT) const { return (*fHitsRef)[(*this)[iT].IHits()[iH]]; }
139 
140  // selects tracks and marks all hits as used
141  void SelectAndSaveTracks(FTSCATracks &tracks);
142 
143  /*
144  static bool CompareByZ(const FTSCATrack *a, const FTSCATrack *b)
145  {
146  return (fHitsRef[(*a).IHits()[0]].X0() < fHitsRef[(*b).IHits()[0]].X0());
147  }
148  */
149 
150  FTSCAHits *HitsRef() { return fHitsRef; }
151  void SortTracksByZ();
152 
153  private:
154  FTSCAHits *fHitsRef;
155 };
156 
158 {
159  // sort (tracks.begin(), tracks.end(), CompareByZ);
160  FTSCATrack tempTrack;
161  // cout<<"before sort\n";
162  for (int i = this->size() - 1; i > -1; i--) {
163  for (int j = 1; j < i + 1; j++) {
164  FTSCATrack &t1 = (*this)[j - 1];
165  FTSCATrack &t2 = (*this)[j];
166 
167  // float diff11 = abs( (*(this->HitsRef()))[t1.IHits()[0]].X0() - 393.995) ;
168  // float diff21 = abs( (*(this->HitsRef()))[t2.IHits()[0]].X0() - 393.995) ;
169 
170  // float diff12 = abs( (*(this->HitsRef()))[t1.IHits()[t1.NHits()-1]].X0() - 467.84) ;
171  // float diff22 = abs( (*(this->HitsRef()))[t2.IHits()[t2.NHits()-1]].X0() - 467.84) ;
172  float diff12 = abs((*(this->HitsRef()))[t1.IHits()[0]].X0() - 467.84);
173  float diff22 = abs((*(this->HitsRef()))[t2.IHits()[0]].X0() - 467.84);
174  // sort tracks so that first come those which fit closer into the middle-region of FTS
175  if /*((diff11>diff21) &&*/ (diff12 > diff22)
176  // sort tracks so that first come those which are closer to PV
177  // if ( ( (*(this->HitsRef()))[t1.IHits()[0]].X0() > (*(this->HitsRef()))[t2.IHits()[0]].X0() ) )
178  {
179  tempTrack = (*this)[j - 1];
180  (*this)[j - 1] = (*this)[j];
181  (*this)[j] = tempTrack;
182  }
183  }
184  }
185  // cout<<"save tracks\n";
186 }
187 
189 {
190  vector<FTSCATrack *> vptrackcandidate; // vptrackcandidate - array of pointers to vtrackcandidate
191  vptrackcandidate.resize(size());
192 
193  for (unsigned int iC = 0; iC < size(); ++iC) {
194  vptrackcandidate[iC] = &((*this)[iC]);
195  }
196 
197  sort(vptrackcandidate.begin(), vptrackcandidate.end(), FTSCATrack::Compare);
198 
199  for (vector<FTSCATrack *>::iterator trIt = vptrackcandidate.begin(); trIt != vptrackcandidate.end(); ++trIt) {
200  FTSCATrack *tr = *trIt;
201 
202  if ((tr->NUsedHits(*fHitsRef) > 0))
203  continue; // don't allow tracks have shared hits. Track will be shorter, leave it for the next iteration
204  // if(tr->NHits()<10) continue;
205 #ifndef SAVE_ALL_CANDIDATES_DBG
206  tr->SetHitsAsUsed(*fHitsRef);
207 #endif
208 
209  tracks.push_back(*tr);
210  } // i_trackCandidate
211 }
212 
213 inline const PndFTSCATrackParam
214 FTSCATrack::Fit(const FTSCAHits &hits, const FTSCATarget &target0, const PndFTSCAParam &caParam, bool dir, bool usePar, PndFTSCATrackParam outerParam)
215 {
216  vector<TESV> iHits(NHits());
217  const int NTHits = iHits.size();
218  // cout<<"NTHits "<<NTHits<<endl;
219  for (unsigned short ihit = 0; ihit < NTHits; ihit++) {
220  // cout<<"IHits()[ihit] ista "<<int(IHits()[ihit].s)<<" number "<<IHits()[ihit].e<<endl;
221  iHits[ihit] = IHits()[ihit];
222  }
223 
225  // CAFunctionality::Fit( caParam, hits, param, iHits, target0, dir );
226  if (usePar) {
227  /*param.SetX(outerParam.X());
228  param.SetY(outerParam.Y());
229  param.SetZ(outerParam.Z());
230  param.SetTx(outerParam.Tx());
231  param.SetTy(outerParam.Ty());
232  param.SetQP(outerParam.QP());
233  for (int i=0; i<15; i++)
234  {
235  param.SetCov(i,outerParam.Cov(i));
236  }*/
237  param.SetQP(outerParam.QP());
238  CAFunctionality::FitUseParam(caParam, hits, param, iHits, target0, dir, usePar);
239  } else {
240  CAFunctionality::Fit(caParam, hits, param, iHits, target0, dir);
241  }
242 
243  PndFTSCATrackParam paramS(param, 0);
244  fChi2 = paramS.Chi2();
245  fNDF = paramS.NDF();
246  // fPar = paramS;
247  return paramS;
248 }
249 
250 inline const PndFTSCATrackParam FTSCATrack::Fit2Times(const FTSCAHits &hits, const FTSCATarget &target0, const PndFTSCAParam &caParam, bool dir)
251 {
252  vector<TESV> iHits(NHits());
253  const int NTHits = iHits.size();
254 
255  for (unsigned short ihit = 0; ihit < NTHits; ihit++) {
256  iHits[ihit] = IHits()[ihit];
257  }
258 
260 
261  CAFunctionality::Fit(caParam, hits, param, iHits, target0, dir);
262  param.SetNDF(-4);
263  param.SetChi2(0.f);
264  CAFunctionality::Fit(caParam, hits, param, iHits, target0, !dir);
265 
266  PndFTSCATrackParam paramS(param, 0);
267  fChi2 = paramS.Chi2();
268  fNDF = paramS.NDF();
269  return paramS;
270 }
271 
272 #endif
const FTSCAHit & Hit(int iH, int iT) const
Definition: FTSCATracks.h:138
FTSCAHits * HitsRef()
Definition: FTSCATracks.h:150
const char & Level() const
Definition: FTSCATracks.h:83
void RemoveHit(int iH)
Definition: FTSCATracks.h:39
const PndFTSCATrackParam Fit2Times(const FTSCAHits &hits, const FTSCATarget &target0, const PndFTSCAParam &caParam, bool dir)
Definition: FTSCATracks.h:250
void AddHitsToTheBeginning(vector< TES > &hits)
Definition: FTSCATracks.h:68
FTSCATracks(FTSCAHits *hits)
Definition: FTSCATracks.h:136
float_m FitUseParam(const PndFTSCAParam &caParam, const FTSCAHits &hits, PndFTSCATrackParamVector &param, const vector< TESV > &iHits, const FTSCATarget &target, bool dir, bool usePar=false, const float_m &mask=float_m(true))
int NUsedHits(const FTSCAHits &hits) const
Definition: FTSCATracks.h:97
unsigned int i
Definition: P4_F32vec4.h:33
int NHits() const
Definition: FTSCATracks.h:34
const PndFTSCATrackParam Fit(const FTSCAHits &hits, const FTSCATarget &target, const PndFTSCAParam &caParam, bool dir=true, bool usePar=false, PndFTSCATrackParam outerParam=PndFTSCATrackParam())
Definition: FTSCATracks.h:214
const vector< TES > & IHits() const
Definition: FTSCATracks.h:37
char & Level()
Definition: FTSCATracks.h:82
float_m Fit(const PndFTSCAParam &caParam, const FTSCAHits &hits, PndFTSCATrackParamVector &param, const vector< TESV > &iHits, const FTSCATarget &target, bool dir, const float_m &active=float_m(true))
void AddHit(char iS, int iH)
Definition: FTSCATracks.h:49
vector< TES > & IHits()
Definition: FTSCATracks.h:36
char & NDF()
Definition: FTSCATracks.h:80
void AddHit(const TES &iH)
Definition: FTSCATracks.h:58
void SortTracksByZ()
Definition: FTSCATracks.h:157
float & Chi2()
Definition: FTSCATracks.h:78
static bool Compare(const FTSCATrack *a, const FTSCATrack *b)
Definition: FTSCATracks.h:85
float f
Definition: P4_F32vec4.h:32
bool IsUsed() const
Definition: FTSCAHits.h:86
void SetHitsAsUsed(FTSCAHits &hits) const
Definition: FTSCATracks.h:108
void SetAsUsed()
Definition: FTSCAHits.h:87
const char & NDF() const
Definition: FTSCATracks.h:81
const float & Chi2() const
Definition: FTSCATracks.h:79
void SelectAndSaveTracks(FTSCATracks &tracks)
Definition: FTSCATracks.h:188
Definition: FTSCATES.h:24