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