00001 #include <cstdlib>
00002 #include <cstring>
00003 #include <string>
00004 #include <fstream>
00005
00006 #include "RecoJets/FFTJetProducers/interface/FFTJetParameterParser.h"
00007
00008 #include "RecoJets/FFTJetAlgorithms/interface/JetConvergenceDistance.h"
00009 #include "RecoJets/FFTJetAlgorithms/interface/ScaleCalculators.h"
00010 #include "RecoJets/FFTJetAlgorithms/interface/EtaAndPtDependentPeakSelector.h"
00011 #include "RecoJets/FFTJetAlgorithms/interface/EtaDependentPileup.h"
00012 #include "RecoJets/FFTJetAlgorithms/interface/PileupGrid2d.h"
00013 #include "RecoJets/FFTJetAlgorithms/interface/JetAbsEta.h"
00014
00015 #include "FWCore/Utilities/interface/Exception.h"
00016 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00017
00018 #include "fftjet/PeakSelectors.hh"
00019 #include "fftjet/Kernel2dFactory.hh"
00020 #include "fftjet/GaussianNoiseMembershipFcn.hh"
00021 #include "fftjet/EquidistantSequence.hh"
00022 #include "fftjet/PeakEtaPhiDistance.hh"
00023 #include "fftjet/PeakEtaDependentDistance.hh"
00024 #include "fftjet/JetProperty.hh"
00025 #include "fftjet/InterpolatedMembershipFcn.hh"
00026 #include "fftjet/CompositeKernel.hh"
00027 #include "fftjet/InterpolatedKernel.hh"
00028 #include "fftjet/InterpolatedKernel3d.hh"
00029 #include "fftjet/MagneticSmearingKernel.hh"
00030
00031 #define make_param(type, varname) const \
00032 type & varname (ps.getParameter< type >( #varname ))
00033
00034 using namespace fftjetcms;
00035
00036 typedef fftjet::RecombinedJet<VectorLike> RecoFFTJet;
00037
00038 static bool parse_peak_member_function(const char* fname,
00039 fftjet::JetProperty<fftjet::Peak>::JetMemberFunction *f)
00040 {
00041 if (strcmp(fname, "eta") == 0)
00042 *f = &fftjet::Peak::eta;
00043 else if (strcmp(fname, "phi") == 0)
00044 *f = &fftjet::Peak::phi;
00045 else if (strcmp(fname, "magnitude") == 0)
00046 *f = &fftjet::Peak::magnitude;
00047 else if (strcmp(fname, "driftSpeed") == 0)
00048 *f = &fftjet::Peak::driftSpeed;
00049 else if (strcmp(fname, "magSpeed") == 0)
00050 *f = &fftjet::Peak::magSpeed;
00051 else if (strcmp(fname, "lifetime") == 0)
00052 *f = &fftjet::Peak::lifetime;
00053 else if (strcmp(fname, "scale") == 0)
00054 *f = &fftjet::Peak::scale;
00055 else if (strcmp(fname, "nearestNeighborDistance") == 0)
00056 *f = &fftjet::Peak::nearestNeighborDistance;
00057 else if (strcmp(fname, "membershipFactor") == 0)
00058 *f = &fftjet::Peak::membershipFactor;
00059 else if (strcmp(fname, "recoScale") == 0)
00060 *f = &fftjet::Peak::recoScale;
00061 else if (strcmp(fname, "recoScaleRatio") == 0)
00062 *f = &fftjet::Peak::recoScaleRatio;
00063 else if (strcmp(fname, "laplacian") == 0)
00064 *f = &fftjet::Peak::laplacian;
00065 else if (strcmp(fname, "hessianDeterminant") == 0)
00066 *f = &fftjet::Peak::hessianDeterminant;
00067 else if (strcmp(fname, "clusterRadius") == 0)
00068 *f = &fftjet::Peak::clusterRadius;
00069 else if (strcmp(fname, "clusterSeparation") == 0)
00070 *f = &fftjet::Peak::clusterSeparation;
00071 else
00072 {
00073 return false;
00074 }
00075 return true;
00076 }
00077
00078 static bool parse_jet_member_function(const char* fname,
00079 fftjet::JetProperty<RecoFFTJet>::JetMemberFunction *f)
00080 {
00081 if (strcmp(fname, "peakEta") == 0)
00082 *f = &RecoFFTJet::peakEta;
00083 else if (strcmp(fname, "peakPhi") == 0)
00084 *f = &RecoFFTJet::peakPhi;
00085 else if (strcmp(fname, "peakMagnitude") == 0)
00086 *f = &RecoFFTJet::peakMagnitude;
00087 else if (strcmp(fname, "magnitude") == 0)
00088 *f = &RecoFFTJet::magnitude;
00089 else if (strcmp(fname, "driftSpeed") == 0)
00090 *f = &RecoFFTJet::driftSpeed;
00091 else if (strcmp(fname, "magSpeed") == 0)
00092 *f = &RecoFFTJet::magSpeed;
00093 else if (strcmp(fname, "lifetime") == 0)
00094 *f = &RecoFFTJet::lifetime;
00095 else if (strcmp(fname, "scale") == 0)
00096 *f = &RecoFFTJet::scale;
00097 else if (strcmp(fname, "nearestNeighborDistance") == 0)
00098 *f = &RecoFFTJet::nearestNeighborDistance;
00099 else if (strcmp(fname, "membershipFactor") == 0)
00100 *f = &RecoFFTJet::membershipFactor;
00101 else if (strcmp(fname, "recoScale") == 0)
00102 *f = &RecoFFTJet::recoScale;
00103 else if (strcmp(fname, "recoScaleRatio") == 0)
00104 *f = &RecoFFTJet::recoScaleRatio;
00105 else if (strcmp(fname, "laplacian") == 0)
00106 *f = &RecoFFTJet::laplacian;
00107 else if (strcmp(fname, "hessianDeterminant") == 0)
00108 *f = &RecoFFTJet::hessianDeterminant;
00109 else if (strcmp(fname, "clusterRadius") == 0)
00110 *f = &RecoFFTJet::clusterRadius;
00111 else if (strcmp(fname, "clusterSeparation") == 0)
00112 *f = &RecoFFTJet::clusterSeparation;
00113 else
00114 {
00115 return false;
00116 }
00117 return true;
00118 }
00119
00120
00121 namespace fftjetcms {
00122
00123 std::auto_ptr<fftjet::Grid2d<Real> >
00124 fftjet_Grid2d_parser(const edm::ParameterSet& ps)
00125 {
00126 typedef std::auto_ptr<fftjet::Grid2d<Real> > return_type;
00127 fftjet::Grid2d<Real> *g = 0;
00128
00129
00130 if (ps.exists("file"))
00131 {
00132 const std::string file = ps.getParameter<std::string>("file");
00133 std::ifstream in(file.c_str(),
00134 std::ios_base::in | std::ios_base::binary);
00135 if (!in.is_open())
00136 throw cms::Exception("FFTJetBadConfig")
00137 << "Failed to open file " << file << std::endl;
00138 g = fftjet::Grid2d<Real>::read(in);
00139 if (g == 0)
00140 throw cms::Exception("FFTJetBadConfig")
00141 << "Failed to read file " << file << std::endl;
00142 }
00143 else
00144 {
00145 const unsigned nEtaBins = ps.getParameter<unsigned>("nEtaBins");
00146 const Real etaMin = ps.getParameter<Real>("etaMin");
00147 const Real etaMax = ps.getParameter<Real>("etaMax");
00148 const unsigned nPhiBins = ps.getParameter<unsigned>("nPhiBins");
00149 const Real phiBin0Edge = ps.getParameter<Real>("phiBin0Edge");
00150 const std::string& title = ps.getUntrackedParameter<std::string>(
00151 "title", "");
00152
00153 if (nEtaBins == 0 || nPhiBins == 0 || etaMin >= etaMax)
00154 return return_type(NULL);
00155
00156 g = new fftjet::Grid2d<Real>(
00157 nEtaBins,
00158 etaMin,
00159 etaMax,
00160 nPhiBins,
00161 phiBin0Edge,
00162 title.c_str()
00163 );
00164
00165
00166 if (ps.exists("data"))
00167 {
00168 const std::vector<Real>& data =
00169 ps.getParameter<std::vector<Real> >("data");
00170 if (data.size() == nEtaBins*nPhiBins)
00171 g->blockSet(&data[0], nEtaBins, nPhiBins);
00172 else
00173 {
00174 delete g;
00175 g = 0;
00176 }
00177 }
00178 }
00179
00180 return return_type(g);
00181 }
00182
00183
00184 std::auto_ptr<fftjet::Functor1<bool,fftjet::Peak> >
00185 fftjet_PeakSelector_parser(const edm::ParameterSet& ps)
00186 {
00187 typedef std::auto_ptr<fftjet::Functor1<bool,fftjet::Peak> > return_type;
00188
00189 const std::string peakselector_type = ps.getParameter<std::string>(
00190 "Class");
00191
00192 if (!peakselector_type.compare("AllPeaksPass"))
00193 {
00194 return return_type(new fftjet::AllPeaksPass());
00195 }
00196
00197 if (!peakselector_type.compare("EtaAndPtDependentPeakSelector"))
00198 {
00199 const std::string file = ps.getParameter<std::string>("file");
00200 std::ifstream in(file.c_str(),
00201 std::ios_base::in | std::ios_base::binary);
00202 if (!in.is_open())
00203 throw cms::Exception("FFTJetBadConfig")
00204 << "Failed to open file " << file << std::endl;
00205 EtaAndPtDependentPeakSelector* ptr =
00206 new EtaAndPtDependentPeakSelector(in);
00207 if (!ptr->isValid())
00208 throw cms::Exception("FFTJetBadConfig")
00209 << "Failed to read file " << file << std::endl;
00210 return return_type(ptr);
00211 }
00212
00213 if (!peakselector_type.compare("EtaAndPtLookupPeakSelector"))
00214 {
00215 make_param(unsigned, nx);
00216 make_param(unsigned, ny);
00217 make_param(double, xmin);
00218 make_param(double, xmax);
00219 make_param(double, ymin);
00220 make_param(double, ymax);
00221 make_param(std::vector<double>, data);
00222
00223 if (xmin >= xmax || ymin >= ymax || !nx || !ny || data.size() != nx*ny)
00224 throw cms::Exception("FFTJetBadConfig")
00225 << "Failed to configure EtaAndPtLookupPeakSelector" << std::endl;
00226
00227 return return_type(new EtaAndPtLookupPeakSelector(
00228 nx, xmin, xmax, ny, ymin, ymax, data));
00229 }
00230
00231 if (!peakselector_type.compare("SimplePeakSelector"))
00232 {
00233 const double magCut = ps.getParameter<double>("magCut");
00234 const double driftSpeedCut = ps.getParameter<double>("driftSpeedCut");
00235 const double magSpeedCut = ps.getParameter<double>("magSpeedCut");
00236 const double lifeTimeCut = ps.getParameter<double>("lifeTimeCut");
00237 const double NNDCut = ps.getParameter<double>("NNDCut");
00238 const double etaCut = ps.getParameter<double>("etaCut");
00239
00240 return return_type(new fftjet::SimplePeakSelector(
00241 magCut, driftSpeedCut ,magSpeedCut, lifeTimeCut, NNDCut, etaCut));
00242 }
00243
00244 if (!peakselector_type.compare("ScalePowerPeakSelector"))
00245 {
00246 const double a = ps.getParameter<double>("a");
00247 const double p = ps.getParameter<double>("p");
00248 const double b = ps.getParameter<double>("b");
00249 const double etaCut = ps.getParameter<double>("etaCut");
00250
00251 return return_type(new fftjet::ScalePowerPeakSelector(
00252 a, p, b, etaCut));
00253 }
00254
00255 return return_type(NULL);
00256 }
00257
00258
00259 std::auto_ptr<fftjet::ScaleSpaceKernel>
00260 fftjet_MembershipFunction_parser(const edm::ParameterSet& ps)
00261 {
00262 typedef std::auto_ptr<fftjet::ScaleSpaceKernel> return_type;
00263
00264 const std::string MembershipFunction_type = ps.getParameter<std::string>(
00265 "Class");
00266
00267
00268 if (!MembershipFunction_type.compare("InterpolatedMembershipFcn"))
00269 {
00270
00271
00272
00273
00274
00275 const std::string file = ps.getParameter<std::string>("file");
00276 std::ifstream in(file.c_str(),
00277 std::ios_base::in | std::ios_base::binary);
00278 if (!in.is_open())
00279 throw cms::Exception("FFTJetBadConfig")
00280 << "Failed to open file " << file << std::endl;
00281 return return_type(fftjet::InterpolatedMembershipFcn<float>::read(in));
00282 }
00283
00284 if (!MembershipFunction_type.compare("Composite"))
00285 {
00286 throw cms::Exception("FFTJetBadConfig")
00287 << "Parsing of CompositeKernel objects is not implemented yet"
00288 << std::endl;
00289 }
00290
00291 if (!MembershipFunction_type.compare("MagneticSmearing"))
00292 {
00293
00294
00295
00296
00297 make_param(std::vector<double>, fragmentationData);
00298 make_param(double, numeratorConst);
00299 make_param(double, charge1Fraction);
00300 make_param(double, charge2Fraction);
00301 make_param(unsigned, samplesPerBin);
00302
00303 if (fragmentationData.empty())
00304 throw cms::Exception("FFTJetBadConfig")
00305 << "Fragmentation function data not defined for "
00306 "MagneticSmearingKernel" << std::endl;
00307 if (samplesPerBin < 1U)
00308 throw cms::Exception("FFTJetBadConfig")
00309 << "Bad number of samples per bin in "
00310 "MagneticSmearingKernel" << std::endl;
00311
00312 fftjet::LinearInterpolator1d* fragmentationFunction =
00313 new fftjet::LinearInterpolator1d(
00314 &fragmentationData[0], fragmentationData.size(), 0.0, 1.0);
00315
00316 return return_type(
00317 new fftjet::MagneticSmearingKernel<fftjet::LinearInterpolator1d>(
00318 fragmentationFunction, numeratorConst,
00319 charge1Fraction, charge2Fraction,
00320 samplesPerBin, true));
00321 }
00322
00323 if (!MembershipFunction_type.compare("Interpolated"))
00324 {
00325
00326 make_param(double, sx);
00327 make_param(double, sy);
00328 make_param(int, scalePower);
00329 make_param(unsigned, nxbins);
00330 make_param(double, xmin);
00331 make_param(double, xmax);
00332 make_param(unsigned, nybins);
00333 make_param(double, ymin);
00334 make_param(double, ymax);
00335 make_param(std::vector<double>, data);
00336
00337 if (data.size() != nxbins*nybins)
00338 throw cms::Exception("FFTJetBadConfig")
00339 << "Bad number of data points for Interpolated kernel"
00340 << std::endl;
00341
00342 return return_type(new fftjet::InterpolatedKernel(
00343 sx, sy, scalePower,
00344 &data[0], nxbins, xmin, xmax,
00345 nybins, ymin, ymax));
00346 }
00347
00348 if (!MembershipFunction_type.compare("Interpolated3d"))
00349 {
00350
00351 make_param(std::vector<double>, data);
00352 make_param(std::vector<double>, scales);
00353 make_param(bool, useLogSpaceForScale);
00354 make_param(unsigned, nxbins);
00355 make_param(double, xmin);
00356 make_param(double, xmax);
00357 make_param(unsigned, nybins);
00358 make_param(double, ymin);
00359 make_param(double, ymax);
00360
00361 if (data.size() != nxbins*nybins*scales.size())
00362 throw cms::Exception("FFTJetBadConfig")
00363 << "Bad number of data points for Interpolated3d kernel"
00364 << std::endl;
00365
00366 return return_type(new fftjet::InterpolatedKernel3d(
00367 &data[0], scales, useLogSpaceForScale,
00368 nxbins, xmin, xmax, nybins, ymin, ymax));
00369 }
00370
00371
00372
00373 fftjet::DefaultKernel2dFactory factory;
00374 if (factory[MembershipFunction_type] == NULL) {
00375 return return_type(NULL);
00376 }
00377
00378 make_param(double, sx);
00379 make_param(double, sy);
00380 make_param(int, scalePower);
00381 make_param(std::vector<double>, kernelParameters);
00382
00383 const int n_expected = factory[MembershipFunction_type]->nParameters();
00384 if (n_expected >= 0)
00385 if (static_cast<unsigned>(n_expected) != kernelParameters.size())
00386 throw cms::Exception("FFTJetBadConfig")
00387 << "Bad number of kernel parameters" << std::endl;
00388
00389 return std::auto_ptr<fftjet::ScaleSpaceKernel>(
00390 factory[MembershipFunction_type]->create(
00391 sx, sy, scalePower, kernelParameters));
00392 }
00393
00394
00395 std::auto_ptr<AbsBgFunctor>
00396 fftjet_BgFunctor_parser(const edm::ParameterSet& ps)
00397 {
00398 const std::string bg_Membership_type = ps.getParameter<std::string>(
00399 "Class");
00400
00401 if (!bg_Membership_type.compare("GaussianNoiseMembershipFcn"))
00402 {
00403 const double minWeight = ps.getParameter<double>("minWeight");
00404 const double prior = ps.getParameter<double>("prior");
00405 return std::auto_ptr<AbsBgFunctor>(
00406 new fftjet::GaussianNoiseMembershipFcn(minWeight,prior));
00407 }
00408
00409 return std::auto_ptr<AbsBgFunctor>(NULL);
00410 }
00411
00412
00413 std::auto_ptr<std::vector<double> >
00414 fftjet_ScaleSet_parser(const edm::ParameterSet& ps)
00415 {
00416 typedef std::auto_ptr<std::vector<double> > return_type;
00417
00418 const std::string className = ps.getParameter<std::string>("Class");
00419
00420 if (!className.compare("EquidistantInLinearSpace") ||
00421 !className.compare("EquidistantInLogSpace"))
00422 {
00423 const double minScale = ps.getParameter<double>("minScale");
00424 const double maxScale = ps.getParameter<double>("maxScale");
00425 const unsigned nScales = ps.getParameter<unsigned>("nScales");
00426
00427 if (minScale <= 0.0 || maxScale <= 0.0 ||
00428 nScales == 0 || minScale == maxScale)
00429 return return_type(NULL);
00430
00431
00432
00433
00434 if (!className.compare("EquidistantInLinearSpace"))
00435 return return_type(new std::vector<double>(
00436 fftjet::EquidistantInLinearSpace(
00437 minScale, maxScale, nScales)));
00438 else
00439 return return_type(new std::vector<double>(
00440 fftjet::EquidistantInLogSpace(
00441 minScale, maxScale, nScales)));
00442 }
00443
00444 if (!className.compare("UserSet"))
00445 {
00446 return_type scales(new std::vector<double>(
00447 ps.getParameter<std::vector<double> >("scales")));
00448
00449
00450 const unsigned nscales = scales->size();
00451 for (unsigned i=0; i<nscales; ++i)
00452 if ((*scales)[i] <= 0.0)
00453 return return_type(NULL);
00454
00455 for (unsigned i=1; i<nscales; ++i)
00456 for (unsigned j=0; j<i; ++j)
00457 if ((*scales)[i] == (*scales)[j])
00458 return return_type(NULL);
00459
00460 return scales;
00461 }
00462
00463 return return_type(NULL);
00464 }
00465
00466
00467 std::auto_ptr<fftjet::ClusteringTreeSparsifier<fftjet::Peak,long> >
00468 fftjet_ClusteringTreeSparsifier_parser(const edm::ParameterSet& ps)
00469 {
00470 typedef std::auto_ptr<fftjet::ClusteringTreeSparsifier<fftjet::Peak,long> > return_type;
00471
00472 const int maxLevelNumber = ps.getParameter<int>("maxLevelNumber");
00473 const unsigned filterMask = ps.getParameter<unsigned>("filterMask");
00474 const std::vector<double> userScalesV =
00475 ps.getParameter<std::vector<double> >("userScales");
00476 const unsigned nUserScales = userScalesV.size();
00477 const double* userScales = nUserScales ? NULL : &userScalesV[0];
00478
00479 return return_type(
00480 new fftjet::ClusteringTreeSparsifier<fftjet::Peak,long>(
00481 maxLevelNumber,
00482 filterMask,
00483 userScales,
00484 nUserScales
00485 )
00486 );
00487 }
00488
00489
00490 std::auto_ptr<fftjet::AbsDistanceCalculator<fftjet::Peak> >
00491 fftjet_DistanceCalculator_parser(const edm::ParameterSet& ps)
00492 {
00493 typedef std::auto_ptr<fftjet::AbsDistanceCalculator<fftjet::Peak> > return_type;
00494
00495 const std::string calc_type = ps.getParameter<std::string>("Class");
00496
00497 if (!calc_type.compare("PeakEtaPhiDistance"))
00498 {
00499 const double etaToPhiBandwidthRatio = ps.getParameter<double>(
00500 "etaToPhiBandwidthRatio");
00501 return return_type(new fftjet::PeakEtaPhiDistance(etaToPhiBandwidthRatio));
00502 }
00503
00504 if (!calc_type.compare("PeakEtaDependentDistance"))
00505 {
00506 std::auto_ptr<fftjet::LinearInterpolator1d> interp =
00507 fftjet_LinearInterpolator1d_parser(
00508 ps.getParameter<edm::ParameterSet>("Interpolator"));
00509 const fftjet::LinearInterpolator1d* ip = interp.get();
00510 if (ip == NULL)
00511 return return_type(NULL);
00512
00513
00514 const unsigned n = ip->nx();
00515 const double* data = ip->getData();
00516 for (unsigned i=0; i<n; ++i)
00517 if (data[i] <= 0.0)
00518 return return_type(NULL);
00519 if (ip->fLow() <= 0.0 || ip->fHigh() <= 0.0)
00520 return return_type(NULL);
00521
00522 return return_type(new fftjet::PeakEtaDependentDistance(*ip));
00523 }
00524
00525 return return_type(NULL);
00526 }
00527
00528
00529 std::auto_ptr<fftjetcms::LinInterpolatedTable1D>
00530 fftjet_LinInterpolatedTable1D_parser(const edm::ParameterSet& ps)
00531 {
00532 const double xmin = ps.getParameter<double>("xmin");
00533 const double xmax = ps.getParameter<double>("xmax");
00534 const bool leftExtrapolationLinear =
00535 ps.getParameter<bool>("leftExtrapolationLinear");
00536 const bool rightExtrapolationLinear =
00537 ps.getParameter<bool>("rightExtrapolationLinear");
00538 const std::vector<double> data(
00539 ps.getParameter<std::vector<double> >("data"));
00540 if (data.empty())
00541 return std::auto_ptr<fftjetcms::LinInterpolatedTable1D>(NULL);
00542 else
00543 return std::auto_ptr<fftjetcms::LinInterpolatedTable1D>(
00544 new fftjetcms::LinInterpolatedTable1D(
00545 &data[0], data.size(), xmin, xmax,
00546 leftExtrapolationLinear, rightExtrapolationLinear));
00547 }
00548
00549
00550 std::auto_ptr<fftjet::LinearInterpolator1d>
00551 fftjet_LinearInterpolator1d_parser(const edm::ParameterSet& ps)
00552 {
00553 const double xmin = ps.getParameter<double>("xmin");
00554 const double xmax = ps.getParameter<double>("xmax");
00555 const double flow = ps.getParameter<double>("flow");
00556 const double fhigh = ps.getParameter<double>("fhigh");
00557 const std::vector<double> data(
00558 ps.getParameter<std::vector<double> >("data"));
00559 if (data.empty())
00560 return std::auto_ptr<fftjet::LinearInterpolator1d>(NULL);
00561 else
00562 return std::auto_ptr<fftjet::LinearInterpolator1d>(
00563 new fftjet::LinearInterpolator1d(
00564 &data[0], data.size(), xmin, xmax, flow, fhigh));
00565 }
00566
00567
00568 std::auto_ptr<fftjet::LinearInterpolator2d>
00569 fftjet_LinearInterpolator2d_parser(const edm::ParameterSet& ps)
00570 {
00571 const std::string file = ps.getParameter<std::string>("file");
00572 std::ifstream in(file.c_str(),
00573 std::ios_base::in | std::ios_base::binary);
00574 if (!in.is_open())
00575 throw cms::Exception("FFTJetBadConfig")
00576 << "Failed to open file " << file << std::endl;
00577 fftjet::LinearInterpolator2d* ip = fftjet::LinearInterpolator2d::read(in);
00578 if (!ip)
00579 throw cms::Exception("FFTJetBadConfig")
00580 << "Failed to read file " << file << std::endl;
00581 return std::auto_ptr<fftjet::LinearInterpolator2d>(ip);
00582 }
00583
00584
00585 std::auto_ptr<fftjet::Functor1<double,fftjet::Peak> >
00586 fftjet_PeakFunctor_parser(const edm::ParameterSet& ps)
00587 {
00588 typedef fftjet::Functor1<double,fftjet::Peak> ptr_type;
00589 typedef std::auto_ptr<ptr_type> return_type;
00590
00591 const std::string property_type = ps.getParameter<std::string>("Class");
00592
00593 if (!property_type.compare("Log"))
00594 {
00595 return_type wrapped = fftjet_PeakFunctor_parser(
00596 ps.getParameter<edm::ParameterSet>("function"));
00597 ptr_type* wr = wrapped.get();
00598 if (wr)
00599 {
00600 return_type result = return_type(
00601 new fftjet::LogProperty<fftjet::Peak>(wr, true));
00602 wrapped.release();
00603 return result;
00604 }
00605 }
00606
00607 if (!property_type.compare("PeakProperty"))
00608 {
00609 const std::string member = ps.getParameter<std::string>("member");
00610 fftjet::JetProperty<fftjet::Peak>::JetMemberFunction fcn;
00611 if (parse_peak_member_function(member.c_str(), &fcn))
00612 return return_type(
00613 new fftjet::JetProperty<fftjet::Peak>(fcn));
00614 else
00615 return return_type(NULL);
00616 }
00617
00618 if (!property_type.compare("MinusScaledLaplacian"))
00619 {
00620 const double sx = ps.getParameter<double>("sx");
00621 const double sy = ps.getParameter<double>("sx");
00622 return return_type(
00623 new fftjet::MinusScaledLaplacian<fftjet::Peak>(sx, sy));
00624 }
00625
00626 if (!property_type.compare("ScaledHessianDet"))
00627 {
00628 return return_type(
00629 new fftjet::ScaledHessianDet<fftjet::Peak>());
00630 }
00631
00632 if (!property_type.compare("ScaledMagnitude"))
00633 {
00634 return return_type(
00635 new fftjet::ScaledMagnitude<fftjet::Peak>());
00636 }
00637
00638 if (!property_type.compare("ScaledMagnitude2"))
00639 {
00640 return return_type(
00641 new fftjet::ScaledMagnitude2<fftjet::Peak>());
00642 }
00643
00644 if (!property_type.compare("ConstDouble"))
00645 {
00646 const double value = ps.getParameter<double>("value");
00647 return return_type(new ConstDouble<fftjet::Peak>(value));
00648 }
00649
00650 if (!property_type.compare("ProportionalToScale"))
00651 {
00652 const double value = ps.getParameter<double>("value");
00653 return return_type(
00654 new ProportionalToScale<fftjet::Peak>(value));
00655 }
00656
00657 if (!property_type.compare("MultiplyByConst"))
00658 {
00659 const double factor = ps.getParameter<double>("factor");
00660 return_type function = fftjet_PeakFunctor_parser(
00661 ps.getParameter<edm::ParameterSet>("function"));
00662 ptr_type* ptr = function.get();
00663 if (ptr)
00664 {
00665 return_type result = return_type(
00666 new MultiplyByConst<fftjet::Peak>(factor, ptr, true));
00667 function.release();
00668 return result;
00669 }
00670 }
00671
00672 if (!property_type.compare("CompositeFunctor"))
00673 {
00674 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
00675 fftjet_Function_parser(
00676 ps.getParameter<edm::ParameterSet>("function1"));
00677 return_type fcn2 = fftjet_PeakFunctor_parser(
00678 ps.getParameter<edm::ParameterSet>("function2"));
00679 fftjet::Functor1<double,double>* f1 = fcn1.get();
00680 ptr_type* f2 = fcn2.get();
00681 if (f1 && f2)
00682 {
00683 return_type result = return_type(
00684 new CompositeFunctor<fftjet::Peak>(f1, f2, true));
00685 fcn1.release();
00686 fcn2.release();
00687 return result;
00688 }
00689 }
00690
00691 if (!property_type.compare("ProductFunctor"))
00692 {
00693 return_type fcn1 = fftjet_PeakFunctor_parser(
00694 ps.getParameter<edm::ParameterSet>("function1"));
00695 return_type fcn2 = fftjet_PeakFunctor_parser(
00696 ps.getParameter<edm::ParameterSet>("function2"));
00697 ptr_type* f1 = fcn1.get();
00698 ptr_type* f2 = fcn2.get();
00699 if (f1 && f2)
00700 {
00701 return_type result = return_type(
00702 new ProductFunctor<fftjet::Peak>(f1, f2, true));
00703 fcn1.release();
00704 fcn2.release();
00705 return result;
00706 }
00707 }
00708
00709 if (!property_type.compare("MagnitudeDependent"))
00710 {
00711 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
00712 fftjet_Function_parser(
00713 ps.getParameter<edm::ParameterSet>("function"));
00714 fftjet::Functor1<double,double>* f1 = fcn1.get();
00715 if (f1)
00716 {
00717 return_type result = return_type(
00718 new MagnitudeDependent<fftjet::Peak>(f1, true));
00719 fcn1.release();
00720 return result;
00721 }
00722 }
00723
00724 if (!property_type.compare("PeakEtaDependent"))
00725 {
00726 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
00727 fftjet_Function_parser(
00728 ps.getParameter<edm::ParameterSet>("function"));
00729 fftjet::Functor1<double,double>* f1 = fcn1.get();
00730 if (f1)
00731 {
00732 return_type result = return_type(new PeakEtaDependent(f1, true));
00733 fcn1.release();
00734 return result;
00735 }
00736 }
00737
00738 return return_type(NULL);
00739 }
00740
00741
00742 std::auto_ptr<fftjet::Functor1<double,fftjet::RecombinedJet<VectorLike> > >
00743 fftjet_JetFunctor_parser(const edm::ParameterSet& ps)
00744 {
00745 typedef fftjet::Functor1<double,RecoFFTJet> ptr_type;
00746 typedef std::auto_ptr<ptr_type> return_type;
00747
00748 const std::string property_type = ps.getParameter<std::string>("Class");
00749
00750 if (!property_type.compare("Log"))
00751 {
00752 return_type wrapped = fftjet_JetFunctor_parser(
00753 ps.getParameter<edm::ParameterSet>("function"));
00754 fftjet::Functor1<double,RecoFFTJet>* wr = wrapped.get();
00755 if (wr)
00756 {
00757 return_type result = return_type(
00758 new fftjet::LogProperty<RecoFFTJet>(wr, true));
00759 wrapped.release();
00760 return result;
00761 }
00762 }
00763
00764 if (!property_type.compare("JetEtaDependent"))
00765 {
00766 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
00767 fftjet_Function_parser(
00768 ps.getParameter<edm::ParameterSet>("function"));
00769 fftjet::Functor1<double,double>* f1 = fcn1.get();
00770 if (f1)
00771 {
00772 return_type result = return_type(new JetEtaDependent(f1, true));
00773 fcn1.release();
00774 return result;
00775 }
00776 }
00777
00778 if (!property_type.compare("JetProperty"))
00779 {
00780 const std::string member = ps.getParameter<std::string>("member");
00781 fftjet::JetProperty<RecoFFTJet>::JetMemberFunction fcn;
00782 if (parse_jet_member_function(member.c_str(), &fcn))
00783 return return_type(
00784 new fftjet::JetProperty<RecoFFTJet>(fcn));
00785 else
00786 return return_type(NULL);
00787 }
00788
00789 if (!property_type.compare("ConstDouble"))
00790 {
00791 const double value = ps.getParameter<double>("value");
00792 return return_type(new ConstDouble<RecoFFTJet>(value));
00793 }
00794
00795 if (!property_type.compare("ProportionalToScale"))
00796 {
00797 const double value = ps.getParameter<double>("value");
00798 return return_type(
00799 new ProportionalToScale<RecoFFTJet>(value));
00800 }
00801
00802 if (!property_type.compare("MultiplyByConst"))
00803 {
00804 const double factor = ps.getParameter<double>("factor");
00805 return_type function = fftjet_JetFunctor_parser(
00806 ps.getParameter<edm::ParameterSet>("function"));
00807 ptr_type* ptr = function.get();
00808 if (ptr)
00809 {
00810 return_type result = return_type(
00811 new MultiplyByConst<RecoFFTJet>(factor, ptr, true));
00812 function.release();
00813 return result;
00814 }
00815 }
00816
00817 if (!property_type.compare("CompositeFunctor"))
00818 {
00819 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
00820 fftjet_Function_parser(
00821 ps.getParameter<edm::ParameterSet>("function1"));
00822 return_type fcn2 = fftjet_JetFunctor_parser(
00823 ps.getParameter<edm::ParameterSet>("function2"));
00824 fftjet::Functor1<double,double>* f1 = fcn1.get();
00825 ptr_type* f2 = fcn2.get();
00826 if (f1 && f2)
00827 {
00828 return_type result = return_type(
00829 new CompositeFunctor<RecoFFTJet>(f1, f2, true));
00830 fcn1.release();
00831 fcn2.release();
00832 return result;
00833 }
00834 }
00835
00836 if (!property_type.compare("ProductFunctor"))
00837 {
00838 return_type fcn1 = fftjet_JetFunctor_parser(
00839 ps.getParameter<edm::ParameterSet>("function1"));
00840 return_type fcn2 = fftjet_JetFunctor_parser(
00841 ps.getParameter<edm::ParameterSet>("function2"));
00842 ptr_type* f1 = fcn1.get();
00843 ptr_type* f2 = fcn2.get();
00844 if (f1 && f2)
00845 {
00846 return_type result = return_type(
00847 new ProductFunctor<RecoFFTJet>(f1, f2, true));
00848 fcn1.release();
00849 fcn2.release();
00850 return result;
00851 }
00852 }
00853
00854 if (!property_type.compare("MagnitudeDependent"))
00855 {
00856 std::auto_ptr<fftjet::Functor1<double,double> > fcn1 =
00857 fftjet_Function_parser(
00858 ps.getParameter<edm::ParameterSet>("function"));
00859 fftjet::Functor1<double,double>* f1 = fcn1.get();
00860 if (f1)
00861 {
00862 return_type result = return_type(
00863 new MagnitudeDependent<RecoFFTJet>(f1, true));
00864 fcn1.release();
00865 return result;
00866 }
00867 }
00868
00869 return return_type(NULL);
00870 }
00871
00872
00873 std::auto_ptr<fftjet::Functor2<double,
00874 fftjet::RecombinedJet<VectorLike>,
00875 fftjet::RecombinedJet<VectorLike> > >
00876 fftjet_JetDistance_parser(const edm::ParameterSet& ps)
00877 {
00878 typedef std::auto_ptr<fftjet::Functor2<
00879 double,
00880 fftjet::RecombinedJet<VectorLike>,
00881 fftjet::RecombinedJet<VectorLike> > > return_type;
00882
00883 const std::string distance_type = ps.getParameter<std::string>(
00884 "Class");
00885
00886 if (!distance_type.compare("JetConvergenceDistance"))
00887 {
00888 make_param(double, etaToPhiBandwidthRatio);
00889 make_param(double, relativePtBandwidth);
00890
00891 if (etaToPhiBandwidthRatio > 0.0 && relativePtBandwidth > 0.0)
00892 return return_type(new JetConvergenceDistance(
00893 etaToPhiBandwidthRatio, relativePtBandwidth));
00894 }
00895
00896 return return_type(NULL);
00897 }
00898
00899
00900 std::auto_ptr<fftjet::Functor1<double,double> >
00901 fftjet_Function_parser(const edm::ParameterSet& ps)
00902 {
00903 typedef std::auto_ptr<fftjet::Functor1<double,double> > return_type;
00904
00905 const std::string fcn_type = ps.getParameter<std::string>("Class");
00906
00907 if (!fcn_type.compare("LinearInterpolator1d"))
00908 {
00909 std::auto_ptr<fftjet::LinearInterpolator1d> p =
00910 fftjet_LinearInterpolator1d_parser(ps);
00911 fftjet::LinearInterpolator1d* ptr = p.get();
00912 if (ptr)
00913 {
00914 p.release();
00915 return return_type(ptr);
00916 }
00917 }
00918
00919 if (!fcn_type.compare("LinInterpolatedTable1D"))
00920 {
00921 std::auto_ptr<fftjetcms::LinInterpolatedTable1D> p =
00922 fftjet_LinInterpolatedTable1D_parser(ps);
00923 fftjetcms::LinInterpolatedTable1D* ptr = p.get();
00924 if (ptr)
00925 {
00926 p.release();
00927 return return_type(ptr);
00928 }
00929 }
00930
00931 if (!fcn_type.compare("Polynomial"))
00932 {
00933 std::vector<double> coeffs;
00934 for (unsigned i=0; ; ++i)
00935 {
00936 std::ostringstream s;
00937 s << 'c' << i;
00938 if (ps.exists(s.str()))
00939 coeffs.push_back(ps.getParameter<double>(s.str()));
00940 else
00941 break;
00942 }
00943 return return_type(new Polynomial(coeffs));
00944 }
00945
00946 return return_type(NULL);
00947 }
00948
00949
00950 std::auto_ptr<AbsPileupCalculator>
00951 fftjet_PileupCalculator_parser(const edm::ParameterSet& ps)
00952 {
00953 typedef std::auto_ptr<AbsPileupCalculator> return_type;
00954
00955 const std::string fcn_type = ps.getParameter<std::string>("Class");
00956
00957 if (!fcn_type.compare("EtaDependentPileup"))
00958 {
00959 std::auto_ptr<fftjet::LinearInterpolator2d> interp =
00960 fftjet_LinearInterpolator2d_parser(
00961 ps.getParameter<edm::ParameterSet>("Interpolator2d"));
00962 const double inputRhoFactor = ps.getParameter<double>("inputRhoFactor");
00963 const double outputRhoFactor = ps.getParameter<double>("outputRhoFactor");
00964
00965 const fftjet::LinearInterpolator2d* ip = interp.get();
00966 if (ip)
00967 return return_type(new EtaDependentPileup(
00968 *ip, inputRhoFactor, outputRhoFactor));
00969 else
00970 return return_type(NULL);
00971 }
00972
00973 if (!fcn_type.compare("PileupGrid2d"))
00974 {
00975 std::auto_ptr<fftjet::Grid2d<Real> > grid =
00976 fftjet_Grid2d_parser(
00977 ps.getParameter<edm::ParameterSet>("Grid2d"));
00978 const double rhoFactor = ps.getParameter<double>("rhoFactor");
00979
00980 const fftjet::Grid2d<Real>* g = grid.get();
00981 if (g)
00982 return return_type(new PileupGrid2d(*g, rhoFactor));
00983 else
00984 return return_type(NULL);
00985 }
00986
00987 return return_type(NULL);
00988 }
00989
00990
00991 std::auto_ptr<fftjet::JetMagnitudeMapper2d <fftjet::Peak> >
00992 fftjet_PeakMagnitudeMapper2d_parser (const edm::ParameterSet& ps)
00993 {
00994 std::auto_ptr<fftjet::LinearInterpolator2d> responseCurve =
00995 fftjet_LinearInterpolator2d_parser(
00996 ps.getParameter<edm::ParameterSet>("responseCurve"));
00997
00998 const double minPredictor = ps.getParameter<double>("minPredictor");
00999 const double maxPredictor = ps.getParameter<double>("maxPredictor");
01000 const unsigned nPredPoints = ps.getParameter<unsigned>("nPredPoints");
01001 const double maxMagnitude = ps.getParameter<double>("maxMagnitude");
01002 const unsigned nMagPoints = ps.getParameter<unsigned>("nMagPoints");
01003
01004 return (std::auto_ptr<fftjet::JetMagnitudeMapper2d<fftjet::Peak> >
01005 (new fftjet::JetMagnitudeMapper2d<fftjet::Peak>(
01006 *responseCurve,
01007 new fftjetcms::PeakAbsEta<fftjet::Peak>(),
01008 true,minPredictor,maxPredictor,nPredPoints,
01009 maxMagnitude,nMagPoints)));
01010 }
01011
01012
01013 std::auto_ptr<fftjet::JetMagnitudeMapper2d <fftjet::RecombinedJet<VectorLike> > >
01014 fftjet_JetMagnitudeMapper2d_parser (const edm::ParameterSet& ps)
01015 {
01016 std::auto_ptr<fftjet::LinearInterpolator2d> responseCurve =
01017 fftjet_LinearInterpolator2d_parser(
01018 ps.getParameter<edm::ParameterSet>("responseCurve"));
01019
01020 const double minPredictor = ps.getParameter<double>("minPredictor");
01021 const double maxPredictor = ps.getParameter<double>("maxPredictor");
01022 const unsigned nPredPoints = ps.getParameter<unsigned>("nPredPoints");
01023 const double maxMagnitude = ps.getParameter<double>("maxMagnitude");
01024 const unsigned nMagPoints = ps.getParameter<unsigned>("nMagPoints");
01025
01026 return (std::auto_ptr<fftjet::JetMagnitudeMapper2d<RecoFFTJet> >
01027 (new fftjet::JetMagnitudeMapper2d<RecoFFTJet>(
01028 *responseCurve,
01029 new fftjetcms::JetAbsEta<RecoFFTJet>(),
01030 true,minPredictor,maxPredictor,nPredPoints,
01031 maxMagnitude,nMagPoints)));
01032 }
01033
01034 }