10 #include <boost/foreach.hpp>
11 #define foreach BOOST_FOREACH
13 #define TRACK_SORT 1 // just use all hits from inner track, then append from outer outside it
14 #define DET_SORT 0 // sort hits using global position of detector
15 #define HIT_SORT 0 // sort hits using global position of hit
19 useInnermostState_(iConfig.getParameter<bool>(
"useInnermostState")),
20 debug_(iConfig.getUntrackedParameter<bool>(
"debug",
false)),
21 theBuilderName(iConfig.getParameter<std::
string>(
"ttrhBuilderName"))
39 std::vector<const TrackingRecHit *> hits;
43 hits.push_back(&**it);
45 DetId id(hits.back()->geographicalId());
46 std::cout <<
" subdet " <<
id.subdetId() <<
" layer " <<
theTrkTopo->layer(
id) <<
" valid " << hits.back()->
isValid() <<
" detid: " << id() << std::endl;
52 DetId lastId(hits.back()->geographicalId());
54 unsigned int lastLayer =
theTrkTopo->layer(lastId);
59 if (thisSubdet > lastSubdet || (thisSubdet == lastSubdet &&
theTrkTopo->layer(
id) > lastLayer)) {
61 if (
debug_)
std::cout <<
" adding subdet " <<
id.subdetId() <<
" layer " <<
theTrkTopo->layer(
id) <<
" valid " << hit->
isValid() <<
" detid: " << id() << std::endl;
63 if (
debug_)
std::cout <<
" skipping subdet " << thisSubdet <<
" layer " <<
theTrkTopo->layer(
id) <<
" valid " << hit->
isValid() <<
" detid: " << id() << std::endl;
67 size_t nHitsFirstTrack = hits.size();
74 if (
debug_)
std::cout <<
" subdet " <<
id.subdetId() <<
" layer " <<
theTrkTopo->layer(
id) <<
" valid " << valid <<
" detid: " << id() << std::endl;
77 ++iHit;
if (iHit > nHitsFirstTrack)
break;
79 if (
id.subdetId() != id2.
subdetId())
continue;
82 if (
debug_)
std::cout <<
" discared as duplicate of other hit" << id() << std::endl;
86 if (
debug_)
std::cout <<
" replacing old invalid hit on detid " << id2() << std::endl;
87 hit2 = hit; shared =
true;
break;
89 if (
debug_)
std::cout <<
" discared as additional hit on layer that already contains hit with detid " << id() << std::endl;
102 unsigned int nhits = hits.
size();
119 std::vector<TransientTrackingRecHit::RecHitPointer> ttrh(nhits);
120 for (
unsigned int i = 0;
i < nhits; ++
i) ttrh[
i] =
theBuilder->build(hits[
i]);
165 return (p2 - p1).dot(
dir_) > 0;
170 GlobalPoint p1 = hit1->isValid() ? hit1->globalPosition() : hit1->det()->position();
171 GlobalPoint p2 = hit2->isValid() ? hit2->globalPosition() : hit2->det()->position();
172 return (p2 - p1).dot(
dir_) > 0;
edm::ESHandle< TrackerTopology > theTrkTopo
const Vector & momentum() const
track momentum vector
const TrackerGeometry * geom_
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.
virtual bool sharesInput(const TrackingRecHit *other, SharedInputType what) const
const math::XYZPoint & outerPosition() const
position of the outermost hit
void init(const edm::EventSetup &iSetup)
TrackCandidate merge(const reco::Track &inner, const reco::Track &outer) const
bool operator()(const TransientTrackingRecHit::RecHitPointer &hit1, const TransientTrackingRecHit::RecHitPointer &hit2) const
const math::XYZPoint & innerPosition() const
position of the innermost hit
bool operator()(const TrackingRecHit *hit1, const TrackingRecHit *hit2) const
unsigned int outerDetId() const
DetId of the detector on which surface the outermost state is located.
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
virtual const GeomDet * idToDet(DetId) const
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
XYZVectorD XYZVector
spatial vector with cartesian internal representation
edm::ESHandle< TransientTrackingRecHitBuilder > theBuilder
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
DetId geographicalId() const
volatile std::atomic< bool > shutdown_flag false
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.