56 #include "CLHEP/Units/GlobalPhysicalConstants.h"
67 class MTDHitMatchingInfo {
69 MTDHitMatchingInfo() {
76 inline bool operator<(
const MTDHitMatchingInfo& m2)
const {
78 constexpr
double chi2_cut = 10.;
79 constexpr
double low_weight = 3.;
80 constexpr
double high_weight = 8.;
81 if (timeChi2 < chi2_cut && m2.timeChi2 < chi2_cut)
82 return chi2(low_weight) < m2.chi2(low_weight);
84 return chi2(high_weight) < m2.chi2(high_weight);
87 inline double chi2(
double timeWeight = 1.)
const {
return estChi2 + timeWeight * timeChi2; }
94 struct TrackTofPidInfo {
126 const TrackTofPidInfo computeTrackTofPidInfo(
double magp2,
132 bool addPIDError =
true) {
133 constexpr
double m_pi = 0.13957018;
134 constexpr
double m_pi_inv2 = 1.0 /
m_pi /
m_pi;
135 constexpr
double m_k = 0.493677;
136 constexpr
double m_k_inv2 = 1.0 / m_k / m_k;
137 constexpr
double m_p = 0.9382720813;
138 constexpr
double m_p_inv2 = 1.0 / m_p / m_p;
142 TrackTofPidInfo tofpid;
145 tofpid.tmtderror = t_mtderr;
146 tofpid.pathlength = length;
148 tofpid.gammasq_pi = 1. + magp2 * m_pi_inv2;
149 tofpid.beta_pi =
std::sqrt(1. - 1. / tofpid.gammasq_pi);
150 tofpid.dt_pi = tofpid.pathlength / tofpid.beta_pi *
c_inv;
152 tofpid.gammasq_k = 1. + magp2 * m_k_inv2;
153 tofpid.beta_k =
std::sqrt(1. - 1. / tofpid.gammasq_k);
154 tofpid.dt_k = tofpid.pathlength / tofpid.beta_k *
c_inv;
156 tofpid.gammasq_p = 1. + magp2 * m_p_inv2;
157 tofpid.beta_p =
std::sqrt(1. - 1. / tofpid.gammasq_p);
158 tofpid.dt_p = tofpid.pathlength / tofpid.beta_p *
c_inv;
160 tofpid.dt = tofpid.tmtd - tofpid.dt_pi - t_vtx;
161 tofpid.dterror =
sqrt(tofpid.tmtderror * tofpid.tmtderror + t_vtx_err * t_vtx_err);
162 tofpid.betaerror = 0;
165 sqrt(tofpid.dterror * tofpid.dterror + (tofpid.dt_p - tofpid.dt_pi) * (tofpid.dt_p - tofpid.dt_pi));
166 tofpid.betaerror = tofpid.beta_p - tofpid.beta_pi;
169 tofpid.dtchi2 = (tofpid.dt * tofpid.dt) / (tofpid.dterror * tofpid.dterror);
171 tofpid.dt_best = tofpid.dt;
172 tofpid.dterror_best = tofpid.dterror;
173 tofpid.dtchi2_best = tofpid.dtchi2;
175 tofpid.prob_pi = -1.;
181 double chi2_pi = tofpid.dtchi2;
183 (tofpid.tmtd - tofpid.dt_k - t_vtx) * (tofpid.tmtd - tofpid.dt_k - t_vtx) / (tofpid.dterror * tofpid.dterror);
185 (tofpid.tmtd - tofpid.dt_p - t_vtx) * (tofpid.tmtd - tofpid.dt_p - t_vtx) / (tofpid.dterror * tofpid.dterror);
187 double rawprob_pi =
exp(-0.5 * chi2_pi);
188 double rawprob_k =
exp(-0.5 * chi2_k);
189 double rawprob_p =
exp(-0.5 * chi2_p);
190 double normprob = 1. / (rawprob_pi + rawprob_k + rawprob_p);
192 tofpid.prob_pi = rawprob_pi * normprob;
193 tofpid.prob_k = rawprob_k * normprob;
194 tofpid.prob_p = rawprob_p * normprob;
196 double prob_heavy = 1. - tofpid.prob_pi;
197 constexpr
double heavy_threshold = 0.75;
199 if (prob_heavy > heavy_threshold) {
200 if (chi2_k < chi2_p) {
201 tofpid.dt_best = (tofpid.tmtd - tofpid.dt_k - t_vtx);
202 tofpid.dtchi2_best = chi2_k;
204 tofpid.dt_best = (tofpid.tmtd - tofpid.dt_p - t_vtx);
205 tofpid.dtchi2_best = chi2_p;
212 bool getTrajectoryStateClosestToBeamLine(
const Trajectory& traj,
220 if (!stateForProjectionToBeamLineOnSurface.
isValid()) {
221 edm::LogError(
"CannotPropagateToBeamLine") <<
"the state on the closest measurement isnot valid. skipping track.";
228 tscbl = tscblBuilder(stateForProjectionToBeamLine,
bs);
236 double& pathlength) {
239 bool validpropagation =
true;
240 double pathlength1 = 0.;
241 double pathlength2 = 0.;
245 const auto& propresult = thePropagator->
propagateWithPath(it->updatedState(), (it + 1)->updatedState().surface());
246 double layerpathlength =
std::abs(propresult.second);
247 if (layerpathlength == 0.) {
248 validpropagation =
false;
250 pathlength1 += layerpathlength;
258 if (pathlength2 == 0.) {
259 validpropagation =
false;
261 pathlength = pathlength1 + pathlength2;
263 return validpropagation;
269 double& pathlength) {
273 bool tscbl_status = getTrajectoryStateClosestToBeamLine(traj,
bs, thePropagator, tscbl);
278 return trackPathLength(traj, tscbl, thePropagator, pathlength);
283 template <
class TrackCollection>
291 template <
class H,
class T>
307 const double vtxTime,
308 const bool matchVertex,
309 MTDHitMatchingInfo& bestHit)
const;
320 const double vtxTime,
321 const bool matchVertex,
322 MTDHitMatchingInfo& bestHit)
const;
324 void fillMatchingHits(
const DetLayer*,
335 MTDHitMatchingInfo&)
const;
344 auto rFirst =
first.mag2();
345 auto rLast =
last.mag2();
351 LogDebug(
"TrackExtenderWithMTD") <<
"Impossible to determine the rechits order" << endl;
364 float& sigmatmtdOut)
const;
422 template <
class TrackCollection>
427 updateTraj_(iConfig.getParameter<
bool>(
"updateTrackTrajectory")),
428 updateExtra_(iConfig.getParameter<
bool>(
"updateTrackExtra")),
429 updatePattern_(iConfig.getParameter<
bool>(
"updateTrackHitPattern")),
430 mtdRecHitBuilder_(iConfig.getParameter<
std::
string>(
"MTDRecHitBuilder")),
431 propagator_(iConfig.getParameter<
std::
string>(
"Propagator")),
432 transientTrackBuilder_(iConfig.getParameter<
std::
string>(
"TransientTrackBuilder")),
433 estMaxChi2_(iConfig.getParameter<double>(
"estimatorMaxChi2")),
434 estMaxNSigma_(iConfig.getParameter<double>(
"estimatorMaxNSigma")),
435 btlChi2Cut_(iConfig.getParameter<double>(
"btlChi2Cut")),
436 btlTimeChi2Cut_(iConfig.getParameter<double>(
"btlTimeChi2Cut")),
437 etlChi2Cut_(iConfig.getParameter<double>(
"etlChi2Cut")),
438 etlTimeChi2Cut_(iConfig.getParameter<double>(
"etlTimeChi2Cut")),
439 useVertex_(iConfig.getParameter<
bool>(
"useVertex")),
440 useSimVertex_(iConfig.getParameter<
bool>(
"useSimVertex")),
441 dzCut_(iConfig.getParameter<double>(
"dZCut")),
442 bsTimeSpread_(iConfig.getParameter<double>(
"bsTimeSpread")) {
459 tmtdToken = produces<edm::ValueMap<float>>(
"tmtd");
461 pOrigTrkToken = produces<edm::ValueMap<float>>(
"generalTrackp");
463 t0OrigTrkToken = produces<edm::ValueMap<float>>(
"generalTrackt0");
473 gtgToken_ = esConsumes<GlobalTrackingGeometry, GlobalTrackingGeometryRecord>();
474 dlgeoToken_ = esConsumes<MTDDetLayerGeometry, MTDRecoGeometryRecord>();
475 magfldToken_ = esConsumes<MagneticField, IdealMagneticFieldRecord>();
477 ttopoToken_ = esConsumes<TrackerTopology, TrackerTopologyRcd>();
479 produces<edm::OwnVector<TrackingRecHit>>();
480 produces<reco::TrackExtraCollection>();
481 produces<TrackCollection>();
484 template <
class TrackCollection>
493 desc.add<
bool>(
"updateTrackTrajectory",
true);
494 desc.add<
bool>(
"updateTrackExtra",
true);
495 desc.add<
bool>(
"updateTrackHitPattern",
true);
496 desc.add<
std::string>(
"TransientTrackBuilder",
"TransientTrackBuilder");
501 "KFFitterForRefitInsideOut",
502 "KFSmootherForRefitInsideOut",
503 "PropagatorWithMaterialForMTD",
510 desc.add<
double>(
"estimatorMaxChi2", 500.);
511 desc.add<
double>(
"estimatorMaxNSigma", 10.);
512 desc.add<
double>(
"btlChi2Cut", 50.);
513 desc.add<
double>(
"btlTimeChi2Cut", 10.);
514 desc.add<
double>(
"etlChi2Cut", 50.);
515 desc.add<
double>(
"etlTimeChi2Cut", 10.);
516 desc.add<
bool>(
"useVertex",
false);
517 desc.add<
bool>(
"useSimVertex",
false);
518 desc.add<
double>(
"dZCut", 0.1);
519 desc.add<
double>(
"bsTimeSpread", 0.2);
520 descriptions.
add(
"trackExtenderWithMTDBase",
desc);
523 template <
class TrackCollection>
524 template <
class H,
class T>
527 const std::vector<T>& vec,
529 auto out = std::make_unique<edm::ValueMap<T>>();
536 template <
class TrackCollection>
541 theTransformer->setServices(es);
553 hitbuilder_ = es.
getHandle(hitbuilderToken_);
561 auto output = std::make_unique<TrackCollection>();
562 auto extras = std::make_unique<reco::TrackExtraCollection>();
563 auto outhits = std::make_unique<edm::OwnVector<TrackingRecHit>>();
565 std::vector<float> btlMatchChi2;
566 std::vector<float> etlMatchChi2;
567 std::vector<float> btlMatchTimeChi2;
568 std::vector<float> etlMatchTimeChi2;
569 std::vector<float> pathLengthsRaw;
570 std::vector<float> tmtdRaw;
571 std::vector<float> sigmatmtdRaw;
572 std::vector<float> pOrigTrkRaw;
573 std::vector<float> betaOrigTrkRaw;
574 std::vector<float> t0OrigTrkRaw;
575 std::vector<float> sigmat0OrigTrkRaw;
576 std::vector<float> pathLengthsOrigTrkRaw;
577 std::vector<float> tmtdOrigTrkRaw;
578 std::vector<float> sigmatmtdOrigTrkRaw;
579 std::vector<int> assocOrigTrkRaw;
581 auto const tracksH =
ev.getHandle(tracksToken_);
582 const auto&
tracks = *tracksH;
585 const auto&
hits =
ev.get(hitsToken_);
588 const auto&
bs =
ev.get(bsToken_);
591 if (useVertex_ && !useSimVertex_) {
592 auto const& vtxs =
ev.get(vtxToken_);
597 std::unique_ptr<math::XYZTLorentzVectorF> genPV(
nullptr);
598 if (useVertex_ && useSimVertex_) {
599 const auto& genVtxPosition =
ev.get(genVtxPositionToken_);
600 const auto& genVtxTime =
ev.get(genVtxTimeToken_);
601 genPV = std::make_unique<math::XYZTLorentzVectorF>(
602 genVtxPosition.x(), genVtxPosition.y(), genVtxPosition.z(), genVtxTime);
607 if (useSimVertex_ && genPV) {
608 vtxTime = genPV->t();
613 std::vector<unsigned> track_indices;
617 double trackVtxTime = 0.;
626 trackVtxTime = vtxTime;
630 const auto& trajs = theTransformer->transform(
track);
631 auto thits = theTransformer->getTransientRecHits(ttrack);
633 MTDHitMatchingInfo mBTL, mETL;
634 if (!trajs.empty()) {
638 bool tscbl_status = getTrajectoryStateClosestToBeamLine(trajs.front(),
bs, prop, tscbl);
643 trackPathLength(trajs.front(), tscbl, prop, pathlength0);
645 const auto& btlhits = tryBTLLayers(tsos,
657 mtdthits.insert(mtdthits.end(), btlhits.begin(), btlhits.end());
661 const auto& etlhits = tryETLLayers(tsos,
673 mtdthits.insert(mtdthits.end(), etlhits.begin(), etlhits.end());
677 auto ordering = checkRecHitsOrdering(thits);
679 thits.insert(thits.end(), mtdthits.begin(), mtdthits.end());
682 mtdthits.insert(mtdthits.end(), thits.begin(), thits.end());
683 thits.swap(mtdthits);
686 const auto& trajwithmtd = mtdthits.empty() ? trajs : theTransformer->transform(ttrack, thits);
687 float pMap = 0.f, betaMap = 0.f, t0Map = 0.f, sigmat0Map = -1.f, pathLengthMap = -1.f, tmtdMap = 0.f,
691 for (
const auto& trj : trajwithmtd) {
692 const auto& thetrj = (updateTraj_ ? trj : trajs.front());
693 float pathLength = 0.f, tmtd = 0.f, sigmatmtd = -1.f;
700 !trajwithmtd.empty() && !mtdthits.empty(),
708 size_t hitsstart = outhits->size();
709 if (updatePattern_) {
710 t2t(trj, *outhits, trajParams, chi2s);
712 t2t(thetrj, *outhits, trajParams, chi2s);
714 size_t hitsend = outhits->size();
715 extras->push_back(buildTrackExtra(trj));
716 extras->back().setHits(hitsRefProd, hitsstart, hitsend - hitsstart);
717 extras->back().setTrajParams(trajParams, chi2s);
720 btlMatchChi2.push_back(mBTL.hit ? mBTL.estChi2 : -1);
721 etlMatchChi2.push_back(mETL.hit ? mETL.estChi2 : -1);
722 btlMatchTimeChi2.push_back(mBTL.hit ? mBTL.timeChi2 : -1);
723 etlMatchTimeChi2.push_back(mETL.hit ? mETL.timeChi2 : -1);
724 pathLengthsRaw.push_back(pathLength);
725 tmtdRaw.push_back(tmtd);
726 sigmatmtdRaw.push_back(sigmatmtd);
727 pathLengthMap = pathLength;
729 sigmatmtdMap = sigmatmtd;
730 auto& backtrack =
output->back();
731 iMap =
output->size() - 1;
732 pMap = backtrack.p();
733 betaMap = backtrack.beta();
734 t0Map = backtrack.t0();
735 sigmat0Map = std::copysign(
std::sqrt(
std::abs(backtrack.covt0t0())), backtrack.covt0t0());
737 backtrack.setExtra((updateExtra_ ? extraRef :
track.extra()));
738 for (
unsigned ihit = hitsstart; ihit < hitsend; ++ihit) {
739 backtrack.appendHitPattern((*outhits)[ihit], ttopo);
742 LogTrace(
"TrackExtenderWithMTD") <<
"Error in the MTD track refitting. This should not happen";
746 pOrigTrkRaw.push_back(pMap);
747 betaOrigTrkRaw.push_back(betaMap);
748 t0OrigTrkRaw.push_back(t0Map);
749 sigmat0OrigTrkRaw.push_back(sigmat0Map);
750 pathLengthsOrigTrkRaw.push_back(pathLengthMap);
751 tmtdOrigTrkRaw.push_back(tmtdMap);
752 sigmatmtdOrigTrkRaw.push_back(sigmatmtdMap);
753 assocOrigTrkRaw.push_back(iMap);
761 fillValueMap(
ev, outTrksHandle, btlMatchChi2, btlMatchChi2Token);
762 fillValueMap(
ev, outTrksHandle, etlMatchChi2, etlMatchChi2Token);
763 fillValueMap(
ev, outTrksHandle, btlMatchTimeChi2, btlMatchTimeChi2Token);
764 fillValueMap(
ev, outTrksHandle, etlMatchTimeChi2, etlMatchTimeChi2Token);
765 fillValueMap(
ev, outTrksHandle, pathLengthsRaw, pathLengthToken);
766 fillValueMap(
ev, outTrksHandle, tmtdRaw, tmtdToken);
767 fillValueMap(
ev, outTrksHandle, sigmatmtdRaw, sigmatmtdToken);
768 fillValueMap(
ev, tracksH, pOrigTrkRaw, pOrigTrkToken);
769 fillValueMap(
ev, tracksH, betaOrigTrkRaw, betaOrigTrkToken);
770 fillValueMap(
ev, tracksH, t0OrigTrkRaw, t0OrigTrkToken);
771 fillValueMap(
ev, tracksH, sigmat0OrigTrkRaw, sigmat0OrigTrkToken);
772 fillValueMap(
ev, tracksH, pathLengthsOrigTrkRaw, pathLengthOrigTrkToken);
773 fillValueMap(
ev, tracksH, tmtdOrigTrkRaw, tmtdOrigTrkToken);
774 fillValueMap(
ev, tracksH, sigmatmtdOrigTrkRaw, sigmatmtdOrigTrkToken);
775 fillValueMap(
ev, tracksH, assocOrigTrkRaw, assocOrigTrkToken);
779 bool cmp_for_detset(
const unsigned one,
const unsigned two) {
return one <
two; };
786 const double pathlength0,
787 const double vtxTime,
789 const float bsTimeSpread,
792 bool useVtxConstraint,
793 std::set<MTDHitMatchingInfo>&
out) {
794 pair<bool, TrajectoryStateOnSurface>
comp =
layer->compatible(tsos, *prop, *
estimator);
796 const vector<DetLayer::DetWithState> compDets =
layer->compatibleDets(tsos, *prop, *
estimator);
797 if (!compDets.empty()) {
798 for (
const auto& detWithState : compDets) {
799 auto range =
hits.equal_range(detWithState.first->geographicalId(), cmp_for_detset);
807 const double tot_pl = pathlength0 +
std::abs(pl.second);
808 const double t_vtx = useVtxConstraint ? vtxTime : 0.;
810 constexpr
double vtx_res = 0.008;
811 const double t_vtx_err = useVtxConstraint ? vtx_res : bsTimeSpread;
813 constexpr
double t_res_manual = 0.035;
815 for (
auto detitr =
range.first; detitr !=
range.second; ++detitr) {
816 for (
const auto&
hit : *detitr) {
817 auto est =
estimator->estimate(detWithState.second,
hit);
821 TrackTofPidInfo tof = computeTrackTofPidInfo(pmag2,
828 MTDHitMatchingInfo mi;
830 mi.estChi2 = est.second;
831 mi.timeChi2 = tof.dtchi2_best;
842 template <
class TrackCollection>
847 const double pathlength0,
853 const double vtxTime,
854 const bool matchVertex,
855 MTDHitMatchingInfo& bestHit)
const {
859 bestHit = MTDHitMatchingInfo();
861 fillMatchingHits(ilay, tsos, traj, pmag2, pathlength0,
hits, prop,
bs, vtxTime, matchVertex,
output, bestHit);
865 template <
class TrackCollection>
870 const double pathlength0,
876 const double vtxTime,
877 const bool matchVertex,
878 MTDHitMatchingInfo& bestHit)
const {
882 bestHit = MTDHitMatchingInfo();
884 const BoundDisk& disk = static_cast<const MTDRingForwardDoubleLayer*>(ilay)->specificSurface();
885 const double diskZ = disk.position().z();
890 fillMatchingHits(ilay, tsos, traj, pmag2, pathlength0,
hits, prop,
bs, vtxTime, matchVertex,
output, bestHit);
903 template <
class TrackCollection>
908 const double pathlength0,
912 const double& vtxTime,
913 const bool matchVertex,
915 MTDHitMatchingInfo& bestHit)
const {
916 std::set<MTDHitMatchingInfo> hitsInLayer;
917 bool hitMatched =
false;
919 using namespace std::placeholders;
920 auto find_hits = std::bind(find_hits_in_dets,
933 std::ref(hitsInLayer));
935 if (useVertex_ && matchVertex)
936 find_hits(vtxTime,
true);
941 if (!hitsInLayer.empty()) {
943 auto const& firstHit = *hitsInLayer.begin();
944 if (firstHit.estChi2 < etlChi2Cut_ && firstHit.timeChi2 < etlTimeChi2Cut_) {
946 output.push_back(hitbuilder_->build(firstHit.hit));
947 if (firstHit < bestHit)
952 if (useVertex_ && matchVertex && !hitMatched) {
956 if (!hitsInLayer.empty()) {
957 auto const& firstHit = *hitsInLayer.begin();
958 if (firstHit.timeChi2 < etlTimeChi2Cut_) {
959 if (firstHit.estChi2 < etlChi2Cut_) {
961 output.push_back(hitbuilder_->build(firstHit.hit));
962 if (firstHit < bestHit)
972 template <
class TrackCollection>
980 float& pathLengthOut,
982 float& sigmatmtdOut)
const {
984 bool tsbcl_status = getTrajectoryStateClosestToBeamLine(traj,
bs, thePropagator, tscbl);
997 double covt0t0 = -1.;
998 pathLengthOut = -1.f;
1000 sigmatmtdOut = -1.f;
1001 double betaOut = 0.;
1002 double covbetabeta = -1.;
1004 auto routput = [&]() {
1022 bool validpropagation = trackPathLength(trajWithMtd,
bs, thePropagator, pathlength);
1024 double thiterror = -1.;
1025 bool validmtd =
false;
1027 if (!validpropagation) {
1031 size_t ihitcount(0), ietlcount(0);
1036 if (
MTDDetId(
hit.recHit()->geographicalId()).mtdSubDetector() == MTDDetId::MTDType::ETL) {
1043 if (ihitcount == 1) {
1044 const MTDTrackingRecHit* mtdhit = static_cast<const MTDTrackingRecHit*>((*ihit1).recHit()->hit());
1045 thit = mtdhit->
time();
1048 }
else if (ihitcount == 2 && ietlcount == 2) {
1049 const auto& propresult =
1050 thePropagator->
propagateWithPath(ihit1->updatedState(), (ihit1 + 1)->updatedState().surface());
1051 double etlpathlength =
std::abs(propresult.second);
1055 if (etlpathlength == 0.) {
1056 validpropagation =
false;
1058 pathlength -= etlpathlength;
1059 const MTDTrackingRecHit* mtdhit1 = static_cast<const MTDTrackingRecHit*>((*ihit1).recHit()->hit());
1061 TrackTofPidInfo tofInfo =
1062 computeTrackTofPidInfo(
p.mag2(), etlpathlength, mtdhit1->
time(), mtdhit1->
timeError(), 0., 0.,
true);
1066 double err1 = tofInfo.dterror * tofInfo.dterror;
1067 double err2 = mtdhit2->timeError() * mtdhit2->timeError();
1070 <<
"MTD tracking hits with zero time uncertainty: " << err1 <<
" " << err2;
1072 if ((tofInfo.dt - mtdhit2->time()) * (tofInfo.dt - mtdhit2->time()) < (err1 + err2) * etlTimeChi2Cut_) {
1079 thiterror = 1. / (err1 + err2);
1080 thit = (tofInfo.dt * err1 + mtdhit2->time() * err2) * thiterror;
1082 LogDebug(
"TrackExtenderWithMTD") <<
"p trk = " <<
p.mag() <<
" ETL hits times/errors: " << mtdhit1->
time()
1083 <<
" +/- " << mtdhit1->
timeError() <<
" , " << mtdhit2->time() <<
" +/- "
1084 << mtdhit2->timeError() <<
" extrapolated time1: " << tofInfo.dt <<
" +/- "
1085 << tofInfo.dterror <<
" average = " << thit <<
" +/- " << thiterror;
1092 <<
"MTD hits #" << ihitcount <<
"ETL hits #" << ietlcount <<
" anomalous pattern, skipping...";
1095 if (validmtd && validpropagation) {
1097 TrackTofPidInfo tofInfo = computeTrackTofPidInfo(
p.mag2(), pathlength, thit, thiterror, 0., 0.,
true);
1098 pathLengthOut = pathlength;
1100 sigmatmtdOut = thiterror;
1102 covt0t0 = tofInfo.dterror * tofInfo.dterror;
1103 betaOut = tofInfo.beta_pi;
1104 covbetabeta = tofInfo.betaerror * tofInfo.betaerror;
1111 template <
class TrackCollection>
1113 static const string metname =
"TrackExtenderWithMTD";
1123 unsigned int innerId = 0, outerId = 0;
1146 const GeomDet* outerDet = gtg_->idToDet(outerDetId);
1154 LogTrace(
metname) <<
"The Global Muon outerMostMeasurementState is not compatible with the recHit detector!"
1155 <<
" Setting outerMost postition to recHit position if recHit isValid: "
1156 << outerRecHit->isValid();
1187 template <
class TrackCollection>
1195 sur = &(
layer->surface());
1196 if ((bc = dynamic_cast<const BoundCylinder*>(sur))) {
1197 output <<
" Cylinder of radius: " << bc->radius() << endl;
1198 }
else if ((
bd = dynamic_cast<const BoundDisk*>(sur))) {
1199 output <<
" Disk at: " <<
bd->position().z() << endl;