00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "Riostream.h"
00019 #include "TH1.h"
00020 #include "TFoamMaxwt.h"
00021
00022 ClassImp(TFoamMaxwt);
00023
00024
00025 TFoamMaxwt::TFoamMaxwt()
00026 {
00027
00028 fNent = 0;
00029 fnBin = 0;
00030 fWtHst1 = 0;
00031 fWtHst2 = 0;
00032 }
00033
00034
00035 TFoamMaxwt::TFoamMaxwt(Double_t wmax, Int_t nBin)
00036 {
00037
00038 fNent = 0;
00039 fnBin = nBin;
00040 fwmax = wmax;
00041 fWtHst1 = new TH1D("TFoamMaxwt_hst_Wt1","Histo of weight ",nBin,0.0,wmax);
00042 fWtHst2 = new TH1D("TFoamMaxwt_hst_Wt2","Histo of weight**2",nBin,0.0,wmax);
00043 fWtHst1->SetDirectory(0);
00044 fWtHst2->SetDirectory(0);
00045 }
00046
00047
00048 TFoamMaxwt::TFoamMaxwt(TFoamMaxwt &From): TObject(From)
00049 {
00050
00051 fnBin = From.fnBin;
00052 fwmax = From.fwmax;
00053 fWtHst1 = From.fWtHst1;
00054 fWtHst2 = From.fWtHst2;
00055 Error("TFoamMaxwt","COPY CONSTRUCTOR NOT TESTED!");
00056 }
00057
00058
00059 TFoamMaxwt::~TFoamMaxwt()
00060 {
00061
00062 delete fWtHst1;
00063 delete fWtHst2;
00064 fWtHst1=0;
00065 fWtHst2=0;
00066 }
00067
00068 void TFoamMaxwt::Reset()
00069 {
00070
00071 fNent = 0;
00072 fWtHst1->Reset();
00073 fWtHst2->Reset();
00074 }
00075
00076
00077 TFoamMaxwt& TFoamMaxwt::operator=(const TFoamMaxwt &From)
00078 {
00079
00080 if (&From == this) return *this;
00081 fnBin = From.fnBin;
00082 fwmax = From.fwmax;
00083 fWtHst1 = From.fWtHst1;
00084 fWtHst2 = From.fWtHst2;
00085 return *this;
00086 }
00087
00088
00089 void TFoamMaxwt::Fill(Double_t wt)
00090 {
00091
00092 fNent = fNent+1.0;
00093 fWtHst1->Fill(wt,1.0);
00094 fWtHst2->Fill(wt,wt);
00095 }
00096
00097
00098 void TFoamMaxwt::Make(Double_t eps, Double_t &MCeff)
00099 {
00100
00101
00102
00103 Double_t wtLim,aveWt;
00104 GetMCeff(eps, MCeff, wtLim);
00105 aveWt = MCeff*wtLim;
00106 cout<< "00000000000000000000000000000000000000000000000000000000000000000000000"<<endl;
00107 cout<< "00 -->wtLim: No_evt ="<<fNent<<" <Wt> = "<<aveWt<<" wtLim= "<<wtLim<<endl;
00108 cout<< "00 -->wtLim: For eps = "<<eps <<" EFFICIENCY <Wt>/wtLim= "<<MCeff<<endl;
00109 cout<< "00000000000000000000000000000000000000000000000000000000000000000000000"<<endl;
00110 }
00111
00112
00113 void TFoamMaxwt::GetMCeff(Double_t eps, Double_t &MCeff, Double_t &wtLim)
00114 {
00115
00116
00117
00118
00119 Int_t ib,ibX;
00120 Double_t lowEdge,bin,bin1;
00121 Double_t aveWt, aveWt1;
00122
00123 fWtHst1->Print();
00124 fWtHst2->Print();
00125
00126
00127 Double_t sum = 0.0;
00128 Double_t sumWt = 0.0;
00129 for(ib=0;ib<=fnBin+1;ib++) {
00130 sum += fWtHst1->GetBinContent(ib);
00131 sumWt += fWtHst2->GetBinContent(ib);
00132 }
00133 if( (sum == 0.0) || (sumWt == 0.0) ) {
00134 cout<<"TFoamMaxwt::Make: zero content of histogram !!!,sum,sumWt ="<<sum<<sumWt<<endl;
00135 }
00136 aveWt = sumWt/sum;
00137
00138 for( ibX=fnBin+1; ibX>0; ibX--) {
00139 lowEdge = (ibX-1.0)*fwmax/fnBin;
00140 sum = 0.0;
00141 sumWt = 0.0;
00142 for( ib=0; ib<=fnBin+1; ib++) {
00143 bin = fWtHst1->GetBinContent(ib);
00144 bin1 = fWtHst2->GetBinContent(ib);
00145 if(ib >= ibX) bin1=lowEdge*bin;
00146 sum += bin;
00147 sumWt += bin1;
00148 }
00149 aveWt1 = sumWt/sum;
00150 if( TMath::Abs(1.0-aveWt1/aveWt) > eps ) break;
00151 }
00152
00153 if(ibX == (fnBin+1) ) {
00154 wtLim = 1.0e200;
00155 MCeff = 0.0;
00156 cout<< "+++++ wtLim undefined. Higher uper limit in histogram"<<endl;
00157 } else if( ibX == 1) {
00158 wtLim = 0.0;
00159 MCeff =-1.0;
00160 cout<< "+++++ wtLim undefined. Lower uper limit or more bins "<<endl;
00161 } else {
00162 wtLim= (ibX)*fwmax/fnBin;
00163 MCeff = aveWt/wtLim;
00164 }
00165 }
00166
00167
00168
00169
00170