#include <NuSystFitter.h>
Inheritance diagram for NuSystFitter:

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 |
Definition at line 18 of file NuSystFitter.h.
| 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] |
| 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] |
| 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.
Referenced by NuFCFittingInterface::AddRun(), NuEZRunsFitter::BuildFitter(), NuFCFitter::NuFCFitter(), NuFCFitterNSI::NuFCFitterNSI(), NuFCFitterNSINu::NuFCFitterNSINu(), NuFCFitterNSINubar::NuFCFitterNSINubar(), NuEZFitterNSI::Rebuild(), and NuEZFitter::Rebuild().
| 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] |
| 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
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] |
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] |
1.4.7