mddb 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mddb/atom.rb CHANGED
@@ -23,6 +23,21 @@ module Mddb
23
23
  self.position.vector_to a.position
24
24
  end
25
25
  end
26
+
27
+ def mass
28
+ begin
29
+ self.class::MASS
30
+ rescue
31
+ raise "Please define a MASS constant in #{self.class} class"
32
+ end
33
+ end
26
34
 
35
+ def charge
36
+ begin
37
+ self.class::CHARGE
38
+ rescue
39
+ raise "Please define a CHARGE constant in #{self.class} class"
40
+ end
41
+ end
27
42
  end
28
43
  end
@@ -1,35 +1,31 @@
1
1
  module Mddb
2
2
  module Calculations
3
- # This module provides a simple way
4
- # of ordering calculation methods in a
5
- # Mddb Model
6
-
7
- # Run the calculations on an instance
8
- def run_calculations
9
- self.get_calculations.each do |calc|
10
- self.send calc
3
+ def run
4
+ begin
5
+ get_calculations.each do |c|
6
+ self.send(c)
7
+ end
8
+ rescue
9
+ raise "You haven't added any calculations to the calculations macro"
11
10
  end
12
11
  end
13
-
14
- def self.included(base)
15
- base.extend(ClassMethods)
16
- end
17
12
 
18
- module ClassMethods
19
- @@calculations = []
20
-
21
- def get_calculations
22
- @@calculations
13
+ def list_calculations
14
+ begin
15
+ get_calculations
16
+ rescue
17
+ raise "You haven't added any calculations to the calculations macro"
23
18
  end
19
+ end
24
20
 
25
- def calculations *args
26
- args.each do |arg|
27
- @@calculations.push "calc_#{arg}"
28
- end
29
- end
21
+ def self.included(klass)
22
+ klass.extend ClassMethods
23
+ end
30
24
 
31
- def list_calculations
32
- return @@calculations
25
+ module ClassMethods
26
+ def calculations *args
27
+ a = args.map {|a| "calc_#{a}"}
28
+ define_method :get_calculations, lambda {a}
33
29
  end
34
30
  end
35
31
  end
@@ -6,6 +6,11 @@ def start_console
6
6
  require 'irb'
7
7
  require 'irb/completion'
8
8
  ARGV.clear
9
+ begin
10
+ last_frame = Frame.sort(:fid.desc).first.fid
11
+ rescue
12
+ last_frame = 0
13
+ end
9
14
  puts "loading xyz"
10
15
  c = YAML.load File.open('config.yml').read
11
16
  sim = c['simulation']
@@ -21,7 +26,7 @@ def start_console
21
26
  end
22
27
  end
23
28
  p = Mddb::Parser::Parser.new
24
- fid = 1
29
+ fid = 1 + last_frame
25
30
  p.each_frame do |f|
26
31
  puts "Frame: #{fid}"
27
32
  frame = Frame.new :fid => fid
data/lib/mddb/frame.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Mddb
2
- class Frame
2
+ class FrameBase
3
3
  include MongoMapper::Document
4
4
  include Mddb::Calculations
5
5
  key :fid, Integer
@@ -9,8 +9,11 @@ module Mddb::Generators
9
9
  File.expand_path('../../templates', __FILE__)
10
10
  end
11
11
 
12
- def atom
12
+ def molecule
13
13
  template "molecule.rb.tt", "models/molecules/#{name}.rb"
14
+ inject_into_class "models/frame.rb", Frame do
15
+ " many :#{name.pluralize}, :class_name => '#{name.capitalize}'\n"
16
+ end
14
17
  template "spec/molecule_spec.rb.tt", "spec/molecules/#{name}_spec.rb"
15
18
  end
16
19
  end
data/lib/mddb/molecule.rb CHANGED
@@ -5,9 +5,58 @@ module Mddb
5
5
  include Mddb::Calculations
6
6
  key :fid, Integer
7
7
  key :mid, Integer
8
+ key :rg, Float
9
+ key :sasa, Float
8
10
  belongs_to :frame, :class_name => 'Mddb::Frame'
9
11
  many :atoms, :class_name => 'Mddb::Atom'
10
12
 
13
+ def calc_rg
14
+ sum_ij = 0
15
+ self.atoms.each do |i|
16
+ self.atoms.each do |j|
17
+ sum_ij += (i.position.distance_to j.position)**2
18
+ end
19
+ end
20
+
21
+ rg2 = sum_ij / (2*(32**2))
22
+ rg = rg2**0.5
23
+
24
+ self.rg = rg/0.529
25
+ self.save
26
+ end
27
+
28
+ def calc_sasa
29
+ nodes=GsdSphere.new(1000).nodes
30
+ r_oxygen = 1.58
31
+ r_monomer = 1.58
32
+ surface = 0
33
+ origin = Point[0,0,0]
34
+ self.atoms.each do |atom|
35
+ nodes.each do |node|
36
+ pos_tranformation = origin.vector_to atom.position
37
+
38
+ point = node + pos_tranformation
39
+
40
+ v_radius = atom.position.vector_to point
41
+
42
+ test_point = atom.position + (v_radius * (r_oxygen + r_monomer))
43
+ other_atoms = self.atoms - [atom]
44
+
45
+ inside = false
46
+
47
+ other_atoms.each do |other|
48
+ if (test_point.distance_to other.position) < (r_oxygen + r_monomer)
49
+ inside = true
50
+ end
51
+ end
52
+
53
+ surface += 1 if inside == false
54
+ end
55
+ end
56
+ self.sasa = surface.to_f/(self.atoms.count*nodes.count)
57
+ self.save
58
+ end
59
+
11
60
  def timeline
12
61
  self.class.where(:mid => self.mid).all
13
62
  end
@@ -19,5 +68,13 @@ module Mddb
19
68
  raise "Bad timestep. No frame exists or out of range"
20
69
  end
21
70
  end
71
+
72
+ def mass
73
+ mass = 0
74
+ self.atoms.each do |a|
75
+ mass += a.mass
76
+ end
77
+ mass
78
+ end
22
79
  end
23
80
  end
data/lib/mddb/parser.rb CHANGED
@@ -7,18 +7,26 @@ module Mddb
7
7
  @objects = Mddb::Config.simulation['count']
8
8
  end
9
9
 
10
+ def new_frame? lineno
11
+ lineno == 3
12
+ end
13
+
14
+ def end_of_frame? lineno
15
+ lineno == @objects + 2
16
+ end
17
+
10
18
  def each_frame
11
- frame = nil
19
+ frame = []
20
+ lineno = 0
12
21
  @file.each do |line|
13
- if line == "#{@objects}\n"
14
- yield(frame) if frame != nil
22
+ lineno += 1
23
+ raw = line.split
24
+ point = Point[raw[1].to_f, raw[2].to_f, raw[3].to_f]
25
+ frame.push point
26
+ if end_of_frame? lineno
27
+ lineno = 0
28
+ yield(frame[2..(frame.count - 1)]) if frame != nil
15
29
  frame = []
16
- else
17
- if line.split.count == 4
18
- raw = line.split
19
- point = Point[raw[1].to_f, raw[2].to_f, raw[3].to_f]
20
- frame.push point
21
- end
22
30
  end
23
31
  end
24
32
  end
@@ -1,4 +1,4 @@
1
- class Frame < Mddb::Frame
1
+ class Frame < Mddb::FrameBase
2
2
  # Relationships here
3
3
  #
4
4
  # Eg.
data/lib/mddb/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Mddb
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/mddb.rb CHANGED
@@ -9,8 +9,8 @@ if File.exists? "config.yml"
9
9
  Mddb::Config.config = "config.yml"
10
10
  require "mddb/point"
11
11
  require "mddb/vector"
12
- require "mddb/atom"
13
12
  require "mddb/frame"
13
+ require "mddb/atom"
14
14
  require "mddb/molecule"
15
15
  require "require_all"
16
16
  require_all 'models' unless Dir.glob('models/**/*.rb').size == 0
@@ -18,4 +18,34 @@ end
18
18
 
19
19
  module Mddb
20
20
  TEMPLATES = File.expand_path('../mddb/templates', __FILE__)
21
+
22
+ def Mddb.run opts = {}
23
+ if opts[:all]
24
+ frames = Frame.all
25
+ else
26
+ frames = Frame.where(:fid.gte => opts[:from], :fid.lte => opts[:to]).all
27
+ end
28
+ if frames.empty?
29
+ puts "There were no frames in in this range"
30
+ else
31
+ klasses = Frame.associations.keys.map {|k| k.to_s.classify}
32
+ if klasses.empty?
33
+ puts "There are no objects associated with frame"
34
+ else
35
+ puts "#{klasses.count} models found"
36
+ frames.each do |f|
37
+ klasses.each do |k|
38
+ begin
39
+ puts "attempting to run #{k}"
40
+ m = Object.const_get(k).where(:fid => f.fid).all
41
+ m.each {|m| m.run}
42
+ rescue
43
+ puts "couldn't run calculation on #{k}"
44
+ end
45
+ end
46
+ f.run
47
+ end
48
+ end
49
+ end
50
+ end
21
51
  end
data/spec/oxygen_spec.rb CHANGED
@@ -1,12 +1,46 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe "Atoms" do
4
- class Oxygen < Mddb::Atom
5
- # include Mddb::Calculations
6
- calculations :fun, :bad, :ok
4
+ describe "OxygenWithContants" do
5
+ class OxygenWithConstants < Mddb::Atom
6
+ include Mddb::Calculations
7
+ MASS = 1.23
8
+ CHARGE = -4.23
9
+ calculations :fun, :bad, :ok
10
+ end
11
+
12
+ it "should have 3 calculations" do
13
+ OxygenWithConstants.new.list_calculations.should == %W(calc_fun calc_bad calc_ok)
14
+ end
15
+
16
+ it "should have a charge method" do
17
+ OxygenWithConstants.new.charge.should == -4.23
18
+ end
19
+
20
+ it "should have a mass method" do
21
+ OxygenWithConstants.new.mass.should == 1.23
22
+ end
7
23
  end
8
24
 
9
- it "should have 3 calculations" do
10
- Oxygen.list_calculations.should == %W(calc_fun calc_bad calc_ok)
25
+ describe "OxygenWithoutContants" do
26
+ class OxygenWithoutConstants < Mddb::Atom
27
+ include Mddb::Calculations
28
+ end
29
+
30
+ it "should raise an error on charge method" do
31
+ lambda {OxygenWithoutConstants.new.charge }.should raise_error(RuntimeError, "Please define a CHARGE constant in OxygenWithoutConstants class")
32
+ end
33
+
34
+ it "should raise an error on mass method" do
35
+ lambda {OxygenWithoutConstants.new.mass}.should raise_error RuntimeError
36
+ end
37
+
38
+ it "should raise an error on list_calculations" do
39
+ lambda {OxygenWithoutConstants.new.list_calculations}.should raise_error RuntimeError
40
+ end
41
+
42
+ it "should raise an error on run" do
43
+ lambda {OxygenWithoutConstants.new.run}.should raise_error RuntimeError
44
+ end
11
45
  end
12
46
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mddb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-11 00:00:00.000000000Z
12
+ date: 2012-02-15 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70196309243000 !ruby/object:Gem::Requirement
16
+ requirement: &70212474145840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70196309243000
24
+ version_requirements: *70212474145840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: mongo_mapper
27
- requirement: &70196309242480 !ruby/object:Gem::Requirement
27
+ requirement: &70212474145420 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70196309242480
35
+ version_requirements: *70212474145420
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: hirb
38
- requirement: &70196309241960 !ruby/object:Gem::Requirement
38
+ requirement: &70212474145000 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70196309241960
46
+ version_requirements: *70212474145000
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: thor
49
- requirement: &70196309241300 !ruby/object:Gem::Requirement
49
+ requirement: &70212474144540 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70196309241300
57
+ version_requirements: *70212474144540
58
58
  description: MDDB makes analysing molecular dynamics simulations easy
59
59
  email:
60
60
  - thom.mulvaney@gmail.com