53 {
55
58 if (not inputTruth) {
60 return StatusCode::FAILURE;
61 }
62
64 ATH_CHECK(outputRoI_handle.record(std::make_unique<xAOD::MuonRoIContainer>(), std::make_unique<xAOD::MuonRoIAuxContainer>()));
65 auto outputRoIs = outputRoI_handle.ptr();
66
67 int n_input_tracks=0;
68 int n_output_tracks=0;
70
71 for (const auto* part : *inputTruth) {
72
73 if (
part->pdgId() != 13 &&
part->pdgId() != -13)
continue;
74
75 if (
part->pt() < 2000.)
continue;
76
77 if (
part->status() != 1)
continue;
78
79 if (std::abs(
part->eta()) > 3.0)
continue;
80
82 <<
" eta=" <<
part->eta()
83 <<
" pT=" <<
part->pt() / 1000.
84 <<
"(GeV) q/pT=" <<
part->charge() * 1000. /
part->pt()
85 <<
"(1/GeV) PDGID=" <<
part->pdgId()
86 <<
" status=" <<
part->status());
87 n_input_tracks++;
88
90 auto track_input_eta = Monitored::Scalar<float>(
"track_input_eta",
part->eta());
91 auto track_input_pt = Monitored::Scalar<float>(
"track_input_pt",
part->pt() / 1000.);
92 auto track_input_phi = Monitored::Scalar<float>(
"track_input_phi",
part->phi());
93 auto track_input_curv = Monitored::Scalar<float>(
"track_input_curv",
part->charge() * 1000. /
part->pt());
94 auto monitorIt = Monitored::Group(
m_monTool, track_input_eta, track_input_pt, track_input_phi, track_input_curv);
95 }
96
97 float qoverPt =
part->charge() /
part->pt();
98 L0MuonTrack otrack;
100 ATH_MSG_DEBUG(
"Killed by the efficiency: q/pt=" << qoverPt * 1000. <<
" (1/GeV)");
101 continue;
102 }
103
104 n_output_tracks++;
105
107 << " eta=" << otrack.eta()
108 << " pT=" << 1. / std::abs(otrack.invpt() * 1000.)
109 << "(GeV) q/pT=" << 1000. * otrack.invpt() << "(1/GeV)");
110
112 auto track_output_eta = Monitored::Scalar<float>("track_output_eta", otrack.eta());
113 auto track_output_pt = Monitored::Scalar<float>("track_output_pt", 1./ std::abs(otrack.invpt() * 1000.));
114 auto track_output_phi = Monitored::Scalar<float>("track_output_phi", otrack.phi());
115 auto track_output_curv = Monitored::Scalar<float>("track_output_curv", otrack.invpt() * 1000.);
116 auto monitorIt = Monitored::Group(
m_monTool, track_output_eta, track_output_pt, track_output_phi, track_output_curv);
117 }
118
119
120 outputRoIs->push_back(std::make_unique<xAOD::MuonRoI>());
121
122
126
129 uint32_t ptword =
static_cast<uint32_t>(1. / std::abs(otrack.invpt() * 1000.) / PT_ROISIZE);
130 if (ptword > 0xff) ptword = 0xff;
131
132
133 float roi_eta = etaword * ETA_ROISIZE - 2.7;
134 float roi_phi = phiword * PHI_ROISIZE - TMath::Pi();
135
136
137 uint32_t roiword = (ptword<<24) | ((otrack.invpt() > 0)<<23) | (phiword<<14) | etaword;
138
139 uint32_t extraword = (
static_cast<uint32_t>(0x1)<<31) | (((ptword>>1) + 0x2) & 0xf);
140
141 std::string emu_thr_name = "L0_MUx";
142 float thrvalue = static_cast<float>(((ptword>>1) + 0x2) & 0xf);
143 outputRoIs->back()->initialize(roiword, roi_eta, roi_phi, emu_thr_name, thrvalue, extraword);
144 if (outputRoIs->back()->pt() == 0.){
146 continue;
147 }
148 ATH_MSG_DEBUG(
"L0MuonRoI: phi = " << roi_phi <<
" (0x" << std::hex << phiword << std::dec <<
"), "
149 << "eta = " << roi_eta << " (0x" << std::hex << etaword << std::dec << "), "
150 << "pT = " << outputRoIs->back()->pt() << " (GeV) (0x" << std::hex << ptword << std::dec << "), "
151 << "q/pT= " << ((otrack.invpt() > 0) ? 1. : -1.) / outputRoIs->back()->pt());
152
154 auto roi_output_eta = Monitored::Scalar<float>("roi_output_eta", outputRoIs->back()->eta());
155 auto roi_output_phi = Monitored::Scalar<float>("roi_output_phi", outputRoIs->back()->phi());
156 auto roi_output_pt = Monitored::Scalar<float>("roi_output_pt", outputRoIs->back()->pt());
157 auto roi_output_curv = Monitored::Scalar<float>("roi_output_curv", (outputRoIs->back()->getCharge() > 0 ? 1. : -1.)/outputRoIs->back()->pt());
158
159 auto delta_eta = Monitored::Scalar<float>(
"delta_eta", outputRoIs->back()->eta() -
part->eta());
160 auto delta_phi = Monitored::Scalar<float>(
"delta_phi", TVector2::Phi_mpi_pi(outputRoIs->back()->phi() - (
part->phi())));
161 auto pt0 =
part->pt();
162 if (pt0 == 0.) pt0 = 1
e-9;
163
164 auto delta_pt = Monitored::Scalar<float>("delta_pt", (outputRoIs->back()->pt() - pt0/1000.) / (pt0/1000.));
165
166 auto delta_curv = Monitored::Scalar<float>(
"delta_curv", ((outputRoIs->back()->getCharge() == 1 ? 1. : -1.)/outputRoIs->back()->pt() - (
part->charge()*1000./pt0)) / (
part->charge()*1000./pt0));
167
168 auto monitorIt = Monitored::Group(
m_monTool, roi_output_eta, roi_output_pt, roi_output_phi, roi_output_curv,
169 delta_eta, delta_phi, delta_pt, delta_curv);
170 }
171 }
172
173 ATH_MSG_DEBUG (
"Result: Number of input truth muons= " << n_input_tracks <<
" , smeared tracks= "<< n_output_tracks);
174
175 return StatusCode::SUCCESS;
176}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
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.