def METHOD_NAME(self, q):
    """Calculate projection.
    exp(i q.r(i)) v(i)
    """
    s2p = self._primitive.s2p_map
    p2s = self._primitive.p2s_map
    num_p = len(self._primitive)
    v = self._velocities
    q_array = np.reshape(q, (-1, 3))
    dtype = "c%d" % (np.dtype("double").itemsize * 2)
    v_q = np.zeros((v.shape[0], num_p, len(q_array), 3), dtype=dtype)
    for p_i, s_i in enumerate(p2s):
        for s_j, s2p_j in enumerate(s2p):
            if s2p_j == s_i:
                for q_i, pf in enumerate(self._get_phase_factor(p_i, s_j, q_array)):
                    v_q[:, p_i, q_i, :] += pf * v[:, s_j, :]
    return v_q