Skip to content

Commit

Permalink
Fix GED electron/photon PF association in run2 heavy-ion miniAOD
Browse files Browse the repository at this point in the history
  • Loading branch information
ttrk committed Mar 17, 2022
1 parent c382a8d commit be8d658
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 3 deletions.
1 change: 1 addition & 0 deletions PhysicsTools/PatAlgos/python/slimming/slimming_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
from Configuration.ProcessModifiers.run2_miniAOD_pp_on_AA_103X_cff import run2_miniAOD_pp_on_AA_103X
run2_miniAOD_pp_on_AA_103X.toReplaceWith(slimmingTask,cms.Task(primaryVertexAssociationCleaned,slimmingTask.copy()))
run2_miniAOD_pp_on_AA_103X.toReplaceWith(slimmingTask,cms.Task(primaryVertexWithBSAssociationCleaned,slimmingTask.copy()))
run2_miniAOD_pp_on_AA_103X.toReplaceWith(slimmingTask,cms.Task(pfEGammaToCandidateRemapperCleaned,slimmingTask.copy()))

from RecoHI.HiTracking.miniAODVertexRecovery_cff import offlinePrimaryVerticesRecovery, offlineSlimmedPrimaryVerticesRecovery
pp_on_AA.toReplaceWith(
Expand Down
11 changes: 11 additions & 0 deletions RecoEgamma/EgammaPhotonProducers/python/reducedEgamma_cfi.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,3 +104,14 @@
hiPhotonIsolationMapInput = "photonIsolationHIProducerppGED",
hiPhotonIsolationMapOutput = "photonIsolationHIProducerppGED"
)

from RecoHI.HiJetAlgos.HiBadParticleCleaner_cfi import cleanedParticleFlow
from CommonTools.ParticleFlow.pfEGammaToCandidateRemapper_cfi import pfEGammaToCandidateRemapper as pfEGammaToCandidateRemapperCleaned
pfEGammaToCandidateRemapperCleaned.pf2pf = cms.InputTag("cleanedParticleFlow")

from Configuration.ProcessModifiers.run2_miniAOD_pp_on_AA_103X_cff import run2_miniAOD_pp_on_AA_103X
run2_miniAOD_pp_on_AA_103X.toModify(
reducedEgamma,
photonsPFValMap = cms.InputTag("pfEGammaToCandidateRemapperCleaned:photons"),
gsfElectronsPFValMap = cms.InputTag("pfEGammaToCandidateRemapperCleaned:electrons")
)
41 changes: 38 additions & 3 deletions RecoHI/HiJetAlgos/plugins/HiBadParticleCleaner.cc
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ HiBadParticleCleaner::HiBadParticleCleaner(const edm::ParameterSet& iConfig)
produces<bool>();
produces<reco::PFCandidateCollection>();
produces<reco::PFCandidateCollection>("removed");
produces<edm::ValueMap<reco::PFCandidateRef>>();
}

//
Expand All @@ -91,7 +92,11 @@ void HiBadParticleCleaner::produce(edm::StreamID, edm::Event& iEvent, const edm:

bool foundBadCandidate = false;

int n = pfCandidates->size();
std::vector<int> oldToNew(n);
int iPF = -1;
for (const reco::PFCandidate& pfCandidate : *pfCandidates) {
iPF++;
if (pfCandidate.particleId() == reco::PFCandidate::ParticleType::mu) // muon cleaning
{
if (pfCandidate.pt() > minMuonPt_) {
Expand Down Expand Up @@ -128,19 +133,22 @@ void HiBadParticleCleaner::produce(edm::StreamID, edm::Event& iEvent, const edm:

if (sig3d > maxSigLoose_) {
pBadCandidateCollection->push_back(pfCandidate);
oldToNew[iPF] = -1*(pBadCandidateCollection->size());
foundBadCandidate = true;
continue;
}

if (track->pt() < pfCandidate.pt() / 1.5 || track->pt() > pfCandidate.pt() * 1.5) {
foundBadCandidate = true;
pBadCandidateCollection->push_back(pfCandidate);
oldToNew[iPF] = -1*(pBadCandidateCollection->size());
continue;
}
if (track->originalAlgo() == reco::TrackBase::muonSeededStepOutIn &&
track->hitPattern().trackerLayersWithMeasurement() < minTrackerLayersForMuonTight_) {
foundBadCandidate = true;
pBadCandidateCollection->push_back(pfCandidate);
oldToNew[iPF] = -1*(pBadCandidateCollection->size());
continue;
}
}
Expand All @@ -156,6 +164,7 @@ void HiBadParticleCleaner::produce(edm::StreamID, edm::Event& iEvent, const edm:
if ((nHits < minTrackNHits_ && nPixelHits < minPixelNHits_) || nHits == 3) {
foundBadCandidate = true;
pBadCandidateCollection->push_back(pfCandidate);
oldToNew[iPF] = -1*(pBadCandidateCollection->size());
continue;
}

Expand All @@ -176,12 +185,14 @@ void HiBadParticleCleaner::produce(edm::StreamID, edm::Event& iEvent, const edm:
if (sig3d > maxSigLoose_) {
foundBadCandidate = true;
pBadCandidateCollection->push_back(pfCandidate);
oldToNew[iPF] = -1*(pBadCandidateCollection->size());
continue;
}

if (sig3d > maxSigTight_ && nHits < minTrackNHits_) {
foundBadCandidate = true;
pBadCandidateCollection->push_back(pfCandidate);
oldToNew[iPF] = -1*(pBadCandidateCollection->size());
continue;
}

Expand All @@ -192,12 +203,14 @@ void HiBadParticleCleaner::produce(edm::StreamID, edm::Event& iEvent, const edm:
if (sig3d > maxSigLoose_) {
foundBadCandidate = true;
pBadCandidateCollection->push_back(pfCandidate);
oldToNew[iPF] = -1*(pBadCandidateCollection->size());
continue;
}

if (nHits < minTrackNHits_) {
foundBadCandidate = true;
pBadCandidateCollection->push_back(pfCandidate);
oldToNew[iPF] = -1*(pBadCandidateCollection->size());
continue;
}
}
Expand All @@ -208,34 +221,56 @@ void HiBadParticleCleaner::produce(edm::StreamID, edm::Event& iEvent, const edm:
if (sig3d > maxSigTight_) {
foundBadCandidate = true;
pBadCandidateCollection->push_back(pfCandidate);
oldToNew[iPF] = -1*(pBadCandidateCollection->size());
continue;
}

if (nHits < minTrackNHits_) {
foundBadCandidate = true;
pBadCandidateCollection->push_back(pfCandidate);
oldToNew[iPF] = -1*(pBadCandidateCollection->size());
continue;
}

if (nPixelHits < minPixelNHits_) {
foundBadCandidate = true;
pBadCandidateCollection->push_back(pfCandidate);
oldToNew[iPF] = -1*(pBadCandidateCollection->size());
continue;
}
}
}
}

pOutputCandidateCollection->push_back(pfCandidate);

oldToNew[iPF] = (pOutputCandidateCollection->size());
} // end loop over pf candidates

bool pass = !foundBadCandidate;

iEvent.put(std::move(pOutputCandidateCollection));
iEvent.put(std::move(pBadCandidateCollection), "removed");
edm::OrphanHandle<std::vector<reco::PFCandidate>> newpf = iEvent.put(std::move(pOutputCandidateCollection));
edm::OrphanHandle<std::vector<reco::PFCandidate>> badpf = iEvent.put(std::move(pBadCandidateCollection), "removed");

iEvent.put(std::make_unique<bool>(pass));

std::unique_ptr<edm::ValueMap<reco::PFCandidateRef>> pf2pf(new edm::ValueMap<reco::PFCandidateRef>());
edm::ValueMap<reco::PFCandidateRef>::Filler filler(*pf2pf);

std::vector<reco::PFCandidateRef> refs;
refs.reserve(n);

// old to new
for (iPF = 0; iPF < n; ++iPF) {
if (oldToNew[iPF] > 0) {
refs.push_back(reco::PFCandidateRef(newpf, oldToNew[iPF] - 1));
} else {
refs.push_back(reco::PFCandidateRef(badpf, -oldToNew[iPF] - 1));
}