CMS 3D CMS Logo

CandidatePointSeededTrackingRegionsProducer.h
Go to the documentation of this file.
1 #ifndef CandidatePointSeededTrackingRegionsProducer_h
2 #define CandidatePointSeededTrackingRegionsProducer_h
3 
7 
21 
22 #include "VertexBeamspotOrigins.h"
23 
59 public:
61 
63  : m_origins(conf.getParameter<edm::ParameterSet>("RegionPSet"), iC) {
64  edm::ParameterSet regPSet = conf.getParameter<edm::ParameterSet>("RegionPSet");
65 
66  // seeding mode
67  std::string seedingModeString = regPSet.getParameter<std::string>("seedingMode");
68  if (seedingModeString == "Candidate")
70  else if (seedingModeString == "Point")
72  else if (seedingModeString == "CandidatePoint")
74  else
75  throw edm::Exception(edm::errors::Configuration) << "Unknown seeding mode string: " << seedingModeString;
76 
77  // basic inputs
79  m_token_input = iC.consumes<reco::CandidateView>(regPSet.getParameter<edm::InputTag>("input"));
80 
81  // Specific points in the detector
84  std::vector<double> etaPoints = points.getParameter<std::vector<double>>("eta");
85  std::vector<double> phiPoints = points.getParameter<std::vector<double>>("phi");
86 
87  if (!(etaPoints.size() == phiPoints.size()))
88  throw edm::Exception(edm::errors::Configuration) << "The parameters 'eta' and 'phi' must have the same size";
89  if (etaPoints.empty())
91  << "At least one point should be defined for point or candidate+point seeding modes";
92 
93  for (size_t i = 0; i < etaPoints.size(); ++i) {
94  m_etaPhiPoints.push_back(std::make_pair(etaPoints[i], phiPoints[i]));
95 
96  double x = std::cos(phiPoints[i]);
97  double y = std::sin(phiPoints[i]);
98  double theta = 2 * std::atan(std::exp(-etaPoints[i]));
99  double z = 1. / std::tan(theta);
100  GlobalVector direction(x, y, z);
101  m_directionPoints.push_back(direction);
102  }
103  }
104 
105  m_maxNRegions = regPSet.getParameter<unsigned int>("maxNRegions");
106  if (m_maxNRegions == 0)
107  throw edm::Exception(edm::errors::Configuration) << "maxNRegions should be greater than or equal to 1";
108 
109  // RectangularEtaPhiTrackingRegion parameters:
110  m_ptMin = regPSet.getParameter<double>("ptMin");
111  m_originRadius = regPSet.getParameter<double>("originRadius");
112 
114  m_deltaEta_Cand = regPSet.getParameter<double>("deltaEta_Cand");
115  m_deltaPhi_Cand = regPSet.getParameter<double>("deltaPhi_Cand");
116  if (m_deltaEta_Cand < 0 || m_deltaPhi_Cand < 0)
118  << "Delta eta and phi parameters must be set for candidates in candidate seeding mode";
120  m_deltaEta_Point = regPSet.getParameter<double>("deltaEta_Point");
121  m_deltaPhi_Point = regPSet.getParameter<double>("deltaPhi_Point");
122  if (m_deltaEta_Point < 0 || m_deltaPhi_Point < 0)
124  << "Delta eta and phi parameters must be set for points in point seeding mode";
126  m_deltaEta_Cand = regPSet.getParameter<double>("deltaEta_Cand");
127  m_deltaPhi_Cand = regPSet.getParameter<double>("deltaPhi_Cand");
128  m_deltaEta_Point = regPSet.getParameter<double>("deltaEta_Point");
129  m_deltaPhi_Point = regPSet.getParameter<double>("deltaPhi_Point");
130  if (m_deltaEta_Cand < 0 || m_deltaPhi_Cand < 0 || m_deltaEta_Point < 0 || m_deltaPhi_Point < 0)
131  throw edm::Exception(edm::errors::Configuration) << "Delta eta and phi parameters must be set separately for "
132  "candidates and points in candidate+point seeding mode";
133  }
134 
135  m_precise = regPSet.getParameter<bool>("precise");
137  regPSet.getParameter<std::string>("whereToUseMeasurementTracker"));
138  if (m_whereToUseMeasurementTracker != RectangularEtaPhiTrackingRegion::UseMeasurementTracker::kNever) {
140  iC.consumes<MeasurementTrackerEvent>(regPSet.getParameter<edm::InputTag>("measurementTrackerName"));
141  }
142  m_searchOpt = false;
143  if (regPSet.exists("searchOpt"))
144  m_searchOpt = regPSet.getParameter<bool>("searchOpt");
145  }
146 
148 
151 
152  desc.add<std::string>("seedingMode", "Candidate");
153 
154  desc.add<edm::InputTag>("input", edm::InputTag(""));
155  edm::ParameterSetDescription descPoints;
156  descPoints.add<std::vector<double>>("eta", {});
157  descPoints.add<std::vector<double>>("phi", {});
158  desc.add<edm::ParameterSetDescription>("points", descPoints);
159 
160  desc.add<unsigned int>("maxNRegions", 10);
161 
162  VertexBeamspotOrigins::fillDescriptions(desc, "hltOnlineBeamSpot", "hltPixelVertices", 1);
163 
164  desc.add<double>("ptMin", 0.9);
165  desc.add<double>("originRadius", 0.2);
166  desc.add<double>("deltaEta_Cand", -1.);
167  desc.add<double>("deltaPhi_Cand", -1.);
168  desc.add<double>("deltaEta_Point", -1.);
169  desc.add<double>("deltaPhi_Point", -1.);
170  desc.add<bool>("precise", true);
171 
172  desc.add<std::string>("whereToUseMeasurementTracker", "ForSiStrips");
173  desc.add<edm::InputTag>("measurementTrackerName", edm::InputTag(""));
174 
175  desc.add<bool>("searchOpt", false);
176 
177  // Only for backwards-compatibility
178  edm::ParameterSetDescription descRegion;
179  descRegion.add<edm::ParameterSetDescription>("RegionPSet", desc);
180 
181  descriptions.add("candidatePointSeededTrackingRegionsFromBeamSpot", descRegion);
182  }
183 
184  std::vector<std::unique_ptr<TrackingRegion>> regions(const edm::Event& e, const edm::EventSetup& es) const override {
185  std::vector<std::unique_ptr<TrackingRegion>> result;
186 
187  // pick up the candidate objects of interest
189  size_t n_objects = 0;
190 
192  e.getByToken(m_token_input, objects);
193  n_objects = objects->size();
194  if (n_objects == 0)
195  return result;
196  }
197 
198  const auto& objs = *objects;
199 
200  const auto& origins = m_origins.origins(e);
201  if (origins.empty()) {
202  return result;
203  }
204 
209  measurementTracker = hmte.product();
210  }
211 
212  // create tracking regions (maximum MaxNRegions of them) in directions of the
213  // objects of interest (we expect that the collection was sorted in decreasing pt order)
214  int n_regions = 0;
215 
217  for (const auto& object : objs) {
218  GlobalVector direction(object.momentum().x(), object.momentum().y(), object.momentum().z());
219 
220  for (const auto& origin : origins) {
221  result.push_back(std::make_unique<RectangularEtaPhiTrackingRegion>(direction,
222  origin.first,
223  m_ptMin,
225  origin.second,
229  m_precise,
230  measurementTracker,
231  m_searchOpt));
232  ++n_regions;
233  if (n_regions >= m_maxNRegions)
234  break;
235  }
236 
237  if (n_regions >= m_maxNRegions)
238  break;
239  }
240 
241  }
242 
244  for (const auto& direction : m_directionPoints) {
245  for (const auto& origin : origins) {
246  result.push_back(std::make_unique<RectangularEtaPhiTrackingRegion>(direction, // GlobalVector
247  origin.first, // GlobalPoint
248  m_ptMin,
250  origin.second,
254  m_precise,
255  measurementTracker,
256  m_searchOpt));
257  ++n_regions;
258  if (n_regions >= m_maxNRegions)
259  break;
260  }
261 
262  if (n_regions >= m_maxNRegions)
263  break;
264  }
265 
266  }
267 
269  for (const auto& object : objs) {
270  double eta_Cand = object.eta();
271  double phi_Cand = object.phi();
272 
273  for (const auto& etaPhiPoint : m_etaPhiPoints) {
274  double eta_Point = etaPhiPoint.first;
275  double phi_Point = etaPhiPoint.second;
276  double dEta_Cand_Point = std::abs(eta_Cand - eta_Point);
277  double dPhi_Cand_Point = std::abs(deltaPhi(phi_Cand, phi_Point));
278 
279  //Check if there is an overlap between Candidate- and Point-based regions of interest
280  if (dEta_Cand_Point > (m_deltaEta_Cand + m_deltaEta_Point) ||
281  dPhi_Cand_Point > (m_deltaPhi_Cand + m_deltaPhi_Point))
282  continue;
283 
284  //Determines boundaries of intersection of RoIs
285  double etaMin_RoI = std::max(eta_Cand - m_deltaEta_Cand, eta_Point - m_deltaEta_Point);
286  double etaMax_RoI = std::min(eta_Cand + m_deltaEta_Cand, eta_Point + m_deltaEta_Point);
287 
288  double phi_Cand_minus = normalizedPhi(phi_Cand - m_deltaPhi_Cand);
289  double phi_Point_minus = normalizedPhi(phi_Point - m_deltaPhi_Point);
290  double phi_Cand_plus = normalizedPhi(phi_Cand + m_deltaPhi_Cand);
291  double phi_Point_plus = normalizedPhi(phi_Point + m_deltaPhi_Point);
292 
293  double phiMin_RoI = deltaPhi(phi_Cand_minus, phi_Point_minus) > 0. ? phi_Cand_minus : phi_Point_minus;
294  double phiMax_RoI = deltaPhi(phi_Cand_plus, phi_Point_plus) < 0. ? phi_Cand_plus : phi_Point_plus;
295 
296  //Determines position and width of new RoI
297  double eta_RoI = 0.5 * (etaMax_RoI + etaMin_RoI);
298  double deltaEta_RoI = etaMax_RoI - eta_RoI;
299 
300  double phi_RoI = 0.5 * (phiMax_RoI + phiMin_RoI);
301  if (phiMax_RoI < phiMin_RoI)
302  phi_RoI -= M_PI;
303  phi_RoI = normalizedPhi(phi_RoI);
304  double deltaPhi_RoI = deltaPhi(phiMax_RoI, phi_RoI);
305 
306  double x = std::cos(phi_RoI);
307  double y = std::sin(phi_RoI);
308  double theta = 2 * std::atan(std::exp(-eta_RoI));
309  double z = 1. / std::tan(theta);
310 
311  GlobalVector direction(x, y, z);
312 
313  for (const auto& origin : origins) {
314  result.push_back(std::make_unique<RectangularEtaPhiTrackingRegion>(direction,
315  origin.first,
316  m_ptMin,
318  origin.second,
319  deltaEta_RoI,
320  deltaPhi_RoI,
322  m_precise,
323  measurementTracker,
324  m_searchOpt));
325  ++n_regions;
326  if (n_regions >= m_maxNRegions)
327  break;
328  }
329 
330  if (n_regions >= m_maxNRegions)
331  break;
332  }
333 
334  if (n_regions >= m_maxNRegions)
335  break;
336  }
337  }
338 
339  edm::LogInfo("CandidatePointSeededTrackingRegionsProducer") << "produced " << n_regions << " regions";
340 
341  return result;
342  }
343 
344 private:
347 
350 
351  std::vector<std::pair<double, double>> m_etaPhiPoints;
352  std::vector<GlobalVector> m_directionPoints;
353 
354  float m_ptMin;
360  bool m_precise;
364 };
365 
366 #endif
Origins origins(const edm::Event &iEvent) const
T getParameter(std::string const &) const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
constexpr T normalizedPhi(T phi)
Definition: normalizedPhi.h:8
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Geom::Theta< T > theta() const
static void fillDescriptions(edm::ParameterSetDescription &desc, const std::string &defaultBeamSpot="offlineBeamSpot", const std::string &defaultVertex="firstStepPrimaryVertices", int defaultMaxVertices=-1)
bool exists(std::string const &parameterName) const
checks if a parameter exists
size_type size() const
static UseMeasurementTracker stringToUseMeasurementTracker(const std::string &name)
edm::EDGetTokenT< MeasurementTrackerEvent > m_token_measurementTracker
RectangularEtaPhiTrackingRegion::UseMeasurementTracker m_whereToUseMeasurementTracker
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
T min(T a, T b)
Definition: MathUtil.h:58
ParameterDescriptionBase * add(U const &iLabel, T const &value)
#define M_PI
CandidatePointSeededTrackingRegionsProducer(const edm::ParameterSet &conf, edm::ConsumesCollector &&iC)
T const * product() const
Definition: Handle.h:69
void add(std::string const &label, ParameterSetDescription const &psetDescription)
HLT enums.
std::vector< std::unique_ptr< TrackingRegion > > regions(const edm::Event &e, const edm::EventSetup &es) const override
bool isUninitialized() const
Definition: EDGetToken.h:70