0

目的:给定一个 PDB 文件,打印出在三级蛋白质结构中形成二硫键的所有半胱氨酸残基对。许可证:GNU GPL 编写者:Eric Miller

#!/usr/bin/env python
import math

def getDistance((x1,y1,z1),(x2,y2,z2)):
   d = math.sqrt(pow((x1-x2),2)+pow((y1-y2),2)+pow((z1-z2),2));
   return round(d,3);

def prettyPrint(dsBonds):
   print "Residue 1\tResidue 2\tDistance";
   for (r1,r2,d) in dsBonds:
   print " {0}\t\t {1}\t\t {2}".format(r1,r2,d);

def main():
   pdbFile = open('2v5t.pdb','r');
   maxBondDist = 2.5;

   isCysLine = lambda line: (line[0:4] == "ATOM" and line[13:15] == "SG");
   cysLines = [line for line in pdbFile if isCysLine(line)];
   pdbFile.close();

   getCoords = lambda line:(float(line[31:38]),
      float(line[39:46]),float(line[47:54]));
   cysCoords = map(getCoords, cysLines);
   dsBonds = [];

   for i in range(len(cysCoords)-1):
      for j in range(i+1,len(cysCoords)):
         dist = getDistance(cysCoords[i],cysCoords[j]);
         residue1 = int(cysLines[i][23:27]);
         residue2 = int(cysLines[j][23:27]);
         if (dist < maxBondDist):
            dsBonds.append((residue1,residue2,dist));

   prettyPrint(dsBonds);

if __name__ == "__main__":
   main()

当我尝试运行这个脚本时,我遇到了缩进问题。我的工作目录中有 2v5t.pdb(运行上述脚本所需)。有什么解决办法吗?

4

3 回答 3

2

对我来说,“prettyPrint”和“ main ”中的缩进被破坏了。也不需要使用';'。试试这个:

#!/usr/bin/env python
import math

# Input: Two 3D points of the form (x,y,z).
# Output: Euclidean distance between the points.
def getDistance((x1, y1, z1), (x2, y2, z2)):
   d = math.sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2) + pow((z1 - z2), 2))
   return round(d, 3)

# Purpose: Prints a list of 3-tuples (r1,r2,d). R1 and r2 are
# residue numbers, and d is the distance between their respective
# gamma sulfur atoms.
def prettyPrint(dsBonds):
   print "Residue 1\tResidue 2\tDistance"
   for r1, r2, d in dsBonds:
       print " {0}\t\t {1}\t\t {2}".format(r1, r2, d)

# Purpose: Find all pairs of cysteine residues whose gamma sulfur atoms
# are within maxBondDist of each other.
def main():
   pdbFile = open('2v5t.pdb','r')
   #Max distance to consider a disulfide bond.
   maxBondDist = 2.5

   # Anonymous function to check if a line from the PDB file is a gamma
   # sulfur atom from a cysteine residue.
   isCysLine = lambda line: (line[0:4] == "ATOM" and line[13:15] == "SG")
   cysLines = [line for line in pdbFile if isCysLine(line)]
   pdbFile.close()

   # Anonymous function to get (x,y,z) coordinates in angstroms for
   # the location of a cysteine residue's gamma sulfur atom.
   getCoords = lambda line:(float(line[31:38]),
                            float(line[39:46]), float(line[47:54]))
   cysCoords = map(getCoords, cysLines)
   # Make a list of all residue pairs classified as disulfide bonds.
   dsBonds = []

   for i in range(len(cysCoords)-1):
      for j in range(i+1, len(cysCoords)):
         dist = getDistance(cysCoords[i], cysCoords[j])
         residue1 = int(cysLines[i][23:27])
         residue2 = int(cysLines[j][23:27])
         if dist < maxBondDist:
            dsBonds.append((residue1,residue2,dist))

   prettyPrint(dsBonds)

if __name__ == "__main__":
    main()
于 2013-04-03T10:14:21.390 回答
0

这:

if __name__ == "__main__":
main()

应该:

if __name__ == "__main__":
    main()

此外,python 解释器将为您提供有关 IndentationError的信息,直到行。我强烈建议阅读提供的错误消息,因为开发人员编写它们是有原因的。

于 2013-04-03T10:14:09.587 回答
0

你没有说错误被标记在哪里,但是:

if __name__ == "__main__":
main()

应该:

if __name__ == "__main__":
   main()
于 2013-04-03T10:15:44.130 回答