functions.sh 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. #!/usr/bin/env bash
  2. function get_next_step() {
  3. # get system name from path
  4. system=$(basename "${job}")
  5. # get prev_step and prev_step_num from parsing coor filenames
  6. last_step_coorname=$(find ${job} -name "*.coor" -type f | sort -V | tail -n 1)
  7. if [[ "${last_step_coorname}" == "" ]]; then
  8. prev_step=""
  9. else
  10. filename=$(basename ${last_step_coorname})
  11. filename=${filename%%.*}
  12. prev_step=${filename##${system}_}
  13. prev_step=${prev_step%%_*}
  14. fi
  15. case "${prev_step}" in
  16. "4-sim")
  17. this_step="4-sim"
  18. prev_step_num=${filename##*[^0-9]}
  19. final_step_num=$((${prev_step_num}+${step_size}))
  20. ;;
  21. "3-heat")
  22. this_step="4-sim"
  23. prev_step_num=0
  24. final_step_num=${step_size}
  25. ;;
  26. "2-min")
  27. this_step="3-heat"
  28. prev_step_num=0
  29. final_step_num=0
  30. ;;
  31. "1-min")
  32. this_step="2-min"
  33. prev_step_num=0
  34. final_step_num=0
  35. ;;
  36. "")
  37. if [[ -f "${job}/${system}.pdb" && -f "${job}/${system}.psf" ]]; then
  38. this_step="1-min"
  39. prev_step_num=0
  40. final_step_num=0
  41. else
  42. echo "No requisite pdb or psf files, exiting..."
  43. exit 1
  44. fi
  45. ;;
  46. esac
  47. }
  48. function create_conf() {
  49. step_size=$((${final_step_num} - ${prev_step_num}))
  50. echo "Creating conf file using job:"${job}" system:"${system}" this_step:"$this_step" prev_step:$prev_step_num final_step:$final_step_num"
  51. #######################################################################################
  52. ## CREATE NAMD CONFIGURATION FILES ##
  53. #######################################################################################
  54. case "${this_step}" in
  55. ##########################
  56. ## MINIMIZATION 1 ##
  57. ##########################
  58. "1-min")
  59. conf="${job}/${system}_${this_step}.conf"
  60. out="${job}/${system}_${this_step}.out"
  61. echo "structure ${system}.psf" > ${conf}
  62. echo "coordinates ${system}.pdb" >> ${conf}
  63. echo "paraTypeCharmm on" >> ${conf}
  64. for ff in "${ffs[@]}"; do
  65. echo "parameters "${ff}"" >> ${conf}
  66. done
  67. echo "temperature 0" >> ${conf}
  68. echo "" >> ${conf}
  69. echo "# Force-Field Parameters" >> ${conf}
  70. echo "exclude scaled1-4" >> ${conf}
  71. echo "1-4scaling 1.0" >> ${conf}
  72. echo "cutoff 12." >> ${conf}
  73. echo "switching on" >> ${conf}
  74. echo "switchdist 10." >> ${conf}
  75. echo "pairlistdist 14" >> ${conf}
  76. echo "" >> ${conf}
  77. echo "# Integrator Parameters" >> ${conf}
  78. echo "timestep 1.0 ;# 1fs/step" >> ${conf}
  79. echo "nonbondedFreq 1" >> ${conf}
  80. echo "fullElectFrequency 2" >> ${conf}
  81. echo "stepspercycle 10" >> ${conf}
  82. echo "" >> ${conf}
  83. echo "# Output" >> ${conf}
  84. echo "outputName ${system}_${this_step}" >> ${conf}
  85. echo "outputEnergies 100" >> ${conf}
  86. echo "outputPressure 100" >> ${conf}
  87. # Minimize
  88. echo "minimize 15000" >> ${conf}
  89. ;;
  90. ##########################
  91. ## MINIMIZATION 2 ##
  92. ##########################
  93. "2-min")
  94. conf="${job}/${system}_${this_step}.conf"
  95. out="${job}/${system}_${this_step}.out"
  96. # Solvate and ionize
  97. solv_ion
  98. # create pcell.txt
  99. calc_pcell_min2
  100. # Source pcell.txt for PBC values
  101. source "${job}/${system}_${this_step}_pcell.txt"
  102. # Begin writing NAMD conf file
  103. echo "structure ${system}_solv_ion.psf" > ${conf}
  104. echo "coordinates ${system}_solv_ion.pdb" >> ${conf}
  105. echo "paraTypeCharmm on" >> ${conf}
  106. for ff in "${ffs[@]}"; do
  107. echo "parameters "${ff}"" >> ${conf}
  108. done
  109. echo "temperature 0" >> ${conf}
  110. echo "" >> ${conf}
  111. echo "# Periodic boundary conditions" >> ${conf}
  112. echo "wrapWater on" >> ${conf}
  113. echo "wrapAll on" >> ${conf}
  114. echo "cellOrigin $CORX $CORY $CORZ" >> ${conf}
  115. echo "cellBasisVector1 $CBVX 0.0 0.0" >> ${conf}
  116. echo "cellBasisVector2 0.0 $CBVY 0.0" >> ${conf}
  117. echo "cellBasisVector3 0.0 0.0 $CBVZ" >> ${conf}
  118. echo "# Force-Field Parameters" >> ${conf}
  119. echo "exclude scaled1-4" >> ${conf}
  120. echo "1-4scaling 1.0" >> ${conf}
  121. echo "cutoff 12." >> ${conf}
  122. echo "switching on" >> ${conf}
  123. echo "switchdist 10." >> ${conf}
  124. echo "pairlistdist 14" >> ${conf}
  125. echo "" >> ${conf}
  126. echo "# Integrator Parameters" >> ${conf}
  127. echo "timestep 2.0 ;# 2fs/step" >> ${conf}
  128. echo "rigidBonds all ;# needed for 2fs steps" >> ${conf}
  129. echo "nonbondedFreq 1" >> ${conf}
  130. echo "fullElectFrequency 2" >> ${conf}
  131. echo "stepspercycle 10" >> ${conf}
  132. echo "" >> ${conf}
  133. echo "# Output" >> ${conf}
  134. echo "outputName ${system}_${this_step}" >> ${conf}
  135. echo "outputEnergies 10000" >> ${conf}
  136. echo "outputPressure 10000" >> ${conf}
  137. # Minimize
  138. echo "minimize 15000" >> ${conf}
  139. ;;
  140. ##########################
  141. ## EQUILIBRATION ##
  142. ##########################
  143. "3-heat")
  144. conf="${job}/${system}_${this_step}.conf"
  145. out="${job}/${system}_${this_step}.out"
  146. # create pcell.txt
  147. calc_pcell_heat
  148. # Source pcell.txt for PBC values
  149. source "${job}/${system}_${this_step}_pcell.txt"
  150. echo "structure ${system}_solv_ion.psf" > ${conf}
  151. echo "coordinates ${system}_solv_ion.pdb" >> ${conf}
  152. echo "bincoordinates ${system}_2-min.coor" >> ${conf}
  153. echo "#extendedSystem ${system}_2-min.xsc" >> ${conf}
  154. echo "cellOrigin $CORX $CORY $CORZ" >> ${conf}
  155. echo "cellBasisVector1 $CBVX 0.0 0.0" >> ${conf}
  156. echo "cellBasisVector2 0.0 $CBVY 0.0" >> ${conf}
  157. echo "cellBasisVector3 0.0 0.0 $CBVZ" >> ${conf}
  158. echo "" >> ${conf}
  159. echo "firsttimestep ${prev_step_num}" >> ${conf}
  160. echo "" >> ${conf}
  161. echo "paraTypeCharmm on" >> ${conf}
  162. for ff in "${ffs[@]}"; do
  163. echo "parameters "${ff}"" >> ${conf}
  164. done
  165. echo "temperature 0" >> ${conf}
  166. echo "#margin 2" >> ${conf}
  167. echo "" >> ${conf}
  168. echo "# Periodic boundary conditions" >> ${conf}
  169. echo "wrapWater on" >> ${conf}
  170. echo "wrapAll on" >> ${conf}
  171. echo "" >> ${conf}
  172. echo "# Full Electrostatics" >> ${conf}
  173. echo "PME on" >> ${conf}
  174. echo "PMEGridSpacing 1.0" >> ${conf}
  175. echo "# Force-Field Parameters" >> ${conf}
  176. echo "exclude scaled1-4" >> ${conf}
  177. echo "1-4scaling 1.0" >> ${conf}
  178. echo "cutoff 12." >> ${conf}
  179. echo "switching on" >> ${conf}
  180. echo "switchdist 10." >> ${conf}
  181. echo "pairlistdist 14" >> ${conf}
  182. echo "" >> ${conf}
  183. echo "# Integrator Parameters" >> ${conf}
  184. echo "timestep 2.0 ;# 2fs/step" >> ${conf}
  185. echo "rigidBonds all ;# needed for 2fs steps" >> ${conf}
  186. echo "nonbondedFreq 1" >> ${conf}
  187. echo "fullElectFrequency 2 " >> ${conf}
  188. echo "stepspercycle 10" >> ${conf}
  189. echo "" >> ${conf}
  190. echo "# Output" >> ${conf}
  191. echo "outputName ${system}_${this_step}" >> ${conf}
  192. echo "outputEnergies 1000" >> ${conf}
  193. echo "outputPressure 1000" >> ${conf}
  194. echo "dcdfreq 1000" >> ${conf}
  195. echo "" >> ${conf}
  196. echo "# Constant Temperature Control" >> ${conf}
  197. echo "langevin on ;# do langevin dynamics" >> ${conf}
  198. echo "langevinDamping 0.5 ;# damping coefficient (gamma) of 0.5/ps" >> ${conf}
  199. echo "langevinTemp 310" >> ${conf}
  200. echo "langevinHydrogen no ;# don't couple langevin bath to hydrogens" >> ${conf}
  201. echo "" >> ${conf}
  202. echo "# Constant Pressure Control (variable volume)" >> ${conf}
  203. echo "useGroupPressure yes ;# needed for 2fs steps" >> ${conf}
  204. echo "useFlexibleCell yes ;# no for water box, yes for membrane" >> ${conf}
  205. echo "useConstantRatio yes ;# no for water box, yes for membrane" >> ${conf}
  206. echo "langevinPiston on" >> ${conf}
  207. echo "langevinPistonTarget 1.01325 ;# in bar -> 1 atm" >> ${conf}
  208. echo "langevinPistonPeriod 100." >> ${conf}
  209. echo "langevinPistonDecay 50." >> ${conf}
  210. echo "langevinPistonTemp 310" >> ${conf}
  211. echo "" >> ${conf}
  212. # Equilibration loop
  213. echo "set freq 100" >> ${conf}
  214. echo 'for {set i 10} {$i <= 310} {incr i 10} {' >> ${conf}
  215. echo 'reinitvels $i' >> ${conf}
  216. echo 'langevinTemp $i' >> ${conf}
  217. echo 'run $freq' >> ${conf}
  218. echo '}' >> ${conf}
  219. # Stabilize
  220. echo 'run 10000' >> ${conf}
  221. ;;
  222. ##########################
  223. ## SIMULATION ##
  224. ##########################
  225. "4-sim")
  226. conf="${job}/${system}_${this_step}_${final_step_num}.conf"
  227. out="${job}/${system}_${this_step}_${final_step_num}.out"
  228. # Begin writing NAMD conf file
  229. echo "structure ${system}_solv_ion.psf" > ${conf}
  230. echo "coordinates ${system}_solv_ion.pdb" >> ${conf}
  231. # if this is the first timestep, begin with heat
  232. if [[ ${prev_step_num} == 0 ]]; then
  233. echo "temperature 310" >> ${conf}
  234. echo "bincoordinates ${system}_3-heat.coor" >> ${conf}
  235. # create pcell.txt
  236. calc_pcell_heat
  237. source "${job}/${system}_${this_step}_pcell.txt"
  238. echo "cellOrigin $CORX $CORY $CORZ" >> ${conf}
  239. echo "cellBasisVector1 $CBVX 0.0 0.0" >> ${conf}
  240. echo "cellBasisVector2 0.0 $CBVY 0.0" >> ${conf}
  241. echo "cellBasisVector3 0.0 0.0 $CBVZ" >> ${conf}
  242. # else resume
  243. else
  244. echo "binvelocities ${system}_${this_step}_${prev_step_num}.vel" >> ${conf}
  245. echo "bincoordinates ${system}_${this_step}_${prev_step_num}.coor" >> ${conf}
  246. echo "extendedSystem ${system}_${this_step}_${prev_step_num}.xsc" >> ${conf}
  247. fi
  248. echo "" >> ${conf}
  249. echo "firsttimestep ${prev_step_num}" >> ${conf}
  250. echo "" >> ${conf}
  251. echo "#margin 2" >> ${conf}
  252. echo "paraTypeCharmm on" >> ${conf}
  253. for ff in "${ffs[@]}"; do
  254. echo "parameters "${ff}"" >> ${conf}
  255. done
  256. echo "" >> ${conf}
  257. echo "# Periodic boundary conditions" >> ${conf}
  258. echo "wrapWater on" >> ${conf}
  259. echo "wrapAll on" >> ${conf}
  260. echo "" >> ${conf}
  261. echo "# Full Electrostatics" >> ${conf}
  262. echo "PME on" >> ${conf}
  263. echo "PMEGridSpacing 1.0" >> ${conf}
  264. echo "" >> ${conf}
  265. echo "# Force-Field Parameters" >> ${conf}
  266. echo "exclude scaled1-4" >> ${conf}
  267. echo "1-4scaling 1.0" >> ${conf}
  268. echo "cutoff 12." >> ${conf}
  269. echo "switching on" >> ${conf}
  270. echo "switchdist 10." >> ${conf}
  271. echo "pairlistdist 14" >> ${conf}
  272. echo "" >> ${conf}
  273. echo "# Integrator Parameters" >> ${conf}
  274. echo "timestep 2.0 ;# 2fs/step" >> ${conf}
  275. echo "rigidBonds all ;# needed for 2fs steps" >> ${conf}
  276. echo "nonbondedFreq 1" >> ${conf}
  277. echo "fullElectFrequency 2 " >> ${conf}
  278. echo "stepspercycle 10" >> ${conf}
  279. echo "" >> ${conf}
  280. echo "# Output" >> ${conf}
  281. echo "outputName ${system}_${this_step}_${final_step_num}" >> ${conf}
  282. echo "outputEnergies 10000" >> ${conf}
  283. echo "outputPressure 10000" >> ${conf}
  284. echo "dcdfreq 10000" >> ${conf}
  285. echo "" >> ${conf}
  286. echo "# Constant Temperature Control" >> ${conf}
  287. echo "langevin on ;# do langevin dynamics" >> ${conf}
  288. echo "langevinDamping 0.5 ;# damping coefficient (gamma) of 0.5/ps" >> ${conf}
  289. echo "langevinTemp 310" >> ${conf}
  290. echo "langevinHydrogen no ;# don't couple langevin bath to hydrogens" >> ${conf}
  291. echo "" >> ${conf}
  292. echo "# Constant Pressure Control (variable volume)" >> ${conf}
  293. echo "useGroupPressure yes ;# needed for 2fs steps" >> ${conf}
  294. echo "useFlexibleCell yes ;# no for water box, yes for membrane" >> ${conf}
  295. echo "useConstantRatio yes ;# no for water box, yes for membrane" >> ${conf}
  296. echo "langevinPiston on" >> ${conf}
  297. echo "langevinPistonTarget 1.01325 ;# in bar -> 1 atm" >> ${conf}
  298. echo "langevinPistonPeriod 100." >> ${conf}
  299. echo "langevinPistonDecay 50." >> ${conf}
  300. echo "langevinPistonTemp 310" >> ${conf}
  301. echo "" >> ${conf}
  302. echo "run ${step_size}" >> ${conf}
  303. ;;
  304. esac
  305. }
  306. function solv_ion() {
  307. # Create temporary VMD script to solvate, ionize, and generate PBC measurements
  308. # Load molecule
  309. echo "mol load psf [glob ${job}/${system}.psf] namdbin [glob ${job}/${system}_${prev_step}.coor]" > ${job}/temp_solv_ion.tcl
  310. echo "set all [atomselect top all]" >> ${job}/temp_solv_ion.tcl
  311. echo "\$all writepdb ${job}/${system}_${prev_step}.pdb" >> ${job}/temp_solv_ion.tcl
  312. # Solvate
  313. echo "package require solvate" >> ${job}/temp_solv_ion.tcl
  314. echo "solvate ${job}/${system}.psf ${job}/${system}_${prev_step}.pdb -o ${job}/${system}_solv -s WT -x 13 -y 13 -z 13 +x 13 +y 13 +z 13 -b 2.4" >> ${job}/temp_solv_ion.tcl
  315. # Ionize
  316. echo "package require autoionize" >> ${job}/temp_solv_ion.tcl
  317. echo "autoionize -psf ${job}/${system}_solv.psf -pdb ${job}/${system}_solv.pdb -o ${job}/${system}_solv_ion -sc 0.15" >> ${job}/temp_solv_ion.tcl
  318. # Run VMD
  319. vmd -dispdev text -eofexit < "${job}/temp_solv_ion.tcl"
  320. rm ${job}/temp_solv_ion.tcl
  321. }
  322. function calc_pcell_min2() {
  323. # Load molecule
  324. echo "mol load psf [glob ${job}/${system}_solv_ion.psf] pdb [glob ${job}/${system}_solv_ion.pdb]" > ${job}/temp_build_box.tcl
  325. # Get PBC box measurements from VMD and output to pcell.txt
  326. echo "set fileId [open ${job}/${system}_${this_step}_pcell.txt "w"]" >> ${job}/temp_build_box.tcl
  327. echo "set all [atomselect top "not lipid"]" >> ${job}/temp_build_box.tcl
  328. echo 'set minmax [measure minmax $all]' >> ${job}/temp_build_box.tcl
  329. echo 'set vec [vecsub [lindex $minmax 1] [lindex $minmax 0]]' >> ${job}/temp_build_box.tcl
  330. echo 'puts $fileId "#!/usr/bin/env bash"' >> ${job}/temp_build_box.tcl
  331. echo 'puts $fileId "CBVX=[lindex $vec 0]"' >> ${job}/temp_build_box.tcl
  332. echo 'puts $fileId "CBVY=[lindex $vec 1]"' >> ${job}/temp_build_box.tcl
  333. echo 'puts $fileId "CBVZ=[lindex $vec 2]"' >> ${job}/temp_build_box.tcl
  334. echo 'set center [measure center $all]' >> ${job}/temp_build_box.tcl
  335. echo 'puts $fileId "CORX=[lindex $center 0]"' >> ${job}/temp_build_box.tcl
  336. echo 'puts $fileId "CORY=[lindex $center 1]"' >> ${job}/temp_build_box.tcl
  337. echo 'puts $fileId "CORZ=[lindex $center 2]"' >> ${job}/temp_build_box.tcl
  338. echo 'close $fileId' >> ${job}/temp_build_box.tcl
  339. # Run VMD
  340. vmd -dispdev text -eofexit < "${job}/temp_build_box.tcl"
  341. rm "${job}/temp_build_box.tcl"
  342. }
  343. function calc_pcell_heat() {
  344. # Load molecule
  345. echo "mol load psf [glob ${job}/${system}_solv_ion.psf] namdbin [glob ${job}/${system}_${prev_step}.coor]" > ${job}/temp_build_box.tcl
  346. # Get PBC box measurements from VMD and output to pcell.txt
  347. echo "set fileId [open ${job}/${system}_${this_step}_pcell.txt "w"]" >> ${job}/temp_build_box.tcl
  348. echo "set all [atomselect top all]" >> ${job}/temp_build_box.tcl
  349. echo 'set minmax [measure minmax $all]' >> ${job}/temp_build_box.tcl
  350. echo 'set vec [vecsub [lindex $minmax 1] [lindex $minmax 0]]' >> ${job}/temp_build_box.tcl
  351. echo 'puts $fileId "#!/usr/bin/env bash"' >> ${job}/temp_build_box.tcl
  352. echo 'puts $fileId "CBVX=[lindex $vec 0]"' >> ${job}/temp_build_box.tcl
  353. echo 'puts $fileId "CBVY=[lindex $vec 1]"' >> ${job}/temp_build_box.tcl
  354. echo 'puts $fileId "CBVZ=[lindex $vec 2]"' >> ${job}/temp_build_box.tcl
  355. echo 'set center [measure center $all]' >> ${job}/temp_build_box.tcl
  356. echo 'puts $fileId "CORX=[lindex $center 0]"' >> ${job}/temp_build_box.tcl
  357. echo 'puts $fileId "CORY=[lindex $center 1]"' >> ${job}/temp_build_box.tcl
  358. echo 'puts $fileId "CORZ=[lindex $center 2]"' >> ${job}/temp_build_box.tcl
  359. echo 'close $fileId' >> ${job}/temp_build_box.tcl
  360. # Run VMD
  361. vmd -dispdev text -eofexit < "${job}/temp_build_box.tcl"
  362. rm "${job}/temp_build_box.tcl"
  363. }
  364. function calc_pcell_sim() {
  365. # Load molecule
  366. echo "mol load psf [glob ${job}/${system}_solv_ion.psf] namdbin [glob ${job}/${system}_${prev_step}_${prev_step_num}.coor]" > ${job}/temp_build_box.tcl
  367. # Get PBC box measurements from VMD and output to pcell.txt
  368. echo "set fileId [open ${job}/${system}_${this_step}_${prev_step_num}_pcell.txt "w"]" >> ${job}/temp_build_box.tcl
  369. echo "set all [atomselect top all]" >> ${job}/temp_build_box.tcl
  370. echo 'set minmax [measure minmax $all]' >> ${job}/temp_build_box.tcl
  371. echo 'set vec [vecsub [lindex $minmax 1] [lindex $minmax 0]]' >> ${job}/temp_build_box.tcl
  372. echo 'puts $fileId "#!/usr/bin/env bash"' >> ${job}/temp_build_box.tcl
  373. echo 'puts $fileId "CBVX=[lindex $vec 0]"' >> ${job}/temp_build_box.tcl
  374. echo 'puts $fileId "CBVY=[lindex $vec 1]"' >> ${job}/temp_build_box.tcl
  375. echo 'puts $fileId "CBVZ=[lindex $vec 2]"' >> ${job}/temp_build_box.tcl
  376. echo 'set center [measure center $all]' >> ${job}/temp_build_box.tcl
  377. echo 'puts $fileId "CORX=[lindex $center 0]"' >> ${job}/temp_build_box.tcl
  378. echo 'puts $fileId "CORY=[lindex $center 1]"' >> ${job}/temp_build_box.tcl
  379. echo 'puts $fileId "CORZ=[lindex $center 2]"' >> ${job}/temp_build_box.tcl
  380. echo 'close $fileId' >> ${job}/temp_build_box.tcl
  381. # Run VMD
  382. vmd -dispdev text -eofexit < "${job}/temp_build_box.tcl"
  383. rm "${job}/temp_build_box.tcl"
  384. }
  385. function copy_ffs() {
  386. ffs=()
  387. for ff in ../0-forcefields/*; do
  388. if [[ -f "${ff}" ]]; then
  389. # strip path
  390. ff_name=${ff##*/}
  391. # copy ff and append to ffs array
  392. cp -f "${ff}" "${job}/${ff_name}"
  393. ffs+=(${ff##*/})
  394. fi
  395. done
  396. }
  397. function backup() {
  398. if [[ -f "${out}" ]]; then
  399. mv "${out}" "${out}.bak"
  400. fi
  401. }