File indexing completed on 2024-04-06 12:27:21
0001 #ifndef RecoParticleFlow_PFClusterProducer_CaloRecHitResolutionProvider_h
0002 #define RecoParticleFlow_PFClusterProducer_CaloRecHitResolutionProvider_h
0003
0004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0005
0006 #include <cmath>
0007
0008 class CaloRecHitResolutionProvider {
0009 public:
0010 CaloRecHitResolutionProvider(const edm::ParameterSet& iConfig) {
0011 noiseTerm_ = iConfig.getParameter<double>("noiseTerm");
0012 constantTerm2_ = std::pow(iConfig.getParameter<double>("constantTerm"), 2);
0013 noiseTermLowE_ = iConfig.getParameter<double>("noiseTermLowE");
0014 corrTermLowE_ = iConfig.getParameter<double>("corrTermLowE");
0015 constantTermLowE2_ = std::pow(iConfig.getParameter<double>("constantTermLowE"), 2);
0016 threshLowE_ = iConfig.getParameter<double>("threshLowE");
0017 threshHighE_ = iConfig.getParameter<double>("threshHighE");
0018
0019 resHighE2_ = std::pow((noiseTerm_ / threshHighE_), 2) + constantTerm2_;
0020 }
0021
0022 double timeResolution2(double energy) {
0023 double res2 = 10000.;
0024
0025 if (energy <= 0.)
0026 return res2;
0027 else if (energy < threshLowE_) {
0028 if (corrTermLowE_ > 0.) {
0029 const double res = noiseTermLowE_ / energy + corrTermLowE_ / (energy * energy);
0030 res2 = res * res;
0031 } else {
0032 const double noiseDivE = noiseTermLowE_ / energy;
0033 res2 = noiseDivE * noiseDivE + constantTermLowE2_;
0034 }
0035 } else if (energy < threshHighE_) {
0036 const double noiseDivE = noiseTerm_ / energy;
0037 res2 = noiseDivE * noiseDivE + constantTerm2_;
0038 } else
0039 res2 = resHighE2_;
0040
0041 if (res2 > 10000.)
0042 return 10000.;
0043 return res2;
0044 }
0045
0046 private:
0047 double noiseTerm_;
0048 double constantTerm2_;
0049
0050 double noiseTermLowE_;
0051 double constantTermLowE2_;
0052 double corrTermLowE_;
0053
0054 double threshLowE_;
0055 double threshHighE_;
0056
0057 double resHighE2_;
0058 };
0059
0060 #endif