# 9.6.3. Trajectory Coordinate Averaging — `MDAnalysis.transformations.positionaveraging`

Averages the coordinates of a given trajectory with the N previous frames. For frames < N, the average of the frames iterated up to that point will be returned.

class MDAnalysis.transformations.positionaveraging.PositionAverager(avg_frames, check_reset=True, max_threads=None, parallelizable=False)

  Averages the coordinates of a given timestep so that the coordinates of the AtomGroup correspond to the average positions of the N previous frames. For frames < N, the average of the frames iterated up to that point will be returned.

  Example

  Average the coordinates of a given AtomGroup over the course of the previous N frames. For `N=3`, the output will correspond to the average of the coordinates over the last 3 frames. When `check_reset=True`, the averager will be reset once the iteration is complete, or if the frames iterated are not sequential.

      N=3
      transformation = PositionAverager(N, check_reset=True)
      u.trajectory.add_transformations(transformation)
      for ts in u.trajectory:
          print(ts.positions)

  In this case, `ts.positions` will return the average coordinates of the last N iterated frames.

  When `check_reset=False`, the average of coordinates from non sequential timesteps can also be computed. However, the averager must be manually reset before restarting an iteration. In this case, `ts.positions` will return the average coordinates of the last N iterated frames, despite them not being sequential (`frames = [0, 7, 1, 6]`).

      N=3
      transformation = PositionAverager(N, check_reset=False)
      u.trajectory.add_transformations(transformation)
      frames = [0, 7, 1, 6]
      transformation.resetarrays()
      for ts in u.trajectory[frames]:
          print(ts.positions)

  If `check_reset=True`, the `PositionAverager` would have automatically reset after detecting a non sequential iteration (i.e. when iterating from frame 7 to frame 1 or when resetting the iterator from frame 6 back to frame 0).

  For frames < N, the average is calculated with the frames iterated up to that point and thus will not follow the same behaviour as for frames > N. This can be followed by comparing the number of frames being used to compute the current averaged frame (`current_avg`) to the one requested when calling `PositionAverager` (`avg_frames`) which in these examples corresponds to `N=3`.

      N=3
      transformation = PositionAverager(N, check_reset=True)
      u.trajectory.add_transformations(transformation)
      for ts in u.trajectory:
          if transformation.current_avg == transformation.avg_frames:
              print(ts.positions)

  In the case of `N=3`, as the average is calculated with the frames iterated up to the current iteration, the first frame returned will not be averaged. During the first iteration no other frames are stored in memory thus far and, consequently, `transformation.current_avg = 1`. The second frame iterated will return the average of frame 1 and frame 2, with `transformation.current_avg = 2`. Only during the third and following iterations will `ts.positions` start returning the average of the last 3 frames and thus `transformation.current_avg = 3` These initial frames are typically not desired during analysis, but one can easily avoid them, as seen in the previous example with `if transformation.current_avg == transformation.avg_frames:` or by simply removing the first `avg_frames-1` frames from the analysis.

  Parameters:

    - avg_frames (int) – Determines the number of frames to be used for the position averaging.

    - check_reset (bool, optional) – If `True`, position averaging will be reset and a warning raised when the trajectory iteration direction changes. If `False`, position averaging will not reset, regardless of the iteration.

  Return type:

    MDAnalysis.coordinates.timestep.Timestep

  Changed in version 2.0.0: The transformation was changed to inherit from the base class for limiting threads and checking if it can be used in parallel analysis.

  Parameters:

    - max_threads (int, optional) – The maximum thread number can be used. Default is `None`, which means the default or the external setting.

    - parallelizable (bool, optional) – A check for if this can be used in split-apply-combine parallel analysis approach. Default is `True`.