Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DVMPHelper.C
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file DVMPHelper.C
1 #include "DVMPHelper.h"
2 
3 #include <cmath>
4 #include <iostream>
5 DVMPHelper::DVMPHelper(std::vector<float> reco_eta,
6  std::vector<float> reco_phi,
7  std::vector<float> reco_ptotal,
8  std::vector<int> reco_charge,
9  std::vector<float> reco_cluster_e,
10  std::vector<bool> reco_is_scattered_lepton,
11  std::vector<float> true_eta,
12  std::vector<float> true_phi,
13  std::vector<float> true_ptotal,
14  std::vector<int> pid,
15  std::vector<bool> is_scattered_lepton)
16 {
17 
18  _size_reco = reco_eta.size();
19  _size_truth = true_eta.size();
20 
23 
24  for(int i = 0 ; i < _size_reco ; i++)
25  {
26  rparticles[i]=GetParticleReco(reco_eta.at(i),reco_phi.at(i),reco_ptotal.at(i),reco_charge.at(i),reco_cluster_e.at(i),reco_is_scattered_lepton.at(i));
27  }
28  for(int j = 0 ; j <_size_truth ; j++)
29  {
30  tparticles[j]=GetParticleTruth(true_eta.at(j),true_phi.at(j),true_ptotal.at(j),pid.at(j),is_scattered_lepton.at(j));
31  }
32 }
33 
35 DVMPHelper::GetParticleReco(float eta, float phi, float ptotal, int charge,float e,bool is_scattered_lepton)
36 {
37  DVMPHelper::particle_reco particle = {eta,phi,ptotal,charge,e,is_scattered_lepton};
38  return particle;
39 }
40 
42 DVMPHelper::GetParticleTruth(float eta, float phi, float ptotal, int pid, bool is_scattered_lepton)
43 {
44  DVMPHelper::particle_truth particle = {eta,phi,ptotal,pid,is_scattered_lepton};
45  return particle;
46 }
47 
48 float
51 {
52  float pt1 = DVMPHelper::get_pt(p1.eta,p1.ptotal);
53  float pt2 = DVMPHelper::get_pt(p2.eta,p2.ptotal);
54 
55  float eta1= p1.eta;
56  float eta2= p2.eta;
57 
58  float phi1= p1.phi;
59  float phi2= p2.phi;
60 
61  float Msquared = 2*pt1*pt2*(cosh(eta1-eta2)-cos(phi1-phi2));
62  return sqrt(Msquared);
63 }
64 
65 float
68 {
69  float pt1 = DVMPHelper::get_pt(p1.eta,p1.ptotal);
70  float pt2 = DVMPHelper::get_pt(p2.eta,p2.ptotal);
71 
72  float eta1= p1.eta;
73  float eta2= p2.eta;
74 
75  float phi1= p1.phi;
76  float phi2= p2.phi;
77 
78  float Msquared = 2*pt1*pt2*(cosh(eta1-eta2)-cos(phi1-phi2));
79  return sqrt(Msquared);
80 }
81 
82 float
83 DVMPHelper::get_pt(float eta, float ptotal)
84 {
85  float theta = 2*atan(exp(-1*eta));
86  float pt = ptotal * sin(theta);
87  return pt;
88 }
89 
90 bool
92 {
93  for(int i = 0 ; i < _size_reco ; i++)
94  {
95  if(rparticles[i].charge==1)
96  return true;
97  }
98  return false;
99 }
100 
101 bool
103 {
104  const float ep_cut = 0.7;
105  if( rparticles[index].e / rparticles[index].ptotal > ep_cut )
106  return true;
107  else
108  return false;
109 }
110 
111 std::vector<float>
113 {
114  std::vector<float> inv_mass;
115 
116  // Assert number of particles in event is greater than 1
117  if(_size_reco<=1)
118  {
119  inv_mass.push_back(NAN);
120  return inv_mass;
121  }
122 
123  // Assert a positron exists
125  {
126  inv_mass.push_back(NAN);
127  return inv_mass;
128  }
129 
130  // Record index of positron and electrons
131  int idx_positron=-1;
132  std::vector<int> idx_electron;
133  for(int i = 0 ; i < _size_reco ; i++)
134  {
135  if( rparticles[i].charge == 1 )
136  idx_positron=i;
137  else if( rparticles[i].charge == -1 )
138  idx_electron.push_back(i);
139  }
140  // Ensure positron and electron(s) pass ep_cut
141  if(!(pass_cut(idx_positron)))
142  {
143  inv_mass.push_back(NAN);
144  return inv_mass;
145  }
146 
147  for(unsigned i = 0 ; i < idx_electron.size() ; i++)
148  {
149  if( !pass_cut(idx_electron.at(i)) )
150  idx_electron.erase(idx_electron.begin()+i);
151  }
152 
153  if(idx_electron.size()==0) // all found electrons fail cut
154  {
155  inv_mass.push_back(NAN);
156  return inv_mass;
157  }
158  // Calculate invariant mass for all electron and positron pairs
159  for(unsigned i = 0; i < idx_electron.size() ; i++)
160  {
161  inv_mass.push_back(DVMPHelper::get_invariant_mass( rparticles[idx_electron.at(i)], rparticles[idx_positron]));
162  }
163  return inv_mass;
164 }
165 
166 std::vector<float>
168 {
169  std::vector<float> inv_mass;
170 
171  // Record index of positron and electrons
172  int idx_positron=-1;
173  std::vector<int> idx_electron;
174  for(int i = 0 ; i < _size_truth ; i++)
175  {
176  if( tparticles[i].pid == -11 )
177  idx_positron=i;
178  else if( tparticles[i].pid == 11 )
179  idx_electron.push_back(i);
180  }
181 
182  // Calculate invariant mass for all electron positron pairs
183  for(unsigned i = 0; i < idx_electron.size() ; i++)
184  {
185  inv_mass.push_back(DVMPHelper::get_invariant_mass( tparticles[idx_electron.at(i)], tparticles[idx_positron]));
186  }
187  return inv_mass;
188 }
189 
190 std::vector<float>
192 {
193  std::vector<float> inv_mass;
194 
195  // Assert number of particles in event is greater than 1
196  if(_size_reco<=1)
197  {
198  inv_mass.push_back(NAN);
199  return inv_mass;
200  }
201 
202  // Assert a positron exists
204  {
205  inv_mass.push_back(NAN);
206  return inv_mass;
207  }
208 
209  // Record index of positron and electrons
210  int idx_positron=-1;
211  std::vector<int> idx_electron;
212  for(int i = 0 ; i < _size_reco ; i++)
213  {
214  if( rparticles[i].charge == 1 )
215  idx_positron=i;
216  else if( rparticles[i].charge == -1 && rparticles[i].is_scattered_lepton==false )
217  idx_electron.push_back(i);
218  }
219  // Ensure positron and electron(s) pass ep_cut
220  if(!(pass_cut(idx_positron)))
221  {
222  inv_mass.push_back(NAN);
223  return inv_mass;
224  }
225 
226  for(unsigned i = 0 ; i < idx_electron.size() ; i++)
227  {
228  if( !pass_cut(idx_electron.at(i)) )
229  idx_electron.erase(idx_electron.begin()+i);
230  }
231 
232  if(idx_electron.size()==0) // all found electrons fail cut
233  {
234  inv_mass.push_back(NAN);
235  return inv_mass;
236  }
237  // Calculate invariant mass for all electron and positron pairs
238  for(unsigned i = 0; i < idx_electron.size() ; i++)
239  {
240  inv_mass.push_back(DVMPHelper::get_invariant_mass( rparticles[idx_electron.at(i)], rparticles[idx_positron]));
241  }
242  return inv_mass;
243 }
244 
245 std::vector<float>
247 {
248  std::vector<float> inv_mass;
249 
250  // Assert number of particles in event is greater than 1
251  if(_size_reco<=1)
252  {
253  inv_mass.push_back(NAN);
254  return inv_mass;
255  }
256 
257  // Assert a positron exists
259  {
260  inv_mass.push_back(NAN);
261  return inv_mass;
262  }
263 
264  // Record index of positron and electrons
265  int idx_positron=-1;
266  std::vector<int> idx_electron;
267  for(int i = 0 ; i < _size_reco ; i++)
268  {
269  if( rparticles[i].charge == 1 )
270  idx_positron=i;
271  else if( rparticles[i].charge == -1 && rparticles[i].is_scattered_lepton==true )
272  idx_electron.push_back(i);
273  }
274  // Ensure positron and electron(s) pass ep_cut
275  if(!(pass_cut(idx_positron)))
276  {
277  inv_mass.push_back(NAN);
278  return inv_mass;
279  }
280 
281  for(unsigned i = 0 ; i < idx_electron.size() ; i++)
282  {
283  if( !pass_cut(idx_electron.at(i)) )
284  idx_electron.erase(idx_electron.begin()+i);
285  }
286 
287  if(idx_electron.size()==0) // all found electrons fail cut
288  {
289  inv_mass.push_back(NAN);
290  return inv_mass;
291  }
292  // Calculate invariant mass for all electron and positron pairs
293  for(unsigned i = 0; i < idx_electron.size() ; i++)
294  {
295  inv_mass.push_back(DVMPHelper::get_invariant_mass( rparticles[idx_electron.at(i)], rparticles[idx_positron]));
296  }
297  return inv_mass;
298 }
299 
300 std::vector<float>
302 {
303  std::vector<float> inv_mass;
304 
305  // Record index of positron and electrons
306  int idx_positron=-1;
307  std::vector<int> idx_electron;
308  for(int i = 0 ; i < _size_truth ; i++)
309  {
310  if( tparticles[i].pid == -11 )
311  idx_positron=i;
312  else if( tparticles[i].pid == 11 && tparticles[i].is_scattered_lepton==false)
313  idx_electron.push_back(i);
314  }
315 
316  // Calculate invariant mass for all electron positron pairs
317  for(unsigned i = 0; i < idx_electron.size() ; i++)
318  {
319  inv_mass.push_back(DVMPHelper::get_invariant_mass( tparticles[idx_electron.at(i)], tparticles[idx_positron]));
320  }
321 
322  return inv_mass;
323 }
324 
325 std::vector<float>
327 {
328  std::vector<float> inv_mass;
329  // Record index of positron and electrons
330  int idx_positron=-1;
331  std::vector<int> idx_electron;
332  for(int i = 0 ; i < _size_truth ; i++)
333  {
334  if( tparticles[i].pid == -11 )
335  idx_positron=i;
336  else if( tparticles[i].pid == 11 && tparticles[i].is_scattered_lepton==true)
337  idx_electron.push_back(i);
338  }
339 
340  // Calculate invariant mass for all electron positron pairs
341  for(unsigned i = 0; i < idx_electron.size() ; i++)
342  {
343  inv_mass.push_back(DVMPHelper::get_invariant_mass( tparticles[idx_electron.at(i)], tparticles[idx_positron]));
344  }
345  return inv_mass;
346 }
347