File indexing completed on 2024-04-06 12:30:47
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #include "SeedToTrackProducer.h"
0022
0023 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0024 #include "Geometry/Records/interface/TrackerTopologyRcd.h"
0025
0026
0027
0028
0029 SeedToTrackProducer::SeedToTrackProducer(const edm::ParameterSet &iConfig)
0030 : theMGFieldToken(esConsumes()), theTrackingGeometryToken(esConsumes()), theTopoToken(esConsumes()) {
0031 L2seedsTagT_ = consumes<TrajectorySeedCollection>(iConfig.getParameter<edm::InputTag>("L2seedsCollection"));
0032 L2seedsTagS_ = consumes<edm::View<TrajectorySeed>>(iConfig.getParameter<edm::InputTag>("L2seedsCollection"));
0033
0034 produces<reco::TrackCollection>();
0035 produces<reco::TrackExtraCollection>();
0036 produces<TrackingRecHitCollection>();
0037 }
0038
0039
0040
0041
0042
0043
0044 void SeedToTrackProducer::produce(edm::StreamID, edm::Event &iEvent, const edm::EventSetup &iSetup) const {
0045 using namespace edm;
0046 using namespace std;
0047
0048 std::unique_ptr<reco::TrackCollection> selectedTracks(new reco::TrackCollection);
0049 std::unique_ptr<reco::TrackExtraCollection> selectedTrackExtras(new reco::TrackExtraCollection());
0050 std::unique_ptr<TrackingRecHitCollection> selectedTrackHits(new TrackingRecHitCollection());
0051
0052 reco::TrackRefProd rTracks = iEvent.getRefBeforePut<reco::TrackCollection>();
0053 reco::TrackExtraRefProd rTrackExtras = iEvent.getRefBeforePut<reco::TrackExtraCollection>();
0054 TrackingRecHitRefProd rHits = iEvent.getRefBeforePut<TrackingRecHitCollection>();
0055
0056 edm::Ref<reco::TrackExtraCollection>::key_type hidx = 0;
0057 edm::Ref<reco::TrackExtraCollection>::key_type idx = 0;
0058
0059
0060 auto const &mgField = iSetup.getData(theMGFieldToken);
0061 auto const &trackingGeometry = iSetup.getData(theTrackingGeometryToken);
0062
0063 const TrackerTopology &ttopo = iSetup.getData(theTopoToken);
0064
0065
0066 edm::Handle<TrajectorySeedCollection> L2seedsCollection;
0067 iEvent.getByToken(L2seedsTagT_, L2seedsCollection);
0068 const std::vector<TrajectorySeed> *L2seeds = nullptr;
0069 if (L2seedsCollection.isValid())
0070 L2seeds = L2seedsCollection.product();
0071 else
0072 edm::LogError("SeedToTrackProducer") << "L2 seeds collection not found !! " << endl;
0073
0074 edm::Handle<edm::View<TrajectorySeed>> seedHandle;
0075 iEvent.getByToken(L2seedsTagS_, seedHandle);
0076
0077
0078 for (unsigned int i = 0; i < L2seeds->size(); i++) {
0079
0080 TrajectoryStateOnSurface theTrajectory = seedTransientState(L2seeds->at(i), mgField, trackingGeometry);
0081 float seedEta = theTrajectory.globalMomentum().eta();
0082 float seedPhi = theTrajectory.globalMomentum().phi();
0083 float seedPt = theTrajectory.globalMomentum().perp();
0084 CovarianceMatrix matrixSeedErr = theTrajectory.curvilinearError().matrix();
0085 edm::LogVerbatim("SeedToTrackProducer")
0086 << "seedPt=" << seedPt << " seedEta=" << seedEta << " seedPhi=" << seedPhi << endl;
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096 math::XYZPoint initPoint(0, 0, 0);
0097 math::XYZVector initMom(seedPt * cos(seedPhi), seedPt * sin(seedPhi), seedPt * sinh(seedEta));
0098 reco::Track theTrack(1,
0099 1,
0100 initPoint,
0101 initMom,
0102 1,
0103 matrixSeedErr,
0104 reco::TrackBase::TrackAlgorithm::globalMuon,
0105 reco::TrackBase::TrackQuality::tight);
0106
0107
0108 math::XYZPoint dummyFinalPoint(1, 1, 1);
0109 math::XYZVector dummyFinalMom(0, 0, 10);
0110 edm::RefToBase<TrajectorySeed> seed(seedHandle, i);
0111 CovarianceMatrix matrixExtra = ROOT::Math::SMatrixIdentity();
0112 reco::TrackExtra theTrackExtra(dummyFinalPoint,
0113 dummyFinalMom,
0114 true,
0115 initPoint,
0116 initMom,
0117 true,
0118 matrixSeedErr,
0119 1,
0120 matrixExtra,
0121 2,
0122 (L2seeds->at(i)).direction(),
0123 seed);
0124 theTrack.setExtra(reco::TrackExtraRef(rTrackExtras, idx++));
0125 edm::LogVerbatim("SeedToTrackProducer")
0126 << "trackPt=" << theTrack.pt() << " trackEta=" << theTrack.eta() << " trackPhi=" << theTrack.phi() << endl;
0127 edm::LogVerbatim("SeedToTrackProducer")
0128 << "trackPtError=" << theTrack.ptError() << "trackPhiError=" << theTrack.phiError() << endl;
0129
0130
0131 unsigned int nHitsAdded = 0;
0132 for (auto const &recHit : L2seeds->at(i).recHits()) {
0133 TrackingRecHit *hit = recHit.clone();
0134 theTrack.appendHitPattern(*hit, ttopo);
0135 selectedTrackHits->push_back(hit);
0136 nHitsAdded++;
0137 }
0138 theTrackExtra.setHits(rHits, hidx, nHitsAdded);
0139 hidx += nHitsAdded;
0140 selectedTracks->push_back(theTrack);
0141 selectedTrackExtras->push_back(theTrackExtra);
0142 }
0143 iEvent.put(std::move(selectedTracks));
0144 iEvent.put(std::move(selectedTrackExtras));
0145 iEvent.put(std::move(selectedTrackHits));
0146 }
0147
0148 TrajectoryStateOnSurface SeedToTrackProducer::seedTransientState(const TrajectorySeed &tmpSeed,
0149 const MagneticField &mgField,
0150 const GlobalTrackingGeometry &trackingGeometry) const {
0151 PTrajectoryStateOnDet tmpTSOD = tmpSeed.startingState();
0152 DetId tmpDetId(tmpTSOD.detId());
0153 const GeomDet *tmpGeomDet = trackingGeometry.idToDet(tmpDetId);
0154 TrajectoryStateOnSurface tmpTSOS =
0155 trajectoryStateTransform::transientState(tmpTSOD, &(tmpGeomDet->surface()), &mgField);
0156 return tmpTSOS;
0157 }
0158
0159
0160 DEFINE_FWK_MODULE(SeedToTrackProducer);