私は現在、いくつかの遺伝子データを分析し、色付きの Word ドキュメントで出力を生成するスクリプトを作成しています。スクリプトは機能しますが、スクリプト内の 1 つのメソッド、Word 文書を作成するメソッドの記述が不適切です。
ドキュメントを作成するメソッドは、スタンドアロンの HTML ファイルを作成し、「docx」拡張子を付けて保存します。これにより、ドキュメントのさまざまな部分にさまざまなスタイルを与えることができます。
以下は、これを機能させるための最低限のものです。これには、最終ステップの直前に別のメソッドで作成され、ハッシュに格納されるいくつかのサンプル入力データと、必要なメソッドが含まれています。
require 'bio'
def make_hash(input_file)
input_read = Hash.new
biofastafile = Bio::FlatFile.open(Bio::FastaFormat, input_file)
biofastafile.each_entry do |entry|
input_read[entry.definition] = entry.aaseq
end
return input_read
end
def to_doc(hash, output, motif)
output_file = File.new(output, "w")
output_file.puts "<!DOCTYPE html><html><head><style> .id{font-weight: bold;} .signalp{color:#000099; font-weight: bold;} .motif{color:#FF3300; font-weight: bold;} h3 {word-wrap: break-word;} p {word-wrap: break-word; font-family:Courier New, Courier, Mono;}</style></head><body>"
hash.each do |id, seq|
sequence = seq.to_s.gsub("\[\"", "").gsub("\"\]", "")
id.scan(/(\w+)(.*)/) do |id_start, id_end|
output_file.puts "<p><span class=\"id\"> >#{id_start}</span><span>#{id_end}</span><br>"
output_file.puts "<span class=\"signalp\">"
sequence.scan(/(\w+)-(\w+)/) do |signalp, seq_end|
output_file.puts signalp + "</span>" + seq_end.gsub(/#{motif}/, '<span class="motif">\0</span>')
output_file.puts "</p>"
end
end
end
output_file.puts "</body></html>"
output_file.close
end
hash = make_hash("./sample.txt")
to_doc = to_doc(hash, "output.docx", "WL|KK|RR|KR|R..R|R....R"
これはサンプルデータです。実際には、種からの遺伝データを分析する場合、これは何十万ものシーケンスで構成されている可能性があります。
>isotig00001_f4_14 - Signal P Cleavage Site => 11:12
MMHLLCIVLLL-KWWLLL
>isotig00001_f4_15 - Signal P Cleavage Site => 10:11
MHLLCIVLLL-KWWLLL
>isotig00003_f6_8 - Signal P Cleavage Site => 11:12
MMHLLCIVLLL-KWWLLL
>isotig00003_f6_9 - Signal P Cleavage Site => 10:11
MHLLCIVLLL-KWWLLL
>isotig00004_f6_8 - Signal P Cleavage Site => 11:12
MMHLLCIVLLL-KWWLLL
>isotig00004_f6_9 - Signal P Cleavage Site => 10:11
MHLLCIVLLL-KWWLLL
>isotig00009_f2_3 - Signal P Cleavage Site => 22:23
MLKCFSIIMGLILLLEIGGGCA-IYFYRAQIQAQFQKSLTDVTITDYRENADFQDLIDALQSGLSCCGVNSYEDWDNNIYFNCSGPANNPEALWCAFLLLYTGSSKRSSQHPVRLWSSFPRTTKYFPHKDLHHWLCGYVYNVD
>isotig00009_f3_9 - Signal P Cleavage Site => 16:17
MKTGIIIFISTVVVLP-ITLKPCGVPFSCCIPDQASGVANTQCGYGVRSPEQQNTFHTKIYTTGCADMFTMWINRYLYYIAGIAGVIVLVELFGFCFAHSLINDIKRQKARWAHR
>isotig00009_f6_13 - Signal P Cleavage Site => 11:12
MMHLLCIVLLL-KWWLLL
>isotig00009_f6_14 - Signal P Cleavage Site => 10:11
MHLLCIVLLL-KWWLLL
各読み取りは、seq id (a で始まる行>
) とシーケンスの 2 つの部分で構成されます。これは分割され、make_hash
メソッド内のハッシュに格納されます。この例:
>isotig00001_f4_14 - Signal P Cleavage Site => 11:12
MMHLLCIVLLL-KWWLLL
以下で構成されています。
>isotig00001_f4_14 (the first part of the id - class="id")
Signal P Cleavage Site => 11:12 (the second part of the id - normal writing)
(new line)
MMHLLCIVLLL (first part of the sequence - class="signalp")
KW WL LL (the second part of the sequence - the motif KW will be class="motif")
HTML では、以下が生成されます。
<p>
<span class="id"> >isotig00001_f4_14</span><span>Signal P Cleavage Site => 11:12</span>
<br>
<span class="signalp">MMHLLCIVLL</span><span>KW</span><span class="motif">KW</span><span>LL</span>
to_doc
基本的には、SLIM/HAML/NOKOGIRI/ERB などの適切な HTML テンプレート スクリプトを使用してメソッドを書き換えたいと思います。私はこれを成し遂げようとしました。
何らかの理由で、ループ内のループが機能せず、これらの変数を格納するグローバル変数の作成も機能しませんでした。
上記のスクリプトは機能します。サンプル データを「sample.txt」として保存し、スクリプトを実行するだけです。
どんな助けにも非常に感謝しています。