OSDN Git Service

On importing Gamess output, the energy values are read and set as the property.
[molby/Molby.git] / Scripts / commands.rb
1 #
2 #  commands.rb
3 #
4 #  Created by Toshi Nagata on 2008/06/28.
5 #  Copyright 2008 Toshi Nagata. All rights reserved.
6 #
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation version 2 of the License.
10
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15
16 class Molecule
17
18   def cmd_assign_residue
19     sel = self.selection
20         if sel.length == 0
21           sel = self.atom_group
22         end
23         atoms = sel.inspect.sub!("IntGroup[", "").sub!("]", "")
24     hash = Dialog.run("Assign Residue") {
25           layout(2,
26                 item(:text, :title=>"New residue name/number\n(like \"RES.1\")\nfor atoms #{atoms}"),
27             item(:textfield, :width=>120, :tag=>"residue"))
28     }
29     if hash[:status] == 0
30           residue = hash["residue"]
31           assign_residue(sel, residue)
32         end
33   end
34
35   def cmd_offset_residue
36     sel = self.selection
37         if sel.length == 0
38           sel = self.atom_group
39         end
40         atoms = sel.inspect.sub!("IntGroup[", "").sub!("]", "")
41     hash = Dialog.run("Offset Residues") {
42           layout(2,
43                 item(:text, :title=>"Offset residue number:\nfor atoms #{atoms}"),
44             item(:textfield, :width=>120, :tag=>"offset"))
45     }
46         if hash[:status] == 0
47           offset = hash["offset"].to_i
48           offset_residue(sel, offset)
49         end
50   end
51    
52   def cmd_sort_by_residue
53     sel = self.selection
54         if sel.length == 0
55           sel = self.atom_group
56         end
57         sorted = sel.sort_by { |i| [self.atoms[i].res_seq, i] }
58         ary = []
59         j = 0
60         (0...natoms).each { |i|
61           if sel.include?(i)
62             ary << sorted[j]
63                 j += 1
64                 break if j >= sorted.length
65           else
66             ary << i
67           end
68         }
69         self.renumber_atoms(ary)
70   end
71
72   def cmd_delete_frames
73     n = nframes
74     return if n == 0
75         hash = Dialog.run("Delete Frames") {
76           layout(2,
77             item(:text, :title=>"Start"),
78             item(:textfield, :width=>120, :tag=>"start", :value=>"0"),
79                 item(:text, :title=>"End"),
80                 item(:textfield, :width=>120, :tag=>"end", :value=>(n - 1).to_s),
81                 item(:text, :title=>"Keeping frames every..."),
82                 -1,
83                 item(:text, :title=>"Step"),
84                 item(:textfield, :width=>120, :tag=>"step", :value=>"0"))
85         }
86         if hash[:status] == 0
87           sframe = Integer(hash["start"])
88           eframe = Integer(hash["end"])
89           step = Integer(hash["step"])
90           return if sframe > eframe
91           eframe = n - 1 if eframe >= n
92           fgroup = IntGroup[sframe..eframe]
93           if step > 0
94             while sframe <= eframe
95                   fgroup.delete(sframe)
96                   sframe += step
97                 end
98           end
99           remove_frames(fgroup)
100         end
101   end
102
103   def cmd_reverse_frames
104     n = nframes
105     return if n == 0
106         hash = Dialog.run("Reverse Frames") {
107           layout(2,
108             item(:text, :title=>"Start"),
109             item(:textfield, :width=>120, :tag=>"start", :value=>"0"),
110                 item(:text, :title=>"End"),
111                 item(:textfield, :width=>120, :tag=>"end", :value=>(n - 1).to_s))
112         }
113         if hash[:status] == 0
114           sframe = Integer(hash["start"])
115           eframe = Integer(hash["end"])
116           return if sframe > eframe
117           eframe = n - 1 if eframe >= n
118           frames = (0...sframe).to_a + (sframe..eframe).to_a.reverse + ((eframe + 1)...n).to_a
119           reorder_frames(frames)
120         end
121   end
122
123   def cmd_extra_properties
124     mol = self
125         get_count = lambda { |it| mol.nframes }
126         get_value = lambda { |it, row, col|
127           if col == 0
128             row.to_s
129           else
130             sprintf("%.8f", mol.get_property(col - 1, row)) rescue ""
131           end
132     }
133     Dialog.new("Extra Props:" + mol.name, nil, nil, :resizable=>true, :has_close_box=>true) {
134           names = nil
135           on_document_modified = lambda { |m|
136             if (n = m.property_names) != names
137                   names = n
138                   col = [["frame", 40]] + names.map { |nn| [nn, 120] }
139                   item_with_tag("table")[:columns] = col
140                 end
141                 item_with_tag("table")[:refresh] = true
142           }
143           layout(1,
144                 item(:table, :width=>320, :height=>300, :flex=>[0,0,0,0,1,1], :tag=>"table",
145                   :on_count=>get_count,
146                   :on_get_value=>get_value),
147             :flex=>[0,0,0,0,1,1]
148           )
149           set_min_size(320, 200)
150           listen(mol, "documentModified", on_document_modified)
151           listen(mol, "documentWillClose", lambda { |m| close } )
152           on_document_modified.call(mol)
153           show
154         }
155   end
156   
157   #  DEBUG
158   def cmd_test
159     $test_dialog = Dialog.new("Test") { item(:text, :title=>"test"); show }
160   end
161   
162 end
163
164 module Kernel
165   def ask_scratch_dir
166     sdir = get_global_settings("global.scratch_dir")
167         while 1
168       p = Dialog.open_panel("Please select scratch directory", sdir, nil, true)
169           if p
170             if p =~ / /
171                   error_message_box("Please avoid path containing a white space.\n" + p.sub(/ /, "<!> <!>"))
172                   sdir = p
173                   next
174                 else
175                   set_global_settings("global.scratch_dir", p)
176                   return p
177             end
178           else
179             return nil
180           end
181         end
182   end
183 end
184
185 register_menu("Assign residue...", :cmd_assign_residue, :non_empty)
186 register_menu("Offset residue...", :cmd_offset_residue, :non_empty)
187 register_menu("Sort by residue", :cmd_sort_by_residue, :non_empty)
188 register_menu("", "")
189 register_menu("Delete Frames...", :cmd_delete_frames, lambda { |m| m && m.nframes > 1 } )
190 register_menu("Reverse Frames...", :cmd_reverse_frames, lambda { |m| m && m.nframes > 1 } )
191 register_menu("", "")
192 register_menu("Open Extra Properties Window...", :cmd_extra_properties, lambda { |m| m && m.property_names.count > 0 } )
193 #register_menu("cmd test", :cmd_test)
194