物理のベンチ by mitta

学んだことを発信します。備忘録も書きます。間違いがあればコメントください。

NumPyを使ってCERN ROOTの解析用ダミーデータを生成する2-物理実験っぽいデータの生成編

やること

解析用のダミーデータの生成。
研究室の教育用に。

ダミーデータの内容

・ADC :ガンマ分布を使用、宇宙線っぽいデータ。
・TDC1:正規分布を使用、ADCに対してTime Walkっぽいものがあるデータ。TDCモジュールのTime Jitter、トリガータイミングのズレがある。
・TDC2:正規分布を使用、Trigger Timingっぽいデータ。
・TDC3:一様分布を使用、Read Out Triggerっぽいデータ。

コード

import numpy as np

kNumEvent = 10000
fout = open("output.dat","w")

for i in range(kNumEvent):
    rand1 = round(np.random.normal(0, 1),5) # 正規分布(平均, 標準偏差) 
    rand2= round(np.random.rand(),5) # 一様分布()
    rand3 = round(np.random.binomial(100,0.3),5) # 二項分布(試行回数, 成功確率)
    rand4 = round(np.random.beta(2,5),5) # β分布(α値, β値)
    rand5 = round(np.random.gamma(4,1),5) #γ分布(形状母数(k), 尺度母数(Θ))
    rand6 = round(np.random.chisquare(3),5) # χ二乗分布(自由度(k))

    rand7 = np.random.normal(1000, 10)
    rand8 = np.random.normal(1300, 2)
    def func1(X,a,b,c):
        Y = a*X**(-0.5) + b/X + c
        return Y

    tmp_ADC = round(rand5*200)
    tmp_TDC1 = round(func1(rand5*200,1000,100,rand1*10+rand2*5+rand7))
    tmp_TDC2 = round(rand7+rand8)
    tmp_TDC3 = round(1000+rand2*5)
    
    fout.write(str(i)+" "+str(tmp_ADC)+" "+str(tmp_TDC1)+" "+str(tmp_TDC2)+" "+str(tmp_TDC3)+" "+
    str(rand1)+" "+str(rand2)+" "+str(rand3)+" "+str(rand4)+" "+str(rand5)+" "+str(rand6)+"\n")

fout.close()

print("F!!!!!")

結果

f:id:salamence_andrias:20210613145427p:plain
f:id:salamence_andrias:20210613144936p:plain

NumPyを使ってCERN ROOTの解析用ダミーデータを生成する1-ランダムデータ編

やること

ダミーのテキストデータをNumPyで作る。
色々な形状な分布を生成して後々ROOTで解析する。

コード

import numpy as np

kNumEvent = 1000
fout = open("output.dat","w")
for i in range(kNumEvent):
    rand1 = round(np.random.normal(0, 1),5) # 正規分布(平均, 標準偏差) 
    rand2= round(np.random.rand(),5) # 一様分布()
    rand3 = round(np.random.binomial(100,0.3),5) # 二項分布(試行回数, 成功確率)
    rand4 = round(np.random.beta(2,5),5) # β分布(α値, β値)
    rand5 = round(np.random.gamma(5,1),5) #γ分布(形状母数(k), 尺度母数(Θ))
    rand6 = round(np.random.chisquare(3),5) # χ二乗分布(自由度(k))   
    fout.write(str(rand1)+" "+str(rand2)+" "+str(rand3)+" "+str(rand4)+" "+str(rand5)+" "+str(rand6)+"\n")
fout.close()

print("F!!!!!")

WindowsユーザーがCERN ROOT 6をいい感じにコーディングできるようになるまで3-ROOTのinstall編

今回やること

・ROOT 6のinstall
・PyROOT(Pythonで動かすroot)の設定

方法

ROOT 6のinstall

ROOTは色々なインストール方法がある。
ROOT公式によるとCentOS 8ではyumからROOTをインストールするのが最も楽。
root.cern
ということでterminalを起動して以下のコマンドを打ち込む

$ su

これで管理者権限を得られる。
この状態で

# yum install epel-release
# yum install root

これでROOTをインストールできる。
ここで一度再起動する。

# reboot

ROOTがインストールできているか確認する。

$ root

以下の画面が表示されればおk。
f:id:salamence_andrias:20210612223439p:plain

PyROOTのinstall

PyROOTはPython内でROOTを扱うためのPython moduleである。
便利なmoduleなので入れておくとよいだろう。
次回以降に利点を紹介する。
ROOT公式の説明では「ROOT内にあるROOT.pyをPythonのPATHに追加しろ」と書いてある。
yumでインストールした場合、ROOT.pyが見つからない。
そこで再びyumからPyROOTをインストールする。

$ su
# yum install python3-root
# reboot

これで他に何もしなくともPyROOTをインストールできる。
PyROOTが使えるかどうかPythonを起動して確認する。

$ python3 
>>> import ROOT
>>>

これで何も表示されなければおk。

次回

ROOTの基本を紹介する。

WindowsユーザーがCERN ROOT 6をいい感じにコーディングできるようになるまで2-CentOS8・VMwareの設定編

今回やること

・CentOS8のキーボードを日本語配列にする
windowsとCentOS8の共有フォルダの設定
GUI版(別windowで表示するタイプの)emacsをinstall

方法

キーボードを日本語化

<基本>terminal
基本的にはこの「terminal」に文字を入力することでPC(CentOS)を操作する。
f:id:salamence_andrias:20210607224127p:plain
f:id:salamence_andrias:20210607225447p:plain
開くとこんな感じ。以下、この記事ではこの「terminal」上に書くコマンドを以下のように記述する。

$ ここにコマンドを入力して操作

詳しいコマンド等は自分で検索されたし。

一般日本人がよく使うキーボードは「日本語配列」と呼ばれる配列である。
これは日本語版のOSではデフォルトで設定されているが、英語版のOSでは「US配列」が主流である。
キーボードそのものの見分け方は簡単で、「Enter」を見れば一発で分かる。
日本語配列のキーボードは以下のような形をしている。
www.amazon.co.jp
OS上で見分ける方法も簡単で「Shift」+「2」を押して「"」が出れば日本語配列、「@」が出ればUS配列である。


<本題>キーボードの日本語化
始めに、キーボードの設定に「Japanese」を追加する。

f:id:salamence_andrias:20210609232330p:plain
f:id:salamence_andrias:20210609232444p:plain
f:id:salamence_andrias:20210609232544p:plain
f:id:salamence_andrias:20210609232628p:plain

US配列を消去して完了。

f:id:salamence_andrias:20210609232729p:plain


windowsとCentOS8の共有フォルダの設定

一旦vmwareをパワーオフにする。
もう一度VMwareを起動して「仮想マシンの編集」を行う。
f:id:salamence_andrias:20210609224929p:plain
f:id:salamence_andrias:20210609225424p:plain
「追加」を押すと、windows上のディレクトリを選択できる。
このディレクトリがCentOSでもwindowsでも編集できる「共有フォルダ」である。
共有フォルダ設定を完了したら、

$ ls /mnt/hgfs/

と入力し、ターミナル上に

「設定したディレクトリ名」(以後、vmshareと書く)

が出れば完了。

そのまま以下のよう入力し、共有できているか確認する。

$ cd /mnt/hgfs/vmshare
$ mkdir tmpfile

この後にwindows上で設定した共有ディレクトリを確認して「tmpfile」があればおk。


GUIemacsのinstall

emacsとはコーディングするためのソフトである。
プログラムを書くだけならシンプルでかなりおすすめ。
f:id:salamence_andrias:20210609234139p:plain
f:id:salamence_andrias:20210609234241p:plain
「Software」からemacsをインストールすることで別windowからemacsを起動できる。
f:id:salamence_andrias:20210609234626p:plain

試しに以下をterminalに入力してGUIemacsがあるか確認する。

$ emacs hoge

余談①

実はCentOS8を日本語表記にすることはできる。

メリット

・terminalの警告文やエラー文がちょっとわかりやすくなる(かなりうれしい)

デメリット

・「Desktop」が「デスクトップ」になり、tarminal上で操作しにくくくなる(ここだけ英語表記にはできる)
・エラー文が日本語だと単純なエラー以外は記事が見つからなくなる(詳しい人はみんな英語でやってるらしい)

このため筆者的には非推奨

余談②

emacsは起動したときに別windowで開くもの(GUI版)とterminal上で開くものがある。
GUI版の方が初心者にはおすすめ。

emacsはコーディング含むテキストを編集できるソフトだが、windowsのショートカットキーは全く通用しない。
各自覚えるべし。

次回

ROOT 6のinstallと、PyROOTのコーディングのための設定を行う。

WindowsユーザーがCERN ROOT 6をいい感じにコーディングできるようになるまで1-対応OS導入編

はじめに

筆者は何者か

筆者は修士課程で実験物理学を学んでいた物理オタク。

何でこんな記事書いた

rootは筆者のようなバカ大学生が理解するにはちょっと難しいし、日本語で優しく教えてくれるサイトが少なかったので。
こういうサイトが増えれば増えるほど色々な理解レベルに対応できるようになる(はず)。

rootってなに

計算ツールみたいなもん。素核宇宙実験系の解析が楽にできる。

やること

全体的に

ROOTをWindowsユーザーにもいい感じにコーディングできるようにする。

今回は

Windows上で仮想OSを立ち上げる。CentOSが楽なのでCentOSを使用する。

導入

windows上でVMWareというものを動かし、仮想でCentOS 8(Windows, mac, linuxの亜種みたいなやつ)を動かす。
このCentOS内でROOTを動かせるようにする。

何で

Q1:Windowsではいかんのか
A1:WindowsではROOTを動かせない。

Q2:なんでわざわざCentOS
A2:VMWareCentOSを動かしてもCentOSで起こったことがwindowsに影響しない。
  なんかOS壊しちゃってもCentOSのファイルをWindowsから消せば何とかなるから。

Q3:VSCodeのWSL(Ubuntu)とかは
A3:ROOTを入れるのすら苦戦してるのにWindowsのpathとか触って元に戻るはずねえだろ!!
  あと初心者には最悪GUIも使えるOSのほうがいい(はず)。

方法

①まずはWindows上でWindowsじゃない別のOSを走らせてくれる「VMware」を公式サイトからDL
www.vmware.com
これを実行してVMwareを入手。exeを実行して「VMware Workstation 16 Prayer」を起動してみる。

②一旦VMwareは置いておいて、「CentOS」の本体を公式サイトからDL
ftp-srv2.kddilabs.jp
別にこのバージョンでなくとも
CentOS LINUXであること
・64bitのdvd.isoファイル(10GBくらいある)を選んでダウンロードすること
を満たしていればVMwareで起動することは簡単に可能。

CentOSの本体を「安全な場所」に保管してVMwareからCentOSを起動
安全な場所とは
・「ダウンロード」フォルダではない
・OneDrive上にない
・間違って消さない場所
であればおk。
f:id:salamence_andrias:20210605233140p:plain
f:id:salamence_andrias:20210605233052p:plain
f:id:salamence_andrias:20210605233243p:plain
ユーザー設定はよしなに。(※このときの「root」は「管理者権限」のrootという意味なので間違えないこと)
f:id:salamence_andrias:20210605233510p:plain
起動できればおk。(初回は起動に20分くらいかかる)
f:id:salamence_andrias:20210605234849p:plain

まとめ

WindowsではROOTは使えない
・仮想でCentOS起動し、ROOTを使いたい
・「VMware」「CentOS」をDL、インストールする

次回

Cent OSの設定をする。

余談

・終わるときに「サスペンド」か「パワーオフ」か聞かれるが、基本的に「サスペンド」でいい。

【備忘録】pythonで実験データを細かく解析するために、各種パラメータを辞書式で作る方法

はじめに

実験中検出器を様々なパラメータでデータを取ったはいいが、最終的にまとめるときには実験時のパラメータを代入する作業は辞書式で書かないとやってられなくなった。
某chが10個しかない検出器はごり押しで130runデータを普通のlistで書いていたが、某200chある検出器はそれでは厳しかったので今まで避けていた辞書式のlistで管理することを決意した。
学びの度に追記して記事の精度を上げたい。

使いどころ

  • 手動で変えて取ったデータのパラメータを管理したいとき(HVの値、ビーム照射座標など)
  • event loopによって1 eventごとにデータを見て解析をしたいとき

⇒データ解析時にdictを追加することで多段階解析も可能

本文

入力

hv_dict = {
    '4418':{"1u":1900, "1d":1900, "2u":0, "2d":0}
    '4434':{"1u":1900, "1d":2000, "2u-o":1900, "2d":2000},
    '4445':{"1u":2100, "1d":2100, "2u-o":2100, "2d":2100}
} #定義

print(hv_dict["4418"])
print(hv_dict["4418"]["1u"])


hv_dict['4418']["2u-4"] = 2000 #追加
print(hv_dict["4418"])

出力

{'1u': 1900, '1d': 1900, '2u': 0, '2d': 0}
1900

{'1u': 1900, '1d': 1900, '2u-o': 1900, '2d': 0, '2u-4': 2000}

注釈

  1. 「:」の前部分がkeyで後ろ部分がvalueなので、前部分にパラメータの名前を書き、後ろ部分にパラメータの値を書く。
  2. 参照するときは外側のkeyから書く(2次元配列)

【備忘録】Pythonで動的に変数を取得する方法

状況

数独を解くプログラムの作成中に、先に変数名が決まっている状態で、数値代入をするかsympyのsymbol変数として扱うかを動的に決めたかったので調べた。

コマンド

exec()を使うと、()内のstringで打ち込んだコードを使用してくれる←日本語合っとるか??

書いたやつ

import sympy   

            #A  B  C   D  E  F   G  H  I
probrems = [[0, 0, 0,  9, 0, 3,  0, 0, 0], # a
            [2, 3, 0,  8, 7, 0,  0, 4, 0], # b
            [0, 0, 0,  0, 0, 0,  0, 0, 6], # c

            [5, 2, 0,  0, 8, 0,  0, 0, 0], # d
            [0, 0, 0,  2, 0, 0,  4, 0, 0], # e
            [4, 0, 0,  6, 0, 0,  1, 0, 2], # f

            [0, 0, 9,  0, 0, 0,  0, 0, 0], # g
            [7, 8, 3,  0, 9, 0,  0, 0, 0], # h
            [0, 0, 0,  0, 5, 0,  8, 0, 0]] # i

values  =  [["Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia"],
            ["Ab","Bb","Cb","Db","Eb","Fb","Gb","Hb","Ib"],
            ["Ac","Bc","Cc","Dc","Ec","Fc","Gc","Hc","Ic"],
            ["Ad","Bd","Cd","Dd","Ed","Fd","Gd","Hd","Id"],
            ["Ae","Be","Ce","De","Ee","Fe","Ge","He","Ie"],
            ["Af","Bf","Cf","Df","Ef","Ff","Gf","Hf","If"],
            ["Ag","Bg","Cg","Dg","Eg","Fg","Gg","Hg","Ig"],
            ["Ah","Bh","Ch","Dh","Eh","Fh","Gh","Hh","Ih"],
            ["Ai","Bi","Ci","Di","Ei","Fi","Gi","Hi","Ii"]]

for hori in range(9):
    for vart in range(9):
        tmp =  probrems[hori][vart]
        name = values[hori][vart]
        if tmp != 0:
            exec('{} = {}'.format(name,tmp))
        if tmp == 0:            
            exec('{} = sympy.Symbol("{}",positive=True)'.format(name,name))

出力

分かりにくいが、アルファベット部分はsympyのsymbolになってる。

[Aa, Ba, Ca, 9, Ea, 3, Ga, Ha, Ia]
[2, 3, Cb, 8, 7, Fb, Gb, 4, Ib]
[Ac, Bc, Cc, Dc, Ec, Fc, Gc, Hc, 6]
[5, 2, Cd, Dd, 8, Fd, Gd, Hd, Id]
[Ae, Be, Ce, 2, Ee, Fe, 4, He, Ie]
[4, Bf, Cf, 6, Ef, Ff, 1, Hf, 2]
[Ag, Bg, 9, Dg, Eg, Fg, Gg, Hg, Ig]
[7, 8, 3, Dh, 9, Fh, Gh, Hh, Ih]
[Ai, Bi, Ci, Di, 5, Fi, 8, Hi, Ii]

一口メモ

多分、for文で回しながらformatを使って可変量の変数を作り、処理しそう。
変数(listも同様)定義、処理、アウトプット全部exec()でやることになると思う。
formatがC++で言うsprintf()と同じと考えればわかりやすい(ハズ)。