CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Static Public Member Functions | Static Public Attributes | Private Member Functions | Private Attributes
L2TauNNProducer Class Reference
Inheritance diagram for L2TauNNProducer:
edm::stream::EDProducer< edm::GlobalCache< L2TauNNProducerCacheData > >

Classes

struct  caloRecHitCollections
 
struct  InputDescTau
 

Public Member Functions

 L2TauNNProducer (const edm::ParameterSet &, const L2TauNNProducerCacheData *)
 
- Public Member Functions inherited from edm::stream::EDProducer< edm::GlobalCache< L2TauNNProducerCacheData > >
 EDProducer ()=default
 
 EDProducer (const EDProducer &)=delete
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 
const EDProduceroperator= (const EDProducer &)=delete
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &)
 
static void globalEndJob (L2TauNNProducerCacheData *)
 
static std::unique_ptr< L2TauNNProducerCacheDatainitializeGlobalCache (const edm::ParameterSet &)
 

Static Public Attributes

static constexpr float dEta_width = 2 * L2TauTagNNv1::dR_max / static_cast<float>(L2TauTagNNv1::nCellEta)
 
static constexpr float dPhi_width = 2 * L2TauTagNNv1::dR_max / static_cast<float>(L2TauTagNNv1::nCellPhi)
 
static constexpr float dR2_max = L2TauTagNNv1::dR_max * L2TauTagNNv1::dR_max
 

Private Member Functions

void checknan (tensorflow::Tensor &tensor, int debugLevel)
 
void fillCaloRecHits (tensorflow::Tensor &cellGridMatrix, const std::vector< l1t::TauRef > &allTaus, const caloRecHitCollections &caloRecHits)
 
void fillL1TauVars (tensorflow::Tensor &cellGridMatrix, const std::vector< l1t::TauRef > &allTaus)
 
void fillPatatracks (tensorflow::Tensor &cellGridMatrix, const std::vector< l1t::TauRef > &allTaus, const pixelTrack::TrackSoA &patatracks_tsoa, const ZVertexSoA &patavtx_soa, const reco::BeamSpot &beamspot, const MagneticField *magfi)
 
template<typename VPos , typename LVec >
std::tuple< float, float, int, int > getEtaPhiIndices (const VPos &position, const LVec &tau_p4)
 
template<typename LVec >
std::tuple< float, float, int, int > getEtaPhiIndices (float eta, float phi, const LVec &tau_p4)
 
std::vector< float > getTauScore (const tensorflow::Tensor &cellGridMatrix)
 
std::pair< float, float > impactParameter (int it, const pixelTrack::TrackSoA &patatracks_tsoa, float patatrackPhi, const reco::BeamSpot &beamspot, const MagneticField *magfi)
 
void produce (edm::Event &event, const edm::EventSetup &eventsetup) override
 
void selectGoodTracksAndVertices (const ZVertexSoA &patavtx_soa, const pixelTrack::TrackSoA &patatracks_tsoa, std::vector< int > &trkGood, std::vector< int > &vtxGood)
 
void standardizeTensor (tensorflow::Tensor &tensor)
 

Private Attributes

const edm::EDGetTokenT< reco::BeamSpotbeamSpotToken_
 
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecordbFieldToken_
 
const int debugLevel_
 
const edm::EDGetTokenT< EcalRecHitCollectionebToken_
 
const edm::EDGetTokenT< EcalRecHitCollectioneeToken_
 
const float fractionSumPt2_
 
const edm::ESGetToken< CaloGeometry, CaloGeometryRecordgeometryToken_
 
const edm::EDGetTokenT< HBHERecHitCollectionhbheToken_
 
const edm::EDGetTokenT< HORecHitCollectionhoToken_
 
std::string inputTensorName_
 
std::vector< InputDescTauL1TauDesc_
 
const L2TauNNProducerCacheDataL2cacheData_
 
const unsigned int maxVtx_
 
const float minSumPt2_
 
std::string outputTensorName_
 
const edm::EDGetTokenT< PixelTrackHeterogeneouspataTracksToken_
 
const edm::EDGetTokenT< ZVertexHeterogeneouspataVerticesToken_
 
const edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefstauTriggerToken_
 
const float trackChi2Max_
 
const float trackPtMax_
 
const float trackPtMin_
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer< edm::GlobalCache< L2TauNNProducerCacheData > >
using CacheTypes = CacheContexts< T... >
 
using GlobalCache = typename CacheTypes::GlobalCache
 
using HasAbility = AbilityChecker< T... >
 
using InputProcessBlockCache = typename CacheTypes::InputProcessBlockCache
 
using LuminosityBlockCache = typename CacheTypes::LuminosityBlockCache
 
using LuminosityBlockContext = LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCache >
 
using LuminosityBlockSummaryCache = typename CacheTypes::LuminosityBlockSummaryCache
 
using RunCache = typename CacheTypes::RunCache
 
using RunContext = RunContextT< RunCache, GlobalCache >
 
using RunSummaryCache = typename CacheTypes::RunSummaryCache
 

Detailed Description

Definition at line 147 of file L2TauTagNNProducer.cc.

Constructor & Destructor Documentation

◆ L2TauNNProducer()

L2TauNNProducer::L2TauNNProducer ( const edm::ParameterSet cfg,
const L2TauNNProducerCacheData cacheData 
)
explicit

Definition at line 287 of file L2TauTagNNProducer.cc.

References looper::cfg, L2TauNNProducer::InputDescTau::CollectionName, submitPVResolutionJobs::desc, Exception, L2TauNNProducerCacheData::graphDef, inputTensorName_, L2TauNNProducer::InputDescTau::inputToken_, L1TauDesc_, L2cacheData_, Skims_PA_cff::name, outputTensorName_, and AlCaHLTBitMon_QueryRunRegistry::string.

288  : debugLevel_(cfg.getParameter<int>("debugLevel")),
289  hbheToken_(consumes<HBHERecHitCollection>(cfg.getParameter<edm::InputTag>("hbheInput"))),
290  hoToken_(consumes<HORecHitCollection>(cfg.getParameter<edm::InputTag>("hoInput"))),
291  ebToken_(consumes<EcalRecHitCollection>(cfg.getParameter<edm::InputTag>("ebInput"))),
292  eeToken_(consumes<EcalRecHitCollection>(cfg.getParameter<edm::InputTag>("eeInput"))),
293  geometryToken_(esConsumes<CaloGeometry, CaloGeometryRecord>()),
294  bFieldToken_(esConsumes<MagneticField, IdealMagneticFieldRecord>()),
295  pataVerticesToken_(consumes<ZVertexHeterogeneous>(cfg.getParameter<edm::InputTag>("pataVertices"))),
296  pataTracksToken_(consumes<PixelTrackHeterogeneous>(cfg.getParameter<edm::InputTag>("pataTracks"))),
297  beamSpotToken_(consumes<reco::BeamSpot>(cfg.getParameter<edm::InputTag>("BeamSpot"))),
298  maxVtx_(cfg.getParameter<uint>("maxVtx")),
299  fractionSumPt2_(cfg.getParameter<double>("fractionSumPt2")),
300  minSumPt2_(cfg.getParameter<double>("minSumPt2")),
301  trackPtMin_(cfg.getParameter<double>("track_pt_min")),
302  trackPtMax_(cfg.getParameter<double>("track_pt_max")),
303  trackChi2Max_(cfg.getParameter<double>("track_chi2_max")) {
304  if (cacheData->graphDef == nullptr) {
305  throw cms::Exception("InvalidCacheData") << "Invalid Cache Data.";
306  }
307  inputTensorName_ = cacheData->graphDef->node(0).name();
308  outputTensorName_ = cacheData->graphDef->node(cacheData->graphDef->node_size() - 1).name();
309  L2cacheData_ = cacheData;
310  std::vector<edm::ParameterSet> L1TauCollections = cfg.getParameter<std::vector<edm::ParameterSet>>("L1Taus");
311  L1TauDesc_.reserve(L1TauCollections.size());
312  for (const auto& l1TauInput : L1TauCollections) {
313  InputDescTau toInsert;
314  toInsert.CollectionName = l1TauInput.getParameter<std::string>("L1CollectionName");
315  toInsert.inputToken_ =
316  consumes<trigger::TriggerFilterObjectWithRefs>(l1TauInput.getParameter<edm::InputTag>("L1TauTrigger"));
317  L1TauDesc_.push_back(toInsert);
318  }
319  for (const auto& desc : L1TauDesc_)
320  produces<std::vector<float>>(desc.CollectionName);
321 }
std::string inputTensorName_
const edm::EDGetTokenT< PixelTrackHeterogeneous > pataTracksToken_
const edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
const edm::EDGetTokenT< HORecHitCollection > hoToken_
std::vector< InputDescTau > L1TauDesc_
const unsigned int maxVtx_
const float fractionSumPt2_
const edm::EDGetTokenT< ZVertexHeterogeneous > pataVerticesToken_
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > bFieldToken_
const edm::EDGetTokenT< HBHERecHitCollection > hbheToken_
const float trackChi2Max_
std::string outputTensorName_
tensorflow::GraphDef * graphDef
const L2TauNNProducerCacheData * L2cacheData_
const edm::EDGetTokenT< EcalRecHitCollection > eeToken_
const edm::EDGetTokenT< EcalRecHitCollection > ebToken_
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > geometryToken_

Member Function Documentation

◆ checknan()

void L2TauNNProducer::checknan ( tensorflow::Tensor &  tensor,
int  debugLevel 
)
private

Definition at line 323 of file L2TauTagNNProducer.cc.

References ztail::d, HLT_2022v14_cff::debugLevel, Exception, input, edm::isNotFinite(), and L2TauTagNNv1::varNameMap.

Referenced by produce().

323  {
325  std::vector<int> tensor_shape(tensor.shape().dims());
326  for (int d = 0; d < tensor.shape().dims(); d++) {
327  tensor_shape.at(d) = tensor.shape().dim_size(d);
328  }
329  if (tensor_shape.size() != 4) {
330  throw cms::Exception("InvalidTensor") << "Tensor shape does not have 4 dimensions!";
331  }
332  for (int tau_idx = 0; tau_idx < tensor_shape.at(0); tau_idx++) {
333  for (int phi_idx = 0; phi_idx < tensor_shape.at(1); phi_idx++) {
334  for (int eta_idx = 0; eta_idx < tensor_shape.at(2); eta_idx++) {
335  for (int var_idx = 0; var_idx < tensor_shape.at(3); var_idx++) {
336  auto getCell = [&](NNInputs input) -> float& {
337  return getCellImpl(tensor, tau_idx, phi_idx, eta_idx, input);
338  };
339  auto nonstd_var = getCell(static_cast<NNInputs>(var_idx));
340  if (edm::isNotFinite(nonstd_var)) {
341  edm::LogWarning("InputVar") << "var is nan \nvar name= "
342  << L2TauTagNNv1::varNameMap.at(static_cast<L2TauTagNNv1::NNInputs>(var_idx))
343  << "\t var_idx = " << var_idx << "\t eta_idx = " << eta_idx
344  << "\t phi_idx = " << phi_idx << "\t tau_idx = " << tau_idx;
345  if (debugLevel > 2) {
346  edm::LogWarning("InputVar") << "other vars in same cell \n";
347  if (var_idx + 1 < tensor_shape.at(3))
348  edm::LogWarning("InputVar") << L2TauTagNNv1::varNameMap.at(static_cast<NNInputs>(var_idx + 1))
349  << "\t = " << getCell(static_cast<NNInputs>(var_idx + 1));
350  if (var_idx + 2 < tensor_shape.at(3))
351  edm::LogWarning("InputVar") << L2TauTagNNv1::varNameMap.at(static_cast<NNInputs>(var_idx + 2))
352  << "\t = " << getCell(static_cast<NNInputs>(var_idx + 2));
353  if (var_idx + 3 < tensor_shape.at(3))
354  edm::LogWarning("InputVar") << L2TauTagNNv1::varNameMap.at(static_cast<NNInputs>(var_idx + 3))
355  << "\t = " << getCell(static_cast<NNInputs>(var_idx + 3));
356  if (var_idx + 4 < tensor_shape.at(3))
357  edm::LogWarning("InputVar") << L2TauTagNNv1::varNameMap.at(static_cast<NNInputs>(var_idx + 4))
358  << "\t = " << getCell(static_cast<NNInputs>(var_idx + 4));
359  }
360  }
361  }
362  }
363  }
364  }
365 }
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
static std::string const input
Definition: EdmProvDump.cc:50
const std::map< NNInputs, std::string > varNameMap
d
Definition: ztail.py:151
Log< level::Warning, false > LogWarning

◆ fillCaloRecHits()

void L2TauNNProducer::fillCaloRecHits ( tensorflow::Tensor &  cellGridMatrix,
const std::vector< l1t::TauRef > &  allTaus,
const caloRecHitCollections caloRecHits 
)
private

Definition at line 433 of file L2TauTagNNProducer.cc.

References reco::deltaR2(), dR2_max, L2TauNNProducer::caloRecHitCollections::eb, L2TauNNProducer::caloRecHitCollections::ee, L2TauNNProducer::caloRecHitCollections::geometry, getEtaPhiIndices(), CaloGeometry::getGeometry(), L2TauNNProducer::caloRecHitCollections::hbhe, L2TauNNProducer::caloRecHitCollections::ho, input, L2TauTagNNv1::nCellEta, L2TauTagNNv1::nCellPhi, and position.

Referenced by produce().

435  {
437 
438  const int nTaus = allTaus.size();
439  float deta, dphi;
440  int eta_idx = 0;
441  int phi_idx = 0;
442  int tau_idx = 0;
443 
444  auto getCell = [&](NNInputs input) -> float& {
445  return getCellImpl(cellGridMatrix, tau_idx, phi_idx, eta_idx, input);
446  };
447  for (tau_idx = 0; tau_idx < nTaus; tau_idx++) {
448  // calorechit_EE
449  for (const auto& caloRecHit_ee : *caloRecHits.ee) {
450  if (caloRecHit_ee.energy() <= 0)
451  continue;
452  const auto& position = caloRecHits.geometry->getGeometry(caloRecHit_ee.id())->getPosition();
453  const float eeCalEn = caloRecHit_ee.energy();
454  const float eeCalChi2 = caloRecHit_ee.chi2();
455  if (reco::deltaR2(position, allTaus[tau_idx]->polarP4()) < dR2_max) {
456  std::tie(deta, dphi, eta_idx, phi_idx) = getEtaPhiIndices(position, allTaus[tau_idx]->polarP4());
457  getCell(NNInputs::EcalEnergySum) += eeCalEn;
458  getCell(NNInputs::EcalSize) += 1.;
459  getCell(NNInputs::EcalEnergyStdDev) += eeCalEn * eeCalEn;
460  getCell(NNInputs::EcalDeltaEta) += deta * eeCalEn;
461  getCell(NNInputs::EcalDeltaPhi) += dphi * eeCalEn;
462  if (eeCalChi2 >= 0) {
463  getCell(NNInputs::EcalChi2) += eeCalChi2 * eeCalEn;
464  getCell(NNInputs::EcalEnergySumForPositiveChi2) += eeCalEn;
465  getCell(NNInputs::EcalSizeForPositiveChi2) += 1.;
466  }
467  }
468  }
469 
470  // calorechit_EB
471  for (const auto& caloRecHit_eb : *caloRecHits.eb) {
472  if (caloRecHit_eb.energy() <= 0)
473  continue;
474  const auto& position = caloRecHits.geometry->getGeometry(caloRecHit_eb.id())->getPosition();
475  const float ebCalEn = caloRecHit_eb.energy();
476  const float ebCalChi2 = caloRecHit_eb.chi2();
477  if (reco::deltaR2(position, allTaus[tau_idx]->polarP4()) < dR2_max) {
478  std::tie(deta, dphi, eta_idx, phi_idx) = getEtaPhiIndices(position, allTaus[tau_idx]->polarP4());
479  getCell(NNInputs::EcalEnergySum) += ebCalEn;
480  getCell(NNInputs::EcalSize) += 1.;
481  getCell(NNInputs::EcalEnergyStdDev) += ebCalEn * ebCalEn;
482  getCell(NNInputs::EcalDeltaEta) += deta * ebCalEn;
483  getCell(NNInputs::EcalDeltaPhi) += dphi * ebCalEn;
484  if (ebCalChi2 >= 0) {
485  getCell(NNInputs::EcalChi2) += ebCalChi2 * ebCalEn;
486  getCell(NNInputs::EcalEnergySumForPositiveChi2) += ebCalEn;
487  getCell(NNInputs::EcalSizeForPositiveChi2) += 1.;
488  }
489  }
490  }
491 
492  // calorechit_HBHE
493  for (const auto& caloRecHit_hbhe : *caloRecHits.hbhe) {
494  if (caloRecHit_hbhe.energy() <= 0)
495  continue;
496  const auto& position = caloRecHits.geometry->getGeometry(caloRecHit_hbhe.id())->getPosition();
497  const float hbheCalEn = caloRecHit_hbhe.energy();
498  const float hbheCalChi2 = caloRecHit_hbhe.chi2();
499  if (reco::deltaR2(position, allTaus[tau_idx]->polarP4()) < dR2_max) {
500  std::tie(deta, dphi, eta_idx, phi_idx) = getEtaPhiIndices(position, allTaus[tau_idx]->polarP4());
501  getCell(NNInputs::HcalEnergySum) += hbheCalEn;
502  getCell(NNInputs::HcalEnergyStdDev) += hbheCalEn * hbheCalEn;
503  getCell(NNInputs::HcalSize) += 1.;
504  getCell(NNInputs::HcalDeltaEta) += deta * hbheCalEn;
505  getCell(NNInputs::HcalDeltaPhi) += dphi * hbheCalEn;
506  if (hbheCalChi2 >= 0) {
507  getCell(NNInputs::HcalChi2) += hbheCalChi2 * hbheCalEn;
508  getCell(NNInputs::HcalEnergySumForPositiveChi2) += hbheCalEn;
509  getCell(NNInputs::HcalSizeForPositiveChi2) += 1.;
510  }
511  }
512  }
513 
514  // calorechit_HO
515  for (const auto& caloRecHit_ho : *caloRecHits.ho) {
516  if (caloRecHit_ho.energy() <= 0)
517  continue;
518  const auto& position = caloRecHits.geometry->getGeometry(caloRecHit_ho.id())->getPosition();
519  const float hoCalEn = caloRecHit_ho.energy();
520  if (reco::deltaR2(position, allTaus[tau_idx]->polarP4()) < dR2_max) {
521  std::tie(deta, dphi, eta_idx, phi_idx) = getEtaPhiIndices(position, allTaus[tau_idx]->polarP4());
522  getCell(NNInputs::HcalEnergySum) += hoCalEn;
523  getCell(NNInputs::HcalEnergyStdDev) += hoCalEn * hoCalEn;
524  getCell(NNInputs::HcalSize) += 1.;
525  getCell(NNInputs::HcalDeltaEta) += deta * hoCalEn;
526  getCell(NNInputs::HcalDeltaPhi) += dphi * hoCalEn;
527  }
528  }
529 
530  // normalize to sum and define stdDev
531  for (eta_idx = 0; eta_idx < L2TauTagNNv1::nCellEta; eta_idx++) {
532  for (phi_idx = 0; phi_idx < L2TauTagNNv1::nCellPhi; phi_idx++) {
533  /* normalize eCal vars*/
534  if (getCell(NNInputs::EcalEnergySum) > 0.) {
535  getCell(NNInputs::EcalDeltaEta) /= getCell(NNInputs::EcalEnergySum);
536  getCell(NNInputs::EcalDeltaPhi) /= getCell(NNInputs::EcalEnergySum);
537  }
538  if (getCell(NNInputs::EcalEnergySumForPositiveChi2) > 0.) {
539  getCell(NNInputs::EcalChi2) /= getCell(NNInputs::EcalEnergySumForPositiveChi2);
540  }
541  if (getCell(NNInputs::EcalSize) > 1.) {
542  // (stdDev - (enSum*enSum)/size) / (size-1)
543  getCell(NNInputs::EcalEnergyStdDev) =
544  (getCell(NNInputs::EcalEnergyStdDev) -
545  (getCell(NNInputs::EcalEnergySum) * getCell(NNInputs::EcalEnergySum)) / getCell(NNInputs::EcalSize)) /
546  (getCell(NNInputs::EcalSize) - 1);
547  } else {
548  getCell(NNInputs::EcalEnergyStdDev) = 0.;
549  }
550  /* normalize hCal Vars */
551  if (getCell(NNInputs::HcalEnergySum) > 0.) {
552  getCell(NNInputs::HcalDeltaEta) /= getCell(NNInputs::HcalEnergySum);
553  getCell(NNInputs::HcalDeltaPhi) /= getCell(NNInputs::HcalEnergySum);
554  }
555  if (getCell(NNInputs::HcalEnergySumForPositiveChi2) > 0.) {
556  getCell(NNInputs::HcalChi2) /= getCell(NNInputs::HcalEnergySumForPositiveChi2);
557  }
558  if (getCell(NNInputs::HcalSize) > 1.) {
559  // (stdDev - (enSum*enSum)/size) / (size-1)
560  getCell(NNInputs::HcalEnergyStdDev) =
561  (getCell(NNInputs::HcalEnergyStdDev) -
562  (getCell(NNInputs::HcalEnergySum) * getCell(NNInputs::HcalEnergySum)) / getCell(NNInputs::HcalSize)) /
563  (getCell(NNInputs::HcalSize) - 1);
564  } else {
565  getCell(NNInputs::HcalEnergyStdDev) = 0.;
566  }
567  }
568  }
569  }
570 }
std::tuple< float, float, int, int > getEtaPhiIndices(const VPos &position, const LVec &tau_p4)
static std::string const input
Definition: EdmProvDump.cc:50
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
static constexpr float dR2_max
constexpr int nCellEta
static int position[264][3]
Definition: ReadPGInfo.cc:289
constexpr int nCellPhi

◆ fillDescriptions()

void L2TauNNProducer::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 255 of file L2TauTagNNProducer.cc.

References edm::ParameterSetDescription::add(), edm::ParameterSet::addParameter(), edm::ConfigurationDescriptions::addWithDefaultLabel(), submitPVResolutionJobs::desc, HLT_2022v14_cff::InputTag, AlCaHLTBitMon_QueryRunRegistry::string, and parallelization::uint.

255  {
257  desc.add<int>("debugLevel", 0)->setComment("set debug level for printing out info");
258  edm::ParameterSetDescription l1TausPset;
259  l1TausPset.add<std::string>("L1CollectionName", "DoubleTau")->setComment("Name of collections");
260  l1TausPset.add<edm::InputTag>("L1TauTrigger", edm::InputTag("hltL1sDoubleTauBigOR"))
261  ->setComment("Which trigger should the L1 Taus collection pass");
262  edm::ParameterSet l1TausPSetDefault;
263  l1TausPSetDefault.addParameter<std::string>("L1CollectionName", "DoubleTau");
264  l1TausPSetDefault.addParameter<edm::InputTag>("L1TauTrigger", edm::InputTag("hltL1sDoubleTauBigOR"));
265  desc.addVPSet("L1Taus", l1TausPset, {l1TausPSetDefault});
266  desc.add<edm::InputTag>("hbheInput", edm::InputTag("hltHbhereco"))->setComment("HBHE recHit collection");
267  desc.add<edm::InputTag>("hoInput", edm::InputTag("hltHoreco"))->setComment("HO recHit Collection");
268  desc.add<edm::InputTag>("ebInput", edm::InputTag("hltEcalRecHit:EcalRecHitsEB"))->setComment("EB recHit Collection");
269  desc.add<edm::InputTag>("eeInput", edm::InputTag("hltEcalRecHit:EcalRecHitsEE"))->setComment("EE recHit Collection");
270  desc.add<edm::InputTag>("pataVertices", edm::InputTag("hltPixelVerticesSoA"))
271  ->setComment("patatrack vertices collection");
272  desc.add<edm::InputTag>("pataTracks", edm::InputTag("hltPixelTracksSoA"))->setComment("patatrack collection");
273  desc.add<edm::InputTag>("BeamSpot", edm::InputTag("hltOnlineBeamSpot"))->setComment("BeamSpot Collection");
274  desc.add<uint>("maxVtx", 100)->setComment("max output collection size (number of accepted vertices)");
275  desc.add<double>("fractionSumPt2", 0.3)->setComment("threshold on sumPt2 fraction of the leading vertex");
276  desc.add<double>("minSumPt2", 0.)->setComment("min sumPt2");
277  desc.add<double>("track_pt_min", 1.0)->setComment("min track p_T");
278  desc.add<double>("track_pt_max", 10.0)->setComment("max track p_T");
279  desc.add<double>("track_chi2_max", 99999.)->setComment("max track chi2");
280  desc.add<std::string>("graphPath", "RecoTauTag/TrainingFiles/data/L2TauNNTag/L2TauTag_Run3v1.pb")
281  ->setComment("path to the saved CNN");
282  desc.add<std::string>("normalizationDict", "RecoTauTag/TrainingFiles/data/L2TauNNTag/NormalizationDict.json")
283  ->setComment("path to the dictionary for variable standardization");
284  descriptions.addWithDefaultLabel(desc);
285 }
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
void addParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:135
ParameterDescriptionBase * add(U const &iLabel, T const &value)

◆ fillL1TauVars()

void L2TauNNProducer::fillL1TauVars ( tensorflow::Tensor &  cellGridMatrix,
const std::vector< l1t::TauRef > &  allTaus 
)
private

Definition at line 401 of file L2TauTagNNProducer.cc.

References input, L2TauTagNNv1::nCellEta, and L2TauTagNNv1::nCellPhi.

Referenced by produce().

401  {
403 
404  const int nTaus = allTaus.size();
405  for (int tau_idx = 0; tau_idx < nTaus; tau_idx++) {
406  for (int eta_idx = 0; eta_idx < L2TauTagNNv1::nCellEta; eta_idx++) {
407  for (int phi_idx = 0; phi_idx < L2TauTagNNv1::nCellPhi; phi_idx++) {
408  auto getCell = [&](NNInputs input) -> float& {
409  return getCellImpl(cellGridMatrix, tau_idx, phi_idx, eta_idx, input);
410  };
411  getCell(NNInputs::l1Tau_pt) = allTaus[tau_idx]->pt();
412  getCell(NNInputs::l1Tau_eta) = allTaus[tau_idx]->eta();
413  getCell(NNInputs::l1Tau_hwIso) = allTaus[tau_idx]->hwIso();
414  }
415  }
416  }
417 }
static std::string const input
Definition: EdmProvDump.cc:50
constexpr int nCellEta
constexpr int nCellPhi

◆ fillPatatracks()

void L2TauNNProducer::fillPatatracks ( tensorflow::Tensor &  cellGridMatrix,
const std::vector< l1t::TauRef > &  allTaus,
const pixelTrack::TrackSoA patatracks_tsoa,
const ZVertexSoA patavtx_soa,
const reco::BeamSpot beamspot,
const MagneticField magfi 
)
private

Definition at line 651 of file L2TauTagNNProducer.cc.

References TrackSoAHeterogeneousT< S >::charge(), TrackSoAHeterogeneousT< S >::chi2, reco::deltaR2(), dR2_max, TrackSoAHeterogeneousT< S >::eta, spr::find(), getEtaPhiIndices(), ZVertexSoA::idv, impactParameter(), input, SiStripPI::min, L2TauTagNNv1::nCellEta, L2TauTagNNv1::nCellPhi, nHits, TrackSoAHeterogeneousT< S >::nHits(), TrackCollections2monitor_cff::nVertices, TrackSoAHeterogeneousT< S >::phi(), TrackSoAHeterogeneousT< S >::pt, and selectGoodTracksAndVertices().

Referenced by produce().

656  {
658  float deta, dphi;
659  int eta_idx = 0;
660  int phi_idx = 0;
661  int tau_idx = 0;
662 
663  auto getCell = [&](NNInputs input) -> float& {
664  return getCellImpl(cellGridMatrix, tau_idx, phi_idx, eta_idx, input);
665  };
666 
667  std::vector<int> trkGood;
668  std::vector<int> vtxGood;
669 
670  selectGoodTracksAndVertices(patavtx_soa, patatracks_tsoa, trkGood, vtxGood);
671 
672  const int nTaus = allTaus.size();
673  for (tau_idx = 0; tau_idx < nTaus; tau_idx++) {
674  const float tauEta = allTaus[tau_idx]->eta();
675  const float tauPhi = allTaus[tau_idx]->phi();
676 
677  for (const auto it : trkGood) {
678  const float patatrackPt = patatracks_tsoa.pt[it];
679  if (patatrackPt <= 0)
680  continue;
681  const float patatrackPhi = patatracks_tsoa.phi(it);
682  const float patatrackEta = patatracks_tsoa.eta(it);
683  const float patatrackCharge = patatracks_tsoa.charge(it);
684  const float patatrackChi2OverNdof = patatracks_tsoa.chi2(it);
685  const auto nHits = patatracks_tsoa.nHits(it);
686  if (nHits <= 0)
687  continue;
688  const int patatrackNdof = 2 * std::min(6, nHits) - 5;
689 
690  const int vtx_idx_assTrk = patavtx_soa.idv[it];
691  if (reco::deltaR2(patatrackEta, patatrackPhi, tauEta, tauPhi) < dR2_max) {
692  std::tie(deta, dphi, eta_idx, phi_idx) =
693  getEtaPhiIndices(patatrackEta, patatrackPhi, allTaus[tau_idx]->polarP4());
694  getCell(NNInputs::PatatrackPtSum) += patatrackPt;
695  getCell(NNInputs::PatatrackSize) += 1.;
696  getCell(NNInputs::PatatrackChargeSum) += patatrackCharge;
697  getCell(NNInputs::PatatrackDeltaEta) += deta * patatrackPt;
698  getCell(NNInputs::PatatrackDeltaPhi) += dphi * patatrackPt;
699  getCell(NNInputs::PatatrackChi2OverNdof) += patatrackChi2OverNdof * patatrackPt;
700  getCell(NNInputs::PatatrackNdof) += patatrackNdof * patatrackPt;
701  std::pair<float, float> impactParameters = impactParameter(it, patatracks_tsoa, patatrackPhi, beamspot, magfi);
702  getCell(NNInputs::PatatrackDxy) += impactParameters.first * patatrackPt;
703  getCell(NNInputs::PatatrackDz) += impactParameters.second * patatrackPt;
704  if ((std::find(vtxGood.begin(), vtxGood.end(), vtx_idx_assTrk) != vtxGood.end())) {
705  getCell(NNInputs::PatatrackPtSumWithVertex) += patatrackPt;
706  getCell(NNInputs::PatatrackSizeWithVertex) += 1.;
707  }
708  }
709  }
710 
711  // normalize to sum and define stdDev
712  for (eta_idx = 0; eta_idx < L2TauTagNNv1::nCellEta; eta_idx++) {
713  for (phi_idx = 0; phi_idx < L2TauTagNNv1::nCellPhi; phi_idx++) {
714  getCell(NNInputs::nVertices) = vtxGood.size();
715  if (getCell(NNInputs::PatatrackPtSum) > 0.) {
716  getCell(NNInputs::PatatrackDeltaEta) /= getCell(NNInputs::PatatrackPtSum);
717  getCell(NNInputs::PatatrackDeltaPhi) /= getCell(NNInputs::PatatrackPtSum);
718  getCell(NNInputs::PatatrackChi2OverNdof) /= getCell(NNInputs::PatatrackPtSum);
719  getCell(NNInputs::PatatrackNdof) /= getCell(NNInputs::PatatrackPtSum);
720  getCell(NNInputs::PatatrackDxy) /= getCell(NNInputs::PatatrackPtSum);
721  getCell(NNInputs::PatatrackDz) /= getCell(NNInputs::PatatrackPtSum);
722  }
723  }
724  }
725  }
726 }
constexpr float phi(int32_t i) const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
std::tuple< float, float, int, int > getEtaPhiIndices(const VPos &position, const LVec &tau_p4)
std::pair< float, float > impactParameter(int it, const pixelTrack::TrackSoA &patatracks_tsoa, float patatrackPhi, const reco::BeamSpot &beamspot, const MagneticField *magfi)
static std::string const input
Definition: EdmProvDump.cc:50
eigenSoA::ScalarSoA< float, S > pt
eigenSoA::ScalarSoA< float, S > chi2
void selectGoodTracksAndVertices(const ZVertexSoA &patavtx_soa, const pixelTrack::TrackSoA &patatracks_tsoa, std::vector< int > &trkGood, std::vector< int > &vtxGood)
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
constexpr float charge(int32_t i) const
caConstants::TupleMultiplicity const CAHitNtupletGeneratorKernelsGPU::HitToTuple const cms::cuda::AtomicPairCounter GPUCACell const *__restrict__ uint32_t const *__restrict__ gpuPixelDoublets::CellNeighborsVector const gpuPixelDoublets::CellTracksVector const GPUCACell::OuterHitOfCell const int32_t nHits
int16_t idv[MAXTRACKS]
Definition: ZVertexSoA.h:14
static constexpr float dR2_max
constexpr int nCellEta
constexpr int nHits(int i) const
eigenSoA::ScalarSoA< float, S > eta
constexpr int nCellPhi

◆ getEtaPhiIndices() [1/2]

template<typename VPos , typename LVec >
std::tuple< float, float, int, int > L2TauNNProducer::getEtaPhiIndices ( const VPos &  position,
const LVec &  tau_p4 
)
private

Definition at line 429 of file L2TauTagNNProducer.cc.

References position.

Referenced by fillCaloRecHits(), and fillPatatracks().

429  {
430  return getEtaPhiIndices(position.eta(), position.phi(), tau_p4);
431 }
std::tuple< float, float, int, int > getEtaPhiIndices(const VPos &position, const LVec &tau_p4)
static int position[264][3]
Definition: ReadPGInfo.cc:289

◆ getEtaPhiIndices() [2/2]

template<typename LVec >
std::tuple< float, float, int, int > L2TauNNProducer::getEtaPhiIndices ( float  eta,
float  phi,
const LVec &  tau_p4 
)
private

Definition at line 420 of file L2TauTagNNProducer.cc.

References reco::deltaPhi(), dEta_width, dPhi_width, L2TauTagNNv1::dR_max, PVValHelper::eta, and phi.

420  {
421  const float deta = eta - tau_p4.eta();
422  const float dphi = reco::deltaPhi(phi, tau_p4.phi());
423  const int eta_idx = static_cast<int>(floor((deta + L2TauTagNNv1::dR_max) / dEta_width));
424  const int phi_idx = static_cast<int>(floor((dphi + L2TauTagNNv1::dR_max) / dPhi_width));
425  return std::make_tuple(deta, dphi, eta_idx, phi_idx);
426 }
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
constexpr float dR_max
static constexpr float dPhi_width
static constexpr float dEta_width

◆ getTauScore()

std::vector< float > L2TauNNProducer::getTauScore ( const tensorflow::Tensor &  cellGridMatrix)
private

Definition at line 728 of file L2TauTagNNProducer.cc.

References L2cacheData_, tensorflow::run(), and L2TauNNProducerCacheData::session.

Referenced by produce().

728  {
729  std::vector<tensorflow::Tensor> pred_tensor;
730  tensorflow::run(L2cacheData_->session, {{inputTensorName_, cellGridMatrix}}, {outputTensorName_}, &pred_tensor);
731  const int nTau = cellGridMatrix.shape().dim_size(0);
732  std::vector<float> pred_vector(nTau);
733  for (int tau_idx = 0; tau_idx < nTau; ++tau_idx) {
734  pred_vector[tau_idx] = pred_tensor[0].matrix<float>()(tau_idx, 0);
735  }
736 
737  return pred_vector;
738 }
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
Definition: TensorFlow.cc:213
std::string outputTensorName_
const L2TauNNProducerCacheData * L2cacheData_
tensorflow::Session * session

◆ globalEndJob()

void L2TauNNProducer::globalEndJob ( L2TauNNProducerCacheData cacheData)
static

Definition at line 249 of file L2TauTagNNProducer.cc.

References tensorflow::closeSession(), L2TauNNProducerCacheData::graphDef, and L2TauNNProducerCacheData::session.

249  {
250  if (cacheData->graphDef != nullptr) {
251  delete cacheData->graphDef;
252  }
253  tensorflow::closeSession(cacheData->session);
254 }
bool closeSession(Session *&session)
Definition: TensorFlow.cc:198
tensorflow::GraphDef * graphDef
tensorflow::Session * session

◆ impactParameter()

std::pair< float, float > L2TauNNProducer::impactParameter ( int  it,
const pixelTrack::TrackSoA patatracks_tsoa,
float  patatrackPhi,
const reco::BeamSpot beamspot,
const MagneticField magfi 
)
private

Definition at line 619 of file L2TauTagNNProducer.cc.

References LocalTrajectoryParameters::charge(), funct::cos(), f, runTauDisplay::gp, M_PI_2, LocalTrajectoryParameters::momentum(), phi, LocalTrajectoryParameters::position(), createTree::pp, funct::sin(), TrackSoAHeterogeneousT< S >::stateAtBS, and riemannFit::transformToPerigeePlane().

Referenced by fillPatatracks().

623  {
624  auto const& fit = patatracks_tsoa.stateAtBS;
625  /* dxy and dz */
626  riemannFit::Vector5d ipar, opar;
627  riemannFit::Matrix5d icov, ocov;
628  fit.copyToDense(ipar, icov, it);
629  riemannFit::transformToPerigeePlane(ipar, icov, opar, ocov);
630  LocalTrajectoryParameters lpar(opar(0), opar(1), opar(2), opar(3), opar(4), 1.);
631  float sp = std::sin(patatrackPhi);
632  float cp = std::cos(patatrackPhi);
633  Surface::RotationType Rotation(sp, -cp, 0, 0, 0, -1.f, cp, sp, 0);
634  GlobalPoint BeamSpotPoint(beamspot.x0(), beamspot.y0(), beamspot.z0());
635  Plane impPointPlane(BeamSpotPoint, Rotation);
637  impPointPlane.toGlobal(lpar.position()), impPointPlane.toGlobal(lpar.momentum()), lpar.charge(), magfi);
638  GlobalPoint vv = gp.position();
639  math::XYZPoint pos(vv.x(), vv.y(), vv.z());
640  GlobalVector pp = gp.momentum();
641  math::XYZVector mom(pp.x(), pp.y(), pp.z());
642  auto lambda = M_PI_2 - pp.theta();
643  auto phi = pp.phi();
644  float patatrackDxy = -vv.x() * std::sin(phi) + vv.y() * std::cos(phi);
645  float patatrackDz =
646  (vv.z() * std::cos(lambda) - (vv.x() * std::cos(phi) + vv.y() * std::sin(phi)) * std::sin(lambda)) /
647  std::cos(lambda);
648  return std::make_pair(patatrackDxy, patatrackDz);
649 }
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
#define M_PI_2
Definition: Plane.h:16
Eigen::Matrix< double, 5, 1 > Vector5d
Definition: FitResult.h:16
__host__ __device__ void transformToPerigeePlane(VI5 const &ip, MI5 const &icov, VO5 &op, MO5 &ocov)
Definition: FitUtils.h:218
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
TrajectoryStateSoAT< S > stateAtBS
double f[11][100]
SOARotation< float > Rotation
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
Eigen::Matrix< double, 5, 5 > Matrix5d
Definition: FitResult.h:20

◆ initializeGlobalCache()

std::unique_ptr< L2TauNNProducerCacheData > L2TauNNProducer::initializeGlobalCache ( const edm::ParameterSet cfg)
static

Definition at line 224 of file L2TauTagNNProducer.cc.

References looper::cfg, tensorflow::createSession(), edm::FileInPath::fullPath(), HLT_2022v14_cff::graphPath, crabWrapper::key, tensorflow::loadGraphDef(), normDictElement::max, normDictElement::mean, normDictElement::min, HLT_2022v14_cff::normalizationDict, L2TauTagNNv1::nVars, tensorflow::setLogging(), normDictElement::std, AlCaHLTBitMon_QueryRunRegistry::string, heppy_batch::val, trigObjTnPSource_cfi::var, and L2TauTagNNv1::varNameMap.

224  {
225  std::unique_ptr<L2TauNNProducerCacheData> cacheData = std::make_unique<L2TauNNProducerCacheData>();
226  cacheData->normVec.reserve(L2TauTagNNv1::nVars);
227 
228  auto const graphPath = edm::FileInPath(cfg.getParameter<std::string>("graphPath")).fullPath();
229 
230  cacheData->graphDef = tensorflow::loadGraphDef(graphPath);
231  cacheData->session = tensorflow::createSession(cacheData->graphDef);
232 
234 
235  boost::property_tree::ptree loadPtreeRoot;
236  auto const normalizationDict = edm::FileInPath(cfg.getParameter<std::string>("normalizationDict")).fullPath();
237  boost::property_tree::read_json(normalizationDict, loadPtreeRoot);
238  for (const auto& [key, val] : L2TauTagNNv1::varNameMap) {
239  boost::property_tree::ptree var = loadPtreeRoot.get_child(val);
240  normDictElement current_element;
241  current_element.mean = var.get_child("mean").get_value<float>();
242  current_element.std = var.get_child("std").get_value<float>();
243  current_element.min = var.get_child("min").get_value<float>();
244  current_element.max = var.get_child("max").get_value<float>();
245  cacheData->normVec.push_back(current_element);
246  }
247  return cacheData;
248 }
Session * createSession(SessionOptions &sessionOptions)
Definition: TensorFlow.cc:85
std::string fullPath() const
Definition: FileInPath.cc:161
GraphDef * loadGraphDef(const std::string &pbFile)
Definition: TensorFlow.cc:68
constexpr int nVars
const std::map< NNInputs, std::string > varNameMap
void setLogging(const std::string &level="3")
Definition: TensorFlow.cc:15

◆ produce()

void L2TauNNProducer::produce ( edm::Event event,
const edm::EventSetup eventsetup 
)
overrideprivate

Definition at line 740 of file L2TauTagNNProducer.cc.

References beamSpotToken_, bFieldToken_, checknan(), debugLevel_, HLT_2022v14_cff::distance, L2TauNNProducer::caloRecHitCollections::eb, ebToken_, L2TauNNProducer::caloRecHitCollections::ee, eeToken_, fillCaloRecHits(), fillL1TauVars(), fillPatatracks(), spr::find(), relativeConstraints::geometry, L2TauNNProducer::caloRecHitCollections::geometry, geometryToken_, edm::EventSetup::getHandle(), getTauScore(), photonIsolationHIProducer_cfi::hbhe, L2TauNNProducer::caloRecHitCollections::hbhe, hbheToken_, photonIsolationHIProducer_cfi::ho, L2TauNNProducer::caloRecHitCollections::ho, hoToken_, L1TauDesc_, eostools::move(), L2TauTagNNv1::nCellEta, L2TauTagNNv1::nCellPhi, L2TauTagNNv1::nVars, pataTracksToken_, pataVerticesToken_, DiDispStaMuonMonitor_cfi::pt, standardizeTensor(), and trigger::TriggerL1Tau.

740  {
741  std::vector<std::vector<size_t>> TauCollectionMap(L1TauDesc_.size());
742  l1t::TauVectorRef allTaus;
743 
744  for (size_t inp_idx = 0; inp_idx < L1TauDesc_.size(); inp_idx++) {
745  l1t::TauVectorRef l1Taus;
746  auto const& l1TriggeredTaus = event.get(L1TauDesc_[inp_idx].inputToken_);
747  l1TriggeredTaus.getObjects(trigger::TriggerL1Tau, l1Taus);
748  TauCollectionMap.at(inp_idx).resize(l1Taus.size());
749 
750  for (size_t l1_idx = 0; l1_idx < l1Taus.size(); l1_idx++) {
751  size_t tau_idx;
752  const auto iter = std::find(allTaus.begin(), allTaus.end(), l1Taus[l1_idx]);
753  if (iter != allTaus.end()) {
754  tau_idx = std::distance(allTaus.begin(), iter);
755  } else {
756  allTaus.push_back(l1Taus[l1_idx]);
757  tau_idx = allTaus.size() - 1;
758  }
759  TauCollectionMap.at(inp_idx).at(l1_idx) = tau_idx;
760  }
761  }
762  const auto ebCal = event.getHandle(ebToken_);
763  const auto eeCal = event.getHandle(eeToken_);
764  const auto hbhe = event.getHandle(hbheToken_);
765  const auto ho = event.getHandle(hoToken_);
766  const auto& patatracks_SoA = *event.get(pataTracksToken_);
767  const auto& vertices_SoA = *event.get(pataVerticesToken_);
768  const auto bsHandle = event.getHandle(beamSpotToken_);
769 
770  auto const fieldESH = eventsetup.getHandle(bFieldToken_);
771  auto const geometry = eventsetup.getHandle(geometryToken_);
772 
773  caloRecHitCollections caloRecHits;
774  caloRecHits.hbhe = &*hbhe;
775  caloRecHits.ho = &*ho;
776  caloRecHits.eb = &*ebCal;
777  caloRecHits.ee = &*eeCal;
778  caloRecHits.geometry = &*geometry;
779 
780  const int nTaus = allTaus.size();
781  tensorflow::Tensor cellGridMatrix(tensorflow::DT_FLOAT,
783  const int n_inputs = nTaus * L2TauTagNNv1::nCellEta * L2TauTagNNv1::nCellPhi * L2TauTagNNv1::nVars;
784  for (int input_idx = 0; input_idx < n_inputs; ++input_idx) {
785  cellGridMatrix.flat<float>()(input_idx) = 0;
786  }
787  fillL1TauVars(cellGridMatrix, allTaus);
788 
789  fillCaloRecHits(cellGridMatrix, allTaus, caloRecHits);
790 
791  fillPatatracks(cellGridMatrix, allTaus, patatracks_SoA, vertices_SoA, *bsHandle, fieldESH.product());
792 
793  standardizeTensor(cellGridMatrix);
794 
795  if (debugLevel_ > 0) {
796  checknan(cellGridMatrix, debugLevel_);
797  }
798 
799  std::vector<float> tau_score = getTauScore(cellGridMatrix);
800 
801  for (size_t inp_idx = 0; inp_idx < L1TauDesc_.size(); inp_idx++) {
802  const size_t nTau = TauCollectionMap[inp_idx].size();
803  auto tau_tags = std::make_unique<std::vector<float>>(nTau);
804  for (size_t tau_pos = 0; tau_pos < nTau; ++tau_pos) {
805  const auto tau_idx = TauCollectionMap[inp_idx][tau_pos];
806  if (debugLevel_ > 0) {
807  edm::LogInfo("DebugInfo") << event.id().event() << " \t " << (allTaus[tau_idx])->pt() << " \t "
808  << tau_score.at(tau_idx) << std::endl;
809  }
810  (*tau_tags)[tau_pos] = tau_score.at(tau_idx);
811  }
812  event.put(std::move(tau_tags), L1TauDesc_[inp_idx].CollectionName);
813  }
814 }
const edm::EDGetTokenT< PixelTrackHeterogeneous > pataTracksToken_
void standardizeTensor(tensorflow::Tensor &tensor)
const edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
std::vector< float > getTauScore(const tensorflow::Tensor &cellGridMatrix)
const edm::EDGetTokenT< HORecHitCollection > hoToken_
std::vector< InputDescTau > L1TauDesc_
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
void checknan(tensorflow::Tensor &tensor, int debugLevel)
void fillCaloRecHits(tensorflow::Tensor &cellGridMatrix, const std::vector< l1t::TauRef > &allTaus, const caloRecHitCollections &caloRecHits)
constexpr int nVars
const edm::EDGetTokenT< ZVertexHeterogeneous > pataVerticesToken_
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > bFieldToken_
std::vector< TauRef > TauVectorRef
Definition: Tau.h:14
const edm::EDGetTokenT< HBHERecHitCollection > hbheToken_
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:151
void fillL1TauVars(tensorflow::Tensor &cellGridMatrix, const std::vector< l1t::TauRef > &allTaus)
Log< level::Info, false > LogInfo
constexpr int nCellEta
const edm::EDGetTokenT< EcalRecHitCollection > eeToken_
const edm::EDGetTokenT< EcalRecHitCollection > ebToken_
void fillPatatracks(tensorflow::Tensor &cellGridMatrix, const std::vector< l1t::TauRef > &allTaus, const pixelTrack::TrackSoA &patatracks_tsoa, const ZVertexSoA &patavtx_soa, const reco::BeamSpot &beamspot, const MagneticField *magfi)
def move(src, dest)
Definition: eostools.py:511
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > geometryToken_
constexpr int nCellPhi

◆ selectGoodTracksAndVertices()

void L2TauNNProducer::selectGoodTracksAndVertices ( const ZVertexSoA patavtx_soa,
const pixelTrack::TrackSoA patatracks_tsoa,
std::vector< int > &  trkGood,
std::vector< int > &  vtxGood 
)
private

Definition at line 572 of file L2TauTagNNProducer.cc.

References cms::cuda::assert(), TrackSoAHeterogeneousT< S >::chi2, fractionSumPt2_, ZVertexSoA::idv, dqmiolumiharvest::j, pixelTrack::loose, HLT_2022v14_cff::maxTracks, maxVtx_, SiStripPI::min, minSumPt2_, nHits, TrackSoAHeterogeneousT< S >::nHits(), ZVertexSoA::nvFinal, TrackSoAHeterogeneousT< S >::pt, quality, TrackSoAHeterogeneousT< S >::qualityData(), ZVertexSoA::sortInd, TrackSoAHeterogeneousT< S >::stride(), trackChi2Max_, trackPtMax_, and trackPtMin_.

Referenced by fillPatatracks().

575  {
576  const auto maxTracks = patatracks_tsoa.stride();
577  const int nv = patavtx_soa.nvFinal;
578  trkGood.clear();
579  trkGood.reserve(maxTracks);
580  vtxGood.clear();
581  vtxGood.reserve(nv);
582  auto const* quality = patatracks_tsoa.qualityData();
583 
584  // No need to sort either as the algorithms is just using the max (not even the location, just the max value of pt2sum).
585  std::vector<float> pTSquaredSum(nv, 0);
586  std::vector<int> nTrkAssociated(nv, 0);
587 
588  for (int32_t trk_idx = 0; trk_idx < maxTracks; ++trk_idx) {
589  auto nHits = patatracks_tsoa.nHits(trk_idx);
590  if (nHits == 0) {
591  break;
592  }
593  int vtx_ass_to_track = patavtx_soa.idv[trk_idx];
594  if (vtx_ass_to_track >= 0 && vtx_ass_to_track < nv) {
595  auto patatrackPt = patatracks_tsoa.pt[trk_idx];
596  ++nTrkAssociated[vtx_ass_to_track];
597  if (patatrackPt >= trackPtMin_ && patatracks_tsoa.chi2(trk_idx) <= trackChi2Max_) {
598  patatrackPt = std::min(patatrackPt, trackPtMax_);
599  pTSquaredSum[vtx_ass_to_track] += patatrackPt * patatrackPt;
600  }
601  }
602  if (nHits > 0 and quality[trk_idx] >= pixelTrack::Quality::loose) {
603  trkGood.push_back(trk_idx);
604  }
605  }
606  if (nv > 0) {
607  const auto minFOM_fromFrac = (*std::max_element(pTSquaredSum.begin(), pTSquaredSum.end())) * fractionSumPt2_;
608  for (int j = nv - 1; j >= 0 && vtxGood.size() < maxVtx_; --j) {
609  auto vtx_idx = patavtx_soa.sortInd[j];
610  assert(vtx_idx < nv);
611  if (nTrkAssociated[vtx_idx] >= 2 && pTSquaredSum[vtx_idx] >= minFOM_fromFrac &&
612  pTSquaredSum[vtx_idx] > minSumPt2_) {
613  vtxGood.push_back(vtx_idx);
614  }
615  }
616  }
617 }
static constexpr int32_t stride()
const unsigned int maxVtx_
assert(be >=bs)
const float fractionSumPt2_
eigenSoA::ScalarSoA< float, S > pt
eigenSoA::ScalarSoA< float, S > chi2
constexpr Quality const * qualityData() const
const float trackChi2Max_
caConstants::TupleMultiplicity const CAHitNtupletGeneratorKernelsGPU::HitToTuple const cms::cuda::AtomicPairCounter GPUCACell const *__restrict__ uint32_t const *__restrict__ gpuPixelDoublets::CellNeighborsVector const gpuPixelDoublets::CellTracksVector const GPUCACell::OuterHitOfCell const int32_t nHits
int16_t idv[MAXTRACKS]
Definition: ZVertexSoA.h:14
constexpr int nHits(int i) const
uint32_t nvFinal
Definition: ZVertexSoA.h:21
string quality
uint16_t sortInd[MAXVTX]
Definition: ZVertexSoA.h:20

◆ standardizeTensor()

void L2TauNNProducer::standardizeTensor ( tensorflow::Tensor &  tensor)
private

Definition at line 367 of file L2TauTagNNProducer.cc.

References ztail::d, Exception, input, L2cacheData_, SiStripPI::max, SiStripPI::mean, SiStripPI::min, and L2TauNNProducerCacheData::normVec.

Referenced by produce().

367  {
369  std::vector<int> tensor_shape(tensor.shape().dims());
370  for (int d = 0; d < tensor.shape().dims(); d++) {
371  tensor_shape.at(d) = tensor.shape().dim_size(d);
372  }
373  if (tensor_shape.size() != 4) {
374  throw cms::Exception("InvalidTensor") << "Tensor shape does not have 4 dimensions!";
375  }
376  for (int tau_idx = 0; tau_idx < tensor_shape.at(0); tau_idx++) {
377  for (int phi_idx = 0; phi_idx < tensor_shape.at(1); phi_idx++) {
378  for (int eta_idx = 0; eta_idx < tensor_shape.at(2); eta_idx++) {
379  for (int var_idx = 0; var_idx < tensor_shape.at(3); var_idx++) {
380  auto getCell = [&](NNInputs input) -> float& {
381  return getCellImpl(tensor, tau_idx, phi_idx, eta_idx, input);
382  };
383  float mean = L2cacheData_->normVec.at(var_idx).mean;
384  float std = L2cacheData_->normVec.at(var_idx).std;
385  float min = L2cacheData_->normVec.at(var_idx).min;
386  float max = L2cacheData_->normVec.at(var_idx).max;
387  float nonstd_var = getCell(static_cast<NNInputs>(var_idx));
388  float std_var = static_cast<float>((nonstd_var - mean) / std);
389  if (std_var > max) {
390  std_var = static_cast<float>(max);
391  } else if (std_var < min) {
392  std_var = static_cast<float>(min);
393  }
394  getCell(static_cast<NNInputs>(var_idx)) = std_var;
395  }
396  }
397  }
398  }
399 }
static std::string const input
Definition: EdmProvDump.cc:50
std::vector< normDictElement > normVec
d
Definition: ztail.py:151
const L2TauNNProducerCacheData * L2cacheData_

Member Data Documentation

◆ beamSpotToken_

const edm::EDGetTokenT<reco::BeamSpot> L2TauNNProducer::beamSpotToken_
private

Definition at line 212 of file L2TauTagNNProducer.cc.

Referenced by produce().

◆ bFieldToken_

const edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> L2TauNNProducer::bFieldToken_
private

Definition at line 209 of file L2TauTagNNProducer.cc.

Referenced by produce().

◆ debugLevel_

const int L2TauNNProducer::debugLevel_
private

Definition at line 201 of file L2TauTagNNProducer.cc.

Referenced by produce().

◆ dEta_width

constexpr float L2TauNNProducer::dEta_width = 2 * L2TauTagNNv1::dR_max / static_cast<float>(L2TauTagNNv1::nCellEta)
static

Definition at line 163 of file L2TauTagNNProducer.cc.

Referenced by getEtaPhiIndices().

◆ dPhi_width

constexpr float L2TauNNProducer::dPhi_width = 2 * L2TauTagNNv1::dR_max / static_cast<float>(L2TauTagNNv1::nCellPhi)
static

Definition at line 164 of file L2TauTagNNProducer.cc.

Referenced by getEtaPhiIndices().

◆ dR2_max

constexpr float L2TauNNProducer::dR2_max = L2TauTagNNv1::dR_max * L2TauTagNNv1::dR_max
static

Definition at line 162 of file L2TauTagNNProducer.cc.

Referenced by fillCaloRecHits(), and fillPatatracks().

◆ ebToken_

const edm::EDGetTokenT<EcalRecHitCollection> L2TauNNProducer::ebToken_
private

Definition at line 206 of file L2TauTagNNProducer.cc.

Referenced by produce().

◆ eeToken_

const edm::EDGetTokenT<EcalRecHitCollection> L2TauNNProducer::eeToken_
private

Definition at line 207 of file L2TauTagNNProducer.cc.

Referenced by produce().

◆ fractionSumPt2_

const float L2TauNNProducer::fractionSumPt2_
private

Definition at line 214 of file L2TauTagNNProducer.cc.

Referenced by selectGoodTracksAndVertices().

◆ geometryToken_

const edm::ESGetToken<CaloGeometry, CaloGeometryRecord> L2TauNNProducer::geometryToken_
private

Definition at line 208 of file L2TauTagNNProducer.cc.

Referenced by produce().

◆ hbheToken_

const edm::EDGetTokenT<HBHERecHitCollection> L2TauNNProducer::hbheToken_
private

Definition at line 204 of file L2TauTagNNProducer.cc.

Referenced by produce().

◆ hoToken_

const edm::EDGetTokenT<HORecHitCollection> L2TauNNProducer::hoToken_
private

Definition at line 205 of file L2TauTagNNProducer.cc.

Referenced by produce().

◆ inputTensorName_

std::string L2TauNNProducer::inputTensorName_
private

Definition at line 219 of file L2TauTagNNProducer.cc.

Referenced by L2TauNNProducer().

◆ L1TauDesc_

std::vector<InputDescTau> L2TauNNProducer::L1TauDesc_
private

Definition at line 203 of file L2TauTagNNProducer.cc.

Referenced by L2TauNNProducer(), and produce().

◆ L2cacheData_

const L2TauNNProducerCacheData* L2TauNNProducer::L2cacheData_
private

Definition at line 221 of file L2TauTagNNProducer.cc.

Referenced by getTauScore(), L2TauNNProducer(), and standardizeTensor().

◆ maxVtx_

const unsigned int L2TauNNProducer::maxVtx_
private

Definition at line 213 of file L2TauTagNNProducer.cc.

Referenced by selectGoodTracksAndVertices().

◆ minSumPt2_

const float L2TauNNProducer::minSumPt2_
private

Definition at line 215 of file L2TauTagNNProducer.cc.

Referenced by selectGoodTracksAndVertices().

◆ outputTensorName_

std::string L2TauNNProducer::outputTensorName_
private

Definition at line 220 of file L2TauTagNNProducer.cc.

Referenced by L2TauNNProducer().

◆ pataTracksToken_

const edm::EDGetTokenT<PixelTrackHeterogeneous> L2TauNNProducer::pataTracksToken_
private

Definition at line 211 of file L2TauTagNNProducer.cc.

Referenced by produce().

◆ pataVerticesToken_

const edm::EDGetTokenT<ZVertexHeterogeneous> L2TauNNProducer::pataVerticesToken_
private

Definition at line 210 of file L2TauTagNNProducer.cc.

Referenced by produce().

◆ tauTriggerToken_

const edm::EDGetTokenT<trigger::TriggerFilterObjectWithRefs> L2TauNNProducer::tauTriggerToken_
private

Definition at line 202 of file L2TauTagNNProducer.cc.

◆ trackChi2Max_

const float L2TauNNProducer::trackChi2Max_
private

Definition at line 218 of file L2TauTagNNProducer.cc.

Referenced by selectGoodTracksAndVertices().

◆ trackPtMax_

const float L2TauNNProducer::trackPtMax_
private

Definition at line 217 of file L2TauTagNNProducer.cc.

Referenced by selectGoodTracksAndVertices().

◆ trackPtMin_

const float L2TauNNProducer::trackPtMin_
private

Definition at line 216 of file L2TauTagNNProducer.cc.

Referenced by selectGoodTracksAndVertices().