#include "TROOT.h"
#include "TVirtualFitter.h"
#include "TPluginManager.h"
#include "TEnv.h"
#include "Api.h"
TVirtualFitter *TVirtualFitter::fgFitter    = 0;
Int_t           TVirtualFitter::fgMaxpar    = 0;
Int_t           TVirtualFitter::fgMaxiter   = 5000;
Double_t        TVirtualFitter::fgPrecision = 1e-6;
Double_t        TVirtualFitter::fgErrorDef  = 1;
TString         TVirtualFitter::fgDefault   = "";
ClassImp(TVirtualFitter)
TVirtualFitter::TVirtualFitter()
{
   
   fMethodCall = 0;
   fFCN        = 0;
   fNpoints    = 0;
   fPointSize  = 0;
   fCacheSize  = 0;
   fCache      = 0;
}
TVirtualFitter::TVirtualFitter(const TVirtualFitter& tvf) :
  TNamed(tvf), 
  fOption(tvf.fOption),
  fXfirst(tvf.fXfirst),
  fXlast(tvf.fXlast),
  fYfirst(tvf.fYfirst),
  fYlast(tvf.fYlast),
  fZfirst(tvf.fZfirst),
  fZlast(tvf.fZlast),
  fNpoints(tvf.fNpoints),
  fPointSize(tvf.fPointSize),
  fCacheSize(tvf.fCacheSize),
  fCache(tvf.fCache),
  fObjectFit(tvf.fObjectFit),
  fUserFunc(tvf.fUserFunc),
  fMethodCall(tvf.fMethodCall),
  fFCN(tvf.fFCN) 
{ 
   
}
TVirtualFitter& TVirtualFitter::operator=(const TVirtualFitter& tvf)
{
   
   if(this!=&tvf) {
      TNamed::operator=(tvf);
      fOption=tvf.fOption;
      fXfirst=tvf.fXfirst;
      fXlast=tvf.fXlast;
      fYfirst=tvf.fYfirst;
      fYlast=tvf.fYlast;
      fZfirst=tvf.fZfirst;
      fZlast=tvf.fZlast;
      fNpoints=tvf.fNpoints;
      fPointSize=tvf.fPointSize;
      fCacheSize=tvf.fCacheSize;
      fCache=tvf.fCache;
      fObjectFit=tvf.fObjectFit;
      fUserFunc=tvf.fUserFunc;
      fMethodCall=tvf.fMethodCall;
      fFCN=tvf.fFCN;
   } 
   return *this;
}
TVirtualFitter::~TVirtualFitter()
{
   
   delete fMethodCall;
   delete [] fCache;
   fgFitter    = 0;
   fgMaxpar    = 0;
   fMethodCall = 0;
   fFCN        = 0;
}
TVirtualFitter *TVirtualFitter::Fitter(TObject *obj, Int_t maxpar)
{
   
   
   
   if (fgFitter && maxpar > fgMaxpar) {
      delete fgFitter;
      fgFitter = 0;
   }
   if (!fgFitter) {
      TPluginHandler *h;
      if (fgDefault.Length() == 0) fgDefault = gEnv->GetValue("Root.Fitter","Minuit");
      if ((h = gROOT->GetPluginManager()->FindHandler("TVirtualFitter",fgDefault))) {
         if (h->LoadPlugin() == -1)
            return 0;
         fgFitter = (TVirtualFitter*) h->ExecPlugin(1, maxpar);
         fgMaxpar = maxpar;
      }
   }
   if (fgFitter) fgFitter->SetObjectFit(obj);
   return fgFitter;
}
void  TVirtualFitter::GetConfidenceIntervals(Int_t , Int_t , const Double_t * , Double_t * , Double_t )
{
   
   
}
void  TVirtualFitter::GetConfidenceIntervals(TObject * , Double_t )
{
   
   
}
const char *TVirtualFitter::GetDefaultFitter()
{
   
   return fgDefault.Data();
}
TVirtualFitter *TVirtualFitter::GetFitter()
{
   
   return fgFitter;
}
Int_t TVirtualFitter::GetMaxIterations()
{
   
   return fgMaxiter;
}
Double_t TVirtualFitter::GetErrorDef()
{
   
   return fgErrorDef;
}
Double_t TVirtualFitter::GetPrecision()
{
   
   return fgPrecision;
}
void TVirtualFitter::SetDefaultFitter(const char *name)
{
   
   if (fgDefault == name) return;
   delete fgFitter;
   fgFitter = 0;
   fgDefault = name;
}
void TVirtualFitter::SetFitter(TVirtualFitter *fitter, Int_t maxpar)
{
   
   fgFitter = fitter;
   fgMaxpar = maxpar;
}
void TVirtualFitter::SetFCN(void (*fcn)(Int_t &, Double_t *, Double_t &f, Double_t *, Int_t))
{
   
   
   fFCN = fcn;
}
void InteractiveFCN(Int_t &npar, Double_t *gin, Double_t &f, Double_t *u, Int_t flag)
{
   
   TMethodCall *m = TVirtualFitter::GetFitter()->GetMethodCall();
   if (!m) return;
   Long_t args[5];
   args[0] = (Long_t)∦
   args[1] = (Long_t)gin;
   args[2] = (Long_t)&f;
   args[3] = (Long_t)u;
   args[4] = (Long_t)flag;
   m->SetParamPtrs(args);
   Double_t result;
   m->Execute(result);
}
Double_t *TVirtualFitter::SetCache(Int_t npoints, Int_t psize)
{
   
   
   
   
   
   
   
   
   if (npoints*psize > fCacheSize) {
      delete [] fCache;
      fCacheSize = npoints*psize;
      fCache = new Double_t[fCacheSize];
   }
   fNpoints = npoints;
   fPointSize = psize;
   return fCache;
}
void TVirtualFitter::SetFCN(void *fcn)
{
   
   
   
   if (!fcn) return;
   char *funcname = G__p2f2funcname(fcn);
   if (funcname) {
      delete fMethodCall;
      fMethodCall = new TMethodCall();
      fMethodCall->InitWithPrototype(funcname,"Int_t&,Double_t*,Double_t&,Double_t*,Int_t");
   }
   fFCN = InteractiveFCN;
}
void TVirtualFitter::SetMaxIterations(Int_t niter)
{
   
   fgMaxiter  = niter;
}
void TVirtualFitter::SetErrorDef(Double_t errdef)
{
   
   fgErrorDef = errdef;
   if (!fgFitter) return;
   Double_t arglist[1];
   arglist[0] = errdef;
   fgFitter->ExecuteCommand("SET ERRORDEF", arglist, 1);
}
void TVirtualFitter::SetPrecision(Double_t prec)
{
   
   fgPrecision = prec;
}
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.