Bash
Version 7 (Andrey Golovin, 08.11.2014 00:30) → Version 8/9 (Andrey Golovin, 08.11.2014 00:31)
{{toc}} {toc}
h1. Использование GNU parallel
Итак, есть задача по запуску счёта для некоторого количества задач.
Чаще всего используется скрипт с циклом:
<pre>
for i in $(seq 0 6);do
# mkdir model_${i}
## remove OXT and H1-H2, rename H3 to H in original autodock pdb
echo "save model_${i}/pep.pdb, all, $i"
cat flex_short.pdb model_${i}/pep.pdb > model_${i}/compl.pdb
cd model_${i}
FlexPepDocking.linuxgccrelease -s compl.pdb -flexpep_prepack -ex1 -ex2aro \
-peptide_chain A -receptor_chain H >& log.prepack
FlexPepDocking.linuxgccrelease -s compl_0001.pdb -receptor_chain H -peptide_chain A \
-out:file:silent decoys.silent -out:file:silent_struct_type binary \
-pep_refine -ex1 -ex2aro -use_input_sc -nstruct 300 >& log.run &
cd ..
done
</pre>
Часто, в ходе работы надо коментировать некторые строки, так как эти задачи уже выполнены. Так же не плохо бы было реализовать эффективное использование всех вычмслительных ядер компьютера.
Давайте я предложу несколько примеров как эти шаги можно эффективно реализовать с GNU parallel:
h5. Сделать N директорий:
<pre>
parallel --gnu mkdir model_{1} ::: {1..6}
or
export n=6
parallel --gnu mkdir model_{1} ::: $(seq 1 $n)
</pre>
h5. Генерация скрипта для Pymol
<pre>
parallel --gnu echo "save model_{1}/pep.pdb, all, {1}" ::: $(seq 1 $n) > run.pml
</pre>
h5. Склеить файлы:
<pre>
parallel --gnu cat flex_short.pdb model_${1}/pep.pdb > model_${1}/compl.pdb ::: $(seq 1 $n)
</pre>
h5. Запуск задач по prepacking на восьми ядрах:
<pre>
parallel --gnu -j8 "cd model_{1} ; FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack" ::: $(seq 1 $n)
</pre>
h5. Можно подавать функции bash на исполнение:
<pre>
export SHELL=$(type -p bash)
prepack() {
cd model_${1}
FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack
}
n=9
export -f prepack
parallel -j6 prepack ::: $(seq 1 $n)
</pre>
Итак весь скрипт можно представить как набор однострочных команд исполняюшихся паралельно:
<pre>
#!/bin/bash
export SHELL=$(type -p bash)
prepack() {
cd model_${1}
FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack
}
refine() {
cd model_${1}
FlexPepDocking.linuxgccrelease @../flags.refine -overwrite >& log.refine
}
export -f prepack refine
n=9
parallel --gnu mkdir model_{1} ::: $(seq 1 $n)
parallel --gnu echo "save model_{1}/pep.pdb, all, {1}" ::: $(seq 1 $n) > run.pml
parallel --gnu cat flex_short.pdb model_{1}/pep.pdb > model_{1}/compl.pdb ::: $(seq 1 $n)
parallel --gnu -j6 prepack ::: $(seq 1 $n)
parallel --gnu -j6 refine ::: $(seq 1 $n)
</pre>
h1. Awk hacks
h2. Способ экстракции MODEL из pdb, RS - record sparator
<pre>
extract_model(){
file=$1
fr=$(($2+1))
awk -v f="$fr" '(NR == f){print "MODEL", $0}' RS="MODEL" $1 | egrep "(^ATOM|^MODEL)"
}
</pre>
h1. Использование GNU parallel
Итак, есть задача по запуску счёта для некоторого количества задач.
Чаще всего используется скрипт с циклом:
<pre>
for i in $(seq 0 6);do
# mkdir model_${i}
## remove OXT and H1-H2, rename H3 to H in original autodock pdb
echo "save model_${i}/pep.pdb, all, $i"
cat flex_short.pdb model_${i}/pep.pdb > model_${i}/compl.pdb
cd model_${i}
FlexPepDocking.linuxgccrelease -s compl.pdb -flexpep_prepack -ex1 -ex2aro \
-peptide_chain A -receptor_chain H >& log.prepack
FlexPepDocking.linuxgccrelease -s compl_0001.pdb -receptor_chain H -peptide_chain A \
-out:file:silent decoys.silent -out:file:silent_struct_type binary \
-pep_refine -ex1 -ex2aro -use_input_sc -nstruct 300 >& log.run &
cd ..
done
</pre>
Часто, в ходе работы надо коментировать некторые строки, так как эти задачи уже выполнены. Так же не плохо бы было реализовать эффективное использование всех вычмслительных ядер компьютера.
Давайте я предложу несколько примеров как эти шаги можно эффективно реализовать с GNU parallel:
h5. Сделать N директорий:
<pre>
parallel --gnu mkdir model_{1} ::: {1..6}
or
export n=6
parallel --gnu mkdir model_{1} ::: $(seq 1 $n)
</pre>
h5. Генерация скрипта для Pymol
<pre>
parallel --gnu echo "save model_{1}/pep.pdb, all, {1}" ::: $(seq 1 $n) > run.pml
</pre>
h5. Склеить файлы:
<pre>
parallel --gnu cat flex_short.pdb model_${1}/pep.pdb > model_${1}/compl.pdb ::: $(seq 1 $n)
</pre>
h5. Запуск задач по prepacking на восьми ядрах:
<pre>
parallel --gnu -j8 "cd model_{1} ; FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack" ::: $(seq 1 $n)
</pre>
h5. Можно подавать функции bash на исполнение:
<pre>
export SHELL=$(type -p bash)
prepack() {
cd model_${1}
FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack
}
n=9
export -f prepack
parallel -j6 prepack ::: $(seq 1 $n)
</pre>
Итак весь скрипт можно представить как набор однострочных команд исполняюшихся паралельно:
<pre>
#!/bin/bash
export SHELL=$(type -p bash)
prepack() {
cd model_${1}
FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack
}
refine() {
cd model_${1}
FlexPepDocking.linuxgccrelease @../flags.refine -overwrite >& log.refine
}
export -f prepack refine
n=9
parallel --gnu mkdir model_{1} ::: $(seq 1 $n)
parallel --gnu echo "save model_{1}/pep.pdb, all, {1}" ::: $(seq 1 $n) > run.pml
parallel --gnu cat flex_short.pdb model_{1}/pep.pdb > model_{1}/compl.pdb ::: $(seq 1 $n)
parallel --gnu -j6 prepack ::: $(seq 1 $n)
parallel --gnu -j6 refine ::: $(seq 1 $n)
</pre>
h1. Awk hacks
h2. Способ экстракции MODEL из pdb, RS - record sparator
<pre>
extract_model(){
file=$1
fr=$(($2+1))
awk -v f="$fr" '(NR == f){print "MODEL", $0}' RS="MODEL" $1 | egrep "(^ATOM|^MODEL)"
}
</pre>