ニャンポ魚

ニャンポうお

やや公共性のあるメモ。泥臭い実験生物学を、ICTの力でちょっとでも効率的にやりたい。

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 に失敗する

エラーの概要
解決策
  • pythonのバージョンが 2.7 の環境を activate
  • そちらで同様にインストールを試みると成功

問題2: Jupyter notebook で python2 を動かせない

問題3: import openslide が効かない

*1:スライドガラスまるごと、プレパラートの全体をスキャンした画像

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を取得するのにサインアップが必要なのでやる。

表示条件のカスタマイズとかを済ませて、表示。このとき検索結果がでかすぎるとメモリが足りなくてしぬことがある。

作成例

f:id:un-titled:20200104054929p:plain

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

chrome.google.com

  • 複数のGmailアカウントに届いたメールを、新しくタブを開くことなく通知、閲覧、アーカイブ
  • これまで使ってこなかったことを後悔する出来。

Tabpane

chrome.google.com

  • 開いてる全タブをサムネイルとして一覧。
  • タブを開きすぎた際、何のページだったかを把握しながら閉じるのに便利。

Picture in Picture for every website

chrome.google.com

  • 任意のページにある動画をフローティングディスプレイ上で再生。
  • ながら見に便利。

Grammarly for Chrome

chrome.google.com

  • 英文スペル、文法チェッカー。
  • 高度な機能については課金されているが、無料でも冠詞の抜けなどを拾ってくれる。

Google Scholar ボタン

chrome.google.com

メニューバー上のアイコンをクリックすることで、

  • 表示していた論文をGoogle Scholar上で検索。
  • 選択していた文字列をGoogle Scholar上で検索。
  • いずれでもない場合、小ウィンドウ内でGoogle Scholarの検索窓を開く。

f:id:un-titled:20191110115826p:plain

ヒットした論文について、複数の引用形式から好きなものを選んでコピーできるのが便利。

PDF Viewer

chrome.google.com

  • HTML5でPDFファイルを開く
  • Chrome自体のPDFビューアは日本語フォントの扱いが変なことがあったので乗り換えた。

バッチ処理によるfastaファイルの結合

fastamerge.bat
for /f %%i in ('dir /b *.fasta') do (
     echo.>>%%i
     type %%i>>merged.fasta
)
exit
  • バッチファイルを置いたフォルダ内にあるすべてのfastaファイルを結合して、merged.fastaに出力

  • MEGAのようなソフトを使って、シーケンス結果をアラインメントにかける際に利用

  • もっと具体的に書くと、ユーロフィンから送られてきたデータを解凍したフォルダ内にこのファイルをコピペして走らせ、依頼したシーケンス一発注ごとに得られた配列がすべて入っているファイルを作るのに使っている

  • なんかあんまりうまくないヒューリスティクスな気がするのでもうちょっといい手でやりたいが

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。くらいの使い分けになるんじゃないかなあと思った。

いずれにしても計算機のスペックがそこそこないと効率化につながらないので、そこも考慮に入れておいた方がよいのではないか。