サマチャレ 2017
データ解析
の編集
-- 雛形とするページ --
BracketName
FAQ
FormattingRules
FrontPage
Help
InterWiki
InterWikiName
InterWikiSandBox
MenuBar
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
SandBox
WikiEngines
WikiName
WikiWikiWeb
YukiWiki
グループ1
グループ2
グループ3
グループ4
グループA
グループB
グループC
グループD
サマーチャレンジ 2017
データ収集制御
データ解析
ラドン検出の原理
写真等
原子核崩壊の基本
実験装置
発表資料まとめ
自己紹介
資料集
[[サマーチャレンジ 2017]] #contents *ROOT [#w92b2400] ROOTはCERN (欧州共同原子核研究機構)によって開発されたデータ解析用ソフトウェアであり、高エネルギー物理学の分野で広く使用されている。ROOTはC++プログラムで動作させることができ、ヒストグラム作成やグラフ描画、フィッティング等のデータ解析に必要な処理を簡単に取り扱うことができる。 CENTER:&ref(./rooticon.jpg,20%);&ref(./rootIcon2.jpg,25%); **ROOTのインストール [#p03a1e08] ROOTは[[CERN:http://public.web.cern.ch/Public/Welcome.html]] (欧州共同原子核研究機構)によって開発されたデータ解析用ソフトウェアであり、高エネルギー物理学の分野で広く使用されている。ROOTはC++プログラムで動作させることができ、ヒストグラム作成やグラフ描画、フィッティング等のデータ解析に必要な処理を簡単に取り扱うことができる。 1. http://root.cern.ch/root/から”Download”をクリックし、”recommended(赤文字)”を選択する。 その中の下の方にある”Windows”以下にある”VC++9 MSI(Release)"をダウンロードする。 2. ダウンロードしたファイルを開き、手順に従いインストールする。 3. デスクトップにrootのアイコン(木の絵)ができているはず。起動できればインストール完了。 Tera Padやテキストエディタなどでプログラムを作成し、プログラムファイルをrootのアイコンにドラッグ&ドロップすれば、プログラムが動く(はず)。 実際にサンプルプログラムを動かしたり、参考資料を見て、rootとC++プログラムに慣れよう! **参考資料 [#nf7046db] [[猿でもわかるROOT:http://www.dw-sapporo.co.jp/technology/658766f830d530a130a430eb7f6e304d5834/733f306b30824f7f3048308bROOT.pdf]]~ [[猿ROOT【番外編】:http://www.ppl.phys.chiba-u.jp/~hoshina/doc/c%2B%2B/main.pdf]] [[ROOT tutorials(English):http://root.cern.ch/root/html534/tutorials/]]~ [[ROOT コマンド集(日本語):http://atlas.kek.jp/comp/ROOT-commands.html]]~ **C++/ROOTのサンプルプログラム [#ead007f5] コピペして実行すれば動くはず。 ***例題1: 繰り返し(for)文、条件(if)文。 [#d8fea661] void Ex1(){ //関数名(Ex1)はファイル名(Ex1.C)と同じにする //for文 //中括弧の中の命令をiを1づつ増やしながら、10回繰り返す for( int i=0; i<10; i++ ){ cout << "i = " << i << endl; //画面に表示。endlは改行 } cout << endl; for( int i=0; i<10; i++ ){ //if文 //ifの後の括弧内に書かれた条件に一致するときだけ、中括弧内を実行 if( i>3 && i<8 ){ cout << "i = " << i << endl; } } } ***例題2: 配列の使い方。 [#e5ac251e] void Ex2(){ //intは整数型の変数 int x1; int y1[2]; //1次元配列(2x1の行列みたいなもの) int z1[3][3]; //2次元配列(3x3の行列みたいなもの) //floatは少数も扱える(doubleとかもあるよ) float x2; float y2[2]; //変数に値を代入 x1 = 100 / 3.0; x2 = 100 / 3.0; cout << endl; cout << "x1=" << x1 <<" x2="<< x2 << endl; //計算結果を表示、結果は同じかな?? cout << endl; //for文を使って、値を代入 for( int i=0; i<2; i++ ){ y1[i] = (i+1) * 10.5; //i番目の要素に値を代入 y2[i] = (i+1) * 10.5; cout << "y1[" << i << "]=" << y1[i] << " y2[" << i << "]=" << y2[i] << endl; } cout << endl; //2次元配列に0~8を代入して、表示 cout << "z1[3][3]=" << endl; for( int i=0; i<3; i++ ){ for( int j=0; j<3; j++ ){ z1[i][j] = i*3 + j; cout << z1[i][j] <<" "; } cout << endl; } } ***例題3: データファイルを読み込む。 [#z4e832d6] #include<fstream> //ファイルを読み込むための設定 void Ex3(){ std::ifstream file; file.open("data.dat"); //""内の名前のファイルを開く if( !file ){ //開けなかった時のエラー処理 cout << "Could not open file!" << endl; return; } string x, y; //文字列型の変数 while( !file.eof() ){ file >> x >> y; //ファイルからx,yに2つずつ値を代入 cout << x <<" "<< y << endl; } } ***例題4: ヒストグラムを作る。 [#nad105b3] void Ex4(){ //1次元ヒストグラムの作る //括弧の中はそれぞれ、 // 名前、タイトル、ヒストグラムの分割数、最小値、最大値 TH1F *h1 = new TH1F( "name", "title", 100, -10, 10 ); //ガウス分布を発生させて、ヒストグラムに入れてみる for( int i=0; i<1000; i++ ){ float x = gRandom->Gaus( 0, 3 ); //平均0、標準偏差3のガウス分布を発生させている h1->Fill( x ); // ヒストグラムにxを入れている } //作ったヒストグラムを表示 //勝手にcanvasと呼ばれる窓が作られる(自分でサイズを指定して作ることもできる) h1->Draw(); } ***例題5: ヒストグラムを関数でfitする(ガウス分布)。 [#sd42aae1] void Ex5(){ gStyle->SetOptFit(1); //フィットの結果を表示するおまじない //1次元ヒストグラムの作る TH1F *h1 = new TH1F( "name", "title", 100, -10, 10 ); //ガウス分布を発生させて、ヒストグラムに入れてみる for( int i=0; i<1000; i++ ){ float x = gRandom->Gaus( 0, 3 ); //平均0、標準偏差3のガウス分布を発生させている h1->Fill( x ); // ヒストグラムにxを入れている } h1->Draw(); //ガウス関数でヒストグラムをfitする h1->Fit("gaus"); } ***例題6: ヒストグラムを関数でfitする(自分で関数を定義)。 [#ve4b6515] void Ex6(){ //1次元ヒストグラムの作る TH1F *h1 = new TH1F( "name", "title", 100, -10, 10 ); //ガウス分布を発生させて、ヒストグラムに入れてみる for( int i=0; i<1000; i++ ){ float x = gRandom->Gaus( 0, 3 ); //平均0、標準偏差3のガウス分布を発生させている h1->Fill( x ); // ヒストグラムにxを入れている } h1->Draw(); //fitする関数を定義する。 //TF1は、1次元の関数を表す。 //括弧内はa、名前、関数式、範囲 TF1 *fgs = new TF1( "fgs", "[0] * exp( -0.5*(x-[1])*(x-[1]) / [2] / [2] )", -5, 5 ); fgs->SetParameters( 100, 0, 2 ); //初期値の設定(初期値が変な値だとfitに失敗することもある) h1->Fit( fgs ); } ***例題7: ヒストグラムを関数でfitする(応用編)。 [#re399252] Double_t MyGaus( Double_t *x, Double_t *par ); void Ex7(){ //1次元ヒストグラムの作る TH1F *h1 = new TH1F( "name", "title", 100, -10, 10 ); //ガウス分布を発生させて、ヒストグラムに入れてみる for( int i=0; i<1000; i++ ){ float x = gRandom->Gaus( 0, 3 ); //平均0、標準偏差3のガウス分布を発生させている h1->Fill( x ); // ヒストグラムにxを入れている } h1->Draw(); //ガウス関数でヒストグラムをfitする //自分で定義した関数名を2つめの引数に書けば良い TF1 *fgs = new TF1( "fgs", MyGaus, -6, 6, 3 ); fgs->SetParameters( 100, 0, 2 ); fgs->SetLineColor(kBlue); h1->Fit( fgs, "R" ); //"R"は範囲を指定してのfitting。fit範囲はfgsで指定した-6~6 } //double型の関数を定義 //引数に対して計算したガウス関数の値を返す Double_t MyGaus( Double_t *x, Double_t *par ){ Double_t val; if( par[2]==0 ) val = -99999; else val = par[0] * exp( -0.5 * ( x[0] - par[1] ) * ( x[0] - par[1] ) / par[2] / par[2] ); return val; } ***例題8: データをグラフで表示する。 [#ce0af8fe] void Ex8() { //テキストファイルを生成 Data(); //テキストファイルdata.datを開く ifstream fin("data.dat"); if(!fin){ cout << "can't open file" << endl; return; } //グラフを作る(誤差なし) TGraph* graph = new TGraph(); graph->SetMarkerStyle(20);//データを丸で表示 //入力ファイルを読み込む //xとyに値を代入 int i=0; double x,y; while( fin >> x >> y ) { //グラフに値を代入。iはグラフの何番目に値を入れるかを指定 graph->SetPoint(i,x,y); i++; } //グラフを表示。オプション"A"は必須 //Pはデータをポイントで表示 //PをLにすると? graph->Draw("AP"); } // Generate data.dat file void Data() { ofstream fout("data.dat"); TF1* f = new TF1("f","[0]*x", 0, 10); f->SetParameter(0, gRandom->Rndm()); for(Int_t i=0;i<10;i++){ const Double_t x = gRandom->Rndm()*10.0; const Double_t y = f->Eval(x); fout << x << " " << y << endl; } } ***例題9: データをグラフで表示、フィットする。 [#zf969be0] void Ex9() { //テキストファイルを生成 Data(); //テキストファイルdata.datを開く ifstream fin("data.dat"); if(!fin){ cout << "can't open file" << endl; return; } //グラフを作る(誤差あり) TGraphErrors* graph = new TGraphErrors(); graph->SetMarkerStyle(20);//データを丸で表示 //入力ファイルを読み込む //xとyに値を代入 int i=0; double x,y; double ex,ey; //xとy誤差 while( fin >> x >> y >> ex >> ey ) { //グラフに値を代入。iはグラフの何番目に値を入れるかを指定 graph->SetPoint(i,x,y); graph->SetPointError(i,ex,ey); i++; } //グラフを表示。オプション"A"は必須 //Pはデータをポイントで表示 //PをLにすると? graph->Draw("AP"); //データを直線でフィット TF1* f = new TF1("f", "pol1", 0, 10); f->SetParameters(0,1); graph->Fit(f,"r"); } // Generate data.dat file void Data() { ofstream fout("data.dat"); TF1* g = new TF1("g","gaus", -10, 10); g->SetParameter(0, 1.0); for(Int_t i=0;i<10;i++){ const Double_t mean = i*0.5+0.5 ; const Double_t sigma = gRandom->Rndm()*1.0+1.0 ; g->SetParameter(1, mean); g->SetParameter(2, sigma); TH1D h(Form("h_%d",i),"",100,-10,10); for(Int_t j=0;j<100;j++){ h.Fill(g->GetRandom()); } h.Sumw2(); TF1 out(Form("out_%d",i),"gaus",-10,10); h.Fit(out.GetName(),"rq0"); cout << out.GetParameter(1) << " " << out.GetParError(1) << endl; fout << mean << " " << out.GetParameter(1) << " " << 0.0 << " " << out.GetParError(1) << endl; } delete g; }
タイムスタンプを変更しない
[[サマーチャレンジ 2017]] #contents *ROOT [#w92b2400] ROOTはCERN (欧州共同原子核研究機構)によって開発されたデータ解析用ソフトウェアであり、高エネルギー物理学の分野で広く使用されている。ROOTはC++プログラムで動作させることができ、ヒストグラム作成やグラフ描画、フィッティング等のデータ解析に必要な処理を簡単に取り扱うことができる。 CENTER:&ref(./rooticon.jpg,20%);&ref(./rootIcon2.jpg,25%); **ROOTのインストール [#p03a1e08] ROOTは[[CERN:http://public.web.cern.ch/Public/Welcome.html]] (欧州共同原子核研究機構)によって開発されたデータ解析用ソフトウェアであり、高エネルギー物理学の分野で広く使用されている。ROOTはC++プログラムで動作させることができ、ヒストグラム作成やグラフ描画、フィッティング等のデータ解析に必要な処理を簡単に取り扱うことができる。 1. http://root.cern.ch/root/から”Download”をクリックし、”recommended(赤文字)”を選択する。 その中の下の方にある”Windows”以下にある”VC++9 MSI(Release)"をダウンロードする。 2. ダウンロードしたファイルを開き、手順に従いインストールする。 3. デスクトップにrootのアイコン(木の絵)ができているはず。起動できればインストール完了。 Tera Padやテキストエディタなどでプログラムを作成し、プログラムファイルをrootのアイコンにドラッグ&ドロップすれば、プログラムが動く(はず)。 実際にサンプルプログラムを動かしたり、参考資料を見て、rootとC++プログラムに慣れよう! **参考資料 [#nf7046db] [[猿でもわかるROOT:http://www.dw-sapporo.co.jp/technology/658766f830d530a130a430eb7f6e304d5834/733f306b30824f7f3048308bROOT.pdf]]~ [[猿ROOT【番外編】:http://www.ppl.phys.chiba-u.jp/~hoshina/doc/c%2B%2B/main.pdf]] [[ROOT tutorials(English):http://root.cern.ch/root/html534/tutorials/]]~ [[ROOT コマンド集(日本語):http://atlas.kek.jp/comp/ROOT-commands.html]]~ **C++/ROOTのサンプルプログラム [#ead007f5] コピペして実行すれば動くはず。 ***例題1: 繰り返し(for)文、条件(if)文。 [#d8fea661] void Ex1(){ //関数名(Ex1)はファイル名(Ex1.C)と同じにする //for文 //中括弧の中の命令をiを1づつ増やしながら、10回繰り返す for( int i=0; i<10; i++ ){ cout << "i = " << i << endl; //画面に表示。endlは改行 } cout << endl; for( int i=0; i<10; i++ ){ //if文 //ifの後の括弧内に書かれた条件に一致するときだけ、中括弧内を実行 if( i>3 && i<8 ){ cout << "i = " << i << endl; } } } ***例題2: 配列の使い方。 [#e5ac251e] void Ex2(){ //intは整数型の変数 int x1; int y1[2]; //1次元配列(2x1の行列みたいなもの) int z1[3][3]; //2次元配列(3x3の行列みたいなもの) //floatは少数も扱える(doubleとかもあるよ) float x2; float y2[2]; //変数に値を代入 x1 = 100 / 3.0; x2 = 100 / 3.0; cout << endl; cout << "x1=" << x1 <<" x2="<< x2 << endl; //計算結果を表示、結果は同じかな?? cout << endl; //for文を使って、値を代入 for( int i=0; i<2; i++ ){ y1[i] = (i+1) * 10.5; //i番目の要素に値を代入 y2[i] = (i+1) * 10.5; cout << "y1[" << i << "]=" << y1[i] << " y2[" << i << "]=" << y2[i] << endl; } cout << endl; //2次元配列に0~8を代入して、表示 cout << "z1[3][3]=" << endl; for( int i=0; i<3; i++ ){ for( int j=0; j<3; j++ ){ z1[i][j] = i*3 + j; cout << z1[i][j] <<" "; } cout << endl; } } ***例題3: データファイルを読み込む。 [#z4e832d6] #include<fstream> //ファイルを読み込むための設定 void Ex3(){ std::ifstream file; file.open("data.dat"); //""内の名前のファイルを開く if( !file ){ //開けなかった時のエラー処理 cout << "Could not open file!" << endl; return; } string x, y; //文字列型の変数 while( !file.eof() ){ file >> x >> y; //ファイルからx,yに2つずつ値を代入 cout << x <<" "<< y << endl; } } ***例題4: ヒストグラムを作る。 [#nad105b3] void Ex4(){ //1次元ヒストグラムの作る //括弧の中はそれぞれ、 // 名前、タイトル、ヒストグラムの分割数、最小値、最大値 TH1F *h1 = new TH1F( "name", "title", 100, -10, 10 ); //ガウス分布を発生させて、ヒストグラムに入れてみる for( int i=0; i<1000; i++ ){ float x = gRandom->Gaus( 0, 3 ); //平均0、標準偏差3のガウス分布を発生させている h1->Fill( x ); // ヒストグラムにxを入れている } //作ったヒストグラムを表示 //勝手にcanvasと呼ばれる窓が作られる(自分でサイズを指定して作ることもできる) h1->Draw(); } ***例題5: ヒストグラムを関数でfitする(ガウス分布)。 [#sd42aae1] void Ex5(){ gStyle->SetOptFit(1); //フィットの結果を表示するおまじない //1次元ヒストグラムの作る TH1F *h1 = new TH1F( "name", "title", 100, -10, 10 ); //ガウス分布を発生させて、ヒストグラムに入れてみる for( int i=0; i<1000; i++ ){ float x = gRandom->Gaus( 0, 3 ); //平均0、標準偏差3のガウス分布を発生させている h1->Fill( x ); // ヒストグラムにxを入れている } h1->Draw(); //ガウス関数でヒストグラムをfitする h1->Fit("gaus"); } ***例題6: ヒストグラムを関数でfitする(自分で関数を定義)。 [#ve4b6515] void Ex6(){ //1次元ヒストグラムの作る TH1F *h1 = new TH1F( "name", "title", 100, -10, 10 ); //ガウス分布を発生させて、ヒストグラムに入れてみる for( int i=0; i<1000; i++ ){ float x = gRandom->Gaus( 0, 3 ); //平均0、標準偏差3のガウス分布を発生させている h1->Fill( x ); // ヒストグラムにxを入れている } h1->Draw(); //fitする関数を定義する。 //TF1は、1次元の関数を表す。 //括弧内はa、名前、関数式、範囲 TF1 *fgs = new TF1( "fgs", "[0] * exp( -0.5*(x-[1])*(x-[1]) / [2] / [2] )", -5, 5 ); fgs->SetParameters( 100, 0, 2 ); //初期値の設定(初期値が変な値だとfitに失敗することもある) h1->Fit( fgs ); } ***例題7: ヒストグラムを関数でfitする(応用編)。 [#re399252] Double_t MyGaus( Double_t *x, Double_t *par ); void Ex7(){ //1次元ヒストグラムの作る TH1F *h1 = new TH1F( "name", "title", 100, -10, 10 ); //ガウス分布を発生させて、ヒストグラムに入れてみる for( int i=0; i<1000; i++ ){ float x = gRandom->Gaus( 0, 3 ); //平均0、標準偏差3のガウス分布を発生させている h1->Fill( x ); // ヒストグラムにxを入れている } h1->Draw(); //ガウス関数でヒストグラムをfitする //自分で定義した関数名を2つめの引数に書けば良い TF1 *fgs = new TF1( "fgs", MyGaus, -6, 6, 3 ); fgs->SetParameters( 100, 0, 2 ); fgs->SetLineColor(kBlue); h1->Fit( fgs, "R" ); //"R"は範囲を指定してのfitting。fit範囲はfgsで指定した-6~6 } //double型の関数を定義 //引数に対して計算したガウス関数の値を返す Double_t MyGaus( Double_t *x, Double_t *par ){ Double_t val; if( par[2]==0 ) val = -99999; else val = par[0] * exp( -0.5 * ( x[0] - par[1] ) * ( x[0] - par[1] ) / par[2] / par[2] ); return val; } ***例題8: データをグラフで表示する。 [#ce0af8fe] void Ex8() { //テキストファイルを生成 Data(); //テキストファイルdata.datを開く ifstream fin("data.dat"); if(!fin){ cout << "can't open file" << endl; return; } //グラフを作る(誤差なし) TGraph* graph = new TGraph(); graph->SetMarkerStyle(20);//データを丸で表示 //入力ファイルを読み込む //xとyに値を代入 int i=0; double x,y; while( fin >> x >> y ) { //グラフに値を代入。iはグラフの何番目に値を入れるかを指定 graph->SetPoint(i,x,y); i++; } //グラフを表示。オプション"A"は必須 //Pはデータをポイントで表示 //PをLにすると? graph->Draw("AP"); } // Generate data.dat file void Data() { ofstream fout("data.dat"); TF1* f = new TF1("f","[0]*x", 0, 10); f->SetParameter(0, gRandom->Rndm()); for(Int_t i=0;i<10;i++){ const Double_t x = gRandom->Rndm()*10.0; const Double_t y = f->Eval(x); fout << x << " " << y << endl; } } ***例題9: データをグラフで表示、フィットする。 [#zf969be0] void Ex9() { //テキストファイルを生成 Data(); //テキストファイルdata.datを開く ifstream fin("data.dat"); if(!fin){ cout << "can't open file" << endl; return; } //グラフを作る(誤差あり) TGraphErrors* graph = new TGraphErrors(); graph->SetMarkerStyle(20);//データを丸で表示 //入力ファイルを読み込む //xとyに値を代入 int i=0; double x,y; double ex,ey; //xとy誤差 while( fin >> x >> y >> ex >> ey ) { //グラフに値を代入。iはグラフの何番目に値を入れるかを指定 graph->SetPoint(i,x,y); graph->SetPointError(i,ex,ey); i++; } //グラフを表示。オプション"A"は必須 //Pはデータをポイントで表示 //PをLにすると? graph->Draw("AP"); //データを直線でフィット TF1* f = new TF1("f", "pol1", 0, 10); f->SetParameters(0,1); graph->Fit(f,"r"); } // Generate data.dat file void Data() { ofstream fout("data.dat"); TF1* g = new TF1("g","gaus", -10, 10); g->SetParameter(0, 1.0); for(Int_t i=0;i<10;i++){ const Double_t mean = i*0.5+0.5 ; const Double_t sigma = gRandom->Rndm()*1.0+1.0 ; g->SetParameter(1, mean); g->SetParameter(2, sigma); TH1D h(Form("h_%d",i),"",100,-10,10); for(Int_t j=0;j<100;j++){ h.Fill(g->GetRandom()); } h.Sumw2(); TF1 out(Form("out_%d",i),"gaus",-10,10); h.Fit(out.GetName(),"rq0"); cout << out.GetParameter(1) << " " << out.GetParError(1) << endl; fout << mean << " " << out.GetParameter(1) << " " << 0.0 << " " << out.GetParError(1) << endl; } delete g; }
テキスト整形のルールを表示する
検索
AND検索
OR検索
編集操作
リロード
新規
編集
添付
差分
一覧
単語検索
最終更新
バックアップ
ヘルプ
最新の20件
2017-08-30
発表資料まとめ
2017-08-27
グループ1
2017-08-26
グループ4
写真等
サマーチャレンジ 2017
2017-08-25
グループ3
資料集
グループ2
データ解析
2017-08-14
自己紹介
グループD
グループC
グループB
グループA
実験装置
ラドン検出の原理
FAQ
データ収集制御
2017-08-10
原子核崩壊の基本
2016-01-27
SandBox