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;
421 template <
class TrackCollection>
426 updateTraj_(iConfig.getParameter<
bool>(
"updateTrackTrajectory")),
427 updateExtra_(iConfig.getParameter<
bool>(
"updateTrackExtra")),
428 updatePattern_(iConfig.getParameter<
bool>(
"updateTrackHitPattern")),
429 mtdRecHitBuilder_(iConfig.getParameter<
std::
string>(
"MTDRecHitBuilder")),
430 propagator_(iConfig.getParameter<
std::
string>(
"Propagator")),
431 transientTrackBuilder_(iConfig.getParameter<
std::
string>(
"TransientTrackBuilder")),
432 estMaxChi2_(iConfig.getParameter<double>(
"estimatorMaxChi2")),
433 estMaxNSigma_(iConfig.getParameter<double>(
"estimatorMaxNSigma")),
434 btlChi2Cut_(iConfig.getParameter<double>(
"btlChi2Cut")),
435 btlTimeChi2Cut_(iConfig.getParameter<double>(
"btlTimeChi2Cut")),
436 etlChi2Cut_(iConfig.getParameter<double>(
"etlChi2Cut")),
437 etlTimeChi2Cut_(iConfig.getParameter<double>(
"etlTimeChi2Cut")),
438 useVertex_(iConfig.getParameter<
bool>(
"useVertex")),
439 useSimVertex_(iConfig.getParameter<
bool>(
"useSimVertex")),
440 dzCut_(iConfig.getParameter<double>(
"dZCut")),
441 bsTimeSpread_(iConfig.getParameter<double>(
"bsTimeSpread")) {
459 pOrigTrkToken = produces<edm::ValueMap<float>>(
"generalTrackp");
461 t0OrigTrkToken = produces<edm::ValueMap<float>>(
"generalTrackt0");
471 gtgToken_ = esConsumes<GlobalTrackingGeometry, GlobalTrackingGeometryRecord>();
472 dlgeoToken_ = esConsumes<MTDDetLayerGeometry, MTDRecoGeometryRecord>();
473 magfldToken_ = esConsumes<MagneticField, IdealMagneticFieldRecord>();
475 ttopoToken_ = esConsumes<TrackerTopology, TrackerTopologyRcd>();
477 produces<edm::OwnVector<TrackingRecHit>>();
478 produces<reco::TrackExtraCollection>();
479 produces<TrackCollection>();
482 template <
class TrackCollection>
491 desc.add<
bool>(
"updateTrackTrajectory",
true);
492 desc.add<
bool>(
"updateTrackExtra",
true);
493 desc.add<
bool>(
"updateTrackHitPattern",
true);
494 desc.add<
std::string>(
"TransientTrackBuilder",
"TransientTrackBuilder");
499 "KFFitterForRefitInsideOut",
500 "KFSmootherForRefitInsideOut",
501 "PropagatorWithMaterialForMTD",
508 desc.add<
double>(
"estimatorMaxChi2", 500.);
509 desc.add<
double>(
"estimatorMaxNSigma", 10.);
510 desc.add<
double>(
"btlChi2Cut", 50.);
511 desc.add<
double>(
"btlTimeChi2Cut", 10.);
512 desc.add<
double>(
"etlChi2Cut", 50.);
513 desc.add<
double>(
"etlTimeChi2Cut", 10.);
514 desc.add<
bool>(
"useVertex",
false);
515 desc.add<
bool>(
"useSimVertex",
false);
516 desc.add<
double>(
"dZCut", 0.1);
517 desc.add<
double>(
"bsTimeSpread", 0.2);
518 descriptions.
add(
"trackExtenderWithMTDBase",
desc);
521 template <
class TrackCollection>
522 template <
class H,
class T>
525 const std::vector<T>& vec,
527 auto out = std::make_unique<edm::ValueMap<T>>();
534 template <
class TrackCollection>
539 theTransformer->setServices(es);
551 hitbuilder_ = es.
getHandle(hitbuilderToken_);
559 auto output = std::make_unique<TrackCollection>();
560 auto extras = std::make_unique<reco::TrackExtraCollection>();
561 auto outhits = std::make_unique<edm::OwnVector<TrackingRecHit>>();
563 std::vector<float> btlMatchChi2;
564 std::vector<float> etlMatchChi2;
565 std::vector<float> btlMatchTimeChi2;
566 std::vector<float> etlMatchTimeChi2;
567 std::vector<int> npixBarrel;
568 std::vector<int> npixEndcap;
569 std::vector<float> pOrigTrkRaw;
570 std::vector<float> betaOrigTrkRaw;
571 std::vector<float> t0OrigTrkRaw;
572 std::vector<float> sigmat0OrigTrkRaw;
573 std::vector<float> pathLengthsOrigTrkRaw;
574 std::vector<float> tmtdOrigTrkRaw;
575 std::vector<float> sigmatmtdOrigTrkRaw;
576 std::vector<int> assocOrigTrkRaw;
578 auto const tracksH =
ev.getHandle(tracksToken_);
579 const auto&
tracks = *tracksH;
582 const auto&
hits =
ev.get(hitsToken_);
585 const auto&
bs =
ev.get(bsToken_);
588 if (useVertex_ && !useSimVertex_) {
589 auto const& vtxs =
ev.get(vtxToken_);
594 std::unique_ptr<math::XYZTLorentzVectorF> genPV(
nullptr);
595 if (useVertex_ && useSimVertex_) {
596 const auto& genVtxPosition =
ev.get(genVtxPositionToken_);
597 const auto& genVtxTime =
ev.get(genVtxTimeToken_);
598 genPV = std::make_unique<math::XYZTLorentzVectorF>(
599 genVtxPosition.x(), genVtxPosition.y(), genVtxPosition.z(), genVtxTime);
604 if (useSimVertex_ && genPV) {
605 vtxTime = genPV->t();
610 std::vector<unsigned> track_indices;
614 double trackVtxTime = 0.;
623 trackVtxTime = vtxTime;
627 const auto& trajs = theTransformer->transform(
track);
628 auto thits = theTransformer->getTransientRecHits(ttrack);
630 MTDHitMatchingInfo mBTL, mETL;
631 if (!trajs.empty()) {
635 bool tscbl_status = getTrajectoryStateClosestToBeamLine(trajs.front(),
bs, prop, tscbl);
640 trackPathLength(trajs.front(), tscbl, prop, pathlength0);
642 const auto& btlhits = tryBTLLayers(tsos,
654 mtdthits.insert(mtdthits.end(), btlhits.begin(), btlhits.end());
658 const auto& etlhits = tryETLLayers(tsos,
670 mtdthits.insert(mtdthits.end(), etlhits.begin(), etlhits.end());
674 auto ordering = checkRecHitsOrdering(thits);
676 thits.insert(thits.end(), mtdthits.begin(), mtdthits.end());
679 mtdthits.insert(mtdthits.end(), thits.begin(), thits.end());
680 thits.swap(mtdthits);
683 const auto& trajwithmtd = mtdthits.empty() ? trajs : theTransformer->transform(ttrack, thits);
684 float pMap = 0.f, betaMap = 0.f, t0Map = 0.f, sigmat0Map = -1.f, pathLengthMap = -1.f, tmtdMap = 0.f,
688 for (
const auto& trj : trajwithmtd) {
689 const auto& thetrj = (updateTraj_ ? trj : trajs.front());
690 float pathLength = 0.f, tmtd = 0.f, sigmatmtd = -1.f;
697 !trajwithmtd.empty() && !mtdthits.empty(),
705 size_t hitsstart = outhits->size();
706 if (updatePattern_) {
707 t2t(trj, *outhits, trajParams, chi2s);
709 t2t(thetrj, *outhits, trajParams, chi2s);
711 size_t hitsend = outhits->size();
712 extras->push_back(buildTrackExtra(trj));
713 extras->back().setHits(hitsRefProd, hitsstart, hitsend - hitsstart);
714 extras->back().setTrajParams(trajParams, chi2s);
717 btlMatchChi2.push_back(mBTL.hit ? mBTL.estChi2 : -1);
718 etlMatchChi2.push_back(mETL.hit ? mETL.estChi2 : -1);
719 btlMatchTimeChi2.push_back(mBTL.hit ? mBTL.timeChi2 : -1);
720 etlMatchTimeChi2.push_back(mETL.hit ? mETL.timeChi2 : -1);
721 pathLengthMap = pathLength;
723 sigmatmtdMap = sigmatmtd;
724 auto& backtrack =
output->back();
725 iMap =
output->size() - 1;
726 pMap = backtrack.p();
727 betaMap = backtrack.beta();
728 t0Map = backtrack.t0();
729 sigmat0Map = std::copysign(
std::sqrt(
std::abs(backtrack.covt0t0())), backtrack.covt0t0());
731 backtrack.setExtra((updateExtra_ ? extraRef :
track.extra()));
732 for (
unsigned ihit = hitsstart; ihit < hitsend; ++ihit) {
733 backtrack.appendHitPattern((*outhits)[ihit], ttopo);
735 npixBarrel.push_back(backtrack.hitPattern().numberOfValidPixelBarrelHits());
736 npixEndcap.push_back(backtrack.hitPattern().numberOfValidPixelEndcapHits());
738 LogTrace(
"TrackExtenderWithMTD") <<
"Error in the MTD track refitting. This should not happen";
742 pOrigTrkRaw.push_back(pMap);
743 betaOrigTrkRaw.push_back(betaMap);
744 t0OrigTrkRaw.push_back(t0Map);
745 sigmat0OrigTrkRaw.push_back(sigmat0Map);
746 pathLengthsOrigTrkRaw.push_back(pathLengthMap);
747 tmtdOrigTrkRaw.push_back(tmtdMap);
748 sigmatmtdOrigTrkRaw.push_back(sigmatmtdMap);
749 assocOrigTrkRaw.push_back(iMap);
752 btlMatchChi2.push_back(-1.);
753 etlMatchChi2.push_back(-1.);
754 btlMatchTimeChi2.push_back(-1.);
755 etlMatchTimeChi2.push_back(-1.);
756 npixBarrel.push_back(-1.);
757 npixEndcap.push_back(-1.);
767 fillValueMap(
ev, tracksH, btlMatchChi2, btlMatchChi2Token);
768 fillValueMap(
ev, tracksH, etlMatchChi2, etlMatchChi2Token);
769 fillValueMap(
ev, tracksH, btlMatchTimeChi2, btlMatchTimeChi2Token);
770 fillValueMap(
ev, tracksH, etlMatchTimeChi2, etlMatchTimeChi2Token);
771 fillValueMap(
ev, tracksH, npixBarrel, npixBarrelToken);
772 fillValueMap(
ev, tracksH, npixEndcap, npixEndcapToken);
773 fillValueMap(
ev, tracksH, pOrigTrkRaw, pOrigTrkToken);
774 fillValueMap(
ev, tracksH, betaOrigTrkRaw, betaOrigTrkToken);
775 fillValueMap(
ev, tracksH, t0OrigTrkRaw, t0OrigTrkToken);
776 fillValueMap(
ev, tracksH, sigmat0OrigTrkRaw, sigmat0OrigTrkToken);
777 fillValueMap(
ev, tracksH, pathLengthsOrigTrkRaw, pathLengthOrigTrkToken);
778 fillValueMap(
ev, tracksH, tmtdOrigTrkRaw, tmtdOrigTrkToken);
779 fillValueMap(
ev, tracksH, sigmatmtdOrigTrkRaw, sigmatmtdOrigTrkToken);
780 fillValueMap(
ev, tracksH, assocOrigTrkRaw, assocOrigTrkToken);
784 bool cmp_for_detset(
const unsigned one,
const unsigned two) {
return one <
two; };
791 const double pathlength0,
792 const double vtxTime,
794 const float bsTimeSpread,
797 bool useVtxConstraint,
798 std::set<MTDHitMatchingInfo>&
out) {
799 pair<bool, TrajectoryStateOnSurface>
comp =
layer->compatible(tsos, *prop, *
estimator);
801 const vector<DetLayer::DetWithState> compDets =
layer->compatibleDets(tsos, *prop, *
estimator);
802 if (!compDets.empty()) {
803 for (
const auto& detWithState : compDets) {
804 auto range =
hits.equal_range(detWithState.first->geographicalId(), cmp_for_detset);
812 const double tot_pl = pathlength0 +
std::abs(pl.second);
813 const double t_vtx = useVtxConstraint ? vtxTime : 0.;
815 constexpr
double vtx_res = 0.008;
816 const double t_vtx_err = useVtxConstraint ? vtx_res : bsTimeSpread;
818 constexpr
double t_res_manual = 0.035;
820 for (
auto detitr =
range.first; detitr !=
range.second; ++detitr) {
821 for (
const auto&
hit : *detitr) {
822 auto est =
estimator->estimate(detWithState.second,
hit);
826 TrackTofPidInfo tof = computeTrackTofPidInfo(pmag2,
833 MTDHitMatchingInfo mi;
835 mi.estChi2 = est.second;
836 mi.timeChi2 = tof.dtchi2_best;
847 template <
class TrackCollection>
852 const double pathlength0,
858 const double vtxTime,
859 const bool matchVertex,
860 MTDHitMatchingInfo& bestHit)
const {
864 bestHit = MTDHitMatchingInfo();
866 fillMatchingHits(ilay, tsos, traj, pmag2, pathlength0,
hits, prop,
bs, vtxTime, matchVertex,
output, bestHit);
870 template <
class TrackCollection>
875 const double pathlength0,
881 const double vtxTime,
882 const bool matchVertex,
883 MTDHitMatchingInfo& bestHit)
const {
887 bestHit = MTDHitMatchingInfo();
889 const BoundDisk& disk = static_cast<const MTDRingForwardDoubleLayer*>(ilay)->specificSurface();
890 const double diskZ = disk.position().z();
895 fillMatchingHits(ilay, tsos, traj, pmag2, pathlength0,
hits, prop,
bs, vtxTime, matchVertex,
output, bestHit);
908 template <
class TrackCollection>
913 const double pathlength0,
917 const double& vtxTime,
918 const bool matchVertex,
920 MTDHitMatchingInfo& bestHit)
const {
921 std::set<MTDHitMatchingInfo> hitsInLayer;
922 bool hitMatched =
false;
924 using namespace std::placeholders;
925 auto find_hits = std::bind(find_hits_in_dets,
938 std::ref(hitsInLayer));
940 if (useVertex_ && matchVertex)
941 find_hits(vtxTime,
true);
946 if (!hitsInLayer.empty()) {
948 auto const& firstHit = *hitsInLayer.begin();
949 if (firstHit.estChi2 < etlChi2Cut_ && firstHit.timeChi2 < etlTimeChi2Cut_) {
951 output.push_back(hitbuilder_->build(firstHit.hit));
952 if (firstHit < bestHit)
957 if (useVertex_ && matchVertex && !hitMatched) {
961 if (!hitsInLayer.empty()) {
962 auto const& firstHit = *hitsInLayer.begin();
963 if (firstHit.timeChi2 < etlTimeChi2Cut_) {
964 if (firstHit.estChi2 < etlChi2Cut_) {
966 output.push_back(hitbuilder_->build(firstHit.hit));
967 if (firstHit < bestHit)
977 template <
class TrackCollection>
985 float& pathLengthOut,
987 float& sigmatmtdOut)
const {
989 bool tsbcl_status = getTrajectoryStateClosestToBeamLine(traj,
bs, thePropagator, tscbl);
1002 double covt0t0 = -1.;
1003 pathLengthOut = -1.f;
1005 sigmatmtdOut = -1.f;
1006 double betaOut = 0.;
1007 double covbetabeta = -1.;
1009 auto routput = [&]() {
1027 bool validpropagation = trackPathLength(trajWithMtd,
bs, thePropagator, pathlength);
1029 double thiterror = -1.;
1030 bool validmtd =
false;
1032 if (!validpropagation) {
1036 size_t ihitcount(0), ietlcount(0);
1041 if (
MTDDetId(
hit.recHit()->geographicalId()).mtdSubDetector() == MTDDetId::MTDType::ETL) {
1048 if (ihitcount == 1) {
1049 const MTDTrackingRecHit* mtdhit = static_cast<const MTDTrackingRecHit*>((*ihit1).recHit()->hit());
1050 thit = mtdhit->
time();
1053 }
else if (ihitcount == 2 && ietlcount == 2) {
1054 const auto& propresult =
1055 thePropagator->
propagateWithPath(ihit1->updatedState(), (ihit1 + 1)->updatedState().surface());
1056 double etlpathlength =
std::abs(propresult.second);
1060 if (etlpathlength == 0.) {
1061 validpropagation =
false;
1063 pathlength -= etlpathlength;
1064 const MTDTrackingRecHit* mtdhit1 = static_cast<const MTDTrackingRecHit*>((*ihit1).recHit()->hit());
1066 TrackTofPidInfo tofInfo =
1067 computeTrackTofPidInfo(
p.mag2(), etlpathlength, mtdhit1->
time(), mtdhit1->
timeError(), 0., 0.,
true);
1071 double err1 = tofInfo.dterror * tofInfo.dterror;
1072 double err2 = mtdhit2->timeError() * mtdhit2->timeError();
1075 <<
"MTD tracking hits with zero time uncertainty: " << err1 <<
" " << err2;
1077 if ((tofInfo.dt - mtdhit2->time()) * (tofInfo.dt - mtdhit2->time()) < (err1 + err2) * etlTimeChi2Cut_) {
1084 thiterror = 1. / (err1 + err2);
1085 thit = (tofInfo.dt * err1 + mtdhit2->time() * err2) * thiterror;
1087 LogDebug(
"TrackExtenderWithMTD") <<
"p trk = " <<
p.mag() <<
" ETL hits times/errors: " << mtdhit1->
time()
1088 <<
" +/- " << mtdhit1->
timeError() <<
" , " << mtdhit2->time() <<
" +/- "
1089 << mtdhit2->timeError() <<
" extrapolated time1: " << tofInfo.dt <<
" +/- "
1090 << tofInfo.dterror <<
" average = " << thit <<
" +/- " << thiterror;
1097 <<
"MTD hits #" << ihitcount <<
"ETL hits #" << ietlcount <<
" anomalous pattern, skipping...";
1100 if (validmtd && validpropagation) {
1102 TrackTofPidInfo tofInfo = computeTrackTofPidInfo(
p.mag2(), pathlength, thit, thiterror, 0., 0.,
true);
1103 pathLengthOut = pathlength;
1105 sigmatmtdOut = thiterror;
1107 covt0t0 = tofInfo.dterror * tofInfo.dterror;
1108 betaOut = tofInfo.beta_pi;
1109 covbetabeta = tofInfo.betaerror * tofInfo.betaerror;
1116 template <
class TrackCollection>
1118 static const string metname =
"TrackExtenderWithMTD";
1128 unsigned int innerId = 0, outerId = 0;
1151 const GeomDet* outerDet = gtg_->idToDet(outerDetId);
1159 LogTrace(
metname) <<
"The Global Muon outerMostMeasurementState is not compatible with the recHit detector!"
1160 <<
" Setting outerMost postition to recHit position if recHit isValid: "
1161 << outerRecHit->isValid();
1192 template <
class TrackCollection>
1200 sur = &(
layer->surface());
1201 if ((bc = dynamic_cast<const BoundCylinder*>(sur))) {
1202 output <<
" Cylinder of radius: " << bc->radius() << endl;
1203 }
else if ((
bd = dynamic_cast<const BoundDisk*>(sur))) {
1204 output <<
" Disk at: " <<
bd->position().z() << endl;