File indexing completed on 2024-04-06 12:28:57
0001 #ifndef PointSeededTrackingRegionsProducer_h
0002 #define PointSeededTrackingRegionsProducer_h
0003
0004 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegionProducer.h"
0005 #include "RecoTracker/TkTrackingRegions/interface/RectangularEtaPhiTrackingRegion.h"
0006 #include "RecoTracker/MeasurementDet/interface/MeasurementTrackerEvent.h"
0007
0008 #include "FWCore/Framework/interface/Event.h"
0009 #include "FWCore/Framework/interface/EventSetup.h"
0010 #include "FWCore/Utilities/interface/InputTag.h"
0011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0012 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0013 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0014 #include "FWCore/Framework/interface/ConsumesCollector.h"
0015 #include "DataFormats/Common/interface/Handle.h"
0016 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
0017 #include "DataFormats/VertexReco/interface/Vertex.h"
0018 #include "DataFormats/VertexReco/interface/VertexFwd.h"
0019 #include "DataFormats/Candidate/interface/Candidate.h"
0020 #include "MagneticField/Engine/interface/MagneticField.h"
0021 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0022 #include "RecoTracker/Record/interface/TrackerMultipleScatteringRecord.h"
0023 #include "RecoTracker/TkMSParametrization/interface/MultipleScatteringParametrisationMaker.h"
0024
0025 #include <TMath.h>
0026 #include <TLorentzVector.h>
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 class PointSeededTrackingRegionsProducer : public TrackingRegionProducer {
0053 public:
0054 typedef enum { BEAM_SPOT_FIXED, BEAM_SPOT_SIGMA, VERTICES_FIXED, VERTICES_SIGMA } Mode;
0055
0056 explicit PointSeededTrackingRegionsProducer(const edm::ParameterSet& conf, edm::ConsumesCollector&& iC)
0057 : token_field(iC.esConsumes()) {
0058 edm::ParameterSet regPSet = conf.getParameter<edm::ParameterSet>("RegionPSet");
0059
0060
0061 std::string modeString = regPSet.getParameter<std::string>("mode");
0062 if (modeString == "BeamSpotFixed")
0063 m_mode = BEAM_SPOT_FIXED;
0064 else if (modeString == "BeamSpotSigma")
0065 m_mode = BEAM_SPOT_SIGMA;
0066 else if (modeString == "VerticesFixed")
0067 m_mode = VERTICES_FIXED;
0068 else if (modeString == "VerticesSigma")
0069 m_mode = VERTICES_SIGMA;
0070 else
0071 edm::LogError("PointSeededTrackingRegionsProducer") << "Unknown mode string: " << modeString;
0072
0073
0074 edm::ParameterSet points = regPSet.getParameter<edm::ParameterSet>("points");
0075 etaPoints = points.getParameter<std::vector<double>>("eta");
0076 phiPoints = points.getParameter<std::vector<double>>("phi");
0077 if (!(etaPoints.size() == phiPoints.size()))
0078 throw edm::Exception(edm::errors::Configuration) << "The parameters 'eta' and 'phi' must have the same size";
0079 ;
0080 m_maxNRegions = regPSet.getParameter<int>("maxNRegions");
0081 token_beamSpot = iC.consumes<reco::BeamSpot>(regPSet.getParameter<edm::InputTag>("beamSpot"));
0082 m_maxNVertices = 1;
0083 if (m_mode == VERTICES_FIXED || m_mode == VERTICES_SIGMA) {
0084 token_vertex = iC.consumes<reco::VertexCollection>(regPSet.getParameter<edm::InputTag>("vertexCollection"));
0085 m_maxNVertices = regPSet.getParameter<int>("maxNVertices");
0086 }
0087
0088
0089 m_ptMin = regPSet.getParameter<double>("ptMin");
0090 m_originRadius = regPSet.getParameter<double>("originRadius");
0091 m_zErrorBeamSpot = regPSet.getParameter<double>("zErrorBeamSpot");
0092 m_deltaEta = regPSet.getParameter<double>("deltaEta");
0093 m_deltaPhi = regPSet.getParameter<double>("deltaPhi");
0094 m_precise = regPSet.getParameter<bool>("precise");
0095 m_whereToUseMeasurementTracker = RectangularEtaPhiTrackingRegion::stringToUseMeasurementTracker(
0096 regPSet.getParameter<std::string>("whereToUseMeasurementTracker"));
0097 if (m_whereToUseMeasurementTracker != RectangularEtaPhiTrackingRegion::UseMeasurementTracker::kNever) {
0098 token_measurementTracker =
0099 iC.consumes<MeasurementTrackerEvent>(regPSet.getParameter<edm::InputTag>("measurementTrackerName"));
0100 }
0101 m_searchOpt = false;
0102 if (regPSet.exists("searchOpt"))
0103 m_searchOpt = regPSet.getParameter<bool>("searchOpt");
0104
0105
0106 if (m_mode == VERTICES_SIGMA)
0107 m_nSigmaZVertex = regPSet.getParameter<double>("nSigmaZVertex");
0108 if (m_mode == VERTICES_FIXED)
0109 m_zErrorVetex = regPSet.getParameter<double>("zErrorVetex");
0110 m_nSigmaZBeamSpot = -1.;
0111 if (m_mode == BEAM_SPOT_SIGMA) {
0112 m_nSigmaZBeamSpot = regPSet.getParameter<double>("nSigmaZBeamSpot");
0113 if (m_nSigmaZBeamSpot < 0.)
0114 edm::LogError("PointSeededTrackingRegionsProducer")
0115 << "nSigmaZBeamSpot must be positive for BeamSpotSigma mode!";
0116 }
0117
0118 if (m_precise) {
0119 token_msmaker = iC.esConsumes();
0120 }
0121 }
0122
0123 ~PointSeededTrackingRegionsProducer() override {}
0124
0125 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0126 edm::ParameterSetDescription desc;
0127
0128 edm::ParameterSetDescription descPoints;
0129 descPoints.add<std::vector<double>>("eta", {0.});
0130 descPoints.add<std::vector<double>>("phi", {0.});
0131 desc.add<edm::ParameterSetDescription>("points", descPoints);
0132
0133 desc.add<std::string>("mode", "BeamSpotFixed");
0134 desc.add<int>("maxNRegions", 10);
0135 desc.add<edm::InputTag>("beamSpot", edm::InputTag("hltOnlineBeamSpot"));
0136 desc.add<edm::InputTag>("vertexCollection", edm::InputTag("hltPixelVertices"));
0137 desc.add<int>("maxNVertices", 1);
0138
0139 desc.add<double>("ptMin", 0.9);
0140 desc.add<double>("originRadius", 0.2);
0141 desc.add<double>("zErrorBeamSpot", 24.2);
0142 desc.add<double>("deltaEta", 0.5);
0143 desc.add<double>("deltaPhi", 0.5);
0144 desc.add<bool>("precise", true);
0145
0146 desc.add<double>("nSigmaZVertex", 3.);
0147 desc.add<double>("zErrorVetex", 0.2);
0148 desc.add<double>("nSigmaZBeamSpot", 4.);
0149
0150 desc.add<std::string>("whereToUseMeasurementTracker", "ForSiStrips");
0151 desc.add<edm::InputTag>("measurementTrackerName", edm::InputTag(""));
0152
0153 desc.add<bool>("searchOpt", false);
0154
0155
0156 edm::ParameterSetDescription descRegion;
0157 descRegion.add<edm::ParameterSetDescription>("RegionPSet", desc);
0158
0159
0160
0161 descriptions.add("pointSeededTrackingRegion", descRegion);
0162 }
0163
0164 std::vector<std::unique_ptr<TrackingRegion>> regions(const edm::Event& e, const edm::EventSetup& es) const override {
0165 std::vector<std::unique_ptr<TrackingRegion>> result;
0166
0167
0168 edm::Handle<reco::BeamSpot> bs;
0169 e.getByToken(token_beamSpot, bs);
0170 if (!bs.isValid())
0171 return result;
0172
0173 const auto& field = es.getData(token_field);
0174 const MultipleScatteringParametrisationMaker* msmaker = nullptr;
0175 if (m_precise) {
0176 msmaker = &es.getData(token_msmaker);
0177 }
0178
0179
0180 GlobalPoint default_origin(bs->x0(), bs->y0(), bs->z0());
0181
0182
0183 std::vector<std::pair<GlobalPoint, float>> origins;
0184
0185
0186 if (m_mode == BEAM_SPOT_FIXED || m_mode == BEAM_SPOT_SIGMA) {
0187 origins.push_back(std::make_pair(
0188 default_origin, (m_mode == BEAM_SPOT_FIXED) ? m_zErrorBeamSpot : m_nSigmaZBeamSpot * bs->sigmaZ()));
0189 } else if (m_mode == VERTICES_FIXED || m_mode == VERTICES_SIGMA) {
0190 edm::Handle<reco::VertexCollection> vertices;
0191 e.getByToken(token_vertex, vertices);
0192 int n_vert = 0;
0193 for (reco::VertexCollection::const_iterator iv = vertices->begin(), ev = vertices->end();
0194 iv != ev && n_vert < m_maxNVertices;
0195 ++iv) {
0196 if (iv->isFake() || !iv->isValid())
0197 continue;
0198
0199 origins.push_back(std::make_pair(GlobalPoint(iv->x(), iv->y(), iv->z()),
0200 (m_mode == VERTICES_FIXED) ? m_zErrorVetex : m_nSigmaZVertex * iv->zError()));
0201 ++n_vert;
0202 }
0203
0204 if (origins.empty()) {
0205 origins.push_back(std::make_pair(
0206 default_origin, (m_nSigmaZBeamSpot > 0.) ? m_nSigmaZBeamSpot * bs->z0Error() : m_zErrorBeamSpot));
0207 }
0208 }
0209
0210 const MeasurementTrackerEvent* measurementTracker = nullptr;
0211 if (!token_measurementTracker.isUninitialized()) {
0212 edm::Handle<MeasurementTrackerEvent> hmte;
0213 e.getByToken(token_measurementTracker, hmte);
0214 measurementTracker = hmte.product();
0215 }
0216
0217
0218
0219 size_t n_points = etaPoints.size();
0220 int n_regions = 0;
0221 for (size_t i = 0; i < n_points && n_regions < m_maxNRegions; ++i) {
0222 double x = std::cos(phiPoints[i]);
0223 double y = std::sin(phiPoints[i]);
0224 double theta = 2 * std::atan(std::exp(-etaPoints[i]));
0225 double z = 1. / std::tan(theta);
0226
0227 GlobalVector direction(x, y, z);
0228
0229 for (size_t j = 0; j < origins.size() && n_regions < m_maxNRegions; ++j) {
0230 result.push_back(std::make_unique<RectangularEtaPhiTrackingRegion>(direction,
0231 origins[j].first,
0232 m_ptMin,
0233 m_originRadius,
0234 origins[j].second,
0235 m_deltaEta,
0236 m_deltaPhi,
0237 field,
0238 msmaker,
0239 m_precise,
0240 m_whereToUseMeasurementTracker,
0241 measurementTracker,
0242 m_searchOpt));
0243 ++n_regions;
0244 }
0245 }
0246 edm::LogInfo("PointSeededTrackingRegionsProducer") << "produced " << n_regions << " regions";
0247
0248 return result;
0249 }
0250
0251 private:
0252 Mode m_mode;
0253
0254 int m_maxNRegions;
0255 edm::EDGetTokenT<reco::VertexCollection> token_vertex;
0256 edm::EDGetTokenT<reco::BeamSpot> token_beamSpot;
0257 int m_maxNVertices;
0258
0259 std::vector<double> etaPoints;
0260 std::vector<double> phiPoints;
0261
0262 float m_ptMin;
0263 float m_originRadius;
0264 float m_zErrorBeamSpot;
0265 float m_deltaEta;
0266 float m_deltaPhi;
0267 bool m_precise;
0268 edm::EDGetTokenT<MeasurementTrackerEvent> token_measurementTracker;
0269 RectangularEtaPhiTrackingRegion::UseMeasurementTracker m_whereToUseMeasurementTracker;
0270 edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> token_field;
0271 edm::ESGetToken<MultipleScatteringParametrisationMaker, TrackerMultipleScatteringRecord> token_msmaker;
0272 bool m_searchOpt;
0273
0274 float m_nSigmaZVertex;
0275 float m_zErrorVetex;
0276 float m_nSigmaZBeamSpot;
0277 };
0278
0279 #endif