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