00001 #include "Binning.h" 00002 00003 #include <iostream> 00004 #include <cmath> 00005 00006 using namespace OscFit; 00007 00008 Binning::Binning( const char* xtitle, Int_t xbins, Double_t* xedges ) 00009 { 00010 fXbins = xbins; 00011 fXedges = new Double_t[fXbins+1]; 00012 fXtitle = xtitle; 00013 00014 for( Int_t ibin=0; ibin<fXbins+1; ibin++ ){ 00015 fXedges[ibin] = xedges[ibin]; 00016 } 00017 00018 fYbins = 1; 00019 fYedges = new Double_t[2]; 00020 fYedges[0] = -1.0e6; 00021 fYedges[1] = +1.0e6; 00022 fYtitle = ""; 00023 } 00024 00025 Binning::Binning( const char* xtitle, Int_t xbins, Double_t* xedges, const char* ytitle, Int_t ybins, Double_t* yedges ) 00026 { 00027 fXbins = xbins; 00028 fXedges = new Double_t[fXbins+1]; 00029 fXtitle = xtitle; 00030 00031 for( Int_t ibin=0; ibin<fXbins+1; ibin++ ){ 00032 fXedges[ibin] = xedges[ibin]; 00033 } 00034 00035 fYbins = ybins; 00036 fYedges = new Double_t[fYbins+1]; 00037 fYtitle = ytitle; 00038 00039 for( Int_t ibin=0; ibin<fYbins+1; ibin++ ){ 00040 fYedges[ibin] = yedges[ibin]; 00041 } 00042 } 00043 00044 Binning::~Binning() 00045 { 00046 if( fXedges ) delete [] fXedges; 00047 if( fYedges ) delete [] fYedges; 00048 } 00049 00050 Int_t Binning::FindBinX( Double_t x ) 00051 { 00052 for( Int_t ibin=0; ibin<fXbins; ibin++ ){ 00053 if( x>=fXedges[ibin] && x<fXedges[ibin+1] ){ 00054 return ibin; 00055 } 00056 } 00057 00058 return -1; 00059 } 00060 00061 Int_t Binning::FindBinY( Double_t y ) 00062 { 00063 for( Int_t ibin=0; ibin<fYbins; ibin++ ){ 00064 if( y>=fYedges[ibin] && y<fYedges[ibin+1] ){ 00065 return ibin; 00066 } 00067 } 00068 00069 return -1; 00070 } 00071 00072 Int_t Binning::FindBin( Double_t x, Double_t y ) 00073 { 00074 Int_t binX = FindBinX(x); 00075 Int_t binY = FindBinY(y); 00076 00077 return GetBinNumber(binX,binY); 00078 } 00079 00080 Int_t Binning::GetBinNumber( Int_t x, Int_t y ) 00081 { 00082 if( x>=0 && x<fXbins 00083 && y>=0 && y<fYbins ){ 00084 return x + fXbins*y; 00085 } 00086 00087 return -1; 00088 } 00089 00090 TH1D* Binning::MakeTH1D( const char* histName ) 00091 { 00092 if( fYbins>1 ) return 0; 00093 00094 TH1D* hNew = new TH1D(histName,"",fXbins,fXedges); 00095 hNew->GetXaxis()->SetTitle(fXtitle.Data()); 00096 hNew->GetXaxis()->CenterTitle(); 00097 00098 return hNew; 00099 } 00100 00101 TH2D* Binning::MakeTH2D( const char* histName ) 00102 { 00103 TH2D* hNew = new TH2D(histName,"",fXbins,fXedges, 00104 fYbins,fYedges); 00105 hNew->GetXaxis()->SetTitle(fXtitle.Data()); 00106 hNew->GetYaxis()->SetTitle(fYtitle.Data()); 00107 hNew->GetXaxis()->CenterTitle(); 00108 hNew->GetYaxis()->CenterTitle(); 00109 00110 return hNew; 00111 } 00112 00113 void Binning::PrintBinningScheme() 00114 { 00115 std::cout << " *** Binning::PrintBinningScheme() *** " << std::endl; 00116 00117 if( fXbins>1 ){ 00118 std::cout << " X-axis (" << fXtitle.Data() << "):" << std::endl; 00119 for( Int_t n=0; n<fXbins+1; n++ ){ 00120 std::cout << " [" << n << "] " << fXedges[n] << std::endl; 00121 } 00122 } 00123 00124 if( fYbins>1 ){ 00125 std::cout << " Y-axis (" << fYtitle.Data() << "): " << std::endl; 00126 for( Int_t n=0; n<fYbins+1; n++ ){ 00127 std::cout << " [" << n << "] " << fYedges[n] << std::endl; 00128 } 00129 } 00130 } 00131