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