CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
FFTJetParameterParser.cc
Go to the documentation of this file.
1 #include <cstdlib>
2 #include <cstring>
3 #include <string>
4 #include <fstream>
5 
7 
14 
17 
18 #include "fftjet/PeakSelectors.hh"
19 #include "fftjet/Kernel2dFactory.hh"
20 #include "fftjet/GaussianNoiseMembershipFcn.hh"
21 #include "fftjet/EquidistantSequence.hh"
22 #include "fftjet/PeakEtaPhiDistance.hh"
23 #include "fftjet/PeakEtaDependentDistance.hh"
24 #include "fftjet/JetProperty.hh"
25 #include "fftjet/InterpolatedMembershipFcn.hh"
26 #include "fftjet/CompositeKernel.hh"
27 #include "fftjet/InterpolatedKernel.hh"
28 #include "fftjet/InterpolatedKernel3d.hh"
29 #include "fftjet/MagneticSmearingKernel.hh"
30 
31 #define make_param(type, varname) const type& varname(ps.getParameter<type>(#varname))
32 
33 using namespace fftjetcms;
34 
35 typedef fftjet::RecombinedJet<VectorLike> RecoFFTJet;
36 
37 static bool parse_peak_member_function(const char* fname, fftjet::JetProperty<fftjet::Peak>::JetMemberFunction* f) {
38  if (strcmp(fname, "eta") == 0)
39  *f = &fftjet::Peak::eta;
40  else if (strcmp(fname, "phi") == 0)
41  *f = &fftjet::Peak::phi;
42  else if (strcmp(fname, "magnitude") == 0)
43  *f = &fftjet::Peak::magnitude;
44  else if (strcmp(fname, "driftSpeed") == 0)
45  *f = &fftjet::Peak::driftSpeed;
46  else if (strcmp(fname, "magSpeed") == 0)
47  *f = &fftjet::Peak::magSpeed;
48  else if (strcmp(fname, "lifetime") == 0)
49  *f = &fftjet::Peak::lifetime;
50  else if (strcmp(fname, "mergeTime") == 0)
51  *f = &fftjet::Peak::mergeTime;
52  else if (strcmp(fname, "splitTime") == 0)
53  *f = &fftjet::Peak::splitTime;
54  else if (strcmp(fname, "scale") == 0)
55  *f = &fftjet::Peak::scale;
56  else if (strcmp(fname, "nearestNeighborDistance") == 0)
57  *f = &fftjet::Peak::nearestNeighborDistance;
58  else if (strcmp(fname, "membershipFactor") == 0)
59  *f = &fftjet::Peak::membershipFactor;
60  else if (strcmp(fname, "recoScale") == 0)
61  *f = &fftjet::Peak::recoScale;
62  else if (strcmp(fname, "recoScaleRatio") == 0)
63  *f = &fftjet::Peak::recoScaleRatio;
64  else if (strcmp(fname, "laplacian") == 0)
65  *f = &fftjet::Peak::laplacian;
66  else if (strcmp(fname, "hessianDeterminant") == 0)
67  *f = &fftjet::Peak::hessianDeterminant;
68  else if (strcmp(fname, "clusterRadius") == 0)
69  *f = &fftjet::Peak::clusterRadius;
70  else if (strcmp(fname, "clusterSeparation") == 0)
71  *f = &fftjet::Peak::clusterSeparation;
72  else {
73  return false;
74  }
75  return true;
76 }
77 
78 static bool parse_jet_member_function(const char* fname, fftjet::JetProperty<RecoFFTJet>::JetMemberFunction* f) {
79  if (strcmp(fname, "peakEta") == 0)
80  *f = &RecoFFTJet::peakEta;
81  else if (strcmp(fname, "peakPhi") == 0)
82  *f = &RecoFFTJet::peakPhi;
83  else if (strcmp(fname, "peakMagnitude") == 0)
84  *f = &RecoFFTJet::peakMagnitude;
85  else if (strcmp(fname, "magnitude") == 0)
86  *f = &RecoFFTJet::magnitude;
87  else if (strcmp(fname, "driftSpeed") == 0)
88  *f = &RecoFFTJet::driftSpeed;
89  else if (strcmp(fname, "magSpeed") == 0)
90  *f = &RecoFFTJet::magSpeed;
91  else if (strcmp(fname, "lifetime") == 0)
92  *f = &RecoFFTJet::lifetime;
93  else if (strcmp(fname, "mergeTime") == 0)
94  *f = &RecoFFTJet::mergeTime;
95  else if (strcmp(fname, "splitTime") == 0)
96  *f = &RecoFFTJet::splitTime;
97  else if (strcmp(fname, "scale") == 0)
98  *f = &RecoFFTJet::scale;
99  else if (strcmp(fname, "nearestNeighborDistance") == 0)
100  *f = &RecoFFTJet::nearestNeighborDistance;
101  else if (strcmp(fname, "membershipFactor") == 0)
102  *f = &RecoFFTJet::membershipFactor;
103  else if (strcmp(fname, "recoScale") == 0)
104  *f = &RecoFFTJet::recoScale;
105  else if (strcmp(fname, "recoScaleRatio") == 0)
106  *f = &RecoFFTJet::recoScaleRatio;
107  else if (strcmp(fname, "laplacian") == 0)
108  *f = &RecoFFTJet::laplacian;
109  else if (strcmp(fname, "hessianDeterminant") == 0)
110  *f = &RecoFFTJet::hessianDeterminant;
111  else if (strcmp(fname, "clusterRadius") == 0)
112  *f = &RecoFFTJet::clusterRadius;
113  else if (strcmp(fname, "clusterSeparation") == 0)
114  *f = &RecoFFTJet::clusterSeparation;
115  else {
116  return false;
117  }
118  return true;
119 }
120 
121 namespace fftjetcms {
122 
123  std::unique_ptr<fftjet::Grid2d<Real> > fftjet_Grid2d_parser(const edm::ParameterSet& ps) {
124  typedef std::unique_ptr<fftjet::Grid2d<Real> > return_type;
125  fftjet::Grid2d<Real>* g = nullptr;
126 
127  // Check if the grid should be read from file
128  if (ps.exists("file")) {
129  const std::string file = ps.getParameter<std::string>("file");
130  std::ifstream in(file.c_str(), std::ios_base::in | std::ios_base::binary);
131  if (!in.is_open())
132  throw cms::Exception("FFTJetBadConfig") << "Failed to open file " << file << std::endl;
134  if (g == nullptr)
135  throw cms::Exception("FFTJetBadConfig") << "Failed to read file " << file << std::endl;
136  } else {
137  const unsigned nEtaBins = ps.getParameter<unsigned>("nEtaBins");
138  const Real etaMin = ps.getParameter<Real>("etaMin");
139  const Real etaMax = ps.getParameter<Real>("etaMax");
140  const unsigned nPhiBins = ps.getParameter<unsigned>("nPhiBins");
141  const Real phiBin0Edge = ps.getParameter<Real>("phiBin0Edge");
142  const std::string& title = ps.getUntrackedParameter<std::string>("title", "");
143 
144  if (nEtaBins == 0 || nPhiBins == 0 || etaMin >= etaMax)
145  return return_type(nullptr);
146 
147  g = new fftjet::Grid2d<Real>(nEtaBins, etaMin, etaMax, nPhiBins, phiBin0Edge, title.c_str());
148 
149  // Check if the grid data is provided
150  if (ps.exists("data")) {
151  const std::vector<Real>& data = ps.getParameter<std::vector<Real> >("data");
152  if (data.size() == nEtaBins * nPhiBins)
153  g->blockSet(&data[0], nEtaBins, nPhiBins);
154  else {
155  delete g;
156  g = nullptr;
157  }
158  }
159  }
160 
161  return return_type(g);
162  }
163 
164  std::unique_ptr<fftjet::Functor1<bool, fftjet::Peak> > fftjet_PeakSelector_parser(const edm::ParameterSet& ps) {
165  typedef std::unique_ptr<fftjet::Functor1<bool, fftjet::Peak> > return_type;
166 
167  const std::string peakselector_type = ps.getParameter<std::string>("Class");
168 
169  if (!peakselector_type.compare("AllPeaksPass")) {
170  return return_type(new fftjet::AllPeaksPass());
171  }
172 
173  if (!peakselector_type.compare("EtaAndPtDependentPeakSelector")) {
174  const std::string file = ps.getParameter<std::string>("file");
175  std::ifstream in(file.c_str(), std::ios_base::in | std::ios_base::binary);
176  if (!in.is_open())
177  throw cms::Exception("FFTJetBadConfig") << "Failed to open file " << file << std::endl;
179  if (!ptr->isValid())
180  throw cms::Exception("FFTJetBadConfig") << "Failed to read file " << file << std::endl;
181  return return_type(ptr);
182  }
183 
184  if (!peakselector_type.compare("EtaAndPtLookupPeakSelector")) {
185  make_param(unsigned, nx);
186  make_param(unsigned, ny);
187  make_param(double, xmin);
188  make_param(double, xmax);
189  make_param(double, ymin);
190  make_param(double, ymax);
191  make_param(std::vector<double>, data);
192 
193  if (xmin >= xmax || ymin >= ymax || !nx || !ny || data.size() != nx * ny)
194  throw cms::Exception("FFTJetBadConfig") << "Failed to configure EtaAndPtLookupPeakSelector" << std::endl;
195 
196  return return_type(new EtaAndPtLookupPeakSelector(nx, xmin, xmax, ny, ymin, ymax, data));
197  }
198 
199  if (!peakselector_type.compare("SimplePeakSelector")) {
200  const double magCut = ps.getParameter<double>("magCut");
201  const double driftSpeedCut = ps.getParameter<double>("driftSpeedCut");
202  const double magSpeedCut = ps.getParameter<double>("magSpeedCut");
203  const double lifeTimeCut = ps.getParameter<double>("lifeTimeCut");
204  const double NNDCut = ps.getParameter<double>("NNDCut");
205  const double etaCut = ps.getParameter<double>("etaCut");
206  const double splitTimeCut = ps.getParameter<double>("splitTimeCut");
207  const double mergeTimeCut = ps.getParameter<double>("mergeTimeCut");
208 
209  return return_type(new fftjet::SimplePeakSelector(
210  magCut, driftSpeedCut, magSpeedCut, lifeTimeCut, NNDCut, etaCut, splitTimeCut, mergeTimeCut));
211  }
212 
213  if (!peakselector_type.compare("ScalePowerPeakSelector")) {
214  const double a = ps.getParameter<double>("a");
215  const double p = ps.getParameter<double>("p");
216  const double b = ps.getParameter<double>("b");
217  const double etaCut = ps.getParameter<double>("etaCut");
218 
219  return return_type(new fftjet::ScalePowerPeakSelector(a, p, b, etaCut));
220  }
221 
222  return return_type(nullptr);
223  }
224 
225  std::unique_ptr<fftjet::ScaleSpaceKernel> fftjet_MembershipFunction_parser(const edm::ParameterSet& ps) {
226  typedef std::unique_ptr<fftjet::ScaleSpaceKernel> return_type;
227 
228  const std::string MembershipFunction_type = ps.getParameter<std::string>("Class");
229 
230  // Parse special cases first
231  if (!MembershipFunction_type.compare("InterpolatedMembershipFcn")) {
232  // This is a kernel defined by a 4d (sparsified) lookup table.
233  // Here, it is simply loaded from a file using a built-in
234  // method from fftjet. Note that the table representation
235  // must be native binary (this will not work on platforms with
236  // different endianity of floating point standard).
237  const std::string file = ps.getParameter<std::string>("file");
238  std::ifstream in(file.c_str(), std::ios_base::in | std::ios_base::binary);
239  if (!in.is_open())
240  throw cms::Exception("FFTJetBadConfig") << "Failed to open file " << file << std::endl;
242  }
243 
244  if (!MembershipFunction_type.compare("Composite")) {
245  throw cms::Exception("FFTJetBadConfig")
246  << "Parsing of CompositeKernel objects is not implemented yet" << std::endl;
247  }
248 
249  if (!MembershipFunction_type.compare("MagneticSmearing")) {
250  // This kernel represents smearing of a jet in phi
251  // in a magnetic field. The meaning of the parameters
252  // is explained in the comments in the MagneticSmearingKernel.hh
253  // header file of the fftjet package.
254  make_param(std::vector<double>, fragmentationData);
255  make_param(double, numeratorConst);
256  make_param(double, charge1Fraction);
257  make_param(double, charge2Fraction);
258  make_param(unsigned, samplesPerBin);
259 
260  if (fragmentationData.empty())
261  throw cms::Exception("FFTJetBadConfig") << "Fragmentation function data not defined for "
262  "MagneticSmearingKernel"
263  << std::endl;
264  if (samplesPerBin < 1U)
265  throw cms::Exception("FFTJetBadConfig") << "Bad number of samples per bin in "
266  "MagneticSmearingKernel"
267  << std::endl;
268 
269  fftjet::LinearInterpolator1d* fragmentationFunction =
270  new fftjet::LinearInterpolator1d(&fragmentationData[0], fragmentationData.size(), 0.0, 1.0);
271 
272  return return_type(new fftjet::MagneticSmearingKernel<fftjet::LinearInterpolator1d>(
273  fragmentationFunction, numeratorConst, charge1Fraction, charge2Fraction, samplesPerBin, true));
274  }
275 
276  if (!MembershipFunction_type.compare("Interpolated")) {
277  // This is a kernel defined by a histogram-like 2d lookup table
278  make_param(double, sx);
279  make_param(double, sy);
280  make_param(int, scalePower);
281  make_param(unsigned, nxbins);
282  make_param(double, xmin);
283  make_param(double, xmax);
284  make_param(unsigned, nybins);
285  make_param(double, ymin);
286  make_param(double, ymax);
287  make_param(std::vector<double>, data);
288 
289  if (data.size() != nxbins * nybins)
290  throw cms::Exception("FFTJetBadConfig") << "Bad number of data points for Interpolated kernel" << std::endl;
291 
292  return return_type(
293  new fftjet::InterpolatedKernel(sx, sy, scalePower, &data[0], nxbins, xmin, xmax, nybins, ymin, ymax));
294  }
295 
296  if (!MembershipFunction_type.compare("Interpolated3d")) {
297  // This is a kernel defined by a histogram-like 3d lookup table
298  make_param(std::vector<double>, data);
299  make_param(std::vector<double>, scales);
300  make_param(bool, useLogSpaceForScale);
301  make_param(unsigned, nxbins);
302  make_param(double, xmin);
303  make_param(double, xmax);
304  make_param(unsigned, nybins);
305  make_param(double, ymin);
306  make_param(double, ymax);
307 
308  if (data.size() != nxbins * nybins * scales.size())
309  throw cms::Exception("FFTJetBadConfig") << "Bad number of data points for Interpolated3d kernel" << std::endl;
310 
311  return return_type(new fftjet::InterpolatedKernel3d(
312  &data[0], scales, useLogSpaceForScale, nxbins, xmin, xmax, nybins, ymin, ymax));
313  }
314 
315  // This is not a special kernel. Try one of the classes
316  // in the kernel factory provided by FFTJet.
317  fftjet::DefaultKernel2dFactory factory;
318  if (factory[MembershipFunction_type] == nullptr) {
319  return return_type(nullptr);
320  }
321 
322  make_param(double, sx);
323  make_param(double, sy);
324  make_param(int, scalePower);
325  make_param(std::vector<double>, kernelParameters);
326 
327  const int n_expected = factory[MembershipFunction_type]->nParameters();
328  if (n_expected >= 0)
329  if (static_cast<unsigned>(n_expected) != kernelParameters.size())
330  throw cms::Exception("FFTJetBadConfig") << "Bad number of kernel parameters" << std::endl;
331 
332  return std::unique_ptr<fftjet::ScaleSpaceKernel>(
333  factory[MembershipFunction_type]->create(sx, sy, scalePower, kernelParameters));
334  }
335 
336  std::unique_ptr<AbsBgFunctor> fftjet_BgFunctor_parser(const edm::ParameterSet& ps) {
337  const std::string bg_Membership_type = ps.getParameter<std::string>("Class");
338 
339  if (!bg_Membership_type.compare("GaussianNoiseMembershipFcn")) {
340  const double minWeight = ps.getParameter<double>("minWeight");
341  const double prior = ps.getParameter<double>("prior");
342  return std::unique_ptr<AbsBgFunctor>(new fftjet::GaussianNoiseMembershipFcn(minWeight, prior));
343  }
344 
345  return std::unique_ptr<AbsBgFunctor>(nullptr);
346  }
347 
348  std::unique_ptr<std::vector<double> > fftjet_ScaleSet_parser(const edm::ParameterSet& ps) {
349  typedef std::unique_ptr<std::vector<double> > return_type;
350 
351  const std::string className = ps.getParameter<std::string>("Class");
352 
353  if (!className.compare("EquidistantInLinearSpace") || !className.compare("EquidistantInLogSpace")) {
354  const double minScale = ps.getParameter<double>("minScale");
355  const double maxScale = ps.getParameter<double>("maxScale");
356  const unsigned nScales = ps.getParameter<unsigned>("nScales");
357 
358  if (minScale <= 0.0 || maxScale <= 0.0 || nScales == 0 || minScale == maxScale)
359  return return_type(nullptr);
360 
361  // Can't return pointers to EquidistantInLinearSpace
362  // or EquidistantInLogSpace directly because std::vector
363  // destructor is not virtual.
364  if (!className.compare("EquidistantInLinearSpace"))
365  return return_type(new std::vector<double>(fftjet::EquidistantInLinearSpace(minScale, maxScale, nScales)));
366  else
367  return return_type(new std::vector<double>(fftjet::EquidistantInLogSpace(minScale, maxScale, nScales)));
368  }
369 
370  if (!className.compare("UserSet")) {
371  return_type scales(new std::vector<double>(ps.getParameter<std::vector<double> >("scales")));
372 
373  // Verify that all scales are positive and unique
374  const unsigned nscales = scales->size();
375  for (unsigned i = 0; i < nscales; ++i)
376  if ((*scales)[i] <= 0.0)
377  return return_type(nullptr);
378 
379  for (unsigned i = 1; i < nscales; ++i)
380  for (unsigned j = 0; j < i; ++j)
381  if ((*scales)[i] == (*scales)[j])
382  return return_type(nullptr);
383 
384  return scales;
385  }
386 
387  return return_type(nullptr);
388  }
389 
390  std::unique_ptr<fftjet::ClusteringTreeSparsifier<fftjet::Peak, long> > fftjet_ClusteringTreeSparsifier_parser(
391  const edm::ParameterSet& ps) {
392  typedef std::unique_ptr<fftjet::ClusteringTreeSparsifier<fftjet::Peak, long> > return_type;
393 
394  const int maxLevelNumber = ps.getParameter<int>("maxLevelNumber");
395  const unsigned filterMask = ps.getParameter<unsigned>("filterMask");
396  const std::vector<double> userScalesV = ps.getParameter<std::vector<double> >("userScales");
397  const unsigned nUserScales = userScalesV.size();
398  const double* userScales = nUserScales ? &userScalesV[0] : nullptr;
399 
400  return return_type(
401  new fftjet::ClusteringTreeSparsifier<fftjet::Peak, long>(maxLevelNumber, filterMask, userScales, nUserScales));
402  }
403 
404  std::unique_ptr<fftjet::AbsDistanceCalculator<fftjet::Peak> > fftjet_DistanceCalculator_parser(
405  const edm::ParameterSet& ps) {
406  typedef std::unique_ptr<fftjet::AbsDistanceCalculator<fftjet::Peak> > return_type;
407 
408  const std::string calc_type = ps.getParameter<std::string>("Class");
409 
410  if (!calc_type.compare("PeakEtaPhiDistance")) {
411  const double etaToPhiBandwidthRatio = ps.getParameter<double>("etaToPhiBandwidthRatio");
412  return return_type(new fftjet::PeakEtaPhiDistance(etaToPhiBandwidthRatio));
413  }
414 
415  if (!calc_type.compare("PeakEtaDependentDistance")) {
416  std::unique_ptr<fftjet::LinearInterpolator1d> interp =
418  const fftjet::LinearInterpolator1d* ip = interp.get();
419  if (ip == nullptr)
420  return return_type(nullptr);
421 
422  // Check that the interpolator is always positive
423  const unsigned n = ip->nx();
424  const double* data = ip->getData();
425  for (unsigned i = 0; i < n; ++i)
426  if (data[i] <= 0.0)
427  return return_type(nullptr);
428  if (ip->fLow() <= 0.0 || ip->fHigh() <= 0.0)
429  return return_type(nullptr);
430 
431  return return_type(new fftjet::PeakEtaDependentDistance(*ip));
432  }
433 
434  return return_type(nullptr);
435  }
436 
437  std::unique_ptr<fftjetcms::LinInterpolatedTable1D> fftjet_LinInterpolatedTable1D_parser(const edm::ParameterSet& ps) {
438  const double xmin = ps.getParameter<double>("xmin");
439  const double xmax = ps.getParameter<double>("xmax");
440  const bool leftExtrapolationLinear = ps.getParameter<bool>("leftExtrapolationLinear");
441  const bool rightExtrapolationLinear = ps.getParameter<bool>("rightExtrapolationLinear");
442  const std::vector<double> data(ps.getParameter<std::vector<double> >("data"));
443  if (data.empty())
444  return std::unique_ptr<fftjetcms::LinInterpolatedTable1D>(nullptr);
445  else
446  return std::unique_ptr<fftjetcms::LinInterpolatedTable1D>(new fftjetcms::LinInterpolatedTable1D(
447  &data[0], data.size(), xmin, xmax, leftExtrapolationLinear, rightExtrapolationLinear));
448  }
449 
450  std::unique_ptr<fftjet::LinearInterpolator1d> fftjet_LinearInterpolator1d_parser(const edm::ParameterSet& ps) {
451  const double xmin = ps.getParameter<double>("xmin");
452  const double xmax = ps.getParameter<double>("xmax");
453  const double flow = ps.getParameter<double>("flow");
454  const double fhigh = ps.getParameter<double>("fhigh");
455  const std::vector<double> data(ps.getParameter<std::vector<double> >("data"));
456  if (data.empty())
457  return std::unique_ptr<fftjet::LinearInterpolator1d>(nullptr);
458  else
459  return std::unique_ptr<fftjet::LinearInterpolator1d>(
460  new fftjet::LinearInterpolator1d(&data[0], data.size(), xmin, xmax, flow, fhigh));
461  }
462 
463  std::unique_ptr<fftjet::LinearInterpolator2d> fftjet_LinearInterpolator2d_parser(const edm::ParameterSet& ps) {
464  const std::string file = ps.getParameter<std::string>("file");
465  std::ifstream in(file.c_str(), std::ios_base::in | std::ios_base::binary);
466  if (!in.is_open())
467  throw cms::Exception("FFTJetBadConfig") << "Failed to open file " << file << std::endl;
468  fftjet::LinearInterpolator2d* ip = fftjet::LinearInterpolator2d::read(in);
469  if (!ip)
470  throw cms::Exception("FFTJetBadConfig") << "Failed to read file " << file << std::endl;
471  return std::unique_ptr<fftjet::LinearInterpolator2d>(ip);
472  }
473 
474  std::unique_ptr<fftjet::Functor1<double, fftjet::Peak> > fftjet_PeakFunctor_parser(const edm::ParameterSet& ps) {
475  typedef fftjet::Functor1<double, fftjet::Peak> ptr_type;
476  typedef std::unique_ptr<ptr_type> return_type;
477 
478  const std::string property_type = ps.getParameter<std::string>("Class");
479 
480  if (!property_type.compare("Log")) {
481  return_type wrapped = fftjet_PeakFunctor_parser(ps.getParameter<edm::ParameterSet>("function"));
482  ptr_type* wr = wrapped.get();
483  if (wr) {
484  return_type result = return_type(new fftjet::LogProperty<fftjet::Peak>(wr, true));
485  wrapped.release();
486  return result;
487  }
488  }
489 
490  if (!property_type.compare("PeakProperty")) {
491  const std::string member = ps.getParameter<std::string>("member");
492  fftjet::JetProperty<fftjet::Peak>::JetMemberFunction fcn;
493  if (parse_peak_member_function(member.c_str(), &fcn))
494  return return_type(new fftjet::JetProperty<fftjet::Peak>(fcn));
495  else
496  return return_type(nullptr);
497  }
498 
499  if (!property_type.compare("MinusScaledLaplacian")) {
500  const double sx = ps.getParameter<double>("sx");
501  const double sy = ps.getParameter<double>("sx");
502  return return_type(new fftjet::MinusScaledLaplacian<fftjet::Peak>(sx, sy));
503  }
504 
505  if (!property_type.compare("ScaledHessianDet")) {
506  return return_type(new fftjet::ScaledHessianDet<fftjet::Peak>());
507  }
508 
509  if (!property_type.compare("ScaledMagnitude")) {
510  return return_type(new fftjet::ScaledMagnitude<fftjet::Peak>());
511  }
512 
513  if (!property_type.compare("ScaledMagnitude2")) {
514  return return_type(new fftjet::ScaledMagnitude2<fftjet::Peak>());
515  }
516 
517  if (!property_type.compare("ConstDouble")) {
518  const double value = ps.getParameter<double>("value");
519  return return_type(new ConstDouble<fftjet::Peak>(value));
520  }
521 
522  if (!property_type.compare("ProportionalToScale")) {
523  const double value = ps.getParameter<double>("value");
524  return return_type(new ProportionalToScale<fftjet::Peak>(value));
525  }
526 
527  if (!property_type.compare("MultiplyByConst")) {
528  const double factor = ps.getParameter<double>("factor");
529  return_type function = fftjet_PeakFunctor_parser(ps.getParameter<edm::ParameterSet>("function"));
530  ptr_type* ptr = function.get();
531  if (ptr) {
532  return_type result = return_type(new MultiplyByConst<fftjet::Peak>(factor, ptr, true));
533  function.release();
534  return result;
535  }
536  }
537 
538  if (!property_type.compare("CompositeFunctor")) {
539  std::unique_ptr<fftjet::Functor1<double, double> > fcn1 =
541  return_type fcn2 = fftjet_PeakFunctor_parser(ps.getParameter<edm::ParameterSet>("function2"));
542  fftjet::Functor1<double, double>* f1 = fcn1.get();
543  ptr_type* f2 = fcn2.get();
544  if (f1 && f2) {
545  return_type result = return_type(new CompositeFunctor<fftjet::Peak>(f1, f2, true));
546  fcn1.release();
547  fcn2.release();
548  return result;
549  }
550  }
551 
552  if (!property_type.compare("ProductFunctor")) {
553  return_type fcn1 = fftjet_PeakFunctor_parser(ps.getParameter<edm::ParameterSet>("function1"));
554  return_type fcn2 = fftjet_PeakFunctor_parser(ps.getParameter<edm::ParameterSet>("function2"));
555  ptr_type* f1 = fcn1.get();
556  ptr_type* f2 = fcn2.get();
557  if (f1 && f2) {
558  return_type result = return_type(new ProductFunctor<fftjet::Peak>(f1, f2, true));
559  fcn1.release();
560  fcn2.release();
561  return result;
562  }
563  }
564 
565  if (!property_type.compare("MagnitudeDependent")) {
566  std::unique_ptr<fftjet::Functor1<double, double> > fcn1 =
568  fftjet::Functor1<double, double>* f1 = fcn1.get();
569  if (f1) {
570  return_type result = return_type(new MagnitudeDependent<fftjet::Peak>(f1, true));
571  fcn1.release();
572  return result;
573  }
574  }
575 
576  if (!property_type.compare("PeakEtaDependent")) {
577  std::unique_ptr<fftjet::Functor1<double, double> > fcn1 =
579  fftjet::Functor1<double, double>* f1 = fcn1.get();
580  if (f1) {
581  return_type result = return_type(new PeakEtaDependent(f1, true));
582  fcn1.release();
583  return result;
584  }
585  }
586 
587  return return_type(nullptr);
588  }
589 
590  std::unique_ptr<fftjet::Functor1<double, fftjet::RecombinedJet<VectorLike> > > fftjet_JetFunctor_parser(
591  const edm::ParameterSet& ps) {
592  typedef fftjet::Functor1<double, RecoFFTJet> ptr_type;
593  typedef std::unique_ptr<ptr_type> return_type;
594 
595  const std::string property_type = ps.getParameter<std::string>("Class");
596 
597  if (!property_type.compare("Log")) {
598  return_type wrapped = fftjet_JetFunctor_parser(ps.getParameter<edm::ParameterSet>("function"));
599  fftjet::Functor1<double, RecoFFTJet>* wr = wrapped.get();
600  if (wr) {
601  return_type result = return_type(new fftjet::LogProperty<RecoFFTJet>(wr, true));
602  wrapped.release();
603  return result;
604  }
605  }
606 
607  if (!property_type.compare("JetEtaDependent")) {
608  std::unique_ptr<fftjet::Functor1<double, double> > fcn1 =
610  fftjet::Functor1<double, double>* f1 = fcn1.get();
611  if (f1) {
612  return_type result = return_type(new JetEtaDependent(f1, true));
613  fcn1.release();
614  return result;
615  }
616  }
617 
618  if (!property_type.compare("JetProperty")) {
619  const std::string member = ps.getParameter<std::string>("member");
620  fftjet::JetProperty<RecoFFTJet>::JetMemberFunction fcn;
621  if (parse_jet_member_function(member.c_str(), &fcn))
622  return return_type(new fftjet::JetProperty<RecoFFTJet>(fcn));
623  else
624  return return_type(nullptr);
625  }
626 
627  if (!property_type.compare("ConstDouble")) {
628  const double value = ps.getParameter<double>("value");
629  return return_type(new ConstDouble<RecoFFTJet>(value));
630  }
631 
632  if (!property_type.compare("ProportionalToScale")) {
633  const double value = ps.getParameter<double>("value");
634  return return_type(new ProportionalToScale<RecoFFTJet>(value));
635  }
636 
637  if (!property_type.compare("MultiplyByConst")) {
638  const double factor = ps.getParameter<double>("factor");
639  return_type function = fftjet_JetFunctor_parser(ps.getParameter<edm::ParameterSet>("function"));
640  ptr_type* ptr = function.get();
641  if (ptr) {
642  return_type result = return_type(new MultiplyByConst<RecoFFTJet>(factor, ptr, true));
643  function.release();
644  return result;
645  }
646  }
647 
648  if (!property_type.compare("CompositeFunctor")) {
649  std::unique_ptr<fftjet::Functor1<double, double> > fcn1 =
651  return_type fcn2 = fftjet_JetFunctor_parser(ps.getParameter<edm::ParameterSet>("function2"));
652  fftjet::Functor1<double, double>* f1 = fcn1.get();
653  ptr_type* f2 = fcn2.get();
654  if (f1 && f2) {
655  return_type result = return_type(new CompositeFunctor<RecoFFTJet>(f1, f2, true));
656  fcn1.release();
657  fcn2.release();
658  return result;
659  }
660  }
661 
662  if (!property_type.compare("ProductFunctor")) {
663  return_type fcn1 = fftjet_JetFunctor_parser(ps.getParameter<edm::ParameterSet>("function1"));
664  return_type fcn2 = fftjet_JetFunctor_parser(ps.getParameter<edm::ParameterSet>("function2"));
665  ptr_type* f1 = fcn1.get();
666  ptr_type* f2 = fcn2.get();
667  if (f1 && f2) {
668  return_type result = return_type(new ProductFunctor<RecoFFTJet>(f1, f2, true));
669  fcn1.release();
670  fcn2.release();
671  return result;
672  }
673  }
674 
675  if (!property_type.compare("MagnitudeDependent")) {
676  std::unique_ptr<fftjet::Functor1<double, double> > fcn1 =
678  fftjet::Functor1<double, double>* f1 = fcn1.get();
679  if (f1) {
680  return_type result = return_type(new MagnitudeDependent<RecoFFTJet>(f1, true));
681  fcn1.release();
682  return result;
683  }
684  }
685 
686  return return_type(nullptr);
687  }
688 
689  std::unique_ptr<fftjet::Functor2<double, fftjet::RecombinedJet<VectorLike>, fftjet::RecombinedJet<VectorLike> > >
691  typedef std::unique_ptr<
692  fftjet::Functor2<double, fftjet::RecombinedJet<VectorLike>, fftjet::RecombinedJet<VectorLike> > >
693  return_type;
694 
695  const std::string distance_type = ps.getParameter<std::string>("Class");
696 
697  if (!distance_type.compare("JetConvergenceDistance")) {
700 
701  if (etaToPhiBandwidthRatio > 0.0 && relativePtBandwidth > 0.0)
703  }
704 
705  return return_type(nullptr);
706  }
707 
708  std::unique_ptr<fftjet::Functor1<double, double> > fftjet_Function_parser(const edm::ParameterSet& ps) {
709  typedef std::unique_ptr<fftjet::Functor1<double, double> > return_type;
710 
711  const std::string fcn_type = ps.getParameter<std::string>("Class");
712 
713  if (!fcn_type.compare("LinearInterpolator1d")) {
714  std::unique_ptr<fftjet::LinearInterpolator1d> p = fftjet_LinearInterpolator1d_parser(ps);
715  fftjet::LinearInterpolator1d* ptr = p.get();
716  if (ptr) {
717  p.release();
718  return return_type(ptr);
719  }
720  }
721 
722  if (!fcn_type.compare("LinInterpolatedTable1D")) {
723  std::unique_ptr<fftjetcms::LinInterpolatedTable1D> p = fftjet_LinInterpolatedTable1D_parser(ps);
724  fftjetcms::LinInterpolatedTable1D* ptr = p.get();
725  if (ptr) {
726  p.release();
727  return return_type(ptr);
728  }
729  }
730 
731  if (!fcn_type.compare("Polynomial")) {
732  std::vector<double> coeffs;
733  for (unsigned i = 0;; ++i) {
734  std::ostringstream s;
735  s << 'c' << i;
736  if (ps.exists(s.str()))
737  coeffs.push_back(ps.getParameter<double>(s.str()));
738  else
739  break;
740  }
741  return return_type(new Polynomial(coeffs));
742  }
743 
744  return return_type(nullptr);
745  }
746 
747  std::unique_ptr<AbsPileupCalculator> fftjet_PileupCalculator_parser(const edm::ParameterSet& ps) {
748  typedef std::unique_ptr<AbsPileupCalculator> return_type;
749 
750  const std::string fcn_type = ps.getParameter<std::string>("Class");
751 
752  if (!fcn_type.compare("EtaDependentPileup")) {
753  std::unique_ptr<fftjet::LinearInterpolator2d> interp =
755  const double inputRhoFactor = ps.getParameter<double>("inputRhoFactor");
756  const double outputRhoFactor = ps.getParameter<double>("outputRhoFactor");
757 
758  const fftjet::LinearInterpolator2d* ip = interp.get();
759  if (ip)
760  return return_type(new EtaDependentPileup(*ip, inputRhoFactor, outputRhoFactor));
761  else
762  return return_type(nullptr);
763  }
764 
765  if (!fcn_type.compare("PileupGrid2d")) {
766  std::unique_ptr<fftjet::Grid2d<Real> > grid = fftjet_Grid2d_parser(ps.getParameter<edm::ParameterSet>("Grid2d"));
767  const double rhoFactor = ps.getParameter<double>("rhoFactor");
768 
769  const fftjet::Grid2d<Real>* g = grid.get();
770  if (g)
771  return return_type(new PileupGrid2d(*g, rhoFactor));
772  else
773  return return_type(nullptr);
774  }
775 
776  return return_type(nullptr);
777  }
778 
779  std::unique_ptr<fftjet::JetMagnitudeMapper2d<fftjet::Peak> > fftjet_PeakMagnitudeMapper2d_parser(
780  const edm::ParameterSet& ps) {
781  std::unique_ptr<fftjet::LinearInterpolator2d> responseCurve =
783 
784  const double minPredictor = ps.getParameter<double>("minPredictor");
785  const double maxPredictor = ps.getParameter<double>("maxPredictor");
786  const unsigned nPredPoints = ps.getParameter<unsigned>("nPredPoints");
787  const double maxMagnitude = ps.getParameter<double>("maxMagnitude");
788  const unsigned nMagPoints = ps.getParameter<unsigned>("nMagPoints");
789 
790  return (std::unique_ptr<fftjet::JetMagnitudeMapper2d<fftjet::Peak> >(
791  new fftjet::JetMagnitudeMapper2d<fftjet::Peak>(*responseCurve,
793  true,
794  minPredictor,
795  maxPredictor,
796  nPredPoints,
797  maxMagnitude,
798  nMagPoints)));
799  }
800 
801  std::unique_ptr<fftjet::JetMagnitudeMapper2d<fftjet::RecombinedJet<VectorLike> > > fftjet_JetMagnitudeMapper2d_parser(
802  const edm::ParameterSet& ps) {
803  std::unique_ptr<fftjet::LinearInterpolator2d> responseCurve =
805 
806  const double minPredictor = ps.getParameter<double>("minPredictor");
807  const double maxPredictor = ps.getParameter<double>("maxPredictor");
808  const unsigned nPredPoints = ps.getParameter<unsigned>("nPredPoints");
809  const double maxMagnitude = ps.getParameter<double>("maxMagnitude");
810  const unsigned nMagPoints = ps.getParameter<unsigned>("nMagPoints");
811 
812  return (std::unique_ptr<fftjet::JetMagnitudeMapper2d<RecoFFTJet> >(
813  new fftjet::JetMagnitudeMapper2d<RecoFFTJet>(*responseCurve,
815  true,
816  minPredictor,
817  maxPredictor,
818  nPredPoints,
819  maxMagnitude,
820  nMagPoints)));
821  }
822 
823 } // namespace fftjetcms
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
constexpr int nPhiBins
Definition: Common.h:12
std::unique_ptr< fftjetcms::LinInterpolatedTable1D > fftjet_LinInterpolatedTable1D_parser(const edm::ParameterSet &ps)
bool exists(std::string const &parameterName) const
checks if a parameter exists
std::unique_ptr< fftjet::Functor1< double, fftjet::Peak > > fftjet_PeakFunctor_parser(const edm::ParameterSet &ps)
std::unique_ptr< fftjet::LinearInterpolator2d > fftjet_LinearInterpolator2d_parser(const edm::ParameterSet &ps)
std::unique_ptr< AbsBgFunctor > fftjet_BgFunctor_parser(const edm::ParameterSet &ps)
std::unique_ptr< fftjet::Grid2d< Real > > fftjet_Grid2d_parser(const edm::ParameterSet &ps)
constexpr int nEtaBins
Definition: Common.h:11
std::unique_ptr< fftjet::JetMagnitudeMapper2d< fftjet::Peak > > fftjet_PeakMagnitudeMapper2d_parser(const edm::ParameterSet &ps)
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
std::unique_ptr< fftjet::Functor2< double, fftjet::RecombinedJet< VectorLike >, fftjet::RecombinedJet< VectorLike > > > fftjet_JetDistance_parser(const edm::ParameterSet &ps)
fftjet::RecombinedJet< VectorLike > RecoFFTJet
std::unique_ptr< fftjet::JetMagnitudeMapper2d< fftjet::RecombinedJet< VectorLike > > > fftjet_JetMagnitudeMapper2d_parser(const edm::ParameterSet &ps)
std::unique_ptr< fftjet::Functor1< double, fftjet::RecombinedJet< VectorLike > > > fftjet_JetFunctor_parser(const edm::ParameterSet &ps)
static bool parse_peak_member_function(const char *fname, fftjet::JetProperty< fftjet::Peak >::JetMemberFunction *f)
double f[11][100]
Definition: value.py:1
#define make_param(type, varname)
std::unique_ptr< fftjet::AbsDistanceCalculator< fftjet::Peak > > fftjet_DistanceCalculator_parser(const edm::ParameterSet &ps)
std::unique_ptr< AbsPileupCalculator > fftjet_PileupCalculator_parser(const edm::ParameterSet &ps)
std::unique_ptr< fftjet::Functor1< double, double > > fftjet_Function_parser(const edm::ParameterSet &ps)
double Real
void fcn(int &, double *, double &, double *, int)
double b
Definition: hdecay.h:118
string fname
main script
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
double a
Definition: hdecay.h:119
std::unique_ptr< fftjet::Functor1< bool, fftjet::Peak > > fftjet_PeakSelector_parser(const edm::ParameterSet &ps)
static bool parse_jet_member_function(const char *fname, fftjet::JetProperty< RecoFFTJet >::JetMemberFunction *f)
std::unique_ptr< fftjet::ClusteringTreeSparsifier< fftjet::Peak, long > > fftjet_ClusteringTreeSparsifier_parser(const edm::ParameterSet &ps)
std::unique_ptr< std::vector< double > > fftjet_ScaleSet_parser(const edm::ParameterSet &ps)
std::unique_ptr< fftjet::LinearInterpolator1d > fftjet_LinearInterpolator1d_parser(const edm::ParameterSet &ps)
std::string className(const T &t)
Definition: ClassName.h:31
std::unique_ptr< fftjet::ScaleSpaceKernel > fftjet_MembershipFunction_parser(const edm::ParameterSet &ps)