CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Member Functions | Static Public Member Functions | Static Public Attributes | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes
DeepTauId Class Reference
Inheritance diagram for DeepTauId:
deep_tau::DeepTauBase edm::stream::EDProducer< edm::GlobalCache< DeepTauCache > >

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)
 
- Public Member Functions inherited from deep_tau::DeepTauBase
 DeepTauBase (const edm::ParameterSet &cfg, const OutputCollection &outputs, const DeepTauCache *cache)
 
void produce (edm::Event &event, const edm::EventSetup &es) override
 
 ~DeepTauBase () override
 
- Public Member Functions inherited from edm::stream::EDProducer< edm::GlobalCache< 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::DeepTauCache
initializeGlobalCache (const edm::ParameterSet &cfg)
 
- Static Public Member Functions inherited from deep_tau::DeepTauBase
static void globalEndJob (const DeepTauCache *cache)
 
static std::unique_ptr
< DeepTauCache
initializeGlobalCache (const edm::ParameterSet &cfg)
 

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 dnn , typename CandidateCastType , typename TauCastType >
tensorflow::Tensor createInputsV1 (const TauCastType &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, TauFunc tau_funcs) const
 
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)
 
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) override
 
template<typename CandidateCastType , typename TauCastType >
void getPredictionsV1 (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, std::vector< tensorflow::Tensor > &pred_vector, TauFunc tau_funcs)
 
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, 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::TauDiscriminatorContainer
basicTauDiscriminators_inputToken_
 
edm::EDGetTokenT
< reco::TauDiscriminatorContainer
basicTauDiscriminatorsdR03_inputToken_
 
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_
 
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_
 
edm::EDGetTokenT
< edm::AssociationVector
< reco::PFTauRefProd,
std::vector
< reco::PFTauTransverseImpactParameterRef > > > 
pfTauTransverseImpactParameters_token_
 
edm::EDGetTokenT< double > rho_token_
 
const bool save_inputs_
 
std::unique_ptr
< tensorflow::Tensor > 
tauBlockTensor_
 
const unsigned version_
 
std::array< std::unique_ptr
< tensorflow::Tensor >, 2 > 
zeroOutputTensor_
 

Static Private Attributes

static constexpr float pi = M_PI
 

Additional Inherited Members

- Public Types inherited from deep_tau::DeepTauBase
enum  BasicDiscriminator {
  ChargedIsoPtSum, NeutralIsoPtSum, NeutralIsoPtSumWeight, FootprintCorrection,
  PhotonPtSumOutsideSignalCone, PUcorrPtSum
}
 
using CandidateCollection = edm::View< reco::Candidate >
 
using Cutter = 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< 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 Attributes inherited from deep_tau::DeepTauBase
uint8_t andPrediscriminants_
 
std::vector< TauDiscInfo
< pat::PATTauDiscriminator > > 
patPrediscriminants_
 
std::vector< TauDiscInfo
< reco::PFTauDiscriminator > > 
recoPrediscriminants_
 
- Protected Attributes inherited from deep_tau::DeepTauBase
const DeepTauCachecache_
 
const bool is_online_
 
OutputCollection outputs_
 
edm::EDGetTokenT
< CandidateCollection
pfcandToken_
 
edm::EDGetTokenT< TauCollectiontausToken_
 
edm::EDGetTokenT
< reco::VertexCollection
vtxToken_
 
std::map< std::string, WPListworkingPoints_
 
- Static Protected Attributes inherited from deep_tau::DeepTauBase
static const std::vector
< BasicDiscriminator
requiredBasicDiscriminators_
 
static const std::vector
< BasicDiscriminator
requiredBasicDiscriminatorsdR03_
 
static const std::map
< BasicDiscriminator,
std::string > 
stringFromDiscriminator_
 

Detailed Description

Definition at line 1101 of file DeepTauId.cc.

Constructor & Destructor Documentation

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

Definition at line 1190 of file DeepTauId.cc.

References deep_tau::DeepTauBase::cache_, convTensor_, eGammaTensor_, Exception, deep_tau::DeepTauCache::getGraph(), getPartialPredictions(), hadronsTensor_, input_layer_, muonTensor_, dqmiodumpmetadata::n, mergeVDriftHistosByStation::name, output_layer_, setCellConvFeatures(), tauBlockTensor_, version_, and zeroOutputTensor_.

1191  : DeepTauBase(cfg, GetOutputs(), cache),
1192  electrons_token_(consumes<std::vector<pat::Electron>>(cfg.getParameter<edm::InputTag>("electrons"))),
1193  muons_token_(consumes<std::vector<pat::Muon>>(cfg.getParameter<edm::InputTag>("muons"))),
1194  rho_token_(consumes<double>(cfg.getParameter<edm::InputTag>("rho"))),
1195  basicTauDiscriminators_inputToken_(consumes<reco::TauDiscriminatorContainer>(
1196  cfg.getUntrackedParameter<edm::InputTag>("basicTauDiscriminators"))),
1197  basicTauDiscriminatorsdR03_inputToken_(consumes<reco::TauDiscriminatorContainer>(
1198  cfg.getUntrackedParameter<edm::InputTag>("basicTauDiscriminatorsdR03"))),
1200  consumes<edm::AssociationVector<reco::PFTauRefProd, std::vector<reco::PFTauTransverseImpactParameterRef>>>(
1201  cfg.getParameter<edm::InputTag>("pfTauTransverseImpactParameters"))),
1202  version_(cfg.getParameter<unsigned>("version")),
1203  debug_level(cfg.getParameter<int>("debug_level")),
1204  disable_dxy_pca_(cfg.getParameter<bool>("disable_dxy_pca")),
1205  disable_hcalFraction_workaround_(cfg.getParameter<bool>("disable_hcalFraction_workaround")),
1206  disable_CellIndex_workaround_(cfg.getParameter<bool>("disable_CellIndex_workaround")),
1207  save_inputs_(cfg.getParameter<bool>("save_inputs")),
1208  json_file_(nullptr),
1209  file_counter_(0) {
1210  if (version_ == 1) {
1211  input_layer_ = cache_->getGraph().node(0).name();
1212  output_layer_ = cache_->getGraph().node(cache_->getGraph().node_size() - 1).name();
1213  const auto& shape = cache_->getGraph().node(0).attr().at("shape").shape();
1214  if (shape.dim(1).size() != dnn_inputs_2017v1::NumberOfInputs)
1215  throw cms::Exception("DeepTauId")
1216  << "number of inputs does not match the expected inputs for the given version";
1217  } else if (version_ == 2) {
1218  tauBlockTensor_ = std::make_unique<tensorflow::Tensor>(
1219  tensorflow::DT_FLOAT, tensorflow::TensorShape{1, dnn_inputs_2017_v2::TauBlockInputs::NumberOfInputs});
1220  for (size_t n = 0; n < 2; ++n) {
1221  const bool is_inner = n == 0;
1222  const auto n_cells =
1223  is_inner ? dnn_inputs_2017_v2::number_of_inner_cell : dnn_inputs_2017_v2::number_of_outer_cell;
1224  eGammaTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1225  tensorflow::DT_FLOAT,
1226  tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::EgammaBlockInputs::NumberOfInputs});
1227  muonTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1228  tensorflow::DT_FLOAT,
1229  tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::MuonBlockInputs::NumberOfInputs});
1230  hadronsTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1231  tensorflow::DT_FLOAT,
1232  tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::HadronBlockInputs::NumberOfInputs});
1233  convTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1234  tensorflow::DT_FLOAT,
1235  tensorflow::TensorShape{1, n_cells, n_cells, dnn_inputs_2017_v2::number_of_conv_features});
1236  zeroOutputTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1237  tensorflow::DT_FLOAT, tensorflow::TensorShape{1, 1, 1, dnn_inputs_2017_v2::number_of_conv_features});
1238 
1239  eGammaTensor_[is_inner]->flat<float>().setZero();
1240  muonTensor_[is_inner]->flat<float>().setZero();
1241  hadronsTensor_[is_inner]->flat<float>().setZero();
1242 
1243  setCellConvFeatures(*zeroOutputTensor_[is_inner], getPartialPredictions(is_inner), 0, 0, 0);
1244  }
1245  } else {
1246  throw cms::Exception("DeepTauId") << "version " << version_ << " is not supported.";
1247  }
1248  }
T getUntrackedParameter(std::string const &, T const &) const
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
Definition: DeepTauId.cc:2819
const bool disable_dxy_pca_
Definition: DeepTauId.cc:2815
const bool save_inputs_
Definition: DeepTauId.cc:2821
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > zeroOutputTensor_
Definition: DeepTauId.cc:2819
int file_counter_
Definition: DeepTauId.cc:2824
const DeepTauCache * cache_
Definition: DeepTauBase.h:135
std::ofstream * json_file_
Definition: DeepTauId.cc:2822
const tensorflow::GraphDef & getGraph(const std::string &name="") const
Definition: DeepTauBase.h:58
void setCellConvFeatures(tensorflow::Tensor &convTensor, const tensorflow::Tensor &features, unsigned batch_idx, int eta_index, int phi_index)
Definition: DeepTauId.cc:1827
const unsigned version_
Definition: DeepTauId.cc:2813
static const OutputCollection & GetOutputs()
Definition: DeepTauId.cc:1105
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > convTensor_
Definition: DeepTauId.cc:2819
std::string output_layer_
Definition: DeepTauId.cc:2812
const bool disable_CellIndex_workaround_
Definition: DeepTauId.cc:2817
std::string input_layer_
Definition: DeepTauId.cc:2812
DeepTauBase(const edm::ParameterSet &cfg, const OutputCollection &outputs, const DeepTauCache *cache)
Definition: DeepTauBase.cc:91
tensorflow::Tensor getPartialPredictions(bool is_inner)
Definition: DeepTauId.cc:1721
edm::EDGetTokenT< edm::AssociationVector< reco::PFTauRefProd, std::vector< reco::PFTauTransverseImpactParameterRef > > > pfTauTransverseImpactParameters_token_
Definition: DeepTauId.cc:2811
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminators_inputToken_
Definition: DeepTauId.cc:2808
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
Definition: DeepTauId.cc:2819
const bool disable_hcalFraction_workaround_
Definition: DeepTauId.cc:2816
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminatorsdR03_inputToken_
Definition: DeepTauId.cc:2809
const int debug_level
Definition: DeepTauId.cc:2814
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
Definition: DeepTauId.cc:2819
edm::EDGetTokenT< std::vector< pat::Electron > > electrons_token_
Definition: DeepTauId.cc:2805
edm::EDGetTokenT< std::vector< pat::Muon > > muons_token_
Definition: DeepTauId.cc:2806
edm::EDGetTokenT< double > rho_token_
Definition: DeepTauId.cc:2807
std::unique_ptr< tensorflow::Tensor > tauBlockTensor_
Definition: DeepTauId.cc:2818

Member Function Documentation

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

Definition at line 2660 of file DeepTauId.cc.

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

Referenced by createInputsV1().

2660  {
2661  if (ele) {
2662  elecEe = elecEgamma = 0;
2663  auto superCluster = ele->superCluster();
2664  if (superCluster.isNonnull() && superCluster.isAvailable() && superCluster->clusters().isNonnull() &&
2665  superCluster->clusters().isAvailable()) {
2666  for (auto iter = superCluster->clustersBegin(); iter != superCluster->clustersEnd(); ++iter) {
2667  const double energy = (*iter)->energy();
2668  if (iter == superCluster->clustersBegin())
2669  elecEe += energy;
2670  else
2671  elecEgamma += energy;
2672  }
2673  }
2674  } else {
2675  elecEe = elecEgamma = default_value;
2676  }
2677  }
static constexpr float default_value
Definition: DeepTauId.cc:1103
reco::SuperClusterRef superCluster() const override
override the reco::GsfElectron::superCluster method, to access the internal storage of the superclust...
static bool DeepTauId::calculateElectronClusterVarsV2 ( const pat::Electron ele,
float &  cc_ele_energy,
float &  cc_gamma_energy,
int &  cc_n_gamma 
)
inlinestaticprivate

Definition at line 1283 of file DeepTauId.cc.

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

Referenced by createEgammaBlockInputs().

1286  {
1287  cc_ele_energy = cc_gamma_energy = 0;
1288  cc_n_gamma = 0;
1289  const auto& superCluster = ele.superCluster();
1290  if (superCluster.isNonnull() && superCluster.isAvailable() && superCluster->clusters().isNonnull() &&
1291  superCluster->clusters().isAvailable()) {
1292  for (auto iter = superCluster->clustersBegin(); iter != superCluster->clustersEnd(); ++iter) {
1293  const float energy = static_cast<float>((*iter)->energy());
1294  if (iter == superCluster->clustersBegin())
1295  cc_ele_energy += energy;
1296  else {
1297  cc_gamma_energy += energy;
1298  ++cc_n_gamma;
1299  }
1300  }
1301  return true;
1302  } else
1303  return false;
1304  }
reco::SuperClusterRef superCluster() const override
override the reco::GsfElectron::superCluster method, to access the internal storage of the superclust...
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 2754 of file DeepTauId.cc.

References funct::abs(), and funct::pow().

Referenced by calculateGottfriedJacksonAngleDifference(), createInputsV1(), and createTauBlockInputs().

2757  {
2758  if (tau_funcs.getHasSecondaryVertex(tau, tau_index)) {
2759  static constexpr double mTau = 1.77682;
2760  const double mAOne = tau.p4().M();
2761  const double pAOneMag = tau.p();
2762  const double argumentThetaGJmax = (std::pow(mTau, 2) - std::pow(mAOne, 2)) / (2 * mTau * pAOneMag);
2763  const double argumentThetaGJmeasured = tau.p4().Vect().Dot(tau_funcs.getFlightLength(tau, tau_index)) /
2764  (pAOneMag * tau_funcs.getFlightLength(tau, tau_index).R());
2765  if (std::abs(argumentThetaGJmax) <= 1. && std::abs(argumentThetaGJmeasured) <= 1.) {
2766  double thetaGJmax = std::asin(argumentThetaGJmax);
2767  double thetaGJmeasured = std::acos(argumentThetaGJmeasured);
2768  gj_diff = thetaGJmeasured - thetaGJmax;
2769  return true;
2770  }
2771  }
2772  return false;
2773  }
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
template<typename TauCastType >
static float DeepTauId::calculateGottfriedJacksonAngleDifference ( const TauCastType &  tau,
const size_t  tau_index,
TauFunc  tau_funcs 
)
inlinestaticprivate

Definition at line 2776 of file DeepTauId.cc.

References calculateGottfriedJacksonAngleDifference(), and default_value.

2778  {
2779  double gj_diff;
2780  if (calculateGottfriedJacksonAngleDifference(tau, tau_index, gj_diff, tau_funcs))
2781  return static_cast<float>(gj_diff);
2782  return default_value;
2783  }
static constexpr float default_value
Definition: DeepTauId.cc:1103
static bool calculateGottfriedJacksonAngleDifference(const TauCastType &tau, const size_t tau_index, double &gj_diff, TauFunc tau_funcs)
Definition: DeepTauId.cc:2754
void DeepTauId::checkInputs ( const tensorflow::Tensor &  inputs,
const std::string &  block_name,
int  n_inputs,
const CellGrid *  grid = nullptr 
) const
inlineprivate

Definition at line 1306 of file DeepTauId.cc.

References cms::cuda::assert(), gather_cfg::cout, debug_level, PVValHelper::eta, Exception, getRunAppsInfo::grid, input, edm::isNotFinite(), and phi.

Referenced by getPredictionsV2().

1309  {
1310  if (debug_level >= 1) {
1311  std::cout << "<checkInputs>: block_name = " << block_name << std::endl;
1312  if (block_name == "input_tau") {
1313  for (int input_index = 0; input_index < n_inputs; ++input_index) {
1314  float input = inputs.matrix<float>()(0, input_index);
1315  if (edm::isNotFinite(input)) {
1316  throw cms::Exception("DeepTauId")
1317  << "in the " << block_name
1318  << ", input is not finite, i.e. infinite or NaN, for input_index = " << input_index;
1319  }
1320  if (debug_level >= 2) {
1321  std::cout << block_name << "[var = " << input_index << "] = " << std::setprecision(5) << std::fixed << input
1322  << std::endl;
1323  }
1324  }
1325  } else {
1326  assert(grid);
1327  int n_eta, n_phi;
1328  if (block_name.find("input_inner") != std::string::npos) {
1329  n_eta = 5;
1330  n_phi = 5;
1331  } else if (block_name.find("input_outer") != std::string::npos) {
1332  n_eta = 10;
1333  n_phi = 10;
1334  } else
1335  assert(0);
1336  int eta_phi_index = 0;
1337  for (int eta = -n_eta; eta <= n_eta; ++eta) {
1338  for (int phi = -n_phi; phi <= n_phi; ++phi) {
1339  const CellIndex cell_index{eta, phi};
1340  const auto cell_iter = grid->find(cell_index);
1341  if (cell_iter != grid->end()) {
1342  for (int input_index = 0; input_index < n_inputs; ++input_index) {
1343  float input = inputs.tensor<float, 4>()(eta_phi_index, 0, 0, input_index);
1344  if (edm::isNotFinite(input)) {
1345  throw cms::Exception("DeepTauId")
1346  << "in the " << block_name << ", input is not finite, i.e. infinite or NaN, for eta = " << eta
1347  << ", phi = " << phi << ", input_index = " << input_index;
1348  }
1349  if (debug_level >= 2) {
1350  std::cout << block_name << "[eta = " << eta << "][phi = " << phi << "][var = " << input_index
1351  << "] = " << std::setprecision(5) << std::fixed << input << std::endl;
1352  }
1353  }
1354  eta_phi_index += 1;
1355  }
1356  }
1357  }
1358  }
1359  }
1360  }
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
assert(be >=bs)
static std::string const input
Definition: EdmProvDump.cc:47
tuple cout
Definition: gather_cfg.py:144
const int debug_level
Definition: DeepTauId.cc:2814
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 1746 of file DeepTauId.cc.

References convTensor_, gather_cfg::cout, debug_level, eGammaTensor_, HI_PhotonSkim_cff::electrons, PVValHelper::eta, getPartialPredictions(), hadronsTensor_, patZpeak::muons, muonTensor_, phi, MetAnalyzer::pv(), rho, setCellConvFeatures(), metsig::tau, and zeroOutputTensor_.

1756  {
1757  if (debug_level >= 2) {
1758  std::cout << "<DeepTauId::createConvFeatures (is_inner = " << is_inner << ")>:" << std::endl;
1759  }
1760  tensorflow::Tensor& convTensor = *convTensor_.at(is_inner);
1761  eGammaTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1762  tensorflow::DT_FLOAT,
1763  tensorflow::TensorShape{
1764  (long long int)grid.num_valid_cells(), 1, 1, dnn_inputs_2017_v2::EgammaBlockInputs::NumberOfInputs});
1765  muonTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1766  tensorflow::DT_FLOAT,
1767  tensorflow::TensorShape{
1768  (long long int)grid.num_valid_cells(), 1, 1, dnn_inputs_2017_v2::MuonBlockInputs::NumberOfInputs});
1769  hadronsTensor_[is_inner] = std::make_unique<tensorflow::Tensor>(
1770  tensorflow::DT_FLOAT,
1771  tensorflow::TensorShape{
1772  (long long int)grid.num_valid_cells(), 1, 1, dnn_inputs_2017_v2::HadronBlockInputs::NumberOfInputs});
1773 
1774  eGammaTensor_[is_inner]->flat<float>().setZero();
1775  muonTensor_[is_inner]->flat<float>().setZero();
1776  hadronsTensor_[is_inner]->flat<float>().setZero();
1777 
1778  unsigned idx = 0;
1779  for (int eta = -grid.maxEtaIndex(); eta <= grid.maxEtaIndex(); ++eta) {
1780  for (int phi = -grid.maxPhiIndex(); phi <= grid.maxPhiIndex(); ++phi) {
1781  if (debug_level >= 2) {
1782  std::cout << "processing ( eta = " << eta << ", phi = " << phi << " )" << std::endl;
1783  }
1784  const CellIndex cell_index{eta, phi};
1785  const auto cell_iter = grid.find(cell_index);
1786  if (cell_iter != grid.end()) {
1787  if (debug_level >= 2) {
1788  std::cout << " creating inputs for ( eta = " << eta << ", phi = " << phi << " ): idx = " << idx
1789  << std::endl;
1790  }
1791  const Cell& cell = cell_iter->second;
1792  createEgammaBlockInputs<CandidateCastType>(
1793  idx, tau, tau_index, tau_ref, pv, rho, electrons, pfCands, cell, tau_funcs, is_inner);
1794  createMuonBlockInputs<CandidateCastType>(
1795  idx, tau, tau_index, tau_ref, pv, rho, muons, pfCands, cell, tau_funcs, is_inner);
1796  createHadronsBlockInputs<CandidateCastType>(
1797  idx, tau, tau_index, tau_ref, pv, rho, pfCands, cell, tau_funcs, is_inner);
1798  idx += 1;
1799  } else {
1800  if (debug_level >= 2) {
1801  std::cout << " skipping creation of inputs, because ( eta = " << eta << ", phi = " << phi
1802  << " ) is not in the grid !!" << std::endl;
1803  }
1804  }
1805  }
1806  }
1807 
1808  const auto predTensor = getPartialPredictions(is_inner);
1809  idx = 0;
1810  for (int eta = -grid.maxEtaIndex(); eta <= grid.maxEtaIndex(); ++eta) {
1811  for (int phi = -grid.maxPhiIndex(); phi <= grid.maxPhiIndex(); ++phi) {
1812  const CellIndex cell_index{eta, phi};
1813  const int eta_index = grid.getEtaTensorIndex(cell_index);
1814  const int phi_index = grid.getPhiTensorIndex(cell_index);
1815 
1816  const auto cell_iter = grid.find(cell_index);
1817  if (cell_iter != grid.end()) {
1818  setCellConvFeatures(convTensor, predTensor, idx, eta_index, phi_index);
1819  idx += 1;
1820  } else {
1821  setCellConvFeatures(convTensor, *zeroOutputTensor_[is_inner], 0, eta_index, phi_index);
1822  }
1823  }
1824  }
1825  }
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
Definition: DeepTauId.cc:2819
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > zeroOutputTensor_
Definition: DeepTauId.cc:2819
void setCellConvFeatures(tensorflow::Tensor &convTensor, const tensorflow::Tensor &features, unsigned batch_idx, int eta_index, int phi_index)
Definition: DeepTauId.cc:1827
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > convTensor_
Definition: DeepTauId.cc:2819
tensorflow::Tensor getPartialPredictions(bool is_inner)
Definition: DeepTauId.cc:1721
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
Definition: DeepTauId.cc:2819
tuple muons
Definition: patZpeak.py:41
tuple cout
Definition: gather_cfg.py:144
const int debug_level
Definition: DeepTauId.cc:2814
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
Definition: DeepTauId.cc:2819
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 1944 of file DeepTauId.cc.

References funct::abs(), edm::View< T >::at(), calculateElectronClusterVarsV2(), HLT_FULL_cff::chi2, eGammaTensor_, configurableAnalysis::Electron, validate-o2o-wbm::f, getValue(), getValueLinear(), getValueNorm(), PixelMapPlotter::inputs, isInEcalCrack(), ndof, reco::Vertex::position(), HLT_FULL_cff::rho, runTauDisplay::tau_eta, and runTauDisplay::tau_pt.

1954  {
1955  namespace dnn = dnn_inputs_2017_v2::EgammaBlockInputs;
1956 
1957  tensorflow::Tensor& inputs = *eGammaTensor_.at(is_inner);
1958 
1959  const auto& get = [&](int var_index) -> float& { return inputs.tensor<float, 4>()(idx, 0, 0, var_index); };
1960 
1961  const bool valid_index_pf_ele = cell_map.count(CellObjectType::PfCand_electron);
1962  const bool valid_index_pf_gamma = cell_map.count(CellObjectType::PfCand_gamma);
1963  const bool valid_index_ele = cell_map.count(CellObjectType::Electron);
1964 
1965  if (!cell_map.empty()) {
1966  get(dnn::rho) = getValueNorm(rho, 21.49f, 9.713f);
1967  get(dnn::tau_pt) = getValueLinear(tau.polarP4().pt(), 20.f, 1000.f, true);
1968  get(dnn::tau_eta) = getValueLinear(tau.polarP4().eta(), -2.3f, 2.3f, false);
1969  get(dnn::tau_inside_ecal_crack) = getValue(isInEcalCrack(tau.polarP4().eta()));
1970  }
1971  if (valid_index_pf_ele) {
1972  size_t index_pf_ele = cell_map.at(CellObjectType::PfCand_electron);
1973  const auto& ele_cand = dynamic_cast<const CandidateCastType&>(pfCands.at(index_pf_ele));
1974 
1975  get(dnn::pfCand_ele_valid) = valid_index_pf_ele;
1976  get(dnn::pfCand_ele_rel_pt) = getValueNorm(pfCands.at(index_pf_ele).polarP4().pt() / tau.polarP4().pt(),
1977  is_inner ? 0.9792f : 0.304f,
1978  is_inner ? 0.5383f : 1.845f);
1979  get(dnn::pfCand_ele_deta) = getValueLinear(pfCands.at(index_pf_ele).polarP4().eta() - tau.polarP4().eta(),
1980  is_inner ? -0.1f : -0.5f,
1981  is_inner ? 0.1f : 0.5f,
1982  false);
1983  get(dnn::pfCand_ele_dphi) = getValueLinear(dPhi(tau.polarP4(), pfCands.at(index_pf_ele).polarP4()),
1984  is_inner ? -0.1f : -0.5f,
1985  is_inner ? 0.1f : 0.5f,
1986  false);
1987  get(dnn::pfCand_ele_pvAssociationQuality) =
1988  getValueLinear<int>(candFunc::getPvAssocationQuality(ele_cand), 0, 7, true);
1989  get(dnn::pfCand_ele_puppiWeight) = is_inner ? getValue(candFunc::getPuppiWeight(ele_cand, 0.9906834f))
1990  : getValue(candFunc::getPuppiWeight(ele_cand, 0.9669586f));
1991  get(dnn::pfCand_ele_charge) = getValue(ele_cand.charge());
1992  get(dnn::pfCand_ele_lostInnerHits) = getValue<int>(candFunc::getLostInnerHits(ele_cand, 0));
1993  get(dnn::pfCand_ele_numberOfPixelHits) = getValueLinear(candFunc::getNumberOfPixelHits(ele_cand, 0), 0, 10, true);
1994  get(dnn::pfCand_ele_vertex_dx) =
1995  getValueNorm(pfCands.at(index_pf_ele).vertex().x() - pv.position().x(), 0.f, 0.1221f);
1996  get(dnn::pfCand_ele_vertex_dy) =
1997  getValueNorm(pfCands.at(index_pf_ele).vertex().y() - pv.position().y(), 0.f, 0.1226f);
1998  get(dnn::pfCand_ele_vertex_dz) =
1999  getValueNorm(pfCands.at(index_pf_ele).vertex().z() - pv.position().z(), 0.001f, 1.024f);
2000  get(dnn::pfCand_ele_vertex_dx_tauFL) = getValueNorm(
2001  pfCands.at(index_pf_ele).vertex().x() - pv.position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2002  0.f,
2003  0.3411f);
2004  get(dnn::pfCand_ele_vertex_dy_tauFL) = getValueNorm(
2005  pfCands.at(index_pf_ele).vertex().y() - pv.position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2006  0.0003f,
2007  0.3385f);
2008  get(dnn::pfCand_ele_vertex_dz_tauFL) = getValueNorm(
2009  pfCands.at(index_pf_ele).vertex().z() - pv.position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2010  0.f,
2011  1.307f);
2012 
2013  const bool hasTrackDetails = candFunc::getHasTrackDetails(ele_cand);
2014  if (hasTrackDetails) {
2015  get(dnn::pfCand_ele_hasTrackDetails) = hasTrackDetails;
2016  get(dnn::pfCand_ele_dxy) = getValueNorm(candFunc::getTauDxy(ele_cand), 0.f, 0.171f);
2017  get(dnn::pfCand_ele_dxy_sig) =
2018  getValueNorm(std::abs(candFunc::getTauDxy(ele_cand)) / pfCands.at(index_pf_ele).dxyError(), 1.634f, 6.45f);
2019  get(dnn::pfCand_ele_dz) = getValueNorm(candFunc::getTauDz(ele_cand), 0.001f, 1.02f);
2020  get(dnn::pfCand_ele_dz_sig) =
2021  getValueNorm(std::abs(candFunc::getTauDz(ele_cand)) / ele_cand.dzError(), 24.56f, 210.4f);
2022  get(dnn::pfCand_ele_track_chi2_ndof) = getValueNorm(
2023  candFunc::getPseudoTrack(ele_cand).chi2() / candFunc::getPseudoTrack(ele_cand).ndof(), 2.272f, 8.439f);
2024  get(dnn::pfCand_ele_track_ndof) = getValueNorm(candFunc::getPseudoTrack(ele_cand).ndof(), 15.18f, 3.203f);
2025  }
2026  }
2027  if (valid_index_pf_gamma) {
2028  size_t index_pf_gamma = cell_map.at(CellObjectType::PfCand_gamma);
2029  const auto& gamma_cand = dynamic_cast<const CandidateCastType&>(pfCands.at(index_pf_gamma));
2030 
2031  get(dnn::pfCand_gamma_valid) = valid_index_pf_gamma;
2032  get(dnn::pfCand_gamma_rel_pt) = getValueNorm(pfCands.at(index_pf_gamma).polarP4().pt() / tau.polarP4().pt(),
2033  is_inner ? 0.6048f : 0.02576f,
2034  is_inner ? 1.669f : 0.3833f);
2035  get(dnn::pfCand_gamma_deta) = getValueLinear(pfCands.at(index_pf_gamma).polarP4().eta() - tau.polarP4().eta(),
2036  is_inner ? -0.1f : -0.5f,
2037  is_inner ? 0.1f : 0.5f,
2038  false);
2039  get(dnn::pfCand_gamma_dphi) = getValueLinear(dPhi(tau.polarP4(), pfCands.at(index_pf_gamma).polarP4()),
2040  is_inner ? -0.1f : -0.5f,
2041  is_inner ? 0.1f : 0.5f,
2042  false);
2043  get(dnn::pfCand_gamma_pvAssociationQuality) =
2044  getValueLinear<int>(candFunc::getPvAssocationQuality(gamma_cand), 0, 7, true);
2045  get(dnn::pfCand_gamma_fromPV) = getValueLinear<int>(candFunc::getFromPV(gamma_cand), 0, 3, true);
2046  get(dnn::pfCand_gamma_puppiWeight) = is_inner ? getValue(candFunc::getPuppiWeight(gamma_cand, 0.9084110f))
2047  : getValue(candFunc::getPuppiWeight(gamma_cand, 0.4211567f));
2048  get(dnn::pfCand_gamma_puppiWeightNoLep) = is_inner
2049  ? getValue(candFunc::getPuppiWeightNoLep(gamma_cand, 0.8857716f))
2050  : getValue(candFunc::getPuppiWeightNoLep(gamma_cand, 0.3822604f));
2051  get(dnn::pfCand_gamma_lostInnerHits) = getValue<int>(candFunc::getLostInnerHits(gamma_cand, 0));
2052  get(dnn::pfCand_gamma_numberOfPixelHits) =
2053  getValueLinear(candFunc::getNumberOfPixelHits(gamma_cand, 0), 0, 7, true);
2054  get(dnn::pfCand_gamma_vertex_dx) =
2055  getValueNorm(pfCands.at(index_pf_gamma).vertex().x() - pv.position().x(), 0.f, 0.0067f);
2056  get(dnn::pfCand_gamma_vertex_dy) =
2057  getValueNorm(pfCands.at(index_pf_gamma).vertex().y() - pv.position().y(), 0.f, 0.0069f);
2058  get(dnn::pfCand_gamma_vertex_dz) =
2059  getValueNorm(pfCands.at(index_pf_gamma).vertex().z() - pv.position().z(), 0.f, 0.0578f);
2060  get(dnn::pfCand_gamma_vertex_dx_tauFL) = getValueNorm(
2061  pfCands.at(index_pf_gamma).vertex().x() - pv.position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2062  0.001f,
2063  0.9565f);
2064  get(dnn::pfCand_gamma_vertex_dy_tauFL) = getValueNorm(
2065  pfCands.at(index_pf_gamma).vertex().y() - pv.position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2066  0.0008f,
2067  0.9592f);
2068  get(dnn::pfCand_gamma_vertex_dz_tauFL) = getValueNorm(
2069  pfCands.at(index_pf_gamma).vertex().z() - pv.position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2070  0.0038f,
2071  2.154f);
2072  const bool hasTrackDetails = candFunc::getHasTrackDetails(gamma_cand);
2073  if (hasTrackDetails) {
2074  get(dnn::pfCand_gamma_hasTrackDetails) = hasTrackDetails;
2075  get(dnn::pfCand_gamma_dxy) = getValueNorm(candFunc::getTauDxy(gamma_cand), 0.0004f, 0.882f);
2076  get(dnn::pfCand_gamma_dxy_sig) =
2077  getValueNorm(std::abs(candFunc::getTauDxy(gamma_cand)) / gamma_cand.dxyError(), 4.271f, 63.78f);
2078  get(dnn::pfCand_gamma_dz) = getValueNorm(candFunc::getTauDz(gamma_cand), 0.0071f, 5.285f);
2079  get(dnn::pfCand_gamma_dz_sig) =
2080  getValueNorm(std::abs(candFunc::getTauDz(gamma_cand)) / gamma_cand.dzError(), 162.1f, 622.4f);
2081  get(dnn::pfCand_gamma_track_chi2_ndof) = candFunc::getPseudoTrack(gamma_cand).ndof() > 0
2082  ? getValueNorm(candFunc::getPseudoTrack(gamma_cand).chi2() /
2083  candFunc::getPseudoTrack(gamma_cand).ndof(),
2084  4.268f,
2085  15.47f)
2086  : 0;
2087  get(dnn::pfCand_gamma_track_ndof) =
2088  candFunc::getPseudoTrack(gamma_cand).ndof() > 0
2089  ? getValueNorm(candFunc::getPseudoTrack(gamma_cand).ndof(), 12.25f, 4.774f)
2090  : 0;
2091  }
2092  }
2093  if (valid_index_ele) {
2094  size_t index_ele = cell_map.at(CellObjectType::Electron);
2095 
2096  get(dnn::ele_valid) = valid_index_ele;
2097  get(dnn::ele_rel_pt) = getValueNorm(electrons->at(index_ele).polarP4().pt() / tau.polarP4().pt(),
2098  is_inner ? 1.067f : 0.5111f,
2099  is_inner ? 1.521f : 2.765f);
2100  get(dnn::ele_deta) = getValueLinear(electrons->at(index_ele).polarP4().eta() - tau.polarP4().eta(),
2101  is_inner ? -0.1f : -0.5f,
2102  is_inner ? 0.1f : 0.5f,
2103  false);
2104  get(dnn::ele_dphi) = getValueLinear(dPhi(tau.polarP4(), electrons->at(index_ele).polarP4()),
2105  is_inner ? -0.1f : -0.5f,
2106  is_inner ? 0.1f : 0.5f,
2107  false);
2108 
2109  float cc_ele_energy, cc_gamma_energy;
2110  int cc_n_gamma;
2111  const bool cc_valid =
2112  calculateElectronClusterVarsV2(electrons->at(index_ele), cc_ele_energy, cc_gamma_energy, cc_n_gamma);
2113  if (cc_valid) {
2114  get(dnn::ele_cc_valid) = cc_valid;
2115  get(dnn::ele_cc_ele_rel_energy) =
2116  getValueNorm(cc_ele_energy / electrons->at(index_ele).polarP4().pt(), 1.729f, 1.644f);
2117  get(dnn::ele_cc_gamma_rel_energy) = getValueNorm(cc_gamma_energy / cc_ele_energy, 0.1439f, 0.3284f);
2118  get(dnn::ele_cc_n_gamma) = getValueNorm(cc_n_gamma, 1.794f, 2.079f);
2119  }
2120  get(dnn::ele_rel_trackMomentumAtVtx) = getValueNorm(
2121  electrons->at(index_ele).trackMomentumAtVtx().R() / electrons->at(index_ele).polarP4().pt(), 1.531f, 1.424f);
2122  get(dnn::ele_rel_trackMomentumAtCalo) = getValueNorm(
2123  electrons->at(index_ele).trackMomentumAtCalo().R() / electrons->at(index_ele).polarP4().pt(), 1.531f, 1.424f);
2124  get(dnn::ele_rel_trackMomentumOut) = getValueNorm(
2125  electrons->at(index_ele).trackMomentumOut().R() / electrons->at(index_ele).polarP4().pt(), 0.7735f, 0.935f);
2126  get(dnn::ele_rel_trackMomentumAtEleClus) =
2127  getValueNorm(electrons->at(index_ele).trackMomentumAtEleClus().R() / electrons->at(index_ele).polarP4().pt(),
2128  0.7735f,
2129  0.935f);
2130  get(dnn::ele_rel_trackMomentumAtVtxWithConstraint) = getValueNorm(
2131  electrons->at(index_ele).trackMomentumAtVtxWithConstraint().R() / electrons->at(index_ele).polarP4().pt(),
2132  1.625f,
2133  1.581f);
2134  get(dnn::ele_rel_ecalEnergy) =
2135  getValueNorm(electrons->at(index_ele).ecalEnergy() / electrons->at(index_ele).polarP4().pt(), 1.993f, 1.308f);
2136  get(dnn::ele_ecalEnergy_sig) = getValueNorm(
2137  electrons->at(index_ele).ecalEnergy() / electrons->at(index_ele).ecalEnergyError(), 70.25f, 58.16f);
2138  get(dnn::ele_eSuperClusterOverP) = getValueNorm(electrons->at(index_ele).eSuperClusterOverP(), 2.432f, 15.13f);
2139  get(dnn::ele_eSeedClusterOverP) = getValueNorm(electrons->at(index_ele).eSeedClusterOverP(), 2.034f, 13.96f);
2140  get(dnn::ele_eSeedClusterOverPout) = getValueNorm(electrons->at(index_ele).eSeedClusterOverPout(), 6.64f, 36.8f);
2141  get(dnn::ele_eEleClusterOverPout) = getValueNorm(electrons->at(index_ele).eEleClusterOverPout(), 4.183f, 20.63f);
2142  get(dnn::ele_deltaEtaSuperClusterTrackAtVtx) =
2143  getValueNorm(electrons->at(index_ele).deltaEtaSuperClusterTrackAtVtx(), 0.f, 0.0363f);
2144  get(dnn::ele_deltaEtaSeedClusterTrackAtCalo) =
2145  getValueNorm(electrons->at(index_ele).deltaEtaSeedClusterTrackAtCalo(), -0.0001f, 0.0512f);
2146  get(dnn::ele_deltaEtaEleClusterTrackAtCalo) =
2147  getValueNorm(electrons->at(index_ele).deltaEtaEleClusterTrackAtCalo(), -0.0001f, 0.0541f);
2148  get(dnn::ele_deltaPhiEleClusterTrackAtCalo) =
2149  getValueNorm(electrons->at(index_ele).deltaPhiEleClusterTrackAtCalo(), 0.0002f, 0.0553f);
2150  get(dnn::ele_deltaPhiSuperClusterTrackAtVtx) =
2151  getValueNorm(electrons->at(index_ele).deltaPhiSuperClusterTrackAtVtx(), 0.0001f, 0.0523f);
2152  get(dnn::ele_deltaPhiSeedClusterTrackAtCalo) =
2153  getValueNorm(electrons->at(index_ele).deltaPhiSeedClusterTrackAtCalo(), 0.0004f, 0.0777f);
2154  get(dnn::ele_mvaInput_earlyBrem) = getValue(electrons->at(index_ele).mvaInput().earlyBrem);
2155  get(dnn::ele_mvaInput_lateBrem) = getValue(electrons->at(index_ele).mvaInput().lateBrem);
2156  get(dnn::ele_mvaInput_sigmaEtaEta) =
2157  getValueNorm(electrons->at(index_ele).mvaInput().sigmaEtaEta, 0.0008f, 0.0052f);
2158  get(dnn::ele_mvaInput_hadEnergy) = getValueNorm(electrons->at(index_ele).mvaInput().hadEnergy, 14.04f, 69.48f);
2159  get(dnn::ele_mvaInput_deltaEta) = getValueNorm(electrons->at(index_ele).mvaInput().deltaEta, 0.0099f, 0.0851f);
2160  const auto& gsfTrack = electrons->at(index_ele).gsfTrack();
2161  if (gsfTrack.isNonnull()) {
2162  get(dnn::ele_gsfTrack_normalizedChi2) = getValueNorm(gsfTrack->normalizedChi2(), 3.049f, 10.39f);
2163  get(dnn::ele_gsfTrack_numberOfValidHits) = getValueNorm(gsfTrack->numberOfValidHits(), 16.52f, 2.806f);
2164  get(dnn::ele_rel_gsfTrack_pt) =
2165  getValueNorm(gsfTrack->pt() / electrons->at(index_ele).polarP4().pt(), 1.355f, 16.81f);
2166  get(dnn::ele_gsfTrack_pt_sig) = getValueNorm(gsfTrack->pt() / gsfTrack->ptError(), 5.046f, 3.119f);
2167  }
2168  const auto& closestCtfTrack = electrons->at(index_ele).closestCtfTrackRef();
2169  const bool has_closestCtfTrack = closestCtfTrack.isNonnull();
2170  if (has_closestCtfTrack) {
2171  get(dnn::ele_has_closestCtfTrack) = has_closestCtfTrack;
2172  get(dnn::ele_closestCtfTrack_normalizedChi2) = getValueNorm(closestCtfTrack->normalizedChi2(), 2.411f, 6.98f);
2173  get(dnn::ele_closestCtfTrack_numberOfValidHits) =
2174  getValueNorm(closestCtfTrack->numberOfValidHits(), 15.16f, 5.26f);
2175  }
2176  }
2177  }
static float getValueLinear(T value, float min_value, float max_value, bool positive)
Definition: DeepTauId.cc:1265
static bool isInEcalCrack(double eta)
Definition: DeepTauId.cc:2785
const Point & position() const
position
Definition: Vertex.h:127
static float getValue(T value)
Definition: DeepTauId.cc:1260
static float getValueNorm(T value, float mean, float sigma, float n_sigmas_max=5)
Definition: DeepTauId.cc:1275
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static bool calculateElectronClusterVarsV2(const pat::Electron &ele, float &cc_ele_energy, float &cc_gamma_energy, int &cc_n_gamma)
Definition: DeepTauId.cc:1283
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
Definition: DeepTauId.cc:2819
const_reference at(size_type pos) const
constexpr char Electron[]
Definition: modules.cc:12
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 2331 of file DeepTauId.cc.

References funct::abs(), edm::View< T >::at(), HLT_FULL_cff::chi2, disable_hcalFraction_workaround_, validate-o2o-wbm::f, getValue(), getValueLinear(), getValueNorm(), hadronsTensor_, PixelMapPlotter::inputs, isInEcalCrack(), ndof, reco::Vertex::position(), HLT_FULL_cff::rho, runTauDisplay::tau_eta, and runTauDisplay::tau_pt.

2340  {
2341  namespace dnn = dnn_inputs_2017_v2::HadronBlockInputs;
2342 
2343  tensorflow::Tensor& inputs = *hadronsTensor_.at(is_inner);
2344 
2345  const auto& get = [&](int var_index) -> float& { return inputs.tensor<float, 4>()(idx, 0, 0, var_index); };
2346 
2347  const bool valid_chH = cell_map.count(CellObjectType::PfCand_chargedHadron);
2348  const bool valid_nH = cell_map.count(CellObjectType::PfCand_neutralHadron);
2349 
2350  if (!cell_map.empty()) {
2351  get(dnn::rho) = getValueNorm(rho, 21.49f, 9.713f);
2352  get(dnn::tau_pt) = getValueLinear(tau.polarP4().pt(), 20.f, 1000.f, true);
2353  get(dnn::tau_eta) = getValueLinear(tau.polarP4().eta(), -2.3f, 2.3f, false);
2354  get(dnn::tau_inside_ecal_crack) = getValue(isInEcalCrack(tau.polarP4().eta()));
2355  }
2356  if (valid_chH) {
2357  size_t index_chH = cell_map.at(CellObjectType::PfCand_chargedHadron);
2358  const auto& chH_cand = dynamic_cast<const CandidateCastType&>(pfCands.at(index_chH));
2359 
2360  get(dnn::pfCand_chHad_valid) = valid_chH;
2361  get(dnn::pfCand_chHad_rel_pt) = getValueNorm(pfCands.at(index_chH).polarP4().pt() / tau.polarP4().pt(),
2362  is_inner ? 0.2564f : 0.0194f,
2363  is_inner ? 0.8607f : 0.1865f);
2364  get(dnn::pfCand_chHad_deta) = getValueLinear(pfCands.at(index_chH).polarP4().eta() - tau.polarP4().eta(),
2365  is_inner ? -0.1f : -0.5f,
2366  is_inner ? 0.1f : 0.5f,
2367  false);
2368  get(dnn::pfCand_chHad_dphi) = getValueLinear(dPhi(tau.polarP4(), pfCands.at(index_chH).polarP4()),
2369  is_inner ? -0.1f : -0.5f,
2370  is_inner ? 0.1f : 0.5f,
2371  false);
2372  get(dnn::pfCand_chHad_leadChargedHadrCand) =
2373  getValue(&chH_cand == dynamic_cast<const CandidateCastType*>(tau.leadChargedHadrCand().get()));
2374  get(dnn::pfCand_chHad_pvAssociationQuality) =
2375  getValueLinear<int>(candFunc::getPvAssocationQuality(chH_cand), 0, 7, true);
2376  get(dnn::pfCand_chHad_fromPV) = getValueLinear<int>(candFunc::getFromPV(chH_cand), 0, 3, true);
2377  const float default_chH_pw_inner = 0.7614090f;
2378  const float default_chH_pw_outer = 0.1974930f;
2379  get(dnn::pfCand_chHad_puppiWeight) = is_inner
2380  ? getValue(candFunc::getPuppiWeight(chH_cand, default_chH_pw_inner))
2381  : getValue(candFunc::getPuppiWeight(chH_cand, default_chH_pw_outer));
2382  get(dnn::pfCand_chHad_puppiWeightNoLep) =
2383  is_inner ? getValue(candFunc::getPuppiWeightNoLep(chH_cand, default_chH_pw_inner))
2384  : getValue(candFunc::getPuppiWeightNoLep(chH_cand, default_chH_pw_outer));
2385  get(dnn::pfCand_chHad_charge) = getValue(chH_cand.charge());
2386  get(dnn::pfCand_chHad_lostInnerHits) = getValue<int>(candFunc::getLostInnerHits(chH_cand, 0));
2387  get(dnn::pfCand_chHad_numberOfPixelHits) =
2388  getValueLinear(candFunc::getNumberOfPixelHits(chH_cand, 0), 0, 12, true);
2389  get(dnn::pfCand_chHad_vertex_dx) =
2390  getValueNorm(pfCands.at(index_chH).vertex().x() - pv.position().x(), 0.0005f, 1.735f);
2391  get(dnn::pfCand_chHad_vertex_dy) =
2392  getValueNorm(pfCands.at(index_chH).vertex().y() - pv.position().y(), -0.0008f, 1.752f);
2393  get(dnn::pfCand_chHad_vertex_dz) =
2394  getValueNorm(pfCands.at(index_chH).vertex().z() - pv.position().z(), -0.0201f, 8.333f);
2395  get(dnn::pfCand_chHad_vertex_dx_tauFL) = getValueNorm(
2396  pfCands.at(index_chH).vertex().x() - pv.position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2397  -0.0014f,
2398  1.93f);
2399  get(dnn::pfCand_chHad_vertex_dy_tauFL) = getValueNorm(
2400  pfCands.at(index_chH).vertex().y() - pv.position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2401  0.0022f,
2402  1.948f);
2403  get(dnn::pfCand_chHad_vertex_dz_tauFL) = getValueNorm(
2404  pfCands.at(index_chH).vertex().z() - pv.position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2405  -0.0138f,
2406  8.622f);
2407 
2408  const bool hasTrackDetails = candFunc::getHasTrackDetails(chH_cand);
2409  if (hasTrackDetails) {
2410  get(dnn::pfCand_chHad_hasTrackDetails) = hasTrackDetails;
2411  get(dnn::pfCand_chHad_dxy) = getValueNorm(candFunc::getTauDxy(chH_cand), -0.012f, 2.386f);
2412  get(dnn::pfCand_chHad_dxy_sig) =
2413  getValueNorm(std::abs(candFunc::getTauDxy(chH_cand)) / chH_cand.dxyError(), 6.417f, 36.28f);
2414  get(dnn::pfCand_chHad_dz) = getValueNorm(candFunc::getTauDz(chH_cand), -0.0246f, 7.618f);
2415  get(dnn::pfCand_chHad_dz_sig) =
2416  getValueNorm(std::abs(candFunc::getTauDz(chH_cand)) / chH_cand.dzError(), 301.3f, 491.1f);
2417  get(dnn::pfCand_chHad_track_chi2_ndof) =
2418  candFunc::getPseudoTrack(chH_cand).ndof() > 0
2419  ? getValueNorm(candFunc::getPseudoTrack(chH_cand).chi2() / candFunc::getPseudoTrack(chH_cand).ndof(),
2420  0.7876f,
2421  3.694f)
2422  : 0;
2423  get(dnn::pfCand_chHad_track_ndof) =
2424  candFunc::getPseudoTrack(chH_cand).ndof() > 0
2425  ? getValueNorm(candFunc::getPseudoTrack(chH_cand).ndof(), 13.92f, 6.581f)
2426  : 0;
2427  }
2428  float hcal_fraction = candFunc::getHCalFraction(chH_cand, disable_hcalFraction_workaround_);
2429  get(dnn::pfCand_chHad_hcalFraction) = getValue(hcal_fraction);
2430  get(dnn::pfCand_chHad_rawCaloFraction) = getValueLinear(candFunc::getRawCaloFraction(chH_cand), 0.f, 2.6f, true);
2431  }
2432  if (valid_nH) {
2433  size_t index_nH = cell_map.at(CellObjectType::PfCand_neutralHadron);
2434  const auto& nH_cand = dynamic_cast<const CandidateCastType&>(pfCands.at(index_nH));
2435 
2436  get(dnn::pfCand_nHad_valid) = valid_nH;
2437  get(dnn::pfCand_nHad_rel_pt) = getValueNorm(pfCands.at(index_nH).polarP4().pt() / tau.polarP4().pt(),
2438  is_inner ? 0.3163f : 0.0502f,
2439  is_inner ? 0.2769f : 0.4266f);
2440  get(dnn::pfCand_nHad_deta) = getValueLinear(pfCands.at(index_nH).polarP4().eta() - tau.polarP4().eta(),
2441  is_inner ? -0.1f : -0.5f,
2442  is_inner ? 0.1f : 0.5f,
2443  false);
2444  get(dnn::pfCand_nHad_dphi) = getValueLinear(
2445  dPhi(tau.polarP4(), pfCands.at(index_nH).polarP4()), is_inner ? -0.1f : -0.5f, is_inner ? 0.1f : 0.5f, false);
2446  get(dnn::pfCand_nHad_puppiWeight) = is_inner ? getValue(candFunc::getPuppiWeight(nH_cand, 0.9798355f))
2447  : getValue(candFunc::getPuppiWeight(nH_cand, 0.7813260f));
2448  get(dnn::pfCand_nHad_puppiWeightNoLep) = is_inner ? getValue(candFunc::getPuppiWeightNoLep(nH_cand, 0.9046796f))
2449  : getValue(candFunc::getPuppiWeightNoLep(nH_cand, 0.6554860f));
2450  float hcal_fraction = candFunc::getHCalFraction(nH_cand, disable_hcalFraction_workaround_);
2451  get(dnn::pfCand_nHad_hcalFraction) = getValue(hcal_fraction);
2452  }
2453  }
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
Definition: DeepTauId.cc:2819
static float getValueLinear(T value, float min_value, float max_value, bool positive)
Definition: DeepTauId.cc:1265
static bool isInEcalCrack(double eta)
Definition: DeepTauId.cc:2785
const Point & position() const
position
Definition: Vertex.h:127
static float getValue(T value)
Definition: DeepTauId.cc:1260
static float getValueNorm(T value, float mean, float sigma, float n_sigmas_max=5)
Definition: DeepTauId.cc:1275
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const bool disable_hcalFraction_workaround_
Definition: DeepTauId.cc:2816
const_reference at(size_type pos) const
template<typename dnn , typename CandidateCastType , typename TauCastType >
tensorflow::Tensor DeepTauId::createInputsV1 ( const TauCastType &  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,
TauFunc  tau_funcs 
) const
inlineprivate

Definition at line 2456 of file DeepTauId.cc.

References funct::abs(), calculateElectronClusterVars(), calculateGottfriedJacksonAngleDifference(), default_value, PVValHelper::dxy, PVValHelper::dz, reco::tau::eratio(), PVValHelper::eta, Exception, findMatchedElectron(), PixelMapPlotter::inputs, isInEcalCrack(), ResonanceBuilder::mass, reco::tau::n_photons_total(), processIsolationPFComponents(), processSignalPFComponents(), DiDispStaMuonMonitor_cfi::pt, reco::tau::pt_weighted_deta_strip(), reco::tau::pt_weighted_dphi_strip(), reco::tau::pt_weighted_dr_iso(), reco::tau::pt_weighted_dr_signal(), and metsig::tau.

2461  {
2462  static constexpr bool check_all_set = false;
2463  static constexpr float default_value_for_set_check = -42;
2464 
2465  tensorflow::Tensor inputs(tensorflow::DT_FLOAT, {1, dnn_inputs_2017v1::NumberOfInputs});
2466  const auto& get = [&](int var_index) -> float& { return inputs.matrix<float>()(0, var_index); };
2467  auto leadChargedHadrCand = dynamic_cast<const CandidateCastType*>(tau.leadChargedHadrCand().get());
2468 
2469  if (check_all_set) {
2470  for (int var_index = 0; var_index < dnn::NumberOfInputs; ++var_index) {
2471  get(var_index) = default_value_for_set_check;
2472  }
2473  }
2474 
2475  get(dnn::pt) = tau.p4().pt();
2476  get(dnn::eta) = tau.p4().eta();
2477  get(dnn::mass) = tau.p4().mass();
2478  get(dnn::decayMode) = tau.decayMode();
2479  get(dnn::chargedIsoPtSum) = tau_funcs.getChargedIsoPtSum(tau, tau_ref);
2480  get(dnn::neutralIsoPtSum) = tau_funcs.getNeutralIsoPtSum(tau, tau_ref);
2481  get(dnn::neutralIsoPtSumWeight) = tau_funcs.getNeutralIsoPtSumWeight(tau, tau_ref);
2482  get(dnn::photonPtSumOutsideSignalCone) = tau_funcs.getPhotonPtSumOutsideSignalCone(tau, tau_ref);
2483  get(dnn::puCorrPtSum) = tau_funcs.getPuCorrPtSum(tau, tau_ref);
2484  get(dnn::dxy) = tau_funcs.getdxy(tau, tau_index);
2485  get(dnn::dxy_sig) = tau_funcs.getdxySig(tau, tau_index);
2486  get(dnn::dz) = leadChargedHadrCand ? candFunc::getTauDz(*leadChargedHadrCand) : default_value;
2487  get(dnn::ip3d) = tau_funcs.getip3d(tau, tau_index);
2488  get(dnn::ip3d_sig) = tau_funcs.getip3dSig(tau, tau_index);
2489  get(dnn::hasSecondaryVertex) = tau_funcs.getHasSecondaryVertex(tau, tau_index);
2490  get(dnn::flightLength_r) = tau_funcs.getFlightLength(tau, tau_index).R();
2491  get(dnn::flightLength_dEta) = dEta(tau_funcs.getFlightLength(tau, tau_index), tau.p4());
2492  get(dnn::flightLength_dPhi) = dPhi(tau_funcs.getFlightLength(tau, tau_index), tau.p4());
2493  get(dnn::flightLength_sig) = tau_funcs.getFlightLengthSig(tau, tau_index);
2494  get(dnn::leadChargedHadrCand_pt) = leadChargedHadrCand ? leadChargedHadrCand->p4().Pt() : default_value;
2495  get(dnn::leadChargedHadrCand_dEta) =
2496  leadChargedHadrCand ? dEta(leadChargedHadrCand->p4(), tau.p4()) : default_value;
2497  get(dnn::leadChargedHadrCand_dPhi) =
2498  leadChargedHadrCand ? dPhi(leadChargedHadrCand->p4(), tau.p4()) : default_value;
2499  get(dnn::leadChargedHadrCand_mass) = leadChargedHadrCand ? leadChargedHadrCand->p4().mass() : default_value;
2504  get(dnn::leadingTrackNormChi2) = tau_funcs.getLeadingTrackNormChi2(tau);
2505  get(dnn::e_ratio) = reco::tau::eratio(tau);
2506  get(dnn::gj_angle_diff) = calculateGottfriedJacksonAngleDifference(tau, tau_index, tau_funcs);
2507  get(dnn::n_photons) = reco::tau::n_photons_total(tau);
2508  get(dnn::emFraction) = tau_funcs.getEmFraction(tau);
2509  get(dnn::has_gsf_track) = leadChargedHadrCand && std::abs(leadChargedHadrCand->pdgId()) == 11;
2510  get(dnn::inside_ecal_crack) = isInEcalCrack(tau.p4().Eta());
2511  auto gsf_ele = findMatchedElectron(tau, electrons, 0.3);
2512  get(dnn::gsf_ele_matched) = gsf_ele != nullptr;
2513  get(dnn::gsf_ele_pt) = gsf_ele != nullptr ? gsf_ele->p4().Pt() : default_value;
2514  get(dnn::gsf_ele_dEta) = gsf_ele != nullptr ? dEta(gsf_ele->p4(), tau.p4()) : default_value;
2515  get(dnn::gsf_ele_dPhi) = gsf_ele != nullptr ? dPhi(gsf_ele->p4(), tau.p4()) : default_value;
2516  get(dnn::gsf_ele_mass) = gsf_ele != nullptr ? gsf_ele->p4().mass() : default_value;
2517  calculateElectronClusterVars(gsf_ele, get(dnn::gsf_ele_Ee), get(dnn::gsf_ele_Egamma));
2518  get(dnn::gsf_ele_Pin) = gsf_ele != nullptr ? gsf_ele->trackMomentumAtVtx().R() : default_value;
2519  get(dnn::gsf_ele_Pout) = gsf_ele != nullptr ? gsf_ele->trackMomentumOut().R() : default_value;
2520  get(dnn::gsf_ele_EtotOverPin) = get(dnn::gsf_ele_Pin) > 0
2521  ? (get(dnn::gsf_ele_Ee) + get(dnn::gsf_ele_Egamma)) / get(dnn::gsf_ele_Pin)
2522  : default_value;
2523  get(dnn::gsf_ele_Eecal) = gsf_ele != nullptr ? gsf_ele->ecalEnergy() : default_value;
2524  get(dnn::gsf_ele_dEta_SeedClusterTrackAtCalo) =
2525  gsf_ele != nullptr ? gsf_ele->deltaEtaSeedClusterTrackAtCalo() : default_value;
2526  get(dnn::gsf_ele_dPhi_SeedClusterTrackAtCalo) =
2527  gsf_ele != nullptr ? gsf_ele->deltaPhiSeedClusterTrackAtCalo() : default_value;
2528  get(dnn::gsf_ele_mvaIn_sigmaEtaEta) = gsf_ele != nullptr ? gsf_ele->mvaInput().sigmaEtaEta : default_value;
2529  get(dnn::gsf_ele_mvaIn_hadEnergy) = gsf_ele != nullptr ? gsf_ele->mvaInput().hadEnergy : default_value;
2530  get(dnn::gsf_ele_mvaIn_deltaEta) = gsf_ele != nullptr ? gsf_ele->mvaInput().deltaEta : default_value;
2531 
2532  get(dnn::gsf_ele_Chi2NormGSF) = default_value;
2533  get(dnn::gsf_ele_GSFNumHits) = default_value;
2534  get(dnn::gsf_ele_GSFTrackResol) = default_value;
2535  get(dnn::gsf_ele_GSFTracklnPt) = default_value;
2536  if (gsf_ele != nullptr && gsf_ele->gsfTrack().isNonnull()) {
2537  get(dnn::gsf_ele_Chi2NormGSF) = gsf_ele->gsfTrack()->normalizedChi2();
2538  get(dnn::gsf_ele_GSFNumHits) = gsf_ele->gsfTrack()->numberOfValidHits();
2539  if (gsf_ele->gsfTrack()->pt() > 0) {
2540  get(dnn::gsf_ele_GSFTrackResol) = gsf_ele->gsfTrack()->ptError() / gsf_ele->gsfTrack()->pt();
2541  get(dnn::gsf_ele_GSFTracklnPt) = std::log10(gsf_ele->gsfTrack()->pt());
2542  }
2543  }
2544 
2545  get(dnn::gsf_ele_Chi2NormKF) = default_value;
2546  get(dnn::gsf_ele_KFNumHits) = default_value;
2547  if (gsf_ele != nullptr && gsf_ele->closestCtfTrackRef().isNonnull()) {
2548  get(dnn::gsf_ele_Chi2NormKF) = gsf_ele->closestCtfTrackRef()->normalizedChi2();
2549  get(dnn::gsf_ele_KFNumHits) = gsf_ele->closestCtfTrackRef()->numberOfValidHits();
2550  }
2551  get(dnn::leadChargedCand_etaAtEcalEntrance) = tau_funcs.getEtaAtEcalEntrance(tau);
2552  get(dnn::leadChargedCand_pt) = leadChargedHadrCand->pt();
2553 
2554  get(dnn::leadChargedHadrCand_HoP) = default_value;
2555  get(dnn::leadChargedHadrCand_EoP) = default_value;
2556  if (leadChargedHadrCand->pt() > 0) {
2557  get(dnn::leadChargedHadrCand_HoP) = tau_funcs.getEcalEnergyLeadingChargedHadr(tau) / leadChargedHadrCand->pt();
2558  get(dnn::leadChargedHadrCand_EoP) = tau_funcs.getHcalEnergyLeadingChargedHadr(tau) / leadChargedHadrCand->pt();
2559  }
2560 
2561  MuonHitMatchV1 muon_hit_match;
2562  if (tau.leadPFChargedHadrCand().isNonnull() && tau.leadPFChargedHadrCand()->muonRef().isNonnull())
2563  muon_hit_match.addMatchedMuon(*tau.leadPFChargedHadrCand()->muonRef(), tau);
2564 
2565  auto matched_muons = muon_hit_match.findMatchedMuons(tau, muons, 0.3, 5);
2566  for (auto muon : matched_muons)
2567  muon_hit_match.addMatchedMuon(*muon, tau);
2568  muon_hit_match.fillTensor<dnn>(get, tau, default_value);
2569 
2570  LorentzVectorXYZ signalChargedHadrCands_sumIn, signalChargedHadrCands_sumOut;
2572  tau.signalChargedHadrCands(),
2573  signalChargedHadrCands_sumIn,
2574  signalChargedHadrCands_sumOut,
2575  get(dnn::signalChargedHadrCands_sum_innerSigCone_pt),
2576  get(dnn::signalChargedHadrCands_sum_innerSigCone_dEta),
2577  get(dnn::signalChargedHadrCands_sum_innerSigCone_dPhi),
2578  get(dnn::signalChargedHadrCands_sum_innerSigCone_mass),
2579  get(dnn::signalChargedHadrCands_sum_outerSigCone_pt),
2580  get(dnn::signalChargedHadrCands_sum_outerSigCone_dEta),
2581  get(dnn::signalChargedHadrCands_sum_outerSigCone_dPhi),
2582  get(dnn::signalChargedHadrCands_sum_outerSigCone_mass),
2583  get(dnn::signalChargedHadrCands_nTotal_innerSigCone),
2584  get(dnn::signalChargedHadrCands_nTotal_outerSigCone));
2585 
2586  LorentzVectorXYZ signalNeutrHadrCands_sumIn, signalNeutrHadrCands_sumOut;
2588  tau.signalNeutrHadrCands(),
2589  signalNeutrHadrCands_sumIn,
2590  signalNeutrHadrCands_sumOut,
2591  get(dnn::signalNeutrHadrCands_sum_innerSigCone_pt),
2592  get(dnn::signalNeutrHadrCands_sum_innerSigCone_dEta),
2593  get(dnn::signalNeutrHadrCands_sum_innerSigCone_dPhi),
2594  get(dnn::signalNeutrHadrCands_sum_innerSigCone_mass),
2595  get(dnn::signalNeutrHadrCands_sum_outerSigCone_pt),
2596  get(dnn::signalNeutrHadrCands_sum_outerSigCone_dEta),
2597  get(dnn::signalNeutrHadrCands_sum_outerSigCone_dPhi),
2598  get(dnn::signalNeutrHadrCands_sum_outerSigCone_mass),
2599  get(dnn::signalNeutrHadrCands_nTotal_innerSigCone),
2600  get(dnn::signalNeutrHadrCands_nTotal_outerSigCone));
2601 
2602  LorentzVectorXYZ signalGammaCands_sumIn, signalGammaCands_sumOut;
2604  tau.signalGammaCands(),
2605  signalGammaCands_sumIn,
2606  signalGammaCands_sumOut,
2607  get(dnn::signalGammaCands_sum_innerSigCone_pt),
2608  get(dnn::signalGammaCands_sum_innerSigCone_dEta),
2609  get(dnn::signalGammaCands_sum_innerSigCone_dPhi),
2610  get(dnn::signalGammaCands_sum_innerSigCone_mass),
2611  get(dnn::signalGammaCands_sum_outerSigCone_pt),
2612  get(dnn::signalGammaCands_sum_outerSigCone_dEta),
2613  get(dnn::signalGammaCands_sum_outerSigCone_dPhi),
2614  get(dnn::signalGammaCands_sum_outerSigCone_mass),
2615  get(dnn::signalGammaCands_nTotal_innerSigCone),
2616  get(dnn::signalGammaCands_nTotal_outerSigCone));
2617 
2618  LorentzVectorXYZ isolationChargedHadrCands_sum;
2620  tau.isolationChargedHadrCands(),
2621  isolationChargedHadrCands_sum,
2622  get(dnn::isolationChargedHadrCands_sum_pt),
2623  get(dnn::isolationChargedHadrCands_sum_dEta),
2624  get(dnn::isolationChargedHadrCands_sum_dPhi),
2625  get(dnn::isolationChargedHadrCands_sum_mass),
2626  get(dnn::isolationChargedHadrCands_nTotal));
2627 
2628  LorentzVectorXYZ isolationNeutrHadrCands_sum;
2630  tau.isolationNeutrHadrCands(),
2631  isolationNeutrHadrCands_sum,
2632  get(dnn::isolationNeutrHadrCands_sum_pt),
2633  get(dnn::isolationNeutrHadrCands_sum_dEta),
2634  get(dnn::isolationNeutrHadrCands_sum_dPhi),
2635  get(dnn::isolationNeutrHadrCands_sum_mass),
2636  get(dnn::isolationNeutrHadrCands_nTotal));
2637 
2638  LorentzVectorXYZ isolationGammaCands_sum;
2640  tau.isolationGammaCands(),
2641  isolationGammaCands_sum,
2642  get(dnn::isolationGammaCands_sum_pt),
2643  get(dnn::isolationGammaCands_sum_dEta),
2644  get(dnn::isolationGammaCands_sum_dPhi),
2645  get(dnn::isolationGammaCands_sum_mass),
2646  get(dnn::isolationGammaCands_nTotal));
2647 
2648  get(dnn::tau_visMass_innerSigCone) = (signalGammaCands_sumIn + signalChargedHadrCands_sumIn).mass();
2649 
2650  if (check_all_set) {
2651  for (int var_index = 0; var_index < dnn::NumberOfInputs; ++var_index) {
2652  if (get(var_index) == default_value_for_set_check)
2653  throw cms::Exception("DeepTauId: variable with index = ") << var_index << " is not set.";
2654  }
2655  }
2656 
2657  return inputs;
2658  }
static constexpr float default_value
Definition: DeepTauId.cc:1103
unsigned int n_photons_total(const reco::PFTau &tau)
return total number of pf photon candidates with pT&gt;500 MeV, which are associated to signal ...
static void processIsolationPFComponents(const TauCastType &tau, const CandidateCollection &candidates, LorentzVectorXYZ &p4, float &pt, float &d_eta, float &d_phi, float &m, float &n)
Definition: DeepTauId.cc:2724
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)
Definition: DeepTauId.cc:2680
float pt_weighted_dr_signal(const reco::PFTau &tau, int dm)
static const pat::Electron * findMatchedElectron(const TauCastType &tau, const std::vector< pat::Electron > *electrons, double deltaR)
Definition: DeepTauId.cc:2791
static bool isInEcalCrack(double eta)
Definition: DeepTauId.cc:2785
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:2754
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
tuple muons
Definition: patZpeak.py:41
static void calculateElectronClusterVars(const pat::Electron *ele, float &elecEe, float &elecEgamma)
Definition: DeepTauId.cc:2660
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double >> LorentzVectorXYZ
Definition: DeepTauBase.h:75
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 2180 of file DeepTauId.cc.

References funct::abs(), edm::View< T >::at(), MuonSubdetId::CSC, MuonSubdetId::DT, validate-o2o-wbm::f, getValue(), getValueLinear(), getValueNorm(), PixelMapPlotter::inputs, isInEcalCrack(), dumpRecoGeometry_cfg::Muon, muonTensor_, reco::Vertex::position(), pat::Muon::PV2D, HLT_FULL_cff::rho, MuonSubdetId::RPC, relativeConstraints::station, runTauDisplay::tau_eta, and runTauDisplay::tau_pt.

2190  {
2191  namespace dnn = dnn_inputs_2017_v2::MuonBlockInputs;
2192 
2193  tensorflow::Tensor& inputs = *muonTensor_.at(is_inner);
2194 
2195  const auto& get = [&](int var_index) -> float& { return inputs.tensor<float, 4>()(idx, 0, 0, var_index); };
2196 
2197  const bool valid_index_pf_muon = cell_map.count(CellObjectType::PfCand_muon);
2198  const bool valid_index_muon = cell_map.count(CellObjectType::Muon);
2199 
2200  if (!cell_map.empty()) {
2201  get(dnn::rho) = getValueNorm(rho, 21.49f, 9.713f);
2202  get(dnn::tau_pt) = getValueLinear(tau.polarP4().pt(), 20.f, 1000.f, true);
2203  get(dnn::tau_eta) = getValueLinear(tau.polarP4().eta(), -2.3f, 2.3f, false);
2204  get(dnn::tau_inside_ecal_crack) = getValue(isInEcalCrack(tau.polarP4().eta()));
2205  }
2206  if (valid_index_pf_muon) {
2207  size_t index_pf_muon = cell_map.at(CellObjectType::PfCand_muon);
2208  const auto& muon_cand = dynamic_cast<const CandidateCastType&>(pfCands.at(index_pf_muon));
2209 
2210  get(dnn::pfCand_muon_valid) = valid_index_pf_muon;
2211  get(dnn::pfCand_muon_rel_pt) = getValueNorm(pfCands.at(index_pf_muon).polarP4().pt() / tau.polarP4().pt(),
2212  is_inner ? 0.9509f : 0.0861f,
2213  is_inner ? 0.4294f : 0.4065f);
2214  get(dnn::pfCand_muon_deta) = getValueLinear(pfCands.at(index_pf_muon).polarP4().eta() - tau.polarP4().eta(),
2215  is_inner ? -0.1f : -0.5f,
2216  is_inner ? 0.1f : 0.5f,
2217  false);
2218  get(dnn::pfCand_muon_dphi) = getValueLinear(dPhi(tau.polarP4(), pfCands.at(index_pf_muon).polarP4()),
2219  is_inner ? -0.1f : -0.5f,
2220  is_inner ? 0.1f : 0.5f,
2221  false);
2222  get(dnn::pfCand_muon_pvAssociationQuality) =
2223  getValueLinear<int>(candFunc::getPvAssocationQuality(muon_cand), 0, 7, true);
2224  get(dnn::pfCand_muon_fromPV) = getValueLinear<int>(candFunc::getFromPV(muon_cand), 0, 3, true);
2225  get(dnn::pfCand_muon_puppiWeight) = is_inner ? getValue(candFunc::getPuppiWeight(muon_cand, 0.9786588f))
2226  : getValue(candFunc::getPuppiWeight(muon_cand, 0.8132477f));
2227  get(dnn::pfCand_muon_charge) = getValue(muon_cand.charge());
2228  get(dnn::pfCand_muon_lostInnerHits) = getValue<int>(candFunc::getLostInnerHits(muon_cand, 0));
2229  get(dnn::pfCand_muon_numberOfPixelHits) =
2230  getValueLinear(candFunc::getNumberOfPixelHits(muon_cand, 0), 0, 11, true);
2231  get(dnn::pfCand_muon_vertex_dx) =
2232  getValueNorm(pfCands.at(index_pf_muon).vertex().x() - pv.position().x(), -0.0007f, 0.6869f);
2233  get(dnn::pfCand_muon_vertex_dy) =
2234  getValueNorm(pfCands.at(index_pf_muon).vertex().y() - pv.position().y(), 0.0001f, 0.6784f);
2235  get(dnn::pfCand_muon_vertex_dz) =
2236  getValueNorm(pfCands.at(index_pf_muon).vertex().z() - pv.position().z(), -0.0117f, 4.097f);
2237  get(dnn::pfCand_muon_vertex_dx_tauFL) = getValueNorm(
2238  pfCands.at(index_pf_muon).vertex().x() - pv.position().x() - tau_funcs.getFlightLength(tau, tau_index).x(),
2239  -0.0001f,
2240  0.8642f);
2241  get(dnn::pfCand_muon_vertex_dy_tauFL) = getValueNorm(
2242  pfCands.at(index_pf_muon).vertex().y() - pv.position().y() - tau_funcs.getFlightLength(tau, tau_index).y(),
2243  0.0004f,
2244  0.8561f);
2245  get(dnn::pfCand_muon_vertex_dz_tauFL) = getValueNorm(
2246  pfCands.at(index_pf_muon).vertex().z() - pv.position().z() - tau_funcs.getFlightLength(tau, tau_index).z(),
2247  -0.0118f,
2248  4.405f);
2249 
2250  const bool hasTrackDetails = candFunc::getHasTrackDetails(muon_cand);
2251  if (hasTrackDetails) {
2252  get(dnn::pfCand_muon_hasTrackDetails) = hasTrackDetails;
2253  get(dnn::pfCand_muon_dxy) = getValueNorm(candFunc::getTauDxy(muon_cand), -0.0045f, 0.9655f);
2254  get(dnn::pfCand_muon_dxy_sig) =
2255  getValueNorm(std::abs(candFunc::getTauDxy(muon_cand)) / muon_cand.dxyError(), 4.575f, 42.36f);
2256  get(dnn::pfCand_muon_dz) = getValueNorm(candFunc::getTauDz(muon_cand), -0.0117f, 4.097f);
2257  get(dnn::pfCand_muon_dz_sig) =
2258  getValueNorm(std::abs(candFunc::getTauDz(muon_cand)) / muon_cand.dzError(), 80.37f, 343.3f);
2259  get(dnn::pfCand_muon_track_chi2_ndof) = getValueNorm(
2260  candFunc::getPseudoTrack(muon_cand).chi2() / candFunc::getPseudoTrack(muon_cand).ndof(), 0.69f, 1.711f);
2261  get(dnn::pfCand_muon_track_ndof) = getValueNorm(candFunc::getPseudoTrack(muon_cand).ndof(), 17.5f, 5.11f);
2262  }
2263  }
2264  if (valid_index_muon) {
2265  size_t index_muon = cell_map.at(CellObjectType::Muon);
2266 
2267  get(dnn::muon_valid) = valid_index_muon;
2268  get(dnn::muon_rel_pt) = getValueNorm(muons->at(index_muon).polarP4().pt() / tau.polarP4().pt(),
2269  is_inner ? 0.7966f : 0.2678f,
2270  is_inner ? 3.402f : 3.592f);
2271  get(dnn::muon_deta) = getValueLinear(muons->at(index_muon).polarP4().eta() - tau.polarP4().eta(),
2272  is_inner ? -0.1f : -0.5f,
2273  is_inner ? 0.1f : 0.5f,
2274  false);
2275  get(dnn::muon_dphi) = getValueLinear(dPhi(tau.polarP4(), muons->at(index_muon).polarP4()),
2276  is_inner ? -0.1f : -0.5f,
2277  is_inner ? 0.1f : 0.5f,
2278  false);
2279  get(dnn::muon_dxy) = getValueNorm(muons->at(index_muon).dB(pat::Muon::PV2D), 0.0019f, 1.039f);
2280  get(dnn::muon_dxy_sig) =
2281  getValueNorm(std::abs(muons->at(index_muon).dB(pat::Muon::PV2D)) / muons->at(index_muon).edB(pat::Muon::PV2D),
2282  8.98f,
2283  71.17f);
2284 
2285  const bool normalizedChi2_valid =
2286  muons->at(index_muon).globalTrack().isNonnull() && muons->at(index_muon).normChi2() >= 0;
2287  if (normalizedChi2_valid) {
2288  get(dnn::muon_normalizedChi2_valid) = normalizedChi2_valid;
2289  get(dnn::muon_normalizedChi2) = getValueNorm(muons->at(index_muon).normChi2(), 21.52f, 265.8f);
2290  if (muons->at(index_muon).innerTrack().isNonnull())
2291  get(dnn::muon_numberOfValidHits) = getValueNorm(muons->at(index_muon).numberOfValidHits(), 21.84f, 10.59f);
2292  }
2293  get(dnn::muon_segmentCompatibility) = getValue(muons->at(index_muon).segmentCompatibility());
2294  get(dnn::muon_caloCompatibility) = getValue(muons->at(index_muon).caloCompatibility());
2295 
2296  const bool pfEcalEnergy_valid = muons->at(index_muon).pfEcalEnergy() >= 0;
2297  if (pfEcalEnergy_valid) {
2298  get(dnn::muon_pfEcalEnergy_valid) = pfEcalEnergy_valid;
2299  get(dnn::muon_rel_pfEcalEnergy) =
2300  getValueNorm(muons->at(index_muon).pfEcalEnergy() / muons->at(index_muon).polarP4().pt(), 0.2273f, 0.4865f);
2301  }
2302 
2303  MuonHitMatchV2 hit_match(muons->at(index_muon));
2304  static const std::map<int, std::pair<int, int>> muonMatchHitVars = {
2305  {MuonSubdetId::DT, {dnn::muon_n_matches_DT_1, dnn::muon_n_hits_DT_1}},
2306  {MuonSubdetId::CSC, {dnn::muon_n_matches_CSC_1, dnn::muon_n_hits_CSC_1}},
2307  {MuonSubdetId::RPC, {dnn::muon_n_matches_RPC_1, dnn::muon_n_hits_RPC_1}}};
2308 
2309  static const std::map<int, std::vector<float>> muonMatchVarLimits = {
2310  {MuonSubdetId::DT, {2, 2, 2, 2}}, {MuonSubdetId::CSC, {6, 2, 2, 2}}, {MuonSubdetId::RPC, {7, 6, 4, 4}}};
2311 
2312  static const std::map<int, std::vector<float>> muonHitVarLimits = {{MuonSubdetId::DT, {12, 12, 12, 8}},
2313  {MuonSubdetId::CSC, {24, 12, 12, 12}},
2314  {MuonSubdetId::RPC, {4, 4, 2, 2}}};
2315 
2316  for (int subdet : hit_match.MuonHitMatchV2::consideredSubdets()) {
2317  const auto& matchHitVar = muonMatchHitVars.at(subdet);
2318  const auto& matchLimits = muonMatchVarLimits.at(subdet);
2319  const auto& hitLimits = muonHitVarLimits.at(subdet);
2320  for (int station = MuonHitMatchV2::first_station_id; station <= MuonHitMatchV2::last_station_id; ++station) {
2321  const unsigned n_matches = hit_match.nMatches(subdet, station);
2322  const unsigned n_hits = hit_match.nHits(subdet, station);
2323  get(matchHitVar.first + station - 1) = getValueLinear(n_matches, 0, matchLimits.at(station - 1), true);
2324  get(matchHitVar.second + station - 1) = getValueLinear(n_hits, 0, hitLimits.at(station - 1), true);
2325  }
2326  }
2327  }
2328  }
static float getValueLinear(T value, float min_value, float max_value, bool positive)
Definition: DeepTauId.cc:1265
static bool isInEcalCrack(double eta)
Definition: DeepTauId.cc:2785
const Point & position() const
position
Definition: Vertex.h:127
static float getValue(T value)
Definition: DeepTauId.cc:1260
static float getValueNorm(T value, float mean, float sigma, float n_sigmas_max=5)
Definition: DeepTauId.cc:1275
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static constexpr int RPC
Definition: MuonSubdetId.h:13
tuple muons
Definition: patZpeak.py:41
const_reference at(size_type pos) const
static constexpr int DT
Definition: MuonSubdetId.h:11
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
Definition: DeepTauId.cc:2819
static constexpr int CSC
Definition: MuonSubdetId.h:12
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 1838 of file DeepTauId.cc.

References funct::abs(), calculateGottfriedJacksonAngleDifference(), disable_dxy_pca_, reco::tau::eratio(), validate-o2o-wbm::f, getValue(), getValueLinear(), getValueNorm(), PixelMapPlotter::inputs, deep_tau::DeepTauBase::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(), HLT_FULL_cff::rho, runTauDisplay::tau_eta, runTauDisplay::tau_mass, runTauDisplay::tau_phi, runTauDisplay::tau_pt, and tauBlockTensor_.

1843  {
1844  namespace dnn = dnn_inputs_2017_v2::TauBlockInputs;
1845 
1846  tensorflow::Tensor& inputs = *tauBlockTensor_;
1847  inputs.flat<float>().setZero();
1848 
1849  const auto& get = [&](int var_index) -> float& { return inputs.matrix<float>()(0, var_index); };
1850 
1851  auto leadChargedHadrCand = dynamic_cast<const CandidateCastType*>(tau.leadChargedHadrCand().get());
1852 
1853  get(dnn::rho) = getValueNorm(rho, 21.49f, 9.713f);
1854  get(dnn::tau_pt) = getValueLinear(tau.polarP4().pt(), 20.f, 1000.f, true);
1855  get(dnn::tau_eta) = getValueLinear(tau.polarP4().eta(), -2.3f, 2.3f, false);
1856  get(dnn::tau_phi) = getValueLinear(tau.polarP4().phi(), -pi, pi, false);
1857  get(dnn::tau_mass) = getValueNorm(tau.polarP4().mass(), 0.6669f, 0.6553f);
1858  get(dnn::tau_E_over_pt) = getValueLinear(tau.p4().energy() / tau.p4().pt(), 1.f, 5.2f, true);
1859  get(dnn::tau_charge) = getValue(tau.charge());
1860  get(dnn::tau_n_charged_prongs) = getValueLinear(tau.decayMode() / 5 + 1, 1, 3, true);
1861  get(dnn::tau_n_neutral_prongs) = getValueLinear(tau.decayMode() % 5, 0, 2, true);
1862  get(dnn::chargedIsoPtSum) = getValueNorm(tau_funcs.getChargedIsoPtSum(tau, tau_ref), 47.78f, 123.5f);
1863  get(dnn::chargedIsoPtSumdR03_over_dR05) =
1864  getValue(tau_funcs.getChargedIsoPtSumdR03(tau, tau_ref) / tau_funcs.getChargedIsoPtSum(tau, tau_ref));
1865  get(dnn::footprintCorrection) = getValueNorm(tau_funcs.getFootprintCorrectiondR03(tau, tau_ref), 9.029f, 26.42f);
1866  get(dnn::neutralIsoPtSum) = getValueNorm(tau_funcs.getNeutralIsoPtSum(tau, tau_ref), 57.59f, 155.3f);
1867  get(dnn::neutralIsoPtSumWeight_over_neutralIsoPtSum) =
1868  getValue(tau_funcs.getNeutralIsoPtSumWeight(tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(tau, tau_ref));
1869  get(dnn::neutralIsoPtSumWeightdR03_over_neutralIsoPtSum) =
1870  getValue(tau_funcs.getNeutralIsoPtSumdR03Weight(tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(tau, tau_ref));
1871  get(dnn::neutralIsoPtSumdR03_over_dR05) =
1872  getValue(tau_funcs.getNeutralIsoPtSumdR03(tau, tau_ref) / tau_funcs.getNeutralIsoPtSum(tau, tau_ref));
1873  get(dnn::photonPtSumOutsideSignalCone) =
1874  getValueNorm(tau_funcs.getPhotonPtSumOutsideSignalCone(tau, tau_ref), 1.731f, 6.846f);
1875  get(dnn::puCorrPtSum) = getValueNorm(tau_funcs.getPuCorrPtSum(tau, tau_ref), 22.38f, 16.34f);
1876  // The global PCA coordinates were used as inputs during the NN training, but it was decided to disable
1877  // them for the inference, because modeling of dxy_PCA in MC poorly describes the data, and x and y coordinates
1878  // in data results outside of the expected 5 std. dev. input validity range. On the other hand,
1879  // these coordinates are strongly era-dependent. Kept as comment to document what NN expects.
1880  if (!disable_dxy_pca_) {
1881  auto const pca = tau_funcs.getdxyPCA(tau, tau_index);
1882  get(dnn::tau_dxy_pca_x) = getValueNorm(pca.x(), -0.0241f, 0.0074f);
1883  get(dnn::tau_dxy_pca_y) = getValueNorm(pca.y(), 0.0675f, 0.0128f);
1884  get(dnn::tau_dxy_pca_z) = getValueNorm(pca.z(), 0.7973f, 3.456f);
1885  } else {
1886  get(dnn::tau_dxy_pca_x) = 0;
1887  get(dnn::tau_dxy_pca_y) = 0;
1888  get(dnn::tau_dxy_pca_z) = 0;
1889  }
1890  const bool tau_dxy_valid =
1891  isAbove(tau_funcs.getdxy(tau, tau_index), -10) && isAbove(tau_funcs.getdxyError(tau, tau_index), 0);
1892  if (tau_dxy_valid) {
1893  get(dnn::tau_dxy_valid) = tau_dxy_valid;
1894  get(dnn::tau_dxy) = getValueNorm(tau_funcs.getdxy(tau, tau_index), 0.0018f, 0.0085f);
1895  get(dnn::tau_dxy_sig) = getValueNorm(
1896  std::abs(tau_funcs.getdxy(tau, tau_index)) / tau_funcs.getdxyError(tau, tau_index), 2.26f, 4.191f);
1897  }
1898  const bool tau_ip3d_valid =
1899  isAbove(tau_funcs.getip3d(tau, tau_index), -10) && isAbove(tau_funcs.getip3dError(tau, tau_index), 0);
1900  if (tau_ip3d_valid) {
1901  get(dnn::tau_ip3d_valid) = tau_ip3d_valid;
1902  get(dnn::tau_ip3d) = getValueNorm(tau_funcs.getip3d(tau, tau_index), 0.0026f, 0.0114f);
1903  get(dnn::tau_ip3d_sig) = getValueNorm(
1904  std::abs(tau_funcs.getip3d(tau, tau_index)) / tau_funcs.getip3dError(tau, tau_index), 2.928f, 4.466f);
1905  }
1906  if (leadChargedHadrCand) {
1907  const bool hasTrackDetails = candFunc::getHasTrackDetails(*leadChargedHadrCand);
1908  const float tau_dz = (is_online_ && !hasTrackDetails) ? 0 : candFunc::getTauDz(*leadChargedHadrCand);
1909  get(dnn::tau_dz) = getValueNorm(tau_dz, 0.f, 0.0190f);
1910  get(dnn::tau_dz_sig_valid) = candFunc::getTauDZSigValid(*leadChargedHadrCand);
1911  const double dzError = hasTrackDetails ? leadChargedHadrCand->dzError() : -999.;
1912  get(dnn::tau_dz_sig) = getValueNorm(std::abs(tau_dz) / dzError, 4.717f, 11.78f);
1913  }
1914  get(dnn::tau_flightLength_x) = getValueNorm(tau_funcs.getFlightLength(tau, tau_index).x(), -0.0003f, 0.7362f);
1915  get(dnn::tau_flightLength_y) = getValueNorm(tau_funcs.getFlightLength(tau, tau_index).y(), -0.0009f, 0.7354f);
1916  get(dnn::tau_flightLength_z) = getValueNorm(tau_funcs.getFlightLength(tau, tau_index).z(), -0.0022f, 1.993f);
1917  get(dnn::tau_flightLength_sig) = 0.55756444; //This value is set due to a bug in the training
1918  get(dnn::tau_pt_weighted_deta_strip) =
1919  getValueLinear(reco::tau::pt_weighted_deta_strip(tau, tau.decayMode()), 0, 1, true);
1920 
1921  get(dnn::tau_pt_weighted_dphi_strip) =
1922  getValueLinear(reco::tau::pt_weighted_dphi_strip(tau, tau.decayMode()), 0, 1, true);
1923  get(dnn::tau_pt_weighted_dr_signal) =
1924  getValueNorm(reco::tau::pt_weighted_dr_signal(tau, tau.decayMode()), 0.0052f, 0.01433f);
1925  get(dnn::tau_pt_weighted_dr_iso) = getValueLinear(reco::tau::pt_weighted_dr_iso(tau, tau.decayMode()), 0, 1, true);
1926  get(dnn::tau_leadingTrackNormChi2) = getValueNorm(tau_funcs.getLeadingTrackNormChi2(tau), 1.538f, 4.401f);
1927  const auto eratio = reco::tau::eratio(tau);
1928  const bool tau_e_ratio_valid = std::isnormal(eratio) && eratio > 0.f;
1929  get(dnn::tau_e_ratio_valid) = tau_e_ratio_valid;
1930  get(dnn::tau_e_ratio) = tau_e_ratio_valid ? getValueLinear(eratio, 0, 1, true) : 0.f;
1931  const double gj_angle_diff = calculateGottfriedJacksonAngleDifference(tau, tau_index, tau_funcs);
1932  const bool tau_gj_angle_diff_valid = (std::isnormal(gj_angle_diff) || gj_angle_diff == 0) && gj_angle_diff >= 0;
1933  get(dnn::tau_gj_angle_diff_valid) = tau_gj_angle_diff_valid;
1934  get(dnn::tau_gj_angle_diff) = tau_gj_angle_diff_valid ? getValueLinear(gj_angle_diff, 0, pi, true) : 0;
1935  get(dnn::tau_n_photons) = getValueNorm(reco::tau::n_photons_total(tau), 2.95f, 3.927f);
1936  get(dnn::tau_emFraction) = getValueLinear(tau_funcs.getEmFraction(tau), -1, 1, false);
1937 
1938  get(dnn::tau_inside_ecal_crack) = getValue(isInEcalCrack(tau.p4().eta()));
1939  get(dnn::leadChargedCand_etaAtEcalEntrance_minus_tau_eta) =
1940  getValueNorm(tau_funcs.getEtaAtEcalEntrance(tau) - tau.p4().eta(), 0.0042f, 0.0323f);
1941  }
unsigned int n_photons_total(const reco::PFTau &tau)
return total number of pf photon candidates with pT&gt;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:2815
static float getValueLinear(T value, float min_value, float max_value, bool positive)
Definition: DeepTauId.cc:1265
static bool isAbove(double value, double min)
Definition: DeepTauId.cc:1281
static bool isInEcalCrack(double eta)
Definition: DeepTauId.cc:2785
static constexpr float pi
Definition: DeepTauId.cc:1257
static float getValue(T value)
Definition: DeepTauId.cc:1260
float pt_weighted_deta_strip(const reco::PFTau &tau, int dm)
static float getValueNorm(T value, float mean, float sigma, float n_sigmas_max=5)
Definition: DeepTauId.cc:1275
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:2754
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
std::unique_ptr< tensorflow::Tensor > tauBlockTensor_
Definition: DeepTauId.cc:2818
static void DeepTauId::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
inlinestatic

Definition at line 1147 of file DeepTauId.cc.

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

1147  {
1149  desc.add<edm::InputTag>("electrons", edm::InputTag("slimmedElectrons"));
1150  desc.add<edm::InputTag>("muons", edm::InputTag("slimmedMuons"));
1151  desc.add<edm::InputTag>("taus", edm::InputTag("slimmedTaus"));
1152  desc.add<edm::InputTag>("pfcands", edm::InputTag("packedPFCandidates"));
1153  desc.add<edm::InputTag>("vertices", edm::InputTag("offlineSlimmedPrimaryVertices"));
1154  desc.add<edm::InputTag>("rho", edm::InputTag("fixedGridRhoAll"));
1155  desc.add<std::vector<std::string>>("graph_file",
1156  {"RecoTauTag/TrainingFiles/data/DeepTauId/deepTau_2017v2p6_e6.pb"});
1157  desc.add<bool>("mem_mapped", false);
1158  desc.add<unsigned>("version", 2);
1159  desc.add<int>("debug_level", 0);
1160  desc.add<bool>("disable_dxy_pca", false);
1161  desc.add<bool>("disable_hcalFraction_workaround", false);
1162  desc.add<bool>("disable_CellIndex_workaround", false);
1163  desc.add<bool>("save_inputs", false);
1164  desc.add<bool>("is_online", false);
1165 
1166  desc.add<std::vector<std::string>>("VSeWP", {"-1."});
1167  desc.add<std::vector<std::string>>("VSmuWP", {"-1."});
1168  desc.add<std::vector<std::string>>("VSjetWP", {"-1."});
1169 
1170  desc.addUntracked<edm::InputTag>("basicTauDiscriminators", edm::InputTag("basicTauDiscriminators"));
1171  desc.addUntracked<edm::InputTag>("basicTauDiscriminatorsdR03", edm::InputTag("basicTauDiscriminatorsdR03"));
1172  desc.add<edm::InputTag>("pfTauTransverseImpactParameters", edm::InputTag("hpsPFTauTransverseImpactParameters"));
1173 
1174  {
1175  edm::ParameterSetDescription pset_Prediscriminants;
1176  pset_Prediscriminants.add<std::string>("BooleanOperator", "and");
1177  {
1179  psd1.add<double>("cut");
1180  psd1.add<edm::InputTag>("Producer");
1181  pset_Prediscriminants.addOptional<edm::ParameterSetDescription>("decayMode", psd1);
1182  }
1183  desc.add<edm::ParameterSetDescription>("Prediscriminants", pset_Prediscriminants);
1184  }
1185 
1186  descriptions.add("DeepTau", desc);
1187  }
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
template<typename Collection , typename TauCastType >
void DeepTauId::fillGrids ( const TauCastType &  tau,
const Collection &  objects,
CellGrid &  inner_grid,
CellGrid &  outer_grid 
)
inlineprivate

Definition at line 1685 of file DeepTauId.cc.

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

Referenced by getPredictionsV2().

1685  {
1686  static constexpr double outer_dR2 = 0.25; //0.5^2
1687  const double inner_radius = getInnerSignalConeRadius(tau.polarP4().pt());
1688  const double inner_dR2 = std::pow(inner_radius, 2);
1689 
1690  const auto addObject = [&](size_t n, double deta, double dphi, CellGrid& grid) {
1691  const auto& obj = objects.at(n);
1692  const CellObjectType obj_type = GetCellObjectType(obj);
1693  if (obj_type == CellObjectType::Other)
1694  return;
1695  CellIndex cell_index;
1696  if (grid.tryGetCellIndex(deta, dphi, cell_index)) {
1697  Cell& cell = grid[cell_index];
1698  auto iter = cell.find(obj_type);
1699  if (iter != cell.end()) {
1700  const auto& prev_obj = objects.at(iter->second);
1701  if (obj.polarP4().pt() > prev_obj.polarP4().pt())
1702  iter->second = n;
1703  } else {
1704  cell[obj_type] = n;
1705  }
1706  }
1707  };
1708 
1709  for (size_t n = 0; n < objects.size(); ++n) {
1710  const auto& obj = objects.at(n);
1711  const double deta = obj.polarP4().eta() - tau.polarP4().eta();
1712  const double dphi = reco::deltaPhi(obj.polarP4().phi(), tau.polarP4().phi());
1713  const double dR2 = std::pow(deta, 2) + std::pow(dphi, 2);
1714  if (dR2 < inner_dR2)
1715  addObject(n, deta, dphi, inner_grid);
1716  if (dR2 < outer_dR2)
1717  addObject(n, deta, dphi, outer_grid);
1718  }
1719  }
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
static double getInnerSignalConeRadius(double pt)
Definition: DeepTauId.cc:2746
CellObjectType
Definition: DeepTauId.cc:964
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
template<typename TauCastType >
static const pat::Electron* DeepTauId::findMatchedElectron ( const TauCastType &  tau,
const std::vector< pat::Electron > *  electrons,
double  deltaR 
)
inlinestaticprivate

Definition at line 2791 of file DeepTauId.cc.

References HLT_FULL_cff::deltaR, reco::deltaR2(), and reco::LeafCandidate::pt().

Referenced by createInputsV1().

2793  {
2794  const double dR2 = deltaR * deltaR;
2795  const pat::Electron* matched_ele = nullptr;
2796  for (const auto& ele : *electrons) {
2797  if (reco::deltaR2(tau.p4(), ele.p4()) < dR2 && (!matched_ele || matched_ele->pt() < ele.pt())) {
2798  matched_ele = &ele;
2799  }
2800  }
2801  return matched_ele;
2802  }
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
static double DeepTauId::getInnerSignalConeRadius ( double  pt)
inlinestaticprivate

Definition at line 2746 of file DeepTauId.cc.

References SiStripPI::max.

Referenced by fillGrids(), and processSignalPFComponents().

2746  {
2747  static constexpr double min_pt = 30., min_radius = 0.05, cone_opening_coef = 3.;
2748  // This is equivalent of the original formula (std::max(std::min(0.1, 3.0/pt), 0.05)
2749  return std::max(cone_opening_coef / std::max(pt, min_pt), min_radius);
2750  }
static const OutputCollection& DeepTauId::GetOutputs ( )
inlinestatic

Definition at line 1105 of file DeepTauId.cc.

References GetRecoTauVFromDQM_MC_cff::Output, and deep_tau::DeepTauBase::outputs_.

1105  {
1106  static constexpr size_t e_index = 0, mu_index = 1, tau_index = 2, jet_index = 3;
1107  static const OutputCollection outputs_ = {
1108  {"VSe", Output({tau_index}, {e_index, tau_index})},
1109  {"VSmu", Output({tau_index}, {mu_index, tau_index})},
1110  {"VSjet", Output({tau_index}, {jet_index, tau_index})},
1111  };
1112  return outputs_;
1113  }
std::map< std::string, Output > OutputCollection
Definition: DeepTauBase.h:91
OutputCollection outputs_
Definition: DeepTauBase.h:134
tensorflow::Tensor DeepTauId::getPartialPredictions ( bool  is_inner)
inlineprivate

Definition at line 1721 of file DeepTauId.cc.

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

Referenced by createConvFeatures(), and DeepTauId().

1721  {
1722  std::vector<tensorflow::Tensor> pred_vector;
1723  if (is_inner) {
1724  tensorflow::run(&(cache_->getSession("inner")),
1725  {
1726  {"input_inner_egamma", *eGammaTensor_.at(is_inner)},
1727  {"input_inner_muon", *muonTensor_.at(is_inner)},
1728  {"input_inner_hadrons", *hadronsTensor_.at(is_inner)},
1729  },
1730  {"inner_all_dropout_4/Identity"},
1731  &pred_vector);
1732  } else {
1733  tensorflow::run(&(cache_->getSession("outer")),
1734  {
1735  {"input_outer_egamma", *eGammaTensor_.at(is_inner)},
1736  {"input_outer_muon", *muonTensor_.at(is_inner)},
1737  {"input_outer_hadrons", *hadronsTensor_.at(is_inner)},
1738  },
1739  {"outer_all_dropout_4/Identity"},
1740  &pred_vector);
1741  }
1742  return pred_vector.at(0);
1743  }
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
Definition: DeepTauId.cc:2819
const DeepTauCache * cache_
Definition: DeepTauBase.h:135
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
Definition: TensorFlow.cc:213
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
Definition: DeepTauId.cc:2819
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
Definition: DeepTauId.cc:2819
tensorflow::Session & getSession(const std::string &name="") const
Definition: DeepTauBase.h:57
tensorflow::Tensor DeepTauId::getPredictions ( edm::Event event,
edm::Handle< TauCollection taus 
)
inlineoverrideprivatevirtual

Implements deep_tau::DeepTauBase.

Definition at line 1423 of file DeepTauId.cc.

References deep_tau::DeepTauBase::andPrediscriminants_, basicDiscrdR03IndexMap_, basicDiscrIndexMap_, HLT_FULL_cff::basicTauDiscriminators, basicTauDiscriminators_inputToken_, HLT_FULL_cff::basicTauDiscriminatorsdR03, basicTauDiscriminatorsdR03_inputToken_, discrIndicesMapped_, electrons_token_, Exception, validate-o2o-wbm::f, edm::ValueMap< T >::get(), deep_tau::DeepTauBase::is_online_, isotrackApplyRegressor::k, matchDiscriminatorIndices(), muons_token_, deep_tau::NumberOfOutputs, deep_tau::DeepTauBase::patPrediscriminants_, deep_tau::DeepTauBase::pfcandToken_, HLT_FULL_cff::pfTauTransverseImpactParameters, pfTauTransverseImpactParameters_token_, deep_tau::DeepTauBase::recoPrediscriminants_, deep_tau::DeepTauBase::requiredBasicDiscriminators_, deep_tau::DeepTauBase::requiredBasicDiscriminatorsdR03_, rho, rho_token_, version_, beam_dqm_sourceclient-live_cfg::vertices, and deep_tau::DeepTauBase::vtxToken_.

1423  {
1424  // Empty dummy vectors
1425  const std::vector<pat::Electron> electron_collection_default;
1426  const std::vector<pat::Muon> muon_collection_default;
1427  const reco::TauDiscriminatorContainer basicTauDiscriminators_default;
1428  const reco::TauDiscriminatorContainer basicTauDiscriminatorsdR03_default;
1430  pfTauTransverseImpactParameters_default;
1431 
1432  const std::vector<pat::Electron>* electron_collection;
1433  const std::vector<pat::Muon>* muon_collection;
1438 
1439  if (!is_online_) {
1440  electron_collection = &event.get(electrons_token_);
1441  muon_collection = &event.get(muons_token_);
1442  pfTauTransverseImpactParameters = &pfTauTransverseImpactParameters_default;
1443  basicTauDiscriminators = &basicTauDiscriminators_default;
1444  basicTauDiscriminatorsdR03 = &basicTauDiscriminatorsdR03_default;
1445  } else {
1446  electron_collection = &electron_collection_default;
1447  muon_collection = &muon_collection_default;
1448  pfTauTransverseImpactParameters = &event.get(pfTauTransverseImpactParameters_token_);
1449  basicTauDiscriminators = &event.get(basicTauDiscriminators_inputToken_);
1450  basicTauDiscriminatorsdR03 = &event.get(basicTauDiscriminatorsdR03_inputToken_);
1451 
1452  // Get indices for discriminators
1453  if (!discrIndicesMapped_) {
1458  discrIndicesMapped_ = true;
1459  }
1460  }
1461 
1462  TauFunc tauIDs = {basicTauDiscriminators,
1467 
1469  event.getByToken(pfcandToken_, pfCands);
1470 
1472  event.getByToken(vtxToken_, vertices);
1473 
1475  event.getByToken(rho_token_, rho);
1476 
1477  tensorflow::Tensor predictions(tensorflow::DT_FLOAT, {static_cast<int>(taus->size()), deep_tau::NumberOfOutputs});
1478 
1479  for (size_t tau_index = 0; tau_index < taus->size(); ++tau_index) {
1480  const edm::RefToBase<reco::BaseTau> tauRef = taus->refAt(tau_index);
1481 
1482  std::vector<tensorflow::Tensor> pred_vector;
1483 
1484  bool passesPrediscriminants;
1485  if (is_online_) {
1486  passesPrediscriminants = tauIDs.passPrediscriminants<std::vector<TauDiscInfo<reco::PFTauDiscriminator>>>(
1488  } else {
1489  passesPrediscriminants = tauIDs.passPrediscriminants<std::vector<TauDiscInfo<pat::PATTauDiscriminator>>>(
1491  }
1492 
1493  if (passesPrediscriminants) {
1494  if (version_ == 1) {
1495  if (is_online_)
1496  getPredictionsV1<reco::PFCandidate, reco::PFTau>(
1497  taus->at(tau_index), tau_index, tauRef, electron_collection, muon_collection, pred_vector, tauIDs);
1498  else
1499  getPredictionsV1<pat::PackedCandidate, pat::Tau>(
1500  taus->at(tau_index), tau_index, tauRef, electron_collection, muon_collection, pred_vector, tauIDs);
1501  } else if (version_ == 2) {
1502  if (is_online_) {
1503  getPredictionsV2<reco::PFCandidate, reco::PFTau>(taus->at(tau_index),
1504  tau_index,
1505  tauRef,
1506  electron_collection,
1507  muon_collection,
1508  *pfCands,
1509  vertices->at(0),
1510  *rho,
1511  pred_vector,
1512  tauIDs);
1513  } else
1514  getPredictionsV2<pat::PackedCandidate, pat::Tau>(taus->at(tau_index),
1515  tau_index,
1516  tauRef,
1517  electron_collection,
1518  muon_collection,
1519  *pfCands,
1520  vertices->at(0),
1521  *rho,
1522  pred_vector,
1523  tauIDs);
1524  } else {
1525  throw cms::Exception("DeepTauId") << "version " << version_ << " is not supported.";
1526  }
1527 
1528  for (int k = 0; k < deep_tau::NumberOfOutputs; ++k) {
1529  const float pred = pred_vector[0].flat<float>()(k);
1530  if (!(pred >= 0 && pred <= 1))
1531  throw cms::Exception("DeepTauId")
1532  << "invalid prediction = " << pred << " for tau_index = " << tau_index << ", pred_index = " << k;
1533  predictions.matrix<float>()(tau_index, k) = pred;
1534  }
1535  } else {
1536  // This else statement was added as a part of the DeepTau@HLT development. It does not affect the current state
1537  // of offline DeepTauId code as there the preselection is not used (it was added in the DeepTau@HLT). It returns
1538  // default values for deepTau score if the preselection failed. Before this statement the values given for this tau
1539  // were random. k == 2 corresponds to the tau score and all other k values to e, mu and jets. By defining in this way
1540  // the final score is -1.
1541  for (int k = 0; k < deep_tau::NumberOfOutputs; ++k) {
1542  predictions.matrix<float>()(tau_index, k) = (k == 2) ? -1.f : 2.f;
1543  }
1544  }
1545  }
1546  return predictions;
1547  }
std::map< BasicDiscriminator, size_t > basicDiscrdR03IndexMap_
Definition: DeepTauId.cc:2829
std::map< BasicDiscriminator, size_t > basicDiscrIndexMap_
Definition: DeepTauId.cc:2828
const unsigned version_
Definition: DeepTauId.cc:2813
static const std::vector< BasicDiscriminator > requiredBasicDiscriminatorsdR03_
Definition: DeepTauBase.h:139
const std::map< BasicDiscriminator, size_t > matchDiscriminatorIndices(edm::Event &event, edm::EDGetTokenT< reco::TauDiscriminatorContainer > discriminatorContainerToken, std::vector< BasicDiscriminator > requiredDiscr)
Definition: DeepTauId.cc:1115
static const std::vector< BasicDiscriminator > requiredBasicDiscriminators_
Definition: DeepTauBase.h:138
const_reference_type get(ProductID id, size_t idx) const
Definition: ValueMap.h:144
edm::EDGetTokenT< edm::AssociationVector< reco::PFTauRefProd, std::vector< reco::PFTauTransverseImpactParameterRef > > > pfTauTransverseImpactParameters_token_
Definition: DeepTauId.cc:2811
bool discrIndicesMapped_
Definition: DeepTauId.cc:2827
uint8_t andPrediscriminants_
Definition: DeepTauBase.h:111
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminators_inputToken_
Definition: DeepTauId.cc:2808
tuple pfTauTransverseImpactParameters
edm::EDGetTokenT< reco::TauDiscriminatorContainer > basicTauDiscriminatorsdR03_inputToken_
Definition: DeepTauId.cc:2809
std::vector< TauDiscInfo< pat::PATTauDiscriminator > > patPrediscriminants_
Definition: DeepTauBase.h:112
tuple basicTauDiscriminators
edm::EDGetTokenT< std::vector< pat::Electron > > electrons_token_
Definition: DeepTauId.cc:2805
edm::EDGetTokenT< std::vector< pat::Muon > > muons_token_
Definition: DeepTauId.cc:2806
tuple basicTauDiscriminatorsdR03
edm::EDGetTokenT< double > rho_token_
Definition: DeepTauId.cc:2807
edm::EDGetTokenT< CandidateCollection > pfcandToken_
Definition: DeepTauBase.h:130
std::vector< TauDiscInfo< reco::PFTauDiscriminator > > recoPrediscriminants_
Definition: DeepTauBase.h:113
constexpr int NumberOfOutputs
Definition: DeepTauId.cc:19
edm::EDGetTokenT< reco::VertexCollection > vtxToken_
Definition: DeepTauBase.h:131
template<typename CandidateCastType , typename TauCastType >
void DeepTauId::getPredictionsV1 ( 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,
std::vector< tensorflow::Tensor > &  pred_vector,
TauFunc  tau_funcs 
)
inlineprivate

Definition at line 1550 of file DeepTauId.cc.

References deep_tau::DeepTauBase::cache_, deep_tau::DeepTauCache::getSession(), input_layer_, PixelMapPlotter::inputs, output_layer_, tensorflow::run(), and metsig::tau.

1556  {
1557  const tensorflow::Tensor& inputs = createInputsV1<dnn_inputs_2017v1, const CandidateCastType>(
1558  dynamic_cast<const TauCastType&>(tau), tau_index, tau_ref, electrons, muons, tau_funcs);
1559  tensorflow::run(&(cache_->getSession()), {{input_layer_, inputs}}, {output_layer_}, &pred_vector);
1560  }
const DeepTauCache * cache_
Definition: DeepTauBase.h:135
std::string output_layer_
Definition: DeepTauId.cc:2812
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
Definition: TensorFlow.cc:213
std::string input_layer_
Definition: DeepTauId.cc:2812
tuple muons
Definition: patZpeak.py:41
tensorflow::Session & getSession(const std::string &name="") const
Definition: DeepTauBase.h:57
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,
std::vector< tensorflow::Tensor > &  pred_vector,
TauFunc  tau_funcs 
)
inlineprivate

Definition at line 1563 of file DeepTauId.cc.

References cms::cuda::assert(), deep_tau::DeepTauBase::cache_, checkInputs(), convTensor_, gather_cfg::cout, debug_level, disable_CellIndex_workaround_, eGammaTensor_, file_counter_, fillGrids(), deep_tau::DeepTauCache::getSession(), hadronsTensor_, is_first_block_, json_file_, label, muonTensor_, deep_tau::NumberOfOutputs, tensorflow::run(), save_inputs_, saveInputs(), AlCaHLTBitMon_QueryRunRegistry::string, metsig::tau, tauBlockTensor_, and cond::impl::to_string().

1572  {
1573  if (debug_level >= 2) {
1574  std::cout << "<DeepTauId::getPredictionsV2 (moduleLabel = " << moduleDescription().moduleLabel()
1575  << ")>:" << std::endl;
1576  std::cout << " tau: pT = " << tau.pt() << ", eta = " << tau.eta() << ", phi = " << tau.phi() << std::endl;
1577  }
1578  CellGrid inner_grid(dnn_inputs_2017_v2::number_of_inner_cell,
1579  dnn_inputs_2017_v2::number_of_inner_cell,
1580  0.02,
1581  0.02,
1583  CellGrid outer_grid(dnn_inputs_2017_v2::number_of_outer_cell,
1584  dnn_inputs_2017_v2::number_of_outer_cell,
1585  0.05,
1586  0.05,
1588  fillGrids(dynamic_cast<const TauCastType&>(tau), *electrons, inner_grid, outer_grid);
1589  fillGrids(dynamic_cast<const TauCastType&>(tau), *muons, inner_grid, outer_grid);
1590  fillGrids(dynamic_cast<const TauCastType&>(tau), pfCands, inner_grid, outer_grid);
1591 
1592  createTauBlockInputs<CandidateCastType>(
1593  dynamic_cast<const TauCastType&>(tau), tau_index, tau_ref, pv, rho, tau_funcs);
1594  using namespace dnn_inputs_2017_v2;
1595  checkInputs(*tauBlockTensor_, "input_tau", TauBlockInputs::NumberOfInputs);
1596  createConvFeatures<CandidateCastType>(dynamic_cast<const TauCastType&>(tau),
1597  tau_index,
1598  tau_ref,
1599  pv,
1600  rho,
1601  electrons,
1602  muons,
1603  pfCands,
1604  inner_grid,
1605  tau_funcs,
1606  true);
1607  checkInputs(*eGammaTensor_[true], "input_inner_egamma", EgammaBlockInputs::NumberOfInputs, &inner_grid);
1608  checkInputs(*muonTensor_[true], "input_inner_muon", MuonBlockInputs::NumberOfInputs, &inner_grid);
1609  checkInputs(*hadronsTensor_[true], "input_inner_hadrons", HadronBlockInputs::NumberOfInputs, &inner_grid);
1610  createConvFeatures<CandidateCastType>(dynamic_cast<const TauCastType&>(tau),
1611  tau_index,
1612  tau_ref,
1613  pv,
1614  rho,
1615  electrons,
1616  muons,
1617  pfCands,
1618  outer_grid,
1619  tau_funcs,
1620  false);
1621  checkInputs(*eGammaTensor_[false], "input_outer_egamma", EgammaBlockInputs::NumberOfInputs, &outer_grid);
1622  checkInputs(*muonTensor_[false], "input_outer_muon", MuonBlockInputs::NumberOfInputs, &outer_grid);
1623  checkInputs(*hadronsTensor_[false], "input_outer_hadrons", HadronBlockInputs::NumberOfInputs, &outer_grid);
1624 
1625  if (save_inputs_) {
1626  std::string json_file_name = "DeepTauId_" + std::to_string(file_counter_) + ".json";
1627  json_file_ = new std::ofstream(json_file_name.data());
1628  is_first_block_ = true;
1629  (*json_file_) << "{";
1630  saveInputs(*tauBlockTensor_, "input_tau", dnn_inputs_2017_v2::TauBlockInputs::NumberOfInputs);
1631  saveInputs(*eGammaTensor_[true],
1632  "input_inner_egamma",
1633  dnn_inputs_2017_v2::EgammaBlockInputs::NumberOfInputs,
1634  &inner_grid);
1635  saveInputs(
1636  *muonTensor_[true], "input_inner_muon", dnn_inputs_2017_v2::MuonBlockInputs::NumberOfInputs, &inner_grid);
1637  saveInputs(*hadronsTensor_[true],
1638  "input_inner_hadrons",
1639  dnn_inputs_2017_v2::HadronBlockInputs::NumberOfInputs,
1640  &inner_grid);
1641  saveInputs(*eGammaTensor_[false],
1642  "input_outer_egamma",
1643  dnn_inputs_2017_v2::EgammaBlockInputs::NumberOfInputs,
1644  &outer_grid);
1645  saveInputs(
1646  *muonTensor_[false], "input_outer_muon", dnn_inputs_2017_v2::MuonBlockInputs::NumberOfInputs, &outer_grid);
1647  saveInputs(*hadronsTensor_[false],
1648  "input_outer_hadrons",
1649  dnn_inputs_2017_v2::HadronBlockInputs::NumberOfInputs,
1650  &outer_grid);
1651  (*json_file_) << "}";
1652  delete json_file_;
1653  ++file_counter_;
1654  }
1655 
1656  tensorflow::run(&(cache_->getSession("core")),
1657  {{"input_tau", *tauBlockTensor_},
1658  {"input_inner", *convTensor_.at(true)},
1659  {"input_outer", *convTensor_.at(false)}},
1660  {"main_output/Softmax"},
1661  &pred_vector);
1662  if (debug_level >= 1) {
1663  std::cout << "output = { ";
1664  for (int idx = 0; idx < deep_tau::NumberOfOutputs; ++idx) {
1665  if (idx > 0)
1666  std::cout << ", ";
1668  if (idx == 0)
1669  label = "e";
1670  else if (idx == 1)
1671  label = "mu";
1672  else if (idx == 2)
1673  label = "tau";
1674  else if (idx == 3)
1675  label = "jet";
1676  else
1677  assert(0);
1678  std::cout << label << " = " << pred_vector[0].flat<float>()(idx);
1679  }
1680  std::cout << " }" << std::endl;
1681  }
1682  }
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > hadronsTensor_
Definition: DeepTauId.cc:2819
void checkInputs(const tensorflow::Tensor &inputs, const std::string &block_name, int n_inputs, const CellGrid *grid=nullptr) const
Definition: DeepTauId.cc:1306
void fillGrids(const TauCastType &tau, const Collection &objects, CellGrid &inner_grid, CellGrid &outer_grid)
Definition: DeepTauId.cc:1685
const bool save_inputs_
Definition: DeepTauId.cc:2821
int file_counter_
Definition: DeepTauId.cc:2824
const DeepTauCache * cache_
Definition: DeepTauBase.h:135
std::ofstream * json_file_
Definition: DeepTauId.cc:2822
std::string to_string(const V &value)
Definition: OMSAccess.h:71
assert(be >=bs)
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > convTensor_
Definition: DeepTauId.cc:2819
char const * label
bool is_first_block_
Definition: DeepTauId.cc:2823
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
Definition: TensorFlow.cc:213
void saveInputs(const tensorflow::Tensor &inputs, const std::string &block_name, int n_inputs, const CellGrid *grid=nullptr)
Definition: DeepTauId.cc:1362
const bool disable_CellIndex_workaround_
Definition: DeepTauId.cc:2817
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > eGammaTensor_
Definition: DeepTauId.cc:2819
tuple muons
Definition: patZpeak.py:41
tuple cout
Definition: gather_cfg.py:144
const int debug_level
Definition: DeepTauId.cc:2814
std::array< std::unique_ptr< tensorflow::Tensor >, 2 > muonTensor_
Definition: DeepTauId.cc:2819
constexpr int NumberOfOutputs
Definition: DeepTauId.cc:19
std::unique_ptr< tensorflow::Tensor > tauBlockTensor_
Definition: DeepTauId.cc:2818
tensorflow::Session & getSession(const std::string &name="") const
Definition: DeepTauBase.h:57
template<typename T >
static float DeepTauId::getValue ( T  value)
inlinestaticprivate

Definition at line 1260 of file DeepTauId.cc.

References validate-o2o-wbm::f, and relativeConstraints::value.

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

1260  {
1261  return std::isnormal(value) ? static_cast<float>(value) : 0.f;
1262  }
template<typename T >
static float DeepTauId::getValueLinear ( T  value,
float  min_value,
float  max_value,
bool  positive 
)
inlinestaticprivate

Definition at line 1265 of file DeepTauId.cc.

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

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

1265  {
1266  const float fixed_value = getValue(value);
1267  const float clamped_value = std::clamp(fixed_value, min_value, max_value);
1268  float transformed_value = (clamped_value - min_value) / (max_value - min_value);
1269  if (!positive)
1270  transformed_value = transformed_value * 2 - 1;
1271  return transformed_value;
1272  }
const std::map< ValueQuantityType, double > min_value
static float getValue(T value)
Definition: DeepTauId.cc:1260
const std::map< ValueQuantityType, double > max_value
template<typename T >
static float DeepTauId::getValueNorm ( T  value,
float  mean,
float  sigma,
float  n_sigmas_max = 5 
)
inlinestaticprivate

Definition at line 1275 of file DeepTauId.cc.

References getValue(), and SiStripPI::mean.

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

1275  {
1276  const float fixed_value = getValue(value);
1277  const float norm_value = (fixed_value - mean) / sigma;
1278  return std::clamp(norm_value, -n_sigmas_max, n_sigmas_max);
1279  }
static float getValue(T value)
Definition: DeepTauId.cc:1260
static void DeepTauId::globalEndJob ( const deep_tau::DeepTauCache cache_)
inlinestatic

Definition at line 1254 of file DeepTauId.cc.

1254 { return DeepTauBase::globalEndJob(cache_); }
static std::unique_ptr<deep_tau::DeepTauCache> DeepTauId::initializeGlobalCache ( const edm::ParameterSet cfg)
inlinestatic

Definition at line 1250 of file DeepTauId.cc.

1250  {
1251  return DeepTauBase::initializeGlobalCache(cfg);
1252  }
static bool DeepTauId::isAbove ( double  value,
double  min 
)
inlinestaticprivate

Definition at line 1281 of file DeepTauId.cc.

References SiStripPI::min.

Referenced by createTauBlockInputs().

1281 { return std::isnormal(value) && value > min; }
static bool DeepTauId::isInEcalCrack ( double  eta)
inlinestaticprivate

Definition at line 2785 of file DeepTauId.cc.

References funct::abs().

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

2785  {
2786  const double abs_eta = std::abs(eta);
2787  return abs_eta > 1.46 && abs_eta < 1.558;
2788  }
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const std::map<BasicDiscriminator, size_t> DeepTauId::matchDiscriminatorIndices ( edm::Event event,
edm::EDGetTokenT< reco::TauDiscriminatorContainer discriminatorContainerToken,
std::vector< BasicDiscriminator requiredDiscr 
)
inline

Definition at line 1115 of file DeepTauId.cc.

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

Referenced by getPredictions().

1118  {
1119  std::map<std::string, size_t> discrIndexMapStr;
1120  auto const aHandle = event.getHandle(discriminatorContainerToken);
1121  auto const aProv = aHandle.provenance();
1122  if (aProv == nullptr)
1123  aHandle.whyFailed()->raise();
1124  const auto& psetsFromProvenance = edm::parameterSet(aProv->stable(), event.processHistory());
1125  auto const idlist = psetsFromProvenance.getParameter<std::vector<edm::ParameterSet>>("IDdefinitions");
1126  for (size_t j = 0; j < idlist.size(); ++j) {
1127  std::string idname = idlist[j].getParameter<std::string>("IDname");
1128  if (discrIndexMapStr.count(idname)) {
1129  throw cms::Exception("DeepTauId")
1130  << "basic discriminator " << idname << " appears more than once in the input.";
1131  }
1132  discrIndexMapStr[idname] = j;
1133  }
1134 
1135  //translate to a map of <BasicDiscriminator, index> and check if all discriminators are present
1136  std::map<BasicDiscriminator, size_t> discrIndexMap;
1137  for (size_t i = 0; i < requiredDiscr.size(); i++) {
1138  if (discrIndexMapStr.find(stringFromDiscriminator_.at(requiredDiscr[i])) == discrIndexMapStr.end())
1139  throw cms::Exception("DeepTauId") << "Basic Discriminator " << stringFromDiscriminator_.at(requiredDiscr[i])
1140  << " was not provided in the config file.";
1141  else
1142  discrIndexMap[requiredDiscr[i]] = discrIndexMapStr[stringFromDiscriminator_.at(requiredDiscr[i])];
1143  }
1144  return discrIndexMap;
1145  }
ParameterSet const & parameterSet(StableProvenance const &provenance, ProcessHistory const &history)
Definition: Provenance.cc:11
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
static const std::map< BasicDiscriminator, std::string > stringFromDiscriminator_
Definition: DeepTauBase.h:137
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 2724 of file DeepTauId.cc.

References default_value, dqmiodumpmetadata::n, and reco::Candidate::p4().

Referenced by createInputsV1().

2731  {
2732  p4 = LorentzVectorXYZ(0, 0, 0, 0);
2733  n = 0;
2734 
2735  for (const auto& cand : candidates) {
2736  p4 += cand->p4();
2737  ++n;
2738  }
2739 
2740  pt = n != 0 ? p4.Pt() : default_value;
2741  d_eta = n != 0 ? dEta(p4, tau.p4()) : default_value;
2742  d_phi = n != 0 ? dPhi(p4, tau.p4()) : default_value;
2743  m = n != 0 ? p4.mass() : default_value;
2744  }
static constexpr float default_value
Definition: DeepTauId.cc:1103
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double >> LorentzVectorXYZ
Definition: DeepTauBase.h:75
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 2680 of file DeepTauId.cc.

References default_value, reco::deltaR(), getInnerSignalConeRadius(), and reco::Candidate::p4().

Referenced by createInputsV1().

2693  {
2694  p4_inner = LorentzVectorXYZ(0, 0, 0, 0);
2695  p4_outer = LorentzVectorXYZ(0, 0, 0, 0);
2696  n_inner = 0;
2697  n_outer = 0;
2698 
2699  const double innerSigCone_radius = getInnerSignalConeRadius(tau.pt());
2700  for (const auto& cand : candidates) {
2701  const double dR = reco::deltaR(cand->p4(), tau.leadChargedHadrCand()->p4());
2702  const bool isInside_innerSigCone = dR < innerSigCone_radius;
2703  if (isInside_innerSigCone) {
2704  p4_inner += cand->p4();
2705  ++n_inner;
2706  } else {
2707  p4_outer += cand->p4();
2708  ++n_outer;
2709  }
2710  }
2711 
2712  pt_inner = n_inner != 0 ? p4_inner.Pt() : default_value;
2713  dEta_inner = n_inner != 0 ? dEta(p4_inner, tau.p4()) : default_value;
2714  dPhi_inner = n_inner != 0 ? dPhi(p4_inner, tau.p4()) : default_value;
2715  m_inner = n_inner != 0 ? p4_inner.mass() : default_value;
2716 
2717  pt_outer = n_outer != 0 ? p4_outer.Pt() : default_value;
2718  dEta_outer = n_outer != 0 ? dEta(p4_outer, tau.p4()) : default_value;
2719  dPhi_outer = n_outer != 0 ? dPhi(p4_outer, tau.p4()) : default_value;
2720  m_outer = n_outer != 0 ? p4_outer.mass() : default_value;
2721  }
static constexpr float default_value
Definition: DeepTauId.cc:1103
static double getInnerSignalConeRadius(double pt)
Definition: DeepTauId.cc:2746
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: DeepTauBase.h:75
void DeepTauId::saveInputs ( const tensorflow::Tensor &  inputs,
const std::string &  block_name,
int  n_inputs,
const CellGrid *  grid = nullptr 
)
inlineprivate

Definition at line 1362 of file DeepTauId.cc.

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

Referenced by getPredictionsV2().

1365  {
1366  if (debug_level >= 1) {
1367  std::cout << "<saveInputs>: block_name = " << block_name << std::endl;
1368  }
1369  if (!is_first_block_)
1370  (*json_file_) << ", ";
1371  (*json_file_) << "\"" << block_name << "\": [";
1372  if (block_name == "input_tau") {
1373  for (int input_index = 0; input_index < n_inputs; ++input_index) {
1374  float input = inputs.matrix<float>()(0, input_index);
1375  if (input_index != 0)
1376  (*json_file_) << ", ";
1377  (*json_file_) << input;
1378  }
1379  } else {
1380  assert(grid);
1381  int n_eta, n_phi;
1382  if (block_name.find("input_inner") != std::string::npos) {
1383  n_eta = 5;
1384  n_phi = 5;
1385  } else if (block_name.find("input_outer") != std::string::npos) {
1386  n_eta = 10;
1387  n_phi = 10;
1388  } else
1389  assert(0);
1390  int eta_phi_index = 0;
1391  for (int eta = -n_eta; eta <= n_eta; ++eta) {
1392  if (eta != -n_eta)
1393  (*json_file_) << ", ";
1394  (*json_file_) << "[";
1395  for (int phi = -n_phi; phi <= n_phi; ++phi) {
1396  if (phi != -n_phi)
1397  (*json_file_) << ", ";
1398  (*json_file_) << "[";
1399  const CellIndex cell_index{eta, phi};
1400  const auto cell_iter = grid->find(cell_index);
1401  for (int input_index = 0; input_index < n_inputs; ++input_index) {
1402  float input = 0.;
1403  if (cell_iter != grid->end()) {
1404  input = inputs.tensor<float, 4>()(eta_phi_index, 0, 0, input_index);
1405  }
1406  if (input_index != 0)
1407  (*json_file_) << ", ";
1408  (*json_file_) << input;
1409  }
1410  if (cell_iter != grid->end()) {
1411  eta_phi_index += 1;
1412  }
1413  (*json_file_) << "]";
1414  }
1415  (*json_file_) << "]";
1416  }
1417  }
1418  (*json_file_) << "]";
1419  is_first_block_ = false;
1420  }
assert(be >=bs)
static std::string const input
Definition: EdmProvDump.cc:47
bool is_first_block_
Definition: DeepTauId.cc:2823
tuple cout
Definition: gather_cfg.py:144
const int debug_level
Definition: DeepTauId.cc:2814
void DeepTauId::setCellConvFeatures ( tensorflow::Tensor &  convTensor,
const tensorflow::Tensor &  features,
unsigned  batch_idx,
int  eta_index,
int  phi_index 
)
inlineprivate

Definition at line 1827 of file DeepTauId.cc.

References dqmiodumpmetadata::n.

Referenced by createConvFeatures(), and DeepTauId().

1831  {
1832  for (int n = 0; n < dnn_inputs_2017_v2::number_of_conv_features; ++n) {
1833  convTensor.tensor<float, 4>()(0, eta_index, phi_index, n) = features.tensor<float, 4>()(batch_idx, 0, 0, n);
1834  }
1835  }
std::vector< float > features(const reco::PreId &ecal, const reco::PreId &hcal, double rho, const reco::BeamSpot &spot, noZS::EcalClusterLazyTools &ecalTools)

Member Data Documentation

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

Definition at line 2829 of file DeepTauId.cc.

Referenced by getPredictions().

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

Definition at line 2828 of file DeepTauId.cc.

Referenced by getPredictions().

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

Definition at line 2808 of file DeepTauId.cc.

Referenced by getPredictions().

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

Definition at line 2809 of file DeepTauId.cc.

Referenced by getPredictions().

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

Definition at line 2819 of file DeepTauId.cc.

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

const int DeepTauId::debug_level
private

Definition at line 2814 of file DeepTauId.cc.

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

constexpr float DeepTauId::default_value = -999.
static
const bool DeepTauId::disable_CellIndex_workaround_
private

Definition at line 2817 of file DeepTauId.cc.

Referenced by getPredictionsV2().

const bool DeepTauId::disable_dxy_pca_
private

Definition at line 2815 of file DeepTauId.cc.

Referenced by createTauBlockInputs().

const bool DeepTauId::disable_hcalFraction_workaround_
private

Definition at line 2816 of file DeepTauId.cc.

Referenced by createHadronsBlockInputs().

bool DeepTauId::discrIndicesMapped_ = false
private

Definition at line 2827 of file DeepTauId.cc.

Referenced by getPredictions().

std::array<std::unique_ptr<tensorflow::Tensor>, 2> DeepTauId::eGammaTensor_
private
edm::EDGetTokenT<std::vector<pat::Electron> > DeepTauId::electrons_token_
private

Definition at line 2805 of file DeepTauId.cc.

Referenced by getPredictions().

int DeepTauId::file_counter_
private

Definition at line 2824 of file DeepTauId.cc.

Referenced by getPredictionsV2().

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

Definition at line 2812 of file DeepTauId.cc.

Referenced by DeepTauId(), and getPredictionsV1().

bool DeepTauId::is_first_block_
private

Definition at line 2823 of file DeepTauId.cc.

Referenced by getPredictionsV2(), and saveInputs().

std::ofstream* DeepTauId::json_file_
private

Definition at line 2822 of file DeepTauId.cc.

Referenced by getPredictionsV2().

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

Definition at line 2806 of file DeepTauId.cc.

Referenced by getPredictions().

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

Definition at line 2812 of file DeepTauId.cc.

Referenced by DeepTauId(), and getPredictionsV1().

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

Definition at line 2811 of file DeepTauId.cc.

Referenced by getPredictions().

constexpr float DeepTauId::pi = M_PI
staticprivate

Definition at line 1257 of file DeepTauId.cc.

Referenced by createTauBlockInputs().

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

Definition at line 2807 of file DeepTauId.cc.

Referenced by getPredictions().

const bool DeepTauId::save_inputs_
private

Definition at line 2821 of file DeepTauId.cc.

Referenced by getPredictionsV2().

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

Definition at line 2818 of file DeepTauId.cc.

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

const unsigned DeepTauId::version_
private

Definition at line 2813 of file DeepTauId.cc.

Referenced by DeepTauId(), and getPredictions().

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

Definition at line 2819 of file DeepTauId.cc.

Referenced by createConvFeatures(), and DeepTauId().