68 int& pc_ref_idx)
const;
121 iConfig.getParameter<
edm::
InputTag>(
"packedPFCandidates"))),
123 iConfig.getParameter<
edm::
InputTag>(
"lostTracks"))),
125 iConfig.getParameter<
edm::
InputTag>(
"packedPFCandidates"))),
127 gt2dedxStrip_(consumes<
edm::ValueMap<
reco::DeDxData>>(iConfig.getParameter<
edm::
InputTag>(
"dEdxDataStrip"))),
128 gt2dedxPixel_(consumes<
edm::ValueMap<
reco::DeDxData>>(iConfig.getParameter<
edm::
InputTag>(
"dEdxDataPixel"))),
130 addPrescaledDeDxTracks_(iConfig.getParameter<
bool>(
"addPrescaledDeDxTracks")),
131 gt2dedxHitInfoPrescale_(addPrescaledDeDxTracks_ ? consumes<
edm::ValueMap<
int>>(
132 iConfig.getParameter<
edm::
InputTag>(
"dEdxHitInfoPrescale"))
133 :
edm::EDGetTokenT<
edm::ValueMap<
int>>()),
134 usePrecomputedDeDxStrip_(iConfig.getParameter<
bool>(
"usePrecomputedDeDxStrip")),
135 usePrecomputedDeDxPixel_(iConfig.getParameter<
bool>(
"usePrecomputedDeDxPixel")),
136 pT_cut_(iConfig.getParameter<double>(
"pT_cut")),
137 pT_cut_noIso_(iConfig.getParameter<double>(
"pT_cut_noIso")),
138 pfIsolation_DR_(iConfig.getParameter<double>(
"pfIsolation_DR")),
139 pfIsolation_DZ_(iConfig.getParameter<double>(
"pfIsolation_DZ")),
140 absIso_cut_(iConfig.getParameter<double>(
"absIso_cut")),
141 relIso_cut_(iConfig.getParameter<double>(
"relIso_cut")),
142 miniRelIso_cut_(iConfig.getParameter<double>(
"miniRelIso_cut")),
143 caloJet_DR_(iConfig.getParameter<double>(
"caloJet_DR")),
144 pflepoverlap_DR_(iConfig.getParameter<double>(
"pflepoverlap_DR")),
145 pflepoverlap_pTmin_(iConfig.getParameter<double>(
"pflepoverlap_pTmin")),
146 pcRefNearest_DR_(iConfig.getParameter<double>(
"pcRefNearest_DR")),
147 pcRefNearest_pTmin_(iConfig.getParameter<double>(
"pcRefNearest_pTmin")),
148 pfneutralsum_DR_(iConfig.getParameter<double>(
"pfneutralsum_DR")),
149 saveDeDxHitInfo_(iConfig.getParameter<
bool>(
"saveDeDxHitInfo")),
150 saveDeDxHitInfoCut_(iConfig.getParameter<
std::
string>(
"saveDeDxHitInfoCut")) {
160 throw cms::Exception(
"ParameterError") <<
"miniIsoParams must have exactly 3 elements.\n";
162 produces<pat::IsolatedTrackCollection>();
165 produces<reco::DeDxHitInfoCollection>();
166 produces<reco::DeDxHitInfoAss>();
175 iEvent.getByToken(pc_, pc_h);
185 iEvent.getByToken(gt_, gt_h);
195 iEvent.getByToken(gt2pc_, gt2pc);
199 iEvent.getByToken(gt2lt_, gt2lt);
203 iEvent.getByToken(pc2pf_, pc2pf);
210 iEvent.getByToken(gt2dedxStrip_, gt2dedxStrip);
214 iEvent.getByToken(gt2dedxPixel_, gt2dedxPixel);
218 iEvent.getByToken(gt2dedxHitInfo_, gt2dedxHitInfo);
220 if (addPrescaledDeDxTracks_) {
221 iEvent.getByToken(gt2dedxHitInfoPrescale_, gt2dedxHitInfoPrescale);
232 auto outDeDxC = std::make_unique<reco::DeDxHitInfoCollection>();
233 std::vector<int> dEdXass;
235 auto outPtrP = std::make_unique<std::vector<pat::IsolatedTrack>>();
238 for (
unsigned int igt = 0; igt <
generalTracks->size(); igt++) {
249 bool isInPackedCands = (pcref.
isNonnull() && pcref.
id() == pc_h.
id() && pfCand->
charge() != 0);
250 bool isInLostTracks = (ltref.
isNonnull() && ltref.
id() == lt_h.
id());
256 float dz,
dxy, dzError, dxyError;
261 if (isInPackedCands) {
263 polarP4 = pfCand->
p4();
265 pfCandInd = pcref.
key();
267 }
else if (isInLostTracks) {
268 p4 = lostTrack->
p4();
269 polarP4 = lostTrack->
p4();
272 ltCandInd = ltref.
key();
274 double m = 0.13957018;
275 double E =
sqrt(
m *
m + gentk.
p() * gentk.
p());
276 p4.SetPxPyPzE(gentk.
px(), gentk.
py(), gentk.
pz(), E);
277 polarP4.SetCoordinates(gentk.
pt(), gentk.
eta(), gentk.
phi(),
m);
284 if (addPrescaledDeDxTracks_) {
285 const auto& dedxRef = (*gt2dedxHitInfo)[tkref];
286 if (dedxRef.isNonnull()) {
287 prescaled = (*gt2dedxHitInfoPrescale)[dedxRef];
291 if (polarP4.pt() < pT_cut_ && prescaled <= 1)
299 getIsolation(polarP4, pc, pfCandInd, isolationDR03, miniIso);
302 if (polarP4.pt() < pT_cut_noIso_ && prescaled <= 1 &&
309 if (isInPackedCands) {
317 }
else if (isInLostTracks) {
319 dz = lostTrack->
dz();
327 dz = gentk.
dz(
pv.position());
335 float caloJetEm, caloJetHad;
336 getCaloJetEnergy(polarP4,
caloJets.product(), caloJetEm, caloJetHad);
338 bool pfLepOverlap = getPFLeptonOverlap(polarP4, pc);
339 float pfNeutralSum = getPFNeutralSum(polarP4, pc, pfCandInd);
342 int refToNearestPF_idx = -1;
343 getNearestPCRef(polarP4, pc, pfCandInd, refToNearestPF_idx);
344 if (refToNearestPF_idx != -1)
348 int refToNearestLostTrack_idx = -1;
349 getNearestPCRef(polarP4, lt, ltCandInd, refToNearestLostTrack_idx);
350 if (refToNearestLostTrack_idx != -1)
354 float dEdxPixel = -1, dEdxStrip = -1;
355 if (usePrecomputedDeDxStrip_ && gt2dedxStrip.
isValid() && gt2dedxStrip->contains(tkref.
id())) {
356 dEdxStrip = (*gt2dedxStrip)[tkref].dEdx();
359 dEdxStrip = getDeDx(hitInfo,
false,
true);
361 if (usePrecomputedDeDxPixel_ && gt2dedxPixel.
isValid() && gt2dedxPixel->contains(tkref.
id())) {
362 dEdxPixel = (*gt2dedxPixel)[tkref].dEdx();
365 dEdxPixel = getDeDx(hitInfo,
true,
false);
374 std::vector<uint32_t> crossedHcalStatus;
378 std::vector<uint16_t> crossedEcalStatus;
380 crossedEcalStatus.push_back(ecalS->
find(did.rawId())->getStatusCode());
418 refToNearestLostTrack));
419 outPtrP->back().setStatus(prescaled);
421 if (saveDeDxHitInfo_) {
422 const auto& dedxRef = (*gt2dedxHitInfo)[tkref];
423 if (saveDeDxHitInfoCut_(outPtrP->back()) && dedxRef.isNonnull()) {
424 outDeDxC->push_back(*dedxRef);
425 dEdXass.push_back(outDeDxC->size() - 1);
427 dEdXass.push_back(-1);
435 for (
unsigned int ipc = 0; ipc < pc->size(); ipc++) {
441 if (pfref.
get()->trackRef().isNonnull() && pfref.
get()->trackRef().id() == gt_h.
id())
447 float dz,
dxy, dzError, dxyError;
452 if (polarP4.pt() < pT_cut_)
460 getIsolation(polarP4, pc, ipc, isolationDR03, miniIso);
463 if (polarP4.pt() < pT_cut_noIso_ && !(isolationDR03.
chargedHadronIso() < absIso_cut_ ||
481 float caloJetEm, caloJetHad;
482 getCaloJetEnergy(polarP4,
caloJets.product(), caloJetEm, caloJetHad);
484 bool pfLepOverlap = getPFLeptonOverlap(polarP4, pc);
485 float pfNeutralSum = getPFNeutralSum(polarP4, pc, ipc);
488 int refToNearestPF_idx = -1;
489 getNearestPCRef(polarP4, pc, ipc, refToNearestPF_idx);
490 if (refToNearestPF_idx != -1)
494 int refToNearestLostTrack_idx = -1;
495 getNearestPCRef(polarP4, lt, -1, refToNearestLostTrack_idx);
496 if (refToNearestLostTrack_idx != -1)
501 float dEdxPixel = -1, dEdxStrip = -1;
503 std::vector<uint16_t> ecalStatus;
504 std::vector<uint32_t> hcalStatus;
532 refToNearestLostTrack));
534 dEdXass.push_back(-1);
538 if (saveDeDxHitInfo_) {
540 auto dedxMatch = std::make_unique<reco::DeDxHitInfoAss>(dedxOH);
542 filler.insert(orphHandle, dEdXass.begin(), dEdXass.end());
553 float chiso = 0, nhiso = 0, phiso = 0, puiso = 0;
554 float chmiso = 0, nhmiso = 0, phmiso = 0, pumiso = 0;
555 float miniDR =
std::max(miniIsoParams_[0],
std::min(miniIsoParams_[1], miniIsoParams_[2] /
p4.pt()));
556 for (pat::PackedCandidateCollection::const_iterator pf_it = pc->begin(); pf_it != pc->end(); pf_it++) {
557 if (
int(pf_it - pc->begin()) == pc_idx)
560 bool fromPV = (pf_it->fromPV() > 1 || fabs(pf_it->dz()) < pfIsolation_DZ_);
561 float pt = pf_it->p4().pt();
564 if (
dr < pfIsolation_DR_) {
598 bool isOverlap =
false;
599 float dr_min = pflepoverlap_DR_;
601 for (
const auto&
pf : *pc) {
610 if (
pt < pflepoverlap_pTmin_)
614 if (
dr > pflepoverlap_DR_)
623 if (dr_min < pflepoverlap_DR_ && (id_drmin == 11 || id_drmin == 13))
633 int& pc_ref_idx)
const {
634 float dr_min = pcRefNearest_DR_;
635 float dr_min_pu = pcRefNearest_DR_;
636 int pc_ref_idx_pu = -1;
637 for (pat::PackedCandidateCollection::const_iterator pf_it = pc->begin(); pf_it != pc->end(); pf_it++) {
638 if (
int(pf_it - pc->begin()) == pc_idx)
641 bool fromPV = (pf_it->fromPV() > 1 || fabs(pf_it->dz()) < pfIsolation_DZ_);
642 float pt = pf_it->p4().pt();
646 if (
pt < pcRefNearest_pTmin_)
648 if (
dr > dr_min &&
dr > dr_min_pu)
654 pc_ref_idx =
int(pf_it - pc->begin());
657 if (
dr < dr_min_pu) {
659 pc_ref_idx_pu =
int(pf_it - pc->begin());
664 if (pc_ref_idx == -1 &&
666 pc_ref_idx = pc_ref_idx_pu;
674 float nhsum = 0, phsum = 0;
675 for (pat::PackedCandidateCollection::const_iterator pf_it = pc->begin(); pf_it != pc->end(); pf_it++) {
676 if (
int(pf_it - pc->begin()) == pc_idx)
679 float pt = pf_it->p4().pt();
682 if (
dr < pfneutralsum_DR_) {
692 nsum = nhsum + phsum;
699 if (hitInfo ==
nullptr) {
703 std::vector<float> charge_vec;
704 for (
unsigned int ih = 0; ih < hitInfo->
size(); ih++) {
725 Norm = 3.61e-06 * 265;
731 int size = charge_vec.size();
736 for (
int i = 0;
i <
size;
i++) {
753 return trackAssociator_.associate(
iEvent, iSetup, trackAssocParameters_, &initialState);
759 float& caloJetHad)
const {
760 float nearestDR = 999;
762 for (
unsigned int i = 0;
i < cJets->size();
i++) {
764 if (
dR < caloJet_DR_ &&
dR < nearestDR) {