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