File indexing completed on 2024-04-06 12:18:38
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #include "HLTScoutingMuonProducer.h"
0018 #include "DataFormats/Math/interface/deltaR.h"
0019 #include "TMath.h"
0020
0021
0022
0023
0024 HLTScoutingMuonProducer::HLTScoutingMuonProducer(const edm::ParameterSet& iConfig)
0025 : ChargedCandidateCollection_(
0026 consumes<reco::RecoChargedCandidateCollection>(iConfig.getParameter<edm::InputTag>("ChargedCandidates"))),
0027 displacedvertexCollection_(
0028 consumes<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("displacedvertexCollection"))),
0029 MuonCollection_(consumes<reco::MuonCollection>(iConfig.getParameter<edm::InputTag>("InputMuons"))),
0030 linkToken_(consumes<reco::MuonTrackLinksCollection>(iConfig.getParameter<edm::InputTag>("InputLinks"))),
0031 TrackCollection_(consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("Tracks"))),
0032 EcalPFClusterIsoMap_(consumes<RecoChargedCandMap>(iConfig.getParameter<edm::InputTag>("EcalPFClusterIsoMap"))),
0033 HcalPFClusterIsoMap_(consumes<RecoChargedCandMap>(iConfig.getParameter<edm::InputTag>("HcalPFClusterIsoMap"))),
0034 TrackIsoMap_(consumes<edm::ValueMap<double>>(iConfig.getParameter<edm::InputTag>("TrackIsoMap"))),
0035 muonPtCut(iConfig.getParameter<double>("muonPtCut")),
0036 muonEtaCut(iConfig.getParameter<double>("muonEtaCut")),
0037 minVtxProbCut(iConfig.getParameter<double>("minVtxProbCut")) {
0038
0039 produces<Run3ScoutingMuonCollection>();
0040 produces<Run3ScoutingVertexCollection>("displacedVtx");
0041 }
0042
0043 HLTScoutingMuonProducer::~HLTScoutingMuonProducer() = default;
0044
0045
0046 void HLTScoutingMuonProducer::produce(edm::StreamID sid, edm::Event& iEvent, edm::EventSetup const& setup) const {
0047 using namespace edm;
0048
0049 std::unique_ptr<Run3ScoutingMuonCollection> outMuons(new Run3ScoutingMuonCollection());
0050 std::unique_ptr<Run3ScoutingVertexCollection> dispVertices(new Run3ScoutingVertexCollection());
0051
0052
0053 Handle<reco::RecoChargedCandidateCollection> ChargedCandidateCollection;
0054 if (!iEvent.getByToken(ChargedCandidateCollection_, ChargedCandidateCollection)) {
0055 iEvent.put(std::move(outMuons));
0056 iEvent.put(std::move(dispVertices), "displacedVtx");
0057 return;
0058 }
0059
0060 std::pair<reco::RecoChargedCandidate, reco::RecoChargedCandidate> ivtxMuPair;
0061 std::vector<std::pair<reco::RecoChargedCandidate, reco::RecoChargedCandidate>> vtxMuPair;
0062
0063
0064 Handle<reco::VertexCollection> displacedvertexCollection;
0065 if (iEvent.getByToken(displacedvertexCollection_, displacedvertexCollection)) {
0066 for (auto& dispvtx : *displacedvertexCollection) {
0067 if (!dispvtx.isValid())
0068 continue;
0069 float vtxProb = 0.0;
0070 if ((dispvtx.chi2() >= 0.0) && (dispvtx.ndof() > 0))
0071 vtxProb = TMath::Prob(dispvtx.chi2(), dispvtx.ndof());
0072 if (vtxProb < minVtxProbCut)
0073 continue;
0074
0075
0076 auto trackIt = dispvtx.tracks_begin();
0077 reco::TrackRef vertextkRef1 = (*trackIt).castTo<reco::TrackRef>();
0078 trackIt++;
0079 reco::TrackRef vertextkRef2 = (*trackIt).castTo<reco::TrackRef>();
0080
0081
0082 int iFoundRefs = 0;
0083 for (auto const& cand : *ChargedCandidateCollection) {
0084 reco::TrackRef tkRef = cand.get<reco::TrackRef>();
0085 if (tkRef == vertextkRef1) {
0086 ivtxMuPair.first = cand;
0087 iFoundRefs++;
0088 }
0089 if (tkRef == vertextkRef2) {
0090 ivtxMuPair.second = cand;
0091 iFoundRefs++;
0092 }
0093 }
0094 if (iFoundRefs < 2)
0095 continue;
0096 vtxMuPair.push_back(ivtxMuPair);
0097
0098 dispVertices->emplace_back(dispvtx.x(),
0099 dispvtx.y(),
0100 dispvtx.z(),
0101 dispvtx.zError(),
0102 dispvtx.xError(),
0103 dispvtx.yError(),
0104 dispvtx.tracksSize(),
0105 dispvtx.chi2(),
0106 dispvtx.ndof(),
0107 dispvtx.isValid(),
0108 dispvtx.covariance(0, 1),
0109 dispvtx.covariance(0, 2),
0110 dispvtx.covariance(1, 2));
0111 }
0112 }
0113
0114
0115 Handle<reco::MuonCollection> MuonCollection;
0116 if (!iEvent.getByToken(MuonCollection_, MuonCollection)) {
0117 iEvent.put(std::move(outMuons));
0118 iEvent.put(std::move(dispVertices), "displacedVtx");
0119 return;
0120 }
0121
0122
0123 edm::Handle<reco::MuonTrackLinksCollection> links;
0124 if (!iEvent.getByToken(linkToken_, links)) {
0125 iEvent.put(std::move(outMuons));
0126 iEvent.put(std::move(dispVertices), "displacedVtx");
0127 return;
0128 }
0129
0130
0131 Handle<RecoChargedCandMap> EcalPFClusterIsoMap;
0132 iEvent.getByToken(EcalPFClusterIsoMap_, EcalPFClusterIsoMap);
0133
0134
0135 Handle<RecoChargedCandMap> HcalPFClusterIsoMap;
0136 iEvent.getByToken(HcalPFClusterIsoMap_, HcalPFClusterIsoMap);
0137
0138
0139 Handle<ValueMap<double>> TrackIsoMap;
0140 iEvent.getByToken(TrackIsoMap_, TrackIsoMap);
0141
0142
0143 std::vector<int> vtxInd;
0144 float minDR2 = 1e-06;
0145 int index = 0;
0146
0147 for (auto& muon : *ChargedCandidateCollection) {
0148 reco::RecoChargedCandidateRef muonRef = getRef(ChargedCandidateCollection, index);
0149 ++index;
0150 if (muonRef.isNull() || !muonRef.isAvailable())
0151 continue;
0152
0153 reco::TrackRef track = muon.track();
0154 if (track.isNull() || !track.isAvailable())
0155 continue;
0156
0157 int validStandAloneMuonHits = 0;
0158 int matchedStandAloneMuonStations = 0;
0159 for (auto const& link : *links) {
0160 const reco::Track& trackerTrack = *link.trackerTrack();
0161 float dR2 = deltaR2(track->eta(), track->phi(), trackerTrack.eta(), trackerTrack.phi());
0162 float dPt = std::abs(track->pt() - trackerTrack.pt());
0163 if (track->pt() != 0)
0164 dPt = dPt / track->pt();
0165
0166 if (dR2 < 0.02 * 0.02 and dPt < 0.001) {
0167 if (link.standAloneTrack().isNonnull()) {
0168 validStandAloneMuonHits = link.standAloneTrack()->hitPattern().numberOfValidMuonHits();
0169 matchedStandAloneMuonStations = link.standAloneTrack()->hitPattern().muonStationsWithValidHits();
0170 }
0171 }
0172 }
0173
0174 unsigned int recoMuonType = 2;
0175 float normalizedChi2 = 999.0;
0176 int nRecoMuonValidMuonHits = 0;
0177 int nRecoMuonChambers = 0;
0178 int nRecoMuonChambersCSCorDT = 0;
0179 int nRecoMuonMatches = 0;
0180 int nRecoMuonMatchedStations = 0;
0181 unsigned int nRecoMuonExpectedMatchedStations = 0;
0182 unsigned int recoMuonStationMask = 0;
0183 int nRecoMuonMatchedRPCLayers = 0;
0184 unsigned int recoMuonRPClayerMask = 0;
0185 for (auto const& recoMu : *MuonCollection) {
0186 float dR2 = deltaR2(muon.eta(), muon.phi(), recoMu.eta(), recoMu.phi());
0187 float dPt = std::abs(muon.pt() - recoMu.pt());
0188 if (muon.pt() != 0)
0189 dPt = dPt / muon.pt();
0190
0191 if (dR2 < 0.02 * 0.02 and dPt < 0.001) {
0192 if (recoMu.globalTrack().isNonnull()) {
0193 normalizedChi2 = recoMu.globalTrack()->normalizedChi2();
0194 nRecoMuonValidMuonHits = recoMu.globalTrack()->hitPattern().numberOfValidMuonHits();
0195 }
0196 recoMuonType = recoMu.type();
0197 nRecoMuonChambers = recoMu.numberOfChambers();
0198 nRecoMuonChambersCSCorDT = recoMu.numberOfChambersCSCorDT();
0199 nRecoMuonMatches = recoMu.numberOfMatches();
0200 nRecoMuonMatchedStations = recoMu.numberOfMatchedStations();
0201 nRecoMuonExpectedMatchedStations = recoMu.expectedNnumberOfMatchedStations();
0202 recoMuonStationMask = recoMu.stationMask();
0203 nRecoMuonMatchedRPCLayers = recoMu.numberOfMatchedRPCLayers();
0204 recoMuonRPClayerMask = recoMu.RPClayerMask();
0205 }
0206 }
0207
0208 if (muon.pt() < muonPtCut)
0209 continue;
0210 if (fabs(muon.eta()) > muonEtaCut)
0211 continue;
0212
0213 double ecalisopf = -1.0;
0214 if (EcalPFClusterIsoMap.isValid()) {
0215 ecalisopf = (*EcalPFClusterIsoMap)[muonRef];
0216 }
0217
0218 double hcalisopf = -1.0;
0219 if (HcalPFClusterIsoMap.isValid()) {
0220 hcalisopf = (*HcalPFClusterIsoMap)[muonRef];
0221 }
0222
0223 double trackiso = -1.0;
0224 if (TrackIsoMap.isValid()) {
0225 trackiso = (*TrackIsoMap)[muonRef];
0226 }
0227
0228 vtxInd.reserve(vtxMuPair.size());
0229 for (unsigned int i = 0; i < vtxMuPair.size(); i++) {
0230 float dr2_1 = reco::deltaR2(((vtxMuPair[i]).first), muon);
0231 float dr2_2 = reco::deltaR2(((vtxMuPair[i]).second), muon);
0232 if ((dr2_1 < minDR2) || (dr2_2 < minDR2))
0233 vtxInd.push_back(i);
0234 }
0235
0236 outMuons->emplace_back(muon.pt(),
0237 muon.eta(),
0238 muon.phi(),
0239 muon.mass(),
0240 recoMuonType,
0241 track->charge(),
0242 normalizedChi2,
0243 ecalisopf,
0244 hcalisopf,
0245 trackiso,
0246 validStandAloneMuonHits,
0247 matchedStandAloneMuonStations,
0248 nRecoMuonValidMuonHits,
0249 nRecoMuonChambers,
0250 nRecoMuonChambersCSCorDT,
0251 nRecoMuonMatches,
0252 nRecoMuonMatchedStations,
0253 nRecoMuonExpectedMatchedStations,
0254 recoMuonStationMask,
0255 nRecoMuonMatchedRPCLayers,
0256 recoMuonRPClayerMask,
0257 track->hitPattern().numberOfValidPixelHits(),
0258 track->hitPattern().numberOfValidStripHits(),
0259 track->hitPattern().pixelLayersWithMeasurement(),
0260 track->hitPattern().trackerLayersWithMeasurement(),
0261 track->chi2(),
0262 track->ndof(),
0263 track->dxy(),
0264 track->dz(),
0265 track->qoverp(),
0266 track->lambda(),
0267 track->pt(),
0268 track->phi(),
0269 track->eta(),
0270 track->dxyError(),
0271 track->dzError(),
0272 track->qoverpError(),
0273 track->lambdaError(),
0274 track->phiError(),
0275 track->dsz(),
0276 track->dszError(),
0277 track->covariance(0, 1),
0278 track->covariance(0, 2),
0279 track->covariance(0, 3),
0280 track->covariance(0, 4),
0281 track->covariance(1, 2),
0282 track->covariance(1, 3),
0283 track->covariance(1, 4),
0284 track->covariance(2, 3),
0285 track->covariance(2, 4),
0286 track->covariance(3, 4),
0287 track->vx(),
0288 track->vy(),
0289 track->vz(),
0290 vtxInd,
0291 track->hitPattern().run3ScoutingHitPatternPOD());
0292 vtxInd.clear();
0293 }
0294
0295
0296 iEvent.put(std::move(outMuons));
0297 iEvent.put(std::move(dispVertices), "displacedVtx");
0298 }
0299
0300
0301 void HLTScoutingMuonProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0302 edm::ParameterSetDescription desc;
0303 desc.add<edm::InputTag>("ChargedCandidates", edm::InputTag("hltIterL3MuonCandidatesNoVtx"));
0304 desc.add<edm::InputTag>("displacedvertexCollection", edm::InputTag("hltDisplacedmumuVtxProducer"));
0305 desc.add<edm::InputTag>("InputMuons", edm::InputTag("hltIterL3MuonsNoVtx"));
0306 desc.add<edm::InputTag>("InputLinks", edm::InputTag("hltL3MuonsIterL3LinksNoVtx"));
0307 desc.add<edm::InputTag>("Tracks", edm::InputTag("hltPixelTracks"));
0308 desc.add<edm::InputTag>("EcalPFClusterIsoMap", edm::InputTag("hltMuonEcalMFPFClusterIsoForMuonsNoVtx"));
0309 desc.add<edm::InputTag>("HcalPFClusterIsoMap", edm::InputTag("hltMuonHcalPFClusterIsoForMuonsNoVtx"));
0310 desc.add<edm::InputTag>("TrackIsoMap",
0311 edm::InputTag("hltMuonTkRelIsolationCut0p09MapNoVtx:combinedRelativeIsoDeposits"));
0312 desc.add<double>("muonPtCut", 3.0);
0313 desc.add<double>("muonEtaCut", 2.4);
0314 desc.add<double>("minVtxProbCut", 0.001);
0315
0316 descriptions.add("hltScoutingMuonProducer", desc);
0317 }
0318
0319
0320 #include "FWCore/Framework/interface/MakerMacros.h"
0321 DEFINE_FWK_MODULE(HLTScoutingMuonProducer);