Main Page | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members | Related Pages

CutBinning.C

Go to the documentation of this file.
00001 
00021 #include "jbltools/sfh/CutBinning.h"
00022 #include "jbltools/sfh/FillIterator.h"
00023 #include "jbltools/sfh/BaseCutBase.h"
00024 
00025 #include <iostream>
00026 #include <cstring>
00027 
00028 static const char *ident="@(#)$Id: CutBinning.C,v 1.4 2005/07/20 10:51:32 blist Exp $";
00029 
00030  
00031 CutBinning::CutBinning (int nbins, const BaseCut *cuts[], const char *name) 
00032 : BinningFun (nbins, -0.5, nbins-0.5, (name ? std::string(name) : "")),
00033   theCuts(nbins), binNames(nbins), binTitles(nbins),
00034   theFillIterator (0)
00035 {
00036   for (int i = 0; i < nbins; ++i) {
00037     const BaseCut *cut = cuts[i];
00038     theCuts[i] = cut;
00039     binNames[i] = str(i, 3);
00040     binTitles[i] = cut ? std::string(cut->getName()) : "";
00041   }
00042   genDefinition();
00043 }
00044 
00045 CutBinning::CutBinning (int nbins, BaseCut *cuts[], const char *name) 
00046 : BinningFun (nbins, -0.5, nbins-0.5, (name ? std::string(name) : "")),
00047   theCuts(nbins), binNames(nbins), binTitles(nbins),
00048   theFillIterator (0)
00049 {
00050   for (int i = 0; i < nbins; ++i) {
00051     const BaseCut *cut = cuts[i];
00052     theCuts[i] = cut;
00053     binNames[i] = str(i, 3);
00054     binTitles[i] = cut ? std::string(cut->getName()) : "";
00055   }
00056   genDefinition();
00057 }
00058  
00059 CutBinning::CutBinning (int nbins, const BaseCut *cuts[], const char *titles[], const char *name) 
00060 : BinningFun (nbins, -0.5, nbins-0.5, (name ? std::string(name) : "")),
00061   theCuts(nbins), binNames(nbins), binTitles(nbins),
00062   theFillIterator (0)
00063 {
00064   for (int i = 0; i < nbins; ++i) {
00065     const BaseCut *cut = cuts[i];
00066     const char *title = titles[i];
00067     theCuts[i] = cut;
00068     binNames[i] = str(i, 3);
00069     binTitles[i] = title ? std::string (title) : "";
00070   }
00071   genDefinition();
00072 }
00073 CutBinning::CutBinning (int nbins, BaseCut *cuts[], const char *titles[], const char *name) 
00074 : BinningFun (nbins, -0.5, nbins-0.5, (name ? std::string(name) : "")),
00075   theCuts(nbins), binNames(nbins), binTitles(nbins),
00076   theFillIterator (0)
00077 {
00078   for (int i = 0; i < nbins; ++i) {
00079     const BaseCut *cut = cuts[i];
00080     const char *title = titles[i];
00081     theCuts[i] = cut;
00082     binNames[i] = str(i, 3);
00083     binTitles[i] = title ? std::string (title) : "";
00084   }
00085   genDefinition();
00086 }
00087 
00088 bool CutBinning::operator() (int i) const {
00089       const BaseCut *cut = (i >= 0 && static_cast<unsigned int>(i) < theCuts.size()) ? theCuts[i] : 0;                 
00090       return cut ? (*cut)() : true; 
00091     }    
00092                     
00093 const char *CutBinning::getBinName(int i) const {
00094   if (i < 0 || i >= getNBins()) return 0;
00095   size_t len = binNames[i].size()+1;
00096   char *result = new char[len];
00097   strncpy (result, binNames[i].c_str(), len);
00098   return result;
00099 }
00100 
00101 const char *CutBinning::getBinTitle(int i) const {
00102   if (i < 0 || i >= getNBins()) return 0;
00103   size_t len = binTitles[i].size()+1;
00104   char *result = new char[len];
00105   strncpy (result, binTitles[i].c_str(), len);
00106   return result;
00107 }
00108 
00109 void CutBinning::genDefinition() {
00110   std::string definition_("(");
00111   int i = 0;
00112   while (i < getNBins()) {
00113     definition_ += binTitles[i];
00114     if (++i >= getNBins()) break;
00115     definition_ += std::string(", ");
00116   }
00117   definition_ += ")";
00118   setDefinition (definition_);
00119 }
00120 
00121 void CutBinning::checkIterators() {
00122   theFillIterator = 0;
00123   const FillIterator *fi = 0;
00124   for (int i = 0; i < getNBins(); ++i) {
00125     const BaseCut *cut = theCuts[i];
00126     if (cut && (fi = cut->getIterator())) {
00127       if (!theFillIterator) {
00128         theFillIterator = fi;
00129       } 
00130       else if (theFillIterator != fi) {
00131         std::cerr << "CutBinning::checkIterators: cut " << i 
00132                   << " depends on iterator " << fi->getName()
00133                   << ", other cuts depend on " << theFillIterator->getName()
00134                   << "!\n  (If bothe have the same name, it is a different instance!)\n";
00135       }
00136     }
00137   }
00138 }
00139 
00140 bool CutBinning::hasBinLabels() const {
00141   return true;
00142 }
00143     
00144 const char *CutBinning::getBinLabel(int i) const {
00145   return getBinTitle(i);
00146 }

Generated on Thu Oct 26 12:52:55 2006 for SFH by doxygen 1.3.2