ユーザ用ツール

サイト用ツール


サイドバー

Menu

Latest

study:software:root:other

Other

TString

  • ほとんどstd::stringと同じようなクラス
  • stringが苦手なフォーマット文字列の処理が可能なので、若干使いやすい
  • TObjectを継承していないので、Collection Classを使いたいときはTObjStringを使う

TString s1("hoge");
TString s1 = "hoge";

上のどちらでも初期化できる。

TString s1;
s1.Form("hoge%d",2);

[ ] TString s1("hoge");
[ ] TString s2("!!!");
[ ] s1 += s2;
[ ] s1
(class TString)"hoge!!!"
[ ] s1 += "hoge";//加算代入は文字列や数値でも定義されている
[ ] s1
(class TString)"hoge!!!hoge"

[ ] TString s1("hoge");
[ ] cout << s1[1] << endl;
o
[ ] cout << s1(1,2) << endl;
og
[ ] s1[1] = "a";
[ ] cout << s1 << endl
hage

s1.Data();//つまりstd::stringのc_str()と一緒。

TString s1 = "123 456"
s1.Atoi();//文字列をInt_t型へ

itoa関数は静的メンバ関数として定義されている。

TString::Itoa(15,2);//Int_t型を文字列へ。第二引数は進数をあらわす(この場合=1111)。

Form・フォーマット文字列を整形して返り値にする

TStringのソースにはForm()がなぜかグローバル関数(!!)として定義されているので、TStringの実体なしに使用ができる。

for(int i=0;i<10;++i){
  cout << Form("hoge%d",i) << endl;//hoge0,hoge1,...と出力
}

動作としてはprintfなどで使われるフォーマット文字列を整形して、const char*型にすることができる。

Formの返り値を下のようにポインタに確保しないこと。

const char* str = Form("hoge");

基本的にはForm()とかstring::c_str()とかTString::Data()とかそういうので得られたconst char*は次のようにすぐさま使用すること。

TH1F *h = new TH1F(Form("hoge"),"",100,0.,10.);

どうしてもいったん変数に入れておきたい場合はstrcpyを使う。

char str[100];
strcpy(str,Form("hoge"));

のように配列を用意する。特に関数に渡す場合は動作がはっきりしない場合は配列にコピーしたほうが安全。


Formは内部的な動作として静的変数で大きめの文字配列を用意して、そこに文字列を確保している。

Formを使う度に使用された領域の分だけアドレスをずらしている(と思う)ので、割と安全に使えるようになっている。

TDatabasePDG

pdg(Particle Data Group)の粒子情報を取得するクラス。

CLHEP(C++ Library for High Energy Physics experiment)にもHepPDTというライブラリが存在していて、似たようなことができる(使い方は知らないけど…)。そのROOT版といったところ。

// lib :  libEG
// #include "TDatabasePDG.h"

TDatabasePDG *pdg = new TDatabasePDG();
TParticlePDG *particle = pdg->GetParticle(id); //pdgIdについてはhttp://pdg.lbl.gov/2004/reviews/montecarlorpp.pdf
particle->GetName(); //粒子の名前
particle->Mass(); //質量
particle->Spin(); //スピン
particle->Lifetime(); //寿命
...

TParticlePDGは通常はTDatabasePDGから呼び出されるクラスで各粒子情報をもっている。

詳細はhttp://root.cern.ch/root/html/TParticlePDG.html

ちなみにGetParticleでは予め作っておいたTParticlePDGのリストからオブジェクトを呼び出している。

言いたいことは、つまり新しくヒープに確保するわけではないので、メモリリークの心配をせずに使っていいということ。

デフォルトの粒子情報は$ROOTSYS/etc/pdg_table.txtにあるが、ここにないparticleを追加したい場合は自分で追加する必要がある。

やり方としては、予め.rootrcに下の記述をしておくか

Root.DatabasePDG: $(HOME)/my_pdg_table.txt

下のようにファイルを読み込むかどちらかの手段をとる。

TDatabasePDG *pdg = new TDatabasePDG();
pdg->ReadPDGtable(filename)

TExec

何らかのイベントが発生したときに、指定したコマンドをCINTで実行させるためのクラス。

具体的には

  • TPadにDrawしたたとき
  • TH1又はTGraphをDrawしたとき
  • TPadにMouthが乗った時やクリックした時

の3つの場合に指定したコマンドを実行できる。

TPadにDrawしたとき

TCanvas *c = new TCanvas("c","c");
TExec *ex = new TExec("ex","cout << \"hoge\" << endl;");
ex->Draw();

TText t;
t.DrawTextNDC(.5,.5,"label");

上を実行すると、hogeと表示される。

仕組みとしてはexが描かれているTPadがModifiedの状態でUpdateされると、そのコマンドが実行される。

上の例文のマクロはミスリーディングで、実はTTextのDrawをしなくてもhogeと表示される。

exを描いた時点で、canvasがModifiedのフラッグが立っているので、マクロ終了時のUpdate()で反応してしまう。

場合によっては

c->Modified(0);

のようにしてフラッグをおる必要がある。スクリプト実行中は明示的に呼び出ない限り、canvasはUpdate()されないことにも注意が必要。


また例えばTH1をDraw()してもコマンドは実行されない。

TH1はDrawすると既にTPadに描かれていたオブジェクトをすべて削除する性質があるので、TExecも削除してしまうためである。

もちろんDraw("same")ならば削除されないのでコマンドが実行される。


以上のようにTExecはあまり使いやすいとは言いがたい。

TH1又はTGpraphをDrawしたとき

あるTH1をDrawしたときに特定のコマンドを実行させることができる。

TH1F *h = new TH1F("h","title",100,0.,1.);
TExec *ex = new TExec("ex","cout << \"hoge\" << endl;");
h->GetListOfFunctions()->Add(ex);

この場合、hをDrawすると、hogeと表示される。

応用例は思いつかない

TPadにMouthが乗った時やクリックした時

c1.AddExec("ex","cout << \"hoge\" << endl;");

上のようにするとcanvasに触れる度にhogeと表示される。何度でも表示される。

study/software/root/other.txt · 最終更新: 2013/09/05 03:10 by kamo

ページ用ツール