mecobalamin’s diary

人間万事塞翁が馬

https://help.hatenablog.com/entry/developer-option

RNA-seqその3、trimmomatic

分割したFastqファイルのクリーニングをする
mecobalamin.hatenablog.com

trimmomaticについて
Trimmomatic | FASTQ クリーニングツール

trimmomaticを実行するとファイルへのアクセスがとても多い
windowsのタスクマネージャーを見ると
解析するデータが大きいのもあって
ディスクが100%近くでアクティブになる
HDDには良くない感じに見える



まず下準備としてRAMディスクを用意する
これは壊れても交換しやすいディスクがあれば別にいらないと思う

ubuntuには標準でRAMディスクがあるが、
wslのtmpfsはエミュレーションしているだけらしい
Does tmpfs really work? : bashonubuntuonwindows

なのでwindowsで動くRAMディスクをインストールする
「ImDisk Virtual Disk Driver」システムメモリ上に仮想ディスクを作成できるツール - 窓の杜
インストールしたけど場所がわからない。。。。
コントロールパネルで表示を小さいアイコンにすると
ImDisk Virtual Disk Driverのアイコンが見つかるので
ショートカットをデスクトップに作っておく

PCを再起動後にImDiskを実行する
wslを起動した状態だとマウントできないみたい

10GのRAMディスクを作成
ドライブ名はR
f:id:mecobalamin:20190225165253p:plain
f:id:mecobalamin:20190225165312p:plain

wslのターミナルを起動して
dfコマンドでRAMディスクにマウントできていることを確認する
マウント先はImDiskで設定したR

$ df
Filesystem     1K-blocks      Used Available Use% Mounted on
R:              10485756   1432936   9052820  14% /mnt/r

ImDiskでボリュームを削除してもマウントが残ってたりする
RAMディスクを作ったり消したりしたらPCの再起動をしとくのが良さげ

RAMディスクを作ってマウントできてなければ手動でマウントする
それとImDiskで削除する前にアンマウントする
それぞれのコマンドはこれ

$ sudo mount -t drvfs r: /mnt/r
$ sudo umount /mnt/r

作ったRAMディスクをテンポラリディスクとして使用する



ここから本題

trimmomaticの処理は以下の流れで行う

  1. copy files to tmp directory
  2. fastqc
  3. trimmomatic
  4. fastq-stats
  5. remove unnecessary string
  6. prinseq-lite

trimmomaticの前後でやっているのはシークエンスデータの統計データの取得
クリーニングの前後でデータの比較を行うための処理をやっている、
そうなんだけど見てもまだよくわからない。。。。
とりあえず使ったスクリプトだけ掲載

アダプターが取り除かれた配列が
"trim_"のついたディレクトリに保存される

#!/bin/bash

cd $HOME/usr/scripts/

w_dir="$HOME/usr/data"
scripts_dir="$HOME/usr/scripts"
tmp_dir="/mnt/r/tmp"

list_name="list_sra.txt"
list_dir="${scripts_dir}"
list_raw=$(cat ${list_dir}/${list_name} | wc -l)
list_file=$(cat ${list_dir}/${list_name} | sed 's/\.sra//g' )

postfix="fastq"
quality="15"

adapter="$HOME/miniconda3/share/trimmomatic-0.38-1/adapters/TruSeq3-PE.fa"

for i in ${list_file}
  do
    echo "analyze ${i}"
    trim_dir="${w_dir}/trim_${i}/trim"
    stats_dir="${w_dir}/trim_${i}/stats"
    fastqc_dir="${w_dir}/trim_${i}/fastqc"
    prinseq_dir="${w_dir}/trim_${i}/ps"

    mkdir -p ${trim_dir}
    mkdir -p ${stats_dir}
    mkdir -p ${fastqc_dir}
    mkdir -p ${prinseq_dir}

    mkdir -p ${tmp_dir}

    in_dir="${w_dir}/raw/div_${i}"
    div_list="${in_dir}/list_div_${i}.txt"

    infile_1=$(grep _1_ ${div_list})
    for j in ${infile_1}
      do
        infile_2=${j/_1_/_2_}
        logfile=${j/_1_/_}

        echo "copy files to tmp directory"
        cp ${in_dir}/${j} ${tmp_dir}/
        cp ${in_dir}/${infile_2} ${tmp_dir}/

        echo "fastqc began"
        for k in ${j} ${infile_2}
          do
            fastqc --nogroup -o ${fastqc_dir} ${tmp_dir}/${k}
          done
        echo "finished."

        echo "trimmomatic began"

        trimmomatic \
          PE \
          ${tmp_dir}/${j} \
          ${tmp_dir}/${infile_2} \
          ${tmp_dir}/trim${quality}_${j}.${postfix} \
          ${tmp_dir}/trim${quality}_${j}.${postfix}-unique.out \
          ${tmp_dir}/trim${quality}_${infile_2}.${postfix} \
          ${tmp_dir}/trim${quality}_${infile_2}.${postfix}-unique.out \
          ILLUMINACLIP:${adapter}:2:30:10 \
          LEADING:3 \
          TRAILING:3 \
          SLIDINGWINDOW:4:${quality} MINLEN:36 \
          &> ${trim_dir}/trim_${logfile}.log

        echo "finished."

        echo "fastq-stats began"
        for k in ${j} ${infile_2}
          do
            fastq-stats \
              ${tmp_dir}/${k} >\
              ${stats_dir}/raw_${k}.stats
            fastq-stats \
              ${tmp_dir}/trim${quality}_${k}.${postfix} >\
              ${stats_dir}/trim_${k}.stats
          done
        echo "finished."

        rm ${tmp_dir}/${j}
        rm ${tmp_dir}/${infile_2}

        echo "remove unnecessary string"
        for k in ${j} ${infile_2}
          do
            #sed -i".bak" '/length/s/^\+.*/+/' ${tmp_dir}/trim${quality}_${k}.${postfix}
            #mv ${tmp_dir}/trim${quality}_${k}.${postfix} ${tmp_dir}/rename_${k}.${postfix}
            #mv ${tmp_dir}/trim${quality}_${k}.${postfix}.bak ${tmp_dir}/trim${quality}_${k}.${postfix}
            cat ${tmp_dir}/trim${quality}_${k}.${postfix} | sed '/length/s/^\+.*/+/' \
            > ${tmp_dir}/rename_${k}.${postfix}
          done
        echo "finished."

        mv ${tmp_dir}/trim${quality}_* ${trim_dir}/

        echo "prinseq-lite began"

        prinseq-lite.pl \
          -fastq ${tmp_dir}/rename_${j}.${postfix} \
          -fastq2 ${tmp_dir}/rename_${infile_2}.${postfix} \
          -out_format 3 \
          -derep 24 \
          -log ${prinseq_dir}/${logfile}.log \
          -out_good ${tmp_dir}/ps_${logfile}_gd \
          -out_bad ${tmp_dir}/ps_${logfile}_bd \
          -trim_tail_right 5 \
          -min_len 30

        mv ${tmp_dir}/rename_* ${trim_dir}
        mv ${tmp_dir}/ps_${logfile}_* ${prinseq_dir}

      done

    rm -r ${tmp_dir}

  done

27 Feb. 2019修正
adapterのファイル名をSEからPEに修正した

14 April 2019追記
ファイルの容量がRAMディスクよりも大きいと
エラーを吐かずにスクリプトが止まる

今回は10GBでは足りず、16GBまで増やす必要があった

RAMディスクの容量を変えたあとに
PCの再起動をせずにスクリプトを実行したところ
ディスクをうまく認識できなかったみたいで
一瞬ファイルの書き込みがあって
実行中のまま反応がなくなった

その後が変な状況になってしまった
crtl + cでスクリプトは止められず
tmuxを終了してもjobが残っていたようだ
ターミナルを終了してPCの再起動をしても
ubuntuは生きていたようで強制終了するかの選択肢がでてきた

強制終了を選んでも再起動のまましばらく先に進まず。。。
結局電源ボタン長押しで再起動

一応PCは再起動してほかも問題なく動いてくれているけれど
次回もそうだとは限らないので
RAMディスク周りをいじるときは
その前後でPCとターミナルの再起動をしておく

そもそもRAMディスクを使うのは
データを入れているHDDの保護のためなので、
テンポラリに使えるディスクがあればいい
USBメモリとか?
気になるのは書き込み速度

あとで試す

追記ここまで

30 May 2019追記
余分な文字列を削除するコマンドのところで
やり直してみたらエラーが出る
sedのテンポラリファイルを移動か削除のときにパーミッションエラーが出てる
コメントアウトして別の方法でやってみたらうまくできたみたいなのでそっちも残す
追記ここまで