// @(#)root/mathcore:$Id: Factory.h 37448 2010-12-09 20:20:56Z moneta $
// Author: L. Moneta Fri Dec 22 14:43:33 2006

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
 *                                                                    *
 *                                                                    *
 **********************************************************************/

// Header file for class Factory

#ifndef ROOT_Math_Factory
#define ROOT_Math_Factory

#include <string>


namespace ROOT { 

   namespace Math { 

   class Minimizer; 
   class DistSampler;   
   
//___________________________________________________________________________
/** 
   Factory  class holding static functions to create the interfaces like ROOT::Math::Minimizer
   via the Plugin Manager
*/ 
class Factory { 
      public: 

   /**
      static method to create the corrisponding Minimizer given the string
      Supported Minimizers types are: 
      Minuit (TMinuit), Minuit2, GSLMultiMin, GSLMultiFit, GSLSimAn, Linear, Fumili, Genetic
      If no name is given use default values defined in  MinimizerOptions
    */
   static ROOT::Math::Minimizer * CreateMinimizer(const std::string & minimizerType = "", const std::string & algoType = "");

   /**
      static method to create the distribution sampler class given a string specifying the type
      Supported sampler types are: 
      Unuran, Foam
      If no name is given use default values defined in  DistSamplerOptions
    */
   static ROOT::Math::DistSampler * CreateDistSampler(const std::string & samplerType ="");
   

}; 

   } // end namespace Fit

} // end namespace ROOT


#endif /* ROOT_Fit_MinimizerFactory */
