37 for (
size_t hitNr = 0; hitNr <
seed.hitInfo().size(); hitNr++) {
38 int subDetBit = 0x1 << hitNr;
45 int layerOrDiskNr =
seed.layerOrDiskNr(hitNr);
46 if (layerOrDiskNr == 0 || layerOrDiskNr > 4) {
49 <<
"The layerOrDiskNr of hitnr " << hitNr <<
" is " << layerOrDiskNr
50 <<
" which is equal to numeric_limits::max which implies it was not filled correctly.\nWhile this is " 51 "valid for the matching variables as it can signal the failure to find a postive or negative seed " 52 "trajectory,\nit is not valid for the layer number as that is always known.\nThus there is a logic " 53 "error in the code or possible corrupt data";
55 throw cms::Exception(
"InvalidData") <<
"The layerOrDiskNr of hitnr " << hitNr <<
" is " << layerOrDiskNr
56 <<
" and is not in the range of 1<=x<=4 which implies a new pixel " 57 "detector\nthis code does not support as the current one has only 4 " 58 "layers numbered 1-4 or corrupt data\n";
61 int layerBit = 0x1 << layerOffset << layerOrDiskNr;
64 int nrLayersAlongTrajShifted =
seed.nrLayersAlongTraj() << 12;
65 info |= nrLayersAlongTrajShifted;
79 valMap_ = std::make_unique<reco::RecoEcalCandidateIsolationMap>(candHandle);
80 valInfoMap_ = std::make_unique<reco::RecoEcalCandidateIsolationMap>(candHandle);
110 std::unique_ptr<reco::RecoEcalCandidateIsolationMap>
valMap_;
143 : recoEcalCandidateToken_(
150 productsToWrite_(
config.getParameter<
int>(
"productsToWrite")),
155 produces<reco::RecoEcalCandidateIsolationMap>(
"s2");
157 produces<reco::RecoEcalCandidateIsolationMap>(
"dPhi1BestS2");
158 produces<reco::RecoEcalCandidateIsolationMap>(
"dPhi2BestS2");
159 produces<reco::RecoEcalCandidateIsolationMap>(
"dzBestS2");
163 for (
size_t hitNr = 1; hitNr <=
nrHits_; hitNr++) {
164 produces<reco::RecoEcalCandidateIsolationMap>(
"dPhi" +
std::to_string(hitNr));
165 produces<reco::RecoEcalCandidateIsolationMap>(
"dPhi" +
std::to_string(hitNr) +
"Info");
166 produces<reco::RecoEcalCandidateIsolationMap>(
"dRZ" +
std::to_string(hitNr));
167 produces<reco::RecoEcalCandidateIsolationMap>(
"dRZ" +
std::to_string(hitNr) +
"Info");
169 produces<reco::RecoEcalCandidateIsolationMap>(
"nrClus");
170 produces<reco::RecoEcalCandidateIsolationMap>(
"seedClusEFrac");
171 produces<reco::RecoEcalCandidateIsolationMap>(
"phiWidth");
172 produces<reco::RecoEcalCandidateIsolationMap>(
"etaWidth");
207 varParamDesc.addVPSet(
"bins", binParamDesc);
208 desc.add(
"dPhi1SParams", varParamDesc);
209 desc.add(
"dPhi2SParams", varParamDesc);
210 desc.add(
"dRZ2SParams", varParamDesc);
211 desc.add<
int>(
"productsToWrite", 0);
212 descriptions.
add((
"hltEgammaHLTPixelMatchVarProducer"),
desc);
221 if (!recoEcalCandHandle.isValid())
223 else if (!pixelSeedsHandle.isValid()) {
224 auto s2Map = std::make_unique<reco::RecoEcalCandidateIsolationMap>(recoEcalCandHandle);
225 for (
unsigned int candNr = 0; candNr < recoEcalCandHandle->size(); candNr++) {
227 s2Map->insert(candRef, 0);
233 auto dPhi1BestS2Map = std::make_unique<reco::RecoEcalCandidateIsolationMap>(recoEcalCandHandle);
234 auto dPhi2BestS2Map = std::make_unique<reco::RecoEcalCandidateIsolationMap>(recoEcalCandHandle);
235 auto dzBestS2Map = std::make_unique<reco::RecoEcalCandidateIsolationMap>(recoEcalCandHandle);
236 auto s2Map = std::make_unique<reco::RecoEcalCandidateIsolationMap>(recoEcalCandHandle);
238 auto nrClusMap = std::make_unique<reco::RecoEcalCandidateIsolationMap>(recoEcalCandHandle);
239 auto seedClusEFracMap = std::make_unique<reco::RecoEcalCandidateIsolationMap>(recoEcalCandHandle);
240 auto phiWidthMap = std::make_unique<reco::RecoEcalCandidateIsolationMap>(recoEcalCandHandle);
241 auto etaWidthMap = std::make_unique<reco::RecoEcalCandidateIsolationMap>(recoEcalCandHandle);
243 std::vector<PixelData> pixelData;
244 for (
size_t hitNr = 0; hitNr <
nrHits_; hitNr++) {
249 for (
unsigned int candNr = 0; candNr < recoEcalCandHandle->size(); candNr++) {
257 for (
auto&
seed : *pixelSeedsHandle) {
260 if (&(*candSCRef) == &(*pixelSCRef)) {
261 std::array<float, 4> s2Data =
calS2(
seed, -1);
262 std::array<float, 4> s2DataPos =
calS2(
seed, +1);
263 if (s2Data[0] < bestS2[0])
265 if (s2DataPos[0] < bestS2[0])
269 for (
auto& pixelDatum : pixelData) {
270 pixelDatum.fill(
seed);
276 s2Map->insert(candRef, bestS2[0]);
278 dPhi1BestS2Map->insert(candRef, bestS2[1]);
279 dPhi2BestS2Map->insert(candRef, bestS2[2]);
280 dzBestS2Map->insert(candRef, bestS2[3]);
283 nrClusMap->insert(candRef, candSCRef->clustersSize());
284 float seedClusEFrac = candSCRef->rawEnergy() > 0 ? candSCRef->seed()->energy() / candSCRef->rawEnergy() : 0.;
287 seedClusEFracMap->insert(candRef, seedClusEFrac);
288 float phiWidth = candSCRef->phiWidth();
289 float etaWidth = candSCRef->etaWidth();
290 phiWidthMap->insert(candRef,
phiWidth);
291 etaWidthMap->insert(candRef,
etaWidth);
293 for (
auto& pixelDatum : pixelData) {
294 pixelDatum.fill(candRef);
306 for (
auto& pixelDatum : pixelData) {
307 pixelDatum.putInto(
iEvent);
321 float dPhi1 = (
charge < 0 ?
seed.dPhiNeg(0) :
seed.dPhiPos(0)) / dPhi1Const;
322 float dPhi2 = (
charge < 0 ?
seed.dPhiNeg(1) :
seed.dPhiPos(1)) / dPhi2Const;
323 float dRz2 = (
charge < 0 ?
seed.dRZNeg(1) :
seed.dRZPos(1)) / dRZ2Const;
325 float s2 = dPhi1 * dPhi1 + dPhi2 * dPhi2 + dRz2 * dRz2;
326 return std::array<float, 4>{{s2, dPhi1, dPhi2, dRz2}};
ParameterDescriptionNode * ifValue(ParameterDescription< T > const &switchParameter, std::unique_ptr< ParameterDescriptionCases< T >> cases)
void produce(edm::Event &, const edm::EventSetup &) override
egPM::Param< reco::ElectronSeed > dPhi2Para_
egPM::Param< reco::ElectronSeed > dPhi1Para_
std::array< float, 4 > calS2(const reco::ElectronSeed &seed, int charge) const
static std::string to_string(const XMLCh *ch)
void putInto(edm::Event &event)
egPM::Param< reco::ElectronSeed > dRZ2Para_
void fill(const reco::ElectronSeed &seed)
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Abs< T >::type abs(const T &t)
#define DEFINE_FWK_MODULE(type)
std::vector< ElectronSeed > ElectronSeedCollection
collection of ElectronSeed objects
const edm::EDGetTokenT< reco::RecoEcalCandidateCollection > recoEcalCandidateToken_
std::unique_ptr< reco::RecoEcalCandidateIsolationMap > valInfoMap_
float dPhiBest(size_t hitNr) const
void add(std::string const &label, ParameterSetDescription const &psetDescription)
std::unique_ptr< reco::RecoEcalCandidateIsolationMap > valMap_
~EgammaHLTPixelMatchVarProducer() override
std::vector< RecoEcalCandidate > RecoEcalCandidateCollection
collectin of RecoEcalCandidate objects
const edm::EDGetTokenT< reco::ElectronSeedCollection > pixelSeedsToken_
EgammaHLTPixelMatchVarProducer(const edm::ParameterSet &)
PixelData(std::string name, size_t hitNr, float(reco::ElectronSeed::*func)(size_t) const, const edm::Handle< reco::RecoEcalCandidateCollection > &candHandle)
float dRZBest(size_t hitNr) const
float(reco::ElectronSeed::* func_)(size_t) const
void fill(const reco::RecoEcalCandidateRef &candRef)