<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _calcEnergyStretchTwist(self, diff, es, which):
 r"""Calculate energy for ``estype='ST'`` using a difference vector. It is called in :meth:`dnaEY.getGlobalDeformationEnergy` for energy calculation of each frame. Parameters diff : numpy.ndarray Array of difference between minimum and current parameter values. .. math:: \mathbf{x} = \begin{bmatrix} (L_i - L_0) & (\phi_i - \phi_0) \end{bmatrix} es : numpy.ndarray Elastic matrix. See in :meth:`dnaEY.getStretchTwistModulus` about elastic matrix. which : str For which type of motions, energy will be calculated. See ``which`` parameter in :meth:`dnaEY.getGlobalDeformationEnergy` for keywords. Return ------ energy : float Deformation free energy value """


        if which not in self.enGlobalTypes[:5]:
            raise ValueError('{0} is not a supported energy keywords.\n Use any of the following: \n {1}'.format(
                which, self.enGlobalTypes[:5]))

        energy = None

        if which == 'full':
            temp = np.matrix(diff)
            energy = 0.5 * ((temp * es) * temp.T)
            energy = energy[0,0]

        if which == 'diag':
            energy = 0.5 * ((diff[0] ** 2 * es[0][0])
                            + (diff[1] ** 2 * es[1][1]))

        if which == 'stretch':
            energy = 0.5 * (diff[0] ** 2 * es[0][0])

        if which == 'twist':
            energy = 0.5 * (diff[1] ** 2 * es[1][1])

        if which == 'st_coupling':
            energy = 0.5 * (diff[0] * diff[1] * es[0][1])

        return energy