ATLAS Offline Software
Loading...
Searching...
No Matches
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
5#include "MMLoadVariables.h"
10#include "Math/Vector4D.h"
11#include <cmath>
12#include <vector>
13
14MMLoadVariables::MMLoadVariables() : AthMessaging(Athena::getMessageSvc(), "MMLoadVariables") {}
15
16StatusCode 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
105evInf_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) {}
@ Phi
Definition RPCdef.h:8
@ Eta
Definition RPCdef.h:8
AtlasHitsVector< TrackRecord > TrackRecordCollection
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
size_type size() const
StatusCode getTruthInfo(const EventContext &ctx, const McEventCollection *truthContainer, const TrackRecordCollection *trackRecordCollection, std::map< std::pair< uint64_t, unsigned int >, evInf_entry > &Event_Info) const
This defines the McEventCollection, which is really just an ObjectVector of McEvent objectsFile: Gene...
singleton-like access to IMessageSvc via open function and helper
Some weak symbol referencing magic... These are declared in AthenaKernel/getMessageSvc....
int barcode(const T *p)
Definition Barcode.h:16
int generations(const T &p)
Method to return how many interactions a particle has undergone during simulation (TODO migrate to be...
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
double eta_ent
uint64_t athena_event
int truth_n
int pdg_id
double eta_ip
double E
double theta_ent
double dtheta
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())
double phi_ent
double pt
double phi_ip
ROOT::Math::XYZVector vertex
double theta_ip
double theta_pos
double eta_pos
int mu_n
double phi_pos