Dear Konrad,<br>Thanks for your help. I finally used numpy.asarray() as it is a clearer representation of the modes. By the way, is there any example that projects a trajectory onto the normal modes? I think it is simple to code but I was a bit worried about performance. That&#39;s why I am asking if there is already something implemented.<br>
Cheers,<br>Ramon<br><br><br><div class="gmail_quote">2011/9/1 Konrad Hinsen <span dir="ltr">&lt;<a href="mailto:research@khinsen.fastmail.net">research@khinsen.fastmail.net</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div></div><div class="h5">On 31 août 11, at 11:44, Ramon Crehuet wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I would like to convert a NormalModes object into a numpy array. I tried:<br>
modes = NormalModes(universe)<br>
m_numpy = modes.array<br>
and<br>
m2_numpy = numpy.asarray(modes)<br>
which do not give the same... (though it gives arrays with the same shape, so they are not simple a transposition).<br>
Curiously, modes[0].array and modes.array[0] are also different, and in particular:<br>
np.all(modes[0].array==m2_<u></u>numpy[0]) is True. So m2_numpy seems to contain as vectors, each mode. By then, what is modes.array...?<br>
</blockquote>
<br>
<br></div></div>
It&#39;s an array that contains the normal modes vectors in some way, the details depending on how the modes were obtained (i.e. vibrational/energetic/<u></u>brownian, using a subspace or not, using a sparse representation or not, ...). In fact, it is the array containing the result from the last LAPACK call made in the normal mode calculation.<br>

<br>
If you want to use that array directly (which I don&#39;t really recommend), the best guide to its interpretation is the code that extracts individual modes in MMTK. For a VibrationalModes object, those are:<br>
<br>
    # mode vector in mass-weighted coordinates<br>
<br>
    def rawMode(self, item):<br>
        index = self.sort_index[item]<br>
        f = self.frequencies[index]<br>
        if self.imaginary[index]:<br>
            f = f*1.j<br>
        return VibrationalMode(self.universe, item, f, self.array[index])<br>
<br>
    # mode vector in Cartesian coordinates scaled by a thermal amplitude<br>
<br>
    def __getitem__(self, item):<br>
        index = self.sort_index[item]<br>
        f = self.frequencies[index]<br>
        if self.imaginary[index]:<br>
            f = f*1.j<br>
        if self.temperature is None or item &lt; 6:<br>
            amplitude = 1.<br>
        else:<br>
            amplitude = N.sqrt(2.*self.temperature*<u></u>Units.k_B/Units.amu) / \<br>
                        (2.*N.pi*f)<br>
        return VibrationalMode(self.universe, item, f,<br>
                               amplitude*self.array[index]/<u></u>self.weights)<br>
<br>
This shows that you need at the very least modes.array AND modes.sort_index to extract any useful information from that array.<br>
<br>
numpy.asarray() converts any sequence-like data into an array. It&#39;s similar to<br>
<br>
   numpy.array([m for m in modes])<br>
<br>
meaning that it ends up calling modes.__getitem__, which applies mass weighting and a thermal amplitude. It also sorts the modes by eigenvalue.<br>
<br>
Konrad.<br>
--<br>
------------------------------<u></u>------------------------------<u></u>---------<br><font color="#888888">
Konrad Hinsen<br>
Centre de Biophysique Moléculaire, CNRS Orléans<br>
Synchrotron Soleil - Division Expériences<br>
Saint Aubin - BP 48<br>
91192 Gif sur Yvette Cedex, France<br>
Tel. <a href="tel:%2B33-1%2069%2035%2097%2015" value="+33169359715" target="_blank">+33-1 69 35 97 15</a><br>
E-Mail: research at  khinsen dot fastmail dot net<br>
------------------------------<u></u>------------------------------<u></u>---------<br>
<br>
</font></blockquote></div><br>