File indexing completed on 2025-05-09 22:40:29
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <memory>
0021
0022
0023 #include "FWCore/Framework/interface/Frameworkfwd.h"
0024 #include "FWCore/Framework/interface/ESHandle.h"
0025 #include "FWCore/Framework/interface/global/EDProducer.h"
0026
0027 #include "FWCore/Framework/interface/Event.h"
0028 #include "FWCore/Framework/interface/MakerMacros.h"
0029
0030 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0031
0032 #include "DataFormats/TrackReco/interface/Track.h"
0033 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0034 #include "DataFormats/TrajectorySeed/interface/TrajectorySeed.h"
0035 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
0036 #include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h"
0037 #include "TrackingTools/TrajectoryState/interface/PerigeeConversions.h"
0038 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h"
0039 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
0040 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0041 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
0042 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
0043 #include "Geometry/CommonDetUnit/interface/GlobalTrackingGeometry.h"
0044 #include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h"
0045
0046
0047
0048
0049
0050 class TrackFromSeedProducer : public edm::global::EDProducer<> {
0051 public:
0052 explicit TrackFromSeedProducer(const edm::ParameterSet&);
0053 ~TrackFromSeedProducer() override = default;
0054
0055 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0056
0057 private:
0058 void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
0059
0060
0061 edm::EDGetTokenT<edm::View<TrajectorySeed> > seedsToken;
0062 edm::EDGetTokenT<reco::BeamSpot> beamSpotToken;
0063 const edm::ESGetToken<GlobalTrackingGeometry, GlobalTrackingGeometryRecord> geoToken_;
0064 const edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> tTopoToken_;
0065 const edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> mfToken_;
0066 const edm::ESGetToken<TransientTrackingRecHitBuilder, TransientRecHitRecord> ttrhToken_;
0067 };
0068
0069
0070
0071
0072 TrackFromSeedProducer::TrackFromSeedProducer(const edm::ParameterSet& iConfig)
0073 : geoToken_(esConsumes()),
0074 tTopoToken_(esConsumes()),
0075 mfToken_(esConsumes()),
0076 ttrhToken_(esConsumes(edm::ESInputTag("", iConfig.getParameter<std::string>("TTRHBuilder")))) {
0077
0078 produces<reco::TrackCollection>();
0079 produces<TrackingRecHitCollection>();
0080 produces<reco::TrackExtraCollection>();
0081
0082
0083 const edm::InputTag seedsTag(iConfig.getParameter<edm::InputTag>("src"));
0084 const edm::InputTag beamSpotTag(iConfig.getParameter<edm::InputTag>("beamSpot"));
0085
0086
0087 seedsToken = consumes<edm::View<TrajectorySeed> >(seedsTag);
0088 beamSpotToken = consumes<reco::BeamSpot>(beamSpotTag);
0089 }
0090
0091
0092 void TrackFromSeedProducer::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
0093 using namespace edm;
0094 using namespace reco;
0095 using namespace std;
0096
0097
0098 unique_ptr<TrackCollection> tracks(new TrackCollection);
0099 unique_ptr<TrackingRecHitCollection> rechits(new TrackingRecHitCollection);
0100 unique_ptr<TrackExtraCollection> trackextras(new TrackExtraCollection);
0101
0102
0103 TrackExtraRefProd ref_trackextras = iEvent.getRefBeforePut<TrackExtraCollection>();
0104 TrackingRecHitRefProd ref_rechits = iEvent.getRefBeforePut<TrackingRecHitCollection>();
0105
0106
0107 Handle<edm::View<TrajectorySeed> > hseeds;
0108 iEvent.getByToken(seedsToken, hseeds);
0109 const auto& seeds = *hseeds;
0110
0111
0112 edm::Handle<reco::BeamSpot> beamSpot;
0113 iEvent.getByToken(beamSpotToken, beamSpot);
0114
0115
0116 TSCBLBuilderNoMaterial tscblBuilder;
0117
0118 const auto& tTRHBuilder = &iSetup.getData(ttrhToken_);
0119 const auto& theMF = &iSetup.getData(mfToken_);
0120 const TrackerTopology& ttopo = iSetup.getData(tTopoToken_);
0121 const GlobalTrackingGeometry* const geometry_ = &iSetup.getData(geoToken_);
0122
0123
0124 int nfailed = 0;
0125 for (size_t iSeed = 0; iSeed < seeds.size(); ++iSeed) {
0126 auto const& seed = seeds[iSeed];
0127
0128 TrajectoryStateOnSurface state;
0129 if (seed.nHits() == 0) {
0130 const Surface* deepCore_sruface = &geometry_->idToDet(seed.startingState().detId())->specificSurface();
0131 state = trajectoryStateTransform::transientState(seed.startingState(), deepCore_sruface, theMF);
0132 } else {
0133 TransientTrackingRecHit::RecHitPointer lastRecHit = tTRHBuilder->build(&*(seed.recHits().end() - 1));
0134 state = trajectoryStateTransform::transientState(seed.startingState(), lastRecHit->surface(), theMF);
0135 }
0136 TrajectoryStateClosestToBeamLine tsAtClosestApproachSeed =
0137 tscblBuilder(*state.freeState(), *beamSpot);
0138 if (tsAtClosestApproachSeed.isValid()) {
0139 const reco::TrackBase::Point vSeed1(tsAtClosestApproachSeed.trackStateAtPCA().position().x(),
0140 tsAtClosestApproachSeed.trackStateAtPCA().position().y(),
0141 tsAtClosestApproachSeed.trackStateAtPCA().position().z());
0142 const reco::TrackBase::Vector pSeed(tsAtClosestApproachSeed.trackStateAtPCA().momentum().x(),
0143 tsAtClosestApproachSeed.trackStateAtPCA().momentum().y(),
0144 tsAtClosestApproachSeed.trackStateAtPCA().momentum().z());
0145
0146 PerigeeTrajectoryError seedPerigeeErrors =
0147 PerigeeConversions::ftsToPerigeeError(tsAtClosestApproachSeed.trackStateAtPCA());
0148 tracks->emplace_back(0., 0., vSeed1, pSeed, state.charge(), seedPerigeeErrors.covarianceMatrix());
0149 } else {
0150 edm::LogVerbatim("SeedValidator") << "TrajectoryStateClosestToBeamLine not valid";
0151
0152
0153 tracks->emplace_back(
0154 -1, -1, reco::TrackBase::Point(), reco::TrackBase::Vector(), 0, reco::TrackBase::CovarianceMatrix());
0155 nfailed++;
0156 }
0157
0158 tracks->back().appendHits(seed.recHits().begin(), seed.recHits().end(), ttopo);
0159
0160 size_t firsthitindex = rechits->size();
0161 for (auto const& recHit : seed.recHits()) {
0162 rechits->push_back(recHit);
0163 }
0164
0165
0166 trackextras->push_back(TrackExtra());
0167 trackextras->back().setHits(ref_rechits, firsthitindex, rechits->size() - firsthitindex);
0168 trackextras->back().setSeedRef(edm::RefToBase<TrajectorySeed>(hseeds, iSeed));
0169
0170 tracks->back().setExtra(TrackExtraRef(ref_trackextras, trackextras->size() - 1));
0171 }
0172
0173 if (nfailed > 0) {
0174 edm::LogInfo("SeedValidator") << "failed to create tracks from " << nfailed << " out of " << seeds.size()
0175 << " seeds ";
0176 }
0177 iEvent.put(std::move(tracks));
0178 iEvent.put(std::move(rechits));
0179 iEvent.put(std::move(trackextras));
0180 }
0181
0182 void TrackFromSeedProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0183 edm::ParameterSetDescription desc;
0184 desc.add<std::string>("TTRHBuilder", {});
0185 desc.add<edm::InputTag>("src", edm::InputTag(""));
0186 desc.add<edm::InputTag>("beamSpot", edm::InputTag(""));
0187 descriptions.addWithDefaultLabel(desc);
0188 }
0189
0190
0191 DEFINE_FWK_MODULE(TrackFromSeedProducer);