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 vertex_tmp = subEvent->vertices().front()->position();
54 }
55 j++;
56
57 if(thePart.Pt() > 0. && HepMC::generations(particle) < 1){
58 bool addIt = true;
59 for(unsigned int ipart=0; ipart < truthParticles.size(); ipart++){
60 if( std::abs(thePart.Pt()-truthParticles[ipart].Pt()) < 0.001 ||
61 std::abs(thePart.Eta()-truthParticles[ipart].Eta()) < 0.001 ||
62 std::abs(xAOD::P4Helpers::deltaPhi(thePart.Phi(), truthParticles[ipart].Phi())) < 0.001 ||
63 std::abs(thePart.E()-truthParticles[ipart].E()) < 0.001 ) addIt = false;
64 }
65 if(addIt){
66 truthParticles.push_back(thePart);
67 //new stuff
68 vertex.push_back(vertex_tmp);
69 pdg.push_back(pdg_tmp);
70 truthParticles_ent.push_back(ROOT::Math::PtEtaPhiEVector(momentum.perp(),etaEntry_tmp ,phiEntry_tmp ,momentum.e()));
71 truthParticles_pos.push_back(ROOT::Math::PtEtaPhiEVector(momentum.perp(),etaPosition_tmp,phiPosition_tmp,momentum.e()));
72 }
73 }
74
75 } //end particle loop
76 } //end truth container loop (should be only 1 container per event)
77 } // if truth container is not null
78
79 uint64_t event = ctx.eventID().event_number();
80 for(unsigned int i=0; i<truthParticles.size(); i++) {
81 evInf_entry particle_info(event, pdg[i],
82 truthParticles[i].E(), truthParticles[i].Pt(),
83 truthParticles[i].Eta(), truthParticles_pos[i].Eta(), truthParticles_ent[i].Eta(),
84 truthParticles[i].Phi(), truthParticles_pos[i].Phi(), truthParticles_ent[i].Phi(),
85 truthParticles[i].Theta(), truthParticles_pos[i].Theta(), truthParticles_ent[i].Theta(), truthParticles_ent[i].Theta()-truthParticles_pos[i].Theta(),
86 j,MuEntry_Particle_n,vertex[i]);
87 Event_Info[{event,i}] = std::move(particle_info);
88 }
89
90 return StatusCode::SUCCESS;
91}
92
93evInf_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,
94 int trn,int mun,const ROOT::Math::XYZVector& tex):
95 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),
96 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....
Definition AthDsoUtils.h:10
int barcode(const T *p)
Definition Barcode.h:17
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