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