1999/08/06    libg2c.a in egcs-1.1.2-12c and Physics Analysis Package

[1] libg2c.a in egcs-1.1.2-12c

egcs 版の libf2c のライブラリーでちょっと困った問題に遭遇した。C++ プログラムと FORTRAN プログラムが混在する共有ライブラリーを作ろうとして -lg2c をつけると、出来た共有ライブラリーはダイナミックローディング出来ない。どうやら、libg2c.a は PIC フラッグを立てずに 作られているようである。
  1. この問題は、共有ライブラリーを作る際には -lg2c をつけずに、 アプリケーションの所で -lg2c をつけることにより回避可能である。 しかしこの方法では、共有ライブラリーが使うと想定される FORTRAN 組み込み関数の 全てを、アプリケーションプログラム中で明示的に使うことにより、 静的にリンクしておく必要がある。 これでは、場合によっては、共有ライブラリーを作る度にアプリケーションも 作りなおさなければならない可能性が生じ、あまりうれしくない。
  2. もう一つの解決法は、もちろん、-fPIC をつけて libg2c.a を作りなおすことである。ただ、それをしていないのには何か理由があるのであろうか?ちなみにインテル系の Linux (RedHat-6.0) では問題がないので、確かめたわけではないが、-fPIC つきでコンパイルされているような気がする。
というわけで、結局、自己責任ということで、自分用の libg2c.a を -fPIC 付きで作りなおすことにした。-fPIC をつけるパッチはここにある。また、RPM 作成用の SPEC はここ。できた RPM は
egcs-1.1.2-12cm.ppc.rpm
egcs-c++-1.1.2-12cm.ppc.rpm
egcs-g77-1.1.2-12c.ppc.rpm
egcs-g77-1.1.2-12cm.ppc.rpm
egcs-objc-1.1.2-12cm.ppc.rpm
SRPM は
egcs-1.1.2-12cm.src.rpm
である。

もちろん、FORTRAN 関数を含む共有ライブラリーを作るなどということをしなければ、全く不要の変更である。"rpm -Uvh" で放り込んで使っているが、今の所何の問題もない(もちろん、FORTRAN 以外の部分では何の変更もないはずである)。FORTRAN 関数を含む共有ライブラリーも問題なくダイナミックロードできるので思惑どおおりである。とはいえ、作るのも自己責任なら使うのも自己責任
 
 

[2] 解析プログラム開発近況

TObjArray を継承したジェットクラスを使ったジェットファインダーがインタープリターモード(RCINT)でうまく動かなかった問題は、ロッカブル・ローレンツベクタークラスの多重継承のプライオリティーを

    class LockableLVector :  public Lockable, public LVector;

から

    class LockableLVector : public LVector, public Lockable

に変更したら解決した。

理由は調べていないが、

    class Lockable        (Root Objectでない)
    class LVector         (Root Object つまり TObject を継承)

なので、多重継承では Root Object を先に置く必要があるようである。

ジェットファインダーの使い方

ジェットファインダーは、TObjArray tracks がイベント中のトラックの LockableLVector のアレイとして

Double_t ycut = 0.001;                  // ycut の設定
ANLJadeEJetFinder jclust(ycut);         // JetFinder のインスタンスの生成
jclust.Initialize(tracks);              // クラスタリングする track をセット
jclust.FindJets();                      // 与えられた ycut でジェットクラスタリングを実行

Int_t njets = 6;                        // ジェットの本数を指定
jclust.FrorceNJets(njets);              // その本数になるように ycut を調整

のように使う。jclust.FindJets() をやらずにいきなり jclust.FrorceNJets(njets) をしてもよい。

ジェットファインディングの結果は

TObjArray &jets = jclust.GetJets();     // 結果の参照を TObjArray として返してもらう
TIter nextjet(&jets);                   // その TObjArray にアクセスする iterator を生成
ANLJet *jetPntr;
while ((jetPntr = (ANLJet *)nextjet())) {
  ANLJet &jet = *jetPntr;
  LockableLVector p4jet = jet();        // ジェットの4元運動量を取得
  histEjet->Fill(p4jet.E());            // ジェットのエネルギーのヒストグラムをフィル
  .....
}
のように使える。現在、広島大学の池松氏とともに、孤立レプトン検出、カット、イベントシェイプ、その他の解析用クラスを開発中。今月の終わりくらいにはベータ版をリリース予定。その後は、測定器シミュレーター、イベントジェネレーターと進むつもり。
 


Back to Keisuke Fujii's MkLinux/LinuxPPC Life