ROOT logo

From $ROOTSYS/tutorials/roostats/rs401d_FeldmanCousins.C

/////////////////////////////////////////////////////////////////////////
//
// 'Neutrino Oscillation Example from Feldman & Cousins'
// author: Kyle Cranmer
// date March 2009
//
// This tutorial shows a more complex example using the FeldmanCousins utility
// to create a confidence interval for a toy neutrino oscillation experiment.
// The example attempts to faithfully reproduce the toy example described in Feldman & Cousins' 
// original paper, Phys.Rev.D57:3873-3889,1998. 
//
// to run it:
// .x tutorials/roostats/rs401d_FeldmanCousins.C+
/////////////////////////////////////////////////////////////////////////

#include "RooGlobalFunc.h"
#include "RooStats/ConfInterval.h"
#include "RooStats/FeldmanCousins.h"
#include "RooStats/ProfileLikelihoodCalculator.h"
#include "RooStats/MCMCCalculator.h"
#include "RooStats/UniformProposal.h"
#include "RooStats/LikelihoodIntervalPlot.h"
#include "RooStats/MCMCIntervalPlot.h"
#include "RooStats/MCMCInterval.h"

#include "RooDataSet.h"
#include "RooDataHist.h"
#include "RooRealVar.h"
#include "RooConstVar.h"
#include "RooAddition.h"
#include "RooProduct.h"
#include "RooProdPdf.h"
#include "RooAddPdf.h"

#include "TROOT.h"
#include "RooPolynomial.h"
#include "RooRandom.h"

#include "RooNLLVar.h"
#include "RooProfileLL.h"

#include "RooPlot.h"

#include "TCanvas.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TTree.h"
#include "TMarker.h"
#include "TStopwatch.h"

#include <iostream>

// PDF class created for this macro
#if !defined(__CINT__) || defined(__MAKECINT__)
#include "../tutorials/roostats/NuMuToNuE_Oscillation.h"
#include "../tutorials/roostats/NuMuToNuE_Oscillation.cxx" // so that it can be executed directly
#else
#include "../tutorials/roostats/NuMuToNuE_Oscillation.cxx+" // so that it can be executed directly
#endif

// use this order for safety on library loading
using namespace RooFit ;
using namespace RooStats ;


void rs401d_FeldmanCousins(bool doFeldmanCousins=false, bool doMCMC = true)
{

  // to time the macro
  TStopwatch t;
  t.Start();


  /*
    Taken from Feldman & Cousins paper, Phys.Rev.D57:3873-3889,1998. 
    e-Print: physics/9711021 (see page 13.)

    Quantum mechanics dictates that the probability of such a transformation is given by the formula 
    P (νµ → ν e ) = sin^2 (2θ) sin^2 (1.27 ∆m^2 L /E )
    where P is the probability for a νµ to transform into a νe , L is the distance in km between 
    the creation of the neutrino from meson decay and its interaction in the detector, E is the 
    neutrino energy in GeV, and ∆m^2 = |m^2− m^2 | in (eV/c^2 )^2 . 

    To demonstrate how this works in practice, and how it compares to alternative approaches 
    that have been used, we consider a toy model of a typical neutrino oscillation experiment. 
    The toy model is defined by the following parameters: Mesons are assumed to decay to 
    neutrinos uniformly in a region 600 m to 1000 m from the detector. The expected background 
    from conventional νe interactions and misidentified νµ interactions is assumed to be 100 
    events in each of 5 energy bins which span the region from 10 to 60 GeV. We assume that 
    the νµ flux is such that if P (νµ → ν e ) = 0.01 averaged over any bin, then that bin would 
    have an expected additional contribution of 100 events due to νµ → ν e oscillations. 
   */

  // Make signal model model
  RooRealVar E("E","", 15,10,60,"GeV");
  RooRealVar L("L","", .800,.600, 1.0,"km"); // need these units in formula
  RooRealVar deltaMSq("deltaMSq","#Delta m^{2}",40,1,300,"eV/c^{2}");
  RooRealVar sinSq2theta("sinSq2theta","sin^{2}(2#theta)", .006,.0,.02);
  //RooRealVar deltaMSq("deltaMSq","#Delta m^{2}",40,20,70,"eV/c^{2}");
  //  RooRealVar sinSq2theta("sinSq2theta","sin^{2}(2#theta)", .006,.001,.01);
  // PDF for oscillation only describes deltaMSq dependence, sinSq2theta goes into sigNorm
  // 1) The code for this PDF was created by issuing these commands
  //    root [0] RooClassFactory x
  //    root [1] x.makePdf("NuMuToNuE_Oscillation","L,E,deltaMSq","","pow(sin(1.27*deltaMSq*L/E),2)")
  NuMuToNuE_Oscillation PnmuTone("PnmuTone","P(#nu_{#mu} #rightarrow #nu_{e}",L,E,deltaMSq);

  // only E is observable, so create the signal model by integrating out L 
  RooAbsPdf* sigModel = PnmuTone.createProjection(L);

  // create   \int dE' dL' P(E',L' | \Delta m^2). 
  // Given RooFit will renormalize the PDF in the range of the observables, 
  // the average probability to oscillate in the experiment's acceptance
  // needs to be incorporated into the extended term in the likelihood.
  // Do this by creating a RooAbsReal representing the integral and divide by 
  // the area in the E-L plane.
  // The integral should be over "primed" observables, so we need
  // an independent copy of PnmuTone not to interfere with the original.

  // Independent copy for Integral
  RooRealVar EPrime("EPrime","", 15,10,60,"GeV");
  RooRealVar LPrime("LPrime","", .800,.600, 1.0,"km"); // need these units in formula
  NuMuToNuE_Oscillation PnmuTonePrime("PnmuTonePrime","P(#nu_{#mu} #rightarrow #nu_{e}",
				      LPrime,EPrime,deltaMSq);
  RooAbsReal* intProbToOscInExp = PnmuTonePrime.createIntegral(RooArgSet(EPrime,LPrime));

  // Getting the flux is a bit tricky.  It is more celear to include a cross section term that is not
  // explicitly refered to in the text, eg.
  // # events in bin = flux * cross-section for nu_e interaction in E bin * average prob nu_mu osc. to nu_e in bin
  // let maxEventsInBin = flux * cross-section for nu_e interaction in E bin 
  // maxEventsInBin * 1% chance per bin =  100 events / bin
  // therefore maxEventsInBin = 10,000.
  // for 5 bins, this means maxEventsTot = 50,000   
  RooConstVar maxEventsTot("maxEventsTot","maximum number of sinal events",50000);
  RooConstVar inverseArea("inverseArea","1/(#Delta E #Delta L)",
			   1./(EPrime.getMax()-EPrime.getMin())/(LPrime.getMax()-LPrime.getMin()));

  // sigNorm = maxEventsTot * (\int dE dL prob to oscillate in experiment / Area) * sin^2(2\theta)
  RooProduct sigNorm("sigNorm", "", RooArgSet(maxEventsTot, *intProbToOscInExp, inverseArea, sinSq2theta));
  // bkg = 5 bins * 100 events / bin
  RooConstVar bkgNorm("bkgNorm","normalization for background",500);

  // flat background (0th order polynomial, so no arguments for coefficients)
  RooPolynomial bkgEShape("bkgEShape","flat bkg shape", E);

  // total model
  RooAddPdf model("model","",RooArgList(*sigModel,bkgEShape),
		  RooArgList(sigNorm,bkgNorm));

  // for debugging, check model tree
  //  model.printCompactTree();
  //  model.graphVizTree("model.dot");


  // turn off some messages
  RooMsgService::instance().setStreamStatus(0,kFALSE);
  RooMsgService::instance().setStreamStatus(1,kFALSE);
  RooMsgService::instance().setStreamStatus(2,kFALSE);


  //////////////////////////////////////////////
  // n events in data to data, simply sum of sig+bkg
  Int_t nEventsData = bkgNorm.getVal()+sigNorm.getVal(); 
  cout << "generate toy data with nEvents = " << nEventsData << endl;
  // adjust random seed to get a toy dataset similar to one in paper. 
  // Found by trial and error (3 trials, so not very "fine tuned")
  RooRandom::randomGenerator()->SetSeed(3); 
  // create a toy dataset
  RooDataSet* data = model.generate(RooArgSet(E), nEventsData);
  
  /////////////////////////////////////////////
  // make some plots
  TCanvas* dataCanvas = new TCanvas("dataCanvas");
  dataCanvas->Divide(2,2);

  // plot the PDF
  dataCanvas->cd(1);
  TH1* hh = PnmuTone.createHistogram("hh",E,Binning(40),YVar(L,Binning(40)),Scaling(kFALSE)) ;
  hh->SetLineColor(kBlue) ;
  hh->SetTitle("True Signal Model");
  hh->Draw("surf");

  // plot the data with the best fit
  dataCanvas->cd(2);
  RooPlot* Eframe = E.frame();
  data->plotOn(Eframe);
  model.fitTo(*data, Extended());
  model.plotOn(Eframe);
  model.plotOn(Eframe,Components(*sigModel),LineColor(kRed));
  model.plotOn(Eframe,Components(bkgEShape),LineColor(kGreen));
  model.plotOn(Eframe);
  Eframe->SetTitle("toy data with best fit model (and sig+bkg components)");
  Eframe->Draw();

  // plot the likelihood function
  dataCanvas->cd(3);
  RooNLLVar nll("nll", "nll", model, *data, Extended());
  RooProfileLL pll("pll", "", nll, RooArgSet(deltaMSq, sinSq2theta));
  //  TH1* hhh = nll.createHistogram("hhh",sinSq2theta,Binning(40),YVar(deltaMSq,Binning(40))) ;
  TH1* hhh = pll.createHistogram("hhh",sinSq2theta,Binning(40),YVar(deltaMSq,Binning(40)),Scaling(kFALSE)) ;
  hhh->SetLineColor(kBlue) ;
  hhh->SetTitle("Likelihood Function");
  hhh->Draw("surf");

  dataCanvas->Update();



  //////////////////////////////////////////////////////////
  //////// show use of Feldman-Cousins utility in RooStats
  // set the distribution creator, which encodes the test statistic
  RooArgSet parameters(deltaMSq, sinSq2theta);
  RooWorkspace* w = new RooWorkspace();

  ModelConfig modelConfig;
  modelConfig.SetWorkspace(*w);
  modelConfig.SetPdf(model);
  modelConfig.SetParametersOfInterest(parameters);

  RooStats::FeldmanCousins fc(*data, modelConfig);
  fc.SetTestSize(.1); // set size of test
  fc.UseAdaptiveSampling(true);
  fc.SetNBins(10); // number of points to test per parameter

  // use the Feldman-Cousins tool
  ConfInterval* interval = 0;
  if(doFeldmanCousins)
    interval = fc.GetInterval();


  ///////////////////////////////////////////////////////////////////
  ///////// show use of ProfileLikeihoodCalculator utility in RooStats
  RooStats::ProfileLikelihoodCalculator plc(*data, modelConfig);
  plc.SetTestSize(.1);
  
  ConfInterval* plcInterval = plc.GetInterval();

  ///////////////////////////////////////////////////////////////////
  ///////// show use of MCMCCalculator utility in RooStats
  MCMCInterval* mcInt = NULL;

  if (doMCMC) {
      // turn some messages back on
      RooMsgService::instance().setStreamStatus(0,kTRUE);
      RooMsgService::instance().setStreamStatus(1,kTRUE);

      TStopwatch mcmcWatch;
      mcmcWatch.Start();

      RooArgList axisList(deltaMSq, sinSq2theta);
      MCMCCalculator mc(*data, modelConfig);
      mc.SetNumIters(5000);
      mc.SetNumBurnInSteps(100);
      mc.SetUseKeys(true);
      mc.SetTestSize(.1);
      mc.SetAxes(axisList); // set which is x and y axis in posterior histogram
      //mc.SetNumBins(50);
      mcInt = (MCMCInterval*)mc.GetInterval();

      mcmcWatch.Stop();
      mcmcWatch.Print();
  }
  ////////////////////////////////////////////
  // make plot of resulting interval

  dataCanvas->cd(4);

  // first plot a small dot for every point tested
  if (doFeldmanCousins) {
     RooDataHist* parameterScan = (RooDataHist*) fc.GetPointsToScan();
     TH2F* hist = (TH2F*) parameterScan->createHistogram("sinSq2theta:deltaMSq",30,30);
     //  hist->Draw();
     TH2F* forContour = (TH2F*)hist->Clone();

     // now loop through the points and put a marker if it's in the interval
     RooArgSet* tmpPoint;
     // loop over points to test
     for(Int_t i=0; i<parameterScan->numEntries(); ++i){
        // get a parameter point from the list of points to test.
        tmpPoint = (RooArgSet*) parameterScan->get(i)->clone("temp");

        if (interval){
           if (interval->IsInInterval( *tmpPoint ) ) {
              forContour->SetBinContent( hist->FindBin(tmpPoint->getRealValue("sinSq2theta"), 
                       tmpPoint->getRealValue("deltaMSq")),	 1);
           }else{
              forContour->SetBinContent( hist->FindBin(tmpPoint->getRealValue("sinSq2theta"), 
                       tmpPoint->getRealValue("deltaMSq")),	 0);
           }
        }


        delete tmpPoint;
     }

     if (interval){
        Double_t level=0.5;
        forContour->SetContour(1,&level);
        forContour->SetLineWidth(2);
        forContour->SetLineColor(kRed);
        forContour->Draw("cont2,same");
     }
  }

  MCMCIntervalPlot* mcPlot = NULL;
  if (mcInt) {
     cout << "MCMC actual confidence level: "
        << mcInt->GetActualConfidenceLevel() << endl;
     mcPlot = new MCMCIntervalPlot(*mcInt);
     mcPlot->SetLineColor(kMagenta);
     mcPlot->Draw();
  }
  dataCanvas->Update();
  
  LikelihoodIntervalPlot plotInt((LikelihoodInterval*)plcInterval);
  plotInt.SetTitle("90% Confidence Intervals");
  if (mcInt)
     plotInt.Draw("same");
  else
     plotInt.Draw();
  dataCanvas->Update();

  /// print timing info
  t.Stop();
  t.Print();
    

}

 rs401d_FeldmanCousins.C:1
 rs401d_FeldmanCousins.C:2
 rs401d_FeldmanCousins.C:3
 rs401d_FeldmanCousins.C:4
 rs401d_FeldmanCousins.C:5
 rs401d_FeldmanCousins.C:6
 rs401d_FeldmanCousins.C:7
 rs401d_FeldmanCousins.C:8
 rs401d_FeldmanCousins.C:9
 rs401d_FeldmanCousins.C:10
 rs401d_FeldmanCousins.C:11
 rs401d_FeldmanCousins.C:12
 rs401d_FeldmanCousins.C:13
 rs401d_FeldmanCousins.C:14
 rs401d_FeldmanCousins.C:15
 rs401d_FeldmanCousins.C:16
 rs401d_FeldmanCousins.C:17
 rs401d_FeldmanCousins.C:18
 rs401d_FeldmanCousins.C:19
 rs401d_FeldmanCousins.C:20
 rs401d_FeldmanCousins.C:21
 rs401d_FeldmanCousins.C:22
 rs401d_FeldmanCousins.C:23
 rs401d_FeldmanCousins.C:24
 rs401d_FeldmanCousins.C:25
 rs401d_FeldmanCousins.C:26
 rs401d_FeldmanCousins.C:27
 rs401d_FeldmanCousins.C:28
 rs401d_FeldmanCousins.C:29
 rs401d_FeldmanCousins.C:30
 rs401d_FeldmanCousins.C:31
 rs401d_FeldmanCousins.C:32
 rs401d_FeldmanCousins.C:33
 rs401d_FeldmanCousins.C:34
 rs401d_FeldmanCousins.C:35
 rs401d_FeldmanCousins.C:36
 rs401d_FeldmanCousins.C:37
 rs401d_FeldmanCousins.C:38
 rs401d_FeldmanCousins.C:39
 rs401d_FeldmanCousins.C:40
 rs401d_FeldmanCousins.C:41
 rs401d_FeldmanCousins.C:42
 rs401d_FeldmanCousins.C:43
 rs401d_FeldmanCousins.C:44
 rs401d_FeldmanCousins.C:45
 rs401d_FeldmanCousins.C:46
 rs401d_FeldmanCousins.C:47
 rs401d_FeldmanCousins.C:48
 rs401d_FeldmanCousins.C:49
 rs401d_FeldmanCousins.C:50
 rs401d_FeldmanCousins.C:51
 rs401d_FeldmanCousins.C:52
 rs401d_FeldmanCousins.C:53
 rs401d_FeldmanCousins.C:54
 rs401d_FeldmanCousins.C:55
 rs401d_FeldmanCousins.C:56
 rs401d_FeldmanCousins.C:57
 rs401d_FeldmanCousins.C:58
 rs401d_FeldmanCousins.C:59
 rs401d_FeldmanCousins.C:60
 rs401d_FeldmanCousins.C:61
 rs401d_FeldmanCousins.C:62
 rs401d_FeldmanCousins.C:63
 rs401d_FeldmanCousins.C:64
 rs401d_FeldmanCousins.C:65
 rs401d_FeldmanCousins.C:66
 rs401d_FeldmanCousins.C:67
 rs401d_FeldmanCousins.C:68
 rs401d_FeldmanCousins.C:69
 rs401d_FeldmanCousins.C:70
 rs401d_FeldmanCousins.C:71
 rs401d_FeldmanCousins.C:72
 rs401d_FeldmanCousins.C:73
 rs401d_FeldmanCousins.C:74
 rs401d_FeldmanCousins.C:75
 rs401d_FeldmanCousins.C:76
 rs401d_FeldmanCousins.C:77
 rs401d_FeldmanCousins.C:78
 rs401d_FeldmanCousins.C:79
 rs401d_FeldmanCousins.C:80
 rs401d_FeldmanCousins.C:81
 rs401d_FeldmanCousins.C:82
 rs401d_FeldmanCousins.C:83
 rs401d_FeldmanCousins.C:84
 rs401d_FeldmanCousins.C:85
 rs401d_FeldmanCousins.C:86
 rs401d_FeldmanCousins.C:87
 rs401d_FeldmanCousins.C:88
 rs401d_FeldmanCousins.C:89
 rs401d_FeldmanCousins.C:90
 rs401d_FeldmanCousins.C:91
 rs401d_FeldmanCousins.C:92
 rs401d_FeldmanCousins.C:93
 rs401d_FeldmanCousins.C:94
 rs401d_FeldmanCousins.C:95
 rs401d_FeldmanCousins.C:96
 rs401d_FeldmanCousins.C:97
 rs401d_FeldmanCousins.C:98
 rs401d_FeldmanCousins.C:99
 rs401d_FeldmanCousins.C:100
 rs401d_FeldmanCousins.C:101
 rs401d_FeldmanCousins.C:102
 rs401d_FeldmanCousins.C:103
 rs401d_FeldmanCousins.C:104
 rs401d_FeldmanCousins.C:105
 rs401d_FeldmanCousins.C:106
 rs401d_FeldmanCousins.C:107
 rs401d_FeldmanCousins.C:108
 rs401d_FeldmanCousins.C:109
 rs401d_FeldmanCousins.C:110
 rs401d_FeldmanCousins.C:111
 rs401d_FeldmanCousins.C:112
 rs401d_FeldmanCousins.C:113
 rs401d_FeldmanCousins.C:114
 rs401d_FeldmanCousins.C:115
 rs401d_FeldmanCousins.C:116
 rs401d_FeldmanCousins.C:117
 rs401d_FeldmanCousins.C:118
 rs401d_FeldmanCousins.C:119
 rs401d_FeldmanCousins.C:120
 rs401d_FeldmanCousins.C:121
 rs401d_FeldmanCousins.C:122
 rs401d_FeldmanCousins.C:123
 rs401d_FeldmanCousins.C:124
 rs401d_FeldmanCousins.C:125
 rs401d_FeldmanCousins.C:126
 rs401d_FeldmanCousins.C:127
 rs401d_FeldmanCousins.C:128
 rs401d_FeldmanCousins.C:129
 rs401d_FeldmanCousins.C:130
 rs401d_FeldmanCousins.C:131
 rs401d_FeldmanCousins.C:132
 rs401d_FeldmanCousins.C:133
 rs401d_FeldmanCousins.C:134
 rs401d_FeldmanCousins.C:135
 rs401d_FeldmanCousins.C:136
 rs401d_FeldmanCousins.C:137
 rs401d_FeldmanCousins.C:138
 rs401d_FeldmanCousins.C:139
 rs401d_FeldmanCousins.C:140
 rs401d_FeldmanCousins.C:141
 rs401d_FeldmanCousins.C:142
 rs401d_FeldmanCousins.C:143
 rs401d_FeldmanCousins.C:144
 rs401d_FeldmanCousins.C:145
 rs401d_FeldmanCousins.C:146
 rs401d_FeldmanCousins.C:147
 rs401d_FeldmanCousins.C:148
 rs401d_FeldmanCousins.C:149
 rs401d_FeldmanCousins.C:150
 rs401d_FeldmanCousins.C:151
 rs401d_FeldmanCousins.C:152
 rs401d_FeldmanCousins.C:153
 rs401d_FeldmanCousins.C:154
 rs401d_FeldmanCousins.C:155
 rs401d_FeldmanCousins.C:156
 rs401d_FeldmanCousins.C:157
 rs401d_FeldmanCousins.C:158
 rs401d_FeldmanCousins.C:159
 rs401d_FeldmanCousins.C:160
 rs401d_FeldmanCousins.C:161
 rs401d_FeldmanCousins.C:162
 rs401d_FeldmanCousins.C:163
 rs401d_FeldmanCousins.C:164
 rs401d_FeldmanCousins.C:165
 rs401d_FeldmanCousins.C:166
 rs401d_FeldmanCousins.C:167
 rs401d_FeldmanCousins.C:168
 rs401d_FeldmanCousins.C:169
 rs401d_FeldmanCousins.C:170
 rs401d_FeldmanCousins.C:171
 rs401d_FeldmanCousins.C:172
 rs401d_FeldmanCousins.C:173
 rs401d_FeldmanCousins.C:174
 rs401d_FeldmanCousins.C:175
 rs401d_FeldmanCousins.C:176
 rs401d_FeldmanCousins.C:177
 rs401d_FeldmanCousins.C:178
 rs401d_FeldmanCousins.C:179
 rs401d_FeldmanCousins.C:180
 rs401d_FeldmanCousins.C:181
 rs401d_FeldmanCousins.C:182
 rs401d_FeldmanCousins.C:183
 rs401d_FeldmanCousins.C:184
 rs401d_FeldmanCousins.C:185
 rs401d_FeldmanCousins.C:186
 rs401d_FeldmanCousins.C:187
 rs401d_FeldmanCousins.C:188
 rs401d_FeldmanCousins.C:189
 rs401d_FeldmanCousins.C:190
 rs401d_FeldmanCousins.C:191
 rs401d_FeldmanCousins.C:192
 rs401d_FeldmanCousins.C:193
 rs401d_FeldmanCousins.C:194
 rs401d_FeldmanCousins.C:195
 rs401d_FeldmanCousins.C:196
 rs401d_FeldmanCousins.C:197
 rs401d_FeldmanCousins.C:198
 rs401d_FeldmanCousins.C:199
 rs401d_FeldmanCousins.C:200
 rs401d_FeldmanCousins.C:201
 rs401d_FeldmanCousins.C:202
 rs401d_FeldmanCousins.C:203
 rs401d_FeldmanCousins.C:204
 rs401d_FeldmanCousins.C:205
 rs401d_FeldmanCousins.C:206
 rs401d_FeldmanCousins.C:207
 rs401d_FeldmanCousins.C:208
 rs401d_FeldmanCousins.C:209
 rs401d_FeldmanCousins.C:210
 rs401d_FeldmanCousins.C:211
 rs401d_FeldmanCousins.C:212
 rs401d_FeldmanCousins.C:213
 rs401d_FeldmanCousins.C:214
 rs401d_FeldmanCousins.C:215
 rs401d_FeldmanCousins.C:216
 rs401d_FeldmanCousins.C:217
 rs401d_FeldmanCousins.C:218
 rs401d_FeldmanCousins.C:219
 rs401d_FeldmanCousins.C:220
 rs401d_FeldmanCousins.C:221
 rs401d_FeldmanCousins.C:222
 rs401d_FeldmanCousins.C:223
 rs401d_FeldmanCousins.C:224
 rs401d_FeldmanCousins.C:225
 rs401d_FeldmanCousins.C:226
 rs401d_FeldmanCousins.C:227
 rs401d_FeldmanCousins.C:228
 rs401d_FeldmanCousins.C:229
 rs401d_FeldmanCousins.C:230
 rs401d_FeldmanCousins.C:231
 rs401d_FeldmanCousins.C:232
 rs401d_FeldmanCousins.C:233
 rs401d_FeldmanCousins.C:234
 rs401d_FeldmanCousins.C:235
 rs401d_FeldmanCousins.C:236
 rs401d_FeldmanCousins.C:237
 rs401d_FeldmanCousins.C:238
 rs401d_FeldmanCousins.C:239
 rs401d_FeldmanCousins.C:240
 rs401d_FeldmanCousins.C:241
 rs401d_FeldmanCousins.C:242
 rs401d_FeldmanCousins.C:243
 rs401d_FeldmanCousins.C:244
 rs401d_FeldmanCousins.C:245
 rs401d_FeldmanCousins.C:246
 rs401d_FeldmanCousins.C:247
 rs401d_FeldmanCousins.C:248
 rs401d_FeldmanCousins.C:249
 rs401d_FeldmanCousins.C:250
 rs401d_FeldmanCousins.C:251
 rs401d_FeldmanCousins.C:252
 rs401d_FeldmanCousins.C:253
 rs401d_FeldmanCousins.C:254
 rs401d_FeldmanCousins.C:255
 rs401d_FeldmanCousins.C:256
 rs401d_FeldmanCousins.C:257
 rs401d_FeldmanCousins.C:258
 rs401d_FeldmanCousins.C:259
 rs401d_FeldmanCousins.C:260
 rs401d_FeldmanCousins.C:261
 rs401d_FeldmanCousins.C:262
 rs401d_FeldmanCousins.C:263
 rs401d_FeldmanCousins.C:264
 rs401d_FeldmanCousins.C:265
 rs401d_FeldmanCousins.C:266
 rs401d_FeldmanCousins.C:267
 rs401d_FeldmanCousins.C:268
 rs401d_FeldmanCousins.C:269
 rs401d_FeldmanCousins.C:270
 rs401d_FeldmanCousins.C:271
 rs401d_FeldmanCousins.C:272
 rs401d_FeldmanCousins.C:273
 rs401d_FeldmanCousins.C:274
 rs401d_FeldmanCousins.C:275
 rs401d_FeldmanCousins.C:276
 rs401d_FeldmanCousins.C:277
 rs401d_FeldmanCousins.C:278
 rs401d_FeldmanCousins.C:279
 rs401d_FeldmanCousins.C:280
 rs401d_FeldmanCousins.C:281
 rs401d_FeldmanCousins.C:282
 rs401d_FeldmanCousins.C:283
 rs401d_FeldmanCousins.C:284
 rs401d_FeldmanCousins.C:285
 rs401d_FeldmanCousins.C:286
 rs401d_FeldmanCousins.C:287
 rs401d_FeldmanCousins.C:288
 rs401d_FeldmanCousins.C:289
 rs401d_FeldmanCousins.C:290
 rs401d_FeldmanCousins.C:291
 rs401d_FeldmanCousins.C:292
 rs401d_FeldmanCousins.C:293
 rs401d_FeldmanCousins.C:294
 rs401d_FeldmanCousins.C:295
 rs401d_FeldmanCousins.C:296
 rs401d_FeldmanCousins.C:297
 rs401d_FeldmanCousins.C:298
 rs401d_FeldmanCousins.C:299
 rs401d_FeldmanCousins.C:300
 rs401d_FeldmanCousins.C:301
 rs401d_FeldmanCousins.C:302
 rs401d_FeldmanCousins.C:303
 rs401d_FeldmanCousins.C:304
 rs401d_FeldmanCousins.C:305
 rs401d_FeldmanCousins.C:306
 rs401d_FeldmanCousins.C:307
 rs401d_FeldmanCousins.C:308
 rs401d_FeldmanCousins.C:309
 rs401d_FeldmanCousins.C:310
 rs401d_FeldmanCousins.C:311
 rs401d_FeldmanCousins.C:312
 rs401d_FeldmanCousins.C:313
 rs401d_FeldmanCousins.C:314
 rs401d_FeldmanCousins.C:315
 rs401d_FeldmanCousins.C:316
 rs401d_FeldmanCousins.C:317
 rs401d_FeldmanCousins.C:318
 rs401d_FeldmanCousins.C:319
 rs401d_FeldmanCousins.C:320
 rs401d_FeldmanCousins.C:321
 rs401d_FeldmanCousins.C:322
 rs401d_FeldmanCousins.C:323
 rs401d_FeldmanCousins.C:324
 rs401d_FeldmanCousins.C:325
 rs401d_FeldmanCousins.C:326
 rs401d_FeldmanCousins.C:327
 rs401d_FeldmanCousins.C:328
 rs401d_FeldmanCousins.C:329