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;
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(); }
210 std::vector<edm::InputTag> trackProducerTags(conf.
getParameter<std::vector<edm::InputTag>>(
"TrackProducers"));
224 if (!qualityStr.empty()) {
235 for (
unsigned int i = 0;
i < setsToMerge.size();
i++) {
236 listsToMerge_.push_back(setsToMerge[
i].getParameter<std::vector<int>>(
"tLists"));
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");
247 for (
int i = 0;
i < (int)selectors.size();
i++) {
249 mvaStores.push_back(ntag);
252 unsigned int numTrkColl = trackProducerTags.size();
253 if (numTrkColl !=
hasSelector_.size() || numTrkColl != selectors.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";
259 for (
unsigned int i = indivShareFrac_.size();
i < numTrkColl;
i++) {
261 indivShareFrac_.push_back(1.0);
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>();
280 if (makeReKeyedSeeds_) {
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);
331 if (trackHandles[i].
isValid()) {
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];
452 algo[
i] = track->
algo();
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();
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>();
712 outputTrkHits->reserve(nToWrite * 25);
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)
742 outputTrks->back().setQualityMask(trackQuals[i]);
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(
""))) {
774 for (
auto const& recHit : origSeedRef->
recHits()) {
776 refSetter.
reKey(&newRecHitContainer.
back());
803 seedsRefs[
i] = origSeedRef;
826 for (
unsigned int ti = 0; ti < trackColls.size(); ti++) {
835 for (
size_t i = 0,
n = hTraj1->size(); i <
n; ++
i) {
838 if (match != hTTAss1->end()) {
840 uint32_t oldKey = trackCollFirsts[ti] +
static_cast<uint32_t
>(trkRef.
key());
841 if (trackRefs[oldKey].isNonnull()) {
846 outputTTAss->insert(
edm::Ref<std::vector<Trajectory>>(refTrajs,
outputTrajs->size() - 1), trackRefs[oldKey]);
856 fillerMVA.insert(outHandle, mvaVec.begin(), mvaVec.end());
862 auto mvas = std::make_unique<MVACollection>(mvaVec.begin(), mvaVec.end());
PropagationDirection direction() const
const edm::RefToBase< TrajectorySeed > & seedRef() const
T getUntrackedParameter(std::string const &, T const &) const
TrackListMerger(const edm::ParameterSet &conf)
std::vector< unsigned char > QualityMaskCollection
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
std::vector< bool > promoteQuality_
const edm::EventSetup & c
std::unique_ptr< TrajTrackAssociationCollection > outputTTAss
const bool isValid(const Frame &aFrame, const FrameQuality &aQuality, const uint16_t aExpectedPos)
const TrackExtraRef & extra() const
reference to "extra" object
friend struct const_iterator
reco::TrackRefProd refTrks
bool getByToken(EDGetToken token, Handle< PROD > &result) const
TkEDGetTokenss edTokens(const edm::InputTag &tag, const edm::InputTag &mvatag)
TrackQuality
track quality
#define DEFINE_FWK_MODULE(type)
size_t recHitsSize() const
Get number of RecHits. (Warning, this includes invalid hits, which are not physical hits)...
std::vector< ParameterSet > VParameterSet
void reKey(TrackingRecHit *hit) const
reco::TrackBase::TrackQuality qualityToSet_
std::vector< Track > TrackCollection
collection of Tracks
bool exists(std::string const ¶meterName) const
checks if a parameter exists
bool innerOk() const
return true if the innermost hit is valid
unsigned short numberOfLostHits() const
number of cases where track crossed a layer without getting a hit.
key_type key() const
Accessor for product key.
~TrackListMerger() override
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
const math::XYZPoint & outerPosition() const
position of the outermost hit
std::vector< float > MVACollection
std::unique_ptr< std::vector< Trajectory > > outputTrajs
ProductID id() const
Accessor for product ID.
TrackAlgorithm
track algorithm
TrackingRecHitRefProd refTrkHits
void produce(edm::Event &e, const edm::EventSetup &c) override
std::vector< double > indivShareFrac_
bool overlap(const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
const math::XYZPoint & innerPosition() const
position of the innermost hit
TrackAlgorithm algo() const
std::string const & productInstanceName() const
std::unique_ptr< TrackingRecHitCollection > outputTrkHits
edm::EDGetTokenT< edm::ValueMap< int > > tsel
std::vector< TrajectorySeed > TrajectorySeedCollection
double chi2() const
chi-squared of the fit
CovarianceMatrix outerStateCovariance() const
outermost trajectory state curvilinear errors
edm::RefProd< TrajectorySeedCollection > refTrajSeeds
edm::EDGetTokenT< reco::TrackCollection > tk
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
unsigned int outerDetId() const
DetId of the detector on which surface the outermost state is located.
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Abs< T >::type abs(const T &t)
TkEDGetTokenss edTokens(const edm::InputTag &tag, const edm::InputTag &seltag, const edm::InputTag &mvatag)
edm::ESGetToken< TrackAlgoPriorityOrder, CkfComponentsRecord > priorityToken
unsigned short numberOfValidHits() const
number of valid hits found
edm::EDGetTokenT< TrajTrackAssociationCollection > tass
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
edm::RefProd< std::vector< Trajectory > > refTrajs
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
RefProd< PROD > getRefBeforePut()
std::unique_ptr< reco::TrackExtraCollection > outputTrkExtras
std::vector< int > hasSelector_
RecHitRange recHits() const
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
double maxNormalizedChisq_
PTrajectoryStateOnDet const & startingState() const
static TrackQuality qualityByName(const std::string &name)
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
bool outerOk() const
return true if the outermost hit is valid
const PropagationDirection & seedDirection() const
direction of how the hits were sorted in the original seed
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
std::unique_ptr< TrajectorySeedCollection > outputSeeds
edm::EDGetTokenT< edm::ValueMap< float > > tmva
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
CovarianceMatrix innerStateCovariance() const
innermost trajectory state curvilinear errors
T getParameter(std::string const &) const
constexpr std::array< unsigned int, reco::TrackBase::algoSize > trackAlgoPriorityOrder
unsigned int nHits() const
std::vector< TkEDGetTokenss > trackProducers_
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
std::string const & processName() const
ProductID id() const
Accessor for product ID.
const TrackResiduals & residuals() const
get the residuals
int numberOfValidPixelHits() const
TkEDGetTokenss(const edm::InputTag &tag_, edm::EDGetTokenT< reco::TrackCollection > &&tk_, edm::EDGetTokenT< std::vector< Trajectory >> &&traj_, edm::EDGetTokenT< TrajTrackAssociationCollection > &&tass_, edm::EDGetTokenT< edm::ValueMap< int >> &&tsel_, edm::EDGetTokenT< edm::ValueMap< float >> &&tmva_)
std::vector< std::vector< int > > listsToMerge_
std::unique_ptr< reco::TrackCollection > outputTrks
edm::EDGetTokenT< std::vector< Trajectory > > traj
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
DetId geographicalId() const
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Log< level::Warning, false > LogWarning
std::string const & moduleLabel() const
std::string priorityName_
StableProvenance const & getStableProvenance(BranchID const &theID) const
virtual LocalPoint localPosition() const =0
unsigned int innerDetId() const
DetId of the detector on which surface the innermost state is located.
reco::TrackExtraRefProd refTrkExtras
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.