Statistiques
| Révision :

root / ase / gui / nanotube.py @ 11

Historique | Voir | Annoter | Télécharger (5,37 ko)

1 1 tkerber
# encoding: utf-8
2 1 tkerber
"""nanotube.py - Window for setting up Carbon nanotubes and similar tubes.
3 1 tkerber
"""
4 1 tkerber
5 1 tkerber
import gtk
6 1 tkerber
from ase.gui.widgets import pack, cancel_apply_ok, oops
7 1 tkerber
from ase.gui.setupwindow import SetupWindow
8 1 tkerber
from ase.gui.pybutton import PyButton
9 1 tkerber
from ase.structure import nanotube
10 1 tkerber
import ase
11 1 tkerber
import numpy as np
12 1 tkerber
13 1 tkerber
introtext = """\
14 1 tkerber
Set up a Carbon nanotube by specifying the (n,m) roll-up vector.
15 1 tkerber
Please note that m <= n.
16 1 tkerber

17 1 tkerber
Nanotubes of other elements can be made by specifying the element
18 1 tkerber
and bond length.\
19 1 tkerber
"""
20 1 tkerber
21 1 tkerber
py_template = """
22 1 tkerber
from ase.structure import nanotube
23 1 tkerber

24 1 tkerber
atoms = nanotube(%(n)i, %(m)i, length=%(length)i, bond=%(bl).3f, symbol=%(symb)s)
25 1 tkerber
"""
26 1 tkerber
27 1 tkerber
28 1 tkerber
class SetupNanotube(SetupWindow):
29 1 tkerber
    "Window for setting up a (Carbon) nanotube."
30 1 tkerber
    def __init__(self, gui):
31 1 tkerber
        SetupWindow.__init__(self)
32 1 tkerber
        self.set_title("Nanotube")
33 1 tkerber
        vbox = gtk.VBox()
34 1 tkerber
35 1 tkerber
        # Intoductory text
36 1 tkerber
        self.packtext(vbox, introtext)
37 1 tkerber
38 1 tkerber
        # Choose the element and bond length
39 1 tkerber
        label1 = gtk.Label("Element: ")
40 1 tkerber
        #label.set_alignment(0.0, 0.2)
41 1 tkerber
        self.element = gtk.Entry(max=3)
42 1 tkerber
        self.element.set_text("C")
43 1 tkerber
        self.element.connect('activate', self.update_element)
44 1 tkerber
        self.bondlength = gtk.Adjustment(1.42, 0.0, 1000.0, 0.01)
45 1 tkerber
        label2 = gtk.Label("  Bond length: ")
46 1 tkerber
        label3 = gtk.Label("Å")
47 1 tkerber
        bond_box = gtk.SpinButton(self.bondlength, 10.0, 3)
48 1 tkerber
        pack(vbox, [label1, self.element, label2, bond_box, label3])
49 1 tkerber
        self.elementinfo = gtk.Label("")
50 1 tkerber
        self.elementinfo.modify_fg(gtk.STATE_NORMAL,
51 1 tkerber
                                   gtk.gdk.color_parse('#FF0000'))
52 1 tkerber
        pack(vbox, [self.elementinfo])
53 1 tkerber
        pack(vbox, gtk.Label(""))
54 1 tkerber
55 1 tkerber
        # Choose the structure.
56 1 tkerber
        pack(vbox, [gtk.Label("Select roll-up vector (n,m) and tube length:")])
57 1 tkerber
        label1 = gtk.Label("n: ")
58 1 tkerber
        label2 = gtk.Label("  m: ")
59 1 tkerber
        self.n = gtk.Adjustment(6, 1, 100, 1)
60 1 tkerber
        self.m = gtk.Adjustment(0, 0, 100, 1)
61 1 tkerber
        spinn = gtk.SpinButton(self.n, 0, 0)
62 1 tkerber
        spinm = gtk.SpinButton(self.m, 0, 0)
63 1 tkerber
        label3 = gtk.Label("  Length: ")
64 1 tkerber
        self.length = gtk.Adjustment(1, 1, 100, 1)
65 1 tkerber
        spinl = gtk.SpinButton(self.length, 0, 0)
66 1 tkerber
        pack(vbox, [label1, spinn, label2, spinm, label3, spinl])
67 1 tkerber
        self.err = gtk.Label("")
68 1 tkerber
        self.err.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#FF0000'))
69 1 tkerber
        pack(vbox, [self.err])
70 1 tkerber
        pack(vbox, gtk.Label(""))
71 1 tkerber
        self.n.connect('value-changed', self.update_n)
72 1 tkerber
        self.m.connect('value-changed', self.update_m)
73 1 tkerber
74 1 tkerber
        # Buttons
75 1 tkerber
        self.pybut = PyButton("Creating a nanoparticle.")
76 1 tkerber
        self.pybut.connect('clicked', self.makeatoms)
77 1 tkerber
        buts = cancel_apply_ok(cancel=lambda widget: self.destroy(),
78 1 tkerber
                               apply=self.apply,
79 1 tkerber
                               ok=self.ok)
80 1 tkerber
        pack(vbox, [self.pybut, buts], end=True, bottom=True)
81 1 tkerber
82 1 tkerber
        # Finalize setup
83 1 tkerber
        self.add(vbox)
84 1 tkerber
        vbox.show()
85 1 tkerber
        self.show()
86 1 tkerber
        self.gui = gui
87 1 tkerber
88 1 tkerber
    def update_n(self, *args):
89 1 tkerber
        if self.m.value > self.n.value:
90 1 tkerber
            self.m.value = self.n.value
91 1 tkerber
            self.err.set_text("m decreased! (m may not be larger than n.)")
92 1 tkerber
        else:
93 1 tkerber
            self.err.set_text("")
94 1 tkerber
95 1 tkerber
    def update_m(self, *args):
96 1 tkerber
        if self.m.value > self.n.value:
97 1 tkerber
            self.n.value = self.m.value
98 1 tkerber
            self.err.set_text("n increased! (m may not be larger than n.)")
99 1 tkerber
        else:
100 1 tkerber
            self.err.set_text("")
101 1 tkerber
102 1 tkerber
    def update_element(self, *args):
103 1 tkerber
        "Called when a new element may have been entered."
104 1 tkerber
        # Assumes the element widget is self.element and that a label
105 1 tkerber
        # for errors is self.elementinfo.  The chemical symbol is
106 1 tkerber
        # placed in self.legalelement - or None if the element is
107 1 tkerber
        # invalid.
108 1 tkerber
        elem = self.element.get_text()
109 1 tkerber
        if not elem:
110 1 tkerber
            self.invalid_element("  No element specified!")
111 1 tkerber
            return False
112 1 tkerber
        try:
113 1 tkerber
            z = int(elem)
114 1 tkerber
        except ValueError:
115 1 tkerber
            # Probably a symbol
116 1 tkerber
            try:
117 1 tkerber
                z = ase.data.atomic_numbers[elem]
118 1 tkerber
            except KeyError:
119 1 tkerber
                self.invalid_element()
120 1 tkerber
                return False
121 1 tkerber
        try:
122 1 tkerber
            symb = ase.data.chemical_symbols[z]
123 1 tkerber
        except KeyError:
124 1 tkerber
            self.invalid_element()
125 1 tkerber
            return False
126 1 tkerber
        self.elementinfo.set_text("")
127 1 tkerber
        self.legal_element = symb
128 1 tkerber
        return True
129 1 tkerber
130 1 tkerber
    def makeatoms(self, *args):
131 1 tkerber
        self.update_element()
132 1 tkerber
        if self.legal_element is None:
133 1 tkerber
            self.atoms = None
134 1 tkerber
            self.pybut.python = None
135 1 tkerber
        else:
136 1 tkerber
            n = int(self.n.value)
137 1 tkerber
            m = int(self.m.value)
138 1 tkerber
            symb = self.legal_element
139 1 tkerber
            length = int(self.length.value)
140 1 tkerber
            bl = self.bondlength.value
141 1 tkerber
            self.atoms = nanotube(n, m, length=length, bond=bl, symbol=symb)
142 1 tkerber
            self.pybut.python = py_template % {'n': n, 'm':m, 'length':length,
143 1 tkerber
                                               'symb':symb, 'bl':bl}
144 1 tkerber
145 1 tkerber
146 1 tkerber
    def apply(self, *args):
147 1 tkerber
        self.makeatoms()
148 1 tkerber
        if self.atoms is not None:
149 1 tkerber
            self.gui.new_atoms(self.atoms)
150 1 tkerber
            return True
151 1 tkerber
        else:
152 1 tkerber
            oops("No valid atoms.",
153 1 tkerber
                 "You have not (yet) specified a consistent set of parameters.")
154 1 tkerber
            return False
155 1 tkerber
156 1 tkerber
    def ok(self, *args):
157 1 tkerber
        if self.apply():
158 1 tkerber
            self.destroy()
159 1 tkerber