Statistiques
| Révision :

root / ase / gui / simulation.py

Historique | Voir | Annoter | Télécharger (4,77 ko)

1 1 tkerber
"Base class for simulation windows"
2 1 tkerber
3 1 tkerber
import gtk
4 1 tkerber
from ase.gui.widgets import oops, pack
5 1 tkerber
from ase import Atoms
6 1 tkerber
7 1 tkerber
class Simulation(gtk.Window):
8 1 tkerber
    def __init__(self, gui):
9 1 tkerber
        gtk.Window.__init__(self)
10 1 tkerber
        self.gui = gui
11 1 tkerber
12 1 tkerber
    def packtext(self, vbox, text, label=None):
13 1 tkerber
        "Pack an text frame into the window."
14 1 tkerber
        pack(vbox, gtk.Label(""))
15 1 tkerber
        txtframe = gtk.Frame(label)
16 1 tkerber
        txtlbl = gtk.Label(text)
17 1 tkerber
        txtframe.add(txtlbl)
18 1 tkerber
        txtlbl.show()
19 1 tkerber
        pack(vbox, txtframe)
20 1 tkerber
        pack(vbox, gtk.Label(""))
21 1 tkerber
22 1 tkerber
    def packimageselection(self, outerbox, txt1=" (rerun simulation)",
23 1 tkerber
                           txt2=" (continue simulation)"):
24 1 tkerber
        "Make the frame for selecting starting config if more than one."
25 1 tkerber
        self.startframe = gtk.Frame("Select starting configuration:")
26 1 tkerber
        pack(outerbox, [self.startframe])
27 1 tkerber
        vbox = gtk.VBox()
28 1 tkerber
        self.startframe.add(vbox)
29 1 tkerber
        vbox.show()
30 1 tkerber
        self.numconfig_format = "There are currently %i configurations loaded."
31 1 tkerber
        self.numconfig_label = gtk.Label("")
32 1 tkerber
        pack(vbox, [self.numconfig_label])
33 1 tkerber
        lbl = gtk.Label("Choose which one to use as the initial configuration")
34 1 tkerber
        pack(vbox, [lbl])
35 1 tkerber
        self.start_radio_first = gtk.RadioButton(
36 1 tkerber
            None, "The first configuration"+txt1+".")
37 1 tkerber
        pack(vbox, [self.start_radio_first])
38 1 tkerber
        self.start_radio_nth = gtk.RadioButton(self.start_radio_first,
39 1 tkerber
                                               "Configuration number ")
40 1 tkerber
        self.start_nth_adj = gtk.Adjustment(0, 0, 1, 1)
41 1 tkerber
        self.start_nth_spin = gtk.SpinButton(self.start_nth_adj, 0, 0)
42 1 tkerber
        self.start_nth_spin.set_sensitive(False)
43 1 tkerber
        pack(vbox, [self.start_radio_nth, self.start_nth_spin])
44 1 tkerber
        self.start_radio_last = gtk.RadioButton(self.start_radio_first,
45 1 tkerber
            "The last configuration"+txt2+".")
46 1 tkerber
        self.start_radio_last.set_active(True)
47 1 tkerber
        pack(vbox, self.start_radio_last)
48 1 tkerber
        self.start_radio_nth.connect("toggled", self.start_radio_nth_toggled)
49 1 tkerber
        self.setupimageselection()
50 1 tkerber
51 1 tkerber
    def start_radio_nth_toggled(self, widget):
52 1 tkerber
        self.start_nth_spin.set_sensitive(self.start_radio_nth.get_active())
53 1 tkerber
54 1 tkerber
    def setupimageselection(self):
55 1 tkerber
        "Decide if the start image selection frame should be shown."
56 1 tkerber
        n = self.gui.images.nimages
57 1 tkerber
        if n <= 1:
58 1 tkerber
            self.startframe.hide()
59 1 tkerber
        else:
60 1 tkerber
            self.startframe.show()
61 1 tkerber
            if self.start_nth_adj.value >= n:
62 1 tkerber
                self.start_nth_adj.value = n-1
63 1 tkerber
            self.start_nth_adj.upper = n-1
64 1 tkerber
            self.numconfig_label.set_text(self.numconfig_format % (n,))
65 1 tkerber
66 1 tkerber
    def getimagenumber(self):
67 1 tkerber
        "Get the image number selected in the start image frame."
68 1 tkerber
        nmax = self.gui.images.nimages
69 1 tkerber
        if nmax <= 1:
70 1 tkerber
            return 0
71 1 tkerber
        elif self.start_radio_first.get_active():
72 1 tkerber
            return 0
73 1 tkerber
        elif self.start_radio_nth.get_active():
74 1 tkerber
            return self.start_nth_adj.value
75 1 tkerber
        else:
76 1 tkerber
            assert self.start_radio_last.get_active()
77 1 tkerber
            return nmax-1
78 1 tkerber
79 1 tkerber
    def makebutbox(self, vbox):
80 1 tkerber
        self.buttons = gtk.HButtonBox()
81 1 tkerber
        runbut = gtk.Button("Run")
82 1 tkerber
        runbut.connect('clicked', self.run)
83 1 tkerber
        closebut = gtk.Button(stock=gtk.STOCK_CLOSE)
84 1 tkerber
        closebut.connect('clicked', lambda x: self.destroy())
85 1 tkerber
        for w in (runbut, closebut):
86 1 tkerber
            self.buttons.pack_start(w, 0, 0)
87 1 tkerber
            w.show()
88 1 tkerber
        pack(vbox, [self.buttons], end=True, bottom=True)
89 1 tkerber
90 1 tkerber
    def setup_atoms(self):
91 1 tkerber
        self.atoms = self.get_atoms()
92 1 tkerber
        if self.atoms is None:
93 1 tkerber
            return False
94 1 tkerber
        try:
95 1 tkerber
            self.calculator = self.gui.simulation['calc']
96 1 tkerber
        except KeyError:
97 1 tkerber
            oops("No calculator: Use Calculate/Set Calculator on the menu.")
98 1 tkerber
            return False
99 1 tkerber
        self.atoms.set_calculator(self.calculator())
100 1 tkerber
        return True
101 1 tkerber
102 1 tkerber
    def get_atoms(self):
103 1 tkerber
        "Make an atoms object from the active image"
104 1 tkerber
        images = self.gui.images
105 1 tkerber
        if images.natoms < 1:
106 1 tkerber
            oops("No atoms present")
107 1 tkerber
            return None
108 1 tkerber
        n = self.getimagenumber()
109 1 tkerber
        return Atoms(positions=images.P[n], symbols=images.Z,
110 1 tkerber
                     cell=images.A[n], pbc=images.pbc)
111 1 tkerber
112 1 tkerber
    def begin(self, **kwargs):
113 1 tkerber
        if self.gui.simulation.has_key('progress'):
114 1 tkerber
            self.gui.simulation['progress'].begin(**kwargs)
115 1 tkerber
116 1 tkerber
    def end(self):
117 1 tkerber
        if self.gui.simulation.has_key('progress'):
118 1 tkerber
            self.gui.simulation['progress'].end()
119 1 tkerber
120 1 tkerber
    def prepare_store_atoms(self):
121 1 tkerber
        "Informs the gui that the next configuration should be the first."
122 1 tkerber
        self.gui.prepare_new_atoms()
123 1 tkerber
        self.count_steps = 0
124 1 tkerber
125 1 tkerber
    def store_atoms(self):
126 1 tkerber
        "Observes the minimization and stores the atoms in the gui."
127 1 tkerber
        self.gui.append_atoms(self.atoms)
128 1 tkerber
        self.count_steps += 1