Class: URBANopt::Scenario::ScenarioCSV

Inherits:
ScenarioBase show all
Defined in:
lib/urbanopt/scenario/scenario_csv.rb

Instance Attribute Summary collapse

Attributes inherited from ScenarioBase

#feature_file, #name, #root_dir, #run_dir

Instance Method Summary collapse

Methods inherited from ScenarioBase

#clear

Constructor Details

#initialize(name, root_dir, run_dir, feature_file, mapper_files_dir, csv_file, num_header_rows) ⇒ ScenarioCSV

ScenarioCSV is a ScenarioBase which assigns a Simulation Mapper to each Feature in a FeatureFile using a simple CSV format. The CSV file has three columns 1) feature_id, 2) feature_name, and 3) mapper_class_name. There is one row for each Feature.

parameters:
  • name - String - Human readable scenario name.

  • root_dir - String - Root directory for the scenario, contains Gemfile describing dependencies.

  • run_dir - String - Directory for simulation of this scenario, deleting run directory clears the scenario.

  • feature_file - URBANopt::Core::FeatureFile - FeatureFile containing features to simulate.

  • mapper_files_dir - String - Directory containing all mapper class files containing MapperBase definitions.

  • csv_file - String - Path to CSV file assigning a MapperBase class to each feature in feature_file.

  • num_header_rows - String - Number of header rows to skip in CSV file.



27
28
29
30
31
32
33
34
35
36
37
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 27

def initialize(name, root_dir, run_dir, feature_file, mapper_files_dir, csv_file, num_header_rows)
  super(name, root_dir, run_dir, feature_file)
  @root_dir = root_dir
  @mapper_files_dir = mapper_files_dir
  @csv_file = csv_file
  @num_header_rows = num_header_rows

  @@logger ||= URBANopt::Scenario.logger

  load_mapper_files
end

Instance Attribute Details

#csv_fileObject (readonly)

Path to CSV file



40
41
42
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 40

def csv_file
  @csv_file
end

#mapper_files_dirObject (readonly)

Directory containing all mapper class files



46
47
48
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 46

def mapper_files_dir
  @mapper_files_dir
end

#num_header_rowsObject (readonly)

Number of header rows to skip in CSV file



43
44
45
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 43

def num_header_rows
  @num_header_rows
end

Instance Method Details

#load_mapper_filesObject

Require all simulation mappers in mapper_files_dir



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 49

def load_mapper_files
  # loads default values from extension gem
  @options = OpenStudio::Extension::RunnerConfig.default_config(@root_dir)
  # check if runner.conf file exists
  if File.exist?(File.join(@root_dir, OpenStudio::Extension::RunnerConfig::FILENAME))
    runner_config = OpenStudio::Extension::RunnerConfig.new(@root_dir)
    # use the default values overridden with runner.conf values where not
    # nil nor empty strings
    @options = @options.merge(runner_config.options.reject { |k, v| v.nil? || (v.is_a?(String) && v === '') })
  end

  # bundle path is assigned from the runner.conf if it exists or is assigned in the root_dir
  # if bundle install path is not provided or is empty, it will be placed in root_dir/.bundle/install, otherwise use the provided path
  if !@options.key?(:bundle_install_path) || @options[:bundle_install_path] === ''
    @options[:bundle_install_path] = File.join(@root_dir, '.bundle/install/')
  else
    @options[:bundle_install_path] = Pathname.new(@options[:bundle_install_path]).cleanpath.to_s
  end
  bundle_path = @options[:bundle_install_path]

  puts "Bundle final path is set to: #{bundle_path}"

  # checks if bundle path doesn't exist or is empty
  if !Dir.exist?(bundle_path) || Dir.empty?(bundle_path)
    Bundler.with_unbundled_env do
      OpenStudio::Extension::Runner.new(@root_dir, [], @options)
    end
  end

  # find all lib dirs in the bundle path and add them to the path
  lib_dirs = Dir.glob(File.join(bundle_path, '/**/lib'))
  lib_dirs.each do |ld|
    # for now only add openstudio and urbanopt gems to the load path
    # and only those with 'urbanopt' or 'openstudio' in the before-last path position
    tmp_path_arr = Pathname(ld).each_filename.to_a
    if tmp_path_arr[-2].include?('urbanopt') || tmp_path_arr[-2].include?('openstudio')
      # puts "adding DIR to load path: #{ld}"
      $LOAD_PATH.unshift(ld)
    end
  end

  dirs = Dir.glob(File.join(@mapper_files_dir, '/*.rb'))

  dirs.each do |f|
    require(f)
  rescue LoadError => e
    @@logger.error(e.message)
    raise
  end
end

#simulation_dirsObject

Gets all the simulation directories



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 101

def simulation_dirs
  # DLM: TODO use HeaderConverters from CSV module

  rows_skipped = 0
  result = []
  CSV.foreach(@csv_file) do |row|
    if rows_skipped < @num_header_rows
      rows_skipped += 1
      next
    end

    break if row[0].nil?

    # gets +feature_id+ , +feature_name+ and +mapper_class+ from csv_file
    feature_id = row[0].chomp
    feature_name = row[1].chomp
    mapper_class = row[2].chomp

    # gets +features+ from the feature_file.
    features = []
    feature = feature_file.get_feature_by_id(feature_id)
    features << feature

    feature_names = []
    feature_names << feature_name

    simulation_dir = SimulationDirOSW.new(self, features, feature_names, mapper_class)

    result << simulation_dir
  end

  return result
end