# Source code for obspy.realtime.rtmemory

    # -*- coding: utf-8 -*-
    """
    Module for handling ObsPy RtMemory objects.

    :copyright:
        The ObsPy Development Team (devs@obspy.org) & Anthony Lomax
    :license:
        GNU Lesser General Public License, Version 3
        (https://www.gnu.org/copyleft/lesser.html)
    """
    from __future__ import (absolute_import, division, print_function,
                            unicode_literals)
    from future.builtins import *  # NOQA

    import numpy as np

    class RtMemory:
        """
        Real time memory class.
        """
        def __init__(self):
            self.initialized = False

        def initialize(self, data_type, length_input, length_output,
                       input_initial_value=0, output_initial_value=0):
            """
            Create and initialize input and output arrays for this RtMemory object.

            :type data_type: numpy.dtype
            :param data_type: Desired array data-type.
            :type length_input: int
            :param length_input: length of the input memory array.
            :type length_output: int
            :param length_output: length of the output memory array.
            :type input_initial_value: float, optional
            :param input_initial_value: Initialization value for the input
                memory array (default is 1.0).
            :type output_initial_value: float, optional
            :param output_initial_value: Initialization value for the output
                memory array (default is 1.0).
            """
            self.input = np.empty(length_input, data_type)
            self.input.fill(input_initial_value)

            self.output = np.empty(length_output, data_type)
            self.output.fill(output_initial_value)

            self.initialized = True

        def _update(self, memory_array, data):
            """
            Update specified memory array using specified number of points from
            end of specified data array.

            :type memory_array: numpy.ndarray
            :param memory_array:  Memory array (input or output) in this
                RtMemory object to update.
            :type data: numpy.ndarray
            :param data:  Data array to use for update.
            :return: NumPy :class:`~numpy.ndarray` object containing updated
                memory array (input or output).
            """
            if data.size >= np.size(memory_array):
                # data length greater than or equal to memory length
                memory_array = data[np.size(data) - np.size(memory_array):]
            else:
                # data length less than memory length
                # shift memory
                memory_array = memory_array[data.size:]
                # append data
                memory_array = np.concatenate((memory_array, data))
            return memory_array

        def update_output(self, data):
            """
            Update output memory using specified number of points from end of
            specified array.

            :type data: numpy.ndarray
            :param data:  Data array to use for update.
            """
            self.output = self._update(self.output, data)

        def update_input(self, data):
            """
            Update input memory using specified number of points from end of
            specified array.

            :type data: numpy.ndarray
            :param data:  Data array to use for update.
            """
            self.input = self._update(self.input, data)

### Thank you!

We would like to thank our contributors, whose efforts make this software what it is. These people have helped by writing code and documentation, and by testing. They have created and maintained this product, its associated libraries and applications, our build tools and our web sites.

#### Contributors

- Ackerley, Nick
- Allgeyer, Sebastien
- Ammon, Charles J.
- Antunes, Emanuel
- Arnarsson, Ólafur St.
- Bank, Markus
- Barsch, Robert
- Behr, Yannik
- Bernardi, Fabrizio
- Bernauer, Felix
- Bes de Berc, Maxime
- Beyreuther, Moritz
- Boltz, Shawn
- Bonaimé, Sébastien
- Carothers, Lloyd
- Chamberlain, Calum
- Chambers, Derrick
- Chen, Zhao
- Clark, Adam
- Danecek, Peter
- Egdorf, Sven
- Engels, Fabian
- Ermert, Laura
- Eulenfeld, Tom

- Fabbri, Tommaso
- Falco, Nicholas
- Fee, Jeremy
- Grellier, Clément
- Grunberg, Marc
- Hammer, Conny
- Heimann, Sebastian
- Heiniger, Lukas
- Hope, Gaute
- Igel, Heiner
- Inza, Adolfo
- Isken, Marius
- Ketchum, David
- Koymans, Mathijs
- Kremers, Simon
- Kress, Victor
- Krieger, Lars
- Krischer, Lion
- Kula, Damian
- Käufl, Paul
- Köhler, Andreas
- Lecocq, Thomas
- Leeman, John
- Legovini, Paride

- Lesage, Philippe
- Li, Yulin
- Lomax, Anthony
- Lopes, Rui L.
- MacCarthy, Jonathan
- Maggi, Alessia
- Martin, Henri
- Medlin, Andrew
- Megies, Tobias
- Meschede, Matthias
- Michelini, Alberto
- Miller, Nathaniel C.
- Morgenstern, Bernhard
- Nof, Ran Novitsky
- Panning, Mark P.
- Parker, Tom
- Pestourie, Romain
- Rapagnani, Giovanni
- Reyes, Celso
- Ringler, Adam
- Rothenhäusler, Nicolas
- Russo, Emiliano
- Sales de Andrade, Elliott

- Satriano, Claudio
- Saul, Joachim
- Scheingraber, Chris
- Schneider, Simon
- Sippl, Christian
- Snoke, Arthur
- Stange, Stefan
- Stähler, Simon C.
- Sullivan, Benjamin
- Tian, Dongdong
- Trabant, Chad
- Trani, Luca
- Uieda, Leonardo
- Walker, Andrew
- Walther, Marcus
- Wassermann, Joachim
- Williams, Mark C.
- Winkelman, Andrew
- Zaccarelli, Riccardo
- Zad, Seyed Kasra Hosseini
- Zhu, Lijun
- van Driel, Martin
- van Wijk, Kasper

#### Funds

ObsPy was partially funded by the

- German Science Foundation (DFG) via grant DFG IG 16/9-1
- German Ministry for Education and Research (BMBF), GEOTECHNOLOGIEN grant 03G0646H.
- NERA project (Network of European Research Infrastructures for Earthquake Risk Assessment and Mitigation) under the European Community's Seventh Framework Programme (FP7/2007-2013) grant agreement n° 262330
- Leibniz Institute for Applied Geophysics (LIAG)
- VERCE EU-FP7 project (no. 283543)