import os import numpy from subprocess import Popen, PIPE import pymesh from default_config.global_vars import apbs_bin, pdb2pqr_bin, multivalue_bin import random """ computeAPBS.py: Wrapper function to compute the Poisson Boltzmann electrostatics for a surface using APBS. Pablo Gainza - LPDI STI EPFL 2019 This file is part of MaSIF. Released under an Apache License 2.0 """ def computeAPBS(vertices, pdb_file, tmp_file_base): """ Calls APBS, pdb2pqr, and multivalue and returns the charges per vertex """ fields = tmp_file_base.split("/")[0:-1] directory = "/".join(fields) + "/" filename_base = tmp_file_base.split("/")[-1] pdbname = pdb_file.split("/")[-1] args = [ pdb2pqr_bin, "--ff=parse", "--whitespace", "--noopt", "--apbs-input", pdbname, filename_base, ] p2 = Popen(args, stdout=PIPE, stderr=PIPE, cwd=directory) stdout, stderr = p2.communicate() args = [apbs_bin, filename_base + ".in"] p2 = Popen(args, stdout=PIPE, stderr=PIPE, cwd=directory) stdout, stderr = p2.communicate() vertfile = open(directory + "/" + filename_base + ".csv", "w") for vert in vertices: vertfile.write("{},{},{}\n".format(vert[0], vert[1], vert[2])) vertfile.close() args = [ multivalue_bin, filename_base + ".csv", filename_base + ".dx", filename_base + "_out.csv", ] p2 = Popen(args, stdout=PIPE, stderr=PIPE, cwd=directory) stdout, stderr = p2.communicate() # Read the charge file chargefile = open(tmp_file_base + "_out.csv") charges = numpy.array([0.0] * len(vertices)) for ix, line in enumerate(chargefile.readlines()): charges[ix] = float(line.split(",")[3]) remove_fn = os.path.join(directory, filename_base) os.remove(remove_fn) os.remove(remove_fn+'.csv') os.remove(remove_fn+'.dx') os.remove(remove_fn+'.in') os.remove(remove_fn+'-input.p') os.remove(remove_fn+'_out.csv') return charges