FairRoot/PandaRoot
PndKFParticleFinder.cxx
Go to the documentation of this file.
1 //-----------------------------------------------------------
2 //-----------------------------------------------------------
3 
4 // Panda Headers ----------------------
6 #include "PndKFParticleFinder.h"
7 #include "PndPidCandidate.h"
8 #include "PndEmcBump.h"
9 #include "FairRunAna.h"
10 #include "FairField.h"
11 
12 //KF Particle headers
13 #include "KFParticleTopoReconstructor.h"
14 #include "KFPTrackVector.h"
15 #include "PndEmcBump.h"
16 
17 //ROOT headers
18 #include "TClonesArray.h"
19 #include "TStopwatch.h" //to measure the time
20 #include "TMath.h" //to calculate Prob function
21 
22 //c++ and std headers
23 #include <iostream>
24 #include <cmath>
25 #include <vector>
26 using std::vector;
27 
29  FairTask(name, iVerbose), fChargedTrackBranchName(""), fNeutralTrackBranchName(""), fChargedTrackArray(0), fNeutralTrackArray(0), fEmcBumps(0),
30  fTopoReconstructor(0), fPVFindMode(0), fPID(0)
31 {
32  fTopoReconstructor = new KFParticleTopoReconstructor;
33  // set default cuts
34  SetPrimaryProbCut(0.0001); // 0.01% to consider primary track as a secondary;
35 }
36 
38 {
40 }
41 
43 {
44  //Get ROOT Manager
45  FairRootManager* ioman= FairRootManager::Instance();
46 
47  if(ioman==0)
48  {
49  Error("PndKFParticleFinder::Init","RootManager not instantiated!");
50  return kERROR;
51  }
52 
53  // Get input collection
54  fChargedTrackArray=(TClonesArray*) ioman->GetObject(fChargedTrackBranchName);
55  if(fChargedTrackArray==0)
56  {
57  Error("PndKFParticleFinder::Init","track-array not found!");
58  return kERROR;
59  }
60 
61  if(!(fNeutralTrackBranchName.IsNull()))
62  {
63  fNeutralTrackArray = (TClonesArray*) ioman->GetObject(fNeutralTrackBranchName);
64  }
65  fEmcBumps = (TClonesArray*) ioman->GetObject("EmcBump");
66 
67  //set magnetic field for KF Particle
68  FairField* MF=FairRunAna::Instance()->GetField();
69  Double_t xyz[3]={0,0,0};
70  Double_t fieldValue[3];
71  MF->Field(xyz,fieldValue);
72  double Bz = fieldValue[2];
73  fTopoReconstructor->SetField(-Bz);
74 
75  return kSUCCESS;
76 }
77 
79 {
80  Int_t ntracks=0;//fChargedTrackArray->GetEntriesFast();
81 
82  vector<PndPidCandidate> vRTracks(fChargedTrackArray->GetEntriesFast());
83  vector<int> pdg(fChargedTrackArray->GetEntriesFast(), -1);
84  vector<int> trackId(fChargedTrackArray->GetEntriesFast(), -1);
85 
86  for(int iTr=0; iTr<fChargedTrackArray->GetEntriesFast(); iTr++)
87  {
89 
90  bool ok = 1;
91  ok = ok && std::isfinite(inTrack->GetPosition().x());
92  ok = ok && std::isfinite(inTrack->GetPosition().y());
93  ok = ok && std::isfinite(inTrack->GetPosition().z());
94  ok = ok && std::isfinite(inTrack->GetMomentum().x());
95  ok = ok && std::isfinite(inTrack->GetMomentum().y());
96  ok = ok && std::isfinite(inTrack->GetMomentum().z());
97 
98  float cov[21];
99  cov[ 0] = inTrack->GetErrorP7()[0];
100  cov[ 1] = inTrack->GetErrorP7()[1];
101  cov[ 2] = inTrack->GetErrorP7()[2];
102  cov[ 3] = inTrack->GetErrorP7()[3];
103  cov[ 4] = inTrack->GetErrorP7()[4];
104  cov[ 5] = inTrack->GetErrorP7()[5];
105  cov[ 6] = inTrack->GetErrorP7()[6];
106  cov[ 7] = inTrack->GetErrorP7()[7];
107  cov[ 8] = inTrack->GetErrorP7()[8];
108  cov[ 9] = inTrack->GetErrorP7()[18];
109  cov[10] = inTrack->GetErrorP7()[9];
110  cov[11] = inTrack->GetErrorP7()[10];
111  cov[12] = inTrack->GetErrorP7()[11];
112  cov[13] = inTrack->GetErrorP7()[19];
113  cov[14] = inTrack->GetErrorP7()[20];
114  cov[15] = inTrack->GetErrorP7()[12];
115  cov[16] = inTrack->GetErrorP7()[13];
116  cov[17] = inTrack->GetErrorP7()[14];
117  cov[18] = inTrack->GetErrorP7()[21];
118  cov[19] = inTrack->GetErrorP7()[22];
119  cov[20] = inTrack->GetErrorP7()[23];
120 
121 
122  for(unsigned short iC=0; iC<21; iC++)
123  ok = ok && std::isfinite(cov[iC]);
124 // ok = ok && (cov[0] < 100. && cov[0] > 0.)
125 // && (cov[2] < 100. && cov[2] > 0.)
126 // && (cov[5] < 100. && cov[5] > 0.)
127 // && (cov[9] < 100. && cov[9] > 0.)
128 // && (cov[14] < 100. && cov[14] > 0.)
129 // && (cov[20] < 100. && cov[20] > 0.);
130  ok = ok && (cov[0] > 0.)
131  && (cov[2] > 0.)
132  && (cov[5] > 0.)
133  && (cov[9] > 0.)
134  && (cov[14] > 0.)
135  && (cov[20] > 0.);
136 
137  ok = ok && inTrack->GetChiSquared() < 20*inTrack->GetDegreesOfFreedom();
138  if(!ok) continue;
139 
140  if(fPID)
141  {
142  if(fPID->GetPID()[iTr] == -2) continue;
143  pdg[ntracks] = fPID->GetPID()[iTr];
144  }
145  vRTracks[ntracks] = *inTrack;
146  trackId[ntracks] = iTr;
147 
148  ntracks++;
149  }
150 
151  vRTracks.resize(ntracks);
152  pdg.resize(ntracks);
153  trackId.resize(ntracks);
154 
155  KFPTrackVector tracks;
156  tracks.Resize(ntracks);
157  //fill vector with tracks
158  for(Int_t iTr=0; iTr<ntracks; iTr++)
159  {
160  PndPidCandidate *inTrack = (PndPidCandidate*)fChargedTrackArray->At(trackId[iTr]);
161 
162  float par[6] = {0.f};
163  par[0] = inTrack->GetPosition().x();
164  par[1] = inTrack->GetPosition().y();
165  par[2] = inTrack->GetPosition().z();
166  par[3] = inTrack->GetMomentum().x();
167  par[4] = inTrack->GetMomentum().y();
168  par[5] = inTrack->GetMomentum().z();
169 
170  Int_t q = inTrack->GetCharge();
171 
172  float cov[21];
173  cov[ 0] = inTrack->GetErrorP7()[0];
174  cov[ 1] = inTrack->GetErrorP7()[1];
175  cov[ 2] = inTrack->GetErrorP7()[2];
176  cov[ 3] = inTrack->GetErrorP7()[3];
177  cov[ 4] = inTrack->GetErrorP7()[4];
178  cov[ 5] = inTrack->GetErrorP7()[5];
179  cov[ 6] = inTrack->GetErrorP7()[6];
180  cov[ 7] = inTrack->GetErrorP7()[7];
181  cov[ 8] = inTrack->GetErrorP7()[8];
182  cov[ 9] = inTrack->GetErrorP7()[18];
183  cov[10] = inTrack->GetErrorP7()[9];
184  cov[11] = inTrack->GetErrorP7()[10];
185  cov[12] = inTrack->GetErrorP7()[11];
186  cov[13] = inTrack->GetErrorP7()[19];
187  cov[14] = inTrack->GetErrorP7()[20];
188  cov[15] = inTrack->GetErrorP7()[12];
189  cov[16] = inTrack->GetErrorP7()[13];
190  cov[17] = inTrack->GetErrorP7()[14];
191  cov[18] = inTrack->GetErrorP7()[21];
192  cov[19] = inTrack->GetErrorP7()[22];
193  cov[20] = inTrack->GetErrorP7()[23];
194 
195  for(Int_t iP=0; iP<6; iP++)
196  tracks.SetParameter(par[iP], iP, iTr);
197  for(Int_t iC=0; iC<21; iC++)
198  tracks.SetCovariance(cov[iC], iC, iTr);
199  tracks.SetId(trackId[iTr], iTr);
200  if(fPID)
201  tracks.SetPDG(fPID->GetPID()[iTr], iTr);
202  else
203  tracks.SetPDG(-1, iTr);
204  tracks.SetQ(q, iTr);
205 
206  if(fPVFindMode == 0)
207  {
208  tracks.SetPVIndex(-1, iTr);
209  }
210  else
211  tracks.SetPVIndex(-1, iTr);
212  }
213 
214 
215  //fill vector with Emc clusters
216  KFPEmcCluster emcClusters;
218  {
219  int nClusters = 0;
220  vector<int> clusterId(fNeutralTrackArray->GetEntriesFast());
221  for(int iClust=0; iClust<fNeutralTrackArray->GetEntriesFast(); iClust++)
222  {
223  PndPidCandidate *inTrack = (PndPidCandidate*)fNeutralTrackArray->At(iClust);
224  int iBump = inTrack->GetEmcIndex();
225  PndEmcBump *inBump = (PndEmcBump*) fEmcBumps->At(iBump);
226 
227  if(inTrack->GetEmcQuality()<400) continue;
228  if(inBump->energy() < 0.02) continue;
229 
230  clusterId[nClusters] = iClust;
231  nClusters++;
232  }
233 
234  emcClusters.Resize(nClusters);
235  for(int iClust2=0; iClust2<nClusters; iClust2++)
236  {
237  int iClust = clusterId[iClust2];
238  PndPidCandidate *inTrack = (PndPidCandidate*)fNeutralTrackArray->At(iClust);
239  int iBump = inTrack->GetEmcIndex();
240  PndEmcBump *inBump = (PndEmcBump*) fEmcBumps->At(iBump);
241 
242  float par[4] = {0.f};
243  par[0] = inTrack->GetLastHit().x();
244  par[1] = inTrack->GetLastHit().y();
245  par[2] = inTrack->GetLastHit().z();
246  par[3] = inBump->energy();
247  float cov[10] = {0.f};
248  cov[ 0] = inTrack->GetErrorP7()[0];
249  cov[ 1] = inTrack->GetErrorP7()[1];
250  cov[ 2] = inTrack->GetErrorP7()[2];
251  cov[ 3] = inTrack->GetErrorP7()[3];
252  cov[ 4] = inTrack->GetErrorP7()[4];
253  cov[ 5] = inTrack->GetErrorP7()[5];
254  cov[ 6] = inTrack->GetErrorP7()[15];
255  cov[ 7] = inTrack->GetErrorP7()[16];
256  cov[ 8] = inTrack->GetErrorP7()[17];
257  cov[ 9] = inTrack->GetErrorP7()[27];
258 
259  for(Int_t iP=0; iP<4; iP++)
260  emcClusters.SetParameter(par[iP], iP, iClust2);
261  for(Int_t iC=0; iC<10; iC++)
262  emcClusters.SetCovariance(cov[iC], iC, iClust2);
263  emcClusters.SetId(iClust+fChargedTrackArray->GetEntriesFast(), iClust2);
264  }
265  }
266 
267  TStopwatch timer;
268  timer.Start();
269 
270  fTopoReconstructor->Init(tracks);
272  {
273  fTopoReconstructor->SetEmcClusters(&emcClusters);
274  }
275 
276  if(fPVFindMode == 0)
277  {
278  KFPVertex primVtx_tmp;
279  primVtx_tmp.SetXYZ(0,0,0);
280  primVtx_tmp.SetCovarianceMatrix( 0,0,0,0,0,0 );
281  primVtx_tmp.SetNContributors( 0 );
282  primVtx_tmp.SetChi2( -100 );
283 
284  vector<int> pvTrackIds;
285  KFVertex pv(primVtx_tmp);
286  fTopoReconstructor->AddPV(pv, pvTrackIds);
287  }
288  else if(fPVFindMode == 1)
289  fTopoReconstructor->ReconstructPrimVertex();
290  else if(fPVFindMode == 2)
291  fTopoReconstructor->ReconstructPrimVertex(0);
292 
293  fTopoReconstructor->SortTracks();
294  fTopoReconstructor->ReconstructParticles();
295 
296  timer.Stop();
297  fTopoReconstructor->SetTime(timer.RealTime());
298 }
299 
300 double PndKFParticleFinder::InversedChi2Prob(double p, int ndf) const
301 {
302  double epsilon = 1.e-14;
303  double chi2Left = 0.f;
304  double chi2Right = 10000.f;
305 
306  double probLeft = p - TMath::Prob(chi2Left, ndf);
307 
308  double chi2Centr = (chi2Left+chi2Right)/2.f;
309  double probCentr = p - TMath::Prob( chi2Centr, ndf);
310 
311  while( TMath::Abs(chi2Right-chi2Centr)/chi2Centr > epsilon )
312  {
313  if(probCentr * probLeft > 0.f)
314  {
315  chi2Left = chi2Centr;
316  probLeft = probCentr;
317  }
318  else
319  {
320  chi2Right = chi2Centr;
321  }
322 
323  chi2Centr = (chi2Left+chi2Right)/2.f;
324  probCentr = p - TMath::Prob( chi2Centr, ndf);
325  }
326 
327  return chi2Centr;
328 }
329 
331 {
332  fTopoReconstructor->SetChi2PrimaryCut( InversedChi2Prob(prob, 2) );
333 }
334 
PndKFParticleFinder(const char *name="PndKFParticleFinder", Int_t iVerbose=0)
Double_t p
Definition: anasim.C:58
Int_t GetCharge() const
Float_t GetEmcQuality() const
Int_t GetDegreesOfFreedom() const
TClonesArray * fNeutralTrackArray
PndKFParticleFinderPID * fPID
const std::vector< int > & GetPID() const
TString fNeutralTrackBranchName
Name of the input TCA.
Double_t par[3]
void SetChi2(float chi)
Definition: KFPVertex.h:44
void SetNContributors(int nc)
Definition: KFPVertex.h:46
const Float_t * GetErrorP7() const
Int_t GetEmcIndex() const
static T Abs(const T &x)
Definition: PndCAMath.h:39
Float_t GetChiSquared() const
Double_t
float_m ok
int fPID
Definition: poormantracks.C:16
TStopwatch timer
Definition: hit_dirc.C:51
void SetXYZ(float *position)
Definition: KFPVertex.h:39
TFile * f
Definition: bump_analys.C:12
TVector3 GetLastHit() const
TClonesArray * fEmcBumps
TString name
TVector3 GetPosition() const
double InversedChi2Prob(double p, int ndf) const
virtual Double_t energy() const
virtual void Exec(Option_t *opt)
ClassImp(PndAnaContFact)
Int_t iVerbose
TVector3 GetMomentum() const
KFParticleTopoReconstructor * fTopoReconstructor
void SetCovarianceMatrix(float *C)
Definition: KFPVertex.h:48
represents a reconstructed (splitted) emc cluster
Definition: PndEmcBump.h:34
TClonesArray * fChargedTrackArray
Name of the input TCA.
void SetPrimaryProbCut(float prob)
virtual InitStatus Init()