mddb 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in mddb.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,11 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ if File.exists?(File.join(File.expand_path('../..', __FILE__), 'lib'))
4
+ mddb_path = File.expand_path('../../lib', __FILE__)
5
+ $:.unshift(mddb_path)
6
+ end
7
+
8
+ require 'mddb'
9
+ require "mddb/cli"
10
+
11
+ Mddb::CLI.run
@@ -0,0 +1,39 @@
1
+ # Example config
2
+ #
3
+ # database:
4
+ # host: localhost
5
+ # port: 12345
6
+ # name: 'sim1'
7
+ #
8
+ #
9
+ # If host or port are not defined, localhost and 27017
10
+ # MongoDB's default port, will be used.
11
+ #
12
+ # Only the database name must be strictly defined. It is important
13
+ # that you choose a database name that does not already exist, if
14
+ # you not want to mess up an older database.
15
+
16
+ database:
17
+ host:
18
+ port:
19
+ name: 'mddb'
20
+
21
+ simulation:
22
+ file: 'quick.xyz'
23
+ frames: 5
24
+ dimensions: 24.8522, 24.8522, 24.8522
25
+ count: 1538 # total number of objects per frame
26
+ objects:
27
+ water:
28
+ count: 512
29
+ start: 1
30
+ atom:
31
+ - oxygen
32
+ - hydrogen
33
+ - hydrogen
34
+ chain:
35
+ count: 1
36
+ start: 1537
37
+ atom:
38
+ - phobe
39
+ - phobe
@@ -0,0 +1,21 @@
1
+ require "mddb/version"
2
+ require "mddb/calculations"
3
+ require "mddb/cli"
4
+ require "mongo_mapper"
5
+ require "mddb/config"
6
+ require "mddb/parser"
7
+
8
+ if File.exists? "config.yml"
9
+ Mddb::Config.config = "config.yml"
10
+ require "mddb/point"
11
+ require "mddb/vector"
12
+ require "mddb/atom"
13
+ require "mddb/frame"
14
+ require "mddb/molecule"
15
+ require "require_all"
16
+ require_all 'models' unless Dir.glob('models/**/*.rb').size == 0
17
+ end
18
+
19
+ module Mddb
20
+ TEMPLATES = File.expand_path('../mddb/templates', __FILE__)
21
+ end
@@ -0,0 +1,28 @@
1
+ require 'mddb/calculations'
2
+ require 'mddb/point'
3
+ require 'mongo_mapper'
4
+ module Mddb
5
+ class Atom
6
+ include MongoMapper::EmbeddedDocument
7
+ include Mddb::Calculations
8
+ key :position, Point
9
+ key :fid, Integer
10
+
11
+ def distance_to a
12
+ if a.is_a? Point
13
+ self.position.distance_to a
14
+ elsif a.is_a? Mddb::Atom
15
+ self.position.distance_to a.position
16
+ end
17
+ end
18
+
19
+ def vector_to a
20
+ if a.is_a? Point
21
+ self.position.vector_to a
22
+ elsif a.is_a? Mddb::Atom
23
+ self.position.vector_to a.position
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,36 @@
1
+ module Mddb
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
11
+ end
12
+ end
13
+
14
+ def self.included(base)
15
+ base.extend(ClassMethods)
16
+ end
17
+
18
+ module ClassMethods
19
+ @@calculations = []
20
+
21
+ def get_calculations
22
+ @@calculations
23
+ end
24
+
25
+ def calculations *args
26
+ args.each do |arg|
27
+ @@calculations.push "calc_#{arg}"
28
+ end
29
+ end
30
+
31
+ def list_calculations
32
+ return @@calculations
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ require 'mddb/version'
2
+ module Mddb
3
+ class CLI
4
+ def self.run
5
+ if ARGV.empty?
6
+ puts "Using MDDB v." + Mddb::VERSION
7
+ puts "Options:"
8
+ puts " new Creates a new project"
9
+ puts " generate <model> Creates a new model."
10
+ puts " Leave blank for list of available "
11
+ puts " models"
12
+ puts " console Starts an interactice MDDB console"
13
+ elsif %w{-v --version --v}.include? ARGV.first
14
+ puts Mddb::VERSION
15
+ elsif ARGV.first == 'new'
16
+ ARGV.shift
17
+ require 'mddb/commands/new'
18
+ elsif ARGV.first == 'console'
19
+ require 'mddb/commands/console'
20
+ elsif ARGV.first == 'load'
21
+ require 'mddb/commands/load'
22
+ elsif %w{g generate}.include? ARGV.first
23
+ ARGV.shift
24
+ require 'mddb/generators'
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ def start_console
4
+ require 'irb'
5
+ require 'irb/completion'
6
+ require 'require_all'
7
+ require 'hirb'
8
+ Hirb.enable
9
+ # Require all our models
10
+ require_all 'models' unless Dir.glob('models/**/*.rb').size == 0
11
+ ARGV.clear
12
+ puts "Wecome to Mddb!"
13
+ IRB.start
14
+ end
15
+
16
+ if File.exists? 'config.yml'
17
+ start_console
18
+ else
19
+ puts "Your not in the project root directory"
20
+ end
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ def start_console
4
+ require 'mddb'
5
+ require 'mddb/point'
6
+ require 'irb'
7
+ require 'irb/completion'
8
+ ARGV.clear
9
+ puts "loading xyz"
10
+ c = YAML.load File.open('config.yml').read
11
+ sim = c['simulation']
12
+ objects = sim['objects']
13
+ objects.keys.each do |key|
14
+ unless Object.const_defined?(key.capitalize)
15
+ puts "No model for #{key}! Please create one!"
16
+ end
17
+ objects[key]['atom'].each do |a|
18
+ unless Object.const_defined?(a.capitalize)
19
+ puts "No model for #{a}! Please create one!"
20
+ end
21
+ end
22
+ end
23
+ p = Mddb::Parser::Parser.new
24
+ fid = 1
25
+ p.each_frame do |f|
26
+ puts "Frame: #{fid}"
27
+ frame = Frame.new :fid => fid
28
+ objects.keys.each do |mol|
29
+ (objects[mol]['start']..(objects[mol]['start']+objects[mol]['count']) - 1).to_a.each do |i|
30
+ m = Object.const_get(mol.capitalize).new :mid => i, :fid => fid
31
+ objects[mol]['atom'].each_with_index do |a,z|
32
+ line = z*objects[mol]['count'] + i
33
+ a = Object.const_get(a.capitalize).new :aid => (z+1), :position => f[line-1], :fid => fid
34
+ m.atoms << a
35
+ end
36
+ m.save
37
+ frame.send(mol.pluralize) << m
38
+ end
39
+ end
40
+ frame.save
41
+ fid +=1
42
+ end
43
+
44
+ end
45
+
46
+ if File.exists? 'config.yml'
47
+ start_console
48
+ else
49
+ puts "Your not in the project root directory"
50
+ end
@@ -0,0 +1,33 @@
1
+ require 'thor'
2
+ require 'thor/group'
3
+ class New < Thor::Group
4
+ include Thor::Actions
5
+ argument :name
6
+
7
+ def self.source_root
8
+ File.expand_path('../../templates', __FILE__)
9
+ end
10
+
11
+ def README
12
+ template "README.tt", "#{name}/README"
13
+ end
14
+
15
+ def config
16
+ template "config.yml.tt", "#{name}/config.yml"
17
+ end
18
+
19
+ def models
20
+ empty_directory "#{name}/models"
21
+ end
22
+
23
+ def frame
24
+ template "frame.rb.tt", "#{name}/models/frame.rb"
25
+ end
26
+
27
+ def spec
28
+ empty_directory "#{name}/spec"
29
+ end
30
+
31
+ end
32
+
33
+ New.start
@@ -0,0 +1,31 @@
1
+ module Mddb
2
+ module Config
3
+ def self.database
4
+ @@config['database'] ||= {}
5
+ end
6
+
7
+ def self.simulation
8
+ @@config['simulation']
9
+ end
10
+
11
+ def self.config=(file)
12
+ config = YAML.load_file(file)
13
+ config['database']['host'] = 'localhost' if config['database']['host'].nil?
14
+ config['database']['port'] = 27017 if config['database']['port'].nil?
15
+ raise "bad config file: database name needs to be defined" if config['database']['name'].nil?
16
+ config['simulation']['dimensions'] = config['simulation']['dimensions'].split(',').collect {|a| a.to_f}
17
+ @@config = config
18
+ self.connect
19
+ end
20
+
21
+
22
+ # The ranges of atoms in the config file are described as strings, we need
23
+ # to make them into ruby strings.
24
+ def self.connect
25
+ host = Mddb::Config.database['host']
26
+ database = Mddb::Config.database['name']
27
+ MongoMapper.connection = Mongo::Connection.new(host)
28
+ MongoMapper.database = database
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,7 @@
1
+ module Mddb
2
+ class Frame
3
+ include MongoMapper::Document
4
+ include Mddb::Calculations
5
+ key :fid, Integer
6
+ end
7
+ end
@@ -0,0 +1,32 @@
1
+ require 'mddb/generators/atom'
2
+ require 'mddb/generators/molecule'
3
+ module Mddb
4
+ module Generators
5
+ def Generators.list
6
+ gens = Mddb::Generators.constants.map {|x| x.to_s.downcase}
7
+ gens - ['run']
8
+ end
9
+
10
+ class Run
11
+ def self.start
12
+ if ARGV.empty?
13
+ puts "try one of the following"
14
+ Mddb::Generators.list.each do |g|
15
+ puts " #{g} <name>"
16
+ end
17
+ elsif Mddb::Generators.list.include? ARGV.first
18
+ gen = ARGV.first
19
+ ARGV.shift
20
+ if ARGV.empty?
21
+ puts "supply a name"
22
+ else
23
+ eval("Mddb::Generators::" + gen.capitalize + ".start")
24
+ end
25
+ end
26
+
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ Mddb::Generators::Run.start
@@ -0,0 +1,18 @@
1
+ require 'thor'
2
+ require 'thor/group'
3
+ module Mddb::Generators
4
+ class Atom < Thor::Group
5
+ argument :name
6
+ include Thor::Actions
7
+
8
+ def self.source_root
9
+ File.expand_path('../../templates', __FILE__)
10
+ end
11
+
12
+ def atom
13
+ template "atom.rb.tt", "models/atoms/#{name}.rb"
14
+ template "spec/atom_spec.rb.tt", "spec/atoms/#{name}_spec.rb"
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,18 @@
1
+ require 'thor'
2
+ require 'thor/group'
3
+ module Mddb::Generators
4
+ class Molecule < Thor::Group
5
+ argument :name
6
+ include Thor::Actions
7
+
8
+ def self.source_root
9
+ File.expand_path('../../templates', __FILE__)
10
+ end
11
+
12
+ def atom
13
+ template "molecule.rb.tt", "models/molecules/#{name}.rb"
14
+ template "spec/molecule_spec.rb.tt", "spec/molecules/#{name}_spec.rb"
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,23 @@
1
+ require 'mddb/calculations'
2
+ module Mddb
3
+ class Molecule
4
+ include MongoMapper::Document
5
+ include Mddb::Calculations
6
+ key :fid, Integer
7
+ key :mid, Integer
8
+ belongs_to :frame, :class_name => 'Mddb::Frame'
9
+ many :atoms, :class_name => 'Mddb::Atom'
10
+
11
+ def timeline
12
+ self.class.where(:mid => self.mid).all
13
+ end
14
+
15
+ def timestep n=0
16
+ if self.fid + n <= Frame.count and self.fid + n > 0
17
+ self.class.where(:mid => self.mid, :fid => (self.fid+n)).all
18
+ else
19
+ raise "Bad timestep. No frame exists or out of range"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ module Mddb
2
+ module Parser
3
+
4
+ class Parser
5
+ def initialize
6
+ @file = File.open(Mddb::Config.simulation['file']).readlines
7
+ @objects = Mddb::Config.simulation['count']
8
+ end
9
+
10
+ def each_frame
11
+ frame = nil
12
+ @file.each do |line|
13
+ if line == "#{@objects}\n"
14
+ yield(frame) if frame != nil
15
+ 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
+ end
23
+ end
24
+ end
25
+
26
+ end
27
+ end
28
+ end