11 #define TRACK_SORT 1 // just use all hits from inner track, then append from outer outside it 12 #define DET_SORT 0 // sort hits using global position of detector 13 #define HIT_SORT 0 // sort hits using global position of hit 20 #define DPRINT(x) std::cout << x << ": " 21 #define PRINT std::cout 23 #define DPRINT(x) LogTrace(x) 24 #define PRINT LogTrace("") 28 : useInnermostState_(iConfig.getParameter<
bool>(
"useInnermostState")),
29 theBuilderName(iConfig.getParameter<
std::
string>(
"ttrhBuilderName")) {}
44 << inner.
eta() <<
'/' << outer.
eta() << std::endl;
46 std::vector<const TrackingRecHit *>
hits;
48 DPRINT(
"TrackMerger") <<
"Inner track hits: " << std::endl;
50 hits.push_back(&**it);
52 DetId id(hits.back()->geographicalId());
54 << hits.back()->isValid() <<
" detid: " <<
id() << std::endl;
57 DPRINT(
"TrackMerger") <<
"Outer track hits: " << std::endl;
61 DetId lastId(hits.back()->geographicalId());
67 int thisSubdet =
id.subdetId();
68 if (thisSubdet > lastSubdet || (thisSubdet == lastSubdet &&
theTrkTopo->
layer(
id) > lastLayer)) {
71 << hit->
isValid() <<
" detid: " <<
id() << std::endl;
74 << hit->
isValid() <<
" detid: " <<
id() << std::endl;
90 unsigned int nhits = hits.size();
102 for (
auto hit : hits)
147 size_t nHitsFirstTrack = hits.size();
154 PRINT <<
" subdet " <<
id.subdetId() <<
" layer " <<
theTrkTopo->
layer(
id) <<
" valid " << valid
155 <<
" detid: " <<
id() << std::endl;
157 for (
auto hit2 : hits) {
159 if (iHit > nHitsFirstTrack)
162 if (
id.subdetId() != id2.
subdetId())
167 PRINT <<
" discared as duplicate of other hit" <<
id() << std::endl;
171 if (hit2->isValid() && !
valid) {
172 PRINT <<
" replacing old invalid hit on detid " <<
id2() << std::endl;
177 PRINT <<
" discared as additional hit on layer that already contains hit with detid " <<
id() << std::endl;
188 const std::vector<const TrackingRecHit *> &
hits,
191 unsigned int nhits = hits.size();
192 std::vector<TransientTrackingRecHit::RecHitPointer> ttrh(nhits);
193 for (
unsigned int i = 0;
i <
nhits; ++
i)
196 for (
auto hit : ttrh)
205 return (p2 - p1).dot(
dir_) > 0;
210 GlobalPoint p1 = hit1->isValid() ? hit1->globalPosition() : hit1->det()->position();
211 GlobalPoint p2 = hit2->isValid() ? hit2->globalPosition() : hit2->det()->position();
212 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
ret
prodAgent to be discontinued
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.