Re: Fit function

Rene Brun (Rene.Brun@cern.ch)
Sat, 28 Mar 1998 16:01:39 +0100


Laurent,
I am taking the opportunity of your mail to announce a new HOWTO
explaining how to invoke Fortran routines compiled in an archive
library (for example CERNLIB) from the interpreter.
See URL;
http://root.cern.ch/root/HowtoCERNLIB.html

Rene Brun

Laurent Mirabito wrote:
>
> Hello all,
>
> I tried to define a fit function to a Landau distribution using denlan
> from the Cernlib. To do this I recompile the root application linking
> denlan. It works fine if I define my fit function fitlan.C with a macro.
> If I try to link it also I cannot use it in a TF1 definition.
> (I'm running on a PC-Linux Debian 1.3 with root 2.02)
> Any Ideas ?
> Best regards
> Laurent
>
> Exemple:
>
> [/users/delphi/mirabito/root/me] myroot
> 0.039163
> *******************************************
> * *
> * W E L C O M E to R O O T *
> * *
> * Version 2.00/02 23 March 1998 *
> * *
> * You are welcome to visit our Web site *
> * http://root.cern.ch *
> * *
> *******************************************
>
> CINT/ROOT C/C++ Interpreter version 5.13.45, Mar 17 1998
> Type ? for help. Commands must be C++ statements.
> Enclose multiple statements between { }.
> root [0] Double_t x[1]={200.};
> root [1] Double_t par[3]={1000.,200.,50.};
> root [2] printf("%f \n",fitlan(x,par));
> 178.854167
> root [3] TF1* l = new TF1("fitlan",fitlan,0,2000,3);
> root [4] l->SetParameters(1000.,200.,50.)
> root [5] l->SetParNames("Sum","Maximum of Probability","Width")
> root [6] l->Draw()
> Warning in <MakeDefCanvas>: creating a default canvas with name c1
>
> *** Break *** segmentation violation
>
> *** Break *** segmentation violation
>
> -- myroot.h
> extern "C" Double_t denlan_(Float_t *x);
> extern Double_t fitlan(Double_t *x,Double_t *par);
>
> -- myroot.C
> ///////////////////////////////////////////////////////////////////////////////////////////////////////
> //
> //
> // RMain
> //
> //
> //
> // Main program used to create ROOT application.
> //
> //
> //
> //////////////////////////////////////////////////////////////////////////
>
> #include "TROOT.h"
> #include "TRint.h"
> #include "myroot.h"
> #include <TApplication.h>
> #include <TGClient.h>
>
> extern void InitGui();
> VoidFuncPtr_t initfuncs[] = { InitGui, 0 };
>
> TROOT root("Rint","The ROOT Interactive Interface", initfuncs);
>
> //______________________________________________________________________________
> int main(int argc, char **argv)
> {
> Float_t tt = 5.0;
> printf("%f \n",denlan_(&tt));
> TRint *theApp = new TRint("Rint", &argc, argv, 0, 0);
> // TApplication *theApp= new TApplication("App", &argc, argv);
> // Init Intrinsics, build all windows, and enter event loop
> theApp->Run();
>
> delete theApp;
>
> return(0);
> }
>
> -- fitlan.C
>
> //extern Double_t denlan(Double_t*);
>
> #include "TROOT.h"
> #include "TMath.h"
> #include "myroot.h"
>
> Double_t fitlan(Double_t *x,Double_t *par)
> {
> /* System generated locals */
> Float_t r__1;
> Double_t ret_val;
> /* Local variables */
>
> ret_val = 0.;
> r__1 = (x[0] - TMath::Abs(par[1])) / TMath::Abs(par[2]);
> ret_val = par[0] * (denlan_(&r__1));
> return ret_val;
> } /* fitlan*/
>
> Laurent Mirabito
> IPN Lyon