ROOT logo
// @(#)root/roostats:$Id: NeymanConstruction.cxx 31276 2009-11-18 15:06:42Z moneta $
// Author: Kyle Cranmer   January 2009

/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//_________________________________________________
/*
BEGIN_HTML
<p>
NeymanConstruction is a concrete implementation of the NeymanConstruction interface that, as the name suggests,
performs a NeymanConstruction.  
It produces a RooStats::PointSetInterval, which is a concrete implementation of the ConfInterval interface.  
</p>
<p>
The Neyman Construction is not a uniquely defined statistical technique, it requires that one specify an ordering rule 
or ordering principle, which is usually incoded by choosing a specific test statistic and limits of integration 
(corresponding to upper/lower/central limits).  As a result, this class must be configured with the corresponding
information before it can produce an interval.  Common configurations, such as the Feldman-Cousins approach, can be 
enforced by other light weight classes.
</p>
<p>
The Neyman Construction considers every point in the parameter space independently, no assumptions are 
made that the interval is connected or of a particular shape.  As a result, the PointSetInterval class is used to 
represent the result.  The user indicate which points in the parameter space to perform the constrution by providing
a PointSetInterval instance with the desired points.
</p>
<p>
This class is fairly light weight, because the choice of parameter points to be considered is factorized and so is the 
creation of the sampling distribution of the test statistic (which is done by a concrete class implementing the DistributionCreator interface).  As a result, this class basically just drives the construction by:
<ul>
<li> using a DistributionCreator to create the SamplingDistribution of a user-defined test statistic for each parameter point of interest,</li>
<li>defining the acceptance region in the data by finding the thresholds on the test statistic such that the integral of the sampling distribution is of the appropriate size and consistent with the limits of integration (eg. upper/lower/central limits), </li>
<li> and finally updating the PointSetInterval based on whether the value of the test statistic evaluated on the data are in the acceptance region.</li>
</p>
END_HTML
*/
//

#ifndef RooStats_NeymanConstruction
#include "RooStats/NeymanConstruction.h"
#endif

#ifndef RooStats_RooStatsUtils
#include "RooStats/RooStatsUtils.h"
#endif

#ifndef RooStats_PointSetInterval
#include "RooStats/PointSetInterval.h"
#endif

#include "RooStats/SamplingDistribution.h"
#include "RooStats/ToyMCSampler.h"
#include "RooStats/ModelConfig.h"

#include "RooMsgService.h"

#include "RooDataSet.h"
#include "RooGlobalFunc.h"
#include "TFile.h"
#include "TTree.h"
#include "TMath.h"
#include "TH1F.h"



ClassImp(RooStats::NeymanConstruction) ;

using namespace RooFit;
using namespace RooStats;


//_______________________________________________________
NeymanConstruction::NeymanConstruction() : 
   fPdf(0),
   fData(0),
   fLeftSideFraction(0), 
   fConfBelt(0),  // constructed with tree data 
   fSaveBeltToFile(false),
   fCreateBelt(false)
{
   // default constructor
//   fWS = new RooWorkspace();
//   fOwnsWorkspace = true;
//   fDataName = "";
//   fPdfName = "";
}

void NeymanConstruction::SetModel(const ModelConfig & model) { 
   // set the model
   fPdf = model.GetPdf();
   fPOI.removeAll();
   fNuisParams.removeAll();
   if (model.GetParametersOfInterest() ) fPOI.add(*model.GetParametersOfInterest());
   if (model.GetNuisanceParameters() )   fNuisParams.add(*model.GetNuisanceParameters());
}

//_______________________________________________________
NeymanConstruction::~NeymanConstruction() {
   // default constructor
  //  if(fOwnsWorkspace && fWS) delete fWS;
  //  if(fConfBelt) delete fConfBelt;
}

//_______________________________________________________
ConfInterval* NeymanConstruction::GetInterval() const {
  // Main interface to get a RooStats::ConfInterval.  
  // It constructs a RooStats::SetInterval.


  TFile* f=0;
  if(fSaveBeltToFile){
    oocoutI(f,Contents) << "NeymanConstruction saving ConfidenceBelt to file SamplingDistributions.root" << endl;
    f = new TFile("SamplingDistributions.root","recreate");
  }
  
  // local variables
  RooAbsData* data = fData; //fWS->data(fDataName);
  if(!data) {
    coutF(Contents) << "Neyman Construction: data is not set, can't get interval" << endl;
    return 0;
  }
  Int_t npass = 0;
  RooArgSet* point; 

  RooDataSet* pointsInInterval = new RooDataSet("pointsInInterval", 
						 "points in interval", 
						*(fPointsToTest->get(0)) );

  // loop over points to test
  for(Int_t i=0; i<fPointsToTest->numEntries(); ++i){
     // get a parameter point from the list of points to test.
    point = (RooArgSet*) fPointsToTest->get(i)->clone("temp");


     // get the value of the test statistic for this data set
    Double_t thisTestStatistic = fTestStatSampler->EvaluateTestStatistic(*data, *point );

    // find the lower & upper thresholds on the test statistic that 
    // define the acceptance region in the data

    SamplingDistribution* samplingDist=0;
    Double_t sigma;
    Double_t upperEdgeOfAcceptance, upperEdgeMinusSigma, upperEdgePlusSigma;
    Double_t lowerEdgeOfAcceptance, lowerEdgeMinusSigma, lowerEdgePlusSigma;
    Int_t additionalMC=0;

    // the adaptive sampling algorithm wants at least one toy event to be outside
    // of the requested pvalue including the sampling variaton.  That leads to an equation
    // N-1 = (1-alpha)N + Z sqrt(N - (1-alpha)N) // for upper limit and
    // 1   = alpha N - Z sqrt(alpha N)  // for lower limit 
    // 
    // solving for N gives:
    // N = 1/alpha * [3/2 + sqrt(5)] for Z = 1 (which is used currently)
    // thus, a good guess for the first iteration of events is N=3.73/alpha~4/alpha
    // should replace alpha here by smaller tail probability: eg. alpha*Min(leftsideFrac, 1.-leftsideFrac)
    // totalMC will be incremented by 2 before first call, so initiated it at half the value
    Int_t totalMC = (Int_t) (2./fSize/TMath::Min(fLeftSideFraction,1.-fLeftSideFraction)); 
    if(fLeftSideFraction==0. || fLeftSideFraction ==1.){
      totalMC = (Int_t) (2./fSize); 
    }

    ToyMCSampler* toyMCSampler = dynamic_cast<ToyMCSampler*>(fTestStatSampler);
    if(fAdaptiveSampling && toyMCSampler) {
      do{
	// this will be executed first, then while conditioned checked
	// as an exit condition for the loop.

	// the next line is where most of the time will be spent 
	// generating the sampling dist of the test statistic.
	additionalMC = 2*totalMC; // grow by a factor of two
	samplingDist = 
	  toyMCSampler->AppendSamplingDistribution(*point, 
						   samplingDist, 
						   additionalMC); 
	totalMC=samplingDist->GetSize();

	//cout << "without sigma upper = " << 
	//samplingDist->InverseCDF( 1. - ((1.-fLeftSideFraction) * fSize) ) << endl;

	sigma = 1;
	upperEdgeOfAcceptance = 
	  samplingDist->InverseCDF( 1. - ((1.-fLeftSideFraction) * fSize) , 
				    sigma, upperEdgePlusSigma);
	sigma = -1;
	samplingDist->InverseCDF( 1. - ((1.-fLeftSideFraction) * fSize) , 
				  sigma, upperEdgeMinusSigma);
	
	sigma = 1;
	lowerEdgeOfAcceptance = 
	  samplingDist->InverseCDF( fLeftSideFraction * fSize , 
				    sigma, lowerEdgePlusSigma);
	sigma = -1;
	samplingDist->InverseCDF( fLeftSideFraction * fSize , 
				  sigma, lowerEdgeMinusSigma);
	
	ccoutD(Eval) << "NeymanConstruction: "
	     << "total MC = " << totalMC 
	     << " this test stat = " << thisTestStatistic << endl
	     << " upper edge -1sigma = " << upperEdgeMinusSigma
	     << ", upperEdge = "<<upperEdgeOfAcceptance
	     << ", upper edge +1sigma = " << upperEdgePlusSigma << endl
	     << " lower edge -1sigma = " << lowerEdgeMinusSigma
	     << ", lowerEdge = "<<lowerEdgeOfAcceptance
	     << ", lower edge +1sigma = " << lowerEdgePlusSigma << endl;
      } while(( 
	      (thisTestStatistic <= upperEdgeOfAcceptance &&
	       thisTestStatistic > upperEdgeMinusSigma)
	      || (thisTestStatistic >= upperEdgeOfAcceptance &&
		  thisTestStatistic < upperEdgePlusSigma)
	      || (thisTestStatistic <= lowerEdgeOfAcceptance &&
		  thisTestStatistic > lowerEdgeMinusSigma)
	      || (thisTestStatistic >= lowerEdgeOfAcceptance &&
		  thisTestStatistic < lowerEdgePlusSigma) 
		) && (totalMC < 100./fSize)
	      ) ; // need ; here
    } else {
      // the next line is where most of the time will be spent 
      // generating the sampling dist of the test statistic.
      samplingDist = fTestStatSampler->GetSamplingDistribution(*point); 
      
      lowerEdgeOfAcceptance = 
	samplingDist->InverseCDF( fLeftSideFraction * fSize );
      upperEdgeOfAcceptance = 
	samplingDist->InverseCDF( 1. - ((1.-fLeftSideFraction) * fSize) );
    }
    
    // add acceptance region to ConfidenceBelt
    if(fConfBelt && fCreateBelt){
      //      cout << "conf belt set " << fConfBelt << endl;
      fConfBelt->AddAcceptanceRegion(*point, i,
				     lowerEdgeOfAcceptance, 
				     upperEdgeOfAcceptance);
    }

    // printout some debug info
    TIter      itr = point->createIterator();
    RooRealVar* myarg;
    ccoutP(Eval) << "NeymanConstruction: Prog: "<< i+1<<"/"<<fPointsToTest->numEntries()
		      << " total MC = " << totalMC 
		      << " this test stat = " << thisTestStatistic << endl;
    ccoutP(Eval) << " ";
    while ((myarg = (RooRealVar *)itr.Next())) { 
      ccoutP(Eval) << myarg->GetName() << "=" << myarg->getVal() << " ";
    }
    ccoutP(Eval) << "[" << lowerEdgeOfAcceptance << ", " 
		       << upperEdgeOfAcceptance << "] " << " in interval = " <<
      (thisTestStatistic >= lowerEdgeOfAcceptance && thisTestStatistic <= upperEdgeOfAcceptance) 
	      << endl << endl;

    // Check if this data is in the acceptance region
    if(thisTestStatistic >= lowerEdgeOfAcceptance && thisTestStatistic <= upperEdgeOfAcceptance) {
      // if so, set this point to true
      //      fPointsToTest->add(*point, 1.);  // this behaves differently for Hist and DataSet
      pointsInInterval->add(*point);
      ++npass;
    }

    if(fSaveBeltToFile){
      //write to file
      samplingDist->Write();
      string tmpName = "hist_";
      tmpName+=samplingDist->GetName();
      TH1F* h = new TH1F(tmpName.c_str(),"",500,0.,5.);
      for(int ii=0; ii<samplingDist->GetSize(); ++ii){
	h->Fill(samplingDist->GetSamplingDistribution().at(ii) );
      }
      h->Write();
      delete h;
    }

    delete samplingDist;
    delete point;
  }
  coutI(Eval) << npass << " points in interval" << endl;

  // create an interval based pointsInInterval
  PointSetInterval* interval 
    = new PointSetInterval("ClassicalConfidenceInterval", *pointsInInterval);
  

  if(fSaveBeltToFile){
    //   write belt to file
    fConfBelt->Write();

    f->Close();
  }

  delete f;
  //delete data;
  return interval;
}

//_______________________________________________________
TList* NeymanConstruction::GenSamplingDistribution(const char* asciiFilePat) const {
  //This method generates the sampling distribution for each point of the study. If a file path
  //is provided, the distribution is saved in a root file. Returns the list of the distributions
  //for each point.

  RooArgSet* point; 
  TList* SamplingList = new TList();
  TTree *savedTree = new TTree("SamplingDistributions","List of sampling distributions");
  vector<Double_t> *distrVector = 0;

  if(asciiFilePat && *asciiFilePat){
    savedTree->Branch("distrVector",&distrVector);
  }
  
  // loop over points to test
  for(Int_t i=0; i<fPointsToTest->numEntries(); ++i){
    // get a parameter point from the list of points to test.
    point = (RooArgSet*) fPointsToTest->get(i)->clone("temp");

    // the next line is where most of the time will be spent generating the sampling dist of the test statistic.
    SamplingDistribution* samplingDist = fTestStatSampler->GetSamplingDistribution(*point); 

    cout << "dbg: generating point number " << i << " of " << fPointsToTest->numEntries() << " in the interest interval" << endl;

    SamplingList->Add(samplingDist);

    if(asciiFilePat && *asciiFilePat){ 
      vector<Double_t> dummyVector = samplingDist->GetSamplingDistribution();
      distrVector = &dummyVector;
      savedTree->Fill();
    }

  }

  if(asciiFilePat && *asciiFilePat){
    TFile fSaveList(asciiFilePat,"RECREATE");
    fSaveList.cd();
    savedTree->Write();
    fSaveList.Close();
  }

  return SamplingList;
}

//_______________________________________________________
ConfInterval* NeymanConstruction::GetIntervalUsingList() const {
  // Main interface to get a RooStats::ConfInterval.  
  // It constructs a RooStats::PointSetInterval.

  // local variables
   RooAbsData* data = fData; // fWS->data(fDataName);
  if(!data) {
    cout << "Data is not set, NeymanConstruction not initialized" << endl;
    return 0;
  }

  TList *SamplingList = (TList*)GenSamplingDistribution();

  vector<Double_t> dum = ((SamplingDistribution*)SamplingList->At(1))->GetSamplingDistribution();

  assert(SamplingList->GetSize() > 0);

  return Run(SamplingList);
}

//_______________________________________________________
ConfInterval* NeymanConstruction::GetInterval(const char* asciiFilePat) const {
  //This method returns a confidence interval exactly like GetInterval(), but
  //instead of generating the sampling disribution (long computation) it takes
  //the distribution from the file provided

  // local variables
   RooAbsData* data = fData; // fWS->data(fDataName);
  if(!data) {
    cout << "Data is not set, NeymanConstruction not initialized" << endl;
    return 0;
  }

  TList* SamplingList = new TList();
  TFile _fileSampling(asciiFilePat);
  _fileSampling.cd();
  TTree *savedTree = (TTree*)_fileSampling.Get("SamplingDistributions");
  vector<Double_t> *distrVector = 0;
  savedTree->SetBranchAddress("distrVector", &distrVector);


  for(Int_t i=0; i<fPointsToTest->numEntries(); ++i){
    savedTree->GetEntry(i);
    SamplingDistribution *dummyDist = new SamplingDistribution("TemplatedDistribution","",*distrVector);
      SamplingList->Add(dummyDist);
  }

  assert(SamplingList->GetSize() > 0);

  return Run(SamplingList);
}

//_______________________________________________________
ConfInterval* NeymanConstruction::Run(TList *SamplingList) const {
  //Main method to perform the interval calculation

  // local variables
   RooAbsData* data = fData; // fWS->data(fDataName);
  if(!data) {
    cout << "Data is not set, NeymanConstruction not initialized" << endl;
    return 0;
  }
  Int_t npass = 0;
  RooArgSet* point; 


  // loop over points to test
  for(Int_t i=0; i<fPointsToTest->numEntries(); ++i){
    // get a parameter point from the list of points to test.
    point = (RooArgSet*) fPointsToTest->get(i)->clone("temp");

    // the next line is where most of the time will be spent generating the sampling dist of the test statistic.
    SamplingDistribution* samplingDist = (SamplingDistribution*)SamplingList->At(i);

    // find the lower & upper thresholds on the test statistic that define the acceptance region in the data
    Double_t lowerEdgeOfAcceptance = samplingDist->InverseCDF( fLeftSideFraction * fSize );
    Double_t upperEdgeOfAcceptance = samplingDist->InverseCDF( 1. - ((1.-fLeftSideFraction) * fSize) );

    // get the value of the test statistic for this data set
    Double_t thisTestStatistic = fTestStatSampler->EvaluateTestStatistic(*data, *point );

    TIter      itr = point->createIterator();
    RooRealVar* myarg;
    while ((myarg = (RooRealVar *)itr.Next())) { 
      cout << myarg->GetName() << "=" << myarg->getVal() << " ";
    }
    cout << "\tdbg= " << lowerEdgeOfAcceptance << ", " 
	      << upperEdgeOfAcceptance << ", " << thisTestStatistic <<  " " <<
      (thisTestStatistic > lowerEdgeOfAcceptance && thisTestStatistic < upperEdgeOfAcceptance) << endl;

    // Check if this data is in the acceptance region
    if(thisTestStatistic > lowerEdgeOfAcceptance && thisTestStatistic < upperEdgeOfAcceptance) {
      // if so, set this point to true
      fPointsToTest->add(*point, 1.); 
      ++npass;
    }
    delete samplingDist;
    delete point;
  }
  cout << npass << " points in interval" << endl;

  // create an interval based fPointsToTest
  TString name = TString("ClassicalConfidenceInterval_") + TString(GetName() ); 
  PointSetInterval* interval  = new PointSetInterval(name, *fPointsToTest);
  
  //delete data;
  return interval;
}

 NeymanConstruction.cxx:1
 NeymanConstruction.cxx:2
 NeymanConstruction.cxx:3
 NeymanConstruction.cxx:4
 NeymanConstruction.cxx:5
 NeymanConstruction.cxx:6
 NeymanConstruction.cxx:7
 NeymanConstruction.cxx:8
 NeymanConstruction.cxx:9
 NeymanConstruction.cxx:10
 NeymanConstruction.cxx:11
 NeymanConstruction.cxx:12
 NeymanConstruction.cxx:13
 NeymanConstruction.cxx:14
 NeymanConstruction.cxx:15
 NeymanConstruction.cxx:16
 NeymanConstruction.cxx:17
 NeymanConstruction.cxx:18
 NeymanConstruction.cxx:19
 NeymanConstruction.cxx:20
 NeymanConstruction.cxx:21
 NeymanConstruction.cxx:22
 NeymanConstruction.cxx:23
 NeymanConstruction.cxx:24
 NeymanConstruction.cxx:25
 NeymanConstruction.cxx:26
 NeymanConstruction.cxx:27
 NeymanConstruction.cxx:28
 NeymanConstruction.cxx:29
 NeymanConstruction.cxx:30
 NeymanConstruction.cxx:31
 NeymanConstruction.cxx:32
 NeymanConstruction.cxx:33
 NeymanConstruction.cxx:34
 NeymanConstruction.cxx:35
 NeymanConstruction.cxx:36
 NeymanConstruction.cxx:37
 NeymanConstruction.cxx:38
 NeymanConstruction.cxx:39
 NeymanConstruction.cxx:40
 NeymanConstruction.cxx:41
 NeymanConstruction.cxx:42
 NeymanConstruction.cxx:43
 NeymanConstruction.cxx:44
 NeymanConstruction.cxx:45
 NeymanConstruction.cxx:46
 NeymanConstruction.cxx:47
 NeymanConstruction.cxx:48
 NeymanConstruction.cxx:49
 NeymanConstruction.cxx:50
 NeymanConstruction.cxx:51
 NeymanConstruction.cxx:52
 NeymanConstruction.cxx:53
 NeymanConstruction.cxx:54
 NeymanConstruction.cxx:55
 NeymanConstruction.cxx:56
 NeymanConstruction.cxx:57
 NeymanConstruction.cxx:58
 NeymanConstruction.cxx:59
 NeymanConstruction.cxx:60
 NeymanConstruction.cxx:61
 NeymanConstruction.cxx:62
 NeymanConstruction.cxx:63
 NeymanConstruction.cxx:64
 NeymanConstruction.cxx:65
 NeymanConstruction.cxx:66
 NeymanConstruction.cxx:67
 NeymanConstruction.cxx:68
 NeymanConstruction.cxx:69
 NeymanConstruction.cxx:70
 NeymanConstruction.cxx:71
 NeymanConstruction.cxx:72
 NeymanConstruction.cxx:73
 NeymanConstruction.cxx:74
 NeymanConstruction.cxx:75
 NeymanConstruction.cxx:76
 NeymanConstruction.cxx:77
 NeymanConstruction.cxx:78
 NeymanConstruction.cxx:79
 NeymanConstruction.cxx:80
 NeymanConstruction.cxx:81
 NeymanConstruction.cxx:82
 NeymanConstruction.cxx:83
 NeymanConstruction.cxx:84
 NeymanConstruction.cxx:85
 NeymanConstruction.cxx:86
 NeymanConstruction.cxx:87
 NeymanConstruction.cxx:88
 NeymanConstruction.cxx:89
 NeymanConstruction.cxx:90
 NeymanConstruction.cxx:91
 NeymanConstruction.cxx:92
 NeymanConstruction.cxx:93
 NeymanConstruction.cxx:94
 NeymanConstruction.cxx:95
 NeymanConstruction.cxx:96
 NeymanConstruction.cxx:97
 NeymanConstruction.cxx:98
 NeymanConstruction.cxx:99
 NeymanConstruction.cxx:100
 NeymanConstruction.cxx:101
 NeymanConstruction.cxx:102
 NeymanConstruction.cxx:103
 NeymanConstruction.cxx:104
 NeymanConstruction.cxx:105
 NeymanConstruction.cxx:106
 NeymanConstruction.cxx:107
 NeymanConstruction.cxx:108
 NeymanConstruction.cxx:109
 NeymanConstruction.cxx:110
 NeymanConstruction.cxx:111
 NeymanConstruction.cxx:112
 NeymanConstruction.cxx:113
 NeymanConstruction.cxx:114
 NeymanConstruction.cxx:115
 NeymanConstruction.cxx:116
 NeymanConstruction.cxx:117
 NeymanConstruction.cxx:118
 NeymanConstruction.cxx:119
 NeymanConstruction.cxx:120
 NeymanConstruction.cxx:121
 NeymanConstruction.cxx:122
 NeymanConstruction.cxx:123
 NeymanConstruction.cxx:124
 NeymanConstruction.cxx:125
 NeymanConstruction.cxx:126
 NeymanConstruction.cxx:127
 NeymanConstruction.cxx:128
 NeymanConstruction.cxx:129
 NeymanConstruction.cxx:130
 NeymanConstruction.cxx:131
 NeymanConstruction.cxx:132
 NeymanConstruction.cxx:133
 NeymanConstruction.cxx:134
 NeymanConstruction.cxx:135
 NeymanConstruction.cxx:136
 NeymanConstruction.cxx:137
 NeymanConstruction.cxx:138
 NeymanConstruction.cxx:139
 NeymanConstruction.cxx:140
 NeymanConstruction.cxx:141
 NeymanConstruction.cxx:142
 NeymanConstruction.cxx:143
 NeymanConstruction.cxx:144
 NeymanConstruction.cxx:145
 NeymanConstruction.cxx:146
 NeymanConstruction.cxx:147
 NeymanConstruction.cxx:148
 NeymanConstruction.cxx:149
 NeymanConstruction.cxx:150
 NeymanConstruction.cxx:151
 NeymanConstruction.cxx:152
 NeymanConstruction.cxx:153
 NeymanConstruction.cxx:154
 NeymanConstruction.cxx:155
 NeymanConstruction.cxx:156
 NeymanConstruction.cxx:157
 NeymanConstruction.cxx:158
 NeymanConstruction.cxx:159
 NeymanConstruction.cxx:160
 NeymanConstruction.cxx:161
 NeymanConstruction.cxx:162
 NeymanConstruction.cxx:163
 NeymanConstruction.cxx:164
 NeymanConstruction.cxx:165
 NeymanConstruction.cxx:166
 NeymanConstruction.cxx:167
 NeymanConstruction.cxx:168
 NeymanConstruction.cxx:169
 NeymanConstruction.cxx:170
 NeymanConstruction.cxx:171
 NeymanConstruction.cxx:172
 NeymanConstruction.cxx:173
 NeymanConstruction.cxx:174
 NeymanConstruction.cxx:175
 NeymanConstruction.cxx:176
 NeymanConstruction.cxx:177
 NeymanConstruction.cxx:178
 NeymanConstruction.cxx:179
 NeymanConstruction.cxx:180
 NeymanConstruction.cxx:181
 NeymanConstruction.cxx:182
 NeymanConstruction.cxx:183
 NeymanConstruction.cxx:184
 NeymanConstruction.cxx:185
 NeymanConstruction.cxx:186
 NeymanConstruction.cxx:187
 NeymanConstruction.cxx:188
 NeymanConstruction.cxx:189
 NeymanConstruction.cxx:190
 NeymanConstruction.cxx:191
 NeymanConstruction.cxx:192
 NeymanConstruction.cxx:193
 NeymanConstruction.cxx:194
 NeymanConstruction.cxx:195
 NeymanConstruction.cxx:196
 NeymanConstruction.cxx:197
 NeymanConstruction.cxx:198
 NeymanConstruction.cxx:199
 NeymanConstruction.cxx:200
 NeymanConstruction.cxx:201
 NeymanConstruction.cxx:202
 NeymanConstruction.cxx:203
 NeymanConstruction.cxx:204
 NeymanConstruction.cxx:205
 NeymanConstruction.cxx:206
 NeymanConstruction.cxx:207
 NeymanConstruction.cxx:208
 NeymanConstruction.cxx:209
 NeymanConstruction.cxx:210
 NeymanConstruction.cxx:211
 NeymanConstruction.cxx:212
 NeymanConstruction.cxx:213
 NeymanConstruction.cxx:214
 NeymanConstruction.cxx:215
 NeymanConstruction.cxx:216
 NeymanConstruction.cxx:217
 NeymanConstruction.cxx:218
 NeymanConstruction.cxx:219
 NeymanConstruction.cxx:220
 NeymanConstruction.cxx:221
 NeymanConstruction.cxx:222
 NeymanConstruction.cxx:223
 NeymanConstruction.cxx:224
 NeymanConstruction.cxx:225
 NeymanConstruction.cxx:226
 NeymanConstruction.cxx:227
 NeymanConstruction.cxx:228
 NeymanConstruction.cxx:229
 NeymanConstruction.cxx:230
 NeymanConstruction.cxx:231
 NeymanConstruction.cxx:232
 NeymanConstruction.cxx:233
 NeymanConstruction.cxx:234
 NeymanConstruction.cxx:235
 NeymanConstruction.cxx:236
 NeymanConstruction.cxx:237
 NeymanConstruction.cxx:238
 NeymanConstruction.cxx:239
 NeymanConstruction.cxx:240
 NeymanConstruction.cxx:241
 NeymanConstruction.cxx:242
 NeymanConstruction.cxx:243
 NeymanConstruction.cxx:244
 NeymanConstruction.cxx:245
 NeymanConstruction.cxx:246
 NeymanConstruction.cxx:247
 NeymanConstruction.cxx:248
 NeymanConstruction.cxx:249
 NeymanConstruction.cxx:250
 NeymanConstruction.cxx:251
 NeymanConstruction.cxx:252
 NeymanConstruction.cxx:253
 NeymanConstruction.cxx:254
 NeymanConstruction.cxx:255
 NeymanConstruction.cxx:256
 NeymanConstruction.cxx:257
 NeymanConstruction.cxx:258
 NeymanConstruction.cxx:259
 NeymanConstruction.cxx:260
 NeymanConstruction.cxx:261
 NeymanConstruction.cxx:262
 NeymanConstruction.cxx:263
 NeymanConstruction.cxx:264
 NeymanConstruction.cxx:265
 NeymanConstruction.cxx:266
 NeymanConstruction.cxx:267
 NeymanConstruction.cxx:268
 NeymanConstruction.cxx:269
 NeymanConstruction.cxx:270
 NeymanConstruction.cxx:271
 NeymanConstruction.cxx:272
 NeymanConstruction.cxx:273
 NeymanConstruction.cxx:274
 NeymanConstruction.cxx:275
 NeymanConstruction.cxx:276
 NeymanConstruction.cxx:277
 NeymanConstruction.cxx:278
 NeymanConstruction.cxx:279
 NeymanConstruction.cxx:280
 NeymanConstruction.cxx:281
 NeymanConstruction.cxx:282
 NeymanConstruction.cxx:283
 NeymanConstruction.cxx:284
 NeymanConstruction.cxx:285
 NeymanConstruction.cxx:286
 NeymanConstruction.cxx:287
 NeymanConstruction.cxx:288
 NeymanConstruction.cxx:289
 NeymanConstruction.cxx:290
 NeymanConstruction.cxx:291
 NeymanConstruction.cxx:292
 NeymanConstruction.cxx:293
 NeymanConstruction.cxx:294
 NeymanConstruction.cxx:295
 NeymanConstruction.cxx:296
 NeymanConstruction.cxx:297
 NeymanConstruction.cxx:298
 NeymanConstruction.cxx:299
 NeymanConstruction.cxx:300
 NeymanConstruction.cxx:301
 NeymanConstruction.cxx:302
 NeymanConstruction.cxx:303
 NeymanConstruction.cxx:304
 NeymanConstruction.cxx:305
 NeymanConstruction.cxx:306
 NeymanConstruction.cxx:307
 NeymanConstruction.cxx:308
 NeymanConstruction.cxx:309
 NeymanConstruction.cxx:310
 NeymanConstruction.cxx:311
 NeymanConstruction.cxx:312
 NeymanConstruction.cxx:313
 NeymanConstruction.cxx:314
 NeymanConstruction.cxx:315
 NeymanConstruction.cxx:316
 NeymanConstruction.cxx:317
 NeymanConstruction.cxx:318
 NeymanConstruction.cxx:319
 NeymanConstruction.cxx:320
 NeymanConstruction.cxx:321
 NeymanConstruction.cxx:322
 NeymanConstruction.cxx:323
 NeymanConstruction.cxx:324
 NeymanConstruction.cxx:325
 NeymanConstruction.cxx:326
 NeymanConstruction.cxx:327
 NeymanConstruction.cxx:328
 NeymanConstruction.cxx:329
 NeymanConstruction.cxx:330
 NeymanConstruction.cxx:331
 NeymanConstruction.cxx:332
 NeymanConstruction.cxx:333
 NeymanConstruction.cxx:334
 NeymanConstruction.cxx:335
 NeymanConstruction.cxx:336
 NeymanConstruction.cxx:337
 NeymanConstruction.cxx:338
 NeymanConstruction.cxx:339
 NeymanConstruction.cxx:340
 NeymanConstruction.cxx:341
 NeymanConstruction.cxx:342
 NeymanConstruction.cxx:343
 NeymanConstruction.cxx:344
 NeymanConstruction.cxx:345
 NeymanConstruction.cxx:346
 NeymanConstruction.cxx:347
 NeymanConstruction.cxx:348
 NeymanConstruction.cxx:349
 NeymanConstruction.cxx:350
 NeymanConstruction.cxx:351
 NeymanConstruction.cxx:352
 NeymanConstruction.cxx:353
 NeymanConstruction.cxx:354
 NeymanConstruction.cxx:355
 NeymanConstruction.cxx:356
 NeymanConstruction.cxx:357
 NeymanConstruction.cxx:358
 NeymanConstruction.cxx:359
 NeymanConstruction.cxx:360
 NeymanConstruction.cxx:361
 NeymanConstruction.cxx:362
 NeymanConstruction.cxx:363
 NeymanConstruction.cxx:364
 NeymanConstruction.cxx:365
 NeymanConstruction.cxx:366
 NeymanConstruction.cxx:367
 NeymanConstruction.cxx:368
 NeymanConstruction.cxx:369
 NeymanConstruction.cxx:370
 NeymanConstruction.cxx:371
 NeymanConstruction.cxx:372
 NeymanConstruction.cxx:373
 NeymanConstruction.cxx:374
 NeymanConstruction.cxx:375
 NeymanConstruction.cxx:376
 NeymanConstruction.cxx:377
 NeymanConstruction.cxx:378
 NeymanConstruction.cxx:379
 NeymanConstruction.cxx:380
 NeymanConstruction.cxx:381
 NeymanConstruction.cxx:382
 NeymanConstruction.cxx:383
 NeymanConstruction.cxx:384
 NeymanConstruction.cxx:385
 NeymanConstruction.cxx:386
 NeymanConstruction.cxx:387
 NeymanConstruction.cxx:388
 NeymanConstruction.cxx:389
 NeymanConstruction.cxx:390
 NeymanConstruction.cxx:391
 NeymanConstruction.cxx:392
 NeymanConstruction.cxx:393
 NeymanConstruction.cxx:394
 NeymanConstruction.cxx:395
 NeymanConstruction.cxx:396
 NeymanConstruction.cxx:397
 NeymanConstruction.cxx:398
 NeymanConstruction.cxx:399
 NeymanConstruction.cxx:400
 NeymanConstruction.cxx:401
 NeymanConstruction.cxx:402
 NeymanConstruction.cxx:403
 NeymanConstruction.cxx:404
 NeymanConstruction.cxx:405
 NeymanConstruction.cxx:406
 NeymanConstruction.cxx:407
 NeymanConstruction.cxx:408
 NeymanConstruction.cxx:409
 NeymanConstruction.cxx:410
 NeymanConstruction.cxx:411
 NeymanConstruction.cxx:412
 NeymanConstruction.cxx:413
 NeymanConstruction.cxx:414
 NeymanConstruction.cxx:415
 NeymanConstruction.cxx:416
 NeymanConstruction.cxx:417
 NeymanConstruction.cxx:418
 NeymanConstruction.cxx:419
 NeymanConstruction.cxx:420
 NeymanConstruction.cxx:421
 NeymanConstruction.cxx:422
 NeymanConstruction.cxx:423
 NeymanConstruction.cxx:424
 NeymanConstruction.cxx:425
 NeymanConstruction.cxx:426
 NeymanConstruction.cxx:427
 NeymanConstruction.cxx:428
 NeymanConstruction.cxx:429
 NeymanConstruction.cxx:430
 NeymanConstruction.cxx:431
 NeymanConstruction.cxx:432
 NeymanConstruction.cxx:433
 NeymanConstruction.cxx:434
 NeymanConstruction.cxx:435
 NeymanConstruction.cxx:436
 NeymanConstruction.cxx:437
 NeymanConstruction.cxx:438
 NeymanConstruction.cxx:439
 NeymanConstruction.cxx:440
 NeymanConstruction.cxx:441
 NeymanConstruction.cxx:442
 NeymanConstruction.cxx:443
 NeymanConstruction.cxx:444
 NeymanConstruction.cxx:445
 NeymanConstruction.cxx:446
 NeymanConstruction.cxx:447
 NeymanConstruction.cxx:448
 NeymanConstruction.cxx:449
 NeymanConstruction.cxx:450
 NeymanConstruction.cxx:451
 NeymanConstruction.cxx:452
 NeymanConstruction.cxx:453