Bash

Version 8 (Andrey Golovin, 08.11.2014 00:31)

1 8 Andrey Golovin
{{toc}}
2 7 Andrey Golovin
3 1 Andrey Golovin
h1. Использование GNU parallel
4 1 Andrey Golovin
5 1 Andrey Golovin
Итак, есть задача по запуску счёта для некоторого количества задач.
6 1 Andrey Golovin
Чаще всего используется скрипт с циклом:
7 1 Andrey Golovin
<pre>
8 1 Andrey Golovin
for i in $(seq 0 6);do
9 1 Andrey Golovin
#    mkdir model_${i}
10 1 Andrey Golovin
##    remove OXT and H1-H2, rename H3 to H in original autodock pdb
11 1 Andrey Golovin
    echo "save model_${i}/pep.pdb, all, $i"
12 1 Andrey Golovin
    cat flex_short.pdb   model_${i}/pep.pdb > model_${i}/compl.pdb
13 1 Andrey Golovin
 cd model_${i}     
14 1 Andrey Golovin
     FlexPepDocking.linuxgccrelease -s compl.pdb  -flexpep_prepack  -ex1 -ex2aro \
15 1 Andrey Golovin
     -peptide_chain A -receptor_chain H >& log.prepack 
16 1 Andrey Golovin
     FlexPepDocking.linuxgccrelease -s compl_0001.pdb -receptor_chain H  -peptide_chain A \
17 1 Andrey Golovin
     -out:file:silent decoys.silent -out:file:silent_struct_type binary \
18 1 Andrey Golovin
     -pep_refine -ex1 -ex2aro -use_input_sc  -nstruct 300  >& log.run &
19 1 Andrey Golovin
 cd ..    
20 1 Andrey Golovin
done
21 1 Andrey Golovin
</pre>
22 1 Andrey Golovin
23 1 Andrey Golovin
Часто, в ходе работы надо коментировать некторые строки, так как эти задачи уже выполнены. Так же не плохо бы было реализовать эффективное использование всех вычмслительных ядер компьютера.
24 1 Andrey Golovin
25 1 Andrey Golovin
Давайте я предложу несколько примеров как эти шаги можно эффективно реализовать с GNU parallel:
26 1 Andrey Golovin
27 1 Andrey Golovin
28 1 Andrey Golovin
h5. Сделать N директорий:
29 2 Andrey Golovin
30 1 Andrey Golovin
<pre>
31 1 Andrey Golovin
parallel --gnu mkdir model_{1} ::: {1..6}
32 1 Andrey Golovin
or
33 1 Andrey Golovin
export n=6 
34 1 Andrey Golovin
parallel --gnu mkdir model_{1} ::: $(seq 1 $n)
35 2 Andrey Golovin
</pre>
36 2 Andrey Golovin
37 2 Andrey Golovin
h5. Генерация скрипта для Pymol
38 2 Andrey Golovin
39 2 Andrey Golovin
<pre>
40 2 Andrey Golovin
parallel --gnu  echo "save model_{1}/pep.pdb, all, {1}"  ::: $(seq 1 $n) > run.pml
41 2 Andrey Golovin
</pre>
42 2 Andrey Golovin
43 2 Andrey Golovin
h5. Склеить файлы:
44 2 Andrey Golovin
45 2 Andrey Golovin
<pre>
46 2 Andrey Golovin
parallel --gnu cat flex_short.pdb model_${1}/pep.pdb > model_${1}/compl.pdb ::: $(seq 1 $n)
47 2 Andrey Golovin
</pre>
48 2 Andrey Golovin
49 2 Andrey Golovin
h5. Запуск задач по prepacking на восьми ядрах:
50 2 Andrey Golovin
51 2 Andrey Golovin
<pre>
52 2 Andrey Golovin
parallel --gnu -j8 "cd model_{1} ; FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack" ::: $(seq 1 $n)
53 2 Andrey Golovin
</pre>
54 2 Andrey Golovin
55 2 Andrey Golovin
h5. Можно подавать функции bash на исполнение:
56 2 Andrey Golovin
57 2 Andrey Golovin
<pre>
58 4 Andrey Golovin
59 2 Andrey Golovin
export SHELL=$(type -p bash)
60 2 Andrey Golovin
61 2 Andrey Golovin
prepack() {  
62 2 Andrey Golovin
      cd model_${1}
63 2 Andrey Golovin
      FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack 
64 2 Andrey Golovin
}
65 2 Andrey Golovin
66 2 Andrey Golovin
n=9
67 2 Andrey Golovin
68 3 Andrey Golovin
export -f prepack 
69 1 Andrey Golovin
70 4 Andrey Golovin
parallel -j6   prepack ::: $(seq 1 $n)
71 4 Andrey Golovin
</pre>
72 4 Andrey Golovin
73 4 Andrey Golovin
Итак весь скрипт можно представить как набор однострочных команд исполняюшихся паралельно:
74 4 Andrey Golovin
75 4 Andrey Golovin
<pre>
76 4 Andrey Golovin
#!/bin/bash
77 4 Andrey Golovin
export SHELL=$(type -p bash)
78 4 Andrey Golovin
79 4 Andrey Golovin
prepack() {  
80 4 Andrey Golovin
cd model_${1}
81 4 Andrey Golovin
      FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack 
82 4 Andrey Golovin
}
83 4 Andrey Golovin
refine() {  
84 4 Andrey Golovin
cd model_${1}
85 4 Andrey Golovin
      FlexPepDocking.linuxgccrelease @../flags.refine -overwrite >& log.refine 
86 4 Andrey Golovin
}
87 4 Andrey Golovin
88 4 Andrey Golovin
export -f prepack refine
89 4 Andrey Golovin
90 4 Andrey Golovin
n=9
91 4 Andrey Golovin
92 4 Andrey Golovin
parallel --gnu mkdir model_{1} ::: $(seq 1 $n)
93 4 Andrey Golovin
94 4 Andrey Golovin
parallel --gnu  echo "save model_{1}/pep.pdb, all, {1}"  ::: $(seq 1 $n) > run.pml
95 4 Andrey Golovin
96 4 Andrey Golovin
parallel --gnu  cat flex_short.pdb model_{1}/pep.pdb > model_{1}/compl.pdb ::: $(seq 1 $n)
97 4 Andrey Golovin
98 6 Andrey Golovin
parallel --gnu -j6 prepack ::: $(seq 1 $n)
99 4 Andrey Golovin
100 6 Andrey Golovin
parallel --gnu -j6 refine ::: $(seq 1 $n)
101 4 Andrey Golovin
102 1 Andrey Golovin
</pre>
103 7 Andrey Golovin
104 7 Andrey Golovin
105 7 Andrey Golovin
h1.  Awk hacks
106 7 Andrey Golovin
107 1 Andrey Golovin
h2.  Способ экстракции MODEL из pdb, RS - record sparator
108 8 Andrey Golovin
<pre>
109 7 Andrey Golovin
extract_model(){
110 7 Andrey Golovin
file=$1
111 7 Andrey Golovin
fr=$(($2+1))
112 7 Andrey Golovin
awk -v f="$fr" '(NR == f){print "MODEL", $0}' RS="MODEL" $1 | egrep "(^ATOM|^MODEL)"
113 1 Andrey Golovin
}
114 8 Andrey Golovin
</pre>