WSL上のJupyter LabでPython/ROOT C++/PyROOT、Jupyter Notebookでjsrootを動かす

超メモです。$は削除して実行してください

WSLでJupyter Labを動かす方法

nodejsは最新版を推奨する。それ以外だとエラーが出ることがある。pip3でsudoは付けない。以下、実行すべきコマンド。

$ sudo sed -i.bak -e 's%http://[^ ]\+%mirror://mirrors.ubuntu.com/mirrors.txt%g' /etc/apt/sources.list
$ sudo apt -y update && sudo apt -y upgrade && sudo apt -y install build-essential python3-pip
$ curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt -y install nodejs
$ pip3 install --upgrade setuptools
$ pip3 install testresources metakernel nodejs
$ pip3 install jupyterlab widgetsnbextension 

pip3をユーザー権限で叩くと、$HOME/.local/binに実行ファイルが置かれるので、~/.bashrcに以下を追記する。

PATH="$HOME/.local/bin:$PATH"

Jupyter Labを起動してみる。 Windows上だと --no-browser は必要ないが、WSLからブラウザは開けないので、--no-browser オプションを必ず付けて、ブラウザなしで起動する。

$ jupyter lab --no-browser

とすると、

Or copy and paste one of these URLs:
http://localhost:8889/lab?token=94b26.............
http://127.0.0.1:8889/lab?token=94b26.............

とURLが表示されるので、これをWindowsのブラウザ(Google Chrome)のURLが表示されているところに貼り付ける。

拡張機能をインストールすると、再ビルドを求められることがある。

$ jupyter lab build
$ jupyter lab --no-browser

拡張機能をブラウザからインストールできないときは、コマンドラインからインストールを試す。補完用のtocはブラウザからなぜかインストールできなかった。

$ jupyter labextension install "@jupyterlab/toc"

Jupyter Lab上でROOT C++/PyROOTを動かす

まず、ROOTを入れる。ハードルは高いが頑張る。権限の問題から、/opt/root/6.22.08 ではなく、ユーザーディレクトリ、例えば $HOME/root/6.22.08 にインストールするのが望ましい。

github.com

プリコンパイルバージョンは、画像のライブラリの一部がコンパイルされていないため使えない。

~/.bashrc に、ROOTのPATHを追加する

export ROOTSYS=$HOME/root/6.22.08
cd $ROOTSYS
source bin/thisroot.sh
cd - > /dev/null

Jupyter Labをインストールする。以下、実行すべきコマンド。

$ sudo apt -y install python3-pip
$ curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt -y install nodejs
$ pip3 install --upgrade setuptools
$ pip3 install testresources metakernel nodejs
$ pip3 install jupyterlab widgetsnbextension 

Jupyter-Labを起動し、URLをブラウザで開く。

jupyter lab --no-browser

すると、以下のように、PythonとROOT C++が表示されるはずである。

f:id:onsanai:20210428202232p:plain

サンプルコードは公式から引用する。

HowTo_ROOT-Notebooks

TH1F *h = new TH1F("gauss","Example histogram",100,-4,4);
h->FillRandom("gaus");
TCanvas *c = new TCanvas("myCanvasName","The Canvas Title",800,600);
h->Draw();
c->Draw();

f:id:onsanai:20210428202711p:plain

こうなればOK。当然Pythonからpyrootも動くのでPython 3の方からノートを作り、

import ROOT
h = ROOT.TH1F("gauss","Example histogram",100,-4,4)
h.FillRandom("gaus")
c = ROOT.TCanvas("myCanvasName","The Canvas Title",800,600)
h.Draw()
c.Draw()

f:id:onsanai:20210428202838p:plain

こうなればOK。

Jupyter Notebook上でjsrootを動かす

jsrootはブラウザ上でROOTファイルを動的に扱うJavaScriptのライブラリ。Jupyter Labでは使えないので、Jupyter Notebookを動かす。

root --notebook --no-browser

でJupyter Notebookを開くと、%jsroot (jsrootの有効化)で、Drawすると軸が動的に触れるようになる。

有効化するには ROOT.enableJSVis()と書いても良い。無効化するには ROOT.disableJSVis() で静的に戻る。

f:id:onsanai:20210429151144p:plain

参照: nodejsのインストール方法

GitHub - nodesource/distributions: NodeSource Node.js Binary Distributions

途中で出たエラー(検索用)

ImportError: cannot import name 'StaticModule' from 'setuptools.config' (/usr/lib/python3/dist-packages/setuptools/config.py)