物理学生の備忘録
物理を勉強している大学生です。最近めっきり更新してないから、日記というかプログラムとかメモとかおいておこう かな
プロフィール

asu2ikl4

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

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

検索フォーム

RSSリンクの表示

リンク

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

ブロとも申請フォーム

この人とブロともになる

QRコード

QR

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

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の書き込みモードを許可していないと
ちゃんと保存されないみたい。





生データからROOTファイルに変換
生データのファイルは例えば2列、イベントごとにx yとしているものとする
データファイル名:data.dat
変換後のROOTファイル:smp.root

{
//--------------データファイル->ROOTファイル---------------------------
gROOT ->Reset();
TFile* f = new TFile("smp.root","recreate");
TTree* tree = new TTree("t1","t1:raw data");

double x,y;

tree->Branch("x",&x,"x/D");
tree->Branch("y",&y,"y/D");

ifstream data ("data.dat");//データオープン
while (data >> x >>y)tree->Fill();
data->close(););//データクローズ
t1->Write();
}


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