FairRoot/PandaRoot
PndRecoKalmanTask2.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 // modified by Elisabetta Prencipe 19/05/2014
16 //-----------------------------------------------------------
17 
18 // Panda Headers ----------------------
19 
20 // This Class' Header ------------------
21 #include "PndRecoKalmanTask2.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(),
42 fUseGeane(kTRUE), fIdealHyp(kFALSE), fDaf(kFALSE),
43  fPropagateToIP(kFALSE), fPropagateDistance(2.f), fPerpPlane(kFALSE),
44  fNumIt(1), fPDGHyp(-13), fBusyCut(20)
45 {
46  fFitTrackArray = new TClonesArray("PndTrack");
47  fFitter = new PndRecoKalmanFit2();
48  fDafFitter = new PndRecoDafFit2();
49  SetPersistency(kTRUE);
50 }
51 
52 
54 {
55 }
56 
57 InitStatus
59 {
60 
61 
62  std::cout << " -I- PndRecoKalmanTask2:Init :: Using RKTrackRep" << std::endl;
63 
64 
65  if (!fDaf)
66  {
75  if (!fFitter->Init()) return kFATAL;
76  }
77  else
78  {
86  if (!fDafFitter->Init()) return kFATAL;
87  }
88 
89  //Get ROOT Manager
90  FairRootManager* ioman= FairRootManager::Instance();
91 
92  if(ioman==0)
93  {
94  Error("PndRecoKalmanTask2::Init","RootManager not instantiated!");
95  return kERROR;
96  }
97 
98  // Get input collection
99  fTrackArray=(TClonesArray*) ioman->GetObject(fTrackInBranchName);
100  if(fTrackArray==0)
101  {
102  Error("PndRecoKalmanTask2::Init","track-array not found!");
103  return kERROR;
104  }
105  if (fIdealHyp)
106  {
107  pdg = new TDatabasePDG();
108 // fTrackIDArray=(TClonesArray*) ioman->GetObject(fTrackInIDBranchName);
109 // if(fTrackIDArray==0)
110 // {
111 // Error("PndRecoKalmanTask2::Init","track ID array not found! It is not possible to run ideal particle hypothesis");
112 // return kERROR;
113 // }
114 
115  fMCTrackArray=(TClonesArray*) ioman->GetObject("MCTrack");
116  if(fMCTrackArray==0)
117  {
118  Error("PndRecoKalmanTask2::Init","MCTrack array not found! It is not possible to run ideal particle hypothesis");
119  return kERROR;
120  }
121  }
122 
123  ioman->Register(fTrackOutBranchName,"Gen", fFitTrackArray, GetPersistency());
124 
125  return kSUCCESS;
126 }
127 
129  FairRuntimeDb* rtdb = FairRunAna::Instance()->GetRuntimeDb();
130  rtdb->getContainer("PndGeoSttPar");
131  rtdb->getContainer("PndGeoFtsPar");
132 }
133 
134 void PndRecoKalmanTask2::Exec(Option_t*) {
135  if (fVerbose > 0)
136  std::cout << "PndRecoKalmanTask2::Exec " << FairRootManager::Instance()->GetEntryNr() << std::endl;
137 
138  fFitTrackArray->Delete();
139 
140  Int_t ntracks = fTrackArray->GetEntriesFast();
141 
142  // Detailed output
143  if (fVerbose > 1)
144  std::cout << " -I- PndRecoKalmanTask2: contains " << ntracks
145  << " Tracks." << std::endl;
146 
147  // Cut too busy events TODO
148  if (ntracks > fBusyCut) {
149  std::cout << " -I- PndRecoKalmanTask2::Exec: ntracks=" << ntracks
150  << " Evil Event! skipping" << std::endl;
151  return;
152  }
153 
154  for (Int_t itr = 0; itr < ntracks; ++itr) {
155  if (fVerbose > 1)
156  std::cout << "starting track" << itr << std::endl;
157 
158  TClonesArray& trkRef = *fFitTrackArray;
159  Int_t size = trkRef.GetEntriesFast();
160 
161  PndTrack *prefitTrack = (PndTrack*) fTrackArray->At(itr);
162  Int_t fCharge = prefitTrack->GetParamFirst().GetQ();
163  Int_t PDGCode = 0;
164  if (fIdealHyp) {
165  std::vector<FairLink> mcTrackLinks = prefitTrack->GetSortedMCTracks();
166 // PndTrackID *prefitTrackID = (PndTrackID*) fTrackIDArray->At(itr);
167  if (mcTrackLinks.size() > 0) {
168  Int_t mcTrackId = mcTrackLinks[0].GetIndex();
169  if (mcTrackId != -1) {
170  PndMCTrack *mcTrack = (PndMCTrack*) fMCTrackArray->At( //TODO: Replace with GetCloneOfLinkData to run time-based
171  mcTrackId);
172  if (!mcTrack) {
173  PDGCode = 211 * fCharge;
174  std::cout << "-I- PndRecoKalmanTask2::Exec: MCTrack #"
175  << mcTrackId
176  << " is not existing!! Trying with pion hyp"
177  << std::endl;
178  } else {
179  PDGCode = mcTrack->GetPdgCode();
180  }
181  if (PDGCode >= 100000000) {
182  PDGCode = 211 * fCharge;
183  std::cout
184  << "-I- PndRecoKalmanTask2::Exec: Track is an ion (PDGCode>100000000)! Trying with pion hyp"
185  << std::endl;
186  } else if ((((TParticlePDG*) pdg->GetParticle(PDGCode))->Charge())
187  == 0) {
188  PDGCode = 211 * fCharge;
189  std::cout
190  << "-E- PndRecoKalmanTask2::Exec: Track MC charge is 0!!!! Trying with pion hyp"
191  << std::endl;
192  }
193  } // end of MCTrack ID != -1
194  else {
195  PDGCode = 211 * fCharge;
196  std::cout
197  << "-E- PndRecoKalmanTask2::Exec: No MCTrack index in PndTrackID!! Trying with pion hyp"
198  << std::endl;
199  }
200  } // end of "at least one correlated mc index"
201  else {
202  PDGCode = 211 * fCharge;
203  std::cout
204  << "-E- PndRecoKalmanTask2::Exec: No Correlated MCTrack id in PndTrackID!! Trying with pion hyp"
205  << std::endl;
206  }
207  } // end of ideal hyp condition
208  else {
209  PDGCode = fPDGHyp * fCharge;
210  }
211 
212  PndTrack fitTrack;
213  PndTrack* fitTrackPointer = 0;
214  //bool usePrefit = false; //[R.K.03/2017] unused variable
215  if (PDGCode != 0) {
216  if (fDaf){
217  fitTrackPointer = (fDafFitter->Fit(prefitTrack, PDGCode));
218  fitTrack = *fitTrackPointer;
219  }
220  else{
221  fitTrackPointer = (fFitter->Fit(prefitTrack, PDGCode));
222  fitTrack = *fitTrackPointer;
223  }
224  } else {
225  fitTrack = *prefitTrack;
226  fitTrack.SetFlag(-22);
227  //usePrefit = true; //[R.K.03/2017] unused variable
228  std::cout
229  << "-I- PndRecoKalmanTask2::Exec: Kalman cannot run on this track because of the bad MonteCarlo PDG code"
230  << std::endl;
231  }
232 
233 
234  new (trkRef[size]) PndTrack(
235  fitTrack.GetParamFirst(), fitTrack.GetParamLast(),
236  fitTrack.GetTrackCand(), fitTrack.GetFlag(),
237  fitTrack.GetChi2(), fitTrack.GetNDF(), fitTrack.GetPidHypo(),
238  itr,
239  FairRootManager::Instance()->GetBranchId(fTrackInBranchName));//PndTrack* pndTrack = //[R.K.03/2017] unused variable
240 
241  }
242 
243  if (fVerbose > 0)
244  std::cout << "Fitting done" << std::endl;
245 
246  return;
247 }
248 
250 {
251  // Set the hypothesis for the fit, charge will be applied later
252  if(h.BeginsWith("e") || h.BeginsWith("E")){
253  fPDGHyp=-11; //electrons
254  }else if(h.BeginsWith("m") || h.BeginsWith("M")){
255  fPDGHyp=-13; //muons
256  }else if(h.BeginsWith("pi") || h.BeginsWith("Pi") || h.BeginsWith("PI")){
257  fPDGHyp=211; //pions
258  }else if(h.BeginsWith("K") || h.BeginsWith("K")){
259  fPDGHyp=321; //kaons
260  }else if(h.BeginsWith("p") || h.BeginsWith("P") || h.BeginsWith("antip")){
261  fPDGHyp=2212; //protons/antiprotons
262  }else{
263  std::cout << "-I- PndRecoKalmanTask2::SetParticleHypo: Not recognised PID set -> Using default MUON hypothesis" << std::endl;
264  fPDGHyp=-13; // Muon is default.
265  }
266 }
267 
269 {
270  switch (abs(h))
271  {
272  case 11:
273  fPDGHyp = -11;
274  break;
275  case 13:
276  fPDGHyp = -13;
277  break;
278  case 211:
279  fPDGHyp = 211;
280  break;
281  case 321:
282  fPDGHyp = 321;
283  break;
284  case 2212:
285  fPDGHyp = 2212;
286  break;
287  default:
288  std::cout << "-I- PndRecoKalmanTask2::SetParticleHypo: Not recognised PID set -> Using default MUON hypothesis" << std::endl;
289  fPDGHyp = -13;
290  break;
291  }
292 }
PndRecoDafFit2 * fDafFitter
Standard Kalman Filter class.
void SetGeane(Bool_t opt=kTRUE)
int fVerbose
Definition: poormantracks.C:24
TString fTrackInBranchName
Output TCA for track.
void SetNumIterations(Int_t num)
TClonesArray * fMCTrackArray
Input TCA for PndTrack.
void SetParticleHypo(TString s)
Bool_t fPropagateToIP
Flag to use Deterministic Annealing.
PndTrack * Fit(PndTrack *tBefore, Int_t PDG)
void SetPropagateToIP(Bool_t opt=kTRUE)
Int_t GetPdgCode() const
Definition: PndMCTrack.h:73
TDatabasePDG * pdg
Deterministic Annealing class.
TString fTrackOutBranchName
Name of the input TCA.
Bool_t fPerpPlane
Distance in [cm] to back-propagate the parameters, negative number means no backpropagation.
Int_t GetFlag() const
Definition: PndTrack.h:33
void SetMvdBranchName(const TString &name)
void SetPersistency(Bool_t val=kTRUE)
TClonesArray * fTrackArray
Bool_t fUseGeane
Particle DB.
void SetVerbose(Int_t verb)
void SetMvdBranchName(const TString &name)
Float_t fPropagateDistance
Flag to propagate the parameters to the interaction point (kTRUE)
Int_t fBusyCut
Hypothesis.
Int_t fNumIt
Flag to use as initial plane the one perpendicular to the track (kFALSE)
void SetPropagateToIP(Bool_t opt=kTRUE)
TString fMvdBranchName
Name of the output TCA.
virtual InitStatus Init()
PndTrackCand GetTrackCand()
Definition: PndTrack.h:47
PndRecoKalmanFit2 * fFitter
Name of the TCA for central tracker.
Bool_t fIdealHyp
Flag to set on smoothing (not used)
Int_t GetNDF() const
Definition: PndTrack.h:35
PndTrack * Fit(PndTrack *tBefore, Int_t PDG)
PndRecoKalmanTask2(const char *name="Genfit", Int_t iVerbose=0)
FairTrackParP GetParamLast()
Definition: PndTrack.h:50
FairRuntimeDb * rtdb
Definition: hit_dirc.C:66
TFile * f
Definition: bump_analys.C:12
void SetCentralTrackerBranchName(const TString &name)
TString name
Double_t GetChi2() const
Definition: PndTrack.h:34
Int_t fPDGHyp
Number of iterations.
void SetVerbose(Int_t verb)
void SetFlag(Int_t i)
Definition: PndTrack.h:38
Int_t GetPidHypo() const
Definition: PndTrack.h:32
ClassImp(PndAnaContFact)
Int_t iVerbose
void SetPropagateDistance(Float_t opt=-1.f)
void SetGeane(Bool_t opt=kTRUE)
TClonesArray * fFitTrackArray
Input TCA for PndMCTrack.
virtual void Exec(Option_t *opt)
void SetPerpPlane(Bool_t opt=kTRUE)
void SetCentralTrackerBranchName(const TString &name)
void SetPropagateDistance(Float_t opt=-1.f)
TString fCentralTrackerBranchName
Name of the TCA for MVD.
Bool_t fDaf
Flag to use MC particle hypothesis.
FairTrackParP GetParamFirst()
Definition: PndTrack.h:49
void SetPerpPlane(Bool_t opt=kTRUE)