Source code for ample.modelling.rosetta_scorer
import os
[docs]class RosettaScoreData(object):
def __init__(self):
self.score = None
self.rms = None
self.maxsub = None
self.description = None
self.model = None
[docs]class RosettaScoreParser(object):
def __init__(self, directory):
self.directory = directory
self.avgScore = None
self.topScore = None
self.avgRms = None
self.topRms = None
self.avgMaxsub = None
self.topMaxsub = None
self.data = []
score_file = os.path.join(directory, "score.fsc")
if not os.path.isfile(score_file):
raise RuntimeError("Cannot find ROSETTA score file: {0}".format(score_file))
self.parseFile(score_file)
[docs] def parse_file(self, score_file):
idxScore = None
idxRms = None
idxMaxsub = None
idxDesc = None
for i, line in enumerate(open(score_file, 'r')):
line = line.strip()
# Read header
if i == 0:
for j, f in enumerate(line.split()):
if f == "score":
idxScore = j
elif f == "rms":
idxRms = j
elif f == "maxsub":
idxMaxsub = j
elif f == "description":
idxDesc = j
if idxScore is None or idxRms is None or idxMaxsub is None or idxDesc is None:
raise RuntimeError("Missing header field from score file: {0}".format(score_file))
continue
# End read header
if not line: # ignore blank lines - not sure why they are there...
continue
d = RosettaScoreData()
fields = line.split()
d.score = float(fields[idxScore])
d.rms = float(fields[idxRms])
d.maxsub = float(fields[idxMaxsub])
d.description = fields[idxDesc]
# pdb = fields[31]
d.model = os.path.join(self.directory, d.description + ".pdb")
self.data.append(d)
avg = 0
self.topScore = self.data[0].score
for d in self.data:
avg += d.score
if d.score < self.topScore:
self.topScore = d.score
self.avgScore = avg / len(self.data)
avg = 0
self.topRms = self.data[0].rms
for d in self.data:
avg += d.rms
if d.rms < self.topRms:
self.topRms = d.rms
self.avgRms = avg / len(self.data)
avg = 0
self.topMaxsub = self.data[0].maxsub
for d in self.data:
avg += d.maxsub
if d.maxsub > self.topMaxsub:
self.topMaxsub = d.maxsub
self.avgMaxsub = avg / len(self.data)
return
[docs] def maxsub_sorted(self, reverse=True):
return sorted(self.data, key=lambda data: data.maxsub, reverse=reverse)
[docs] def rms_sorted(self, reverse=True):
return sorted(self.data, key=lambda data: data.rms, reverse=reverse)
[docs] def rms(self, name):
for d in self.data:
if d.description == name:
return d.rms
[docs] def maxsub(self, name):
for d in self.data:
if d.description == name:
return d.maxsub
def __str__(self):
s = "Results for: {0}\n".format(self.name)
s += "Top score : {0}\n".format(self.topScore)
s += "Avg score : {0}\n".format(self.avgScore)
s += "Top rms : {0}\n".format(self.topRms)
s += "Avg rms : {0}\n".format(self.avgRms)
s += "Top maxsub: {0}\n".format(self.topMaxsub)
s += "Avg maxsub: {0}\n".format(self.avgMaxsub)
return s