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)。
TStringのソースにはForm()がなぜかグローバル関数(!!)として定義されているので、TStringの実体なしに使用ができる。
for(int i=0;i<10;++i){ cout << Form("hoge%d",i) << endl;//hoge0,hoge1,...と出力 }
動作としてはprintfなどで使われるフォーマット文字列を整形して、const char*型にすることができる。
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を使う度に使用された領域の分だけアドレスをずらしている(と思う)ので、割と安全に使えるようになっている。
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
言いたいことは、つまり新しくヒープに確保するわけではないので、メモリリークの心配をせずに使っていいということ。
デフォルトの粒子情報は$ROOTSYS/etc/pdg_table.txtにあるが、ここにないparticleを追加したい場合は自分で追加する必要がある。
やり方としては、予め.rootrcに下の記述をしておくか
Root.DatabasePDG: $(HOME)/my_pdg_table.txt
下のようにファイルを読み込むかどちらかの手段をとる。
TDatabasePDG *pdg = new TDatabasePDG(); pdg->ReadPDGtable(filename)
何らかのイベントが発生したときに、指定したコマンドをCINTで実行させるためのクラス。
具体的には
の3つの場合に指定したコマンドを実行できる。
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を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と表示される。
応用例は思いつかない
c1.AddExec("ex","cout << \"hoge\" << endl;");
上のようにするとcanvasに触れる度にhogeと表示される。何度でも表示される。