00001 00012 // for have minuit 00013 #ifdef HAVE_CONFIG_H 00014 #include "config.h" 00015 #endif 00016 00017 // for truncation warning in debug mode 00018 #ifdef _MSC_VER 00019 #include "msdevstudio/MSconfig.h" 00020 #endif 00021 00022 #include "FitterFactory.h" 00023 00024 // List of default fitters 00025 #include "LMFitter.h" 00026 #include "BFGSFitter.h" 00027 00028 #if HAVE_MINUIT || HAVE_MINUIT2 00029 #include "MinuitMigrad.h" 00030 #endif 00031 00032 // List of default objective functions 00033 #include "NTupleChiSqFCN.h" 00034 #include "NTupleLikeliHoodFCN.h" 00035 #include "NTuplePearsonFCN.h" 00036 00037 #include <stdexcept> 00038 00039 using std::string; 00040 using std::vector; 00041 00042 using namespace hippodraw; 00043 00044 FitterFactory * FitterFactory::s_instance = 0; 00045 00046 FitterFactory::FitterFactory () 00047 { 00048 } 00049 00050 FitterFactory * FitterFactory::instance () 00051 { 00052 if ( s_instance == 0 ) { 00053 s_instance = new FitterFactory (); 00054 s_instance->initialize (); 00055 } 00056 00057 return s_instance; 00058 } 00059 00060 void FitterFactory::initialize () 00061 { 00062 Fitter * fitter = new LMFitter ( "ChiSq: Levenberg Marquart" ); 00063 StatedFCN * chifcn = new NTupleChiSqFCN (); 00064 fitter -> setFCN ( chifcn ); 00065 add ( fitter ); 00066 00067 fitter = new LMFitter ( "Pearson: BFGS" ); 00068 StatedFCN * pearsonfcn = new NTuplePearsonFCN (); 00069 fitter -> setFCN ( pearsonfcn ); 00070 add ( fitter ); 00071 00072 fitter = new BFGSFitter ( "MLEH: BFGS" ); 00073 StatedFCN * likfcn = new NTupleLikeliHoodFCN (); 00074 fitter -> setFCN ( likfcn ); 00075 add ( fitter ); 00076 00077 #if HAVE_MINUIT || HAVE_MINUIT2 00078 fitter = new MinuitMigrad ( "ChiSq: Minuit(Migrad)" ); 00079 chifcn = new NTupleChiSqFCN (); 00080 fitter -> setFCN ( chifcn ); 00081 add ( fitter ); 00082 00083 fitter = new MinuitMigrad ( "MLEH: Minuit(Migrad)" ); 00084 likfcn = new NTupleLikeliHoodFCN (); 00085 fitter -> setFCN ( likfcn ); 00086 add ( fitter ); 00087 #endif 00088 00089 } 00090 00091 void 00092 FitterFactory:: 00093 setDefault ( const std::string & name ) 00094 { 00095 bool yes = exists ( name ); 00096 00097 if ( yes == false ) { 00098 string what ( "FitterFactory: Fitter with name `" ); 00099 what += name; 00100 what += "' does not exist."; 00101 throw std::runtime_error ( what ); 00102 } 00103 00104 m_default = name; 00105 } 00106 00107 const string & 00108 FitterFactory:: 00109 getDefault () const 00110 { 00111 if ( m_default.empty () ) { 00112 const vector < string > & fitters = names (); 00113 return fitters.front (); 00114 } 00115 //else 00116 return m_default; 00117 }