1 #ifndef RecoTracker_TkTrackingRegions_TrackingRegionsFromSuperClustersProducer_H 2 #define RecoTracker_TkTrackingRegions_TrackingRegionsFromSuperClustersProducer_H 55 #include "TEnumConstant.h" 57 template <
typename MyEnum>
58 MyEnum strToEnum(
std::string const& enumConstName) {
59 TEnum* en = TEnum::GetEnum(
typeid(MyEnum));
61 if (TEnumConstant
const* enc = en->GetConstant(enumConstName.c_str())) {
62 return static_cast<MyEnum
>(enc->GetValue());
64 throw cms::Exception(
"Configuration") << enumConstName <<
" is not a valid member of " <<
typeid(MyEnum).
name();
67 throw cms::Exception(
"LogicError") <<
typeid(MyEnum).
name() <<
" not recognised by ROOT";
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;
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__
106 const double deltaZVertex,
141 template <
typename T>
144 event.getByToken(token, handle);
171 auto superClustersTags = regionPSet.
getParameter<std::vector<edm::InputTag>>(
"superClusters");
182 for (
const auto&
tag : superClustersTags) {
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)
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);
210 ->setComment(
"only used if useZInBeamspot is true");
212 desc.
add<std::vector<edm::InputTag>>(
"superClusters",
213 std::vector<edm::InputTag>{
edm::InputTag{
"hltEgammaSuperClustersToPixelMatch"}});
219 descriptions.
add(
"trackingRegionsFromSuperClusters", descRegion);
226 double deltaZVertex = 0;
237 auto superClustersHandle = getHandle(iEvent, superClustersToken);
238 for (
auto& superClusterRef : *superClustersHandle) {
240 trackingRegions.emplace_back(
242 trackingRegions.emplace_back(
254 if (!verticesHandle->empty()) {
256 const auto&
pv = verticesHandle->front();
268 const double bsSigmaZ =
std::sqrt(beamSpotHandle->sigmaZ() * beamSpotHandle->sigmaZ() +
269 beamSpotHandle->sigmaZ0Error() * beamSpotHandle->sigmaZ0Error());
273 return GlobalPoint(bsPos.x(), bsPos.y(), bsPos.z());
284 const double deltaZVertex,
293 return std::make_unique<RectangularEtaPhiTrackingRegion>(freeTrajState.
momentum(),
308 <<
" when constructing TrackingRegionsFromSuperClustersProducer both useZInVertex (" <<
useZInVertex_ 309 <<
") and useZInBeamspot (" <<
useZInBeamspot_ <<
") can not be true as they are mutually exclusive options"
T getParameter(std::string const &) const
void setComment(std::string const &value)
const math::XYZPoint & position() const
cluster centroid position
static FreeTrajectoryState get(MagneticField const &magField, GlobalPoint const &xmeas, GlobalPoint const &xvert, float momentum, TrackCharge charge)
RectangularEtaPhiTrackingRegion::UseMeasurementTracker whereToUseMeasTracker_
Global3DPoint GlobalPoint
double nrSigmaForBSDeltaZ_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< Vertex > VertexCollection
collection of Vertex objects
math::XYZPoint Point
point in the space
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)
edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
std::vector< edm::EDGetTokenT< std::vector< reco::SuperClusterRef > > > superClustersTokens_
double energy() const
cluster energy
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)
~TrackingRegionsFromSuperClustersProducer() override
edm::EDGetTokenT< reco::VertexCollection > verticesToken_
edm::EDGetTokenT< MeasurementTrackerEvent > measTrackerEventToken_
bool isUninitialized() const
GlobalPoint getVtxPos(const edm::Event &iEvent, double &deltaZVertex) const
void validateConfigSettings() const