30 #include "boost/property_tree/ptree.hpp" 31 #include "boost/property_tree/json_parser.hpp" 204 edm::LogInfo(
"Initialization") <<
"Init NN models Global Cache " << std::endl;
253 EcalEtMinForClustering(iConfig.getParameter<double>(
"EcalEtMinForClustering")),
254 HcalEtMinForClustering(iConfig.getParameter<double>(
"HcalEtMinForClustering")),
255 EtMinForSeeding(iConfig.getParameter<double>(
"EtMinForSeeding")),
256 EtaRestriction(iConfig.getParameter<double>(
"EtaRestriction")),
257 CB_CE_split(iConfig.getParameter<double>(
"CB_CE_split")),
259 IdWp90_CB(iConfig.getParameter<double>(
"IdWp90_CB")),
260 IdWp95_CB(iConfig.getParameter<double>(
"IdWp95_CB")),
261 IdWp99_CB(iConfig.getParameter<double>(
"IdWp99_CB")),
263 IdWp90_CE(iConfig.getParameter<double>(
"IdWp90_CE")),
264 IdWp95_CE(iConfig.getParameter<double>(
"IdWp95_CE")),
265 IdWp99_CE(iConfig.getParameter<double>(
"IdWp99_CE")) {
272 produces<BXVector<l1t::Tau>>(
"L1NNCaloTauCollectionBXV");
292 if (
hit.towerIEta() == -1016 &&
hit.towerIPhi() == -962) {
312 <<
" TOWERS WITH towerIeta=-1016 AND towerIphi=-962" << std::endl;
333 return a.towerEt >
b.towerEt;
337 std::vector<SimpleHGCluster> AllHGClusters;
341 auto& cl3d = *cl3dIt;
346 l1t::PFCluster cluster(cl3d.pt(), cl3d.eta(), cl3d.phi(), cl3d.hOverE());
350 float pt_new = cl3d.iPt(l1t::HGCalMulticluster::EnergyInterpretation::EM);
352 cluster =
l1t::PFCluster(pt_new, cl3d.eta(), cl3d.phi(), hoe_new, isEM);
356 float had_old = cl3d.
pt() - cluster.emEt();
357 float em_new = cl3d.iPt(l1t::HGCalMulticluster::EnergyInterpretation::EM);
358 float pt_new = had_old + em_new;
359 float hoe_new = em_new > 0 ? (had_old / em_new) : -1;
360 cluster =
l1t::PFCluster(pt_new, cl3d.eta(), cl3d.phi(), hoe_new, isEM);
363 float em_new = cl3d.iPt(l1t::HGCalMulticluster::EnergyInterpretation::EM);
364 float hoe_new = em_new > 0 ? (cl3d.pt() / em_new - 1) : -1;
365 cluster =
l1t::PFCluster(cl3d.pt(), cl3d.eta(), cl3d.phi(), hoe_new, isEM);
376 HGCluster.
pt = cl3d.pt();
377 HGCluster.
eta = cl3d.eta();
378 HGCluster.
phi = cl3d.phi();
381 HGCluster.
spptot = cl3d.sigmaPhiPhiTot();
382 HGCluster.
szz = cl3d.sigmaZZ();
383 HGCluster.
srrtot = cl3d.sigmaRRTot();
384 HGCluster.
meanz = cl3d.zBarycenter();
386 AllHGClusters.push_back(HGCluster);
395 std::vector<SimpleTowerCluster> l1TowerClustersNxM_CB;
396 std::vector<SimpleTowerCluster> l1TowerClustersNxM_CE;
397 std::vector<SimpleHGCluster> HGClusters;
400 std::vector<SimpleTowerCluster> AllL1TowerClustersNxM_CE;
402 bool caloTauSeedingFinished =
false;
404 while (!caloTauSeedingFinished) {
413 l1CaloTower.stale4seed) {
421 caloTauSeedingFinished =
true;
425 clNxM.
seedIeta = l1CaloTower.towerIeta;
426 clNxM.
seedIphi = l1CaloTower.towerIphi;
427 clNxM.
seedEta = l1CaloTower.towerEta;
428 clNxM.
seedPhi = l1CaloTower.towerPhi;
429 if (l1CaloTower.isBarrel) {
433 clNxM.
rawEt += l1CaloTower.towerEt;
435 l1CaloTower.stale4seed =
true;
436 l1CaloTower.stale =
true;
451 d_Eta = l1CaloTower.towerEta - clNxM.
seedEta;
458 l1CaloTower.stale4seed =
true;
466 l1TowerClustersNxM_CB.push_back(clNxM);
468 AllL1TowerClustersNxM_CE.push_back(clNxM);
475 for (
auto& clNxM : l1TowerClustersNxM_CB) {
478 if (l1CaloTower.stale) {
488 if (l1CaloTower.isBarrel) {
489 d_iEta =
tower_dIEta(l1CaloTower.towerIeta, clNxM.seedIeta);
490 d_iPhi =
tower_dIPhi(l1CaloTower.towerIphi, clNxM.seedIphi);
494 d_Eta = l1CaloTower.towerEta - clNxM.seedEta;
497 int dieta = d_Eta / 0.0807;
498 int diphi = d_Phi / 0.0872;
505 clNxM.rawEt += l1CaloTower.towerEt;
506 clNxM.towerHits[hitIdx] = l1CaloTower;
507 l1CaloTower.stale =
true;
516 for (
auto& clNxM : AllL1TowerClustersNxM_CE) {
518 for (
auto& HGCluster : AllHGClusters) {
521 if (
matched || HGCluster.stale || HGCluster.pt < 4) {
525 float d_Eta = HGCluster.eta - clNxM.seedEta;
527 float d_R2 =
pow(d_Eta, 2) +
pow(d_Phi, 2);
530 HGCluster.stale =
true;
531 HGClusters.push_back(HGCluster);
532 l1TowerClustersNxM_CE.push_back(clNxM);
541 for (
auto& clNxM : l1TowerClustersNxM_CE) {
544 if (l1CaloTower.stale) {
554 if (l1CaloTower.isBarrel) {
555 d_iEta =
tower_dIEta(l1CaloTower.towerIeta, clNxM.seedIeta);
556 d_iPhi =
tower_dIPhi(l1CaloTower.towerIphi, clNxM.seedIphi);
560 d_Eta = l1CaloTower.towerEta - clNxM.seedEta;
563 int dieta = d_Eta / 0.0807;
564 int diphi = d_Phi / 0.0872;
571 clNxM.rawEt += l1CaloTower.towerEt;
572 clNxM.towerHits[hitIdx] = l1CaloTower;
573 l1CaloTower.stale =
true;
582 int batchSize_CB = (
int)(l1TowerClustersNxM_CB.size());
583 tensorflow::TensorShape imageShape_CB({batchSize_CB,
IEta_dim,
IPhi_dim, 2});
584 tensorflow::TensorShape positionShape_CB({batchSize_CB, 2});
585 tensorflow::Tensor TowerClusterImage_CB(tensorflow::DT_FLOAT, imageShape_CB);
586 tensorflow::Tensor TowerClusterPosition_CB(tensorflow::DT_FLOAT, positionShape_CB);
589 for (
auto& clNxM : l1TowerClustersNxM_CB) {
594 TowerClusterImage_CB.tensor<
float, 4>()(clIdx,
eta,
phi, 0) =
595 inputQuantizer(clNxM.towerHits[towerIdx].l1egTowerEt + clNxM.towerHits[towerIdx].towerEm, 0.25, 10);
596 TowerClusterImage_CB.tensor<
float, 4>()(clIdx,
eta,
phi, 1) =
601 TowerClusterPosition_CB.tensor<
float, 2>()(clIdx, 0) = clNxM.seedEta;
602 TowerClusterPosition_CB.tensor<
float, 2>()(clIdx, 1) = clNxM.seedPhi;
612 {
"TowerClusterPosition", TowerClusterPosition_CB}};
613 std::vector<tensorflow::Tensor> CNNmodel_CBoutputs;
615 CNNmodel_CBinputList,
616 {
"TauMinator_CB_conv/middleMan/concat"},
617 &CNNmodel_CBoutputs);
621 std::vector<tensorflow::Tensor> DNN_CBoutputsIdent;
624 {
"TauMinator_CB_ident/sigmoid_IDout/Sigmoid"},
625 &DNN_CBoutputsIdent);
628 std::vector<tensorflow::Tensor> DNN_CBoutputsCalib;
631 {
"TauMinator_CB_calib/LIN_DNNout/Relu"},
632 &DNN_CBoutputsCalib);
636 for (
auto& clNxM : l1TowerClustersNxM_CB) {
637 clNxM.IDscore = DNN_CBoutputsIdent[0].matrix<
float>()(0, clIdx);
638 clNxM.calibPt = DNN_CBoutputsCalib[0].matrix<
float>()(0, clIdx);
644 int batchSize_CE = (
int)(l1TowerClustersNxM_CE.size());
645 tensorflow::TensorShape imageShape_CE({batchSize_CE,
IEta_dim,
IPhi_dim, 2});
646 tensorflow::TensorShape positionShape_CE({batchSize_CE, 2});
647 tensorflow::TensorShape cl3dfeatShape_CE({batchSize_CE, 8});
648 tensorflow::Tensor TowerClusterImage_CE(tensorflow::DT_FLOAT, imageShape_CE);
649 tensorflow::Tensor TowerClusterPosition_CE(tensorflow::DT_FLOAT, positionShape_CE);
650 tensorflow::Tensor Cl3dShapeFeatures_CE(tensorflow::DT_FLOAT, cl3dfeatShape_CE);
653 for (
auto& clNxM : l1TowerClustersNxM_CE) {
661 TowerClusterImage_CE.tensor<
float, 4>()(clIdx,
eta,
phi, 0) =
662 inputQuantizer(clNxM.towerHits[towerIdx].l1egTowerEt + clNxM.towerHits[towerIdx].towerEm, 0.25, 10);
663 TowerClusterImage_CE.tensor<
float, 4>()(clIdx,
eta,
phi, 1) =
668 TowerClusterPosition_CE.tensor<
float, 2>()(clIdx, 0) = clNxM.seedEta;
669 TowerClusterPosition_CE.tensor<
float, 2>()(clIdx, 1) = clNxM.seedPhi;
672 Cl3dShapeFeatures_CE.tensor<
float, 2>()(clIdx, 1) =
676 Cl3dShapeFeatures_CE.tensor<
float, 2>()(clIdx, 4) =
679 Cl3dShapeFeatures_CE.tensor<
float, 2>()(clIdx, 6) =
681 Cl3dShapeFeatures_CE.tensor<
float, 2>()(clIdx, 7) =
692 {
"TowerClusterPosition", TowerClusterPosition_CE},
693 {
"AssociatedCl3dFeatures", Cl3dShapeFeatures_CE}};
694 std::vector<tensorflow::Tensor> CNNmodel_CEoutputs;
696 CNNmodel_CEinputList,
697 {
"TauMinator_CE_conv/middleMan/concat"},
698 &CNNmodel_CEoutputs);
702 std::vector<tensorflow::Tensor> DNN_CEoutputsIdent;
705 {
"TauMinator_CE_ident/sigmoid_IDout/Sigmoid"},
706 &DNN_CEoutputsIdent);
709 std::vector<tensorflow::Tensor> DNN_CEoutputsCalib;
712 {
"TauMinator_CE_calib/LIN_DNNout/Relu"},
713 &DNN_CEoutputsCalib);
717 for (
auto& clNxM : l1TowerClustersNxM_CE) {
718 clNxM.IDscore = DNN_CEoutputsIdent[0].matrix<
float>()(0, clIdx);
719 clNxM.calibPt = DNN_CEoutputsCalib[0].matrix<
float>()(0, clIdx);
725 for (
auto& clNxM : l1TowerClustersNxM_CB) {
753 l1Tau.setTowerIEta(clNxM.seedIeta);
754 l1Tau.setTowerIPhi(clNxM.seedIphi);
755 l1Tau.setRawEt(clNxM.rawEt);
757 L1NNCaloTauCollectionBXV->push_back(0,
l1Tau);
760 for (
auto& clNxM : l1TowerClustersNxM_CE) {
788 l1Tau.setTowerIEta(clNxM.seedIeta);
789 l1Tau.setTowerIPhi(clNxM.seedIphi);
790 l1Tau.setRawEt(clNxM.rawEt);
792 L1NNCaloTauCollectionBXV->push_back(0,
l1Tau);
796 iEvent.put(
std::move(L1NNCaloTauCollectionBXV),
"L1NNCaloTauCollectionBXV");
813 if (iEta_1 * iEta_2 > 0) {
814 return iEta_1 - iEta_2;
817 return iEta_1 - iEta_2 - 1;
819 return iEta_1 - iEta_2 + 1;
825 const float phi_step = 0.0872664;
827 return floor(
phi / phi_step) + 1;
829 return floor(
phi / phi_step) + 73;
834 const float eta_step = 0.0845;
835 return floor(
abs(
eta) / eta_step) * std::copysign(1,
eta);
839 return min(floor(inputF / LSB),
float(
pow(2, nbits) - 1)) * LSB;
843 float mean = (globalCache()->FeatScaler_CE).get_child(feature).get<
float>(
"mean");
844 float std = (globalCache()->FeatScaler_CE).get_child(feature).get<
float>(
"std");
855 edm::InputTag(
"l1tHGCalBackEndLayer2Producer",
"HGCalBackendLayer2Processor3DClustering"));
860 psd0.
add<
bool>(
"isPUFilter",
true);
867 std::vector<edm::ParameterSet> temp2;
873 temp2.push_back(temp3);
879 temp2.push_back(temp3);
885 temp2.push_back(temp3);
891 temp2.push_back(temp3);
897 temp2.push_back(temp3);
899 psd0.
addVPSet(
"variables", vpsd2, temp2);
902 "weightsFile",
"L1Trigger/Phase2L1ParticleFlow/data/hgcal_egID/Photon_Pion_vs_Neutrino_BDTweights_1116.xml.gz");
907 desc.add<
double>(
"EcalEtMinForClustering", 0.0);
908 desc.add<
double>(
"HcalEtMinForClustering", 0.0);
909 desc.add<
double>(
"EtMinForSeeding", 2.5);
910 desc.add<
double>(
"EtaRestriction", 2.4);
911 desc.add<
double>(
"CB_CE_split", 1.55);
913 desc.add<
std::string>(
"CNNmodel_CB_path",
"L1Trigger/L1CaloTrigger/data/Phase2_NNCaloTaus/v22/CNNmodel_CB.pb");
914 desc.add<
std::string>(
"DNNident_CB_path",
"L1Trigger/L1CaloTrigger/data/Phase2_NNCaloTaus/v22/DNNident_CB.pb");
915 desc.add<
std::string>(
"DNNcalib_CB_path",
"L1Trigger/L1CaloTrigger/data/Phase2_NNCaloTaus/v22/DNNcalib_CB.pb");
916 desc.add<
std::string>(
"CNNmodel_CE_path",
"L1Trigger/L1CaloTrigger/data/Phase2_NNCaloTaus/v22/CNNmodel_CE.pb");
917 desc.add<
std::string>(
"DNNident_CE_path",
"L1Trigger/L1CaloTrigger/data/Phase2_NNCaloTaus/v22/DNNident_CE.pb");
918 desc.add<
std::string>(
"DNNcalib_CE_path",
"L1Trigger/L1CaloTrigger/data/Phase2_NNCaloTaus/v22/DNNcalib_CE.pb");
919 desc.add<
std::string>(
"FeatScaler_CE_path",
"L1Trigger/L1CaloTrigger/data/Phase2_NNCaloTaus/Cl3dFeatScaler_CE.json");
921 desc.add<
double>(
"IdWp90_CB", 0.706);
922 desc.add<
double>(
"IdWp95_CB", 0.3432);
923 desc.add<
double>(
"IdWp99_CB", 0.0337);
924 desc.add<
double>(
"IdWp90_CE", 0.5711);
925 desc.add<
double>(
"IdWp95_CE", 0.2742);
926 desc.add<
double>(
"IdWp99_CE", 0.0394);
928 desc.add<
bool>(
"DEBUG",
false);
930 descriptions.
add(
"l1tNNCaloTauProducer",
desc);
edm::Handle< l1t::HGCalMulticlusterBxCollection > HGClusterHandle
boost::property_tree::ptree FeatScaler_CE
tensorflow::Session * CNNmodel_CEsession
constexpr double deltaPhi(double phi1, double phi2)
tensorflow::GraphDef * DNNident_CB
std::string DNNident_CE_path
std::string DNNcalib_CB_path
std::vector< NamedTensor > NamedTensorList
T getParameter(std::string const &) const
tensorflow::GraphDef * CNNmodel_CB
ParameterDescriptionBase * addVPSet(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
StringCutObjectSelector< l1t::HGCalMulticluster > preEmId
double pt() const final
transverse momentum
std::string fullPath() const
int tower_dIEta(int &iEta_1, int &iEta_2) const
GraphDef * loadGraphDef(const std::string &pbFile)
T const * product() const
tensorflow::Session * DNNident_CBsession
tensorflow::Session * DNNcalib_CEsession
edm::Handle< l1t::HGCalTowerBxCollection > hgcalTowersHandle
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::string CNNmodel_CB_path
std::vector< SimpleTowerHit > towerHits
tensorflow::Session * DNNident_CEsession
BXVector< HGCalTower > HGCalTowerBxCollection
int endcap_ieta(float &eta) const
tensorflow::GraphDef * DNNcalib_CE
int tower_dIPhi(int &iPhi_1, int &iPhi_2) const
std::string CNNmodel_CE_path
void addParameter(std::string const &name, T const &value)
L1NNCaloTauProducer(const edm::ParameterSet &, const NNmodels_GlobalCache *)
BXVector< HGCalMulticluster > HGCalMulticlusterBxCollection
void run(Session *session, const NamedTensorList &inputs, const std::vector< std::string > &outputNames, std::vector< Tensor > *outputs, const thread::ThreadPoolOptions &threadPoolOptions)
Abs< T >::type abs(const T &t)
tensorflow::GraphDef * CNNmodel_CE
std::string DNNident_CB_path
#define DEFINE_FWK_MODULE(type)
edm::EDGetTokenT< l1t::HGCalMulticlusterBxCollection > HGClusterToken
double HcalEtMinForClustering
ParameterDescriptionBase * add(U const &iLabel, T const &value)
double EcalEtMinForClustering
typename CacheTypes::GlobalCache GlobalCache
float inputScaler(float inputF, std::string feature)
edm::Handle< l1tp2::CaloTowerCollection > l1CaloTowerHandle
tensorflow::Session * DNNcalib_CBsession
float inputQuantizer(float inputF, float LSB, int nbits)
Session * createSession()
std::string DNNcalib_CE_path
Log< level::Info, false > LogInfo
void setLogging(const std::string &level="3")
static std::unique_ptr< NNmodels_GlobalCache > initializeGlobalCache(const edm::ParameterSet &)
void produce(edm::Event &, const edm::EventSetup &) override
tensorflow::Session * CNNmodel_CBsession
void add(std::string const &label, ParameterSetDescription const &psetDescription)
int endcap_iphi(float &phi) const
void InitHits(int N, int M)
l1tpf::HGC3DClusterEgID VsPuId
static void globalEndJob(const NNmodels_GlobalCache *)
tensorflow::GraphDef * DNNcalib_CB
edm::EDGetToken hgcalTowersToken
edm::EDGetTokenT< l1tp2::CaloTowerCollection > l1TowersToken
Log< level::Warning, false > LogWarning
float passID(l1t::HGCalMulticluster c, l1t::PFCluster &cpf)
std::string FeatScaler_CE_path
tensorflow::GraphDef * DNNident_CE
Power< A, B >::type pow(const A &a, const B &b)
math::PtEtaPhiMLorentzVector PolarLorentzVector
Lorentz vector.