12 #define TRACK_SORT 1 // just use all hits from inner track, then append from outer outside it 13 #define DET_SORT 0 // sort hits using global position of detector 14 #define HIT_SORT 0 // sort hits using global position of hit 23 #define DPRINT(x) std::cout << x << ": " 24 #define PRINT std::cout 26 #define DPRINT(x) LogTrace(x) 27 #define PRINT LogTrace("") 32 useInnermostState_(iConfig.getParameter<
bool>(
"useInnermostState")),
33 theBuilderName(iConfig.getParameter<
std::
string>(
"ttrhBuilderName"))
51 DPRINT(
"TrackMerger") <<
std::abs(inner.
eta()) <<
" merging " << inner.
algo() <<
'/' << outer.
algo() <<
' ' << inner.
eta() <<
'/' << outer.
eta()<< std::endl;
53 std::vector<const TrackingRecHit *>
hits;
55 DPRINT(
"TrackMerger") <<
"Inner track hits: " << std::endl;
57 hits.push_back(&**it);
59 DetId id(hits.back()->geographicalId());
60 PRINT <<
" subdet " <<
id.subdetId() <<
" layer " <<
theTrkTopo->
layer(
id) <<
" valid " << hits.back()->isValid() <<
" detid: " <<
id() << std::endl;
63 DPRINT(
"TrackMerger") <<
"Outer track hits: " << std::endl;
67 DetId lastId(hits.back()->geographicalId());
73 int thisSubdet =
id.subdetId();
74 if (thisSubdet > lastSubdet || (thisSubdet == lastSubdet &&
theTrkTopo->
layer(
id) > lastLayer)) {
76 PRINT <<
" adding subdet " <<
id.subdetId() <<
" layer " <<
theTrkTopo->
layer(
id) <<
" valid " << hit->
isValid() <<
" detid: " <<
id() << std::endl;
78 PRINT <<
" skipping subdet " << thisSubdet <<
" layer " <<
theTrkTopo->
layer(
id) <<
" valid " << hit->
isValid() <<
" detid: " <<
id() << std::endl;
94 unsigned int nhits = hits.size();
147 size_t nHitsFirstTrack = hits.size();
154 PRINT <<
" subdet " <<
id.subdetId() <<
" layer " <<
theTrkTopo->
layer(
id) <<
" valid " << valid <<
" detid: " <<
id() << std::endl;
156 for (
auto hit2 : hits) {
157 ++iHit;
if (iHit > nHitsFirstTrack)
break;
159 if (
id.subdetId() != id2.
subdetId())
continue;
162 PRINT <<
" discared as duplicate of other hit" <<
id() << std::endl;
163 shared =
true;
break;
165 if (hit2->isValid() && !valid) {
166 PRINT <<
" replacing old invalid hit on detid " <<
id2() << std::endl;
167 hit = hit2; shared =
true;
break;
169 PRINT <<
" discared as additional hit on layer that already contains hit with detid " <<
id() << std::endl;
170 shared =
true;
break;
172 if (shared)
continue;
178 const std::vector<const TrackingRecHit *>&
hits,
181 unsigned int nhits = hits.size();
182 std::vector<TransientTrackingRecHit::RecHitPointer> ttrh(nhits);
194 return (p2 - p1).dot(
dir_) > 0;
199 GlobalPoint p1 = hit1->isValid() ? hit1->globalPosition() : hit1->det()->position();
200 GlobalPoint p2 = hit2->isValid() ? hit2->globalPosition() : hit2->det()->position();
201 return (p2 - p1).dot(
dir_) > 0;
edm::ESHandle< TrackerTopology > theTrkTopo
Point3DBase< Scalar, LocalTag > LocalPoint
TrackCandidate merge(const reco::Track &inner, const reco::Track &outer, DuplicateTrackType duplicateType) const
std::string theBuilderName
size_t recHitsSize() const
Get number of RecHits. (Warning, this includes invalid hits, which are not physical hits)...
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
void sortByHitPosition(const GlobalVector &v, const std::vector< const TrackingRecHit * > &hits, TrackCandidate::RecHitContainer &ownHits) const
virtual bool sharesInput(const TrackingRecHit *other, SharedInputType what) const
const Vector & momentum() const
track momentum vector
const math::XYZPoint & outerPosition() const
position of the outermost hit
void addSecondTrackHits(std::vector< const TrackingRecHit * > &hits, const reco::Track &outer) const
void init(const edm::EventSetup &iSetup)
bool operator()(const TransientTrackingRecHit::RecHitPointer &hit1, const TransientTrackingRecHit::RecHitPointer &hit2) const
const math::XYZPoint & innerPosition() const
position of the innermost hit
TrackAlgorithm algo() const
bool operator()(const TrackingRecHit *hit1, const TrackingRecHit *hit2) const
double eta() const
pseudorapidity of momentum vector
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)
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
void setStopReason(uint8_t value)
std::shared_ptr< TrackingRecHit const > RecHitPointer
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
XYZVectorD XYZVector
spatial vector with cartesian internal representation
edm::ESHandle< TransientTrackingRecHitBuilder > theBuilder
unsigned int layer(const DetId &id) const
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
DetId geographicalId() const
TrackMerger(const edm::ParameterSet &iConfig)
unsigned int innerDetId() const
DetId of the detector on which surface the innermost state is located.
edm::ESHandle< MagneticField > theMagField
edm::ESHandle< TrackerGeometry > theGeometry
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.