9 #include "FairRunAna.h"
10 #include "FairField.h"
13 #include "KFParticleTopoReconstructor.h"
14 #include "KFPTrackVector.h"
18 #include "TClonesArray.h"
19 #include "TStopwatch.h"
29 FairTask(name, iVerbose), fChargedTrackBranchName(
""), fNeutralTrackBranchName(
""), fChargedTrackArray(0), fNeutralTrackArray(0), fEmcBumps(0),
30 fTopoReconstructor(0), fPVFindMode(0),
fPID(0)
45 FairRootManager* ioman= FairRootManager::Instance();
49 Error(
"PndKFParticleFinder::Init",
"RootManager not instantiated!");
57 Error(
"PndKFParticleFinder::Init",
"track-array not found!");
65 fEmcBumps = (TClonesArray*) ioman->GetObject(
"EmcBump");
68 FairField* MF=FairRunAna::Instance()->GetField();
71 MF->Field(xyz,fieldValue);
72 double Bz = fieldValue[2];
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());
122 for(
unsigned short iC=0; iC<21; iC++)
123 ok = ok && std::isfinite(cov[iC]);
130 ok = ok && (cov[0] > 0.)
145 vRTracks[ntracks] = *inTrack;
146 trackId[ntracks] = iTr;
151 vRTracks.resize(ntracks);
153 trackId.resize(ntracks);
155 KFPTrackVector tracks;
156 tracks.Resize(ntracks);
158 for(Int_t iTr=0; iTr<ntracks; iTr++)
162 float par[6] = {0.f};
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);
203 tracks.SetPDG(-1, iTr);
208 tracks.SetPVIndex(-1, iTr);
211 tracks.SetPVIndex(-1, iTr);
216 KFPEmcCluster emcClusters;
228 if(inBump->
energy() < 0.02)
continue;
230 clusterId[nClusters] = iClust;
234 emcClusters.Resize(nClusters);
235 for(
int iClust2=0; iClust2<nClusters; iClust2++)
237 int iClust = clusterId[iClust2];
242 float par[4] = {0.f};
246 par[3] = inBump->
energy();
247 float cov[10] = {0.f};
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);
279 primVtx_tmp.
SetXYZ(0,0,0);
284 vector<int> pvTrackIds;
302 double epsilon = 1.e-14;
303 double chi2Left = 0.f;
304 double chi2Right = 10000.f;
306 double probLeft = p - TMath::Prob(chi2Left, ndf);
308 double chi2Centr = (chi2Left+chi2Right)/2.
f;
309 double probCentr = p - TMath::Prob( chi2Centr, ndf);
311 while(
TMath::Abs(chi2Right-chi2Centr)/chi2Centr > epsilon )
313 if(probCentr * probLeft > 0.
f)
315 chi2Left = chi2Centr;
316 probLeft = probCentr;
320 chi2Right = chi2Centr;
323 chi2Centr = (chi2Left+chi2Right)/2.
f;
324 probCentr = p - TMath::Prob( chi2Centr, ndf);
PndKFParticleFinder(const char *name="PndKFParticleFinder", Int_t iVerbose=0)
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.
void SetNContributors(int nc)
const Float_t * GetErrorP7() const
Int_t GetEmcIndex() const
TString fChargedTrackBranchName
Float_t GetChiSquared() const
void SetXYZ(float *position)
TVector3 GetLastHit() const
TVector3 GetPosition() const
double InversedChi2Prob(double p, int ndf) const
virtual Double_t energy() const
virtual void Exec(Option_t *opt)
TVector3 GetMomentum() const
KFParticleTopoReconstructor * fTopoReconstructor
void SetCovarianceMatrix(float *C)
represents a reconstructed (splitted) emc cluster
TClonesArray * fChargedTrackArray
Name of the input TCA.
void SetPrimaryProbCut(float prob)
virtual InitStatus Init()