00001 00025 #include "jbltools/sfh/SFHProf.h" 00026 00027 #include "jbltools/sfh/FloatFunBase.h" 00028 #include "jbltools/sfh/BaseCutBase.h" 00029 #include "jbltools/sfh/FillIterator.h" 00030 #include "jbltools/sfh/Binning.h" 00031 00032 #include <iostream> 00033 00034 static const char *ident="@(#)$Id: SFHProf.C,v 1.13 2005/08/23 12:05:44 blist Exp $"; 00035 00036 SFHProf::SFHProf (const char* name, const char* title, 00037 Int_t nbinsx, Axis_t xlow, Axis_t xup, 00038 Option_t *option, 00039 const ROListPoR& hhl, 00040 const FloatFunPoR& xfun_, 00041 const FloatFunPoR& yfun_, 00042 const BaseCutPoR& cut_, 00043 const FloatFunPoR& wfun_, 00044 const FillIteratorPoR& iter_) 00045 : RegHProf (name, title, nbinsx, xlow, xup, option, hhl), 00046 xfun(xfun_.pff), 00047 yfun(yfun_.pff), 00048 cut(cut_.pbc), 00049 wfun(wfun_.pff), 00050 iter(iter_.pfi) 00051 { 00052 checkIterators(name); 00053 } 00054 00055 00056 SFHProf::SFHProf (const char* name, const char* title, 00057 Int_t nbinsx, Axis_t xlow, Axis_t xup, 00058 Axis_t ylow, Axis_t yup, 00059 Option_t *option, 00060 const ROListPoR& hhl, 00061 const FloatFunPoR& xfun_, 00062 const FloatFunPoR& yfun_, 00063 const BaseCutPoR& cut_, 00064 const FloatFunPoR& wfun_, 00065 const FillIteratorPoR& iter_) 00066 : RegHProf (name, title, nbinsx, xlow, xup, ylow, yup, option, hhl), 00067 xfun(xfun_.pff), 00068 yfun(yfun_.pff), 00069 cut(cut_.pbc), 00070 wfun(wfun_.pff), 00071 iter(iter_.pfi) 00072 { 00073 checkIterators(name); 00074 } 00075 00076 00077 SFHProf::SFHProf (const char* name, const char* title, 00078 Int_t nbinsx, const Float_t* xbins, 00079 Option_t *option, 00080 const ROListPoR& hhl, 00081 const FloatFunPoR& xfun_, 00082 const FloatFunPoR& yfun_, 00083 const BaseCutPoR& cut_, 00084 const FloatFunPoR& wfun_, 00085 const FillIteratorPoR& iter_) 00086 : RegHProf (name, title, nbinsx, xbins, option, hhl), 00087 xfun(xfun_.pff), 00088 yfun(yfun_.pff), 00089 cut(cut_.pbc), 00090 wfun(wfun_.pff), 00091 iter(iter_.pfi) 00092 { 00093 checkIterators(name); 00094 } 00095 00096 SFHProf::SFHProf (const char* name, const char* title, 00097 Int_t nbinsx, const Double_t* xbins, 00098 Option_t *option, 00099 const ROListPoR& hhl, 00100 const FloatFunPoR& xfun_, 00101 const FloatFunPoR& yfun_, 00102 const BaseCutPoR& cut_, 00103 const FloatFunPoR& wfun_, 00104 const FillIteratorPoR& iter_) 00105 : RegHProf (name, title, nbinsx, xbins, option, hhl), 00106 xfun(xfun_.pff), 00107 yfun(yfun_.pff), 00108 cut(cut_.pbc), 00109 wfun(wfun_.pff), 00110 iter(iter_.pfi) 00111 { 00112 checkIterators(name); 00113 } 00114 00115 SFHProf::SFHProf (const char* name, const char* title, 00116 Int_t nbinsx, const Double_t* xbins, 00117 Axis_t ylow, Axis_t yup, 00118 Option_t *option, 00119 const ROListPoR& hhl, 00120 const FloatFunPoR& xfun_, 00121 const FloatFunPoR& yfun_, 00122 const BaseCutPoR& cut_, 00123 const FloatFunPoR& wfun_, 00124 const FillIteratorPoR& iter_) 00125 : RegHProf (name, title, nbinsx, xbins, ylow, yup, option, hhl), 00126 xfun(xfun_.pff), 00127 yfun(yfun_.pff), 00128 cut(cut_.pbc), 00129 wfun(wfun_.pff), 00130 iter(iter_.pfi) 00131 { 00132 checkIterators(name); 00133 } 00134 00135 SFHProf::SFHProf (const char* name, 00136 const char* title, 00137 const Binning& binning, 00138 Option_t *option, 00139 const ROListPoR& hhl, 00140 const FloatFunPoR& xfun_, 00141 const FloatFunPoR& yfun_, 00142 const BaseCutPoR& cut_, 00143 const FloatFunPoR& wfun_, 00144 const FillIteratorPoR& iter_) 00145 : RegHProf (name, title, binning, option, hhl), 00146 xfun(xfun_.pff), 00147 yfun(yfun_.pff), 00148 cut(cut_.pbc), 00149 wfun(wfun_.pff), 00150 iter(iter_.pfi) 00151 { 00152 checkIterators(name); 00153 } 00154 00155 SFHProf::SFHProf (const char* name, 00156 const char* title, 00157 const Binning& binning, 00158 Axis_t ylow, Axis_t yup, 00159 Option_t *option, 00160 const ROListPoR& hhl, 00161 const FloatFunPoR& xfun_, 00162 const FloatFunPoR& yfun_, 00163 const BaseCutPoR& cut_, 00164 const FloatFunPoR& wfun_, 00165 const FillIteratorPoR& iter_) 00166 : RegHProf (name, title, binning, ylow, yup, option, hhl), 00167 xfun(xfun_.pff), 00168 yfun(yfun_.pff), 00169 cut(cut_.pbc), 00170 wfun(wfun_.pff), 00171 iter(iter_.pfi) 00172 { 00173 checkIterators(name); 00174 } 00175 00176 00177 SFHProf::~SFHProf() {} 00178 00179 void SFHProf::Fill() { 00180 if (!xfun) return; 00181 if (!iter || iter->reset()) { 00182 do { 00183 if (!cut || (*cut)()) { 00184 Float_FF w = wfun ? (*wfun)() : 1.; 00185 this->TProfile::Fill ((*xfun)(), (*yfun)(), w); 00186 } 00187 } while (iter && iter->next()); 00188 } 00189 } 00190 00191 template<class Fun1, class Fun2> 00192 void SFHProf::checkTwoIterators(const char *name, 00193 const char *fun1name, Fun1 *fun1, 00194 const char *fun2name, Fun2 *fun2) { 00195 if (fun1 && fun1->getIterator() && 00196 fun2 && fun2->getIterator() && 00197 fun1->getIterator() != fun2->getIterator()) { 00198 std::cerr << "SFHProf: Iterators of " << fun1name 00199 << " and " << fun2name 00200 << " are different for histogram " 00201 << name << "!" << std::endl; 00202 } 00203 assert (!fun1 || !fun1->getIterator() || !fun2 || !fun2->getIterator() || fun1->getIterator() == fun2->getIterator()); 00204 } 00205 template<class Fun> 00206 void SFHProf::checkOneIterator (const char *name, 00207 const char *funname, 00208 Fun *fun) { 00209 if (fun && fun->getIterator()) { 00210 if (iter) { 00211 if (fun->getIterator() != iter) { 00212 std::cerr << "SFHProf: Iterator '" 00213 << fun->getIterator()->getName() 00214 << "' of " << funname 00215 << " '" << fun->getName() << "'" 00216 << " and iter '" << iter->getName() 00217 << "'are different for histogram " 00218 << name << "!\n"; 00219 } 00220 } 00221 else { 00222 #if(DEBUG>=2) 00223 std::cerr << "SFHProf: Iterator '" 00224 << fun->getIterator()->getName() << "' of " 00225 << funname 00226 << " '" << fun->getName() << "'" 00227 << " used as iterator for histogram " 00228 << name << ".\n"; 00229 #endif 00230 iter = const_cast<FillIterator *>(fun->getIterator()); 00231 } 00232 } 00233 assert (!fun || !fun->getIterator() || fun->getIterator() == iter); 00234 } 00235 00236 void SFHProf::checkIterators(const char *name) { 00237 checkTwoIterators (name, "xfun", xfun, "yfun", yfun); 00238 checkTwoIterators (name, "xfun", xfun, "cut", cut); 00239 checkTwoIterators (name, "xfun", xfun, "wfun", wfun); 00240 checkTwoIterators (name, "yfun", yfun, "cut", cut); 00241 checkTwoIterators (name, "yfun", yfun, "wfun", wfun); 00242 checkTwoIterators (name, "wfun", wfun, "cut", cut); 00243 00244 checkOneIterator (name, "xfun", xfun); 00245 checkOneIterator (name, "yfun", yfun); 00246 checkOneIterator (name, "wfun", wfun); 00247 checkOneIterator (name, "cut", cut); 00248 } 00249 00250 00251