CMS 3D CMS Logo

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

Classes

struct  Output
 
struct  TauDiscInfo
 

Public Types

using BasicDiscriminator = deep_tau::BasicDiscriminator
 
using CandidateCollection = edm::View< reco::Candidate >
 
using Cutter = deep_tau::TauWPThreshold
 
using CutterPtr = std::unique_ptr< Cutter >
 
using ElectronCollection = pat::ElectronCollection
 
using LorentzVectorXYZ = ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > >
 
using MuonCollection = pat::MuonCollection
 
using OutputCollection = std::map< std::string, Output >
 
using TauCollection = edm::View< reco::BaseTau >
 
using TauDiscriminator = reco::TauDiscriminatorContainer
 
using TauRef = edm::Ref< TauCollection >
 
using TauRefProd = edm::RefProd< TauCollection >
 
using WPList = std::vector< CutterPtr >
 
- Public Types inherited from edm::stream::EDProducer< edm::GlobalCache< deep_tau::DeepTauCache > >
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
 

Public Member Functions

 DeepTauId (const edm::ParameterSet &cfg, const deep_tau::DeepTauCache *cache)
 
const std::map< BasicDiscriminator, size_t > matchDiscriminatorIndices (edm::Event &event, edm::EDGetTokenT< reco::TauDiscriminatorContainer > discriminatorContainerToken, std::vector< BasicDiscriminator > requiredDiscr)
 
void produce (edm::Event &event, const edm::EventSetup &es) override
 
- Public Member Functions inherited from edm::stream::EDProducer< edm::GlobalCache< deep_tau::DeepTauCache > >
 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 &descriptions)
 
static const OutputCollectionGetOutputs ()
 
static void globalEndJob (const deep_tau::DeepTauCache *cache_)
 
static std::unique_ptr< deep_tau::DeepTauCacheinitializeGlobalCache (const edm::ParameterSet &cfg)
 

Public Attributes

uint8_t andPrediscriminants_
 
std::vector< TauDiscInfo< pat::PATTauDiscriminator > > patPrediscriminants_
 
std::vector< TauDiscInfo< reco::PFTauDiscriminator > > recoPrediscriminants_
 

Static Public Attributes

static constexpr float default_value = -999.
 

Private Member Functions

void checkInputs (const tensorflow::Tensor &inputs, const std::string &block_name, int n_inputs, const CellGrid *grid=nullptr) const
 
template<typename CandidateCastType , typename TauCastType >
void createConvFeatures (const TauCastType &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const reco::Vertex &pv, double rho, const std::vector< pat::Electron > *electrons, const std::vector< pat::Muon > *muons, const edm::View< reco::Candidate > &pfCands, const CellGrid &grid, TauFunc tau_funcs, bool is_inner)
 
template<typename CandidateCastType , typename TauCastType >
void createEgammaBlockInputs (unsigned idx, const TauCastType &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const reco::Vertex &pv, double rho, const std::vector< pat::Electron > *electrons, const edm::View< reco::Candidate > &pfCands, const Cell &cell_map, TauFunc tau_funcs, bool is_inner)
 
template<typename CandidateCastType , typename TauCastType >
void createHadronsBlockInputs (unsigned idx, const TauCastType &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const reco::Vertex &pv, double rho, const edm::View< reco::Candidate > &pfCands, const Cell &cell_map, TauFunc tau_funcs, bool is_inner)
 
template<typename CandidateCastType , typename TauCastType >
void createMuonBlockInputs (unsigned idx, const TauCastType &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const reco::Vertex &pv, double rho, const std::vector< pat::Muon > *muons, const edm::View< reco::Candidate > &pfCands, const Cell &cell_map, TauFunc tau_funcs, bool is_inner)
 
void createOutputs (edm::Event &event, const tensorflow::Tensor &pred, edm::Handle< TauCollection > taus)
 
template<typename CandidateCastType , typename TauCastType >
void createTauBlockInputs (const TauCastType &tau, const size_t &tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const reco::Vertex &pv, double rho, TauFunc tau_funcs)
 
template<typename Collection , typename TauCastType >
void fillGrids (const TauCastType &tau, const Collection &objects, CellGrid &inner_grid, CellGrid &outer_grid)
 
tensorflow::Tensor getPartialPredictions (bool is_inner)
 
tensorflow::Tensor getPredictions (edm::Event &event, edm::Handle< TauCollection > taus)
 
template<typename CandidateCastType , typename TauCastType >
void getPredictionsV2 (TauCollection::const_reference &tau, const size_t tau_index, const edm::RefToBase< reco::BaseTau > tau_ref, const std::vector< pat::Electron > *electrons, const std::vector< pat::Muon > *muons, const edm::View< reco::Candidate > &pfCands, const reco::Vertex &pv, double rho, const edm::EventNumber_t &eventnr, std::vector< tensorflow::Tensor > &pred_vector, TauFunc tau_funcs)
 
void saveInputs (const tensorflow::Tensor &inputs, const std::string &block_name, int n_inputs, const CellGrid *grid=nullptr)
 
void setCellConvFeatures (tensorflow::Tensor &convTensor, const tensorflow::Tensor &features, unsigned batch_idx, int eta_index, int phi_index)
 

Static Private Member Functions

static void calculateElectronClusterVars (const pat::Electron *ele, float &elecEe, float &elecEgamma)
 
static bool calculateElectronClusterVarsV2 (const pat::Electron &ele, float &cc_ele_energy, float &cc_gamma_energy, int &cc_n_gamma)
 
template<typename TauCastType >
static bool calculateGottfriedJacksonAngleDifference (const TauCastType &tau, const size_t tau_index, double &gj_diff, TauFunc tau_funcs)
 
template<typename TauCastType >
static float calculateGottfriedJacksonAngleDifference (const TauCastType &tau, const size_t tau_index, TauFunc tau_funcs)
 
template<typename TauCastType >
static const pat::ElectronfindMatchedElectron (const TauCastType &tau, const std::vector< pat::Electron > *electrons, double deltaR)
 
static double getInnerSignalConeRadius (double pt)
 
template<typename T >
static float getValue (T value)
 
template<typename T >
static float getValueLinear (T value, float min_value, float max_value, bool positive)
 
template<typename T >
static float getValueNorm (T value, float mean, float sigma, float n_sigmas_max=5)
 
static bool isAbove (double value, double min)
 
static bool isInEcalCrack (double eta)
 
template<typename CandidateCollection , typename TauCastType >
static void processIsolationPFComponents (const TauCastType &tau, const CandidateCollection &candidates, LorentzVectorXYZ &p4, float &pt, float &d_eta, float &d_phi, float &m, float &n)
 
template<typename CandidateCollection , typename TauCastType >
static void processSignalPFComponents (const TauCastType &tau, const CandidateCollection &candidates, LorentzVectorXYZ &p4_inner, LorentzVectorXYZ &p4_outer, float &pt_inner, float &dEta_inner, float &dPhi_inner, float &m_inner, float &pt_outer, float &dEta_outer, float &dPhi_outer, float &m_outer, float &n_inner, float &n_outer)
 

Private Attributes

std::map< BasicDiscriminator, size_t > basicDiscrdR03IndexMap_
 
std::map< BasicDiscriminator, size_t > basicDiscrIndexMap_
 
edm::EDGetTokenT< reco::TauDiscriminatorContainerbasicTauDiscriminators_inputToken_
 
edm::EDGetTokenT< reco::TauDiscriminatorContainerbasicTauDiscriminatorsdR03_inputToken_
 
const deep_tau::DeepTauCachecache_
 
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > convTensor_
 
const int debug_level
 
const bool disable_CellIndex_workaround_
 
const bool disable_dxy_pca_
 
const bool disable_hcalFraction_workaround_
 
bool discrIndicesMapped_ = false
 
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
 
edm::EDGetTokenT< std::vector< pat::Electron > > electrons_token_
 
int file_counter_
 
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
 
std::string input_layer_
 
bool is_first_block_
 
const bool is_online_
 
std::ofstream * json_file_
 
edm::EDGetTokenT< std::vector< pat::Muon > > muons_token_
 
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
 
std::string output_layer_
 
OutputCollection outputs_
 
edm::EDGetTokenT< CandidateCollectionpfcandToken_
 
edm::EDGetTokenT< edm::AssociationVector< reco::PFTauRefProd, std::vector< reco::PFTauTransverseImpactParameterRef > > > pfTauTransverseImpactParameters_token_
 
const std::vector< BasicDiscriminatorrequiredBasicDiscriminators_
 
const std::vector< BasicDiscriminatorrequiredBasicDiscriminatorsdR03_
 
edm::EDGetTokenT< double > rho_token_
 
const bool save_inputs_
 
const std::map< std::pair< deep_tau::Scaling::FeatureT, bool >, deep_tau::Scaling::ScalingParams > * scalingParamsMap_
 
const std::map< BasicDiscriminator, std::string > stringFromDiscriminator_
 
const unsigned sub_version_
 
std::unique_ptr< tensorflow::Tensor > tauBlockTensor_
 
std::vector< int > tauInputs_indices_
 
edm::EDGetTokenT< TauCollectiontausToken_
 
const unsigned version_
 
edm::EDGetTokenT< reco::VertexCollectionvtxToken_
 
std::map< std::string, WPListworkingPoints_
 
const unsigned year_
 
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > zeroOutputTensor_
 

Static Private Attributes

static constexpr float pi = M_PI
 

Detailed Description

Definition at line 944 of file DeepTauId.cc.

Member Typedef Documentation

◆ BasicDiscriminator

Definition at line 1009 of file DeepTauId.cc.

◆ CandidateCollection

Definition at line 948 of file DeepTauId.cc.

◆ Cutter

Definition at line 954 of file DeepTauId.cc.

◆ CutterPtr

using DeepTauId::CutterPtr = std::unique_ptr<Cutter>

Definition at line 955 of file DeepTauId.cc.

◆ ElectronCollection

Definition at line 951 of file DeepTauId.cc.

◆ LorentzVectorXYZ

using DeepTauId::LorentzVectorXYZ = ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> >

Definition at line 953 of file DeepTauId.cc.

◆ MuonCollection

Definition at line 952 of file DeepTauId.cc.

◆ OutputCollection

using DeepTauId::OutputCollection = std::map<std::string, Output>

Definition at line 995 of file DeepTauId.cc.

◆ TauCollection

Definition at line 947 of file DeepTauId.cc.

◆ TauDiscriminator

Definition at line 946 of file DeepTauId.cc.

◆ TauRef

Definition at line 949 of file DeepTauId.cc.

◆ TauRefProd

Definition at line 950 of file DeepTauId.cc.

◆ WPList

using DeepTauId::WPList = std::vector<CutterPtr>

Definition at line 956 of file DeepTauId.cc.

Constructor & Destructor Documentation

◆ DeepTauId()

DeepTauId::DeepTauId ( const edm::ParameterSet cfg,
const deep_tau::DeepTauCache cache 
)
inlineexplicit

Definition at line 1088 of file DeepTauId.cc.

References andPrediscriminants_, looper::cfg, convTensor_, DMR_cfg::cut, DeepTauId::TauDiscInfo< ConsumeType >::cut, DeepTauId::TauDiscInfo< ConsumeType >::disc_token, eGammaTensor_, nanoDQM_cfi::Electron, mps_fire::end, Exception, edm::ParameterSet::getParameter(), edm::ParameterSet::getParameterNamesForType(), getPartialPredictions(), hadronsTensor_, mps_fire::i, is_online_, label, DeepTauId::TauDiscInfo< ConsumeType >::label, dumpRecoGeometry_cfg::Muon, muonTensor_, dqmiodumpmetadata::n, outputs_, AlCaHLTBitMon_ParallelJobs::p, patPrediscriminants_, recoPrediscriminants_, scalingParamsMap_, deep_tau::Scaling::scalingParamsMap_PhaseIIv2p5, deep_tau::Scaling::scalingParamsMap_v2p1, deep_tau::Scaling::scalingParamsMap_v2p5, setCellConvFeatures(), findQualityFiles::size, jetUpdater_cfi::sort, AlCaHLTBitMon_QueryRunRegistry::string, sub_version_, tauBlockTensor_, tauInputs_indices_, HcalDetIdTransform::transform(), findQualityFiles::v, version_, workingPoints_, year_, and zeroOutputTensor_.

1089  : tausToken_(consumes<TauCollection>(cfg.getParameter<edm::InputTag>("taus"))),
1090  pfcandToken_(consumes<CandidateCollection>(cfg.getParameter<edm::InputTag>("pfcands"))),
1091  vtxToken_(consumes<reco::VertexCollection>(cfg.getParameter<edm::InputTag>("vertices"))),
1092  is_online_(cfg.getParameter<bool>("is_online")),
1093  outputs_(GetOutputs()),
1094  cache_(cache),
1095  electrons_token_(consumes<std::vector<pat::Electron>>(cfg.getParameter<edm::InputTag>("electrons"))),
1096  muons_token_(consumes<std::vector<pat::Muon>>(cfg.getParameter<edm::InputTag>("muons"))),
1097  rho_token_(consumes<double>(cfg.getParameter<edm::InputTag>("rho"))),
1098  basicTauDiscriminators_inputToken_(consumes<reco::TauDiscriminatorContainer>(
1099  cfg.getUntrackedParameter<edm::InputTag>("basicTauDiscriminators"))),
1100  basicTauDiscriminatorsdR03_inputToken_(consumes<reco::TauDiscriminatorContainer>(
1101  cfg.getUntrackedParameter<edm::InputTag>("basicTauDiscriminatorsdR03"))),
1103  consumes<edm::AssociationVector<reco::PFTauRefProd, std::vector<reco::PFTauTransverseImpactParameterRef>>>(
1104  cfg.getParameter<edm::InputTag>("pfTauTransverseImpactParameters"))),
1105  year_(cfg.getParameter<unsigned>("year")),
1106  version_(cfg.getParameter<unsigned>("version")),
1107  sub_version_(cfg.getParameter<unsigned>("sub_version")),
1108  debug_level(cfg.getParameter<int>("debug_level")),
1109  disable_dxy_pca_(cfg.getParameter<bool>("disable_dxy_pca")),
1110  disable_hcalFraction_workaround_(cfg.getParameter<bool>("disable_hcalFraction_workaround")),
1111  disable_CellIndex_workaround_(cfg.getParameter<bool>("disable_CellIndex_workaround")),
1112  save_inputs_(cfg.getParameter<bool>("save_inputs")),
1113  json_file_(nullptr),
1114  file_counter_(0) {
1115  for (const auto& output_desc : outputs_) {
1116  produces<TauDiscriminator>(output_desc.first);
1117  const auto& cut_list = cfg.getParameter<std::vector<std::string>>(output_desc.first + "WP");
1118  for (const std::string& cut_str : cut_list) {
1119  workingPoints_[output_desc.first].push_back(std::make_unique<Cutter>(cut_str));
1120  }
1121  }
1122 
1123  // prediscriminant operator
1124  // require the tau to pass the following prediscriminants
1125  const edm::ParameterSet& prediscriminantConfig = cfg.getParameter<edm::ParameterSet>("Prediscriminants");
1126 
1127  // determine boolean operator used on the prediscriminants
1128  std::string pdBoolOperator = prediscriminantConfig.getParameter<std::string>("BooleanOperator");
1129  // convert string to lowercase
1130  transform(pdBoolOperator.begin(), pdBoolOperator.end(), pdBoolOperator.begin(), ::tolower);
1131 
1132  if (pdBoolOperator == "and") {
1133  andPrediscriminants_ = 0x1; //use chars instead of bools so we can do a bitwise trick later
1134  } else if (pdBoolOperator == "or") {
1135  andPrediscriminants_ = 0x0;
1136  } else {
1137  throw cms::Exception("TauDiscriminationProducerBase")
1138  << "PrediscriminantBooleanOperator defined incorrectly, options are: AND,OR";
1139  }
1140 
1141  // get the list of prediscriminants
1142  std::vector<std::string> prediscriminantsNames =
1143  prediscriminantConfig.getParameterNamesForType<edm::ParameterSet>();
1144 
1145  for (auto const& iDisc : prediscriminantsNames) {
1146  const edm::ParameterSet& iPredisc = prediscriminantConfig.getParameter<edm::ParameterSet>(iDisc);
1147  const edm::InputTag& label = iPredisc.getParameter<edm::InputTag>("Producer");
1148  double cut = iPredisc.getParameter<double>("cut");
1149 
1150  if (is_online_) {
1151  TauDiscInfo<reco::PFTauDiscriminator> thisDiscriminator;
1152  thisDiscriminator.label = label;
1153  thisDiscriminator.cut = cut;
1154  thisDiscriminator.disc_token = consumes<reco::PFTauDiscriminator>(label);
1155  recoPrediscriminants_.push_back(thisDiscriminator);
1156  } else {
1157  TauDiscInfo<pat::PATTauDiscriminator> thisDiscriminator;
1158  thisDiscriminator.label = label;
1159  thisDiscriminator.cut = cut;
1160  thisDiscriminator.disc_token = consumes<pat::PATTauDiscriminator>(label);
1161  patPrediscriminants_.push_back(thisDiscriminator);
1162  }
1163  }
1164  if (version_ == 2) {
1165  using namespace dnn_inputs_v2;
1166  namespace sc = deep_tau::Scaling;
1167  tauInputs_indices_.resize(TauBlockInputs::NumberOfInputs);
1168  std::iota(std::begin(tauInputs_indices_), std::end(tauInputs_indices_), 0);
1169 
1170  if (sub_version_ == 1) {
1171  tauBlockTensor_ = std::make_unique<tensorflow::Tensor>(
1172  tensorflow::DT_FLOAT, tensorflow::TensorShape{1, TauBlockInputs::NumberOfInputs});
1174  } else if (sub_version_ == 5) {
1175  std::sort(TauBlockInputs::varsToDrop.begin(), TauBlockInputs::varsToDrop.end());
1176  for (auto v : TauBlockInputs::varsToDrop) {
1177  tauInputs_indices_.at(v) = -1; // set index to -1
1178  for (std::size_t i = v + 1; i < TauBlockInputs::NumberOfInputs; ++i)
1179  tauInputs_indices_.at(i) -= 1; // shift all the following indices by 1
1180  }
1181  tauBlockTensor_ = std::make_unique<tensorflow::Tensor>(
1182  tensorflow::DT_FLOAT,
1183  tensorflow::TensorShape{1,
1184  static_cast<int>(TauBlockInputs::NumberOfInputs) -
1185  static_cast<int>(TauBlockInputs::varsToDrop.size())});
1186  if (year_ == 2026) {
1188  } else {
1190  }
1191  } else
1192  throw cms::Exception("DeepTauId") << "subversion " << sub_version_ << " is not supported.";
1193 
1194  std::map<std::vector<bool>, std::vector<sc::FeatureT>> GridFeatureTypes_map = {
1195  {{false}, {sc::FeatureT::TauFlat, sc::FeatureT::GridGlobal}}, // feature types without inner/outer grid split
1196  {{false, true},
1197  {sc::FeatureT::PfCand_electron,
1198  sc::FeatureT::PfCand_muon, // feature types with inner/outer grid split
1199  sc::FeatureT::PfCand_chHad,
1200  sc::FeatureT::PfCand_nHad,
1201  sc::FeatureT::PfCand_gamma,
1203  sc::FeatureT::Muon}}};
1204 
1205  // check that sizes of mean/std/lim_min/lim_max vectors are equal between each other
1206  for (const auto& p : GridFeatureTypes_map) {
1207  for (auto is_inner : p.first) {
1208  for (auto featureType : p.second) {
1209  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(featureType, is_inner));
1210  if (!(sp.mean_.size() == sp.std_.size() && sp.mean_.size() == sp.lim_min_.size() &&
1211  sp.mean_.size() == sp.lim_max_.size()))
1212  throw cms::Exception("DeepTauId") << "sizes of scaling parameter vectors do not match between each other";
1213  }
1214  }
1215  }
1216 
1217  for (size_t n = 0; n < 2; ++n) {
1218  const bool is_inner = n == 0;
1219  const auto n_cells = is_inner ? number_of_inner_cell : number_of_outer_cell;
1220  eGammaTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1221  tensorflow::DT_FLOAT, tensorflow::TensorShape{1, 1, 1, EgammaBlockInputs::NumberOfInputs});
1222  muonTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1223  tensorflow::DT_FLOAT, tensorflow::TensorShape{1, 1, 1, MuonBlockInputs::NumberOfInputs});
1224  hadronsTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1225  tensorflow::DT_FLOAT, tensorflow::TensorShape{1, 1, 1, HadronBlockInputs::NumberOfInputs});
1226  convTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1227  tensorflow::DT_FLOAT, tensorflow::TensorShape{1, n_cells, n_cells, number_of_conv_features});
1228  zeroOutputTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1229  tensorflow::DT_FLOAT, tensorflow::TensorShape{1, 1, 1, number_of_conv_features});
1230 
1231  eGammaTensor_[is_inner]->flat<float>().setZero();
1232  muonTensor_[is_inner]->flat<float>().setZero();
1233  hadronsTensor_[is_inner]->flat<float>().setZero();
1234 
1235  setCellConvFeatures(*zeroOutputTensor_[is_inner], getPartialPredictions(is_inner), 0, 0, 0);
1236  }
1237  } else {
1238  throw cms::Exception("DeepTauId") << "version " << version_ << " is not supported.";
1239  }
1240  }
size
Write out results.
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
Definition: DeepTauId.cc:2781
std::map< std::string, WPList > workingPoints_
Definition: DeepTauId.cc:2741
const bool disable_dxy_pca_
Definition: DeepTauId.cc:2777
const bool save_inputs_
Definition: DeepTauId.cc:2784
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > zeroOutputTensor_
Definition: DeepTauId.cc:2781
int file_counter_
Definition: DeepTauId.cc:2787
edm::EDGetTokenT< reco::VertexCollection > vtxToken_
Definition: DeepTauId.cc:2740
std::vector< TauDiscInfo< reco::PFTauDiscriminator > > recoPrediscriminants_
Definition: DeepTauId.cc:1317
uint8_t andPrediscriminants_
Definition: DeepTauId.cc:1315
std::ofstream * json_file_
Definition: DeepTauId.cc:2785
OutputCollection outputs_
Definition: DeepTauId.cc:2743
void setCellConvFeatures(tensorflow::Tensor &convTensor, const tensorflow::Tensor &features, unsigned batch_idx, int eta_index, int phi_index)
Definition: DeepTauId.cc:1869
const unsigned version_
Definition: DeepTauId.cc:2774
std::vector< TauDiscInfo< pat::PATTauDiscriminator > > patPrediscriminants_
Definition: DeepTauId.cc:1316
const unsigned sub_version_
Definition: DeepTauId.cc:2775
edm::EDGetTokenT< TauCollection > tausToken_
Definition: DeepTauId.cc:2738
const std::map< std::pair< deep_tau::Scaling::FeatureT, bool >, deep_tau::Scaling::ScalingParams > * scalingParamsMap_
Definition: DeepTauId.cc:2783
static const OutputCollection & GetOutputs()
Definition: DeepTauId.cc:999
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > convTensor_
Definition: DeepTauId.cc:2781
const std::map< std::pair< FeatureT, bool >, ScalingParams > scalingParamsMap_v2p5
const deep_tau::DeepTauCache * cache_
Definition: DeepTauId.cc:2744
char const * label
edm::EDGetTokenT< CandidateCollection > pfcandToken_
Definition: DeepTauId.cc:2739
const unsigned year_
Definition: DeepTauId.cc:2773
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:179
const bool disable_CellIndex_workaround_
Definition: DeepTauId.cc:2779
const std::map< std::pair< FeatureT, bool >, ScalingParams > scalingParamsMap_v2p1
tensorflow::Tensor getPartialPredictions(bool is_inner)
Definition: DeepTauId.cc:1763
edm::EDGetTokenT< edm::AssociationVector< reco::PFTauRefProd, std::vector< reco::PFTauTransverseImpactParameterRef > > > pfTauTransverseImpactParameters_token_
Definition: DeepTauId.cc:2771
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminators_inputToken_
Definition: DeepTauId.cc:2768
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
Definition: DeepTauId.cc:2781
const bool disable_hcalFraction_workaround_
Definition: DeepTauId.cc:2778
const bool is_online_
Definition: DeepTauId.cc:2742
def cache(function)
Definition: utilities.py:3
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminatorsdR03_inputToken_
Definition: DeepTauId.cc:2769
std::vector< int > tauInputs_indices_
Definition: DeepTauId.cc:2788
const int debug_level
Definition: DeepTauId.cc:2776
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
Definition: DeepTauId.cc:2781
edm::EDGetTokenT< std::vector< pat::Electron > > electrons_token_
Definition: DeepTauId.cc:2765
edm::EDGetTokenT< std::vector< pat::Muon > > muons_token_
Definition: DeepTauId.cc:2766
edm::EDGetTokenT< double > rho_token_
Definition: DeepTauId.cc:2767
const std::map< std::pair< FeatureT, bool >, ScalingParams > scalingParamsMap_PhaseIIv2p5
std::unique_ptr< tensorflow::Tensor > tauBlockTensor_
Definition: DeepTauId.cc:2780
unsigned transform(const HcalDetId &id, unsigned transformCode)

Member Function Documentation

◆ calculateElectronClusterVars()

static void DeepTauId::calculateElectronClusterVars ( const pat::Electron ele,
float &  elecEe,
float &  elecEgamma 
)
inlinestaticprivate

Definition at line 2593 of file DeepTauId.cc.

References default_value, hcalRecHitTable_cff::energy, and pat::Electron::superCluster().

2593  {
2594  if (ele) {
2595  elecEe = elecEgamma = 0;
2596  auto superCluster = ele->superCluster();
2597  if (superCluster.isNonnull() && superCluster.isAvailable() && superCluster->clusters().isNonnull() &&
2598  superCluster->clusters().isAvailable()) {
2599  for (auto iter = superCluster->clustersBegin(); iter != superCluster->clustersEnd(); ++iter) {
2600  const double energy = (*iter)->energy();
2601  if (iter == superCluster->clustersBegin())
2602  elecEe += energy;
2603  else
2604  elecEgamma += energy;
2605  }
2606  }
2607  } else {
2608  elecEe = elecEgamma = default_value;
2609  }
2610  }
static constexpr float default_value
Definition: DeepTauId.cc:997
reco::SuperClusterRef superCluster() const override
override the reco::GsfElectron::superCluster method, to access the internal storage of the superclust...

◆ calculateElectronClusterVarsV2()

static bool DeepTauId::calculateElectronClusterVarsV2 ( const pat::Electron ele,
float &  cc_ele_energy,
float &  cc_gamma_energy,
int &  cc_n_gamma 
)
inlinestaticprivate

Definition at line 1357 of file DeepTauId.cc.

References hcalRecHitTable_cff::energy, and pat::Electron::superCluster().

Referenced by createEgammaBlockInputs().

1360  {
1361  cc_ele_energy = cc_gamma_energy = 0;
1362  cc_n_gamma = 0;
1363  const auto& superCluster = ele.superCluster();
1364  if (superCluster.isNonnull() && superCluster.isAvailable() && superCluster->clusters().isNonnull() &&
1365  superCluster->clusters().isAvailable()) {
1366  for (auto iter = superCluster->clustersBegin(); iter != superCluster->clustersEnd(); ++iter) {
1367  const float energy = static_cast<float>((*iter)->energy());
1368  if (iter == superCluster->clustersBegin())
1369  cc_ele_energy += energy;
1370  else {
1371  cc_gamma_energy += energy;
1372  ++cc_n_gamma;
1373  }
1374  }
1375  return true;
1376  } else
1377  return false;
1378  }
reco::SuperClusterRef superCluster() const override
override the reco::GsfElectron::superCluster method, to access the internal storage of the superclust...

◆ calculateGottfriedJacksonAngleDifference() [1/2]

template<typename TauCastType >
static bool DeepTauId::calculateGottfriedJacksonAngleDifference ( const TauCastType &  tau,
const size_t  tau_index,
double &  gj_diff,
TauFunc  tau_funcs 
)
inlinestaticprivate

Definition at line 2687 of file DeepTauId.cc.

References funct::abs(), conifer::pow(), and metsig::tau.

Referenced by calculateGottfriedJacksonAngleDifference(), and createTauBlockInputs().

2690  {
2691  if (tau_funcs.getHasSecondaryVertex(tau, tau_index)) {
2692  static constexpr double mTau = 1.77682;
2693  const double mAOne = tau.p4().M();
2694  const double pAOneMag = tau.p();
2695  const double argumentThetaGJmax = (std::pow(mTau, 2) - std::pow(mAOne, 2)) / (2 * mTau * pAOneMag);
2696  const double argumentThetaGJmeasured = tau.p4().Vect().Dot(tau_funcs.getFlightLength(tau, tau_index)) /
2697  (pAOneMag * tau_funcs.getFlightLength(tau, tau_index).R());
2698  if (std::abs(argumentThetaGJmax) <= 1. && std::abs(argumentThetaGJmeasured) <= 1.) {
2699  double thetaGJmax = std::asin(argumentThetaGJmax);
2700  double thetaGJmeasured = std::acos(argumentThetaGJmeasured);
2701  gj_diff = thetaGJmeasured - thetaGJmax;
2702  return true;
2703  }
2704  }
2705  return false;
2706  }
constexpr int pow(int x)
Definition: conifer.h:24
Abs< T >::type abs(const T &t)
Definition: Abs.h:22

◆ calculateGottfriedJacksonAngleDifference() [2/2]

template<typename TauCastType >
static float DeepTauId::calculateGottfriedJacksonAngleDifference ( const TauCastType &  tau,
const size_t  tau_index,
TauFunc  tau_funcs 
)
inlinestaticprivate

Definition at line 2709 of file DeepTauId.cc.

References calculateGottfriedJacksonAngleDifference(), default_value, and metsig::tau.

2711  {
2712  double gj_diff;
2713  if (calculateGottfriedJacksonAngleDifference(tau, tau_index, gj_diff, tau_funcs))
2714  return static_cast<float>(gj_diff);
2715  return default_value;
2716  }
static constexpr float default_value
Definition: DeepTauId.cc:997
static bool calculateGottfriedJacksonAngleDifference(const TauCastType &tau, const size_t tau_index, double &gj_diff, TauFunc tau_funcs)
Definition: DeepTauId.cc:2687

◆ checkInputs()

void DeepTauId::checkInputs ( const tensorflow::Tensor &  inputs,
const std::string &  block_name,
int  n_inputs,
const CellGrid *  grid = nullptr 
) const
inlineprivate

Definition at line 1380 of file DeepTauId.cc.

References cms::cuda::assert(), gather_cfg::cout, debug_level, PVValHelper::eta, Exception, alignBH_cfg::fixed, nano_mu_digi_cff::float, getRunAppsInfo::grid, input, PixelMapPlotter::inputs, edm::isNotFinite(), and phi.

Referenced by getPredictionsV2().

1383  {
1384  if (debug_level >= 1) {
1385  std::cout << "<checkInputs>: block_name = " << block_name << std::endl;
1386  if (block_name == "input_tau") {
1387  for (int input_index = 0; input_index < n_inputs; ++input_index) {
1388  float input = inputs.matrix<float>()(0, input_index);
1389  if (edm::isNotFinite(input)) {
1390  throw cms::Exception("DeepTauId")
1391  << "in the " << block_name
1392  << ", input is not finite, i.e. infinite or NaN, for input_index = " << input_index;
1393  }
1394  if (debug_level >= 2) {
1395  std::cout << block_name << "[var = " << input_index << "] = " << std::setprecision(5) << std::fixed << input
1396  << std::endl;
1397  }
1398  }
1399  } else {
1400  assert(grid);
1401  int n_eta, n_phi;
1402  if (block_name.find("input_inner") != std::string::npos) {
1403  n_eta = 5;
1404  n_phi = 5;
1405  } else if (block_name.find("input_outer") != std::string::npos) {
1406  n_eta = 10;
1407  n_phi = 10;
1408  } else
1409  assert(0);
1410  int eta_phi_index = 0;
1411  for (int eta = -n_eta; eta <= n_eta; ++eta) {
1412  for (int phi = -n_phi; phi <= n_phi; ++phi) {
1413  const CellIndex cell_index{eta, phi};
1414  const auto cell_iter = grid->find(cell_index);
1415  if (cell_iter != grid->end()) {
1416  for (int input_index = 0; input_index < n_inputs; ++input_index) {
1417  float input = inputs.tensor<float, 4>()(eta_phi_index, 0, 0, input_index);
1418  if (edm::isNotFinite(input)) {
1419  throw cms::Exception("DeepTauId")
1420  << "in the " << block_name << ", input is not finite, i.e. infinite or NaN, for eta = " << eta
1421  << ", phi = " << phi << ", input_index = " << input_index;
1422  }
1423  if (debug_level >= 2) {
1424  std::cout << block_name << "[eta = " << eta << "][phi = " << phi << "][var = " << input_index
1425  << "] = " << std::setprecision(5) << std::fixed << input << std::endl;
1426  }
1427  }
1428  eta_phi_index += 1;
1429  }
1430  }
1431  }
1432  }
1433  }
1434  }
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
assert(be >=bs)
static std::string const input
Definition: EdmProvDump.cc:50
const int debug_level
Definition: DeepTauId.cc:2776

◆ createConvFeatures()

template<typename CandidateCastType , typename TauCastType >
void DeepTauId::createConvFeatures ( const TauCastType &  tau,
const size_t  tau_index,
const edm::RefToBase< reco::BaseTau tau_ref,
const reco::Vertex pv,
double  rho,
const std::vector< pat::Electron > *  electrons,
const std::vector< pat::Muon > *  muons,
const edm::View< reco::Candidate > &  pfCands,
const CellGrid &  grid,
TauFunc  tau_funcs,
bool  is_inner 
)
inlineprivate

Definition at line 1788 of file DeepTauId.cc.

References convTensor_, gather_cfg::cout, debug_level, eGammaTensor_, pwdgSkimBPark_cfi::electrons, PVValHelper::eta, getPartialPredictions(), getRunAppsInfo::grid, hadronsTensor_, heavyIonCSV_trainingSettings::idx, createfilelist::int, PDWG_BPHSkim_cff::muons, muonTensor_, phi, MetAnalyzer::pv(), rho, setCellConvFeatures(), metsig::tau, and zeroOutputTensor_.

1798  {
1799  if (debug_level >= 2) {
1800  std::cout << "<DeepTauId::createConvFeatures (is_inner = " << is_inner << ")>:" << std::endl;
1801  }
1802  tensorflow::Tensor& convTensor = *convTensor_.at(is_inner);
1803  eGammaTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1804  tensorflow::DT_FLOAT,
1805  tensorflow::TensorShape{
1806  (long long int)grid.num_valid_cells(), 1, 1, dnn_inputs_v2::EgammaBlockInputs::NumberOfInputs});
1807  muonTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1808  tensorflow::DT_FLOAT,
1809  tensorflow::TensorShape{
1810  (long long int)grid.num_valid_cells(), 1, 1, dnn_inputs_v2::MuonBlockInputs::NumberOfInputs});
1811  hadronsTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1812  tensorflow::DT_FLOAT,
1813  tensorflow::TensorShape{
1814  (long long int)grid.num_valid_cells(), 1, 1, dnn_inputs_v2::HadronBlockInputs::NumberOfInputs});
1815 
1816  eGammaTensor_[is_inner]->flat<float>().setZero();
1817  muonTensor_[is_inner]->flat<float>().setZero();
1818  hadronsTensor_[is_inner]->flat<float>().setZero();
1819 
1820  unsigned idx = 0;
1821  for (int eta = -grid.maxEtaIndex(); eta <= grid.maxEtaIndex(); ++eta) {
1822  for (int phi = -grid.maxPhiIndex(); phi <= grid.maxPhiIndex(); ++phi) {
1823  if (debug_level >= 2) {
1824  std::cout << "processing ( eta = " << eta << ", phi = " << phi << " )" << std::endl;
1825  }
1826  const CellIndex cell_index{eta, phi};
1827  const auto cell_iter = grid.find(cell_index);
1828  if (cell_iter != grid.end()) {
1829  if (debug_level >= 2) {
1830  std::cout << " creating inputs for ( eta = " << eta << ", phi = " << phi << " ): idx = " << idx
1831  << std::endl;
1832  }
1833  const Cell& cell = cell_iter->second;
1834  createEgammaBlockInputs<CandidateCastType>(
1835  idx, tau, tau_index, tau_ref, pv, rho, electrons, pfCands, cell, tau_funcs, is_inner);
1836  createMuonBlockInputs<CandidateCastType>(
1837  idx, tau, tau_index, tau_ref, pv, rho, muons, pfCands, cell, tau_funcs, is_inner);
1838  createHadronsBlockInputs<CandidateCastType>(
1839  idx, tau, tau_index, tau_ref, pv, rho, pfCands, cell, tau_funcs, is_inner);
1840  idx += 1;
1841  } else {
1842  if (debug_level >= 2) {
1843  std::cout << " skipping creation of inputs, because ( eta = " << eta << ", phi = " << phi
1844  << " ) is not in the grid !!" << std::endl;
1845  }
1846  }
1847  }
1848  }
1849 
1850  const auto predTensor = getPartialPredictions(is_inner);
1851  idx = 0;
1852  for (int eta = -grid.maxEtaIndex(); eta <= grid.maxEtaIndex(); ++eta) {
1853  for (int phi = -grid.maxPhiIndex(); phi <= grid.maxPhiIndex(); ++phi) {
1854  const CellIndex cell_index{eta, phi};
1855  const int eta_index = grid.getEtaTensorIndex(cell_index);
1856  const int phi_index = grid.getPhiTensorIndex(cell_index);
1857 
1858  const auto cell_iter = grid.find(cell_index);
1859  if (cell_iter != grid.end()) {
1860  setCellConvFeatures(convTensor, predTensor, idx, eta_index, phi_index);
1861  idx += 1;
1862  } else {
1863  setCellConvFeatures(convTensor, *zeroOutputTensor_[is_inner], 0, eta_index, phi_index);
1864  }
1865  }
1866  }
1867  }
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
Definition: DeepTauId.cc:2781
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > zeroOutputTensor_
Definition: DeepTauId.cc:2781
void setCellConvFeatures(tensorflow::Tensor &convTensor, const tensorflow::Tensor &features, unsigned batch_idx, int eta_index, int phi_index)
Definition: DeepTauId.cc:1869
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > convTensor_
Definition: DeepTauId.cc:2781
def pv(vc)
Definition: MetAnalyzer.py:7
tensorflow::Tensor getPartialPredictions(bool is_inner)
Definition: DeepTauId.cc:1763
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
Definition: DeepTauId.cc:2781
const int debug_level
Definition: DeepTauId.cc:2776
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
Definition: DeepTauId.cc:2781

◆ createEgammaBlockInputs()

template<typename CandidateCastType , typename TauCastType >
void DeepTauId::createEgammaBlockInputs ( unsigned  idx,
const TauCastType &  tau,
const size_t  tau_index,
const edm::RefToBase< reco::BaseTau tau_ref,
const reco::Vertex pv,
double  rho,
const std::vector< pat::Electron > *  electrons,
const edm::View< reco::Candidate > &  pfCands,
const Cell cell_map,
TauFunc  tau_funcs,
bool  is_inner 
)
inlineprivate

Definition at line 2025 of file DeepTauId.cc.

References funct::abs(), edm::View< T >::at(), calculateElectronClusterVarsV2(), nano_mu_local_reco_cff::chi2, HLT_2023v12_cff::dPhi, eGammaTensor_, nanoDQM_cfi::Electron, pwdgSkimBPark_cfi::electrons, f, nano_mu_digi_cff::float, heavyIonCSV_trainingSettings::idx, PixelMapPlotter::inputs, isInEcalCrack(), ndof, rho, IsoPhotonEBSkim_cff::rho, scalingParamsMap_, sub_version_, metsig::tau, runTauDisplay::tau_eta, runTauDisplay::tau_pt, and year_.

2035  {
2036  namespace dnn = dnn_inputs_v2::EgammaBlockInputs;
2037  namespace sc = deep_tau::Scaling;
2038  sc::FeatureT ft_global = sc::FeatureT::GridGlobal;
2039  sc::FeatureT ft_PFe = sc::FeatureT::PfCand_electron;
2040  sc::FeatureT ft_PFg = sc::FeatureT::PfCand_gamma;
2042 
2043  // needed to remap indices from scaling vectors to those from dnn_inputs_v2::EgammaBlockInputs
2044  int PFe_index_offset = scalingParamsMap_->at(std::make_pair(ft_global, false)).mean_.size();
2045  int e_index_offset = PFe_index_offset + scalingParamsMap_->at(std::make_pair(ft_PFe, false)).mean_.size();
2046  int PFg_index_offset = e_index_offset + scalingParamsMap_->at(std::make_pair(ft_e, false)).mean_.size();
2047 
2048  // to account for swapped order of PfCand_gamma and Electron blocks for v2p5 training w.r.t. v2p1
2049  int fill_index_offset_e = 0;
2050  int fill_index_offset_PFg = 0;
2051  if (sub_version_ == 5) {
2052  fill_index_offset_e =
2053  scalingParamsMap_->at(std::make_pair(ft_PFg, false)).mean_.size(); // size of PF gamma features
2054  fill_index_offset_PFg =
2055  -scalingParamsMap_->at(std::make_pair(ft_e, false)).mean_.size(); // size of Electron features
2056  }
2057 
2058  tensorflow::Tensor& inputs = *eGammaTensor_.at(is_inner);
2059 
2060  const auto& get = [&](int var_index) -> float& { return inputs.tensor<float, 4>()(idx, 0, 0, var_index); };
2061 
2062  const bool valid_index_pf_ele = cell_map.count(CellObjectType::PfCand_electron);
2063  const bool valid_index_pf_gamma = cell_map.count(CellObjectType::PfCand_gamma);
2064  const bool valid_index_ele = cell_map.count(CellObjectType::Electron);
2065 
2066  if (!cell_map.empty()) {
2067  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(ft_global, false));
2068  get(dnn::rho) = sp.scale(rho, dnn::rho);
2069  get(dnn::tau_pt) = sp.scale(tau.polarP4().pt(), dnn::tau_pt);
2070  get(dnn::tau_eta) = sp.scale(tau.polarP4().eta(), dnn::tau_eta);
2071  get(dnn::tau_inside_ecal_crack) = sp.scale(isInEcalCrack(tau.polarP4().eta()), dnn::tau_inside_ecal_crack);
2072  }
2073  if (valid_index_pf_ele) {
2074  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(ft_PFe, is_inner));
2075  size_t index_pf_ele = cell_map.at(CellObjectType::PfCand_electron);
2076  const auto& ele_cand = dynamic_cast<const CandidateCastType&>(pfCands.at(index_pf_ele));
2077 
2078  get(dnn::pfCand_ele_valid) = sp.scale(valid_index_pf_ele, dnn::pfCand_ele_valid - PFe_index_offset);
2079  get(dnn::pfCand_ele_rel_pt) =
2080  sp.scale(ele_cand.polarP4().pt() / tau.polarP4().pt(), dnn::pfCand_ele_rel_pt - PFe_index_offset);
2081  get(dnn::pfCand_ele_deta) =
2082  sp.scale(ele_cand.polarP4().eta() - tau.polarP4().eta(), dnn::pfCand_ele_deta - PFe_index_offset);
2083  get(dnn::pfCand_ele_dphi) =
2084  sp.scale(dPhi(tau.polarP4(), ele_cand.polarP4()), dnn::pfCand_ele_dphi - PFe_index_offset);
2085  get(dnn::pfCand_ele_pvAssociationQuality) = sp.scale<int>(
2086  candFunc::getPvAssocationQuality(ele_cand), dnn::pfCand_ele_pvAssociationQuality - PFe_index_offset);
2087  get(dnn::pfCand_ele_puppiWeight) = is_inner ? sp.scale(candFunc::getPuppiWeight(ele_cand, 0.9906834f),
2088  dnn::pfCand_ele_puppiWeight - PFe_index_offset)
2089  : sp.scale(candFunc::getPuppiWeight(ele_cand, 0.9669586f),
2090  dnn::pfCand_ele_puppiWeight - PFe_index_offset);
2091  get(dnn::pfCand_ele_charge) = sp.scale(ele_cand.charge(), dnn::pfCand_ele_charge - PFe_index_offset);
2092  get(dnn::pfCand_ele_lostInnerHits) =
2093  sp.scale<int>(candFunc::getLostInnerHits(ele_cand, 0), dnn::pfCand_ele_lostInnerHits - PFe_index_offset);
2094  get(dnn::pfCand_ele_numberOfPixelHits) =
2095  sp.scale(candFunc::getNumberOfPixelHits(ele_cand, 0), dnn::pfCand_ele_numberOfPixelHits - PFe_index_offset);
2096  get(dnn::pfCand_ele_vertex_dx) =
2097  sp.scale(ele_cand.vertex().x() - pv.position().x(), dnn::pfCand_ele_vertex_dx - PFe_index_offset);
2098  get(dnn::pfCand_ele_vertex_dy) =
2099  sp.scale(ele_cand.vertex().y() - pv.position().y(), dnn::pfCand_ele_vertex_dy - PFe_index_offset);
2100  get(dnn::pfCand_ele_vertex_dz) =
2101  sp.scale(ele_cand.vertex().z() - pv.position().z(), dnn::pfCand_ele_vertex_dz - PFe_index_offset);
2102  get(dnn::pfCand_ele_vertex_dx_tauFL) =
2103  sp.scale(ele_cand.vertex().x() - pv.position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2104  dnn::pfCand_ele_vertex_dx_tauFL - PFe_index_offset);
2105  get(dnn::pfCand_ele_vertex_dy_tauFL) =
2106  sp.scale(ele_cand.vertex().y() - pv.position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2107  dnn::pfCand_ele_vertex_dy_tauFL - PFe_index_offset);
2108  get(dnn::pfCand_ele_vertex_dz_tauFL) =
2109  sp.scale(ele_cand.vertex().z() - pv.position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2110  dnn::pfCand_ele_vertex_dz_tauFL - PFe_index_offset);
2111 
2112  const bool hasTrackDetails = candFunc::getHasTrackDetails(ele_cand);
2113  if (hasTrackDetails) {
2114  get(dnn::pfCand_ele_hasTrackDetails) =
2115  sp.scale(hasTrackDetails, dnn::pfCand_ele_hasTrackDetails - PFe_index_offset);
2116  get(dnn::pfCand_ele_dxy) = sp.scale(candFunc::getTauDxy(ele_cand), dnn::pfCand_ele_dxy - PFe_index_offset);
2117  get(dnn::pfCand_ele_dxy_sig) = sp.scale(std::abs(candFunc::getTauDxy(ele_cand)) / ele_cand.dxyError(),
2118  dnn::pfCand_ele_dxy_sig - PFe_index_offset);
2119  get(dnn::pfCand_ele_dz) = sp.scale(candFunc::getTauDz(ele_cand), dnn::pfCand_ele_dz - PFe_index_offset);
2120  get(dnn::pfCand_ele_dz_sig) = sp.scale(std::abs(candFunc::getTauDz(ele_cand)) / ele_cand.dzError(),
2121  dnn::pfCand_ele_dz_sig - PFe_index_offset);
2122  get(dnn::pfCand_ele_track_chi2_ndof) =
2123  candFunc::getPseudoTrack(ele_cand).ndof() > 0
2124  ? sp.scale(candFunc::getPseudoTrack(ele_cand).chi2() / candFunc::getPseudoTrack(ele_cand).ndof(),
2125  dnn::pfCand_ele_track_chi2_ndof - PFe_index_offset)
2126  : 0;
2127  get(dnn::pfCand_ele_track_ndof) =
2128  candFunc::getPseudoTrack(ele_cand).ndof() > 0
2129  ? sp.scale(candFunc::getPseudoTrack(ele_cand).ndof(), dnn::pfCand_ele_track_ndof - PFe_index_offset)
2130  : 0;
2131  }
2132  }
2133  if (valid_index_pf_gamma) {
2134  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(ft_PFg, is_inner));
2135  size_t index_pf_gamma = cell_map.at(CellObjectType::PfCand_gamma);
2136  const auto& gamma_cand = dynamic_cast<const CandidateCastType&>(pfCands.at(index_pf_gamma));
2137 
2138  get(dnn::pfCand_gamma_valid + fill_index_offset_PFg) =
2139  sp.scale(valid_index_pf_gamma, dnn::pfCand_gamma_valid - PFg_index_offset);
2140  get(dnn::pfCand_gamma_rel_pt + fill_index_offset_PFg) =
2141  sp.scale(gamma_cand.polarP4().pt() / tau.polarP4().pt(), dnn::pfCand_gamma_rel_pt - PFg_index_offset);
2142  get(dnn::pfCand_gamma_deta + fill_index_offset_PFg) =
2143  sp.scale(gamma_cand.polarP4().eta() - tau.polarP4().eta(), dnn::pfCand_gamma_deta - PFg_index_offset);
2144  get(dnn::pfCand_gamma_dphi + fill_index_offset_PFg) =
2145  sp.scale(dPhi(tau.polarP4(), gamma_cand.polarP4()), dnn::pfCand_gamma_dphi - PFg_index_offset);
2146  get(dnn::pfCand_gamma_pvAssociationQuality + fill_index_offset_PFg) = sp.scale<int>(
2147  candFunc::getPvAssocationQuality(gamma_cand), dnn::pfCand_gamma_pvAssociationQuality - PFg_index_offset);
2148  get(dnn::pfCand_gamma_fromPV + fill_index_offset_PFg) =
2149  sp.scale<int>(candFunc::getFromPV(gamma_cand), dnn::pfCand_gamma_fromPV - PFg_index_offset);
2150  get(dnn::pfCand_gamma_puppiWeight + fill_index_offset_PFg) =
2151  is_inner ? sp.scale(candFunc::getPuppiWeight(gamma_cand, 0.9084110f),
2152  dnn::pfCand_gamma_puppiWeight - PFg_index_offset)
2153  : sp.scale(candFunc::getPuppiWeight(gamma_cand, 0.4211567f),
2154  dnn::pfCand_gamma_puppiWeight - PFg_index_offset);
2155  get(dnn::pfCand_gamma_puppiWeightNoLep + fill_index_offset_PFg) =
2156  is_inner ? sp.scale(candFunc::getPuppiWeightNoLep(gamma_cand, 0.8857716f),
2157  dnn::pfCand_gamma_puppiWeightNoLep - PFg_index_offset)
2158  : sp.scale(candFunc::getPuppiWeightNoLep(gamma_cand, 0.3822604f),
2159  dnn::pfCand_gamma_puppiWeightNoLep - PFg_index_offset);
2160  get(dnn::pfCand_gamma_lostInnerHits + fill_index_offset_PFg) =
2161  sp.scale<int>(candFunc::getLostInnerHits(gamma_cand, 0), dnn::pfCand_gamma_lostInnerHits - PFg_index_offset);
2162  get(dnn::pfCand_gamma_numberOfPixelHits + fill_index_offset_PFg) = sp.scale(
2163  candFunc::getNumberOfPixelHits(gamma_cand, 0), dnn::pfCand_gamma_numberOfPixelHits - PFg_index_offset);
2164  get(dnn::pfCand_gamma_vertex_dx + fill_index_offset_PFg) =
2165  sp.scale(gamma_cand.vertex().x() - pv.position().x(), dnn::pfCand_gamma_vertex_dx - PFg_index_offset);
2166  get(dnn::pfCand_gamma_vertex_dy + fill_index_offset_PFg) =
2167  sp.scale(gamma_cand.vertex().y() - pv.position().y(), dnn::pfCand_gamma_vertex_dy - PFg_index_offset);
2168  get(dnn::pfCand_gamma_vertex_dz + fill_index_offset_PFg) =
2169  sp.scale(gamma_cand.vertex().z() - pv.position().z(), dnn::pfCand_gamma_vertex_dz - PFg_index_offset);
2170  get(dnn::pfCand_gamma_vertex_dx_tauFL + fill_index_offset_PFg) =
2171  sp.scale(gamma_cand.vertex().x() - pv.position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2172  dnn::pfCand_gamma_vertex_dx_tauFL - PFg_index_offset);
2173  get(dnn::pfCand_gamma_vertex_dy_tauFL + fill_index_offset_PFg) =
2174  sp.scale(gamma_cand.vertex().y() - pv.position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2175  dnn::pfCand_gamma_vertex_dy_tauFL - PFg_index_offset);
2176  get(dnn::pfCand_gamma_vertex_dz_tauFL + fill_index_offset_PFg) =
2177  sp.scale(gamma_cand.vertex().z() - pv.position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2178  dnn::pfCand_gamma_vertex_dz_tauFL - PFg_index_offset);
2179  const bool hasTrackDetails = candFunc::getHasTrackDetails(gamma_cand);
2180  if (hasTrackDetails) {
2181  get(dnn::pfCand_gamma_hasTrackDetails + fill_index_offset_PFg) =
2182  sp.scale(hasTrackDetails, dnn::pfCand_gamma_hasTrackDetails - PFg_index_offset);
2183  get(dnn::pfCand_gamma_dxy + fill_index_offset_PFg) =
2184  sp.scale(candFunc::getTauDxy(gamma_cand), dnn::pfCand_gamma_dxy - PFg_index_offset);
2185  get(dnn::pfCand_gamma_dxy_sig + fill_index_offset_PFg) =
2186  sp.scale(std::abs(candFunc::getTauDxy(gamma_cand)) / gamma_cand.dxyError(),
2187  dnn::pfCand_gamma_dxy_sig - PFg_index_offset);
2188  get(dnn::pfCand_gamma_dz + fill_index_offset_PFg) =
2189  sp.scale(candFunc::getTauDz(gamma_cand), dnn::pfCand_gamma_dz - PFg_index_offset);
2190  get(dnn::pfCand_gamma_dz_sig + fill_index_offset_PFg) =
2191  sp.scale(std::abs(candFunc::getTauDz(gamma_cand)) / gamma_cand.dzError(),
2192  dnn::pfCand_gamma_dz_sig - PFg_index_offset);
2193  get(dnn::pfCand_gamma_track_chi2_ndof + fill_index_offset_PFg) =
2194  candFunc::getPseudoTrack(gamma_cand).ndof() > 0
2195  ? sp.scale(candFunc::getPseudoTrack(gamma_cand).chi2() / candFunc::getPseudoTrack(gamma_cand).ndof(),
2196  dnn::pfCand_gamma_track_chi2_ndof - PFg_index_offset)
2197  : 0;
2198  get(dnn::pfCand_gamma_track_ndof + fill_index_offset_PFg) =
2199  candFunc::getPseudoTrack(gamma_cand).ndof() > 0
2200  ? sp.scale(candFunc::getPseudoTrack(gamma_cand).ndof(), dnn::pfCand_gamma_track_ndof - PFg_index_offset)
2201  : 0;
2202  }
2203  }
2204  if (valid_index_ele) {
2205  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(ft_e, is_inner));
2206  size_t index_ele = cell_map.at(CellObjectType::Electron);
2207  const auto& ele = electrons->at(index_ele);
2208 
2209  get(dnn::ele_valid + fill_index_offset_e) = sp.scale(valid_index_ele, dnn::ele_valid - e_index_offset);
2210  get(dnn::ele_rel_pt + fill_index_offset_e) =
2211  sp.scale(ele.polarP4().pt() / tau.polarP4().pt(), dnn::ele_rel_pt - e_index_offset);
2212  get(dnn::ele_deta + fill_index_offset_e) =
2213  sp.scale(ele.polarP4().eta() - tau.polarP4().eta(), dnn::ele_deta - e_index_offset);
2214  get(dnn::ele_dphi + fill_index_offset_e) =
2215  sp.scale(dPhi(tau.polarP4(), ele.polarP4()), dnn::ele_dphi - e_index_offset);
2216 
2217  float cc_ele_energy, cc_gamma_energy;
2218  int cc_n_gamma;
2219  const bool cc_valid = calculateElectronClusterVarsV2(ele, cc_ele_energy, cc_gamma_energy, cc_n_gamma);
2220  if (cc_valid) {
2221  get(dnn::ele_cc_valid + fill_index_offset_e) = sp.scale(cc_valid, dnn::ele_cc_valid - e_index_offset);
2222  get(dnn::ele_cc_ele_rel_energy + fill_index_offset_e) =
2223  sp.scale(cc_ele_energy / ele.polarP4().pt(), dnn::ele_cc_ele_rel_energy - e_index_offset);
2224  get(dnn::ele_cc_gamma_rel_energy + fill_index_offset_e) =
2225  sp.scale(cc_gamma_energy / cc_ele_energy, dnn::ele_cc_gamma_rel_energy - e_index_offset);
2226  get(dnn::ele_cc_n_gamma + fill_index_offset_e) = sp.scale(cc_n_gamma, dnn::ele_cc_n_gamma - e_index_offset);
2227  }
2228  get(dnn::ele_rel_trackMomentumAtVtx + fill_index_offset_e) =
2229  sp.scale(ele.trackMomentumAtVtx().R() / ele.polarP4().pt(), dnn::ele_rel_trackMomentumAtVtx - e_index_offset);
2230  get(dnn::ele_rel_trackMomentumAtCalo + fill_index_offset_e) = sp.scale(
2231  ele.trackMomentumAtCalo().R() / ele.polarP4().pt(), dnn::ele_rel_trackMomentumAtCalo - e_index_offset);
2232  get(dnn::ele_rel_trackMomentumOut + fill_index_offset_e) =
2233  sp.scale(ele.trackMomentumOut().R() / ele.polarP4().pt(), dnn::ele_rel_trackMomentumOut - e_index_offset);
2234  get(dnn::ele_rel_trackMomentumAtEleClus + fill_index_offset_e) = sp.scale(
2235  ele.trackMomentumAtEleClus().R() / ele.polarP4().pt(), dnn::ele_rel_trackMomentumAtEleClus - e_index_offset);
2236  get(dnn::ele_rel_trackMomentumAtVtxWithConstraint + fill_index_offset_e) =
2237  sp.scale(ele.trackMomentumAtVtxWithConstraint().R() / ele.polarP4().pt(),
2238  dnn::ele_rel_trackMomentumAtVtxWithConstraint - e_index_offset);
2239  get(dnn::ele_rel_ecalEnergy + fill_index_offset_e) =
2240  sp.scale(ele.ecalEnergy() / ele.polarP4().pt(), dnn::ele_rel_ecalEnergy - e_index_offset);
2241  get(dnn::ele_ecalEnergy_sig + fill_index_offset_e) =
2242  sp.scale(ele.ecalEnergy() / ele.ecalEnergyError(), dnn::ele_ecalEnergy_sig - e_index_offset);
2243  get(dnn::ele_eSuperClusterOverP + fill_index_offset_e) =
2244  sp.scale(ele.eSuperClusterOverP(), dnn::ele_eSuperClusterOverP - e_index_offset);
2245  get(dnn::ele_eSeedClusterOverP + fill_index_offset_e) =
2246  sp.scale(ele.eSeedClusterOverP(), dnn::ele_eSeedClusterOverP - e_index_offset);
2247  get(dnn::ele_eSeedClusterOverPout + fill_index_offset_e) =
2248  sp.scale(ele.eSeedClusterOverPout(), dnn::ele_eSeedClusterOverPout - e_index_offset);
2249  get(dnn::ele_eEleClusterOverPout + fill_index_offset_e) =
2250  sp.scale(ele.eEleClusterOverPout(), dnn::ele_eEleClusterOverPout - e_index_offset);
2251  get(dnn::ele_deltaEtaSuperClusterTrackAtVtx + fill_index_offset_e) =
2252  sp.scale(ele.deltaEtaSuperClusterTrackAtVtx(), dnn::ele_deltaEtaSuperClusterTrackAtVtx - e_index_offset);
2253  get(dnn::ele_deltaEtaSeedClusterTrackAtCalo + fill_index_offset_e) =
2254  sp.scale(ele.deltaEtaSeedClusterTrackAtCalo(), dnn::ele_deltaEtaSeedClusterTrackAtCalo - e_index_offset);
2255  get(dnn::ele_deltaEtaEleClusterTrackAtCalo + fill_index_offset_e) =
2256  sp.scale(ele.deltaEtaEleClusterTrackAtCalo(), dnn::ele_deltaEtaEleClusterTrackAtCalo - e_index_offset);
2257  get(dnn::ele_deltaPhiEleClusterTrackAtCalo + fill_index_offset_e) =
2258  sp.scale(ele.deltaPhiEleClusterTrackAtCalo(), dnn::ele_deltaPhiEleClusterTrackAtCalo - e_index_offset);
2259  get(dnn::ele_deltaPhiSuperClusterTrackAtVtx + fill_index_offset_e) =
2260  sp.scale(ele.deltaPhiSuperClusterTrackAtVtx(), dnn::ele_deltaPhiSuperClusterTrackAtVtx - e_index_offset);
2261  get(dnn::ele_deltaPhiSeedClusterTrackAtCalo + fill_index_offset_e) =
2262  sp.scale(ele.deltaPhiSeedClusterTrackAtCalo(), dnn::ele_deltaPhiSeedClusterTrackAtCalo - e_index_offset);
2263  const bool mva_valid =
2264  (ele.mvaInput().earlyBrem > -2) ||
2265  (year_ !=
2266  2026); // Known issue that input can be invalid in Phase2 samples (early/lateBrem==-2, hadEnergy==0, sigmaEtaEta/deltaEta==3.40282e+38). Unknown if also in Run2/3, so don't change there
2267  if (mva_valid) {
2268  get(dnn::ele_mvaInput_earlyBrem + fill_index_offset_e) =
2269  sp.scale(ele.mvaInput().earlyBrem, dnn::ele_mvaInput_earlyBrem - e_index_offset);
2270  get(dnn::ele_mvaInput_lateBrem + fill_index_offset_e) =
2271  sp.scale(ele.mvaInput().lateBrem, dnn::ele_mvaInput_lateBrem - e_index_offset);
2272  get(dnn::ele_mvaInput_sigmaEtaEta + fill_index_offset_e) =
2273  sp.scale(ele.mvaInput().sigmaEtaEta, dnn::ele_mvaInput_sigmaEtaEta - e_index_offset);
2274  get(dnn::ele_mvaInput_hadEnergy + fill_index_offset_e) =
2275  sp.scale(ele.mvaInput().hadEnergy, dnn::ele_mvaInput_hadEnergy - e_index_offset);
2276  get(dnn::ele_mvaInput_deltaEta + fill_index_offset_e) =
2277  sp.scale(ele.mvaInput().deltaEta, dnn::ele_mvaInput_deltaEta - e_index_offset);
2278  }
2279  const auto& gsfTrack = ele.gsfTrack();
2280  if (gsfTrack.isNonnull()) {
2281  get(dnn::ele_gsfTrack_normalizedChi2 + fill_index_offset_e) =
2282  sp.scale(gsfTrack->normalizedChi2(), dnn::ele_gsfTrack_normalizedChi2 - e_index_offset);
2283  get(dnn::ele_gsfTrack_numberOfValidHits + fill_index_offset_e) =
2284  sp.scale(gsfTrack->numberOfValidHits(), dnn::ele_gsfTrack_numberOfValidHits - e_index_offset);
2285  get(dnn::ele_rel_gsfTrack_pt + fill_index_offset_e) =
2286  sp.scale(gsfTrack->pt() / ele.polarP4().pt(), dnn::ele_rel_gsfTrack_pt - e_index_offset);
2287  get(dnn::ele_gsfTrack_pt_sig + fill_index_offset_e) =
2288  sp.scale(gsfTrack->pt() / gsfTrack->ptError(), dnn::ele_gsfTrack_pt_sig - e_index_offset);
2289  }
2290  const auto& closestCtfTrack = ele.closestCtfTrackRef();
2291  const bool has_closestCtfTrack = closestCtfTrack.isNonnull();
2292  if (has_closestCtfTrack) {
2293  get(dnn::ele_has_closestCtfTrack + fill_index_offset_e) =
2294  sp.scale(has_closestCtfTrack, dnn::ele_has_closestCtfTrack - e_index_offset);
2295  get(dnn::ele_closestCtfTrack_normalizedChi2 + fill_index_offset_e) =
2296  sp.scale(closestCtfTrack->normalizedChi2(), dnn::ele_closestCtfTrack_normalizedChi2 - e_index_offset);
2297  get(dnn::ele_closestCtfTrack_numberOfValidHits + fill_index_offset_e) =
2298  sp.scale(closestCtfTrack->numberOfValidHits(), dnn::ele_closestCtfTrack_numberOfValidHits - e_index_offset);
2299  }
2300  }
2301  }
static bool isInEcalCrack(double eta)
Definition: DeepTauId.cc:2718
const unsigned sub_version_
Definition: DeepTauId.cc:2775
const std::map< std::pair< deep_tau::Scaling::FeatureT, bool >, deep_tau::Scaling::ScalingParams > * scalingParamsMap_
Definition: DeepTauId.cc:2783
const unsigned year_
Definition: DeepTauId.cc:2773
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
const_reference at(size_type pos) const
static bool calculateElectronClusterVarsV2(const pat::Electron &ele, float &cc_ele_energy, float &cc_gamma_energy, int &cc_n_gamma)
Definition: DeepTauId.cc:1357
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
Definition: DeepTauId.cc:2781

◆ createHadronsBlockInputs()

template<typename CandidateCastType , typename TauCastType >
void DeepTauId::createHadronsBlockInputs ( unsigned  idx,
const TauCastType &  tau,
const size_t  tau_index,
const edm::RefToBase< reco::BaseTau tau_ref,
const reco::Vertex pv,
double  rho,
const edm::View< reco::Candidate > &  pfCands,
const Cell cell_map,
TauFunc  tau_funcs,
bool  is_inner 
)
inlineprivate

Definition at line 2455 of file DeepTauId.cc.

References funct::abs(), edm::View< T >::at(), nano_mu_local_reco_cff::chi2, disable_hcalFraction_workaround_, HLT_2023v12_cff::dPhi, f, nano_mu_digi_cff::float, hadronsTensor_, heavyIonCSV_trainingSettings::idx, PixelMapPlotter::inputs, isInEcalCrack(), ndof, rho, IsoPhotonEBSkim_cff::rho, scalingParamsMap_, metsig::tau, runTauDisplay::tau_eta, and runTauDisplay::tau_pt.

2464  {
2465  namespace dnn = dnn_inputs_v2::HadronBlockInputs;
2466  namespace sc = deep_tau::Scaling;
2467  sc::FeatureT ft_global = sc::FeatureT::GridGlobal;
2468  sc::FeatureT ft_PFchH = sc::FeatureT::PfCand_chHad;
2469  sc::FeatureT ft_PFnH = sc::FeatureT::PfCand_nHad;
2470 
2471  // needed to remap indices from scaling vectors to those from dnn_inputs_v2::HadronBlockInputs
2472  int PFchH_index_offset = scalingParamsMap_->at(std::make_pair(ft_global, false)).mean_.size();
2473  int PFnH_index_offset = PFchH_index_offset + scalingParamsMap_->at(std::make_pair(ft_PFchH, false)).mean_.size();
2474 
2475  tensorflow::Tensor& inputs = *hadronsTensor_.at(is_inner);
2476 
2477  const auto& get = [&](int var_index) -> float& { return inputs.tensor<float, 4>()(idx, 0, 0, var_index); };
2478 
2479  const bool valid_chH = cell_map.count(CellObjectType::PfCand_chargedHadron);
2480  const bool valid_nH = cell_map.count(CellObjectType::PfCand_neutralHadron);
2481 
2482  if (!cell_map.empty()) {
2483  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(ft_global, false));
2484  get(dnn::rho) = sp.scale(rho, dnn::rho);
2485  get(dnn::tau_pt) = sp.scale(tau.polarP4().pt(), dnn::tau_pt);
2486  get(dnn::tau_eta) = sp.scale(tau.polarP4().eta(), dnn::tau_eta);
2487  get(dnn::tau_inside_ecal_crack) = sp.scale(isInEcalCrack(tau.polarP4().eta()), dnn::tau_inside_ecal_crack);
2488  }
2489  if (valid_chH) {
2490  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(ft_PFchH, is_inner));
2491  size_t index_chH = cell_map.at(CellObjectType::PfCand_chargedHadron);
2492  const auto& chH_cand = dynamic_cast<const CandidateCastType&>(pfCands.at(index_chH));
2493 
2494  get(dnn::pfCand_chHad_valid) = sp.scale(valid_chH, dnn::pfCand_chHad_valid - PFchH_index_offset);
2495  get(dnn::pfCand_chHad_rel_pt) =
2496  sp.scale(chH_cand.polarP4().pt() / tau.polarP4().pt(), dnn::pfCand_chHad_rel_pt - PFchH_index_offset);
2497  get(dnn::pfCand_chHad_deta) =
2498  sp.scale(chH_cand.polarP4().eta() - tau.polarP4().eta(), dnn::pfCand_chHad_deta - PFchH_index_offset);
2499  get(dnn::pfCand_chHad_dphi) =
2500  sp.scale(dPhi(tau.polarP4(), chH_cand.polarP4()), dnn::pfCand_chHad_dphi - PFchH_index_offset);
2501  get(dnn::pfCand_chHad_leadChargedHadrCand) =
2502  sp.scale(&chH_cand == dynamic_cast<const CandidateCastType*>(tau.leadChargedHadrCand().get()),
2503  dnn::pfCand_chHad_leadChargedHadrCand - PFchH_index_offset);
2504  get(dnn::pfCand_chHad_pvAssociationQuality) = sp.scale<int>(
2505  candFunc::getPvAssocationQuality(chH_cand), dnn::pfCand_chHad_pvAssociationQuality - PFchH_index_offset);
2506  get(dnn::pfCand_chHad_fromPV) =
2507  sp.scale<int>(candFunc::getFromPV(chH_cand), dnn::pfCand_chHad_fromPV - PFchH_index_offset);
2508  const float default_chH_pw_inner = 0.7614090f;
2509  const float default_chH_pw_outer = 0.1974930f;
2510  get(dnn::pfCand_chHad_puppiWeight) = is_inner ? sp.scale(candFunc::getPuppiWeight(chH_cand, default_chH_pw_inner),
2511  dnn::pfCand_chHad_puppiWeight - PFchH_index_offset)
2512  : sp.scale(candFunc::getPuppiWeight(chH_cand, default_chH_pw_outer),
2513  dnn::pfCand_chHad_puppiWeight - PFchH_index_offset);
2514  get(dnn::pfCand_chHad_puppiWeightNoLep) =
2515  is_inner ? sp.scale(candFunc::getPuppiWeightNoLep(chH_cand, default_chH_pw_inner),
2516  dnn::pfCand_chHad_puppiWeightNoLep - PFchH_index_offset)
2517  : sp.scale(candFunc::getPuppiWeightNoLep(chH_cand, default_chH_pw_outer),
2518  dnn::pfCand_chHad_puppiWeightNoLep - PFchH_index_offset);
2519  get(dnn::pfCand_chHad_charge) = sp.scale(chH_cand.charge(), dnn::pfCand_chHad_charge - PFchH_index_offset);
2520  get(dnn::pfCand_chHad_lostInnerHits) =
2521  sp.scale<int>(candFunc::getLostInnerHits(chH_cand, 0), dnn::pfCand_chHad_lostInnerHits - PFchH_index_offset);
2522  get(dnn::pfCand_chHad_numberOfPixelHits) = sp.scale(candFunc::getNumberOfPixelHits(chH_cand, 0),
2523  dnn::pfCand_chHad_numberOfPixelHits - PFchH_index_offset);
2524  get(dnn::pfCand_chHad_vertex_dx) =
2525  sp.scale(chH_cand.vertex().x() - pv.position().x(), dnn::pfCand_chHad_vertex_dx - PFchH_index_offset);
2526  get(dnn::pfCand_chHad_vertex_dy) =
2527  sp.scale(chH_cand.vertex().y() - pv.position().y(), dnn::pfCand_chHad_vertex_dy - PFchH_index_offset);
2528  get(dnn::pfCand_chHad_vertex_dz) =
2529  sp.scale(chH_cand.vertex().z() - pv.position().z(), dnn::pfCand_chHad_vertex_dz - PFchH_index_offset);
2530  get(dnn::pfCand_chHad_vertex_dx_tauFL) =
2531  sp.scale(chH_cand.vertex().x() - pv.position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2532  dnn::pfCand_chHad_vertex_dx_tauFL - PFchH_index_offset);
2533  get(dnn::pfCand_chHad_vertex_dy_tauFL) =
2534  sp.scale(chH_cand.vertex().y() - pv.position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2535  dnn::pfCand_chHad_vertex_dy_tauFL - PFchH_index_offset);
2536  get(dnn::pfCand_chHad_vertex_dz_tauFL) =
2537  sp.scale(chH_cand.vertex().z() - pv.position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2538  dnn::pfCand_chHad_vertex_dz_tauFL - PFchH_index_offset);
2539 
2540  const bool hasTrackDetails = candFunc::getHasTrackDetails(chH_cand);
2541  if (hasTrackDetails) {
2542  get(dnn::pfCand_chHad_hasTrackDetails) =
2543  sp.scale(hasTrackDetails, dnn::pfCand_chHad_hasTrackDetails - PFchH_index_offset);
2544  get(dnn::pfCand_chHad_dxy) =
2545  sp.scale(candFunc::getTauDxy(chH_cand), dnn::pfCand_chHad_dxy - PFchH_index_offset);
2546  get(dnn::pfCand_chHad_dxy_sig) = sp.scale(std::abs(candFunc::getTauDxy(chH_cand)) / chH_cand.dxyError(),
2547  dnn::pfCand_chHad_dxy_sig - PFchH_index_offset);
2548  get(dnn::pfCand_chHad_dz) = sp.scale(candFunc::getTauDz(chH_cand), dnn::pfCand_chHad_dz - PFchH_index_offset);
2549  get(dnn::pfCand_chHad_dz_sig) = sp.scale(std::abs(candFunc::getTauDz(chH_cand)) / chH_cand.dzError(),
2550  dnn::pfCand_chHad_dz_sig - PFchH_index_offset);
2551  get(dnn::pfCand_chHad_track_chi2_ndof) =
2552  candFunc::getPseudoTrack(chH_cand).ndof() > 0
2553  ? sp.scale(candFunc::getPseudoTrack(chH_cand).chi2() / candFunc::getPseudoTrack(chH_cand).ndof(),
2554  dnn::pfCand_chHad_track_chi2_ndof - PFchH_index_offset)
2555  : 0;
2556  get(dnn::pfCand_chHad_track_ndof) =
2557  candFunc::getPseudoTrack(chH_cand).ndof() > 0
2558  ? sp.scale(candFunc::getPseudoTrack(chH_cand).ndof(), dnn::pfCand_chHad_track_ndof - PFchH_index_offset)
2559  : 0;
2560  }
2561  float hcal_fraction = candFunc::getHCalFraction(chH_cand, disable_hcalFraction_workaround_);
2562  get(dnn::pfCand_chHad_hcalFraction) =
2563  sp.scale(hcal_fraction, dnn::pfCand_chHad_hcalFraction - PFchH_index_offset);
2564  get(dnn::pfCand_chHad_rawCaloFraction) =
2565  sp.scale(candFunc::getRawCaloFraction(chH_cand), dnn::pfCand_chHad_rawCaloFraction - PFchH_index_offset);
2566  }
2567  if (valid_nH) {
2568  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(ft_PFnH, is_inner));
2569  size_t index_nH = cell_map.at(CellObjectType::PfCand_neutralHadron);
2570  const auto& nH_cand = dynamic_cast<const CandidateCastType&>(pfCands.at(index_nH));
2571 
2572  get(dnn::pfCand_nHad_valid) = sp.scale(valid_nH, dnn::pfCand_nHad_valid - PFnH_index_offset);
2573  get(dnn::pfCand_nHad_rel_pt) =
2574  sp.scale(nH_cand.polarP4().pt() / tau.polarP4().pt(), dnn::pfCand_nHad_rel_pt - PFnH_index_offset);
2575  get(dnn::pfCand_nHad_deta) =
2576  sp.scale(nH_cand.polarP4().eta() - tau.polarP4().eta(), dnn::pfCand_nHad_deta - PFnH_index_offset);
2577  get(dnn::pfCand_nHad_dphi) =
2578  sp.scale(dPhi(tau.polarP4(), nH_cand.polarP4()), dnn::pfCand_nHad_dphi - PFnH_index_offset);
2579  get(dnn::pfCand_nHad_puppiWeight) = is_inner ? sp.scale(candFunc::getPuppiWeight(nH_cand, 0.9798355f),
2580  dnn::pfCand_nHad_puppiWeight - PFnH_index_offset)
2581  : sp.scale(candFunc::getPuppiWeight(nH_cand, 0.7813260f),
2582  dnn::pfCand_nHad_puppiWeight - PFnH_index_offset);
2583  get(dnn::pfCand_nHad_puppiWeightNoLep) = is_inner
2584  ? sp.scale(candFunc::getPuppiWeightNoLep(nH_cand, 0.9046796f),
2585  dnn::pfCand_nHad_puppiWeightNoLep - PFnH_index_offset)
2586  : sp.scale(candFunc::getPuppiWeightNoLep(nH_cand, 0.6554860f),
2587  dnn::pfCand_nHad_puppiWeightNoLep - PFnH_index_offset);
2588  float hcal_fraction = candFunc::getHCalFraction(nH_cand, disable_hcalFraction_workaround_);
2589  get(dnn::pfCand_nHad_hcalFraction) = sp.scale(hcal_fraction, dnn::pfCand_nHad_hcalFraction - PFnH_index_offset);
2590  }
2591  }
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
Definition: DeepTauId.cc:2781
static bool isInEcalCrack(double eta)
Definition: DeepTauId.cc:2718
const std::map< std::pair< deep_tau::Scaling::FeatureT, bool >, deep_tau::Scaling::ScalingParams > * scalingParamsMap_
Definition: DeepTauId.cc:2783
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
const_reference at(size_type pos) const
const bool disable_hcalFraction_workaround_
Definition: DeepTauId.cc:2778

◆ createMuonBlockInputs()

template<typename CandidateCastType , typename TauCastType >
void DeepTauId::createMuonBlockInputs ( unsigned  idx,
const TauCastType &  tau,
const size_t  tau_index,
const edm::RefToBase< reco::BaseTau tau_ref,
const reco::Vertex pv,
double  rho,
const std::vector< pat::Muon > *  muons,
const edm::View< reco::Candidate > &  pfCands,
const Cell cell_map,
TauFunc  tau_funcs,
bool  is_inner 
)
inlineprivate

Definition at line 2304 of file DeepTauId.cc.

References funct::abs(), edm::View< T >::at(), nano_mu_local_reco_cff::chi2, MuonSubdetId::CSC, HLT_2023v12_cff::dPhi, MuonSubdetId::DT, f, nano_mu_digi_cff::float, heavyIonCSV_trainingSettings::idx, PixelMapPlotter::inputs, isInEcalCrack(), dumpRecoGeometry_cfg::Muon, PDWG_BPHSkim_cff::muons, muonTensor_, ndof, pat::Muon::PV2D, rho, IsoPhotonEBSkim_cff::rho, MuonSubdetId::RPC, scalingParamsMap_, relativeConstraints::station, metsig::tau, runTauDisplay::tau_eta, and runTauDisplay::tau_pt.

2314  {
2315  namespace dnn = dnn_inputs_v2::MuonBlockInputs;
2316  namespace sc = deep_tau::Scaling;
2317  sc::FeatureT ft_global = sc::FeatureT::GridGlobal;
2318  sc::FeatureT ft_PFmu = sc::FeatureT::PfCand_muon;
2320 
2321  // needed to remap indices from scaling vectors to those from dnn_inputs_v2::MuonBlockInputs
2322  int PFmu_index_offset = scalingParamsMap_->at(std::make_pair(ft_global, false)).mean_.size();
2323  int mu_index_offset = PFmu_index_offset + scalingParamsMap_->at(std::make_pair(ft_PFmu, false)).mean_.size();
2324 
2325  tensorflow::Tensor& inputs = *muonTensor_.at(is_inner);
2326 
2327  const auto& get = [&](int var_index) -> float& { return inputs.tensor<float, 4>()(idx, 0, 0, var_index); };
2328 
2329  const bool valid_index_pf_muon = cell_map.count(CellObjectType::PfCand_muon);
2330  const bool valid_index_muon = cell_map.count(CellObjectType::Muon);
2331 
2332  if (!cell_map.empty()) {
2333  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(ft_global, false));
2334  get(dnn::rho) = sp.scale(rho, dnn::rho);
2335  get(dnn::tau_pt) = sp.scale(tau.polarP4().pt(), dnn::tau_pt);
2336  get(dnn::tau_eta) = sp.scale(tau.polarP4().eta(), dnn::tau_eta);
2337  get(dnn::tau_inside_ecal_crack) = sp.scale(isInEcalCrack(tau.polarP4().eta()), dnn::tau_inside_ecal_crack);
2338  }
2339  if (valid_index_pf_muon) {
2340  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(ft_PFmu, is_inner));
2341  size_t index_pf_muon = cell_map.at(CellObjectType::PfCand_muon);
2342  const auto& muon_cand = dynamic_cast<const CandidateCastType&>(pfCands.at(index_pf_muon));
2343 
2344  get(dnn::pfCand_muon_valid) = sp.scale(valid_index_pf_muon, dnn::pfCand_muon_valid - PFmu_index_offset);
2345  get(dnn::pfCand_muon_rel_pt) =
2346  sp.scale(muon_cand.polarP4().pt() / tau.polarP4().pt(), dnn::pfCand_muon_rel_pt - PFmu_index_offset);
2347  get(dnn::pfCand_muon_deta) =
2348  sp.scale(muon_cand.polarP4().eta() - tau.polarP4().eta(), dnn::pfCand_muon_deta - PFmu_index_offset);
2349  get(dnn::pfCand_muon_dphi) =
2350  sp.scale(dPhi(tau.polarP4(), muon_cand.polarP4()), dnn::pfCand_muon_dphi - PFmu_index_offset);
2351  get(dnn::pfCand_muon_pvAssociationQuality) = sp.scale<int>(
2352  candFunc::getPvAssocationQuality(muon_cand), dnn::pfCand_muon_pvAssociationQuality - PFmu_index_offset);
2353  get(dnn::pfCand_muon_fromPV) =
2354  sp.scale<int>(candFunc::getFromPV(muon_cand), dnn::pfCand_muon_fromPV - PFmu_index_offset);
2355  get(dnn::pfCand_muon_puppiWeight) = is_inner ? sp.scale(candFunc::getPuppiWeight(muon_cand, 0.9786588f),
2356  dnn::pfCand_muon_puppiWeight - PFmu_index_offset)
2357  : sp.scale(candFunc::getPuppiWeight(muon_cand, 0.8132477f),
2358  dnn::pfCand_muon_puppiWeight - PFmu_index_offset);
2359  get(dnn::pfCand_muon_charge) = sp.scale(muon_cand.charge(), dnn::pfCand_muon_charge - PFmu_index_offset);
2360  get(dnn::pfCand_muon_lostInnerHits) =
2361  sp.scale<int>(candFunc::getLostInnerHits(muon_cand, 0), dnn::pfCand_muon_lostInnerHits - PFmu_index_offset);
2362  get(dnn::pfCand_muon_numberOfPixelHits) = sp.scale(candFunc::getNumberOfPixelHits(muon_cand, 0),
2363  dnn::pfCand_muon_numberOfPixelHits - PFmu_index_offset);
2364  get(dnn::pfCand_muon_vertex_dx) =
2365  sp.scale(muon_cand.vertex().x() - pv.position().x(), dnn::pfCand_muon_vertex_dx - PFmu_index_offset);
2366  get(dnn::pfCand_muon_vertex_dy) =
2367  sp.scale(muon_cand.vertex().y() - pv.position().y(), dnn::pfCand_muon_vertex_dy - PFmu_index_offset);
2368  get(dnn::pfCand_muon_vertex_dz) =
2369  sp.scale(muon_cand.vertex().z() - pv.position().z(), dnn::pfCand_muon_vertex_dz - PFmu_index_offset);
2370  get(dnn::pfCand_muon_vertex_dx_tauFL) =
2371  sp.scale(muon_cand.vertex().x() - pv.position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2372  dnn::pfCand_muon_vertex_dx_tauFL - PFmu_index_offset);
2373  get(dnn::pfCand_muon_vertex_dy_tauFL) =
2374  sp.scale(muon_cand.vertex().y() - pv.position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2375  dnn::pfCand_muon_vertex_dy_tauFL - PFmu_index_offset);
2376  get(dnn::pfCand_muon_vertex_dz_tauFL) =
2377  sp.scale(muon_cand.vertex().z() - pv.position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2378  dnn::pfCand_muon_vertex_dz_tauFL - PFmu_index_offset);
2379 
2380  const bool hasTrackDetails = candFunc::getHasTrackDetails(muon_cand);
2381  if (hasTrackDetails) {
2382  get(dnn::pfCand_muon_hasTrackDetails) =
2383  sp.scale(hasTrackDetails, dnn::pfCand_muon_hasTrackDetails - PFmu_index_offset);
2384  get(dnn::pfCand_muon_dxy) = sp.scale(candFunc::getTauDxy(muon_cand), dnn::pfCand_muon_dxy - PFmu_index_offset);
2385  get(dnn::pfCand_muon_dxy_sig) = sp.scale(std::abs(candFunc::getTauDxy(muon_cand)) / muon_cand.dxyError(),
2386  dnn::pfCand_muon_dxy_sig - PFmu_index_offset);
2387  get(dnn::pfCand_muon_dz) = sp.scale(candFunc::getTauDz(muon_cand), dnn::pfCand_muon_dz - PFmu_index_offset);
2388  get(dnn::pfCand_muon_dz_sig) = sp.scale(std::abs(candFunc::getTauDz(muon_cand)) / muon_cand.dzError(),
2389  dnn::pfCand_muon_dz_sig - PFmu_index_offset);
2390  get(dnn::pfCand_muon_track_chi2_ndof) =
2391  candFunc::getPseudoTrack(muon_cand).ndof() > 0
2392  ? sp.scale(candFunc::getPseudoTrack(muon_cand).chi2() / candFunc::getPseudoTrack(muon_cand).ndof(),
2393  dnn::pfCand_muon_track_chi2_ndof - PFmu_index_offset)
2394  : 0;
2395  get(dnn::pfCand_muon_track_ndof) =
2396  candFunc::getPseudoTrack(muon_cand).ndof() > 0
2397  ? sp.scale(candFunc::getPseudoTrack(muon_cand).ndof(), dnn::pfCand_muon_track_ndof - PFmu_index_offset)
2398  : 0;
2399  }
2400  }
2401  if (valid_index_muon) {
2402  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(ft_mu, is_inner));
2403  size_t index_muon = cell_map.at(CellObjectType::Muon);
2404  const auto& muon = muons->at(index_muon);
2405 
2406  get(dnn::muon_valid) = sp.scale(valid_index_muon, dnn::muon_valid - mu_index_offset);
2407  get(dnn::muon_rel_pt) = sp.scale(muon.polarP4().pt() / tau.polarP4().pt(), dnn::muon_rel_pt - mu_index_offset);
2408  get(dnn::muon_deta) = sp.scale(muon.polarP4().eta() - tau.polarP4().eta(), dnn::muon_deta - mu_index_offset);
2409  get(dnn::muon_dphi) = sp.scale(dPhi(tau.polarP4(), muon.polarP4()), dnn::muon_dphi - mu_index_offset);
2410  get(dnn::muon_dxy) = sp.scale(muon.dB(pat::Muon::PV2D), dnn::muon_dxy - mu_index_offset);
2411  get(dnn::muon_dxy_sig) =
2412  sp.scale(std::abs(muon.dB(pat::Muon::PV2D)) / muon.edB(pat::Muon::PV2D), dnn::muon_dxy_sig - mu_index_offset);
2413 
2414  const bool normalizedChi2_valid = muon.globalTrack().isNonnull() && muon.normChi2() >= 0;
2415  if (normalizedChi2_valid) {
2416  get(dnn::muon_normalizedChi2_valid) =
2417  sp.scale(normalizedChi2_valid, dnn::muon_normalizedChi2_valid - mu_index_offset);
2418  get(dnn::muon_normalizedChi2) = sp.scale(muon.normChi2(), dnn::muon_normalizedChi2 - mu_index_offset);
2419  if (muon.innerTrack().isNonnull())
2420  get(dnn::muon_numberOfValidHits) =
2421  sp.scale(muon.numberOfValidHits(), dnn::muon_numberOfValidHits - mu_index_offset);
2422  }
2423  get(dnn::muon_segmentCompatibility) =
2424  sp.scale(muon.segmentCompatibility(), dnn::muon_segmentCompatibility - mu_index_offset);
2425  get(dnn::muon_caloCompatibility) =
2426  sp.scale(muon.caloCompatibility(), dnn::muon_caloCompatibility - mu_index_offset);
2427 
2428  const bool pfEcalEnergy_valid = muon.pfEcalEnergy() >= 0;
2429  if (pfEcalEnergy_valid) {
2430  get(dnn::muon_pfEcalEnergy_valid) =
2431  sp.scale(pfEcalEnergy_valid, dnn::muon_pfEcalEnergy_valid - mu_index_offset);
2432  get(dnn::muon_rel_pfEcalEnergy) =
2433  sp.scale(muon.pfEcalEnergy() / muon.polarP4().pt(), dnn::muon_rel_pfEcalEnergy - mu_index_offset);
2434  }
2435 
2436  MuonHitMatchV2 hit_match(muon);
2437  static const std::map<int, std::pair<int, int>> muonMatchHitVars = {
2438  {MuonSubdetId::DT, {dnn::muon_n_matches_DT_1, dnn::muon_n_hits_DT_1}},
2439  {MuonSubdetId::CSC, {dnn::muon_n_matches_CSC_1, dnn::muon_n_hits_CSC_1}},
2440  {MuonSubdetId::RPC, {dnn::muon_n_matches_RPC_1, dnn::muon_n_hits_RPC_1}}};
2441 
2442  for (int subdet : hit_match.MuonHitMatchV2::consideredSubdets()) {
2443  const auto& matchHitVar = muonMatchHitVars.at(subdet);
2444  for (int station = MuonHitMatchV2::first_station_id; station <= MuonHitMatchV2::last_station_id; ++station) {
2445  const unsigned n_matches = hit_match.nMatches(subdet, station);
2446  const unsigned n_hits = hit_match.nHits(subdet, station);
2447  get(matchHitVar.first + station - 1) = sp.scale(n_matches, matchHitVar.first + station - 1 - mu_index_offset);
2448  get(matchHitVar.second + station - 1) = sp.scale(n_hits, matchHitVar.second + station - 1 - mu_index_offset);
2449  }
2450  }
2451  }
2452  }
static bool isInEcalCrack(double eta)
Definition: DeepTauId.cc:2718
const std::map< std::pair< deep_tau::Scaling::FeatureT, bool >, deep_tau::Scaling::ScalingParams > * scalingParamsMap_
Definition: DeepTauId.cc:2783
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
const_reference at(size_type pos) const
static constexpr int RPC
Definition: MuonSubdetId.h:13
static constexpr int DT
Definition: MuonSubdetId.h:11
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
Definition: DeepTauId.cc:2781
static constexpr int CSC
Definition: MuonSubdetId.h:12

◆ createOutputs()

void DeepTauId::createOutputs ( edm::Event event,
const tensorflow::Tensor &  pred,
edm::Handle< TauCollection taus 
)
inlineprivate

Definition at line 1322 of file DeepTauId.cc.

References is_online_, eostools::move(), outputs_, mps_fire::result, Tau3MuMonitor_cff::taus, FWLite::working_points, and workingPoints_.

Referenced by produce().

1322  {
1323  for (const auto& output_desc : outputs_) {
1324  const WPList* working_points = nullptr;
1325  if (workingPoints_.find(output_desc.first) != workingPoints_.end()) {
1326  working_points = &workingPoints_.at(output_desc.first);
1327  }
1328  auto result = output_desc.second.get_value(taus, pred, working_points, is_online_);
1329  event.put(std::move(result), output_desc.first);
1330  }
1331  }
std::map< std::string, WPList > workingPoints_
Definition: DeepTauId.cc:2741
working_points
Definition: FWLite.py:134
OutputCollection outputs_
Definition: DeepTauId.cc:2743
const bool is_online_
Definition: DeepTauId.cc:2742
std::vector< CutterPtr > WPList
Definition: DeepTauId.cc:956
def move(src, dest)
Definition: eostools.py:511

◆ createTauBlockInputs()

template<typename CandidateCastType , typename TauCastType >
void DeepTauId::createTauBlockInputs ( const TauCastType &  tau,
const size_t &  tau_index,
const edm::RefToBase< reco::BaseTau tau_ref,
const reco::Vertex pv,
double  rho,
TauFunc  tau_funcs 
)
inlineprivate

Definition at line 1880 of file DeepTauId.cc.

References funct::abs(), calculateGottfriedJacksonAngleDifference(), disable_dxy_pca_, reco::tau::eratio(), getValueLinear(), PixelMapPlotter::inputs, is_online_, isAbove(), isInEcalCrack(), reco::tau::n_photons_total(), pi, reco::tau::pt_weighted_deta_strip(), reco::tau::pt_weighted_dphi_strip(), reco::tau::pt_weighted_dr_iso(), reco::tau::pt_weighted_dr_signal(), rho, IsoPhotonEBSkim_cff::rho, scalingParamsMap_, sub_version_, metsig::tau, runTauDisplay::tau_eta, runTauDisplay::tau_mass, runTauDisplay::tau_phi, runTauDisplay::tau_pt, tauBlockTensor_, and tauInputs_indices_.

1885  {
1886  namespace dnn = dnn_inputs_v2::TauBlockInputs;
1887  namespace sc = deep_tau::Scaling;
1888  sc::FeatureT ft = sc::FeatureT::TauFlat;
1889  const sc::ScalingParams& sp = scalingParamsMap_->at(std::make_pair(ft, false));
1890 
1891  tensorflow::Tensor& inputs = *tauBlockTensor_;
1892  inputs.flat<float>().setZero();
1893 
1894  const auto& get = [&](int var_index) -> float& {
1895  return inputs.matrix<float>()(0, tauInputs_indices_.at(var_index));
1896  };
1897 
1898  auto leadChargedHadrCand = dynamic_cast<const CandidateCastType*>(tau.leadChargedHadrCand().get());
1899 
1900  get(dnn::rho) = sp.scale(rho, tauInputs_indices_[dnn::rho]);
1901  get(dnn::tau_pt) = sp.scale(tau.polarP4().pt(), tauInputs_indices_[dnn::tau_pt]);
1902  get(dnn::tau_eta) = sp.scale(tau.polarP4().eta(), tauInputs_indices_[dnn::tau_eta]);
1903  if (sub_version_ == 1) {
1904  get(dnn::tau_phi) = getValueLinear(tau.polarP4().phi(), -pi, pi, false);
1905  }
1906  get(dnn::tau_mass) = sp.scale(tau.polarP4().mass(), tauInputs_indices_[dnn::tau_mass]);
1907  get(dnn::tau_E_over_pt) = sp.scale(tau.p4().energy() / tau.p4().pt(), tauInputs_indices_[dnn::tau_E_over_pt]);
1908  get(dnn::tau_charge) = sp.scale(tau.charge(), tauInputs_indices_[dnn::tau_charge]);
1909  get(dnn::tau_n_charged_prongs) = sp.scale(tau.decayMode() / 5 + 1, tauInputs_indices_[dnn::tau_n_charged_prongs]);
1910  get(dnn::tau_n_neutral_prongs) = sp.scale(tau.decayMode() % 5, tauInputs_indices_[dnn::tau_n_neutral_prongs]);
1911  get(dnn::chargedIsoPtSum) =
1912  sp.scale(tau_funcs.getChargedIsoPtSum(tau, tau_ref), tauInputs_indices_[dnn::chargedIsoPtSum]);
1913  get(dnn::chargedIsoPtSumdR03_over_dR05) =
1914  sp.scale(tau_funcs.getChargedIsoPtSumdR03(tau, tau_ref) / tau_funcs.getChargedIsoPtSum(tau, tau_ref),
1915  tauInputs_indices_[dnn::chargedIsoPtSumdR03_over_dR05]);
1916  if (sub_version_ == 1)
1917  get(dnn::footprintCorrection) =
1918  sp.scale(tau_funcs.getFootprintCorrectiondR03(tau, tau_ref), tauInputs_indices_[dnn::footprintCorrection]);
1919  else if (sub_version_ == 5)
1920  get(dnn::footprintCorrection) =
1921  sp.scale(tau_funcs.getFootprintCorrection(tau, tau_ref), tauInputs_indices_[dnn::footprintCorrection]);
1922 
1923  get(dnn::neutralIsoPtSum) =
1924  sp.scale(tau_funcs.getNeutralIsoPtSum(tau, tau_ref), tauInputs_indices_[dnn::neutralIsoPtSum]);
1925  get(dnn::neutralIsoPtSumWeight_over_neutralIsoPtSum) =
1926  sp.scale(tau_funcs.getNeutralIsoPtSumWeight(tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(tau, tau_ref),
1927  tauInputs_indices_[dnn::neutralIsoPtSumWeight_over_neutralIsoPtSum]);
1928  get(dnn::neutralIsoPtSumWeightdR03_over_neutralIsoPtSum) =
1929  sp.scale(tau_funcs.getNeutralIsoPtSumdR03Weight(tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(tau, tau_ref),
1930  tauInputs_indices_[dnn::neutralIsoPtSumWeightdR03_over_neutralIsoPtSum]);
1931  get(dnn::neutralIsoPtSumdR03_over_dR05) =
1932  sp.scale(tau_funcs.getNeutralIsoPtSumdR03(tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(tau, tau_ref),
1933  tauInputs_indices_[dnn::neutralIsoPtSumdR03_over_dR05]);
1934  get(dnn::photonPtSumOutsideSignalCone) = sp.scale(tau_funcs.getPhotonPtSumOutsideSignalCone(tau, tau_ref),
1935  tauInputs_indices_[dnn::photonPtSumOutsideSignalCone]);
1936  get(dnn::puCorrPtSum) = sp.scale(tau_funcs.getPuCorrPtSum(tau, tau_ref), tauInputs_indices_[dnn::puCorrPtSum]);
1937  // The global PCA coordinates were used as inputs during the NN training, but it was decided to disable
1938  // them for the inference, because modeling of dxy_PCA in MC poorly describes the data, and x and y coordinates
1939  // in data results outside of the expected 5 std. dev. input validity range. On the other hand,
1940  // these coordinates are strongly era-dependent. Kept as comment to document what NN expects.
1941  if (sub_version_ == 1) {
1942  if (!disable_dxy_pca_) {
1943  auto const pca = tau_funcs.getdxyPCA(tau, tau_index);
1944  get(dnn::tau_dxy_pca_x) = sp.scale(pca.x(), tauInputs_indices_[dnn::tau_dxy_pca_x]);
1945  get(dnn::tau_dxy_pca_y) = sp.scale(pca.y(), tauInputs_indices_[dnn::tau_dxy_pca_y]);
1946  get(dnn::tau_dxy_pca_z) = sp.scale(pca.z(), tauInputs_indices_[dnn::tau_dxy_pca_z]);
1947  } else {
1948  get(dnn::tau_dxy_pca_x) = 0;
1949  get(dnn::tau_dxy_pca_y) = 0;
1950  get(dnn::tau_dxy_pca_z) = 0;
1951  }
1952  }
1953 
1954  const bool tau_dxy_valid =
1955  isAbove(tau_funcs.getdxy(tau, tau_index), -10) && isAbove(tau_funcs.getdxyError(tau, tau_index), 0);
1956  if (tau_dxy_valid) {
1957  get(dnn::tau_dxy_valid) = sp.scale(tau_dxy_valid, tauInputs_indices_[dnn::tau_dxy_valid]);
1958  get(dnn::tau_dxy) = sp.scale(tau_funcs.getdxy(tau, tau_index), tauInputs_indices_[dnn::tau_dxy]);
1959  get(dnn::tau_dxy_sig) =
1960  sp.scale(std::abs(tau_funcs.getdxy(tau, tau_index)) / tau_funcs.getdxyError(tau, tau_index),
1961  tauInputs_indices_[dnn::tau_dxy_sig]);
1962  }
1963  const bool tau_ip3d_valid =
1964  isAbove(tau_funcs.getip3d(tau, tau_index), -10) && isAbove(tau_funcs.getip3dError(tau, tau_index), 0);
1965  if (tau_ip3d_valid) {
1966  get(dnn::tau_ip3d_valid) = sp.scale(tau_ip3d_valid, tauInputs_indices_[dnn::tau_ip3d_valid]);
1967  get(dnn::tau_ip3d) = sp.scale(tau_funcs.getip3d(tau, tau_index), tauInputs_indices_[dnn::tau_ip3d]);
1968  get(dnn::tau_ip3d_sig) =
1969  sp.scale(std::abs(tau_funcs.getip3d(tau, tau_index)) / tau_funcs.getip3dError(tau, tau_index),
1970  tauInputs_indices_[dnn::tau_ip3d_sig]);
1971  }
1972  if (leadChargedHadrCand) {
1973  const bool hasTrackDetails = candFunc::getHasTrackDetails(*leadChargedHadrCand);
1974  const float tau_dz = (is_online_ && !hasTrackDetails) ? 0 : candFunc::getTauDz(*leadChargedHadrCand);
1975  get(dnn::tau_dz) = sp.scale(tau_dz, tauInputs_indices_[dnn::tau_dz]);
1976  get(dnn::tau_dz_sig_valid) =
1977  sp.scale(candFunc::getTauDZSigValid(*leadChargedHadrCand), tauInputs_indices_[dnn::tau_dz_sig_valid]);
1978  const double dzError = hasTrackDetails ? leadChargedHadrCand->dzError() : -999.;
1979  get(dnn::tau_dz_sig) = sp.scale(std::abs(tau_dz) / dzError, tauInputs_indices_[dnn::tau_dz_sig]);
1980  }
1981  get(dnn::tau_flightLength_x) =
1982  sp.scale(tau_funcs.getFlightLength(tau, tau_index).x(), tauInputs_indices_[dnn::tau_flightLength_x]);
1983  get(dnn::tau_flightLength_y) =
1984  sp.scale(tau_funcs.getFlightLength(tau, tau_index).y(), tauInputs_indices_[dnn::tau_flightLength_y]);
1985  get(dnn::tau_flightLength_z) =
1986  sp.scale(tau_funcs.getFlightLength(tau, tau_index).z(), tauInputs_indices_[dnn::tau_flightLength_z]);
1987  if (sub_version_ == 1)
1988  get(dnn::tau_flightLength_sig) = 0.55756444; //This value is set due to a bug in the training
1989  else if (sub_version_ == 5)
1990  get(dnn::tau_flightLength_sig) =
1991  sp.scale(tau_funcs.getFlightLengthSig(tau, tau_index), tauInputs_indices_[dnn::tau_flightLength_sig]);
1992 
1993  get(dnn::tau_pt_weighted_deta_strip) = sp.scale(reco::tau::pt_weighted_deta_strip(tau, tau.decayMode()),
1994  tauInputs_indices_[dnn::tau_pt_weighted_deta_strip]);
1995 
1996  get(dnn::tau_pt_weighted_dphi_strip) = sp.scale(reco::tau::pt_weighted_dphi_strip(tau, tau.decayMode()),
1997  tauInputs_indices_[dnn::tau_pt_weighted_dphi_strip]);
1998  get(dnn::tau_pt_weighted_dr_signal) = sp.scale(reco::tau::pt_weighted_dr_signal(tau, tau.decayMode()),
1999  tauInputs_indices_[dnn::tau_pt_weighted_dr_signal]);
2000  get(dnn::tau_pt_weighted_dr_iso) =
2001  sp.scale(reco::tau::pt_weighted_dr_iso(tau, tau.decayMode()), tauInputs_indices_[dnn::tau_pt_weighted_dr_iso]);
2002  get(dnn::tau_leadingTrackNormChi2) =
2003  sp.scale(tau_funcs.getLeadingTrackNormChi2(tau), tauInputs_indices_[dnn::tau_leadingTrackNormChi2]);
2004  const auto eratio = reco::tau::eratio(tau);
2005  const bool tau_e_ratio_valid = std::isnormal(eratio) && eratio > 0.f;
2006  get(dnn::tau_e_ratio_valid) = sp.scale(tau_e_ratio_valid, tauInputs_indices_[dnn::tau_e_ratio_valid]);
2007  get(dnn::tau_e_ratio) = tau_e_ratio_valid ? sp.scale(eratio, tauInputs_indices_[dnn::tau_e_ratio]) : 0.f;
2008  const double gj_angle_diff = calculateGottfriedJacksonAngleDifference(tau, tau_index, tau_funcs);
2009  const bool tau_gj_angle_diff_valid = (std::isnormal(gj_angle_diff) || gj_angle_diff == 0) && gj_angle_diff >= 0;
2010  get(dnn::tau_gj_angle_diff_valid) =
2011  sp.scale(tau_gj_angle_diff_valid, tauInputs_indices_[dnn::tau_gj_angle_diff_valid]);
2012  get(dnn::tau_gj_angle_diff) =
2013  tau_gj_angle_diff_valid ? sp.scale(gj_angle_diff, tauInputs_indices_[dnn::tau_gj_angle_diff]) : 0;
2014  get(dnn::tau_n_photons) = sp.scale(reco::tau::n_photons_total(tau), tauInputs_indices_[dnn::tau_n_photons]);
2015  get(dnn::tau_emFraction) = sp.scale(tau_funcs.getEmFraction(tau), tauInputs_indices_[dnn::tau_emFraction]);
2016 
2017  get(dnn::tau_inside_ecal_crack) =
2018  sp.scale(isInEcalCrack(tau.p4().eta()), tauInputs_indices_[dnn::tau_inside_ecal_crack]);
2019  get(dnn::leadChargedCand_etaAtEcalEntrance_minus_tau_eta) =
2020  sp.scale(tau_funcs.getEtaAtEcalEntrance(tau) - tau.p4().eta(),
2021  tauInputs_indices_[dnn::leadChargedCand_etaAtEcalEntrance_minus_tau_eta]);
2022  }
unsigned int n_photons_total(const reco::PFTau &tau)
return total number of pf photon candidates with pT>500 MeV, which are associated to signal ...
float pt_weighted_dr_signal(const reco::PFTau &tau, int dm)
const bool disable_dxy_pca_
Definition: DeepTauId.cc:2777
static float getValueLinear(T value, float min_value, float max_value, bool positive)
Definition: DeepTauId.cc:1339
static bool isAbove(double value, double min)
Definition: DeepTauId.cc:1355
static bool isInEcalCrack(double eta)
Definition: DeepTauId.cc:2718
const unsigned sub_version_
Definition: DeepTauId.cc:2775
const std::map< std::pair< deep_tau::Scaling::FeatureT, bool >, deep_tau::Scaling::ScalingParams > * scalingParamsMap_
Definition: DeepTauId.cc:2783
static constexpr float pi
Definition: DeepTauId.cc:1320
float pt_weighted_deta_strip(const reco::PFTau &tau, int dm)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
float pt_weighted_dr_iso(const reco::PFTau &tau, int dm)
static bool calculateGottfriedJacksonAngleDifference(const TauCastType &tau, const size_t tau_index, double &gj_diff, TauFunc tau_funcs)
Definition: DeepTauId.cc:2687
float pt_weighted_dphi_strip(const reco::PFTau &tau, int dm)
float eratio(const reco::PFTau &tau)
return ratio of energy in ECAL over sum of energy in ECAL and HCAL
const bool is_online_
Definition: DeepTauId.cc:2742
std::vector< int > tauInputs_indices_
Definition: DeepTauId.cc:2788
std::unique_ptr< tensorflow::Tensor > tauBlockTensor_
Definition: DeepTauId.cc:2780

◆ fillDescriptions()

static void DeepTauId::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
inlinestatic

Definition at line 1043 of file DeepTauId.cc.

References edm::ConfigurationDescriptions::add(), edm::ParameterSetDescription::add(), edm::ParameterSetDescription::addOptional(), submitPVResolutionJobs::desc, ProducerED_cfi::InputTag, and AlCaHLTBitMon_QueryRunRegistry::string.

1043  {
1045  desc.add<edm::InputTag>("electrons", edm::InputTag("slimmedElectrons"));
1046  desc.add<edm::InputTag>("muons", edm::InputTag("slimmedMuons"));
1047  desc.add<edm::InputTag>("taus", edm::InputTag("slimmedTaus"));
1048  desc.add<edm::InputTag>("pfcands", edm::InputTag("packedPFCandidates"));
1049  desc.add<edm::InputTag>("vertices", edm::InputTag("offlineSlimmedPrimaryVertices"));
1050  desc.add<edm::InputTag>("rho", edm::InputTag("fixedGridRhoAll"));
1051  desc.add<std::vector<std::string>>("graph_file",
1052  {"RecoTauTag/TrainingFiles/data/DeepTauId/deepTau_2017v2p6_e6.pb"});
1053  desc.add<bool>("mem_mapped", false);
1054  desc.add<unsigned>("year", 2017);
1055  desc.add<unsigned>("version", 2);
1056  desc.add<unsigned>("sub_version", 1);
1057  desc.add<int>("debug_level", 0);
1058  desc.add<bool>("disable_dxy_pca", false);
1059  desc.add<bool>("disable_hcalFraction_workaround", false);
1060  desc.add<bool>("disable_CellIndex_workaround", false);
1061  desc.add<bool>("save_inputs", false);
1062  desc.add<bool>("is_online", false);
1063 
1064  desc.add<std::vector<std::string>>("VSeWP", {"-1."});
1065  desc.add<std::vector<std::string>>("VSmuWP", {"-1."});
1066  desc.add<std::vector<std::string>>("VSjetWP", {"-1."});
1067 
1068  desc.addUntracked<edm::InputTag>("basicTauDiscriminators", edm::InputTag("basicTauDiscriminators"));
1069  desc.addUntracked<edm::InputTag>("basicTauDiscriminatorsdR03", edm::InputTag("basicTauDiscriminatorsdR03"));
1070  desc.add<edm::InputTag>("pfTauTransverseImpactParameters", edm::InputTag("hpsPFTauTransverseImpactParameters"));
1071 
1072  {
1073  edm::ParameterSetDescription pset_Prediscriminants;
1074  pset_Prediscriminants.add<std::string>("BooleanOperator", "and");
1075  {
1077  psd1.add<double>("cut");
1078  psd1.add<edm::InputTag>("Producer");
1079  pset_Prediscriminants.addOptional<edm::ParameterSetDescription>("decayMode", psd1);
1080  }
1081  desc.add<edm::ParameterSetDescription>("Prediscriminants", pset_Prediscriminants);
1082  }
1083 
1084  descriptions.add("DeepTau", desc);
1085  }
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void add(std::string const &label, ParameterSetDescription const &psetDescription)

◆ fillGrids()

template<typename Collection , typename TauCastType >
void DeepTauId::fillGrids ( const TauCastType &  tau,
const Collection &  objects,
CellGrid &  inner_grid,
CellGrid &  outer_grid 
)
inlineprivate

Definition at line 1727 of file DeepTauId.cc.

References reco::deltaPhi(), getInnerSignalConeRadius(), getRunAppsInfo::grid, dqmiodumpmetadata::n, getGTfromDQMFile::obj, conifer::pow(), and metsig::tau.

Referenced by getPredictionsV2().

1727  {
1728  static constexpr double outer_dR2 = 0.25; //0.5^2
1729  const double inner_radius = getInnerSignalConeRadius(tau.polarP4().pt());
1730  const double inner_dR2 = std::pow(inner_radius, 2);
1731 
1732  const auto addObject = [&](size_t n, double deta, double dphi, CellGrid& grid) {
1733  const auto& obj = objects.at(n);
1734  const CellObjectType obj_type = GetCellObjectType(obj);
1735  if (obj_type == CellObjectType::Other)
1736  return;
1737  CellIndex cell_index;
1738  if (grid.tryGetCellIndex(deta, dphi, cell_index)) {
1739  Cell& cell = grid[cell_index];
1740  auto iter = cell.find(obj_type);
1741  if (iter != cell.end()) {
1742  const auto& prev_obj = objects.at(iter->second);
1743  if (obj.polarP4().pt() > prev_obj.polarP4().pt())
1744  iter->second = n;
1745  } else {
1746  cell[obj_type] = n;
1747  }
1748  }
1749  };
1750 
1751  for (size_t n = 0; n < objects.size(); ++n) {
1752  const auto& obj = objects.at(n);
1753  const double deta = obj.polarP4().eta() - tau.polarP4().eta();
1754  const double dphi = reco::deltaPhi(obj.polarP4().phi(), tau.polarP4().phi());
1755  const double dR2 = std::pow(deta, 2) + std::pow(dphi, 2);
1756  if (dR2 < inner_dR2)
1757  addObject(n, deta, dphi, inner_grid);
1758  if (dR2 < outer_dR2)
1759  addObject(n, deta, dphi, outer_grid);
1760  }
1761  }
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
static double getInnerSignalConeRadius(double pt)
Definition: DeepTauId.cc:2679
constexpr int pow(int x)
Definition: conifer.h:24
CellObjectType
Definition: DeepTauId.cc:826

◆ findMatchedElectron()

template<typename TauCastType >
static const pat::Electron* DeepTauId::findMatchedElectron ( const TauCastType &  tau,
const std::vector< pat::Electron > *  electrons,
double  deltaR 
)
inlinestaticprivate

Definition at line 2724 of file DeepTauId.cc.

References PbPb_ZMuSkimMuonDPG_cff::deltaR, reco::deltaR2(), pwdgSkimBPark_cfi::electrons, reco::LeafCandidate::pt(), and metsig::tau.

2726  {
2727  const double dR2 = deltaR * deltaR;
2728  const pat::Electron* matched_ele = nullptr;
2729  for (const auto& ele : *electrons) {
2730  if (reco::deltaR2(tau.p4(), ele.p4()) < dR2 && (!matched_ele || matched_ele->pt() < ele.pt())) {
2731  matched_ele = &ele;
2732  }
2733  }
2734  return matched_ele;
2735  }
double pt() const final
transverse momentum
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
Analysis-level electron class.
Definition: Electron.h:51

◆ getInnerSignalConeRadius()

static double DeepTauId::getInnerSignalConeRadius ( double  pt)
inlinestaticprivate

Definition at line 2679 of file DeepTauId.cc.

References SiStripPI::max, cosmictrackSelector_cfi::min_pt, and DiDispStaMuonMonitor_cfi::pt.

Referenced by fillGrids(), and processSignalPFComponents().

2679  {
2680  static constexpr double min_pt = 30., min_radius = 0.05, cone_opening_coef = 3.;
2681  // This is equivalent of the original formula (std::max(std::min(0.1, 3.0/pt), 0.05)
2682  return std::max(cone_opening_coef / std::max(pt, min_pt), min_radius);
2683  }

◆ GetOutputs()

static const OutputCollection& DeepTauId::GetOutputs ( )
inlinestatic

Definition at line 999 of file DeepTauId.cc.

References GetRecoTauVFromDQM_MC_cff::Output, and outputs_.

999  {
1000  static constexpr size_t e_index = 0, mu_index = 1, tau_index = 2, jet_index = 3;
1001  static const OutputCollection outputs_ = {
1002  {"VSe", Output({tau_index}, {e_index, tau_index})},
1003  {"VSmu", Output({tau_index}, {mu_index, tau_index})},
1004  {"VSjet", Output({tau_index}, {jet_index, tau_index})},
1005  };
1006  return outputs_;
1007  }
OutputCollection outputs_
Definition: DeepTauId.cc:2743
std::map< std::string, Output > OutputCollection
Definition: DeepTauId.cc:995

◆ getPartialPredictions()

tensorflow::Tensor DeepTauId::getPartialPredictions ( bool  is_inner)
inlineprivate

Definition at line 1763 of file DeepTauId.cc.

References cache_, eGammaTensor_, deep_tau::DeepTauCache::getSession(), hadronsTensor_, muonTensor_, and tensorflow::run().

Referenced by createConvFeatures(), and DeepTauId().

1763  {
1764  std::vector<tensorflow::Tensor> pred_vector;
1765  if (is_inner) {
1766  tensorflow::run(&(cache_->getSession("inner")),
1767  {
1768  {"input_inner_egamma", *eGammaTensor_.at(is_inner)},
1769  {"input_inner_muon", *muonTensor_.at(is_inner)},
1770  {"input_inner_hadrons", *hadronsTensor_.at(is_inner)},
1771  },
1772  {"inner_all_dropout_4/Identity"},
1773  &pred_vector);
1774  } else {
1775  tensorflow::run(&(cache_->getSession("outer")),
1776  {
1777  {"input_outer_egamma", *eGammaTensor_.at(is_inner)},
1778  {"input_outer_muon", *muonTensor_.at(is_inner)},
1779  {"input_outer_hadrons", *hadronsTensor_.at(is_inner)},
1780  },
1781  {"outer_all_dropout_4/Identity"},
1782  &pred_vector);
1783  }
1784  return pred_vector.at(0);
1785  }
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
Definition: DeepTauId.cc:2781
const deep_tau::DeepTauCache * cache_
Definition: DeepTauId.cc:2744
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
Definition: TensorFlow.cc:259
tensorflow::Session & getSession(const std::string &name="") const
Definition: DeepTauId.cc:147
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
Definition: DeepTauId.cc:2781
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
Definition: DeepTauId.cc:2781

◆ getPredictions()

tensorflow::Tensor DeepTauId::getPredictions ( edm::Event event,
edm::Handle< TauCollection taus 
)
inlineprivate

Definition at line 1497 of file DeepTauId.cc.

References andPrediscriminants_, basicDiscrdR03IndexMap_, basicDiscrIndexMap_, HLT_2023v12_cff::basicTauDiscriminators, basicTauDiscriminators_inputToken_, HLT_2023v12_cff::basicTauDiscriminatorsdR03, basicTauDiscriminatorsdR03_inputToken_, discrIndicesMapped_, electrons_token_, Exception, f, is_online_, dqmdumpme::k, matchDiscriminatorIndices(), muons_token_, deep_tau::NumberOfOutputs, patPrediscriminants_, pfcandToken_, HLT_2023v12_cff::pfTauTransverseImpactParameters, pfTauTransverseImpactParameters_token_, recoPrediscriminants_, requiredBasicDiscriminators_, requiredBasicDiscriminatorsdR03_, rho, rho_token_, Tau3MuMonitor_cff::taus, version_, AlignmentTracksFromVertexSelector_cfi::vertices, and vtxToken_.

Referenced by produce().

1497  {
1498  // Empty dummy vectors
1499  const std::vector<pat::Electron> electron_collection_default;
1500  const std::vector<pat::Muon> muon_collection_default;
1501  const reco::TauDiscriminatorContainer basicTauDiscriminators_default;
1502  const reco::TauDiscriminatorContainer basicTauDiscriminatorsdR03_default;
1504  pfTauTransverseImpactParameters_default;
1505 
1506  const std::vector<pat::Electron>* electron_collection;
1507  const std::vector<pat::Muon>* muon_collection;
1512 
1513  if (!is_online_) {
1514  electron_collection = &event.get(electrons_token_);
1515  muon_collection = &event.get(muons_token_);
1516  pfTauTransverseImpactParameters = &pfTauTransverseImpactParameters_default;
1517  basicTauDiscriminators = &basicTauDiscriminators_default;
1518  basicTauDiscriminatorsdR03 = &basicTauDiscriminatorsdR03_default;
1519  } else {
1520  electron_collection = &electron_collection_default;
1521  muon_collection = &muon_collection_default;
1525 
1526  // Get indices for discriminators
1527  if (!discrIndicesMapped_) {
1532  discrIndicesMapped_ = true;
1533  }
1534  }
1535 
1536  TauFunc tauIDs = {basicTauDiscriminators,
1541 
1543  event.getByToken(pfcandToken_, pfCands);
1544 
1546  event.getByToken(vtxToken_, vertices);
1547 
1549  event.getByToken(rho_token_, rho);
1550 
1551  auto const& eventnr = event.id().event();
1552 
1553  tensorflow::Tensor predictions(tensorflow::DT_FLOAT, {static_cast<int>(taus->size()), deep_tau::NumberOfOutputs});
1554 
1555  for (size_t tau_index = 0; tau_index < taus->size(); ++tau_index) {
1556  const edm::RefToBase<reco::BaseTau> tauRef = taus->refAt(tau_index);
1557 
1558  std::vector<tensorflow::Tensor> pred_vector;
1559 
1560  bool passesPrediscriminants;
1561  if (is_online_) {
1562  passesPrediscriminants = tauIDs.passPrediscriminants<std::vector<TauDiscInfo<reco::PFTauDiscriminator>>>(
1564  } else {
1565  passesPrediscriminants = tauIDs.passPrediscriminants<std::vector<TauDiscInfo<pat::PATTauDiscriminator>>>(
1567  }
1568 
1569  if (passesPrediscriminants) {
1570  if (version_ == 2) {
1571  if (is_online_) {
1572  getPredictionsV2<reco::PFCandidate, reco::PFTau>(taus->at(tau_index),
1573  tau_index,
1574  tauRef,
1575  electron_collection,
1576  muon_collection,
1577  *pfCands,
1578  vertices->at(0),
1579  *rho,
1580  eventnr,
1581  pred_vector,
1582  tauIDs);
1583  } else
1584  getPredictionsV2<pat::PackedCandidate, pat::Tau>(taus->at(tau_index),
1585  tau_index,
1586  tauRef,
1587  electron_collection,
1588  muon_collection,
1589  *pfCands,
1590  vertices->at(0),
1591  *rho,
1592  eventnr,
1593  pred_vector,
1594  tauIDs);
1595  } else {
1596  throw cms::Exception("DeepTauId") << "version " << version_ << " is not supported.";
1597  }
1598 
1599  for (int k = 0; k < deep_tau::NumberOfOutputs; ++k) {
1600  const float pred = pred_vector[0].flat<float>()(k);
1601  if (!(pred >= 0 && pred <= 1))
1602  throw cms::Exception("DeepTauId")
1603  << "invalid prediction = " << pred << " for tau_index = " << tau_index << ", pred_index = " << k;
1604  predictions.matrix<float>()(tau_index, k) = pred;
1605  }
1606  } else {
1607  // This else statement was added as a part of the DeepTau@HLT development. It does not affect the current state
1608  // of offline DeepTauId code as there the preselection is not used (it was added in the DeepTau@HLT). It returns
1609  // default values for deepTau score if the preselection failed. Before this statement the values given for this tau
1610  // were random. k == 2 corresponds to the tau score and all other k values to e, mu and jets. By defining in this way
1611  // the final score is -1.
1612  for (int k = 0; k < deep_tau::NumberOfOutputs; ++k) {
1613  predictions.matrix<float>()(tau_index, k) = (k == 2) ? -1.f : 2.f;
1614  }
1615  }
1616  }
1617  return predictions;
1618  }
std::map< BasicDiscriminator, size_t > basicDiscrdR03IndexMap_
Definition: DeepTauId.cc:2793
std::map< BasicDiscriminator, size_t > basicDiscrIndexMap_
Definition: DeepTauId.cc:2792
edm::EDGetTokenT< reco::VertexCollection > vtxToken_
Definition: DeepTauId.cc:2740
std::vector< TauDiscInfo< reco::PFTauDiscriminator > > recoPrediscriminants_
Definition: DeepTauId.cc:1317
uint8_t andPrediscriminants_
Definition: DeepTauId.cc:1315
const unsigned version_
Definition: DeepTauId.cc:2774
std::vector< TauDiscInfo< pat::PATTauDiscriminator > > patPrediscriminants_
Definition: DeepTauId.cc:1316
edm::EDGetTokenT< CandidateCollection > pfcandToken_
Definition: DeepTauId.cc:2739
const std::map< BasicDiscriminator, size_t > matchDiscriminatorIndices(edm::Event &event, edm::EDGetTokenT< reco::TauDiscriminatorContainer > discriminatorContainerToken, std::vector< BasicDiscriminator > requiredDiscr)
Definition: DeepTauId.cc:1011
double f[11][100]
const std::vector< BasicDiscriminator > requiredBasicDiscriminators_
Definition: DeepTauId.cc:2753
const std::vector< BasicDiscriminator > requiredBasicDiscriminatorsdR03_
Definition: DeepTauId.cc:2758
edm::EDGetTokenT< edm::AssociationVector< reco::PFTauRefProd, std::vector< reco::PFTauTransverseImpactParameterRef > > > pfTauTransverseImpactParameters_token_
Definition: DeepTauId.cc:2771
bool discrIndicesMapped_
Definition: DeepTauId.cc:2791
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminators_inputToken_
Definition: DeepTauId.cc:2768
const bool is_online_
Definition: DeepTauId.cc:2742
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminatorsdR03_inputToken_
Definition: DeepTauId.cc:2769
edm::EDGetTokenT< std::vector< pat::Electron > > electrons_token_
Definition: DeepTauId.cc:2765
edm::EDGetTokenT< std::vector< pat::Muon > > muons_token_
Definition: DeepTauId.cc:2766
edm::EDGetTokenT< double > rho_token_
Definition: DeepTauId.cc:2767
Definition: event.py:1
constexpr int NumberOfOutputs
Definition: DeepTauId.cc:156

◆ getPredictionsV2()

template<typename CandidateCastType , typename TauCastType >
void DeepTauId::getPredictionsV2 ( TauCollection::const_reference tau,
const size_t  tau_index,
const edm::RefToBase< reco::BaseTau tau_ref,
const std::vector< pat::Electron > *  electrons,
const std::vector< pat::Muon > *  muons,
const edm::View< reco::Candidate > &  pfCands,
const reco::Vertex pv,
double  rho,
const edm::EventNumber_t eventnr,
std::vector< tensorflow::Tensor > &  pred_vector,
TauFunc  tau_funcs 
)
inlineprivate

Definition at line 1621 of file DeepTauId.cc.

References cms::cuda::assert(), cache_, checkInputs(), convTensor_, gather_cfg::cout, debug_level, disable_CellIndex_workaround_, eGammaTensor_, pwdgSkimBPark_cfi::electrons, file_counter_, fillGrids(), deep_tau::DeepTauCache::getSession(), hadronsTensor_, heavyIonCSV_trainingSettings::idx, is_first_block_, json_file_, label, PDWG_BPHSkim_cff::muons, muonTensor_, deep_tau::NumberOfOutputs, rho, tensorflow::run(), save_inputs_, saveInputs(), AlCaHLTBitMon_QueryRunRegistry::string, metsig::tau, tauBlockTensor_, and to_string().

1631  {
1632  using namespace dnn_inputs_v2;
1633  if (debug_level >= 2) {
1634  std::cout << "<DeepTauId::getPredictionsV2 (moduleLabel = " << moduleDescription().moduleLabel()
1635  << ")>:" << std::endl;
1636  std::cout << " tau: pT = " << tau.pt() << ", eta = " << tau.eta() << ", phi = " << tau.phi()
1637  << ", eventnr = " << eventnr << std::endl;
1638  }
1639  CellGrid inner_grid(number_of_inner_cell, number_of_inner_cell, 0.02, 0.02, disable_CellIndex_workaround_);
1640  CellGrid outer_grid(number_of_outer_cell, number_of_outer_cell, 0.05, 0.05, disable_CellIndex_workaround_);
1641  fillGrids(dynamic_cast<const TauCastType&>(tau), *electrons, inner_grid, outer_grid);
1642  fillGrids(dynamic_cast<const TauCastType&>(tau), *muons, inner_grid, outer_grid);
1643  fillGrids(dynamic_cast<const TauCastType&>(tau), pfCands, inner_grid, outer_grid);
1644 
1645  createTauBlockInputs<CandidateCastType>(
1646  dynamic_cast<const TauCastType&>(tau), tau_index, tau_ref, pv, rho, tau_funcs);
1647  checkInputs(*tauBlockTensor_, "input_tau", static_cast<int>(tauBlockTensor_->shape().dim_size(1)));
1648  createConvFeatures<CandidateCastType>(dynamic_cast<const TauCastType&>(tau),
1649  tau_index,
1650  tau_ref,
1651  pv,
1652  rho,
1653  electrons,
1654  muons,
1655  pfCands,
1656  inner_grid,
1657  tau_funcs,
1658  true);
1659  checkInputs(*eGammaTensor_[true], "input_inner_egamma", EgammaBlockInputs::NumberOfInputs, &inner_grid);
1660  checkInputs(*muonTensor_[true], "input_inner_muon", MuonBlockInputs::NumberOfInputs, &inner_grid);
1661  checkInputs(*hadronsTensor_[true], "input_inner_hadrons", HadronBlockInputs::NumberOfInputs, &inner_grid);
1662  createConvFeatures<CandidateCastType>(dynamic_cast<const TauCastType&>(tau),
1663  tau_index,
1664  tau_ref,
1665  pv,
1666  rho,
1667  electrons,
1668  muons,
1669  pfCands,
1670  outer_grid,
1671  tau_funcs,
1672  false);
1673  checkInputs(*eGammaTensor_[false], "input_outer_egamma", EgammaBlockInputs::NumberOfInputs, &outer_grid);
1674  checkInputs(*muonTensor_[false], "input_outer_muon", MuonBlockInputs::NumberOfInputs, &outer_grid);
1675  checkInputs(*hadronsTensor_[false], "input_outer_hadrons", HadronBlockInputs::NumberOfInputs, &outer_grid);
1676 
1677  if (save_inputs_) {
1678  std::string json_file_name = "DeepTauId_" + std::to_string(eventnr) + "_" + std::to_string(tau_index) + ".json";
1679  json_file_ = new std::ofstream(json_file_name.data());
1680  is_first_block_ = true;
1681  (*json_file_) << "{";
1682  saveInputs(*tauBlockTensor_, "input_tau", static_cast<int>(tauBlockTensor_->shape().dim_size(1)));
1683  saveInputs(
1684  *eGammaTensor_[true], "input_inner_egamma", dnn_inputs_v2::EgammaBlockInputs::NumberOfInputs, &inner_grid);
1685  saveInputs(*muonTensor_[true], "input_inner_muon", dnn_inputs_v2::MuonBlockInputs::NumberOfInputs, &inner_grid);
1686  saveInputs(
1687  *hadronsTensor_[true], "input_inner_hadrons", dnn_inputs_v2::HadronBlockInputs::NumberOfInputs, &inner_grid);
1688  saveInputs(
1689  *eGammaTensor_[false], "input_outer_egamma", dnn_inputs_v2::EgammaBlockInputs::NumberOfInputs, &outer_grid);
1690  saveInputs(*muonTensor_[false], "input_outer_muon", dnn_inputs_v2::MuonBlockInputs::NumberOfInputs, &outer_grid);
1691  saveInputs(
1692  *hadronsTensor_[false], "input_outer_hadrons", dnn_inputs_v2::HadronBlockInputs::NumberOfInputs, &outer_grid);
1693  (*json_file_) << "}";
1694  delete json_file_;
1695  ++file_counter_;
1696  }
1697 
1698  tensorflow::run(&(cache_->getSession("core")),
1699  {{"input_tau", *tauBlockTensor_},
1700  {"input_inner", *convTensor_.at(true)},
1701  {"input_outer", *convTensor_.at(false)}},
1702  {"main_output/Softmax"},
1703  &pred_vector);
1704  if (debug_level >= 1) {
1705  std::cout << "output = { ";
1706  for (int idx = 0; idx < deep_tau::NumberOfOutputs; ++idx) {
1707  if (idx > 0)
1708  std::cout << ", ";
1710  if (idx == 0)
1711  label = "e";
1712  else if (idx == 1)
1713  label = "mu";
1714  else if (idx == 2)
1715  label = "tau";
1716  else if (idx == 3)
1717  label = "jet";
1718  else
1719  assert(0);
1720  std::cout << label << " = " << pred_vector[0].flat<float>()(idx);
1721  }
1722  std::cout << " }" << std::endl;
1723  }
1724  }
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
Definition: DeepTauId.cc:2781
void fillGrids(const TauCastType &tau, const Collection &objects, CellGrid &inner_grid, CellGrid &outer_grid)
Definition: DeepTauId.cc:1727
const bool save_inputs_
Definition: DeepTauId.cc:2784
int file_counter_
Definition: DeepTauId.cc:2787
std::ofstream * json_file_
Definition: DeepTauId.cc:2785
assert(be >=bs)
static std::string to_string(const XMLCh *ch)
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > convTensor_
Definition: DeepTauId.cc:2781
const deep_tau::DeepTauCache * cache_
Definition: DeepTauId.cc:2744
char const * label
bool is_first_block_
Definition: DeepTauId.cc:2786
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
Definition: TensorFlow.cc:259
void saveInputs(const tensorflow::Tensor &inputs, const std::string &block_name, int n_inputs, const CellGrid *grid=nullptr)
Definition: DeepTauId.cc:1436
const bool disable_CellIndex_workaround_
Definition: DeepTauId.cc:2779
void checkInputs(const tensorflow::Tensor &inputs, const std::string &block_name, int n_inputs, const CellGrid *grid=nullptr) const
Definition: DeepTauId.cc:1380
tensorflow::Session & getSession(const std::string &name="") const
Definition: DeepTauId.cc:147
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
Definition: DeepTauId.cc:2781
const int debug_level
Definition: DeepTauId.cc:2776
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
Definition: DeepTauId.cc:2781
constexpr int NumberOfOutputs
Definition: DeepTauId.cc:156
std::unique_ptr< tensorflow::Tensor > tauBlockTensor_
Definition: DeepTauId.cc:2780

◆ getValue()

template<typename T >
static float DeepTauId::getValue ( T  value)
inlinestaticprivate

Definition at line 1334 of file DeepTauId.cc.

References f, and relativeConstraints::value.

Referenced by getValueLinear(), and getValueNorm().

1334  {
1335  return std::isnormal(value) ? static_cast<float>(value) : 0.f;
1336  }
double f[11][100]
Definition: value.py:1

◆ getValueLinear()

template<typename T >
static float DeepTauId::getValueLinear ( T  value,
float  min_value,
float  max_value,
bool  positive 
)
inlinestaticprivate

Definition at line 1339 of file DeepTauId.cc.

References getValue(), hcaldqm::quantity::max_value, and hcaldqm::quantity::min_value.

Referenced by createTauBlockInputs().

1339  {
1340  const float fixed_value = getValue(value);
1341  const float clamped_value = std::clamp(fixed_value, min_value, max_value);
1342  float transformed_value = (clamped_value - min_value) / (max_value - min_value);
1343  if (!positive)
1344  transformed_value = transformed_value * 2 - 1;
1345  return transformed_value;
1346  }
const std::map< ValueQuantityType, double > min_value
static float getValue(T value)
Definition: DeepTauId.cc:1334
Definition: value.py:1
const std::map< ValueQuantityType, double > max_value

◆ getValueNorm()

template<typename T >
static float DeepTauId::getValueNorm ( T  value,
float  mean,
float  sigma,
float  n_sigmas_max = 5 
)
inlinestaticprivate

Definition at line 1349 of file DeepTauId.cc.

References getValue(), and SiStripPI::mean.

1349  {
1350  const float fixed_value = getValue(value);
1351  const float norm_value = (fixed_value - mean) / sigma;
1352  return std::clamp(norm_value, -n_sigmas_max, n_sigmas_max);
1353  }
static float getValue(T value)
Definition: DeepTauId.cc:1334
Definition: value.py:1

◆ globalEndJob()

static void DeepTauId::globalEndJob ( const deep_tau::DeepTauCache cache_)
inlinestatic

Definition at line 1303 of file DeepTauId.cc.

1303 {}

◆ initializeGlobalCache()

static std::unique_ptr<deep_tau::DeepTauCache> DeepTauId::initializeGlobalCache ( const edm::ParameterSet cfg)
inlinestatic

Definition at line 1281 of file DeepTauId.cc.

References looper::cfg, mps_splice::entry, edm::FileInPath::fullPath(), HLT_2023v12_cff::graph_file, HLT_2023v12_cff::mem_mapped, and AlCaHLTBitMon_QueryRunRegistry::string.

1281  {
1282  const auto graph_name_vector = cfg.getParameter<std::vector<std::string>>("graph_file");
1283  std::map<std::string, std::string> graph_names;
1284  for (const auto& entry : graph_name_vector) {
1285  const size_t sep_pos = entry.find(':');
1286  std::string entry_name, graph_file;
1287  if (sep_pos != std::string::npos) {
1288  entry_name = entry.substr(0, sep_pos);
1289  graph_file = entry.substr(sep_pos + 1);
1290  } else {
1291  entry_name = "";
1292  graph_file = entry;
1293  }
1295  if (graph_names.count(entry_name))
1296  throw cms::Exception("DeepTauCache") << "Duplicated graph entries";
1297  graph_names[entry_name] = graph_file;
1298  }
1299  bool mem_mapped = cfg.getParameter<bool>("mem_mapped");
1300  return std::make_unique<deep_tau::DeepTauCache>(graph_names, mem_mapped);
1301  }
std::string fullPath() const
Definition: FileInPath.cc:161

◆ isAbove()

static bool DeepTauId::isAbove ( double  value,
double  min 
)
inlinestaticprivate

Definition at line 1355 of file DeepTauId.cc.

References SiStripPI::min.

Referenced by createTauBlockInputs().

1355 { return std::isnormal(value) && value > min; }
Definition: value.py:1

◆ isInEcalCrack()

static bool DeepTauId::isInEcalCrack ( double  eta)
inlinestaticprivate

Definition at line 2718 of file DeepTauId.cc.

References funct::abs(), and PVValHelper::eta.

Referenced by createEgammaBlockInputs(), createHadronsBlockInputs(), createMuonBlockInputs(), and createTauBlockInputs().

2718  {
2719  const double abs_eta = std::abs(eta);
2720  return abs_eta > 1.46 && abs_eta < 1.558;
2721  }
Abs< T >::type abs(const T &t)
Definition: Abs.h:22

◆ matchDiscriminatorIndices()

const std::map<BasicDiscriminator, size_t> DeepTauId::matchDiscriminatorIndices ( edm::Event event,
edm::EDGetTokenT< reco::TauDiscriminatorContainer discriminatorContainerToken,
std::vector< BasicDiscriminator requiredDiscr 
)
inline

Definition at line 1011 of file DeepTauId.cc.

References Exception, edm::ParameterSet::getParameter(), mps_fire::i, dqmiolumiharvest::j, edm::parameterSet(), AlCaHLTBitMon_QueryRunRegistry::string, and stringFromDiscriminator_.

Referenced by getPredictions().

1014  {
1015  std::map<std::string, size_t> discrIndexMapStr;
1016  auto const aHandle = event.getHandle(discriminatorContainerToken);
1017  auto const aProv = aHandle.provenance();
1018  if (aProv == nullptr)
1019  aHandle.whyFailed()->raise();
1020  const auto& psetsFromProvenance = edm::parameterSet(aProv->stable(), event.processHistory());
1021  auto const idlist = psetsFromProvenance.getParameter<std::vector<edm::ParameterSet>>("IDdefinitions");
1022  for (size_t j = 0; j < idlist.size(); ++j) {
1023  std::string idname = idlist[j].getParameter<std::string>("IDname");
1024  if (discrIndexMapStr.count(idname)) {
1025  throw cms::Exception("DeepTauId")
1026  << "basic discriminator " << idname << " appears more than once in the input.";
1027  }
1028  discrIndexMapStr[idname] = j;
1029  }
1030 
1031  //translate to a map of <BasicDiscriminator, index> and check if all discriminators are present
1032  std::map<BasicDiscriminator, size_t> discrIndexMap;
1033  for (size_t i = 0; i < requiredDiscr.size(); i++) {
1034  if (discrIndexMapStr.find(stringFromDiscriminator_.at(requiredDiscr[i])) == discrIndexMapStr.end())
1035  throw cms::Exception("DeepTauId") << "Basic Discriminator " << stringFromDiscriminator_.at(requiredDiscr[i])
1036  << " was not provided in the config file.";
1037  else
1038  discrIndexMap[requiredDiscr[i]] = discrIndexMapStr[stringFromDiscriminator_.at(requiredDiscr[i])];
1039  }
1040  return discrIndexMap;
1041  }
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
ParameterSet const & parameterSet(StableProvenance const &provenance, ProcessHistory const &history)
Definition: Provenance.cc:11
const std::map< BasicDiscriminator, std::string > stringFromDiscriminator_
Definition: DeepTauId.cc:2746

◆ processIsolationPFComponents()

template<typename CandidateCollection , typename TauCastType >
static void DeepTauId::processIsolationPFComponents ( const TauCastType &  tau,
const CandidateCollection candidates,
LorentzVectorXYZ p4,
float &  pt,
float &  d_eta,
float &  d_phi,
float &  m,
float &  n 
)
inlinestaticprivate

Definition at line 2657 of file DeepTauId.cc.

References HLT_2023v12_cff::candidates, default_value, HLT_2023v12_cff::dEta, HLT_2023v12_cff::dPhi, visualization-live-secondInstance_cfg::m, dqmiodumpmetadata::n, DiDispStaMuonMonitor_cfi::pt, and metsig::tau.

2664  {
2665  p4 = LorentzVectorXYZ(0, 0, 0, 0);
2666  n = 0;
2667 
2668  for (const auto& cand : candidates) {
2669  p4 += cand->p4();
2670  ++n;
2671  }
2672 
2673  pt = n != 0 ? p4.Pt() : default_value;
2674  d_eta = n != 0 ? dEta(p4, tau.p4()) : default_value;
2675  d_phi = n != 0 ? dPhi(p4, tau.p4()) : default_value;
2676  m = n != 0 ? p4.mass() : default_value;
2677  }
static constexpr float default_value
Definition: DeepTauId.cc:997
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > LorentzVectorXYZ
Definition: DeepTauId.cc:953

◆ processSignalPFComponents()

template<typename CandidateCollection , typename TauCastType >
static void DeepTauId::processSignalPFComponents ( const TauCastType &  tau,
const CandidateCollection candidates,
LorentzVectorXYZ p4_inner,
LorentzVectorXYZ p4_outer,
float &  pt_inner,
float &  dEta_inner,
float &  dPhi_inner,
float &  m_inner,
float &  pt_outer,
float &  dEta_outer,
float &  dPhi_outer,
float &  m_outer,
float &  n_inner,
float &  n_outer 
)
inlinestaticprivate

Definition at line 2613 of file DeepTauId.cc.

References HLT_2023v12_cff::candidates, default_value, reco::deltaR(), HLT_2023v12_cff::dEta, HLT_2023v12_cff::dPhi, HGC3DClusterGenMatchSelector_cfi::dR, getInnerSignalConeRadius(), and metsig::tau.

2626  {
2627  p4_inner = LorentzVectorXYZ(0, 0, 0, 0);
2628  p4_outer = LorentzVectorXYZ(0, 0, 0, 0);
2629  n_inner = 0;
2630  n_outer = 0;
2631 
2632  const double innerSigCone_radius = getInnerSignalConeRadius(tau.pt());
2633  for (const auto& cand : candidates) {
2634  const double dR = reco::deltaR(cand->p4(), tau.leadChargedHadrCand()->p4());
2635  const bool isInside_innerSigCone = dR < innerSigCone_radius;
2636  if (isInside_innerSigCone) {
2637  p4_inner += cand->p4();
2638  ++n_inner;
2639  } else {
2640  p4_outer += cand->p4();
2641  ++n_outer;
2642  }
2643  }
2644 
2645  pt_inner = n_inner != 0 ? p4_inner.Pt() : default_value;
2646  dEta_inner = n_inner != 0 ? dEta(p4_inner, tau.p4()) : default_value;
2647  dPhi_inner = n_inner != 0 ? dPhi(p4_inner, tau.p4()) : default_value;
2648  m_inner = n_inner != 0 ? p4_inner.mass() : default_value;
2649 
2650  pt_outer = n_outer != 0 ? p4_outer.Pt() : default_value;
2651  dEta_outer = n_outer != 0 ? dEta(p4_outer, tau.p4()) : default_value;
2652  dPhi_outer = n_outer != 0 ? dPhi(p4_outer, tau.p4()) : default_value;
2653  m_outer = n_outer != 0 ? p4_outer.mass() : default_value;
2654  }
static constexpr float default_value
Definition: DeepTauId.cc:997
static double getInnerSignalConeRadius(double pt)
Definition: DeepTauId.cc:2679
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > LorentzVectorXYZ
Definition: DeepTauId.cc:953

◆ produce()

void DeepTauId::produce ( edm::Event event,
const edm::EventSetup es 
)
inlineoverride

Definition at line 1242 of file DeepTauId.cc.

References createOutputs(), Exception, getPredictions(), is_online_, deep_tau::NumberOfOutputs, patPrediscriminants_, recoPrediscriminants_, Tau3MuMonitor_cff::taus, and tausToken_.

1242  {
1244  event.getByToken(tausToken_, taus);
1245 
1246  // store empty output collection(s) if tau collection is empty
1247  if (taus->empty()) {
1248  const tensorflow::Tensor emptyPrediction(tensorflow::DT_FLOAT, {0, deep_tau::NumberOfOutputs});
1249  createOutputs(event, emptyPrediction, taus);
1250  return;
1251  }
1252 
1253  edm::ProductID tauProductID = taus.id();
1254 
1255  // load prediscriminators
1256  size_t nPrediscriminants =
1258  for (size_t iDisc = 0; iDisc < nPrediscriminants; ++iDisc) {
1259  edm::ProductID discKeyId;
1260  if (is_online_) {
1261  recoPrediscriminants_[iDisc].fill(event);
1262  discKeyId = recoPrediscriminants_[iDisc].handle->keyProduct().id();
1263  } else {
1264  patPrediscriminants_[iDisc].fill(event);
1265  discKeyId = patPrediscriminants_[iDisc].handle->keyProduct().id();
1266  }
1267 
1268  // Check to make sure the product is correct for the discriminator.
1269  // If not, throw a more informative exception.
1270  if (tauProductID != discKeyId) {
1271  throw cms::Exception("MisconfiguredPrediscriminant")
1272  << "The tau collection has product ID: " << tauProductID
1273  << " but the pre-discriminator is keyed with product ID: " << discKeyId << std::endl;
1274  }
1275  }
1276 
1277  const tensorflow::Tensor& pred = getPredictions(event, taus);
1278  createOutputs(event, pred, taus);
1279  }
tensorflow::Tensor getPredictions(edm::Event &event, edm::Handle< TauCollection > taus)
Definition: DeepTauId.cc:1497
std::vector< TauDiscInfo< reco::PFTauDiscriminator > > recoPrediscriminants_
Definition: DeepTauId.cc:1317
std::vector< TauDiscInfo< pat::PATTauDiscriminator > > patPrediscriminants_
Definition: DeepTauId.cc:1316
edm::EDGetTokenT< TauCollection > tausToken_
Definition: DeepTauId.cc:2738
void createOutputs(edm::Event &event, const tensorflow::Tensor &pred, edm::Handle< TauCollection > taus)
Definition: DeepTauId.cc:1322
const bool is_online_
Definition: DeepTauId.cc:2742
Definition: event.py:1
constexpr int NumberOfOutputs
Definition: DeepTauId.cc:156

◆ saveInputs()

void DeepTauId::saveInputs ( const tensorflow::Tensor &  inputs,
const std::string &  block_name,
int  n_inputs,
const CellGrid *  grid = nullptr 
)
inlineprivate

Definition at line 1436 of file DeepTauId.cc.

References cms::cuda::assert(), gather_cfg::cout, debug_level, PVValHelper::eta, nano_mu_digi_cff::float, getRunAppsInfo::grid, input, PixelMapPlotter::inputs, is_first_block_, and phi.

Referenced by getPredictionsV2().

1439  {
1440  if (debug_level >= 1) {
1441  std::cout << "<saveInputs>: block_name = " << block_name << std::endl;
1442  }
1443  if (!is_first_block_)
1444  (*json_file_) << ", ";
1445  (*json_file_) << "\"" << block_name << "\": [";
1446  if (block_name == "input_tau") {
1447  for (int input_index = 0; input_index < n_inputs; ++input_index) {
1448  float input = inputs.matrix<float>()(0, input_index);
1449  if (input_index != 0)
1450  (*json_file_) << ", ";
1451  (*json_file_) << input;
1452  }
1453  } else {
1454  assert(grid);
1455  int n_eta, n_phi;
1456  if (block_name.find("input_inner") != std::string::npos) {
1457  n_eta = 5;
1458  n_phi = 5;
1459  } else if (block_name.find("input_outer") != std::string::npos) {
1460  n_eta = 10;
1461  n_phi = 10;
1462  } else
1463  assert(0);
1464  int eta_phi_index = 0;
1465  for (int eta = -n_eta; eta <= n_eta; ++eta) {
1466  if (eta != -n_eta)
1467  (*json_file_) << ", ";
1468  (*json_file_) << "[";
1469  for (int phi = -n_phi; phi <= n_phi; ++phi) {
1470  if (phi != -n_phi)
1471  (*json_file_) << ", ";
1472  (*json_file_) << "[";
1473  const CellIndex cell_index{eta, phi};
1474  const auto cell_iter = grid->find(cell_index);
1475  for (int input_index = 0; input_index < n_inputs; ++input_index) {
1476  float input = 0.;
1477  if (cell_iter != grid->end()) {
1478  input = inputs.tensor<float, 4>()(eta_phi_index, 0, 0, input_index);
1479  }
1480  if (input_index != 0)
1481  (*json_file_) << ", ";
1482  (*json_file_) << input;
1483  }
1484  if (cell_iter != grid->end()) {
1485  eta_phi_index += 1;
1486  }
1487  (*json_file_) << "]";
1488  }
1489  (*json_file_) << "]";
1490  }
1491  }
1492  (*json_file_) << "]";
1493  is_first_block_ = false;
1494  }
assert(be >=bs)
static std::string const input
Definition: EdmProvDump.cc:50
bool is_first_block_
Definition: DeepTauId.cc:2786
const int debug_level
Definition: DeepTauId.cc:2776

◆ setCellConvFeatures()

void DeepTauId::setCellConvFeatures ( tensorflow::Tensor &  convTensor,
const tensorflow::Tensor &  features,
unsigned  batch_idx,
int  eta_index,
int  phi_index 
)
inlineprivate

Definition at line 1869 of file DeepTauId.cc.

References lowptgsfeleseed::features(), nano_mu_digi_cff::float, and dqmiodumpmetadata::n.

Referenced by createConvFeatures(), and DeepTauId().

1873  {
1874  for (int n = 0; n < dnn_inputs_v2::number_of_conv_features; ++n) {
1875  convTensor.tensor<float, 4>()(0, eta_index, phi_index, n) = features.tensor<float, 4>()(batch_idx, 0, 0, n);
1876  }
1877  }
std::vector< float > features(const reco::PreId &ecal, const reco::PreId &hcal, double rho, const reco::BeamSpot &spot, noZS::EcalClusterLazyTools &ecalTools)

Member Data Documentation

◆ andPrediscriminants_

uint8_t DeepTauId::andPrediscriminants_

Definition at line 1315 of file DeepTauId.cc.

Referenced by DeepTauId(), and getPredictions().

◆ basicDiscrdR03IndexMap_

std::map<BasicDiscriminator, size_t> DeepTauId::basicDiscrdR03IndexMap_
private

Definition at line 2793 of file DeepTauId.cc.

Referenced by getPredictions().

◆ basicDiscrIndexMap_

std::map<BasicDiscriminator, size_t> DeepTauId::basicDiscrIndexMap_
private

Definition at line 2792 of file DeepTauId.cc.

Referenced by getPredictions().

◆ basicTauDiscriminators_inputToken_

edm::EDGetTokenT<reco::TauDiscriminatorContainer> DeepTauId::basicTauDiscriminators_inputToken_
private

Definition at line 2768 of file DeepTauId.cc.

Referenced by getPredictions().

◆ basicTauDiscriminatorsdR03_inputToken_

edm::EDGetTokenT<reco::TauDiscriminatorContainer> DeepTauId::basicTauDiscriminatorsdR03_inputToken_
private

Definition at line 2769 of file DeepTauId.cc.

Referenced by getPredictions().

◆ cache_

const deep_tau::DeepTauCache* DeepTauId::cache_
private

Definition at line 2744 of file DeepTauId.cc.

Referenced by getPartialPredictions(), and getPredictionsV2().

◆ convTensor_

std::array<std::unique_ptr<tensorflow::Tensor>, 2> DeepTauId::convTensor_
private

Definition at line 2781 of file DeepTauId.cc.

Referenced by createConvFeatures(), DeepTauId(), and getPredictionsV2().

◆ debug_level

const int DeepTauId::debug_level
private

Definition at line 2776 of file DeepTauId.cc.

Referenced by checkInputs(), createConvFeatures(), getPredictionsV2(), and saveInputs().

◆ default_value

constexpr float DeepTauId::default_value = -999.
static

◆ disable_CellIndex_workaround_

const bool DeepTauId::disable_CellIndex_workaround_
private

Definition at line 2779 of file DeepTauId.cc.

Referenced by getPredictionsV2().

◆ disable_dxy_pca_

const bool DeepTauId::disable_dxy_pca_
private

Definition at line 2777 of file DeepTauId.cc.

Referenced by createTauBlockInputs().

◆ disable_hcalFraction_workaround_

const bool DeepTauId::disable_hcalFraction_workaround_
private

Definition at line 2778 of file DeepTauId.cc.

Referenced by createHadronsBlockInputs().

◆ discrIndicesMapped_

bool DeepTauId::discrIndicesMapped_ = false
private

Definition at line 2791 of file DeepTauId.cc.

Referenced by getPredictions().

◆ eGammaTensor_

std::array<std::unique_ptr<tensorflow::Tensor>, 2> DeepTauId::eGammaTensor_
private

◆ electrons_token_

edm::EDGetTokenT<std::vector<pat::Electron> > DeepTauId::electrons_token_
private

Definition at line 2765 of file DeepTauId.cc.

Referenced by getPredictions().

◆ file_counter_

int DeepTauId::file_counter_
private

Definition at line 2787 of file DeepTauId.cc.

Referenced by getPredictionsV2().

◆ hadronsTensor_

std::array<std::unique_ptr<tensorflow::Tensor>, 2> DeepTauId::hadronsTensor_
private

◆ input_layer_

std::string DeepTauId::input_layer_
private

Definition at line 2772 of file DeepTauId.cc.

◆ is_first_block_

bool DeepTauId::is_first_block_
private

Definition at line 2786 of file DeepTauId.cc.

Referenced by getPredictionsV2(), and saveInputs().

◆ is_online_

const bool DeepTauId::is_online_
private

◆ json_file_

std::ofstream* DeepTauId::json_file_
private

Definition at line 2785 of file DeepTauId.cc.

Referenced by getPredictionsV2().

◆ muons_token_

edm::EDGetTokenT<std::vector<pat::Muon> > DeepTauId::muons_token_
private

Definition at line 2766 of file DeepTauId.cc.

Referenced by getPredictions().

◆ muonTensor_

std::array<std::unique_ptr<tensorflow::Tensor>, 2> DeepTauId::muonTensor_
private

◆ output_layer_

std::string DeepTauId::output_layer_
private

Definition at line 2772 of file DeepTauId.cc.

◆ outputs_

OutputCollection DeepTauId::outputs_
private

Definition at line 2743 of file DeepTauId.cc.

Referenced by createOutputs(), DeepTauId(), and GetOutputs().

◆ patPrediscriminants_

std::vector<TauDiscInfo<pat::PATTauDiscriminator> > DeepTauId::patPrediscriminants_

Definition at line 1316 of file DeepTauId.cc.

Referenced by DeepTauId(), getPredictions(), and produce().

◆ pfcandToken_

edm::EDGetTokenT<CandidateCollection> DeepTauId::pfcandToken_
private

Definition at line 2739 of file DeepTauId.cc.

Referenced by getPredictions().

◆ pfTauTransverseImpactParameters_token_

edm::EDGetTokenT<edm::AssociationVector<reco::PFTauRefProd, std::vector<reco::PFTauTransverseImpactParameterRef> > > DeepTauId::pfTauTransverseImpactParameters_token_
private

Definition at line 2771 of file DeepTauId.cc.

Referenced by getPredictions().

◆ pi

constexpr float DeepTauId::pi = M_PI
staticprivate

Definition at line 1320 of file DeepTauId.cc.

Referenced by createTauBlockInputs().

◆ recoPrediscriminants_

std::vector<TauDiscInfo<reco::PFTauDiscriminator> > DeepTauId::recoPrediscriminants_

Definition at line 1317 of file DeepTauId.cc.

Referenced by DeepTauId(), getPredictions(), and produce().

◆ requiredBasicDiscriminators_

const std::vector<BasicDiscriminator> DeepTauId::requiredBasicDiscriminators_
private

◆ requiredBasicDiscriminatorsdR03_

const std::vector<BasicDiscriminator> DeepTauId::requiredBasicDiscriminatorsdR03_
private

◆ rho_token_

edm::EDGetTokenT<double> DeepTauId::rho_token_
private

Definition at line 2767 of file DeepTauId.cc.

Referenced by getPredictions().

◆ save_inputs_

const bool DeepTauId::save_inputs_
private

Definition at line 2784 of file DeepTauId.cc.

Referenced by getPredictionsV2().

◆ scalingParamsMap_

const std::map<std::pair<deep_tau::Scaling::FeatureT, bool>, deep_tau::Scaling::ScalingParams>* DeepTauId::scalingParamsMap_
private

◆ stringFromDiscriminator_

const std::map<BasicDiscriminator, std::string> DeepTauId::stringFromDiscriminator_
private
Initial value:
{
{BasicDiscriminator::NeutralIsoPtSumWeight, "NeutralIsoPtSumWeight"},
{BasicDiscriminator::FootprintCorrection, "TauFootprintCorrection"},
{BasicDiscriminator::PhotonPtSumOutsideSignalCone, "PhotonPtSumOutsideSignalCone"},

Definition at line 2746 of file DeepTauId.cc.

Referenced by matchDiscriminatorIndices().

◆ sub_version_

const unsigned DeepTauId::sub_version_
private

Definition at line 2775 of file DeepTauId.cc.

Referenced by createEgammaBlockInputs(), createTauBlockInputs(), and DeepTauId().

◆ tauBlockTensor_

std::unique_ptr<tensorflow::Tensor> DeepTauId::tauBlockTensor_
private

Definition at line 2780 of file DeepTauId.cc.

Referenced by createTauBlockInputs(), DeepTauId(), and getPredictionsV2().

◆ tauInputs_indices_

std::vector<int> DeepTauId::tauInputs_indices_
private

Definition at line 2788 of file DeepTauId.cc.

Referenced by createTauBlockInputs(), and DeepTauId().

◆ tausToken_

edm::EDGetTokenT<TauCollection> DeepTauId::tausToken_
private

Definition at line 2738 of file DeepTauId.cc.

Referenced by produce().

◆ version_

const unsigned DeepTauId::version_
private

Definition at line 2774 of file DeepTauId.cc.

Referenced by DeepTauId(), and getPredictions().

◆ vtxToken_

edm::EDGetTokenT<reco::VertexCollection> DeepTauId::vtxToken_
private

Definition at line 2740 of file DeepTauId.cc.

Referenced by getPredictions().

◆ workingPoints_

std::map<std::string, WPList> DeepTauId::workingPoints_
private

Definition at line 2741 of file DeepTauId.cc.

Referenced by createOutputs(), and DeepTauId().

◆ year_

const unsigned DeepTauId::year_
private

Definition at line 2773 of file DeepTauId.cc.

Referenced by createEgammaBlockInputs(), and DeepTauId().

◆ zeroOutputTensor_

std::array<std::unique_ptr<tensorflow::Tensor>, 2> DeepTauId::zeroOutputTensor_
private

Definition at line 2781 of file DeepTauId.cc.

Referenced by createConvFeatures(), and DeepTauId().