// @(#)root/roostats:$Id$
// Author: Sven Kreiss    June 2010
// 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/ToyMCSampler.h"

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

#ifndef ROO_DATA_HIST
#include "RooDataHist.h"
#endif

#ifndef ROO_REAL_VAR
#include "RooRealVar.h"
#endif

#include "TCanvas.h"
#include "RooPlot.h"
#include "RooRandom.h"

#include "RooStudyManager.h"
#include "RooStats/ToyMCStudy.h"
#include "RooStats/DetailedOutputAggregator.h"
#include "RooStats/RooStatsUtils.h"
#include "RooSimultaneous.h"
#include "RooCategory.h"

#include "TMath.h"


using namespace RooFit;
using namespace std;


ClassImp(RooStats::ToyMCSampler)

namespace RooStats {

void NuisanceParametersSampler::NextPoint(RooArgSet& nuisPoint, Double_t& weight) {
   // Assigns new nuisance parameter point to members of nuisPoint.
   // nuisPoint can be more objects than just the nuisance
   // parameters.

   // check whether to get new set of nuisanceParPoints
   if (fIndex >= fNToys) {
      Refresh();
      fIndex = 0;
   }

   // get value
   nuisPoint =  *fPoints->get(fIndex++);
   weight = fPoints->weight();

   // check whether result will have any influence
   if(fPoints->weight() == 0.0) {
      oocoutI((TObject*)NULL,Generation) << "Weight 0 encountered. Skipping." << endl;
      NextPoint(nuisPoint, weight);
   }
}
void NuisanceParametersSampler::Refresh() {
   // Creates the initial set of nuisance parameter points. It also refills the
   // set with new parameter points if called repeatedly. This helps with
   // adaptive sampling as the required number of nuisance parameter points
   // might increase during the run.

   if (!fPrior || !fParams) return;

   if (fPoints) delete fPoints;

   if (fExpected) {
      // UNDER CONSTRUCTION
      oocoutI((TObject*)NULL,InputArguments) << "Using expected nuisance parameters." << endl;

      int nBins = fNToys;

      // From FeldmanCousins.cxx:
      // set nbins for the POI
      TIter it2 = fParams->createIterator();
      RooRealVar *myarg2;
      while ((myarg2 = dynamic_cast<RooRealVar*>(it2.Next()))) {
        myarg2->setBins(nBins);
      }


      fPoints = fPrior->generate(
         *fParams,
         AllBinned(),
         ExpectedData(),
         NumEvents(1) // for Asimov set, this is only a scale factor
      );
      if(fPoints->numEntries() != fNToys) {
         fNToys = fPoints->numEntries();
         oocoutI((TObject*)NULL,InputArguments) <<
            "Adjusted number of toys to number of bins of nuisance parameters: " << fNToys << endl;
      }

/*
      // check
      TCanvas *c1 = new TCanvas;
      RooPlot *p = dynamic_cast<RooRealVar*>(fParams->first())->frame();
      fPoints->plotOn(p);
      p->Draw();
      for(int x=0; x < fPoints->numEntries(); x++) {
         fPoints->get(x)->Print("v");
         cout << fPoints->weight() << endl;
      }
*/

   }else{
      oocoutI((TObject*)NULL,InputArguments) << "Using randomized nuisance parameters." << endl;

      fPoints = fPrior->generate(*fParams, fNToys);
   }
}



Bool_t ToyMCSampler::fgAlwaysUseMultiGen = kFALSE ;


void ToyMCSampler::SetAlwaysUseMultiGen(Bool_t flag) { fgAlwaysUseMultiGen = flag ; }



ToyMCSampler::ToyMCSampler() : fSamplingDistName("SD"), fNToys(1)
{
   // Proof constructor. Do not use.

   fPdf = NULL;
   fParametersForTestStat = NULL;
   fPriorNuisance = NULL;
   fNuisancePars = NULL;
   fObservables = NULL;
   fGlobalObservables = NULL;

   fSize = 0.05;
   fNEvents = 0;
   fGenerateBinned = kFALSE;
   fGenerateBinnedTag = "";
   fGenerateAutoBinned = kTRUE;
   fExpectedNuisancePar = kFALSE;

   fToysInTails = 0.0;
   fMaxToys = RooNumber::infinity();
   fAdaptiveLowLimit = -RooNumber::infinity();
   fAdaptiveHighLimit = RooNumber::infinity();

   fProtoData = NULL;

   fProofConfig = NULL;
   fNuisanceParametersSampler = NULL;

   _allVars = NULL ;
   _gs1 = NULL ;
   _gs2 = NULL ;
   _gs3 = NULL ;
   _gs4 = NULL ;
   
   //suppress messages for num integration of Roofit
   RooMsgService::instance().getStream(1).removeTopic(RooFit::NumIntegration);
   
   fUseMultiGen = kFALSE ;
}

ToyMCSampler::ToyMCSampler(TestStatistic &ts, Int_t ntoys) :
   fSamplingDistName(ts.GetVarName()), fNToys(ntoys)
{
   fPdf = NULL;
   fParametersForTestStat = NULL;
   fPriorNuisance = NULL;
   fNuisancePars = NULL;
   fObservables = NULL;
   fGlobalObservables = NULL;

   fSize = 0.05;
   fNEvents = 0;
   fGenerateBinned = kFALSE;
   fGenerateBinnedTag = "";
   fGenerateAutoBinned = kTRUE;
   fExpectedNuisancePar = kFALSE;

   fToysInTails = 0.0;
   fMaxToys = RooNumber::infinity();
   fAdaptiveLowLimit = -RooNumber::infinity();
   fAdaptiveHighLimit = RooNumber::infinity();

   fProtoData = NULL;

   fProofConfig = NULL;
   fNuisanceParametersSampler = NULL;

   _allVars = NULL ;
   _gs1 = NULL ;
   _gs2 = NULL ;
   _gs3 = NULL ;
   _gs4 = NULL ;
   
   //suppress messages for num integration of Roofit
   RooMsgService::instance().getStream(1).removeTopic(RooFit::NumIntegration);
   
   fUseMultiGen = kFALSE ;

   AddTestStatistic(&ts);
}


ToyMCSampler::~ToyMCSampler() {
   if(fNuisanceParametersSampler) delete fNuisanceParametersSampler;

   ClearCache();
}


Bool_t ToyMCSampler::CheckConfig(void) {
   // only checks, no guessing/determination (do this in calculators,
   // e.g. using ModelConfig::GuessObsAndNuisance(...))
   bool goodConfig = true;

   if(fTestStatistics.size() == 0 || fTestStatistics[0] == NULL) { ooccoutE((TObject*)NULL,InputArguments) << "Test statistic not set." << endl; goodConfig = false; }
   if(!fObservables) { ooccoutE((TObject*)NULL,InputArguments) << "Observables not set." << endl; goodConfig = false; }
   if(!fParametersForTestStat) { ooccoutE((TObject*)NULL,InputArguments) << "Parameter values used to evaluate the test statistic are not set." << endl; goodConfig = false; }
   if(!fPdf) { ooccoutE((TObject*)NULL,InputArguments) << "Pdf not set." << endl; goodConfig = false; }


   //ooccoutI((TObject*)NULL,InputArguments) << "ToyMCSampler configuration:" << endl;
   //ooccoutI((TObject*)NULL,InputArguments) << "Pdf from SetPdf: " << fPdf << endl;
   // for( unsigned int i=0; i < fTestStatistics.size(); i++ ) {
   //   ooccoutI((TObject*)NULL,InputArguments) << "test statistics["<<i<<"]: " << fTestStatistics[i] << endl;
   // }
   //ooccoutI((TObject*)NULL,InputArguments) << endl;

   return goodConfig;
}


RooArgList* ToyMCSampler::EvaluateAllTestStatistics(RooAbsData& data, const RooArgSet& poi) {
   // Evaluate all test statistics, returning result and any detailed output.
   // PDF parameter values are saved in case they are modified by
   // TestStatistic::Evaluate (eg. SimpleLikelihoodRatioTestStat).
   DetailedOutputAggregator detOutAgg;
   const RooArgList* allTS = EvaluateAllTestStatistics(data, poi, detOutAgg);
   if (!allTS) return 0;
   // no need to delete allTS, it is deleted in destructor of detOutAgg
   return  dynamic_cast<RooArgList*>(allTS->snapshot());
}


const RooArgList* ToyMCSampler::EvaluateAllTestStatistics(RooAbsData& data, const RooArgSet& poi, DetailedOutputAggregator& detOutAgg) {
   RooArgSet *allVars = fPdf ? fPdf->getVariables() : 0;
   RooArgSet *saveAll = allVars ? dynamic_cast<RooArgSet*>(allVars->snapshot()) : 0;
   for( unsigned int i = 0; i < fTestStatistics.size(); i++ ) {
      if( fTestStatistics[i] == NULL ) continue;
      TString name( TString::Format("%s_TS%u", fSamplingDistName.c_str(), i) );
      RooArgSet* parForTS = dynamic_cast<RooArgSet*>(poi.snapshot());
      RooRealVar ts( name, fTestStatistics[i]->GetVarName(), fTestStatistics[i]->Evaluate( data, *parForTS ) );
      RooArgList tset(ts);
      detOutAgg.AppendArgSet(&tset);
      delete parForTS;
      if (const RooArgSet* detOut = fTestStatistics[i]->GetDetailedOutput()) {
        name.Append("_");
        detOutAgg.AppendArgSet(detOut, name);
      }
      if (saveAll) *allVars = *saveAll;  // restore values, perhaps modified by fTestStatistics[i]->Evaluate()
   }
   delete saveAll;
   delete allVars;
   return detOutAgg.GetAsArgList();
}


SamplingDistribution* ToyMCSampler::GetSamplingDistribution(RooArgSet& paramPointIn) {
   if(fTestStatistics.size() > 1) {
      oocoutW((TObject*)NULL, InputArguments) << "Multiple test statistics defined, but only one distribution will be returned." << endl;
      for( unsigned int i=0; i < fTestStatistics.size(); i++ ) {
         oocoutW((TObject*)NULL, InputArguments) << " \t test statistic: " << fTestStatistics[i] << endl;
      }
   }
   
   RooDataSet* r = GetSamplingDistributions(paramPointIn);
   if(r == NULL || r->numEntries() == 0) {
      oocoutW((TObject*)NULL, Generation) << "no sampling distribution generated" << endl;
      return NULL;
   }
   
   SamplingDistribution* samp = new SamplingDistribution( r->GetName(), r->GetTitle(), *r );
   delete r;
   return samp;
}


RooDataSet* ToyMCSampler::GetSamplingDistributions(RooArgSet& paramPointIn)
{
   // Use for serial and parallel runs.

   // ======= S I N G L E   R U N ? =======
   if(!fProofConfig)
      return GetSamplingDistributionsSingleWorker(paramPointIn);


   // ======= P A R A L L E L   R U N =======
   CheckConfig();

   // turn adaptive sampling off if given
   if(fToysInTails) {
      fToysInTails = 0;
      oocoutW((TObject*)NULL, InputArguments)
         << "Adaptive sampling in ToyMCSampler is not supported for parallel runs."
         << endl;
   }

   // adjust number of toys on the slaves to keep the total number of toys constant
   Int_t totToys = fNToys;
   fNToys = (int)ceil((double)fNToys / (double)fProofConfig->GetNExperiments()); // round up

   // create the study instance for parallel processing
   ToyMCStudy* toymcstudy = new ToyMCStudy ;
   toymcstudy->SetToyMCSampler(*this);
   toymcstudy->SetParamPoint(paramPointIn);
   toymcstudy->SetRandomSeed(RooRandom::randomGenerator()->Integer(TMath::Limits<unsigned int>::Max() ) );

   // temporary workspace for proof to avoid messing with TRef
   RooWorkspace w(fProofConfig->GetWorkspace());
   RooStudyManager studymanager(w, *toymcstudy);
   studymanager.runProof(fProofConfig->GetNExperiments(), fProofConfig->GetHost(), fProofConfig->GetShowGui());

   RooDataSet* output = toymcstudy->merge();

   // reset the number of toys
   fNToys = totToys;

   delete toymcstudy;
   return output;
}

RooDataSet* ToyMCSampler::GetSamplingDistributionsSingleWorker(RooArgSet& paramPointIn)
{
   // This is the main function for serial runs. It is called automatically
   // from inside GetSamplingDistribution when no ProofConfig is given.
   // You should not call this function yourself. This function should
   // be used by ToyMCStudy on the workers (ie. when you explicitly want
   // a serial run although ProofConfig is present).

   // Make sure the cache is clear. It is important to clear it hear, because
   // the cache might be invalid even when just the firstPOI was changed, for which
   // no accessor has to be called. (Fixes a bug when ToyMCSampler is
   // used with the Neyman Construction)
   ClearCache();

   CheckConfig();

   // important to cache the paramPoint b/c test statistic might 
   // modify it from event to event
   RooArgSet *paramPoint = (RooArgSet*) paramPointIn.snapshot();
   RooArgSet *allVars = fPdf->getVariables();
   RooArgSet *saveAll = (RooArgSet*) allVars->snapshot();


   DetailedOutputAggregator detOutAgg;

   // counts the number of toys in the limits set for adaptive sampling
   // (taking weights into account; always on first test statistic)
   Double_t toysInTails = 0.0;

   for (Int_t i = 0; i < fMaxToys; ++i) {
      // need to check at the beginning for case that zero toys are requested
      if (toysInTails >= fToysInTails  &&  i+1 > fNToys) break;

      // status update
      if ( i% 500 == 0 && i>0 ) {
         oocoutP((TObject*)0,Generation) << "generated toys: " << i << " / " << fNToys;
         if (fToysInTails) ooccoutP((TObject*)0,Generation) << " (tails: " << toysInTails << " / " << fToysInTails << ")" << std::endl;
         else ooccoutP((TObject*)0,Generation) << endl;
      }


      // TODO: change this treatment to keep track of all values so that the threshold
      // for adaptive sampling is counted for all distributions and not just the
      // first one.
      Double_t valueFirst = -999.0, weight = 1.0;

      // set variables to requested parameter point
      *allVars = *saveAll; // important for example for SimpleLikelihoodRatioTestStat
      
      RooAbsData* toydata = GenerateToyData(*paramPoint, weight);

      *allVars = *fParametersForTestStat;

      const RooArgList* allTS = EvaluateAllTestStatistics(*toydata, *fParametersForTestStat, detOutAgg);
      if (allTS->getSize() > Int_t(fTestStatistics.size()))
        detOutAgg.AppendArgSet( fGlobalObservables, "globObs_" );
      if (RooRealVar* firstTS = dynamic_cast<RooRealVar*>(allTS->first()))
         valueFirst = firstTS->getVal();

      delete toydata;

      // check for nan
      if(valueFirst != valueFirst) {
         oocoutW((TObject*)NULL, Generation) << "skip: " << valueFirst << ", " << weight << endl;
         continue;
      }

      detOutAgg.CommitSet(weight);

      // adaptive sampling checks
      if (valueFirst <= fAdaptiveLowLimit  ||  valueFirst >= fAdaptiveHighLimit) {
         if(weight >= 0.) toysInTails += weight;
         else toysInTails += 1.;
      }
   }

   // clean up
   *allVars = *saveAll;
   delete saveAll;
   delete allVars;
   delete paramPoint;

   return detOutAgg.GetAsDataSet(fSamplingDistName, fSamplingDistName);
}

void ToyMCSampler::GenerateGlobalObservables(RooAbsPdf& pdf) const {

   if(!fGlobalObservables  ||  fGlobalObservables->getSize()==0) {
      ooccoutE((TObject*)NULL,InputArguments) << "Global Observables not set." << endl;
      return;
   }
   
   
   if (fUseMultiGen || fgAlwaysUseMultiGen) {

      // generate one set of global observables and assign it
      // has problem for sim pdfs
      RooSimultaneous* simPdf = dynamic_cast<RooSimultaneous*>( &pdf );
      if (!simPdf) {
         RooDataSet *one = pdf.generate(*fGlobalObservables, 1);
   
         const RooArgSet *values = one->get(0);
         if (!_allVars) {
            _allVars = pdf.getVariables();
         }
         *_allVars = *values;
         delete one;
   
      } else {
   
         if (_pdfList.size() == 0) {
            RooCategory& channelCat = (RooCategory&)simPdf->indexCat();
            int nCat = channelCat.numTypes();
            for (int i=0; i < nCat; ++i){
               channelCat.setIndex(i);
               RooAbsPdf* pdftmp = simPdf->getPdf(channelCat.getLabel());
               assert(pdftmp);
               RooArgSet* globtmp = pdftmp->getObservables(*fGlobalObservables);
               RooAbsPdf::GenSpec* gs = pdftmp->prepareMultiGen(*globtmp, NumEvents(1));
               _pdfList.push_back(pdftmp);
               _obsList.push_back(globtmp);
               _gsList.push_back(gs);
            }
         }
   
         list<RooArgSet*>::iterator oiter = _obsList.begin();
         list<RooAbsPdf::GenSpec*>::iterator giter = _gsList.begin();
         for (list<RooAbsPdf*>::iterator iter = _pdfList.begin(); iter != _pdfList.end(); ++iter, ++giter, ++oiter) {
            //RooDataSet* tmp = (*iter)->generate(**oiter,1) ;
            RooDataSet* tmp = (*iter)->generate(**giter);
            **oiter = *tmp->get(0);
            delete tmp;
         }
      }


   } else {
   
      // not using multigen for global observables
      RooDataSet* one = pdf.generateSimGlobal( *fGlobalObservables, 1 );
      const RooArgSet *values = one->get(0);
      RooArgSet* allVars = pdf.getVariables();
      *allVars = *values;
      delete allVars;
      delete one;

   }
}

RooAbsData* ToyMCSampler::GenerateToyData(RooArgSet& paramPoint, double& weight, RooAbsPdf& pdf) const {
   // This method generates a toy data set 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.

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

   // assign input paramPoint
   RooArgSet* allVars = fPdf->getVariables();
   *allVars = paramPoint;


   // create nuisance parameter points
   if(!fNuisanceParametersSampler && fPriorNuisance && fNuisancePars) {
      fNuisanceParametersSampler = new NuisanceParametersSampler(fPriorNuisance, fNuisancePars, fNToys, fExpectedNuisancePar);
      if ((fUseMultiGen || fgAlwaysUseMultiGen) &&  fNuisanceParametersSampler )
         oocoutI((TObject*)NULL,InputArguments) << "Cannot use multigen when nuisance parameters vary for every toy" << endl;
   }

   // generate global observables
   RooArgSet observables(*fObservables);
   if(fGlobalObservables  &&  fGlobalObservables->getSize()) {
      observables.remove(*fGlobalObservables);
      GenerateGlobalObservables(pdf);
   }

   // save values to restore later.
   // but this must remain after(!) generating global observables
   const RooArgSet* saveVars = (const RooArgSet*)allVars->snapshot();

   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, weight);


   }else{
      weight = 1.0;
   }

   RooAbsData *data = Generate(pdf, observables);

   // We generated the data with the randomized nuisance parameter (if hybrid)
   // but now we are setting the nuisance parameters back to where they were.
   *allVars = *saveVars;
   delete allVars;
   delete saveVars;

   return data;
}



RooAbsData* ToyMCSampler::Generate(RooAbsPdf &pdf, RooArgSet &observables, const RooDataSet* protoData, int forceEvents) const {
   // This is the generate function to use in the context of the ToyMCSampler
   // instead of the standard RooAbsPdf::generate(...).
   // It takes into account whether the number of events is given explicitly
   // or whether it should use the expected number of events. It also takes
   // into account the option to generate a binned data set (ie RooDataHist).

   if(fProtoData) {
      protoData = fProtoData;
      forceEvents = protoData->numEntries();
   }

   RooAbsData *data = NULL;
   int events = forceEvents;
   if(events == 0) events = fNEvents;

   // cannot use multigen when the nuisance parameters change for every toy
   bool useMultiGen = (fUseMultiGen || fgAlwaysUseMultiGen) && !fNuisanceParametersSampler; 

   if(events == 0) {
      if( pdf.canBeExtended() && pdf.expectedEvents(observables) > 0) {
         if(fGenerateBinned) {
            if(protoData) data = pdf.generate(observables, AllBinned(), Extended(), ProtoData(*protoData, true, true));
            else          data = pdf.generate(observables, AllBinned(), Extended());
         }else{
	   if(protoData) {
	     if (useMultiGen) {
	       if (!_gs2) { _gs2 = pdf.prepareMultiGen(observables, Extended(), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag), ProtoData(*protoData, true, true)) ; }
	       data = pdf.generate(*_gs2) ;
	     } else {
	       data = pdf.generate                    (observables, Extended(), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag), ProtoData(*protoData, true, true));
	     }
	   }
            else  {
	      if (useMultiGen) {
		if (!_gs1) { _gs1 = pdf.prepareMultiGen(observables, Extended(), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag) ) ; }
		data = pdf.generate(*_gs1) ;
	      } else {
		data = pdf.generate                    (observables, Extended(), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag) );
	      }

	    }
         }
      }else{
         oocoutE((TObject*)0,InputArguments)
            << "ToyMCSampler: Error : pdf is not extended and number of events per toy is zero"
            << endl;
      }
   }else{
      if(fGenerateBinned) {
         if(protoData) data = pdf.generate(observables, events, AllBinned(), ProtoData(*protoData, true, true));
         else          data = pdf.generate(observables, events, AllBinned());
      }else{
	if(protoData) {
	  if (useMultiGen) {
	    if (!_gs3) { _gs3 = pdf.prepareMultiGen(observables, NumEvents(events), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag), ProtoData(*protoData, true, true)); }
	    data = pdf.generate(*_gs3) ;
	  } else {
	    data = pdf.generate                    (observables, NumEvents(events), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag), ProtoData(*protoData, true, true));
	  }
	} else {
	  if (useMultiGen) {	    
	    if (!_gs4) { _gs4 = pdf.prepareMultiGen(observables, NumEvents(events), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag)); }
	    data = pdf.generate(*_gs4) ;
	  } else {
	    data = pdf.generate                    (observables, NumEvents(events), AutoBinned(fGenerateAutoBinned), GenBinned(fGenerateBinnedTag));
	  }
	}
      }
   }

   // in case of number counting print observables
   // if (data->numEntries() == 1) { 
   //    std::cout << "generate observables : ";
   //    RooStats::PrintListContent(*data->get(0), std::cout); 
   // }
   
   return data;
}





// Extended interface to append to sampling distribution more samples
SamplingDistribution* ToyMCSampler::AppendSamplingDistribution(
   RooArgSet& allParameters, 
   SamplingDistribution* last, 
   Int_t additionalMC)
{
   Int_t tmp = fNToys;
   fNToys = additionalMC;
   SamplingDistribution* newSamples = GetSamplingDistribution(allParameters);
   fNToys = tmp;
   
   if(last){
     last->Add(newSamples);
     delete newSamples;
     return last;
   }
   
   return newSamples;
}




void ToyMCSampler::ClearCache() { 
   // clear the cache obtained from the pdf used for speeding the toy and global observables generation
   // needs to be called every time the model pdf (fPdf) changes


   if (_gs1) delete _gs1; 
   _gs1 = 0;
   if (_gs2) delete _gs2; 
   _gs2 = 0;
   if (_gs3) delete _gs3; 
   _gs3 = 0;
   if (_gs4) delete _gs4; 
   _gs4 = 0;

   // no need to delete the _pdfList since it is managed by the RooSimultaneous object
   if (_pdfList.size() > 0) { 
      std::list<RooArgSet*>::iterator oiter = _obsList.begin();
      for (std::list<RooAbsPdf::GenSpec*>::iterator giter  = _gsList.begin(); giter != _gsList.end(); ++giter, ++oiter) {
         delete *oiter; 
         delete *giter; 
      }
      _pdfList.clear();
      _obsList.clear();
      _gsList.clear();
   }

   //LM: is this set really needed ??
   if (_allVars) delete _allVars; 
   _allVars = 0;

}

} // end namespace RooStats
 ToyMCSampler.cxx:1
 ToyMCSampler.cxx:2
 ToyMCSampler.cxx:3
 ToyMCSampler.cxx:4
 ToyMCSampler.cxx:5
 ToyMCSampler.cxx:6
 ToyMCSampler.cxx:7
 ToyMCSampler.cxx:8
 ToyMCSampler.cxx:9
 ToyMCSampler.cxx:10
 ToyMCSampler.cxx:11
 ToyMCSampler.cxx:12
 ToyMCSampler.cxx:13
 ToyMCSampler.cxx:14
 ToyMCSampler.cxx:15
 ToyMCSampler.cxx:16
 ToyMCSampler.cxx:17
 ToyMCSampler.cxx:18
 ToyMCSampler.cxx:19
 ToyMCSampler.cxx:20
 ToyMCSampler.cxx:21
 ToyMCSampler.cxx:22
 ToyMCSampler.cxx:23
 ToyMCSampler.cxx:24
 ToyMCSampler.cxx:25
 ToyMCSampler.cxx:26
 ToyMCSampler.cxx:27
 ToyMCSampler.cxx:28
 ToyMCSampler.cxx:29
 ToyMCSampler.cxx:30
 ToyMCSampler.cxx:31
 ToyMCSampler.cxx:32
 ToyMCSampler.cxx:33
 ToyMCSampler.cxx:34
 ToyMCSampler.cxx:35
 ToyMCSampler.cxx:36
 ToyMCSampler.cxx:37
 ToyMCSampler.cxx:38
 ToyMCSampler.cxx:39
 ToyMCSampler.cxx:40
 ToyMCSampler.cxx:41
 ToyMCSampler.cxx:42
 ToyMCSampler.cxx:43
 ToyMCSampler.cxx:44
 ToyMCSampler.cxx:45
 ToyMCSampler.cxx:46
 ToyMCSampler.cxx:47
 ToyMCSampler.cxx:48
 ToyMCSampler.cxx:49
 ToyMCSampler.cxx:50
 ToyMCSampler.cxx:51
 ToyMCSampler.cxx:52
 ToyMCSampler.cxx:53
 ToyMCSampler.cxx:54
 ToyMCSampler.cxx:55
 ToyMCSampler.cxx:56
 ToyMCSampler.cxx:57
 ToyMCSampler.cxx:58
 ToyMCSampler.cxx:59
 ToyMCSampler.cxx:60
 ToyMCSampler.cxx:61
 ToyMCSampler.cxx:62
 ToyMCSampler.cxx:63
 ToyMCSampler.cxx:64
 ToyMCSampler.cxx:65
 ToyMCSampler.cxx:66
 ToyMCSampler.cxx:67
 ToyMCSampler.cxx:68
 ToyMCSampler.cxx:69
 ToyMCSampler.cxx:70
 ToyMCSampler.cxx:71
 ToyMCSampler.cxx:72
 ToyMCSampler.cxx:73
 ToyMCSampler.cxx:74
 ToyMCSampler.cxx:75
 ToyMCSampler.cxx:76
 ToyMCSampler.cxx:77
 ToyMCSampler.cxx:78
 ToyMCSampler.cxx:79
 ToyMCSampler.cxx:80
 ToyMCSampler.cxx:81
 ToyMCSampler.cxx:82
 ToyMCSampler.cxx:83
 ToyMCSampler.cxx:84
 ToyMCSampler.cxx:85
 ToyMCSampler.cxx:86
 ToyMCSampler.cxx:87
 ToyMCSampler.cxx:88
 ToyMCSampler.cxx:89
 ToyMCSampler.cxx:90
 ToyMCSampler.cxx:91
 ToyMCSampler.cxx:92
 ToyMCSampler.cxx:93
 ToyMCSampler.cxx:94
 ToyMCSampler.cxx:95
 ToyMCSampler.cxx:96
 ToyMCSampler.cxx:97
 ToyMCSampler.cxx:98
 ToyMCSampler.cxx:99
 ToyMCSampler.cxx:100
 ToyMCSampler.cxx:101
 ToyMCSampler.cxx:102
 ToyMCSampler.cxx:103
 ToyMCSampler.cxx:104
 ToyMCSampler.cxx:105
 ToyMCSampler.cxx:106
 ToyMCSampler.cxx:107
 ToyMCSampler.cxx:108
 ToyMCSampler.cxx:109
 ToyMCSampler.cxx:110
 ToyMCSampler.cxx:111
 ToyMCSampler.cxx:112
 ToyMCSampler.cxx:113
 ToyMCSampler.cxx:114
 ToyMCSampler.cxx:115
 ToyMCSampler.cxx:116
 ToyMCSampler.cxx:117
 ToyMCSampler.cxx:118
 ToyMCSampler.cxx:119
 ToyMCSampler.cxx:120
 ToyMCSampler.cxx:121
 ToyMCSampler.cxx:122
 ToyMCSampler.cxx:123
 ToyMCSampler.cxx:124
 ToyMCSampler.cxx:125
 ToyMCSampler.cxx:126
 ToyMCSampler.cxx:127
 ToyMCSampler.cxx:128
 ToyMCSampler.cxx:129
 ToyMCSampler.cxx:130
 ToyMCSampler.cxx:131
 ToyMCSampler.cxx:132
 ToyMCSampler.cxx:133
 ToyMCSampler.cxx:134
 ToyMCSampler.cxx:135
 ToyMCSampler.cxx:136
 ToyMCSampler.cxx:137
 ToyMCSampler.cxx:138
 ToyMCSampler.cxx:139
 ToyMCSampler.cxx:140
 ToyMCSampler.cxx:141
 ToyMCSampler.cxx:142
 ToyMCSampler.cxx:143
 ToyMCSampler.cxx:144
 ToyMCSampler.cxx:145
 ToyMCSampler.cxx:146
 ToyMCSampler.cxx:147
 ToyMCSampler.cxx:148
 ToyMCSampler.cxx:149
 ToyMCSampler.cxx:150
 ToyMCSampler.cxx:151
 ToyMCSampler.cxx:152
 ToyMCSampler.cxx:153
 ToyMCSampler.cxx:154
 ToyMCSampler.cxx:155
 ToyMCSampler.cxx:156
 ToyMCSampler.cxx:157
 ToyMCSampler.cxx:158
 ToyMCSampler.cxx:159
 ToyMCSampler.cxx:160
 ToyMCSampler.cxx:161
 ToyMCSampler.cxx:162
 ToyMCSampler.cxx:163
 ToyMCSampler.cxx:164
 ToyMCSampler.cxx:165
 ToyMCSampler.cxx:166
 ToyMCSampler.cxx:167
 ToyMCSampler.cxx:168
 ToyMCSampler.cxx:169
 ToyMCSampler.cxx:170
 ToyMCSampler.cxx:171
 ToyMCSampler.cxx:172
 ToyMCSampler.cxx:173
 ToyMCSampler.cxx:174
 ToyMCSampler.cxx:175
 ToyMCSampler.cxx:176
 ToyMCSampler.cxx:177
 ToyMCSampler.cxx:178
 ToyMCSampler.cxx:179
 ToyMCSampler.cxx:180
 ToyMCSampler.cxx:181
 ToyMCSampler.cxx:182
 ToyMCSampler.cxx:183
 ToyMCSampler.cxx:184
 ToyMCSampler.cxx:185
 ToyMCSampler.cxx:186
 ToyMCSampler.cxx:187
 ToyMCSampler.cxx:188
 ToyMCSampler.cxx:189
 ToyMCSampler.cxx:190
 ToyMCSampler.cxx:191
 ToyMCSampler.cxx:192
 ToyMCSampler.cxx:193
 ToyMCSampler.cxx:194
 ToyMCSampler.cxx:195
 ToyMCSampler.cxx:196
 ToyMCSampler.cxx:197
 ToyMCSampler.cxx:198
 ToyMCSampler.cxx:199
 ToyMCSampler.cxx:200
 ToyMCSampler.cxx:201
 ToyMCSampler.cxx:202
 ToyMCSampler.cxx:203
 ToyMCSampler.cxx:204
 ToyMCSampler.cxx:205
 ToyMCSampler.cxx:206
 ToyMCSampler.cxx:207
 ToyMCSampler.cxx:208
 ToyMCSampler.cxx:209
 ToyMCSampler.cxx:210
 ToyMCSampler.cxx:211
 ToyMCSampler.cxx:212
 ToyMCSampler.cxx:213
 ToyMCSampler.cxx:214
 ToyMCSampler.cxx:215
 ToyMCSampler.cxx:216
 ToyMCSampler.cxx:217
 ToyMCSampler.cxx:218
 ToyMCSampler.cxx:219
 ToyMCSampler.cxx:220
 ToyMCSampler.cxx:221
 ToyMCSampler.cxx:222
 ToyMCSampler.cxx:223
 ToyMCSampler.cxx:224
 ToyMCSampler.cxx:225
 ToyMCSampler.cxx:226
 ToyMCSampler.cxx:227
 ToyMCSampler.cxx:228
 ToyMCSampler.cxx:229
 ToyMCSampler.cxx:230
 ToyMCSampler.cxx:231
 ToyMCSampler.cxx:232
 ToyMCSampler.cxx:233
 ToyMCSampler.cxx:234
 ToyMCSampler.cxx:235
 ToyMCSampler.cxx:236
 ToyMCSampler.cxx:237
 ToyMCSampler.cxx:238
 ToyMCSampler.cxx:239
 ToyMCSampler.cxx:240
 ToyMCSampler.cxx:241
 ToyMCSampler.cxx:242
 ToyMCSampler.cxx:243
 ToyMCSampler.cxx:244
 ToyMCSampler.cxx:245
 ToyMCSampler.cxx:246
 ToyMCSampler.cxx:247
 ToyMCSampler.cxx:248
 ToyMCSampler.cxx:249
 ToyMCSampler.cxx:250
 ToyMCSampler.cxx:251
 ToyMCSampler.cxx:252
 ToyMCSampler.cxx:253
 ToyMCSampler.cxx:254
 ToyMCSampler.cxx:255
 ToyMCSampler.cxx:256
 ToyMCSampler.cxx:257
 ToyMCSampler.cxx:258
 ToyMCSampler.cxx:259
 ToyMCSampler.cxx:260
 ToyMCSampler.cxx:261
 ToyMCSampler.cxx:262
 ToyMCSampler.cxx:263
 ToyMCSampler.cxx:264
 ToyMCSampler.cxx:265
 ToyMCSampler.cxx:266
 ToyMCSampler.cxx:267
 ToyMCSampler.cxx:268
 ToyMCSampler.cxx:269
 ToyMCSampler.cxx:270
 ToyMCSampler.cxx:271
 ToyMCSampler.cxx:272
 ToyMCSampler.cxx:273
 ToyMCSampler.cxx:274
 ToyMCSampler.cxx:275
 ToyMCSampler.cxx:276
 ToyMCSampler.cxx:277
 ToyMCSampler.cxx:278
 ToyMCSampler.cxx:279
 ToyMCSampler.cxx:280
 ToyMCSampler.cxx:281
 ToyMCSampler.cxx:282
 ToyMCSampler.cxx:283
 ToyMCSampler.cxx:284
 ToyMCSampler.cxx:285
 ToyMCSampler.cxx:286
 ToyMCSampler.cxx:287
 ToyMCSampler.cxx:288
 ToyMCSampler.cxx:289
 ToyMCSampler.cxx:290
 ToyMCSampler.cxx:291
 ToyMCSampler.cxx:292
 ToyMCSampler.cxx:293
 ToyMCSampler.cxx:294
 ToyMCSampler.cxx:295
 ToyMCSampler.cxx:296
 ToyMCSampler.cxx:297
 ToyMCSampler.cxx:298
 ToyMCSampler.cxx:299
 ToyMCSampler.cxx:300
 ToyMCSampler.cxx:301
 ToyMCSampler.cxx:302
 ToyMCSampler.cxx:303
 ToyMCSampler.cxx:304
 ToyMCSampler.cxx:305
 ToyMCSampler.cxx:306
 ToyMCSampler.cxx:307
 ToyMCSampler.cxx:308
 ToyMCSampler.cxx:309
 ToyMCSampler.cxx:310
 ToyMCSampler.cxx:311
 ToyMCSampler.cxx:312
 ToyMCSampler.cxx:313
 ToyMCSampler.cxx:314
 ToyMCSampler.cxx:315
 ToyMCSampler.cxx:316
 ToyMCSampler.cxx:317
 ToyMCSampler.cxx:318
 ToyMCSampler.cxx:319
 ToyMCSampler.cxx:320
 ToyMCSampler.cxx:321
 ToyMCSampler.cxx:322
 ToyMCSampler.cxx:323
 ToyMCSampler.cxx:324
 ToyMCSampler.cxx:325
 ToyMCSampler.cxx:326
 ToyMCSampler.cxx:327
 ToyMCSampler.cxx:328
 ToyMCSampler.cxx:329
 ToyMCSampler.cxx:330
 ToyMCSampler.cxx:331
 ToyMCSampler.cxx:332
 ToyMCSampler.cxx:333
 ToyMCSampler.cxx:334
 ToyMCSampler.cxx:335
 ToyMCSampler.cxx:336
 ToyMCSampler.cxx:337
 ToyMCSampler.cxx:338
 ToyMCSampler.cxx:339
 ToyMCSampler.cxx:340
 ToyMCSampler.cxx:341
 ToyMCSampler.cxx:342
 ToyMCSampler.cxx:343
 ToyMCSampler.cxx:344
 ToyMCSampler.cxx:345
 ToyMCSampler.cxx:346
 ToyMCSampler.cxx:347
 ToyMCSampler.cxx:348
 ToyMCSampler.cxx:349
 ToyMCSampler.cxx:350
 ToyMCSampler.cxx:351
 ToyMCSampler.cxx:352
 ToyMCSampler.cxx:353
 ToyMCSampler.cxx:354
 ToyMCSampler.cxx:355
 ToyMCSampler.cxx:356
 ToyMCSampler.cxx:357
 ToyMCSampler.cxx:358
 ToyMCSampler.cxx:359
 ToyMCSampler.cxx:360
 ToyMCSampler.cxx:361
 ToyMCSampler.cxx:362
 ToyMCSampler.cxx:363
 ToyMCSampler.cxx:364
 ToyMCSampler.cxx:365
 ToyMCSampler.cxx:366
 ToyMCSampler.cxx:367
 ToyMCSampler.cxx:368
 ToyMCSampler.cxx:369
 ToyMCSampler.cxx:370
 ToyMCSampler.cxx:371
 ToyMCSampler.cxx:372
 ToyMCSampler.cxx:373
 ToyMCSampler.cxx:374
 ToyMCSampler.cxx:375
 ToyMCSampler.cxx:376
 ToyMCSampler.cxx:377
 ToyMCSampler.cxx:378
 ToyMCSampler.cxx:379
 ToyMCSampler.cxx:380
 ToyMCSampler.cxx:381
 ToyMCSampler.cxx:382
 ToyMCSampler.cxx:383
 ToyMCSampler.cxx:384
 ToyMCSampler.cxx:385
 ToyMCSampler.cxx:386
 ToyMCSampler.cxx:387
 ToyMCSampler.cxx:388
 ToyMCSampler.cxx:389
 ToyMCSampler.cxx:390
 ToyMCSampler.cxx:391
 ToyMCSampler.cxx:392
 ToyMCSampler.cxx:393
 ToyMCSampler.cxx:394
 ToyMCSampler.cxx:395
 ToyMCSampler.cxx:396
 ToyMCSampler.cxx:397
 ToyMCSampler.cxx:398
 ToyMCSampler.cxx:399
 ToyMCSampler.cxx:400
 ToyMCSampler.cxx:401
 ToyMCSampler.cxx:402
 ToyMCSampler.cxx:403
 ToyMCSampler.cxx:404
 ToyMCSampler.cxx:405
 ToyMCSampler.cxx:406
 ToyMCSampler.cxx:407
 ToyMCSampler.cxx:408
 ToyMCSampler.cxx:409
 ToyMCSampler.cxx:410
 ToyMCSampler.cxx:411
 ToyMCSampler.cxx:412
 ToyMCSampler.cxx:413
 ToyMCSampler.cxx:414
 ToyMCSampler.cxx:415
 ToyMCSampler.cxx:416
 ToyMCSampler.cxx:417
 ToyMCSampler.cxx:418
 ToyMCSampler.cxx:419
 ToyMCSampler.cxx:420
 ToyMCSampler.cxx:421
 ToyMCSampler.cxx:422
 ToyMCSampler.cxx:423
 ToyMCSampler.cxx:424
 ToyMCSampler.cxx:425
 ToyMCSampler.cxx:426
 ToyMCSampler.cxx:427
 ToyMCSampler.cxx:428
 ToyMCSampler.cxx:429
 ToyMCSampler.cxx:430
 ToyMCSampler.cxx:431
 ToyMCSampler.cxx:432
 ToyMCSampler.cxx:433
 ToyMCSampler.cxx:434
 ToyMCSampler.cxx:435
 ToyMCSampler.cxx:436
 ToyMCSampler.cxx:437
 ToyMCSampler.cxx:438
 ToyMCSampler.cxx:439
 ToyMCSampler.cxx:440
 ToyMCSampler.cxx:441
 ToyMCSampler.cxx:442
 ToyMCSampler.cxx:443
 ToyMCSampler.cxx:444
 ToyMCSampler.cxx:445
 ToyMCSampler.cxx:446
 ToyMCSampler.cxx:447
 ToyMCSampler.cxx:448
 ToyMCSampler.cxx:449
 ToyMCSampler.cxx:450
 ToyMCSampler.cxx:451
 ToyMCSampler.cxx:452
 ToyMCSampler.cxx:453
 ToyMCSampler.cxx:454
 ToyMCSampler.cxx:455
 ToyMCSampler.cxx:456
 ToyMCSampler.cxx:457
 ToyMCSampler.cxx:458
 ToyMCSampler.cxx:459
 ToyMCSampler.cxx:460
 ToyMCSampler.cxx:461
 ToyMCSampler.cxx:462
 ToyMCSampler.cxx:463
 ToyMCSampler.cxx:464
 ToyMCSampler.cxx:465
 ToyMCSampler.cxx:466
 ToyMCSampler.cxx:467
 ToyMCSampler.cxx:468
 ToyMCSampler.cxx:469
 ToyMCSampler.cxx:470
 ToyMCSampler.cxx:471
 ToyMCSampler.cxx:472
 ToyMCSampler.cxx:473
 ToyMCSampler.cxx:474
 ToyMCSampler.cxx:475
 ToyMCSampler.cxx:476
 ToyMCSampler.cxx:477
 ToyMCSampler.cxx:478
 ToyMCSampler.cxx:479
 ToyMCSampler.cxx:480
 ToyMCSampler.cxx:481
 ToyMCSampler.cxx:482
 ToyMCSampler.cxx:483
 ToyMCSampler.cxx:484
 ToyMCSampler.cxx:485
 ToyMCSampler.cxx:486
 ToyMCSampler.cxx:487
 ToyMCSampler.cxx:488
 ToyMCSampler.cxx:489
 ToyMCSampler.cxx:490
 ToyMCSampler.cxx:491
 ToyMCSampler.cxx:492
 ToyMCSampler.cxx:493
 ToyMCSampler.cxx:494
 ToyMCSampler.cxx:495
 ToyMCSampler.cxx:496
 ToyMCSampler.cxx:497
 ToyMCSampler.cxx:498
 ToyMCSampler.cxx:499
 ToyMCSampler.cxx:500
 ToyMCSampler.cxx:501
 ToyMCSampler.cxx:502
 ToyMCSampler.cxx:503
 ToyMCSampler.cxx:504
 ToyMCSampler.cxx:505
 ToyMCSampler.cxx:506
 ToyMCSampler.cxx:507
 ToyMCSampler.cxx:508
 ToyMCSampler.cxx:509
 ToyMCSampler.cxx:510
 ToyMCSampler.cxx:511
 ToyMCSampler.cxx:512
 ToyMCSampler.cxx:513
 ToyMCSampler.cxx:514
 ToyMCSampler.cxx:515
 ToyMCSampler.cxx:516
 ToyMCSampler.cxx:517
 ToyMCSampler.cxx:518
 ToyMCSampler.cxx:519
 ToyMCSampler.cxx:520
 ToyMCSampler.cxx:521
 ToyMCSampler.cxx:522
 ToyMCSampler.cxx:523
 ToyMCSampler.cxx:524
 ToyMCSampler.cxx:525
 ToyMCSampler.cxx:526
 ToyMCSampler.cxx:527
 ToyMCSampler.cxx:528
 ToyMCSampler.cxx:529
 ToyMCSampler.cxx:530
 ToyMCSampler.cxx:531
 ToyMCSampler.cxx:532
 ToyMCSampler.cxx:533
 ToyMCSampler.cxx:534
 ToyMCSampler.cxx:535
 ToyMCSampler.cxx:536
 ToyMCSampler.cxx:537
 ToyMCSampler.cxx:538
 ToyMCSampler.cxx:539
 ToyMCSampler.cxx:540
 ToyMCSampler.cxx:541
 ToyMCSampler.cxx:542
 ToyMCSampler.cxx:543
 ToyMCSampler.cxx:544
 ToyMCSampler.cxx:545
 ToyMCSampler.cxx:546
 ToyMCSampler.cxx:547
 ToyMCSampler.cxx:548
 ToyMCSampler.cxx:549
 ToyMCSampler.cxx:550
 ToyMCSampler.cxx:551
 ToyMCSampler.cxx:552
 ToyMCSampler.cxx:553
 ToyMCSampler.cxx:554
 ToyMCSampler.cxx:555
 ToyMCSampler.cxx:556
 ToyMCSampler.cxx:557
 ToyMCSampler.cxx:558
 ToyMCSampler.cxx:559
 ToyMCSampler.cxx:560
 ToyMCSampler.cxx:561
 ToyMCSampler.cxx:562
 ToyMCSampler.cxx:563
 ToyMCSampler.cxx:564
 ToyMCSampler.cxx:565
 ToyMCSampler.cxx:566
 ToyMCSampler.cxx:567
 ToyMCSampler.cxx:568
 ToyMCSampler.cxx:569
 ToyMCSampler.cxx:570
 ToyMCSampler.cxx:571
 ToyMCSampler.cxx:572
 ToyMCSampler.cxx:573
 ToyMCSampler.cxx:574
 ToyMCSampler.cxx:575
 ToyMCSampler.cxx:576
 ToyMCSampler.cxx:577
 ToyMCSampler.cxx:578
 ToyMCSampler.cxx:579
 ToyMCSampler.cxx:580
 ToyMCSampler.cxx:581
 ToyMCSampler.cxx:582
 ToyMCSampler.cxx:583
 ToyMCSampler.cxx:584
 ToyMCSampler.cxx:585
 ToyMCSampler.cxx:586
 ToyMCSampler.cxx:587
 ToyMCSampler.cxx:588
 ToyMCSampler.cxx:589
 ToyMCSampler.cxx:590
 ToyMCSampler.cxx:591
 ToyMCSampler.cxx:592
 ToyMCSampler.cxx:593
 ToyMCSampler.cxx:594
 ToyMCSampler.cxx:595
 ToyMCSampler.cxx:596
 ToyMCSampler.cxx:597
 ToyMCSampler.cxx:598
 ToyMCSampler.cxx:599
 ToyMCSampler.cxx:600
 ToyMCSampler.cxx:601
 ToyMCSampler.cxx:602
 ToyMCSampler.cxx:603
 ToyMCSampler.cxx:604
 ToyMCSampler.cxx:605
 ToyMCSampler.cxx:606
 ToyMCSampler.cxx:607
 ToyMCSampler.cxx:608
 ToyMCSampler.cxx:609
 ToyMCSampler.cxx:610
 ToyMCSampler.cxx:611
 ToyMCSampler.cxx:612
 ToyMCSampler.cxx:613
 ToyMCSampler.cxx:614
 ToyMCSampler.cxx:615
 ToyMCSampler.cxx:616
 ToyMCSampler.cxx:617
 ToyMCSampler.cxx:618
 ToyMCSampler.cxx:619
 ToyMCSampler.cxx:620
 ToyMCSampler.cxx:621
 ToyMCSampler.cxx:622
 ToyMCSampler.cxx:623
 ToyMCSampler.cxx:624
 ToyMCSampler.cxx:625
 ToyMCSampler.cxx:626
 ToyMCSampler.cxx:627
 ToyMCSampler.cxx:628
 ToyMCSampler.cxx:629
 ToyMCSampler.cxx:630
 ToyMCSampler.cxx:631
 ToyMCSampler.cxx:632
 ToyMCSampler.cxx:633
 ToyMCSampler.cxx:634
 ToyMCSampler.cxx:635
 ToyMCSampler.cxx:636
 ToyMCSampler.cxx:637
 ToyMCSampler.cxx:638
 ToyMCSampler.cxx:639
 ToyMCSampler.cxx:640
 ToyMCSampler.cxx:641
 ToyMCSampler.cxx:642
 ToyMCSampler.cxx:643
 ToyMCSampler.cxx:644
 ToyMCSampler.cxx:645
 ToyMCSampler.cxx:646
 ToyMCSampler.cxx:647
 ToyMCSampler.cxx:648
 ToyMCSampler.cxx:649
 ToyMCSampler.cxx:650
 ToyMCSampler.cxx:651
 ToyMCSampler.cxx:652
 ToyMCSampler.cxx:653
 ToyMCSampler.cxx:654
 ToyMCSampler.cxx:655
 ToyMCSampler.cxx:656
 ToyMCSampler.cxx:657
 ToyMCSampler.cxx:658
 ToyMCSampler.cxx:659
 ToyMCSampler.cxx:660
 ToyMCSampler.cxx:661
 ToyMCSampler.cxx:662
 ToyMCSampler.cxx:663
 ToyMCSampler.cxx:664
 ToyMCSampler.cxx:665
 ToyMCSampler.cxx:666
 ToyMCSampler.cxx:667
 ToyMCSampler.cxx:668
 ToyMCSampler.cxx:669
 ToyMCSampler.cxx:670
 ToyMCSampler.cxx:671
 ToyMCSampler.cxx:672
 ToyMCSampler.cxx:673
 ToyMCSampler.cxx:674
 ToyMCSampler.cxx:675
 ToyMCSampler.cxx:676
 ToyMCSampler.cxx:677
 ToyMCSampler.cxx:678
 ToyMCSampler.cxx:679
 ToyMCSampler.cxx:680
 ToyMCSampler.cxx:681
 ToyMCSampler.cxx:682
 ToyMCSampler.cxx:683
 ToyMCSampler.cxx:684
 ToyMCSampler.cxx:685
 ToyMCSampler.cxx:686
 ToyMCSampler.cxx:687
 ToyMCSampler.cxx:688
 ToyMCSampler.cxx:689
 ToyMCSampler.cxx:690
 ToyMCSampler.cxx:691
 ToyMCSampler.cxx:692
 ToyMCSampler.cxx:693
 ToyMCSampler.cxx:694
 ToyMCSampler.cxx:695
 ToyMCSampler.cxx:696
 ToyMCSampler.cxx:697
 ToyMCSampler.cxx:698
 ToyMCSampler.cxx:699
 ToyMCSampler.cxx:700