File indexing completed on 2025-07-03 00:42:28
0001 #include "DataFormats/NanoAOD/interface/FlatTable.h"
0002 #include "DataFormats/TauReco/interface/PFTauTransverseImpactParameterAssociation.h"
0003 #include "DataFormats/TauReco/interface/TauDiscriminatorContainer.h"
0004 #include "FWCore/Framework/interface/Event.h"
0005 #include "FWCore/Framework/interface/Frameworkfwd.h"
0006 #include "FWCore/Framework/interface/MakerMacros.h"
0007 #include "FWCore/Framework/interface/global/EDProducer.h"
0008 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010
0011 class HLTTauTableProducer : public edm::global::EDProducer<> {
0012 public:
0013 using TauCollection = edm::View<reco::BaseTau>;
0014 using TauIPVector = edm::AssociationVector<reco::PFTauRefProd, std::vector<reco::PFTauTransverseImpactParameterRef>>;
0015 using TauDiscrMap = reco::TauDiscriminatorContainer;
0016
0017
0018 HLTTauTableProducer(const edm::ParameterSet& cfg)
0019 : tableName_(cfg.getParameter<std::string>("tableName")),
0020 skipNonExistingSrc_(cfg.getParameter<bool>("skipNonExistingSrc")),
0021 tauToken_(mayConsume<TauCollection>(cfg.getParameter<edm::InputTag>("taus"))),
0022 tauIPToken_(mayConsume<TauIPVector>(cfg.getParameter<edm::InputTag>("tauTransverseImpactParameters"))),
0023 deepTauVSeToken_(mayConsume<TauDiscrMap>(cfg.getParameter<edm::InputTag>("deepTauVSe"))),
0024 deepTauVSmuToken_(mayConsume<TauDiscrMap>(cfg.getParameter<edm::InputTag>("deepTauVSmu"))),
0025 deepTauVSjetToken_(mayConsume<TauDiscrMap>(cfg.getParameter<edm::InputTag>("deepTauVSjet"))),
0026 precision_(cfg.getParameter<int>("precision")) {
0027 produces<nanoaod::FlatTable>(tableName_);
0028 }
0029
0030 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0031 edm::ParameterSetDescription desc;
0032 desc.add<std::string>("tableName", "hltHpsPFTau")
0033 ->setComment("Table name, needs to be the same as the main Tau table");
0034 desc.add<bool>("skipNonExistingSrc", false)
0035 ->setComment("whether or not to skip producing the table on absent input product");
0036 desc.add<edm::InputTag>("taus", edm::InputTag(""));
0037 desc.add<edm::InputTag>("tauTransverseImpactParameters", edm::InputTag(""));
0038 desc.add<edm::InputTag>("deepTauVSe", edm::InputTag(""));
0039 desc.add<edm::InputTag>("deepTauVSmu", edm::InputTag(""));
0040 desc.add<edm::InputTag>("deepTauVSjet", edm::InputTag(""));
0041 desc.add<int>("precision", 7);
0042 descriptions.addWithDefaultLabel(desc);
0043 }
0044
0045 private:
0046 void produce(edm::StreamID id, edm::Event& event, const edm::EventSetup& setup) const override {
0047 const auto tausHandle = event.getHandle(tauToken_);
0048 const size_t nTaus = tausHandle.isValid() ? (*tausHandle).size() : 0;
0049
0050
0051 static constexpr float default_value = std::numeric_limits<float>::quiet_NaN();
0052
0053 std::vector<float> deepTauVSe(nTaus, default_value);
0054 std::vector<float> deepTauVSmu(nTaus, default_value);
0055 std::vector<float> deepTauVSjet(nTaus, default_value);
0056
0057
0058 std::vector<float> dxy(nTaus, default_value);
0059 std::vector<float> dxy_error(nTaus, default_value);
0060 std::vector<float> ip3d(nTaus, default_value);
0061 std::vector<float> ip3d_error(nTaus, default_value);
0062 std::vector<float> hasSecondaryVertex(nTaus, default_value);
0063 std::vector<float> flightLength_x(nTaus, default_value);
0064 std::vector<float> flightLength_y(nTaus, default_value);
0065 std::vector<float> flightLength_z(nTaus, default_value);
0066 std::vector<float> flightLengthSig(nTaus, default_value);
0067 std::vector<float> secondaryVertex_x(nTaus, default_value);
0068 std::vector<float> secondaryVertex_y(nTaus, default_value);
0069 std::vector<float> secondaryVertex_z(nTaus, default_value);
0070
0071 if (tausHandle.isValid() || !(this->skipNonExistingSrc_)) {
0072 const auto& tausProductId = tausHandle.id();
0073 const auto& tausIPHandle = event.getHandle(tauIPToken_);
0074 const auto& deepTauVSeMapHandle = event.getHandle(deepTauVSeToken_);
0075 const auto& deepTauVSmuMapHandle = event.getHandle(deepTauVSmuToken_);
0076 const auto& deepTauVSjetMapHandle = event.getHandle(deepTauVSjetToken_);
0077
0078 for (size_t tau_index = 0; tau_index < nTaus; ++tau_index) {
0079 if (deepTauVSeMapHandle.isValid() || !(this->skipNonExistingSrc_)) {
0080 deepTauVSe[tau_index] = deepTauVSeMapHandle->get(tausProductId, tau_index).rawValues.at(0);
0081 } else {
0082 edm::LogWarning("HLTTauTableProducer") << " Invalid handle for DeeTauVse score input collection";
0083 }
0084
0085 if (deepTauVSmuMapHandle.isValid() || !(this->skipNonExistingSrc_)) {
0086 deepTauVSmu[tau_index] = deepTauVSmuMapHandle->get(tausProductId, tau_index).rawValues.at(0);
0087 } else {
0088 edm::LogWarning("HLTTauTableProducer") << " Invalid handle for DeeTauVsMu score input collection";
0089 }
0090
0091 if (deepTauVSjetMapHandle.isValid() || !(this->skipNonExistingSrc_)) {
0092 deepTauVSjet[tau_index] = deepTauVSjetMapHandle->get(tausProductId, tau_index).rawValues.at(0);
0093 } else {
0094 edm::LogWarning("HLTTauTableProducer") << " Invalid handle for DeeTauVsJet score input collection";
0095 }
0096
0097 if (tausIPHandle.isValid() || !(this->skipNonExistingSrc_)) {
0098 dxy[tau_index] = tausIPHandle->value(tau_index)->dxy();
0099 dxy_error[tau_index] = tausIPHandle->value(tau_index)->dxy_error();
0100 ip3d[tau_index] = tausIPHandle->value(tau_index)->ip3d();
0101 ip3d_error[tau_index] = tausIPHandle->value(tau_index)->ip3d_error();
0102 hasSecondaryVertex[tau_index] = tausIPHandle->value(tau_index)->hasSecondaryVertex();
0103 flightLength_x[tau_index] = tausIPHandle->value(tau_index)->flightLength().x();
0104 flightLength_y[tau_index] = tausIPHandle->value(tau_index)->flightLength().y();
0105 flightLength_z[tau_index] = tausIPHandle->value(tau_index)->flightLength().z();
0106 flightLengthSig[tau_index] = tausIPHandle->value(tau_index)->flightLengthSig();
0107
0108 if (hasSecondaryVertex[tau_index] > 0) {
0109 secondaryVertex_x[tau_index] = tausIPHandle->value(tau_index)->secondaryVertex()->x();
0110 secondaryVertex_y[tau_index] = tausIPHandle->value(tau_index)->secondaryVertex()->y();
0111 secondaryVertex_z[tau_index] = tausIPHandle->value(tau_index)->secondaryVertex()->z();
0112 }
0113 } else {
0114 edm::LogWarning("HLTTauTableProducer") << " Invalid handle for Tau IP input collection";
0115 }
0116 }
0117 } else {
0118 edm::LogWarning("HLTTauTableProducer") << " Invalid handle for PFTau candidate input collection";
0119 }
0120
0121 auto tauTable = std::make_unique<nanoaod::FlatTable>(nTaus, tableName_, false, true);
0122 tauTable->addColumn<float>("dxy", dxy, "tau transverse impact parameter", precision_);
0123 tauTable->addColumn<float>("dxy_error", dxy_error, " dxy_error ", precision_);
0124 tauTable->addColumn<float>("ip3d", ip3d, " ip3d ", precision_);
0125 tauTable->addColumn<float>("ip3d_error", ip3d_error, " ip3d_error ", precision_);
0126 tauTable->addColumn<float>("hasSecondaryVertex", hasSecondaryVertex, " hasSecondaryVertex ", precision_);
0127 tauTable->addColumn<float>("flightLength_x", flightLength_x, "flightLength_x", precision_);
0128 tauTable->addColumn<float>("flightLength_y", flightLength_y, "flightLength_y", precision_);
0129 tauTable->addColumn<float>("flightLength_z", flightLength_z, "flightLength_z", precision_);
0130 tauTable->addColumn<float>("flightLengthSig", flightLengthSig, "flightLengthSig", precision_);
0131 tauTable->addColumn<float>("secondaryVertex_x", secondaryVertex_x, "secondaryVertex_x", precision_);
0132 tauTable->addColumn<float>("secondaryVertex_y", secondaryVertex_y, "secondaryVertex_y", precision_);
0133 tauTable->addColumn<float>("secondaryVertex_z", secondaryVertex_z, "secondaryVertex_z", precision_);
0134 tauTable->addColumn<float>("deepTauVSe", deepTauVSe, "tau vs electron discriminator", precision_);
0135 tauTable->addColumn<float>("deepTauVSmu", deepTauVSmu, "tau vs muon discriminator", precision_);
0136 tauTable->addColumn<float>("deepTauVSjet", deepTauVSjet, "tau vs jet discriminator", precision_);
0137
0138 event.put(std::move(tauTable), tableName_);
0139 }
0140
0141 private:
0142 const std::string tableName_;
0143 const bool skipNonExistingSrc_;
0144 const edm::EDGetTokenT<TauCollection> tauToken_;
0145 const edm::EDGetTokenT<TauIPVector> tauIPToken_;
0146 const edm::EDGetTokenT<TauDiscrMap> deepTauVSeToken_, deepTauVSmuToken_, deepTauVSjetToken_;
0147 const unsigned int precision_;
0148 };
0149
0150 #include "FWCore/Framework/interface/MakerMacros.h"
0151 DEFINE_FWK_MODULE(HLTTauTableProducer);