CMS 3D CMS Logo

TrackingRegionsFromSuperClustersProducer.h
Go to the documentation of this file.
1 #ifndef RecoTracker_TkTrackingRegions_TrackingRegionsFromSuperClustersProducer_H
2 #define RecoTracker_TkTrackingRegions_TrackingRegionsFromSuperClustersProducer_H
3 
4 //******************************************************************************
5 //
6 // Part of the refactorisation of of the E/gamma pixel matching pre-2017
7 // This refactorisation converts the monolithic approach to a series of
8 // independent producer modules, with each modules performing a specific
9 // job as recommended by the 2017 tracker framework
10 //
11 // This module is called a Producer even though its not an ED producer
12 // This was done to be consistant with other TrackingRegion producers
13 // in RecoTracker/TkTrackingRegions
14 //
15 // The module closely follows the other TrackingRegion producers
16 // in RecoTracker/TkTrackingRegions and is intended to become an EDProducer
17 // by TrackingRegionEDProducerT<TrackingRegionsFromSuperClustersProducer>
18 
19 // This module c tracking regions from the superclusters. It mostly
20 // replicates the functionality of the SeedFilter class
21 // although unlike that class, it does not actually create seeds
22 //
23 // Author : Sam Harper (RAL), 2017
24 //
25 //*******************************************************************************
26 
35 
43 
47 
49 
52 
53 //stick this in common tools
54 #include "TEnum.h"
55 #include "TEnumConstant.h"
56 namespace {
57  template <typename MyEnum>
58  MyEnum strToEnum(std::string const& enumConstName) {
59  TEnum* en = TEnum::GetEnum(typeid(MyEnum));
60  if (en != nullptr) {
61  if (TEnumConstant const* enc = en->GetConstant(enumConstName.c_str())) {
62  return static_cast<MyEnum>(enc->GetValue());
63  } else {
64  throw cms::Exception("Configuration") << enumConstName << " is not a valid member of " << typeid(MyEnum).name();
65  }
66  }
67  throw cms::Exception("LogicError") << typeid(MyEnum).name() << " not recognised by ROOT";
68  }
69  template <>
72  if (enumConstName == "kNever")
73  return MyEnum::kNever;
74  else if (enumConstName == "kForSiStrips")
75  return MyEnum::kForSiStrips;
76  else if (enumConstName == "kAlways")
77  return MyEnum::kAlways;
78  else {
79  throw cms::Exception("InvalidConfiguration")
80  << enumConstName << " is not a valid member of " << typeid(MyEnum).name()
81  << " (or strToEnum needs updating, this is a manual translation found at " << __FILE__ << " line " << __LINE__
82  << ")";
83  }
84  }
85 
86 } // namespace
88 public:
89  enum class Charge { NEG = -1, POS = +1 };
90 
91 public:
93 
95 
96  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
97 
98  std::vector<std::unique_ptr<TrackingRegion>> regions(const edm::Event& iEvent,
99  const edm::EventSetup& iSetup) const override;
100 
101 private:
102  GlobalPoint getVtxPos(const edm::Event& iEvent, double& deltaZVertex) const;
103 
104  std::unique_ptr<TrackingRegion> createTrackingRegion(const reco::SuperCluster& superCluster,
105  const GlobalPoint& vtxPos,
106  const double deltaZVertex,
107  const Charge charge,
108  const MeasurementTrackerEvent* measTrackerEvent,
109  const MagneticField& magField) const;
110 
111 private:
112  void validateConfigSettings() const;
113 
114 private:
115  //there are 3 modes in which to define the Z area of the tracking region
116  //1) from first vertex in the passed vertices collection +/- originHalfLength in z (useZInVertex=true)
117  //2) the beamspot +/- nrSigmaForBSDeltaZ* zSigma of beamspot (useZInBeamspot=true)
118  // the zSigma of the beamspot can have a minimum value specified
119  // we do this because a common error is that beamspot has too small of a value
120  //3) defaultZ_ +/- originHalfLength (if useZInVertex and useZInBeamspot are both false)
121  double ptMin_;
129  double defaultZ_;
130  double minBSDeltaZ_;
131  bool precise_;
133 
137  std::vector<edm::EDGetTokenT<std::vector<reco::SuperClusterRef>>> superClustersTokens_;
138 };
139 
140 namespace {
141  template <typename T>
142  edm::Handle<T> getHandle(const edm::Event& event, const edm::EDGetTokenT<T>& token) {
144  event.getByToken(token, handle);
145  return handle;
146  }
147 } // namespace
148 
150  edm::ConsumesCollector&& iC) {
151  edm::ParameterSet regionPSet = cfg.getParameter<edm::ParameterSet>("RegionPSet");
152 
153  ptMin_ = regionPSet.getParameter<double>("ptMin");
154  originRadius_ = regionPSet.getParameter<double>("originRadius");
155  originHalfLength_ = regionPSet.getParameter<double>("originHalfLength");
156  deltaPhiRegion_ = regionPSet.getParameter<double>("deltaPhiRegion");
157  deltaEtaRegion_ = regionPSet.getParameter<double>("deltaEtaRegion");
158  useZInVertex_ = regionPSet.getParameter<bool>("useZInVertex");
159  useZInBeamspot_ = regionPSet.getParameter<bool>("useZInBeamspot");
160  nrSigmaForBSDeltaZ_ = regionPSet.getParameter<double>("nrSigmaForBSDeltaZ");
161  defaultZ_ = regionPSet.getParameter<double>("defaultZ");
162  minBSDeltaZ_ = regionPSet.getParameter<double>("minBSDeltaZ");
163  precise_ = regionPSet.getParameter<bool>("precise");
164  whereToUseMeasTracker_ = strToEnum<RectangularEtaPhiTrackingRegion::UseMeasurementTracker>(
165  regionPSet.getParameter<std::string>("whereToUseMeasTracker"));
166 
168 
169  auto verticesTag = regionPSet.getParameter<edm::InputTag>("vertices");
170  auto beamSpotTag = regionPSet.getParameter<edm::InputTag>("beamSpot");
171  auto superClustersTags = regionPSet.getParameter<std::vector<edm::InputTag>>("superClusters");
172  auto measTrackerEventTag = regionPSet.getParameter<edm::InputTag>("measurementTrackerEvent");
173 
174  if (useZInVertex_) {
175  verticesToken_ = iC.consumes<reco::VertexCollection>(verticesTag);
176  } else {
177  beamSpotToken_ = iC.consumes<reco::BeamSpot>(beamSpotTag);
178  }
180  measTrackerEventToken_ = iC.consumes<MeasurementTrackerEvent>(measTrackerEventTag);
181  }
182  for (const auto& tag : superClustersTags) {
183  superClustersTokens_.emplace_back(iC.consumes<std::vector<reco::SuperClusterRef>>(tag));
184  }
185 }
186 
189 
190  desc.add<double>("ptMin", 1.5);
191  desc.add<double>("originRadius", 0.2);
192  desc.add<double>("originHalfLength", 15.0)
193  ->setComment("z range is +/- this value except when using the beamspot (useZInBeamspot=true)");
194  desc.add<double>("deltaPhiRegion", 0.4);
195  desc.add<double>("deltaEtaRegion", 0.1);
196  desc.add<bool>("useZInVertex", false)
197  ->setComment("use the leading vertex position +/-orginHalfLength, mutually exclusive with useZInBeamspot");
198  desc.add<bool>("useZInBeamspot", true)
199  ->setComment(
200  "use the beamspot position +/- nrSigmaForBSDeltaZ* sigmaZ_{bs}, mutually exclusive with useZInVertex");
201  desc.add<double>("nrSigmaForBSDeltaZ", 3.0)
202  ->setComment("# of sigma to extend the z region when using the beamspot, only active if useZInBeamspot=true");
203  desc.add<double>("minBSDeltaZ", 0.0)
204  ->setComment("a minimum value of the beamspot sigma z to use, only active if useZInBeamspot=true");
205  desc.add<double>("defaultZ", 0.)
206  ->setComment("the default z position, only used if useZInVertex and useZInBeamspot are both false");
207  desc.add<bool>("precise", true);
208  desc.add<std::string>("whereToUseMeasTracker", "kNever");
209  desc.add<edm::InputTag>("beamSpot", edm::InputTag("hltOnlineBeamSpot"))
210  ->setComment("only used if useZInBeamspot is true");
211  desc.add<edm::InputTag>("vertices", edm::InputTag())->setComment("only used if useZInVertex is true");
212  desc.add<std::vector<edm::InputTag>>("superClusters",
213  std::vector<edm::InputTag>{edm::InputTag{"hltEgammaSuperClustersToPixelMatch"}});
214  desc.add<edm::InputTag>("measurementTrackerEvent", edm::InputTag());
215 
216  edm::ParameterSetDescription descRegion;
217  descRegion.add<edm::ParameterSetDescription>("RegionPSet", desc);
218 
219  descriptions.add("trackingRegionsFromSuperClusters", descRegion);
220 }
221 
222 std::vector<std::unique_ptr<TrackingRegion>> TrackingRegionsFromSuperClustersProducer::regions(
223  const edm::Event& iEvent, const edm::EventSetup& iSetup) const {
224  std::vector<std::unique_ptr<TrackingRegion>> trackingRegions;
225 
226  double deltaZVertex = 0;
227  GlobalPoint vtxPos = getVtxPos(iEvent, deltaZVertex);
228 
229  const MeasurementTrackerEvent* measTrackerEvent = nullptr;
231  measTrackerEvent = getHandle(iEvent, measTrackerEventToken_).product();
232  }
233  edm::ESHandle<MagneticField> magFieldHandle;
234  iSetup.get<IdealMagneticFieldRecord>().get(magFieldHandle);
235 
236  for (auto& superClustersToken : superClustersTokens_) {
237  auto superClustersHandle = getHandle(iEvent, superClustersToken);
238  for (auto& superClusterRef : *superClustersHandle) {
239  //do both charge hypothesises
240  trackingRegions.emplace_back(
241  createTrackingRegion(*superClusterRef, vtxPos, deltaZVertex, Charge::POS, measTrackerEvent, *magFieldHandle));
242  trackingRegions.emplace_back(
243  createTrackingRegion(*superClusterRef, vtxPos, deltaZVertex, Charge::NEG, measTrackerEvent, *magFieldHandle));
244  }
245  }
246  return trackingRegions;
247 }
248 
250  if (useZInVertex_) {
251  auto verticesHandle = getHandle(iEvent, verticesToken_);
252  //we throw if the vertices are not there but if no vertex is
253  //recoed in the event, we default to 0,0,defaultZ as the vertex
254  if (!verticesHandle->empty()) {
255  deltaZVertex = originHalfLength_;
256  const auto& pv = verticesHandle->front();
257  return GlobalPoint(pv.x(), pv.y(), pv.z());
258  } else {
259  deltaZVertex = originHalfLength_;
260  return GlobalPoint(0, 0, defaultZ_);
261  }
262  } else {
263  auto beamSpotHandle = getHandle(iEvent, beamSpotToken_);
264  const reco::BeamSpot::Point& bsPos = beamSpotHandle->position();
265 
266  if (useZInBeamspot_) {
267  //as this is what has been done traditionally for e/gamma, others just use sigmaZ
268  const double bsSigmaZ = std::sqrt(beamSpotHandle->sigmaZ() * beamSpotHandle->sigmaZ() +
269  beamSpotHandle->sigmaZ0Error() * beamSpotHandle->sigmaZ0Error());
270  const double sigmaZ = std::max(bsSigmaZ, minBSDeltaZ_);
271  deltaZVertex = nrSigmaForBSDeltaZ_ * sigmaZ;
272 
273  return GlobalPoint(bsPos.x(), bsPos.y(), bsPos.z());
274  } else {
275  deltaZVertex = originHalfLength_;
276  return GlobalPoint(bsPos.x(), bsPos.y(), defaultZ_);
277  }
278  }
279 }
280 
282  const reco::SuperCluster& superCluster,
283  const GlobalPoint& vtxPos,
284  const double deltaZVertex,
285  const Charge charge,
286  const MeasurementTrackerEvent* measTrackerEvent,
287  const MagneticField& magField) const {
288  const GlobalPoint clusterPos(superCluster.position().x(), superCluster.position().y(), superCluster.position().z());
289  const double energy = superCluster.energy();
290 
291  FreeTrajectoryState freeTrajState =
292  FTSFromVertexToPointFactory::get(magField, clusterPos, vtxPos, energy, static_cast<int>(charge));
293  return std::make_unique<RectangularEtaPhiTrackingRegion>(freeTrajState.momentum(),
294  vtxPos,
295  ptMin_,
297  deltaZVertex,
301  precise_,
302  measTrackerEvent);
303 }
304 
307  throw cms::Exception("InvalidConfiguration")
308  << " when constructing TrackingRegionsFromSuperClustersProducer both useZInVertex (" << useZInVertex_
309  << ") and useZInBeamspot (" << useZInBeamspot_ << ") can not be true as they are mutually exclusive options"
310  << std::endl;
311  }
312 }
313 
314 #endif
T getParameter(std::string const &) const
void setComment(std::string const &value)
const math::XYZPoint & position() const
cluster centroid position
Definition: CaloCluster.h:153
static FreeTrajectoryState get(MagneticField const &magField, GlobalPoint const &xmeas, GlobalPoint const &xvert, float momentum, TrackCharge charge)
RectangularEtaPhiTrackingRegion::UseMeasurementTracker whereToUseMeasTracker_
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
math::XYZPoint Point
point in the space
Definition: BeamSpot.h:27
std::vector< std::unique_ptr< TrackingRegion > > regions(const edm::Event &iEvent, const edm::EventSetup &iSetup) const override
TrackingRegionsFromSuperClustersProducer(const edm::ParameterSet &cfg, edm::ConsumesCollector &&cc)
std::vector< edm::EDGetTokenT< std::vector< reco::SuperClusterRef > > > superClustersTokens_
int iEvent
Definition: GenABIO.cc:224
T sqrt(T t)
Definition: SSEVec.h:19
def pv(vc)
Definition: MetAnalyzer.py:7
double energy() const
cluster energy
Definition: CaloCluster.h:148
ParameterDescriptionBase * add(U const &iLabel, T const &value)
GlobalVector momentum() const
std::unique_ptr< TrackingRegion > createTrackingRegion(const reco::SuperCluster &superCluster, const GlobalPoint &vtxPos, const double deltaZVertex, const Charge charge, const MeasurementTrackerEvent *measTrackerEvent, const MagneticField &magField) const
void add(std::string const &label, ParameterSetDescription const &psetDescription)
edm::EDGetTokenT< reco::VertexCollection > verticesToken_
edm::EDGetTokenT< MeasurementTrackerEvent > measTrackerEventToken_
T get() const
Definition: EventSetup.h:73
bool isUninitialized() const
Definition: EDGetToken.h:70
GlobalPoint getVtxPos(const edm::Event &iEvent, double &deltaZVertex) const
Definition: event.py:1