ATLAS Offline Software
MMLoadVariables.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
10 #include "Math/Vector4D.h"
11 #include <cmath>
12 #include <vector>
13 
15 
16 StatusCode MMLoadVariables::getTruthInfo(const EventContext& ctx,
17  const McEventCollection *truthContainer,
18  const TrackRecordCollection* trackRecordCollection,
19  std::map<std::pair<uint64_t,unsigned int>,evInf_entry>& Event_Info) const {
20  //*******Following MuonPRD code to access all the variables**********
21  std::vector<ROOT::Math::PtEtaPhiEVector> truthParticles, truthParticles_ent, truthParticles_pos;
22  std::vector<int> pdg;
23  std::vector<ROOT::Math::XYZVector> vertex;
24  float phiEntry_tmp = 0;
25  float phiPosition_tmp = 0;
26  float etaEntry_tmp = 0;
27  float etaPosition_tmp = 0;
28  int pdg_tmp = 0;
29  ROOT::Math::XYZVector vertex_tmp(0.,0.,0.);
30 
31  ROOT::Math::PtEtaPhiEVector thePart, theInfo;
32  auto MuEntry_Particle_n = (trackRecordCollection!=nullptr)?trackRecordCollection->size():0;
33  int j=0; // iteration of particle entries
34  if( truthContainer != nullptr ){
35  for(const auto subEvent : *truthContainer) {
36  for(const auto& particle : *subEvent){
37  const HepMC::FourVector momentum = particle->momentum();
38  if( HepMC::generations(particle) < 1 && std::abs(particle->pdg_id())==13){
39  thePart.SetCoordinates(momentum.perp(),momentum.eta(),momentum.phi(),momentum.e());
40  if(trackRecordCollection!=nullptr){
41  for(const auto & mit : *trackRecordCollection ) {
42  const CLHEP::Hep3Vector mumomentum = mit.GetMomentum();
43  const CLHEP::Hep3Vector muposition = mit.GetPosition();
44  if(!trackRecordCollection->empty() && HepMC::barcode(particle) == mit.barcode()) { // FIXME barcode-based
45  pdg_tmp = particle->pdg_id();
46  phiEntry_tmp = mumomentum.getPhi();
47  etaEntry_tmp = mumomentum.getEta();
48  phiPosition_tmp = muposition.getPhi();
49  etaPosition_tmp = muposition.getEta();
50  }
51  }//muentry loop
52  } // trackRecordCollection is not null
53 #ifdef HEPMC3
54  vertex_tmp = subEvent->vertices().front()->position();
55 #else
56  int l=0;
57  for(const auto vit : subEvent->vertex_range())
58  {
59  if(l!=0){break;}//get first vertex of iteration, may want to change this
60  l++;
61  const HepMC::GenVertex *vertex1 = vit;
62  const HepMC::FourVector& position = vertex1->position();
63  vertex_tmp.SetXYZ(position.x(),position.y(),position.z());
64  }//end vertex loop
65 #endif
66  }
67  j++;
68 
69  if(thePart.Pt() > 0. && HepMC::generations(particle) < 1){
70  bool addIt = true;
71  for(unsigned int ipart=0; ipart < truthParticles.size(); ipart++){
72  if( std::abs(thePart.Pt()-truthParticles[ipart].Pt()) < 0.001 ||
73  std::abs(thePart.Eta()-truthParticles[ipart].Eta()) < 0.001 ||
74  std::abs(xAOD::P4Helpers::deltaPhi(thePart.Phi(), truthParticles[ipart].Phi())) < 0.001 ||
75  std::abs(thePart.E()-truthParticles[ipart].E()) < 0.001 ) addIt = false;
76  }
77  if(addIt){
78  truthParticles.push_back(thePart);
79  //new stuff
80  vertex.push_back(vertex_tmp);
81  pdg.push_back(pdg_tmp);
82  truthParticles_ent.push_back(ROOT::Math::PtEtaPhiEVector(momentum.perp(),etaEntry_tmp ,phiEntry_tmp ,momentum.e()));
83  truthParticles_pos.push_back(ROOT::Math::PtEtaPhiEVector(momentum.perp(),etaPosition_tmp,phiPosition_tmp,momentum.e()));
84  }
85  }
86 
87  } //end particle loop
88  } //end truth container loop (should be only 1 container per event)
89  } // if truth container is not null
90 
91  uint64_t event = ctx.eventID().event_number();
92  for(unsigned int i=0; i<truthParticles.size(); i++) {
93  evInf_entry particle_info(event, pdg[i],
94  truthParticles[i].E(), truthParticles[i].Pt(),
95  truthParticles[i].Eta(), truthParticles_pos[i].Eta(), truthParticles_ent[i].Eta(),
96  truthParticles[i].Phi(), truthParticles_pos[i].Phi(), truthParticles_ent[i].Phi(),
97  truthParticles[i].Theta(), truthParticles_pos[i].Theta(), truthParticles_ent[i].Theta(), truthParticles_ent[i].Theta()-truthParticles_pos[i].Theta(),
98  j,MuEntry_Particle_n,vertex[i]);
99  Event_Info[{event,i}] = std::move(particle_info);
100  }
101 
102  return StatusCode::SUCCESS;
103 }
104 
105 evInf_entry::evInf_entry(uint64_t event,int pdg,double e,double p,double ieta,double peta,double eeta,double iphi,double pphi,double ephi,double ithe,double pthe,double ethe,double dth,
106  int trn,int mun,const ROOT::Math::XYZVector& tex):
107  athena_event(event),pdg_id(pdg),E(e),pt(p),eta_ip(ieta),eta_pos(peta),eta_ent(eeta),phi_ip(iphi),phi_pos(pphi),phi_ent(ephi),theta_ip(ithe),theta_pos(pthe),theta_ent(ethe),
108  dtheta(dth),truth_n(trn),mu_n(mun),vertex(tex) {}
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
Trk::ParticleSwitcher::particle
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:79
getMessageSvc.h
singleton-like access to IMessageSvc via open function and helper
MMLoadVariables.h
xAODP4Helpers.h
AtlasHitsVector
Definition: AtlasHitsVector.h:32
test_pyathena.pt
pt
Definition: test_pyathena.py:11
xAOD::P4Helpers::deltaPhi
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
Definition: xAODP4Helpers.h:69
evInf_entry::evInf_entry
evInf_entry(uint64_t event=0, int pdg=0, double e=0, double p=0, double ieta=0, double peta=0, double eeta=0, double iphi=0, double pphi=0, double ephi=0, double ithe=0, double pthe=0, double ethe=0, double dth=0, int trn=0, int mun=0, const ROOT::Math::XYZVector &tex=ROOT::Math::XYZVector())
Definition: MMLoadVariables.cxx:105
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:157
Phi
@ Phi
Definition: RPCdef.h:8
Athena::getMessageSvc
IMessageSvc * getMessageSvc(bool quiet=false)
Definition: getMessageSvc.cxx:20
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:209
ParticleGun_EoverP_Config.momentum
momentum
Definition: ParticleGun_EoverP_Config.py:63
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
McEventCollection.h
lumiFormat.i
int i
Definition: lumiFormat.py:85
Athena
Some weak symbol referencing magic...
Definition: AthLegacySequence.h:21
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
AthMessaging
Class to provide easy MsgStream access and capabilities.
Definition: AthMessaging.h:55
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
evInf_entry
Definition: MMLoadVariables.h:17
McEventCollection
This defines the McEventCollection, which is really just an ObjectVector of McEvent objects.
Definition: McEventCollection.h:32
MMLoadVariables::MMLoadVariables
MMLoadVariables()
Definition: MMLoadVariables.cxx:14
MagicNumbers.h
VP1PartSpect::E
@ E
Definition: VP1PartSpectFlags.h:21
Trk::vertex
@ vertex
Definition: MeasurementType.h:21
Prompt::Def::Pt
@ Pt
Definition: VarHolder.h:76
AtlasHitsVector::size
size_type size() const
Definition: AtlasHitsVector.h:142
HepMC::generations
int generations(const T &p)
Method to return how many interactions a particle has undergone during simulation (TODO migrate to be...
Definition: MagicNumbers.h:357
MMLoadVariables::getTruthInfo
StatusCode getTruthInfo(const EventContext &ctx, const McEventCollection *truthContainer, const TrackRecordCollection *trackRecordCollection, std::map< std::pair< uint64_t, unsigned int >, evInf_entry > &Event_Info) const
Definition: MMLoadVariables.cxx:16
Eta
@ Eta
Definition: RPCdef.h:8