328 std::vector<const reco::TrackCollection *> trackColls;
329 std::vector<edm::Handle<reco::TrackCollection> > trackHandles(
trackProducers_.size());
331 trackColls.push_back(
nullptr);
334 if (trackHandles[i].isValid()) {
335 trackColls[
i]= trackHandles[
i].product();
338 trackColls[
i]=&s_empty;
342 unsigned int collsSize =trackColls.size();
343 unsigned int rSize=0;
344 unsigned int trackCollSizes[collsSize];
345 unsigned int trackCollFirsts[collsSize];
346 for (
unsigned int i=0; i!=collsSize; i++) {
347 trackCollSizes[
i]=trackColls[
i]->size();
348 trackCollFirsts[
i]=rSize;
349 rSize+=trackCollSizes[
i];
352 statCount.begin(rSize);
361 bool trkUpdated[rSize];
362 int trackCollNum[rSize];
363 int trackQuals[rSize];
364 float trackMVAs[rSize];
366 std::vector<reco::TrackBase::AlgoMask> algoMask(rSize);
367 for (
unsigned int j=0; j<rSize;j++) {
372 for (
unsigned int j=0; j!= collsSize; j++) {
383 if ( !tC1->empty() ){
385 for (reco::TrackCollection::const_iterator
track=tC1->begin();
track!=tC1->end();
track++){
388 trackQuals[
i]=
track->qualityMask();
389 oriAlgo[
i]=
track->originalAlgo();
390 algoMask[
i]=
track->algoMask();
394 if( (*trackMVAStore).contains(trkRef.
id()) ) trackMVAs[
i] = (*trackMVAStore)[trkRef];
396 int qual=(*trackSelColl)[trkRef];
406 selected[
i]=trackQuals[
i]+10;
407 if ((
short unsigned)
track->ndof() < 1){
431 statCount.pre(ngood);
434 typedef std::pair<unsigned int, const TrackingRecHit*> IHit;
435 std::vector<std::vector<IHit>> rh1(ngood);
441 for (
unsigned int j=0; j<rSize; j++) {
442 if (selected[j]==0)
continue;
445 unsigned int collNum=trackCollNum[j];
446 unsigned int trackNum=j-trackCollFirsts[collNum];
449 algo[
i]=track->
algo();
456 rh1[
i].reserve(validHits) ;
457 auto compById = [](IHit
const & h1, IHit
const & h2) {
return h1.first < h2.first;};
460 unsigned int id = hit->
rawId() ;
462 if LIKELY(hit->
isValid()) { rh1[
i].emplace_back(
id,hit); std::push_heap(rh1[i].
begin(),rh1[i].
end(),compById); }
464 std::sort_heap(rh1[i].
begin(),rh1[i].
end(),compById);
468 if LIKELY(ngood>1 && collsSize>1)
470 int saveSelected[rSize];
471 bool notActive[collsSize];
472 for (
unsigned int cn=0;cn!=collsSize;++cn)
475 for (
unsigned int i=0; i<rSize; i++) saveSelected[i]=selected[i];
478 for (
unsigned int i=0; i<rSize-1; i++) {
479 if (selected[i]==0)
continue;
480 unsigned int collNum=trackCollNum[
i];
483 if (notActive[collNum])
continue;
486 unsigned int nh1=rh1[k1].size();
487 int qualityMaskT1 = trackQuals[
i];
490 float score1 = score[k1];
493 for (
unsigned int j=i+1; j<rSize; j++) {
494 if (selected[j]==0)
continue;
495 unsigned int collNum2=trackCollNum[j];
496 if ( (collNum == collNum2) &&
indivShareFrac_[collNum] > 0.99)
continue;
498 if (notActive[collNum2])
continue;
502 int newQualityMask = -9;
504 int maskT1= saveSelected[
i]>1? saveSelected[
i]-10 : qualityMaskT1;
505 int maskT2= saveSelected[j]>1? saveSelected[j]-10 : trackQuals[j];
506 newQualityMask =(maskT1 | maskT2);
508 unsigned int nh2=rh1[k2].size();
528 if (share(it,jt,
epsilon_)) firstoverlap=1;
535 while (ih!=nh1 && jh!=nh2) {
539 auto const id1 = rh1[k1][ih].first;
540 auto const id2 = rh1[k2][jh].first;
545 auto li=ih;
while( (++li)!=nh1 &&
id1 == rh1[k1][li].first);
546 auto lj=jh;
while( (++lj)!=nh2 &&
id2 == rh1[k2][lj].first);
547 for (
auto ii=ih;
ii!=li; ++
ii)
548 for (
auto jj=jh;
jj!=lj; ++
jj) {
551 if (share(it,jt,
epsilon_)) noverlap++;
558 bool dupfound = (collNum != collNum2) ? (noverlap-firstoverlap) > (
std::min(nhit1,nhit2)-firstoverlap)*
shareFrac_ :
561 auto seti = [&](
unsigned int ii,
unsigned int jj) {
563 selected[
ii]=10+newQualityMask;
566 algoMask[
ii] |= algoMask[
jj];
567 algoMask[
jj] = algoMask[
ii];
571 float score2 = score[k2];
573 if ( score1 - score2 > almostSame ) {
575 }
else if ( score2 - score1 > almostSame ) {
603 statCount.noOverlap();
606 if (selected[i]==0)
break;
613 auto vmMVA = std::make_unique<edm::ValueMap<float>>();
620 unsigned int tSize=trackColls[0]->size();
621 auto vm = std::make_unique<edm::ValueMap<int>>();
624 std::vector<int> finalQuals(tSize,-1);
625 for (
unsigned int i=0; i<rSize; i++) {
626 unsigned int tNum=i%tSize;
628 if (selected[i]>1 ) {
629 finalQuals[tNum]=selected[
i]-10;
633 if ( selected[i]==1 )
634 finalQuals[tNum]=trackQuals[
i];
637 filler.insert(trackHandles[0], finalQuals.begin(),finalQuals.end());
642 auto quals = std::make_unique<QualityMaskCollection>(finalQuals.begin(),finalQuals.end());
645 std::vector<float> mvaVec(tSize,-99);
647 for(
unsigned int i = 0; i < rSize; i++){
648 unsigned int tNum = i % tSize;
649 mvaVec[tNum] = trackMVAs[tNum];
652 fillerMVA.insert(trackHandles[0],mvaVec.begin(),mvaVec.end());
656 auto mvas = std::make_unique<MVACollection>(mvaVec.begin(),mvaVec.end());
667 std::vector<reco::TrackRef> trackRefs(rSize);
668 std::vector<edm::RefToBase<TrajectorySeed>> seedsRefs(rSize);
670 unsigned int nToWrite=0;
671 for (
unsigned int i=0; i<rSize; i++)
672 if (selected[i]!=0) nToWrite++;
674 std::vector<float> mvaVec;
676 outputTrks = std::make_unique<reco::TrackCollection>();
684 outputTrkHits = std::make_unique<TrackingRecHitCollection>();
685 outputTrkHits->reserve(nToWrite*25);
688 outputSeeds = std::make_unique<TrajectorySeedCollection>();
695 outputTrajs = std::make_unique<std::vector<Trajectory>>();
696 outputTrajs->reserve(rSize);
698 for (
unsigned int i=0; i<rSize; i++) {
699 if (selected[i]==0) {
704 unsigned int collNum=trackCollNum[
i];
705 unsigned int trackNum=i-trackCollFirsts[collNum];
706 const reco::Track *track=&((trackColls[collNum])->at(trackNum));
708 mvaVec.push_back(trackMVAs[i]);
709 if (selected[i]>1 ) {
710 outputTrks->back().setQualityMask(selected[i]-10);
715 if ( selected[i]==1 )
716 outputTrks->back().setQualityMask(trackQuals[i]);
717 outputTrks->back().setOriginalAlgorithm(oriAlgo[i]);
727 bool doRekeyOnThisSeed=
false;
731 if (origSeedRef->
nHits()!=0){
734 if (firstHit->isValid()){
743 doRekeyOnThisSeed=e.
getByLabel(clusterRemovalInfos,CRIh);
747 if (doRekeyOnThisSeed && !(clusterRemovalInfos==
edm::InputTag(
""))) {
753 for (;iH!=iH_end;++iH){
755 refSetter.reKey(&newRecHitContainer.
back());
777 seedsRefs[
i]=origSeedRef;
788 outputTrkHits->push_back( (*hh)->clone() );
801 for (
unsigned int ti=0; ti<trackColls.size(); ti++) {
809 for (
size_t i = 0,
n = hTraj1->size(); i <
n; ++
i) {
812 if (match != hTTAss1->
end()) {
814 uint32_t oldKey = trackCollFirsts[ti]+
static_cast<uint32_t
>(trkRef.
key());
815 if (trackRefs[oldKey].isNonnull()) {
816 outputTrajs->push_back( *trajRef );
819 outputTrajs->back().setSeedRef( seedsRefs[oldKey] );
820 outputTTAss->insert (
edm::Ref< std::vector<Trajectory> >(refTrajs, outputTrajs->size() - 1),
831 fillerMVA.insert(outHandle,mvaVec.begin(),mvaVec.end());
837 auto mvas = std::make_unique<MVACollection>(mvaVec.begin(),mvaVec.end());
PropagationDirection direction() const
const edm::RefToBase< TrajectorySeed > & seedRef() const
std::unique_ptr< TrajTrackAssociationCollection > outputTTAss
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
std::vector< bool > promoteQuality_
const TrackExtraRef & extra() const
reference to "extra" object
friend struct const_iterator
const_iterator end() const
last iterator over the map (read only)
reco::TrackRefProd refTrks
bool getByToken(EDGetToken token, Handle< PROD > &result) const
edm::RefProd< std::vector< Trajectory > > refTrajs
size_t recHitsSize() const
Get number of RecHits. (Warning, this includes invalid hits, which are not physical hits)...
const_iterator find(const key_type &k) const
find element with specified reference key
reco::TrackBase::TrackQuality qualityToSet_
std::vector< Track > TrackCollection
collection of Tracks
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.
std::unique_ptr< TrajectorySeedCollection > outputSeeds
key_type key() const
Accessor for product key.
std::string const & processName() const
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
edm::RefProd< TrajectorySeedCollection > refTrajSeeds
std::unique_ptr< std::vector< Trajectory > > outputTrajs
ProductID id() const
Accessor for product ID.
TrackAlgorithm
track algorithm
TrackingRecHitRefProd refTrkHits
std::vector< double > indivShareFrac_
const math::XYZPoint & innerPosition() const
position of the innermost hit
TrackAlgorithm algo() const
std::unique_ptr< TrackingRecHitCollection > outputTrkHits
std::vector< TrajectorySeed > TrajectorySeedCollection
double chi2() const
chi-squared of the fit
recHitContainer::const_iterator const_iterator
CovarianceMatrix outerStateCovariance() const
outermost trajectory state curvilinear errors
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.
Abs< T >::type abs(const T &t)
unsigned short numberOfValidHits() const
number of valid hits found
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
virtual LocalPoint localPosition() const =0
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
RefProd< PROD > getRefBeforePut()
std::unique_ptr< reco::TrackExtraCollection > outputTrkExtras
std::vector< int > hasSelector_
ProductID id() const
Accessor for product ID.
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
double maxNormalizedChisq_
PTrajectoryStateOnDet const & startingState() const
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.
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
CovarianceMatrix innerStateCovariance() const
innermost trajectory state curvilinear errors
std::string const & moduleLabel() const
unsigned int nHits() const
std::vector< TkEDGetTokenss > trackProducers_
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
const TrackResiduals & residuals() const
get the residuals
int numberOfValidPixelHits() const
std::unique_ptr< reco::TrackCollection > outputTrks
std::array< unsigned int, reco::TrackBase::algoSize > trackAlgoPriorityOrder
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
DetId geographicalId() const
std::string const & productInstanceName() const
std::string priorityName_
std::vector< std::vector< int > > listsToMerge_
Provenance getProvenance(BranchID const &theID) const
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.