20 constexpr unsigned int dummy_unsigned = 999;
21 constexpr int com_bit = (1<<xAOD::Muon::Author::Commissioning);
22 void increment_unsigned(
unsigned& val) {
23 if (val == dummy_unsigned)
85 return StatusCode::SUCCESS;
92 std::unique_ptr<SG::WriteDecorHandle<xAOD::TruthParticleContainer, ElementLink<xAOD::MuonContainer>>> muonTruthParticleRecoLink{};
94 muonTruthParticleRecoLink = std::make_unique<SG::WriteDecorHandle<xAOD::TruthParticleContainer, ElementLink<xAOD::MuonContainer>>>(
m_muonTruthRecoLink, ctx);
99 if (!muonTruthParticleLink.isValid()) {
101 return StatusCode::FAILURE;
111 bool saw_staco =
false;
112 bool decor_staco =
false;
122 tp =
muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
124 tp =
muon->primaryTrackParticle();
127 bool foundTruth{
false}, setOrigin{
false};
132 if (acc_origin.isAvailable(*tp) && acc_origin(*tp) != 0) {
133 muonTruthParticleOrigin(*
muon) = acc_origin(*tp);
134 muonTruthParticleType(*
muon) = acc_type(*tp);
139 if (acc_link.isAvailable(*tp)) {
140 truthLink = acc_link(*tp);
142 ATH_MSG_DEBUG(
"Could not find any truth link associated with track having pt:"<<tp->pt()<<
" MeV, eta: "<<tp->eta()<<
", phi: "<<tp->phi()<<
", charge: "<<tp->charge()<<
". d0:"<<tp->d0()<<
", z0: "<<tp->z0());
160 truthParticle->index(),
163 muonTruthParticleLink(*
muon) = muonTruthLink;
165 muonTruthParticleOrigin(*
muon) = acc_origin(*tp);
166 muonTruthParticleType(*
muon) = acc_type(*tp);
170 if (muonTruthParticleRecoLink && muonTruthParticleRecoLink->operator()(*truthParticle).isValid()){
171 const xAOD::Muon* decor_muon = *muonTruthParticleRecoLink->operator()(*truthParticle);
172 ATH_MSG_VERBOSE(
"Truth particle is already decorated with reco muon "<<decor_muon->
pt()*1.e-3
173 <<
" eta: "<<decor_muon->
eta()<<
" phi: "<<decor_muon->
phi()<<
" charge: "<<
174 decor_muon->
charge()<<
" author: "<<decor_muon->
author()<<
" all authors: "<<
179 ATH_MSG_DEBUG(
"Author of the decorated muon is better than the one of the new candidate");
183 const int com_score = (
muon->allAuthors() & com_bit) - (decor_muon->
allAuthors() &com_bit);
185 ATH_MSG_DEBUG(
"Found two muons reconstructed by an equivalent author. But this one is from the commissioning chain");
196 std::vector<unsigned int> nprecHitsPerChamberLayer(
toInt(ChIndex::ChIndexMax), dummy_unsigned);
197 std::vector<unsigned int> nphiHitsPerChamberLayer(
toInt(PhiIndex::PhiIndexMax), dummy_unsigned);
198 std::vector<unsigned int> ntrigEtaHitsPerChamberLayer(
toInt(PhiIndex::PhiIndexMax), dummy_unsigned);
200 constexpr int author_sel = (1<<xAOD::Muon::MuidCo) | (1<<xAOD::Muon::MuidSA) | (1<<xAOD::Muon::MuGirl);
204 tp->track(), nprecHitsPerChamberLayer, nphiHitsPerChamberLayer, ntrigEtaHitsPerChamberLayer);
206 muonTruthParticleNPrecMatched(*
muon) = nprecHitsPerChamberLayer;
207 muonTruthParticleNPhiMatched(*
muon) = nphiHitsPerChamberLayer;
208 muonTruthParticleNTrigEtaMatched(*
muon) = ntrigEtaHitsPerChamberLayer;
210 if (muonTruthParticleRecoLink) (*muonTruthParticleRecoLink)(*truthParticle) = muonLink;
217 ATH_MSG_WARNING(
"Could not find the appropiate track particle for muon with pT: " <<
muon->pt() * 1.e-3 <<
" GeV, eta: "
218 <<
muon->eta() <<
", phi: " <<
muon->phi()
219 <<
" author: " <<
muon->author());
223 muonTruthParticleOrigin(*
muon) = 0;
224 muonTruthParticleType(*
muon) = 0;
229 muonTruthParticleNPrecMatched(*
muon) = std::vector<unsigned int>{};
230 muonTruthParticleNPhiMatched(*
muon) = std::vector<unsigned int>{};
231 muonTruthParticleNTrigEtaMatched(*
muon) = std::vector<unsigned int>{};
235 if (
muon->author() == xAOD::Muon::STACO) {
243 decor_staco = !dec_origin.isAvailable (*cmb_trk);
246 dec_origin(*cmb_trk) = acc_origin(*
muon);
247 dec_type(*cmb_trk) = acc_type(*
muon);
248 dec_link(*cmb_trk) = acc_link(*
muon);
254 if (muonTruthParticleRecoLink && !muonTruthParticleRecoLink->isAvailable()) {
261 return StatusCode::SUCCESS;
265 std::vector<unsigned int>& nprecHitsPerChamberLayer,
266 std::vector<unsigned int>& nphiHitsPerChamberLayer,
267 std::vector<unsigned int>& ntrigEtaHitsPerChamberLayer)
const {
269 if (!truthParticle || !truthMdtHitsAcc.
isAvailable(*truthParticle)) {
270 ATH_MSG_DEBUG(
"muon has no truth hits vector in the truth association alg");
271 nprecHitsPerChamberLayer.clear();
272 nphiHitsPerChamberLayer.clear();
273 ntrigEtaHitsPerChamberLayer.clear();
276 const std::vector<unsigned long long>& mdtTruth = truthMdtHitsAcc(*truthParticle);
277 std::vector<unsigned long long> cscTruth;
279 if (
m_idHelperSvc->hasCSC()) cscTruth = truthCscHitsAcc(*truthParticle);
280 const std::vector<unsigned long long>& rpcTruth = truthRpcHitsAcc(*truthParticle);
281 const std::vector<unsigned long long>& tgcTruth = truthTgcHitsAcc(*truthParticle);
284 if (!tsit || !tsit->trackParameters() || !tsit->measurementOnTrack())
continue;
300 for (
unsigned int i = 0; i < mdtTruth.size(); ++i) {
301 if (
id == mdtTruth[i]) {
302 if (
chIndex != ChIndex::ChUnknown) {
303 increment_unsigned(nprecHitsPerChamberLayer.at(
toInt(
chIndex)));
309 for (
unsigned int i = 0; i < cscTruth.size(); ++i) {
310 if (
id != cscTruth[i])
continue;
313 if (
index != PhiIndex::PhiUnknown) {
314 increment_unsigned(nphiHitsPerChamberLayer.at(
toInt(
index)));
317 if (
chIndex != ChIndex::ChUnknown) {
318 increment_unsigned(nprecHitsPerChamberLayer.at(
toInt(
chIndex)));
324 for (
unsigned int i = 0; i < rpcTruth.size(); ++i) {
325 if (
id != rpcTruth[i]) {
continue; }
327 if (
index != PhiIndex::PhiUnknown) {
329 increment_unsigned(nphiHitsPerChamberLayer.at(
toInt(
index)));
331 increment_unsigned(ntrigEtaHitsPerChamberLayer.at(
toInt(
index)));
337 for (
unsigned int i = 0; i < tgcTruth.size(); ++i) {
338 if (
id != tgcTruth[i]) {
continue; }
340 if (
index != PhiIndex::PhiUnknown) {
342 increment_unsigned(nphiHitsPerChamberLayer.at(
toInt(
index)));
344 increment_unsigned(ntrigEtaHitsPerChamberLayer.at(
toInt(
index)));
367 if (identifiers.empty()) {
return; }
368 for (
unsigned int i = 0; i <
vec.size(); ++i) {
369 if (
vec[i] != dummy_unsigned)
continue;
370 for (
unsigned j = 0; j < identifiers.size(); ++j) {
373 const auto phiIdx =
static_cast<PhiIndex>(i);
379 const auto chIdx =
static_cast<ChIndex>(i);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
std::vector< size_t > vec
Helper class to provide constant type-safe access to aux data.
ATLAS-specific HepMC functions.
Handle class for adding a decoration to an object.
ElementLink< xAOD::TruthParticleContainer > TruthLink_t
ElementLink implementation for ROOT usage.
bool toPersistent()
Dummy function provinding the offline interface.
bool isValid() const
Test to see if the link can be dereferenced.
Class for competing MuonClusters, it extends the Trk::CompetingRIOsOnTrack base class.
const std::vector< const MuonClusterOnTrack * > & containedROTs() const
returns the vector of SCT_ClusterOnTrack objects .
SG::ReadHandleKey< xAOD::MuonContainer > m_recoMuKey
SG::ReadDecorHandleKeyArray< xAOD::IParticleContainer > m_inputDecorKey
SG::WriteDecorHandleKey< xAOD::MuonContainer > m_muonTruthParticleOrigin
SG::WriteDecorHandleKey< xAOD::MuonContainer > m_muonTruthParticleNPhiMatched
Gaudi::Property< bool > m_associateWithInDetTP
StatusCode initialize() override
SG::WriteDecorHandleKey< xAOD::TruthParticleContainer > m_muonTruthRecoLink
Gaudi::Property< std::vector< std::string > > m_assocTrkContainers
SG::WriteDecorHandleKey< xAOD::MuonContainer > m_muonTruthParticleType
SG::WriteDecorHandleKey< xAOD::MuonContainer > m_muonTruthParticleLink
SG::WriteDecorHandleKey< xAOD::MuonContainer > m_muonTruthParticleNTrigEtaMatched
void count_chamber_layers(const xAOD::IParticle *truth_particle, const Trk::Track *ptrk, std::vector< unsigned int > &nprecHitsPerChamberLayer, std::vector< unsigned int > &nphiHitsPerChamberLayer, std::vector< unsigned int > &ntrigEtaHitsPerChamberLayer) const
void clear_dummys(const std::vector< unsigned long long > &identifiers, std::vector< unsigned int > &vec) const
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Gaudi::Property< std::string > m_recoLink
SG::ReadHandleKey< xAOD::TruthParticleContainer > m_truthMuKey
Key to the filtered muon truth particles.
StatusCode execute(const EventContext &ctx) const override
SG::WriteDecorHandleKey< xAOD::MuonContainer > m_muonTruthParticleNPrecMatched
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Helper class to provide constant type-safe access to aux data.
Helper class to provide type-safe access to aux data.
Handle class for adding a decoration to an object.
This class is the pure abstract base class for all fittable tracking measurements.
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Identifier identify() const
return the identifier -extends MeasurementBase
represents the track state (measurement, material, fit parameters and quality) at a surface.
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
Class providing the definition of the 4-vector interface.
XAOD_AUXDATA_DEPRECATED bool isAvailable(const std::string &name, const std::string &clsname="") const
Check if a user property is available for reading or not.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
virtual double pt() const
The transverse momentum ( ) of the particle.
uint16_t allAuthors() const
Get all the authors of this Muon.
bool is_sim_descendant(const T1 &p1, const T2 &p2)
Method to check if the first particle is a descendant of the second in the simulation,...
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
int authorRank(const xAOD::Muon::Author &a)
ChIndex chIndex(const std::string &index)
convert ChIndex name string to enum
PhiIndex
enum to classify the different phi layers in the muon spectrometer
constexpr int toInt(const EnumType enumVal)
ChIndex
enum to classify the different chamber layers in the muon spectrometer
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
double deltaR2(double rapidity1, double phi1, double rapidity2, double phi2)
from bare rapidity,phi
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.
Muon_v1 Muon
Reference the current persistent version:
TruthParticleContainer_v1 TruthParticleContainer
Declare the latest version of the truth particle container.