lib/openstudio/analysis/translator/excel.rb in openstudio-analysis-0.3.2 vs lib/openstudio/analysis/translator/excel.rb in openstudio-analysis-0.3.3
- old
+ new
@@ -103,15 +103,17 @@
# verify that all continuous variables have all the data needed and create a name maps
variable_names = []
@variables['data'].each do |measure|
if measure['enabled']
measure['variables'].each do |variable|
+
+
# Determine if row is suppose to be an argument or a variable to be perturbed.
if variable['variable_type'] == 'variable'
variable_names << variable['display_name']
- # make sure that the variable has a static value
+ # make sure that variables have static values
if variable['distribution']['static_value'].nil? || variable['distribution']['static_value'] == ''
fail "Variable #{measure['name']}:#{variable['name']} needs a static value"
end
if variable['type'] == 'enum' || variable['type'] == 'Choice'
@@ -189,11 +191,11 @@
analysis_template = ERB.new(File.open("#{template_root}/analysis.json.erb", 'r').read)
workflow_template = ERB.new(File.open("#{template_root}/workflow_item.json.erb", 'r').read)
uncertain_variable_template = ERB.new(File.open("#{template_root}/uncertain_variable.json.erb", 'r').read)
discrete_uncertain_variable_template = ERB.new(File.open("#{template_root}/discrete_uncertain_variable.json.erb", 'r').read)
pivot_variable_template = ERB.new(File.open("#{template_root}/pivot_variable.json.erb", 'r').read)
- argument_template = ERB.new(File.open("#{template_root}/argument.json.erb", 'r').read)
+ argument_template = ERB.new(File.read("#{template_root}/argument.json.erb"))
# Templated analysis json file (this is what is returned)
puts "Analysis name is #{@name}"
openstudio_analysis_json = JSON.parse(analysis_template.result(get_binding))
@@ -345,45 +347,40 @@
# puts " Adding #{filename}"
zipfile.add("./weather/#{File.basename(filename)}", filename)
end
# Add only the measures that are defined in the spreadsheet
- added_measures = []
- measure_files = Dir.glob("#{@measure_path}/**/measure.rb")
+ required_measures = @variables['data'].map { |v| v['measure_file_name_directory'] if v['enabled'] }.compact.uniq
- # go through each of the Variables
- @variables['data'].each do |v|
- measure_to_save = nil
- measure_files.each do |measure|
- # pp v['measure_file_name_directory']
- if measure.include? "/#{v['measure_file_name_directory']}/"
- measure_to_save = File.dirname(measure)
- # pp "Measure to save is #{measure}"
- break
+ # first validate that all the measures exist
+ errors = []
+ required_measures.each do |measure|
+ measure_dir_to_add = "#{@measure_path}/#{measure}"
+
+ if Dir.exist? measure_dir_to_add
+ unless File.exist? "#{measure_dir_to_add}/measure.rb"
+ errors << "Measure in directory '#{@measure_path}/#{measure}' did not contain a measure.rb file"
end
+ else
+ errors << "Could not find measure '#{measure}' in directory '#{@measure_path}'"
end
+ end
+ fail errors.join("\n") unless errors.empty?
- if measure_to_save && !added_measures.include?(measure_to_save)
- # pp "Attempting to add measure #{measure_to_save}"
- if File.exist?(measure_to_save)
- # pp "Adding measure directory to zip #{measure_to_save}"
- Dir[File.join(measure_to_save, '**')].each do |file|
- if File.directory?(file)
- if File.basename(file) == 'resources' || File.basename(file) == 'lib'
- add_directory_to_zip(zipfile, file, "./measures/#{v['measure_file_name_directory']}/#{File.basename(file)}")
- else
- # pp "Skipping Directory #{File.basename(file)}"
- end
- else
- # pp "Adding File #{file}"
- # added_measures << measure_dir unless added_measures.include? measure_dir
- zipfile.add(file.sub(measure_to_save, "./measures/#{v['measure_file_name_directory']}/"), file)
- end
+ required_measures.each do |measure|
+ # pp "Adding measure directory to zip #{measure_to_save}"
+ Dir[File.join(measure, '**')].each do |file|
+ if File.directory?(file)
+ if File.basename(file) == 'resources' || File.basename(file) == 'lib'
+ add_directory_to_zip(zipfile, file, "./measures/#{v['measure_file_name_directory']}/#{File.basename(file)}")
+ else
+ # pp "Skipping Directory #{File.basename(file)}"
end
- added_measures << measure_to_save unless added_measures.include? measure_to_save
else
- fail "Could not find measure to add to zip for #{@measure_path}/#{v['measure_file_name_directory']}"
+ # pp "Adding File #{file}"
+ # added_measures << measure_dir unless added_measures.include? measure_dir
+ zipfile.add(file.sub(measure, "./measures/#{v['measure_file_name_directory']}/"), file)
end
end
end
# puts "Adding #{model[:path]}"
@@ -555,11 +552,11 @@
v.to_i if v % 1 == 0
@problem["#{row[0].snake_case}"] = v
end
elsif b_algorithm_setup
- if row[0]
+ if row[0] && !row[0].empty?
v = row[1]
v = v.to_i if v % 1 == 0
@algorithm["#{row[0].snake_case}"] = v
end
elsif b_weather_files
@@ -605,16 +602,17 @@
# If you add a new column and you want that variable in the hash, then you must add it here.
# rows = @xls.sheet('Variables').parse(:enabled => "# variable")
# puts rows.inspect
rows = nil
begin
- if @version >= '0.3.0'.to_version
+ if @version >= '0.3.3'.to_version
rows = @xls.sheet('Variables').parse(enabled: '# variable',
measure_name_or_var_type: 'type',
measure_file_name_or_var_display_name: 'parameter display name.*',
measure_file_name_directory: 'measure directory',
measure_type_or_parameter_name_in_measure: 'parameter name in measure',
+ display_name_short: 'parameter short display name',
#sampling_method: 'sampling method',
variable_type: 'Variable Type',
units: 'units',
default_value: 'static.default value',
enums: 'enumerations',
@@ -628,10 +626,33 @@
distribution: 'distribution',
source: 'data source',
notes: 'notes',
relation_to_eui: 'typical var to eui relationship',
clean: true)
+ elsif @version >= '0.3.0'.to_version
+ rows = @xls.sheet('Variables').parse(enabled: '# variable',
+ measure_name_or_var_type: 'type',
+ measure_file_name_or_var_display_name: 'parameter display name.*',
+ measure_file_name_directory: 'measure directory',
+ measure_type_or_parameter_name_in_measure: 'parameter name in measure',
+ #sampling_method: 'sampling method',
+ variable_type: 'Variable Type',
+ units: 'units',
+ default_value: 'static.default value',
+ enums: 'enumerations',
+ min: 'min',
+ max: 'max',
+ mode: 'mean|mode',
+ stddev: 'std dev',
+ delta_x: 'delta.x',
+ discrete_values: 'discrete values',
+ discrete_weights: 'discrete weights',
+ distribution: 'distribution',
+ source: 'data source',
+ notes: 'notes',
+ relation_to_eui: 'typical var to eui relationship',
+ clean: true)
elsif @version >= '0.2.0'.to_version
rows = @xls.sheet('Variables').parse(enabled: '# variable',
measure_name_or_var_type: 'type',
measure_file_name_or_var_display_name: 'parameter display name.*',
measure_file_name_directory: 'measure directory',
@@ -743,10 +764,13 @@
variable_index += 1
var = {}
var['variable_type'] = row[:measure_name_or_var_type]
var['display_name'] = row[:measure_file_name_or_var_display_name]
+ var['display_name_short'] = row[:display_name_short] ? row[:display_name_short] : var['display_name']
+
+ # TODO: convert this to measure class and parameter name
var['machine_name'] = row[:measure_file_name_or_var_display_name].downcase.strip.gsub('-', '_').gsub(' ', '_').strip
var['name'] = row[:measure_type_or_parameter_name_in_measure]
var['index'] = variable_index # order of the variable (not sure of its need)
var['type'] = row[:variable_type] ? row[:variable_type].downcase : row[:variable_type]
@@ -807,22 +831,35 @@
data
end
def parse_outputs
rows = nil
- if @version >= '0.3.0'.to_version
+ if @version >= '0.3.3'.to_version
rows = @xls.sheet('Outputs').parse(display_name: 'Variable Display Name',
+ display_name_short: 'Short Display Name',
metadata_id: 'Taxonomy Identifier',
name: '^Name$',
units: 'Units',
visualize: 'Visualize',
export: 'Export',
variable_type: 'Variable Type',
objective_function: 'Objective Function',
objective_function_target: 'Objective Function Target',
scaling_factor: 'Scale',
objective_function_group: 'Objective Function Group')
+ elsif @version >= '0.3.0'.to_version
+ rows = @xls.sheet('Outputs').parse(display_name: 'Variable Display Name',
+ metadata_id: 'Taxonomy Identifier',
+ name: '^Name$',
+ units: 'Units',
+ visualize: 'Visualize',
+ export: 'Export',
+ variable_type: 'Variable Type',
+ objective_function: 'Objective Function',
+ objective_function_target: 'Objective Function Target',
+ scaling_factor: 'Scale',
+ objective_function_group: 'Objective Function Group')
else
rows = @xls.sheet('Outputs').parse(display_name: 'Variable Display Name',
name: '^Name$',
units: 'units',
objective_function: 'objective function',
@@ -845,9 +882,10 @@
rows.each_with_index do |row, icnt|
next if icnt < 2 # skip the first 3 lines of the file
var = {}
var['display_name'] = row[:display_name]
+ var['display_name_short'] = row[:display_name_short] ? row[:display_name_short] : row[:display_name]
var['metadata_id'] = row[:metadata_id]
var['name'] = row[:name]
var['units'] = row[:units]
var['visualize'] = row[:visualize].downcase == 'true' ? true : false if row[:visualize]
var['export'] = row[:export].downcase == 'true' ? true : false if row[:export]