OpenMPCD
VelocityAutocorrelation.py
1 """
2 @package MPCDAnalysis.VelocityAutocorrelation
3 
4 Analysis functionality for data on (center-of-mass) velocity autocorrelation,
5 as produced by
6 `OpenMPCD::CUDA::MPCFluid::Instrumentation::VelocityAutocorrelation`.
7 """
8 from MPCDAnalysis.OnTheFlyStatisticsDDDA import OnTheFlyStatisticsDDDA
9 
11  """
12  Analysis class for data on mean square displacement, as produced by
13  `OpenMPCD::CUDA::MPCFluid::Instrumentation::VelocityAutocorrelation`.
14 
15  Unless specified otherwise, all times are measured in units of MPC time.
16 
17  @see OpenMPCD::CUDA::MPCFluid::Instrumentation::VelocityAutocorrelation
18  """
19 
20  def __init__(self, rundirs, minimumTime):
21  """
22  The constructor.
23 
24  @throw TypeError
25  Throws if `rundir` is not a `str`, or a `list` of `str`.
26  @throw ValueError
27  Throws if the given `rundir` does not exist, or does not contain
28  a readable, valid data file.
29  @throw ValueError
30  Throws if `rundir` is an empty list.
31 
32  @param[in] rundirs
33  The run directory, as a `string`. From this directory, the
34  file `velocityAutocorrelations.data` will be read as input.
35  If this file does not exist,
36  `velocityAutocorrelations.data.xz` will be read instead.
37  Alternatively, this can be a list of strings, each element
38  of which specifies a directory that is treated as described
39  above.
40  @param[in] minimumTime
41  Discard all measurements involving simulation times smaller
42  than this value.
43  """
44 
45  if isinstance(rundirs, str):
46  rundirs = [rundirs]
47 
48  if not isinstance(rundirs, list):
49  raise TypeError()
50  for rundir in rundirs:
51  if not isinstance(rundir, str):
52  raise TypeError()
53  if len(rundirs) == 0:
54  raise ValueError()
55 
56  if not isinstance(minimumTime, float):
57  raise TypeError()
58 
59  self._minimumTime = minimumTime
60 
61 
62  self._measurements = []
63  self._statistics = {}
64  self._config = None
65  self._MPCTimestep = None
66  self._correlationTimes = []
67 
68  from MPCDAnalysis.OnTheFlyStatisticsDDDA import OnTheFlyStatisticsDDDA
69 
70  for rundir in rundirs:
71  if not isinstance(rundir, str):
72  raise TypeError()
73 
74  filepath = rundir + "/" + "velocityAutocorrelations.data"
75  filepathXZ = filepath + ".xz"
76 
77  import os.path
78  if not os.path.isfile(filepath) and not os.path.isfile(filepathXZ):
79  raise ValueError()
80 
81  from MPCDAnalysis.Configuration import Configuration
82  if self._config is None:
83  self._config = Configuration(rundir)
84  self._measurementTime = \
85  self._config[
86  "instrumentation." + \
87  "velocityAutocorrelation." + \
88  "measurementTime"]
89 
90  self._MPCTimestep = self._config["mpc.timestep"]
91 
92  else:
93  if not self._config.isEquivalent(Configuration(rundir)):
94  raise ValueError(
95  "Rundirs have incompatible configurations!")
96 
97  if os.path.isfile(filepath):
98  with open(filepath, "r") as f:
99  self._parse(f)
100  elif os.path.isfile(filepathXZ):
101  import lzma
102  f = lzma.LZMAFile(filepathXZ, "r")
103  self._parse(f)
104  else:
105  raise RuntimeError()
106 
107 
108  def getAutocorrelation(self, deltaT):
109  """
110  Returns an `OnTheFlyStatisticsDDDA` object that holds information on the
111  sample of measured mean square displacements for time difference
112  `deltaT`.
113 
114  @throw TypeError
115  Throws if any of the arguments have invalid types.
116  @throw ValueError
117  Throws if any of the arguments have invalid values.
118 
119  @param[in] deltaT
120  The time difference to return results for. This must be of
121  type `float` and an element of `getCorrelationTimes()`.
122  """
123 
124  if not isinstance(deltaT, float):
125  raise TypeError()
126  if deltaT not in self.getCorrelationTimes():
127  raise ValueError
128 
129  return self._statistics[deltaT]
130 
131 
132  def getCorrelationTimes(self):
133  """
134  Returns a sorted list of valid correlation times.
135  """
136 
137  return self._correlationTimes
138 
139 
140  def _getDeltaT(self, t1, t2):
141  """
142  Returns a rounded time difference of `t2` and `t1`.
143 
144  The returned result is rounded such that it is (approximately to within
145  floating-point precision) multiple of the MPC simulation timestep used.
146 
147  @throw TypeError
148  Throws if any of the arguments have invalid types.
149  @throw ValueError
150  Throws if any of the arguments have invalid values.
151 
152  @param[in] t1
153  The first time, as a non-negative `float`.
154  @param[in] t1
155  The second time, as a `float` larger than or equal to `t1`.
156  """
157 
158  if not isinstance(t1, float) or not isinstance(t2, float):
159  raise TypeError()
160  if t1 < 0 or t2 < t1:
161  raise ValueError()
162 
163  multiple = (t2 - t1) / self._MPCTimestep
164  return round(multiple) * self._MPCTimestep
165 
166 
167  def _parse(self, f):
168  """
169  Parses the given file `f`.
170 
171  If a file has been parsed already, this new file is treated as if it
172  was a continuation of previously parsed runs. Hence, this file's first
173  measurement is treated as if it followed the last file's last
174  measurement.
175 
176  @param[in] f
177  The file to parse, of type `file` or `lzma.LZMAFile`.
178  """
179 
180  for line in f:
181  parts = [float(x) for x in line.split()]
182  if len(parts) != 3:
183  raise ValueError()
184 
185  t1, t2, value = parts
186 
187  if t2 < self._minimumTime:
188  continue
189 
190  deltaT = self._getDeltaT(t1, t2)
191 
192  if deltaT not in self._statistics:
193  self._statistics[deltaT] = OnTheFlyStatisticsDDDA()
194 
195  self._statistics[deltaT].addDatum(value)
196 
197  self._correlationTimes = sorted(self._statistics.keys())
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation._statistics
_statistics
Definition: VelocityAutocorrelation.py:66
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation._correlationTimes
_correlationTimes
Definition: VelocityAutocorrelation.py:69
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation.getAutocorrelation
def getAutocorrelation(self, deltaT)
Definition: VelocityAutocorrelation.py:126
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation._measurements
_measurements
Definition: VelocityAutocorrelation.py:65
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation._parse
def _parse(self, f)
Definition: VelocityAutocorrelation.py:185
MPCDAnalysis.OnTheFlyStatisticsDDDA.OnTheFlyStatisticsDDDA
Definition: OnTheFlyStatisticsDDDA.py:29
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation._getDeltaT
def _getDeltaT(self, t1, t2)
Definition: VelocityAutocorrelation.py:162
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation._config
_config
Definition: VelocityAutocorrelation.py:67
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation._minimumTime
_minimumTime
Definition: VelocityAutocorrelation.py:62
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation._MPCTimestep
_MPCTimestep
Definition: VelocityAutocorrelation.py:68
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation
Definition: VelocityAutocorrelation.py:20
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation.getCorrelationTimes
def getCorrelationTimes(self)
Definition: VelocityAutocorrelation.py:140
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation.__init__
def __init__(self, rundirs, minimumTime)
Definition: VelocityAutocorrelation.py:46
MPCDAnalysis.Configuration
Definition: Configuration.py:1
MPCDAnalysis.VelocityAutocorrelation.VelocityAutocorrelation._measurementTime
_measurementTime
Definition: VelocityAutocorrelation.py:87
MPCDAnalysis.OnTheFlyStatisticsDDDA
Definition: OnTheFlyStatisticsDDDA.py:1