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.



62
63
64
65
66
67
68
69
70
71
72
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 62

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



75
76
77
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 75

def csv_file
  @csv_file
end

#mapper_files_dirObject (readonly)

Directory containing all mapper class files



81
82
83
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 81

def mapper_files_dir
  @mapper_files_dir
end

#num_header_rowsObject (readonly)

Number of header rows to skip in CSV file



78
79
80
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 78

def num_header_rows
  @num_header_rows
end

Instance Method Details

#load_mapper_filesObject

Require all simulation mappers in mapper_files_dir



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 84

def load_mapper_files

  # loads default values from extension gem
  options = OpenStudio::Extension::RunnerConfig.default_config
  # 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 overriden with runner.conf values
    options = options.merge(runner_config.options)
  end

  # bundle path is assigned from the runner.conf if it exists or is assigned in the root_dir
  bundle_path = !options.key?(:bundle_install_path) || options[:bundle_install_path] === '' ? File.join(@root_dir, '.bundle/install/') : options[:bundle_install_path]
  
  # checks if bundle path doesn't exist or is empty
  if !Dir.exists?(bundle_path) or Dir.empty?(bundle_path)
    # install bundle
    OpenStudio::Extension::Runner.new(@root_dir)
  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' or 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



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/urbanopt/scenario/scenario_csv.rb', line 128

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