Statistiques
| Révision :

root / ase / gui / status.py @ 3

Historique | Voir | Annoter | Télécharger (3,39 ko)

1 1 tkerber
# -*- coding: utf-8 -*-
2 1 tkerber
3 1 tkerber
from math import sqrt, pi, acos
4 1 tkerber
5 1 tkerber
import gtk
6 1 tkerber
import numpy as np
7 1 tkerber
8 1 tkerber
from ase.data import chemical_symbols as symbols
9 1 tkerber
from ase.data import atomic_names as names
10 1 tkerber
from ase.gui.widgets import pack
11 1 tkerber
from ase.gui.languages import translate as _
12 1 tkerber
13 1 tkerber
def formula(Z):
14 1 tkerber
    hist = {}
15 1 tkerber
    for z in Z:
16 1 tkerber
        if z in hist:
17 1 tkerber
            hist[z] += 1
18 1 tkerber
        else:
19 1 tkerber
            hist[z] = 1
20 1 tkerber
    text = ''
21 1 tkerber
    Z = hist.keys()
22 1 tkerber
    Z.sort()
23 1 tkerber
    for z in Z:
24 1 tkerber
        text += symbols[z]
25 1 tkerber
        n = hist[z]
26 1 tkerber
        if n > 1:
27 1 tkerber
            text += '<sub>%d</sub>' % n
28 1 tkerber
    return text
29 1 tkerber
30 1 tkerber
class Status:
31 1 tkerber
    def __init__(self, vbox):
32 1 tkerber
        self.eventbox = gtk.EventBox()
33 1 tkerber
        self.label = gtk.Label()
34 1 tkerber
        self.eventbox.add(self.label)
35 1 tkerber
        self.label.show()
36 1 tkerber
        if gtk.pygtk_version < (2, 12):
37 1 tkerber
            self.set_tip(self.eventbox, _('Tip for status box ...'))
38 1 tkerber
        else:
39 1 tkerber
            self.eventbox.set_tooltip_text(_('Tip for status box ...'))
40 1 tkerber
        pack(vbox, self.eventbox)
41 1 tkerber
        self.ordered_indices = []
42 1 tkerber
43 1 tkerber
    def status(self):
44 1 tkerber
        # use where here:  XXX
45 1 tkerber
        indices = np.arange(self.images.natoms)[self.images.selected]
46 1 tkerber
        ordered_indices = self.images.selected_ordered
47 1 tkerber
        n = len(indices)
48 1 tkerber
        self.nselected = n
49 1 tkerber
50 1 tkerber
        if n == 0:
51 1 tkerber
            self.label.set_text('')
52 1 tkerber
            return
53 1 tkerber
54 1 tkerber
        Z = self.images.Z[indices]
55 1 tkerber
        R = self.R[indices]
56 1 tkerber
57 1 tkerber
        if n == 1:
58 1 tkerber
            tag = self.images.T[indices][0]
59 1 tkerber
            mom = self.images.M[self.frame][indices]
60 1 tkerber
            text = (u' #%d %s (%s): %.3f Å, %.3f Å, %.3f Å ' %
61 1 tkerber
                    ((indices[0], names[Z[0]], symbols[Z[0]]) + tuple(R[0])))
62 1 tkerber
63 1 tkerber
            text+=' tag=%s mom=%1.2f' % (tag, mom)
64 1 tkerber
        elif n == 2:
65 1 tkerber
            D = R[0] - R[1]
66 1 tkerber
            d = sqrt(np.dot(D, D))
67 1 tkerber
            text = u' %s-%s: %.3f Å' % (symbols[Z[0]], symbols[Z[1]], d)
68 1 tkerber
        elif n == 3:
69 1 tkerber
            d = []
70 1 tkerber
            for c in range(3):
71 1 tkerber
                D = R[c] - R[(c + 1) % 3]
72 1 tkerber
                d.append(np.dot(D, D))
73 1 tkerber
            a = []
74 1 tkerber
            for c in range(3):
75 1 tkerber
                t1 = 0.5 * (d[c] + d[(c + 1) % 3] - d[(c + 2) % 3])
76 1 tkerber
                t2 = sqrt(d[c] * d[(c + 1) % 3])
77 1 tkerber
                try:
78 1 tkerber
                    t3 = acos(t1 / t2)
79 1 tkerber
                except ValueError:
80 1 tkerber
                    if t1 > 0:
81 1 tkerber
                        t3 = 0
82 1 tkerber
                    else:
83 1 tkerber
                        t3 = pi
84 1 tkerber
                a.append(t3 * 180 / pi)
85 1 tkerber
            text = (u' %s-%s-%s: %.1f°, %.1f°, %.1f°' %
86 1 tkerber
                    tuple([symbols[z] for z in Z] + a))
87 1 tkerber
        elif len(ordered_indices) == 4:
88 1 tkerber
            R = self.R[ordered_indices]
89 1 tkerber
            Z = self.images.Z[ordered_indices]
90 1 tkerber
            a    = R[1]-R[0]
91 1 tkerber
            b    = R[2]-R[1]
92 1 tkerber
            c    = R[3]-R[2]
93 1 tkerber
            bxa  = np.cross(b,a)
94 1 tkerber
            bxa /= np.sqrt(np.vdot(bxa,bxa))
95 1 tkerber
            cxb  = np.cross(c,b)
96 1 tkerber
            cxb /= np.sqrt(np.vdot(cxb,cxb))
97 1 tkerber
            angle = np.vdot(bxa,cxb)
98 1 tkerber
            if angle < -1: angle = -1
99 1 tkerber
            if angle >  1: angle =  1
100 1 tkerber
            angle = np.arccos(angle)
101 1 tkerber
            if (np.vdot(bxa,c)) > 0: angle = 2*np.pi-angle
102 1 tkerber
            angle = angle*180.0/np.pi
103 1 tkerber
            text = ( u'dihedral %s->%s->%s->%s: %.1f°' % tuple([symbols[z] for z in Z]+[angle]))
104 1 tkerber
        else:
105 1 tkerber
            text = ' ' + formula(Z)
106 1 tkerber
107 1 tkerber
        self.label.set_markup(text)
108 1 tkerber
109 1 tkerber
if __name__ == '__main__':
110 1 tkerber
    import os
111 1 tkerber
    os.system('python gui.py')