ROOT logo

From $ROOTSYS/tutorials/roostats/StandardHypoTestInvDemo.C

/* -*- mode: c++ -*- */
// Standard tutorial macro for performing an inverted  hypothesis test 
//
// This macro will perform a scan of tehe p-values for computing the limit
// 

#include "TFile.h"
#include "RooWorkspace.h"
#include "RooAbsPdf.h"
#include "RooRealVar.h"
#include "RooDataSet.h"
#include "RooStats/ModelConfig.h"
#include "TGraphErrors.h"
#include "TGraphAsymmErrors.h"
#include "TCanvas.h"
#include "TLine.h"
#include "TROOT.h"

#include "RooStats/AsymptoticCalculator.h"
#include "RooStats/HybridCalculator.h"
#include "RooStats/FrequentistCalculator.h"
#include "RooStats/ToyMCSampler.h"
#include "RooStats/HypoTestPlot.h"

#include "RooStats/NumEventsTestStat.h"
#include "RooStats/ProfileLikelihoodTestStat.h"
#include "RooStats/SimpleLikelihoodRatioTestStat.h"
#include "RooStats/RatioOfProfiledLikelihoodsTestStat.h"
#include "RooStats/MaxLikelihoodEstimateTestStat.h"

#include "RooStats/HypoTestInverter.h"
#include "RooStats/HypoTestInverterResult.h"
#include "RooStats/HypoTestInverterPlot.h"

using namespace RooFit;
using namespace RooStats;


bool plotHypoTestResult = true;          // plot test statistic result at each point
bool writeResult = true;                 // write HypoTestInverterResult in a file 
bool optimize = true;                    // optmize evaluation of test statistic 
bool useVectorStore = true;              // convert data to use new roofit data store 
bool generateBinned = false;             // generate binned data sets 
bool noSystematics = false;              // force all systematics to be off (i.e. set all nuisance parameters as constat
                                         // to their nominal values)
double nToysRatio = 2;                   // ratio Ntoys S+b/ntoysB
double maxPOI = -1;                      // max value used of POI (in case of auto scan) 
bool useProof = false;                    // use Proof Light when using toys (for freq or hybrid)
int nworkers = 4;                        // number of worker for Proof
bool rebuild = false;                    // re-do extra toys for computing expected limits and rebuild test stat
                                         // distributions (N.B this requires much more CPU (factor is equivalent to nToyToRebuild)
int nToyToRebuild = 100;                 // number of toys used to rebuild 

std::string massValue = "";              // extra string to tag output file of result 
std::string  minimizerType = "";                  // minimizer type (default is what is in ROOT::Math::MinimizerOptions::DefaultMinimizerType()
int   printLevel = 0;                    // print level for debugging PL test statistics and calculators  



// internal class to run the inverter and more

namespace RooStats { 

   class HypoTestInvTool{

   public:
      HypoTestInvTool();
      ~HypoTestInvTool(){};

      HypoTestInverterResult * 
      RunInverter(RooWorkspace * w, 
                  const char * modelSBName, const char * modelBName, 
                  const char * dataName,
                  int type,  int testStatType, 
                  bool useCLs, 
                  int npoints, double poimin, double poimax, int ntoys, 
                  bool useNumberCounting = false, 
                  const char * nuisPriorName = 0);



      void
      AnalyzeResult( HypoTestInverterResult * r,
                     int calculatorType,
                     int testStatType, 
                     bool useCLs,  
                     int npoints,
                     const char * fileNameBase = 0 );

      void SetParameter(const char * name, const char * value);
      void SetParameter(const char * name, bool value);
      void SetParameter(const char * name, int value);
      void SetParameter(const char * name, double value);

   private:

      bool mPlotHypoTestResult;
      bool mWriteResult;
      bool mOptimize;
      bool mUseVectorStore;
      bool mGenerateBinned;
      bool mUseProof;
      bool mRebuild;
      int     mNWorkers;
      int     mNToyToRebuild;
      int     mPrintLevel;
      double  mNToysRatio;
      double  mMaxPoi;
      std::string mMassValue;
      std::string mMinimizerType;                  // minimizer type (default is what is in ROOT::Math::MinimizerOptions::DefaultMinimizerType()

   };

} // end namespace RooStats

RooStats::HypoTestInvTool::HypoTestInvTool() : mPlotHypoTestResult(true),
                                               mWriteResult(false),
                                               mOptimize(true),
                                               mUseVectorStore(true),
                                               mGenerateBinned(false),
                                               mUseProof(false),
                                               mRebuild(false),
                                               mNWorkers(4),
                                               mNToyToRebuild(100),
                                               mPrintLevel(0),
                                               mNToysRatio(2),
                                               mMaxPoi(-1),
                                               mMassValue(""),
                                               mMinimizerType(""){
}



void
RooStats::HypoTestInvTool::SetParameter(const char * name, bool value){
   //
   // set boolean parameters
   //

   std::string s_name(name);

   if (s_name.find("PlotHypoTestResult") != std::string::npos) mPlotHypoTestResult = value;
   if (s_name.find("WriteResult") != std::string::npos) mWriteResult = value;
   if (s_name.find("Optimize") != std::string::npos) mOptimize = value;
   if (s_name.find("UseVectorStore") != std::string::npos) mUseVectorStore = value;
   if (s_name.find("GenerateBinned") != std::string::npos) mGenerateBinned = value;
   if (s_name.find("UseProof") != std::string::npos) mUseProof = value;
   if (s_name.find("Rebuild") != std::string::npos) mRebuild = value;

   return;
}



void
RooStats::HypoTestInvTool::SetParameter(const char * name, int value){
   //
   // set integer parameters
   //

   std::string s_name(name);

   if (s_name.find("NWorkers") != std::string::npos) mNWorkers = value;
   if (s_name.find("NToyToRebuild") != std::string::npos) mNToyToRebuild = value;
   if (s_name.find("PrintLevel") != std::string::npos) mPrintLevel = value;

   return;
}



void
RooStats::HypoTestInvTool::SetParameter(const char * name, double value){
   //
   // set double precision parameters
   //

   std::string s_name(name);

   if (s_name.find("NToysRatio") != std::string::npos) mNToysRatio = value;
   if (s_name.find("MaxPoi") != std::string::npos) mMaxPoi = value;

   return;
}



void
RooStats::HypoTestInvTool::SetParameter(const char * name, const char * value){
   //
   // set string parameters
   //

   std::string s_name(name);

   if (s_name.find("MassValue") != std::string::npos) mMassValue.assign(value);
   if (s_name.find("MinimizerType") != std::string::npos) mMinimizerType.assign(value);

   return;
}



void 
StandardHypoTestInvDemo(const char * infile = 0,
                        const char * wsName = "combined",
                        const char * modelSBName = "ModelConfig",
                        const char * modelBName = "",
                        const char * dataName = "obsData",                 
                        int calculatorType = 0,
                        int testStatType = 0, 
                        bool useCLs = true ,  
                        int npoints = 6,   
                        double poimin = 0,  
                        double poimax = 5, 
                        int ntoys=1000,
                        bool useNumberCounting = false,
                        const char * nuisPriorName = 0){
/*

  Other Parameter to pass in tutorial
  apart from standard for filename, ws, modelconfig and data

  type = 0 Freq calculator 
  type = 1 Hybrid calculator
  type = 2 Asymptotic calculator  

  testStatType = 0 LEP
  = 1 Tevatron 
  = 2 Profile Likelihood
  = 3 Profile Likelihood one sided (i.e. = 0 if mu < mu_hat)

  useCLs          scan for CLs (otherwise for CLs+b)    

  npoints:        number of points to scan , for autoscan set npoints = -1 

  poimin,poimax:  min/max value to scan in case of fixed scans 
  (if min >= max, try to find automatically)                           

  ntoys:         number of toys to use 

  useNumberCounting:  set to true when using number counting events 

  nuisPriorName:   name of prior for the nnuisance. This is often expressed as constraint term in the global model
  It is needed only when using the HybridCalculator (type=1)
  If not given by default the prior pdf from ModelConfig is used. 

  extra options are available as global paramwters of the macro. They major ones are: 

  plotHypoTestResult   plot result of tests at each point (TS distributions) (defauly is true)
  useProof             use Proof   (default is true) 
  writeResult          write result of scan (default is true)
  rebuild              rebuild scan for expected limits (require extra toys) (default is false)
  generateBinned       generate binned data sets for toys (default is false) - be careful not to activate with 
  a too large (>=3) number of observables 
  nToyRatio            ratio of S+B/B toys (default is 2)
    

*/

  
  
   TString fileName(infile);
   if (fileName.IsNull()) { 
      fileName = "results/example_combined_GaussExample_model.root";
      std::cout << "Use standard file generated with HistFactory : " << fileName << std::endl;
   }
  
   // open file and check if input file exists
   TFile * file = TFile::Open(fileName); 
  
   // if input file was specified but not found, quit
   if(!file && !TString(infile).IsNull()){
      cout <<"file " << fileName << " not found" << endl;
      return;
   } 
  
   // if default file not found, try to create it
   if(!file ){
      // Normally this would be run on the command line
      cout <<"will run standard hist2workspace example"<<endl;
      gROOT->ProcessLine(".! prepareHistFactory .");
      gROOT->ProcessLine(".! hist2workspace config/example.xml");
      cout <<"\n\n---------------------"<<endl;
      cout <<"Done creating example input"<<endl;
      cout <<"---------------------\n\n"<<endl;
    
      // now try to access the file again
      file = TFile::Open(fileName);
    
   }
  
   if(!file){
      // if it is still not there, then we can't continue
      cout << "Not able to run hist2workspace to create example input" <<endl;
      return;
   }
  


   HypoTestInvTool calc;

   // set parameters
   calc.SetParameter("PlotHypoTestResult", plotHypoTestResult);
   calc.SetParameter("WriteResult", writeResult);
   calc.SetParameter("Optimize", optimize);
   calc.SetParameter("UseVectorStore", useVectorStore);
   calc.SetParameter("GenerateBinned", generateBinned);
   calc.SetParameter("NToysRatio", nToysRatio);
   calc.SetParameter("MaxPOI", maxPOI);
   calc.SetParameter("UseProof", useProof);
   calc.SetParameter("Nworkers", nworkers);
   calc.SetParameter("Rebuild", rebuild);
   calc.SetParameter("NToyToRebuild", nToyToRebuild);
   calc.SetParameter("MassValue", massValue.c_str());
   calc.SetParameter("MinimizerType", minimizerType.c_str());
   calc.SetParameter("PrintLevel", printLevel);


   RooWorkspace * w = dynamic_cast<RooWorkspace*>( file->Get(wsName) );
   HypoTestInverterResult * r = 0;  
   std::cout << w << "\t" << fileName << std::endl;
   if (w != NULL) {
      r = calc.RunInverter(w, modelSBName, modelBName,
                           dataName, calculatorType, testStatType, useCLs,
                           npoints, poimin, poimax,  
                           ntoys, useNumberCounting, nuisPriorName );    
      if (!r) { 
         std::cerr << "Error running the HypoTestInverter - Exit " << std::endl;
         return;          
      }
   }
   else { 
      // case workspace is not present look for the inverter result
      std::cout << "Reading an HypoTestInverterResult with name " << wsName << " from file " << fileName << std::endl;
      r = dynamic_cast<HypoTestInverterResult*>( file->Get(wsName) ); //
      if (!r) { 
         std::cerr << "File " << fileName << " does not contain a workspace or an HypoTestInverterResult - Exit " 
                   << std::endl;
         file->ls();
         return; 
      }
   }		
  
   calc.AnalyzeResult( r, calculatorType, testStatType, useCLs, npoints, infile );
  
   return;
}



void
RooStats::HypoTestInvTool::AnalyzeResult( HypoTestInverterResult * r,
                                          int calculatorType,
                                          int testStatType, 
                                          bool useCLs,  
                                          int npoints,
                                          const char * fileNameBase ){

   // analyize result produced by the inverter, optionally save it in a file 
   
   double upperLimit = r->UpperLimit();
   double ulError = r->UpperLimitEstimatedError();
  
   std::cout << "The computed upper limit is: " << upperLimit << " +/- " << ulError << std::endl;
  
   // compute expected limit
   std::cout << " expected limit (median) " << r->GetExpectedUpperLimit(0) << std::endl;
   std::cout << " expected limit (-1 sig) " << r->GetExpectedUpperLimit(-1) << std::endl;
   std::cout << " expected limit (+1 sig) " << r->GetExpectedUpperLimit(1) << std::endl;
   std::cout << " expected limit (-2 sig) " << r->GetExpectedUpperLimit(-2) << std::endl;
   std::cout << " expected limit (+2 sig) " << r->GetExpectedUpperLimit(2) << std::endl;
  
  
   // write result in a file 
   if (r != NULL && mWriteResult) {
    
      // write to a file the results
      const char *  calcType = (calculatorType == 0) ? "Freq" : (calculatorType == 1) ? "Hybr" : "Asym";
      const char *  limitType = (useCLs) ? "CLs" : "Cls+b";
      const char * scanType = (npoints < 0) ? "auto" : "grid";
      TString resultFileName = TString::Format("%s_%s_%s_ts%d_",calcType,limitType,scanType,testStatType);      
      //strip the / from the filename
      if (mMassValue.size()>0) {
         resultFileName += mMassValue.c_str();
         resultFileName += "_";
      }
    
      TString name = fileNameBase; 
      name.Replace(0, name.Last('/')+1, "");
      resultFileName += name;
    
      TFile * fileOut = new TFile(resultFileName,"RECREATE");
      r->Write();
      fileOut->Close();                                                                     
   }   
  
  
   // plot the result ( p values vs scan points) 
   std::string typeName = "";
   if (calculatorType == 0 )
      typeName = "Frequentist";
   if (calculatorType == 1 )
      typeName = "Hybrid";   
   else if (calculatorType == 2 ) { 
      typeName = "Asymptotic";
      mPlotHypoTestResult = false; 
   }
  
   const char * resultName = r->GetName();
   TString plotTitle = TString::Format("%s CL Scan for workspace %s",typeName.c_str(),resultName);
   HypoTestInverterPlot *plot = new HypoTestInverterPlot("HTI_Result_Plot",plotTitle,r);
   plot->Draw("CLb 2CL");  // plot all and Clb
  
   const int nEntries = r->ArraySize();
  
   // plot test statistics distributions for the two hypothesis 
   if (mPlotHypoTestResult) { 
      TCanvas * c2 = new TCanvas();
      if (nEntries > 1) { 
         int ny = TMath::CeilNint( sqrt(nEntries) );
         int nx = TMath::CeilNint(double(nEntries)/ny);
         c2->Divide( nx,ny);
      }
      for (int i=0; i<nEntries; i++) {
         if (nEntries > 1) c2->cd(i+1);
         SamplingDistPlot * pl = plot->MakeTestStatPlot(i);
         pl->SetLogYaxis(true);
         pl->Draw();
      }
   }
}



// internal routine to run the inverter
HypoTestInverterResult *
RooStats::HypoTestInvTool::RunInverter(RooWorkspace * w,
                                       const char * modelSBName, const char * modelBName, 
                                       const char * dataName, int type,  int testStatType, 
                                       bool useCLs, int npoints, double poimin, double poimax, 
                                       int ntoys,
                                       bool useNumberCounting,
                                       const char * nuisPriorName ){

   std::cout << "Running HypoTestInverter on the workspace " << w->GetName() << std::endl;
  
   w->Print();
  
  
   RooAbsData * data = w->data(dataName); 
   if (!data) { 
      Error("StandardHypoTestDemo","Not existing data %s",dataName);
      return 0;
   }
   else 
      std::cout << "Using data set " << dataName << std::endl;
  
   if (mUseVectorStore) { 
      RooAbsData::defaultStorageType = RooAbsData::Vector;
      data->convertToVectorStore() ;
   }
  
  
   // get models from WS
   // get the modelConfig out of the file
   ModelConfig* bModel = (ModelConfig*) w->obj(modelBName);
   ModelConfig* sbModel = (ModelConfig*) w->obj(modelSBName);
  
   if (!sbModel) {
      Error("StandardHypoTestDemo","Not existing ModelConfig %s",modelSBName);
      return 0;
   }
   // check the model 
   if (!sbModel->GetPdf()) { 
      Error("StandardHypoTestDemo","Model %s has no pdf ",modelSBName);
      return 0;
   }
   if (!sbModel->GetParametersOfInterest()) {
      Error("StandardHypoTestDemo","Model %s has no poi ",modelSBName);
      return 0;
   }
   if (!sbModel->GetObservables()) {
      Error("StandardHypoTestInvDemo","Model %s has no observables ",modelSBName);
      return 0;
   }
   if (!sbModel->GetSnapshot() ) { 
      Info("StandardHypoTestInvDemo","Model %s has no snapshot  - make one using model poi",modelSBName);
      sbModel->SetSnapshot( *sbModel->GetParametersOfInterest() );
   }
  
   // case of no systematics
   // remove nuisance parameters from model
   if (noSystematics) { 
      const RooArgSet * nuisPar = sbModel->GetNuisanceParameters();
      if (nuisPar && nuisPar->getSize() > 0) { 
         std::cout << "StandardHypoTestInvDemo" << "  -  Switch off all systematics by setting them constant to their initial values" << std::endl;
         RooStats::SetAllConstant(*nuisPar);
      }
      if (bModel) { 
         const RooArgSet * bnuisPar = bModel->GetNuisanceParameters();
         if (bnuisPar) 
            RooStats::SetAllConstant(*bnuisPar);
      }
   }
  
   if (!bModel || bModel == sbModel) {
      Info("StandardHypoTestInvDemo","The background model %s does not exist",modelBName);
      Info("StandardHypoTestInvDemo","Copy it from ModelConfig %s and set POI to zero",modelSBName);
      bModel = (ModelConfig*) sbModel->Clone();
      bModel->SetName(TString(modelSBName)+TString("_with_poi_0"));      
      RooRealVar * var = dynamic_cast<RooRealVar*>(bModel->GetParametersOfInterest()->first());
      if (!var) return 0;
      double oldval = var->getVal();
      var->setVal(0);
      bModel->SetSnapshot( RooArgSet(*var)  );
      var->setVal(oldval);
   }
   else { 
      if (!bModel->GetSnapshot() ) { 
         Info("StandardHypoTestInvDemo","Model %s has no snapshot  - make one using model poi and 0 values ",modelBName);
         RooRealVar * var = dynamic_cast<RooRealVar*>(bModel->GetParametersOfInterest()->first());
         if (var) { 
            double oldval = var->getVal();
            var->setVal(0);
            bModel->SetSnapshot( RooArgSet(*var)  );
            var->setVal(oldval);
         }
         else { 
            Error("StandardHypoTestInvDemo","Model %s has no valid poi",modelBName);
            return 0;
         }         
      }
   }
  
   // run first a data fit 
  
   const RooArgSet * poiSet = sbModel->GetParametersOfInterest();
   RooRealVar *poi = (RooRealVar*)poiSet->first();
  
   std::cout << "StandardHypoTestInvDemo : POI initial value:   " << poi->GetName() << " = " << poi->getVal()   << std::endl;  
  
   // fit the data first (need to use constraint )
   Info( "StandardHypoTestInvDemo"," Doing a first fit to the observed data ");
   if (minimizerType.size()==0) minimizerType = ROOT::Math::MinimizerOptions::DefaultMinimizerType();
   else 
      ROOT::Math::MinimizerOptions::SetDefaultMinimizer(minimizerType.c_str());
   Info("StandardHypoTestInvDemo","Using %s as minimizer for computing the test statistic",
        ROOT::Math::MinimizerOptions::DefaultMinimizerType().c_str() );
   RooArgSet constrainParams;
   if (sbModel->GetNuisanceParameters() ) constrainParams.add(*sbModel->GetNuisanceParameters());
   RooStats::RemoveConstantParameters(&constrainParams);
   TStopwatch tw; 
   tw.Start(); 
   RooFitResult * fitres = sbModel->GetPdf()->fitTo(*data,InitialHesse(false), Hesse(false),
                                                    Minimizer(minimizerType.c_str(),"Migrad"), Strategy(0), PrintLevel(mPrintLevel+1), Constrain(constrainParams), Save(true) );
   if (fitres->status() != 0) { 
      Warning("StandardHypoTestInvDemo","Fit to the model failed - try with strategy 1 and perform first an Hesse computation");
      fitres = sbModel->GetPdf()->fitTo(*data,InitialHesse(true), Hesse(false),Minimizer(minimizerType.c_str(),"Migrad"), Strategy(1), PrintLevel(mPrintLevel+1), Constrain(constrainParams), Save(true) );
   }
   if (fitres->status() != 0) 
      Warning("StandardHypoTestInvDemo"," Fit still failed - continue anyway.....");
  
  
   double poihat  = poi->getVal();
   std::cout << "StandardHypoTestInvDemo - Best Fit value : " << poi->GetName() << " = "  
             << poihat << " +/- " << poi->getError() << std::endl;
   std::cout << "Time for fitting : "; tw.Print(); 
  
   //save best fit value in the poi snapshot 
   sbModel->SetSnapshot(*sbModel->GetParametersOfInterest());
   std::cout << "StandardHypoTestInvo: snapshot of S+B Model " << sbModel->GetName() 
             << " is set to the best fit value" << std::endl;
  
   // build test statistics and hypotest calculators for running the inverter 
  
   SimpleLikelihoodRatioTestStat slrts(*sbModel->GetPdf(),*bModel->GetPdf());
  
   if (sbModel->GetSnapshot()) slrts.SetNullParameters(*sbModel->GetSnapshot());
   if (bModel->GetSnapshot()) slrts.SetAltParameters(*bModel->GetSnapshot());
  
   // ratio of profile likelihood - need to pass snapshot for the alt
   RatioOfProfiledLikelihoodsTestStat 
      ropl(*sbModel->GetPdf(), *bModel->GetPdf(), bModel->GetSnapshot());
   ropl.SetSubtractMLE(false);
   ropl.SetPrintLevel(mPrintLevel);
   ropl.SetMinimizer(minimizerType.c_str());
  
   ProfileLikelihoodTestStat profll(*sbModel->GetPdf());
   if (testStatType == 3) profll.SetOneSided(1);
   profll.SetMinimizer(minimizerType.c_str());
   profll.SetPrintLevel(mPrintLevel);

   profll.SetReuseNLL(mOptimize);
   slrts.SetReuseNLL(mOptimize);
   ropl.SetReuseNLL(mOptimize);

   if (mOptimize) { 
      profll.SetStrategy(0);
      ropl.SetStrategy(0);
   }
  
   if (mMaxPoi > 0) poi->setMax(mMaxPoi);  // increase limit
  
   MaxLikelihoodEstimateTestStat maxll(*sbModel->GetPdf(),*poi); 
  
   // create the HypoTest calculator class 
   HypoTestCalculatorGeneric *  hc = 0;
   if (type == 0) hc = new FrequentistCalculator(*data, *bModel, *sbModel);
   else if (type == 1) hc = new HybridCalculator(*data, *bModel, *sbModel);
   else if (type == 2) hc = new AsymptoticCalculator(*data, *bModel, *sbModel);
   else {
      Error("StandardHypoTestInvDemo","Invalid - calculator type = %d supported values are only :\n\t\t\t 0 (Frequentist) , 1 (Hybrid) , 2 (Asymptotic) ",type);
      return 0;
   }
  
   // set the test statistic 
   TestStatistic * testStat = 0;
   if (testStatType == 0) testStat = &slrts;
   if (testStatType == 1) testStat = &ropl;
   if (testStatType == 2 || testStatType == 3) testStat = &profll;
   if (testStatType == 4) testStat = &maxll;
   if (testStat == 0) { 
      Error("StandardHypoTestInvDemo","Invalid - test statistic type = %d supported values are only :\n\t\t\t 0 (SLR) , 1 (Tevatron) , 2 (PLR), 3 (PLR1), 4(MLE)",testStatType);
      return 0;
   }
  
  
   ToyMCSampler *toymcs = (ToyMCSampler*)hc->GetTestStatSampler();
   if (toymcs) { 
      if (useNumberCounting) toymcs->SetNEventsPerToy(1);
      toymcs->SetTestStatistic(testStat);
    
      if (data->isWeighted() && !mGenerateBinned) { 
         Info("StandardHypoTestInvDemo","Data set is weighted, nentries = %d and sum of weights = %8.1f but toy generation is unbinned - it would be faster to set mGenerateBinned to true\n",data->numEntries(), data->sumEntries());
      }
      toymcs->SetGenerateBinned(mGenerateBinned);
    
      toymcs->SetUseMultiGen(mOptimize);
    
      if (mGenerateBinned &&  sbModel->GetObservables()->getSize() > 2) { 
         Warning("StandardHypoTestInvDemo","generate binned is activated but the number of ovservable is %d. Too much memory could be needed for allocating all the bins",sbModel->GetObservables()->getSize() );
      }
    
   }
  
  
   if (type == 1) { 
      HybridCalculator *hhc = dynamic_cast<HybridCalculator*> (hc);
      assert(hhc);
    
      hhc->SetToys(ntoys,ntoys/mNToysRatio); // can use less ntoys for b hypothesis 
    
      // remove global observables from ModelConfig (this is probably not needed anymore in 5.32)
      bModel->SetGlobalObservables(RooArgSet() );
      sbModel->SetGlobalObservables(RooArgSet() );
    
    
      // check for nuisance prior pdf in case of nuisance parameters 
      if (bModel->GetNuisanceParameters() || sbModel->GetNuisanceParameters() ) {
         RooAbsPdf * nuisPdf = 0; 
         if (nuisPriorName) nuisPdf = w->pdf(nuisPriorName);
         // use prior defined first in bModel (then in SbModel)
         if (!nuisPdf)  { 
            Info("StandardHypoTestInvDemo","No nuisance pdf given for the HybridCalculator - try to deduce  pdf from the model");
            if (bModel->GetPdf() && bModel->GetObservables() ) 
               nuisPdf = RooStats::MakeNuisancePdf(*bModel,"nuisancePdf_bmodel");
            else 
               nuisPdf = RooStats::MakeNuisancePdf(*sbModel,"nuisancePdf_sbmodel");
         }   
         if (!nuisPdf ) {
            if (bModel->GetPriorPdf())  { 
               nuisPdf = bModel->GetPriorPdf();
               Info("StandardHypoTestInvDemo","No nuisance pdf given - try to use %s that is defined as a prior pdf in the B model",nuisPdf->GetName());            
            }
            else { 
               Error("StandardHypoTestInvDemo","Cannnot run Hybrid calculator because no prior on the nuisance parameter is specified or can be derived");
               return 0;
            }
         }
         assert(nuisPdf);
         Info("StandardHypoTestInvDemo","Using as nuisance Pdf ... " );
         nuisPdf->Print();
      
         const RooArgSet * nuisParams = (bModel->GetNuisanceParameters() ) ? bModel->GetNuisanceParameters() : sbModel->GetNuisanceParameters();
         RooArgSet * np = nuisPdf->getObservables(*nuisParams);
         if (np->getSize() == 0) { 
            Warning("StandardHypoTestInvDemo","Prior nuisance does not depend on nuisance parameters. They will be smeared in their full range");
         }
         delete np;
      
         hhc->ForcePriorNuisanceAlt(*nuisPdf);
         hhc->ForcePriorNuisanceNull(*nuisPdf);
      
      
      }
   } 
   else if (type == 2) { 
      ((AsymptoticCalculator*) hc)->SetOneSided(true); 
      // ((AsymptoticCalculator*) hc)->SetQTilde(true); // not needed should be done automatically now
      ((AsymptoticCalculator*) hc)->SetPrintLevel(mPrintLevel+1); 
   }
   else if (type != 2) 
      ((FrequentistCalculator*) hc)->SetToys(ntoys,ntoys/mNToysRatio); 
  
   // Get the result
   RooMsgService::instance().getStream(1).removeTopic(RooFit::NumIntegration);
  
  
  
   HypoTestInverter calc(*hc);
   calc.SetConfidenceLevel(0.95);
  
  
   calc.UseCLs(useCLs);
   calc.SetVerbose(true);
  
   // can speed up using proof-lite
   if (mUseProof && mNWorkers > 1) { 
      ProofConfig pc(*w, mNWorkers, "", kFALSE);
      toymcs->SetProofConfig(&pc);    // enable proof
   }
  
  
   if (npoints > 0) {
      if (poimin > poimax) { 
         // if no min/max given scan between MLE and +4 sigma 
         poimin = int(poihat);
         poimax = int(poihat +  4 * poi->getError());
      }
      std::cout << "Doing a fixed scan  in interval : " << poimin << " , " << poimax << std::endl;
      calc.SetFixedScan(npoints,poimin,poimax);
   }
   else { 
      //poi->setMax(10*int( (poihat+ 10 *poi->getError() )/10 ) );
      std::cout << "Doing an  automatic scan  in interval : " << poi->getMin() << " , " << poi->getMax() << std::endl;
   }
  
   tw.Start();
   HypoTestInverterResult * r = calc.GetInterval();
   std::cout << "Time to perform limit scan \n";
   tw.Print();
  
   if (mRebuild) {
      calc.SetCloseProof(1);
      tw.Start();
      SamplingDistribution * limDist = calc.GetUpperLimitDistribution(true,mNToyToRebuild);
      std::cout << "Time to rebuild distributions " << std::endl;
      tw.Print();
    
      if (limDist) { 
         std::cout << "expected up limit " << limDist->InverseCDF(0.5) << " +/- " 
                   << limDist->InverseCDF(0.16) << "  " 
                   << limDist->InverseCDF(0.84) << "\n"; 
      
         //update r to a new updated result object containing the rebuilt expected p-values distributions
         // (it will not recompute the expected limit)
         if (r) delete r;  // need to delete previous object since GetInterval will return a cloned copy
         r = calc.GetInterval();
      
      }
      else 
         std::cout << "ERROR : failed to re-build distributions " << std::endl; 
   }
  
   return r;
}



void ReadResult(const char * fileName, const char * resultName="", bool useCLs=true) { 
   // read a previous stored result from a file given the result name

   StandardHypoTestInvDemo(fileName, resultName,"","","",0,0,useCLs);
}


#ifdef USE_AS_MAIN
int main() {
    StandardHypoTestInvDemo();
}
#endif




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