Studio.app と LDraw を使って LEGO 風のイベントディスプレイをスーパーカミオカンデ用に作る

同業の中の人がこんな企画をされていました。

あくまで一般向けのものであって、同業者が手を出すものではないと思うのですが、Python + matplotlib よりも ROOT だと早いよ、というのを言いたくなってしまったので、大人気ないことをしてしまうわけです。

さて、以前から LEGO ブロックで物理関係のことをやってみたいなとずっと思っていて、また LEGO の 3 次元データを扱うためのファイルフォーマットの 1 つである LDraw というものを最近知りました。LDraw のフォーマットは非常に簡単なので、これを使うとイベントディスプレイに使えます。
www.ldraw.org

また Studio.app という LEGO(風の)ブロック用の 3D ソフトウェアもあることを知り、これで LDraw をインポートできるということもわかりました。じゃあ、これらを組み合わせるとスーパーカミオカンデ(SK)のイベントディスプレイを LEGO 風にできるわけです。
www.bricklink.com

本当は SK ではなくて、自分のやっているチェレンコフ望遠鏡アレイ(CTA)のイベントディスプレイで遊ぶべきなのですが、同業の中の人の企画にまず乗っかってみようかな、と。

さて、結果です。

ROOT で 5 行で作る場合
$ root
root [0] TNtuple nt("nt", "nt", "ch:pe:t:x:y:z")
root [1] nt.ReadFile("Downloads/sample/multirings.0001.000015.csv")
root [2] nt.SetMarkerStyle(20)
root [3] nt.SetMarkerSize(0.5)
root [4] nt.Draw("z:y:x:pe", "", "col")

f:id:oxon:20200531121653p:plain
ROOT の NTuple で作ったもの

ROOT + Python で LDraw に出力したもの
$ ./sk2lego.py Downloads/sample/multirings.0001.000015.csv > event.ldr

f:id:oxon:20200531121744p:plain
LDraw に出力して、Studio.app でインポートしたもの

LDraw の形式は、こんな感じです。1 に続けて、色番号、座標と回転行列の要素、そして部品番号です。簡単ですね。

1 36 x y z Rxx Rxy Rxz Ryx Ryy Ryz Rzx Rzy Rzz 4073.dat

まあ、これだけだと実際に立体に組むことはできないので、東大 LEGO 部の作品に組み込むと格好良さそうな気がします。
http://www-sk.icrr.u-tokyo.ac.jp/pr/topics/2016/08/img/DSC_0984%20copy.jpg

sk2lego.py の中身です回転行列を使う必要があるので、それは ROOT を呼んでいます。

gist.github.com