File indexing completed on 2025-07-14 08:14:37
0001
0002
0003
0004 #pragma once
0005
0006 #include <Math/Vector4D.h>
0007 #include <edm4hep/MCParticleCollection.h>
0008 #include <edm4eic/ReconstructedParticleCollection.h>
0009 #include <set>
0010
0011 using ROOT::Math::PxPyPzEVector;
0012
0013 namespace eicrecon {
0014
0015 template <class T> auto find_first_with_pdg(const T* parts, const std::set<int32_t>& pdg) {
0016 T c;
0017 c.setSubsetCollection();
0018 for (const auto& p : *parts) {
0019 if (pdg.count(p.getPDG()) > 0) {
0020 c.push_back(p);
0021 break;
0022 }
0023 }
0024 return c;
0025 }
0026
0027 template <class T>
0028 auto find_first_with_status_pdg(const T* parts, const std::set<int32_t>& status,
0029 const std::set<int32_t>& pdg) {
0030 T c;
0031 c.setSubsetCollection();
0032 for (const auto& p : *parts) {
0033 if (status.count(p.getGeneratorStatus()) > 0 && pdg.count(p.getPDG()) > 0) {
0034 c.push_back(p);
0035 break;
0036 }
0037 }
0038 return c;
0039 }
0040
0041 inline auto find_first_beam_electron(const edm4hep::MCParticleCollection* mcparts) {
0042 return find_first_with_status_pdg(mcparts, {4}, {11});
0043 }
0044
0045 inline auto find_first_beam_hadron(const edm4hep::MCParticleCollection* mcparts) {
0046 return find_first_with_status_pdg(mcparts, {4}, {2212, 2112});
0047 }
0048
0049 inline auto find_first_scattered_electron(const edm4hep::MCParticleCollection* mcparts) {
0050 return find_first_with_status_pdg(mcparts, {1}, {11});
0051 }
0052
0053 inline auto find_first_scattered_electron(const edm4eic::ReconstructedParticleCollection* rcparts) {
0054 return find_first_with_pdg(rcparts, {11});
0055 }
0056
0057 template <typename Vector3>
0058 PxPyPzEVector round_beam_four_momentum(const Vector3& p_in, const float mass,
0059 const std::vector<float>& pz_set,
0060 const float crossing_angle = 0.0) {
0061 PxPyPzEVector p_out;
0062 for (const auto& pz : pz_set) {
0063 if (std::abs(p_in.z / pz - 1) < 0.1) {
0064 p_out.SetPz(pz);
0065 break;
0066 }
0067 }
0068 p_out.SetPx(p_out.Pz() * sin(crossing_angle));
0069 p_out.SetPz(p_out.Pz() * cos(crossing_angle));
0070 p_out.SetE(std::hypot(p_out.Px(), p_out.Pz(), mass));
0071 return p_out;
0072 }
0073
0074 }