58 declareInterface<IMuonCreatorTool>(
this);
114 return StatusCode::SUCCESS;
117 const std::vector<const InDetCandidateToTagMap*>& tagMaps,
OutputData& outputData)
const {
118 create(ctx, muonCandidates, tagMaps, outputData,
false);
119 create(ctx, muonCandidates, tagMaps, outputData,
true);
122 const std::vector<const InDetCandidateToTagMap*>& tagMaps,
OutputData& outputData,
123 bool select_commissioning)
const {
127 std::vector<const MuonCombined::MuonCandidate*> resolvedMuonCandidates;
131 resolveOverlaps(ctx, muonCandidates, tagMaps, resolvedInDetCandidates, resolvedMuonCandidates, select_commissioning);
132 else if (!select_commissioning)
135 unsigned int numIdCan = resolvedInDetCandidates.size();
136 unsigned int numMuCan = muonCandidates ? muonCandidates->
size() : 0;
137 ATH_MSG_DEBUG(
"Creating xAOD::Muons from: " << numIdCan <<
" indet candidates and " << numMuCan <<
" muon candidates ");
140 ATH_MSG_DEBUG(
"MuonCandidates : overlap removal " << muonCandidates->
size() <<
" in, " << resolvedMuonCandidates.size()
151 if (select_commissioning) {
muon->addAllAuthor(xAOD::Muon::Author::Commissioning); }
153 if (!
muon->primaryTrackParticleLink().isValid()) {
154 ATH_MSG_ERROR(
"This muon has no valid primaryTrackParticleLink! Author=" <<
muon->author());
163 if (
muon && select_commissioning) {
muon->addAllAuthor(xAOD::Muon::Author::Commissioning); }
181 ATH_MSG_DEBUG(
"MuonCreatorTool::create(...) No extrapolated track - aborting. Will not create Muon.");
191 muon->setMuonType(xAOD::Muon::MuonStandAlone);
197 using TrackParticleType = xAOD::Muon::TrackParticleType;
198 if (
m_requireMSOEforSA && !
muon->trackParticle(TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle)) {
199 ATH_MSG_DEBUG(
"Creation of track particle for SA muon failed, removing it");
212 std::unique_ptr<Trk::CaloExtension> caloExtension =
m_caloExtTool->caloExtension(ctx, *
track);
214 ATH_MSG_DEBUG(
"failed to get a calo extension for this SA muon, discard it");
219 ATH_MSG_DEBUG(
"failed to retrieve any calo layers for this SA muon, discard it");
239 acc_nUnspoiledCscHits(
muon) = 0;
240 acc_MuonSpectrometerPt(
muon) = -1;
241 acc_InnerDetectorPt(
muon) = -1;
243 acc_ET_Core(
muon) = 0;
244 acc_ET_EMCore(
muon) = 0;
245 acc_ET_TileCore(
muon) = 0;
246 acc_ET_HECCore(
muon) = 0;
252 if (candidate.second.empty()) {
253 ATH_MSG_DEBUG(
"MuonCreatorTool::create(...) - InDetCandidate with empty combinedDataTags. Aborting. Will not create Muon.");
256 const std::vector<const TagBase*>&
tags = candidate.second;
259 if (muGirlLowBetaTag) {
260 ATH_MSG_DEBUG(
"Track has only a MuGirlLowBetaTag but Staus are not being built, so will not create muon");
273 muon->setTrackParticleLink(xAOD::Muon::InnerDetectorTrackParticle, candidate.first->indetTrackParticleLink());
274 ATH_MSG_DEBUG(
"Adding InDet Track: pt " << candidate.first->indetTrackParticle().pt() <<
" eta "
275 << candidate.first->indetTrackParticle().eta() <<
" phi "
276 << candidate.first->indetTrackParticle().phi());
290 if (muGirlLowBetaTag) {
293 muon->setAuthor(
tag->author());
294 muon->setMuonType(
tag->type());
309 if (slowMuon && muonLink.
isValid()) {
319 if (muGirlLowBetaTag)
continue;
323 ATH_MSG_DEBUG(
"MuonCreatorTool first muon tag: author=" <<
tag->author() <<
" type=" <<
tag->type());
324 muon->setAuthor(
tag->author());
325 muon->setMuonType(
tag->type());
327 if (candidate.first->isSiliconAssociated()) {
muon->setMuonType(xAOD::Muon::SiliconAssociatedForwardMuon); }
331 muon->addAllAuthor(
tag->author());
334 xAOD::Muon::MuonType
type =
tag->type();
344 if (!(cbFitTag || stacoTag || muGirlTag)) {
ATH_MSG_WARNING(
"Unknown combined tag "); }
346 }
else if (
type == xAOD::Muon::SegmentTagged) {
353 if (!(segTag || muGirlTag)) {
ATH_MSG_WARNING(
"Unknown segment-tagged tag "); }
354 }
else if (
type == xAOD::Muon::CaloTagged) {
374 bool haveEloss =
muon->parameter(eLoss, xAOD::Muon::EnergyLoss);
375 if (!haveEloss || eLoss == 0) {
384 ATH_MSG_DEBUG(
"Done creating muon with " << acc_nUnspoiledCscHits(*
muon) <<
" unspoiled csc hits");
402 acc_phi0(
muon) = -999;
403 acc_theta(
muon) = -999;
404 acc_qOverP(
muon) = -999;
405 acc_qOverPerr(
muon) = -999.;
411 if (!
muon.combinedTrackParticleLink().isValid()) {
415 const Trk::Track* msTrack =
tag->muonCandidate().extrapolatedTrack() ?
tag->muonCandidate().extrapolatedTrack()
416 : &
tag->muonCandidate().muonSpectrometerTrack();
422 if (idSummary)
summary += *idSummary;
423 if (msSummary)
summary += *msSummary;
437 std::vector<float> dummy_cov(15, 0.);
438 tp->setTrackParameterCovarianceMatrix(0, dummy_cov);
444 ATH_MSG_DEBUG(
"Adding statistical combination: pt " << (*link)->pt() <<
" eta " << (*link)->eta() <<
" phi "
446 muon.setTrackParticleLink(xAOD::Muon::CombinedTrackParticle, link);
452 std::bitset<xAOD::NumberOfTrackRecoInfo>
pattern;
458 (*accessor)( *tp ) = (*accessor)( id_track_particle );
461 (*accessor)( *tp ) = (*accessor)( id_track_particle );
472 muon.setParameter(5, xAOD::Muon::msInnerMatchDOF);
473 muon.setParameter(
static_cast<float>(
tag->matchChi2()), xAOD::Muon::msInnerMatchChi2);
494 if (!
muon.combinedTrackParticleLink().isValid()) {
503 ATH_MSG_DEBUG(
"Adding combined fit: pt " << (*link)->pt() <<
" eta " << (*link)->eta() <<
" phi " << (*link)->phi());
504 muon.setTrackParticleLink(xAOD::Muon::CombinedTrackParticle, link);
513 const float inner_chi2 =
tag->matchChi2();
514 muon.setParameter(
tag->matchDoF(), xAOD::Muon::msInnerMatchDOF);
515 muon.setParameter(inner_chi2, xAOD::Muon::msInnerMatchChi2);
517 ATH_MSG_DEBUG(
"Done adding Combined Fit Muon " <<
tag->author() <<
" type " <<
tag->type());
534 if (slowMuon && stauExtras) {
555 std::vector<uint8_t>& eTechVec = eTechAcc(*slowMuon);
556 std::vector<unsigned int>& idVec = idAcc(*slowMuon);
557 std::vector<float>& mToFVec = mToFAcc(*slowMuon);
558 std::vector<float>& xVec = xAcc(*slowMuon);
559 std::vector<float>& yVec = yAcc(*slowMuon);
560 std::vector<float>& zVec = zAcc(*slowMuon);
561 std::vector<float>& eVec = eAcc(*slowMuon);
562 std::vector<float>& errorVec = errorAcc(*slowMuon);
563 std::vector<float>& shiftVec = shiftAcc(*slowMuon);
564 std::vector<float>& propagationTimeVec = propTimeAcc(*slowMuon);
566 for (
const auto& hit : stauExtras->
hits) {
567 eTechVec.push_back(hit.eTech);
568 idVec.push_back(hit.id.get_identifier32().get_compact());
569 mToFVec.push_back(hit.mToF);
570 xVec.push_back(hit.x);
571 yVec.push_back(hit.y);
572 zVec.push_back(hit.z);
573 eVec.push_back(hit.e);
574 errorVec.push_back(hit.error);
575 shiftVec.push_back(hit.shift);
576 propagationTimeVec.push_back(hit.propagationTime);
584 std::vector<int>& adcVec = adcAcc(*slowMuon);
585 std::vector<float>& rdriftVec = rdriftAcc(*slowMuon);
589 adcVec.push_back(extraMDTinfo.adc);
590 rdriftVec.push_back(extraMDTinfo.rdrift);
598 if (!
muon.combinedTrackParticleLink().isValid() &&
tag->combinedTrack()) {
606 ATH_MSG_DEBUG(
"Adding MuGirlLowBeta: pt " << (*link)->pt() <<
" eta " << (*link)->eta() <<
" phi " << (*link)->phi());
607 muon.setTrackParticleLink(xAOD::Muon::CombinedTrackParticle, link);
609 ATH_MSG_WARNING(
"Creating of MuGirlLowBeta TrackParticle Link failed");
615 std::vector<ElementLink<xAOD::MuonSegmentContainer>> segments;
618 if (link.isValid()) {
619 segments.push_back(link);
620 ATH_MSG_DEBUG(
"Adding MuGirlLowBeta: xaod::MuonSegment px " << (*link)->px() <<
" py " << (*link)->py() <<
" pz "
625 muon.setMuonSegmentLinks(segments);
637 if (!
muon.combinedTrackParticleLink().isValid() &&
tag->combinedTrack()) {
646 ATH_MSG_DEBUG(
"Adding MuGirl: pt " << (*link)->pt() <<
" eta " << (*link)->eta() <<
" phi " << (*link)->phi());
647 muon.setTrackParticleLink(xAOD::Muon::CombinedTrackParticle, link);
659 ATH_MSG_DEBUG(
"Adding MuGirl: pt " << (*link)->pt() <<
" eta " << (*link)->eta() <<
" phi " << (*link)->phi());
660 muon.setTrackParticleLink(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, link);
668 std::vector<ElementLink<xAOD::MuonSegmentContainer>> segments;
672 segments.push_back(link);
673 ATH_MSG_DEBUG(
"Adding MuGirl: xaod::MuonSegment px " << (*link)->px() <<
" py " << (*link)->py() <<
" pz "
678 muon.setMuonSegmentLinks(segments);
695 std::vector<ElementLink<xAOD::MuonSegmentContainer>> segments;
696 bool foundseg =
false;
697 for (
const auto&
info :
tag->segmentsInfo()) {
704 if (seglink.
isValid()) segments.push_back(seglink);
710 muon.setParameter(
static_cast<float>(
info.segment->fitQuality()->chiSquared() /
info.segment->fitQuality()->numberDoF()),
727 mu.setParameter(0.
f, xAOD::Muon::CaloMuonScore);
728 mu.setParameter(
static_cast<int>(0xFF), xAOD::Muon::CaloMuonIDTag);
732 acc_ET_Core(
mu) = 0.0;
733 acc_ElType(
mu) = -999.0;
734 acc_ElFSREnergy(
mu) = -999.0;
739 ATH_MSG_DEBUG(
"Adding Calo Muon with author " <<
tag->author() <<
", type " <<
tag->type() <<
", CaloMuonScore "
740 <<
tag->caloMuonScore());
741 mu.setParameter(
static_cast<float>(
tag->caloMuonScore()), xAOD::Muon::CaloMuonScore);
742 mu.setParameter(
static_cast<int>(
tag->caloMuonIdTag()), xAOD::Muon::CaloMuonIDTag);
747 acc_ET_Core(
mu) =
tag->etCore();
748 acc_ElType(
mu) =
tag->energyLossType();
749 acc_ElFSREnergy(
mu) =
tag->fsrCandidateEnergy();
759 if (trackCollection) {
799 if (!
muon.nMuonSegments()) {
800 std::vector< ElementLink<xAOD::MuonSegmentContainer>> segments;
804 segments.push_back(link);
805 ATH_MSG_DEBUG(
"Adding MuGirl: xaod::MuonSegment px " << (*link)->px() <<
" py " << (*link)->py() <<
" pz "
811 muon.setMuonSegmentLinks(segments);
814 if (
muon.muonSpectrometerTrackParticleLink().isValid()) {
return; }
827 ATH_MSG_DEBUG(
"There is no extrapolated track associated to the MuonCandidate.");
834 ATH_MSG_DEBUG(
"Adding standalone fit (refitted): pt " << (*link)->pt() <<
" eta " << (*link)->eta() <<
" phi "
836 muon.setTrackParticleLink(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, link);
837 float fieldInt =
m_trackQuery->fieldIntegral(**meLink, ctx).betweenSpectrometerMeasurements();
840 acc_nUnspoiledCscHits(
muon) = nunspoiled;
844 if (!extrapolatedTrack)
ATH_MSG_WARNING(
"Track doesn't have extrapolated track. Skipping");
847 "Track doesn't have perigee parameters on extrapolated "
854 if (
muon.muonType() != xAOD::Muon::MuonStandAlone) {
865 ATH_MSG_DEBUG(
"Adding MS-only extrapolated track: pt " << (*link)->pt() <<
" eta " << (*link)->eta() <<
" phi "
868 muon.setTrackParticleLink(xAOD::Muon::MSOnlyExtrapolatedMuonSpectrometerTrackParticle, link);
870 ATH_MSG_WARNING(
"failed to create MS-only extrapolated track particle");
876 ATH_MSG_DEBUG(
"Adding standalone fit (refitted): pt " << (*link)->pt() <<
" eta " << (*link)->eta() <<
" phi "
878 muon.setTrackParticleLink(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, link);
879 float fieldInt =
m_trackQuery->fieldIntegral(**meLink, ctx).betweenSpectrometerMeasurements();
882 acc_nUnspoiledCscHits(
muon) = nunspoiled;
895 ATH_MSG_DEBUG(
"Adding MS-only extrapolated track to MuGirl muon: pt "
896 << (*link)->pt() <<
" eta " << (*link)->eta() <<
" phi " << (*link)->phi());
898 muon.setTrackParticleLink(xAOD::Muon::MSOnlyExtrapolatedMuonSpectrometerTrackParticle, link);
909 ATH_MSG_DEBUG(
"Adding standalone fit (un-refitted): pt " << (*link)->pt() <<
" eta " << (*link)->eta()
910 <<
" phi " << (*link)->phi());
912 muon.setTrackParticleLink(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, link);
926 ATH_MSG_DEBUG(
"Adding standalone fit: pt " << (*link)->pt() <<
" eta " << (*link)->eta() <<
" phi " << (*link)->phi());
928 muon.setTrackParticleLink(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, link);
933 acc_nUnspoiledCscHits(
muon) = nunspoiled;
942 const std::vector<const InDetCandidateToTagMap*>& tagMaps)
const {
943 resolvedInDetCandidates.clear();
945 if (!tag_map)
continue;
946 for (
const auto& combined_tag : *tag_map) {
947 const TagBase*
tag = combined_tag.second.get();
949 if (muGirlLowBetaTag) { resolvedInDetCandidates.emplace_back(combined_tag.first, std::vector<const TagBase*>{
tag}); }
955 ATH_MSG_DEBUG(
"ID candidates: " << tagMaps.size() <<
" after stau selection " << resolvedInDetCandidates.size());
956 for (
const InDetCandidateTags& candidate : resolvedInDetCandidates) {
963 std::stable_sort(resolvedInDetCandidates.begin(), resolvedInDetCandidates.end(),
964 [](
const InDetCandidateTags&
a,
const InDetCandidateTags&
b) {
965 return a.first->indetTrackParticle().pt() > b.first->indetTrackParticle().pt();
970 const std::vector<const InDetCandidateToTagMap*>& tagMaps,
972 std::vector<const MuonCombined::MuonCandidate*>& resolvedMuonCandidates,
973 bool select_commissioning)
const {
974 resolvedMuonCandidates.clear();
975 resolvedInDetCandidates.clear();
977 std::unique_ptr<const TrackCollection> resolvedTracks;
978 std::vector<std::unique_ptr<Trk::Track>> garbage_collection;
985 if (!tag_map)
continue;
986 for (
const auto& comb_tag : *tag_map) {
991 if (
tag->isCommissioning() != select_commissioning)
break;
993 std::find_if(inDetCandidateMap.begin(), inDetCandidateMap.end(),
994 [&comb_tag](
const InDetCandidateTags& to_test) { return (*to_test.first) == (*comb_tag.first); });
995 if (itr != inDetCandidateMap.end())
996 itr->second.emplace_back(
tag);
998 inDetCandidateMap.emplace_back(std::make_pair(comb_tag.first, std::vector<const TagBase*>{tag}));
1005 if (!inDetCandidateMap.empty()) {
1011 resolvedInDetCandidates.reserve(inDetCandidateMap.size());
1012 caloMuons.reserve(inDetCandidateMap.size());
1014 std::stable_sort(comb_tag.second.begin(), comb_tag.second.end(),
SortTagBasePtr());
1015 if (comb_tag.second.size() == 1 && comb_tag.second.front()->type() == xAOD::Muon::CaloTagged) {
1016 caloMuons.emplace_back(std::move(comb_tag));
1018 resolvedInDetCandidates.emplace_back(std::move(comb_tag));
1020 inDetCandidateMap.clear();
1022 std::stable_sort(resolvedInDetCandidates.begin(), resolvedInDetCandidates.end(),
SortInDetCandidates());
1024 ATH_MSG_DEBUG(
"Found " << resolvedInDetCandidates.size() <<
" inner detector tags in event "
1025 << ctx.eventID().event_number());
1027 std::stringstream
tags;
1029 ATH_MSG_DEBUG(
"ID candidate: " << candidate.first->toString() <<
" " <<
tags.str());
1035 to_resolve.reserve(resolvedInDetCandidates.size());
1036 garbage_collection.reserve(resolvedInDetCandidates.size());
1040 std::map<const Trk::Track*, InDetCandidateTags> trackInDetCandLinks;
1044 const TagBase* primaryTag = candidate.second[0];
1051 trackInDetCandLinks[to_resolve.back()] = std::move(candidate);
1057 if (!segments.empty()) {
1059 garbage_collection.emplace_back(
1060 createDummyTrack(ctx, primaryTag->
associatedSegments(), *(candidate.first->indetTrackParticle().track())));
1062 to_resolve.push_back(garbage_collection.back().get());
1064 trackInDetCandLinks[garbage_collection.back().get()] = std::move(candidate);
1068 resolvedInDetCandidates.clear();
1071 resolvedTracks.reset(m_ambiguityProcessor->process(to_resolve.asDataVector()));
1076 if (trackCandLink == trackInDetCandLinks.end()) {
1077 ATH_MSG_WARNING(
"Unable to find internal link between MS track and ID candidate!");
1080 resolvedInDetCandidates.push_back(std::move(trackCandLink->second));
1086 << resolvedInDetCandidates.size() <<
" trackCandLinks: " << trackInDetCandLinks.size()
1087 <<
" to_resolve: " << to_resolve.size() <<
" resolvedTracks: " << resolvedTracks->size());
1089 ATH_MSG_DEBUG(
"ID candidate: " << candidate.first->toString() <<
" " << candidate.second[0]->toString());
1093 ATH_MSG_DEBUG(
"ID candidate: " << candidate.first->toString() <<
" " << candidate.second[0]->toString());
1097 resolvedInDetCandidates.insert(resolvedInDetCandidates.end(), caloMuons.begin(), caloMuons.end());
1100 std::stable_sort(resolvedInDetCandidates.begin(), resolvedInDetCandidates.end(),
1102 return a.first->indetTrackParticle().pt() > b.first->indetTrackParticle().pt();
1108 if (!muonCandidates) {
return; }
1116 if (resolvedTracks) { resolvedTracks2.assign(resolvedTracks->
begin(), resolvedTracks->
end()); }
1118 std::set<const MuonCandidate*> used_candidates;
1120 for (
const TagBase*
tag : indet_cand.second) {
1134 std::map<const Trk::Track*, const MuonCandidate*> trackMuonCandLinks;
1136 if (candidate->isCommissioning() != select_commissioning)
continue;
1138 if (used_candidates.count(candidate)) {
1142 used_candidates.insert(candidate);
1143 resolvedTracks2.push_back(
track);
1144 trackMuonCandLinks[
track] = candidate;
1148 resolvedTracks.reset(m_ambiguityProcessor->process(resolvedTracks2.asDataVector()));
1152 auto trackCandLink = trackMuonCandLinks.find(
track);
1153 if (trackCandLink != trackMuonCandLinks.end()) resolvedMuonCandidates.push_back(trackCandLink->second);
1158 ATH_MSG_DEBUG(
"Muon candidates: " << muonCandidates->size() <<
" after ambiguity solving " << resolvedMuonCandidates.size());
1159 for (
const MuonCandidate* candidate : resolvedMuonCandidates) {
1165 std::unique_ptr<Trk::Track> MuonCreatorTool::createDummyTrack(
const EventContext& ctx,
1166 const std::vector<const Muon::MuonSegment*>& segments,
1170 auto trackStateOnSurfaces = std::make_unique<Trk::TrackStates>();
1175 std::unique_ptr<const Trk::TrackParameters>
pars{m_edmHelperSvc->createTrackParameters(*seg,
momentum,
charge)};
1177 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern(0);
1180 std::unique_ptr<Trk::TrackParameters> exPars{m_propagator->propagateParameters(
1182 if (!exPars) {
ATH_MSG_VERBOSE(
"Could not propagate Track to segment surface"); }
1185 trackStateOnSurfaces->push_back(trackState);
1192 std::unique_ptr<Trk::Track> newtrack =
1193 std::make_unique<Trk::Track>(
info, std::move(trackStateOnSurfaces), (indetTrack.
fitQuality())->uniqueClone());
1196 if (m_trackSummaryTool.isEnabled()) { m_trackSummaryTool->computeAndReplaceTrackSummary(*newtrack,
false); }
1202 if (!
muon.primaryTrackParticleLink().isValid()) {
1203 ATH_MSG_DEBUG(
"No primary track particle set, deleting muon");
1213 ATH_MSG_WARNING(
"MuonCreatorTool::dressMuon - trying to set qOverP, but value from muon.primaryTrackParticle ["
1214 <<
muon.primaryTrackParticleLink().dataID()
1215 <<
"] is zero. Setting charge=0.0. The eta/phi of the muon is: " <<
muon.eta() <<
" / " <<
muon.phi());
1216 muon.setCharge(0.0);
1220 m_muonDressingTool->addMuonHitSummary(
muon);
1223 if (!m_scatteringAngleTool.empty()) {
1229 ATH_MSG_VERBOSE(
"Got curvatureSignificance " << curvatureSignificance <<
" and neighbourSignificance "
1230 << neighbourSignificance);
1233 if (!m_momentumBalanceTool.empty()) {
1239 if (!m_meanMDTdADCTool.empty()) {
1240 float meanDeltaADC =
float(m_meanMDTdADCTool->meanMDTdADCFiller(
muon));
1241 muon.setParameter(meanDeltaADC, xAOD::Muon::meanDeltaADCCountsMDT);
1245 if (!m_selectorTool.empty()) {
1246 acc_MuonSpectrometerPt(
muon) =
muon.pt();
1247 acc_InnerDetectorPt(
muon) =
muon.pt();
1249 m_selectorTool->setPassesIDCuts(
muon);
1252 m_selectorTool->setQuality(
muon);
1256 if (m_fillEnergyLossFromTrack) {
1258 if (
muon.trackParticle(xAOD::Muon::CombinedTrackParticle)) {
1259 trk =
muon.trackParticle(xAOD::Muon::CombinedTrackParticle)->track();
1261 if (!trk &&
muon.trackParticle(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle)) {
1262 trk =
muon.trackParticle(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle)->track();
1267 fillEnergyLossFromTrack(
muon,
nullptr);
1268 ATH_MSG_VERBOSE(
"Couldn't find matching track which might have energy loss.");
1274 if (!
muon.inDetTrackParticleLink().isValid()) {
1275 ATH_MSG_WARNING(
"Missing ID track particle link in addEnergyLossToMuon!");
1280 const Trk::Track* trk = (*(
muon.inDetTrackParticleLink()))->track();
1290 for (;
it != itEnd; ++
it) {
1291 if ((*it)->trackParameters()) {
1297 ATH_MSG_WARNING(
"Missing ID TSOS with track parameters in addEnergyLossToMuon!");
1302 std::vector<const Trk::TrackStateOnSurface*>* caloTSOS = m_caloMaterialProvider->getCaloTSOS(*((*it)->trackParameters()), *trk);
1310 fillEnergyLossFromTrack(
muon, caloTSOS);
1313 std::vector<const Trk::TrackStateOnSurface*>::const_iterator it2 = caloTSOS->begin();
1314 std::vector<const Trk::TrackStateOnSurface*>::const_iterator itEnd2 = caloTSOS->end();
1315 for (; it2 != itEnd2; ++it2)
delete *it2;
1319 void MuonCreatorTool::fillEnergyLossFromTrack(
xAOD::Muon&
muon,
const std::vector<const Trk::TrackStateOnSurface*>* tsosVector)
const {
1322 muon.setParameter(0.
f, xAOD::Muon::EnergyLoss);
1323 muon.setParameter(0.
f, xAOD::Muon::ParamEnergyLoss);
1324 muon.setParameter(0.
f, xAOD::Muon::MeasEnergyLoss);
1325 muon.setParameter(0.
f, xAOD::Muon::EnergyLossSigma);
1326 muon.setParameter(0.
f, xAOD::Muon::MeasEnergyLossSigma);
1327 muon.setParameter(0.
f, xAOD::Muon::ParamEnergyLossSigmaPlus);
1328 muon.setParameter(0.
f, xAOD::Muon::ParamEnergyLossSigmaMinus);
1330 muon.setEnergyLossType(xAOD::Muon::Parametrized);
1331 muon.setParameter(0.
f, xAOD::Muon::FSR_CandidateEnergy);
1332 if (m_fillExtraELossInfo) acc_numEnergyLossPerTrack(
muon) = 0;
1337 unsigned int numEnergyLossPerTrack = 0;
1338 bool problem =
false;
1339 for (
const auto* tsos : *tsosVector) {
1341 if (!meot)
continue;
1344 if (!caloEnergy)
continue;
1345 ++numEnergyLossPerTrack;
1347 muon.setParameter(
static_cast<float>(caloEnergy->
deltaE()), xAOD::Muon::EnergyLoss);
1348 muon.setParameter(
static_cast<float>(caloEnergy->
deltaEParam()), xAOD::Muon::ParamEnergyLoss);
1349 muon.setParameter(
static_cast<float>(caloEnergy->
deltaEMeas()), xAOD::Muon::MeasEnergyLoss);
1350 muon.setParameter(
static_cast<float>(caloEnergy->
sigmaDeltaE()), xAOD::Muon::EnergyLossSigma);
1351 muon.setParameter(
static_cast<float>(caloEnergy->
sigmaDeltaEMeas()), xAOD::Muon::MeasEnergyLossSigma);
1355 muon.setEnergyLossType(
static_cast<xAOD::Muon::EnergyLossType
>(caloEnergy->
energyLossType()));
1356 muon.setParameter(
static_cast<float>(caloEnergy->
fsrCandidateEnergy()), xAOD::Muon::FSR_CandidateEnergy);
1358 if (numEnergyLossPerTrack > 1) {
1362 if (m_fillExtraELossInfo) acc_numEnergyLossPerTrack(
muon) = numEnergyLossPerTrack;
1369 if (!
tp || !clusterContainer) {
1375 ATH_MSG_DEBUG(
" Selected track: pt " <<
tp->pt() <<
" eta " <<
tp->eta() <<
" phi " <<
tp->phi());
1383 if (!inputCaloExt) {
1386 std::unique_ptr<Trk::CaloExtension> caloExtension = m_caloExtTool->caloExtension(ctx, *
tp);
1387 if (!caloExtension) {
1392 ATH_MSG_DEBUG(
"Received a caloExtension object without track extrapolation");
1394 cluster = m_cellCollector.collectCells(*caloExtension, caloDDMgr, *container, *clusterContainer);
1396 cluster = m_cellCollector.collectCells(*inputCaloExt, caloDDMgr, *container, *clusterContainer);
1399 ATH_MSG_DEBUG(
"Failed to create cluster from ParticleCellAssociation");
1402 ATH_MSG_DEBUG(
" New cluster: eta " << cluster->
eta() <<
" phi " << cluster->
phi() <<
" cells " << cluster->
size());
1407 muon.setClusterLink(clusterLink);
1409 if (!m_caloNoiseKey.empty()) {
1411 caloNoise = noiseH.
cptr();
1414 std::vector<float> etcore(4, 0);
1415 m_cellCollector.collectEtCore(*cluster, etcore, caloNoise, m_sigmaCaloNoiseCut);
1421 if (m_caloNoiseKey.empty())
1422 ATH_MSG_DEBUG(
"NO Tool for calo noise,sigma: " << m_sigmaCaloNoiseCut);