FairRoot/PandaRoot
PndPidDiscAssociatorTask.cxx
Go to the documentation of this file.
2 #include "PndPidCandidate.h"
3 #include "PndPidProbability.h"
4 #include "FairRootManager.h"
5 #include "TMath.h"
6 #include "TF1.h"
7 #include "Riostream.h"
8 
9 
10 //___________________________________________________________
12  //
13  FairRootManager *fManager =FairRootManager::Instance();
14  fManager->Write();
15 }
16 
17 //___________________________________________________________
19  //---
20  fPidChargedProb = new TClonesArray("PndPidProbability");
22 }
23 
24 //___________________________________________________________
25 PndPidDiscAssociatorTask::PndPidDiscAssociatorTask(const char *name, const char *title):FairTask(name)
26 {
27  //---
28  fPidChargedProb = new TClonesArray("PndPidProbability");
30  SetTitle(title);
31 }
32 
33 //___________________________________________________________
35 
36  std::cout << "InitStatus PndPidDiscAssociatorTask::Init()" << std::endl;
37 
38  FairRootManager *fManager =FairRootManager::Instance();
39 
40  fPidChargedCand = (TClonesArray *)fManager->GetObject("PidChargedCand"+fTrackBranchNamePidHypo);
41  if ( ! fPidChargedCand) {
42  std::cout << "-I- PndPidDiscAssociatorTask::Init: No PndPidCandidate array PidChargedCand there!" << std::endl;
43  return kERROR;
44  }
45 
46  Register();
47 
48  std::cout << "-I- PndPidDiscAssociatorTask::Init: Success!" << std::endl;
49 
50  return kSUCCESS;
51 }
52 
53 //______________________________________________________
55  //--
56 }
57 //______________________________________________________
59  if (fPidChargedProb->GetEntriesFast() != 0) fPidChargedProb->Clear();
60  if(fVerbose>1) std::cout << "-I- Start PndPidDiscAssociatorTask. "<<std::endl;
61 
62  // Get the Candidates
63  for(Int_t i=0; i<fPidChargedCand->GetEntriesFast(); i++)
64  {
66  TClonesArray& pidRef = *fPidChargedProb;
67  PndPidProbability* prob = new(pidRef[i]) PndPidProbability();// initializes with zeros
68  prob->SetIndex(i);
69  if (pidcand->GetDiscIndex()==-1) continue;
70  DoPidMatch(pidcand,prob);
71  }
72 
73 }
74 
76 {
77 
78  // electron
79  {
80  Double_t mass = 0.0005;
81  Double_t sigma = 0.006;
82  prob->SetElectronPdf(GetPdf(pidcand->GetDiscThetaC(),pidcand->GetMomentum().Mag(),mass, sigma));
83  }
84 
85  // muon
86  {
87  Double_t mass = 0.106;
88  Double_t sigma = 0.006;
89  prob->SetMuonPdf(GetPdf(pidcand->GetDiscThetaC(),pidcand->GetMomentum().Mag(),mass, sigma));
90  }
91 
92  // pion
93  {
94  Double_t mass = 0.140;
95  Double_t sigma = 0.006;
96  prob->SetPionPdf(GetPdf(pidcand->GetDiscThetaC(),pidcand->GetMomentum().Mag(),mass, sigma));
97  }
98 
99  // kaon
100  {
101  Double_t mass = 0.494;
102  Double_t sigma = 0.005;
103  prob->SetKaonPdf(GetPdf(pidcand->GetDiscThetaC(),pidcand->GetMomentum().Mag(),mass, sigma));
104  }
105 
106  // proton
107  {
108  Double_t mass = 0.938;
109  Double_t sigma = 0.005;
110  prob->SetProtonPdf(GetPdf(pidcand->GetDiscThetaC(),pidcand->GetMomentum().Mag(),mass, sigma));
111  }
112 }
113 
115 {
116 
117  Double_t beta = mom / TMath::Sqrt(mom*mom + mass*mass);
118  if ( (beta>0.) && ((1./1.47/beta)<1.) )
119  {
120  Double_t center = 1./1.47/beta;
121  TF1 *gausPdf = new TF1("gausPdf","gausn",0,1);
122  gausPdf->SetParameter(0,1);
123  gausPdf->SetParameter(1,center);
124  gausPdf->SetParameter(2,sigma);
125  Double_t val = gausPdf->Eval(TMath::Cos(thetaC));
126  delete gausPdf;
127  return val;
128  }
129  else
130  {
131  // FIXME: Don't write zeros to that pdf!
132  return 0.;
133  }
134 }
135 
136 //_________________________________________________________________
138  //---
139  FairRootManager::Instance()->
140  Register("PidAlgoDisc"+fTrackBranchNamePidHypo,"Pid", fPidChargedProb, kTRUE);
141 }
142 
143 //_________________________________________________________________
145 }
146 
147 //_________________________________________________________________
149  //---
150 }
151 
152 
int fVerbose
Definition: poormantracks.C:24
Int_t i
Definition: run_full.C:25
void SetPionPdf(Double_t val)
Int_t GetDiscIndex() const
Double_t val[nBoxes][nFEBox]
Definition: createCalib.C:11
static T Sqrt(const T &x)
Definition: PndCAMath.h:37
void SetKaonPdf(Double_t val)
Double_t GetPdf(Double_t thetaC, Double_t mom, Double_t mass, Double_t sigma)
Double_t sigma[nsteps]
Definition: dedx_bands.C:65
Double_t mom
Definition: plot_dirc.C:14
static T Cos(const T &x)
Definition: PndCAMath.h:43
void SetElectronPdf(Double_t val)
void DoPidMatch(PndPidCandidate *pidcand, PndPidProbability *prob)
void SetMuonPdf(Double_t val)
Float_t GetDiscThetaC() const
h_MC_angle SetTitle("MC truth: opening angle of #pi^{0}")
Double_t
virtual void Exec(Option_t *option)
TClonesArray * fPidChargedProb
PndPidCandidate TCA for charged particles.
TString name
void SetProtonPdf(Double_t val)
ClassImp(PndAnaContFact)
TString fTrackBranchNamePidHypo
PndPidProbability TCA for charged particles.
TVector3 GetMomentum() const
Double_t thetaC
Definition: plot_dirc.C:16
void SetIndex(Int_t idx)