FairRoot/PandaRoot
PndLmdSigCleanTask.cxx
Go to the documentation of this file.
1 // -------------------------------------------------------------------------
2 // ----- PndLmdSigCleanTask source file -----
3 // ----- Created 26/02/14 by A.Karavdina -----
4 // -------------------------------------------------------------------------
5 // libc includes
6 #include <iostream>
7 
8 // Root includes
9 #include <TMatrixDSym.h>
10 #include "TClonesArray.h"
11 #include "TROOT.h"
12 #include "TTree.h"
13 #include "TVector3.h"
14 
15 // framework includes
16 #include "FairBaseParSet.h"
17 #include "FairHit.h"
18 #include "FairRootManager.h"
19 #include "FairRun.h"
20 #include "FairRunAna.h"
21 #include "FairRuntimeDb.h"
22 #include "FairTrackParH.h"
23 #include "PndLmdSigCleanTask.h"
24 #include "PndMCTrack.h"
25 #include "PndTrack.h"
26 #include "TGeant3.h"
27 // PndSds includes
28 #include "PndSdsHit.h"
29 #include "PndSdsMCPoint.h"
30 #include "PndSdsMergedHit.h"
31 // PndLmd includes
32 #include <map>
33 #include <vector>
34 
35 // ----- Default constructor -------------------------------------------
37  : FairTask("Cleaning Tracks Task for PANDA Lmd"),
38  fEventNr(0),
39  fdX(0),
40  fdY(0) {
41  // tprop = new TNtuple();
42 }
43 // -------------------------------------------------------------------------
44 
46  : FairTask("Cleaning Tracks Task for PANDA Lmd"),
47  fEventNr(0),
48  fdX(0),
49  fdY(0) {
50  fdir = dir;
51  fPbeam = pBeam;
52  cout << "Beam Momentum in this run is " << fPbeam << endl;
53  hResponse = new TH1D("hResponse", "", 1e3, -1, 1);
54  fXYcut = false;
55 }
56 
57 // ----- Destructor ----------------------------------------------------
59 
60 // ----- Public method Init --------------------------------------------
62  // Get RootManager
63  FairRootManager* ioman = FairRootManager::Instance();
64  if (!ioman) {
65  std::cout << "-E- PndLmdSigCleanTask::Init: "
66  << "RootManager not instantiated!" << std::endl;
67  return kFATAL;
68  }
69 
70  fTrkArray = (TClonesArray*)ioman->GetObject("LMDPndTrackFilt");
71  if (!fTrkArray) {
72  std::cout << "-W- PndLmdTrkQTask::Init: "
73  << "No Track"
74  << " array!" << std::endl;
75  return kERROR;
76  }
77 
78  // Get rec.tracks after back propagation
79  fRecBPTracks = (TClonesArray*)ioman->GetObject("GeaneTrackFinal");
80  if (!fRecBPTracks) {
81  std::cout << "-W- PndLmdSigCleanTask::Init: "
82  << "No Track after back-propagation"
83  << " array!" << std::endl;
84  return kERROR;
85  }
86 
87  fTrackParFinal = new TClonesArray("FairTrackParH");
88  ioman->Register("LMDCleanTrack", "PndLmd", fTrackParFinal, kTRUE);
89 
91  // FairRun* fRun = FairRun::Instance(); //[R.K. 01/2017] unused variable?
92  // FairRuntimeDb* rtdb = fRun->GetRuntimeDb(); //[R.K. 01/2017] unused
93  // variable
94 
95  // TMVA -----------------------------------------------------
96  // This loads the library
97  if (fabs(fPbeam - 1.5) < 1e-1) {
98  TMVA::Tools::Instance();
99 
100  // TMVA::Reader *
101  reader = new TMVA::Reader("!Color:!Silent");
102 
103  // Create a set of variables and declare them to the reader
104  // - the variable names MUST corresponds in name and type to those given in
105  // the weight file(s) used
106 
107  reader->AddVariable("axrec", &axrec);
108  reader->AddVariable("ayrec", &ayrec);
109  reader->AddVariable("azrec", &azrec);
110  reader->AddVariable("aprec", &aprec);
111  reader->AddVariable("athrec", &athrec);
112  reader->AddVariable("aphrec", &aphrec);
113 
114  // TString dir = "weights/";
115  TString prefix = "TMVAClassification";
116  fmethodName = "BDT method";
117  TString weightfile =
118  fdir + prefix + TString("_BDT") + TString(".weights.xml");
119  reader->BookMVA(fmethodName, weightfile);
120  }
121  //------------------------------------------------------
122  return kSUCCESS;
123 }
124 // -------------------------------------------------------------------------
126  // Get Base Container
128  // FairRuntimeDb* rtdb=ana->GetRuntimeDb();
129 }
130 
131 // ----- Public method Exec --------------------------------------------
132 void PndLmdSigCleanTask::Exec(Option_t*) {
133  std::map<int, std::vector<int> > mcHitMap; // Track -> MCHits
134  fTrackParFinal->Delete();
135 
136  if (fVerbose > 2) {
137  cout << " ---- Info: " << fEventNr << endl;
138  }
139  fEventNr++;
140 
141  // go through all tracks
142  const int nGeaneTrks = fRecBPTracks->GetEntriesFast();
143  Int_t counterSigTrk = 0;
144  for (Int_t iN = 0; iN < nGeaneTrks;
145  iN++) { // loop over all reconstructed trks
146  FairTrackParH* fRes = (FairTrackParH*)fRecBPTracks->At(iN);
147  // 1. Trk params before BP
148  bool isCleanCand;
149  if (fXYcut == kTRUE) {
150  PndTrack* trkpnd = (PndTrack*)(fTrkArray->At(iN));
151  FairTrackParP fFittedTrkP = trkpnd->GetParamFirst();
152  isCleanCand = CheckXY(&fFittedTrkP);
153  } else {
154  isCleanCand = kTRUE;
155  }
156  // 2. Trk params after BP
157  bool isClean = Check(fRes);
158  if (isClean == kTRUE && isCleanCand == kTRUE) {
159  new ((*fTrackParFinal)[counterSigTrk])
160  FairTrackParH(*(fRes)); // save Track
161  counterSigTrk++;
162  if (fVerbose > 2) cout << "***** isClean TRUE *****" << endl;
163  } else {
164  new ((*fTrackParFinal)[counterSigTrk]) FairTrackParH(); // save NULL
165  counterSigTrk++;
166  if (fVerbose > 2) cout << "***** isClean FALSE *****" << endl;
167  }
168  } // [END] loop over all reconstructed trks
169  if (fVerbose > 2) cout << "PndLmdSigCleanTask::Exec END!" << endl;
170 }
171 
173 
175  FairTrackParH* fTrk) { // answer TRUE means "it's a signal"
176  bool res;
177  if (fabs(fPbeam - 1.5) < 1e-1)
178  res = CheckMVA(fTrk); // MVA was trained only on sample with 1.5 GeV/c
179  // simulation ///TODO: extension to other energies?
180  else {
181  TVector3 MomRecBP = fTrk->GetMomentum();
182  double prec = MomRecBP.Mag();
183  res = CheckMom(prec);
184  }
185  return res;
186 }
187 
188 bool PndLmdSigCleanTask::CheckMom(double prec) {
189  bool res;
190  if (abs(prec - fPbeam) > 3e-4)
191  res = false;
192  else
193  res = true;
194  return res;
195 }
196 
197 bool PndLmdSigCleanTask::CheckMVA(FairTrackParH* fTrk) {
198  // cout<<"Yes, TMVA game!"<<endl;
199  bool res;
200  TVector3 PosRecBP = fTrk->GetPosition();
201  axrec = float(PosRecBP.X() - fdX);
202  ayrec = float(PosRecBP.Y() - fdY);
203  azrec = float(PosRecBP.Z());
204  TVector3 MomRecBP = fTrk->GetMomentum();
205  aprec = float(MomRecBP.Mag());
206  Double_t lyambda = fTrk->GetLambda();
207  athrec = float(TMath::Pi() / 2. - lyambda);
208  aphrec = float(fTrk->GetPhi());
209  double mva_response = reader->EvaluateMVA(fmethodName);
210  hResponse->Fill(mva_response);
211  // if(mva_response>-0.0599) res=true; //BDT
212 
213  // if(mva_response<-0.0411){//new training for non-point-like beam
214  // [28/04/2014]
215  // if(mva_response<0.0947){//new training for non-point-like beam [28/04/2014]
216  if (mva_response <
217  -0.5) { // new training for non-point-like beam [28/09/2014]
218  // if(mva_response<0){
219  // if(mva_response<-0.1452){
220  // if(mva_response<-0.156){
221  // if(mva_response<-0.01){
222  res = false; // BDT //TEST
223  // cout<<"BDT="<<mva_response<<" for PCA:("<<axrec<<", "<<ayrec<<",
224  // "<<azrec<<") athrec = "<<1e3*athrec<<" aprec = "<<aprec<<endl;
225  } else
226  res = true;
227  return res;
228 }
229 
230 bool PndLmdSigCleanTask::CheckXY(FairTrackParP* fFittedTrkP) {
231  TVector3 MomRecLMD(fFittedTrkP->GetPx(), fFittedTrkP->GetPy(),
232  fFittedTrkP->GetPz());
233  MomRecLMD *= 1. / MomRecLMD.Mag();
234  bool dirOKx = true;
235  bool dirOKy = true;
236  if (fVerbose > 0) cout << "!XThFilt!" << endl;
237  double Xref = -19.1 + 1.12 * 1e3 * MomRecLMD.Theta() + fdX;
238  double diffX = abs(fFittedTrkP->GetX() - Xref);
239  if (fVerbose > 0)
240  cout << "fFittedTrkP.GetX() = " << fFittedTrkP->GetX() << " Xref = " << Xref
241  << " diffX = " << diffX << endl;
242  if (diffX > 3.0) dirOKx = false;
243  if (fVerbose > 0) cout << "!YPhFilt!" << endl;
244  double Yref = -0.00651 + 0.045 * 1e3 * MomRecLMD.Phi() + fdY;
245  double diffY = abs(fFittedTrkP->GetY() - Yref);
246  if (fVerbose > 0)
247  cout << "fFittedTrkP.GetY() = " << fFittedTrkP->GetY() << " Yref = " << Yref
248  << " diffY = " << diffY << endl;
249  if (diffY > 4.0) dirOKy = false;
250 
251  bool res = false;
252  if (dirOKx && dirOKy) res = true;
253  return res;
254 }
255 
int fVerbose
Definition: poormantracks.C:24
Int_t res
Definition: anadigi.C:166
virtual InitStatus Init()
TClonesArray * fRecBPTracks
bool CheckXY(FairTrackParP *fTrk)
double diffX
Definition: anaLmdReco.C:76
virtual void Exec(Option_t *opt)
bool Check(FairTrackParH *fTrk)
TClonesArray * fTrackParFinal
bool CheckMom(double prec)
virtual void SetParContainers()
Double_t
double diffY
Definition: anaLmdReco.C:76
TMVA::Reader * reader
friend F32vec4 fabs(const F32vec4 &a)
Definition: P4_F32vec4.h:47
static PndGeoHandling * Instance()
ClassImp(PndAnaContFact)
bool CheckMVA(FairTrackParH *fTrk)
Double_t Pi
TClonesArray * fTrkArray
PndGeoHandling * fGeoH
FairTrackParP GetParamFirst()
Definition: PndTrack.h:49