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_) {
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
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);