Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // Setup
0063   auto const& mf = iSetup.getData(mfToken_);
0064   auto const& bs = iEvent.get(beamSpotToken_);
0065 
0066   // Vector definitions
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     // Get seed tokens
0086     auto const& seedToken = seedTokens_[iColl];
0087     auto const& seedTracks = iEvent.get(seedToken);
0088 
0089     if (seedTracks.empty())
0090       continue;
0091 
0092     // Get seed track refs
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       // Fill output
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);