Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // TauCollection = deeptau.TauCollection;
0017   // using TauDeepTauVector = edm::AssociationVector<reco::PFTauRefProd, std::vector<reco::TauDiscriminatorContainer>>;
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     // resize all output vectors
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     // source: RecoTauTag/RecoTau/plugins/PFTauTransverseImpactParameters.cc
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_, /*singleton*/ false, /*extension*/ 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);