FairRoot/PandaRoot
PndPidSttAssociatorTask.cxx
Go to the documentation of this file.
1 //
2 // PndPidSttAssociatorTask.cxx
3 //
4 // ============================================
5 
7 #include "PndPidCandidate.h"
8 #include "PndPidProbability.h"
9 
10 #include "FairRootManager.h"
11 
12 #include "TClonesArray.h"
13 
14 #include <iostream>
15 #include <cmath>
16 
17 using std::cout;
18 using std::endl;
19 using std::sqrt;
20 //___________________________________________________________
22  delete fElectronDEDXMean;
23  delete fMuonDEDXMean;
24  delete fPionDEDXMean;
25  delete fKaonDEDXMean;
26  delete fProtonDEDXMeanL;
27  delete fProtonDEDXMeanH;
28 }
29 
30 //___________________________________________________________
32  fPidChargedProb = new TClonesArray("PndPidProbability");
33  fDefaultHypo = kTRUE;
34 }
35 
36 //___________________________________________________________
37 PndPidSttAssociatorTask::PndPidSttAssociatorTask(const char *name, const char *title):FairTask(name)
38 {
39  fPidChargedProb = new TClonesArray("PndPidProbability");
40  fDefaultHypo = kTRUE;
41  SetTitle(title);
42 }
43 
44 //___________________________________________________________
46 
47  if(fVerbose > 0) std::cout << "PndPidSttAssociatorTask::Init()" << std::endl;
48 
49  // Get RootManager
50  FairRootManager* ioman = FairRootManager::Instance();
51  if ( ! ioman ) {
52  std::cout << "-E- PndPidSttAssociatorTask::Init: "
53  << "RootManager not instantiated!" << std::endl;
54  return kFATAL;
55  }
56 
57  fPidChargedCand = (TClonesArray *) ioman->GetObject("PidChargedCand"+fTrackBranchNamePidHypo);
58  if ( ! fPidChargedCand) {
59  std::cout << "-E- PndPidSttAssociatorTask::Init: No PidChargedCand array!" << std::endl;
60  return kERROR;
61  }
62 
63  // set up functions
76 
77  ioman->Register("PidAlgoStt"+fTrackBranchNamePidHypo,"Pid", fPidChargedProb, kTRUE);
78 
79  if(fDefaultHypo == kTRUE) std::cout << "-I- PndPidSttAssociatorTask: using default mass hypo bands (muon)" << endl;
80  else std::cout << "-I- PndPidSttAssociatorTask: NOT using default mass hypo bands" << endl;
81 
82  std::cout << "-I- PndPidSttAssociatorTask::Init: Intialization successfull" << endl;
83 
84  return kSUCCESS;
85 }
86 
88 
89  // cout << "PND PID STT ASSOCIATOR" << endl;
90 
91  fPidChargedProb->Clear();
92 
93  for(Int_t i = 0; i < fPidChargedCand->GetEntriesFast(); i++)
94  {
96  TClonesArray& pidRef = *fPidChargedProb;
97  PndPidProbability* prob = new(pidRef[i]) PndPidProbability();// initializes with flat probabilities
98  prob->SetIndex(i);
99 
100  // cout << "i " << i << " dedx " << pidCand->GetSttMeanDEDX() << endl;
101  if (pidCand->GetSttMeanDEDX() == 0) continue;
102 
103  // CUT on momentum: if mom > 0.8 GeV/c
104  // no way to decide what particle it is
105  if (pidCand->GetMomentum().Mag() < 0.2 ) continue;
106  if (pidCand->GetMomentum().Mag() > 5.0 ) continue;
107 
108  DoPidMatch(pidCand,prob);
109  }
110 
111 }
112 
114 {
115  // measured quantities
116  Double_t momentum = pidcand->GetMomentum().Mag();
117  Double_t dedx = pidcand->GetSttMeanDEDX();
118 
119  // parametrized quantities (gaussian)
120  Double_t dedx_mean, dedx_sigma;
121 
122  // e
123  dedx_mean = fElectronDEDXMean->Eval(momentum);
124  dedx_sigma = fElectronDEDXSigma->Eval(momentum);
125  prob->SetElectronPdf(GetPdf(dedx, dedx_mean, dedx_sigma));
126  // cout << "e: " << pidcand->GetMomentum().Mag()
127  // << " " << pidcand->GetSttMeanDEDX()
128  // << " " << dedx_mean
129  // << " " << dedx_sigma
130  // << " " << prob->GetElectronPdf() << endl;
131 
132  // mu
133  dedx_mean = fMuonDEDXMean->Eval(momentum);
134  dedx_sigma = fMuonDEDXSigma->Eval(momentum);
135  prob->SetMuonPdf(GetPdf(dedx, dedx_mean, dedx_sigma));
136  // cout << "mu: " << pidcand->GetMomentum().Mag()
137  // << " " << pidcand->GetSttMeanDEDX()
138  // << " " << dedx_mean
139  // << " " << dedx_sigma
140  // << " " << prob->GetMuonPdf() << endl;
141 
142  // pi
143  dedx_mean = fPionDEDXMean->Eval(momentum);
144  dedx_sigma = fPionDEDXSigma->Eval(momentum);
145  prob->SetPionPdf(GetPdf(dedx, dedx_mean, dedx_sigma));
146  // cout << "pi: " << pidcand->GetMomentum().Mag()
147  // << " " << pidcand->GetSttMeanDEDX()
148  // << " " << dedx_mean
149  // << " " << dedx_sigma
150  // << " " << prob->GetPionPdf() << endl;
151 
152  // k
153  dedx_mean = fKaonDEDXMean->Eval(momentum);
154  dedx_sigma = fKaonDEDXSigma->Eval(momentum);
155  prob->SetKaonPdf(GetPdf(dedx, dedx_mean, dedx_sigma));
156  // cout << "k: " << pidcand->GetMomentum().Mag()
157  // << " " << pidcand->GetSttMeanDEDX()
158  // << " " << dedx_mean
159  // << " " << dedx_sigma
160  // << " " << prob->GetKaonPdf() << endl;
161 
162  // p
163  if(momentum < 1.){
164  dedx_mean = fProtonDEDXMeanL->Eval(momentum);
165  dedx_sigma = fProtonDEDXSigmaL->Eval(momentum);
166  prob->SetProtonPdf(GetPdf(dedx, dedx_mean, dedx_sigma));
167  }
168  if(momentum > 1.){
169  dedx_mean = fProtonDEDXMeanH->Eval(momentum);
170  dedx_sigma = fProtonDEDXSigmaH->Eval(momentum);
171  prob->SetProtonPdf(GetPdf(dedx, dedx_mean, dedx_sigma));
172  }
173  // cout << "p: " << pidcand->GetMomentum().Mag()
174  // << " " << pidcand->GetSttMeanDEDX()
175  // << " " << dedx_mean
176  // << " " << dedx_sigma
177  // << " " << prob->GetProtonPdf() << endl;
178 
179  // cout << endl;
180 
181 
182 }
183 
185 {
186  // gaussian of dedx_mean distribution @ a certain momentum
187  TF1 *gausPdf = new TF1("gausPdf","gausn", 0, 100); // CHECK the extremities
188  gausPdf->SetParameters(1, mean, sigma);
189  Double_t val = gausPdf->Eval(dedx);
190  delete gausPdf;
191  return val;
192 }
193 
194 
195 // functions to parametrize the dedx_mean as function of momentum -----------
196 
198  fElectronDEDXMean = new TF1("emdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5.);
199 
200  if(fDefaultHypo == kTRUE) fElectronDEDXMean->SetParameters(-2.53435e-02,1.35409e-01,7.34210e+00);
201  else fElectronDEDXMean->SetParameters(-2.53435e-02,1.35409e-01,7.34210e+00);
202 
203 }
204 
206  fMuonDEDXMean = new TF1("mumdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5.);
207  if(fDefaultHypo == kTRUE) fMuonDEDXMean->SetParameters(8.84580e-02,7.70377e-01,5.38858e+00);
208  else fMuonDEDXMean->SetParameters(8.84580e-02,7.70377e-01,5.38858e+00);
209 
210 }
211 
213  fPionDEDXMean = new TF1("pimdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5);
214  if(fDefaultHypo == kTRUE) fPionDEDXMean->SetParameters(1.28760e-01,7.53150e-01,5.22487e+00);
215  else fPionDEDXMean->SetParameters(1.28760e-01,7.53150e-01,5.22487e+00);
216 
217 }
218 
220  fKaonDEDXMean = new TF1("kmdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5.);
221  if(fDefaultHypo == kTRUE) fKaonDEDXMean->SetParameters(1.56819e+00,8.85371e-01,4.13682e+00);
222  else fKaonDEDXMean->SetParameters(1.56819e+00,8.85371e-01,4.13682e+00);
223 
224 }
225 
227  fProtonDEDXMeanH = new TF1("pmdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5.);
228  if(fDefaultHypo == kTRUE) fProtonDEDXMeanH->SetParameters(4.16818e+00,6.90343e-01,3.97309e+00);
229  else fProtonDEDXMeanH->SetParameters(4.16818e+00,6.90343e-01,3.97309e+00);
230 
231 }
232 
234  fProtonDEDXMeanL = new TF1("pmdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5.);
235  if(fDefaultHypo == kTRUE) fProtonDEDXMeanL->SetParameters(6.52530,5.82758,1.86702);
236  else fProtonDEDXMeanL->SetParameters(6.52530,5.82758,1.86702);
237 
238 }
239 
240 
241 // functions to parametrize the dedx_sigma as function of momentum ----------
242 
244  fElectronDEDXSigma = new TF1("esdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5.);
245  if(fDefaultHypo == kTRUE) fElectronDEDXSigma->SetParameters(1.81859e-03,-1.01187e-02,6.76615e-01);
246  else fElectronDEDXSigma->SetParameters(1.81859e-03,-1.01187e-02,6.76615e-01);
247 
248 }
249 
251  fMuonDEDXSigma = new TF1("musdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5.);
252  if(fDefaultHypo == kTRUE) fMuonDEDXSigma->SetParameters(8.54877e-03,2.96974e-02,5.51581e-01);
253  else fMuonDEDXSigma->SetParameters(8.54877e-03,2.96974e-02,5.51581e-01);
254 
255 }
256 
258  fPionDEDXSigma = new TF1("pisdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5.);
259  if(fDefaultHypo == kTRUE) fPionDEDXSigma->SetParameters(1.49778e-02,3.05617e-02,5.43355e-01);
260  else fPionDEDXSigma->SetParameters(1.49778e-02,3.05617e-02,5.43355e-01);
261 
262 }
263 
265  fKaonDEDXSigma = new TF1("ksdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5.);
266  if(fDefaultHypo == kTRUE) fKaonDEDXSigma->SetParameters(2.30775e-01,8.81697e-02,4.20122e-01);
267  else fKaonDEDXSigma->SetParameters(2.30775e-01,8.81697e-02,4.20122e-01);
268 
269 }
270 
272  fProtonDEDXSigmaL = new TF1("psdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5.);
273  if(fDefaultHypo == kTRUE) fProtonDEDXSigmaL->SetParameters(1.11867e+00,1.78621e+00,-1.01217e-01);
274  else fProtonDEDXSigmaL->SetParameters(1.11867e+00,1.78621e+00,-1.01217e-01);
275 
276 }
278  fProtonDEDXSigmaH = new TF1("psdedx","[0] * (1./x)**2 + [1] * TMath::Log(x) + [2]", 0.2, 5.);
279  if(fDefaultHypo == kTRUE) fProtonDEDXSigmaH->SetParameters(5.17593e-01,6.68813e-02,4.59503e-01);
280  else fProtonDEDXSigmaL->SetParameters(5.17593e-01,6.68813e-02,4.59503e-01);
281 
282 }
283 
virtual void Exec(Option_t *opt)
Double_t GetPdf(Double_t dedx, Double_t mean, Double_t sigma)
int fVerbose
Definition: poormantracks.C:24
TClonesArray * fPidChargedProb
charged candidates
Int_t i
Definition: run_full.C:25
void SetPionPdf(Double_t val)
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
Float_t GetSttMeanDEDX() const
Double_t val[nBoxes][nFEBox]
Definition: createCalib.C:11
void SetKaonPdf(Double_t val)
Double_t sigma[nsteps]
Definition: dedx_bands.C:65
void DoPidMatch(PndPidCandidate *pidcand, PndPidProbability *prob)
void SetElectronPdf(Double_t val)
void SetMuonPdf(Double_t val)
h_MC_angle SetTitle("MC truth: opening angle of #pi^{0}")
Double_t
TString name
void SetProtonPdf(Double_t val)
ClassImp(PndAnaContFact)
Double_t mean[nsteps]
Definition: dedx_bands.C:65
TVector3 GetMomentum() const
void SetIndex(Int_t idx)