FairRoot/PandaRoot
PndRecoKalmanTask.cxx
Go to the documentation of this file.
1 //-----------------------------------------------------------
2 // File and Version Information:
3 // $Id$
4 //
5 // Description:
6 // Implementation of class PndRecoKalmanTask
7 // see PndRecoKalmanTask.hh 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 // Stefano Spataro, UNI Torino
15 //
16 //-----------------------------------------------------------
17 
18 // Panda Headers ----------------------
19 
20 // This Class' Header ------------------
21 #include "PndRecoKalmanTask.h"
22 
23 // C/C++ Headers ----------------------
24 #include <iostream>
25 #include <cmath>
26 
27 // Collaborating Class Headers --------
28 #include "TClonesArray.h"
29 #include "TParticlePDG.h"
30 #include "PndTrack.h"
31 #include "PndTrackID.h"
32 #include "PndMCTrack.h"
33 #include "FairRootManager.h"
34 #include "FairGeanePro.h"
35 #include "FairRunAna.h"
36 #include "FairRuntimeDb.h"
37 
39  : PndPersistencyTask(name, iVerbose),fFitTrackArray(), fTrackInBranchName(""),
40  fTrackOutBranchName(""), fMvdBranchName(""), fCentralTrackerBranchName(""),
41  fFitter(), fDafFitter(), fPersistence(kTRUE),
42  fUseGeane(kTRUE), fIdealHyp(kFALSE), fDaf(kFALSE),
43  fPropagateToIP(kFALSE), fPropagateDistance(2.f), fPerpPlane(kFALSE),fTrackRep(0),
44  fNumIt(1), fPDGHyp(211), fBusyCut(20)
45 {
46  fFitTrackArray = new TClonesArray("PndTrack");
47  fFitter = new PndRecoKalmanFit();
48  fDafFitter = new PndRecoDafFit();
49  SetPersistency(kTRUE);
50 }
51 
52 
54 {
55 }
56 
57 InitStatus
59 {
60 
61  switch (fTrackRep)
62  {
63  case 0:
64  std::cout << " -I- PndRecoKalmanTask:Init :: Using GeaneTrackRep" << std::endl;
65  break;
66  case 1:
67  std::cout << " -I- PndRecoKalmanTask:Init :: Using RKTrackRep" << std::endl;
68  break;
69  default:
70  Error("PndRecoKalmanTask::Init","Not existing Track Representation!!");
71  return kERROR;
72  }
73 
74  if (!fDaf)
75  {
85  if (!fFitter->Init()) return kFATAL;
86  }
87  else
88  {
96  if (!fDafFitter->Init()) return kFATAL;
97  }
98 
99  //Get ROOT Manager
100  FairRootManager* ioman= FairRootManager::Instance();
101 
102  if(ioman==0)
103  {
104  Error("PndRecoKalmanTask::Init","RootManager not instantiated!");
105  return kERROR;
106  }
107 
108  // Get input collection
109  fTrackArray=(TClonesArray*) ioman->GetObject(fTrackInBranchName);
110  if(fTrackArray==0)
111  {
112  Error("PndRecoKalmanTask::Init","track-array not found!");
113  return kERROR;
114  }
115  if (fIdealHyp)
116  {
117  pdg = new TDatabasePDG();
118  // fTrackIDArray=(TClonesArray*) ioman->GetObject(fTrackInIDBranchName);
119  // if(fTrackIDArray==0)
120  // {
121  // Error("PndRecoKalmanTask::Init","track ID array not found! It is not possible to run ideal particle hypothesis");
122  // return kERROR;
123  // }
124 
125  fMCTrackArray=(TClonesArray*) ioman->GetObject("MCTrack");
126  if(fMCTrackArray==0)
127  {
128  Error("PndRecoKalmanTask::Init","MCTrack array not found! It is not possible to run ideal particle hypothesis");
129  return kERROR;
130  }
131  }
132  // TODO this is deactivated for backwards compatibility. Should be removed someday [R.K. 12/2018]
133  // if (fIdealHyp) {
134  // ioman->Register(fTrackOutBranchName+"IdHyp","Gen", fFitTrackArray, GetPersistency());
135  // }
136  // else if (abs(fPDGHyp) == 11){
137  // ioman->Register(fTrackOutBranchName+"Electron","Gen", fFitTrackArray, GetPersistency());
138  // }
139  // else if (abs(fPDGHyp) == 13){
140  // ioman->Register(fTrackOutBranchName+"Muon","Gen", fFitTrackArray, GetPersistency());
141  // }
142  // else if (abs(fPDGHyp) == 211){
143  // ioman->Register(fTrackOutBranchName+"Pion","Gen", fFitTrackArray, GetPersistency());
144  // }
145  // else if (abs(fPDGHyp) == 321){
146  // ioman->Register(fTrackOutBranchName+"Kaon","Gen", fFitTrackArray, GetPersistency());
147  // }
148  // else if (abs(fPDGHyp) == 2212){
149  // ioman->Register(fTrackOutBranchName+"Proton","Gen", fFitTrackArray, GetPersistency());
150  // }
151  // else {
152  // std::cout << " -I- PndRecoKalmanTask:Init :: No hypothesis set, using PION hypothesis" << std::endl;
153  ioman->Register(fTrackOutBranchName,"Gen", fFitTrackArray, GetPersistency());
154  // }
155 
156  return kSUCCESS;
157 }
158 
160  FairRuntimeDb* rtdb = FairRunAna::Instance()->GetRuntimeDb();
161  rtdb->getContainer("PndGeoSttPar");
162  rtdb->getContainer("PndGeoFtsPar");
163 }
164 
165 void PndRecoKalmanTask::Exec(Option_t*) {
166  if (fVerbose > 0)
167  std::cout << "PndRecoKalmanTask::Exec" << std::endl;
168 
169  fFitTrackArray->Delete();
170 
171  Int_t ntracks = fTrackArray->GetEntriesFast();
172 
173  // Detailed output
174  if (fVerbose > 1)
175  std::cout << " -I- PndRecoKalmanTask: contains " << ntracks
176  << " Tracks." << std::endl;
177 
178  // Cut too busy events TODO
179  if (ntracks > fBusyCut) {
180  std::cout << " -I- PndRecoKalmanTask::Exec: ntracks=" << ntracks
181  << " Evil Event! skipping" << std::endl;
182  return;
183  }
184 
185  for (Int_t itr = 0; itr < ntracks; ++itr) {
186  if (fVerbose > 1)
187  std::cout << "starting track" << itr << std::endl;
188 
189  TClonesArray& trkRef = *fFitTrackArray;
190  Int_t size = trkRef.GetEntriesFast();
191 
192  PndTrack *prefitTrack = (PndTrack*) fTrackArray->At(itr);
193  Int_t fCharge = prefitTrack->GetParamFirst().GetQ();
194  Int_t PDGCode = 0;
195  if (fIdealHyp) {
196  //PndTrackID *prefitTrackID = (PndTrackID*) fTrackIDArray->At(itr);
197  if (prefitTrack->GetSortedMCTracks().size() > 0) {
198  FairLink mcTrackId = prefitTrack->GetSortedMCTracks().at(0);
199  if (mcTrackId.GetType() == FairRootManager::Instance()->GetBranchId("MCTrack")) {
200  PndMCTrack *mcTrack = (PndMCTrack*) fMCTrackArray->At(mcTrackId.GetIndex()); //todo: replace with GetCloneOfLinkData
201  if (!mcTrack) {
202  PDGCode = 211 * fCharge;
203  std::cout << "-I- PndRecoKalmanTask::Exec: MCTrack #"
204  << mcTrackId
205  << " is not existing!! Trying with pion hyp"
206  << std::endl;
207  } else {
208  PDGCode = mcTrack->GetPdgCode();
209  }
210  if (PDGCode >= 100000000) {
211  PDGCode = 211 * fCharge;
212  std::cout
213  << "-I- PndRecoKalmanTask::Exec: Track is an ion (PDGCode>100000000)! Trying with pion hyp"
214  << std::endl;
215  } else if ((((TParticlePDG*) pdg->GetParticle(PDGCode))->Charge())
216  == 0) {
217  PDGCode = 211 * fCharge;
218  std::cout
219  << "-E- PndRecoKalmanTask::Exec: Track MC charge is 0!!!! Trying with pion hyp"
220  << std::endl;
221  }
222  } // end of MCTrack ID != -1
223  else {
224  PDGCode = 211 * fCharge;
225  std::cout
226  << "-E- PndRecoKalmanTask::Exec: No MCTrack index in PndTrackID!! Trying with pion hyp"
227  << std::endl;
228  }
229  } // end of "at least one correlated mc index"
230  else {
231  PDGCode = 211 * fCharge;
232  std::cout
233  << "-E- PndRecoKalmanTask::Exec: No Correlated MCTrack id in PndTrackID!! Trying with pion hyp"
234  << std::endl;
235  }
236  } // end of ideal hyp condition
237  else {
238  PDGCode = fPDGHyp * fCharge;
239  }
240 
241  PndTrack *fitTrack;
242  if (PDGCode != 0) {
243  if (fDaf)
244  fitTrack = fDafFitter->Fit(prefitTrack, PDGCode);
245  else
246  fitTrack = fFitter->Fit(prefitTrack, PDGCode);
247  } else {
248  fitTrack = prefitTrack;
249  fitTrack->SetFlag(-22);
250  std::cout
251  << "-I- PndRecoKalmanTask::Exec: Kalman cannot run on this track because of the bad MonteCarlo PDG code"
252  << std::endl;
253  }
254 
255  new (trkRef[size]) PndTrack(
256  fitTrack->GetParamFirst(), fitTrack->GetParamLast(),
257  fitTrack->GetTrackCand(), fitTrack->GetFlag(),
258  fitTrack->GetChi2(), fitTrack->GetNDF(), fitTrack->GetPidHypo(),
259  itr,
260  FairRootManager::Instance()->GetBranchId(fTrackInBranchName)); //PndTrack* pndTrack = //[R.K.03/2017] unused variable
261  delete (fitTrack);
262  }
263 
264  if (fVerbose > 0)
265  std::cout << "Fitting done" << std::endl;
266 
267  return;
268 }
269 
271 {
272  // Set the hypothesis for the fit, charge will be applied later
273  if(h.BeginsWith("e") || h.BeginsWith("E")) {
274  fPDGHyp=-11; //electrons
275  } else if(h.BeginsWith("m") || h.BeginsWith("M")) {
276  fPDGHyp=-13; //muons
277  } else if(h.BeginsWith("pi") || h.BeginsWith("Pi") || h.BeginsWith("PI")) {
278  fPDGHyp=211; //pions
279  } else if(h.BeginsWith("K") || h.BeginsWith("K")) {
280  fPDGHyp=321; //kaons
281  } else if(h.BeginsWith("p") || h.BeginsWith("P") || h.BeginsWith("antip")) {
282  fPDGHyp=2212; //protons/antiprotons
283  } else {
284  std::cout << "-I- PndRecoKalmanTask::SetParticleHypo: Not recognised PID set -> Using default PION hypothesis" << std::endl;
285  fPDGHyp=211; // Pion is default.
286  }
287 }
288 
290 {
291  switch (abs(h))
292  {
293  case 11:
294  fPDGHyp = -11;
295  break;
296  case 13:
297  fPDGHyp = -13;
298  break;
299  case 211:
300  fPDGHyp = 211;
301  break;
302  case 321:
303  fPDGHyp = 321;
304  break;
305  case 2212:
306  fPDGHyp = 2212;
307  break;
308  default:
309  std::cout << "-I- PndRecoKalmanTask::SetParticleHypo: Not recognised PID set -> Using default PION hypothesis" << std::endl;
310  fPDGHyp = 211;
311  break;
312  }
313 }
315 
PndRecoKalmanTask(const char *name="Genfit", Int_t iVerbose=0)
int fVerbose
Definition: poormantracks.C:24
TString fTrackInBranchName
Output TCA for track.
void SetMvdBranchName(const TString &name)
Definition: PndRecoDafFit.h:46
TClonesArray * fTrackArray
void SetTrackRep(Int_t num)
Definition: PndRecoDafFit.h:44
void SetPropagateToIP(Bool_t opt=kTRUE)
void SetTrackRep(Int_t num)
Int_t GetPdgCode() const
Definition: PndMCTrack.h:73
Int_t GetFlag() const
Definition: PndTrack.h:33
Short_t fTrackRep
Flag to use as initial plane the one perpendicular to the track (kFALSE)
virtual void Exec(Option_t *opt)
void SetPersistency(Bool_t val=kTRUE)
virtual InitStatus Init()
void SetParticleHypo(TString s)
TString fCentralTrackerBranchName
Name of the TCA for MVD.
void SetPropagateDistance(Float_t opt=-1.f)
TDatabasePDG * pdg
void SetMvdBranchName(const TString &name)
Bool_t fIdealHyp
Flag to set on smoothing (not used)
void SetPerpPlane(Bool_t opt=kTRUE)
Definition: PndRecoDafFit.h:42
Int_t fPDGHyp
Number of iterations.
Bool_t fPerpPlane
Distance in [cm] to back-propagate the parameters, negative number means no backpropagation.
Bool_t fPropagateToIP
Flag to use Deterministic Annealing.
PndTrackCand GetTrackCand()
Definition: PndTrack.h:47
Int_t fNumIt
(0) GeaneTrackRep, 1 RKTrackRep
PndRecoKalmanFit * fFitter
Name of the TCA for central tracker.
Int_t GetNDF() const
Definition: PndTrack.h:35
void SetPerpPlane(Bool_t opt=kTRUE)
FairTrackParP GetParamLast()
Definition: PndTrack.h:50
FairRuntimeDb * rtdb
Definition: hit_dirc.C:66
TFile * f
Definition: bump_analys.C:12
TClonesArray * fFitTrackArray
Input TCA for PndMCTrack.
PndRecoDafFit * fDafFitter
Bool_t fDaf
Flag to use MC particle hypothesis.
void SetGeane(Bool_t opt=kTRUE)
TString fMvdBranchName
Name of the output TCA.
PndTrack * Fit(PndTrack *tBefore, Int_t PDG)
TString name
void SetVerbose(Int_t verb)
void SetCentralTrackerBranchName(const TString &name)
Double_t GetChi2() const
Definition: PndTrack.h:34
TString fTrackOutBranchName
Name of the input TCA.
void SetVerbose(Int_t verb)
Definition: PndRecoDafFit.h:45
void SetFlag(Int_t i)
Definition: PndTrack.h:38
Int_t GetPidHypo() const
Definition: PndTrack.h:32
void SetCentralTrackerBranchName(const TString &name)
Definition: PndRecoDafFit.h:47
ClassImp(PndAnaContFact)
PndTrack * Fit(PndTrack *tBefore, Int_t PDG)
Int_t iVerbose
void SetNumIterations(Int_t num)
void SetGeane(Bool_t opt=kTRUE)
Definition: PndRecoDafFit.h:40
Float_t fPropagateDistance
Flag to propagate the parameters to the interaction point (kTRUE)
TClonesArray * fMCTrackArray
Input TCA for PndTrack.
Int_t fBusyCut
Hypothesis.
FairTrackParP GetParamFirst()
Definition: PndTrack.h:49
void SetPropagateToIP(Bool_t opt=kTRUE)
Definition: PndRecoDafFit.h:41
Bool_t fUseGeane
Persistence.