Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-08 03:36:31

0001 #include "DataFormats/ParticleFlowReco/interface/PFRecTrack.h"
0002 #include "DataFormats/TrackReco/interface/Track.h"
0003 #include "FWCore/Framework/interface/ESHandle.h"
0004 #include "FWCore/Framework/interface/Event.h"
0005 #include "FWCore/Framework/interface/stream/EDProducer.h"
0006 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0009 #include "MagneticField/Engine/interface/MagneticField.h"
0010 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0011 #include "RecoParticleFlow/PFTracking/interface/PFTrackTransformer.h"
0012 #include "TrackingTools/PatternTools/interface/Trajectory.h"
0013 
0014 class LightPFTrackProducer : public edm::stream::EDProducer<> {
0015 public:
0016   ///Constructor
0017   explicit LightPFTrackProducer(const edm::ParameterSet&);
0018 
0019   ///Destructor
0020   ~LightPFTrackProducer() override;
0021 
0022   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0023 
0024 private:
0025   void beginRun(const edm::Run&, const edm::EventSetup&) override;
0026   void endRun(const edm::Run&, const edm::EventSetup&) override;
0027 
0028   ///Produce the PFRecTrack collection
0029   void produce(edm::Event&, const edm::EventSetup&) override;
0030 
0031   ///PFTrackTransformer
0032   PFTrackTransformer* pfTransformer_;
0033   std::vector<edm::EDGetTokenT<reco::TrackCollection>> tracksContainers_;
0034 
0035   const edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> magneticFieldToken_;
0036   ///TRACK QUALITY
0037   bool useQuality_;
0038   reco::TrackBase::TrackQuality trackQuality_;
0039 };
0040 
0041 #include "FWCore/Framework/interface/MakerMacros.h"
0042 DEFINE_FWK_MODULE(LightPFTrackProducer);
0043 
0044 void LightPFTrackProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0045   edm::ParameterSetDescription desc;
0046   desc.add<std::string>("TrackQuality", "highPurity");
0047   desc.add<bool>("UseQuality", true);
0048   desc.add<std::vector<edm::InputTag>>(
0049       "TkColList", {edm::InputTag("generalTracks"), edm::InputTag("secStep"), edm::InputTag("thStep")});
0050   descriptions.add("lightpftrack", desc);
0051 }
0052 
0053 using namespace std;
0054 using namespace edm;
0055 LightPFTrackProducer::LightPFTrackProducer(const ParameterSet& iConfig)
0056     : pfTransformer_(nullptr), magneticFieldToken_(esConsumes<edm::Transition::BeginRun>()) {
0057   produces<reco::PFRecTrackCollection>();
0058 
0059   std::vector<InputTag> tags = iConfig.getParameter<vector<InputTag>>("TkColList");
0060 
0061   for (unsigned int i = 0; i < tags.size(); ++i)
0062     tracksContainers_.push_back(consumes<reco::TrackCollection>(tags[i]));
0063 
0064   useQuality_ = iConfig.getParameter<bool>("UseQuality");
0065   trackQuality_ = reco::TrackBase::qualityByName(iConfig.getParameter<std::string>("TrackQuality"));
0066 }
0067 
0068 LightPFTrackProducer::~LightPFTrackProducer() { delete pfTransformer_; }
0069 
0070 void LightPFTrackProducer::produce(Event& iEvent, const EventSetup& iSetup) {
0071   //create the empty collections
0072   auto PfTrColl = std::make_unique<reco::PFRecTrackCollection>();
0073 
0074   for (unsigned int istr = 0; istr < tracksContainers_.size(); istr++) {
0075     //Track collection
0076     Handle<reco::TrackCollection> tkRefCollection;
0077     iEvent.getByToken(tracksContainers_[istr], tkRefCollection);
0078     reco::TrackCollection Tk = *(tkRefCollection.product());
0079     for (unsigned int i = 0; i < Tk.size(); i++) {
0080       if (useQuality_ && (!(Tk[i].quality(trackQuality_))))
0081         continue;
0082       reco::TrackRef trackRef(tkRefCollection, i);
0083       reco::PFRecTrack pftrack(trackRef->charge(), reco::PFRecTrack::KF, i, trackRef);
0084       Trajectory FakeTraj;
0085       bool mymsgwarning = false;
0086       bool valid = pfTransformer_->addPoints(pftrack, *trackRef, FakeTraj, mymsgwarning);
0087       if (valid)
0088         PfTrColl->push_back(pftrack);
0089     }
0090   }
0091   iEvent.put(std::move(PfTrColl));
0092 }
0093 
0094 // ------------ method called once each job just before starting event loop  ------------
0095 void LightPFTrackProducer::beginRun(const edm::Run& run, const EventSetup& iSetup) {
0096   auto const& magneticField = &iSetup.getData(magneticFieldToken_);
0097   pfTransformer_ = new PFTrackTransformer(math::XYZVector(magneticField->inTesla(GlobalPoint(0, 0, 0))));
0098   pfTransformer_->OnlyProp();
0099 }
0100 
0101 // ------------ method called once each job just after ending the event loop  ------------
0102 void LightPFTrackProducer::endRun(const edm::Run& run, const EventSetup& iSetup) {
0103   delete pfTransformer_;
0104   pfTransformer_ = nullptr;
0105 }