CellFishing.jlを試してみる(2nd)

Published: Fri 14 December 2018
By oec

In Julia.

Githubのmasterブランチが修正されたとのことなので、 前回と同様にコマンドラインインターフェースと対話環境でCellFishing.jlにトライしてみました。

コマンドラインインターフェースでPlass2018.dge.loomをCellFishin.jlする

先ずは公式のREADMEと同様に Plass2018.dge.loomをもう一度CellFishing.jlします。

$ ./bin/cellfishing build Plass2018.dge.loom
Build a search database from Plass2018.dge.loom.
  Loading data ―――――――――――― 14 seconds, 149 milliseconds
  Selecting features ―――――― 966 milliseconds
  Creating a database ―――――  ** On entry to SLASCLS parameter number  4 had an illegal value
  ...

  Writing the database ―――― 777 milliseconds
The serialized database is in Plass2018.dge.loom.cf.

同じサンプルを使うのでOn entry to SLASCLS parameter number 4 had an illegal valueは残りますが気にせず続けます。

$ ./bin/cellfishing search Plass2018.dge.loom.cf Plass2018.dge.loom >neighbors.tsv
Search Plass2018.dge.loom.cf for 10 neighbors.
  Loading the database ―――― 399 milliseconds
  Loading query data ―――――― 13 seconds, 957 milliseconds
  Searching the database ―― 3 seconds, 15 milliseconds
  Writing neighbors ――――――― 34 milliseconds

$ less -S -N neighbors.tsv 

1 all_sgete_4GU75:AAAATTACTTGGCx  all_sgete_4GU75:AAAATTACTTGGCx  all_sgete_4GU75:AAAAGGTTTACTTx  all_sgete_4GU75:AAAAGACTAGTGTx  
      2 all_sgete_4GU75:AAAAGGTTTACTTx  all_sgete_4GU75:AAAATTACTTGGCx  all_sgete_4GU75:AAAAGGTTTACTTx  all_sgete_4GU75:AAAAGACTAGTGTx  
      3 all_sgete_4GU75:AAAAGACTAGTGTx  all_sgete_4GU75:AAAATTACTTGGCx  all_sgete_4GU75:AAAAGGTTTACTTx  all_sgete_4GU75:AAAAGACTAGTGTx  
      4 all_sgete_4GU75:AAACCCTAACAGCx  all_sgete_4GU75:AAAATTACTTGGCx  all_sgete_4GU75:AAAAGGTTTACTTx  all_sgete_4GU75:AAAAGACTAGTGTx  
      5 all_sgete_4GU75:AAACATGATGCGAx  all_sgete_4GU75:AAAATTACTTGGCx  all_sgete_4GU75:AAAAGGTTTACTTx  all_sgete_4GU75:AAAAGACTAGTGTx  
      6 all_sgete_4GU75:AAAGACCACAGTGx  all_sgete_4GU75:AAAATTACTTGGCx  all_sgete_4GU75:AAAAGGTTTACTTx  all_sgete_4GU75:AAAAGACTAGTGTx  

Error発生せず。それらしいneighbors.tsvが出力されました。

テスト用のloomファイルを作り、コマンドラインインターフェースで試す

loompyで作ったテスト用のファイルを同様にコマンドラインインターフェースで試してみます。

先ずはPythonのnumpy.random.randを使って配列を作り、loomとして書き出します。

import numpy as np
import loompy
filename = "test.loom"
matrix = np.random.rand(10, 10)  # 0.0以上、1.0未満、10x10の配列の乱数
row_attrs = { "SomeRowAttr": np.arange(10) }
col_attrs = { "SomeColAttr": np.arange(10) }
loompy.create(filename, matrix, row_attrs, col_attrs)

このファイルをJupyter notebookで見てみると、

ds = loompy.connect(filename)
ds

          SomeColAttr   0                   1                     2                 3                   4                   5                   6                     7                 8                    9
SomeRowAttr                                          
0       0.2396876204321453  0.7873450487005871  0.37780645241374833 0.8671433367989253  0.6134126218299916  0.6257857211933744  0.2351991261037153  0.05687990825893263 0.9422973537466136  0.4850026172656482
1       0.5144405258272866  0.9985185543089808  0.05208261292199956 0.5206197195865041  0.49523984875891747 0.7786804192427867  0.5406144475897734  0.46217822694288824 0.8023488955224481  0.36528632965640706
2       0.9419281325841554  0.33141216680528085 0.7249619131535856  0.4822207679952296  0.3740075932444845  0.0028364580008067852   0.04292462230648897 0.6168198766038926  0.31808567902378126 0.05013101551316135
3       0.27300380376870936 0.3684618743139705  0.9133050710627907  0.47127482205237126 0.20493957564658427 0.3219545803644297  0.2265000220532043  0.46393198401263536 0.8891700592418956  0.7842988293468391
4       0.03956714615110801 0.08015128296788943 0.7469051695357061  0.625519235272402   0.9960447662950902  0.20891999703998143 0.09333740092671794 0.08245896197053637 0.5141247696313814  0.5232399512979921
5       0.7561411405454064  0.6671049178984818  0.22151345475650208 0.30925906316109375 0.7425441989162589  0.6181628507666441  0.4422587152654789  0.6619072825701765  0.5221547626875674  0.9088153607121365
6 ....

それらしいファイルが出力された気がします。

では、Plass2018.dge.loomと同様にこのファイルをCellFishing.jlします。

$ ./bin/cellfishing build test.loom
Build a search database from test.loom.
  Loading data ―――――――――――― HDF5-DIAG: Error detected in HDF5 (1.10.4) thread 0:
  #000: H5O.c line 120 in H5Oopen(): unable to open object
    major: Object header
...
ERROR: LoadError: Error opening object ///row_attrs/Gene

numpy.random.rand()で作ったテスト用のデータはLoadErrorとなりました。 データのフォーマットが違いそうな気がします。

対話環境でCSVを読み込む

一回目と同様の10x10のcsvファイルを使って 対話環境でCellFishing.jlを試します。

julia> using CellFishing
julia> using CSV
julia> data = CSV.read("test.csv", delim=',')
10×10 DataFrames.DataFrame
│ Row │ A        │ B        │ C        │ D        │ E         │ F        │ G        │ H         │ I         │ J         │
│     │ Float64⍰ │ Float64⍰ │ Float64⍰ │ Float64⍰ │ Float64⍰  │ Float64⍰ │ Float64⍰ │ Float64⍰  │ Float64⍰  │ Float64⍰  │
├─────┼──────────┼──────────┼──────────┼──────────┼───────────┼──────────┼──────────┼───────────┼───────────┼───────────┤
│ 1   │ 0.66881  │ 0.684548 │ 0.543321 │ 0.395865 │ 0.580571  │ 0.181782 │ 0.463489 │ 0.114986  │ 0.45077   │ 0.273915  │
│ 2   │ 0.628929 │ 0.655457 │ 0.568615 │ 0.510255 │ 0.772066  │ 0.824264 │ 0.59687  │ 0.628348  │ 0.418789  │ 0.983976  │
│ 3   │ 0.723614 │ 0.418452 │ 0.249667 │ 0.139474 │ 0.334926  │ 0.376858 │ 0.192299 │ 0.0670013 │ 0.93907   │ 0.140252  │
│ 4   │ 0.963905 │ 0.147077 │ 0.231303 │ 0.70938  │ 0.497994  │ 0.30241  │ 0.314685 │ 0.0725281 │ 0.0401966 │ 0.569654  │
│ 5   │ 0.319602 │ 0.112272 │ 0.982957 │ 0.7491   │ 0.830083  │ 0.393083 │ 0.687088 │ 0.343796  │ 0.0315826 │ 0.323356  │
│ 6   │ 0.42922  │ 0.166654 │ 0.162221 │ 0.864021 │ 0.015853  │ 0.20722  │ 0.687266 │ 0.44684   │ 0.0539362 │ 0.172383  │
│ 7   │ 0.379178 │ 0.154495 │ 0.485539 │ 0.824225 │ 0.429369  │ 0.674071 │ 0.184348 │ 0.647457  │ 0.0908948 │ 0.729107  │
│ 8   │ 0.816236 │ 0.825931 │ 0.801143 │ 0.211432 │ 0.671175  │ 0.678665 │ 0.141858 │ 0.713245  │ 0.0540037 │ 0.0674242 │
│ 9   │ 0.737016 │ 0.995226 │ 0.847743 │ 0.914302 │ 0.484938  │ 0.467824 │ 0.271309 │ 0.58344   │ 0.244783  │ 0.280495  │
│ 10  │ 0.707984 │ 0.715595 │ 0.524505 │ 0.453797 │ 0.0954121 │ 0.942033 │ 0.5295   │ 0.228389  │ 0.551513  │ 0.747924  │

julia> cellnames = string.(names(data))
julia> featurenames = ["1","2", "3","4","5","6","7","8","9","10"]
julia> counts = Matrix(data[:,:])
10×10 Array{Union{Missing, Float64},2}:
 0.66881   0.684548  0.543321  0.395865  0.580571   0.181782  0.463489  0.114986   0.45077    0.273915 
 0.628929  0.655457  0.568615  0.510255  0.772066   0.824264  0.59687   0.628348   0.418789   0.983976 
 ...

julia> counts = Matrix{Float64}(counts)
10×10 Array{Float64,2}:
 0.66881   0.684548  0.543321  0.395865  0.580571   0.181782  0.463489  0.114986   0.45077    0.273915 
 0.628929  0.655457  0.568615  0.510255  0.772066   0.824264  0.59687   0.628348   0.418789   0.983976 
 ...

julia> features = CellFishing.selectfeatures(counts, featurenames)
CellFishing.Features(<#features=10,#selected=1>)

julia> database = CellFishing.CellIndex(counts, features, metadata=cellnames)
ERROR: ArgumentError: invalid n_dims

CellFishing.CellIndex()実行時に、前回試した時に発生したMethodErrorは無くなりましたが、 でArgumentErrorはまだ残ります。。。

コマンドラインインターフェースでも対話型実行環境でも、自作のサンプルデータ(loom or csv)を読み込んでの CellFishing.jlは失敗していますが、なんとなく読み込んだファイルのフォーマットの不具合がErrorの原因かも、、とい気はしています。 CellFishin.jlを実際に利用する際は各種データをloomに変換して使うことになると思うので、 そのあたりの設定等の情報をもう少しよく読んでまたトライしてみたいと思います。

links

social