76 :
tag(tag_), tk(tk_), traj(traj_), tass(tass_), tsel(tsel_), tmva(tmva_) {}
80 consumes<reco::TrackCollection>(
tag),
81 consumes<std::vector<Trajectory>>(
tag),
82 consumes<TrajTrackAssociationCollection>(
tag),
88 consumes<reco::TrackCollection>(
tag),
89 consumes<std::vector<Trajectory>>(
tag),
90 consumes<TrajTrackAssociationCollection>(
tag),
143 #include <x86intrin.h>
148 inline volatile unsigned long long rdtsc() {
return __rdtsc(); }
153 unsigned long long st;
154 long long totBegin = 0;
155 long long totPre = 0;
156 long long totEnd = 0;
157 unsigned long long timeNo;
158 unsigned long long timeOv;
159 void begin(
int tt) { totBegin +=
tt; }
160 void start() { st = rdtsc(); }
161 void noOverlap() { timeNo += (rdtsc() - st); }
162 void overlap() { timeOv += (rdtsc() - st); }
163 void pre(
int tt) { totPre +=
tt; }
164 void end(
int tt) { totEnd +=
tt; }
175 std::cout <<
"TrackListMerger stat\nBegin/Pre/End/maxDPhi/maxDEta/Overlap/NoOverlap " << totBegin <<
'/' << totPre
176 <<
'/' << totEnd <<
'/' << maxDP <<
'/' << maxDE <<
'/' << timeOv / 1000 <<
'/' << timeNo / 1000
180 ~StatCount() {
print(); }
202 return reinterpret_cast<const BaseTrackerRecHit*>(
hit)->firstClusterRef().
id();
210 std::vector<edm::InputTag> trackProducerTags(conf.
getParameter<std::vector<edm::InputTag>>(
"TrackProducers"));
224 if (!qualityStr.empty()) {
242 std::vector<edm::InputTag>
selectors(conf.
getParameter<std::vector<edm::InputTag>>(
"selectedTrackQuals"));
243 std::vector<edm::InputTag> mvaStores;
244 if (conf.
exists(
"mvaValueTags")) {
245 mvaStores = conf.
getParameter<std::vector<edm::InputTag>>(
"mvaValueTags");
249 mvaStores.push_back(ntag);
252 unsigned int numTrkColl = trackProducerTags.size();
254 throw cms::Exception(
"Inconsistent size") <<
"need same number of track collections and selectors";
256 if (numTrkColl !=
hasSelector_.size() || numTrkColl != mvaStores.size()) {
257 throw cms::Exception(
"Inconsistent size") <<
"need same number of track collections and MVA stores";
267 for (
unsigned int i = 1;
i < numTrkColl;
i++) {
268 if (!(trackProducerTags[
i] == trackProducerTags[0]))
272 throw cms::Exception(
"Bad input") <<
"to use writeOnlyTrkQuals=True all input InputTags must be the same";
274 produces<edm::ValueMap<int>>();
275 produces<QualityMaskCollection>(
"QualityMasks");
277 produces<reco::TrackCollection>();
282 produces<TrajectorySeedCollection>();
286 produces<reco::TrackExtraCollection>();
287 produces<TrackingRecHitCollection>();
289 produces<std::vector<Trajectory>>();
290 produces<TrajTrackAssociationCollection>();
292 produces<edm::ValueMap<float>>(
"MVAVals");
293 produces<MVACollection>(
"MVAValues");
297 for (
unsigned int i = 0;
i < numTrkColl; ++
i) {
299 :
edTokens(trackProducerTags[
i], mvaStores[
i]);
325 std::vector<const reco::TrackCollection*> trackColls;
326 std::vector<edm::Handle<reco::TrackCollection>> trackHandles(
trackProducers_.size());
328 trackColls.push_back(
nullptr);
332 trackColls[
i] = trackHandles[
i].product();
335 trackColls[
i] = &s_empty;
339 unsigned int collsSize = trackColls.size();
340 unsigned int rSize = 0;
341 unsigned int trackCollSizes[collsSize];
342 unsigned int trackCollFirsts[collsSize];
343 for (
unsigned int i = 0;
i != collsSize;
i++) {
344 trackCollSizes[
i] = trackColls[
i]->size();
345 trackCollFirsts[
i] = rSize;
346 rSize += trackCollSizes[
i];
349 statCount.begin(rSize);
358 bool trkUpdated[rSize];
359 int trackCollNum[rSize];
360 int trackQuals[rSize];
361 float trackMVAs[rSize];
363 std::vector<reco::TrackBase::AlgoMask> algoMask(rSize);
364 for (
unsigned int j = 0;
j < rSize;
j++) {
367 trkUpdated[
j] =
false;
370 trackMVAs[
j] = -998.0;
375 for (
unsigned int j = 0;
j != collsSize;
j++) {
388 for (reco::TrackCollection::const_iterator
track = tC1->begin();
track != tC1->end();
track++) {
391 trackQuals[
i] =
track->qualityMask();
392 oriAlgo[
i] =
track->originalAlgo();
393 algoMask[
i] =
track->algoMask();
397 if ((*trackMVAStore).contains(trkRef.
id()))
398 trackMVAs[
i] = (*trackMVAStore)[trkRef];
400 int qual = (*trackSelColl)[trkRef];
406 trackQuals[
i] = qual;
410 selected[
i] = trackQuals[
i] + 10;
411 if ((
short unsigned)
track->ndof() < 1) {
434 statCount.pre(ngood);
437 typedef std::pair<unsigned int, const TrackingRecHit*> IHit;
438 std::vector<std::vector<IHit>> rh1(ngood);
443 for (
unsigned int j = 0;
j < rSize;
j++) {
444 if (selected[
j] == 0)
448 unsigned int collNum = trackCollNum[
j];
449 unsigned int trackNum =
j - trackCollFirsts[collNum];
453 int validHits =
track->numberOfValidHits();
454 int validPixelHits =
track->hitPattern().numberOfValidPixelHits();
459 rh1[
i].reserve(validHits);
460 auto compById = [](IHit
const& h1, IHit
const& h2) {
return h1.first < h2.first; };
463 unsigned int id =
hit->rawId();
464 if (
hit->geographicalId().subdetId() > 2)
467 rh1[
i].emplace_back(
id,
hit);
468 std::push_heap(rh1[
i].begin(), rh1[
i].
end(), compById);
471 std::sort_heap(rh1[
i].begin(), rh1[
i].
end(), compById);
475 if LIKELY (ngood > 1 && collsSize > 1)
476 for (
unsigned int ltm = 0; ltm <
listsToMerge_.size(); ltm++) {
477 int saveSelected[rSize];
478 bool notActive[collsSize];
479 for (
unsigned int cn = 0; cn != collsSize; ++cn)
482 for (
unsigned int i = 0;
i < rSize;
i++)
483 saveSelected[
i] = selected[
i];
486 for (
unsigned int i = 0;
i < rSize - 1;
i++) {
487 if (selected[
i] == 0)
489 unsigned int collNum = trackCollNum[
i];
492 if (notActive[collNum])
496 unsigned int nh1 = rh1[k1].size();
497 int qualityMaskT1 = trackQuals[
i];
500 float score1 =
score[k1];
503 for (
unsigned int j =
i + 1;
j < rSize;
j++) {
504 if (selected[
j] == 0)
506 unsigned int collNum2 = trackCollNum[
j];
510 if (notActive[collNum2])
515 int newQualityMask = -9;
517 int maskT1 = saveSelected[
i] > 1 ? saveSelected[
i] - 10 : qualityMaskT1;
518 int maskT2 = saveSelected[
j] > 1 ? saveSelected[
j] - 10 : trackQuals[
j];
519 newQualityMask = (maskT1 | maskT2);
521 unsigned int nh2 = rh1[k2].size();
536 int firstoverlap = 0;
548 while (ih != nh1 && jh != nh2) {
552 auto const id1 = rh1[k1][ih].first;
553 auto const id2 = rh1[k2][jh].first;
561 while ((++li) != nh1 &&
id1 == rh1[k1][li].
first) {
564 while ((++lj) != nh2 &&
id2 == rh1[k2][lj].
first) {
566 for (
auto ii = ih;
ii != li; ++
ii)
567 for (
auto jj = jh;
jj != lj; ++
jj) {
580 (collNum != collNum2)
584 auto seti = [&](
unsigned int ii,
unsigned int jj) {
586 selected[
ii] = 10 + newQualityMask;
587 trkUpdated[
ii] =
true;
589 oriAlgo[
ii] = oriAlgo[
jj];
590 algoMask[
ii] |= algoMask[
jj];
591 algoMask[
jj] = algoMask[
ii];
595 float score2 =
score[k2];
596 constexpr
float almostSame =
598 if (score1 - score2 > almostSame) {
600 }
else if (score2 - score1 > almostSame) {
632 statCount.noOverlap();
635 if (selected[
i] == 0)
641 auto vmMVA = std::make_unique<edm::ValueMap<float>>();
646 unsigned int tSize = trackColls[0]->size();
647 auto vm = std::make_unique<edm::ValueMap<int>>();
650 std::vector<int> finalQuals(tSize, -1);
651 for (
unsigned int i = 0;
i < rSize;
i++) {
652 unsigned int tNum =
i % tSize;
654 if (selected[
i] > 1) {
655 finalQuals[tNum] = selected[
i] - 10;
657 finalQuals[tNum] = (finalQuals[tNum] | (1 <<
qualityToSet_));
659 if (selected[
i] == 1)
660 finalQuals[tNum] = trackQuals[
i];
663 filler.insert(trackHandles[0], finalQuals.begin(), finalQuals.end());
667 for (
auto&
q : finalQuals)
669 auto quals = std::make_unique<QualityMaskCollection>(finalQuals.begin(), finalQuals.end());
672 std::vector<float> mvaVec(tSize, -99);
674 for (
unsigned int i = 0;
i < rSize;
i++) {
675 unsigned int tNum =
i % tSize;
676 mvaVec[tNum] = trackMVAs[tNum];
679 fillerMVA.insert(trackHandles[0], mvaVec.begin(), mvaVec.end());
683 auto mvas = std::make_unique<MVACollection>(mvaVec.begin(), mvaVec.end());
693 std::vector<reco::TrackRef> trackRefs(rSize);
694 std::vector<edm::RefToBase<TrajectorySeed>> seedsRefs(rSize);
696 unsigned int nToWrite = 0;
697 for (
unsigned int i = 0;
i < rSize;
i++)
698 if (selected[
i] != 0)
701 std::vector<float> mvaVec;
703 outputTrks = std::make_unique<reco::TrackCollection>();
711 outputTrkHits = std::make_unique<TrackingRecHitCollection>();
715 outputSeeds = std::make_unique<TrajectorySeedCollection>();
721 outputTrajs = std::make_unique<std::vector<Trajectory>>();
724 for (
unsigned int i = 0;
i < rSize;
i++) {
725 if (selected[
i] == 0) {
730 unsigned int collNum = trackCollNum[
i];
731 unsigned int trackNum =
i - trackCollFirsts[collNum];
734 mvaVec.push_back(trackMVAs[
i]);
735 if (selected[
i] > 1) {
736 outputTrks->back().setQualityMask(selected[
i] - 10);
741 if (selected[
i] == 1)
743 outputTrks->back().setOriginalAlgorithm(oriAlgo[
i]);
753 bool doRekeyOnThisSeed =
false;
757 if (origSeedRef->
nHits() != 0) {
766 doRekeyOnThisSeed =
e.getByLabel(clusterRemovalInfos, CRIh);
770 if (doRekeyOnThisSeed && !(clusterRemovalInfos ==
edm::InputTag(
""))) {
776 refSetter.
reKey(&newRecHitContainer.
back());
792 track->outerMomentum(),
794 track->innerPosition(),
795 track->innerMomentum(),
797 track->outerStateCovariance(),
799 track->innerStateCovariance(),
801 track->seedDirection(),
803 seedsRefs[
i] = origSeedRef;
809 unsigned nh1 =
track->recHitsSize();
813 for (
auto hh =
track->recHitsBegin(), eh =
track->recHitsEnd();
hh != eh; ++
hh) {
822 refTrajs =
e.getRefBeforePut<std::vector<Trajectory>>();
826 for (
unsigned int ti = 0; ti < trackColls.size(); ti++) {
835 for (
size_t i = 0,
n = hTraj1->size();
i <
n; ++
i) {
840 uint32_t oldKey = trackCollFirsts[ti] + static_cast<uint32_t>(trkRef.
key());
841 if (trackRefs[oldKey].isNonnull()) {
856 fillerMVA.insert(outHandle, mvaVec.begin(), mvaVec.end());
862 auto mvas = std::make_unique<MVACollection>(mvaVec.begin(), mvaVec.end());