IMP logo
IMP Reference Guide  develop.63b38c487d,2024/12/22
The Integrative Modeling Platform
isd/Analysis.py
1 #!/usr/bin/env python
2 
3 import matplotlib.pyplot
4 import numpy as np
5 from IMP.isd.History import History
6 
7 
8 class Analysis:
9 
10  """Class that produces analysis-related output, and is able to parse the
11  output of a file produced by the Statistics class.
12  """
13 
14  def create_entry(self, h, lineno, el):
15  """adds a new entry to the hierarchy by parsing a title entry"""
16  if lineno == len(self.correspondences):
17  self.correspondences.append([])
18  entryno, cat, name = el.split(':')
19  entryno = int(entryno) - 1
20  if len(self.correspondences[lineno]) == entryno:
21  self.correspondences[lineno].append((cat, name))
22  else:
23  self.correspondences[lineno][entryno] = (cat, name)
24  h.create_entry(cat, name)
25 
26  def add_data(self, h, lineno, colno, data):
27  """adds data point to hierarchy"""
28  cat, name = self.correspondences[lineno][colno]
29  if data.isdigit():
30  data = int(data)
31  else:
32  try:
33  data = float(data)
34  except ValueError:
35  pass
36  h.add_data(cat, name, data)
37 
38  def read_variables(self, statfile):
39  """reads a *_stats.txt file and returns variables present in it"""
40  h = History(statfile)
41  # read title and setup history
42  self.correspondences = []
43  for line in open(statfile):
44  if line.startswith('*'):
45  continue
46  tokens = line.split()
47  if not tokens[0][1].isdigit():
48  continue
49  lineno = int(tokens[0][1:]) - 1
50  if line.startswith('#'):
51  for el in tokens[1:]:
52  self.create_entry(h, lineno, el)
53  continue
54  break
55  return self.correspondences
56 
57  def read_AMBER_variables(self, statfile):
58  """reads an AMBER mden file and returns variables present in it"""
59  h = History(statfile)
60  # read title and setup history
61  self.correspondences = []
62  oldnum = -1
63  for line in open(statfile):
64  tokens = line.split()
65  lineno = int(tokens[0][1:])
66  if lineno < oldnum:
67  break
68  oldnum = lineno
69  for i, el in enumerate(tokens[1:]):
70  self.create_entry(h, lineno, '%d:global:%s' % (i + 1, el))
71  return self.correspondences
72 
73  def read_AMBER_stats(self, statfile):
74  """reads an AMBER mden file and returns a History instance"""
75  h = History(statfile)
76  # read title and setup history
77  read_title = True
78  oldnum = -1
79  self.correspondences = []
80  for line in open(statfile):
81  tokens = line.split()
82  lineno = int(tokens[0][1:])
83  if lineno < oldnum and read_title:
84  read_title = False
85  oldnum = lineno
86  if read_title:
87  for i, el in enumerate(tokens[1:]):
88  self.create_entry(h, lineno, '%d:global:%s' % (i + 1, el))
89  continue
90  # from here on, the line contains data
91  for i, el in enumerate(tokens[1:]):
92  self.add_data(h, lineno, i, el)
93  # h.sanity_check()
94  return h
95 
96  def read_stats(self, statfile):
97  """reads a *_stats.txt file and returns a History instance"""
98  h = History(statfile)
99  # read title and setup history
100  read_title = True
101  self.correspondences = []
102  for line in open(statfile):
103  if line.startswith('*'):
104  continue
105  tokens = line.split()
106  if not tokens[0][1].isdigit():
107  continue
108  lineno = int(tokens[0][1:]) - 1
109  if line.startswith('#'):
110  if read_title:
111  for el in tokens[1:]:
112  self.create_entry(h, lineno, el)
113  continue
114  elif read_title:
115  read_title = False
116  # from here on, the line starts with 'L'
117  for i, el in enumerate(tokens[1:]):
118  self.add_data(h, lineno, i, el)
119  # h.sanity_check()
120  return h
121 
122  def plot(self, h, *datums, **kwargs):
123  """plots datum (cat,name) from hierarchy h, optionally specifying a
124  range. To plot multiple data at the same time, add them sequentially.
125  Takes x axis from the 'step' entry of the first datum. TODO.
126  """
127  data = [np.array(h.get_data(cat, name), dtype=float)
128  for (cat, name) in datums]
129  x = h.get_data(datums[0][0], 'step')
130  toplot = []
131  for i in range(len(data)):
132  toplot.extend([x, data[i]])
133  matplotlib.pyplot.plot(*data, **kwargs)
134  matplotlib.pyplot.grid(True)
135  matplotlib.pyplot.legend()
136  matplotlib.pyplot.show()
137 
138  def histogram(self, h, *datums, **kwargs):
139  """plots histogram of datum (cat,name) from hierarchy h, optionally
140  specifying a range. To plot multiple data at the same time, add them
141  sequentially.
142  """
143  data = [np.array(h.get_data(*dat), dtype=float)
144  for dat in datums]
145  matplotlib.pyplot.hist(*data, **kwargs)
146  matplotlib.pyplot.grid(True)
147  matplotlib.pyplot.legend()
148  matplotlib.pyplot.show()
149 
150  def dump(self, h, dest, *args):
151  """"dump float data from history h to file dest.
152  args can be either strings corresponding to categories, or tuples
153  corresponding to entries of a certain category. Only one counter will
154  be output for the whole dump, it corresponds to the counter of the
155  first entry's category. You can always specify additional counters
156  if needed.
157  """
158  # parse args
159  cats = []
160  names = []
161  for arg in args:
162  if isinstance(arg, str):
163  # get rid of counter
164  ent = h.get_entries(arg)[1:]
165  names.extend(ent)
166  cats.extend([arg] * len(ent))
167  else:
168  # argument should be (cat, entry)
169  names.append(arg[1])
170  cats.append(arg[0])
171  # write data
172  steps = h.get_data(cats[0], 'step')
173  fl = open(dest, 'w')
174  fl.write("# %s:step\t" % cats[0])
175  fl.write('\t'.join(['%s:%s' % (i, j) for (i, j) in zip(cats, names)]))
176  fl.write('\n')
177  data = [h.get_data(i, j) for (i, j) in zip(cats, names)]
178  for i, st in enumerate(steps):
179  fl.write("%10d\t" % st)
180  for j in data:
181  fl.write('%10f\t' % j[i])
182  fl.write('\n')
183  fl.close()
184 
185 
186 if __name__ == '__main__':
187 
188  import sys
189  a = Analysis()
190  h = a.read_stats(sys.argv[1])
191  h.toc()
192  matplotlib.pyplot.ion() # interactive
def add_data
adds data point to hierarchy
Definition: isd/Analysis.py:26
def read_stats
reads a *_stats.txt file and returns a History instance
Definition: isd/Analysis.py:96
def dump
"dump float data from history h to file dest.
def read_AMBER_stats
reads an AMBER mden file and returns a History instance
Definition: isd/Analysis.py:73
def create_entry
adds a new entry to the hierarchy by parsing a title entry
Definition: isd/Analysis.py:14
Classes to store output from replicas.
Definition: History.py:1
def read_variables
reads a *_stats.txt file and returns variables present in it
Definition: isd/Analysis.py:38
def plot
plots datum (cat,name) from hierarchy h, optionally specifying a range.
Class that produces analysis-related output, and is able to parse the output of a file produced by th...
Definition: isd/Analysis.py:8
def read_AMBER_variables
reads an AMBER mden file and returns variables present in it
Definition: isd/Analysis.py:57
def histogram
plots histogram of datum (cat,name) from hierarchy h, optionally specifying a range.