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"
28 #define make_param(type, varname) const \
29 type & varname (ps.getParameter< type >( #varname ))
31 using namespace fftjetcms;
36 fftjet::JetProperty<fftjet::Peak>::JetMemberFunction *
f)
38 if (strcmp(fname,
"eta") == 0)
40 else if (strcmp(fname,
"phi") == 0)
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;
76 fftjet::JetProperty<RecoFFTJet>::JetMemberFunction *
f)
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;
118 namespace fftjetcms {
120 std::auto_ptr<fftjet::Grid2d<Real> >
123 typedef std::auto_ptr<fftjet::Grid2d<Real> > return_type;
125 const unsigned nEtaBins = ps.
getParameter<
unsigned>(
"nEtaBins");
128 const unsigned nPhiBins = ps.
getParameter<
unsigned>(
"nPhiBins");
133 if (nEtaBins == 0 || nPhiBins == 0 || etaMin >= etaMax)
134 return return_type(
NULL);
136 return return_type(
new fftjet::Grid2d<Real>(
147 std::auto_ptr<fftjet::Functor1<bool,fftjet::Peak> >
150 typedef std::auto_ptr<fftjet::Functor1<bool,fftjet::Peak> > return_type;
152 const std::string peakselector_type = ps.
getParameter<std::string>(
155 if (!peakselector_type.compare(
"AllPeaksPass"))
157 return return_type(
new fftjet::AllPeaksPass());
160 if (!peakselector_type.compare(
"EtaAndPtDependentPeakSelector"))
163 std::ifstream
in(file.c_str(),
167 <<
"Failed to open file " << file << std::endl;
172 <<
"Failed to read file " << file << std::endl;
173 return return_type(ptr);
176 if (!peakselector_type.compare(
"EtaAndPtLookupPeakSelector"))
186 if (xmin >= xmax || ymin >= ymax || !nx || !ny ||
data.size() != nx*ny)
188 <<
"Failed to configure EtaAndPtLookupPeakSelector" << std::endl;
191 nx, xmin, xmax, ny, ymin, ymax,
data));
194 if (!peakselector_type.compare(
"SimplePeakSelector"))
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");
203 return return_type(
new fftjet::SimplePeakSelector(
204 magCut, driftSpeedCut ,magSpeedCut, lifeTimeCut, NNDCut, etaCut));
207 if (!peakselector_type.compare(
"ScalePowerPeakSelector"))
212 const double etaCut = ps.
getParameter<
double>(
"etaCut");
214 return return_type(
new fftjet::ScalePowerPeakSelector(
218 return return_type(
NULL);
222 std::auto_ptr<fftjet::ScaleSpaceKernel>
225 typedef std::auto_ptr<fftjet::ScaleSpaceKernel> return_type;
227 const std::string MembershipFunction_type = ps.
getParameter<std::string>(
231 if (!MembershipFunction_type.compare(
"InterpolatedMembershipFcn"))
239 std::ifstream
in(file.c_str(),
243 <<
"Failed to open file " << file << std::endl;
247 if (!MembershipFunction_type.compare(
"Composite"))
250 <<
"Parsing of CompositeKernel objects is not implemented yet"
254 if (!MembershipFunction_type.compare(
"MagneticSmearing"))
260 make_param(std::vector<double>, fragmentationData);
266 if (fragmentationData.empty())
268 <<
"Fragmentation function data not defined for "
269 "MagneticSmearingKernel" << std::endl;
270 if (samplesPerBin < 1U)
272 <<
"Bad number of samples per bin in "
273 "MagneticSmearingKernel" << std::endl;
275 fftjet::LinearInterpolator1d* fragmentationFunction =
276 new fftjet::LinearInterpolator1d(
277 &fragmentationData[0], fragmentationData.size(), 0.0, 1.0);
280 new fftjet::MagneticSmearingKernel<fftjet::LinearInterpolator1d>(
281 fragmentationFunction, numeratorConst,
282 charge1Fraction, charge2Fraction,
283 samplesPerBin,
true));
286 if (!MembershipFunction_type.compare(
"Interpolated"))
300 if (
data.size() != nxbins*nybins)
302 <<
"Bad number of data points for Interpolated kernel"
305 return return_type(
new fftjet::InterpolatedKernel(
307 &
data[0], nxbins, xmin, xmax,
308 nybins, ymin, ymax));
311 if (!MembershipFunction_type.compare(
"Interpolated3d"))
324 if (
data.size() != nxbins*nybins*scales.size())
326 <<
"Bad number of data points for Interpolated3d kernel"
329 return return_type(
new fftjet::InterpolatedKernel3d(
330 &
data[0], scales, useLogSpaceForScale,
331 nxbins, xmin, xmax, nybins, ymin, ymax));
336 fftjet::DefaultKernel2dFactory factory;
337 if (factory[MembershipFunction_type] ==
NULL) {
338 return return_type(
NULL);
344 make_param(std::vector<double>, kernelParameters);
346 const int n_expected = factory[MembershipFunction_type]->nParameters();
348 if (static_cast<unsigned>(n_expected) != kernelParameters.size())
350 <<
"Bad number of kernel parameters" << std::endl;
352 return std::auto_ptr<fftjet::ScaleSpaceKernel>(
353 factory[MembershipFunction_type]->create(
354 sx, sy, scalePower, kernelParameters));
358 std::auto_ptr<AbsBgFunctor>
361 const std::string bg_Membership_type = ps.
getParameter<std::string>(
364 if (!bg_Membership_type.compare(
"GaussianNoiseMembershipFcn"))
366 const double minWeight = ps.
getParameter<
double>(
"minWeight");
368 return std::auto_ptr<AbsBgFunctor>(
369 new fftjet::GaussianNoiseMembershipFcn(minWeight,prior));
372 return std::auto_ptr<AbsBgFunctor>(
NULL);
376 std::auto_ptr<std::vector<double> >
379 typedef std::auto_ptr<std::vector<double> > return_type;
383 if (!className.compare(
"EquidistantInLinearSpace") ||
384 !className.compare(
"EquidistantInLogSpace"))
386 const double minScale = ps.
getParameter<
double>(
"minScale");
387 const double maxScale = ps.
getParameter<
double>(
"maxScale");
388 const unsigned nScales = ps.
getParameter<
unsigned>(
"nScales");
390 if (minScale <= 0.0 || maxScale <= 0.0 ||
391 nScales == 0 || minScale == maxScale)
392 return return_type(
NULL);
397 if (!className.compare(
"EquidistantInLinearSpace"))
398 return return_type(
new std::vector<double>(
399 fftjet::EquidistantInLinearSpace(
400 minScale, maxScale, nScales)));
402 return return_type(
new std::vector<double>(
403 fftjet::EquidistantInLogSpace(
404 minScale, maxScale, nScales)));
407 if (!className.compare(
"UserSet"))
409 return_type scales(
new std::vector<double>(
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);
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);
426 return return_type(
NULL);
430 std::auto_ptr<fftjet::ClusteringTreeSparsifier<fftjet::Peak,long> >
433 typedef std::auto_ptr<fftjet::ClusteringTreeSparsifier<fftjet::Peak,long> > return_type;
435 const int maxLevelNumber = ps.
getParameter<
int>(
"maxLevelNumber");
436 const unsigned filterMask = ps.
getParameter<
unsigned>(
"filterMask");
437 const std::vector<double> userScalesV =
439 const unsigned nUserScales = userScalesV.size();
440 const double* userScales = nUserScales ?
NULL : &userScalesV[0];
443 new fftjet::ClusteringTreeSparsifier<fftjet::Peak,long>(
453 std::auto_ptr<fftjet::AbsDistanceCalculator<fftjet::Peak> >
456 typedef std::auto_ptr<fftjet::AbsDistanceCalculator<fftjet::Peak> > return_type;
458 const std::string calc_type = ps.
getParameter<std::string>(
"Class");
460 if (!calc_type.compare(
"PeakEtaPhiDistance"))
462 const double etaToPhiBandwidthRatio = ps.
getParameter<
double>(
463 "etaToPhiBandwidthRatio");
464 return return_type(
new fftjet::PeakEtaPhiDistance(etaToPhiBandwidthRatio));
467 if (!calc_type.compare(
"PeakEtaDependentDistance"))
469 std::auto_ptr<fftjet::LinearInterpolator1d> interp =
472 const fftjet::LinearInterpolator1d* ip = interp.get();
474 return return_type(
NULL);
477 const unsigned n = ip->nx();
478 const double*
data = ip->getData();
479 for (
unsigned i=0;
i<
n; ++
i)
481 return return_type(
NULL);
482 if (ip->fLow() <= 0.0 || ip->fHigh() <= 0.0)
483 return return_type(
NULL);
485 return return_type(
new fftjet::PeakEtaDependentDistance(*ip));
488 return return_type(
NULL);
492 std::auto_ptr<fftjet::LinearInterpolator1d>
499 const std::vector<double>
data(
502 return std::auto_ptr<fftjet::LinearInterpolator1d>(
NULL);
504 return std::auto_ptr<fftjet::LinearInterpolator1d>(
505 new fftjet::LinearInterpolator1d(
506 &data[0], data.size(), xmin, xmax, flow, fhigh));
510 std::auto_ptr<fftjet::Functor1<double,fftjet::Peak> >
513 typedef fftjet::Functor1<double,fftjet::Peak> ptr_type;
514 typedef std::auto_ptr<ptr_type> return_type;
516 const std::string property_type = ps.
getParameter<std::string>(
"Class");
518 if (!property_type.compare(
"Log"))
522 ptr_type* wr = wrapped.get();
525 return_type
result = return_type(
526 new fftjet::LogProperty<fftjet::Peak>(wr,
true));
532 if (!property_type.compare(
"PeakProperty"))
534 const std::string member = ps.
getParameter<std::string>(
"member");
535 fftjet::JetProperty<fftjet::Peak>::JetMemberFunction
fcn;
538 new fftjet::JetProperty<fftjet::Peak>(fcn));
540 return return_type(
NULL);
543 if (!property_type.compare(
"MinusScaledLaplacian"))
548 new fftjet::MinusScaledLaplacian<fftjet::Peak>(sx, sy));
551 if (!property_type.compare(
"ScaledHessianDet"))
554 new fftjet::ScaledHessianDet<fftjet::Peak>());
557 if (!property_type.compare(
"ScaledMagnitude"))
560 new fftjet::ScaledMagnitude<fftjet::Peak>());
563 if (!property_type.compare(
"ScaledMagnitude2"))
566 new fftjet::ScaledMagnitude2<fftjet::Peak>());
569 if (!property_type.compare(
"ConstDouble"))
575 if (!property_type.compare(
"ProportionalToScale"))
582 if (!property_type.compare(
"MultiplyByConst"))
584 const double factor = ps.
getParameter<
double>(
"factor");
587 ptr_type* ptr =
function.get();
590 return_type
result = return_type(
597 if (!property_type.compare(
"CompositeFunctor"))
599 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
604 fftjet::Functor1<double,double>*
f1 = fcn1.get();
605 ptr_type*
f2 = fcn2.get();
608 return_type
result = return_type(
616 if (!property_type.compare(
"ProductFunctor"))
622 ptr_type*
f1 = fcn1.get();
623 ptr_type*
f2 = fcn2.get();
626 return_type
result = return_type(
634 if (!property_type.compare(
"MagnitudeDependent"))
636 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
639 fftjet::Functor1<double,double>*
f1 = fcn1.get();
642 return_type
result = return_type(
649 if (!property_type.compare(
"PeakEtaDependent"))
651 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
654 fftjet::Functor1<double,double>*
f1 = fcn1.get();
663 return return_type(
NULL);
667 std::auto_ptr<fftjet::Functor1<double,fftjet::RecombinedJet<VectorLike> > >
670 typedef fftjet::Functor1<double,RecoFFTJet> ptr_type;
671 typedef std::auto_ptr<ptr_type> return_type;
673 const std::string property_type = ps.
getParameter<std::string>(
"Class");
675 if (!property_type.compare(
"Log"))
679 fftjet::Functor1<double,RecoFFTJet>* wr = wrapped.get();
682 return_type
result = return_type(
683 new fftjet::LogProperty<RecoFFTJet>(wr,
true));
689 if (!property_type.compare(
"JetEtaDependent"))
691 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
694 fftjet::Functor1<double,double>*
f1 = fcn1.get();
703 if (!property_type.compare(
"JetProperty"))
705 const std::string member = ps.
getParameter<std::string>(
"member");
706 fftjet::JetProperty<RecoFFTJet>::JetMemberFunction
fcn;
709 new fftjet::JetProperty<RecoFFTJet>(fcn));
711 return return_type(
NULL);
714 if (!property_type.compare(
"ConstDouble"))
720 if (!property_type.compare(
"ProportionalToScale"))
727 if (!property_type.compare(
"MultiplyByConst"))
729 const double factor = ps.
getParameter<
double>(
"factor");
732 ptr_type* ptr =
function.get();
735 return_type
result = return_type(
742 if (!property_type.compare(
"CompositeFunctor"))
744 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
749 fftjet::Functor1<double,double>*
f1 = fcn1.get();
750 ptr_type*
f2 = fcn2.get();
753 return_type
result = return_type(
761 if (!property_type.compare(
"ProductFunctor"))
767 ptr_type*
f1 = fcn1.get();
768 ptr_type*
f2 = fcn2.get();
771 return_type
result = return_type(
779 if (!property_type.compare(
"MagnitudeDependent"))
781 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
784 fftjet::Functor1<double,double>*
f1 = fcn1.get();
787 return_type
result = return_type(
794 return return_type(
NULL);
798 std::auto_ptr<fftjet::Functor2<double,
799 fftjet::RecombinedJet<VectorLike>,
800 fftjet::RecombinedJet<VectorLike> > >
803 typedef std::auto_ptr<fftjet::Functor2<
805 fftjet::RecombinedJet<VectorLike>,
806 fftjet::RecombinedJet<VectorLike> > > return_type;
808 const std::string distance_type = ps.
getParameter<std::string>(
811 if (!distance_type.compare(
"JetConvergenceDistance"))
816 if (etaToPhiBandwidthRatio > 0.0 && relativePtBandwidth > 0.0)
818 etaToPhiBandwidthRatio, relativePtBandwidth));
821 return return_type(
NULL);
825 std::auto_ptr<fftjet::Functor1<double,double> >
828 typedef std::auto_ptr<fftjet::Functor1<double,double> > return_type;
830 const std::string fcn_type = ps.
getParameter<std::string>(
"Class");
832 if (!fcn_type.compare(
"LinearInterpolator1d"))
834 std::auto_ptr<fftjet::LinearInterpolator1d>
p =
836 fftjet::LinearInterpolator1d* ptr = p.get();
840 return return_type(ptr);
844 if (!fcn_type.compare(
"Polynomial"))
846 std::vector<double> coeffs;
847 for (
unsigned i=0; ; ++
i)
849 std::ostringstream
s;
859 return return_type(
NULL);
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
std::auto_ptr< fftjet::Grid2d< Real > > fftjet_Grid2d_parser(const edm::ParameterSet &ps)
bool exists(std::string const ¶meterName) const
checks if a parameter exists
std::auto_ptr< fftjet::ScaleSpaceKernel > fftjet_MembershipFunction_parser(const edm::ParameterSet &ps)
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)
#define make_param(type, varname)
std::auto_ptr< fftjet::Functor1< double, fftjet::Peak > > fftjet_PeakFunctor_parser(const edm::ParameterSet &ps)
void fcn(int &, double *, double &, double *, int)
std::auto_ptr< fftjet::LinearInterpolator1d > fftjet_LinearInterpolator1d_parser(const edm::ParameterSet &ps)
std::auto_ptr< fftjet::AbsDistanceCalculator< fftjet::Peak > > fftjet_DistanceCalculator_parser(const edm::ParameterSet &ps)
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)
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)
std::auto_ptr< fftjet::Functor1< double, fftjet::RecombinedJet< VectorLike > > > fftjet_JetFunctor_parser(const edm::ParameterSet &ps)