// @(#)root/roostats:$Id$
// Author: Sven Kreiss    January 2012
// Author: Kyle Cranmer, Lorenzo Moneta, Gregory Schott, Wouter Verkerke
/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "RooStats/ToyMCImportanceSampler.h"

#ifndef ROO_MSG_SERVICE
#include "RooMsgService.h"
#endif

#include "RooCategory.h"
#include "TMath.h"

using namespace RooFit;
using namespace std;


ClassImp(RooStats::ToyMCImportanceSampler)

namespace RooStats {


ToyMCImportanceSampler::~ToyMCImportanceSampler() {
   for( unsigned int i=0; i < fImportanceSnapshots.size(); i++ ) if(fImportanceSnapshots[i]) delete fImportanceSnapshots[i];
   for( unsigned int i=0; i < fNullSnapshots.size(); i++ ) if(fNullSnapshots[i]) delete fNullSnapshots[i];
}
void ToyMCImportanceSampler::ClearCache(void) {
   ToyMCSampler::ClearCache();
   
   for( unsigned int i=0; i < fImpNLLs.size(); i++ ) if(fImpNLLs[i]) { delete fImpNLLs[i]; fImpNLLs[i] = NULL; }
   for( unsigned int i=0; i < fNullNLLs.size(); i++ ) if(fNullNLLs[i]) { delete fNullNLLs[i]; fNullNLLs[i] = NULL; }
}









RooDataSet* ToyMCImportanceSampler::GetSamplingDistributionsSingleWorker(RooArgSet& paramPoint) {
   if( fNToys == 0 ) return NULL;

   // remember original #toys, but overwrite it temporarily with the #toys per distribution
   Int_t allToys = fNToys;

   // to keep track of which dataset entry comes form which density, define a roocategory as a label
   RooCategory densityLabel( "densityLabel", "densityLabel" );
   densityLabel.defineType( "null", -1 );
   for( unsigned int i=0; i < fImportanceDensities.size(); i++ )
      densityLabel.defineType( TString::Format( "impDens_%d", i ), i );


   RooDataSet* fullResult = NULL;

   // generate null (negative i) and imp densities (0 and positive i)
   for( int i = -1; i < (int)fImportanceDensities.size(); i++ ) {
      if( i < 0 ) {
         // generate null toys
         oocoutP((TObject*)0,Generation) << endl << endl << "   GENERATING FROM NULL DENSITY " << endl << endl;
         SetDensityToGenerateFromByIndex( 0, true ); // true = generate from null
      }else{
         oocoutP((TObject*)0,Generation) << endl << endl << "   GENERATING IMP DENS/SNAP "<<i+1<<"  OUT OF "<<fImportanceDensities.size()<<endl<<endl;
         SetDensityToGenerateFromByIndex( i, false ); // false = generate not from null
      }

      RooRealVar reweight( "reweight", "reweight", 1.0 );
      // apply strategy for how to distribute the #toys between the distributions
      if( fToysStrategy == EQUALTOYSPERDENSITY ) {
         // assuming alltoys = one null + N imp densities. And round up.
         fNToys = TMath::CeilNint(  double(allToys)/(fImportanceDensities.size()+1)  ); 
      }else if(fToysStrategy == EXPONENTIALTOYDISTRIBUTION ) {
         // for N densities, split the toys into (2^(N+1))-1 parts, and assign 2^0 parts to the first
         // density (which is the null), 2^1 to the second (first imp dens), etc, up to 2^N
         fNToys = TMath::CeilNint(  double(allToys) * pow( double(2) , i+1 )  /  (pow( double(2), int(fImportanceDensities.size()+1) )-1)  );
         
         int largestNToys = TMath::CeilNint(  allToys * pow( double(2), int(fImportanceDensities.size()) )  /  (pow( double(2), int(fImportanceDensities.size()+1) )-1)  );
         reweight.setVal( ((double)largestNToys) / fNToys );
      }
      
      ooccoutI((TObject*)NULL,InputArguments) << "Generating " << fNToys << " toys for this density." << endl;
      ooccoutI((TObject*)NULL,InputArguments) << "Reweight is " << reweight.getVal() << endl;
      

      RooDataSet* result = ToyMCSampler::GetSamplingDistributionsSingleWorker( paramPoint );

      if (result->get()->getSize() > Int_t(fTestStatistics.size())) {
         // add label
         densityLabel.setIndex( i );
         result->addColumn( densityLabel );
         result->addColumn( reweight );
      }
      
      if( !fullResult ) {
         RooArgSet columns( *result->get() );
         RooRealVar weightVar ( "weight", "weight", 1.0 );
         columns.add( weightVar );
//       cout << endl << endl << "Reweighted data columns: " << endl;
//       columns.Print("v");
//       cout << endl;
         fullResult = new RooDataSet( result->GetName(), result->GetTitle(), columns, "weight" );
      }

      for( int j=0; j < result->numEntries(); j++ ) {
//          cout << "entry: " << j << endl;
//          result->get(j)->Print();
//          cout << "weight: " << result->weight() << endl;
//          cout << "reweight: " << reweight.getVal() << endl;
         const RooArgSet* row = result->get(j);
         fullResult->add( *row, result->weight()*reweight.getVal() );
      }
      delete result;
   }

   // restore #toys
   fNToys = allToys;
   
   return fullResult;
}







RooAbsData* ToyMCImportanceSampler::GenerateToyData(
   RooArgSet& paramPoint, 
   double& weight
) const {
   if( fNullDensities.size() > 1 ) {
      ooccoutI((TObject*)NULL,InputArguments) << "Null Densities:" << endl;
      for( unsigned int i=0; i < fNullDensities.size(); i++) {
         ooccoutI((TObject*)NULL,InputArguments) << "  null density["<<i<<"]: " << fNullDensities[i] << " \t null snapshot["<<i<<"]: " << fNullSnapshots[i] << endl;
      }
      ooccoutE((TObject*)NULL,InputArguments) << "Cannot use multiple null densities and only ask for one weight." << endl;
      return NULL;
   }
   
   if( fNullDensities.size() == 0  &&  fPdf ) {
      ooccoutI((TObject*)NULL,InputArguments) << "No explicit null densities specified. Going to add one based on the given paramPoint and the global fPdf. ... but cannot do that inside const function." << endl;
      //AddNullDensity( fPdf, &paramPoint );      
   }
   
   // do not do anything if the given parameter point if fNullSnapshots[0]
   // ... which is the most common case
   if( fNullSnapshots[0] != &paramPoint ) {
      ooccoutD((TObject*)NULL,InputArguments) << "Using given parameter point. Replaces snapshot for the only null currently defined." << endl;
      if(fNullSnapshots[0]) delete fNullSnapshots[0];
      fNullSnapshots.clear();
      fNullSnapshots.push_back( (RooArgSet*)paramPoint.snapshot() );
   }
   
   vector<double> weights;
   weights.push_back( weight );
   
   vector<double> impNLLs;
   for( unsigned int i=0; i < fImportanceDensities.size(); i++ ) impNLLs.push_back( 0.0 );
   vector<double> nullNLLs;
   for( unsigned int i=0; i < fNullDensities.size(); i++ ) nullNLLs.push_back( 0.0 );
   
   RooAbsData *d = GenerateToyData( weights, impNLLs, nullNLLs );
   weight = weights[0];
   return d;
}
RooAbsData* ToyMCImportanceSampler::GenerateToyData(
   RooArgSet& paramPoint, 
   double& weight, 
   vector<double>& impNLLs, 
   double& nullNLL
) const {
   if( fNullDensities.size() > 1 ) {
      ooccoutI((TObject*)NULL,InputArguments) << "Null Densities:" << endl;
      for( unsigned int i=0; i < fNullDensities.size(); i++) {
         ooccoutI((TObject*)NULL,InputArguments) << "  null density["<<i<<"]: " << fNullDensities[i] << " \t null snapshot["<<i<<"]: " << fNullSnapshots[i] << endl;
      }
      ooccoutE((TObject*)NULL,InputArguments) << "Cannot use multiple null densities and only ask for one weight and NLL." << endl;
      return NULL;
   }

   if( fNullDensities.size() == 0  &&  fPdf ) {
      ooccoutI((TObject*)NULL,InputArguments) << "No explicit null densities specified. Going to add one based on the given paramPoint and the global fPdf. ... but cannot do that inside const function." << endl;
      //AddNullDensity( fPdf, &paramPoint );      
   }
   
   ooccoutI((TObject*)NULL,InputArguments) << "Using given parameter point. Overwrites snapshot for the only null currently defined." << endl;
   if(fNullSnapshots[0]) delete fNullSnapshots[0];
   fNullSnapshots.clear();
   fNullSnapshots.push_back( (const RooArgSet*)paramPoint.snapshot() );
   
   vector<double> weights;
   weights.push_back( weight );
   
   vector<double> nullNLLs;
   nullNLLs.push_back( nullNLL );
   
   RooAbsData *d = GenerateToyData( weights, impNLLs, nullNLLs );
   weight = weights[0];
   nullNLL = nullNLLs[0];
   return d;
}

RooAbsData* ToyMCImportanceSampler::GenerateToyData(
   vector<double>& weights
) const {
   if( fNullDensities.size() != weights.size() ) {
      ooccoutI((TObject*)NULL,InputArguments) << "weights.size() != nullDesnities.size(). You need to provide a vector with the correct size." << endl;
      //AddNullDensity( fPdf, &paramPoint );      
   }
   
   vector<double> impNLLs;
   for( unsigned int i=0; i < fImportanceDensities.size(); i++ ) impNLLs.push_back( 0.0 );
   vector<double> nullNLLs;
   for( unsigned int i=0; i < fNullDensities.size(); i++ ) nullNLLs.push_back( 0.0 );
   
   RooAbsData *d = GenerateToyData( weights, impNLLs, nullNLLs );
   return d;
}
RooAbsData* ToyMCImportanceSampler::GenerateToyData(
   vector<double>& weights,
   vector<double>& impNLLVals,
   vector<double>& nullNLLVals
) const {   // This method generates a toy data set for importance sampling for the given parameter point taking
   // global observables into account.
   // The values of the generated global observables remain in the pdf's variables.
   // They have to have those values for the subsequent evaluation of the
   // test statistics.


   ooccoutD((TObject*)0,InputArguments) << endl;
   ooccoutD((TObject*)0,InputArguments) << "GenerateToyDataImportanceSampling" << endl;

   if(!fObservables) {
      ooccoutE((TObject*)NULL,InputArguments) << "Observables not set." << endl;
      return NULL;
   }

   if( fNullDensities.size() == 0 ) {
      oocoutE((TObject*)NULL,InputArguments) << "ToyMCImportanceSampler: Need to specify the null density explicitly." << endl;
      return NULL;
   }
   
   // catch the case when NLLs are not created (e.g. when ToyMCSampler was streamed for Proof) 
   if( fNullNLLs.size() == 0  &&  fNullDensities.size() > 0 ) {
      for( unsigned int i = 0; i < fNullDensities.size(); i++ ) fNullNLLs.push_back( NULL );
   }
   if( fImpNLLs.size() == 0  &&  fImportanceDensities.size() > 0 ) {
      for( unsigned int i = 0; i < fImportanceDensities.size(); i++ ) fImpNLLs.push_back( NULL );
   }
   
   if( fNullDensities.size() != fNullNLLs.size() ) {
      oocoutE((TObject*)NULL,InputArguments) << "ToyMCImportanceSampler: Something wrong. NullNLLs must be of same size as null densities." << endl;
      return NULL;
   }

   if( (!fGenerateFromNull  &&  fIndexGenDensity >= fImportanceDensities.size()) ||
       (fGenerateFromNull   &&  fIndexGenDensity >= fNullDensities.size())
   ) {
      oocoutE((TObject*)NULL,InputArguments) << "ToyMCImportanceSampler: no importance density given or index out of range." << endl;
      return NULL;
   }
   
   
   // paramPoint used to be given as parameter
   // situation is clear when there is only one null.
   // WHAT TO DO FOR MANY NULL DENSITIES?
   RooArgSet paramPoint( *fNullSnapshots[0] );
   //cout << "paramPoint: " << endl;
   //paramPoint.Print("v");
   

   // assign input paramPoint
   RooArgSet* allVars = fPdf->getVariables();
   *allVars = paramPoint;
   
   
   // create nuisance parameter points
   if(!fNuisanceParametersSampler && fPriorNuisance && fNuisancePars)
      fNuisanceParametersSampler = new NuisanceParametersSampler(fPriorNuisance, fNuisancePars, fNToys, fExpectedNuisancePar);

   // generate global observables
   RooArgSet observables(*fObservables);
   if(fGlobalObservables  &&  fGlobalObservables->getSize()) {
      observables.remove(*fGlobalObservables);
      // WHAT TODO FOR MANY NULL DENSITIES?
      GenerateGlobalObservables(*fNullDensities[0]);
   }

   // save values to restore later.
   // but this must remain after(!) generating global observables
   if( !fGenerateFromNull ) {
      RooArgSet* allVarsImpDens = fImportanceDensities[fIndexGenDensity]->getVariables();
      allVars->add(*allVarsImpDens);
      delete allVarsImpDens;
   }
   const RooArgSet* saveVars = (const RooArgSet*)allVars->snapshot();

   double globalWeight = 1.0;
   if(fNuisanceParametersSampler) { // use nuisance parameters?
      // Construct a set of nuisance parameters that has the parameters
      // in the input paramPoint removed. Therefore, no parameter in
      // paramPoint is randomized.
      // Therefore when a parameter is given (should be held fixed),
      // but is also in the list of nuisance parameters, the parameter
      // will be held fixed. This is useful for debugging to hold single
      // parameters fixed although under "normal" circumstances it is
      // randomized.
      RooArgSet allVarsMinusParamPoint(*allVars);
      allVarsMinusParamPoint.remove(paramPoint, kFALSE, kTRUE); // match by name

      // get nuisance parameter point and weight
      fNuisanceParametersSampler->NextPoint(allVarsMinusParamPoint, globalWeight);
   }
   // populate input weights vector with this globalWeight
   for( unsigned int i=0; i < weights.size(); i++ ) weights[i] = globalWeight;

   RooAbsData* data = NULL;
   if( fGenerateFromNull ) {
      //cout << "gen from null" << endl;
      *allVars = *fNullSnapshots[fIndexGenDensity];
      data = Generate(*fNullDensities[fIndexGenDensity], observables);
   }else{
      // need to be careful here not to overwrite the current state of the
      // nuisance parameters, ie they must not be part of the snapshot
      //cout << "gen from imp" << endl;
      if(fImportanceSnapshots[fIndexGenDensity]) *allVars = *fImportanceSnapshots[fIndexGenDensity];
      data = Generate(*fImportanceDensities[fIndexGenDensity], observables);
   }
   //cout << "data generated: " << data << endl;

   if (!data) { 
      oocoutE((TObject*)0,InputArguments) << "ToyMCImportanceSampler: error generating data" << endl;
      return NULL;
   }



   // Importance Sampling: adjust weight
   // Sources: Alex Read, presentation by Michael Woodroofe

   ooccoutD((TObject*)0,InputArguments) << "About to create/calculate all nullNLLs." << endl;
   for( unsigned int i=0; i < fNullDensities.size(); i++ ) {
      //oocoutI((TObject*)0,InputArguments) << "Setting variables to nullSnapshot["<<i<<"]"<<endl;
      //fNullSnapshots[i]->Print("v");
      
      *allVars = *fNullSnapshots[i];
      if( !fNullNLLs[i] ) {
         RooArgSet* allParams = fNullDensities[i]->getParameters(*data);
         fNullNLLs[i] = fNullDensities[i]->createNLL(*data, RooFit::CloneData(kFALSE), RooFit::Constrain(*allParams),
                                                     RooFit::ConditionalObservables(fConditionalObs));
         delete allParams;
      }else{
         fNullNLLs[i]->setData( *data, kFALSE );
      }
      nullNLLVals[i] = fNullNLLs[i]->getVal();
      // FOR DEBuGGING!!!!!!!!!!!!!!!!!
      if( !fReuseNLL ) { delete fNullNLLs[i]; fNullNLLs[i] = NULL; }
   }
   
   
   // for each null: find minNLLVal of null and all imp densities
   ooccoutD((TObject*)0,InputArguments) << "About to find the minimum NLLs." << endl;
   vector<double> minNLLVals;
   for( unsigned int i=0; i < nullNLLVals.size(); i++ ) minNLLVals.push_back( nullNLLVals[i] );
   
   for( unsigned int i=0; i < fImportanceDensities.size(); i++ ) {
      //oocoutI((TObject*)0,InputArguments) << "Setting variables to impSnapshot["<<i<<"]"<<endl;
      //fImportanceSnapshots[i]->Print("v");

      if( fImportanceSnapshots[i] ) *allVars = *fImportanceSnapshots[i];
      if( !fImpNLLs[i] ) {
         RooArgSet* allParams = fImportanceDensities[i]->getParameters(*data);
         fImpNLLs[i] = fImportanceDensities[i]->createNLL(*data, RooFit::CloneData(kFALSE), RooFit::Constrain(*allParams), 
                                                          RooFit::ConditionalObservables(fConditionalObs));
         delete allParams;
      }else{
         fImpNLLs[i]->setData( *data, kFALSE );
      }
      impNLLVals[i] = fImpNLLs[i]->getVal();
      // FOR DEBuGGING!!!!!!!!!!!!!!!!!
      if( !fReuseNLL ) { delete fImpNLLs[i]; fImpNLLs[i] = NULL; }
      
      for( unsigned int j=0; j < nullNLLVals.size(); j++ ) {
         if( impNLLVals[i] < minNLLVals[j] ) minNLLVals[j] = impNLLVals[i];
         ooccoutD((TObject*)0,InputArguments) << "minNLLVals["<<j<<"]: " << minNLLVals[j] << "  nullNLLVals["<<j<<"]: " << nullNLLVals[j] << "    impNLLVals["<<i<<"]: " << impNLLVals[i] << endl;
      }
   }
   
   // veto toys: this is a sort of "overlap removal" of the various distributions
   // if not vetoed: apply weight
   ooccoutD((TObject*)0,InputArguments) << "About to apply vetos and calculate weights." << endl;
   for( unsigned int j=0; j < nullNLLVals.size(); j++ ) {
      if     ( fApplyVeto  &&  fGenerateFromNull  &&  minNLLVals[j] != nullNLLVals[j] ) weights[j] = 0.0;
      else if( fApplyVeto  &&  !fGenerateFromNull  &&  minNLLVals[j] != impNLLVals[fIndexGenDensity] ) weights[j] = 0.0;
      else if( !fGenerateFromNull ) {
         // apply (for fImportanceGenNorm, the weight is one, so nothing needs to be done here)
         
         // L(pdf) / L(imp)  =  exp( NLL(imp) - NLL(pdf) )
         weights[j] *= exp(minNLLVals[j] - nullNLLVals[j]);
      }

      ooccoutD((TObject*)0,InputArguments) << "weights["<<j<<"]: " << weights[j] << endl;
   }



   *allVars = *saveVars;
   delete allVars;
   delete saveVars;

   return data;
}





// poi has to be fitted beforehand. This function expects this to be the muhat value.
int ToyMCImportanceSampler::CreateImpDensitiesForOnePOIAdaptively( RooAbsPdf& pdf, const RooArgSet& allPOI, RooRealVar& poi, double nStdDevOverlap, double poiValueForBackground ) {
   // these might not necessarily be the same thing.
   double impMaxMu = poi.getVal();

   // this includes the null
   int n = 1;
   
   // check whether error is trustworthy
   if( poi.getError() > 0.01  &&  poi.getError() < 5.0 ) {
      n = TMath::CeilNint( poi.getVal() / (2.*nStdDevOverlap*poi.getError()) ); // round up
      oocoutI((TObject*)0,InputArguments) << "Using fitFavoredMu and error to set the number of imp points" << endl;
      oocoutI((TObject*)0,InputArguments) << "muhat: " << poi.getVal() << "    optimize for distance: " << 2.*nStdDevOverlap*poi.getError() << endl;
      oocoutI((TObject*)0,InputArguments) << "n = " << n << endl;
      oocoutI((TObject*)0,InputArguments) << "This results in a distance of: " << impMaxMu / n << endl;
   }
   
   // exclude the null, just return the number of importance snapshots
   return CreateNImpDensitiesForOnePOI( pdf, allPOI, poi, n-1, poiValueForBackground);
}

int ToyMCImportanceSampler::CreateNImpDensitiesForOnePOI( RooAbsPdf& pdf, const RooArgSet& allPOI, RooRealVar& poi, int n, double poiValueForBackground ) {
   // n is the number of importance densities

   // these might not necessarily be the same thing.
   double impMaxMu = poi.getVal();

   // create imp snapshots
   if( impMaxMu > poiValueForBackground  &&  n > 0 ) {
      for( int i=1; i <= n; i++ ) {
         poi.setVal( poiValueForBackground + (double)i/(n)*(impMaxMu - poiValueForBackground) );
         oocoutI((TObject*)0,InputArguments) << endl << "create point with poi: " << endl;
         poi.Print();
         
         // impSnaps without first snapshot because that is null hypothesis
         
         AddImportanceDensity( &pdf, &allPOI );
      }
   }
   
   return n;
}








} // end namespace RooStats
 ToyMCImportanceSampler.cxx:1
 ToyMCImportanceSampler.cxx:2
 ToyMCImportanceSampler.cxx:3
 ToyMCImportanceSampler.cxx:4
 ToyMCImportanceSampler.cxx:5
 ToyMCImportanceSampler.cxx:6
 ToyMCImportanceSampler.cxx:7
 ToyMCImportanceSampler.cxx:8
 ToyMCImportanceSampler.cxx:9
 ToyMCImportanceSampler.cxx:10
 ToyMCImportanceSampler.cxx:11
 ToyMCImportanceSampler.cxx:12
 ToyMCImportanceSampler.cxx:13
 ToyMCImportanceSampler.cxx:14
 ToyMCImportanceSampler.cxx:15
 ToyMCImportanceSampler.cxx:16
 ToyMCImportanceSampler.cxx:17
 ToyMCImportanceSampler.cxx:18
 ToyMCImportanceSampler.cxx:19
 ToyMCImportanceSampler.cxx:20
 ToyMCImportanceSampler.cxx:21
 ToyMCImportanceSampler.cxx:22
 ToyMCImportanceSampler.cxx:23
 ToyMCImportanceSampler.cxx:24
 ToyMCImportanceSampler.cxx:25
 ToyMCImportanceSampler.cxx:26
 ToyMCImportanceSampler.cxx:27
 ToyMCImportanceSampler.cxx:28
 ToyMCImportanceSampler.cxx:29
 ToyMCImportanceSampler.cxx:30
 ToyMCImportanceSampler.cxx:31
 ToyMCImportanceSampler.cxx:32
 ToyMCImportanceSampler.cxx:33
 ToyMCImportanceSampler.cxx:34
 ToyMCImportanceSampler.cxx:35
 ToyMCImportanceSampler.cxx:36
 ToyMCImportanceSampler.cxx:37
 ToyMCImportanceSampler.cxx:38
 ToyMCImportanceSampler.cxx:39
 ToyMCImportanceSampler.cxx:40
 ToyMCImportanceSampler.cxx:41
 ToyMCImportanceSampler.cxx:42
 ToyMCImportanceSampler.cxx:43
 ToyMCImportanceSampler.cxx:44
 ToyMCImportanceSampler.cxx:45
 ToyMCImportanceSampler.cxx:46
 ToyMCImportanceSampler.cxx:47
 ToyMCImportanceSampler.cxx:48
 ToyMCImportanceSampler.cxx:49
 ToyMCImportanceSampler.cxx:50
 ToyMCImportanceSampler.cxx:51
 ToyMCImportanceSampler.cxx:52
 ToyMCImportanceSampler.cxx:53
 ToyMCImportanceSampler.cxx:54
 ToyMCImportanceSampler.cxx:55
 ToyMCImportanceSampler.cxx:56
 ToyMCImportanceSampler.cxx:57
 ToyMCImportanceSampler.cxx:58
 ToyMCImportanceSampler.cxx:59
 ToyMCImportanceSampler.cxx:60
 ToyMCImportanceSampler.cxx:61
 ToyMCImportanceSampler.cxx:62
 ToyMCImportanceSampler.cxx:63
 ToyMCImportanceSampler.cxx:64
 ToyMCImportanceSampler.cxx:65
 ToyMCImportanceSampler.cxx:66
 ToyMCImportanceSampler.cxx:67
 ToyMCImportanceSampler.cxx:68
 ToyMCImportanceSampler.cxx:69
 ToyMCImportanceSampler.cxx:70
 ToyMCImportanceSampler.cxx:71
 ToyMCImportanceSampler.cxx:72
 ToyMCImportanceSampler.cxx:73
 ToyMCImportanceSampler.cxx:74
 ToyMCImportanceSampler.cxx:75
 ToyMCImportanceSampler.cxx:76
 ToyMCImportanceSampler.cxx:77
 ToyMCImportanceSampler.cxx:78
 ToyMCImportanceSampler.cxx:79
 ToyMCImportanceSampler.cxx:80
 ToyMCImportanceSampler.cxx:81
 ToyMCImportanceSampler.cxx:82
 ToyMCImportanceSampler.cxx:83
 ToyMCImportanceSampler.cxx:84
 ToyMCImportanceSampler.cxx:85
 ToyMCImportanceSampler.cxx:86
 ToyMCImportanceSampler.cxx:87
 ToyMCImportanceSampler.cxx:88
 ToyMCImportanceSampler.cxx:89
 ToyMCImportanceSampler.cxx:90
 ToyMCImportanceSampler.cxx:91
 ToyMCImportanceSampler.cxx:92
 ToyMCImportanceSampler.cxx:93
 ToyMCImportanceSampler.cxx:94
 ToyMCImportanceSampler.cxx:95
 ToyMCImportanceSampler.cxx:96
 ToyMCImportanceSampler.cxx:97
 ToyMCImportanceSampler.cxx:98
 ToyMCImportanceSampler.cxx:99
 ToyMCImportanceSampler.cxx:100
 ToyMCImportanceSampler.cxx:101
 ToyMCImportanceSampler.cxx:102
 ToyMCImportanceSampler.cxx:103
 ToyMCImportanceSampler.cxx:104
 ToyMCImportanceSampler.cxx:105
 ToyMCImportanceSampler.cxx:106
 ToyMCImportanceSampler.cxx:107
 ToyMCImportanceSampler.cxx:108
 ToyMCImportanceSampler.cxx:109
 ToyMCImportanceSampler.cxx:110
 ToyMCImportanceSampler.cxx:111
 ToyMCImportanceSampler.cxx:112
 ToyMCImportanceSampler.cxx:113
 ToyMCImportanceSampler.cxx:114
 ToyMCImportanceSampler.cxx:115
 ToyMCImportanceSampler.cxx:116
 ToyMCImportanceSampler.cxx:117
 ToyMCImportanceSampler.cxx:118
 ToyMCImportanceSampler.cxx:119
 ToyMCImportanceSampler.cxx:120
 ToyMCImportanceSampler.cxx:121
 ToyMCImportanceSampler.cxx:122
 ToyMCImportanceSampler.cxx:123
 ToyMCImportanceSampler.cxx:124
 ToyMCImportanceSampler.cxx:125
 ToyMCImportanceSampler.cxx:126
 ToyMCImportanceSampler.cxx:127
 ToyMCImportanceSampler.cxx:128
 ToyMCImportanceSampler.cxx:129
 ToyMCImportanceSampler.cxx:130
 ToyMCImportanceSampler.cxx:131
 ToyMCImportanceSampler.cxx:132
 ToyMCImportanceSampler.cxx:133
 ToyMCImportanceSampler.cxx:134
 ToyMCImportanceSampler.cxx:135
 ToyMCImportanceSampler.cxx:136
 ToyMCImportanceSampler.cxx:137
 ToyMCImportanceSampler.cxx:138
 ToyMCImportanceSampler.cxx:139
 ToyMCImportanceSampler.cxx:140
 ToyMCImportanceSampler.cxx:141
 ToyMCImportanceSampler.cxx:142
 ToyMCImportanceSampler.cxx:143
 ToyMCImportanceSampler.cxx:144
 ToyMCImportanceSampler.cxx:145
 ToyMCImportanceSampler.cxx:146
 ToyMCImportanceSampler.cxx:147
 ToyMCImportanceSampler.cxx:148
 ToyMCImportanceSampler.cxx:149
 ToyMCImportanceSampler.cxx:150
 ToyMCImportanceSampler.cxx:151
 ToyMCImportanceSampler.cxx:152
 ToyMCImportanceSampler.cxx:153
 ToyMCImportanceSampler.cxx:154
 ToyMCImportanceSampler.cxx:155
 ToyMCImportanceSampler.cxx:156
 ToyMCImportanceSampler.cxx:157
 ToyMCImportanceSampler.cxx:158
 ToyMCImportanceSampler.cxx:159
 ToyMCImportanceSampler.cxx:160
 ToyMCImportanceSampler.cxx:161
 ToyMCImportanceSampler.cxx:162
 ToyMCImportanceSampler.cxx:163
 ToyMCImportanceSampler.cxx:164
 ToyMCImportanceSampler.cxx:165
 ToyMCImportanceSampler.cxx:166
 ToyMCImportanceSampler.cxx:167
 ToyMCImportanceSampler.cxx:168
 ToyMCImportanceSampler.cxx:169
 ToyMCImportanceSampler.cxx:170
 ToyMCImportanceSampler.cxx:171
 ToyMCImportanceSampler.cxx:172
 ToyMCImportanceSampler.cxx:173
 ToyMCImportanceSampler.cxx:174
 ToyMCImportanceSampler.cxx:175
 ToyMCImportanceSampler.cxx:176
 ToyMCImportanceSampler.cxx:177
 ToyMCImportanceSampler.cxx:178
 ToyMCImportanceSampler.cxx:179
 ToyMCImportanceSampler.cxx:180
 ToyMCImportanceSampler.cxx:181
 ToyMCImportanceSampler.cxx:182
 ToyMCImportanceSampler.cxx:183
 ToyMCImportanceSampler.cxx:184
 ToyMCImportanceSampler.cxx:185
 ToyMCImportanceSampler.cxx:186
 ToyMCImportanceSampler.cxx:187
 ToyMCImportanceSampler.cxx:188
 ToyMCImportanceSampler.cxx:189
 ToyMCImportanceSampler.cxx:190
 ToyMCImportanceSampler.cxx:191
 ToyMCImportanceSampler.cxx:192
 ToyMCImportanceSampler.cxx:193
 ToyMCImportanceSampler.cxx:194
 ToyMCImportanceSampler.cxx:195
 ToyMCImportanceSampler.cxx:196
 ToyMCImportanceSampler.cxx:197
 ToyMCImportanceSampler.cxx:198
 ToyMCImportanceSampler.cxx:199
 ToyMCImportanceSampler.cxx:200
 ToyMCImportanceSampler.cxx:201
 ToyMCImportanceSampler.cxx:202
 ToyMCImportanceSampler.cxx:203
 ToyMCImportanceSampler.cxx:204
 ToyMCImportanceSampler.cxx:205
 ToyMCImportanceSampler.cxx:206
 ToyMCImportanceSampler.cxx:207
 ToyMCImportanceSampler.cxx:208
 ToyMCImportanceSampler.cxx:209
 ToyMCImportanceSampler.cxx:210
 ToyMCImportanceSampler.cxx:211
 ToyMCImportanceSampler.cxx:212
 ToyMCImportanceSampler.cxx:213
 ToyMCImportanceSampler.cxx:214
 ToyMCImportanceSampler.cxx:215
 ToyMCImportanceSampler.cxx:216
 ToyMCImportanceSampler.cxx:217
 ToyMCImportanceSampler.cxx:218
 ToyMCImportanceSampler.cxx:219
 ToyMCImportanceSampler.cxx:220
 ToyMCImportanceSampler.cxx:221
 ToyMCImportanceSampler.cxx:222
 ToyMCImportanceSampler.cxx:223
 ToyMCImportanceSampler.cxx:224
 ToyMCImportanceSampler.cxx:225
 ToyMCImportanceSampler.cxx:226
 ToyMCImportanceSampler.cxx:227
 ToyMCImportanceSampler.cxx:228
 ToyMCImportanceSampler.cxx:229
 ToyMCImportanceSampler.cxx:230
 ToyMCImportanceSampler.cxx:231
 ToyMCImportanceSampler.cxx:232
 ToyMCImportanceSampler.cxx:233
 ToyMCImportanceSampler.cxx:234
 ToyMCImportanceSampler.cxx:235
 ToyMCImportanceSampler.cxx:236
 ToyMCImportanceSampler.cxx:237
 ToyMCImportanceSampler.cxx:238
 ToyMCImportanceSampler.cxx:239
 ToyMCImportanceSampler.cxx:240
 ToyMCImportanceSampler.cxx:241
 ToyMCImportanceSampler.cxx:242
 ToyMCImportanceSampler.cxx:243
 ToyMCImportanceSampler.cxx:244
 ToyMCImportanceSampler.cxx:245
 ToyMCImportanceSampler.cxx:246
 ToyMCImportanceSampler.cxx:247
 ToyMCImportanceSampler.cxx:248
 ToyMCImportanceSampler.cxx:249
 ToyMCImportanceSampler.cxx:250
 ToyMCImportanceSampler.cxx:251
 ToyMCImportanceSampler.cxx:252
 ToyMCImportanceSampler.cxx:253
 ToyMCImportanceSampler.cxx:254
 ToyMCImportanceSampler.cxx:255
 ToyMCImportanceSampler.cxx:256
 ToyMCImportanceSampler.cxx:257
 ToyMCImportanceSampler.cxx:258
 ToyMCImportanceSampler.cxx:259
 ToyMCImportanceSampler.cxx:260
 ToyMCImportanceSampler.cxx:261
 ToyMCImportanceSampler.cxx:262
 ToyMCImportanceSampler.cxx:263
 ToyMCImportanceSampler.cxx:264
 ToyMCImportanceSampler.cxx:265
 ToyMCImportanceSampler.cxx:266
 ToyMCImportanceSampler.cxx:267
 ToyMCImportanceSampler.cxx:268
 ToyMCImportanceSampler.cxx:269
 ToyMCImportanceSampler.cxx:270
 ToyMCImportanceSampler.cxx:271
 ToyMCImportanceSampler.cxx:272
 ToyMCImportanceSampler.cxx:273
 ToyMCImportanceSampler.cxx:274
 ToyMCImportanceSampler.cxx:275
 ToyMCImportanceSampler.cxx:276
 ToyMCImportanceSampler.cxx:277
 ToyMCImportanceSampler.cxx:278
 ToyMCImportanceSampler.cxx:279
 ToyMCImportanceSampler.cxx:280
 ToyMCImportanceSampler.cxx:281
 ToyMCImportanceSampler.cxx:282
 ToyMCImportanceSampler.cxx:283
 ToyMCImportanceSampler.cxx:284
 ToyMCImportanceSampler.cxx:285
 ToyMCImportanceSampler.cxx:286
 ToyMCImportanceSampler.cxx:287
 ToyMCImportanceSampler.cxx:288
 ToyMCImportanceSampler.cxx:289
 ToyMCImportanceSampler.cxx:290
 ToyMCImportanceSampler.cxx:291
 ToyMCImportanceSampler.cxx:292
 ToyMCImportanceSampler.cxx:293
 ToyMCImportanceSampler.cxx:294
 ToyMCImportanceSampler.cxx:295
 ToyMCImportanceSampler.cxx:296
 ToyMCImportanceSampler.cxx:297
 ToyMCImportanceSampler.cxx:298
 ToyMCImportanceSampler.cxx:299
 ToyMCImportanceSampler.cxx:300
 ToyMCImportanceSampler.cxx:301
 ToyMCImportanceSampler.cxx:302
 ToyMCImportanceSampler.cxx:303
 ToyMCImportanceSampler.cxx:304
 ToyMCImportanceSampler.cxx:305
 ToyMCImportanceSampler.cxx:306
 ToyMCImportanceSampler.cxx:307
 ToyMCImportanceSampler.cxx:308
 ToyMCImportanceSampler.cxx:309
 ToyMCImportanceSampler.cxx:310
 ToyMCImportanceSampler.cxx:311
 ToyMCImportanceSampler.cxx:312
 ToyMCImportanceSampler.cxx:313
 ToyMCImportanceSampler.cxx:314
 ToyMCImportanceSampler.cxx:315
 ToyMCImportanceSampler.cxx:316
 ToyMCImportanceSampler.cxx:317
 ToyMCImportanceSampler.cxx:318
 ToyMCImportanceSampler.cxx:319
 ToyMCImportanceSampler.cxx:320
 ToyMCImportanceSampler.cxx:321
 ToyMCImportanceSampler.cxx:322
 ToyMCImportanceSampler.cxx:323
 ToyMCImportanceSampler.cxx:324
 ToyMCImportanceSampler.cxx:325
 ToyMCImportanceSampler.cxx:326
 ToyMCImportanceSampler.cxx:327
 ToyMCImportanceSampler.cxx:328
 ToyMCImportanceSampler.cxx:329
 ToyMCImportanceSampler.cxx:330
 ToyMCImportanceSampler.cxx:331
 ToyMCImportanceSampler.cxx:332
 ToyMCImportanceSampler.cxx:333
 ToyMCImportanceSampler.cxx:334
 ToyMCImportanceSampler.cxx:335
 ToyMCImportanceSampler.cxx:336
 ToyMCImportanceSampler.cxx:337
 ToyMCImportanceSampler.cxx:338
 ToyMCImportanceSampler.cxx:339
 ToyMCImportanceSampler.cxx:340
 ToyMCImportanceSampler.cxx:341
 ToyMCImportanceSampler.cxx:342
 ToyMCImportanceSampler.cxx:343
 ToyMCImportanceSampler.cxx:344
 ToyMCImportanceSampler.cxx:345
 ToyMCImportanceSampler.cxx:346
 ToyMCImportanceSampler.cxx:347
 ToyMCImportanceSampler.cxx:348
 ToyMCImportanceSampler.cxx:349
 ToyMCImportanceSampler.cxx:350
 ToyMCImportanceSampler.cxx:351
 ToyMCImportanceSampler.cxx:352
 ToyMCImportanceSampler.cxx:353
 ToyMCImportanceSampler.cxx:354
 ToyMCImportanceSampler.cxx:355
 ToyMCImportanceSampler.cxx:356
 ToyMCImportanceSampler.cxx:357
 ToyMCImportanceSampler.cxx:358
 ToyMCImportanceSampler.cxx:359
 ToyMCImportanceSampler.cxx:360
 ToyMCImportanceSampler.cxx:361
 ToyMCImportanceSampler.cxx:362
 ToyMCImportanceSampler.cxx:363
 ToyMCImportanceSampler.cxx:364
 ToyMCImportanceSampler.cxx:365
 ToyMCImportanceSampler.cxx:366
 ToyMCImportanceSampler.cxx:367
 ToyMCImportanceSampler.cxx:368
 ToyMCImportanceSampler.cxx:369
 ToyMCImportanceSampler.cxx:370
 ToyMCImportanceSampler.cxx:371
 ToyMCImportanceSampler.cxx:372
 ToyMCImportanceSampler.cxx:373
 ToyMCImportanceSampler.cxx:374
 ToyMCImportanceSampler.cxx:375
 ToyMCImportanceSampler.cxx:376
 ToyMCImportanceSampler.cxx:377
 ToyMCImportanceSampler.cxx:378
 ToyMCImportanceSampler.cxx:379
 ToyMCImportanceSampler.cxx:380
 ToyMCImportanceSampler.cxx:381
 ToyMCImportanceSampler.cxx:382
 ToyMCImportanceSampler.cxx:383
 ToyMCImportanceSampler.cxx:384
 ToyMCImportanceSampler.cxx:385
 ToyMCImportanceSampler.cxx:386
 ToyMCImportanceSampler.cxx:387
 ToyMCImportanceSampler.cxx:388
 ToyMCImportanceSampler.cxx:389
 ToyMCImportanceSampler.cxx:390
 ToyMCImportanceSampler.cxx:391
 ToyMCImportanceSampler.cxx:392
 ToyMCImportanceSampler.cxx:393
 ToyMCImportanceSampler.cxx:394
 ToyMCImportanceSampler.cxx:395
 ToyMCImportanceSampler.cxx:396
 ToyMCImportanceSampler.cxx:397
 ToyMCImportanceSampler.cxx:398
 ToyMCImportanceSampler.cxx:399
 ToyMCImportanceSampler.cxx:400
 ToyMCImportanceSampler.cxx:401
 ToyMCImportanceSampler.cxx:402
 ToyMCImportanceSampler.cxx:403
 ToyMCImportanceSampler.cxx:404
 ToyMCImportanceSampler.cxx:405
 ToyMCImportanceSampler.cxx:406
 ToyMCImportanceSampler.cxx:407
 ToyMCImportanceSampler.cxx:408
 ToyMCImportanceSampler.cxx:409
 ToyMCImportanceSampler.cxx:410
 ToyMCImportanceSampler.cxx:411
 ToyMCImportanceSampler.cxx:412
 ToyMCImportanceSampler.cxx:413
 ToyMCImportanceSampler.cxx:414
 ToyMCImportanceSampler.cxx:415
 ToyMCImportanceSampler.cxx:416
 ToyMCImportanceSampler.cxx:417
 ToyMCImportanceSampler.cxx:418
 ToyMCImportanceSampler.cxx:419
 ToyMCImportanceSampler.cxx:420
 ToyMCImportanceSampler.cxx:421
 ToyMCImportanceSampler.cxx:422
 ToyMCImportanceSampler.cxx:423
 ToyMCImportanceSampler.cxx:424
 ToyMCImportanceSampler.cxx:425
 ToyMCImportanceSampler.cxx:426
 ToyMCImportanceSampler.cxx:427
 ToyMCImportanceSampler.cxx:428
 ToyMCImportanceSampler.cxx:429
 ToyMCImportanceSampler.cxx:430
 ToyMCImportanceSampler.cxx:431
 ToyMCImportanceSampler.cxx:432
 ToyMCImportanceSampler.cxx:433
 ToyMCImportanceSampler.cxx:434
 ToyMCImportanceSampler.cxx:435
 ToyMCImportanceSampler.cxx:436
 ToyMCImportanceSampler.cxx:437
 ToyMCImportanceSampler.cxx:438
 ToyMCImportanceSampler.cxx:439
 ToyMCImportanceSampler.cxx:440
 ToyMCImportanceSampler.cxx:441
 ToyMCImportanceSampler.cxx:442
 ToyMCImportanceSampler.cxx:443
 ToyMCImportanceSampler.cxx:444
 ToyMCImportanceSampler.cxx:445
 ToyMCImportanceSampler.cxx:446
 ToyMCImportanceSampler.cxx:447
 ToyMCImportanceSampler.cxx:448
 ToyMCImportanceSampler.cxx:449
 ToyMCImportanceSampler.cxx:450
 ToyMCImportanceSampler.cxx:451
 ToyMCImportanceSampler.cxx:452
 ToyMCImportanceSampler.cxx:453
 ToyMCImportanceSampler.cxx:454
 ToyMCImportanceSampler.cxx:455
 ToyMCImportanceSampler.cxx:456
 ToyMCImportanceSampler.cxx:457
 ToyMCImportanceSampler.cxx:458
 ToyMCImportanceSampler.cxx:459
 ToyMCImportanceSampler.cxx:460
 ToyMCImportanceSampler.cxx:461
 ToyMCImportanceSampler.cxx:462
 ToyMCImportanceSampler.cxx:463
 ToyMCImportanceSampler.cxx:464
 ToyMCImportanceSampler.cxx:465
 ToyMCImportanceSampler.cxx:466
 ToyMCImportanceSampler.cxx:467
 ToyMCImportanceSampler.cxx:468
 ToyMCImportanceSampler.cxx:469
 ToyMCImportanceSampler.cxx:470
 ToyMCImportanceSampler.cxx:471
 ToyMCImportanceSampler.cxx:472
 ToyMCImportanceSampler.cxx:473
 ToyMCImportanceSampler.cxx:474
 ToyMCImportanceSampler.cxx:475
 ToyMCImportanceSampler.cxx:476