ROOT logo

From $ROOTSYS/tutorials/roostats/ModelInspector.C

//////////////////////////////////////
// RooStats Model Inspector
// Author Kyle Cranmer <cranmer@cern.ch>
// Version 1, October 2011
//   - based on tutorial macro by Bertrand Bellenot, Ilka Antcheva
// Version 2, November 2011
//   - fixes from Bertrand Bellenot <Bertrand.Bellenot@cern.ch> for scrolling window for many parameters
//
//
// Usage:
// The usage is the same as the StandardXxxDemo.C macros.
// The macro expects a root file containing a workspace with a ModelConfig and a dataset
// $ root
// .L ModelInspector.C+
// ModelInspector(fileName, workspaceName, modelConfigName, dataSetName);
//
// Drag the sliders to adjust the parameters of the model.
// the min and max range of the sliders are used to define the upper & lower variation
// the pointer position of the slider is the central blue curve.
//
// Click the FIT button to 
//
// To Do:
//  - check boxes to specify which nuisance parameters used in making variation
//  - a button to make the profile inspector plots
//  - a check button to use MINOS errors
//  - have fit button show the covariance matrix from the fit
//  - a button to make the log likelihood plots
//  - a dialog to open the desired file
//  - ability to see teh signal and background contributions?
//   
   
#include "TGButton.h"
#include "TRootEmbeddedCanvas.h"
#include "TGLayout.h"
#include "TF1.h"
#include "TMath.h"
#include "TCanvas.h"
#include "TGTextEntry.h"
#include "TGLabel.h"
#include "TGTripleSlider.h"
#include "RooWorkspace.h"
#include "RooStats/ModelConfig.h"
#include "TFile.h"
#include "RooArgSet.h"
#include "TList.h"
#include "RooAbsPdf.h"
#include "RooRealVar.h"
#include "RooPlot.h"
#include "TGButton.h"
#include <map>
#include "RooFitResult.h"
#include "TROOT.h"
#include <TApplication.h>
#include "RooSimultaneous.h"
#include "RooCategory.h"

enum ETestCommandIdentifiers {
   HId1,
   HId2,
   HId3,
   HCId1,
   HCId2,

   HSId1
};

using namespace RooFit;
using namespace RooStats;
class ModelInspectorGUI : public TGMainFrame {

private:
   TRootEmbeddedCanvas *fCanvas;
   TGLayoutHints       *fLcan;
   TF1                 *fFitFcn;
  RooPlot* fPlot;
  RooWorkspace* fWS;  
  TFile* fFile;
  ModelConfig* fMC;
  RooAbsData* fData;
  RooFitResult* fFitRes;

  TList fSliderList;
  TList fFrameList;
  vector<RooPlot*> fPlotList;
  map<TGTripleHSlider*,const char*> fSliderMap;
  map<TGTripleHSlider*,TGLabel*> fLabelMap;

  TGButton* fFitButton;
  TGTextButton *fExitButton; 

   // BB: a TGCanvas and a vertical frame are needed for using scrollbars
   TGCanvas *fCan;
   TGVerticalFrame *fVFrame;
  
   TGHorizontalFrame   *fHframe0, *fHframe1, *fHframe2;
   TGLayoutHints       *fBly, *fBfly1, *fBfly2, *fBfly3;
   TGTripleHSlider     *fHslider1;
  //   TGTextEntry         *fTeh1, *fTeh2, *fTeh3;
   TGTextBuffer        *fTbh1, *fTbh2, *fTbh3;
   TGCheckButton       *fCheck1, *fCheck2;

public:
  ModelInspectorGUI(RooWorkspace*, ModelConfig*, RooAbsData*);
   virtual ~ModelInspectorGUI();

   void CloseWindow();
   void DoText(const char *text);
   void DoSlider();
   void DoSlider(const char*);
   void DoFit();
   void DoExit();
   void HandleButtons();

   ClassDef(ModelInspectorGUI, 0)
};

//______________________________________________________________________________
ModelInspectorGUI::ModelInspectorGUI(RooWorkspace* w, ModelConfig* mc, RooAbsData* data) 
  : TGMainFrame(gClient->GetRoot(), 100, 100)
{
  
  RooMsgService::instance().getStream(1).removeTopic(RooFit::NumIntegration);
  fWS = w;
  fMC = mc;
  fData = data;
  RooSimultaneous* simPdf = NULL;
  Int_t numCats = 1;
  if(strcmp(fMC->GetPdf()->ClassName(),"RooSimultaneous")==0){
    cout <<"Is a simultaneous PDF"<< endl;     
    simPdf = (RooSimultaneous*)(fMC->GetPdf());
    RooCategory* channelCat = (RooCategory*) (&simPdf->indexCat());
    cout <<" with " << channelCat->numTypes() << " categories"<<endl;
    numCats = channelCat->numTypes();
  } else {
    cout <<"Is not a simultaneous PDF"<<endl;
  }
  fFitRes=0;
  

   char buf[32];
   SetCleanup(kDeepCleanup);

   // Create an embedded canvas and add to the main frame, centered in x and y
   // and with 30 pixel margins all around
   fCanvas = new TRootEmbeddedCanvas("Canvas", this, 600, 400);
   fLcan = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10, 10, 10, 10);
   AddFrame(fCanvas, fLcan);
   fPlotList.resize(numCats);
   if(numCats>1){
     fCanvas->GetCanvas()->Divide(numCats);
     for(int i=0; i<numCats; ++i){
       //   fCanvas->GetCanvas()->SetFillColor(33);
       //   fCanvas->GetCanvas()->SetFrameFillColor(41);
       fCanvas->GetCanvas()->cd(i+1)->SetBorderMode(0);
       fCanvas->GetCanvas()->cd(i+1)->SetGrid();
       //   fCanvas->GetCanvas()->SetLogy();
     }
   }

   fHframe0 = new TGHorizontalFrame(this, 0, 0, 0);

   fCheck1 = new TGCheckButton(fHframe0, "&Constrained", HCId1);
   fCheck2 = new TGCheckButton(fHframe0, "&Relative", HCId2);
   fCheck1->SetState(kButtonUp);
   fCheck2->SetState(kButtonUp);
   fCheck1->SetToolTipText("Pointer position constrained to slider sides");
   fCheck2->SetToolTipText("Pointer position relative to slider position");

   fHframe0->Resize(200, 50);


   fHframe2 = new TGHorizontalFrame(this, 0, 0, 0);

   fFitButton = new TGTextButton(fHframe2,"Fit");
   fFitButton->Connect("Clicked()","ModelInspectorGUI",this,"DoFit()");
   fExitButton = new TGTextButton(fHframe2, "Exit ");
   fExitButton->Connect("Clicked()", "ModelInspectorGUI", this, "DoExit()");


   fCheck1->Connect("Clicked()", "ModelInspectorGUI", this,
                    "HandleButtons()");
   fCheck2->Connect("Clicked()", "ModelInspectorGUI", this,
                    "HandleButtons()");

   fHframe2->Resize(100, 25);

   //--- layout for buttons: top align, equally expand horizontally
   fBly = new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5);

   //--- layout for the frame: place at bottom, right aligned
   fBfly1 = new TGLayoutHints(kLHintsTop | kLHintsCenterX, 5, 5, 5, 5);
   fBfly2 = new TGLayoutHints(kLHintsTop | kLHintsLeft,    5, 5, 5, 5);
   fBfly3 = new TGLayoutHints(kLHintsTop | kLHintsRight,   5, 5, 5, 5);

   //   fHframe0->AddFrame(fCheck1, fBfly2);
   //   fHframe0->AddFrame(fCheck2, fBfly2);
   fHframe2->AddFrame(fFitButton, fBfly2);
   fHframe2->AddFrame(fExitButton, fBfly3);

   AddFrame(fHframe0, fBly);
   AddFrame(fHframe2, fBly);


   // Loop over POI & NP, create slider
   // need maps of NP->slider? or just slider->NP
   RooArgSet parameters;
   parameters.add(*fMC->GetParametersOfInterest());
   parameters.add(*fMC->GetNuisanceParameters());
   TIterator* it = parameters.createIterator();
   RooRealVar* param=NULL;
   
   // BB: This is the part needed in order to have scrollbars 
   fCan = new TGCanvas(this, 100, 100, kFixedSize);
   AddFrame(fCan, new TGLayoutHints(kLHintsExpandY | kLHintsExpandX));
   fVFrame = new TGVerticalFrame(fCan->GetViewPort(), 10, 10);
   fCan->SetContainer(fVFrame);
   // And that't it!
   // Obviously, the parent of other subframes is now fVFrame instead of "this"...

   while( (param=(RooRealVar*)it->Next()) ){
     cout <<"Adding Slider for "<<param->GetName()<<endl;
     TGHorizontalFrame* hframek = new TGHorizontalFrame(fVFrame, 0, 0, 0);

     TGLabel* hlabel = new TGLabel(hframek,Form("%s = %.3f +%.3f",param->GetName(),param->getVal(),param->getError()));
     TGTripleHSlider* hsliderk = new TGTripleHSlider(hframek, 190, kDoubleScaleBoth, HSId1,
				     kHorizontalFrame,
				     GetDefaultFrameBackground(),
				     kFALSE, kFALSE, kFALSE, kFALSE);
     hsliderk->Connect("PointerPositionChanged()", "ModelInspectorGUI", 
			this, "DoSlider()");
     hsliderk->Connect("PositionChanged()", "ModelInspectorGUI", 
			this, "DoSlider()");
     hsliderk->SetRange(param->getMin(),param->getMax());
     
     hframek->Resize(200, 25);
     fSliderList.Add(hsliderk);
     fFrameList.Add(hframek);

     hsliderk->SetPosition(param->getVal()-param->getError(),param->getVal()+param->getError());
     hsliderk->SetPointerPosition(param->getVal());

     hframek->AddFrame(hlabel, fBly);
     hframek->AddFrame(hsliderk, fBly);
     fVFrame->AddFrame(hframek, fBly);
     fSliderMap[hsliderk]=param->GetName();
     fLabelMap[hsliderk]=hlabel;
   }

   // Set main frame name, map sub windows (buttons), initialize layout
   // algorithm via Resize() and map main frame
   SetWindowName("RooFit/RooStats Model Inspector");
   MapSubwindows();
   Resize(GetDefaultSize());
   MapWindow();

   DoSlider();
}

//______________________________________________________________________________
ModelInspectorGUI::~ModelInspectorGUI()
{
   // Clean up

   Cleanup();
}

//______________________________________________________________________________
void ModelInspectorGUI::CloseWindow()
{
   // Called when window is closed via the window manager.

   delete this;
}

//______________________________________________________________________________
void ModelInspectorGUI::DoText(const char * /*text*/)
{
   // Handle text entry widgets.

   TGTextEntry *te = (TGTextEntry *) gTQSender;
   Int_t id = te->WidgetId();

   switch (id) {
      case HId1:
         fHslider1->SetPosition(atof(fTbh1->GetString()),
                                fHslider1->GetMaxPosition());
         break;
      case HId2:
         fHslider1->SetPointerPosition(atof(fTbh2->GetString()));
         break;
      case HId3:
         fHslider1->SetPosition(fHslider1->GetMinPosition(),
                                atof(fTbh1->GetString()));
         break;
      default:
         break;
   }
   DoSlider();
}

//______________________________________________________________________________
void ModelInspectorGUI::DoFit()
{
  fFitRes = fMC->GetPdf()->fitTo(*fData,Save());
  map<TGTripleHSlider*,const char*>::iterator it;;
  it = fSliderMap.begin();
  for(; it!=fSliderMap.end(); ++it){
    RooRealVar* param=fWS->var(it->second);
    param = (RooRealVar*) fFitRes->floatParsFinal().find(it->second);
    it->first->SetPosition(param->getVal()-param->getError(),param->getVal()+param->getError());
    it->first->SetPointerPosition(param->getVal());
  }
  DoSlider();

}

//______________________________________________________________________________
void ModelInspectorGUI::DoSlider(const char* text)
{
  cout << "." << text <<endl;
}

//______________________________________________________________________________
void ModelInspectorGUI::DoSlider()
{
   // Handle slider widgets.
  char buf[32];

  RooSimultaneous* simPdf = NULL;
  Int_t numCats = 0;
  if(strcmp(fMC->GetPdf()->ClassName(),"RooSimultaneous")==0){
    simPdf = (RooSimultaneous*)(fMC->GetPdf());
    RooCategory* channelCat = (RooCategory*) (&simPdf->indexCat());
    numCats = channelCat->numTypes();
  } else {
  }


  /////////////////////////////////////////////
  if(!simPdf){
    /////////////////////////////////////////////
    // if not SimPdf
    /////////////////////////////////////////////

    // pre loop      
    map<TGTripleHSlider*,const char*>::iterator it;;
    delete fPlot;
    fPlot = ((RooRealVar*)fMC->GetObservables()->first())->frame();
    fData->plotOn(fPlot);
    double normCount;

    // high loop
    it = fSliderMap.begin();
    for(; it!=fSliderMap.end(); ++it){
      const char* name = it->second;
      fWS->var(name)->setVal(it->first->GetMaxPosition());
      RooRealVar* param = fWS->var(name);
      fLabelMap[it->first]->SetText(Form("%s = %.3f [%.3f,%.3f]",param->GetName(),it->first->GetPointerPosition(),it->first->GetMinPosition(),it->first->GetMaxPosition()));
    }
    normCount = fMC->GetPdf()->expectedEvents(*fMC->GetObservables());
    fMC->GetPdf()->plotOn(fPlot,LineColor(kRed),Normalization(normCount,RooAbsReal::NumEvent));
    
    // low loop
    it = fSliderMap.begin();
    for(; it!=fSliderMap.end(); ++it){
      const char* name = it->second;
      fWS->var(name)->setVal(it->first->GetMinPosition());
      }
    normCount = fMC->GetPdf()->expectedEvents(*fMC->GetObservables());
    fMC->GetPdf()->plotOn(fPlot,LineColor(kGreen),Normalization(normCount,RooAbsReal::NumEvent));
    
    // central oop
    it = fSliderMap.begin();
    for(; it!=fSliderMap.end(); ++it){
      const char* name = it->second;
      fWS->var(name)->setVal(it->first->GetPointerPosition());
    }
    normCount = fMC->GetPdf()->expectedEvents(*fMC->GetObservables());
    fMC->GetPdf()->plotOn(fPlot,LineColor(kBlue),Normalization(normCount,RooAbsReal::NumEvent));
    fPlot->Draw();
    
    fCanvas->GetCanvas()->Modified();
    fCanvas->GetCanvas()->Update();
    ////////////////////////////////////////////////////////////////////////////
  } else {
    ////////////////////////////////////////////////////////////////////////////
    // else (is simpdf)
    ////////////////////////////////////////////////////////////////////////////
    RooCategory* channelCat = (RooCategory*) (&simPdf->indexCat());
    //    TIterator* iter = simPdf->indexCat().typeIterator() ;
    TIterator* iter = channelCat->typeIterator() ;
    RooCatType* tt = NULL;
    Int_t frameIndex = 0;
    while((tt=(RooCatType*) iter->Next())) {
      ++frameIndex;
      fCanvas->GetCanvas()->cd(frameIndex);

      // pre loop
      RooAbsPdf* pdftmp = simPdf->getPdf(tt->GetName()) ;
      RooArgSet* obstmp = pdftmp->getObservables(*fMC->GetObservables()) ;
      RooRealVar* obs = ((RooRealVar*)obstmp->first());

      fPlot = fPlotList.at(frameIndex-1);
      if(fPlot) delete fPlot;
      fPlot = obs->frame();
      fPlotList.at(frameIndex-1) = fPlot;

      RooFit::MsgLevel msglevel = RooMsgService::instance().globalKillBelow();
      RooMsgService::instance().setGlobalKillBelow(RooFit::WARNING);
      fData->plotOn(fPlot,MarkerSize(1),Cut(Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())),DataError(RooAbsData::None));
      RooMsgService::instance().setGlobalKillBelow(msglevel);


      map<TGTripleHSlider*,const char*>::iterator it;;
      double normCount;

      // high loop
      it = fSliderMap.begin();
      for(; it!=fSliderMap.end(); ++it){
	const char* name = it->second;
	fWS->var(name)->setVal(it->first->GetMaxPosition());
	RooRealVar* param = fWS->var(name);
	fLabelMap[it->first]->SetText(Form("%s = %.3f [%.3f,%.3f]",param->GetName(),it->first->GetPointerPosition(),it->first->GetMinPosition(),it->first->GetMaxPosition()));
      }
      normCount = pdftmp->expectedEvents(*obs);
      pdftmp->plotOn(fPlot,LineColor(kRed),LineWidth(2.),Normalization(normCount,RooAbsReal::NumEvent)) ;


      // low loop
      it = fSliderMap.begin();
      for(; it!=fSliderMap.end(); ++it){
	const char* name = it->second;
	fWS->var(name)->setVal(it->first->GetMinPosition());
	RooRealVar* param = fWS->var(name);
	fLabelMap[it->first]->SetText(Form("%s = %.3f [%.3f,%.3f]",param->GetName(),it->first->GetPointerPosition(),it->first->GetMinPosition(),it->first->GetMaxPosition()));
      }
      normCount = pdftmp->expectedEvents(*obs);
      pdftmp->plotOn(fPlot,LineColor(kGreen),LineWidth(2.),Normalization(normCount,RooAbsReal::NumEvent)) ;

      // central loop
      it = fSliderMap.begin();
      for(; it!=fSliderMap.end(); ++it){
	const char* name = it->second;
	fWS->var(name)->setVal(it->first->GetPointerPosition());
	RooRealVar* param = fWS->var(name);
	fLabelMap[it->first]->SetText(Form("%s = %.3f [%.3f,%.3f]",param->GetName(),it->first->GetPointerPosition(),it->first->GetMinPosition(),it->first->GetMaxPosition()));
      }
      normCount = pdftmp->expectedEvents(*obs);
      if(!fFitRes)
	pdftmp->plotOn(fPlot,LineColor(kBlue),LineWidth(2.),Normalization(normCount,RooAbsReal::NumEvent)) ;
      else{
	pdftmp->plotOn(fPlot,Normalization(normCount,RooAbsReal::NumEvent),VisualizeError(*fFitRes,*fMC->GetNuisanceParameters()),FillColor(kYellow)) ;
	pdftmp->plotOn(fPlot,LineColor(kBlue),LineWidth(2.),Normalization(normCount,RooAbsReal::NumEvent)) ;
      RooFit::MsgLevel msglevel = RooMsgService::instance().globalKillBelow();
      RooMsgService::instance().setGlobalKillBelow(RooFit::WARNING);
      fData->plotOn(fPlot,MarkerSize(1),Cut(Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())),DataError(RooAbsData::None));
      RooMsgService::instance().setGlobalKillBelow(msglevel);
      }
      fPlot->Draw();
    }    
    fCanvas->GetCanvas()->Modified();
    fCanvas->GetCanvas()->Update();
    ///////////////////////////////////////////
    // end if(simPdf)
  }


}

//______________________________________________________________________________
void ModelInspectorGUI::HandleButtons()
{
   // Handle different buttons.

   TGButton *btn = (TGButton *) gTQSender;
   Int_t id = btn->WidgetId();

   switch (id) {
      case HCId1:
         fHslider1->SetConstrained(fCheck1->GetState());
         break;
      case HCId2:
         fHslider1->SetRelative(fCheck2->GetState());
         break;
      default:
         break;
   }
}
void ModelInspectorGUI::DoExit()
{
   printf("Exit application...");
   gApplication->Terminate(0);
}


void ModelInspector(const char* infile = "",
		      const char* workspaceName = "combined",
		      const char* modelConfigName = "ModelConfig",
		      const char* dataName = "obsData"){

#ifdef __CINT__
  cout <<"You must use ACLIC for this.  Use ModelInspector.C+"<<endl;
  return;
#endif

  /////////////////////////////////////////////////////////////
  // First part is just to access a user-defined file 
  // or create the standard example file if it doesn't exist
  ////////////////////////////////////////////////////////////
  const char* filename = "";
  if (!strcmp(infile,""))
    filename = "results/example_combined_GaussExample_model.root";
  else
    filename = infile;
  // Check if example input file exists
  TFile *file = TFile::Open(filename);

  // if input file was specified byt not found, quit
  if(!file && strcmp(infile,"")){
    cout <<"file 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;
  }

  
  /////////////////////////////////////////////////////////////
  // Tutorial starts here
  ////////////////////////////////////////////////////////////

  // get the workspace out of the file
  RooWorkspace* w = (RooWorkspace*) file->Get(workspaceName);
  if(!w){
    cout <<"workspace not found" << endl;
    return;
  }

  // get the modelConfig out of the file
  ModelConfig* mc = (ModelConfig*) w->obj(modelConfigName);

  // get the modelConfig out of the file
  RooAbsData* data = w->data(dataName);

  // make sure ingredients are found
  if(!data || !mc){
    w->Print();
    cout << "data or ModelConfig was not found" <<endl;
    return;
  }

  new ModelInspectorGUI(w,mc,data);
}

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