// @(#)root/foam:$Id$
// Author: S. Jadach <mailto:Stanislaw.jadach@ifj.edu.pl>, P.Sawicki <mailto:Pawel.Sawicki@ifj.edu.pl>

//____________________________________________________________________________
//
// Class  TFoamMaxwt
// =================
// Small auxiliary class for controlling MC weight.
// It provides certain measure of the "maximum weight"
// depending on small user-parameter "epsilon".
// It creates and uses 2 histograms of the TH1D class.
// User defines no. of bins nBin,  nBin=1000 is  recommended
// wmax defines weight range (1,wmax), it is adjusted "manually"
//
//____________________________________________________________________________


#include "Riostream.h"
#include "TH1.h"
#include "TFoamMaxwt.h"

ClassImp(TFoamMaxwt);

//____________________________________________________________________________
TFoamMaxwt::TFoamMaxwt()
{
// Constructor for streamer
   fNent = 0;
   fnBin = 0;
   fWtHst1 = 0;
   fWtHst2 = 0;
}

//____________________________________________________________________________
TFoamMaxwt::TFoamMaxwt(Double_t wmax, Int_t nBin)
{
// Principal user constructor
   fNent = 0;
   fnBin = nBin;
   fwmax = wmax;
   fWtHst1 = new TH1D("TFoamMaxwt_hst_Wt1","Histo of weight   ",nBin,0.0,wmax);
   fWtHst2 = new TH1D("TFoamMaxwt_hst_Wt2","Histo of weight**2",nBin,0.0,wmax);
   fWtHst1->SetDirectory(0);// exclude from diskfile
   fWtHst2->SetDirectory(0);// and enable deleting
}

//______________________________________________________________________________
TFoamMaxwt::TFoamMaxwt(TFoamMaxwt &From): TObject(From)
{
// Explicit COPY CONSTRUCTOR (unused, so far)
   fnBin   = From.fnBin;
   fwmax   = From.fwmax;
   fWtHst1 = From.fWtHst1;
   fWtHst2 = From.fWtHst2;
   Error("TFoamMaxwt","COPY CONSTRUCTOR NOT TESTED!");
}

//_______________________________________________________________________________
TFoamMaxwt::~TFoamMaxwt()
{
// Destructor
   delete fWtHst1; // For this SetDirectory(0) is needed!
   delete fWtHst2; //
   fWtHst1=0;
   fWtHst2=0;
}
//_______________________________________________________________________________
void TFoamMaxwt::Reset()
{
// Reseting weight analysis
   fNent = 0;
   fWtHst1->Reset();
   fWtHst2->Reset();
}

//_______________________________________________________________________________
TFoamMaxwt& TFoamMaxwt::operator=(const TFoamMaxwt &From)
{
// substitution =
   if (&From == this) return *this;
   fnBin = From.fnBin;
   fwmax = From.fwmax;
   fWtHst1 = From.fWtHst1;
   fWtHst2 = From.fWtHst2;
   return *this;
}

//________________________________________________________________________________
void TFoamMaxwt::Fill(Double_t wt)
{
// Filling analyzed weight
   fNent =  fNent+1.0;
   fWtHst1->Fill(wt,1.0);
   fWtHst2->Fill(wt,wt);
}

//________________________________________________________________________________
void TFoamMaxwt::Make(Double_t eps, Double_t &MCeff)
{
// Calculates Efficiency= aveWt/wtLim for a given tolerance level epsilon<<1
// To be called at the end of the MC run.

   Double_t wtLim,aveWt;
   GetMCeff(eps, MCeff, wtLim);
   aveWt = MCeff*wtLim;
   std::cout<< "00000000000000000000000000000000000000000000000000000000000000000000000"<<std::endl;
   std::cout<< "00 -->wtLim: No_evt ="<<fNent<<"   <Wt> = "<<aveWt<<"  wtLim=  "<<wtLim<<std::endl;
   std::cout<< "00 -->wtLim: For eps = "<<eps  <<"    EFFICIENCY <Wt>/wtLim= "<<MCeff<<std::endl;
   std::cout<< "00000000000000000000000000000000000000000000000000000000000000000000000"<<std::endl;
}

//_________________________________________________________________________________
void TFoamMaxwt::GetMCeff(Double_t eps, Double_t &MCeff, Double_t &wtLim)
{
// Calculates Efficiency= aveWt/wtLim for a given tolerance level epsilon<<1
// using information stored in two histograms.
// To be called at the end of the MC run.

   Int_t ib,ibX;
   Double_t lowEdge,bin,bin1;
   Double_t aveWt, aveWt1;

   fWtHst1->Print();
   fWtHst2->Print();

// Convention on bin-numbering: nb=1 for 1-st bin, underflow nb=0, overflow nb=Nb+1
   Double_t sum   = 0.0;
   Double_t sumWt = 0.0;
   for(ib=0;ib<=fnBin+1;ib++) {
      sum   += fWtHst1->GetBinContent(ib);
      sumWt += fWtHst2->GetBinContent(ib);
   }
   if( (sum == 0.0) || (sumWt == 0.0) ) {
      std::cout<<"TFoamMaxwt::Make: zero content of histogram !!!,sum,sumWt ="<<sum<<sumWt<<std::endl;
   }
   aveWt = sumWt/sum;
   //--------------------------------------
   for( ibX=fnBin+1; ibX>0; ibX--) {
      lowEdge = (ibX-1.0)*fwmax/fnBin;
      sum   = 0.0;
      sumWt = 0.0;
      for( ib=0; ib<=fnBin+1; ib++) {
         bin  = fWtHst1->GetBinContent(ib);
         bin1 = fWtHst2->GetBinContent(ib);
         if(ib >= ibX) bin1=lowEdge*bin;
         sum   += bin;
         sumWt += bin1;
      }
      aveWt1 = sumWt/sum;
      if( TMath::Abs(1.0-aveWt1/aveWt) > eps ) break;
   }
   //---------------------------
   if(ibX == (fnBin+1) ) {
      wtLim = 1.0e200;
      MCeff   = 0.0;
      std::cout<< "+++++ wtLim undefined. Higher uper limit in histogram"<<std::endl;
   } else if( ibX == 1) {
      wtLim = 0.0;
      MCeff   =-1.0;
      std::cout<< "+++++ wtLim undefined. Lower uper limit or more bins "<<std::endl;
   } else {
      wtLim= (ibX)*fwmax/fnBin; // We over-estimate wtLim, under-estimate MCeff
      MCeff  = aveWt/wtLim;
   }
}
///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//      End of    Class  TFoamMaxwt                                          //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////
 TFoamMaxwt.cxx:1
 TFoamMaxwt.cxx:2
 TFoamMaxwt.cxx:3
 TFoamMaxwt.cxx:4
 TFoamMaxwt.cxx:5
 TFoamMaxwt.cxx:6
 TFoamMaxwt.cxx:7
 TFoamMaxwt.cxx:8
 TFoamMaxwt.cxx:9
 TFoamMaxwt.cxx:10
 TFoamMaxwt.cxx:11
 TFoamMaxwt.cxx:12
 TFoamMaxwt.cxx:13
 TFoamMaxwt.cxx:14
 TFoamMaxwt.cxx:15
 TFoamMaxwt.cxx:16
 TFoamMaxwt.cxx:17
 TFoamMaxwt.cxx:18
 TFoamMaxwt.cxx:19
 TFoamMaxwt.cxx:20
 TFoamMaxwt.cxx:21
 TFoamMaxwt.cxx:22
 TFoamMaxwt.cxx:23
 TFoamMaxwt.cxx:24
 TFoamMaxwt.cxx:25
 TFoamMaxwt.cxx:26
 TFoamMaxwt.cxx:27
 TFoamMaxwt.cxx:28
 TFoamMaxwt.cxx:29
 TFoamMaxwt.cxx:30
 TFoamMaxwt.cxx:31
 TFoamMaxwt.cxx:32
 TFoamMaxwt.cxx:33
 TFoamMaxwt.cxx:34
 TFoamMaxwt.cxx:35
 TFoamMaxwt.cxx:36
 TFoamMaxwt.cxx:37
 TFoamMaxwt.cxx:38
 TFoamMaxwt.cxx:39
 TFoamMaxwt.cxx:40
 TFoamMaxwt.cxx:41
 TFoamMaxwt.cxx:42
 TFoamMaxwt.cxx:43
 TFoamMaxwt.cxx:44
 TFoamMaxwt.cxx:45
 TFoamMaxwt.cxx:46
 TFoamMaxwt.cxx:47
 TFoamMaxwt.cxx:48
 TFoamMaxwt.cxx:49
 TFoamMaxwt.cxx:50
 TFoamMaxwt.cxx:51
 TFoamMaxwt.cxx:52
 TFoamMaxwt.cxx:53
 TFoamMaxwt.cxx:54
 TFoamMaxwt.cxx:55
 TFoamMaxwt.cxx:56
 TFoamMaxwt.cxx:57
 TFoamMaxwt.cxx:58
 TFoamMaxwt.cxx:59
 TFoamMaxwt.cxx:60
 TFoamMaxwt.cxx:61
 TFoamMaxwt.cxx:62
 TFoamMaxwt.cxx:63
 TFoamMaxwt.cxx:64
 TFoamMaxwt.cxx:65
 TFoamMaxwt.cxx:66
 TFoamMaxwt.cxx:67
 TFoamMaxwt.cxx:68
 TFoamMaxwt.cxx:69
 TFoamMaxwt.cxx:70
 TFoamMaxwt.cxx:71
 TFoamMaxwt.cxx:72
 TFoamMaxwt.cxx:73
 TFoamMaxwt.cxx:74
 TFoamMaxwt.cxx:75
 TFoamMaxwt.cxx:76
 TFoamMaxwt.cxx:77
 TFoamMaxwt.cxx:78
 TFoamMaxwt.cxx:79
 TFoamMaxwt.cxx:80
 TFoamMaxwt.cxx:81
 TFoamMaxwt.cxx:82
 TFoamMaxwt.cxx:83
 TFoamMaxwt.cxx:84
 TFoamMaxwt.cxx:85
 TFoamMaxwt.cxx:86
 TFoamMaxwt.cxx:87
 TFoamMaxwt.cxx:88
 TFoamMaxwt.cxx:89
 TFoamMaxwt.cxx:90
 TFoamMaxwt.cxx:91
 TFoamMaxwt.cxx:92
 TFoamMaxwt.cxx:93
 TFoamMaxwt.cxx:94
 TFoamMaxwt.cxx:95
 TFoamMaxwt.cxx:96
 TFoamMaxwt.cxx:97
 TFoamMaxwt.cxx:98
 TFoamMaxwt.cxx:99
 TFoamMaxwt.cxx:100
 TFoamMaxwt.cxx:101
 TFoamMaxwt.cxx:102
 TFoamMaxwt.cxx:103
 TFoamMaxwt.cxx:104
 TFoamMaxwt.cxx:105
 TFoamMaxwt.cxx:106
 TFoamMaxwt.cxx:107
 TFoamMaxwt.cxx:108
 TFoamMaxwt.cxx:109
 TFoamMaxwt.cxx:110
 TFoamMaxwt.cxx:111
 TFoamMaxwt.cxx:112
 TFoamMaxwt.cxx:113
 TFoamMaxwt.cxx:114
 TFoamMaxwt.cxx:115
 TFoamMaxwt.cxx:116
 TFoamMaxwt.cxx:117
 TFoamMaxwt.cxx:118
 TFoamMaxwt.cxx:119
 TFoamMaxwt.cxx:120
 TFoamMaxwt.cxx:121
 TFoamMaxwt.cxx:122
 TFoamMaxwt.cxx:123
 TFoamMaxwt.cxx:124
 TFoamMaxwt.cxx:125
 TFoamMaxwt.cxx:126
 TFoamMaxwt.cxx:127
 TFoamMaxwt.cxx:128
 TFoamMaxwt.cxx:129
 TFoamMaxwt.cxx:130
 TFoamMaxwt.cxx:131
 TFoamMaxwt.cxx:132
 TFoamMaxwt.cxx:133
 TFoamMaxwt.cxx:134
 TFoamMaxwt.cxx:135
 TFoamMaxwt.cxx:136
 TFoamMaxwt.cxx:137
 TFoamMaxwt.cxx:138
 TFoamMaxwt.cxx:139
 TFoamMaxwt.cxx:140
 TFoamMaxwt.cxx:141
 TFoamMaxwt.cxx:142
 TFoamMaxwt.cxx:143
 TFoamMaxwt.cxx:144
 TFoamMaxwt.cxx:145
 TFoamMaxwt.cxx:146
 TFoamMaxwt.cxx:147
 TFoamMaxwt.cxx:148
 TFoamMaxwt.cxx:149
 TFoamMaxwt.cxx:150
 TFoamMaxwt.cxx:151
 TFoamMaxwt.cxx:152
 TFoamMaxwt.cxx:153
 TFoamMaxwt.cxx:154
 TFoamMaxwt.cxx:155
 TFoamMaxwt.cxx:156
 TFoamMaxwt.cxx:157
 TFoamMaxwt.cxx:158
 TFoamMaxwt.cxx:159
 TFoamMaxwt.cxx:160
 TFoamMaxwt.cxx:161
 TFoamMaxwt.cxx:162
 TFoamMaxwt.cxx:163
 TFoamMaxwt.cxx:164
 TFoamMaxwt.cxx:165
 TFoamMaxwt.cxx:166
 TFoamMaxwt.cxx:167
 TFoamMaxwt.cxx:168
 TFoamMaxwt.cxx:169
 TFoamMaxwt.cxx:170