33 : theService(service) {
45 category_ =
"Muon|RecoMuon|CosmicMuon|GlobalCosmicMuonTrajectoryBuilder";
98 LogTrace(
category_) <<
"TrackMatcher found " << matched.size() <<
"tracker tracks matched";
110 if (muCand.first ==
nullptr || !muCand.first->isValid()) {
113 muRecHits = muCand.first->recHits();
132 sortHits(hits, muRecHits, tkRecHits);
149 (muonState1.
globalPosition().
y() > tkState1.globalPosition().y()) ? muonState1 : tkState1;
151 (muonState2.globalPosition().y() > tkState2.globalPosition().y()) ? muonState2 : tkState2;
154 (firstState1.globalPosition().y() > firstState2.
globalPosition().
y()) ? firstState1 : firstState2;
158 front = hits.front()->globalPosition();
159 back = hits.back()->globalPosition();
160 if ((front.
perp() < 130 && fabs(front.
z()) < 300) || (back.
perp() < 130 && fabs(back.
z()) < 300)) {
161 if (hits.front()->globalPosition().perp() > hits.back()->globalPosition().perp())
162 reverse(hits.begin(), hits.end());
167 firstState = (tkState1.globalPosition().perp() < tkState2.globalPosition().perp()) ? tkState1 : tkState2;
179 if (refitted.empty()) {
184 if (refitted.empty()) {
191 const std::vector<TrajectoryMeasurement>& mytms = myTraj->
measurements();
193 LogTrace(
category_) <<
"Orignally there are " << tkTrack->found() <<
" tk rhs and " << muTrack->found() <<
" mu rhs.";
195 if (mytms.size() <= tkTrack->found()) {
201 result.push_back(myCand);
203 for (std::vector<TrajectoryMeasurement>::const_iterator itm = mytms.begin(); itm != mytms.end(); ++itm) {
204 LogTrace(
category_) <<
"updated pos " << itm->updatedState().globalPosition() <<
"mom " 205 << itm->updatedState().globalMomentum();
213 if (tkHits.empty()) {
217 if (muonHits.empty()) {
222 ConstRecHitContainer::const_iterator frontTkHit = tkHits.begin();
223 ConstRecHitContainer::const_iterator backTkHit = tkHits.end() - 1;
224 while (!(*frontTkHit)->isValid() && frontTkHit != backTkHit) {
227 while (!(*backTkHit)->isValid() && backTkHit != frontTkHit) {
231 ConstRecHitContainer::const_iterator frontMuHit = muonHits.begin();
232 ConstRecHitContainer::const_iterator backMuHit = muonHits.end() - 1;
233 while (!(*frontMuHit)->isValid() && frontMuHit != backMuHit) {
236 while (!(*backMuHit)->isValid() && backMuHit != frontMuHit) {
240 if (frontTkHit == backTkHit) {
244 if (frontMuHit == backMuHit) {
249 GlobalPoint frontTkPos = (*frontTkHit)->globalPosition();
250 GlobalPoint backTkPos = (*backTkHit)->globalPosition();
252 GlobalPoint frontMuPos = (*frontMuHit)->globalPosition();
253 GlobalPoint backMuPos = (*backMuHit)->globalPosition();
256 if (frontTkPos.
y() < backTkPos.
y()) {
257 reverse(tkHits.begin(), tkHits.end());
260 if (frontMuPos.
y() < backMuPos.
y()) {
261 reverse(muonHits.begin(), muonHits.end());
273 ConstRecHitContainer::iterator middlepoint = muonHits.begin();
274 bool insertInMiddle =
false;
276 for (ConstRecHitContainer::iterator ihit = muonHits.begin(); ihit != muonHits.end() - 1; ihit++) {
278 GlobalPoint nextpos = (*(ihit + 1))->globalPosition();
279 if ((ipos - nextpos).
mag() < 100.0)
282 GlobalPoint middle((ipos.
x() + nextpos.
x()) / 2, (ipos.
y() + nextpos.
y()) / 2, (ipos.
z() + nextpos.
z()) / 2);
283 LogTrace(
category_) <<
"ipos " << ipos <<
"nextpos" << nextpos <<
" middle " << middle << endl;
287 insertInMiddle =
true;
293 if (insertInMiddle) {
294 GlobalPoint jointpointpos = (*middlepoint)->globalPosition();
296 if ((frontTkPos - jointpointpos).
mag() >
297 (backTkPos - jointpointpos).
mag()) {
298 reverse(tkHits.begin(), tkHits.end());
300 muonHits.insert(middlepoint + 1, tkHits.begin(), tkHits.end());
303 if (frontTkPos.
y() < frontMuPos.
y()) {
307 hits.insert(hits.end(), tkHits.begin(), tkHits.end());
309 LogTrace(
category_) <<
"insert at the beginning " << frontTkPos << frontMuPos << endl;
311 hits.insert(hits.end(), muonHits.begin(), muonHits.end());
326 if ((*hit)->isValid()) {
327 DetId recoid = (*hit)->geographicalId();
331 ->propagate(currTsos,
theService->trackingGeometry()->idToDet(recoid)->surface());
335 result.emplace_back(hitCloner(**
hit, predTsos));
347 std::vector<TrackCand>
result;
354 vector<TrackCand> tkTrackCands;
358 tkTrackCands.push_back(tkCand);
365 if (tkTrackCands.size() <= 1) {
376 outerPos.
basicVector().
dot(outerTsos.globalMomentum().basicVector()) >
378 GlobalPoint geoInnerPos = (innerPos.
mag() < outerPos.
mag()) ? innerPos : outerPos;
384 for (vector<TrackCand>::const_iterator itkCand = tkTrackCands.begin(); itkCand != tkTrackCands.end(); ++itkCand) {
387 GlobalPoint tkInnerPos(tkTrack->innerPosition().x(), tkTrack->innerPosition().y(), tkTrack->innerPosition().z());
388 GlobalPoint tkOuterPos(tkTrack->outerPosition().x(), tkTrack->outerPosition().y(), tkTrack->outerPosition().z());
391 float closetDistance11 = (geoInnerPos - tkInnerPos).
mag();
392 float closetDistance12 = (geoInnerPos - tkOuterPos).
mag();
393 float closetDistance1 = (closetDistance11 < closetDistance12) ? closetDistance11 : closetDistance12;
398 for (vector<TrackCand>::const_iterator itkCand2 = tkTrackCands.begin(); itkCand2 != tkTrackCands.end();
400 if (itkCand2 == itkCand)
405 tkTrack2->innerPosition().x(), tkTrack2->innerPosition().y(), tkTrack2->innerPosition().z());
407 tkTrack2->outerPosition().x(), tkTrack2->outerPosition().y(), tkTrack2->outerPosition().z());
410 float farthestDistance21 = (geoInnerPos - tkInnerPos2).
mag();
411 float farthestDistance22 = (geoInnerPos - tkOuterPos2).
mag();
412 float farthestDistance2 = (farthestDistance21 > farthestDistance22) ? farthestDistance21 : farthestDistance22;
415 if (closetDistance1 > farthestDistance2 - 1
e-3) {
421 result.push_back(*itkCand);
425 result.push_back(*itkCand);
428 if (result.empty()) {
430 result = tkTrackCands;
433 result = tkTrackCands;
439 LogTrace(
category_) <<
"TrackMatcher found " << matched_trackerTracks.size() <<
"tracker tracks matched";
442 if (matched_trackerTracks.size() < 2) {
443 return matched_trackerTracks;
452 double max_quality = 1e6;
453 for (vector<TrackCand>::const_iterator iter = matched_trackerTracks.begin(); iter != matched_trackerTracks.end();
457 if (quality < max_quality) {
463 result.push_back(bestMatch);
471 if ((*hit)->isValid()) {
479 if ((*hit)->isValid()) {
490 (posFirst.
x() + posLast.
x()) / 2, (posFirst.
y() + posLast.
y()) / 2, (posFirst.
z() + posLast.
z()) / 2);
492 if ((middle.
mag() < posFirst.
mag()) && (middle.
mag() < posLast.
mag())) {
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
edm::ESHandle< TransientTrackingRecHitBuilder > theTrackerRecHitBuilder
edm::EDGetTokenT< reco::TrackCollection > theTkTrackToken
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
edm::ESHandle< TransientTrackingRecHitBuilder > theMuonRecHitBuilder
std::vector< Track > TrackCollection
collection of Tracks
GlobalPoint globalPosition() const
GlobalMuonTrackMatcher * theTrackMatcher
std::string thePropagatorName
std::string theMuonRecHitBuilderName
GlobalCosmicMuonTrajectoryBuilder(const edm::ParameterSet &, const MuonServiceProxy *service, edm::ConsumesCollector &iC)
Constructor.
TransientTrackingRecHit::ConstRecHitContainer ConstRecHitContainer
DataContainer const & measurements() const
ConstRecHitContainer getTransientRecHits(const reco::Track &) const
CosmicMuonSmoother * theSmoother
bool isTraversing(const reco::Track &tk) const
std::vector< Trajectory * > trajectories(const TrajectorySeed &) override
dummy implementation, unused in this class
std::string theTrackerRecHitBuilderName
void sortHits(ConstRecHitContainer &, ConstRecHitContainer &, ConstRecHitContainer &)
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
std::vector< MuonCandidate * > CandidateContainer
double match(const TrackCand &sta, const TrackCand &track, int matchOption=0, int surfaceOption=1) const
bool isNull() const
Checks for null.
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
std::vector< ConstRecHitPointer > ConstRecHitContainer
std::vector< Trajectory > fit(const Trajectory &) const
const MuonServiceProxy * theService
def bestMatch(object, matchCollection)
~GlobalCosmicMuonTrajectoryBuilder() override
Destructor.
std::vector< TrackCand > match(const TrackCand &, const edm::Handle< reco::TrackCollection > &)
check if tk and muon Tracks are matched
void setEvent(const edm::Event &) override
pass the Event to the algo at each event
GlobalVector globalMomentum() const
static int position[264][3]
std::pair< const Trajectory *, reco::TrackRef > TrackCand
const BasicVectorType & basicVector() const
T const * product() const
TrajectoryContainer trajectories(const Trajectory &traj) const override
edm::Handle< reco::TrackCollection > theTrackerTracks
constexpr Detector det() const
get the detector field from this detid
T dot(const Basic3DVector &rh) const
Scalar product, or "dot" product, with a vector of same type.
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.