FC2ブログ
冴えないポスドクの備忘録
ポスドクになっちゃった。最近めっきり更新してないから、日記というかプログラムとかメモとかおいておこうかな
プロフィール

asu2ikl4

Author:asu2ikl4
ポスドク
物理学専攻
テーマ「高エネルギー素粒子原子核物理」、「放射線測定器開発」など

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

ブロとも申請フォーム

この人とブロともになる

QRコード

QR

スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

学会終わりのつかの間の休日
お盆休みに働いてたことで特別休暇をもらいました。
ちょうど学会が17日まであったので、その翌日から、

ちょうどいいので有給を連チャンでとって3連休まで長い休みにしちゃいました。
休んでないで、ほんと研究しろよって!言われそうです。

久々に実家帰って、親から小言も言われ、
駐輪場のバイクがいざ乗ろうと思ったらバッテリー上がってて乗れないし、
なかなか実家帰れないから、もうバイク売っちゃおうって、

勢いで業者呼んで持って行ってもらいました。
どーなったかな、いたるところサビサビになってたから、金になるのかどうか、
業者の人にも言われました。

査定に数日かかるみたいなので、
休みの間、待ってることにしましょう。


実家戻ると、何もやる気が起きないですねw
栄気養って、出直してきますw
スポンサーサイト
Makefileって
Makefileというのは、簡単に言うと、コンパイルのマクロファイルのこと
コマンド: gcc, cc, c++, g++など、そしてオプションなどをたらたら書いているのを、
テキストファイルに書いておいて、

make

と打てば、コマンドが実行される。そんな機能です。
とりあえず、Makefileをコンパイルしたいプログラムソースと同じディレクトリに作ります。
エディタは何でもいいんですが、(ここではgeditを使います)
$gedit Makefile

#Malefile
test: test.o
 c++ -Wall -O2 -o test test.o
test.o: test.cpp
 c++ -c test.cpp
clean:
 rm -f test test.o

ちなみに、ここでソース名は"test.cpp"としているよ
$make
makeコマンドでtest.cppをコンパイルし、実効ファイルtestが生成されます。
$make clean
cleanオプションを加えると実効ファイルを消します。
ね、原理は簡単でしょ。

違うプログラムを実行したい時は、テキストの"test"を全てソース名に変えて使えば問題ないです。

install:
 cp test /usr/local/bin/

を加えると、
$make install
このコマンドで/usr/local/bin/にコピーなど好きなコマンドを設定することができます。

ROOTでGUI実装 その1
ROOTのGUI builderを使えば簡単にGUIが実装できるらしい。

今回の目標はGUIの基本なるフレームやボタン配置、
そしてボタンを押したらアクションするように実装すること

手順1. ROOTのTBrowserを開いて[Tools] -> [ROOT GUIBuilder]を起動する。
%root
[0] TBrowser tb


85.png

手順2. 適当にフレームとボタンを配置していこう。

86.png


切りがいいところで、保存。
保存したファイルの中身を確認すると、何だかよくわからないものがたくさん書かれている。


// Mainframe macro generated from application: /usr/local/root/bin/root.exe
// By ROOT version 5.34/18 on 2015-06-21 19:55:34

#ifndef ROOT_TGDockableFrame
#include "TGDockableFrame.h"
#endif
#ifndef ROOT_TGMenu
#include "TGMenu.h"
#endif
#ifndef ROOT_TGMdiDecorFrame
#include "TGMdiDecorFrame.h"
#endif
#ifndef ROOT_TG3DLine
#include "TG3DLine.h"
#endif
#ifndef ROOT_TGMdiFrame
#include "TGMdiFrame.h"
#endif
#ifndef ROOT_TGMdiMainFrame
#include "TGMdiMainFrame.h"
#endif
#ifndef ROOT_TGMdiMenu
#include "TGMdiMenu.h"
#endif
#ifndef ROOT_TGListBox
#include "TGListBox.h"
#endif
#ifndef ROOT_TGNumberEntry

.
.
.
void textGUI(){
TGMainFrame *fMainFrame1619 = new TGMainFrame(gClient->GetRoot(),10,10,kMainFrame | kVerticalFrame);
fMainFrame1619->SetName("fMainFrame1619");
fMainFrame1619->SetLayoutBroken(kTRUE);
TGCompositeFrame *fMainFrame1452 = new TGCompositeFrame(fMainFrame1619,490,372,kVerticalFrame);
fMainFrame1452->SetName("fMainFrame1452");
fMainFrame1452->SetLayoutBroken(kTRUE);
// embedded canvas
TRootEmbeddedCanvas *fRootEmbeddedCanvas1322 = new TRootEmbeddedCanvas(0,fMainFrame1452,280,120);
fRootEmbeddedCanvas1322->SetName("fRootEmbeddedCanvas1322");
Int_t wfRootEmbeddedCanvas1322 = fRootEmbeddedCanvas1322->GetCanvasWindowId();
TCanvas *c123 = new TCanvas("c123", 10, 10, wfRootEmbeddedCanvas1322);
fRootEmbeddedCanvas1322->AdoptCanvas(c123);
fMainFrame1452->AddFrame(fRootEmbeddedCanvas1322, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fRootEmbeddedCanvas1322->MoveResize(128,16,280,120);
TGTextButton *fTextButton1373 = new TGTextButton(fMainFrame1452,"OK");
fTextButton1373->SetTextJustify(36);
fTextButton1373->SetMargins(0,0,0,0);
fTextButton1373->SetWrapLength(-1);
fTextButton1373->Resize(90,22);
fTextButton1373->Connect("Clicked()","fMainFrame1452","","func1()");
.
.
.



いらないものを消していくと、


void textGUI(){
// main frame
fMainFrame = new TGMainFrame();
fMainFrame->SetName("fMainFrame");
fMainFrame->SetLayoutBroken(kTRUE);

// sub frame
SubFrame = new TGCompositeFrame(fMainFrame,490,120,kVerticalFrame);
SubFrame->SetName("SubFrame");
SubFrame->SetLayoutBroken(kTRUE);
fMainFrame->AddFrame(SubFrame, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
SubFrame->MoveResize(0,0,490,150);//sub frame x,y, width, height

// ボタン:OK
button_A = new TGTextButton(SubFrame,"OK");
button_A->MoveResize(8,72,90,22);//引数: x,y,width,height [bit]
button_A->Connect("Clicked()", 0, 0, "func1()");

// ボタン:cancel
button_B = new TGTextButton(SubFrame,"cancel");
button_B->Connect("Clicked()", 0, 0, "clear_canvas()");
button_B->MoveResize(8,96,90,22);//引数: x,y,width,height [bit]

//キャンパス
canv = new TRootEmbeddedCanvas(0,SubFrame,280,120);
canv->SetName("canv");
Int_t wcanv = canv->GetCanvasWindowId();
c1 = new TCanvas("c1",10,10,wcanv);
canv->AdoptCanvas(c1);
SubFrame->AddFrame(canv, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
canv->MoveResize(192,8,280,140);//引数: x,y,width,height [bit]

fMainFrame->SetMWMHints(kMWMDecorAll, kMWMFuncAll, kMWMInputModeless);
fMainFrame->MapSubwindows();
fMainFrame->Resize(fMainFrame->GetDefaultSize());
fMainFrame->MapWindow();
fMainFrame->Resize(490,150);//window size
}

//関数
void func1(){
cout << "debug" << endl;
c1->cd();
hist=new TH1S("hist","hist",10,0,10);
hist->SetBinContent(0,10);
hist->SetBinContent(1,11);
hist->SetBinContent(2,20);
hist->SetBinContent(3,30);
hist->SetBinContent(4,100);
hist->SetBinContent(5,20);
hist->SetBinContent(6,10);
hist->SetBinContent(7,9);
hist->SetBinContent(8,10);
hist->SetBinContent(9,10);
hist->Draw();
c1->Update();
}

void clear_canvas(){
c1->Clear();
c1->Update();
}



ボタンの配置と関数とのコネクトなどはたった3行でできてしまう。
とりあえず出来たGUIを起動してみよう

%root -l textGUI.c
87.png


ボタンOKを押すと右のキャンバスにヒストグラムが書かれ、
cancelボタンを押すと消える単純な設計が出来上がった。




TCanvasの分割率を設定したい
キャンバスの分割は

{
c1=new TCanvas("c1");
c1->Divide(1,2);//1x2に分割
//上
c1->cd(1);
f=new Tfile("tmp.root");//ここで、例えばヒストグラムが入っていたとすると
hist1->Draw();
//下
c1->cd(2);
hist2->Draw();
c1->cd(2)->SetLogx();//ここで、対数スケール
c1->cd(2)->SetGridx();//x軸点線挿入
c1->cd(2)->SetGridy();//y軸点線挿入
}
これでうまくとおるはず、




上を80%で下を20%の領域に分割したい。
そんなとき、
{
c1=new TCanvas("c1","",10,30,1000,800);
double sepa=0.8;//上下の比
TPad *pad0 = new TPad("pad0", "pad0",0.0,0.95-sepa,0.99,0.99, 0,0.01,0);
//まずはTPadを用意してc1キャンバスに書いていくという方針。
//サイズを指定して、ちょうど上80%を占めるようにする。
//TPadの引数は名前、名前、左下(x1, y1),右上(x2,y2), 0,0.01,0
//最後の3つはなんだっけ?

pad0->Draw();
pad0->SetNumber(1);//番号をつけてidする


c1->cd();
//もとのキャンバスに戻って、同様に下のもつくる
TPad *pad1 = new TPad("ratio", "ratio",0.0,0.05,0.95,0.95-sepa, 0,0.01,0);//divide(bottom)
pad1->Draw();
pad1->SetNumber(2);

f=new TFile("tmp.root");
c1->cd(1);
hist1->Draw();
c2->cd(2);
hist2->Draw();
c1->cd(2)->SetLogx();
c1->cd(2)->SetGridx();
c1->cd(2)->SetGridy();
}

Treeがちゃんと保存されない
ROOT解析プログラムでTreeを作成し、
コマンド「tree->Write()」
をしたのに、エラーが生じて保存されない。
どうしてだろう?

詳しい状況を説明すると、
あるディレクトリ内でROOTファイル「tmp.root」が存在している
この中にデータをFill()したtreeを保存したい。

$root
[0] f=new TFile("tmp.root")
[1] ...ループでデータ読み込み...
[2] tree->Fill()
[3] tree->Write()
Warning in : file t1 not opened in write mode
(Int_t)0
[4] .ls
TFile** tmp.root
TFile* tmp.root
OBJ: TTree tree: tree


上手く保存されない原因は、
ROOTファイルを開く時のモードが書き込み可能になっていないことである。

TFile()コマンドには2つの引数をもつ
最初はファイル名
2つめはファイルをひらくときのモード選択である。

何もないと読み込みのみである。
コマンド:"recreate" ... 新しくROOTファイルを書き込む
コマンド:"update" ... 既存のROOTファイルを上書きで書き込む、新規でも可能


Treeの保存についてはTFileの書き込みモードを許可していないと
ちゃんと保存されないみたい。






上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。