Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:29:01

0001 #include "FWCore/Framework/interface/ESProducer.h"
0002 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0003 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
0004 #include "Geometry/CommonDetUnit/interface/TrackingGeometry.h"
0005 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0006 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h"
0007 #include "RecoLocalTracker/Records/interface/TrackerCPERecord.h"
0008 #include "RecoLocalTracker/ClusterParameterEstimator/interface/StripClusterParameterEstimator.h"
0009 #include "RecoLocalTracker/ClusterParameterEstimator/interface/PixelClusterParameterEstimator.h"
0010 #include "RecoLocalTracker/SiStripRecHitConverter/interface/SiStripRecHitMatcher.h"
0011 #include "RecoLocalTracker/ClusterParameterEstimator/interface/ClusterParameterEstimator.h"
0012 #include "RecoTracker/TransientTrackingRecHit/interface/TkTransientTrackingRecHitBuilder.h"
0013 
0014 #include "MagneticField/Engine/interface/MagneticField.h"
0015 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0016 
0017 #include "RecoLocalTracker/Phase2TrackerRecHits/interface/Phase2StripCPE.h"
0018 
0019 #include "FWCore/Framework/interface/EventSetup.h"
0020 #include "FWCore/Framework/interface/ESHandle.h"
0021 #include "FWCore/Framework/interface/ModuleFactory.h"
0022 #include "FWCore/Utilities/interface/ESGetToken.h"
0023 
0024 #include <string>
0025 #include <memory>
0026 #include <optional>
0027 
0028 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0029 
0030 class TkTransientTrackingRecHitBuilderESProducer : public edm::ESProducer {
0031 public:
0032   TkTransientTrackingRecHitBuilderESProducer(const edm::ParameterSet& p);
0033 
0034   std::unique_ptr<TransientTrackingRecHitBuilder> produce(const TransientRecHitRecord&);
0035 
0036   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0037 
0038 private:
0039   const std::string pname_;
0040   std::optional<edm::ESGetToken<StripClusterParameterEstimator, TkStripCPERecord>> spToken_;
0041   std::optional<edm::ESGetToken<PixelClusterParameterEstimator, TkPixelCPERecord>> ppToken_;
0042   std::optional<edm::ESGetToken<SiStripRecHitMatcher, TkStripCPERecord>> mpToken_;
0043   edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> geomToken_;
0044   std::optional<edm::ESGetToken<ClusterParameterEstimator<Phase2TrackerCluster1D>, TkPhase2OTCPERecord>> p2OTToken_;
0045   bool const computeCoarseLocalPositionFromDisk_;
0046 };
0047 
0048 using namespace edm;
0049 
0050 TkTransientTrackingRecHitBuilderESProducer::TkTransientTrackingRecHitBuilderESProducer(const edm::ParameterSet& p)
0051     : pname_(p.getParameter<std::string>("PixelCPE")),
0052       computeCoarseLocalPositionFromDisk_(p.getParameter<bool>("ComputeCoarseLocalPositionFromDisk")) {
0053   std::string const myname = p.getParameter<std::string>("ComponentName");
0054   auto c = setWhatProduced(this, myname);
0055   geomToken_ = c.consumes();
0056 
0057   std::string const sname = p.getParameter<std::string>("StripCPE");
0058   if (sname != "Fake") {
0059     spToken_ = c.consumes(edm::ESInputTag("", sname));
0060   }
0061 
0062   if (pname_ != "Fake") {
0063     ppToken_ = c.consumes(edm::ESInputTag("", pname_));
0064   }
0065 
0066   auto const mname = p.getParameter<std::string>("Matcher");
0067   if (mname != "Fake") {
0068     mpToken_ = c.consumes(edm::ESInputTag("", mname));
0069   }
0070 
0071   auto const P2otname = p.getParameter<std::string>("Phase2StripCPE");
0072   if (!P2otname.empty()) {
0073     p2OTToken_ = c.consumes(edm::ESInputTag("", P2otname));
0074   }
0075 }
0076 
0077 std::unique_ptr<TransientTrackingRecHitBuilder> TkTransientTrackingRecHitBuilderESProducer::produce(
0078     const TransientRecHitRecord& iRecord) {
0079   if (pname_ == "PixelCPEFast") {
0080     edm::LogWarning("TkTransientTrackingRecHitBuilderESProducer")
0081         << "\n\t\t WARNING!\n 'PixelCPEFast' has been chosen as PixelCPE choice.\n"
0082         << " Track angles will NOT be used in the CPE estimation!\n";
0083   }
0084 
0085   const StripClusterParameterEstimator* sp = nullptr;
0086   if (spToken_ && !p2OTToken_) {  // no strips in Phase-2
0087     sp = &iRecord.get(*spToken_);
0088   }
0089 
0090   const PixelClusterParameterEstimator* pp = nullptr;
0091   if (ppToken_) {
0092     pp = &iRecord.get(*ppToken_);
0093   }
0094 
0095   const SiStripRecHitMatcher* mp = nullptr;
0096   if (mpToken_) {
0097     mp = &iRecord.get(*mpToken_);
0098   }
0099 
0100   if (computeCoarseLocalPositionFromDisk_)
0101     edm::LogWarning("TkTransientTrackingRecHitBuilderESProducer")
0102         << " The tracking rec hit positions and errors are not a persistent in data formats.\n"
0103         << " They are not available from disk.\n"
0104         << " However, TkTransientTrackingRecHitBuilderESProducer::ComputeCoarseLocalPositionFromDisk=True \n"
0105         << " will make the coarse estimation of this position/error available without track refit.\n"
0106         << " Position/error obtained from rechit with already defined position/error are not recomputed.\n"
0107         << " Position/error obtained from track refit are precise.";
0108 
0109   auto const& dd = iRecord.get(geomToken_);
0110 
0111   //For Phase2 upgrade
0112   if (p2OTToken_) {
0113     return std::make_unique<TkTransientTrackingRecHitBuilder>(&dd, pp, &iRecord.get(*p2OTToken_));
0114   }
0115   return std::make_unique<TkTransientTrackingRecHitBuilder>(&dd, pp, sp, mp, computeCoarseLocalPositionFromDisk_);
0116 }
0117 
0118 void TkTransientTrackingRecHitBuilderESProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0119   edm::ParameterSetDescription desc;
0120   desc.add<std::string>("ComponentName", "Fake");
0121   desc.add<bool>("ComputeCoarseLocalPositionFromDisk", false);
0122   desc.add<std::string>("StripCPE", "Fake")->setComment("Using \"Fake\" disables use of StripCPE");
0123   desc.add<std::string>("PixelCPE", "Fake")->setComment("Using \"Fake\" disables use of PixelCPE");
0124   desc.add<std::string>("Matcher", "Fake")->setComment("Using \"Fake\" disables use of SiStripRecHitMatcher");
0125   desc.add<std::string>("Phase2StripCPE", "")->setComment("Using empty string disables use of Phase2StripCPE");
0126   descriptions.addWithDefaultLabel(desc);
0127 }
0128 
0129 DEFINE_FWK_EVENTSETUP_MODULE(TkTransientTrackingRecHitBuilderESProducer);