44 #include "LayerNumberConverter.h" 71 std::vector<const DetLayer*>
createDetLayers(
const mkfit::LayerNumberConverter& lnc,
83 const std::vector<const DetLayer*>& detLayers,
91 bool lastHitWasInvalid,
92 bool lastHitWasChanged)
const;
121 mteToken_{consumes<MeasurementTrackerEvent>(iConfig.getParameter<
edm::InputTag>(
"measurementTrackerEvent"))},
122 geomToken_{esConsumes<TrackerGeometry, TrackerDigiGeometryRecord>()},
124 esConsumes<Propagator, TrackingComponentsRecord>(iConfig.getParameter<
edm::ESInputTag>(
"propagatorAlong"))},
127 ttopoToken_{esConsumes<TrackerTopology, TrackerTopologyRcd>()},
128 mfToken_{esConsumes<MagneticField, IdealMagneticFieldRecord>()},
129 ttrhBuilderToken_{esConsumes<TransientTrackingRecHitBuilder, TransientRecHitRecord>(
141 desc.
add(
"measurementTrackerEvent",
edm::InputTag{
"MeasurementTrackerEvent"});
144 desc.
add(
"propagatorOpposite",
edm::ESInputTag{
"",
"PropagatorWithMaterialOpposite"});
145 desc.
add(
"backwardFitInCMSSW",
false)
146 ->
setComment(
"Do backward fit (to innermost hit) in CMSSW (true) or mkFit (false)");
159 throw cms::Exception(
"LogicError") <<
"TTRHBuilder must be of type TkTransientTrackingRecHitBuilder";
163 const auto detlayers =
167 hitsSeeds.hitIndexMap(),
184 std::vector<const DetLayer*> dets(lnc.nLayers(),
nullptr);
186 auto isPlusSide = [&ttopo](
const DetId& detid) {
189 auto setDet = [&lnc, &dets, &isPlusSide](
190 const int subdet,
const int layer,
const int isStereo,
const DetId& detId,
const DetLayer* lay) {
191 const int index = lnc.convertLayerNumber(subdet, layer,
false, isStereo, isPlusSide(detId));
192 if (index < 0
or static_cast<unsigned>(index) >= dets.size()) {
193 throw cms::Exception(
"LogicError") <<
"Invalid mkFit layer index " << index <<
" for DetId " << detId
194 <<
" subdet " << subdet <<
" layer " << layer <<
" isStereo " << isStereo;
201 const auto&
comp = lay->basicComponents();
203 throw cms::Exception(
"LogicError") <<
"Got a tracker layer (subdet " << lay->subDetector()
204 <<
") with empty basicComponents.";
207 const auto& detId =
comp.front()->geographicalId();
208 const auto subdet = detId.subdetId();
209 const auto layer = ttopo.
layer(detId);
212 setDet(subdet, layer, monoLayer, detId, lay);
215 setDet(subdet, layer, stereoLayer, detId, lay);
230 const std::vector<const DetLayer*>& detLayers,
241 LogTrace(
"MkFitOutputConverter") <<
"Candidate " << candIndex <<
" pT " <<
cand.pT() <<
" eta " <<
cand.momEta()
242 <<
" phi " <<
cand.momPhi() <<
" chi2 " <<
cand.chi2();
250 bool lastHitInvalid =
false;
252 const auto& hitOnTrack =
cand.getHitOnTrack(
i);
253 LogTrace(
"MkFitOutputConverter") <<
" hit on layer " << hitOnTrack.layer <<
" index " << hitOnTrack.index;
254 if (hitOnTrack.index < 0) {
265 const auto* detLayer = detLayers.at(hitOnTrack.layer);
266 if (detLayer ==
nullptr) {
267 throw cms::Exception(
"LogicError") <<
"DetLayer for layer index " << hitOnTrack.layer <<
" is null!";
272 lastHitInvalid =
true;
282 lastHitInvalid =
false;
290 recHits.
sort([](
const auto&
a,
const auto&
b) {
291 const auto asub =
a.geographicalId().subdetId();
292 const auto bsub =
b.geographicalId().subdetId();
298 const auto& apos =
a.globalPosition();
299 const auto& bpos =
b.globalPosition();
302 return apos.perp2() < bpos.perp2();
310 const auto seedIndex =
cand.label();
311 LogTrace(
"MkFitOutputConverter") <<
" from seed " << seedIndex <<
" seed hits";
312 const auto& mkseed = mkFitSeeds.at(
cand.label());
313 for (
int i = 0;
i < mkseed.nTotalHits(); ++
i) {
314 const auto& hitOnTrack = mkseed.getHitOnTrack(
i);
315 LogTrace(
"MkFitOutputConverter") <<
" hit on layer " << hitOnTrack.layer <<
" index " << hitOnTrack.index;
317 const auto& candHitOnTrack =
cand.getHitOnTrack(
i);
318 if (hitOnTrack.layer != candHitOnTrack.layer) {
320 <<
"Candidate " << candIndex <<
" from seed " << seedIndex <<
" hit " <<
i 321 <<
" has different layer in candidate (" << candHitOnTrack.layer <<
") and seed (" << hitOnTrack.layer
323 <<
" Hit indices are " << candHitOnTrack.index <<
" and " << hitOnTrack.index <<
", respectively";
325 if (hitOnTrack.index != candHitOnTrack.index) {
326 throw cms::Exception(
"LogicError") <<
"Candidate " << candIndex <<
" from seed " << seedIndex <<
" hit " <<
i 327 <<
" has different hit index in candidate (" << candHitOnTrack.index
328 <<
") and seed (" << hitOnTrack.index <<
") on layer " << hitOnTrack.layer;
333 auto state =
cand.state();
334 state.convertFromCCSToCartesian();
335 const auto& param = state.parameters;
336 const auto&
err = state.errors;
338 for (
int i = 0;
i < 6; ++
i) {
339 for (
int j =
i;
j < 6; ++
j) {
348 if (!fts.curvilinearError().posDef()) {
349 edm::LogWarning(
"MkFitOutputConverter") <<
"Curvilinear error not pos-def\n" 350 << fts.curvilinearError().matrix() <<
"\noriginal 6x6 covariance matrix\n" 351 << cov <<
"\ncandidate ignored";
357 ?
backwardFit(fts, recHits, propagatorAlong, propagatorOpposite, hitCloner, lastHitInvalid, lastHitChanged)
359 if (!tsosDet.first.isValid()) {
361 <<
"Backward fit of candidate " << candIndex <<
" failed, ignoring the candidate";
372 seeds.
refAt(seedIndex),
386 bool lastHitWasInvalid,
387 bool lastHitWasChanged)
const {
391 for (
int i = hits.
size() - 1;
i >= 0; --
i) {
402 const auto& lastHitSurface = firstHits.front()->det()->surface();
406 if (lastHitWasInvalid || lastHitWasChanged) {
407 LogTrace(
"MkFitOutputConverter") <<
"Propagating first opposite, then along, because lastHitWasInvalid? " 408 << lastHitWasInvalid <<
" or lastHitWasChanged? " << lastHitWasChanged;
411 const auto lastHitSubdet = firstHits.front()->geographicalId().subdetId();
412 const auto& surfacePos = lastHitSurface.position();
413 const auto& lastHitPos = firstHits.front()->globalPosition();
414 bool doSwitch =
false;
416 doSwitch = (surfacePos.perp2() < lastHitPos.perp2());
418 doSwitch = (surfacePos.z() < lastHitPos.z());
422 <<
"Propagating first opposite, then along, because surface is inner than the hit; surface perp2 " 423 << surfacePos.perp() <<
" hit " << lastHitPos.perp2() <<
" surface z " << surfacePos.z() <<
" hit " 431 if (!tsosDouble.first.isValid()) {
432 LogDebug(
"MkFitOutputConverter") <<
"Propagating to startingState failed, trying in another direction next";
435 auto& startingState = tsosDouble.first;
437 if (!startingState.isValid()) {
439 <<
"startingState is not valid, FTS was\n" 440 << fts <<
" last hit surface surface:" 441 <<
"\n position " << lastHitSurface.
position() <<
"\n phiSpan " << lastHitSurface.phiSpan().first <<
"," 442 << lastHitSurface.phiSpan().first <<
"\n rSpan " << lastHitSurface.rSpan().first <<
"," 443 << lastHitSurface.rSpan().first <<
"\n zSpan " << lastHitSurface.zSpan().first <<
"," 444 << lastHitSurface.zSpan().first;
445 return std::pair<TrajectoryStateOnSurface, const GeomDet*>();
449 startingState.rescaleError(100.);
454 KFTrajectoryFitter backFitter(
455 &propagatorAlong, &aKFUpdator, &aChi2MeasurementEstimator, firstHits.size(),
nullptr, &hitCloner);
466 LogDebug(
"MkFitOutputConverter") <<
"using a backward fit of :" << firstHits.size() <<
" hits, starting from:\n" 467 << startingState <<
" to get the estimate of the initial state of the track.";
470 edm::LogWarning(
"MkFitOutputConverter") <<
"FitTester: first hits fit failed";
471 return std::pair<TrajectoryStateOnSurface, const GeomDet*>();
478 firstMeas.updatedState().localError(),
479 firstMeas.updatedState().surface(),
484 LogDebug(
"MkFitOutputConverter") <<
"the initial state is found to be:\n:" << firstState
485 <<
"\n it's field pointer is: " << firstState.magneticField()
486 <<
"\n the pointer from the state of the back fit was: " 487 << firstMeas.updatedState().magneticField();
489 return std::make_pair(firstState, firstMeas.recHit()->det());
497 auto det = hits[0].det();
498 if (det ==
nullptr) {
499 throw cms::Exception(
"LogicError") <<
"Got nullptr from the first hit det()";
502 const auto& firstHitSurface = det->surface();
505 if (!tsosDouble.first.isValid()) {
506 LogDebug(
"MkFitOutputConverter") <<
"Propagating to startingState along momentum failed, trying opposite next";
510 return std::make_pair(tsosDouble.first, det);
void rescaleError(double factor)
T getParameter(std::string const &) const
static constexpr auto TEC
void setComment(std::string const &value)
TrackCandidateCollection convertCandidates(const MkFitOutputWrapper &mkFitOutput, const MkFitHitIndexMap &hitIndexMap, const edm::View< TrajectorySeed > &seeds, const TrackerGeometry &geom, const MagneticField &mf, const Propagator &propagatorAlong, const Propagator &propagatorOpposite, const TkClonerImpl &hitCloner, const std::vector< const DetLayer * > &detLayers, const mkfit::TrackVec &mkFitSeeds) const
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
edm::EDGetTokenT< MeasurementTrackerEvent > mteToken_
std::pair< TrajectoryStateOnSurface, const GeomDet * > backwardFit(const FreeTrajectoryState &fts, const edm::OwnVector< TrackingRecHit > &hits, const Propagator &propagatorAlong, const Propagator &propagatorOpposite, const TkClonerImpl &hitCloner, bool lastHitWasInvalid, bool lastHitWasChanged) const
std::vector< DetLayer const * > const & allLayers() const
edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > ttopoToken_
std::vector< TrackCandidate > TrackCandidateCollection
Global3DPoint GlobalPoint
edm::EDGetTokenT< MkFitOutputWrapper > tracksToken_
constexpr uint32_t rawId() const
get the raw id
unsigned int side(const DetId &id) const
virtual GlobalPoint globalPosition() const
mkfit::TrackVec const & fitTracks() const
RefToBase< value_type > refAt(size_type i) const
bool getData(T &iHolder) const
edm::EDPutTokenT< TrackCandidateCollection > putTrackCandidateToken_
virtual const MagneticField * magneticField() const =0
size_t clusterIndex(MkFitHit hit) const
Get CMSSW cluster index (currently used only for debugging)
#define DEFINE_FWK_MODULE(type)
std::string propagatorAlongName_
std::vector< const DetLayer * > createDetLayers(const mkfit::LayerNumberConverter &lnc, const GeometricSearchTracker &tracker, const TrackerTopology &ttopo) const
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
~MkFitOutputConverter() override=default
TrajectoryMeasurement const & lastMeasurement() const
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
virtual TrackingRecHit * clone() const =0
MkFitOutputConverter(edm::ParameterSet const &iConfig)
virtual std::pair< TrajectoryStateOnSurface, double > propagateWithPath(const FreeTrajectoryState &, const Surface &) const final
Abs< T >::type abs(const T &t)
bool get(ProductID const &oid, Handle< PROD > &result) const
edm::ESGetToken< Propagator, TrackingComponentsRecord > propagatorAlongToken_
std::string ttrhBuilderName_
static constexpr auto TOB
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isEndcap(GeomDetEnumerators::SubDetector m)
edm::ESGetToken< TransientTrackingRecHitBuilder, TransientRecHitRecord > ttrhBuilderToken_
std::vector< ConstRecHitPointer > ConstRecHitContainer
void produce(edm::StreamID, edm::Event &iEvent, const edm::EventSetup &iSetup) const override
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepSym< double, 6 > > AlgebraicSymMatrix66
std::string propagatorOppositeName_
GlobalPoint position() const
std::vector< Track > TrackVec
static constexpr auto TIB
edm::EDGetTokenT< edm::View< TrajectorySeed > > seedToken_
OrphanHandle< PROD > emplace(EDPutTokenT< PROD > token, Args &&...args)
puts a new product
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomToken_
mkfit::TrackVec const & candidateTracks() const
edm::EDPutTokenT< std::vector< SeedStopInfo > > putSeedStopInfoToken_
unsigned int layer(const DetId &id) const
std::pair< TrajectoryStateOnSurface, const GeomDet * > convertInnermostState(const FreeTrajectoryState &fts, const edm::OwnVector< TrackingRecHit > &hits, const Propagator &propagatorAlong, const Propagator &propagatorOpposite) const
edm::EDGetTokenT< MkFitInputWrapper > hitsSeedsToken_
const_reference at(size_type pos) const
DetId geographicalId() const
const TrackingRecHit * hitPtr(MkFitHit hit) const
Get CMSSW hit pointer.
edm::ESGetToken< Propagator, TrackingComponentsRecord > propagatorOppositeToken_
static constexpr auto TID
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > mfToken_
Global3DVector GlobalVector