ROOT logo
// @(#)root/roostats:$Id: ToyMCSampler.cxx 40023 2011-06-27 16:58:44Z moneta $
// 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 "RooSimultaneous.h"

#include "TMath.h"


ClassImp(RooStats::ToyMCSampler)

namespace RooStats {

class NuisanceParametersSampler {
   // Helper for ToyMCSampler. Handles all of the nuisance parameter related
   // functions. Once instantiated, it gives a new nuisance parameter point
   // at each call to nextPoint(...).

   public:
      NuisanceParametersSampler(RooAbsPdf *prior=NULL, const RooArgSet *parameters=NULL, Int_t nToys=1000, Bool_t asimov=kFALSE) :
         fPrior(prior),
         fParams(parameters),
         fNToys(nToys),
         fExpected(asimov),
         fPoints(NULL),
         fIndex(0)
      {
         if(prior) Refresh();
      }
      virtual ~NuisanceParametersSampler() {
         if(fPoints) delete fPoints;
      }

      void 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);
         }
      }


   protected:

      void 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->generateBinned(
               *fParams,
               RooFit::ExpectedData(),
               RooFit::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);
         }
      }


   private:
      RooAbsPdf *fPrior;           // prior for nuisance parameters
      const RooArgSet *fParams;    // nuisance parameters
      Int_t fNToys;
      Bool_t fExpected;

      RooAbsData *fPoints;         // generated nuisance parameter points
      Int_t fIndex;                // current index in fPoints array
};




Bool_t ToyMCSampler::fgAlwaysUseMultiGen = kFALSE ;



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


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

   if(!fTestStat) { ooccoutE((TObject*)NULL,InputArguments) << "Test statistic not set." << endl; goodConfig = false; }
   if(!fObservables) { ooccoutE((TObject*)NULL,InputArguments) << "Observables not set." << endl; goodConfig = false; }
   if(!fNullPOI) { ooccoutE((TObject*)NULL,InputArguments) << "Parameter values used to evaluate for test statistic  not set." << endl; goodConfig = false; }
   if(!fPdf) { ooccoutE((TObject*)NULL,InputArguments) << "Pdf not set." << endl; goodConfig = false; }

   return goodConfig;
}



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

   // ======= S I N G L E   R U N ? =======
   if(!fProofConfig)
      return GetSamplingDistributionSingleWorker(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);

   // 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());

   SamplingDistribution *result = new SamplingDistribution(GetSamplingDistName().c_str(), GetSamplingDistName().c_str());
   toymcstudy->merge(*result);

   // reset the number of toys
   fNToys = totToys;

   delete toymcstudy ;

   return result;
}

SamplingDistribution* ToyMCSampler::GetSamplingDistributionSingleWorker(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).

   CheckConfig();

   std::vector<Double_t> testStatVec;
   std::vector<Double_t> testStatWeights;

   // 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();
   if (fImportanceDensity) { 
      // in case of importance sampling include in allVars 
      // also any extra variables defined for the importance sampling
      RooArgSet *allVarsImpDens = fImportanceDensity->getVariables();
      allVars->add(*allVarsImpDens);
      delete allVarsImpDens;
   }
   RooArgSet *saveAll = (RooArgSet*) allVars->snapshot();

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

   for (Int_t i = 0; i < fMaxToys; ++i) {

      // 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;
      }

      // set variables to requested parameter point
      *allVars = *saveAll;
      *allVars = *paramPoint;

      Double_t value, weight;
      if(!fImportanceDensity) {
         // generate toy data for this parameter point
         RooAbsData* toydata = GenerateToyData(*paramPoint, weight);
         // evaluate test statistic, that only depends on null POI
         value = fTestStat->Evaluate(*toydata, *fNullPOI);

         delete toydata;
      }else{
         // generate toy data for this parameter point
         RooAbsData* toydata = GenerateToyDataImportanceSampling(*paramPoint, weight);
         // evaluate test statistic, that only depends on null POI
         value = fTestStat->Evaluate(*toydata, *fNullPOI);

         delete toydata;
      }


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

      // add results
      testStatVec.push_back(value);
      if(weight >= 0.) testStatWeights.push_back(weight);

      // adaptive sampling checks
      if (value <= fAdaptiveLowLimit  ||  value >= fAdaptiveHighLimit) {
         if(weight >= 0.) toysInTails += weight;
         else toysInTails += 1.;
      }
      if (toysInTails >= fToysInTails  &&  i+1 >= fNToys) break;
   }


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

   // return
   if (testStatWeights.size()) {
      return new SamplingDistribution(
         fSamplingDistName.c_str(),
         fSamplingDistName.c_str(),
         testStatVec,
         testStatWeights,
         fTestStat->GetVarName()
      );

   }
   return new SamplingDistribution(
      fSamplingDistName.c_str(),
      fSamplingDistName.c_str(),
      testStatVec,
      fTestStat->GetVarName()
   );
}

void ToyMCSampler::GenerateGlobalObservables() const {

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


   // generate one set of global observables and assign it
   // has problem for sim pdfs
   RooSimultaneous* simPdf = dynamic_cast<RooSimultaneous*> (fPdf);
   if (!simPdf) {
      RooDataSet *one = fPdf->generate(*fGlobalObservables, 1);

      const RooArgSet *values = one->get();
      if (!_allVars) {
         _allVars = fPdf->getVariables();
      }
      *_allVars = *values;
      delete one;

   } else {

      if (_pdfList.size() == 0) {
         TIterator* citer = simPdf->indexCat().typeIterator();
         RooCatType* tt = NULL;
         while ((tt = (RooCatType*) citer->Next())) {
            RooAbsPdf* pdftmp = simPdf->getPdf(tt->GetName());
            RooArgSet* globtmp = pdftmp->getObservables(*fGlobalObservables);
            RooAbsPdf::GenSpec* gs = pdftmp->prepareMultiGen(*globtmp, RooFit::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;
      }
   }
}

RooAbsData* ToyMCSampler::GenerateToyData(RooArgSet& paramPoint, double& weight) 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;
   }

   if(fImportanceDensity) {
      oocoutW((TObject*)NULL,InputArguments) << "ToyMCSampler: importance density given but ignored for generating toys." << endl;
   }

   // 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);
      GenerateGlobalObservables();
   }

   // 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?
      // get nuisance parameter point and weight
      fNuisanceParametersSampler->NextPoint(*allVars, weight);
   }else{
      weight = -1.0;
   }

   RooAbsData *data = Generate(*fPdf, 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::GenerateToyDataImportanceSampling(RooArgSet& paramPoint, double& weight) 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.


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

   if(!fImportanceDensity) {
      // no Importance Sampling
      oocoutE((TObject*)NULL,InputArguments) << "ToyMCSampler: no importance density given." << 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);

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

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

   if(fNuisanceParametersSampler) { // use nuisance parameters?
      // get nuisance parameter point and weight
      fNuisanceParametersSampler->NextPoint(*allVars, weight);
   }else{
      weight = -1.0;
   }

   // the number of events generated is either the given fNEvents or
   // in case this is not given, the expected number of events of
   // the pdf with a Poisson fluctuation
   int forceEvents = 0;
   if(fNEvents == 0) {
      forceEvents = (int)fPdf->expectedEvents(observables);
      forceEvents = RooRandom::randomGenerator()->Poisson(forceEvents);
   }

   // need to be careful here not to overwrite the current state of the
   // nuisance parameters, ie they must not be part of the snapshot
   if(fImportanceSnapshot) *allVars = *fImportanceSnapshot;

   // generate with the parameters configured in this class
   //   NULL => no protoData
   //   overwriteEvents => replaces fNEvents it would usually take
   RooAbsData* data = Generate(*fImportanceDensity, observables, NULL, forceEvents);





   // Importance Sampling: adjust weight
   // Source: presentation by Michael Woodroofe

   // NOTE that importance density is used only when sampling also the
   // nuisance parameters
   // One has to be careful not to have nuisance parameter in the snapshot
   // otherwise they will be not smeared in GenerateToyData


   // get the NLLs of the importance density and the pdf to sample
   if (fImportanceSnapshot)   *allVars = *fImportanceSnapshot;

   RooAbsReal *impNLL = fImportanceDensity->createNLL(*data, RooFit::Extended(kFALSE), RooFit::CloneData(kFALSE));
   double impNLLVal = impNLL->getVal();
   delete impNLL;


   *allVars = paramPoint;
   RooAbsReal *pdfNLL = fPdf->createNLL(*data, RooFit::Extended(kFALSE), RooFit::CloneData(kFALSE));
   double pdfNLLVal = pdfNLL->getVal();
   delete pdfNLL;

   // L(pdf) / L(imp)  =  exp( NLL(imp) - NLL(pdf) )
   weight *= exp(impNLLVal - pdfNLLVal);




   *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;

   if(events == 0) {
      if( pdf.canBeExtended() && pdf.expectedEvents(observables) > 0) {
         if(fGenerateBinned) {
            if(protoData) data = pdf.generateBinned(observables, RooFit::Extended(), RooFit::ProtoData(*protoData, true, true));
            else          data = pdf.generateBinned(observables, RooFit::Extended());
         }else{
	   if(protoData) {
	     if (fUseMultiGen || fgAlwaysUseMultiGen) {
	       if (!_gs2) { _gs2 = pdf.prepareMultiGen(observables, RooFit::Extended(), RooFit::ProtoData(*protoData, true, true)) ; }
	       data = pdf.generate(*_gs2) ;
	     } else {
	       data = pdf.generate      (observables, RooFit::Extended(), RooFit::ProtoData(*protoData, true, true));
	     }
	   }
            else  {
	      if (fUseMultiGen || fgAlwaysUseMultiGen) {
		if (!_gs1) { _gs1 = pdf.prepareMultiGen(observables,RooFit::Extended()) ; }
		data = pdf.generate(*_gs1) ;
	      } else {
		data = pdf.generate      (observables, RooFit::Extended());
	      }

	    }
         }
      }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.generateBinned(observables, events, RooFit::ProtoData(*protoData, true, true));
         else          data = pdf.generateBinned(observables, events);
      }else{
	if(protoData) {
	  if (fUseMultiGen || fgAlwaysUseMultiGen) {
	    if (!_gs3) { _gs3 = pdf.prepareMultiGen(observables, RooFit::NumEvents(events), RooFit::ProtoData(*protoData, true, true)); }
	    data = pdf.generate(*_gs3) ;
	  } else {
	    data = pdf.generate      (observables, events, RooFit::ProtoData(*protoData, true, true));
	  }
	} else {
	  if (fUseMultiGen || fgAlwaysUseMultiGen) {	    
	    if (!_gs4) { _gs4 = pdf.prepareMultiGen(observables, RooFit::NumEvents(events)); }
	    data = pdf.generate(*_gs4) ;
	  } else {
	    data = pdf.generate      (observables, events);
	  }
	}
      }
   }
   
   return data;
}





} // 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