OpenMPCD
Data2D.py
1 from .Utilities import readValuePairsFromFile
2 from collections import deque, OrderedDict
3 import math
4 import subprocess
5 
6 class Data2D:
7  def __init__(self, filename=None, minXValue=None):
8  if filename is None:
9  self.data = OrderedDict()
10  else:
11  self.readFromFile(filename, minXValue)
12 
13  self.errors = OrderedDict()
14 
15  def readFromFile(self, filename, minXValue):
16  self.data = readValuePairsFromFile(filename, minXValue)
17 
18  def addPoint(self, point, value, error=None):
19  self.data[point] = value
20  if error is not None:
21  self.errors[point] = error
22 
23  def sort(self):
24  self.data = OrderedDict(sorted(self.data.items()))
25  self.errors = OrderedDict(sorted(self.errors.items()))
26 
27  def getNearestPoint(self, x):
28  self.sort()
29 
30  iterator = iter(self.data.items())
31  firstX, firstY = next(iterator)
32 
33  if x <= firstX:
34  return (firstX, firstY)
35 
36  lastX = firstX
37  lastY = firstY
38  lastDistance = x - firstX
39 
40  for currentX, currentY in iterator:
41  newDistance = x - currentX
42 
43  if newDistance < 0:
44  if abs(newDistance) < lastDistance:
45  return (currentX, currentY)
46  return (lastX, lastY)
47 
48  lastX = currentX
49  lastY = currentY
50  lastDistance = x - currentX
51 
52  return (lastX, lastY)
53 
54  def plot(self, plotEveryNthPoint=1):
55  gnuplotData = ""
56  counter = 0
57  for x, y in sorted(self.data.items()):
58  if counter % plotEveryNthPoint == 0:
59  gnuplotData += str(x) + "\t" + str(y) + "\n"
60 
61  counter += 1
62 
63  gnuplot = subprocess.Popen(['gnuplot'], stdin=subprocess.PIPE)
64 
65  gnuplotCommand = "set terminal wxt persist\n"
66  gnuplotCommand += "plot '-' with linespoints notitle\n"
67  gnuplotCommand += gnuplotData
68  gnuplotCommand += "e"
69 
70  gnuplot.stdin.write(gnuplotCommand.encode("UTF-8"))
71 
72  def getArithmeticMean(self):
73  sum_ = 0
74  count = 0
75  for _, y in self.data.items():
76  count += 1
77  sum_ += y
78 
79  return sum_ / count
80 
81  def getRootMeanSquaredDeviationFromArithmeticMean(self):
82  mean = self.getArithmeticMean()
83 
84  sum_ = 0
85  count = 0
86  for _, y in self.data.items():
87  count += 1
88  sum_ += (y - mean) ** 2
89 
90  return math.sqrt(sum_ / count)
91 
92  def getSimpleMovingAverageDict(self, windowsize):
93  self.sort()
94 
95  window = deque()
96  averages = OrderedDict()
97 
98  for x, y in self.data.items():
99  window.append((x, y))
100 
101  firstX = window[0][0]
102  if x - firstX >= windowsize:
103  sum_ = 0
104  count = 0
105  for value in window:
106  sum_ += value[1]
107  count += 1
108 
109  averages.update({x: sum_ / count})
110 
111  window.popleft()
112 
113  return averages
114 
115  def getAverageFromSimpleMovingAverage(self, windowsize):
116  averages = self.getSimpleMovingAverageDict(windowsize)
117 
118  sum_ = 0
119  count = 0
120  for _, y in averages.items():
121  sum_ += y
122  count += 1
123 
124  return sum_ / count
125 
126  def getLocalExtremaByComparisonFunction(self, comparisonFunction, includeBoundaries):
127  self.sort()
128 
129  extrema = {}
130 
131  items = {key: value for key, value in enumerate(self.data.items())}
132  print(items)
133  for index in items:
134  value = items[index]
135  x = value[0]
136  y = value[1]
137 
138  if index == 0:
139  if not includeBoundaries:
140  continue
141 
142  if index + 1 not in items:
143  extrema[x] = y
144  print(items)
145  print("break1")
146  break
147 
148  if comparisonFunction(y, items[index + 1][1]):
149  extrema[x] = y
150 
151  continue
152 
153  if index + 1 not in items:
154  if not includeBoundaries:
155  continue
156 
157  if comparisonFunction(y, items[index - 1][1]):
158  extrema[x] = y
159 
160  continue
161 
162  if not comparisonFunction(y, items[index - 1][1]):
163  continue
164  if not comparisonFunction(y, items[index + 1][1]):
165  continue
166  extrema[x] = y
167 
168  return extrema
169 
170 
171  def getLocalMaxima(self, includeBoundaries=True):
172  greaterThan = lambda x, y: x > y
173  return self.getLocalExtremaByComparisonFunction(greaterThan, includeBoundaries)
174 
175  def getLocalMinima(self, includeBoundaries=True):
176  lessThan = lambda x, y: x < y
177  return self.getLocalExtremaByComparisonFunction(lessThan, includeBoundaries)
178 
179  def getLocalExtrema(self, includeBoundaries=True):
180  minima = self.getLocalMinima(includeBoundaries)
181  maxima = self.getLocalMaxima(includeBoundaries)
182  return OrderedDict(sorted(minima.items() + maxima.items()))
183 
184 
185  def getData(self, sortFirst=True):
186  if sortFirst:
187  self.sort()
188 
189  return self.data
190 
191  def getKeysAndValues(self, sortFirst=True):
192  if sortFirst:
193  self.sort()
194 
195  return zip(*self.data.items())
196 
197  def getKeysAndValuesAndErrors(self, sortFirst=True):
198  if sortFirst:
199  self.sort()
200 
201  keys = []
202  values = []
203  errors = []
204  for key, value in self.data.items():
205  keys.append(key)
206  values.append(value)
207  if key in self.errors:
208  error = self.errors[key]
209  else:
210  error = None
211  errors.append(error)
212 
213  return [keys, values, errors]
214 
215  def getSize(self):
216  return len(self.data)
217 
218  def save(self, filename, sortFirst=True):
219  """
220  Saves the data to the given filename.
221 
222  @param[in] filename The file path to save to.
223  @param[in] sortFirst Whether to sort the points first, so that their x coordinate is ascending.
224  """
225 
226  self.writeTo(open(filename, 'w'), sortFirst)
227 
228  def writeTo(self, stream, sortFirst=True):
229  """
230  Writes the data to the given object.
231 
232  @param[in] stream The object to write to.
233  @param[in] sortFirst Whether to sort the points first, so that their x coordinate is ascending.
234  """
235 
236  if sortFirst:
237  self.sort()
238 
239  for x, y in self.data.items():
240  stream.write(str(x) + "\t" + str(y))
241  if x in self.errors:
242  stream.write("\t" + str(self.errors[x]))
243  stream.write("\n")
MPCDAnalysis.Data2D.Data2D.readFromFile
def readFromFile(self, filename, minXValue)
Definition: Data2D.py:15
MPCDAnalysis.Data2D.Data2D.sort
def sort(self)
Definition: Data2D.py:23
MPCDAnalysis.Data2D.Data2D.data
data
Definition: Data2D.py:9
MPCDAnalysis.Data2D.Data2D.getSimpleMovingAverageDict
def getSimpleMovingAverageDict(self, windowsize)
Definition: Data2D.py:92
MPCDAnalysis.Data2D.Data2D
Definition: Data2D.py:6
MPCDAnalysis.Data2D.Data2D.getLocalMinima
def getLocalMinima(self, includeBoundaries=True)
Definition: Data2D.py:175
MPCDAnalysis.Data2D.Data2D.getLocalExtremaByComparisonFunction
def getLocalExtremaByComparisonFunction(self, comparisonFunction, includeBoundaries)
Definition: Data2D.py:126
MPCDAnalysis.Data2D.Data2D.save
def save(self, filename, sortFirst=True)
Definition: Data2D.py:225
MPCDAnalysis.Data2D.Data2D.getLocalMaxima
def getLocalMaxima(self, includeBoundaries=True)
Definition: Data2D.py:171
MPCDAnalysis.Data2D.Data2D.writeTo
def writeTo(self, stream, sortFirst=True)
Definition: Data2D.py:236
MPCDAnalysis.Data2D.Data2D.errors
errors
Definition: Data2D.py:13
MPCDAnalysis.Data2D.Data2D.getArithmeticMean
def getArithmeticMean(self)
Definition: Data2D.py:72