16 bool passesQuality(
const reco::Track& trk,
const std::vector<reco::TrackBase::TrackQuality>& allowedQuals) {
17 for (
const auto& qual : allowedQuals) {
79 iConfig.getParameter<
edm::
InputTag>(
"packedPFCandidates"))),
86 minPt_(iConfig.getParameter<double>(
"minPt")),
87 minHits_(iConfig.getParameter<uint32_t>(
"minHits")),
88 minPixelHits_(iConfig.getParameter<uint32_t>(
"minPixelHits")),
89 minPtToStoreProps_(iConfig.getParameter<double>(
"minPtToStoreProps")),
90 minPtToStoreLowQualityProps_(iConfig.getParameter<double>(
"minPtToStoreLowQualityProps")),
91 covarianceVersion_(iConfig.getParameter<
int>(
"covarianceVersion")),
92 covariancePackingSchemas_(iConfig.getParameter<
std::
vector<
int>>(
"covariancePackingSchemas")),
94 passThroughCut_(iConfig.getParameter<
std::
string>(
"passThroughCut")),
95 maxDzForPrimaryAssignment_(
96 iConfig.getParameter<
edm::
ParameterSet>(
"pvAssignment").getParameter<double>(
"maxDzForPrimaryAssignment")),
97 maxDzSigForPrimaryAssignment_(
98 iConfig.getParameter<
edm::
ParameterSet>(
"pvAssignment").getParameter<double>(
"maxDzSigForPrimaryAssignment")),
99 maxDzErrorForPrimaryAssignment_(iConfig.getParameter<
edm::
ParameterSet>(
"pvAssignment")
100 .getParameter<double>(
"maxDzErrorForPrimaryAssignment")),
101 maxDxyForNotReconstructedPrimary_(iConfig.getParameter<
edm::
ParameterSet>(
"pvAssignment")
102 .getParameter<double>(
"maxDxyForNotReconstructedPrimary")),
103 maxDxySigForNotReconstructedPrimary_(iConfig.getParameter<
edm::
ParameterSet>(
"pvAssignment")
104 .getParameter<double>(
"maxDxySigForNotReconstructedPrimary")),
105 useLegacySetup_(iConfig.getParameter<
bool>(
"useLegacySetup")),
106 xiSelection_(iConfig.getParameter<
bool>(
"xiSelection")),
107 xiMassCut_(iConfig.getParameter<double>(
"xiMassCut")) {
108 std::vector<std::string> trkQuals(iConfig.
getParameter<std::vector<std::string>>(
"qualsToAutoAccept"));
114 std::ostringstream
msg;
115 msg <<
" PATLostTracks has a quality requirement which resolves to undefQuality. This usually means a typo and is "
116 "therefore treated a config error\nquality requirements:\n ";
117 for (
const auto& trkQual : trkQuals)
118 msg << trkQual <<
" ";
122 produces<std::vector<reco::Track>>();
123 produces<std::vector<pat::PackedCandidate>>();
124 produces<std::vector<pat::PackedCandidate>>(
"eleTracks");
125 produces<edm::Association<pat::PackedCandidateCollection>>();
135 iEvent.getByToken(map_, pf2pc);
156 iEvent.getByToken(pvOrigs_, pvOrigs);
158 auto outPtrTrks = std::make_unique<std::vector<reco::Track>>();
159 auto outPtrTrksAsCands = std::make_unique<std::vector<pat::PackedCandidate>>();
160 auto outPtrEleTrksAsCands = std::make_unique<std::vector<pat::PackedCandidate>>();
162 std::vector<TrkStatus> trkStatus(
tracks->size(), TrkStatus::NOTUSED);
167 for (
unsigned int ic = 0, nc =
cands->size(); ic < nc; ++ic) {
170 if (
cand.charge() &&
cand.trackRef().isNonnull() &&
cand.trackRef().id() ==
tracks.id()) {
171 if (
cand.pdgId() == 11)
172 trkStatus[
cand.trackRef().key()] = TrkStatus::PFELECTRON;
173 else if (
cand.pdgId() == -11)
174 trkStatus[
cand.trackRef().key()] = TrkStatus::PFPOSITRON;
175 else if ((*pf2pc)[
r]->numberOfHits() > 0)
176 trkStatus[
cand.trackRef().key()] = TrkStatus::PFCAND;
178 trkStatus[
cand.trackRef().key()] = TrkStatus::PFCANDNOTRKPROPS;
183 for (
const auto& secVert : *
vertices) {
184 for (
auto trkIt = secVert.tracks_begin(); trkIt != secVert.tracks_end(); trkIt++) {
185 if (trkStatus[trkIt->key()] == TrkStatus::NOTUSED)
186 trkStatus[trkIt->key()] = TrkStatus::VTX;
190 for (
size_t dIdx = 0; dIdx <
v0.numberOfDaughters(); dIdx++) {
191 size_t key = (dynamic_cast<const reco::RecoChargedCandidate*>(
v0.daughter(dIdx)))->track().key();
192 if (trkStatus[
key] == TrkStatus::NOTUSED)
193 trkStatus[
key] = TrkStatus::VTX;
197 double protonCharge = 0;
198 for (
size_t dIdx = 0; dIdx <
v0.numberOfDaughters(); dIdx++) {
199 size_t key = (dynamic_cast<const reco::RecoChargedCandidate*>(
v0.daughter(dIdx)))->track().key();
200 if (trkStatus[
key] == TrkStatus::NOTUSED)
201 trkStatus[
key] = TrkStatus::VTX;
202 protonCharge +=
v0.daughter(dIdx)->charge() *
v0.daughter(dIdx)->momentum().mag2();
208 for (
unsigned int trkIndx = 0; trkIndx <
tracks->size(); trkIndx++) {
210 if ((*trk).charge() * protonCharge < 0 || trkStatus[trkIndx] != TrkStatus::NOTUSED)
214 trk->px(), trk->py(), trk->pz(),
sqrt(trk->momentum().mag2() + 0.01947995518));
215 if ((p4Lambda + p4pi).M() < xiMassCut_)
216 trkStatus[trkIndx] = TrkStatus::VTX;
222 for (
unsigned int trkIndx = 0; trkIndx <
tracks->size(); trkIndx++) {
224 if (trkStatus[trkIndx] == TrkStatus::VTX || (trkStatus[trkIndx] == TrkStatus::NOTUSED && passTrkCuts(*trk))) {
225 outPtrTrks->emplace_back(*trk);
227 std::pair<int, pat::PackedCandidate::PVAssociationQuality> pvAsso = associateTrkToVtx(*pvOrigs, trk);
231 }
else if (!
pvs->empty()) {
234 addPackedCandidate(*outPtrTrksAsCands, trk,
pv, pvRefProd, trkStatus[trkIndx], pvAsso.second,
muons);
238 mapping[trkIndx] = lostTrkIndx;
240 }
else if ((trkStatus[trkIndx] == TrkStatus::PFELECTRON || trkStatus[trkIndx] == TrkStatus::PFPOSITRON) &&
243 std::pair<int, pat::PackedCandidate::PVAssociationQuality> pvAsso = associateTrkToVtx(*pvOrigs, trk);
247 }
else if (!
pvs->empty()) {
250 addPackedCandidate(*outPtrEleTrksAsCands, trk,
pv, pvRefProd, trkStatus[trkIndx], pvAsso.second,
muons);
257 auto tk2pc = std::make_unique<edm::Association<pat::PackedCandidateCollection>>(oh);
267 const bool passTrkQual = passesQuality(tr, qualsToAutoAccept_);
269 return passTrkHits || passTrkQual || passThroughCut_(tr);
279 const float mass = 0.13957018;
281 int id = 211 * trk->charge();
282 if (trkStatus == TrkStatus::PFELECTRON)
284 else if (trkStatus == TrkStatus::PFPOSITRON)
290 id = -13 * trk->charge();
310 cands.back().setCovarianceVersion(covarianceVersion_);
312 if (trk->pt() > minPtToStoreProps_ || trkStatus == TrkStatus::VTX) {
313 if (useLegacySetup_ ||
std::abs(
id) == 11 || trkStatus == TrkStatus::VTX) {
314 cands.back().setTrackProperties(*trk, covariancePackingSchemas_[4], covarianceVersion_);
316 if (trk->hitPattern().numberOfValidPixelHits() > 0) {
317 cands.back().setTrackProperties(
318 *trk, covariancePackingSchemas_[0], covarianceVersion_);
320 cands.back().setTrackProperties(
321 *trk, covariancePackingSchemas_[1], covarianceVersion_);
324 }
else if (!useLegacySetup_ && trk->pt() > minPtToStoreLowQualityProps_) {
325 if (trk->hitPattern().numberOfValidPixelHits() > 0) {
326 cands.back().setTrackProperties(
327 *trk, covariancePackingSchemas_[2], covarianceVersion_);
329 cands.back().setTrackProperties(
330 *trk, covariancePackingSchemas_[3], covarianceVersion_);
333 cands.back().setAssociationQuality(pvAssocQuality);
341 if (useLegacySetup_) {
346 return std::pair<int, pat::PackedCandidate::PVAssociationQuality>(0,
349 return std::pair<int, pat::PackedCandidate::PVAssociationQuality>(-1,
357 int iVtxMaxWeight = -1;
358 int iVtxMinDzDist = -1;
364 float w =
vtx.trackWeight(trk);
366 double dzSig =
dz / trk->dzError();
371 if (dzSig < minDzSig) {
379 if (iVtxMaxWeight >= 0) {
380 if (maxWeight > 0.5) {
381 return std::pair<int, pat::PackedCandidate::PVAssociationQuality>(iVtxMaxWeight,
384 return std::pair<int, pat::PackedCandidate::PVAssociationQuality>(iVtxMaxWeight,
389 if (
minDz < maxDzForPrimaryAssignment_) {
390 const double add_cov =
vertices[iVtxMinDzDist].covariance(2, 2);
391 const double dzErr =
sqrt(trk->dzError() * trk->dzError() + add_cov);
392 if (
minDz / dzErr < maxDzSigForPrimaryAssignment_ && trk->dzError() < maxDzErrorForPrimaryAssignment_) {
393 return std::pair<int, pat::PackedCandidate::PVAssociationQuality>(iVtxMinDzDist,
400 std::abs(trk->dxy(
vertices[0].position()) / trk->dxyError()) < maxDxySigForNotReconstructedPrimary_)
401 return std::pair<int, pat::PackedCandidate::PVAssociationQuality>(iVtxMinDzDist,