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
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)
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
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.