r"""Calculate moduli as a function of time for convergence check

        It can be used to obtained elastic moduli as a function of time to check their convergence.

        .. note:: Elastic properties cannot be calculated using a single frame because fluctuations are required.
                  Therefore, here time means trajectory between zero time to given time.

        When ``esType='BST'``, following is obtained:

            1) bend-1

            2) bend-2

            3) stretch

            4) twist

            5) bend-1-bend-2

            6) bend-2-stretch

            7) stretch-twist

            8) bend-1-stretch

            9) bend-2-twist

            10) bend-1-twist


        When ``esType='ST'``, following is obtained:

            1) stretch

            2) twist

            3) stretch-twist

        .. currentmodule:: dnaMD

        Parameters
        ----------
        bp : list
            List of two base-steps forming the DNA segment.
            For example: with ``bp=[5, 50]``, 5-50 base-step segment will be considered.

        frameGap : int
            How many frames to skip for next calculation. this option will determine the
            time-gap between each calculation. Lower the number, slower will be the calculation.

        masked : bool
            ``Default=False``. To skip specific frames/snapshots.
            ``DNA.mask`` array should be set to use this functionality.
            This array contains boolean (either ``True`` or ``False``) value
            for each frame to mask the frames. Presently, mask array is
            automatically generated during :meth:`dnaMD.DNA.generate_smooth_axis` to
            skip those frames where 3D fitting curve was not successful within
            the given criteria.

        paxis : str
            Axis parallel to global helical-axis(``'X'``, or ``'Y'`` or ``'Z'``). Only require when bending motions are
            included in the calculation.

        outFile : str
            Output file in csv format.

        Returns
        -------
        time : numpy.ndarray
            1D array containing time values of shape (nframes).

        Elasticities : OrderedDict
            A ordered dictionary of 1D arrays of shape (nframes). The keys in dictionary are name of the elasticity in
            the same order as listed above.
            e.g. ``Elasticities['stretch']`` will give elasticity along stretching as a function of time.

def getModulusByTime(self, bp, frameGap, masked=False, paxis='Z', outFile=None):
        r"""Calculate moduli as a function of time for convergence check

        It can be used to obtained elastic moduli as a function of time to check their convergence.

        .. note:: Elastic properties cannot be calculated using a single frame because fluctuations are required.
                  Therefore, here time means trajectory between zero time to given time.

        When ``esType='BST'``, following is obtained:

            1) bend-1

            2) bend-2

            3) stretch

            4) twist

            5) bend-1-bend-2

            6) bend-2-stretch

            7) stretch-twist

            8) bend-1-stretch

            9) bend-2-twist

            10) bend-1-twist


        When ``esType='ST'``, following is obtained:

            1) stretch

            2) twist

            3) stretch-twist

        .. currentmodule:: dnaMD

        Parameters
        ----------
        bp : list
            List of two base-steps forming the DNA segment.
            For example: with ``bp=[5, 50]``, 5-50 base-step segment will be considered.

        frameGap : int
            How many frames to skip for next calculation. this option will determine the
            time-gap between each calculation. Lower the number, slower will be the calculation.

        masked : bool
            ``Default=False``. To skip specific frames/snapshots.
            ``DNA.mask`` array should be set to use this functionality.
            This array contains boolean (either ``True`` or ``False``) value
            for each frame to mask the frames. Presently, mask array is
            automatically generated during :meth:`dnaMD.DNA.generate_smooth_axis` to
            skip those frames where 3D fitting curve was not successful within
            the given criteria.

        paxis : str
            Axis parallel to global helical-axis(``'X'``, or ``'Y'`` or ``'Z'``). Only require when bending motions are
            included in the calculation.

        outFile : str
            Output file in csv format.

        Returns
        -------
        time : numpy.ndarray
            1D array containing time values of shape (nframes).

        Elasticities : OrderedDict
            A ordered dictionary of 1D arrays of shape (nframes). The keys in dictionary are name of the elasticity in
            the same order as listed above.
            e.g. ``Elasticities['stretch']`` will give elasticity along stretching as a function of time.

        """

        if self.esType == 'BST':
            props_name = [ 'bend-1', 'bend-2', 'stretch', 'twist', 'bend-1-bend-2',
                           'bend-2-stretch', 'stretch-twist', 'bend-1-stretch',
                           'bend-2-twist', 'bend-1-twist']
        else:
            props_name = ['stretch', 'twist', 'stretch-twist']

        time, elasticity = [], OrderedDict()
        for name in props_name:
            elasticity[name] = []

        length = len(self.dna.time[:])
        for i in range(frameGap, length, frameGap):

            props = None
            if self.esType == 'BST':
                mean, modulus_t = self.getStretchTwistBendModulus(bp, frames=[0, i], paxis=paxis, masked=True)
            else:
                mean, modulus_t = self.getStretchTwistModulus(bp, frames=[0, i], masked=masked)

            modulus_t = matrixToVector(modulus_t)
            for p in range(len(props_name)):
                elasticity[props_name[p]].append(modulus_t[p])
            time.append(self.dna.time[i])

        # Write output file
        if outFile is not None:
            with open(outFile, 'w') as fout:
                fout.write('#Time')
                for name in props_name:
                    fout.write(', {0}'.format(name))
                fout.write('\n')
                for t in range(len(time)):
                    fout.write('{0:.3f}'.format(time[t]))
                    for name in props_name:
                        fout.write(', {0:.5f}'.format(elasticity[name][t]))
                    fout.write('\n')

        return time, elasticity