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