50 {
52
55 if (not inputTruth) {
57 return StatusCode::FAILURE;
58 }
59
61 ATH_CHECK(outputRoI_handle.record(std::make_unique<xAOD::MuonRoIContainer>(), std::make_unique<xAOD::MuonRoIAuxContainer>()));
62 auto outputRoIs = outputRoI_handle.ptr();
63
64 int n_input_tracks=0;
65 int n_output_tracks=0;
67
68 for (const auto* part : *inputTruth) {
69
70 if (
part->pdgId() != 13 &&
part->pdgId() != -13)
continue;
71
72 if (
part->pt() < 2000.)
continue;
73
74 if (
part->status() != 1)
continue;
75
76 if (std::abs(
part->eta()) > 3.0)
continue;
77
79 <<
" eta=" <<
part->eta()
80 <<
" pT=" <<
part->pt() / 1000.
81 <<
"(GeV) q/pT=" <<
part->charge() * 1000. /
part->pt()
82 <<
"(1/GeV) PDGID=" <<
part->pdgId()
83 <<
" status=" <<
part->status());
84 n_input_tracks++;
85
87 auto track_input_eta = Monitored::Scalar<float>(
"track_input_eta",
part->eta());
88 auto track_input_pt = Monitored::Scalar<float>(
"track_input_pt",
part->pt() / 1000.);
89 auto track_input_phi = Monitored::Scalar<float>(
"track_input_phi",
part->phi());
90 auto track_input_curv = Monitored::Scalar<float>(
"track_input_curv",
part->charge() * 1000. /
part->pt());
91 auto monitorIt = Monitored::Group(
m_monTool, track_input_eta, track_input_pt, track_input_phi, track_input_curv);
92 }
93
94 float qoverPt =
part->charge() /
part->pt();
95 L0MuonTrack otrack;
97 ATH_MSG_DEBUG(
"Killed by the efficiency: q/pt=" << qoverPt * 1000. <<
" (1/GeV)");
98 continue;
99 }
100
101 n_output_tracks++;
102
104 << " eta=" << otrack.eta()
105 << " pT=" << 1. / std::abs(otrack.invpt() * 1000.)
106 << "(GeV) q/pT=" << 1000. * otrack.invpt() << "(1/GeV)");
107
109 auto track_output_eta = Monitored::Scalar<float>("track_output_eta", otrack.eta());
110 auto track_output_pt = Monitored::Scalar<float>("track_output_pt", 1./ std::abs(otrack.invpt() * 1000.));
111 auto track_output_phi = Monitored::Scalar<float>("track_output_phi", otrack.phi());
112 auto track_output_curv = Monitored::Scalar<float>("track_output_curv", otrack.invpt() * 1000.);
113 auto monitorIt = Monitored::Group(
m_monTool, track_output_eta, track_output_pt, track_output_phi, track_output_curv);
114 }
115
116
117 outputRoIs->push_back(std::make_unique<xAOD::MuonRoI>());
118
119
123
126 uint32_t ptword =
static_cast<uint32_t>(1. / std::abs(otrack.invpt() * 1000.) / PT_ROISIZE);
127 if (ptword > 0xff) ptword = 0xff;
128
129
130 float roi_eta = etaword * ETA_ROISIZE - 2.7;
131 float roi_phi = phiword * PHI_ROISIZE - TMath::Pi();
132
133
134 uint32_t roiword = (ptword<<24) | ((otrack.invpt() > 0)<<23) | (phiword<<14) | etaword;
135
136 uint32_t extraword = (
static_cast<uint32_t>(0x1)<<31) | (((ptword>>1) + 0x2) & 0xf);
137
138 std::string emu_thr_name = "L0_MUx";
139 float thrvalue = static_cast<float>(((ptword>>1) + 0x2) & 0xf);
140 outputRoIs->back()->initialize(roiword, roi_eta, roi_phi, emu_thr_name, thrvalue, extraword);
141
142 ATH_MSG_DEBUG(
"L0MuonRoI: phi = " << roi_phi <<
" (0x" << std::hex << phiword << std::dec <<
"), "
143 << "eta = " << roi_eta << " (0x" << std::hex << etaword << std::dec << "), "
144 << "pT = " << outputRoIs->back()->pt() << " (GeV) (0x" << std::hex << ptword << std::dec << "), "
145 << "q/pT= " << ((otrack.invpt() > 0) ? 1. : -1.) / outputRoIs->back()->pt());
146
148 auto roi_output_eta = Monitored::Scalar<float>("roi_output_eta", outputRoIs->back()->eta());
149 auto roi_output_phi = Monitored::Scalar<float>("roi_output_phi", outputRoIs->back()->phi());
150 auto roi_output_pt = Monitored::Scalar<float>("roi_output_pt", outputRoIs->back()->pt());
151 auto roi_output_curv = Monitored::Scalar<float>("roi_output_curv", (outputRoIs->back()->getCharge() > 0 ? 1. : -1.)/outputRoIs->back()->pt());
152
153 auto delta_eta = Monitored::Scalar<float>(
"delta_eta", outputRoIs->back()->eta() -
part->eta());
154 auto delta_phi = Monitored::Scalar<float>(
"delta_phi", TVector2::Phi_mpi_pi(outputRoIs->back()->phi() - (
part->phi())));
155 auto delta_pt = Monitored::Scalar<float>(
"delta_pt", (outputRoIs->back()->pt() -
part->pt()/1000.) / (
part->pt()/1000.));
156 auto delta_curv = Monitored::Scalar<float>(
"delta_curv", ((outputRoIs->back()->getCharge() == 1 ? 1. : -1.)/outputRoIs->back()->pt() - (
part->charge()*1000./
part->pt())) / (
part->charge()*1000./
part->pt()));
157
158 auto monitorIt = Monitored::Group(
m_monTool, roi_output_eta, roi_output_pt, roi_output_phi, roi_output_curv,
159 delta_eta, delta_phi, delta_pt, delta_curv);
160 }
161 }
162
163 ATH_MSG_DEBUG (
"Result: Number of input truth muons= " << n_input_tracks <<
" , smeared tracks= "<< n_output_tracks);
164
165 return StatusCode::SUCCESS;
166}
#define ATH_CHECK
Evaluate an expression and check for errors.
SG::WriteHandleKey< xAOD::MuonRoIContainer > m_outputMuonRoIKey
std::unique_ptr< TruthTrackSmearer > m_mySmearer
ToolHandle< GenericMonitoringTool > m_monTool
SG::ReadHandleKey< xAOD::TruthParticleContainer > m_inputTruthParticleKey
static constexpr uint32_t ETA_MASK
constants to decode RoI word for Run 4+
static constexpr uint32_t PT_MASK
static constexpr uint32_t PHI_MASK
TruthParticleContainer_v1 TruthParticleContainer
Declare the latest version of the truth particle container.