FairRoot/PandaRoot
Public Member Functions | Private Member Functions | Private Attributes | List of all members
PndKFParticleFinder Class Reference

#include <PndKFParticleFinder.h>

Inheritance diagram for PndKFParticleFinder:

Public Member Functions

 PndKFParticleFinder (const char *name="PndKFParticleFinder", Int_t iVerbose=0)
 
 ~PndKFParticleFinder ()
 
void SetPVToZero ()
 
void ReconstructSinglePV ()
 
void RconstructMultiplePV ()
 
void SetChargedTrackBranchName (const TString &name)
 
void SetNeutralTrackBranchName (const TString &name)
 
virtual InitStatus Init ()
 
virtual void Exec (Option_t *opt)
 
const KFParticleTopoReconstructor * GetTopoReconstructor () const
 
void SetPIDInformation (PndKFParticleFinderPID *pid)
 
void SetPrimaryProbCut (float prob)
 

Private Member Functions

double InversedChi2Prob (double p, int ndf) const
 
const PndKFParticleFinderoperator= (const PndKFParticleFinder &)
 
 PndKFParticleFinder (const PndKFParticleFinder &)
 
 ClassDef (PndKFParticleFinder, 1)
 

Private Attributes

TString fChargedTrackBranchName
 
TString fNeutralTrackBranchName
 Name of the input TCA. More...
 
TClonesArray * fChargedTrackArray
 Name of the input TCA. More...
 
TClonesArray * fNeutralTrackArray
 
TClonesArray * fEmcBumps
 
KFParticleTopoReconstructor * fTopoReconstructor
 
int fPVFindMode
 
PndKFParticleFinderPIDfPID
 

Detailed Description

Definition at line 17 of file PndKFParticleFinder.h.

Constructor & Destructor Documentation

PndKFParticleFinder::PndKFParticleFinder ( const char *  name = "PndKFParticleFinder",
Int_t  iVerbose = 0 
)

Definition at line 28 of file PndKFParticleFinder.cxx.

References fTopoReconstructor, and SetPrimaryProbCut().

28  :
31 {
32  fTopoReconstructor = new KFParticleTopoReconstructor;
33  // set default cuts
34  SetPrimaryProbCut(0.0001); // 0.01% to consider primary track as a secondary;
35 }
TClonesArray * fNeutralTrackArray
PndKFParticleFinderPID * fPID
TString fNeutralTrackBranchName
Name of the input TCA.
TClonesArray * fEmcBumps
TString name
Int_t iVerbose
KFParticleTopoReconstructor * fTopoReconstructor
TClonesArray * fChargedTrackArray
Name of the input TCA.
void SetPrimaryProbCut(float prob)
PndKFParticleFinder::~PndKFParticleFinder ( )

Definition at line 37 of file PndKFParticleFinder.cxx.

References fTopoReconstructor.

38 {
40 }
KFParticleTopoReconstructor * fTopoReconstructor
PndKFParticleFinder::PndKFParticleFinder ( const PndKFParticleFinder )
private

Member Function Documentation

PndKFParticleFinder::ClassDef ( PndKFParticleFinder  ,
 
)
private
void PndKFParticleFinder::Exec ( Option_t *  opt)
virtual

Definition at line 78 of file PndKFParticleFinder.cxx.

References PndEmcCluster::energy(), fChargedTrackArray, fEmcBumps, fNeutralTrackArray, fPID, fPVFindMode, fTopoReconstructor, PndPidCandidate::GetCharge(), PndPidCandidate::GetChiSquared(), PndPidCandidate::GetDegreesOfFreedom(), PndPidCandidate::GetEmcIndex(), PndPidCandidate::GetEmcQuality(), PndPidCandidate::GetErrorP7(), PndPidCandidate::GetLastHit(), PndPidCandidate::GetMomentum(), PndKFParticleFinderPID::GetPID(), PndPidCandidate::GetPosition(), ok, par, KFPVertex::SetChi2(), KFPVertex::SetCovarianceMatrix(), KFPVertex::SetNContributors(), KFPVertex::SetXYZ(), and timer.

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 }
Int_t GetCharge() const
Float_t GetEmcQuality() const
Int_t GetDegreesOfFreedom() const
TClonesArray * fNeutralTrackArray
PndKFParticleFinderPID * fPID
const std::vector< int > & GetPID() const
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
Float_t GetChiSquared() const
float_m ok
TStopwatch timer
Definition: hit_dirc.C:51
void SetXYZ(float *position)
Definition: KFPVertex.h:39
TVector3 GetLastHit() const
TClonesArray * fEmcBumps
TVector3 GetPosition() const
virtual Double_t energy() const
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.
const KFParticleTopoReconstructor* PndKFParticleFinder::GetTopoReconstructor ( ) const
inline

Definition at line 34 of file PndKFParticleFinder.h.

References fTopoReconstructor.

Referenced by kfparticle().

34 { return fTopoReconstructor; }
KFParticleTopoReconstructor * fTopoReconstructor
InitStatus PndKFParticleFinder::Init ( )
virtual

Definition at line 42 of file PndKFParticleFinder.cxx.

References Double_t, fChargedTrackArray, fChargedTrackBranchName, fEmcBumps, fNeutralTrackArray, fNeutralTrackBranchName, and fTopoReconstructor.

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 }
TClonesArray * fNeutralTrackArray
TString fNeutralTrackBranchName
Name of the input TCA.
Double_t
TClonesArray * fEmcBumps
KFParticleTopoReconstructor * fTopoReconstructor
TClonesArray * fChargedTrackArray
Name of the input TCA.
double PndKFParticleFinder::InversedChi2Prob ( double  p,
int  ndf 
) const
private

Definition at line 300 of file PndKFParticleFinder.cxx.

References CAMath::Abs(), and f.

Referenced by SetPrimaryProbCut().

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 }
Double_t p
Definition: anasim.C:58
static T Abs(const T &x)
Definition: PndCAMath.h:39
TFile * f
Definition: bump_analys.C:12
const PndKFParticleFinder& PndKFParticleFinder::operator= ( const PndKFParticleFinder )
private
void PndKFParticleFinder::RconstructMultiplePV ( )
inline

Definition at line 26 of file PndKFParticleFinder.h.

References fPVFindMode.

void PndKFParticleFinder::ReconstructSinglePV ( )
inline

Definition at line 25 of file PndKFParticleFinder.h.

References fPVFindMode.

void PndKFParticleFinder::SetChargedTrackBranchName ( const TString name)
inline

Definition at line 28 of file PndKFParticleFinder.h.

References fChargedTrackBranchName, and name.

Referenced by kfparticle().

TString name
void PndKFParticleFinder::SetNeutralTrackBranchName ( const TString name)
inline

Definition at line 29 of file PndKFParticleFinder.h.

References fNeutralTrackBranchName, and name.

Referenced by kfparticle().

TString fNeutralTrackBranchName
Name of the input TCA.
TString name
void PndKFParticleFinder::SetPIDInformation ( PndKFParticleFinderPID pid)
inline

Definition at line 36 of file PndKFParticleFinder.h.

References fPID, and pid().

Referenced by kfparticle().

36 { fPID = pid; }
PndKFParticleFinderPID * fPID
int pid()
void PndKFParticleFinder::SetPrimaryProbCut ( float  prob)

Definition at line 330 of file PndKFParticleFinder.cxx.

References fTopoReconstructor, and InversedChi2Prob().

Referenced by PndKFParticleFinder().

331 {
332  fTopoReconstructor->SetChi2PrimaryCut( InversedChi2Prob(prob, 2) );
333 }
double InversedChi2Prob(double p, int ndf) const
KFParticleTopoReconstructor * fTopoReconstructor
void PndKFParticleFinder::SetPVToZero ( )
inline

Definition at line 24 of file PndKFParticleFinder.h.

References fPVFindMode.

Member Data Documentation

TClonesArray* PndKFParticleFinder::fChargedTrackArray
private

Name of the input TCA.

Definition at line 53 of file PndKFParticleFinder.h.

Referenced by Exec(), and Init().

TString PndKFParticleFinder::fChargedTrackBranchName
private

Definition at line 49 of file PndKFParticleFinder.h.

Referenced by Init(), and SetChargedTrackBranchName().

TClonesArray* PndKFParticleFinder::fEmcBumps
private

Definition at line 55 of file PndKFParticleFinder.h.

Referenced by Exec(), and Init().

TClonesArray* PndKFParticleFinder::fNeutralTrackArray
private

Definition at line 54 of file PndKFParticleFinder.h.

Referenced by Exec(), and Init().

TString PndKFParticleFinder::fNeutralTrackBranchName
private

Name of the input TCA.

Definition at line 50 of file PndKFParticleFinder.h.

Referenced by Init(), and SetNeutralTrackBranchName().

PndKFParticleFinderPID* PndKFParticleFinder::fPID
private

Definition at line 62 of file PndKFParticleFinder.h.

Referenced by Exec(), and SetPIDInformation().

int PndKFParticleFinder::fPVFindMode
private

Definition at line 59 of file PndKFParticleFinder.h.

Referenced by Exec(), RconstructMultiplePV(), ReconstructSinglePV(), and SetPVToZero().

KFParticleTopoReconstructor* PndKFParticleFinder::fTopoReconstructor
private

The documentation for this class was generated from the following files: