PandaRoot
PndCATracks.h
Go to the documentation of this file.
1 //-*- Mode: C++ -*-
2 // *****************************************************************************
3 // *
4 // @Autors: I.Kulakov; M.Zyzak; I.Kisel *
5 // @e-mail: I.Kulakov@gsi.de; M.Zyzak@gsi.de; I.Kisel@compeng.uni-frankfurt.de *
6 // *
7 // *****************************************************************************
8 
9 #ifndef PNDCATRACKS_H
10 #define PNDCATRACKS_H
11 
12 #include "PndCAHits.h"
13 #include "PndCAFunctionality.h"
14 
15 class PndCATrack {
16  public:
17  PndCATrack() : fChi2(0), fNDF(-5), fIHits(), fLevel(0) { fIHits.reserve(PndCAParameters::MaxNStations); };
18 
19  int NHits() const { return fIHits.size(); }
20 
21  vector<PndCATES> &IHits() { return fIHits; }
22  const vector<PndCATES> &IHits() const { return fIHits; }
23 
24  void AddHit(char iS, int iH)
25  {
26  fIHits.push_back(PndCATES(iS, iH));
27  fNDF++;
28  }
29  void AddHit(const PndCATES &iH)
30  {
31  fIHits.push_back(iH);
32  fNDF++;
33  }
34 
35  float &Chi2() { return fChi2; }
36  const float &Chi2() const { return fChi2; }
37  char &NDF() { return fNDF; }
38  const char &NDF() const { return fNDF; }
39  char &Level() { return fLevel; }
40  const char &Level() const { return fLevel; }
41 
42  static bool Compare(const PndCATrack *a, const PndCATrack *b)
43  {
44  // return (a->fIHits.size() > b->fIHits.size()) ||
45  // ( (a->fIHits.size() == b->fIHits.size()) &&
46  // ( (a->fIHits[0].s < b->fIHits[0].s) ||
47  // ( (a->fIHits[0].s == b->fIHits[0].s) && (a->fChi2 < b->fChi2)
48  // )
49  // )
50  // );
51  return (a->fIHits.size() > b->fIHits.size()) || ((a->fIHits.size() == b->fIHits.size()) && (a->fChi2 < b->fChi2));
52  }
53 
54  int NUsedHits(const PndCAHits &hits) const
55  {
56  int nused = 0;
57  for (unsigned int iH = 0; iH < fIHits.size(); ++iH) {
58  const PndCAHit &h = hits[fIHits[iH]];
59  if (h.IsUsed())
60  nused++;
61  }
62  return nused;
63  }
64 
65  void SetHitsAsUsed(PndCAHits &hits) const
66  {
67  for (unsigned int iH = 0; iH < fIHits.size(); ++iH) {
68  PndCAHit &h = hits[fIHits[iH]];
69  h.SetAsUsed();
70  }
71  }
72 
73  const PndCATrackParam
74  Fit(const PndCAHits &hits, const PndCATarget &target, const PndCAParam &caParam, bool dir = true); // dir = true - get outer parameters, dir = false - get inner ones
75 
76  private:
77  float fChi2;
78  char fNDF;
79  vector<PndCATES> fIHits; // index in PndCATracks::fHits array
80 
81  char fLevel; // n of track segments
82 };
83 
84 // typedef vector<PndCATrack> PndCATracks;
85 
86 class PndCATracks;
87 
88 class PndCATracks : public vector<PndCATrack> {
89  public:
90  PndCATracks(PndCAHits *hits) : fHitsRef(hits){};
91 
92  const PndCAHit &Hit(int iH, int iT) const { return (*fHitsRef)[(*this)[iT].IHits()[iH]]; }
93 
94  // selects tracks and marks all hits as used
95  void SelectAndSaveTracks(PndCATracks &tracks);
96 
97  PndCAHits *HitsRef() { return fHitsRef; }
98 
99  private:
100  PndCAHits *fHitsRef;
101 };
102 
104 {
105  vector<PndCATrack *> vptrackcandidate; // vptrackcandidate - array of pointers to vtrackcandidate
106  vptrackcandidate.resize(size());
107 
108  for (unsigned int iC = 0; iC < size(); ++iC) {
109  vptrackcandidate[iC] = &((*this)[iC]);
110  }
111 
112  sort(vptrackcandidate.begin(), vptrackcandidate.end(), PndCATrack::Compare);
113 
114  for (vector<PndCATrack *>::iterator trIt = vptrackcandidate.begin(); trIt != vptrackcandidate.end(); ++trIt) {
115  PndCATrack *tr = *trIt;
116 
117  if (tr->NUsedHits(*fHitsRef) > 0)
118  continue; // don't allow tracks have shared hits. Track will be shorter, leave it for the next iteration
119 
120  tr->SetHitsAsUsed(*fHitsRef);
121 
122  tracks.push_back(*tr);
123  } // i_trackCandidate
124 }
125 
126 inline const PndCATrackParam PndCATrack::Fit(const PndCAHits &hits, const PndCATarget &target0, const PndCAParam &caParam, bool dir)
127 {
128 
129  vector<PndCATESV> iHits(NHits());
130  const int NTHits = iHits.size();
131 
132  for (unsigned short ihit = 0; ihit < NTHits; ihit++) {
133  iHits[ihit] = IHits()[ihit];
134  }
135  PndCATrackParamVector param;
136  PndCAFunctionality::Fit(caParam, hits, param, iHits, target0, dir);
137  PndCATrackParam paramS(param, 0);
138  fChi2 = paramS.Chi2();
139  fNDF = paramS.NDF();
140  return paramS;
141 }
142 
143 #endif
float_m Fit(const PndCAParam &caParam, const PndCAHits &hits, PndCATrackParamVector &param, const vector< PndCATESV > &iHits, const PndCATarget &target, bool dir, const float_m &active=float_m(true))
const vector< PndCATES > & IHits() const
Definition: PndCATracks.h:22
void SelectAndSaveTracks(PndCATracks &tracks)
Definition: PndCATracks.h:103
void SetHitsAsUsed(PndCAHits &hits) const
Definition: PndCATracks.h:65
int NHits() const
Definition: PndCATracks.h:19
float Chi2() const
char & NDF()
Definition: PndCATracks.h:37
const float & Chi2() const
Definition: PndCATracks.h:36
bool IsUsed() const
Definition: PndCAHits.h:54
static bool Compare(const PndCATrack *a, const PndCATrack *b)
Definition: PndCATracks.h:42
void SetAsUsed()
Definition: PndCAHits.h:55
int NUsedHits(const PndCAHits &hits) const
Definition: PndCATracks.h:54
const char & NDF() const
Definition: PndCATracks.h:38
PndCAHits * HitsRef()
Definition: PndCATracks.h:97
int NDF() const
const PndCAHit & Hit(int iH, int iT) const
Definition: PndCATracks.h:92
void AddHit(const PndCATES &iH)
Definition: PndCATracks.h:29
const char & Level() const
Definition: PndCATracks.h:40
vector< PndCATES > & IHits()
Definition: PndCATracks.h:21
const PndCATrackParam Fit(const PndCAHits &hits, const PndCATarget &target, const PndCAParam &caParam, bool dir=true)
Definition: PndCATracks.h:126
float & Chi2()
Definition: PndCATracks.h:35
void AddHit(char iS, int iH)
Definition: PndCATracks.h:24
PndCATracks(PndCAHits *hits)
Definition: PndCATracks.h:90
char & Level()
Definition: PndCATracks.h:39