File indexing completed on 2024-11-19 23:20:20
0001 #include "FWCore/Framework/interface/global/EDProducer.h"
0002
0003 #include "FWCore/Framework/interface/Event.h"
0004 #include "FWCore/Framework/interface/MakerMacros.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0006
0007 #include "FWCore/Utilities/interface/transform.h"
0008
0009 #include "MagneticField/Engine/interface/MagneticField.h"
0010 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0011
0012 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2DCollection.h"
0013 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
0014
0015 #include "Validation/RecoTrack/interface/trackFromSeedFitFailed.h"
0016
0017 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
0018 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
0019 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h"
0020
0021 #include "RecoTracker/LST/interface/LSTPixelSeedInput.h"
0022
0023 class LSTPixelSeedInputProducer : public edm::global::EDProducer<> {
0024 public:
0025 explicit LSTPixelSeedInputProducer(edm::ParameterSet const& iConfig);
0026 ~LSTPixelSeedInputProducer() override = default;
0027
0028 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0029
0030 private:
0031 void produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const override;
0032
0033 const edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> mfToken_;
0034 const edm::EDGetTokenT<reco::BeamSpot> beamSpotToken_;
0035 std::vector<edm::EDGetTokenT<edm::View<reco::Track>>> seedTokens_;
0036 const edm::EDPutTokenT<LSTPixelSeedInput> lstPixelSeedInputPutToken_;
0037 const edm::EDPutTokenT<TrajectorySeedCollection> lstPixelSeedsPutToken_;
0038 };
0039
0040 LSTPixelSeedInputProducer::LSTPixelSeedInputProducer(edm::ParameterSet const& iConfig)
0041 : mfToken_(esConsumes()),
0042 beamSpotToken_(consumes(iConfig.getParameter<edm::InputTag>("beamSpot"))),
0043 lstPixelSeedInputPutToken_(produces()),
0044 lstPixelSeedsPutToken_(produces()) {
0045 seedTokens_ = edm::vector_transform(iConfig.getParameter<std::vector<edm::InputTag>>("seedTracks"),
0046 [&](const edm::InputTag& tag) { return consumes<edm::View<reco::Track>>(tag); });
0047 }
0048
0049 void LSTPixelSeedInputProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0050 edm::ParameterSetDescription desc;
0051
0052 desc.add<edm::InputTag>("beamSpot", edm::InputTag("offlineBeamSpot"));
0053
0054 desc.add<std::vector<edm::InputTag>>("seedTracks",
0055 std::vector<edm::InputTag>{edm::InputTag("lstInitialStepSeedTracks"),
0056 edm::InputTag("lstHighPtTripletStepSeedTracks")});
0057
0058 descriptions.addWithDefaultLabel(desc);
0059 }
0060
0061 void LSTPixelSeedInputProducer::produce(edm::StreamID iID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
0062
0063 auto const& mf = iSetup.getData(mfToken_);
0064 auto const& bs = iEvent.get(beamSpotToken_);
0065
0066
0067 std::vector<float> see_px;
0068 std::vector<float> see_py;
0069 std::vector<float> see_pz;
0070 std::vector<float> see_dxy;
0071 std::vector<float> see_dz;
0072 std::vector<float> see_ptErr;
0073 std::vector<float> see_etaErr;
0074 std::vector<float> see_stateTrajGlbX;
0075 std::vector<float> see_stateTrajGlbY;
0076 std::vector<float> see_stateTrajGlbZ;
0077 std::vector<float> see_stateTrajGlbPx;
0078 std::vector<float> see_stateTrajGlbPy;
0079 std::vector<float> see_stateTrajGlbPz;
0080 std::vector<int> see_q;
0081 std::vector<std::vector<int>> see_hitIdx;
0082 TrajectorySeedCollection see_seeds;
0083
0084 for (size_t iColl = 0; iColl < seedTokens_.size(); ++iColl) {
0085
0086 auto const& seedToken = seedTokens_[iColl];
0087 auto const& seedTracks = iEvent.get(seedToken);
0088
0089 if (seedTracks.empty())
0090 continue;
0091
0092
0093 edm::RefToBaseVector<reco::Track> seedTrackRefs;
0094 for (edm::View<reco::Track>::size_type i = 0; i < seedTracks.size(); ++i) {
0095 seedTrackRefs.push_back(seedTracks.refAt(i));
0096 }
0097
0098 edm::ProductID id = seedTracks[0].seedRef().id();
0099
0100 for (size_t iSeed = 0; iSeed < seedTrackRefs.size(); ++iSeed) {
0101 auto const& seedTrackRef = seedTrackRefs[iSeed];
0102 auto const& seedTrack = *seedTrackRef;
0103 auto const& seedRef = seedTrack.seedRef();
0104 auto const& seed = *seedRef;
0105
0106 if (seedRef.id() != id)
0107 throw cms::Exception("LogicError")
0108 << "All tracks in 'TracksFromSeeds' collection should point to seeds in the same collection. Now the "
0109 "element 0 had ProductID "
0110 << id << " while the element " << seedTrackRef.key() << " had " << seedTrackRef.id() << ".";
0111
0112 const bool seedFitOk = !trackFromSeedFitFailed(seedTrack);
0113
0114 const TrackingRecHit* lastRecHit = &*(seed.recHits().end() - 1);
0115 TrajectoryStateOnSurface tsos =
0116 trajectoryStateTransform::transientState(seed.startingState(), lastRecHit->surface(), &mf);
0117 auto const& stateGlobal = tsos.globalParameters();
0118
0119 std::vector<int> hitIdx;
0120 for (auto const& hit : seed.recHits()) {
0121 int subid = hit.geographicalId().subdetId();
0122 if (subid == (int)PixelSubdetector::PixelBarrel || subid == (int)PixelSubdetector::PixelEndcap) {
0123 const BaseTrackerRecHit* bhit = dynamic_cast<const BaseTrackerRecHit*>(&hit);
0124 const auto& clusterRef = bhit->firstClusterRef();
0125 const auto clusterKey = clusterRef.cluster_pixel().key();
0126 hitIdx.push_back(clusterKey);
0127 } else {
0128 throw cms::Exception("LSTPixelSeedInputProducer") << "Not pixel hits found!";
0129 }
0130 }
0131
0132
0133 see_px.push_back(seedFitOk ? seedTrack.px() : 0);
0134 see_py.push_back(seedFitOk ? seedTrack.py() : 0);
0135 see_pz.push_back(seedFitOk ? seedTrack.pz() : 0);
0136 see_dxy.push_back(seedFitOk ? seedTrack.dxy(bs.position()) : 0);
0137 see_dz.push_back(seedFitOk ? seedTrack.dz(bs.position()) : 0);
0138 see_ptErr.push_back(seedFitOk ? seedTrack.ptError() : 0);
0139 see_etaErr.push_back(seedFitOk ? seedTrack.etaError() : 0);
0140 see_stateTrajGlbX.push_back(stateGlobal.position().x());
0141 see_stateTrajGlbY.push_back(stateGlobal.position().y());
0142 see_stateTrajGlbZ.push_back(stateGlobal.position().z());
0143 see_stateTrajGlbPx.push_back(stateGlobal.momentum().x());
0144 see_stateTrajGlbPy.push_back(stateGlobal.momentum().y());
0145 see_stateTrajGlbPz.push_back(stateGlobal.momentum().z());
0146 see_q.push_back(seedTrack.charge());
0147 see_hitIdx.push_back(hitIdx);
0148 see_seeds.push_back(seed);
0149 }
0150 }
0151
0152 LSTPixelSeedInput pixelSeedInput(std::move(see_px),
0153 std::move(see_py),
0154 std::move(see_pz),
0155 std::move(see_dxy),
0156 std::move(see_dz),
0157 std::move(see_ptErr),
0158 std::move(see_etaErr),
0159 std::move(see_stateTrajGlbX),
0160 std::move(see_stateTrajGlbY),
0161 std::move(see_stateTrajGlbZ),
0162 std::move(see_stateTrajGlbPx),
0163 std::move(see_stateTrajGlbPy),
0164 std::move(see_stateTrajGlbPz),
0165 std::move(see_q),
0166 std::move(see_hitIdx));
0167 iEvent.emplace(lstPixelSeedInputPutToken_, std::move(pixelSeedInput));
0168 iEvent.emplace(lstPixelSeedsPutToken_, std::move(see_seeds));
0169 }
0170
0171 DEFINE_FWK_MODULE(LSTPixelSeedInputProducer);