GenomeStudio の拡張を F# で書く


Illumina 社のアレイデータを扱うのであれば GenomeStudio を使うことが多いでしょう。この GenomeStudio には C# スクリプト機能があり,高度な解析を行うのに利用できます。しかしドキュメントが一切ないので, Visual Studio のインテリセンスやオブジェクトブラウザーなどを活用して API を調べながらスクリプトを構築してやる必要がありますが,基本的な使い方は GC Content Polynomial Fit v1.4.6 C# Script for GenomeStudio を見ながら推測できます。

きちんと調べたわけではありませんが, GenomeStudio は .NET 3.5 で, C# スクリプトをメモリー上でコンパイルして実行しています。参照アセンブリーの指定ができるので, F# で DLL を作成して,それを C# から呼び出すというのが簡単でしょう。

必要なものは以下の通りです。

  • GenomeStudio の DLL
  • 自分で作成した DLL
  • DLL を呼び出すスクリプトファイル

以下詳しく見ていきます。

まず GenomeStudio の DLL ですが,これは GenomeStudio をインストールしたフォルダに入っています。

  • AnalyteModelLib.dll
  • ClusterAlgInterface.dll
  • Common.dll
  • FrameworkClassLibrary.dll
  • FrameworkInterfaceLibrary.DLL
  • IGVInterface.dll
  • Table.dll
  • UIUtils.DLL

GenomeStudio の共通 DLL のほかに, Modules フォルダ内にプロジェクトタイプごとの拡張 DLL が入っています。 Genotyping モジュールの場合は以下の DLL を参照します。

  • Modules\BSGT\GenotypingBSM.dll

さらに, GenomeStudio は Windows Forms なので,以下の DLL も参照しましょう。

  • System.Drawing
  • System.Windows.Forms

これらを Visual Studio で参照すれば,インテリセンス上に必要な関数が表示されると思われます。不足する場合は適宜探して追加します。

以上の DLL を参照して関数を定義した独自 DLL を作成し,それを C# スクリプトから呼び出す形にします。上で述べたように, GenomeStudio は .NET 3.5 なので,作成する DLL も .NET 3.5 でビルドします。

C# スクリプトは, Execute ボタンを押せばわかるように,おおむね以下のような形に展開されます。

public class Eval
{
   public object EntryPoint(IFramework framework, string outputFilename)
   {
      object ret = null;

      // user code here

      return ret;
   }
}

最も重要なのは, C# スクリプトを包含するメソッドの第一引数である framework になります。これを F# 側に渡してやる形でロジックを完成させます。たとえば以下のような形式になるでしょう。

GenomeStudioExtension.DoSomething(framework);

上のコードの // user code here の部分にこのコードが来ることになります。必要に応じてパラメーターを追加してユーザーに変更してもらうと良いでしょう。

あとは単純にロジック側の F# を書くだけです。上の C# スクリプトに対応させると以下のような感じになります。

module GenomeStudioExtension

open Illumina.GenomeStudio

[<CompiledName("DoSomething")>]
let doSomething (framework:IFramework) =
   // logic here

作成した DLL は,本来どこに置いても良いのですが,簡単のために Modules 内に配置してもらうと良いかもしれません。

作成した DLL を呼び出すコードを C# スクリプトという形で配布します。 C# スクリプトは以下のファイルからなります。

  • .cs ファイル (User Script): スクリプト本体。
  • .adl ファイル (Additional Methods): 追加メソッド。使わない。
  • .bdl ファイル (GenomeStudio DLLs): GenomeStudio 内の DLL。 GenomeStudio のインストールフォルダからの相対パスで指定。
  • .sdl ファイル (System DLLs): その他の DLL。
  • .usg ファイル (Using): using のリスト。一部は自動で using されている。

拡張子を除いて同じ名前のファイルを作成します。 Load すると,それぞれのファイルの内容が,コントロール内に読み込まれ,あとは Execute ボタンを押せば実行できるという状態になります。

注意すべき点としては, plaint text ではなく, rich text format (RTF) でファイルを作成するということがあります。 F# で plain text を RTF に書き出すには,以下の方法が簡単だと思われます[A]。スクリプトは plain text で作成しておいて,配布時に変換するようにしておけば良いでしょう。

open System.IO
open System.Windows.Forms

// you can choose (path:string) instead of (stream:Stream)
let createRtf (stream:Stream) text =
   use richTextBox = new RichTextBox ()
   richTextBox.AppendText (text)
   richTextBox.SaveFile (stream, RichTextBoxStreamType.RichText)

配布時は, Modules 内の決まった場所に DLL を配置してもらい, .bdl ファイルにその DLL への参照を追加しておき,スクリプトファイル群はユーザーの好きな場所に保存してもらうのが良いのではないでしょうか。

脚注

  1. もっと良い方法があれば教えてください。 []