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