FairRoot/PandaRoot
PndLmdKalmanTask.cxx
Go to the documentation of this file.
1 //-----------------------------------------------------------
2 // File and Version Information:
3 // $Id$
4 //
5 // Description:
6 // Implementation of class PndLmdKalmanTask
7 // see PndLmdKalmanTask.h for details
8 //
9 // Environment:
10 // Software developed for the PANDA Detector at FAIR.
11 //
12 // Author List:
13 // Sebastian Neubert TUM (original author)
14 // Ralf Kliemt, TU Dresden (Copied for MVD use)
15 // Anastasia Karavdina, Uni Mainz (Copied for LMD use)
16 //-----------------------------------------------------------
17 
18 // Panda Headers ----------------------
19 
20 // This Class' Header ------------------
21 #include "PndLmdKalmanTask.h"
22 
23 // C/C++ Headers ----------------------
24 #include <assert.h>
25 #include <algorithm>
26 #include <iostream>
27 
28 // Collaborating Class Headers --------
29 #include "FairRootManager.h"
30 #include "GFTrack.h"
31 #include "TClonesArray.h"
32 #include "TDatabasePDG.h"
33 
34 #include "FairMCPoint.h"
35 #include "PndSdsHit.h"
36 
37 #include "FairBaseParSet.h"
38 #include "FairTrackParH.h"
39 #include "GFDetPlane.h"
40 #include "GFException.h"
41 #include "GFKalman.h"
42 #include "GFRecoHitFactory.h"
43 #include "LSLTrackRep.h"
44 #include "PndGeoHandling.h"
45 #include "PndSdsRecoHit.h"
46 #include "TFile.h"
47 #include "TGeoManager.h"
48 #include "TGeoTrack.h"
49 #include "TH1D.h"
50 #include "TLorentzVector.h"
51 //#include "GeaneTrackRep2.h"
52 #include "FairGeanePro.h"
53 #include "GFAbsTrackRep.h"
54 #include "GFConstField.h"
55 #include "GeaneTrackRep.h"
56 #include "PndDetectorList.h"
57 //#include "PndSdsRecoHit.h"
58 #include "PndGenfitAdapters.h"
59 #include "PndTrack.h"
60 #include "PndTrackCand.h"
61 #include "RKTrackRep.h"
62 #include "TMatrixFSym.h"
63 //#include "GFPandaField.h"
64 #include "PndGenfitField.h"
65 // Class Member definitions -----------
66 
68  : FairTask("Kalman Filter"), fPersistence(kFALSE) {
69  // fTrackBranchName = "GFTrackCandLmd";
70  fTrackBranchName = "LMDTrackCand";
71  // fSdsHitBranchName = "LMDHitsStrip";
72  fSdsHitBranchName = "LMDHitsPixel";
74  // hxpull = new TH1D("hxpull","x/#sigma_{x}",1e2,-10,10.);
75  // hypull = new TH1D("hypull","y/#sigma_{y}",1e2,-10,10.);
76  // hzpull = new TH1D("hzpull","z/#sigma_{z}",1e2,-10,10.);
77  // hpxpull = new TH1D("hpxpull","px/#sigma_{px}",1e2,-10,10.);
78  // hpypull = new TH1D("hpypull","x/#sigma_{py}",1e2,-10,10.);
79  // hpzpull = new TH1D("hpzpull","pz/#sigma_{pz}",1e2,-10,10.);
80  flGEANE = false;
81  flRK = false;
82  fscaleP = 1;
83  fscaleM = 1;
84  // rep = NULL;
85 }
86 
88  : FairTask("Kalman Filter"), fPersistence(kFALSE) {
89  fTrackBranchName = TrackBranch;
90  fSdsHitBranchName = HitBranch;
92  flGEANE = false;
93  flRK = false;
94  fscaleP = 1;
95  fscaleM = 1;
96  // rep = NULL;
97 }
98 
100  // if(fPH!=NULL)delete fPH;
101  // if(fChi2H!=NULL)delete fChi2H;
102  // delete rep;
103 }
104 
106  fTrackcount = 0;
107  fsensType = 0;
108  // Get ROOT Manager
109  FairRootManager* ioman = FairRootManager::Instance();
110 
111  if (ioman == 0) {
112  Error("PndLmdKalmanTask::Init", "RootManager not instantiated!");
113  return kERROR;
114  }
115 
116  // Get input collection
117  fTrackArray = (TClonesArray*)ioman->GetObject(fTrackBranchName);
118 
119  if (fTrackArray == 0) {
120  Error("PndLmdKalmanTask::Init", "GFTrackCandLmd array not found!");
121  return kERROR;
122  }
123 
124  fSdsHitsArray = (TClonesArray*)ioman->GetObject(fSdsHitBranchName);
125 
126  // Set output collection
127  // fTrackTmpArray = new TClonesArray("PndLinTrack");
128  // ioman->Register("LMDTrack", "PndLmd", fTrackTmpArray, kTRUE);
129  fTrackTmpArray = new TClonesArray("PndTrack");
130  fTrkOutArray = new TClonesArray("PndTrack");
131  ioman->Register("LMDPndTrackFilt", "PndLmd", fTrkOutArray, kTRUE);
132 
133  // Build hit factory -----------------------------
135 
136  TClonesArray* stripar = (TClonesArray*)ioman->GetObject(fSdsHitBranchName);
137  if (stripar == 0) { // TODO Convention on detector number needed
138  Error("PndLmdKalmanTask::Init", "LMDHitsPixel array not found");
139  } else {
140  int detID = ioman->GetBranchId(fSdsHitBranchName);
141  std::cout << "detID = " << detID << std::endl;
142  // fTheRecoHitFactory->addProducer(ioman->GetBranchId(fSdsHitBranchName),new
143  // GFRecoHitProducer<PndSdsHit,PndSdsRecoHit>(stripar));
146  std::cout << "*** PndLmdKalmanTask::Init"
147  << "\t"
148  << "fSdsHitBranchName array found" << std::endl;
149  }
150 
151  // read beam momentum from base
152  FairRun* fRun = FairRun::Instance();
153  FairRuntimeDb* rtdb = fRun->GetRuntimeDb();
154  FairBaseParSet* par =
155  (FairBaseParSet*)(rtdb->findContainer("FairBaseParSet"));
156  fPbeam = par->GetBeamMom();
157  // fPbeam -=8.77e-5;//TEST!!! energy loss for 11.91 GeV/c
158  // fPbeam -=1e-4;//TEST!!! energy loss for 1.5 GeV/c
159  std::cout << "Beam Momentum for this run is " << fPbeam << std::endl;
160  fPDGCode = -2212; // barp
161  fCharge = -1; // barp
162 
164  fPro = new FairGeanePro();
165  if (flRK) {
166  std::cout << "RKTrackRep will be used for track representation"
167  << std::endl;
168  // GFFieldManager::getInstance()->init(new GFPandaField());
170  }
171  if (flGEANE) {
172  std::cout << "GeaneTrackRep will be used for track representation"
173  << std::endl;
174  fPro = new FairGeanePro();
175  }
176 
177  // //for test purpose
178  // fMCHits = (TClonesArray*) ioman->GetObject("LMDPoint");
179  // if ( !fMCHits) {
180  // std::cout << "-W- PndLmdGeaneTask::Init: "<< "No LMDPoint"<<" array!" <<
181  // std::endl;
182  // return kERROR;
183  // }
184 
185  return kSUCCESS;
186 }
187 
188 void PndLmdKalmanTask::Exec(Option_t*) {
189  fTrackTmpArray->Delete();
190  fTrkOutArray->Delete();
191  if (fVerbose > 1)
192  std::cout
193  << "((((((((((((((((((((( PndLmdKalmanTask::Exec )))))))))))))))))))))"
194  << std::endl;
195  Int_t counterGeaneTrk = 0;
196  Int_t rec_tkr_count = 0;
197  Int_t ntracks = fTrackArray->GetEntriesFast();
198 
199  // Detailed output
200  if (fVerbose > 1)
201  std::cout << " -I- PndLmdKalmanTask: contains " << ntracks << " Tracks."
202  << std::endl;
203  GFKalman fitter;
204  int numIttr = 1;
205  fitter.setNumIterations(numIttr);
206  for (Int_t itr = 0; itr < ntracks; ++itr) {
207  if (fVerbose > 1) std::cout << "starting track" << itr << std::endl;
208 
209  PndTrackCand* trackCand = (PndTrackCand*)fTrackArray->At(itr);
210  const int Ntrkcandhits = trackCand->GetNHits();
211  // Read info about 1st plane(sensor)
212  PndTrackCandHit theHit = trackCand->GetSortedHit(0); // get 1st hit
213  Int_t hitID = theHit.GetHitId();
214  PndSdsHit* myHit = (PndSdsHit*)(fSdsHitsArray->At(hitID));
215  TMatrixD hitCov = myHit->GetCov();
216  if (fVerbose > 1) std::cout << "hitCov:" << std::endl;
217  if (fVerbose > 1) hitCov.Print();
218  Int_t id = myHit->GetSensorID();
219  TString path = fGeoH->GetPath(id);
220  TVector3 oo, uu, vv;
221  fGeoH->GetOUVShortId(id, oo, uu, vv);
222  if (fVerbose > 1) {
223  std::cout << "oo:" << std::endl;
224  oo.Print();
225  std::cout << "uu:" << std::endl;
226  uu.Print();
227  std::cout << "vv:" << std::endl;
228  vv.Print();
229  }
230 
231  GFTrackCand* GFtrkCand = PndTrackCand2GenfitTrackCand(trackCand);
232  TVector3 StartPos = GFtrkCand->getPosSeed();
233  TVector3 StartDir = GFtrkCand->getDirSeed();
234  // //shift start point out of plane on 300 mkm
235  // double xShift = StartPos.X() - StartDir.X()*0.0300;
236  // double yShift = StartPos.Y() - StartDir.Y()*0.0300;
237  // double zShift = StartPos.Z() - StartDir.Z()*0.0300;
238  // StartPos.SetXYZ(xShift,yShift,zShift);
239  TVector3 StartMom = fPbeam * StartDir;
240  TVector3 StartPosErr(sqrt(hitCov[0][0]), sqrt(hitCov[1][1]),
241  sqrt(hitCov[2][2]));
242  TVector3 StartDirErr(
243  0.1 * (sqrt(hitCov[0][0])), 0.1 * (sqrt(hitCov[1][1])),
244  0.1 *
245  sqrt(hitCov[2]
246  [2])); // TODO: check this assumption (2*sigma_{x}/20cm)
247  TVector3 StartMomErr = fPbeam * StartDirErr;
248  // initial errors for Kalman must be large: this is usually done in order to
249  // give a low weight to the prefit
250  StartPosErr *= fscaleP;
251  StartMomErr *= fscaleM;
252  // StartMomErr *=1;
253  if (fVerbose > 2) {
254  unsigned int detid = 12345, index = 12345;
255  std::cout << "GFTrackCand no. " << itr << " has " << GFtrkCand->getNHits()
256  << " hits." << std::endl;
257  std::cout << "[ ihit | detid | index";
258  for (unsigned int ihit = 0; ihit < GFtrkCand->getNHits(); ihit++) {
259  GFtrkCand->getHit(ihit, detid,
260  index); // detid and index are written here
261  std::cout << " ]\n[ " << ihit << " | " << detid << " | " << index;
262  }
263  std::cout << " ]" << std::endl;
264  }
265 
266  if (fVerbose > 1) {
267  std::cout << "*** BEFORE ***" << std::endl;
268  std::cout << "StartPos:" << std::endl;
269  StartPos.Print();
270  std::cout << "StartPosErr:" << std::endl;
271  StartPosErr.Print();
272  std::cout << "StartMom:" << std::endl;
273  StartMom.Print();
274  std::cout << "StartMomErr:" << std::endl;
275  StartMomErr.Print();
276  }
277 
278  GFAbsTrackRep* rep;
279  // // /// The Runge Kutta trk rep ---------------
280  if (flRK) {
281  if (fVerbose > 1)
282  std::cout << "RKTrackRep will be used for track representation"
283  << std::endl;
284  rep = new RKTrackRep(StartPos, StartMom, StartPosErr, StartMomErr,
285  fPDGCode);
286  }
287  // // /// The Runge Kutta trk rep (END) ---------
288 
289  // /// LinTrk rep ------------------
290  // // TVector3 StartPos = GFtrkCand->getPosSeed();
291  // // TVector3 StartDir = GFtrkCand->getDirSeed();
292  // // TVector3 StartMom = fPbeam*StartDir;
293  // LSLTrackRep* rep = new
294  // LSLTrackRep(StartPos.Z(),StartPos.X(),StartPos.Y(),StartDir.X(),StartDir.Y(),1/fPbeam,
295  // StartPosErr.X(),StartPosErr.Y(),StartDirErr.X(),StartDirErr.Y(),
296  // 1e-23,magFieldConst);
297  // //TODO: double siginvp = 1/1e-4 is it correct???
298 
299  // /// LinTrk rep (END) ------------------
300 
302  if (flGEANE) {
303  GFDetPlane start_pl(StartPos, uu, vv); //
304  rep = new GeaneTrackRep(fPro, start_pl, StartMom, StartPosErr,
305  StartMomErr, fCharge, fPDGCode);
306  }
308 
309  GFTrack* trk = new GFTrack(rep);
310  trk->setCandidate(*GFtrkCand);
311 
312  // Load RecoHits
313  try {
315  if (fVerbose > 1) {
316  std::cout << trk->getNumHits() << " hits in track " << itr << std::endl;
317  }
318  } catch (GFException& e) {
319  std::cout << " *** PndLmdKalmanTask::Exec "
320  << "\t"
321  << "Genfit Exception: trk->addHitVector " << e.what()
322  << std::endl;
323  throw e;
324  }
325 
326  // Start Fitter
327  try {
328  if (fVerbose > 1) {
329  std::cout << " ... GFtrk BEFORE ..." << std::endl;
330  trk->Print();
331  }
332  fitter.processTrack(trk);
333  if (fVerbose > 1) {
334  std::cout << " ... GFtrk AFTER ..." << std::endl;
335  trk->Print();
336  }
337  } catch (GFException e) {
338  std::cout << "*** FITTER EXCEPTION ***" << std::endl;
339  std::cout << e.what() << std::endl;
340  }
341  if (fVerbose > 1) std::cout << "successful FIT!" << std::endl;
342 
343  // --- Get trk in PndTrack format ---
344  PndTrack* trkPnd = GenfitTrack2PndTrack(trk);
345  if (fVerbose > 1) {
346  std::cout << "trkPnd AFTER GenFit " << std::endl;
347  trkPnd->Print();
348  std::cout << "Number of hits in trk-cand: " << trackCand->GetNHits()
349  << std::endl;
350  }
351  trkPnd->SetTrackCand(*trackCand);
352  trkPnd->SetRefIndex(
353  itr); // TODO: check is it correct set RefIn like ID of trk-cand???
354  trkPnd->SetChi2(trk->getChiSqu());
355  // --- Save as PndTrack---
356  TClonesArray& clref = *fTrackTmpArray;
357  Int_t size = clref.GetEntriesFast();
358  PndTrack* trackfit = new (clref[size]) PndTrack(*trkPnd);
359 
360  delete trkPnd;
361  delete GFtrkCand;
362  delete trk;
363  // delete rep;
364  }
365 
366  // //filter trks based on chi2 and hit comparision --------------
367  // const unsigned int gll = fTrackTmpArray->GetEntriesFast();
368  // int rec_trk=0;
369  // if(flagFilter){
370  // // fTrkOutArray->Delete();
371  // if(fVerbose>4)
372  // cout<<"trk filter switched on!"<<endl;
373  // //go through all tracks
374  // vector<int> trksH0(gll);//hits on pl#0
375  // vector<int> trksH1(gll);//hits on pl#1
376  // vector<int> trksH2(gll);//hits on pl#2
377  // vector<int> trksH3(gll);//hits on pl#3
378  // vector<unsigned int> trkHn;//number of hits in trk
379  // vector<bool> trk_accept;
380  // vector<double> vchi2;
381  // for (unsigned int i = 0; i<gll;i++){
382  // trksH0[i]=-1;
383  // trksH1[i]=-1;
384  // trksH2[i]=-1;
385  // trksH3[i]=-1;
386  // }
387  // //fill vectors with trks hits
388  // for (unsigned int i = 0; i<gll;i++){
389  // PndTrack* trkpnd = (PndTrack*)(fTrackTmpArray->At(i));
390  // double chi2 = trkpnd->GetChi2();
391  // vchi2.push_back(chi2);
392  // trk_accept.push_back(true);
393  // int candID = trkpnd->GetRefIndex();
394  // PndTrackCand *trkcand = (PndTrackCand*)fTrackArray->At(candID);
395  // const unsigned int Ntrkcandhits= trkcand->GetNHits();
396  // trkHn.push_back(Ntrkcandhits);
397  // for (Int_t iHit = 0; iHit < Ntrkcandhits; iHit++){ // loop over
398  // rec.hits
399  // PndTrackCandHit candhit =
400  // (PndTrackCandHit)(trkcand->GetSortedHit(iHit));
401  // Int_t hitID = candhit.GetHitId();
402  // PndSdsHit* myHit = (PndSdsHit*)(fSdsHitsArray->At(hitID));
403  // Int_t sensid = myHit->GetSensorID();
404  // int ihalf,iplane,imodule,iside,idie,isensor;
405  // lmddim->Get_sensor_by_id(sensid,ihalf,iplane,imodule,iside,idie,isensor);
406  // if(fVerbose>4){
407  // cout<<"trk# "<<i<<" plane#"<<iplane<<endl;
408  // }
409  // switch(iplane)
410  // {
411  // case 0:
412  // trksH0[i]=hitID;
413  // case 1:
414  // trksH1[i]=hitID;
415  // case 2:
416  // trksH2[i]=hitID;
417  // case 3:
418  // trksH3[i]=hitID;
419  // }
420  // }
421  // }
422  // //compare trks on hit level
423  // for (unsigned int i = 0; i<gll;i++){
424  // for (unsigned int j = i+1; j<gll;j++){
425  // int coundduphit=4;//count dublicate hits
426  // if(trksH0[i]!=trksH0[j]) coundduphit--;
427  // if(trksH1[i]!=trksH1[j]) coundduphit--;
428  // if(trksH2[i]!=trksH2[j]) coundduphit--;
429  // if(trksH3[i]!=trksH3[j]) coundduphit--;
430  // if(fVerbose>4){
431  // cout<<" trk#"<<i<<":"<<trksH0[i]<<" trk#"<<j<<":"<<trksH0[j]<<endl;
432  // cout<<" trk#"<<i<<":"<<trksH1[i]<<" trk#"<<j<<":"<<trksH1[j]<<endl;
433  // cout<<" trk#"<<i<<":"<<trksH2[i]<<" trk#"<<j<<":"<<trksH2[j]<<endl;
434  // cout<<" trk#"<<i<<":"<<trksH3[i]<<" trk#"<<j<<":"<<trksH3[j]<<endl;
435  // cout<<" dublicate: "<<coundduphit<<endl;
436  // cout<<""<<endl;
437  // }
438  // if(coundduphit>2){// if 3 and more hits are similar
439  // if(vchi2[i]>vchi2[j]){
440  // if(fVerbose>4){
441  // cout<<" trk#"<<i<<": has "<<trkHn[i]<<"hits; trk#"<<j<<": has
442  // "<<trkHn[j]<<" hits"<<endl;
443  // cout<<" trk#"<<i<<" has chi2="<<vchi2[i]<<" "<<" trk#"<<j<<" has
444  // chi2="<<vchi2[j]<<endl;
445  // }
446  // trk_accept[i]=false;
447  // trk_accept[j]=true;
448  // }
449  // else{
450  // if(fVerbose>4){
451  // cout<<" trk#"<<i<<": has "<<trkHn[i]<<"hits; trk#"<<j<<": has
452  // "<<trkHn[j]<<" hits"<<endl;
453  // cout<<" trk#"<<i<<" has chi2="<<vchi2[i]<<" "<<" trk#"<<j<<" has
454  // chi2="<<vchi2[j]<<endl;
455  // }
456  // trk_accept[i]=true;
457  // trk_accept[j]=false;
458  // }
459  // }
460  // }
461  // }
462  // //save good trks
463  // int rec_trk=0;
464  // for (unsigned int i = 0; i<gll;i++){
465  // if(trk_accept[i]){
466  // PndTrack* trkpnd = (PndTrack*)(fTrackTmpArray->At(i));
467  // new((*fTrkOutArray)[rec_trk]) PndTrack(*(trkpnd)); //save Track
468  // rec_trk++;
469  // }
470  // }
471  // cout<<rec_trk<<" trks saved out of "<<gll<<endl;
472  // }
473  // else{
474  // if(fVerbose>4)
475  // cout<<"trk filter switched off!"<<endl;
476  // for (unsigned int i = 0; i<gll;i++){
477  // PndTrack* trkpnd = (PndTrack*)(fTrackTmpArray->At(i));
478  // new((*fTrkOutArray)[rec_trk]) PndTrack(*(trkpnd)); //save Track
479  // rec_trk++;
480  // }
481  // }
482  // //filter end ------------------------------------------------------------
483  for (unsigned int i = 0; i < fTrackTmpArray->GetEntriesFast(); i++) {
484  PndTrack* trkpnd = (PndTrack*)(fTrackTmpArray->At(i));
485  TClonesArray& clref = *fTrkOutArray;
486  Int_t size = clref.GetEntriesFast();
487  new (clref[size]) PndTrack(*(trkpnd)); // save Track
488  }
489  if (fVerbose > 1)
490  std::cout << "Fitting done, result is " << fTrkOutArray->GetEntriesFast()
491  << " fitted trks" << std::endl;
492  // rep = NULL;
493  return;
494 }
Base Class for genfit track representations. Defines interface for track parameterizations.
Definition: GFAbsTrackRep.h:80
int fVerbose
Definition: poormantracks.C:24
unsigned int getNumHits() const
Definition: GFTrack.h:148
void SetRefIndex(TString branch, Int_t i)
Definition: PndTrack.h:41
void Print()
Definition: GFTrack.cxx:217
void GetOUVShortId(Int_t shortId, TVector3 &o, TVector3 &u, TVector3 &v)
Int_t i
Definition: run_full.C:25
Detector plane genfit geometry class.
Definition: GFDetPlane.h:59
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
Track object for genfit. genfit algorithms work on these objects.
Definition: GFTrack.h:60
std::vector< GFAbsRecoHit * > createMany(const GFTrackCand &cand)
Creat a collection of RecoHits.
void addProducer(int detID, GFAbsRecoHitProducer *hitProd)
Register a producer module to the factory.
double getChiSqu() const
Get chi2.
Definition: GFTrack.h:252
Generic Kalman Filter implementation.
Definition: GFKalman.h:50
PndTrackCandHit GetSortedHit(UInt_t i)
Definition: PndTrackCand.h:54
virtual const char * what() const
standard error message handling for exceptions. use like &quot;std::cerr &lt;&lt; e.what();&quot; ...
Definition: GFException.cxx:47
unsigned int getNHits() const
Definition: GFTrackCand.h:113
void SetChi2(Double_t d)
Definition: PndTrack.h:39
Double_t par[3]
void addHitVector(std::vector< GFAbsRecoHit * > hits)
Add collection of hits.
Definition: GFTrack.h:310
Template class for a hit producer module.
void setCandidate(const GFTrackCand &cand, bool doreset=false)
set track candidate
Definition: GFTrack.cxx:148
TString GetPath(Int_t shortID)
for a given shortID the path is returned
TClonesArray * fTrackTmpArray
Magnetic field.
TVector3 getPosSeed() const
get the seed value for track: pos
Definition: GFTrackCand.h:131
FairRunAna * fRun
Definition: hit_dirc.C:58
TMatrixD GetCov() const
Definition: PndSdsHit.h:98
virtual InitStatus Init()
TVector3 getDirSeed() const
get the seed value for track: direction
Definition: GFTrackCand.h:133
Factory object to create RecoHits from digitized and clustered data.
Track Representation module based on a Runge-Kutta algorithm including a full material model...
TClonesArray * fSdsHitsArray
void getHit(unsigned int i, unsigned int &detId, unsigned int &hitId) const
Get detector ID and cluster index (hitId) for hit number i.
Definition: GFTrackCand.h:84
FairRuntimeDb * rtdb
Definition: hit_dirc.C:66
Track candidate – a list of cluster indices.
Definition: GFTrackCand.h:55
GFTrackCand * PndTrackCand2GenfitTrackCand(PndTrackCand *cand)
void processTrack(GFTrack *trk)
Performs fit on a GFTrack.
Definition: GFKalman.cxx:40
static PndGeoHandling * Instance()
PndGeoHandling * fGeoH
GFTrack * trk
Definition: checkgenfit.C:13
const GFTrackCand & getCand() const
Definition: GFTrack.h:142
Exception class for error handling in GENFIT (provides storage for diagnostic information) ...
Definition: GFException.h:45
void init(GFAbsBField *b)
set the magntic field here. Magnetic field classes must be derived from GFAbsBField ...
TClonesArray * fTrackArray
PndTrack * GenfitTrack2PndTrack(const GFTrack *tr)
static GFFieldManager * getInstance()
UInt_t GetNHits() const
Definition: PndTrackCand.h:59
ClassImp(PndAnaContFact)
FairGeanePro * fPro
void Print()
Definition: PndTrack.cxx:39
Int_t GetSensorID() const
Definition: PndSdsHit.h:90
virtual ~PndLmdKalmanTask()
Int_t GetHitId() const
virtual void Exec(Option_t *opt)
void setNumIterations(Int_t i)
Set number of iterations for Kalman Filter.
Definition: GFKalman.h:86
void SetTrackCand(const PndTrackCand &cand)
Definition: PndTrack.h:43
TMatrixT< double > TMatrixD
Definition: PndLmdDim.h:52
TClonesArray * fTrkOutArray
GFRecoHitFactory * fTheRecoHitFactory