kuroの覚え書き

96の個人的覚え書き

富士通PRIMERGY RX300S7で深層学習の学習環境を構築してみる

データ解析をする上で無視できない深層学習(deep learning)を使えるように勉強中なのだが、手元に実機があったほうがいろいろと試せて良いだろう、ということでサーバの1ノードを深層学習用GPUマシンにすることにした。
当初RX200S7 (XEON E5-2620 x2)の1UサーバにGPUを乗っけてテストを開始したのだが、流石に1Uでは窮屈かなと、2UのRX300S7 (XEON E5-2630L)を入手してみた。
#春は中古サーバが安く出回っていいね。
本当は2UだとフルハイトのPCIカードが刺さらないので、タワー型のサーバ機のほうが良いのだけど、そういう汎用性のありそうな機械はヤフオクでも結構値がつり上がっちゃうので、やむなく2Uラックサーバで我慢する。
GPUは画像を表示させるわけでもないのでx16フルに繋がっている必要はないから、仮想通貨マイナー御用達の外付けx1 PCI-eの基板などで外付けにすればいいのだろうが(そうするとRX300でなくてもいいとも言えるが)、とりあえずはテスト環境として、一番安価でCUDA対応しているNVIDIA GeForce GT710というロープラファイルでローエンドなグラフィックボードを入れてみた。

まずはいろいろとサイトを巡って情報収集。
いつもお世話になっています
CentOS 7 : CUDA 9.1 インストール : Server World
まずはここを参考にCUDAをインストールしてみる。

このページではCUDA9.1を入れているが、こういう情報はすぐに更新されていってしまうので、そのままやるという訳にはいかない。
そもそもいろいろ関係するもののバージョンの組み合わせによって動いたり動かなかったりするわけで、いつの間にか情報のあるバージョンがダウンロードできなくなっていたりするので厄介だ。かといってすべて最新バージョンにしたらだいたいはうまくいかないというのがこの世界。試行錯誤するしか無いのな。

2019年4月18の段階の各種最新バージョンは以下の通り
anaconda3-5.3.1
python 3.7.2
tensorflow-gpu-1.13.1
CUDA-10.1
nvidia-driver-418.43

まずはグラボをインストール。RX300S7のマニュアルを見るとグラボはPCI-slot5に挿せ、とあったので素直に従ってみたところ認識しないし。マニュアルをよくよく見てみると、slot5,6は2CPUでないと使えないとか書いてるし。どういうこっちゃ。結局グラボの装着順は(1) slot5, (2) slot4ということらしく、1CPUのときは(1)は飛ばして(2) slot4に挿す必要があるようで、わかりにくいことこの上ない。ついでにグラボを挿すとオンボードVGAは使えなくなるというおまけ付き。

とりあえずnvidiaのドライバを入れるために標準ドライバを切る。

# lsmod | grep nouveau
nouveau 1869689 0
mxm_wmi 13021 1 nouveau
video 24538 1 nouveau
wmi 21636 2 mxm_wmi,nouveau
drm_kms_helper 179394 2 mgag200,nouveau
ttm  114635 2 mgag200,nouveau
drm  429744 5 ttm,drm_kms_helper,mgag200,nouveau
i2c_algo_bit  13413 3 igb,mgag200,nouveau
# nano /etc/modprobe.d/blacklist-nouveau.conf
# cat /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0

# dracut --force
# reboot

次にドライバをインストール

必要なパッケージをインストール

# yum -y install kernel-devel-$(uname -r) kernel-header-$(uname -r) gcc make

インストールされているグラボを確認

# lspci | grep VGA
04:00.0 VGA compatible controller: NVIDIA Corporation GK208B [GeForce GT 710] (rev a1)
08:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. MGA G200e [Pilot] ServerEngines (SEP1) (rev 05)

ドライバをダウンロード

# wget http://jp.download.nvidia.com/XFree86/Linux-x86_64/418.43/NVIDIA-Linux-x86_64-418.43.run

インストール

# bash NVIDIA-Linux-x86_64-418.43.run
Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 418.43................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

途中のメッセージはすべてyesで進む
f:id:k-kuro:20190617124038p:plain

f:id:k-kuro:20190617124053p:plain

f:id:k-kuro:20190617124104p:plain
ちゃんと入ったか確認

# nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.43  Driver Version: 418.43   |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap|  Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
|  0 GeForce GT 710 Off | 00000000:04:00.0 N/A | N/A |
| 50%  28C P0 N/A / N/A | 0MiB /  980MiB |  N/A Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes:  GPU Memory |
| GPU  PID  Type  Process name  Usage |
|=============================================================================|
| 0 Not Supported  |
+-----------------------------------------------------------------------------+

Not Supportedは気になるが、ローエンド機種なのでそういうものらしい

続いてCUDA10.1をダウンロードしてインストール

# wget https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-repo-rhel7-10.1.105-1.x86_64.rpm
# rpm -Uvh cuda-repo-rhel7-10.1.105-1.x86_64.rpm
# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/cuda.repo
# yum --enablerepo=cuda,epel install cuda-10-1 xorg-x11-drv-nvidia dkms gcc make

いろいろ情報を見てもCUDA10.0までしか実績はなさそうだけど
gcc, makeはすでに最新版だったらしくインストールはされないのはいいが、DKMSのインストールでコケた

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# yum --enablerepo=cuda,epel install cuda-10-1 xorg-x11-drv-nvidia dkms

とすることで回避

# nano /etc/profile.d/cuda101.sh

# cat /etc/profile.d/cuda101.sh
export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

ここで一旦再起動

# reboot

一般ユーザでログインして、テストプログラムを走らせてみる

$ cuda-install-samples-10.1.sh ./
Copying samples to ./NVIDIA_CUDA-10.1_Samples now...
Finished copying samples.

$ cd NVIDIA_CUDA-10.1_Samples/1_Utilities/deviceQuery
$ make
$ ./deviceQuery
./deviceQuery Starting...

CUDA Device Query (Runtime API) version (CUDART static linking)

cudaGetDeviceCount returned 35
-> CUDA driver version is insufficient for CUDA runtime version
Result = FAIL

ここでまたエラーが出た。

NVIDIAのドライバを入れ直すと良いらしい

# bash NVIDIA-Linux-x86_64-418.43.run

改めてテスト

$ cd NVIDIA_CUDA-10.1_Samples/1_Utilities/deviceQuery
$ ./deviceQuery
./deviceQuery Starting...

CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GT 710"
CUDA Driver Version / Runtime Version 10.1 / 10.1
CUDA Capability Major/Minor version number: 3.5
Total amount of global memory:  981 MBytes (1028587520 bytes)
( 1) Multiprocessors, (192) CUDA Cores/MP:  192 CUDA Cores
GPU Max Clock rate: 954 MHz (0.95 GHz)
Memory Clock rate:  800 Mhz
Memory Bus Width: 64-bit
L2 Cache Size:  524288 bytes
Maximum Texture Dimension Size (x,y,z)  1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers
Total amount of constant memory:  65536 bytes
Total amount of shared memory per block:  49152 bytes
Total number of registers available per block: 65536
Warp size:  32
Maximum number of threads per multiprocessor: 2048
Maximum number of threads per block:  1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment:  512 bytes
Concurrent copy and kernel execution: Yes with 1 copy engine(s)
Run time limit on kernels:  No
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping:  Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
Device supports Unified Addressing (UVA): Yes
Device supports Compute Preemption: No
Supports Cooperative Kernel Launch: No
Supports MultiDevice Co-op Kernel Launch: No
Device PCI Domain ID / Bus ID / location ID:  0 / 4 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.1, CUDA Runtime Version = 10.1, NumDevs = 1
Result = PASS

これでCUDAはちゃんとインストールできたっぽい
続く

PCAやMDS plotをpythonで行う

これまでPCAやMDSをやりたいときはRを使っていた。しかしRはどうも肌に合わない。すぐ忘れてしまう。
ということでここはやはりPythonですね、ってことでどうやるのか調べてみた。

【python】pca、mds、nmds、tsneとmatplotlibでデータの可視化をしてみる - 静かなる名辞

[Python]PythonでPCAを行う方法 - Qiita

ほおほお、scikit-learnを使えばいいのね。機械学習の環境構築を最近したばっかりなので、すでに環境は整ってるじゃないの。
ということで早速取り掛かる。

とにかくscikit-learnからライブラリを読み込む

from sklearn.decomposition import PCA

データを読み込む(csvから読み込めば簡単)

import numpy as np
npArray = np.loadtxt("analysis.csv", delimiter = ",")
X = np.array(npArray)

実行する

pca = PCA(n_components=2)
pca.fit(X)

以上!
という簡単さ。なにこれ。
あとはmatplotlibでグラフにすれば一丁上がり。

# coding: UTF-8
 
import numpy as np
from matplotlib import pyplot as plt
from sklearn.decomposition import PCA
from sklearn.manifold import MDS, TSNE

def main():
    npArray = np.loadtxt("analysis.csv", delimiter = ",")
    X = np.array(npArray)

    pca = PCA()
    pca.fit(X)    
    transformed = pca.fit_transform(X)
    plt.scatter(transformed[:, 0], transformed[:, 1])
    plt.title('principal component')
    plt.xlabel('pc1')
    plt.ylabel('pc2')
    print(pca.explained_variance_ratio_)    
    plt.show()

    mds = MDS(n_jobs=4)
    mds.fit(X)  
    transformed = mds.fit_transform(X)
    plt.scatter(transformed[:, 0], transformed[:, 1])
    plt.title('Multidimensional scaling')
    plt.show()
    
    tsne = TSNE()
    tsne.fit(X)    
    transformed = tsne.fit_transform(X)
    plt.scatter(transformed[:, 0], transformed[:, 1])
    plt.title('t-distributed Stochastic Neighbor embedding')
    plt.show()
   
if __name__ == '__main__':
    main()   

MDS plotやtSNEも数行書き換えるだけでOK

Macを起動したら自動でsshfsでマウント

まずはサーバの側の公開鍵・秘密鍵を設定

秘密鍵macの側で~/.ssh/kuro-server
などの名前で保存しておく

/usr/local/bin/sshfs kuro@192.168.1.100:/home/kuro ./mnt -o IdentityFile=~/.ssh/kuro-server

というスクリプトautomatorで作成してアプリとして保存。

アカウントの起動項目に設定。
以上。

Mac mini (2014)のモニタ出力不調

Mac miniのモニタ出力が調子悪く、しばらく使っていると点滅し始めて非常にストレスが溜まる。
HDMIにつないでいても、mini-display-portでHDMI変換しても、VGA変換しても同じ症状が出るし、モニタを変えても出るので、グラフィックチップに問題があるのだと思う。
というわけでUSB-HDMIというのを試してみた。
CableCreation USB 3.0 HDMI アダプタ DisplayLinkチップセット 2560x1440対応 Windows/Mac対応
www.amazon.co.jp
これ。一応MacOSX対応で、ドライバを入れれば10.14mojaveでも実績があるようなので。

早速ドライバをDisplayLinkからダウンロードしてインストール。
DisplayLink
version5.1というのが最新だったので、これをインストールしてみるも、全然表示されない。認識もしてくれていない。
ということで一つ前の5.0.1というのを入れてみる。
今度はなんとなく認識はされている感じだが、表示は出ず、blackoutしたまま。
ふと思い立ってシステムのアップデートを確認してみるとアップデータが出ていた。
mojaveにアップしてからマイナーアップデートをかけていなかったようだ。10.14→10.14.3にアップデート、再起動。
出ました。拡張デスクトップとして表示されている。
そこでミラーリングに切り替えた上で、メインとしていた本体のHDMIを抜き、アダプタの方に差し替えてやると、きちんとフルに表示できた。
これでとりあえず画面がちらつくことはなくなったな。
まあ、USB3.0であったとしてもフルHDで全画面表示で動画とかどうなんだろうね。
しばらく様子を見てみよう。

追記
一晩おいておいたら、フリーズしてた。
再起動しても表示すらできない。
一旦本体の不調HDMIにモニタをつないで再起動してみたが、拡張デスクトップとしても認識しなくなった。
ドライバを5.1にあげてみたが、それもだめ。

この不安定さではメインモニタとして使用するのは無理だな。

追記の追記
結局、タイムマシーンで1週間前にさかのぼりOSを10.12に戻し、ドライバを4.3.1にしてみたところ、安定して表示できるようになった。
これでスリープからも起きれれば問題なしなんだがどうだろうか。

追記の追記の追記
動画とか見る分にはまあ問題ないんだけど、普通にマウスの追随がカクカクしていたり、いまいち使い心地が良くない。
初期のwindows使ってるみたいな感じ。
やはりこのMacをデスクトップマシンとして使うのはもう無理なのかも。


追記の追記の追記の追記(解決編)
なんと、不調の原因はソフトウェアでもMacのハードウェアでも、モニタでもなく、HDMIケーブルだった。
HDMI接続の機器をうちに初めて導入したときから使っていたケーブルが劣化してきたのか、これを別のケーブルに入れ替えたらなんの問題もおこらなくなった。
こりゃ、古いケーブルは全部入れ替えたほうがいいかも。

multi fastaファイルを1遺伝子ごとのファイルに分割するには

multi fastaファイルを1個ずつのfastaに分割したい。
まずはfastaのseq部分の改行をなくす

$ awk -v ORS= '/^>/ { $0 = (NR==1 ? "" : RS) $0 RS } END { printf RS }1' fasta.txt > fasta_awk.txt

次にfastaを2行ごとに分割。多数のファイルが同じ階層にできるので、対象のmultifastaファイルと共に新しいフォルダに入れておく。

$ split -l 2 fasta_awk.txt gene_

これでgene_aaのようなファイルが出力されるので

#!/bin/bash

for file in gene_*; do
  firstline=$(cat "$file" | head -1 | sed -e 's/\//-/g')
  filename=${firstline#>}
  [ -n "$filename" ] && [ ! -e "${filename}.txt" ] &&
  mv "$file" "${filename}.fasta"
done

こういうスクリプトで1行目の>{trasscript_ID}から>を除いたIDを取得して、{transcript_ID}.fastaというファイル名に置き換えてやる。


これを全部まとめて対象ファイルを引数にするスクリプト

#!/bin/sh

fpath=$1
echo "input file: ${fpath}"
faname=`basename $1`
fdir="${fpath%/*}"
fname="${faname%.*}"
fext="${faname#*.}"
opath1="${fdir}/${fname}_1.${fext}"
odir="${fdir}/fastas"
opath="${odir}/gene_"
mkdir ${odir}
awk -v ORS= '/^>/ { $0 = (NR==1 ? "" : RS) $0 RS } END { printf RS }1' ${fpath} > ${opath1}
split -l 2 ${opath1} ${opath}

for file in ${odir}/gene_*; do
  firstline=$(cat "$file" | head -1 | sed -e 's/\//-/g')
  filename=${firstline#>}
  [ -n "$filename" ] && [ ! -e "${filename}.txt" ] &&
  mv "$file" "${odir}/${filename}.${fext}"
done

こんな感じ。

homebrewにエラー再び

==> Upgrading ruby 
==> Downloading https://linuxbrew.bintray.com/bottles/ruby-2.6.1.x86_64_linux.bo
######################################################################## 100.0%
==> Pouring ruby-2.6.1.x86_64_linux.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /home/linuxbrew/.linuxbrew
Could not symlink bin/bundle
Target /home/linuxbrew/.linuxbrew/bin/bundle
is a symlink belonging to ruby. You can unlink it:
  brew unlink ruby

To force the link and overwrite all conflicting files:
  brew link --overwrite ruby

To list all files that would be deleted:
  brew link --overwrite --dry-run ruby

Possible conflicting files are:
/home/linuxbrew/.linuxbrew/bin/bundle -> /home/linuxbrew/.linuxbrew/Cellar/ruby/2.6.0_1/libexec/gembin/bundle
/home/linuxbrew/.linuxbrew/bin/bundler -> /home/linuxbrew/.linuxbrew/Cellar/ruby/2.6.0_1/libexec/gembin/bundler

んー。またrubyか。めんどくさいやっちゃなー。

あと、cufflinksがヘッドノードでは走るのに、計算ノードから起動しようとすると
Illegal installation
というエラーが出て起動しない。
これではtorqueでqsubできないのでめっちゃボトルネックができてしまう。

いろいろ試してみた。

$ brew remove cufflinks

で一旦アンインストールし、ヘッドノードで

$ brew install cufflinks

とインストールし直し→解決せず。
もう一度アンインストールし、計算ノードからインストール→これもだめ。
アンインストールしてから

$ brew cleanup

で不要なリンクファイルなどを一掃してからインストールし直し→解決。

今度からこまったときはbrew cleanupね。

CRISPRで編集がかかったゲノムシークエンスを読むプログラム

CRISPRで編集がかかったと思われるT0サンプルのゲノムをシークエンスすると、変異は2本の染色体にランダムに起こるため、基本的にはヘテロとなってシークエンスデータの波形が2つ分重なって検出されることになるのは先日に書いたとおり。
これをパズルのように分解して再構築して2本の染色体に分離し、それぞれの変異を同定しているわけだが、なんとか自動できないものかと。
というわけでプログラムを作ってみた。

ref.txt:入力としてreference配列のファイル
motif.txt:とりあえず2つのシークエンスが混ざっているのを記述したファイル
例えば
ref.txt
ATGGTGAGCATCAGCCTCTGGGTGG

ベースコールでは
ATGGTGAGCATGACTCTCTGTGG
となっていて、ATGGTGAGCまでは山がずれてなくて、以後2番手の山がかぶっている
ATGGTGAGCCACCGCCTGGGGGT
のように読み取れたとするなら
motif.txtに
ずれ始めから
A/CT/AG/CA/CC/GT/CCTC/GT/GGT/GGG/T
というふうに2つが重なっている部分は/で2つを併記する。

これを
crisgt.py

import sys
import argparse
import re

def get_args():
    parser = argparse.ArgumentParser()

    if sys.stdin.isatty():
        parser.add_argument("file", help="please set reference seq file", type=str)
        parser.add_argument("motif", help="please set search motif file", type=str)

    args = parser.parse_args()

    return(args)

def main():
    args = get_args()

    if hasattr(args, 'file'):
        file = args.file
    if hasattr(args, 'motif'):
        motif = args.motif

    with open(file) as list1:
        w = list1.read().replace('a','A').replace('c','C').replace('g','G').replace('t','T')
        with open(motif) as list2:
            k = list2.read().strip()
            k = k.replace('a','A').replace('c','C').replace('g','G').replace('t','T').replace('N', '[ACGT]').replace('n', '[ACGT]').replace('A/T','[AT]').replace('A/C','[AC]').replace('A/G','[AG]').replace('C/G','[CG]').replace('C/T','[CT]').replace('G/T','[GT]')
            m = re.finditer(k,w)
            for match in m:
               print(match.group(), match.start(), match.end())

if __name__ == '__main__':
    main()
$ python3 crisgt.py ref.txt motif.txt
ATCAGCCTCTGGGT 9 23

というふうに処理すると
あれれ。2つ目の位置が記録されないぞ?

qiita.com

お、これか。pythonのmatchは重複を認めない設定になっているのか。こりゃ以前に作ったプログラムも見直さないといかんな。

            m = re.finditer(k,w)
import regex
            m = regex.finditer(k,w,overlapped=True)

これで解決。

$ python3 crisgtype.py ref.txt motif.txt 
ATCAGCCTCTGGGT 9 23
CAGCCTCTGGGTGG 11 25

これにより、9(10塩基め)から正常な配列に対し、2塩基抜けて12塩基目がずれて来ていることがわかる。

あとは重なった波形から自動的に2つのピークを抽出してきたりしてくれるとすごくいいが、そこはちょっとむずかしいかも。

import sys
import argparse
import re
import regex

def get_args():
    parser = argparse.ArgumentParser()

    if sys.stdin.isatty():
        parser.add_argument("file", help="please set reference seq file", type=str)
        parser.add_argument("seq1", help="please set seq1 file", type=str)
        parser.add_argument("seq2", help="please set seq2 file", type=str)

    args = parser.parse_args()

    return(args)

def main():
    args = get_args()

    if hasattr(args, 'file'):
        file = args.file
    if hasattr(args, 'seq1'):
        seq1 = args.seq1
    if hasattr(args, 'seq2'):
        seq2 = args.seq2

    with open(file) as list1:
        w = list1.read().replace('a','A').replace('c','C').replace('g','G').replace('t','T')
        with open(seq1) as s1:
            sq1 = s1.read().strip()
        with open(seq2) as s2:
            sq2 = s2.read().strip()
        s = "".join('['+i+j+']' for i, j in zip(sq1, sq2))
        m = regex.finditer(s,w,overlapped=True)

        for match in m:
            print(match.group(), match.start(), match.end())

if __name__ == '__main__':
    main()

お、ずいぶんスッキリしてきたぞ。
山が2つ重なりだすところからのベースコールデータと、2番手の山を読み取った配列をそれぞれseq1.txt、seq2.txtとしておいてこれを

$ python3 crisgt.py ref.txt seq1.txt seq2.txt
ATCAGCCTCTGGGT 9 23
CAGCCTCTGGGTGG 11 25

こりゃもう実用レベルじゃね?

CRISPRでknockoutを作ったときにgenotypingをsanger sequenceすることで行う

CRISPRでINDELを誘発したゲノム配列が、実際どういうふうに編集されたかを確認するのにわざわざNGSをつかうのはちょっと大げさなので普通のsangerシークエンサーでシークエンスを読んで確認をしたい。しかし、変異は普通ヘテロに入るので、変異が入った部分からシークエンスの波形がずれて重なり合ってくる。
なので、2つの山を分離して、それぞれのシークエンスを読みほぐす必要がある。まあ、波形を表示するアプリケーションで開いて山をたどりながらエディタでACGTを書いていけばいいだけなんだけど、これが結構面倒くさい。

きっと同じようなことを考えてこれを自動でやっちゃうソフトを作っている人がいるはずだ、と思って検索してみたところ、3つ見つかった。

https://tide.nki.nl

Synthego

CRISP-ID: Detecting CRISPR mediated indels by Sanger sequencing


しかしどれもweb tool。まあいまどきだいたいそんな感じなんだろうけど、ネットに研究データを安直に流すのはどうよ、ってことでローカルでできるアプリがないかと探してみたところ、2つ目のICEについてはオープンソースで公開しているから、ローカルにインストールもできちゃうようだ。それもpythonっぽいので好都合。

ということで

$ git clone git@github.com/synthego-open/ice.git
fatal: repository 'git@github.com/synthego-open/ice.git' does not exist

おや?

$ git clone https://github.com/synthego-open/ice
Cloning into 'ice'...
remote: Enumerating objects: 336, done.
remote: Total 336 (delta 0), reused 0 (delta 0), pack-reused 336
Receiving objects: 100% (336/336), 2.02 MiB | 1.68 MiB/s, done.
Resolving deltas: 100% (203/203), done.

こっちでOKね。

$ cd ice
$ pip3 install -r requirements.txt
Collecting pytest==3.4.2 (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/f1/5c/411ceafef3b5e5486d16f174db18dc26f49e7704dbf59ef488e95db47339/pytest-3.4.2-py2.py3-none-any.whl (189kB)
    100% |████████████████████████████████| 194kB 4.2MB/s 
Requirement already satisfied: biopython>=1.70 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from -r requirements.txt (line 2)) (1.70)
Collecting coverage>=4.4.1 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/fb/af/ce7b0fe063ee0142786ee53ad6197979491ce0785567b6d8be751d2069e8/coverage-4.5.2.tar.gz (384kB)
    100% |████████████████████████████████| 389kB 4.2MB/s 
Collecting pytest-cov==2.5.1 (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/30/7d/7f6a78ae44a1248ee28cc777586c18b28a1df903470e5d34a6e25712b8aa/pytest_cov-2.5.1-py2.py3-none-any.whl
Collecting matplotlib>=2.1.0 (from -r requirements.txt (line 5))
  Downloading https://files.pythonhosted.org/packages/28/6c/addb3560777f454b1d56f0020f89e901eaf68a62593d4795e38ddf24bbd6/matplotlib-3.0.2-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (14.1MB)
    100% |████████████████████████████████| 14.1MB 892kB/s 
Collecting numpy>=1.13.3 (from -r requirements.txt (line 6))
  Downloading https://files.pythonhosted.org/packages/88/b8/569d9c702685b595812fbfd9ee04f240653b7a15feec43cc98be3b34e5f5/numpy-1.16.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (13.9MB)
    100% |████████████████████████████████| 13.9MB 1.5MB/s 
Collecting pandas>=0.20.3 (from -r requirements.txt (line 7))
  Downloading https://files.pythonhosted.org/packages/99/12/bf4c58eea94cea4f91ff931f284146337814fb8546e6eb0b52584446fd52/pandas-0.24.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (16.3MB)
    100% |████████████████████████████████| 16.3MB 732kB/s 
Requirement already satisfied: scipy>=0.19.1 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from -r requirements.txt (line 8)) (0.19.1)
Collecting sklearn>=0.0 (from -r requirements.txt (line 9))
  Downloading https://files.pythonhosted.org/packages/1e/7a/dbb3be0ce9bd5c8b7e3d87328e79063f8b263b2b1bfa4774cb1147bfcd3f/sklearn-0.0.tar.gz
Collecting xlrd>=1.1.0 (from -r requirements.txt (line 10))
  Downloading https://files.pythonhosted.org/packages/b0/16/63576a1a001752e34bf8ea62e367997530dc553b689356b9879339cf45a4/xlrd-1.2.0-py2.py3-none-any.whl (103kB)
    100% |████████████████████████████████| 112kB 10.0MB/s 
Collecting xlsxwriter>=1.0.2 (from -r requirements.txt (line 11))
  Downloading https://files.pythonhosted.org/packages/3d/1b/4caecd4efde1d41ba3bef1a81027032a7a6dff7d5112e1731f232c0addb9/XlsxWriter-1.1.2-py2.py3-none-any.whl (142kB)
    100% |████████████████████████████████| 143kB 370kB/s 
Requirement already satisfied: attrs>=17.2.0 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from pytest==3.4.2->-r requirements.txt (line 1)) (18.2.0)
Requirement already satisfied: py>=1.5.0 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from pytest==3.4.2->-r requirements.txt (line 1)) (1.7.0)
Collecting pluggy<0.7,>=0.5 (from pytest==3.4.2->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/ba/65/ded3bc40bbf8d887f262f150fbe1ae6637765b5c9534bd55690ed2c0b0f7/pluggy-0.6.0-py3-none-any.whl
Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from pytest==3.4.2->-r requirements.txt (line 1)) (28.8.0)
Requirement already satisfied: six>=1.10.0 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from pytest==3.4.2->-r requirements.txt (line 1)) (1.10.0)
Collecting kiwisolver>=1.0.1 (from matplotlib>=2.1.0->-r requirements.txt (line 5))
  Downloading https://files.pythonhosted.org/packages/fb/96/619db9bf08f652790fa9f3c3884a67dc43da4bdaa185a5aa2117eb4651e1/kiwisolver-1.0.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (108kB)
    100% |████████████████████████████████| 112kB 2.4MB/s 
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from matplotlib>=2.1.0->-r requirements.txt (line 5)) (2.2.0)
Requirement already satisfied: cycler>=0.10 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from matplotlib>=2.1.0->-r requirements.txt (line 5)) (0.10.0)
Requirement already satisfied: python-dateutil>=2.1 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from matplotlib>=2.1.0->-r requirements.txt (line 5)) (2.6.1)
Requirement already satisfied: pytz>=2011k in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from pandas>=0.20.3->-r requirements.txt (line 7)) (2017.2)
Collecting scikit-learn (from sklearn>=0.0->-r requirements.txt (line 9))
  Downloading https://files.pythonhosted.org/packages/cb/5f/dfa0a118b8a503e45cd2cf48acb9cf1de8deaf06a3cef1b1c19bd5cbbc45/scikit_learn-0.20.2-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (7.9MB)
    100% |████████████████████████████████| 7.9MB 2.5MB/s 
Installing collected packages: pluggy, pytest, coverage, pytest-cov, kiwisolver, numpy, matplotlib, pandas, scikit-learn, sklearn, xlrd, xlsxwriter
  Found existing installation: pluggy 0.8.1
    Uninstalling pluggy-0.8.1:
      Successfully uninstalled pluggy-0.8.1
  Found existing installation: pytest 4.2.0
    Uninstalling pytest-4.2.0:
      Successfully uninstalled pytest-4.2.0
  Running setup.py install for coverage ... done
  Found existing installation: numpy 1.13.0
    Uninstalling numpy-1.13.0:
      Successfully uninstalled numpy-1.13.0
  Found existing installation: matplotlib 2.0.2
    Uninstalling matplotlib-2.0.2:
      Successfully uninstalled matplotlib-2.0.2
  Running setup.py install for sklearn ... done
Successfully installed coverage-4.5.2 kiwisolver-1.0.1 matplotlib-3.0.2 numpy-1.16.1 pandas-0.24.1 pluggy-0.6.0 pytest-3.4.2 pytest-cov-2.5.1 scikit-learn-0.20.2 sklearn-0.0 xlrd-1.2.0 xlsxwriter-1.1.2

でけた。

使い方は

Running a single ICE analysis:

./ice_analysis_single.py \
	--control ./ice/tests/test_data/good_example_control.ab1  \
	--edited ./ice/tests/test_data/good_example_edited.ab1 \
	--target AACCAGTTGCAGGCGCCCCA \
	--out results/testing \
	--verbose
Running a batch analysis:

./ice_analysis_batch.py \
	--in ./ice/tests/test_data/batch_example.xlsx \
	--out ./results/ \
	--data ./ice/tests/test_data/
	--verbose

だそうな。
やってみる

$ ./ice_analysis_single.py --control ./ice/tests/test_data/good_example_control.ab1 --edited ./ice/tests/test_data/good_example_edited.ab1 --target AACCAGTTGCAGGCGCCCCA --out results/testing --verbose
Synthego ICE (https://synthego.com)
Version: 1.1.1
Base dir: /Users/kkuro/local/bin/ice/results
analyzing 462 number of edit proposals
Shape of coefficient matrix: (462, 228)
------------------------------------------------------
Inference Sequence length: 57
Inference sequence 
Output vector : 4x57 (228)

NNLS input shapes
--------------------------------------------------------
A (228, 462)
b (228,)
R_SQUARED 0.9823262526685657
discord (aln window): 0.14 after cutsite: 0.60

結果は

control                             NNN-NN-NGGGGCATCCTGTGTTCTACCTGGCACCTGTCCCCATAGAAAT
edited                              NNNANNANNGGGCATCCTGTGTTCTACCTGGCACCTGTCCCCATAGAAAT

control                             GAGCGTGAGTGCCCGGGATCTGCTGCGGGGCTGTGCTGGGCTCTTTCTCA
edited                              GAGCGTGAGTGCCCGGGATCTGCTGCGGGGCTGTGCTGGGCTCTTTCTCA

control                             GCCTGGCCCGAAGTTTCCAGATCTGATTGAGCGAGAGAGCAGCAGGACCT
edited                              GCCTGGCCCGAAGTTTCCAGATCTGATTGAGCGAGAGAGCAGCAGGACCT

control                             GCCCCTCTGCTGGGCTCTTACCTTCGCGGCACTCGCCACTGCCCAGCAGC
edited                              GCCCCTCTGCTGGGCTCTTACCTTCGCGGCACTCGCCACTGCCCAGCAGC

control                             AGGTGAGGCCCAACACAACCAGTTGCAGGCGCCCCATGGTGAGCATCAGC
edited                              AGGTGAGGCCCAACACAACCAGTTGCAGGCGCCCC-TGGGGAGAATCACC

control                             CTCTGGGTGGCCCTCCCTCTGGGCCTCGGGTATTTATGGAGCTGGATCCA
edited                              CCCTGGGGGGCCCCCCCCCTGGGGCCCGGGGATTTTTGGGGAGGGAGCCC

control                             AGGTCACATGCTTGTTCATGAGCTCTC-AGGCA-
edited                              AGGGGCCATGTTTTTTTTTAAACCCCCNAGAAAA

こんな感じだね。ターゲットのPAM配列TGGの直前のAがdeleteされていることが検出されているな。
シークエンスデータは

f:id:k-kuro:20190204191845p:plain
シークエンス波形データ
こんな感じだった。
コントロールも波形データでないといかんのかなあ→fasta.txtだとだめだった。むぅ。