物理の駅 by onsanai

Physics-station 研究で日々感じたことを忘れないための備忘録

Windows Subsystem for Linux (WSL) でCERN ROOTバージョン6を動かすまで

この解説は、Linux PCやMac PCがなく、かつLinuxの仮想環境を動かせない人、UpdateされたWindows 10を持っている人、ROOT6を使いたい人向けのものです。

ROOT講習会2019用に加筆修正しました。

Ubuntu 18.04 LTSのインストール

WindowsUbuntuをインストールする。解説は英語しかないが、頑張ってインストールする。

docs.microsoft.com

管理者のPowerShellでコマンドを実行する

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

再起動が必要。

Microsoft Storeから「Ubuntu 18.04 LTS」をインストールする

www.microsoft.com

スタート画面からUbuntuの端末を起動する。

f:id:onsanai:20190412134340p:plain:w100
Ubuntu

ユーザー名を決め、パスワードを入れる。

2回目以降に起動するときは、「Windowsキー+R」からファイル名を指定して実行で「bash」と入れて実行する。

f:id:onsanai:20190426120019p:plain:w300
ファイル名を指定して実行

このように実行すると、Windows側のホームディレクトリ「C:\Users\Masahiro」内をカレントディレクトリ(cd)として実行できる。

事前の準備

下記のコマンドでインストールパッケージをアップデートする。 -y は途中のYes/No質問を自動で全てYesにするオプション。以下、断りのない限りUbuntuの端末上のコマンドである。

sudo apt -y update

アップグレードする

sudo apt -y upgrade

下記のコマンドでビルドツール(パッケージ)を一括でインストール。gccやmakeなどがインストールされる。

sudo apt -y install build-essential cmake

GUIを使えるようにする

Windows側にX-Serverをインストールする。

sourceforge.net

VcXsrv (スタートメニュー上ではXLaunchとなってる)を起動する。

f:id:onsanai:20190410103753p:plain:w100
VcXsrv XLaunch
何も考えずに次へ->次へ->次へ->完了。

xfce4パッケージをインストールする。

sudo apt -y install xfce4-terminal xfce4

~/.bash_profile を開き、以下の記述を末尾に追加する。~/.bash_profile を開くには、 nano ~/.bash_profile が便利だろう。

export DISPLAY=:0.0

再読み込みする。

source ~/.bash_profile

xeyesが表示されればOK。

xeyes

f:id:onsanai:20190421130225p:plain:w100
XEYES

Python3でROOTを動かしたい人のための、ROOTバージョン6のコンパイル方法

Python3で動かす必要のない人は、後述の方が楽かつ速い。

奥村氏のテキストを参考に、ROOT v6.16.00 をコンパイル方法を説明する。

ROOTのソースコードをホームディレクトリにダウンロードする。

cd ~
wget https://root.cern/download/root_v6.16.00.source.tar.gz

/use/local へ移動し、管理者権限でROOTのソースコードを展開

cd /usr/local
sudo tar zxvf ~/root_v6.16.00.source.tar.gz

コンパイルに必要な各種パッケージを導入する。 詳細は、UbuntuでROOTをコンパイルするためにで必要なパッケージを確認されたし。Ubuntu16までとなっているが、18系もそう大差はないように思われる。

sudo apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libgsl0-dev python3-dev

cmakeをビルドする用のディレクトリを作成し、python3付きでコンパイルcmakeする

sudo mkdir root-6.16.00/cmake_build
cd root-6.16.00/cmake_build
sudo cmake ../ -DPYTHON_EXECUTABLE=/usr/bin/python3

makeする。 -j 8 は並列化するためのもので、スレッド数に応じて数字を変えるか、分からない場合は sudo makeだけでよい。 makeはかなり時間がかかる。(当方の環境で8スレッド並列でやって1時間ほどかかった)

sudo make -j 8

4コア8スレッドのラップトップでmakeしている最中のタスクマネージャーはこうなる f:id:onsanai:20190421101551p:plain:w300

~/.bash_profile にROOTのパスを通すため、以下のように記述する。

cd /usr/local/root-6.16.00/cmake_build
source bin/thisroot.sh
cd - > /dev/null

~/.bash_profile を再読み込み

source ~/.bash_profile

次のセクションを飛ばして、ROOTの起動の確認へ。

Pythonを必要としない人のためのROOTバージョン6の簡単インストール方法

ROOT講習会に参加する人は、この「簡単インストール方法」は行わないで下さい。

ROOTの最新版 又は、指定のバージョンをホームディレクトリにダウンロードする。執筆時の最新版は v6.16.00 だった。

cd ~
wget https://root.cern/download/root_v6.16.00.Linux-ubuntu18-x86_64-gcc7.3.tar.gz

/usr/local に展開する。

cd /usr/local
sudo tar xvzf ~/root_v6.16.00.Linux-ubuntu18-x86_64-gcc7.3.tar.gz

~/.bash_profile を開き、末尾に以下の記述追加する

cd /usr/local/root
source bin/thisroot.sh
cd - > /dev/null

~/.bash_profile を再読み込み

source ~/.bash_profile

ROOTの起動の確認

ROOTをグラフィックなしで起動できるか確認する。 -b はグラフィックなしのオプション。

root -b

以下のように表示されればOK

   ------------------------------------------------------------
  | Welcome to ROOT 6.16/00                  https://root.cern |
  |                               (c) 1995-2018, The ROOT Team |
  | Built for linuxx8664gcc on Jan 23 2019, 09:06:13           |
  | From tags/v6-16-00@v6-16-00                                |
  | Try '.help', '.demo', '.license', '.credits', '.quit'/'.q' |
   ------------------------------------------------------------

.q でROOTのモードから抜けられる。次に、ROOTをグラフィックありで起動してみる。

root

ROOTのグラフィックスが表示されることを確認する。

f:id:onsanai:20190410102652p:plain:w500
ROOT グラフィックス

Ubuntuの実態は、ユーザー名「Masahiro」の場合は下記ディレクトリにある。

C:\Users\Masahiro\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs

ChromeであるURL以外を接続させないようにしたい

URLBlacklistで全てのURLを指定、URLWhitelistで特定の(この例ではGoogleのみ)を指定。

以下の内容を test.reg という名前で保存し、管理者権限で実行すると良い。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\URLBlacklist]
"1"="*"

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\URLWhitelist]
"1"="google.com"
"2"="google.co.jp"

Android版のMicrosoftリモートデスクトップからログインした後でWindowsから再接続すると日本語配列入力ができなくなる

タイトル通り。

Androidをクライアントとしてサーバーにリモートデスクトップ接続+ログインすると、クライアント(Android)から送られるキーボードの種類は英語配列キーボードであるため、リモートデスクトップ接続における配列キーボードが英語になる。その後、サーバー側をログアウトせずにWindowsのクライアントから接続すると、その設定は引き継がれるため、日本語配列キーボードでの入力ができなくなる。(日本語入力はできる)

一旦サーバー側をログアウトしてから、Windowsリモートデスクトップから接続+ログインすると、日本語配列キーボードでの入力ができるようになる。

理屈は分かるけど、初見で対策見つけるの難しいよね。

play.google.com

pythonのmatplotlibで2次元ヒストグラムのビンコンテンツを直接操作する

pythonのmatplotlibで2次元ヒストグラムのビンコンテンツ (bin contents)を直接操作する方法はない。なので、 colormesh を使って描画しよう。

import matplotlib.pyplot as plt
import numpy as np

def f(x, y):
    return np.exp(-(x * x) / (2 * 3 ** 2)) * np.exp(-(y * y) / (2 * 3 ** 2))

X, Y = np.mgrid[-10:11, -10:11]
Z = f(X,Y)

fig, ax = plt.subplots()
im = ax.pcolormesh(X, Y, Z, cmap='inferno')
fig.colorbar(im)
plt.show()

このようにしてカラーマップを作成することが出来る。

f:id:onsanai:20190430232052p:plain
二次元ヒストグラムっぽい絵

普通のヒストグラム(一次元ヒストグラム)も、棒グラフを使ってヒストグラムっぽく表示することが出来る。

import matplotlib.pyplot as plt
import numpy as np
 
X = np.array([i for i in range(-10,10)])
Y = np.exp(-(X * X) / (2 * 3 ** 2))
plt.bar(X, Y, width=1.0)
plt.show()

f:id:onsanai:20190430233014p:plain
一次元ヒストグラムっぽい絵

C++のクラスをPythonから使うためにBoost::Pythonを使うまで

BoostのPython用ライブラリを使いたかったのでコンパイルする

参考文献。

Boostライブラリのビルド方法 - boostjp

Windows で Boost 最新版をソースコードからビルドし、インストールする(Microsoft Build Tools を使用)

Visual Studio 2019の x64 Native Tools Command Prompt for VS 2019 を使って、

cd (解凍したディレクトリ)
bootstrap.bat
mkdir stage
b2.exe install -j2 --prefix=stage toolset=msvc-14.2 link=static,shared address-model=64 --with-python

を行う。 -j2 の1は1並列で行うの意味。Visual Studio側では、Visual Studio 2019は v142 となっているため、msvc-16.0 とはしない。

次に、Visual Studio 2019で次のサイトで書いてることをやってみる。

Boost.Python Tutorial - 1.70.0

Visual Studio 2019で、プロジェクト名「hello_ext」を「C++ 空のプロジェクト」で作成する。

  • Pathを正しく通す
    • インクルードディレクトリには、boostだけでなく、 $(USERPROFILE)\Anaconda3\include; も通す。(Anaconda3の場合)
    • ライブラリディレクトリには、boostだけでなく、 $(USERPROFILE)\Anaconda3\libs; も通す。
  • 構成プロパティ-> 全般 -> 構成の種類 は ダイナミックライブラリ (.dll) にする
  • 構成プロパティ-> 全般 -> ターゲットの拡張子 は .pyd にする

hello_ext.pyd が x64のRelease内に出力されるので、それをpythonを実行するディレクトリにコピーし、そこでpythonを起動する

>>> import hello_ext
>>> print hello_ext.greet()
hello, world

これで動くはずである。

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

ここの、 BOOST_PYTHON_MODULE 内 今回の例では、hello_ext はプロジェクト名 (=出力する .pyd 名)と同じでなければならない。

boost::python(1) classと関数の使用方法(PythonからC++の呼び出し) - のんびりしているエンジニアの日記

yaml-cppをWindows10 Visual Studio 2017でコンパイルする

git clone https://github.com/jbeder/yaml-cpp

cmake for Windowsで、

f:id:onsanai:20190421180757p:plain:w400

f:id:onsanai:20190421181446p:plain:w400

Visual Studio 2017の場合は、

YAML_CPP.slnを開く

ALL_BUILDをビルド

INSTALLをビルド

で終わり。

最新のブランチでは、Visual Studio 2013 でコンパイルすることはできない。C++11絡み。

Windows10とVisual Studio 2017でGeant4を動かした

Overview | geant4.web.cern.ch

WindowsでGeant4を入れたお話。

皆さん誤解しているかもしれませんが、WindowsでGeant4は動きます。GUIや、他のLinuxにしか対応していないツールや、マルチスレッド関連を除けば、ちゃんと動きます。 深いことをやろうとすると動かなくなることがありますが、とりあえず構造を作って粒子を打ち込むのであればできる。

と思っていたわけだ。こんなに苦労するとは思わなかった(8時間ほど)。詰まったのは G4LIB_BUILD_DLLプリプロセッサに追加するところだった。一通り導入方法を書きます。質問があればコメントでどうぞ。

Geant4のWindows + Visual Studioでの導入方法

Geant4の入手

まず、ダウンロードページからデータファイルとコンパイル済みのライブラリを入手しましょう。

http://geant4.web.cern.ch/support/download

「compiled using Visual Studio 2017 (version 15.9.3) on Windows 7, 32 bits, executable installer」と書いてありますが、Windows10でも動きます。

コンパイル済みのライブラリは C:\Program Files (x86)\Geant4 10.5 にインストールしたとします。初期設定でそうなっていると思います。 変更する点は次の絵のPATHを通すところ。とりあえず下記のようにしておこう。

f:id:onsanai:20190412153006p:plain:w300
Geant4 Windows10 Install Options

ソースファイルの入手

インストールした先のexamplesにサンプルコードはありますが、分かりにくいです。全然ベーシックじゃねぇです。KEKのGean4初心者講習の実習用ソースコードの方が分かりやすいです。KEK万歳です。 Geant4Tutorial20171129\TutorialMaterials\P01_FirstStep\source にあります。 直下にある *.cc と、srcにある *.cc includeにある *.hh を使います。

KEK wiki https://wiki.kek.jp/display/geant4/Geant4+Japanese+Tutorial+for+Detector+Simulation+2017

ソリューション、プロジェクトを作る

Visual Studio 2017で、適当な名前を付けて作ってください。

先ほどの *.cc *.hh を全部コピーして、ソースファイルとヘッダーファイルに突っ込みます。正しい流儀ではありませんが、気にしたら負けです。

プロジェクトの設定

Visual Studio内で、インクルードパスを設定し、ライブラリファイルを設定します。

  • インクルードパス: プロパティ→構成プロパティ→VC++ディレクトリ→インクルードディレクトC:\Program Files (x86)\Geant4 10.5\include\Geant4
  • ライブラリファイル: プロパティ→構成プロパティ→リンカー→入力→追加の依存ファイル C:\Program Files (x86)\Geant4 10.5\lib\*.lib

適宜インストール先に置きかえてください。

いくつかのプリプロセッサを設定する必要があります。プリプロセッサは プロパティ→構成プロパティ→C/C++プリプロセッサプリプロセッサの定義に、

G4LIB_BUILD_DLL
WIN32
_CRT_SECURE_NO_WARNINGS

を設定してください。

上から、DLLを呼び出す(dllimport を使う)設定、Windowsのヘッダにするための設定、古いCの関数でエラーを出さないための設定です。

環境変数

環境変数のpathに C:\Program Files (x86)\Geant4 10.5\bin を追加しましょう。

データファイルの環境変数は適宜下記のものを設定してください。使う物理リストによっては他の変数を要求されることもあります。

G4ENSDFSTATEDATA=C:\G4ENSDFSTATE2.2
G4LEDATA=C:\G4EMLOW7.7
G4LEVELGAMMADATA=C:\PhotonEvaporation5.3
G4SAIDXSDATA=C:\G4SAIDDATA2.0
G4PARTICLEXSDATA=C:\G4PARTICLEXS1.1

以前は G4NEUTRONXSDATA=C:\G4NEUTRONXS1.4 が必要だったが、G4PARTICLEXSDATAに統合された?

コードの修正

下記のようなエラーが出ると思います。

Geant4\Geometry.cc(43): error C2039: 'Invisible': 'G4VisAttributes' のメンバーではありません。
Geant4\G4VisAttributes.hh(68): note: 'G4VisAttributes' の宣言を確認してください
Geant4\Geometry.cc(43): error C2065: 'Invisible': 定義されていない識別子です。

Geometry.cc の43行目を下記のように修正してください。

   logVol_World->SetVisAttributes (G4VisAttributes::GetInvisible());

動かしてみる

P1というサンプルコードを動かすと、次のようにコンソールに表示されて止まります。ここにコマンドを入れていくと、粒子を買えたりビームを打ったりすることができます。warningが出ていますが、とりあえず気にしません。なぜ出るのかエラい人教えてください。

**************************************************************
 Geant4 version Name: geant4-10-05    (7-December-2018)
                       Copyright : Geant4 Collaboration
                      References : NIM A 506 (2003), 250-303
                                 : IEEE-TNS 53 (2006), 270-278
                                 : NIM A 835 (2016), 186-225
                             WWW : http://geant4.org/
**************************************************************

<<< Geant4 Physics List simulation engine: FTFP_BERT 2.0


 FTFP_BERT : new threshold between BERT and FTFP is over the interval
 for pions :   3 to 12 GeV
 for kaons :   3 to 12 GeV
 for proton :  3 to 12 GeV
 for neutron : 3 to 12 GeV

### Adding tracking cuts for neutron  TimeCut(ns)= 10000  KinEnergyCut(MeV)= 0
Available UI session types: [ Win32, GAG, csh ]

-------- WWWW ------- G4Exception-START -------- WWWW -------
*** G4Exception : UI0002
      issued by : G4UIExecutive::G4UIExecutive()
Specified session type is not build in your system,
or no session type is specified.
A fallback session type is used.
*** This is just a warning message. ***
-------- WWWW -------- G4Exception-END --------- WWWW -------

Idle>

講義資料の「ユーザ・アプリケーション作成の基礎」に使い方が載っています。コマンドを実際に打ちながら、色々動かしてみましょう。

https://wiki.kek.jp/display/geant4/Geant4+Japanese+Tutorial+for+Detector+Simulation+2017

ソースコードを書く

好きにソースコードを書きましょう。例えば、Geant4でHello World!を書くには次のようにするそうです。

#include <G4coutDestination.hh>

int main() {
    G4cout << "Hello world!" << G4endl;
}

IO部分はとりあえずの実装で良いなら、 std::coutstd::ofstream を使っても動きます。

では、良いシュミレーションライフを。

Windows Subsystem for Linux (WSL) でCERN ROOTバージョン6を動かすまで

この解説は、Linux PCやMac PCがなく、かつLinuxの仮想環境を動かせない人、UpdateされたWindows 10を持っている人、ROOT6を使いたい人向けのものです。

ROOT講習会2019用に加筆修正しました。

Ubuntu 18.04 LTSのインストール

WindowsUbuntuをインストールする。解説は英語しかないが、頑張ってインストールする。

docs.microsoft.com

管理者のPowerShellでコマンドを実行する

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

再起動が必要。

Microsoft Storeから「Ubuntu 18.04 LTS」をインストールする

www.microsoft.com

スタート画面からUbuntuの端末を起動する。

f:id:onsanai:20190412134340p:plain:w100
Ubuntu

ユーザー名を決め、パスワードを入れる。

2回目以降に起動するときは、「Windowsキー+R」からファイル名を指定して実行で「bash」と入れて実行する。

f:id:onsanai:20190426120019p:plain:w300
ファイル名を指定して実行

このように実行すると、Windows側のホームディレクトリ「C:\Users\Masahiro」内をカレントディレクトリ(cd)として実行できる。

事前の準備

下記のコマンドでインストールパッケージをアップデートする。 -y は途中のYes/No質問を自動で全てYesにするオプション。以下、断りのない限りUbuntuの端末上のコマンドである。

sudo apt -y update

アップグレードする

sudo apt -y upgrade

下記のコマンドでビルドツール(パッケージ)を一括でインストール。gccやmakeなどがインストールされる。

sudo apt -y install build-essential cmake

GUIを使えるようにする

Windows側にX-Serverをインストールする。

sourceforge.net

VcXsrv (スタートメニュー上ではXLaunchとなってる)を起動する。

f:id:onsanai:20190410103753p:plain:w100
VcXsrv XLaunch
何も考えずに次へ->次へ->次へ->完了。

xfce4パッケージをインストールする。

sudo apt -y install xfce4-terminal xfce4

~/.bash_profile を開き、以下の記述を末尾に追加する。~/.bash_profile を開くには、 nano ~/.bash_profile が便利だろう。

export DISPLAY=:0.0

再読み込みする。

source ~/.bash_profile

xeyesが表示されればOK。

xeyes

f:id:onsanai:20190421130225p:plain:w100
XEYES

Python3でROOTを動かしたい人のための、ROOTバージョン6のコンパイル方法

Python3で動かす必要のない人は、後述の方が楽かつ速い。

奥村氏のテキストを参考に、ROOT v6.16.00 をコンパイル方法を説明する。

ROOTのソースコードをホームディレクトリにダウンロードする。

cd ~
wget https://root.cern/download/root_v6.16.00.source.tar.gz

/use/local へ移動し、管理者権限でROOTのソースコードを展開

cd /usr/local
sudo tar zxvf ~/root_v6.16.00.source.tar.gz

コンパイルに必要な各種パッケージを導入する。 詳細は、UbuntuでROOTをコンパイルするためにで必要なパッケージを確認されたし。Ubuntu16までとなっているが、18系もそう大差はないように思われる。

sudo apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libgsl0-dev python3-dev

cmakeをビルドする用のディレクトリを作成し、python3付きでコンパイルcmakeする

sudo mkdir root-6.16.00/cmake_build
cd root-6.16.00/cmake_build
sudo cmake ../ -DPYTHON_EXECUTABLE=/usr/bin/python3

makeする。 -j 8 は並列化するためのもので、スレッド数に応じて数字を変えるか、分からない場合は sudo makeだけでよい。 makeはかなり時間がかかる。(当方の環境で8スレッド並列でやって1時間ほどかかった)

sudo make -j 8

4コア8スレッドのラップトップでmakeしている最中のタスクマネージャーはこうなる f:id:onsanai:20190421101551p:plain:w300

~/.bash_profile にROOTのパスを通すため、以下のように記述する。

cd /usr/local/root-6.16.00/cmake_build
source bin/thisroot.sh
cd - > /dev/null

~/.bash_profile を再読み込み

source ~/.bash_profile

次のセクションを飛ばして、ROOTの起動の確認へ。

Pythonを必要としない人のためのROOTバージョン6の簡単インストール方法

ROOT講習会に参加する人は、この「簡単インストール方法」は行わないで下さい。

ROOTの最新版 又は、指定のバージョンをホームディレクトリにダウンロードする。執筆時の最新版は v6.16.00 だった。

cd ~
wget https://root.cern/download/root_v6.16.00.Linux-ubuntu18-x86_64-gcc7.3.tar.gz

/usr/local に展開する。

cd /usr/local
sudo tar xvzf ~/root_v6.16.00.Linux-ubuntu18-x86_64-gcc7.3.tar.gz

~/.bash_profile を開き、末尾に以下の記述追加する

cd /usr/local/root
source bin/thisroot.sh
cd - > /dev/null

~/.bash_profile を再読み込み

source ~/.bash_profile

ROOTの起動の確認

ROOTをグラフィックなしで起動できるか確認する。 -b はグラフィックなしのオプション。

root -b

以下のように表示されればOK

   ------------------------------------------------------------
  | Welcome to ROOT 6.16/00                  https://root.cern |
  |                               (c) 1995-2018, The ROOT Team |
  | Built for linuxx8664gcc on Jan 23 2019, 09:06:13           |
  | From tags/v6-16-00@v6-16-00                                |
  | Try '.help', '.demo', '.license', '.credits', '.quit'/'.q' |
   ------------------------------------------------------------

.q でROOTのモードから抜けられる。次に、ROOTをグラフィックありで起動してみる。

root

ROOTのグラフィックスが表示されることを確認する。

f:id:onsanai:20190410102652p:plain:w500
ROOT グラフィックス

Ubuntuの実態は、ユーザー名「Masahiro」の場合は下記ディレクトリにある。

C:\Users\Masahiro\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs

リモートでWindows系を動かしているときにマウスが消えた時

ディスプレイを接続していなかったり、マウスを接続していないと、マウスが消えてしまうことがある

f:id:onsanai:20190401185208p:plain:w500

マウスキー機能を有効にします

を有効にしましょう。

コマンドでWord/Excel/PowerPoint のファイルをPDF/画像に変換する (Windows版)

方針としては、全部PDFに変換してから、画像に変換する。

PDFに変換するには、 LibreOffice を使う。使い方はここを見よ。 takuya-1st.hatenablog.jp

で終わったんだが、プログラムへのPathが変更されていた。

"C:\Program Files\LibreOffice\program\soffice.exe"

なので、実行すべきコマンドは

"C:\Program Files\LibreOffice\program\soffice.exe" --convert-to pdf --headless "C:\sample.pptx"

となるだろうか。スペースの入ったpathは""で囲むのを忘れないように。他のオプションは公式に詳細に書いてある。日本語にしてくれた方に感謝したい。

LibreOffice ソフトウェアをパラメーターを指定して起動する - LibreOffice Help

PDFを画像に変換する方法、pythonユーザーであれば python convert pdf to image で検索すればザクザク出てくる

from pdf2image import convert_from_path
images = convert_from_path(root + ".pdf")
i = 0
for image in images:
    image.save('{}_{:03d}.png'.format(root,i), 'png')
    i += 1

CERN ROOT6の.rootlogon.C の記述例 (プロジェクタで見えづらい色も調整済み)

root.cern.ch

ホームディレクトリに .rootlogon.C を置くと、自分のROOTの設定を毎回使えるので便利である。私が使ってるコードがあるので、サンプルとして公開してみる。Atlas styleを参考にした。

gitlab.com

黄緑色と空色はプロジェクタでの視認性が最悪であり、これも調整している。カラーユニバーサルデザイン推奨配色セットを使った。

f:id:onsanai:20190326010759p:plain
色の設定前(左)、設定後(右)

OpenCVを使った画像内のピーク検出プログラム

ピークの周波数によって、途中のBoxFilterとGaussianBlurのカーネルサイズは変えると良い。

背景の強度を求めて、有意度を求めるのがこのプログラムのミソである。

var size = new OpenCvSharp.Size(nbin, nbin);
Mat signal = Mat.Zeros(size, MatType.CV_32F);
var sig8U = new Mat(size, MatType.CV_8UC1);

//Fill
{
        float val = signal.Get<float>(iy, ix);
        signal.Set(iy, ix, val + (float)(1.0));
}

Mat bg = new Mat(size, MatType.CV_32F); // local average
Mat sub = new Mat(size, MatType.CV_32F); // signal - bg
Mat error = new Mat(size, MatType.CV_32F); // error
Mat sig = new Mat(size, MatType.CV_32F); // significance
Mat buf = new Mat(size, MatType.CV_32F); // buffer

Cv2.BoxFilter(signal, signal, -1, new OpenCvSharp.Size(3, 3), null, false); //3x3の膨張処理
Cv2.GaussianBlur(signal, bg, new OpenCvSharp.Size(15, 15), -1);
Cv2.Subtract(signal, bg, sub);

Cv2.Add(signal, bg, buf);
Cv2.Sqrt(buf, error);

Cv2.Add(error, 0.01, buf);
Cv2.Divide(sub, buf, sig);//0.01は0除算を避けるため

Cv2.ConvertScaleAbs(sig, sig8U, 255.0 / 5.0, 0);//>=5sigma = 255

Cv2.MinMaxLoc(sig, out double minval, out double maxval,
    out OpenCvSharp.Point minloc, out OpenCvSharp.Point maxloc);
cv::Size size = cv::Size(width, width);
cv::Mat signal = cv::Mat::zeros(size, CV_32F);
cv::Mat sig8U = cv::Mat(size, CV_8UC1);

//Fill
{
    signal.at<float>(cv::Point(dx + width / 2, dy + width / 2)) += 1;
}

cv::Mat bg = cv::Mat(size, CV_32F); // local average
cv::Mat sub = cv::Mat(size, CV_32F); // signal - bg
cv::Mat error = cv::Mat(size, CV_32F); // error
cv::Mat sig = cv::Mat(size, CV_32F); // significance
cv::Mat buf = cv::Mat(size, CV_32F); // buffer

cv::boxFilter(signal, signal, -1, cv::Size(3, 3), cv::Point(-1,-1), false); //3x3の膨張処理
cv::GaussianBlur(signal, bg, cv::Size(15, 15), -1);
cv::subtract(signal, bg, sub);

cv::add(signal, bg, buf);
cv::sqrt(buf, error);

cv::add(error, 0.01, buf);
cv::divide(sub, buf, sig);//0.01は0除算を避けるため

cv::convertScaleAbs(sig, sig8U, 255.0 / 5.0, 0);//>=5sigma = 255

double minval, maxval;
cv::Point minloc, maxloc;
cv::minMaxLoc(sig, &minval, &maxval,
    &minloc, &maxloc);

螺旋を描くためのC++ソースコード

uint64_t range = 1000;
int x = 0;
int y = 0;
uint64_t loop = 0;
uint64_t shift = 0;
for (uint64_t i = 1; i < range * range; i++) {
    std::cout<<x<<" "<<y<<" "<<i<<std::endl;
    if (i == (loop * 2 + 1) * (loop * 2 + 1)) {
        loop++;
        shift = 0;
        x++;
    }
    else {
        shift++;
        if (shift >= loop * 6) { x++; }
        else if (shift >= loop * 4) { y--; }
        else if (shift >= loop * 2) { x--; }
        else { y++; }
    }
}

素数だけ描くとこうなる。

f:id:onsanai:20190321180707p:plain
ウラムの螺旋

参照 ウラムの螺旋 - Wikipedia