だんだん素性がばれてきそうですが、、、、

ROOT(http://root.cern.ch/)を使ってみます。フィッティングなんぞをしたいわけで、CERNlibのMINUITを使っていたわけですが、もういい加減Fortranも、cfrotran.hをつかったCも飽きてきました。というか、使いづらい。てなわけでC++で進めたいということです。ヒストラグラムになんらかの関数をフィットさせたいわけではなくて、手元にあるデーターを好きな関数でフィットしたいので、ヒストグラムのインターフェースで提供されるフィットでは少々物足りない。余分なものはいらないので、自作のプログラムから必要なクラスだけを使います。今回はTMinuit.hです。

っとその前にインストール。ホームページからソースをもってきて、適当な場所に展開して、> ./configure; make でOK。とりあえず展開したディレクトリをROOTSYS環境変数に設定し、$ROOTSYS/binをPATHに、$ROOTSYS/libを$LD_LIBRARY_PATHにいれておきます。

ユーザーガイドを見ても、リファレンスを見てもいまいち良く分からなかったのですが、要するにTMinuitを継承して新しいクラスを作り、
virtual Int_t Eval(Int_t npar, Double_t* grad, Double_t& fval, Double_t* par, Int_t flag)
関数をオーバーライドしてしまえば良いというわけですね。virtual関数を使うので、仮想デストラクタを使ったり、コンストラクタをでTMinuitをフィットパラメーターの数で初期化したり、とりあえずパラメーターをDefineParameter()関数で初期設定したりしておけばよさそうです。

あとはMinuit関連のメンバー関数を使ってあげればよろしい。オリジナルのFortranのコード、cfortran.hによるCからの利用と比べても格段に使い勝手はよろしいですねぇ。コードそのものがFortranからの焼き直しということもあり、Eval関数の引数には少々無理があるように思えますが。。。。。

DebianのパッケージにCERNlibが収録されていますが、いまさらCERNlibを収録するくらいならROOTのほうが良いともおもいますね。