ROOT logo

From $ROOTSYS/tutorials/roostats/StandardHypoTestInvDemo.C

/* -*- mode: c++ -*- */
// Standard tutorial macro for performing an inverted  hypothesis test for computing an interval
//
// This macro will perform a scan of the p-values for computing the interval or limit
//
//Author:  L. Moneta
//
// Usage: 
//
// root>.L StandardHypoTestInvDemo.C
// root> StandardHypoTestInvDemo("fileName","workspace name","S+B modelconfig name","B model name","data set name",calculator type, test statistic type, use CLS, 
//                                number of points, xmin, xmax, number of toys, use number counting)
//
//
// type = 0 Freq calculator 
// type = 1 Hybrid calculator
// type = 2 Asymptotic calculator  
// type = 3 Asymptotic calculator using nominal Asimov data sets (not using fitted parameter values but nominal ones)
//
// testStatType = 0 LEP
//              = 1 Tevatron 
//              = 2 Profile Likelihood two sided
//              = 3 Profile Likelihood one sided (i.e. = 0 if mu < mu_hat)
//              = 4 Profile Likelihood signed ( pll = -pll if mu < mu_hat) 
//              = 5 Max Likelihood Estimate as test statistic
//              = 6 Number of observed event as test statistic
//
 

#include "TFile.h"
#include "RooWorkspace.h"
#include "RooAbsPdf.h"
#include "RooRealVar.h"
#include "RooDataSet.h"
#include "RooStats/ModelConfig.h"
#include "RooRandom.h"
#include "TGraphErrors.h"
#include "TGraphAsymmErrors.h"
#include "TCanvas.h"
#include "TLine.h"
#include "TROOT.h"
#include "TSystem.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/NumEventsTestStat.h"

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

using namespace RooFit;
using namespace RooStats;
using namespace std; 

bool plotHypoTestResult = true;          // plot test statistic result at each point
bool writeResult = true;                 // write HypoTestInverterResult in a file 
TString resultFileName;                  // file with results (by default is built automatically using the workspace input file name)
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 Lite when using toys (for freq or hybrid)
int nworkers = 0;                        // number of worker for ProofLite (default use all available cores) 
bool enableDetailedOutput = false;       // enable detailed output with all fit information for each toys (output will be written in result file)
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 
int rebuildParamValues=0;                // = 0   do a profile of all the parameters on the B (alt snapshot) before performing a rebuild operation (default)
                                         // = 1   use initial workspace parameters with B snapshot values 
                                         // = 2   use all initial workspace parameters with B 
                                         // Otherwise the rebuild will be performed using 
int initialFit = -1;                     // do a first  fit to the model (-1 : default, 0 skip fit, 1 do always fit) 
int randomSeed = -1;                     // random seed (if = -1: use default value, if = 0 always random )
                                         // NOTE: Proof uses automatically a random seed

int nAsimovBins = 0;                     // number of bins in observables used for Asimov data sets (0 is the default and it is given by workspace, typically is 100)

bool reuseAltToys = false;                // reuse same toys for alternate hypothesis (if set one gets more stable bands)
double confidenceLevel = 0.95;            // confidence level value



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  

bool useNLLOffset = false;               // use NLL offset when fitting (this increase stability of fits) 


// 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;
      bool mReuseAltToys;
      bool mEnableDetOutput; 
      int     mNWorkers;
      int     mNToyToRebuild;
      int     mRebuildParamValues; 
      int     mPrintLevel;
      int     mInitialFit; 
      int     mRandomSeed; 
      double  mNToysRatio;
      double  mMaxPoi;
      int mAsimovBins;
      std::string mMassValue;
      std::string mMinimizerType;                  // minimizer type (default is what is in ROOT::Math::MinimizerOptions::DefaultMinimizerType()
      TString     mResultFileName; 
   };

} // end namespace RooStats

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



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("EnableDetailedOutput") != std::string::npos) mEnableDetOutput = value;
   if (s_name.find("Rebuild") != std::string::npos) mRebuild = value;
   if (s_name.find("ReuseAltToys") != std::string::npos) mReuseAltToys = 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("RebuildParamValues") != std::string::npos) mRebuildParamValues = value;
   if (s_name.find("PrintLevel") != std::string::npos) mPrintLevel = value;
   if (s_name.find("InitialFit") != std::string::npos) mInitialFit = value;
   if (s_name.find("RandomSeed") != std::string::npos) mRandomSeed = value;
   if (s_name.find("AsimovBins") != std::string::npos) mAsimovBins = 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);
   if (s_name.find("ResultFileName") != std::string::npos) mResultFileName = 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  
  type = 3 Asymptotic calculator using nominal Asimov data sets (not using fitted parameter values but nominal ones)

  testStatType = 0 LEP
  = 1 Tevatron 
  = 2 Profile Likelihood
  = 3 Profile Likelihood one sided (i.e. = 0 if mu < mu_hat)
  = 4 Profiel Likelihood signed ( pll = -pll if mu < mu_hat) 
  = 5 Max Likelihood Estimate as test statistic
  = 6 Number of observed event as test statistic

  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";
      bool fileExist = !gSystem->AccessPathName(filename); // note opposite return code
      // if file does not exists generate with histfactory
      if (!fileExist) {
#ifdef _WIN32
         cout << "HistFactory file cannot be generated on Windows - exit" << endl;
         return;
#endif
         // 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;
      }
      
   }
   else
      filename = infile;
   
   // Try to open the file
   TFile *file = TFile::Open(filename);
   
   // if input file was specified byt not found, quit
   if(!file ){
      cout <<"StandardRooStatsDemoMacro: Input file " << filename << " is not found" << 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("EnableDetailedOutput", enableDetailedOutput);
   calc.SetParameter("NWorkers", nworkers);
   calc.SetParameter("Rebuild", rebuild);
   calc.SetParameter("ReuseAltToys", reuseAltToys);
   calc.SetParameter("NToyToRebuild", nToyToRebuild);
   calc.SetParameter("RebuildParamValues", rebuildParamValues);
   calc.SetParameter("MassValue", massValue.c_str());
   calc.SetParameter("MinimizerType", minimizerType.c_str());
   calc.SetParameter("PrintLevel", printLevel);
   calc.SetParameter("InitialFit",initialFit);
   calc.SetParameter("ResultFileName",resultFileName);
   calc.SetParameter("RandomSeed",randomSeed);
   calc.SetParameter("AsimovBins",nAsimovBins);

   // enable offset for all roostats
   if (useNLLOffset) RooStats::UseNLLOffset(true); 

   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 ){

   // analyze result produced by the inverter, optionally save it in a file 
   
  
   double lowerLimit = 0;
   double llError = 0;
#if defined ROOT_SVN_VERSION &&  ROOT_SVN_VERSION >= 44126
   if (r->IsTwoSided()) {
      lowerLimit = r->LowerLimit();
      llError = r->LowerLimitEstimatedError();
   }
#else
   lowerLimit = r->LowerLimit();
   llError = r->LowerLimitEstimatedError();
#endif

   double upperLimit = r->UpperLimit();
   double ulError = r->UpperLimitEstimatedError();

   //std::cout << "DEBUG : [ " << lowerLimit << " , " << upperLimit << "  ] " << std::endl;
      
   if (lowerLimit < upperLimit*(1.- 1.E-4) && lowerLimit != 0) 
      std::cout << "The computed lower limit is: " << lowerLimit << " +/- " << llError << std::endl;
   std::cout << "The computed upper limit is: " << upperLimit << " +/- " << ulError << std::endl;
  

   // compute expected limit
   std::cout << "Expected upper limits, using the B (alternate) model : " << std::endl;
   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;
  

   // detailed output 
   if (mEnableDetOutput) {
      mWriteResult=true; 
      Info("StandardHypoTestInvDemo","detailed output will be written in output result file"); 
   }

  
   // 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";
      if (mResultFileName.IsNull()) {
         mResultFileName = TString::Format("%s_%s_%s_ts%d_",calcType,limitType,scanType,testStatType);      
         //strip the / from the filename
         if (mMassValue.size()>0) {
            mResultFileName += mMassValue.c_str();
            mResultFileName += "_";
         }
    
         TString name = fileNameBase; 
         name.Replace(0, name.Last('/')+1, "");
         mResultFileName += name;
      }

      // get (if existing) rebuilt UL distribution
      TString uldistFile = "RULDist.root";
      TObject * ulDist = 0;
      bool existULDist = !gSystem->AccessPathName(uldistFile);
      if (existULDist) {
         TFile * fileULDist = TFile::Open(uldistFile);
         if (fileULDist) ulDist= fileULDist->Get("RULDist");
      }


      TFile * fileOut = new TFile(mResultFileName,"RECREATE");
      r->Write();
      if (ulDist) ulDist->Write(); 
      Info("StandardHypoTestInvDemo","HypoTestInverterResult has been written in the file %s",mResultFileName.Data()); 

      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 || calculatorType == 3) { 
      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 in a new canvas with style
   TString c1Name = TString::Format("%s_Scan",typeName.c_str());
   TCanvas * c1 = new TCanvas(c1Name); 
   c1->SetLogy(false);

   plot->Draw("CLb 2CL");  // plot all and Clb

   // if (useCLs) 
   //    plot->Draw("CLb 2CL");  // plot all and Clb
   // else 
   //    plot->Draw("");  // 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(TMath::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::setDefaultStorageType(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;
         }         
      }
   }

   // check model  has global observables when there are nuisance pdf
   // for the hybrid case the globobs are not needed
   if (type != 1 ) { 
      bool hasNuisParam = (sbModel->GetNuisanceParameters() && sbModel->GetNuisanceParameters()->getSize() > 0);
      bool hasGlobalObs = (sbModel->GetGlobalObservables() && sbModel->GetGlobalObservables()->getSize() > 0);
      if (hasNuisParam && !hasGlobalObs ) {  
         // try to see if model has nuisance parameters first 
         RooAbsPdf * constrPdf = RooStats::MakeNuisancePdf(*sbModel,"nuisanceConstraintPdf_sbmodel");
         if (constrPdf) { 
            Warning("StandardHypoTestInvDemo","Model %s has nuisance parameters but no global observables associated",sbModel->GetName());
            Warning("StandardHypoTestInvDemo","\tThe effect of the nuisance parameters will not be treated correctly ");
         }
      }
   }

   // save all initial parameters of the model including the global observables 
   RooArgSet initialParameters; 
   RooArgSet * allParams = sbModel->GetPdf()->getParameters(*data); 
   allParams->snapshot(initialParameters);
   delete allParams; 
  
   // 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 )
   TStopwatch tw; 

   bool doFit = initialFit;
   if (testStatType == 0 && initialFit == -1) doFit = false;  // case of LEP test statistic
   if (type == 3  && initialFit == -1) doFit = false;         // case of Asymptoticcalculator with nominal Asimov
   double poihat = 0;

   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() );
   
   if (doFit)  { 

      // do the fit : By doing a fit the POI snapshot (for S+B)  is set to the fit value
      // and the nuisance parameters nominal values will be set to the fit value. 
      // This is relevant when using LEP test statistics

      Info( "StandardHypoTestInvDemo"," Doing a first fit to the observed data ");
      RooArgSet constrainParams;
      if (sbModel->GetNuisanceParameters() ) constrainParams.add(*sbModel->GetNuisanceParameters());
      RooStats::RemoveConstantParameters(&constrainParams);
      tw.Start(); 
      RooFitResult * fitres = sbModel->GetPdf()->fitTo(*data,InitialHesse(false), Hesse(false),
                                                       Minimizer(minimizerType.c_str(),"Migrad"), Strategy(0), PrintLevel(mPrintLevel), Constrain(constrainParams), Save(true), Offset(RooStats::IsNLLOffset()) );
      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), Offset(RooStats::IsNLLOffset()) );
      }
      if (fitres->status() != 0) 
         Warning("StandardHypoTestInvDemo"," Fit still failed - continue anyway.....");
  
  
      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;
  
   }

   // print a message in case of LEP test statistics because it affects result by doing or not doing a fit 
   if (testStatType == 0) {
      if (!doFit) 
         Info("StandardHypoTestInvDemo","Using LEP test statistic - an initial fit is not done and the TS will use the nuisances at the model value");
      else 
         Info("StandardHypoTestInvDemo","Using LEP test statistic - an initial fit has been done and the TS will use the nuisances at the best fit value");
   }


   // build test statistics and hypotest calculators for running the inverter 
  
   SimpleLikelihoodRatioTestStat slrts(*sbModel->GetPdf(),*bModel->GetPdf());

   // null parameters must includes snapshot of poi plus the nuisance values 
   RooArgSet nullParams(*sbModel->GetSnapshot());
   if (sbModel->GetNuisanceParameters()) nullParams.add(*sbModel->GetNuisanceParameters());
   if (sbModel->GetSnapshot()) slrts.SetNullParameters(nullParams);
   RooArgSet altParams(*bModel->GetSnapshot());
   if (bModel->GetNuisanceParameters()) altParams.add(*bModel->GetNuisanceParameters());
   if (bModel->GetSnapshot()) slrts.SetAltParameters(altParams);
   if (mEnableDetOutput) slrts.EnableDetailedOutput();
  
   // ratio of profile likelihood - need to pass snapshot for the alt
   RatioOfProfiledLikelihoodsTestStat 
      ropl(*sbModel->GetPdf(), *bModel->GetPdf(), bModel->GetSnapshot());
   ropl.SetSubtractMLE(false);
   if (testStatType == 11) ropl.SetSubtractMLE(true);
   ropl.SetPrintLevel(mPrintLevel);
   ropl.SetMinimizer(minimizerType.c_str());
   if (mEnableDetOutput) ropl.EnableDetailedOutput();
  
   ProfileLikelihoodTestStat profll(*sbModel->GetPdf());
   if (testStatType == 3) profll.SetOneSided(true);
   if (testStatType == 4) profll.SetSigned(true);
   profll.SetMinimizer(minimizerType.c_str());
   profll.SetPrintLevel(mPrintLevel);
   if (mEnableDetOutput) profll.EnableDetailedOutput();

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

   if (mOptimize) { 
      profll.SetStrategy(0);
      ropl.SetStrategy(0);
      ROOT::Math::MinimizerOptions::SetDefaultStrategy(0);
   }
  
   if (mMaxPoi > 0) poi->setMax(mMaxPoi);  // increase limit
  
   MaxLikelihoodEstimateTestStat maxll(*sbModel->GetPdf(),*poi); 
   NumEventsTestStat nevtts;

   AsymptoticCalculator::SetPrintLevel(mPrintLevel);
  
   // 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, false, mAsimovBins);
   // else if (type == 3 ) hc = new AsymptoticCalculator(*data, *bModel, *sbModel, true, mAsimovBins);  // for using Asimov data generated with nominal values 
   else if (type == 2 ) hc = new AsymptoticCalculator(*data, *bModel, *sbModel, false );
   else if (type == 3 ) hc = new AsymptoticCalculator(*data, *bModel, *sbModel, true );  // for using Asimov data generated with nominal values 
   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 || testStatType == 11) testStat = &ropl;
   if (testStatType == 2 || testStatType == 3 || testStatType == 4) testStat = &profll;
   if (testStatType == 5) testStat = &maxll;
   if (testStatType == 6) testStat = &nevtts;

   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 && (type == 0 || type == 1) ) { 
      // look if pdf is number counting or extended
      if (sbModel->GetPdf()->canBeExtended() ) { 
         if (useNumberCounting)   Warning("StandardHypoTestInvDemo","Pdf is extended: but number counting flag is set: ignore it ");
      }
      else { 
         // for not extended pdf
         if (!useNumberCounting  )  { 
            int nEvents = data->numEntries();
            Info("StandardHypoTestInvDemo","Pdf is not extended: number of events to generate taken  from observed data set is %d",nEvents);
            toymcs->SetNEventsPerToy(nEvents);
         }
         else {
            Info("StandardHypoTestInvDemo","using a number counting pdf");
            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() );
      }

      // set the random seed if needed
      if (mRandomSeed >= 0) RooRandom::randomGenerator()->SetSeed(mRandomSeed); 
    
   }
  
   // specify if need to re-use same toys
   if (reuseAltToys) {
      hc->UseSameAltToys();
   }
  
   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() ) {

         // fix for using multigen (does not work in this case)
         toymcs->SetUseMultiGen(false);
         ToyMCSampler::SetAlwaysUseMultiGen(false);

         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 || type == 3) { 
      if (testStatType == 3) ((AsymptoticCalculator*) hc)->SetOneSided(true);  
      if (testStatType != 2 && testStatType != 3)  
         Warning("StandardHypoTestInvDemo","Only the PL test statistic can be used with AsymptoticCalculator - use by default a two-sided PL");
   }
   else if (type == 0 || type == 1) { 
      ((FrequentistCalculator*) hc)->SetToys(ntoys,ntoys/mNToysRatio); 
      // store also the fit information for each poi point used by calculator based on toys
      if (mEnableDetOutput) ((FrequentistCalculator*) hc)->StoreFitInfo(true);
   }

  
   // Get the result
   RooMsgService::instance().getStream(1).removeTopic(RooFit::NumIntegration);
  
  
  
   HypoTestInverter calc(*hc);
   calc.SetConfidenceLevel(confidenceLevel);
  
  
   calc.UseCLs(useCLs);
   calc.SetVerbose(true);
  
   // can speed up using proof-lite
   if (mUseProof) { 
      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) {

      std::cout << "\n***************************************************************\n";
      std::cout << "Rebuild the upper limit distribution by re-generating new set of pseudo-experiment and re-compute for each of them a new upper limit\n\n";

         
      allParams = sbModel->GetPdf()->getParameters(*data); 

      // define on which value of nuisance parameters to do the rebuild
      // default is best fit value for bmodel snapshot 



      if (mRebuildParamValues != 0) { 
         // set all parameters to their initial workspace values 
         *allParams = initialParameters; 
      }
      if (mRebuildParamValues == 0 || mRebuildParamValues == 1 ) { 
          RooArgSet constrainParams;
          if (sbModel->GetNuisanceParameters() ) constrainParams.add(*sbModel->GetNuisanceParameters());
          RooStats::RemoveConstantParameters(&constrainParams);
          
          const RooArgSet * poiModel = sbModel->GetParametersOfInterest(); 
          bModel->LoadSnapshot(); 

          // do a profile using the B model snapshot
          if (mRebuildParamValues == 0 ) { 

             RooStats::SetAllConstant(*poiModel,true);

             sbModel->GetPdf()->fitTo(*data,InitialHesse(false), Hesse(false),
                                      Minimizer(minimizerType.c_str(),"Migrad"), Strategy(0), PrintLevel(mPrintLevel), Constrain(constrainParams), Offset(RooStats::IsNLLOffset()) );


             std::cout << "rebuild using fitted parameter value for B-model snapshot" << std::endl;
             constrainParams.Print("v");
          
             RooStats::SetAllConstant(*poiModel,false);
          }
      }
      std::cout << "StandardHypoTestInvDemo: Initial parameters used for rebuilding: ";
      RooStats::PrintListContent(*allParams, std::cout); 
      delete allParams; 

      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 limits after rebuild distribution " << std::endl;
         std::cout << "expected upper limit  (median of limit distribution) " << limDist->InverseCDF(0.5) << std::endl; 
         std::cout << "expected -1 sig limit (0.16% quantile of limit dist) " << limDist->InverseCDF(ROOT::Math::normal_cdf(-1)) << std::endl; 
         std::cout << "expected +1 sig limit (0.84% quantile of limit dist) " << limDist->InverseCDF(ROOT::Math::normal_cdf(1)) << std::endl; 
         std::cout << "expected -2 sig limit (.025% quantile of limit dist) " << limDist->InverseCDF(ROOT::Math::normal_cdf(-2)) << std::endl; 
         std::cout << "expected +2 sig limit (.975% quantile of limit dist) " << limDist->InverseCDF(ROOT::Math::normal_cdf(2)) << std::endl; 

         // Plot the upper limit distribution
         SamplingDistPlot limPlot( (mNToyToRebuild < 200) ? 50 : 100); 
         limPlot.AddSamplingDistribution(limDist); 
         limPlot.GetTH1F()->SetStats(true); // display statistics
         limPlot.SetLineColor(kBlue); 
         new TCanvas("limPlot","Upper Limit Distribution");
         limPlot.Draw(); 
                  
         /// save result in a file 
         limDist->SetName("RULDist"); 
         TFile * fileOut = new TFile("RULDist.root","RECREATE");
         limDist->Write();
         fileOut->Close();                                                                     

      
         //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
 StandardHypoTestInvDemo.C:788
 StandardHypoTestInvDemo.C:789
 StandardHypoTestInvDemo.C:790
 StandardHypoTestInvDemo.C:791
 StandardHypoTestInvDemo.C:792
 StandardHypoTestInvDemo.C:793
 StandardHypoTestInvDemo.C:794
 StandardHypoTestInvDemo.C:795
 StandardHypoTestInvDemo.C:796
 StandardHypoTestInvDemo.C:797
 StandardHypoTestInvDemo.C:798
 StandardHypoTestInvDemo.C:799
 StandardHypoTestInvDemo.C:800
 StandardHypoTestInvDemo.C:801
 StandardHypoTestInvDemo.C:802
 StandardHypoTestInvDemo.C:803
 StandardHypoTestInvDemo.C:804
 StandardHypoTestInvDemo.C:805
 StandardHypoTestInvDemo.C:806
 StandardHypoTestInvDemo.C:807
 StandardHypoTestInvDemo.C:808
 StandardHypoTestInvDemo.C:809
 StandardHypoTestInvDemo.C:810
 StandardHypoTestInvDemo.C:811
 StandardHypoTestInvDemo.C:812
 StandardHypoTestInvDemo.C:813
 StandardHypoTestInvDemo.C:814
 StandardHypoTestInvDemo.C:815
 StandardHypoTestInvDemo.C:816
 StandardHypoTestInvDemo.C:817
 StandardHypoTestInvDemo.C:818
 StandardHypoTestInvDemo.C:819
 StandardHypoTestInvDemo.C:820
 StandardHypoTestInvDemo.C:821
 StandardHypoTestInvDemo.C:822
 StandardHypoTestInvDemo.C:823
 StandardHypoTestInvDemo.C:824
 StandardHypoTestInvDemo.C:825
 StandardHypoTestInvDemo.C:826
 StandardHypoTestInvDemo.C:827
 StandardHypoTestInvDemo.C:828
 StandardHypoTestInvDemo.C:829
 StandardHypoTestInvDemo.C:830
 StandardHypoTestInvDemo.C:831
 StandardHypoTestInvDemo.C:832
 StandardHypoTestInvDemo.C:833
 StandardHypoTestInvDemo.C:834
 StandardHypoTestInvDemo.C:835
 StandardHypoTestInvDemo.C:836
 StandardHypoTestInvDemo.C:837
 StandardHypoTestInvDemo.C:838
 StandardHypoTestInvDemo.C:839
 StandardHypoTestInvDemo.C:840
 StandardHypoTestInvDemo.C:841
 StandardHypoTestInvDemo.C:842
 StandardHypoTestInvDemo.C:843
 StandardHypoTestInvDemo.C:844
 StandardHypoTestInvDemo.C:845
 StandardHypoTestInvDemo.C:846
 StandardHypoTestInvDemo.C:847
 StandardHypoTestInvDemo.C:848
 StandardHypoTestInvDemo.C:849
 StandardHypoTestInvDemo.C:850
 StandardHypoTestInvDemo.C:851
 StandardHypoTestInvDemo.C:852
 StandardHypoTestInvDemo.C:853
 StandardHypoTestInvDemo.C:854
 StandardHypoTestInvDemo.C:855
 StandardHypoTestInvDemo.C:856
 StandardHypoTestInvDemo.C:857
 StandardHypoTestInvDemo.C:858
 StandardHypoTestInvDemo.C:859
 StandardHypoTestInvDemo.C:860
 StandardHypoTestInvDemo.C:861
 StandardHypoTestInvDemo.C:862
 StandardHypoTestInvDemo.C:863
 StandardHypoTestInvDemo.C:864
 StandardHypoTestInvDemo.C:865
 StandardHypoTestInvDemo.C:866
 StandardHypoTestInvDemo.C:867
 StandardHypoTestInvDemo.C:868
 StandardHypoTestInvDemo.C:869
 StandardHypoTestInvDemo.C:870
 StandardHypoTestInvDemo.C:871
 StandardHypoTestInvDemo.C:872
 StandardHypoTestInvDemo.C:873
 StandardHypoTestInvDemo.C:874
 StandardHypoTestInvDemo.C:875
 StandardHypoTestInvDemo.C:876
 StandardHypoTestInvDemo.C:877
 StandardHypoTestInvDemo.C:878
 StandardHypoTestInvDemo.C:879
 StandardHypoTestInvDemo.C:880
 StandardHypoTestInvDemo.C:881
 StandardHypoTestInvDemo.C:882
 StandardHypoTestInvDemo.C:883
 StandardHypoTestInvDemo.C:884
 StandardHypoTestInvDemo.C:885
 StandardHypoTestInvDemo.C:886
 StandardHypoTestInvDemo.C:887
 StandardHypoTestInvDemo.C:888
 StandardHypoTestInvDemo.C:889
 StandardHypoTestInvDemo.C:890
 StandardHypoTestInvDemo.C:891
 StandardHypoTestInvDemo.C:892
 StandardHypoTestInvDemo.C:893
 StandardHypoTestInvDemo.C:894
 StandardHypoTestInvDemo.C:895
 StandardHypoTestInvDemo.C:896
 StandardHypoTestInvDemo.C:897
 StandardHypoTestInvDemo.C:898
 StandardHypoTestInvDemo.C:899
 StandardHypoTestInvDemo.C:900
 StandardHypoTestInvDemo.C:901
 StandardHypoTestInvDemo.C:902
 StandardHypoTestInvDemo.C:903
 StandardHypoTestInvDemo.C:904
 StandardHypoTestInvDemo.C:905
 StandardHypoTestInvDemo.C:906
 StandardHypoTestInvDemo.C:907
 StandardHypoTestInvDemo.C:908
 StandardHypoTestInvDemo.C:909
 StandardHypoTestInvDemo.C:910
 StandardHypoTestInvDemo.C:911
 StandardHypoTestInvDemo.C:912
 StandardHypoTestInvDemo.C:913
 StandardHypoTestInvDemo.C:914
 StandardHypoTestInvDemo.C:915
 StandardHypoTestInvDemo.C:916
 StandardHypoTestInvDemo.C:917
 StandardHypoTestInvDemo.C:918
 StandardHypoTestInvDemo.C:919
 StandardHypoTestInvDemo.C:920
 StandardHypoTestInvDemo.C:921
 StandardHypoTestInvDemo.C:922
 StandardHypoTestInvDemo.C:923
 StandardHypoTestInvDemo.C:924
 StandardHypoTestInvDemo.C:925
 StandardHypoTestInvDemo.C:926
 StandardHypoTestInvDemo.C:927
 StandardHypoTestInvDemo.C:928
 StandardHypoTestInvDemo.C:929
 StandardHypoTestInvDemo.C:930
 StandardHypoTestInvDemo.C:931
 StandardHypoTestInvDemo.C:932
 StandardHypoTestInvDemo.C:933
 StandardHypoTestInvDemo.C:934
 StandardHypoTestInvDemo.C:935
 StandardHypoTestInvDemo.C:936
 StandardHypoTestInvDemo.C:937
 StandardHypoTestInvDemo.C:938
 StandardHypoTestInvDemo.C:939
 StandardHypoTestInvDemo.C:940
 StandardHypoTestInvDemo.C:941
 StandardHypoTestInvDemo.C:942
 StandardHypoTestInvDemo.C:943
 StandardHypoTestInvDemo.C:944
 StandardHypoTestInvDemo.C:945
 StandardHypoTestInvDemo.C:946
 StandardHypoTestInvDemo.C:947
 StandardHypoTestInvDemo.C:948
 StandardHypoTestInvDemo.C:949
 StandardHypoTestInvDemo.C:950
 StandardHypoTestInvDemo.C:951
 StandardHypoTestInvDemo.C:952
 StandardHypoTestInvDemo.C:953
 StandardHypoTestInvDemo.C:954
 StandardHypoTestInvDemo.C:955
 StandardHypoTestInvDemo.C:956
 StandardHypoTestInvDemo.C:957
 StandardHypoTestInvDemo.C:958
 StandardHypoTestInvDemo.C:959
 StandardHypoTestInvDemo.C:960
 StandardHypoTestInvDemo.C:961
 StandardHypoTestInvDemo.C:962
 StandardHypoTestInvDemo.C:963
 StandardHypoTestInvDemo.C:964
 StandardHypoTestInvDemo.C:965
 StandardHypoTestInvDemo.C:966
 StandardHypoTestInvDemo.C:967
 StandardHypoTestInvDemo.C:968
 StandardHypoTestInvDemo.C:969
 StandardHypoTestInvDemo.C:970
 StandardHypoTestInvDemo.C:971
 StandardHypoTestInvDemo.C:972
 StandardHypoTestInvDemo.C:973
 StandardHypoTestInvDemo.C:974
 StandardHypoTestInvDemo.C:975
 StandardHypoTestInvDemo.C:976
 StandardHypoTestInvDemo.C:977
 StandardHypoTestInvDemo.C:978
 StandardHypoTestInvDemo.C:979
 StandardHypoTestInvDemo.C:980
 StandardHypoTestInvDemo.C:981
 StandardHypoTestInvDemo.C:982
 StandardHypoTestInvDemo.C:983
 StandardHypoTestInvDemo.C:984
 StandardHypoTestInvDemo.C:985
 StandardHypoTestInvDemo.C:986
 StandardHypoTestInvDemo.C:987
 StandardHypoTestInvDemo.C:988
 StandardHypoTestInvDemo.C:989
 StandardHypoTestInvDemo.C:990
 StandardHypoTestInvDemo.C:991
 StandardHypoTestInvDemo.C:992
 StandardHypoTestInvDemo.C:993
 StandardHypoTestInvDemo.C:994
 StandardHypoTestInvDemo.C:995
 StandardHypoTestInvDemo.C:996
 StandardHypoTestInvDemo.C:997
 StandardHypoTestInvDemo.C:998
 StandardHypoTestInvDemo.C:999
 StandardHypoTestInvDemo.C:1000
 StandardHypoTestInvDemo.C:1001
 StandardHypoTestInvDemo.C:1002
 StandardHypoTestInvDemo.C:1003
 StandardHypoTestInvDemo.C:1004
 StandardHypoTestInvDemo.C:1005
 StandardHypoTestInvDemo.C:1006
 StandardHypoTestInvDemo.C:1007
 StandardHypoTestInvDemo.C:1008
 StandardHypoTestInvDemo.C:1009
 StandardHypoTestInvDemo.C:1010
 StandardHypoTestInvDemo.C:1011
 StandardHypoTestInvDemo.C:1012
 StandardHypoTestInvDemo.C:1013
 StandardHypoTestInvDemo.C:1014
 StandardHypoTestInvDemo.C:1015
 StandardHypoTestInvDemo.C:1016
 StandardHypoTestInvDemo.C:1017
 StandardHypoTestInvDemo.C:1018
 StandardHypoTestInvDemo.C:1019
 StandardHypoTestInvDemo.C:1020
 StandardHypoTestInvDemo.C:1021
 StandardHypoTestInvDemo.C:1022
 StandardHypoTestInvDemo.C:1023
 StandardHypoTestInvDemo.C:1024
 StandardHypoTestInvDemo.C:1025
 StandardHypoTestInvDemo.C:1026
 StandardHypoTestInvDemo.C:1027
 StandardHypoTestInvDemo.C:1028
 StandardHypoTestInvDemo.C:1029
 StandardHypoTestInvDemo.C:1030
 StandardHypoTestInvDemo.C:1031
 StandardHypoTestInvDemo.C:1032
 StandardHypoTestInvDemo.C:1033
 StandardHypoTestInvDemo.C:1034
 StandardHypoTestInvDemo.C:1035
 StandardHypoTestInvDemo.C:1036
 StandardHypoTestInvDemo.C:1037
 StandardHypoTestInvDemo.C:1038
 StandardHypoTestInvDemo.C:1039
 StandardHypoTestInvDemo.C:1040
 StandardHypoTestInvDemo.C:1041
 StandardHypoTestInvDemo.C:1042
 StandardHypoTestInvDemo.C:1043
 StandardHypoTestInvDemo.C:1044
 StandardHypoTestInvDemo.C:1045
 StandardHypoTestInvDemo.C:1046
 StandardHypoTestInvDemo.C:1047
 StandardHypoTestInvDemo.C:1048
 StandardHypoTestInvDemo.C:1049
 StandardHypoTestInvDemo.C:1050
 StandardHypoTestInvDemo.C:1051
 StandardHypoTestInvDemo.C:1052
 StandardHypoTestInvDemo.C:1053
 StandardHypoTestInvDemo.C:1054
 StandardHypoTestInvDemo.C:1055
 StandardHypoTestInvDemo.C:1056
 StandardHypoTestInvDemo.C:1057
 StandardHypoTestInvDemo.C:1058
 StandardHypoTestInvDemo.C:1059
 StandardHypoTestInvDemo.C:1060
 StandardHypoTestInvDemo.C:1061
 StandardHypoTestInvDemo.C:1062
 StandardHypoTestInvDemo.C:1063
 StandardHypoTestInvDemo.C:1064
 StandardHypoTestInvDemo.C:1065
 StandardHypoTestInvDemo.C:1066
 StandardHypoTestInvDemo.C:1067
 StandardHypoTestInvDemo.C:1068
 StandardHypoTestInvDemo.C:1069
 StandardHypoTestInvDemo.C:1070
 StandardHypoTestInvDemo.C:1071
 StandardHypoTestInvDemo.C:1072
 StandardHypoTestInvDemo.C:1073