File indexing completed on 2023-03-17 11:18:19
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #include <iostream>
0020 #include <memory>
0021
0022 #include <fstream>
0023 #include <functional>
0024 #include <sstream>
0025
0026
0027 #include "fftjet/ProximityClusteringTree.hh"
0028 #include "fftjet/OpenDXPeakTree.hh"
0029
0030
0031 #include "FWCore/Framework/interface/Frameworkfwd.h"
0032 #include "FWCore/Framework/interface/stream/EDAnalyzer.h"
0033
0034 #include "FWCore/Framework/interface/Event.h"
0035 #include "FWCore/Framework/interface/MakerMacros.h"
0036
0037 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0038
0039
0040 #include "RecoJets/FFTJetProducers/interface/FFTJetParameterParser.h"
0041
0042
0043 #include "RecoJets/FFTJetAlgorithms/interface/clusteringTreeConverters.h"
0044
0045 #include "DataFormats/Provenance/interface/RunLumiEventNumber.h"
0046
0047 using namespace fftjetcms;
0048
0049
0050
0051
0052 class FFTJetTreeDump : public edm::stream::EDAnalyzer<> {
0053 public:
0054 explicit FFTJetTreeDump(const edm::ParameterSet&);
0055 FFTJetTreeDump() = delete;
0056 FFTJetTreeDump(const FFTJetTreeDump&) = delete;
0057 FFTJetTreeDump& operator=(const FFTJetTreeDump&) = delete;
0058 ~FFTJetTreeDump() override;
0059
0060 private:
0061
0062 typedef fftjet::ProximityClusteringTree<fftjet::Peak, long> ClusteringTree;
0063 typedef fftjet::SparseClusteringTree<fftjet::Peak, long> SparseTree;
0064 typedef fftjet::OpenDXPeakTree<long, fftjet::AbsClusteringTree> DXFormatter;
0065 typedef fftjet::OpenDXPeakTree<long, fftjet::SparseClusteringTree> SparseFormatter;
0066 typedef fftjet::Functor1<double, fftjet::Peak> PeakProperty;
0067 typedef reco::PattRecoTree<float, reco::PattRecoPeak<float> > StoredTree;
0068
0069 void analyze(const edm::Event&, const edm::EventSetup&) override;
0070
0071 void processTreeData(const edm::Event&, std::ofstream&);
0072
0073 template <class Ptr>
0074 void checkConfig(const Ptr& ptr, const char* message) {
0075 if (ptr.get() == nullptr)
0076 throw cms::Exception("FFTJetBadConfig") << message << std::endl;
0077 }
0078
0079
0080
0081 ClusteringTree* clusteringTree;
0082
0083 const edm::InputTag treeLabel;
0084 edm::EDGetTokenT<StoredTree> treeToken;
0085
0086 const std::string outputPrefix;
0087 const double etaMax;
0088 const bool insertCompleteEvent;
0089 const double completeEventScale;
0090
0091
0092 std::unique_ptr<fftjet::AbsDistanceCalculator<fftjet::Peak> > distanceCalc;
0093
0094
0095 std::unique_ptr<std::vector<double> > iniScales;
0096
0097
0098 SparseTree sparseTree;
0099
0100
0101 std::unique_ptr<PeakProperty> glyphSize;
0102 std::unique_ptr<PeakProperty> glyphColor;
0103
0104
0105 std::unique_ptr<DXFormatter> denseFormatter;
0106 std::unique_ptr<SparseFormatter> sparseFormatter;
0107
0108 unsigned counter;
0109 };
0110
0111
0112
0113
0114 FFTJetTreeDump::FFTJetTreeDump(const edm::ParameterSet& ps)
0115 : clusteringTree(nullptr),
0116 treeLabel(ps.getParameter<edm::InputTag>("treeLabel")),
0117 outputPrefix(ps.getParameter<std::string>("outputPrefix")),
0118 etaMax(ps.getParameter<double>("etaMax")),
0119 insertCompleteEvent(ps.getParameter<bool>("insertCompleteEvent")),
0120 completeEventScale(ps.getParameter<double>("completeEventScale")),
0121 counter(0) {
0122 if (etaMax < 0.0)
0123 throw cms::Exception("FFTJetBadConfig") << "etaMax can not be negative" << std::endl;
0124
0125
0126 const edm::ParameterSet& InitialScales(ps.getParameter<edm::ParameterSet>("InitialScales"));
0127 iniScales = fftjet_ScaleSet_parser(InitialScales);
0128 checkConfig(iniScales, "invalid set of scales");
0129 std::sort(iniScales->begin(), iniScales->end(), std::greater<double>());
0130
0131
0132 const edm::ParameterSet& TreeDistanceCalculator(ps.getParameter<edm::ParameterSet>("TreeDistanceCalculator"));
0133 distanceCalc = fftjet_DistanceCalculator_parser(TreeDistanceCalculator);
0134 checkConfig(distanceCalc, "invalid tree distance calculator");
0135
0136
0137 const edm::ParameterSet& GlyphSize(ps.getParameter<edm::ParameterSet>("GlyphSize"));
0138 glyphSize = fftjet_PeakFunctor_parser(GlyphSize);
0139 checkConfig(glyphSize, "invalid glyph size parameters");
0140
0141 const edm::ParameterSet& GlyphColor(ps.getParameter<edm::ParameterSet>("GlyphColor"));
0142 glyphColor = fftjet_PeakFunctor_parser(GlyphColor);
0143 checkConfig(glyphColor, "invalid glyph color parameters");
0144
0145
0146 denseFormatter = std::make_unique<DXFormatter>(glyphSize.get(), glyphColor.get(), etaMax);
0147 sparseFormatter = std::make_unique<SparseFormatter>(glyphSize.get(), glyphColor.get(), etaMax);
0148
0149
0150 clusteringTree = new ClusteringTree(distanceCalc.get());
0151
0152 treeToken = consumes<StoredTree>(treeLabel);
0153 }
0154
0155 FFTJetTreeDump::~FFTJetTreeDump() { delete clusteringTree; }
0156
0157
0158
0159
0160 void FFTJetTreeDump::processTreeData(const edm::Event& iEvent, std::ofstream& file) {
0161
0162 edm::RunNumber_t const runNum = iEvent.id().run();
0163 edm::EventNumber_t const evNum = iEvent.id().event();
0164
0165
0166 edm::Handle<StoredTree> input;
0167 iEvent.getByToken(treeToken, input);
0168
0169 const double eventScale = insertCompleteEvent ? completeEventScale : 0.0;
0170 if (input->isSparse()) {
0171 sparsePeakTreeFromStorable(*input, iniScales.get(), eventScale, &sparseTree);
0172 sparseFormatter->setTree(sparseTree, runNum, evNum);
0173 file << *sparseFormatter << std::endl;
0174 } else {
0175 densePeakTreeFromStorable(*input, iniScales.get(), eventScale, clusteringTree);
0176 denseFormatter->setTree(*clusteringTree, runNum, evNum);
0177 file << *denseFormatter << std::endl;
0178 }
0179 }
0180
0181
0182 void FFTJetTreeDump::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0183
0184 std::ostringstream filename;
0185 filename << outputPrefix << '_' << counter++ << ".dx";
0186
0187
0188 std::ofstream file(filename.str().c_str());
0189 if (!file)
0190 throw cms::Exception("FFTJetBadConfig") << "Failed to open file \"" << filename.str() << "\"" << std::endl;
0191
0192 processTreeData(iEvent, file);
0193 }
0194
0195
0196 DEFINE_FWK_MODULE(FFTJetTreeDump);