Open Field Tests の座標データ群から中央滞在時間と総移動距離を計算してまとめるPythonコード
このコードは DuoMouse*1 *2というトラッキングソフトが吐き出す動物の座標データから、Open Field Test におけるTime in Center と Total Travel Distance を算出し、同時にファイル名から個体の属性を読み取って、csvファイルにそれらデータをまとめて出力することを目的として書かれている。
ファイル名から個体の属性を読み取れるのは、実験を行った際にファイル命名のルールを決めておいたからなので、このあたりは筆者の環境でしかうまく動かないような要素ということになる。実際に使われる際には適宜書き換えが必要になると思われるがご了承いただきたい。あとガバがあって大事なデータがメタメタになっても筆者は責任とりません。クソコードゆるして。
import re import csv from pathlib import Path import datetime import numpy as np import os report = 'report' + input()+ '.csv' #実行時に出力csvファイルの名前を手打ちする。 out = open(report, "w") out.close() def calcTTD(log): v = np.loadtxt(log, delimiter=',', usecols=(1,2)) v = np.diff(v, axis=0) # 各点間の差を取得 every_distance = np.linalg.norm(v, axis=1) # 各点間のユークリッド距離を計算 TTD = '{0:.1f}'.format(np.sum(every_distance, dtype=float)) #総移動距離を計算して小数点以下一桁に丸める return TTD #単位はpx def calcTiC(log, FPS, mesh_num, area_num): #mesh_numはフィールド全体を何マス×何マスに区切るか。area_numはそのうち何マス×何マスを中央と見なすか y = np.loadtxt(log, delimiter=',', dtype='int64', usecols=[1]) x = np.loadtxt(log, delimiter=',', dtype='int64', usecols=[2]) H, xedges, yedges = np.histogram2d(x, y, bins=(mesh_num, mesh_num), range=((0, HEIGHT),(0, WIDTH))) #ヒストグラム作成 #各メッシュでの滞在時間をヒストグラムにまとめているので、そのままmatplotlibでヒートマップを出すこともできる。ここでは省略 H = H/FPS Y = int((mesh_num-area_num)/2) centre = H[Y:mesh_num-Y,Y:mesh_num-Y] TiC = '{0:.1f}'.format(np.sum(centre, dtype=float)) #中央滞在時間の合計を出して小数点以下一桁に丸める return TiC #単位はsec p = Path(r'hoge/hoge/hoge') #データをまとめて置いているディレクトリを指定 file_ls = list(p.glob("**/*")) #サブディレクトリに含まれているファイルの一覧を取得 file_ls = [str(i) for i in file_ls] file_ls = [i for i in file_ls if 'xy.csv' in i] #そのうち_xy.csvを含むものだけを得る with open(report, 'a') as f: writer = csv.writer(f) writer.writerow(['yy', 'mm', 'dd', 'sex', 'number', 'trial', 'TTD', 'TiCa', 'TiCb', 'TiCc', 'TiCd', 'TiCe', 'TiCf']) #DuoMouseでは撮影した動画のFPSやピクセルサイズなどのデータが座標ファイルとは別に出力されている #以下はそれを探してきて解析に使うためのコード for i in file_ls: log = i ver_i = i.strip("xy.csv") + 'recording.log.txt' ld = open(ver_i) lines = ld.readlines() ld.close() regex = re.compile('\d+') for line in lines: if line.find("TARGET AREA WIDTH") >= 0: WIDTH = regex.search(line[:-1]) print(WIDTH) print(WIDTH.group()) WIDTH=int(WIDTH.group()) elif line.find("TARGET AREA HEIGHT") >= 0: HEIGHT = regex.search(line[:-1]) print(HEIGHT) print(HEIGHT.group()) HEIGHT=int(HEIGHT.group()) elif line.find("CAMERA FPS") >= 0: FPS= regex.search(line[:-1]) print(FPS.group()) FPS=int(FPS.group()) #実際の計算。TiCは6種のサイズでとってみる TTD = calcTTD(log) TiCa = calcTiC(log, FPS, 10, 8) TiCb = calcTiC(log, FPS, 9, 7) TiCc = calcTiC(log, FPS, 8, 6) TiCd = calcTiC(log, FPS, 7, 5) TiCe = calcTiC(log, FPS, 5, 3) TiCf = calcTiC(log, FPS, 3, 1) #ファイル名から属性を抽出してcsvに書き込み #元ファイルは[yy]-[mm]-[dd]-[sex]-[individual_number]-[trial_number]というルールで命名していっていたので、それをふまえてcsvに出力 i = os.path.basename(i) name = i.split('-') yymmdd = name[0] yy = yymmdd[:2] mm = yymmdd[2:4] dd = yymmdd[4:] ind = name[1] number = re.sub("\\D", "", ind) sex = ind.strip(number) try: tail = name[2] except IndexError: pass trial = tail[:1] with open(report, 'a') as f: writer = csv.writer(f) writer.writerow([yy, mm, dd, sex, number, trial, TTD, TiCa, TiCb, TiCc, TiCd, TiCe, TiCf])
*1:DuoMouse http://www.mgrl-lab.jp/DuoMouse.html
*2:余談だが、Duo の名のとおり、もともとは二匹のマウスのソーシャルインタラクションを検討するために書かれたソフトらしい。大は小を兼ねるということで筆者は一匹のマウスの行動解析に利用させていただいている。
Anaconda + Jupyter notebook で openslide-python を使う
openslide-python は主に whole slide image *1 を扱うためのライブラリらしい。 openslide.org
問題1: pip install openslide-python に失敗する
エラーの概要
- OS は Windows10
- https://openslide.org/download/#windows-binariesから openslide-python のバイナリデータをダウンロード(2017-11-22に更新された64bit版のもの)
- ダウンロードファイルがあるディレクトリ上で Anaconda Prompt から適当な環境(python3.7)に pip install openslide-python しようとすると失敗
解決策
- pythonのバージョンが 2.7 の環境を activate
- そちらで同様にインストールを試みると成功
問題2: Jupyter notebook で python2 を動かせない
- https://www.dev2qa.com/how-to-run-python-2-code-in-jupyter-notebook/の通りに新しく環境を作り直して解決
問題3: import openslide が効かない
VOS viewer で学術文献どうしの関係を可視化する
VOSviewer - Visualizing scientific landscapes https://www.vosviewer.com/
概要
学術文献どうし、および著者どうしの関係によって形作られるネットワークを、引用や共著を指標として可視化するソフト。
総説論文を読む、みたいなスタンダードな方法とはちょっと違ったやり方で分野を眺めてみるのに使ってみようと思った。
とりあえず動かしてみる
インストールして、
File>Create>Create a map based on bibliographic data>Download data through API
好きな API を選んで絞り込み条件を設定する。Microsoft AcademicだとKeyを取得するのにサインアップが必要なのでやる。
表示条件のカスタマイズとかを済ませて、表示。このとき検索結果がでかすぎるとメモリが足りなくてしぬことがある。
作成例
Europe PMC の API を使って出力した、表題かアブストに odor information processing を含む論文の著者相関図。相互引用関係や共著を基準として作成されている。
File>Saveで出力結果を保存。
Mendeley にためこんだ文献情報を構造化して眺めてみる。
Windows版の Mendeley Desktop で適当な文献をざっと全選択して、Export > .ris 形式で保存
VOSviewerの側では、File>Create>Create a map based on bibliographic data>Read data from reference manager files
あとは出力しておいた .ris ファイルを読み込むだけ。
おすすめのChrome拡張
Checker Plus for Gmail™
Tabpane
- 開いてる全タブをサムネイルとして一覧。
- タブを開きすぎた際、何のページだったかを把握しながら閉じるのに便利。
Picture in Picture for every website
- 任意のページにある動画をフローティングディスプレイ上で再生。
- ながら見に便利。
Grammarly for Chrome
- 英文スペル、文法チェッカー。
- 高度な機能については課金されているが、無料でも冠詞の抜けなどを拾ってくれる。
Google Scholar ボタン
メニューバー上のアイコンをクリックすることで、
- 表示していた論文をGoogle Scholar上で検索。
- 選択していた文字列をGoogle Scholar上で検索。
- いずれでもない場合、小ウィンドウ内でGoogle Scholarの検索窓を開く。
ヒットした論文について、複数の引用形式から好きなものを選んでコピーできるのが便利。
PDF Viewer
バッチ処理によるfastaファイルの結合
fastamerge.bat
for /f %%i in ('dir /b *.fasta') do ( echo.>>%%i type %%i>>merged.fasta ) exit
2019年度版、神経科学に関係するノーベル賞受賞者まとめ
気がついたら2019年度のノーベル生理学医学賞がもう出ていたので、便乗というのにももう遅いが、この機会にノーベル賞受賞者一覧でも眺めてみるかという気分になった。
せめて近い分野の受賞くらいはおさえておいたほうがよいのではないかという気持ちで、それらしいページを見てみる。 faculty.washington.edu どういう基準で神経科学関連の受賞だと判断しているのかわからないところもあるが、日本語だとこういうリストがさっと出てこなかったのでありがたい。
下の方にちょこっと載ってるトリビアもちょっと面白い。
受賞者リスト
以下、上記のリストにパブロフと利根川を足したメモ。1977年の同時受賞者であるヤーリーははじかれていたので注意。
受賞年 | 受賞者 |
メモ |
---|---|---|
1904 | パブロフ | ただし古典的条件付けではなくて消化の研究でもらったらしい。だから上記のページではカウントされてない。 |
1906 | ゴルジ カハール |
言わずもがなの大物ふたり。神経系の網説とシナプス説。 |
1911 | グルストランド | 眼科の研究 |
1914 | バーラーニ | 内耳系の研究 |
1927 | ヤウレック | 麻痺性認知症に対するマラリア寄生虫接種の治療効果を示したことについて。なんのこっちゃという感じだが、無理やり高熱を出させることで原因である梅毒トレポネーマを死滅させるという荒療治らしい。 |
1932 | シェリントン エイドリアン |
シナプスの命名、脳波測定の確立、陰極線オシロスコープの使用による興奮の減衰説など |
1936 | デール レーヴィ |
アセチルコリンとアドレナリンをそれぞれ発見 |
1944 | アーランガー ガッサー |
陰極線オシロスコープによる活動電位測定 |
1949 | ヘス モニス |
前者は間脳の機能マッピング、後者は悪名高いロボトミーの開発 |
1957 | ボベット | 抗ヒスタミン薬などの開発 |
1961 | ベーケーシ | 内耳蝸牛における刺激の物理的機構の発見。どうも後世の研究で覆った部分があるらしいが、まだきちんと理解できていない。 |
1963 | エクレス ホジキン ハクスレー |
活動電位の発生メカニズム。分子生物学で言えばワトソンとクリックくらいの業績? |
1967 | グラニト ハートライン ワルド |
視覚の電気生理と化学 |
1970 | カッツ オイラー アクセルロッド |
ノルアドレナリンの神経伝達物質としてのふるまい |
1973 | ローレンツ フリッシュ ティンバーゲン |
動物行動学とか生態学の人もリストに入ってるのか~。 |
1976 | ブランバーグ ガジュセック |
前者はB型肝炎ウイルスの発見とワクチン開発、後者はプリオンの発見に対する貢献 |
1977 | ギルマン シャーリー |
ペプチドホルモンの同定 |
1979 | ハウンズフィールド コーマック |
CTの開発 |
1981 | ヒューベル ウィーセル スペリー |
前者ふたりは視覚系での傾き検出、後者は分離脳研究。スペーリーはヒヨコをすりつぶす思考実験で有名なポールワイスの弟子で、網膜視蓋投射のトポグラフィックマッピング研究も大きな業績。 |
1986 | モンタルチーニ コーエン |
NGFの発見 |
1987 | 利根川 | 免疫グロブリンの遺伝子再構成。これ自体が神経科学の業績とはいいがたいが、のちに神経科学分野に転身し、CKOマウスを使った記憶研究やプレプレイの発見など、大きな成果を挙げている。 |
1991 | ネーアー ザクマン |
パッチクランプを開発し、それにより単一イオンチャネルの機能を解明したことについて。 |
1994 | ギルマン ロッドベル |
Gタンパクを介したシグナリング経路の解明 |
1997 | プルシナー | プリオンの発見。1976年のガジュセックはクールー病の記載だけで発見と命名はしていない。 |
2000 | カールソン グリーンガード カンデル |
ドーパミン、CREB。カンデルは神経科学分野で最もポピュラーな教科書、Principles of Neural Scienceを編纂している。もうしばらく新版が出ていないが……。 |
2003 | ラウターバー マンスフィールド |
MRIの開発 |
2004 | アクセル バック |
嗅覚受容体遺伝子の同定*1*2 |
2013 | シェクマン ロスマン スードフ |
小胞輸送の研究 |
2014 | オキーフ モーセル夫妻 |
場所細胞の発見、シータ位相差による場所符号化の解明 |
2017 | ホール ロスバッシュ ヤング |
概日リズム形成遺伝子のスクリーニング |
眺めてみての感想
医学分野は全然知らない人がけっこういて驚きがあった。
当然だけど、それこそニューロンの予言からはじまって、次第に高次機能の理解へとつながってゆく過程がなんとなく見てとれる。研究が行なわれていた年代と受賞にはずれがあるのと、一直線の進歩ではもちろんないことを差し引いても。
オプトジェネティクスやDREADDのような操作実験の手法が近いうちにとるかは、まだちょっと微妙なラインかもしれないとこれを見てなんとなく思った。
*1:逸話 http://park.itc.u-tokyo.ac.jp/biological-chemistry/profile/essay/essay04.html
*2:主要論文 : Buck, L., & Axel, R. (1991). A novel multigene family may encode odorant receptors: a molecular basis for odor recognition. Cell, 65(1), 175-187. https://linkinghub.elsevier.com/retrieve/pii/0092-8674(91)90418-X
動物行動のトラッキングソフトを使いくらべてみる
試したもの
- UMA Tracker
- Tracktor
- DeepLabCut
UMA Tracker
UMATracker http://ymnk13.github.io/UMATracker/
良かった点
- 完全にGUI
- 画面にかけるフィルターをカスタマイズするだけなので、いじるパラメタが少ない
- 開発者が日本人なので公式ドキュメントが日本語である
問題点
- 後に挙げる他の2ツールと異なって機械学習を使っていない(たぶん)ため、精度に限界がある(誤った検出を排除しにくい)
- 誤った検出を排除するための手数が多くなる場合は、省力化にそこまで貢献しないこともある
- 撮像条件が微妙にブレていると、動画ひとつごとにフィルターを微調整する必要があることも
フィルターでとりきれないノイズがそもそも発生しないように、そもそもの動画撮影条件を工夫して実験すれば、そうとうお手軽にトラッキングを省力化できそう。
Tracktor
GitHub - vivekhsridhar/tracktor: Python and OpenCV based object tracking software https://github.com/vivekhsridhar/tracktor
良かった点
問題点
- CUIに不慣れだと導入がたいへん
- DeepLabCutの下位互換感
まあこれを使うならDeepLabCutでいいのでは。現状日本語の記事がなかった気がする。
DeepLabCut
GitHub - AlexEMG/DeepLabCut: Markerless pose estimation of user-defined features with deep learning for all animals, including humans https://github.com/AlexEMG/DeepLabCut
良かった点
- 非常に高精度、充分なラベル(教師データ)と学習条件が揃えば、人間と同等程度のトラッキングが可能
- 一個体ごとの多点トラックができる(姿勢の判定が可能)
- すでに国内にもかなりのユーザーがいて、導入にあたってWeb上の日本語記事を多く利用できる
問題点
- CUIに不慣れだと導入がたいへん
厳密にはトラッキングソフトではなくて、トラッキングもできるソフトと呼ぶべきかもしれない。
所感
ノイズの少ない条件(背景が一色、実験者の手が写り込まない、など)での録画が可能で、なおかつユーザーがCUIに抵抗があるならUMA、そうじゃないならDeepLabCut。くらいの使い分けになるんじゃないかなあと思った。
いずれにしても計算機のスペックがそこそこないと効率化につながらないので、そこも考慮に入れておいた方がよいのではないか。