NuSystFitter Class Reference

#include <NuSystFitter.h>

Inheritance diagram for NuSystFitter:

NuABFitter List of all members.

Public Member Functions

 NuSystFitter ()
virtual ~NuSystFitter ()
virtual double Up () const
virtual void SetErrorDef (const Double_t up)
virtual double operator() (const std::vector< double > &pars) const
virtual double Likelihood (const NuMMParameters &mmPars) const
virtual void Setup (const std::vector< std::string > helperInputs, const std::vector< NuHistInterpolator * > fdDataInput, const std::vector< NuHistInterpolator * > ndDataInput, const std::string xsecFile, const std::vector< std::string >, const std::string, Int_t)
virtual void push_back (NuMMRun *run)
virtual const NuMMParameters Minimise (const NuMMParameters &mmPars)
virtual const NuMMParameters Minimise (const NuMMParameters &mmPars, bool &success)
virtual const NuMMParameters FCMinimise (const NuMMParameters &mmPars)
 More robustly minimizes by doing a wide grid search first - same as the FC fitting.
virtual const NuMMParameters FCMinimiseNu (const NuMMParameters &mmPars)
virtual const NuMMParameters FCMinimiseNSI (const NuMMParameters &mmPars)
virtual const TGraph * PlotContours (const NuMMParameters &mmPars)
virtual void NoOscPrediction ()
virtual void NumberOfContourPoints (const Int_t numContourPoints)
virtual const std::pair< Double_t,
Double_t > 
SingleParDm2Errors (const NuMMParameters &mmPars, const bool quiet=false)
virtual const std::pair< Double_t,
Double_t > 
SingleParDm2BarErrors (const NuMMParameters &mmPars, const bool quiet=false)
virtual const std::pair< Double_t,
Double_t > 
SingleParSn2BarErrors (const NuMMParameters &mmPars, const bool quiet=false)
virtual const std::pair< Double_t,
Double_t > 
SingleParErrors (const NuMMParameters &mmPars, const int idx, const bool quiet)
virtual const std::vector<
std::pair< Double_t, Double_t > > 
NeutrinoContourFinder (const NuMMParameters &mmPars)
virtual const std::pair< Double_t,
Double_t > 
DmScanForContour (const NuMMParameters &mmPars, Double_t targetChi2)
virtual void Sn2PointsForNeutrinoContour (const std::vector< Double_t > &sn2PointsForNeutrinoContour)
virtual const TGraph * OneSidedNeutrinoContourFinder (const NuMMParameters &inputPars)
virtual const TGraph * TwoSidedNeutrinoContourFinder (const NuMMParameters &inputPars)
virtual const TGraph * Chi2SliceSin2bar (const NuMMParameters &mmPars, const Int_t numpoints=100, const Double_t minval=0.8, const Double_t maxval=1.2)
virtual const TGraph * Chi2SliceDm2bar (const NuMMParameters &mmPars, const Int_t numpoints=100, const Double_t minval=1e-3, const Double_t maxval=3e-3)
virtual const TGraph * Chi2SliceDm2 (const NuMMParameters &mmPars, const Int_t numpoints=100, const Double_t minval=1e-3, const Double_t maxval=3e-3)
virtual const TGraph * Chi2ValleyBar (const NuMMParameters &mmPars, const Int_t numpoints=100, const Double_t minSin2bar=0., const Double_t maxSin2bar=2.)
virtual const TGraph * Chi2ValleyBarDm2Bar (const NuMMParameters &mmPars, const Int_t numpoints=100, const Double_t minDm2bar=0., const Double_t maxDm2bar=10e-3)
virtual const TGraph * Chi2ValleyDm2 (const NuMMParameters &mmPars, const Int_t numpoints=100, const Double_t minDm2=0., const Double_t maxDm2=10e-3)
virtual const TGraph * Chi2ValleySn2 (const NuMMParameters &mmPars, const Int_t numpoints=100, const Double_t minSn2=0., const Double_t maxSn2=1.)
virtual TH2D * LikelihoodSurfaceBar (const NuMMParameters &mmPars, Int_t sinPoints, Int_t massPoints, Double_t Sn2BarMin=0.0, Double_t Sn2BarMax=1.0, Double_t Dm2BarMin=0.0, Double_t Dm2BarMax=12e-3, Bool_t True_Minimum=true)
 Function to generate a likelihood surface.
virtual Double_t FillLikelihoodSurface (TH2D &surface, NuMMParameters mmPars)
 Fills a histogram with likelihood values. This function accepts an arbitrarily binned histogram, and fills the values according to the likelihood. It returns the value of the minimum likelihood. (This does the CC neutirno spectrum).
virtual Double_t FillLikelihoodSurfaceBar (TH2D &surface, NuMMParameters mmPars)
 Fills a histogram with likelihood values. This function accepts an arbitrarily binned histogram, and fills the values according to the likelihood. It returns the value of the minimum likelihood.
virtual Double_t FillLikelihoodSurfaceNSI (TH2D &surface, NuMMParameters mmPars, Int_t ContourPair)
virtual Double_t FillLikelihoodSurfaceNSIBar (TH2D &surface, NuMMParameters mmPars, Int_t ContourPair)
virtual Double_t FillLikelihoodSurfaceNSIDm2Eps (TH2D &surface, NuMMParameters mmPars, TH2D &sinvals)
virtual Double_t FillLikelihoodSurfaceNSISn2Eps (TH2D &surface, NuMMParameters mmPars, TH2D &massvals)
virtual Double_t FillLikelihoodSurfaceNSIDm2Sn2 (TH2D &surface, NuMMParameters mmPars, TH2D &epsvals)
virtual Double_t FillLikelihoodSurfaceNSI3D (TH3D &surface, NuMMParameters mmPars)
virtual Double_t FillLikelihoodSurfaceDecay (TH2D &surface, NuMMParameters mmPars, Int_t ContourPair=1)
virtual Double_t FillLikelihoodSurfaceDecoherence (TH2D &surface, NuMMParameters mmPars, Int_t ContourPair=1)
virtual Double_t FillLikelihoodSurfaceDecoherenceBar (TH2D &surface, NuMMParameters mmPars, Int_t ContourPair=1)
virtual Double_t FillLikelihoodSurfaceCPT (TH2D &surface, NuMMParameters mmPars)
virtual Double_t FillLikelihoodSurfaceSterile (TH2D &surface, NuMMParameters mmPars, Int_t ContourPair)
virtual void BatchModeOn ()
 Supresses much of the usual output.
virtual void QuietModeOn ()
virtual void QuietModeOff ()
virtual void FillCPT (TH2D &surface)
 Fills a 2D histogram that has dimensions Dm2 (Y) and DM2Bar(X). Uses the center of the passed bins.
NuMMParameters FillAlphaBeta (TH2D &J, TH2D &K, const std::string outfilename)

Protected Member Functions

virtual Double_t FillLikelihoodSurfaceGeneric (TH2D &surface, NuMMParameters mmPars)
virtual Double_t FillLikelihoodSurfaceGeneric (TH3D &surface, NuMMParameters mmPars)
NuMMParameters CoarseGridSearch (NuMMParameters mmGrid)
NuMMParameters GridSearch (TH2D &likesurf, NuMMParameters mmGrid, NuMMParameters *Ref=0)
NuMMParameters FineGridSearch (NuMMParameters mmStart)
NuMMParameters CoarseGridSearchNu (NuMMParameters mmGrid)
NuMMParameters GridSearchNu (TH2D &likesurf, NuMMParameters mmGrid, NuMMParameters *Ref=0)
NuMMParameters FineGridSearchNu (NuMMParameters mmStart)
NuMMParameters CoarseGridSearchNSI (NuMMParameters mmGrid)
NuMMParameters GridSearchNSI (TH2D &likesurf, NuMMParameters mmGrid, NuMMParameters *Ref=0)
NuMMParameters FineGridSearchNSI (NuMMParameters mmStart)
NuMMParameters Sn2GridSearch (Double_t Dm2, Double_t Dm2Bar, Int_t resolution=0)
 Does a grid search over sn2/sn2bar, with resolution bins per parameter.

Protected Attributes

Int_t fQuietMode
Double_t fUp
Int_t fNumContourPoints
std::vector< Double_t > fsn2PointsForNeutrinoContour
std::vector< Double_t > fsn2PointsForNeutrinoContourPhysical
std::vector< Double_t > fsn2PointsForNeutrinoContourUnphysical
std::vector< NuMMRun * > * fRuns

Detailed Description

Definition at line 18 of file NuSystFitter.h.


Constructor & Destructor Documentation

NuSystFitter::NuSystFitter (  ) 

Definition at line 29 of file NuSystFitter.cxx.

00030   : fQuietMode(0),
00031     fUp(1.0),
00032     fNumContourPoints(80),
00033     fsn2PointsForNeutrinoContour(),
00034     fsn2PointsForNeutrinoContourPhysical(),
00035     fsn2PointsForNeutrinoContourUnphysical()
00036 {
00037   fRuns = new vector<NuMMRun*>();
00038 
00039   for (Double_t sn2 = 1.0; sn2 > 0.871; sn2 -= 0.02){
00040     fsn2PointsForNeutrinoContourPhysical.push_back(sn2);
00041   }
00042   fsn2PointsForNeutrinoContourPhysical.push_back(0.87);
00043   fsn2PointsForNeutrinoContourPhysical.push_back(0.86);
00044   for (Double_t sn2 = 0.8595; sn2 > 0.7999; sn2 -= 0.0005){
00045     fsn2PointsForNeutrinoContourPhysical.push_back(sn2);
00046   }
00047 
00048   for (Double_t sn2 = 1.0; sn2 < 3; sn2 += 0.02){
00049     fsn2PointsForNeutrinoContourUnphysical.push_back(sn2);
00050   }
00051 
00052   fsn2PointsForNeutrinoContour = fsn2PointsForNeutrinoContourPhysical;
00053 }

NuSystFitter::~NuSystFitter (  )  [virtual]

Definition at line 56 of file NuSystFitter.cxx.

00057 {
00058 }


Member Function Documentation

void NuSystFitter::BatchModeOn (  )  [virtual]

Supresses much of the usual output.

Definition at line 655 of file NuSystFitter.cxx.

References fQuietMode, and QuietModeOn().

Referenced by NuFCFitter::NuFCFitter(), NuFCFitterNSI::NuFCFitterNSI(), NuFCFitterNSINu::NuFCFitterNSINu(), and NuFCFitterNSINubar::NuFCFitterNSINubar().

00656 {
00657   QuietModeOn();
00658   fQuietMode = 2;
00659 }

const TGraph * NuSystFitter::Chi2SliceDm2 ( const NuMMParameters mmPars,
const Int_t  numpoints = 100,
const Double_t  minval = 1e-3,
const Double_t  maxval = 3e-3 
) [virtual]

Definition at line 2187 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), fQuietMode, minimum, and NuMMParameters::VectorParameters().

02188 {
02189         Double_t increment = (maxval - minval) / (Double_t)numpoints;
02190 
02191 
02192         if (!fQuietMode) cout << "Generating Likelyhood surface for dm2" << endl;
02193 
02194         // Set the parameters object
02195         NuMMParameters mmPars(mmParsC);
02196 
02197         // Make the TGraph to fill
02198         TGraph *chisurf = new TGraph(numpoints);
02199         chisurf->SetNameTitle("Chi2Dm2", "#Delta#chi^{2} Surface for #Deltam^{2}");
02200         chisurf->GetXaxis()->SetTitle("#Deltam^{2}");
02201 
02202         Double_t dm2value = 0, like = 0, minimum = 0;
02203 
02204         // We want to scan over the sin2bar surface and generate a likelyhood plot
02205         for (Int_t i = 0; i < numpoints; i++)
02206         {
02207                 dm2value = minval + increment*i;
02208                 mmPars.Dm2(dm2value);
02209 
02210                 // Generate the likelyhood....
02211                 like = (*this)(mmPars.VectorParameters());
02212 
02213                 // Fill the array
02214 //              dm2s[i] = dm2value;
02215 //              likelyhoods[i] = like;
02216 
02217                 chisurf->SetPoint(i, dm2value, like);
02218 
02219                 // Is this the lowest value?
02220                 if (i == 0)
02221                         minimum = like;
02222                 else
02223                         minimum = like < minimum ? like : minimum;
02224         }
02225 
02226         // Offset the data points
02227         for (Int_t i = 0; i < numpoints; i++)
02228         {
02229                 Double_t x, y;
02230                 chisurf->GetPoint(i, x, y);
02231                 chisurf->SetPoint(i, x, y-minimum);
02232         }
02233 
02234         // Now
02235         if (!fQuietMode) cout << "Surface Generation Done." << endl;
02236 
02237         // Return the completed TGraph
02238         return chisurf;
02239 }

const TGraph * NuSystFitter::Chi2SliceDm2bar ( const NuMMParameters mmPars,
const Int_t  numpoints = 100,
const Double_t  minval = 1e-3,
const Double_t  maxval = 3e-3 
) [virtual]

Definition at line 738 of file NuSystFitter.cxx.

References NuMMParameters::Dm2Bar(), fQuietMode, minimum, and NuMMParameters::VectorParameters().

00739 {
00740         Double_t increment = (maxval - minval) / (Double_t)numpoints;
00741 
00742 
00743         if (!fQuietMode) cout << "Generating Likelyhood surface for dm2bar" << endl;
00744 
00745         // Set the parameters object
00746         NuMMParameters mmPars(mmParsC);
00747 
00748         // Make the TGraph to fill
00749         TGraph *chisurf = new TGraph(numpoints);
00750         chisurf->SetNameTitle("Chi2Dm2Bar", "#Delta#chi^{2} Surface for #Delta#barm^{2}");
00751         chisurf->GetXaxis()->SetTitle("#Delta#barm^{2}");
00752 
00753         Double_t dm2value = 0, like = 0, minimum = 0;
00754 
00755         // We want to scan over the sin2bar surface and generate a likelyhood plot
00756         for (Int_t i = 0; i < numpoints; i++)
00757         {
00758                 dm2value = minval + increment*i;
00759                 mmPars.Dm2Bar(dm2value);
00760 
00761                 // Generate the likelyhood....
00762                 like = (*this)(mmPars.VectorParameters());
00763 
00764                 // Fill the array
00765 //              dm2s[i] = dm2value;
00766 //              likelyhoods[i] = like;
00767 
00768                 chisurf->SetPoint(i, dm2value, like);
00769 
00770                 // Is this the lowest value?
00771                 if (i == 0)
00772                         minimum = like;
00773                 else
00774                         minimum = like < minimum ? like : minimum;
00775         }
00776 
00777         // Offset the data points
00778         for (Int_t i = 0; i < numpoints; i++)
00779         {
00780                 Double_t x, y;
00781                 chisurf->GetPoint(i, x, y);
00782                 chisurf->SetPoint(i, x, y-minimum);
00783         }
00784 
00785         // Now
00786         if (!fQuietMode) cout << "Surface Generation Done." << endl;
00787 
00788         // Return the completed TGraph
00789         return chisurf;
00790 }

const TGraph * NuSystFitter::Chi2SliceSin2bar ( const NuMMParameters mmPars,
const Int_t  numpoints = 100,
const Double_t  minval = 0.8,
const Double_t  maxval = 1.2 
) [virtual]

Definition at line 684 of file NuSystFitter.cxx.

References fQuietMode, minimum, NuMMParameters::Sn2Bar(), and NuMMParameters::VectorParameters().

00685 {
00686         Double_t increment = (maxval - minval) / (Double_t)numpoints;
00687 
00688         if (!fQuietMode) cout << "Generating Likelyhood surface for sin2bar" << endl;
00689 
00690         // Set the parameters object
00691         NuMMParameters mmPars(mmParsC);
00692 
00693         Double_t sn2value = 0, like = 0, minimum = 0;
00694 
00695         // Make the TGraph to fill
00696         TGraph *chisurf = new TGraph(numpoints);
00697         chisurf->SetNameTitle("Chi2Sin2Bar", "#Delta#chi^{2} Surface for Sin^{2}2#bar#theta");
00698         chisurf->GetXaxis()->SetTitle("Sin^{2}2#bar#theta");
00699 
00700         // We want to scan over the sin2bar surface and generate a likelyhood plot
00701         for (Int_t i = 0; i < numpoints; i++)
00702         {
00703                 sn2value = minval + increment*i;
00704                 mmPars.Sn2Bar(sn2value);
00705 
00706                 // Generate the likelyhood....
00707                 like = (*this)(mmPars.VectorParameters());
00708 
00709                 // Fill the array
00710                 //sin2s[i] = sn2value;
00711                 //likelyhoods[i] = like;
00712                 chisurf->SetPoint(i, sn2value, like);
00713 
00714                 // Is this the lowest value?
00715                 if (i == 0)
00716                         minimum = like;
00717                 else
00718                         minimum = like < minimum ? like : minimum;
00719         }
00720 
00721         // Offset the data points
00722         for (Int_t i = 0; i < numpoints; i++)
00723         {
00724                 Double_t x, y;
00725                 chisurf->GetPoint(i, x, y);
00726                 chisurf->SetPoint(i, x, y-minimum);
00727         }
00728 
00729         // Now
00730         if (!fQuietMode) cout << "Surface Generation Done." << endl;
00731 
00732         // Return the completed TGraph
00733         return chisurf;
00734 }

const TGraph * NuSystFitter::Chi2ValleyBar ( const NuMMParameters mmPars,
const Int_t  numpoints = 100,
const Double_t  minSin2bar = 0.,
const Double_t  maxSin2bar = 2. 
) [virtual]

Definition at line 793 of file NuSystFitter.cxx.

References NuMMParameters::Dm2Bar(), NuMMParameters::FixDm2(), NuMMParameters::FixDm2Bar(), NuMMParameters::FixNCBackground(), NuMMParameters::FixNorm(), NuMMParameters::FixShwScale(), NuMMParameters::FixSn2(), NuMMParameters::FixSn2Bar(), fQuietMode, Minimise(), minimum, NuMMParameters::MinuitPass(), NuMMParameters::Sn2Bar(), and NuMMParameters::VectorParameters().

00794 {
00795     NuMMParameters mmPars(mmParsC);
00796 
00797     //  mmPars.Dm2Bar(2.5e-3);
00798     // mmPars.Sn2Bar(1.0);
00799     mmPars.FixNorm();
00800     mmPars.FixShwScale();
00801     mmPars.FixNCBackground();
00802     mmPars.FixDm2();
00803     mmPars.FixSn2();
00804     mmPars.FixDm2Bar(false);
00805     mmPars.FixSn2Bar();
00806 
00807     //  Double_t sin2[points], likelyhood[points], mass[points];
00808     Double_t sinval=0, likeval=0, minimum=0;
00809     Double_t interval =  (max - min) / (points -1);;
00810 
00811     if(!fQuietMode) cout << "Generating Valley trace plot..." << endl;
00812 
00813     TGraph *sin2like = new TGraph(points);
00814 
00815     for (Int_t i = 0; i < points; i++) {
00816 
00817         //        cout << endl << "Sin2 " << i+1 << " / " << points << endl;
00818         // Set up the parameter structure
00819         sinval = min + interval*i;
00820         mmPars.Sn2Bar(sinval);
00821 
00822         NuMMParameters mmFit;
00823         if (sinval == 0) {
00824             mmFit = mmPars;
00825         }
00826         else {
00827             // Now, minimize the likelyhood for this value
00828             mmFit = this->Minimise(mmPars);
00829             int failCount = 0;
00830             while (!mmFit.MinuitPass()) {
00831                 if (failCount > 10) break;
00832                 failCount++;
00833                 mmPars.Dm2Bar(mmPars.Dm2Bar()*1.1);
00834                 cout << "Starting at dm2= " << mmPars.Dm2Bar() << endl;
00835                 mmFit = this->Minimise(mmPars);
00836             }
00837             mmPars.Dm2Bar(mmParsC.Dm2Bar());
00838             if (failCount > 10) continue;
00839         }
00840 
00841         likeval = (*this)(mmFit.VectorParameters());
00842         sin2like->SetPoint(i, sinval, likeval);
00843 
00844         // Calculate Minimum
00845         if (i == 0)
00846             minimum = likeval;
00847         else
00848             minimum = likeval < minimum ? likeval : minimum;
00849         //              cout << "Minimum is now " << minimum << endl;
00850     }
00851 
00852     if (!fQuietMode) cout << endl << "Adjusting Graph Minimum" << endl;
00853     // Offset the data points
00854     for (Int_t i = 0; i < points; i++)
00855         {
00856         Double_t x, y;
00857         sin2like->GetPoint(i, x, y);
00858         //              cout << "From: " << x << ", " << y << " to ";
00859         sin2like->SetPoint(i, x, y-minimum);
00860         //              cout << x << ", " << y-minimum << endl;
00861         }
00862 
00863     if (!fQuietMode) {
00864         cout << endl << "Valley trace plot generation completed" << endl;
00865         cout << "   Minimum found was " << minimum << endl;
00866     }
00867 
00868     // Make the graphs
00869     return sin2like;
00870 }

const TGraph * NuSystFitter::Chi2ValleyBarDm2Bar ( const NuMMParameters mmPars,
const Int_t  numpoints = 100,
const Double_t  minDm2bar = 0.,
const Double_t  maxDm2bar = 10e-3 
) [virtual]

Definition at line 873 of file NuSystFitter.cxx.

References NuMMParameters::ConstrainPhysical(), NuMMParameters::Dm2Bar(), NuMMParameters::FixDm2(), NuMMParameters::FixDm2Bar(), NuMMParameters::FixNCBackground(), NuMMParameters::FixNorm(), NuMMParameters::FixShwScale(), NuMMParameters::FixSn2(), NuMMParameters::FixSn2Bar(), fQuietMode, Minimise(), minimum, NuMMParameters::MinuitPass(), NuMMParameters::Sn2Bar(), and NuMMParameters::VectorParameters().

00877 {
00878     NuMMParameters mmPars(mmParsC);
00879 
00880     mmPars.FixNorm();
00881     mmPars.FixShwScale();
00882     mmPars.FixNCBackground();
00883     mmPars.FixDm2();
00884     mmPars.FixSn2();
00885     mmPars.FixDm2Bar();
00886     mmPars.FixSn2Bar(false);
00887     mmPars.ConstrainPhysical();
00888 
00889 
00890     //  Double_t sin2[points], likelyhood[points], mass[points];
00891     Double_t dmval=0, likeval=0, minimum=0;
00892     Double_t interval =  (max - min) / (points -1);;
00893 
00894     if(!fQuietMode) cout << "Generating Valley trace plot for dm2..." << endl;
00895 
00896     TGraph *dm2like = new TGraph(points);
00897     dm2like->SetName("valleyplot_mass");
00898 
00899     for (Int_t i = 0; i < points; i++) {
00900         if (i % 10 == 0) {
00901             cout << i << "/" << points << endl;
00902         }
00903         // Set up the parameter structure
00904         dmval = min + interval*i;
00905         mmPars.Dm2Bar(dmval);
00906 
00907         NuMMParameters mmFit;
00908         if (dmval == 0) {
00909             mmFit = mmPars;
00910         }
00911         else {
00912             // Now, minimize the likelyhood for this value
00913             mmFit = this->Minimise(mmPars);
00914             int failCount = 0;
00915             while (!mmFit.MinuitPass()) {
00916                 if (failCount > 10) break;
00917                 failCount++;
00918                 mmPars.Sn2Bar(mmPars.Sn2Bar()*0.9);
00919                 cout << "Starting at sn2= " << mmPars.Sn2Bar() << endl;
00920                 mmFit = this->Minimise(mmPars);
00921             }
00922             mmPars.Sn2Bar(mmParsC.Sn2Bar());
00923             if (failCount > 10) continue;
00924         }
00925         //NuMMParameters mmFit(mmPars);
00926 
00927         likeval = (*this)(mmFit.VectorParameters());
00928         dm2like->SetPoint(i, dmval, likeval);
00929 
00930         // Calculate Minimum
00931         if (i == 0)
00932             minimum = likeval;
00933         else
00934             minimum = likeval < minimum ? likeval : minimum;
00935     }
00936 
00937     if (!fQuietMode) cout << endl << "Adjusting Graph Minimum" << endl;
00938 
00939     // Offset the data points
00940     for (Int_t i = 0; i < points; i++) {
00941         Double_t x, y;
00942         dm2like->GetPoint(i, x, y);
00943         dm2like->SetPoint(i, x, y-minimum);
00944     }
00945 
00946     if (!fQuietMode) {
00947         cout << endl << "Valley trace plot generation completed" << endl;
00948         cout << "   Minimum found was " << minimum << endl;
00949     }
00950 
00951     return dm2like;
00952 }

const TGraph * NuSystFitter::Chi2ValleyDm2 ( const NuMMParameters mmPars,
const Int_t  numpoints = 100,
const Double_t  minDm2 = 0.,
const Double_t  maxDm2 = 10e-3 
) [virtual]

Definition at line 956 of file NuSystFitter.cxx.

References NuMMParameters::ConstrainPhysical(), NuMMParameters::Dm2(), NuMMParameters::FixDm2(), NuMMParameters::FixDm2Bar(), NuMMParameters::FixNCBackground(), NuMMParameters::FixNorm(), NuMMParameters::FixShwScale(), NuMMParameters::FixSn2Bar(), fQuietMode, Minimise(), minimum, NuUtilities::ProgressBar(), NuMMParameters::ReleaseSn2(), and NuMMParameters::VectorParameters().

00960 {
00961     NuMMParameters mmPars(mmParsC);
00962 
00963     mmPars.FixNorm();
00964     mmPars.FixShwScale();
00965     mmPars.FixNCBackground();
00966     mmPars.FixDm2();
00967     mmPars.ReleaseSn2();
00968     mmPars.FixDm2Bar();
00969     mmPars.FixSn2Bar();
00970     mmPars.ConstrainPhysical();
00971 
00972 
00973     //  Double_t sin2[points], likelyhood[points], mass[points];
00974     Double_t dmval=0, likeval=0, minimum=0;
00975     Double_t interval =  (max - min) / (points -1);;
00976 
00977     if(!fQuietMode) cout << "Generating Valley trace plot for dm2..." << endl;
00978 
00979     TGraph *dm2like = new TGraph(points);
00980     dm2like->SetName("valleyplot_mass");
00981 
00982     for (Int_t i = 0; i < points; i++)
00983     {
00984         // Print a progress bar
00985         NuUtilities::ProgressBar(i, points-1,5);
00986 
00987         // Set up the parameter structure
00988         dmval = min + interval*i;
00989         mmPars.Dm2(dmval);
00990 
00991         // Now, minimize the likelyhood for this value
00992         NuMMParameters mmFit = this->Minimise(mmPars);
00993         //NuMMParameters mmFit(mmPars);
00994 
00995         likeval = (*this)(mmFit.VectorParameters());
00996         dm2like->SetPoint(i, dmval, likeval);
00997 
00998         // Calculate Minimum
00999         if (i == 0)
01000             minimum = likeval;
01001         else
01002             minimum = likeval < minimum ? likeval : minimum;
01003     }
01004 
01005     if (!fQuietMode) cout << endl << "Adjusting Graph Minimum" << endl;
01006 
01007     // Offset the data points
01008     for (Int_t i = 0; i < points; i++)
01009     {
01010         Double_t x, y;
01011         dm2like->GetPoint(i, x, y);
01012         dm2like->SetPoint(i, x, y-minimum);
01013     }
01014 
01015     if (!fQuietMode) {
01016         cout << endl << "Valley trace plot generation completed" << endl;
01017         cout << "   Minimum found was " << minimum << endl;
01018     }
01019 
01020     return dm2like;
01021 }

const TGraph * NuSystFitter::Chi2ValleySn2 ( const NuMMParameters mmPars,
const Int_t  numpoints = 100,
const Double_t  minSn2 = 0.,
const Double_t  maxSn2 = 1. 
) [virtual]

Definition at line 1025 of file NuSystFitter.cxx.

References NuMMParameters::ConstrainPhysical(), NuMMParameters::FixDm2Bar(), NuMMParameters::FixNCBackground(), NuMMParameters::FixNorm(), NuMMParameters::FixShwScale(), NuMMParameters::FixSn2(), NuMMParameters::FixSn2Bar(), fQuietMode, Minimise(), minimum, NuUtilities::ProgressBar(), NuMMParameters::ReleaseDm2(), NuMMParameters::Sn2(), and NuMMParameters::VectorParameters().

01029 {
01030     NuMMParameters mmPars(mmParsC);
01031 
01032     mmPars.FixNorm();
01033     mmPars.FixShwScale();
01034     mmPars.FixNCBackground();
01035     mmPars.ReleaseDm2();
01036     mmPars.FixSn2();
01037     mmPars.FixDm2Bar();
01038     mmPars.FixSn2Bar();
01039     mmPars.ConstrainPhysical();
01040 
01041 
01042     //  Double_t sin2[points], likelyhood[points], mass[points];
01043     Double_t snval=0, likeval=0, minimum=0;
01044     Double_t interval =  (max - min) / (points -1);;
01045 
01046     if(!fQuietMode) cout << "Generating Valley trace plot for sn2..." << endl;
01047 
01048     TGraph *sn2like = new TGraph(points);
01049     sn2like->SetName("valleyplot_sin");
01050 
01051     for (Int_t i = 0; i < points; i++)
01052     {
01053         // Print a progress bar
01054         NuUtilities::ProgressBar(i, points-1,5);
01055 
01056         // Set up the parameter structure
01057         snval = min + interval*i;
01058         mmPars.Sn2(snval);
01059 
01060         // Now, minimize the likelyhood for this value
01061         NuMMParameters mmFit = this->Minimise(mmPars);
01062         //NuMMParameters mmFit(mmPars);
01063 
01064         likeval = (*this)(mmFit.VectorParameters());
01065         sn2like->SetPoint(i, snval, likeval);
01066 
01067         // Calculate Minimum
01068         if (i == 0)
01069             minimum = likeval;
01070         else
01071             minimum = likeval < minimum ? likeval : minimum;
01072     }
01073 
01074     if (!fQuietMode) cout << endl << "Adjusting Graph Minimum" << endl;
01075 
01076     // Offset the data points
01077     for (Int_t i = 0; i < points; i++)
01078     {
01079         Double_t x, y;
01080         sn2like->GetPoint(i, x, y);
01081         sn2like->SetPoint(i, x, y-minimum);
01082     }
01083 
01084     if (!fQuietMode) {
01085         cout << endl << "Valley trace plot generation completed" << endl;
01086         cout << "   Minimum found was " << minimum << endl;
01087     }
01088 
01089     return sn2like;
01090 }

NuMMParameters NuSystFitter::CoarseGridSearch ( NuMMParameters  mmGrid  )  [protected]

Definition at line 1601 of file NuSystFitter.cxx.

References NuMMParameters::Dm2Bar(), MuELoss::e, GridSearch(), Msg::kInfo, MSG, and NuMMParameters::Sn2Bar().

Referenced by FCMinimise().

01602 {
01603   // The width and height of the grid
01604   const Int_t gridWidth = 5;
01605   const Int_t gridHeight = 15;
01606 
01607   // Generate the surface
01608   TH2D likesurf("likesurf", "likesurf", gridWidth, 0.2, 1, gridHeight, 2e-3, 30e-3);
01609   // TH2D likesurf("likesurf", "likesurf", gridWidth, 0.2, 1, 998*10, 2e-3, 1000e-3);
01610   mmGrid = GridSearch(likesurf, mmGrid);
01611   // cout << "Found dm2: " << mmGrid.Dm2Bar() << ", sn2: " << mmGrid.Sn2Bar() << endl;
01612 
01613   // Now do a log search
01614   vector<Double_t> bins;
01615   for (Double_t i = -1.5; i <= -0.; i += 0.1) {
01616     bins.push_back(pow(10, i));
01617   }
01618   Int_t bincount = bins.size()-1;
01619   TH2D logsurf("logsurf", "logsurf", gridWidth, 0.2, 1, bincount, &(bins.front()));
01620   mmGrid = GridSearch(logsurf, mmGrid, &mmGrid);
01621 
01622   // This was code to do a much sparser grid search instead of the log search
01623   // TH2D sparser("sparser", "sparser", gridWidth, 0.2, 1, 400, 30e-3, 1000e-3);
01624   //  mmGrid = GridSearch(sparser, mmGrid, &mmGrid);
01625 
01626   // Output the minimum
01627   MSG("NuSystFitter", Msg::kInfo) << "Coarse grid search found sn2: "
01628     << mmGrid.Sn2Bar() << ", dm: " << mmGrid.Dm2Bar() << '\n';
01629 
01630   return mmGrid;
01631 }

NuMMParameters NuSystFitter::CoarseGridSearchNSI ( NuMMParameters  mmGrid  )  [protected]

Definition at line 1926 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), MuELoss::e, NuMMParameters::Epsilon(), GridSearchNSI(), Msg::kInfo, and MSG.

Referenced by FCMinimiseNSI().

01927 {
01928   // The width and height of the grid
01929   const Int_t gridWidth = 5;
01930   const Int_t gridHeight = 15;
01931 
01932   // Generate the surface
01933   TH2D likesurf("likesurf", "likesurf", gridWidth, 0.01, 0.5, gridHeight, 0e-3, 10e-3);
01934   mmGrid = GridSearchNSI(likesurf, mmGrid);
01935   cout << "Found dm2: " << mmGrid.Dm2() << ", epsilon: " << mmGrid.Epsilon() << endl;
01936 
01937   // Now do a log search
01938   vector<Double_t> bins;
01939   for (Double_t i = -1.5; i <= -0.; i += 0.1) {
01940     bins.push_back(pow(10, i));
01941   }
01942   Int_t bincount = bins.size()-1;
01943   TH2D logsurf("logsurf", "logsurf", gridWidth, 0.01, 0.5, bincount, &(bins.front()));
01944   mmGrid = GridSearchNSI(logsurf, mmGrid, &mmGrid);
01945 
01946   // Output the minimum
01947   MSG("NuSystFitter", Msg::kInfo) << "Coarse grid search found epsilon: "
01948     << mmGrid.Epsilon() << ", dm: " << mmGrid.Dm2() << '\n';
01949 
01950   return mmGrid;
01951 }

NuMMParameters NuSystFitter::CoarseGridSearchNu ( NuMMParameters  mmGrid  )  [protected]

Definition at line 1761 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), MuELoss::e, GridSearchNu(), Msg::kInfo, MSG, and NuMMParameters::Sn2().

Referenced by FCMinimiseNu().

01762 {
01763   // The width and height of the grid
01764   const Int_t gridWidth = 5;
01765   const Int_t gridHeight = 15;
01766   
01767   // Generate the surface
01768   TH2D likesurf("likesurf", "likesurf", gridWidth, 0.2, 1, gridHeight, 2e-3, 30e-3);
01769   // TH2D likesurf("likesurf", "likesurf", gridWidth, 0.2, 1, 998*10, 2e-3, 1000e-3);
01770   mmGrid = GridSearchNu(likesurf, mmGrid);
01771   // cout << "Found dm2: " << mmGrid.Dm2Bar() << ", sn2: " << mmGrid.Sn2Bar() << endl;
01772   
01773   // Now do a log search
01774   vector<Double_t> bins;
01775   for (Double_t i = -1.5; i <= -0.; i += 0.1) {
01776     bins.push_back(pow(10, i));
01777   }
01778   Int_t bincount = bins.size()-1;
01779   TH2D logsurf("logsurf", "logsurf", gridWidth, 0.2, 1, bincount, &(bins.front()));
01780   mmGrid = GridSearchNu(logsurf, mmGrid, &mmGrid);
01781   
01782   // This was code to do a much sparser grid search instead of the log search
01783   // TH2D sparser("sparser", "sparser", gridWidth, 0.2, 1, 400, 30e-3, 1000e-3);
01784   //  mmGrid = GridSearch(sparser, mmGrid, &mmGrid);
01785   
01786   // Output the minimum
01787   MSG("NuSystFitter", Msg::kInfo) << "Coarse grid search found sn2: "
01788   << mmGrid.Sn2() << ", dm: " << mmGrid.Dm2() << endl;
01789   
01790   return mmGrid;
01791 }

const std::pair< Double_t, Double_t > NuSystFitter::DmScanForContour ( const NuMMParameters mmPars,
Double_t  targetChi2 
) [virtual]

Definition at line 362 of file NuSystFitter.cxx.

References NuMMParameters::AreAllParametersFixed(), NuMMParameters::Dm2(), MuELoss::e, NuMMParameters::FixDm2(), NuMMParameters::NCBackgroundScale(), NuMMParameters::Normalisation(), NuMMParameters::ShwEnScale(), NuMMParameters::Sn2(), and NuMMParameters::VectorParameters().

00364 {
00365   std::pair<Double_t,Double_t> errors;
00366 
00367   NuMMParameters bestFitPoint = this->Minimise(mmPars);
00368   Double_t bestFitChi2 = (*this)(bestFitPoint.VectorParameters());
00369   Double_t bestFitDm2 = bestFitPoint.Dm2();
00370 
00371   if (bestFitChi2 > targetChi2){
00372     errors.first = -1.0;
00373     errors.second = -1.0;
00374     return errors;
00375   }
00376 
00377   cout << "Best chi2: " << bestFitChi2
00378        << " at dm2 = " << bestFitDm2
00379        << ", sn2 = " << bestFitPoint.Sn2()
00380        << ", norm = " << bestFitPoint.Normalisation()
00381        << ", NC = " << bestFitPoint.NCBackgroundScale()
00382        << ", shwEn = " << bestFitPoint.ShwEnScale()
00383        << endl
00384        << ". Target chi2: " << targetChi2
00385        << endl;
00386 
00387   for (Int_t direction = -1; direction < 2; direction += 2){
00388 
00389     cout << "Direction = " << direction << endl;
00390 
00391     NuMMParameters scanMMPars = mmPars;
00392     scanMMPars.Dm2(bestFitDm2);
00393     scanMMPars.FixDm2();
00394 
00395     Double_t incrementArray[9] = {0.1e-3,
00396                                   0.03e-3,
00397                                   0.01e-3,
00398                                   0.003e-3,
00399                                   0.001e-3,
00400                                   0.0003e-3,
00401                                   0.0001e-3,
00402                                   0.00003e-3,
00403                                   0.00001e-3};
00404     Double_t firstChi2 = bestFitChi2;
00405     Double_t firstDm2 = bestFitDm2;
00406     Double_t currentChi2 = -1.0;
00407     Double_t lastChi2 = -1.0;
00408     Double_t lastDm2 = -1.0;
00409     for (Int_t incCount = 0; incCount<9; ++incCount){
00410       Double_t increment = incrementArray[incCount];
00411 
00412       currentChi2 = firstChi2;
00413       scanMMPars.Dm2(firstDm2);
00414 
00415       cout << "Starting while with firstChi2 = " << firstChi2
00416            << ", firstDm2 = " << firstDm2
00417            << ", increment = " << increment
00418            << endl;
00419 
00420       while (currentChi2 < targetChi2){
00421         lastChi2 = currentChi2;
00422         lastDm2 = scanMMPars.Dm2();
00423 
00424         scanMMPars.Dm2(scanMMPars.Dm2() + direction*increment);
00425         cout << "Trying dm2 = " << scanMMPars.Dm2() << "... ";
00426         flush(cout);
00427         if (scanMMPars.AreAllParametersFixed()){
00428           currentChi2 = (*this)(scanMMPars.VectorParameters());
00429         }
00430         else{
00431           currentChi2 = (*this)(this->Minimise(scanMMPars).VectorParameters());
00432         }
00433         cout << "chi2 = " << currentChi2 << endl;
00434       }
00435 
00436       firstDm2 = lastDm2;
00437       firstChi2 = lastChi2;
00438 
00439     }
00440 
00441     Double_t chi2Difference = lastChi2 - currentChi2;
00442     Double_t dm2Difference = lastDm2 - scanMMPars.Dm2();
00443     Double_t value = -1.0;
00444     cout << "chi2Difference = " << chi2Difference << endl;
00445     cout << "dm2Difference = " << dm2Difference << endl;
00446     if ((fabs(chi2Difference)<1e-12) || (fabs(dm2Difference)<1e-12)){
00447       cout << "Chi2 or Dm2 difference is zero. Supplying currentChi2."
00448            << endl;
00449       value = scanMMPars.Dm2();
00450     }
00451     else{
00452       Double_t fractionBetween = (targetChi2 - currentChi2)/chi2Difference;
00453       value = fractionBetween*dm2Difference + scanMMPars.Dm2();
00454     }
00455     cout << "Error is between " << lastDm2
00456          << " and " << scanMMPars.Dm2()
00457          << ", with chi2 between " << lastChi2
00458          << " and " << currentChi2
00459          << endl;
00460     cout << "Value is " << value << endl;
00461     if (-1 == direction){errors.first = value;}
00462     if (1 == direction){errors.second = value;}
00463   }
00464 
00465   cout << "Final answer is dm2 = " << bestFitDm2
00466        << " + " << errors.second - bestFitDm2
00467        << " - " << errors.first - bestFitDm2
00468        << endl;
00469   return errors;
00470 }

const NuMMParameters NuSystFitter::FCMinimise ( const NuMMParameters mmPars  )  [virtual]

More robustly minimizes by doing a wide grid search first - same as the FC fitting.

Definition at line 1567 of file NuSystFitter.cxx.

References CoarseGridSearch(), NuMMParameters::Dm2(), NuMMParameters::Dm2Bar(), FineGridSearch(), Msg::kInfo, Minimise(), NuMMParameters::MinuitPass(), MSG, NuMMParameters::Sn2(), and NuMMParameters::Sn2Bar().

Referenced by NuFCFitterNuMuBar::Fit().

01568 {
01569   // Start with a coarse grid search, to seed minuit
01570   const NuMMParameters mmStart = CoarseGridSearch(mmPars);
01571 
01572   // Now run the normal minuit procedure with this as the starting point
01573   NuMMParameters mmFit = Minimise(mmStart);
01574 
01575   // If minuit failed, do a finer grid search around the coarse starting point
01576   // Did minuit succeed?
01577   // if (mmFit.MinuitPass())
01578   // {
01579 
01580   // } else {
01581   if (!mmFit.MinuitPass())
01582   {
01583       // Minuit failed to fit. Use a more intensive grid search,
01584       // starting on the minuit starting point (that we get from
01585       // a grid search)
01586       MSG("NuSystFitter", Msg::kInfo) << "Minuit fit failed. Doing Finer Grid search" << endl;
01587       mmFit = FineGridSearch(mmStart);
01588   } else {
01589       // Tell them what minuit found
01590       MSG("NuSystFitter", Msg::kInfo)
01591         << "Minuit found: dm2: " << mmFit.Dm2()
01592         << " sn2: " << mmFit.Sn2()
01593         << " dm2bar: " << mmFit.Dm2Bar()
01594         << " sn2bar: " << mmFit.Sn2Bar()
01595         << '\n';
01596   }
01597   return mmFit;
01598 }

const NuMMParameters NuSystFitter::FCMinimiseNSI ( const NuMMParameters mmPars  )  [virtual]

Definition at line 1886 of file NuSystFitter.cxx.

References CoarseGridSearchNSI(), NuMMParameters::Dm2(), NuMMParameters::Dm2Bar(), NuMMParameters::Epsilon(), FineGridSearchNSI(), Msg::kInfo, Minimise(), NuMMParameters::MinuitPass(), MSG, NuMMParameters::PrintStatus(), NuMMParameters::Sn2(), and NuMMParameters::Sn2Bar().

01887 {
01888   // Start with a coarse grid search, to seed minuit
01889   mmPars.PrintStatus();
01890   const NuMMParameters mmStart = CoarseGridSearchNSI(mmPars);
01891 
01892   // Now run the normal minuit procedure with this as the starting point
01893   mmStart.PrintStatus();
01894   NuMMParameters mmFit = Minimise(mmStart);
01895 
01896   // Test seeding directly with no coarse search
01897   //NuMMParameters mmFit = Minimise(mmPars);
01898 
01899   // If minuit failed, do a finer grid search around the coarse starting point
01900   // Did minuit succeed?
01901   // if (mmFit.MinuitPass())
01902   // {
01903 
01904   // } else {
01905   if (!mmFit.MinuitPass())
01906   {
01907       // Minuit failed to fit. Use a more intensive grid search,
01908       // starting on the minuit starting point (that we get from
01909       // a grid search)
01910       MSG("NuSystFitter", Msg::kInfo) << "Minuit fit failed. Doing Finer Grid search" << endl;
01911       mmFit = FineGridSearchNSI(mmStart);
01912   } else {
01913       // Tell them what minuit found
01914       MSG("NuSystFitter", Msg::kInfo)
01915         << "Minuit found: dm2: " << mmFit.Dm2()
01916         << " sn2: " << mmFit.Sn2()
01917         << " dm2bar: " << mmFit.Dm2Bar()
01918         << " sn2bar: " << mmFit.Sn2Bar()
01919         << "epsilon: " << mmFit.Epsilon()
01920         << '\n';
01921   }
01922   return mmFit;
01923 }

const NuMMParameters NuSystFitter::FCMinimiseNu ( const NuMMParameters mmPars  )  [virtual]

Definition at line 1727 of file NuSystFitter.cxx.

References CoarseGridSearchNu(), NuMMParameters::Dm2(), NuMMParameters::Dm2Bar(), FineGridSearchNu(), Msg::kInfo, Minimise(), NuMMParameters::MinuitPass(), MSG, NuMMParameters::Sn2(), and NuMMParameters::Sn2Bar().

01728 {
01729   // Start with a coarse grid search, to seed minuit
01730   const NuMMParameters mmStart = CoarseGridSearchNu(mmPars);    
01731   
01732   // Now run the normal minuit procedure with this as the starting point
01733   NuMMParameters mmFit = Minimise(mmStart);
01734   
01735   // If minuit failed, do a finer grid search around the coarse starting point
01736   // Did minuit succeed?
01737   // if (mmFit.MinuitPass())
01738   // {
01739   
01740   // } else {
01741   if (!mmFit.MinuitPass())
01742   {
01743     // Minuit failed to fit. Use a more intensive grid search,
01744     // starting on the minuit starting point (that we get from
01745     // a grid search)
01746     MSG("NuSystFitter", Msg::kInfo) << "Minuit fit failed. Doing Finer Grid search" << endl;
01747     mmFit = FineGridSearchNu(mmStart);
01748   } else {
01749     // Tell them what minuit found
01750     MSG("NuSystFitter", Msg::kInfo)
01751     << "Minuit found: dm2: " << mmFit.Dm2()
01752     << " sn2: " << mmFit.Sn2()
01753     << " dm2bar: " << mmFit.Dm2Bar()
01754     << " sn2bar: " << mmFit.Sn2Bar()
01755     << '\n';
01756   }
01757   return mmFit;
01758 }

NuMMParameters NuSystFitter::FillAlphaBeta ( TH2D &  J,
TH2D &  K,
const std::string  outfilename 
)

Definition at line 2381 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), NuMMParameters::Dm2Bar(), minimum, NuUtilities::ProgressBar(), NuMMParameters::Sn2(), and NuMMParameters::Sn2Bar().

02382 {
02383   // characteristics of each surface
02384   Int_t NpointsJX = J.GetNbinsX();
02385   Int_t NpointsJY = J.GetNbinsY();
02386   Int_t NpointsKX = K.GetNbinsX();
02387   Int_t NpointsKY = K.GetNbinsY();
02388 
02389   Double_t widthX = J.GetXaxis()->GetBinWidth(1);
02390   Double_t widthY = J.GetYaxis()->GetBinWidth(1);
02391 
02392   Double_t minKX = K.GetXaxis()->GetBinCenter(1);
02393   Double_t maxKX = K.GetXaxis()->GetBinCenter(NpointsKX);
02394   Double_t minKY = K.GetYaxis()->GetBinCenter(1);
02395   Double_t maxKY = K.GetYaxis()->GetBinCenter(NpointsKY);
02396 
02397   Double_t minJX = J.GetXaxis()->GetBinCenter(1);
02398   Double_t maxJX = J.GetXaxis()->GetBinCenter(NpointsJX);
02399   Double_t minJY = J.GetYaxis()->GetBinCenter(1);
02400   Double_t maxJY = J.GetYaxis()->GetBinCenter(NpointsJY);
02401 
02402   Double_t minABX = minKX - maxJX + widthX/2;
02403   Double_t maxABX = maxKX - minJX - widthX/2.;
02404   Double_t minABY = minKY - maxJY + widthY/2.;
02405   Double_t maxABY = maxKY - minJY - widthY/2.;
02406 
02407   Int_t NpointsAlpha = (int)((maxABY-minABY)/widthY) + 1;
02408   Int_t NpointsBeta  = (int)((maxABX-minABX)/widthX) + 1;
02409 
02410   // resulting (alpha, beta) surfaces
02411   TH2D *absurf = new TH2D("ab", "(#alpha,#beta) likelihood surface",
02412                           NpointsBeta, minABX, maxABX,
02413                           NpointsAlpha, minABY, maxABY );
02414   absurf->GetXaxis()->SetTitle("#beta");
02415   absurf->GetYaxis()->SetTitle("#alpha");
02416 
02417   TH2D *hDmMin = new TH2D("hDmMin", "Dm2 for Minimum Likehood",
02418                           NpointsBeta, minABX, maxABX,
02419                           NpointsAlpha, minABY, maxABY );
02420   hDmMin->GetXaxis()->SetTitle("#beta");
02421   hDmMin->GetYaxis()->SetTitle("#alpha");
02422 
02423   TH2D *hSnMin = new TH2D("hSnMin", "Sn2 for Minimum Likehood",
02424                           NpointsBeta, minABX, maxABX,
02425                           NpointsAlpha, minABY, maxABY );
02426   hSnMin->GetXaxis()->SetTitle("#beta");
02427   hSnMin->GetYaxis()->SetTitle("#alpha");
02428 
02429   TH2D *hDmMinBar = new TH2D("hDmMinBar", "Dm2Bar for Minimum Likehood",
02430                           NpointsBeta, minABX, maxABX,
02431                           NpointsAlpha, minABY, maxABY );
02432   hDmMinBar->GetXaxis()->SetTitle("#beta");
02433   hDmMinBar->GetYaxis()->SetTitle("#alpha");
02434 
02435   TH2D *hSnMinBar = new TH2D("hSnMinBar", "Sn2Bar for Minimum Likehood",
02436                           NpointsBeta, minABX, maxABX,
02437                           NpointsAlpha, minABY, maxABY );
02438   hSnMinBar->GetXaxis()->SetTitle("#beta");
02439   hSnMinBar->GetYaxis()->SetTitle("#alpha");
02440 
02441   // building the surfaces
02442   Double_t likeTot, minimum;
02443   Double_t dmMin=0, snMin=0, dmMinBar=0, snMinBar=0;
02444 
02445   for (Double_t beta=minABX; beta<=maxABX; beta+=widthX){
02446     Int_t iB = absurf->GetXaxis()->FindFixBin(beta);
02447 
02448     for(Double_t alpha=minABY; alpha<=maxABY; alpha+=widthY){
02449       Int_t iA = absurf->GetYaxis()->FindFixBin(alpha);
02450       minimum = -1;
02451       NuUtilities::ProgressBar(iA*iB, NpointsAlpha*NpointsBeta, 1);
02452 
02453       for(Int_t indexJx=1; indexJx<=NpointsJX; ++indexJx){
02454         for(Int_t indexJy=1; indexJy<=NpointsJY; ++indexJy){
02455 
02456           Double_t xval = J.GetXaxis()->GetBinCenter(indexJx);
02457           Double_t yval = J.GetYaxis()->GetBinCenter(indexJy);
02458 
02459           xval += beta;
02460           if (xval < minKX) continue;
02461           if (xval > maxKX) continue;
02462 
02463           yval += alpha;
02464           if (yval < minKY) continue;
02465           if (yval > maxKY) continue;
02466 
02467           Int_t indexKx = K.GetXaxis()->FindFixBin(xval);
02468           Int_t indexKy = K.GetYaxis()->FindFixBin(yval);
02469           likeTot = J.GetBinContent(indexJx, indexJy) + K.GetBinContent(indexKx, indexKy);
02470 
02471           if ( (minimum==-1) || (likeTot<minimum) ) {
02472             minimum = likeTot;
02473             dmMin    = J.GetYaxis()->GetBinCenter(indexJy);
02474             snMin    = J.GetXaxis()->GetBinCenter(indexJx);
02475             dmMinBar = K.GetYaxis()->GetBinCenter(indexKy);
02476             snMinBar = K.GetXaxis()->GetBinCenter(indexKx);
02477           }
02478         }
02479       }
02480       absurf->SetBinContent(iB, iA, minimum);
02481       hDmMin->SetBinContent(iB, iA, dmMin);
02482       hSnMin->SetBinContent(iB, iA, snMin);
02483       hDmMinBar->SetBinContent(iB, iA, dmMinBar);
02484       hSnMinBar->SetBinContent(iB, iA, snMinBar);
02485     }
02486   }
02487 
02488   // shift by minimum
02489   Int_t minbinX, minbinY, minbinZ;
02490   absurf->GetMinimumBin(minbinX, minbinY, minbinZ);
02491   Double_t minContent = absurf->GetBinContent(minbinX, minbinY);
02492 
02493   for (Int_t iterB=1; iterB<=NpointsBeta; ++iterB){
02494     for (Int_t iterA=1; iterA<=NpointsAlpha; ++iterA){
02495       Double_t content = absurf->GetBinContent(iterB, iterA);
02496       absurf->SetBinContent(iterB, iterA, content-minContent);
02497     }
02498   }
02499 
02500   // min of Alpha Beta surface
02501   Double_t minalpha = absurf->GetYaxis()->GetBinCenter(minbinY);
02502   Double_t minbeta  = absurf->GetXaxis()->GetBinCenter(minbinX);
02503   TGraph *minG = new TGraph(1, &minbeta, &minalpha);
02504 
02505   // save
02506   cout << "Plots saved in " << outfilename.c_str() << endl;
02507   TFile *file = new TFile(outfilename.c_str(), "RECREATE");
02508 
02509   J.Write("J", TObject::kOverwrite);
02510   K.Write("K", TObject::kOverwrite);
02511   absurf->Write("AlphaBeta", TObject::kOverwrite);
02512   hDmMin->Write("dm2Min", TObject::kOverwrite);
02513   hSnMin->Write("sn2Min", TObject::kOverwrite);
02514   hDmMinBar->Write("dm2MinBar", TObject::kOverwrite);
02515   hSnMinBar->Write("sn2MinBar", TObject::kOverwrite);
02516   minG->Write("AlphaBetaMinimum", TObject::kOverwrite);
02517   file->Close(0);
02518 
02519   // done!
02520   NuMMParameters pars;
02521   pars.Dm2( hDmMin->GetBinContent(minbinX, minbinY) );
02522   pars.Sn2( hSnMin->GetBinContent(minbinX, minbinY) );
02523   pars.Dm2Bar( hDmMinBar->GetBinContent(minbinX, minbinY) );
02524   pars.Sn2Bar( hSnMinBar->GetBinContent(minbinX, minbinY) );
02525   return pars;
02526 }

void NuSystFitter::FillCPT ( TH2D &  surface  )  [virtual]

Fills a 2D histogram that has dimensions Dm2 (Y) and DM2Bar(X). Uses the center of the passed bins.

Definition at line 2310 of file NuSystFitter.cxx.

References NuMMParameters::ConstrainPhysical(), MuELoss::e, NuMMParameters::FixDm2(), NuMMParameters::FixDm2Bar(), Msg::kError, Msg::kWarning, Minimise(), minimum, NuMMParameters::MinuitPass(), MSG, NuUtilities::ProgressBar(), NuMMParameters::Sn2(), NuMMParameters::Sn2Bar(), Sn2GridSearch(), and NuMMParameters::VectorParameters().

02311 {
02312   Double_t minimum = 0.0;
02313 
02314   const Double_t bincount = surf.GetNbinsX() * surf.GetNbinsY();
02315 
02316   // Loop over every bin in the histogram
02317   for(Int_t xBin = 1; xBin <= surf.GetNbinsX(); ++xBin) {
02318     for (Int_t yBin = 1; yBin <= surf.GetNbinsY(); ++yBin) {
02319       // Show a progress bar
02320       NuUtilities::ProgressBar(surf.GetNbinsY()*(xBin-1) + yBin, bincount, 5);
02321 
02322       const Double_t dm2 =    surf.GetYaxis()->GetBinCenter(yBin);
02323       const Double_t dm2bar = surf.GetXaxis()->GetBinCenter(xBin);
02324 
02325       // Find the sn2 minimum at this value. First do a grid search
02326       NuMMParameters pars = Sn2GridSearch(dm2, dm2bar);
02327       // Get the likelihood, so we can be certain MINUIT improved the fit
02328       const Double_t likeSparse = (*this)(pars.VectorParameters());
02329 
02330       // Now, minimise from this found point
02331       pars.FixDm2();
02332       pars.FixDm2Bar();
02333       pars.ConstrainPhysical();
02334       NuMMParameters parsFit = Minimise(pars);
02335 
02336       // Handle MINUIT failure
02337       if (!parsFit.MinuitPass()) {
02338         MSG("NuSystFitter",Msg::kWarning)
02339           << "MINUIT fit did not pass when attempting to make Dm2-Dm2Bar plot. " << '\n'
02340           << "Dm2: " << dm2 << ", Dm2Bar: " << dm2bar << '\n'
02341           << "Grid Search returned Sn2: " << pars.Sn2() << ", Sn2Bar: " << pars.Sn2Bar() << '\n'
02342           << "Doing Higher resolution grid search" << endl;
02343         // Just do a higher resolution grid search
02344         parsFit = Sn2GridSearch(dm2, dm2bar, 31);
02345         MSG("NuSystFitter",Msg::kWarning)
02346           << "  Found Sn2: " << parsFit.Sn2() << ", Sn2Bar: " << parsFit.Sn2Bar() << endl;
02347       }
02348 
02349       // We now have a best fit for this point. Get the likelihood
02350       const Double_t like = (*this)(parsFit.VectorParameters());
02351       // Sort out the minimums
02352       if (xBin == 1 && yBin == 1) minimum = like;
02353       if (like < minimum) minimum = like;
02354 
02355       // Validate this found minimum was actually better than the grid search
02356       if (like - likeSparse > 1e-4) {
02357         MSG("NuSystFitter",Msg::kError)
02358           << "Dm2: " << dm2 << ", Dm2Bar: " << dm2bar << '\n'
02359           << "Grid Search  Sn2: " << pars.Sn2() << ", Sn2Bar: " << pars.Sn2Bar() << " = " << likeSparse << '\n'
02360           << "MINUIT Found Sn2: " << parsFit.Sn2() << ", Sn2Bar: " << parsFit.Sn2Bar() << " = " << like << '\n'
02361           << "MINUIT fit was worse than seeding grid search!\n"  << '\n'
02362           << "Since this error is not understood, Skipping this bin." << endl;
02363         continue;
02364       }
02365       // Finally, fill the histogram with this likelihood
02366       surf.SetBinContent(xBin, yBin, like);
02367     }
02368   }
02369 
02370   // Now, shift the whole histogram based on the minimum
02371   for(Int_t xBin = 1; xBin <= surf.GetNbinsX(); ++xBin) {
02372     for (Int_t yBin = 1; yBin <= surf.GetNbinsY(); ++yBin) {
02373       Double_t val = surf.GetBinContent(xBin, yBin);
02374       surf.SetBinContent(xBin, yBin, val-minimum);
02375     }
02376   }
02377 }

Double_t NuSystFitter::FillLikelihoodSurface ( TH2D &  surface,
NuMMParameters  mmPars 
) [virtual]

Fills a histogram with likelihood values. This function accepts an arbitrarily binned histogram, and fills the values according to the likelihood. It returns the value of the minimum likelihood. (This does the CC neutirno spectrum).

Definition at line 1323 of file NuSystFitter.cxx.

References NuMMParameters::ContourForNuMus(), and FillLikelihoodSurfaceGeneric().

Referenced by GridSearchNu().

01325 {
01326   mmPars.ContourForNuMus();
01327   return FillLikelihoodSurfaceGeneric(surface, mmPars);
01328 }

Double_t NuSystFitter::FillLikelihoodSurfaceBar ( TH2D &  surface,
NuMMParameters  mmPars 
) [virtual]

Fills a histogram with likelihood values. This function accepts an arbitrarily binned histogram, and fills the values according to the likelihood. It returns the value of the minimum likelihood.

Definition at line 1332 of file NuSystFitter.cxx.

References NuMMParameters::ContourForNuBars(), and FillLikelihoodSurfaceGeneric().

Referenced by NuFCFitter::Archive(), GridSearch(), NuFCFitter::GridSearch(), LikelihoodSurfaceBar(), and NuFCDelegateArchiver::UseFitter().

01334 {
01335   mmPars.ContourForNuBars();
01336   return FillLikelihoodSurfaceGeneric(surface, mmPars);
01337 }

Double_t NuSystFitter::FillLikelihoodSurfaceCPT ( TH2D &  surface,
NuMMParameters  mmPars 
) [virtual]

Definition at line 1525 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), NuMMParameters::Dm2Bar(), fQuietMode, minimum, NuUtilities::ProgressBar(), NuMMParameters::Sn2(), NuMMParameters::Sn2Bar(), and NuMMParameters::VectorParameters().

01526 {
01527   Double_t minimum = -1;
01528   const int Nx = surface.GetNbinsX();
01529   const int Ny = surface.GetNbinsY();
01530 
01531   for (Int_t x = 1; x <= Nx; x++)
01532   {
01533       for (Int_t y = 1; y <= Ny; y++)
01534       {
01535           mmPars.Sn2(surface.GetXaxis()->GetBinCenter(x));
01536           mmPars.Dm2(surface.GetYaxis()->GetBinCenter(y));
01537           mmPars.Sn2Bar(surface.GetXaxis()->GetBinCenter(x));
01538           mmPars.Dm2Bar(surface.GetYaxis()->GetBinCenter(y));
01539           Double_t likelihood = (*this)(mmPars.VectorParameters());
01540 
01541           surface.SetBinContent(x, y, likelihood);
01542 
01543           // Work out if this is the minimum
01544           if (minimum < 0 || minimum > likelihood) minimum = likelihood;
01545 
01546           // Now print the progress bar unless in "batch mode"
01547           if(fQuietMode < 2) NuUtilities::ProgressBar((x-1)*Ny+y, Nx*Ny, 1);
01548       }
01549   }
01550 
01551   return minimum;
01552 }

Double_t NuSystFitter::FillLikelihoodSurfaceDecay ( TH2D &  surface,
NuMMParameters  mmPars,
Int_t  ContourPair = 1 
) [virtual]

Definition at line 1495 of file NuSystFitter.cxx.

References NuMMParameters::ContourForDecay(), and FillLikelihoodSurfaceGeneric().

01498 {
01499   mmPars.ContourForDecay(ContourPair);
01500   return FillLikelihoodSurfaceGeneric(surface, mmPars);
01501 }

Double_t NuSystFitter::FillLikelihoodSurfaceDecoherence ( TH2D &  surface,
NuMMParameters  mmPars,
Int_t  ContourPair = 1 
) [virtual]

Definition at line 1505 of file NuSystFitter.cxx.

References NuMMParameters::ContourForDecoherence(), and FillLikelihoodSurfaceGeneric().

01508 {
01509   mmPars.ContourForDecoherence(ContourPair);
01510   return FillLikelihoodSurfaceGeneric(surface, mmPars);
01511 }

Double_t NuSystFitter::FillLikelihoodSurfaceDecoherenceBar ( TH2D &  surface,
NuMMParameters  mmPars,
Int_t  ContourPair = 1 
) [virtual]

Definition at line 1515 of file NuSystFitter.cxx.

References NuMMParameters::ContourForDecoherenceBar(), and FillLikelihoodSurfaceGeneric().

01518 {
01519   mmPars.ContourForDecoherenceBar(ContourPair);
01520   return FillLikelihoodSurfaceGeneric(surface, mmPars);
01521 }

Double_t NuSystFitter::FillLikelihoodSurfaceGeneric ( TH3D &  surface,
NuMMParameters  mmPars 
) [protected, virtual]

Definition at line 1258 of file NuSystFitter.cxx.

References NuMMParameters::ContourPars3D(), NuMMParameters::FixParameterByIndex(), fQuietMode, Minimise(), minimum, NuUtilities::ProgressBar(), NuMMParameters::SetParameterByIndex(), and NuMMParameters::VectorParameters().

01260 {
01261   const int Nx = surface.GetNbinsX();
01262   const int Ny = surface.GetNbinsY();
01263   const int Nz = surface.GetNbinsZ();
01264 
01265   TAxis* xax = surface.GetXaxis();
01266   TAxis* yax = surface.GetYaxis();
01267   TAxis* zax = surface.GetZaxis();
01268 
01269   //cout << "Before ContourPars3D()" << endl;
01270 
01271   const int idx1 = mmPars.ContourPars3D()[0];
01272   const int idx2 = mmPars.ContourPars3D()[1];
01273   const int idx3 = mmPars.ContourPars3D()[2];
01274 
01275   //cout << "After ContourPars3D(): idx1= " << idx1
01276   //     << ", idx2= " << idx2 << ", idx3= " << idx3 << endl;
01277 
01278   Double_t minimum = -1;
01279 
01280   // Order loops so same-dmsq go sequentially for usual osc contours. This
01281   // takes full advantage of the cacheing in the oscillation functions
01282   for(int z = 1; z <= Nz; z++){
01283     for(int y = 1; y <= Ny; y++){
01284       for(int x = 1; x <= Nx; x++){
01285         // Now print the progress bar unless in "batch mode"
01286         // Need this new mode to avoid having nothing but
01287         // progress bars in FC log files
01288         if(fQuietMode < 2){
01289           NuUtilities::ProgressBar((z-1)*Ny*Nx+y+x-1, Nx*Ny*Nz, 1);
01290         }
01291         //cout << "Before mmPars.SetParameterByIndex()" << endl;
01292         //cout << "(x, y, z): " << x << ", " << y << ", " << z << endl;
01293         //cout << "xax->GetBinCenter(x): " << xax->GetBinCenter(x)
01294         //     << ", yax->GetBinCenter(y): " << yax->GetBinCenter(y)
01295         //     << ", zax->GetBinCenter(z): " << zax->GetBinCenter(z) << endl;
01296         mmPars.SetParameterByIndex(idx3, xax->GetBinCenter(x));
01297         //cout << "Set parameter idx3: " << idx3 << endl;
01298         mmPars.FixParameterByIndex(idx3);
01299         mmPars.SetParameterByIndex(idx2, zax->GetBinCenter(z));
01300         //cout << "Set parameter idx2: " << idx2 << endl;
01301         mmPars.FixParameterByIndex(idx2);
01302         mmPars.SetParameterByIndex(idx1, yax->GetBinCenter(y));
01303         //cout << "Set parameter idx1: " << idx1 << endl;
01304         mmPars.FixParameterByIndex(idx1);
01305         //cout << "In three for loops about to minimize mmPars" << endl;
01306 
01307         mmPars = Minimise(mmPars);
01308 
01309         const Double_t likelihood = (*this)(mmPars.VectorParameters());
01310         surface.SetBinContent(x, y, z, likelihood);
01311 
01312         // Work out if this is the minimum
01313         if (minimum < 0 || minimum > likelihood) minimum = likelihood;
01314       }
01315     }
01316   }
01317   cout << "minimum is: " << minimum << endl;
01318   return minimum;
01319 }

Double_t NuSystFitter::FillLikelihoodSurfaceGeneric ( TH2D &  surface,
NuMMParameters  mmPars 
) [protected, virtual]

Helper function. Fills a likelihood surface based on the parameters as defined by NuMMParameters::ContourPars()

Definition at line 1207 of file NuSystFitter.cxx.

References NuMMParameters::ContourPars(), NuMMParameters::FixParameterByIndex(), fQuietMode, Minimise(), minimum, NuUtilities::ProgressBar(), NuMMParameters::SetParameterByIndex(), and NuMMParameters::VectorParameters().

Referenced by FillLikelihoodSurface(), FillLikelihoodSurfaceBar(), FillLikelihoodSurfaceDecay(), FillLikelihoodSurfaceDecoherence(), FillLikelihoodSurfaceDecoherenceBar(), FillLikelihoodSurfaceNSI(), FillLikelihoodSurfaceNSI3D(), FillLikelihoodSurfaceNSIBar(), and FillLikelihoodSurfaceSterile().

01209 {
01210 
01211   NuMMParameters surfPars;
01212 
01213   const int Nx = surface.GetNbinsX();
01214   const int Ny = surface.GetNbinsY();
01215 
01216   TAxis* xax = surface.GetXaxis();
01217   TAxis* yax = surface.GetYaxis();
01218 
01219   const int idx1 = mmPars.ContourPars().first;
01220   const int idx2 = mmPars.ContourPars().second;
01221 
01222   Double_t minimum = -1;
01223 
01224   // Order loops so same-dmsq go sequentially for usual osc contours. This
01225   // takes full advantage of the cacheing in the oscillation functions
01226   for(int y = 1; y <= Ny; y++){
01227     for(int x = 1; x <= Nx; x++){
01228       // Now print the progress bar unless in "batch mode"
01229       // Need this new mode to avoid having nothing but
01230       // progress bars in FC log files
01231       if(fQuietMode < 2){
01232         NuUtilities::ProgressBar((y-1)*Nx+x, Nx*Ny, 1);
01233       }
01234 
01235       surfPars = mmPars;
01236 
01237       surfPars.SetParameterByIndex(idx2, xax->GetBinCenter(x));
01238       surfPars.FixParameterByIndex(idx2);
01239       surfPars.SetParameterByIndex(idx1, yax->GetBinCenter(y));
01240       surfPars.FixParameterByIndex(idx1);
01241 
01242       surfPars = Minimise(surfPars);
01243 
01244       const Double_t likelihood = (*this)(surfPars.VectorParameters());
01245 
01246       surface.SetBinContent(x, y, likelihood);
01247 
01248       // Work out if this is the minimum
01249       if (minimum < 0 || minimum > likelihood) minimum = likelihood;
01250     }
01251   }
01252 
01253   return minimum;
01254 }

Double_t NuSystFitter::FillLikelihoodSurfaceNSI ( TH2D &  surface,
NuMMParameters  mmPars,
Int_t  ContourPair 
) [virtual]

Definition at line 1339 of file NuSystFitter.cxx.

References NuMMParameters::ContourForNSI(), and FillLikelihoodSurfaceGeneric().

Referenced by NuFCFitterNSINu::Archive(), NuFCFitterNSINu::GridSearch(), and GridSearchNSI().

01342 {
01343   mmPars.ContourForNSI(ContourPair);
01344   return FillLikelihoodSurfaceGeneric(surface, mmPars);
01345 
01346 }

Double_t NuSystFitter::FillLikelihoodSurfaceNSI3D ( TH3D &  surface,
NuMMParameters  mmPars 
) [virtual]

Definition at line 1359 of file NuSystFitter.cxx.

References NuMMParameters::ContourForNSI(), and FillLikelihoodSurfaceGeneric().

Referenced by NuFCFitterNSI::Archive(), and NuFCFitterNSI::GridSearch().

01361 {
01362   mmPars.ContourForNSI();
01363   //  cout << "Set contours for NSI: ContourPars3D()[0]= " << mmPars.ContourPars3D()[0]
01364   //     << ", ContourPars3D()[1]= " << mmPars.ContourPars3D()[1]
01365   //     << ", ContourPars3D()[2]= " << mmPars.ContourPars3D()[2]
01366   //     << endl;
01367   return FillLikelihoodSurfaceGeneric(surface, mmPars);
01368 
01369 }

Double_t NuSystFitter::FillLikelihoodSurfaceNSIBar ( TH2D &  surface,
NuMMParameters  mmPars,
Int_t  ContourPair 
) [virtual]

Definition at line 1349 of file NuSystFitter.cxx.

References NuMMParameters::ContourForNSIBar(), and FillLikelihoodSurfaceGeneric().

Referenced by NuFCFitterNSINubar::Archive(), and NuFCFitterNSINubar::GridSearch().

01352 {
01353   mmPars.ContourForNSIBar(ContourPair);
01354   return FillLikelihoodSurfaceGeneric(surface, mmPars);
01355 
01356 }

Double_t NuSystFitter::FillLikelihoodSurfaceNSIDm2Eps ( TH2D &  surface,
NuMMParameters  mmPars,
TH2D &  sinvals 
) [virtual]

Definition at line 1374 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), NuMMParameters::Epsilon(), NuMMParameters::FixDm2(), NuMMParameters::FixEpsilon(), fQuietMode, Likelihood(), Minimise(), minimum, NuUtilities::ProgressBar(), and NuMMParameters::Sn2().

01377 {
01378  
01379   Int_t Neps = surface.GetNbinsX();
01380   Int_t Ndm2 = surface.GetNbinsY();
01381 
01382   Double_t minimum = 1e6;
01383 
01384   for (int i = 1; i <= Neps; i++){
01385     for (int j = 1; j <= Ndm2; j++){
01386 
01387       if(fQuietMode < 2){
01388         NuUtilities::ProgressBar((i-1)*Ndm2+j, Ndm2*Neps, 1);
01389       }
01390 
01391       Double_t eps = surface.GetXaxis()->GetBinCenter(i);
01392       Double_t dm2 = surface.GetYaxis()->GetBinCenter(j);
01393       mmPars.Dm2(dm2);
01394       mmPars.Epsilon(eps);
01395       mmPars.FixDm2();
01396       mmPars.FixEpsilon();
01397 
01398       NuMMParameters bf = this->Minimise(mmPars);
01399       Double_t likelihood = Likelihood(bf);
01400       Double_t sn2Min = bf.Sn2();
01401 
01402       surface.SetBinContent(i, j, likelihood);
01403       sinvals.SetBinContent(i, j, sn2Min);
01404       if(likelihood < minimum) minimum = likelihood;      
01405     }
01406   }
01407 
01408   return minimum;
01409 }

Double_t NuSystFitter::FillLikelihoodSurfaceNSIDm2Sn2 ( TH2D &  surface,
NuMMParameters  mmPars,
TH2D &  epsvals 
) [virtual]

Definition at line 1454 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), NuMMParameters::Epsilon(), NuMMParameters::FixDm2(), NuMMParameters::FixSn2(), fQuietMode, Likelihood(), Minimise(), minimum, NuUtilities::ProgressBar(), and NuMMParameters::Sn2().

01457 {
01458  
01459   Int_t Nsn2 = surface.GetNbinsX();
01460   Int_t Ndm2 = surface.GetNbinsY();
01461 
01462   Double_t minimum = 1e6;
01463 
01464   for (int i = 1; i <= Nsn2; i++){
01465     for (int j = 1; j <= Ndm2; j++){
01466 
01467       if(fQuietMode < 2){
01468         NuUtilities::ProgressBar((i-1)*Ndm2+j, Ndm2*Nsn2, 1);
01469       }
01470 
01471       Double_t sn2 = surface.GetXaxis()->GetBinCenter(i);
01472       Double_t dm2 = surface.GetYaxis()->GetBinCenter(j);
01473       mmPars.Dm2(dm2);
01474       mmPars.Sn2(sn2);
01475       mmPars.FixDm2();
01476       mmPars.FixSn2();
01477 
01478       NuMMParameters bf = this->Minimise(mmPars);
01479       Double_t likelihood = Likelihood(bf);
01480       Double_t epsMin = bf.Epsilon();
01481       
01482       surface.SetBinContent(i, j, likelihood);
01483       epsvals.SetBinContent(i, j, epsMin);
01484 
01485       if(likelihood < minimum) minimum = likelihood;      
01486     }
01487   }
01488 
01489   return minimum;
01490 }

Double_t NuSystFitter::FillLikelihoodSurfaceNSISn2Eps ( TH2D &  surface,
NuMMParameters  mmPars,
TH2D &  massvals 
) [virtual]

Definition at line 1413 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), NuMMParameters::Epsilon(), NuMMParameters::FixEpsilon(), NuMMParameters::FixSn2(), fQuietMode, Likelihood(), Minimise(), minimum, NuUtilities::ProgressBar(), and NuMMParameters::Sn2().

01416 {
01417  
01418   Int_t Neps = surface.GetNbinsX();
01419   Int_t Nsn2 = surface.GetNbinsY();
01420 
01421   Double_t minimum = 1e6;
01422 
01423   for (int i = 1; i <= Neps; i++){
01424     for (int j = 1; j <= Nsn2; j++){
01425 
01426       if(fQuietMode < 2){
01427         NuUtilities::ProgressBar((i-1)*Nsn2+j, Nsn2*Neps, 1);
01428       }
01429 
01430       Double_t eps = surface.GetXaxis()->GetBinCenter(i);
01431       Double_t sn2 = surface.GetYaxis()->GetBinCenter(j);
01432       mmPars.Sn2(sn2);
01433       mmPars.Epsilon(eps);
01434       mmPars.FixSn2();
01435       mmPars.FixEpsilon();
01436 
01437       NuMMParameters bf = this->Minimise(mmPars);
01438       Double_t likelihood = Likelihood(bf);
01439       Double_t dm2Min = bf.Dm2();
01440 
01441       surface.SetBinContent(i, j, likelihood);
01442       massvals.SetBinContent(i, j, dm2Min);
01443 
01444       if(likelihood < minimum) minimum = likelihood;      
01445     }
01446   }
01447 
01448   return minimum;
01449 }

Double_t NuSystFitter::FillLikelihoodSurfaceSterile ( TH2D &  surface,
NuMMParameters  mmPars,
Int_t  ContourPair 
) [virtual]

Definition at line 1555 of file NuSystFitter.cxx.

References NuMMParameters::ContourForSterile(), and FillLikelihoodSurfaceGeneric().

01556                                                                        {
01557   mmPars.ContourForSterile(ContourPair);
01558   return FillLikelihoodSurfaceGeneric(surface, mmPars);
01559 }

NuMMParameters NuSystFitter::FineGridSearch ( NuMMParameters  mmStart  )  [protected]

Definition at line 1634 of file NuSystFitter.cxx.

References NuMMParameters::Dm2Bar(), MuELoss::e, GridSearch(), Msg::kInfo, NuMMParameters::LowerDm2BarLimit(), NuMMParameters::LowerSn2BarLimit(), MSG, and NuMMParameters::Sn2Bar().

Referenced by FCMinimise().

01635 {
01636   // Calculate the location of the fine grid search
01637   Double_t gridL, gridR, gridT, gridB;
01638   gridL = gridR = gridT = gridB = -1.0;
01639 
01640   // Go +- 0.2 in sin space
01641   gridL = mmStart.Sn2Bar() - 0.2;
01642   gridR = gridL + 0.4;
01643   // Now limit it to the physical realm
01644   if (gridL <= mmStart.LowerSn2BarLimit()) gridL = mmStart.LowerSn2BarLimit();
01645   if (gridR > 1.0) gridR = 1.0;
01646 
01647   // And go +-2e-3 in mass space
01648   gridB = mmStart.Dm2Bar() - 2e-3;
01649   gridT = gridB + 4e-3;
01650   // We only really need to worry about lower limit here
01651   if (gridB <= mmStart.LowerDm2BarLimit()) gridB = mmStart.LowerSn2BarLimit();
01652 
01653 
01654   MSG("NuSystFitter", Msg::kInfo)
01655     << "Doing fine grid search on sin = [ "
01656     << gridL << ", " << gridR << " ]\n"
01657     << "                              dm  = [ "
01658     << gridB << ", " << gridT << " ]\n";
01659 
01660   // Ensure that we haven't done anything stupid like set low above high
01661   if (gridL >= gridR || gridT <= gridB) {
01662 //      cout << "Error: Negative range in fine grid search" << endl;
01663       throw runtime_error("Negative range in fine grid search");
01664   }
01665 
01666   // Make the surface
01667 
01668   // The width and height of the grid
01669   const Int_t gridWidth = 19;
01670   const Int_t gridHeight = 19;
01671 
01672   // Generate the surface
01673   TH2D likesurf("likesurf", "likesurf", gridWidth, gridL, gridR,
01674     gridHeight, gridB, gridT);
01675 
01676   // And now do a grid search on this
01677   NuMMParameters mmGrid = GridSearch(likesurf, mmStart);
01678 
01679   // Output the minimum
01680   MSG("NusystFitter", Msg::kInfo) << "Fine grid search found sn2bar: "
01681     << mmGrid.Sn2Bar() << ", dm2bar: " << mmGrid.Dm2Bar() << '\n';
01682 
01683   return mmGrid;
01684 }

NuMMParameters NuSystFitter::FineGridSearchNSI ( NuMMParameters  mmStart  )  [protected]

Definition at line 1954 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), MuELoss::e, NuMMParameters::Epsilon(), GridSearchNSI(), Msg::kInfo, NuMMParameters::LowerDm2Limit(), NuMMParameters::LowerEpsilonLimit(), and MSG.

Referenced by FCMinimiseNSI().

01955 {
01956   // Calculate the location of the fine grid search
01957   Double_t gridL, gridR, gridT, gridB;
01958   gridL = gridR = gridT = gridB = -1.0;
01959 
01960 //   // Go +- 0.2 in sin space
01961 //   gridL = mmStart.Sn2Bar() - 0.2;
01962 //   gridR = gridL + 0.4;
01963 //   // Now limit it to the physical realm
01964 //   if (gridL <= mmStart.LowerSn2BarLimit()) gridL = mmStart.LowerSn2BarLimit();
01965 //   if (gridR > 1.0) gridR = 1.0;
01966 
01967   // And go +-2e-3 in mass space
01968   gridB = mmStart.Dm2() - 2e-3;
01969   gridT = gridB + 4e-3;
01970   // We only really need to worry about lower limit here
01971   if (gridB <= mmStart.LowerDm2Limit()) gridB = mmStart.LowerDm2Limit();
01972 
01973   // Go +- 0.2 in epsilon space
01974   gridL = mmStart.Epsilon() - 0.2;
01975   gridR = gridL + 0.4;
01976   // Now limit it to the physical realm
01977   if (gridL <= mmStart.LowerEpsilonLimit()) gridL = mmStart.LowerEpsilonLimit();
01978 
01979   MSG("NuSystFitter", Msg::kInfo)
01980     << "Doing fine grid search on eps = [ "
01981     << gridL << ", " << gridR << " ]\n"
01982     << "                              dm  = [ "
01983     << gridB << ", " << gridT << " ]\n";
01984 
01985   // Ensure that we haven't done anything stupid like set low above high
01986   if (gridL >= gridR || gridT <= gridB) {
01987 //      cout << "Error: Negative range in fine grid search" << endl;
01988       throw runtime_error("Negative range in fine grid search");
01989   }
01990 
01991   // Make the surface
01992 
01993   // The width and height of the grid
01994   const Int_t gridWidth = 19;
01995   const Int_t gridHeight = 19;
01996 
01997   // Generate the surface
01998   TH2D likesurf("likesurf", "likesurf", gridWidth, gridL, gridR,
01999     gridHeight, gridB, gridT);
02000 
02001   // And now do a grid search on this
02002   NuMMParameters mmGrid = GridSearchNSI(likesurf, mmStart);
02003 
02004   // Output the minimum
02005   MSG("NusystFitter", Msg::kInfo) << "Fine grid search found epsilon: "
02006     << mmGrid.Epsilon() << ", dm2: " << mmGrid.Dm2() << '\n';
02007 
02008   return mmGrid;
02009 }

NuMMParameters NuSystFitter::FineGridSearchNu ( NuMMParameters  mmStart  )  [protected]

Definition at line 1794 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), NuMMParameters::Dm2Bar(), MuELoss::e, GridSearchNu(), Msg::kInfo, NuMMParameters::LowerDm2BarLimit(), NuMMParameters::LowerSn2BarLimit(), MSG, NuMMParameters::Sn2(), and NuMMParameters::Sn2Bar().

Referenced by FCMinimiseNu().

01795 {
01796   // Calculate the location of the fine grid search
01797   Double_t gridL, gridR, gridT, gridB;
01798   gridL = gridR = gridT = gridB = -1.0;
01799   
01800   // Go +- 0.2 in sin space
01801   gridL = mmStart.Sn2Bar() - 0.2;
01802   gridR = gridL + 0.4;
01803   // Now limit it to the physical realm
01804   if (gridL <= mmStart.LowerSn2BarLimit()) gridL = mmStart.LowerSn2BarLimit();
01805   if (gridR > 1.0) gridR = 1.0;
01806   
01807   // And go +-2e-3 in mass space
01808   gridB = mmStart.Dm2Bar() - 2e-3;
01809   gridT = gridB + 4e-3;
01810   // We only really need to worry about lower limit here
01811   if (gridB <= mmStart.LowerDm2BarLimit()) gridB = mmStart.LowerSn2BarLimit();
01812   
01813   
01814   MSG("NuSystFitter", Msg::kInfo) 
01815   << "Doing fine grid search on sin = [ "
01816   << gridL << ", " << gridR << " ]\n"
01817   << "                              dm  = [ "
01818   << gridB << ", " << gridT << " ]\n";
01819   
01820   // Ensure that we haven't done anything stupid like set low above high
01821   if (gridL >= gridR || gridT <= gridB) {
01822     //      cout << "Error: Negative range in fine grid search" << endl;
01823     throw runtime_error("Negative range in fine grid search");
01824   }
01825   
01826   // Make the surface
01827   
01828   // The width and height of the grid
01829   const Int_t gridWidth = 19;
01830   const Int_t gridHeight = 19;
01831   
01832   // Generate the surface
01833   TH2D likesurf("likesurf", "likesurf", gridWidth, gridL, gridR,
01834                 gridHeight, gridB, gridT);
01835   
01836   // And now do a grid search on this
01837   NuMMParameters mmGrid = GridSearchNu(likesurf, mmStart);
01838   
01839   // Output the minimum
01840   MSG("NusystFitter", Msg::kInfo) << "Fine grid search found sn2: "
01841   << mmGrid.Sn2() << ", dm2: " << mmGrid.Dm2() << '\n';
01842   
01843   return mmGrid;
01844 }

NuMMParameters NuSystFitter::GridSearch ( TH2D &  likesurf,
NuMMParameters  mmGrid,
NuMMParameters Ref = 0 
) [protected]

Definition at line 1687 of file NuSystFitter.cxx.

References NuMMParameters::Dm2Bar(), FillLikelihoodSurfaceBar(), Msg::kDebug, MAXMSG, NuMMParameters::Sn2Bar(), and NuMMParameters::VectorParameters().

Referenced by CoarseGridSearch(), and FineGridSearch().

01688 {
01689     Double_t likelihood = FillLikelihoodSurfaceBar(likesurf, mmGrid);
01690 
01691     // Find the point on this surface that is minimum
01692     Int_t minbinX = 0, minbinY = 0, minbinZ = 0;
01693     likesurf.GetMinimumBin(minbinX, minbinY, minbinZ);
01694     Double_t minsin = likesurf.GetXaxis()->GetBinCenter(minbinX);
01695     Double_t minmass = likesurf.GetYaxis()->GetBinCenter(minbinY);
01696 
01697     // Check the zero point, to see if it is lower than anything else on the grid
01698     mmGrid.Sn2Bar(0);
01699     mmGrid.Dm2Bar(0);
01700     Double_t zeropoint = (*this)(mmGrid.VectorParameters());
01701     if (zeropoint < likelihood) {
01702         // Then the no-oscillation case is the minimum
01703         minsin = 0.0;
01704         minmass = 0.0;
01705     }
01706 
01707     // If we have been given a reference point, check to see if this is lower
01708     if (Ref) {
01709       Double_t refpoint = (*this)(Ref->VectorParameters());
01710       if (refpoint < likelihood) {
01711         MAXMSG("NuSystFitter", 5, Msg::kDebug) << "Reference point is lower than grid search" << endl;
01712         minsin = Ref->Sn2Bar();
01713         minmass = Ref->Dm2Bar();
01714       }
01715     }
01716 
01717     // Set mmPars to the newly found point, then return it
01718     mmGrid.Sn2Bar(minsin);
01719     mmGrid.Dm2Bar(minmass);
01720 
01721     return mmGrid;
01722 }

NuMMParameters NuSystFitter::GridSearchNSI ( TH2D &  likesurf,
NuMMParameters  mmGrid,
NuMMParameters Ref = 0 
) [protected]

Definition at line 2012 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), NuMMParameters::Epsilon(), FillLikelihoodSurfaceNSI(), Msg::kDebug, MAXMSG, and NuMMParameters::VectorParameters().

Referenced by CoarseGridSearchNSI(), and FineGridSearchNSI().

02013 {
02014   Double_t likelihood = FillLikelihoodSurfaceNSI(likesurf, mmGrid, 1);
02015 
02016     // Find the point on this surface that is minimum
02017     Int_t minbinX = 0, minbinY = 0, minbinZ = 0;
02018     likesurf.GetMinimumBin(minbinX, minbinY, minbinZ);
02019     Double_t mineps = likesurf.GetXaxis()->GetBinCenter(minbinX);
02020     Double_t minmass = likesurf.GetYaxis()->GetBinCenter(minbinY);
02021 
02022     // Check the zero point, to see if it is lower than anything else on the grid
02023     mmGrid.Epsilon(0);
02024     mmGrid.Dm2(0);
02025     Double_t zeropoint = (*this)(mmGrid.VectorParameters());
02026     if (zeropoint < likelihood) {
02027         // Then the no-oscillation case is the minimum
02028         mineps = 0.0;
02029         minmass = 0.0;
02030     }
02031 
02032     // If we have been given a reference point, check to see if this is lower
02033     if (Ref) {
02034       Double_t refpoint = (*this)(Ref->VectorParameters());
02035       if (refpoint < likelihood) {
02036         MAXMSG("NuSystFitter", 5, Msg::kDebug) << "Reference point is lower than grid search" << endl;
02037         mineps = Ref->Epsilon();
02038         minmass = Ref->Dm2();
02039       }
02040     }
02041 
02042     // Set mmPars to the newly found point, then return it
02043     mmGrid.Epsilon(mineps);
02044     mmGrid.Dm2(minmass);
02045 
02046     return mmGrid;
02047 }

NuMMParameters NuSystFitter::GridSearchNu ( TH2D &  likesurf,
NuMMParameters  mmGrid,
NuMMParameters Ref = 0 
) [protected]

Definition at line 1847 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), FillLikelihoodSurface(), Msg::kDebug, MAXMSG, NuMMParameters::Sn2(), and NuMMParameters::VectorParameters().

Referenced by CoarseGridSearchNu(), and FineGridSearchNu().

01848 {
01849   Double_t likelihood = FillLikelihoodSurface(likesurf, mmGrid);
01850   
01851   // Find the point on this surface that is minimum
01852   Int_t minbinX = 0, minbinY = 0, minbinZ = 0;
01853   likesurf.GetMinimumBin(minbinX, minbinY, minbinZ);
01854   Double_t minsin = likesurf.GetXaxis()->GetBinCenter(minbinX);
01855   Double_t minmass = likesurf.GetYaxis()->GetBinCenter(minbinY);
01856   
01857   // Check the zero point, to see if it is lower than anything else on the grid
01858   mmGrid.Sn2(0);
01859   mmGrid.Dm2(0);
01860   Double_t zeropoint = (*this)(mmGrid.VectorParameters());
01861   if (zeropoint < likelihood) {
01862     // Then the no-oscillation case is the minimum
01863     minsin = 0.0;
01864     minmass = 0.0;
01865   }
01866   
01867   // If we have been given a reference point, check to see if this is lower
01868   if (Ref) {
01869     Double_t refpoint = (*this)(Ref->VectorParameters());
01870     if (refpoint < likelihood) {
01871       MAXMSG("NuSystFitter", 5, Msg::kDebug) << "Reference point is lower than grid search" << endl;
01872       minsin = Ref->Sn2();
01873       minmass = Ref->Dm2();
01874     }
01875   }
01876   
01877   // Set mmPars to the newly found point, then return it
01878   mmGrid.Sn2(minsin);
01879   mmGrid.Dm2(minmass);
01880   
01881   return mmGrid;
01882 }

double NuSystFitter::Likelihood ( const NuMMParameters mmPars  )  const [virtual]

Definition at line 635 of file NuSystFitter.cxx.

References fQuietMode, fRuns, and NuMMParameters::PenaltyTerm().

Referenced by NuABFitter::DeltaChi(), NuABFitter::DoOutput(), NuABFitter::FillLikelihoodSurfaceAB(), FillLikelihoodSurfaceNSIDm2Eps(), FillLikelihoodSurfaceNSIDm2Sn2(), FillLikelihoodSurfaceNSISn2Eps(), NuFCFitterNuMuBar::Fit(), operator()(), NuABFitter::RecoverNegativeDeltaChi(), and NuFCDelegateArchiver::UseFitter().

00636 {
00637     Double_t likelihood = 0.0;
00638     for (std::vector<NuMMRun*>::iterator runIt = fRuns->begin();
00639          fRuns->end() != runIt;
00640          ++runIt){
00641       likelihood += (*runIt)->ComparePredWithData(mmPars);
00642     }
00643     if (!fQuietMode){
00644         cout << "Stats likelihood: " << likelihood;
00645     }
00646     likelihood += mmPars.PenaltyTerm();
00647     if (!fQuietMode){
00648         cout << " + penalty = " << likelihood << endl;
00649     }
00650 
00651     return likelihood;
00652 }

TH2D * NuSystFitter::LikelihoodSurfaceBar ( const NuMMParameters mmPars,
Int_t  sinPoints,
Int_t  massPoints,
Double_t  Sn2BarMin = 0.0,
Double_t  Sn2BarMax = 1.0,
Double_t  Dm2BarMin = 0.0,
Double_t  Dm2BarMax = 12e-3,
Bool_t  True_Minimum = true 
) [virtual]

Function to generate a likelihood surface.

Definition at line 1094 of file NuSystFitter.cxx.

References NuMMParameters::Dm2Bar(), FillLikelihoodSurfaceBar(), fQuietMode, Minimise(), minimum, NuMMParameters::MinuitPass(), NuMMParameters::Sn2Bar(), and NuMMParameters::VectorParameters().

01102 {
01103     // Calculate the bin spacing. This is -1 because we want to 'add'
01104     // one bin outside of the specified range, so that the bin contents
01105     // are representative of the center of the bin.
01106     Double_t sininterval =  (sn2BarMax - sn2BarMin) / (sinPoints -1);
01107     Double_t massinterval = (dm2BarMax - dm2BarMin) / (massPoints - 1);
01108 
01109     // Offsets. This is how much to shift the bins min and max by
01110     Double_t sinoffset = sininterval / 2.0;
01111     Double_t massoffset = massinterval / 2.0;
01112     // Create the destination histogram
01113     TH2D *surface = new TH2D(   "chisurf", "#chi^{2} Likelihood Surface",
01114                                 sinPoints, sn2BarMin-sinoffset, sn2BarMax+sinoffset,
01115                                 massPoints, dm2BarMin-massoffset, dm2BarMax+massoffset );
01116     // Set it up
01117     surface->GetXaxis()->SetTitle("sin^{2}2#bar#theta");
01118     surface->GetYaxis()->SetTitle("#Delta#barm^{2}");
01119 
01120     // A variable to store the minimum likelihood encountered
01121     // Double_t minimum = -1;
01122 
01123     // Make a copy of the parameters
01124     NuMMParameters mmPars(mmParsIn);
01125 
01126     // Variables to store the current value. These are declared here
01127     // so that we can verify we have counted them correctly after the
01128     // looping ends.
01129     // Double_t sinVal = 0., dmVal = 0.;
01130 
01131     if (!fQuietMode) cout << "Generating Likelihood Surface..." << endl;
01132 
01133     Double_t minimum = this->FillLikelihoodSurfaceBar(*surface, mmPars);
01134 
01135     // // Now, start looping over the surface
01136     // for (Int_t sinBin = 1; sinBin <= sinPoints; sinBin++)
01137     // {
01138     //     // Calculate and set this sin (bin 0 starts at -sinoffset but
01139     //     // we want it to contain the value at 0)
01140     //     sinVal = sn2BarMin + sininterval*(sinBin-1);
01141     //     mmPars.Sn2Bar(sinVal);
01142     //
01143     //     for (Int_t massBin = 1; massBin <= massPoints; massBin++)
01144     //     {
01145     //         // Calculate and set the dmass value
01146     //         dmVal = dm2BarMin + massinterval*(massBin-1);
01147     //         mmPars.Dm2Bar(dmVal);
01148     //
01149     //         // Now, calculate the likelihood using this fitter
01150     //         Double_t likelihood = (*this)(mmPars.VectorParameters());
01151     //
01152     //         // Minimim calculations
01153     //         if (minimum < 0 || likelihood < minimum)
01154     //             minimum = likelihood;
01155     //
01156     //         // Set the bin content!
01157     //         surface->SetBinContent(sinBin, massBin, likelihood);
01158     //     }
01159     // }
01160     // Print a message to say we have finished
01161     if (!fQuietMode) {
01162         cout << "Surface Generation Done. Minimum Likelihood = "
01163              << minimum << endl;
01164     }
01165 
01166 
01167     // Get the minimum bin on this histogram
01168     Int_t minbinX, minbinY, minbinZ;
01169     surface->GetMinimumBin(minbinX, minbinY, minbinZ);
01170     // Set the fit parameters to this point as a start point
01171     mmPars.Sn2Bar(surface->GetXaxis()->GetBinCenter(minbinX));
01172     mmPars.Dm2Bar(surface->GetYaxis()->GetBinCenter(minbinY));
01173 
01174   if (True_Minimum) {
01175     // Now minimise at this point, and grab the likelihood
01176     if (!fQuietMode) cout << "Searching for true minimum" << endl;
01177 
01178     NuMMParameters mmFit = this->Minimise(mmPars);
01179     Double_t minlike = (*this)(mmFit.VectorParameters());
01180 
01181     // Check if the fit failed, if it did, then don't use it
01182     if (mmFit.MinuitPass())
01183     {
01184         // If this is smaller than this minimum we have found (it should be)
01185         if (minlike <= minimum)
01186           minimum = minlike;
01187         else
01188           cout << "WARNING: Fit Minimisation found minimum higher than grid search" << endl;
01189     }
01190   }
01191     // Now, we have generated likelihoods for all grid points.
01192     // Offset each one by the minimum, so that it is a delta chi
01193     // squared surface.
01194     for (Int_t sinBin = 1; sinBin <= sinPoints; sinBin++) {
01195         for (Int_t massBin = 1; massBin <= massPoints; massBin++) {
01196             Double_t content = surface->GetBinContent(sinBin, massBin);
01197             surface->SetBinContent(sinBin, massBin, content - minimum);
01198         }
01199     }
01200 
01201     // Now we have generated and offset the histogram. Return it!
01202     return surface;
01203 }

const NuMMParameters NuSystFitter::Minimise ( const NuMMParameters mmPars,
bool &  success 
) [virtual]

Definition at line 99 of file NuSystFitter.cxx.

References NuMMParameters::AreAllParametersFixed(), NuMMParameters::CopyConstraintsLimitsAndFixings(), fQuietMode, NuMMParameters::kAlpha, NuMMParameters::kDelta1, NuMMParameters::kDelta2, NuMMParameters::kDelta3, NuMMParameters::kDm2, NuMMParameters::kDm221, NuMMParameters::kDm243, NuMMParameters::kDm2Bar, NuMMParameters::kEpsilon, NuMMParameters::kMu2, NuMMParameters::kNcBack, NuMMParameters::kNorm, NuMMParameters::kNumParameters, NuMMParameters::kShwScale, NuMMParameters::kSn2, NuMMParameters::kSn2Bar, NuMMParameters::kTheta12, NuMMParameters::kTheta13, NuMMParameters::kTheta14, NuMMParameters::kTheta24, NuMMParameters::kTheta34, NuMMParameters::MinuitParameters(), NuMMParameters::MinuitPass(), and NuMMParameters::PrintStatus().

00101 {
00102   success = true;
00103 
00104   if(mmPars.AreAllParametersFixed()) return mmPars;
00105 
00106   //Set up Minuit parameters
00107   ROOT::Minuit2::MnUserParameters mnPars = mmPars.MinuitParameters();
00108     
00109   vector<double> param_vec = mnPars.Params();
00110 //    cout << "Fitting with " << param_vec.size() << " parameters." << endl;
00111 //   cout << "Fitting with " << mnPars.VariableParameters() << " variable parameters." << endl;
00112   if (!fQuietMode) mmPars.PrintStatus();
00113 
00114   //Run Minuit fit
00115   ROOT::Minuit2::MnMigrad mnMigrad(*this,mnPars);
00116   ROOT::Minuit2::FunctionMinimum funcMin = mnMigrad();
00117 
00118   if (!funcMin.IsValid()) {
00119     success = false;
00120     cout << "Function minimum is not valid!" << endl;
00121   } else {
00122     success = true;
00123     if (!fQuietMode){
00124       const ROOT::Minuit2::MnUserParameters upars = funcMin.UserParameters();
00125 
00126       cout << "Function minimum is: " << endl
00127            << "Sn2: "       << upars.Parameter(NuMMParameters::kSn2).Value()
00128            << ", dm2: "     << upars.Parameter(NuMMParameters::kDm2).Value()
00129            << "; norm: "    << upars.Parameter(NuMMParameters::kNorm).Value()
00130            << "; shwEn: "   << upars.Parameter(NuMMParameters::kShwScale).Value()
00131            << "; NCBack: "  << upars.Parameter(NuMMParameters::kNcBack).Value()
00132            << "; Sn2bar: "  << upars.Parameter(NuMMParameters::kSn2Bar).Value()
00133            << "; dm2bar: "  << upars.Parameter(NuMMParameters::kDm2Bar).Value()
00134            << "; epsilon: " << upars.Parameter(NuMMParameters::kEpsilon).Value()
00135            << "; Theta12: " << upars.Parameter(NuMMParameters::kTheta12).Value()
00136            << "; Theta13: " << upars.Parameter(NuMMParameters::kTheta13).Value()
00137            << "; Theta14: " << upars.Parameter(NuMMParameters::kTheta14).Value()
00138            << "; Delta1: "  << upars.Parameter(NuMMParameters::kDelta1).Value()
00139            << "; Delta2: "  << upars.Parameter(NuMMParameters::kDelta2).Value()
00140            << "; Delta3: "  << upars.Parameter(NuMMParameters::kDelta3).Value()
00141            << "; Theta24: " << upars.Parameter(NuMMParameters::kTheta24).Value()
00142            << "; Theta34: " << upars.Parameter(NuMMParameters::kTheta34).Value()
00143            << "; Dm221: "   << upars.Parameter(NuMMParameters::kDm221).Value()
00144            << "; Dm243: "   << upars.Parameter(NuMMParameters::kDm243).Value()
00145            << "; mu2: "     << upars.Parameter(NuMMParameters::kMu2).Value()
00146            << "; alpha: "   << upars.Parameter(NuMMParameters::kAlpha).Value()
00147            << "; CPT: "     << upars.Parameter(NuMMParameters::kNumParameters).Value()
00148       << endl;
00149     }
00150   }
00151 
00152   //cout << "Diagonal covar elements:" << endl;
00153   //ROOT::Minuit2::MnUserCovariance covar = funcMin.UserCovariance();
00154   //for (unsigned int i = 0; i < covar.Nrow(); i++) {
00155   //  cout << "element " << i << " = " << covar(i,i) << endl;
00156   //}
00157 
00158   NuMMParameters bestFitPars(funcMin);
00159   // Make sure the parameters we return are configured the same way as what was passed
00160   bestFitPars.CopyConstraintsLimitsAndFixings(mmPars);
00161   bestFitPars.MinuitPass(success);
00162   //bestFitPars.PrintStatus();
00163   return bestFitPars;
00164 }

const NuMMParameters NuSystFitter::Minimise ( const NuMMParameters mmPars  )  [virtual]

Definition at line 92 of file NuSystFitter.cxx.

Referenced by Chi2ValleyBar(), Chi2ValleyBarDm2Bar(), Chi2ValleyDm2(), Chi2ValleySn2(), FCMinimise(), FCMinimiseNSI(), FCMinimiseNu(), FillCPT(), FillLikelihoodSurfaceGeneric(), FillLikelihoodSurfaceNSIDm2Eps(), FillLikelihoodSurfaceNSIDm2Sn2(), FillLikelihoodSurfaceNSISn2Eps(), NuFCFitterNuMuBar::Fit(), NuEZFitterNSI::Fit(), NuEZFitter::Fit(), LikelihoodSurfaceBar(), NuFCFitterNSINubar::MinuitFit(), NuFCFitterNSINu::MinuitFit(), NuFCFitterNSI::MinuitFit(), NuFCFitter::MinuitFit(), NuFCFitterNSINubar::RecoverNegativeDeltaChi(), NuFCFitterNSINu::RecoverNegativeDeltaChi(), NuFCFitterNSI::RecoverNegativeDeltaChi(), and NuFCFitter::RecoverNegativeDeltaChi().

00093 {
00094   bool success;
00095   return Minimise(mmPars, success);
00096 }

const std::vector< std::pair< Double_t, Double_t > > NuSystFitter::NeutrinoContourFinder ( const NuMMParameters mmPars  )  [virtual]

Definition at line 301 of file NuSystFitter.cxx.

References NuMMParameters::FixSn2(), NuMMParameters::Sn2(), and NuMMParameters::VectorParameters().

00302 {
00303   //Find the target chi2 for the contour
00304   NuMMParameters bestFitPars = this->Minimise(inputPars);
00305   Double_t bestFitChi2 = (*this)(bestFitPars.VectorParameters());
00306   Double_t targetChi2 = bestFitChi2 + this->Up();
00307   cout << "Target chi2 = " << targetChi2 << endl;
00308 
00309   //Fix sn2 ready for the dm2 scans:
00310   NuMMParameters mmPars = inputPars;
00311   mmPars.FixSn2();
00312   //Make somewhere to put the contour points
00313   std::vector<pair<Double_t,Double_t> > pointsUp;
00314   std::vector<pair<Double_t,Double_t> > pointsDown;
00315 
00316   //Run the contour in quiet mode
00317   this->QuietModeOn();
00318 
00319   //Get the points for the contour
00320   for (vector<Double_t>::iterator snIt = fsn2PointsForNeutrinoContour.begin();
00321        snIt != fsn2PointsForNeutrinoContour.end();
00322        ++snIt){
00323     Double_t sn2 = *snIt;
00324     mmPars.Sn2(sn2);
00325     const std::pair<Double_t, Double_t> values =
00326       this->DmScanForContour(mmPars,targetChi2);
00327     cout << "Contour points: sn2 = " << sn2
00328          << "; dm2 = " << values.first << " and " << values.second
00329          << endl;
00330     if ((values.first < 0.0) || (values.second < 0.0)){
00331       cout << "End of contour at sn2 = " << mmPars.Sn2() << endl;
00332       break;
00333     }
00334     else{
00335       pair<Double_t, Double_t> pointDown(sn2,values.first);
00336       pair<Double_t, Double_t> pointUp(sn2,values.second);
00337       pointsDown.push_back(pointDown);
00338       pointsUp.push_back(pointUp);
00339     }
00340   }
00341 
00342   //Make a single vector of points
00343   std::vector<pair<Double_t,Double_t> > contour;
00344   for (vector<pair<Double_t, Double_t> >::const_iterator it = pointsUp.begin();
00345        it != pointsUp.end();
00346        ++it){
00347     pair<Double_t,Double_t> currentPoint((*it).first,(*it).second);
00348     contour.push_back(currentPoint);
00349   }
00350   for (vector<pair<Double_t, Double_t> >::reverse_iterator
00351          itr = pointsDown.rbegin();
00352        itr != pointsDown.rend();
00353        ++itr){
00354     pair<Double_t,Double_t> currentPoint((*itr).first,(*itr).second);
00355     contour.push_back(currentPoint);
00356   }
00357   return contour;
00358 }

void NuSystFitter::NoOscPrediction (  )  [virtual]

Definition at line 86 of file NuSystFitter.cxx.

00087 {
00088 
00089 }

virtual void NuSystFitter::NumberOfContourPoints ( const Int_t  numContourPoints  )  [inline, virtual]

Definition at line 46 of file NuSystFitter.h.

References fNumContourPoints.

00047     {fNumContourPoints = numContourPoints;}

const TGraph * NuSystFitter::OneSidedNeutrinoContourFinder ( const NuMMParameters inputPars  )  [virtual]

Definition at line 230 of file NuSystFitter.cxx.

00231 {
00232   std::vector<std::pair<Double_t,Double_t> > contPoints =
00233     this->NeutrinoContourFinder(inputPars);
00234 
00235   //Put the contour points in a TGraph
00236   TGraph* contour = new TGraph(contPoints.size());
00237   Int_t point=0;
00238   for (vector<pair<Double_t, Double_t> >::const_iterator it =
00239          contPoints.begin();
00240        it != contPoints.end();
00241        ++it){
00242     contour->SetPoint(point,(*it).first,(*it).second);
00243     cout << "Set contour point " << point
00244          << ", " << (*it).first
00245          << ", " << (*it).second
00246          << endl;
00247     ++point;
00248   }
00249   return contour;
00250 }

double NuSystFitter::operator() ( const std::vector< double > &  pars  )  const [virtual]

Definition at line 626 of file NuSystFitter.cxx.

References Likelihood().

00627 {
00628   NuMMParameters mmPars(pars);
00629   //cout << "Called operator()" << endl;
00630   //mmPars.PrintStatus();
00631   return Likelihood(mmPars);
00632 }

const TGraph * NuSystFitter::PlotContours ( const NuMMParameters mmPars  )  [virtual]

Definition at line 167 of file NuSystFitter.cxx.

References NuMMParameters::ContourPars(), fNumContourPoints, NuMMParameters::kAlpha, NuMMParameters::kDm2, NuMMParameters::kDm2Bar, NuMMParameters::kMu2, NuMMParameters::kNcBack, NuMMParameters::kNorm, NuMMParameters::kNumParameters, NuMMParameters::kShwScale, NuMMParameters::kSn2, NuMMParameters::kSn2Bar, NuMMParameters::MinuitParameters(), and Munits::second.

00168 {
00169 
00170 
00171   //Set up Minuit parameters
00172   ROOT::Minuit2::MnUserParameters mnPars = mmPars.MinuitParameters();
00173 
00174   //Run Minuit fit
00175   ROOT::Minuit2::MnMigrad mnMigrad(*this,mnPars);
00176   ROOT::Minuit2::FunctionMinimum funcMin = mnMigrad();
00177 
00178   if (!funcMin.IsValid()){
00179     cout << "Function minimum is not valid!" << endl;
00180   }
00181   else{
00182     cout << "Contour Minimization: " << endl;
00183 
00184     const ROOT::Minuit2::MnUserParameters upars = funcMin.UserParameters();
00185 
00186     cout << "Function minimum is: " << endl
00187          << "Sn2: " << upars.Parameter(NuMMParameters::kSn2).Value()
00188          << ", dm2: " << upars.Parameter(NuMMParameters::kDm2).Value()
00189          << "; norm: " << upars.Parameter(NuMMParameters::kNorm).Value()
00190          << "; shwEn: " << upars.Parameter(NuMMParameters::kShwScale).Value()
00191          << "; NCBack: " << upars.Parameter(NuMMParameters::kNcBack).Value()
00192          << "; Sn2bar: " << upars.Parameter(NuMMParameters::kSn2Bar).Value()
00193          << "; dm2bar: " << upars.Parameter(NuMMParameters::kDm2Bar).Value()
00194          << "; mu2: " << upars.Parameter(NuMMParameters::kMu2).Value()
00195          << "; alpha: " << upars.Parameter(NuMMParameters::kAlpha).Value()
00196          << "; CPT: " << upars.Parameter(NuMMParameters::kNumParameters).Value()
00197          << endl;
00198   }
00199 
00200   ROOT::Minuit2::MnContours contours(*this,funcMin);
00201   ROOT::Minuit2::ContoursError contErr = contours.Contour(mmPars.ContourPars().first,
00202                                                           mmPars.ContourPars().second,
00203                                                           fNumContourPoints);
00204 
00205   std::vector<std::pair<Double_t,Double_t> > vContPoints = contErr();
00206   //std::vector<std::pair<Double_t,Double_t> > vContPoints(10);// = contErr();
00207 
00208   Double_t* x = new Double_t[vContPoints.size()];
00209   for (UInt_t pointCount = 0; pointCount<vContPoints.size(); ++pointCount){
00210     x[pointCount] = vContPoints[pointCount].first;
00211   }
00212 
00213   Double_t* y = new Double_t[vContPoints.size()];
00214   for (UInt_t pointCount = 0; pointCount<vContPoints.size(); ++pointCount){
00215     y[pointCount] = vContPoints[pointCount].second;
00216   }
00217   TGraph* gCont = new TGraph(vContPoints.size(),y,x);
00218 //  cout << "drawing contour" << endl;
00219 //  gCont->SetName("gCont");
00220 //  gDirectory->Print();
00221 //  TFile* file=TFile::Open("contourplot.root","RECREATE");
00222 //  gDirectory->Print();
00223 //  gCont->Write("gCont");
00224 //  file->Close();
00225   return gCont;
00226 }

void NuSystFitter::push_back ( NuMMRun run  )  [virtual]

Definition at line 61 of file NuSystFitter.cxx.

References fRuns, and run().

Referenced by NuFCFittingInterface::AddRun(), NuEZRunsFitter::BuildFitter(), NuFCFitter::NuFCFitter(), NuFCFitterNSI::NuFCFitterNSI(), NuFCFitterNSINu::NuFCFitterNSINu(), NuFCFitterNSINubar::NuFCFitterNSINubar(), NuEZFitterNSI::Rebuild(), and NuEZFitter::Rebuild().

00062 {
00063   fRuns->push_back(run);
00064 }

void NuSystFitter::QuietModeOff (  )  [virtual]

Definition at line 673 of file NuSystFitter.cxx.

References fQuietMode, and fRuns.

00674 {
00675   fQuietMode = 0;
00676   for (std::vector<NuMMRun*>::iterator runIt = fRuns->begin();
00677        fRuns->end() != runIt;
00678        ++runIt){
00679     (*runIt)->QuietModeOff();
00680   }
00681 }

void NuSystFitter::QuietModeOn (  )  [virtual]

Definition at line 662 of file NuSystFitter.cxx.

References fQuietMode, and fRuns.

Referenced by BatchModeOn().

00663 {
00664   fQuietMode = 1;
00665   for (std::vector<NuMMRun*>::iterator runIt = fRuns->begin();
00666        fRuns->end() != runIt;
00667        ++runIt){
00668     (*runIt)->QuietModeOn();
00669   }
00670 }

virtual void NuSystFitter::SetErrorDef ( const Double_t  up  )  [inline, virtual]

Definition at line 24 of file NuSystFitter.h.

References fUp.

00024 {fUp = up;}

virtual void NuSystFitter::Setup ( const std::vector< std::string >  helperInputs,
const std::vector< NuHistInterpolator * >  fdDataInput,
const std::vector< NuHistInterpolator * >  ndDataInput,
const std::string  xsecFile,
const std::vector< std::string >  ,
const std::string  ,
Int_t   
) [virtual]

const std::pair< Double_t, Double_t > NuSystFitter::SingleParDm2BarErrors ( const NuMMParameters mmPars,
const bool  quiet = false 
) [virtual]

Definition at line 481 of file NuSystFitter.cxx.

00482 {
00483   return SingleParErrors(mmPars,5,quiet);
00484 }

const std::pair< Double_t, Double_t > NuSystFitter::SingleParDm2Errors ( const NuMMParameters mmPars,
const bool  quiet = false 
) [virtual]

Definition at line 474 of file NuSystFitter.cxx.

00475 {
00476   return SingleParErrors(mmPars,0,quiet);
00477 }

const std::pair< Double_t, Double_t > NuSystFitter::SingleParErrors ( const NuMMParameters mmPars,
const int  idx,
const bool  quiet 
) [virtual]

Definition at line 495 of file NuSystFitter.cxx.

References NuMMParameters::AreAllParametersFixed(), MuELoss::e, NuMMParameters::FixParameterByIndex(), NuMMParameters::GetParameterByIndex(), NuMMParameters::MinuitPass(), NuMMParameters::SetParameterByIndex(), and NuMMParameters::VectorParameters().

00497 {
00498   std::pair<Double_t,Double_t> errors;
00499 
00500   NuMMParameters bestFitPoint = this->Minimise(mmPars);
00501   Double_t bestFitChi2 = (*this)(bestFitPoint.VectorParameters());
00502   Double_t targetChi2 = bestFitChi2 + this->Up();
00503   Double_t bestFitPar = bestFitPoint.GetParameterByIndex(idx);
00504 
00505   cout << "Best chi2: " << bestFitChi2
00506        << " at par = " << bestFitPar
00507        << ". Target chi2: " << targetChi2
00508        << endl;
00509 
00510   for (Int_t direction = -1; direction < 2; direction += 2){
00511 
00512     if(!quiet) cout << "Direction = " << direction << endl;
00513 
00514     NuMMParameters scanMMPars;
00515 
00516 //    Double_t incrementArray[5] = {0.1e-3,
00517 //                                0.01e-3,
00518 //                                0.001e-3,
00519 //                                0.0001e-3,
00520 //                                0.00001e-3};
00521     Double_t firstChi2 = bestFitChi2;
00522     Double_t firstPar = bestFitPar;
00523     Double_t currentChi2 = -1.0;
00524     Double_t lastChi2 = -1.0;
00525     Double_t lastPar = -1.0;
00526     Double_t increment = 1e-3*bestFitPar;
00527 
00528     while (currentChi2<targetChi2 && increment < 1e6){
00529       increment *= 2.0;
00530       scanMMPars = mmPars;
00531       scanMMPars.FixParameterByIndex(idx);
00532       scanMMPars.SetParameterByIndex(idx,bestFitPar + direction*increment);
00533       lastPar = scanMMPars.GetParameterByIndex(idx);
00534       if(!quiet) cout << "Trying par = " << scanMMPars.GetParameterByIndex(idx) << "... ";
00535       if (scanMMPars.AreAllParametersFixed()){
00536         currentChi2 = (*this)(scanMMPars.VectorParameters());
00537       }
00538       else{
00539         currentChi2 = (*this)(this->Minimise(scanMMPars).VectorParameters());
00540       }
00541       if(!quiet){
00542         cout << "Starting while with increment = " << increment
00543              << ", currentChi2 = " << currentChi2
00544              << ", lastPar = " << lastPar
00545              << endl;
00546       }
00547     }
00548 
00549     increment /= 2.0;
00550 
00551     while (TMath::Abs(currentChi2-targetChi2)>1e-5 && increment > 1e-5*bestFitPar){
00552 
00553       scanMMPars = mmPars;
00554       scanMMPars.FixParameterByIndex(idx);
00555       scanMMPars.SetParameterByIndex(idx,firstPar);
00556 
00557       if(!quiet){
00558         cout << "Starting while with firstChi2 = " << firstChi2
00559              << ", firstPar = " << firstPar
00560              << ", increment = " << increment
00561              << endl;
00562       }
00563 
00564       lastChi2 = currentChi2;
00565       lastPar = scanMMPars.GetParameterByIndex(idx);
00566       Double_t passminuit = true;
00567       scanMMPars.SetParameterByIndex(idx,scanMMPars.GetParameterByIndex(idx) + direction*increment);
00568       if(!quiet) cout << "Trying par = " << scanMMPars.GetParameterByIndex(idx) << "... ";
00569       if (scanMMPars.AreAllParametersFixed()){
00570         currentChi2 = (*this)(scanMMPars.VectorParameters());
00571       }
00572       else{
00573         NuMMParameters minPars = Minimise(scanMMPars);
00574         currentChi2 = (*this)(minPars.VectorParameters());
00575         passminuit = minPars.MinuitPass();
00576       }
00577       if(!quiet) cout << "chi2 = " << currentChi2 << endl;
00578 
00579       if(passminuit){
00580         if(currentChi2 > targetChi2) firstPar = lastPar;
00581         else firstPar = lastPar + direction*increment;
00582         increment /= 2.0;
00583       }
00584       else{
00585         firstPar = lastPar;
00586         increment *= 1.01;
00587       }
00588     }
00589 
00590     Double_t chi2Difference = lastChi2 - currentChi2;
00591     Double_t parDifference = lastPar - scanMMPars.GetParameterByIndex(idx);
00592     Double_t value = -1.0;
00593     if(!quiet){
00594       cout << "chi2Difference = " << -chi2Difference << endl;
00595       cout << "parDifference = " << parDifference << endl;
00596     }
00597     if ((fabs(chi2Difference)<1e-12) || (fabs(parDifference)<1e-12)){
00598       cout << "Chi2 or Par difference is zero. Supplying currentChi2."
00599            << endl;
00600       value = scanMMPars.GetParameterByIndex(idx);
00601     }
00602     else{
00603       Double_t fractionBetween = (targetChi2 - currentChi2)/chi2Difference;
00604       value = fractionBetween*parDifference + scanMMPars.GetParameterByIndex(idx);
00605     }
00606     if(!quiet){
00607       cout << "Error is between " << lastPar
00608            << " and " << scanMMPars.GetParameterByIndex(idx)
00609            << ", with chi2 between " << lastChi2
00610            << " and " << currentChi2
00611            << endl;
00612       cout << "Value is " << value << endl;
00613     }
00614     if (-1 == direction){errors.first = value;}
00615     if (1 == direction){errors.second = value;}
00616   }
00617 
00618   cout << "Final answer is par = " << bestFitPar
00619        << " + " << errors.second - bestFitPar
00620        << " - " << -errors.first + bestFitPar
00621        << endl;
00622   return errors;
00623 }

const std::pair< Double_t, Double_t > NuSystFitter::SingleParSn2BarErrors ( const NuMMParameters mmPars,
const bool  quiet = false 
) [virtual]

Definition at line 488 of file NuSystFitter.cxx.

00489 {
00490   return SingleParErrors(mmPars,6,quiet);
00491 }

NuMMParameters NuSystFitter::Sn2GridSearch ( Double_t  Dm2,
Double_t  Dm2Bar,
Int_t  resolution = 0 
) [protected]

Does a grid search over sn2/sn2bar, with resolution bins per parameter.

Definition at line 2243 of file NuSystFitter.cxx.

References NuMMParameters::Dm2(), NuMMParameters::Dm2Bar(), NuMMParameters::Sn2(), NuMMParameters::Sn2Bar(), and NuMMParameters::VectorParameters().

Referenced by FillCPT().

02244 {
02245   if (resolution <= 0) resolution = 11;
02246   // Use a 2D histogram to define the search grid
02247   TH2D sinsurf("sinsurf","sinsurf",resolution,0,1,resolution,0,1);
02248   // Create a template parameters object
02249   NuMMParameters pars;
02250   pars.Dm2(Dm2);
02251   pars.Dm2Bar(Dm2Bar);
02252 
02253   Double_t minLike, minSn2, minSn2Bar;
02254   minLike = minSn2 = minSn2Bar = -1;
02255 
02256   // Loop over every bin
02257   for (Int_t xBin = 1; xBin <= sinsurf.GetNbinsX(); ++xBin) {
02258     for (Int_t yBin = 1; yBin <= sinsurf.GetNbinsY(); ++yBin) {
02259       Double_t sn2 = sinsurf.GetYaxis()->GetBinCenter(yBin);
02260       Double_t sn2bar = sinsurf.GetXaxis()->GetBinCenter(xBin);
02261       pars.Sn2(sn2);
02262       pars.Sn2Bar(sn2bar);
02263 
02264       // Evaluate the likelihood
02265       const Double_t likelihood = (*this)(pars.VectorParameters());
02266 
02267       // Check for minimum (or first entry)
02268       if ((xBin == 1 && yBin == 1) || likelihood < minLike) {
02269         minLike = likelihood;
02270         minSn2 = sn2;
02271         minSn2Bar = sn2bar;
02272       }
02273     }
02274   }
02275 
02276   // Check Zero and One
02277   pars.Sn2(0.0);
02278   pars.Sn2Bar(0.0);
02279   Double_t likelihood = (*this)(pars.VectorParameters());
02280   if (likelihood < minLike) {
02281     minLike = likelihood;
02282     minSn2 = 0.0;
02283     minSn2Bar = 0.0;
02284   }
02285 
02286   // Check Zero and One
02287   pars.Sn2(1.0);
02288   pars.Sn2Bar(1.0);
02289   likelihood = (*this)(pars.VectorParameters());
02290   if (likelihood < minLike) {
02291     minLike = likelihood;
02292     minSn2 = 1.0;
02293     minSn2Bar = 1.0;
02294   }
02295 
02296   // We should now have a minimum. Sanity check this
02297   assert(minLike > 0);
02298   assert(minSn2 > 0);
02299   assert(minSn2Bar > 0);
02300 
02301   // Now build our return
02302   pars.Sn2(minSn2);
02303   pars.Sn2Bar(minSn2Bar);
02304 
02305   return pars;
02306 }

virtual void NuSystFitter::Sn2PointsForNeutrinoContour ( const std::vector< Double_t > &  sn2PointsForNeutrinoContour  )  [inline, virtual]

Definition at line 62 of file NuSystFitter.h.

References fsn2PointsForNeutrinoContour.

00063     {fsn2PointsForNeutrinoContour = sn2PointsForNeutrinoContour;}

const TGraph * NuSystFitter::TwoSidedNeutrinoContourFinder ( const NuMMParameters inputPars  )  [virtual]

Definition at line 254 of file NuSystFitter.cxx.

00255 {
00256   fsn2PointsForNeutrinoContour = fsn2PointsForNeutrinoContourPhysical;
00257   std::vector<std::pair<Double_t,Double_t> > contPointsPhys =
00258     this->NeutrinoContourFinder(inputPars);
00259 
00260   fsn2PointsForNeutrinoContour = fsn2PointsForNeutrinoContourUnphysical;
00261   std::vector<std::pair<Double_t,Double_t> > contPointsUnphys =
00262     this->NeutrinoContourFinder(inputPars);
00263 
00264   //Make a single vector of points
00265   std::vector<pair<Double_t,Double_t> > contourPoints;
00266   for (vector<pair<Double_t, Double_t> >::const_iterator it =
00267          contPointsPhys.begin();
00268        it != contPointsPhys.end();
00269        ++it){
00270     pair<Double_t,Double_t> currentPoint((*it).first,(*it).second);
00271     contourPoints.push_back(currentPoint);
00272   }
00273   for (vector<pair<Double_t, Double_t> >::reverse_iterator
00274          itr = contPointsUnphys.rbegin();
00275        itr != contPointsUnphys.rend();
00276        ++itr){
00277     pair<Double_t,Double_t> currentPoint((*itr).first,(*itr).second);
00278     contourPoints.push_back(currentPoint);
00279   }
00280 
00281 
00282   //Put the contour points in a TGraph
00283   TGraph* contour = new TGraph(contourPoints.size());
00284   Int_t point=0;
00285   for (vector<pair<Double_t, Double_t> >::const_iterator it =
00286          contourPoints.begin();
00287        it != contourPoints.end();
00288        ++it){
00289     contour->SetPoint(point,(*it).first,(*it).second);
00290     cout << "Set contour point " << point
00291          << ", " << (*it).first
00292          << ", " << (*it).second
00293          << endl;
00294     ++point;
00295   }
00296   return contour;
00297 }

virtual double NuSystFitter::Up (  )  const [inline, virtual]

Definition at line 23 of file NuSystFitter.h.

References fUp.

00023 {return fUp;}//Chi2 errors; 0.5 for likelihood


Member Data Documentation

Int_t NuSystFitter::fNumContourPoints [protected]

Definition at line 177 of file NuSystFitter.h.

Referenced by NumberOfContourPoints(), and PlotContours().

Int_t NuSystFitter::fQuietMode [protected]

Definition at line 175 of file NuSystFitter.h.

Referenced by BatchModeOn(), Chi2SliceDm2(), Chi2SliceDm2bar(), Chi2SliceSin2bar(), Chi2ValleyBar(), Chi2ValleyBarDm2Bar(), Chi2ValleyDm2(), Chi2ValleySn2(), FillLikelihoodSurfaceCPT(), FillLikelihoodSurfaceGeneric(), FillLikelihoodSurfaceNSIDm2Eps(), FillLikelihoodSurfaceNSIDm2Sn2(), FillLikelihoodSurfaceNSISn2Eps(), Likelihood(), LikelihoodSurfaceBar(), Minimise(), QuietModeOff(), and QuietModeOn().

std::vector<NuMMRun*>* NuSystFitter::fRuns [protected]

Definition at line 181 of file NuSystFitter.h.

Referenced by NuABFitter::Archive(), Likelihood(), push_back(), QuietModeOff(), and QuietModeOn().

std::vector<Double_t> NuSystFitter::fsn2PointsForNeutrinoContour [protected]

Definition at line 178 of file NuSystFitter.h.

Referenced by Sn2PointsForNeutrinoContour().

std::vector<Double_t> NuSystFitter::fsn2PointsForNeutrinoContourPhysical [protected]

Definition at line 179 of file NuSystFitter.h.

std::vector<Double_t> NuSystFitter::fsn2PointsForNeutrinoContourUnphysical [protected]

Definition at line 180 of file NuSystFitter.h.

Double_t NuSystFitter::fUp [protected]

Definition at line 176 of file NuSystFitter.h.

Referenced by SetErrorDef(), and Up().


The documentation for this class was generated from the following files:
Generated on Wed May 22 22:02:18 2013 for loon by  doxygen 1.4.7