Использование GNU parallel¶
Итак, есть задача по запуску счёта для некоторого количества задач.
Чаще всего используется скрипт с циклом:
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
Часто, в ходе работы надо коментировать некторые строки, так как эти задачи уже выполнены. Так же не плохо бы было реализовать эффективное использование всех вычмслительных ядер компьютера.
Давайте я предложу несколько примеров как эти шаги можно эффективно реализовать с GNU parallel:
Сделать N директорий:¶
parallel --gnu mkdir model_{1} ::: {1..6} or export n=6 parallel --gnu mkdir model_{1} ::: $(seq 1 $n)
Генерация скрипта для Pymol¶
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)
Запуск задач по prepacking на восьми ядрах:¶
parallel --gnu -j8 "cd model_{1} ; FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack" ::: $(seq 1 $n)
Можно подавать функции bash на исполнение:¶
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)
Итак весь скрипт можно представить как набор однострочных команд исполняюшихся паралельно:
#!/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)
Awk hacks¶
Способ экстракции MODEL из pdb, RS - record sparator¶
extract_model(){ file=$1 fr=$(($2+1)) awk -v f="$fr" '(NR == f){print "MODEL", $0}' RS="MODEL" $1 | egrep "(^ATOM|^MODEL)" }