Go to the documentation of this file.00001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00002 #include "CalibCalorimetry/HcalAlgos/interface/HcalShapeIntegrator.h"
00003 #include <algorithm>
00004 #include <math.h>
00005 #include <iostream>
00006 #include <boost/scoped_ptr.hpp>
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 template <class T_algo>
00017 void genlkupmap(double smin,
00018 double smax,
00019 double max_fracerror,
00020 double min_sstep,
00021 T_algo& algoObject,
00022 std::map<double,double>& m_ylookup)
00023 {
00024 std::pair<double,double> thisxy, lastxy, laststoredxy;
00025 std::pair<double,double> minxy = algoObject.calcpair(smin);
00026 std::pair<double,double> maxxy = algoObject.calcpair(smax);
00027
00028 double slope = maxxy.second - minxy.second;
00029 slope = (slope >= 0.0) ? 1.0 : -1.0;
00030
00031 double sstep = min_sstep;
00032
00033 for (double s=smin; lastxy.first<smax; s += sstep) {
00034
00035 thisxy = algoObject.calcpair(s);
00036
00037 double fracerror = slope*(thisxy.second - laststoredxy.second)/ thisxy.second;
00038 double fracchange = slope*(thisxy.second - lastxy.second)/ thisxy.second;
00039
00040 bool store_cur_pair = false;
00041 bool store_prev_pair = false;
00042
00043 #if 0
00044 char str[80];
00045 sprintf(str, "%7.1f %7.1f (%8.3f %8.4f) %8.5f %8.5f",
00046 s, sstep, thisxy.first, thisxy.second, fracerror, fracchange);
00047 cout << str;
00048 #endif
00049
00050 if (s == smin) {
00051 store_cur_pair = true;
00052 }
00053 else if ((fracerror > 2*max_fracerror) ||
00054 (thisxy.first > smax) ) {
00055 if (sstep > min_sstep) {
00056
00057 s -= sstep;
00058 sstep = std::max(0.5*sstep, min_sstep);
00059 #if 0
00060 cout << endl;
00061 #endif
00062 continue;
00063 }
00064 else if (lastxy.second == laststoredxy.second) {
00065 store_cur_pair = true;
00066
00067
00068
00069
00070 edm::LogWarning("HcalPulseContainmentCorrection::genlkupmap") << " fractional error max exceeded";
00071 }
00072 else {
00073 store_prev_pair = true;
00074
00075
00076 fracerror = slope*(thisxy.second - lastxy.second)/ thisxy.second;
00077
00078 if (fracerror > 2*max_fracerror) {
00079 store_cur_pair = true;
00080
00081
00082
00083
00084 edm::LogWarning("HcalPulseContainmentCorrection::genlkupmap") << " fractional error max exceeded";
00085 }
00086 }
00087 }
00088 else if ((fracerror < 1.9*max_fracerror) &&
00089 (fracchange < 0.1*max_fracerror) &&
00090 (thisxy.first < 0.99 * smax) ) {
00091
00092 sstep *= 2.0;
00093 }
00094
00095 if (thisxy.first > smax)
00096 store_cur_pair = true;
00097
00098 if (store_prev_pair) {
00099 m_ylookup[lastxy.first] = lastxy.second;
00100 laststoredxy = lastxy;
00101 }
00102 if (store_cur_pair) {
00103 m_ylookup[thisxy.first] = thisxy.second;
00104 laststoredxy = thisxy;
00105 }
00106
00107 lastxy = thisxy;
00108
00109 #if 0
00110 sprintf(str, " %c %c",
00111 store_cur_pair ? 'C' : ' ',
00112 store_prev_pair ? 'P' : ' ');
00113 cout << str << endl;
00114 #endif
00115
00116 }
00117
00118 }
00119
00120
00121
00122
00123 template <class S>
00124 class RecoFCcorFactorAlgo {
00125 public:
00126 RecoFCcorFactorAlgo(int num_samples,
00127 double fixedphase_ns);
00128 std::pair<double,double> calcpair(double);
00129 private:
00130 double fixedphasens_;
00131 double integrationwindowns_;
00132 double time0shiftns_;
00133 S shape_;
00134 const boost::scoped_ptr<HcalShapeIntegrator> integrator_;
00135 };
00136