53 #include "CLHEP/Units/GlobalPhysicalConstants.h" 54 #include "CLHEP/Units/GlobalSystemOfUnits.h" 59 template <
class TrackCollection>
67 template <
class H,
class T>
88 if (!recHits.empty()) {
93 auto rFirst = first.
mag2();
94 auto rLast = last.
mag2();
100 LogDebug(
"TrackExtenderWithMTD") <<
"Impossible to determine the rechits order" << endl;
113 float& sigmatmtdOut)
const;
116 string dumpLayer(
const DetLayer* layer)
const;
123 static constexpr char betaOrigTrkName[] =
"generalTrackBeta";
124 static constexpr char t0OrigTrkName[] =
"generalTrackt0";
125 static constexpr char sigmat0OrigTrkName[] =
"generalTracksigmat0";
126 static constexpr char pathLengthOrigTrkName[] =
"generalTrackPathLength";
127 static constexpr char tmtdOrigTrkName[] =
"generalTracktmtd";
128 static constexpr char sigmatmtdOrigTrkName[] =
"generalTracksigmatmtd";
143 template <
class TrackCollection>
148 updateTraj_(iConfig.getParameter<
bool>(
"updateTrackTrajectory")),
149 updateExtra_(iConfig.getParameter<
bool>(
"updateTrackExtra")),
150 updatePattern_(iConfig.getParameter<
bool>(
"updateTrackHitPattern")),
151 mtdRecHitBuilder_(iConfig.getParameter<
std::
string>(
"MTDRecHitBuilder")),
152 propagator_(iConfig.getParameter<
std::
string>(
"Propagator")),
153 transientTrackBuilder_(iConfig.getParameter<
std::
string>(
"TransientTrackBuilder")) {
161 produces<edm::ValueMap<float>>(
tmtdName);
171 produces<edm::OwnVector<TrackingRecHit>>();
172 produces<reco::TrackExtraCollection>();
173 produces<TrackCollection>();
176 template <
class TrackCollection>
182 desc.
add<
bool>(
"updateTrackTrajectory",
true);
183 desc.
add<
bool>(
"updateTrackExtra",
true);
184 desc.
add<
bool>(
"updateTrackHitPattern",
true);
185 desc.
add<
std::string>(
"TransientTrackBuilder",
"TransientTrackBuilder");
187 desc.
add<
std::string>(
"Propagator",
"PropagatorWithMaterialForMTD");
190 "KFFitterForRefitInsideOut",
191 "KFSmootherForRefitInsideOut",
192 "PropagatorWithMaterialForMTD",
199 descriptions.
add(
"trackExtenderWithMTDBase", desc);
202 template <
class TrackCollection>
203 template <
class H,
class T>
206 const std::vector<T>& vec,
208 auto out = std::make_unique<edm::ValueMap<T>>();
210 filler.insert(handle, vec.begin(), vec.end());
215 template <
class TrackCollection>
243 auto output = std::make_unique<TrackCollection>();
244 auto extras = std::make_unique<reco::TrackExtraCollection>();
245 auto outhits = std::make_unique<edm::OwnVector<TrackingRecHit>>();
247 std::vector<float> pathLengthsRaw;
248 std::vector<float> tmtdRaw;
249 std::vector<float> sigmatmtdRaw;
250 std::vector<float> pOrigTrkRaw;
251 std::vector<float> betaOrigTrkRaw;
252 std::vector<float> t0OrigTrkRaw;
253 std::vector<float> sigmat0OrigTrkRaw;
254 std::vector<float> pathLengthsOrigTrkRaw;
255 std::vector<float> tmtdOrigTrkRaw;
256 std::vector<float> sigmatmtdOrigTrkRaw;
260 const auto&
tracks = *tracksH;
264 const auto&
hits = *hitsH;
268 const auto& bs = *bsH;
270 std::vector<unsigned> track_indices;
279 mtdthits.insert(mtdthits.end(), btlhits.begin(), btlhits.end());
284 mtdthits.insert(mtdthits.end(), etlhits.begin(), etlhits.end());
288 thits.insert(thits.end(), mtdthits.begin(), mtdthits.end());
291 mtdthits.insert(mtdthits.end(), thits.begin(), thits.end());
292 thits.swap(mtdthits);
294 const auto& trajwithmtd =
theTransformer->transform(ttrack, thits);
295 float pMap = 0.f, betaMap = 0.f, t0Map = 0.f, sigmat0Map = -1.f, pathLengthMap = -1.f, tmtdMap = 0.f,
298 for (
const auto& trj : trajwithmtd) {
299 const auto& thetrj = (
updateTraj_ ? trj : trajs.front());
300 float pathLength = 0.f, tmtd = 0.f, sigmatmtd = -1.f;
302 track, thetrj, trj, bs, magfield.
product(), prop.
product(), !mtdthits.empty(), pathLength, tmtd, sigmatmtd);
303 if (result.
ndof() >= 0) {
307 size_t hitsstart = outhits->size();
309 t2t(trj, *outhits, trajParams, chi2s);
311 t2t(thetrj, *outhits, trajParams, chi2s);
313 size_t hitsend = outhits->size();
315 extras->back().setHits(hitsRefProd, hitsstart, hitsend - hitsstart);
316 extras->back().setTrajParams(trajParams, chi2s);
318 output->push_back(result);
319 pathLengthsRaw.push_back(pathLength);
320 tmtdRaw.push_back(tmtd);
321 sigmatmtdRaw.push_back(sigmatmtd);
322 pathLengthMap = pathLength;
324 sigmatmtdMap = sigmatmtd;
325 auto& backtrack =
output->back();
326 pMap = backtrack.p();
327 betaMap = backtrack.beta();
328 t0Map = backtrack.t0();
329 sigmat0Map = std::copysign(
std::sqrt(
std::abs(backtrack.covt0t0())), backtrack.covt0t0());
332 for (
unsigned ihit = hitsstart; ihit < hitsend; ++ihit) {
333 backtrack.appendHitPattern((*outhits)[ihit], ttopo);
337 pOrigTrkRaw.push_back(pMap);
338 betaOrigTrkRaw.push_back(betaMap);
339 t0OrigTrkRaw.push_back(t0Map);
340 sigmat0OrigTrkRaw.push_back(sigmat0Map);
341 pathLengthsOrigTrkRaw.push_back(pathLengthMap);
342 tmtdOrigTrkRaw.push_back(tmtdMap);
343 sigmatmtdOrigTrkRaw.push_back(sigmatmtdMap);
364 bool cmp_for_detset(
const unsigned one,
const unsigned two) {
return one < two; };
373 pair<bool, TrajectoryStateOnSurface>
comp = layer->
compatible(tsos, *prop, theEstimator);
375 vector<DetLayer::DetWithState> compDets = layer->
compatibleDets(tsos, *prop, theEstimator);
376 if (!compDets.empty()) {
379 for (
const auto& detWithState : compDets) {
380 auto range = hits.
equal_range(detWithState.first->geographicalId(), cmp_for_detset);
381 for (
auto detitr =
range.first; detitr !=
range.second; ++detitr) {
382 for (
auto itr = detitr->begin(); itr != detitr->end(); ++itr) {
383 auto est = theEstimator.
estimate(detWithState.second, *itr);
384 if (est.first && est.second < best_chi2) {
386 best_chi2 = est.second;
392 output.push_back(hitbuilder.
build(best));
398 template <
class TrackCollection>
409 for (
const DetLayer* ilay : layers) {
417 template <
class TrackCollection>
429 for (
const DetLayer* ilay : layers) {
431 const double diskZ = disk.position().z();
444 template <
class TrackCollection>
452 float& pathLengthOut,
454 float& sigmatmtdOut)
const {
461 edm::LogError(
"CannotPropagateToBeamLine") <<
"the state on the closest measurement isnot valid. skipping track.";
468 constexpr double m_p_inv2 = 1.0 / m_p / m_p;
469 constexpr double c_cm_ns = CLHEP::c_light * CLHEP::ns / CLHEP::cm;
488 double covt0t0 = -1.;
489 pathLengthOut = -1.f;
493 double covbetabeta = -1.;
497 bool validpropagation =
true;
498 double pathlength = 0.;
499 double pathlength1 = 0.;
500 double pathlength2 = 0.;
503 double layerpathlength =
std::abs(propresult.second);
504 if (layerpathlength == 0.) {
505 validpropagation =
false;
507 pathlength1 += layerpathlength;
511 double thiterror = -1.;
512 bool validmtd =
false;
515 bool ismtd = it->recHit()->geographicalId().det() ==
DetId::Forward &&
520 pathlength2 = propresult2.second;
521 if (pathlength2 == 0.) {
522 validpropagation =
false;
524 pathlength = pathlength1 + pathlength2;
526 thit = mtdhit->
time();
534 bool ismtd = it->recHit()->geographicalId().det() ==
DetId::Forward &&
539 pathlength2 = propresult2.second;
540 if (pathlength2 == 0.) {
541 validpropagation =
false;
543 pathlength = pathlength1 + pathlength2;
545 thit = mtdhit->
time();
553 if (validmtd && validpropagation) {
554 double magp2 = p.mag2();
556 double gammasq_pi = 1. + magp2 * m_pi_inv2;
557 double beta_pi =
std::sqrt(1. - 1. / gammasq_pi);
558 double dt_pi = pathlength / beta_pi * c_inv;
560 double gammasq_p = 1. + magp2 * m_p_inv2;
561 double beta_p =
std::sqrt(1. - 1. / gammasq_p);
562 double dt_p = pathlength / beta_p * c_inv;
564 double dterror = dt_p - dt_pi;
565 double betaerror = beta_p - beta_pi;
567 pathLengthOut = pathlength;
569 sigmatmtdOut = thiterror;
571 covt0t0 = thiterror * thiterror + dterror * dterror;
573 covbetabeta = betaerror * betaerror;
591 template <
class TrackCollection>
593 static const string metname =
"TrackExtenderWithMTD";
603 unsigned int innerId = 0, outerId = 0;
608 LogTrace(metname) <<
"alongMomentum";
616 LogTrace(metname) <<
"oppositeToMomentum";
624 LogError(metname) <<
"Wrong propagation direction!";
634 LogTrace(metname) <<
"The Global Muon outerMostMeasurementState is not compatible with the recHit detector!" 635 <<
" Setting outerMost postition to recHit position if recHit isValid: " 636 << outerRecHit->isValid();
637 LogTrace(metname) <<
"From " << outerTSOSPos <<
" to " << hitPos;
667 template <
class TrackCollection>
676 if ((bc = dynamic_cast<const BoundCylinder*>(sur))) {
677 output <<
" Cylinder of radius: " << bc->radius() << endl;
678 }
else if ((bd = dynamic_cast<const BoundDisk*>(sur))) {
679 output <<
" Disk at: " << bd->position().z() << endl;
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double z0() const
z coordinate
TrackExtenderWithMTDT< reco::TrackCollection > TrackExtenderWithMTD
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
ConstRecHitPointer const & recHit() const
Range equal_range(id_type i, CMP cmp, bool update=false) const
reco::TrackExtra buildTrackExtra(const Trajectory &trajectory) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
const std::string metname
edm::EDGetTokenT< reco::BeamSpot > bsToken_
std::unique_ptr< MeasurementEstimator > theEstimator
TrackExtenderWithMTDT(const ParameterSet &pset)
const CurvilinearTrajectoryError & curvilinearError() const
static char sigmat0OrigTrkName[]
Global3DPoint GlobalPoint
reco::TransientTrack build(const reco::Track *p) const
string dumpLayer(const DetLayer *layer) const
const bool updatePattern_
edm::View< TrackType > InputCollection
GlobalPoint globalPosition() const
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
ConstRecHitContainer recHits() const
const Bounds & bounds() const
edm::ESHandle< GlobalTrackingGeometry > gtg
const std::vector< const DetLayer * > & allBTLLayers() const
return the BTL DetLayers (barrel), inside-out
TrackCharge charge() const
reco::Track buildTrack(const reco::Track &, const Trajectory &, const Trajectory &, const reco::BeamSpot &, const MagneticField *field, const Propagator *prop, bool hasMTD, float &pathLength, float &tmtdOut, float &sigmatmtdOut) const
TrajectoryMeasurement const & closestMeasurement(GlobalPoint) const
const Plane & surface() const
The nominal surface of the GeomDet.
const CurvilinearTrajectoryError & curvilinearError() const
virtual std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
edm::EDGetTokenT< MTDTrackingDetSetVector > hitsToken_
static char sigmatmtdOrigTrkName[]
static char pOrigTrkName[]
PropagationDirection const & direction() const
TrackAlgorithm algo() const
DataContainer const & measurements() const
virtual bool inside(const Local3DPoint &) const =0
Determine if the point is inside the bounds.
const SurfaceType & surface() const
#define DEFINE_FWK_MODULE(type)
Container::value_type value_type
static char betaOrigTrkName[]
const std::vector< const DetLayer * > & allETLLayers() const
return the ETL DetLayers (endcap), -Z to +Z
const std::string mtdRecHitBuilder_
edm::ESHandle< TransientTrackingRecHitBuilder > hitbuilder
double ndof() const
number of degrees of freedom of the fit
TrajectoryMeasurement const & lastMeasurement() const
FreeTrajectoryState const * freeState(bool withErrors=true) const
GlobalVector momentum() const
RefitDirection::GeometricalDirection checkRecHitsOrdering(TransientTrackingRecHit::ConstRecHitContainer const &recHits) const
virtual std::pair< TrajectoryStateOnSurface, double > propagateWithPath(const FreeTrajectoryState &, const Surface &) const final
Abs< T >::type abs(const T &t)
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
const std::string propagator_
static char pathLengthName[]
static char tmtdOrigTrkName[]
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::RefToBase< TrajectorySeed > seedRef(void) const
static char sigmatmtdName[]
virtual std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &ts, const Propagator &, const MeasurementEstimator &) const =0
GlobalVector momentum() const
RefProd< PROD > getRefBeforePut()
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
FTS const & trackStateAtPCA() const
GlobalPoint position() const
std::vector< ConstRecHitPointer > ConstRecHitContainer
const std::string transientTrackBuilder_
GlobalPoint position() const
int ndof(bool bon=true) const
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
TrajectoryMeasurement const & firstMeasurement() const
ConstRecHitContainer RecHitContainer
TransientTrackingRecHit::ConstRecHitContainer tryBTLLayers(const TrackType &, const MTDTrackingDetSetVector &, const MTDDetLayerGeometry *, const MagneticField *field, const Propagator *prop) const
static char pathLengthOrigTrkName[]
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
edm::ESHandle< Propagator > prop
const GlobalTrajectoryParameters & globalParameters() const
ParameterSet const & getParameterSet(std::string const &) const
XYZVectorD XYZVector
spatial vector with cartesian internal representation
TransientTrackingRecHit::ConstRecHitContainer tryETLLayers(const TrackType &, const MTDTrackingDetSetVector &, const MTDDetLayerGeometry *, const MagneticField *field, const Propagator *prop) const
edm::ESHandle< TransientTrackBuilder > builder
XYZPointD XYZPoint
point in space with cartesian internal representation
A 2D TrackerRecHit with time and time error information.
void add(std::string const &label, ParameterSetDescription const &psetDescription)
TrackingRecHit::ConstRecHitPointer ConstRecHitPointer
std::unique_ptr< TrackTransformer > theTransformer
static char t0OrigTrkName[]
static int position[264][3]
const GeomDet * idToDet(DetId) const override
double y0() const
y coordinate
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TrackingRecHit &hit) const =0
TrajectoryStateOnSurface const & updatedState() const
T const * product() const
void produce(edm::Event &ev, const edm::EventSetup &es) final
TrackCollection::value_type TrackType
edm::EDGetTokenT< InputCollection > tracksToken_
void fillValueMap(edm::Event &iEvent, const H &handle, const std::vector< T > &vec, const std::string &name) const
double x0() const
x coordinate