File indexing completed on 2025-01-18 03:42:22
0001 #include "RecoTracker/TrackProducer/interface/TrackProducerBase.h"
0002
0003
0004 #include "DataFormats/Common/interface/AssociationMap.h"
0005 #include "DataFormats/DetId/interface/DetId.h"
0006 #include "FWCore/Framework/interface/Frameworkfwd.h"
0007 #include "FWCore/Framework/interface/MakerMacros.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "FWCore/ParameterSet/interface/EmptyGroupDescription.h"
0010 #include "FWCore/Utilities/interface/ESInputTag.h"
0011 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0012 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0013 #include "MagneticField/Engine/interface/MagneticField.h"
0014 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0015 #include "RecoTracker/MeasurementDet/interface/MeasurementTracker.h"
0016 #include "RecoTracker/MeasurementDet/interface/MeasurementTrackerEvent.h"
0017 #include "RecoTracker/Record/interface/CkfComponentsRecord.h"
0018 #include "RecoTracker/Record/interface/NavigationSchoolRecord.h"
0019 #include "TrackingTools/DetLayers/interface/GeometricSearchDet.h"
0020 #include "TrackingTools/DetLayers/interface/NavigationSchool.h"
0021 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
0022 #include "TrackingTools/KalmanUpdators/interface/Chi2MeasurementEstimator.h"
0023 #include "TrackingTools/MeasurementDet/interface/MeasurementDet.h"
0024 #include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
0025 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
0026 #include "TrackingTools/TrackFitters/interface/TrajectoryFitter.h"
0027 #include "TrackingTools/TrackFitters/interface/TrajectoryFitterRecord.h"
0028
0029
0030 template <class T>
0031 TrackProducerBase<T>::~TrackProducerBase() noexcept(false) {}
0032
0033
0034
0035 template <class T>
0036 void TrackProducerBase<T>::initTrackProducerBase(const edm::ParameterSet& conf,
0037 edm::ConsumesCollector cc,
0038 const edm::EDGetToken& src) {
0039 conf_ = conf;
0040 src_ = src;
0041 bsSrc_ = cc.consumes(conf.getParameter<edm::InputTag>("beamSpot"));
0042 mteSrc_ = cc.consumes(conf.getParameter<edm::InputTag>("MeasurementTrackerEvent"));
0043
0044 trackGeomSrc_ = cc.esConsumes();
0045
0046
0047
0048
0049
0050 bool useSimpleMF = conf_.getParameter<bool>("useSimpleMF");
0051 std::string mfName = "";
0052 if (useSimpleMF) {
0053 mfName = conf_.getParameter<std::string>("SimpleMagneticField");
0054 }
0055 mfSrc_ = cc.esConsumes(edm::ESInputTag("", mfName));
0056
0057 std::string fitterName = conf_.getParameter<std::string>("Fitter");
0058 fitterSrc_ = cc.esConsumes(edm::ESInputTag("", fitterName));
0059
0060 std::string propagatorName = conf_.getParameter<std::string>("Propagator");
0061 propagatorSrc_ = cc.esConsumes(edm::ESInputTag("", propagatorName));
0062
0063 std::string builderName = conf_.getParameter<std::string>("TTRHBuilder");
0064 builderSrc_ = cc.esConsumes(edm::ESInputTag("", builderName));
0065
0066
0067
0068
0069
0070
0071 std::string theNavigationSchool = conf_.getParameter<std::string>("NavigationSchool");
0072 if (!theNavigationSchool.empty()) {
0073 useSchool_ = true;
0074 schoolSrc_ = cc.esConsumes(edm::ESInputTag("", theNavigationSchool));
0075 std::string measTkName = conf_.getParameter<std::string>("MeasurementTracker");
0076 measTkSrc_ = cc.esConsumes(edm::ESInputTag("", measTkName));
0077 }
0078 }
0079
0080 template <class T>
0081 void TrackProducerBase<T>::fillPSetDescription(edm::ParameterSetDescription& desc) {
0082 desc.add<edm::InputTag>("beamSpot", edm::InputTag("offlineBeamSpot"));
0083 desc.add<edm::InputTag>("MeasurementTrackerEvent", edm::InputTag("MeasurementTrackerEvent"));
0084 desc.add<bool>("useSimpleMF", false);
0085 desc.add<std::string>("SimpleMagneticField", "");
0086 desc.add<std::string>("Fitter", "KFFittingSmootherWithOutliersRejectionAndRK");
0087 desc.add<std::string>("Propagator", "RungeKuttaTrackerPropagator");
0088 desc.add<std::string>("TTRHBuilder", "WithAngleAndTemplate");
0089 desc.add<std::string>("NavigationSchool", "SimpleNavigationSchool");
0090 desc.add<std::string>("MeasurementTracker", "");
0091 }
0092
0093
0094 template <class T>
0095 void TrackProducerBase<T>::getFromES(const edm::EventSetup& setup,
0096 edm::ESHandle<TrackerGeometry>& theG,
0097 edm::ESHandle<MagneticField>& theMF,
0098 edm::ESHandle<TrajectoryFitter>& theFitter,
0099 edm::ESHandle<Propagator>& thePropagator,
0100 edm::ESHandle<MeasurementTracker>& theMeasTk,
0101 edm::ESHandle<TransientTrackingRecHitBuilder>& theBuilder) {
0102
0103
0104
0105 LogDebug("TrackProducer") << "get geometry"
0106 << "\n";
0107 theG = setup.getHandle(trackGeomSrc_);
0108
0109
0110
0111 LogDebug("TrackProducer") << "get magnetic field"
0112 << "\n";
0113 theMF = setup.getHandle(mfSrc_);
0114
0115
0116
0117
0118 LogDebug("TrackProducer") << "get the fitter from the ES"
0119 << "\n";
0120 theFitter = setup.getHandle(fitterSrc_);
0121
0122
0123
0124 LogDebug("TrackProducer") << "get also the propagator"
0125 << "\n";
0126 thePropagator = setup.getHandle(propagatorSrc_);
0127
0128
0129
0130
0131 LogDebug("TrackProducer") << "get also the TransientTrackingRecHitBuilder"
0132 << "\n";
0133 theBuilder = setup.getHandle(builderSrc_);
0134
0135
0136
0137
0138
0139
0140 if (useSchool_) {
0141 LogDebug("TrackProducer") << "get a navigation school";
0142 theSchool = setup.getHandle(schoolSrc_);
0143 LogDebug("TrackProducer") << "get also the measTk"
0144 << "\n";
0145 theMeasTk = setup.getHandle(measTkSrc_);
0146 } else {
0147 theSchool = edm::ESHandle<NavigationSchool>();
0148 theMeasTk = edm::ESHandle<MeasurementTracker>();
0149 }
0150 }
0151
0152 template <class T>
0153 void TrackProducerBase<T>::getFromEvt(edm::Event& theEvent,
0154 edm::Handle<TrackCandidateCollection>& theTCCollection,
0155 reco::BeamSpot& bs) {
0156
0157
0158
0159 LogDebug("TrackProducer") << "get the TrackCandidateCollection from the event, source is "
0160 << conf_.getParameter<edm::InputTag>("src") << "\n";
0161 theEvent.getByToken(src_, theTCCollection);
0162
0163
0164 edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
0165 theEvent.getByToken(bsSrc_, recoBeamSpotHandle);
0166 if (recoBeamSpotHandle.isValid())
0167 bs = *recoBeamSpotHandle;
0168 else
0169 edm::LogWarning("TrackProducerBase") << " BeamSpot is not valid";
0170 }
0171
0172 template <class T>
0173 void TrackProducerBase<T>::getFromEvt(edm::Event& theEvent,
0174 edm::Handle<TrackView>& theTCollection,
0175 reco::BeamSpot& bs) {
0176
0177
0178
0179 LogDebug("TrackProducer") << "get the TrackCollection from the event, source is "
0180 << conf_.getParameter<edm::InputTag>("src") << "\n";
0181 theEvent.getByToken(src_, theTCollection);
0182
0183
0184 edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
0185 theEvent.getByToken(bsSrc_, recoBeamSpotHandle);
0186 if (recoBeamSpotHandle.isValid())
0187 bs = *recoBeamSpotHandle;
0188 else
0189 edm::LogWarning("TrackProducerBase") << " BeamSpot is not valid";
0190 }
0191
0192 #include <TrackingTools/DetLayers/interface/DetLayer.h>
0193 #include <DataFormats/TrackingRecHit/interface/InvalidTrackingRecHit.h>
0194
0195 template <class T>
0196 void TrackProducerBase<T>::setSecondHitPattern(Trajectory* traj,
0197 T& track,
0198 const Propagator* prop,
0199 const MeasurementTrackerEvent* measTk,
0200 const TrackerTopology* ttopo) {
0201 using namespace std;
0202
0203 std::unique_ptr<Propagator> localProp(prop->clone());
0204
0205
0206 Chi2MeasurementEstimator estimator(30., -3.0, 0.5, 2.0, 0.5, 1.e12);
0207
0208
0209
0210 if (!traj->firstMeasurement().updatedState().isValid() || !traj->lastMeasurement().updatedState().isValid())
0211 return;
0212
0213 const FreeTrajectoryState* outerState = traj->firstMeasurement().updatedState().freeState();
0214 const FreeTrajectoryState* innerState = traj->lastMeasurement().updatedState().freeState();
0215 TrajectoryStateOnSurface const& outerTSOS = traj->firstMeasurement().updatedState();
0216 TrajectoryStateOnSurface const& innerTSOS = traj->lastMeasurement().updatedState();
0217 const DetLayer* outerLayer = traj->firstMeasurement().layer();
0218 const DetLayer* innerLayer = traj->lastMeasurement().layer();
0219
0220 if (!outerLayer || !innerLayer) {
0221
0222 edm::LogError("TrackProducer") << "the trajectory was fit/smoothed in a special case: not setting those pointers.\n"
0223 << " Filling the secondary hit patterns was requested. So I will bail out.";
0224 throw cms::Exception("TrackProducerBase")
0225 << "the trajectory was fit/smoothed in a special case: not setting those pointers.\n"
0226 << " Filling the secondary hit patterns was requested. So I will bail out.";
0227 }
0228
0229
0230 PropagationDirection dirForInnerLayers = oppositeToMomentum;
0231 PropagationDirection dirForOuterLayers = alongMomentum;
0232 auto outIn = traj->direction() != oppositeToMomentum;
0233 if (outIn) {
0234 dirForInnerLayers = alongMomentum;
0235 dirForOuterLayers = oppositeToMomentum;
0236
0237 }
0238
0239
0240
0241
0242
0243 LogDebug("TrackProducer") << "calling inner compLayers()...";
0244 auto const& innerCompLayers = (*theSchool).compatibleLayers(*innerLayer, *innerState, dirForInnerLayers);
0245 LogDebug("TrackProducer") << "calling outer compLayers()...";
0246 auto const& outerCompLayers = (*theSchool).compatibleLayers(*outerLayer, *outerState, dirForOuterLayers);
0247
0248 LogDebug("TrackProducer") << "inner DetLayer sub: " << innerLayer->subDetector() << "\n"
0249 << "outer DetLayer sub: " << outerLayer->subDetector() << "\n"
0250 << "innerstate position rho: " << innerState->position().perp()
0251 << " z: " << innerState->position().z() << "\n"
0252 << "innerstate state pT: " << innerState->momentum().perp()
0253 << " pz: " << innerState->momentum().z() << "\n"
0254 << "outerstate position rho: " << outerState->position().perp()
0255 << " z: " << outerState->position().z() << "\n"
0256 << "outerstate state pT: " << outerState->momentum().perp()
0257 << " pz: " << outerState->momentum().z() << "\n"
0258
0259 << "innerLayers: " << innerCompLayers.size() << "\n"
0260 << "outerLayers: " << outerCompLayers.size() << "\n";
0261
0262 auto loopOverLayer =
0263 [&](decltype(innerCompLayers) compLayers, TrajectoryStateOnSurface const& tsos) {
0264 for (auto it : compLayers) {
0265 if (it->basicComponents().empty()) {
0266
0267 edm::LogWarning("TrackProducer")
0268 << "a detlayer with no components: I cannot figure out a DetId from this layer. please investigate.";
0269 continue;
0270 }
0271 auto const& detWithState = it->compatibleDets(tsos, *localProp, estimator);
0272 if (detWithState.empty())
0273 continue;
0274 DetId id = detWithState.front().first->geographicalId();
0275 MeasurementDetWithData const& measDet = measTk->idToDet(id);
0276 if (measDet.isActive() && !measDet.hasBadComponents(detWithState.front().second)) {
0277 InvalidTrackingRecHit tmpHit(*detWithState.front().first,
0278 outIn ? TrackingRecHit::missing_outer : TrackingRecHit::missing_inner);
0279 track.appendHitPattern(tmpHit, *ttopo);
0280
0281 } else {
0282
0283 InvalidTrackingRecHit tmpHit(*detWithState.front().first,
0284 outIn ? TrackingRecHit::inactive_outer : TrackingRecHit::inactive_inner);
0285 track.appendHitPattern(tmpHit, *ttopo);
0286 }
0287 }
0288 };
0289
0290 localProp->setPropagationDirection(oppositeToMomentum);
0291 loopOverLayer(innerCompLayers, innerTSOS);
0292
0293 localProp->setPropagationDirection(alongMomentum);
0294 outIn = !outIn;
0295 loopOverLayer(outerCompLayers, outerTSOS);
0296 }