File indexing completed on 2025-08-03 08:12:30
0001 #include "DVMPHelper.h"
0002
0003 #include <cmath>
0004 #include <iostream>
0005 DVMPHelper::DVMPHelper(std::vector<float> reco_eta,
0006 std::vector<float> reco_phi,
0007 std::vector<float> reco_ptotal,
0008 std::vector<int> reco_charge,
0009 std::vector<float> reco_cluster_e,
0010 std::vector<bool> reco_is_scattered_lepton,
0011 std::vector<float> true_eta,
0012 std::vector<float> true_phi,
0013 std::vector<float> true_ptotal,
0014 std::vector<int> pid,
0015 std::vector<bool> is_scattered_lepton)
0016 {
0017
0018 _size_reco = reco_eta.size();
0019 _size_truth = true_eta.size();
0020
0021 rparticles = (DVMPHelper::particle_reco*)malloc(_size_reco * sizeof(DVMPHelper::particle_reco));
0022 tparticles = (DVMPHelper::particle_truth*)malloc(_size_truth * sizeof(DVMPHelper::particle_truth));
0023
0024 for(int i = 0 ; i < _size_reco ; i++)
0025 {
0026 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));
0027 }
0028 for(int j = 0 ; j <_size_truth ; j++)
0029 {
0030 tparticles[j]=GetParticleTruth(true_eta.at(j),true_phi.at(j),true_ptotal.at(j),pid.at(j),is_scattered_lepton.at(j));
0031 }
0032 }
0033
0034 DVMPHelper::particle_reco
0035 DVMPHelper::GetParticleReco(float eta, float phi, float ptotal, int charge,float e,bool is_scattered_lepton)
0036 {
0037 DVMPHelper::particle_reco particle = {eta,phi,ptotal,charge,e,is_scattered_lepton};
0038 return particle;
0039 }
0040
0041 DVMPHelper::particle_truth
0042 DVMPHelper::GetParticleTruth(float eta, float phi, float ptotal, int pid, bool is_scattered_lepton)
0043 {
0044 DVMPHelper::particle_truth particle = {eta,phi,ptotal,pid,is_scattered_lepton};
0045 return particle;
0046 }
0047
0048 float
0049 DVMPHelper::get_invariant_mass(DVMPHelper::particle_reco p1,
0050 DVMPHelper::particle_reco p2)
0051 {
0052 float pt1 = DVMPHelper::get_pt(p1.eta,p1.ptotal);
0053 float pt2 = DVMPHelper::get_pt(p2.eta,p2.ptotal);
0054
0055 float eta1= p1.eta;
0056 float eta2= p2.eta;
0057
0058 float phi1= p1.phi;
0059 float phi2= p2.phi;
0060
0061 float Msquared = 2*pt1*pt2*(cosh(eta1-eta2)-cos(phi1-phi2));
0062 return sqrt(Msquared);
0063 }
0064
0065 float
0066 DVMPHelper::get_invariant_mass(DVMPHelper::particle_truth p1,
0067 DVMPHelper::particle_truth p2)
0068 {
0069 float pt1 = DVMPHelper::get_pt(p1.eta,p1.ptotal);
0070 float pt2 = DVMPHelper::get_pt(p2.eta,p2.ptotal);
0071
0072 float eta1= p1.eta;
0073 float eta2= p2.eta;
0074
0075 float phi1= p1.phi;
0076 float phi2= p2.phi;
0077
0078 float Msquared = 2*pt1*pt2*(cosh(eta1-eta2)-cos(phi1-phi2));
0079 return sqrt(Msquared);
0080 }
0081
0082 float
0083 DVMPHelper::get_pt(float eta, float ptotal)
0084 {
0085 float theta = 2*atan(exp(-1*eta));
0086 float pt = ptotal * sin(theta);
0087 return pt;
0088 }
0089
0090 bool
0091 DVMPHelper::find_positron()
0092 {
0093 for(int i = 0 ; i < _size_reco ; i++)
0094 {
0095 if(rparticles[i].charge==1)
0096 return true;
0097 }
0098 return false;
0099 }
0100
0101 bool
0102 DVMPHelper::pass_cut(int index)
0103 {
0104 const float ep_cut = 0.7;
0105 if( rparticles[index].e / rparticles[index].ptotal > ep_cut )
0106 return true;
0107 else
0108 return false;
0109 }
0110
0111 std::vector<float>
0112 DVMPHelper::calculateInvariantMass_1()
0113 {
0114 std::vector<float> inv_mass;
0115
0116
0117 if(_size_reco<=1)
0118 {
0119 inv_mass.push_back(NAN);
0120 return inv_mass;
0121 }
0122
0123
0124 if(!DVMPHelper::find_positron())
0125 {
0126 inv_mass.push_back(NAN);
0127 return inv_mass;
0128 }
0129
0130
0131 int idx_positron=-1;
0132 std::vector<int> idx_electron;
0133 for(int i = 0 ; i < _size_reco ; i++)
0134 {
0135 if( rparticles[i].charge == 1 )
0136 idx_positron=i;
0137 else if( rparticles[i].charge == -1 )
0138 idx_electron.push_back(i);
0139 }
0140
0141 if(!(pass_cut(idx_positron)))
0142 {
0143 inv_mass.push_back(NAN);
0144 return inv_mass;
0145 }
0146
0147 for(unsigned i = 0 ; i < idx_electron.size() ; i++)
0148 {
0149 if( !pass_cut(idx_electron.at(i)) )
0150 idx_electron.erase(idx_electron.begin()+i);
0151 }
0152
0153 if(idx_electron.size()==0)
0154 {
0155 inv_mass.push_back(NAN);
0156 return inv_mass;
0157 }
0158
0159 for(unsigned i = 0; i < idx_electron.size() ; i++)
0160 {
0161 inv_mass.push_back(DVMPHelper::get_invariant_mass( rparticles[idx_electron.at(i)], rparticles[idx_positron]));
0162 }
0163 return inv_mass;
0164 }
0165
0166 std::vector<float>
0167 DVMPHelper::calculateInvariantMass_2()
0168 {
0169 std::vector<float> inv_mass;
0170
0171
0172 int idx_positron=-1;
0173 std::vector<int> idx_electron;
0174 for(int i = 0 ; i < _size_truth ; i++)
0175 {
0176 if( tparticles[i].pid == -11 )
0177 idx_positron=i;
0178 else if( tparticles[i].pid == 11 )
0179 idx_electron.push_back(i);
0180 }
0181
0182
0183 for(unsigned i = 0; i < idx_electron.size() ; i++)
0184 {
0185 inv_mass.push_back(DVMPHelper::get_invariant_mass( tparticles[idx_electron.at(i)], tparticles[idx_positron]));
0186 }
0187 return inv_mass;
0188 }
0189
0190 std::vector<float>
0191 DVMPHelper::calculateInvariantMass_3()
0192 {
0193 std::vector<float> inv_mass;
0194
0195
0196 if(_size_reco<=1)
0197 {
0198 inv_mass.push_back(NAN);
0199 return inv_mass;
0200 }
0201
0202
0203 if(!DVMPHelper::find_positron())
0204 {
0205 inv_mass.push_back(NAN);
0206 return inv_mass;
0207 }
0208
0209
0210 int idx_positron=-1;
0211 std::vector<int> idx_electron;
0212 for(int i = 0 ; i < _size_reco ; i++)
0213 {
0214 if( rparticles[i].charge == 1 )
0215 idx_positron=i;
0216 else if( rparticles[i].charge == -1 && rparticles[i].is_scattered_lepton==false )
0217 idx_electron.push_back(i);
0218 }
0219
0220 if(!(pass_cut(idx_positron)))
0221 {
0222 inv_mass.push_back(NAN);
0223 return inv_mass;
0224 }
0225
0226 for(unsigned i = 0 ; i < idx_electron.size() ; i++)
0227 {
0228 if( !pass_cut(idx_electron.at(i)) )
0229 idx_electron.erase(idx_electron.begin()+i);
0230 }
0231
0232 if(idx_electron.size()==0)
0233 {
0234 inv_mass.push_back(NAN);
0235 return inv_mass;
0236 }
0237
0238 for(unsigned i = 0; i < idx_electron.size() ; i++)
0239 {
0240 inv_mass.push_back(DVMPHelper::get_invariant_mass( rparticles[idx_electron.at(i)], rparticles[idx_positron]));
0241 }
0242 return inv_mass;
0243 }
0244
0245 std::vector<float>
0246 DVMPHelper::calculateInvariantMass_4()
0247 {
0248 std::vector<float> inv_mass;
0249
0250
0251 if(_size_reco<=1)
0252 {
0253 inv_mass.push_back(NAN);
0254 return inv_mass;
0255 }
0256
0257
0258 if(!DVMPHelper::find_positron())
0259 {
0260 inv_mass.push_back(NAN);
0261 return inv_mass;
0262 }
0263
0264
0265 int idx_positron=-1;
0266 std::vector<int> idx_electron;
0267 for(int i = 0 ; i < _size_reco ; i++)
0268 {
0269 if( rparticles[i].charge == 1 )
0270 idx_positron=i;
0271 else if( rparticles[i].charge == -1 && rparticles[i].is_scattered_lepton==true )
0272 idx_electron.push_back(i);
0273 }
0274
0275 if(!(pass_cut(idx_positron)))
0276 {
0277 inv_mass.push_back(NAN);
0278 return inv_mass;
0279 }
0280
0281 for(unsigned i = 0 ; i < idx_electron.size() ; i++)
0282 {
0283 if( !pass_cut(idx_electron.at(i)) )
0284 idx_electron.erase(idx_electron.begin()+i);
0285 }
0286
0287 if(idx_electron.size()==0)
0288 {
0289 inv_mass.push_back(NAN);
0290 return inv_mass;
0291 }
0292
0293 for(unsigned i = 0; i < idx_electron.size() ; i++)
0294 {
0295 inv_mass.push_back(DVMPHelper::get_invariant_mass( rparticles[idx_electron.at(i)], rparticles[idx_positron]));
0296 }
0297 return inv_mass;
0298 }
0299
0300 std::vector<float>
0301 DVMPHelper::calculateInvariantMass_5()
0302 {
0303 std::vector<float> inv_mass;
0304
0305
0306 int idx_positron=-1;
0307 std::vector<int> idx_electron;
0308 for(int i = 0 ; i < _size_truth ; i++)
0309 {
0310 if( tparticles[i].pid == -11 )
0311 idx_positron=i;
0312 else if( tparticles[i].pid == 11 && tparticles[i].is_scattered_lepton==false)
0313 idx_electron.push_back(i);
0314 }
0315
0316
0317 for(unsigned i = 0; i < idx_electron.size() ; i++)
0318 {
0319 inv_mass.push_back(DVMPHelper::get_invariant_mass( tparticles[idx_electron.at(i)], tparticles[idx_positron]));
0320 }
0321
0322 return inv_mass;
0323 }
0324
0325 std::vector<float>
0326 DVMPHelper::calculateInvariantMass_6()
0327 {
0328 std::vector<float> inv_mass;
0329
0330 int idx_positron=-1;
0331 std::vector<int> idx_electron;
0332 for(int i = 0 ; i < _size_truth ; i++)
0333 {
0334 if( tparticles[i].pid == -11 )
0335 idx_positron=i;
0336 else if( tparticles[i].pid == 11 && tparticles[i].is_scattered_lepton==true)
0337 idx_electron.push_back(i);
0338 }
0339
0340
0341 for(unsigned i = 0; i < idx_electron.size() ; i++)
0342 {
0343 inv_mass.push_back(DVMPHelper::get_invariant_mass( tparticles[idx_electron.at(i)], tparticles[idx_positron]));
0344 }
0345 return inv_mass;
0346 }
0347