230 lines
9.9 KiB
Ruby
230 lines
9.9 KiB
Ruby
# encoding: utf-8
|
|
require 'rubyXL'
|
|
class CancerpredictsController < ApplicationController
|
|
def initialize
|
|
super
|
|
@app_title = "cancerpredict"
|
|
end
|
|
def calculate
|
|
create_first_field
|
|
#begin
|
|
if params['header'].to_i == 1
|
|
locale = params['locale'].to_s rescue 'zh_tw'
|
|
locale = 'zh_tw' if locale == 'zh_cn'
|
|
result = {}
|
|
@head_images = {}
|
|
@form_to_show.head_images_id.each do |image_id|
|
|
next if image_id.to_s == ""
|
|
@image = Headimages.find_by(:id=>image_id.to_s)
|
|
@url = @image.temp_file.to_s
|
|
@head_images[@image.sort_number.to_i] = ('<img class="head_logo" alt ="' + Pathname.new(@image.temp_file.file.file).basename.to_s+'" src="'+@url+'"/>')
|
|
end
|
|
result['head_images'] = Hash[@head_images.sort].values.join('')
|
|
@head_images = {}
|
|
@form_to_show.title_images_id.each do |image_id|
|
|
next if image_id.to_s == ""
|
|
@image = Headimages.find_by(:id=>image_id.to_s)
|
|
@url = @image.temp_file.to_s
|
|
@head_images[@image.sort_number.to_i] = ('<img class="head_logo" alt ="' + Pathname.new(@image.temp_file.file.file).basename.to_s+'" src="'+@url+'"/>')
|
|
end
|
|
result['danger_texts'] = (@form_to_show.danger_texts[locale] rescue '')
|
|
result['title'] = Hash[@head_images.sort].values.join('')
|
|
result['page_title'] = @form_to_show.title_texts[params[:locale]]
|
|
elsif params['get_mapping_data_from_csv'].to_i == 1
|
|
result = {}
|
|
result['mapping_data_from_csv'] = YAML.load(@form_to_show.mapping_data_from_csv) rescue {}
|
|
else
|
|
@record = Cancerpredictrecord.new
|
|
@record.title = @app_title
|
|
@choice_keys = []
|
|
@choice_values = []
|
|
@choice_names = []
|
|
@form_to_show.form_show.values.each{|choice| @choice_keys.push choice[:variable]}
|
|
@form_to_show.form_show.values.each{|choice| @choice_values.push choice[:choice_fields]}
|
|
@form_to_show.form_show.values.each{|choice| @choice_names.push choice[:name]}
|
|
@choice_keys.each_with_index{|key,i| @record.names[key] = @choice_names[i]}
|
|
@choice_keys.each_with_index{|key,i| @record.values[key] = @choice_values[i]}
|
|
params['data'].each do |rec_key,rec_value|
|
|
@record.result[rec_key] = rec_value
|
|
end
|
|
@record.submit_time = Time.now.to_s
|
|
@record.save
|
|
locale = params['data']['locale'].to_s rescue 'zh_tw'
|
|
locale = 'zh_tw' if locale == 'zh_cn'
|
|
result = {}
|
|
# result['sex_value'] = params['data']['sex'].to_i - 1
|
|
# result['Age_value'] = params['data']['age'].to_i
|
|
# if params['data']['calcification_score'].to_i < 1400
|
|
# result['cal_value'] = 0
|
|
# else
|
|
# result['cal_value'] = 1
|
|
# end
|
|
mapping_data_from_csv = YAML.load(@form_to_show.mapping_data_from_csv) rescue {}
|
|
@form_to_show.form_show.each do |num,property|
|
|
@variable = property[:variable]
|
|
if @variable.present?
|
|
if property[:is_num] == 1
|
|
result[@variable] = params['data'][@variable].to_f rescue 0.0
|
|
elsif property[:choice_fields].present?
|
|
if property[:map_values].class == Array && property[:choice_fields].class == Array && property[:map_values].length == property[:choice_fields].length
|
|
result[@variable] = property[:map_values][params['data'][@variable].to_i - 1]
|
|
else
|
|
if property[:revert_value].to_i != 1
|
|
result[@variable] = params['data'][@variable].to_i - 1
|
|
else
|
|
result[@variable] = ((property[:choice_fields].length - params['data'][@variable].to_i) rescue params['data'][@variable].to_i)
|
|
end
|
|
end
|
|
end
|
|
if property[:cancer_predict_mapping_file].present?
|
|
if (mapping_data_from_csv != {})
|
|
mapping_hash = mapping_data_from_csv[@variable]
|
|
temp_index = 0
|
|
temp_value = result[@variable]
|
|
mapping_hash.each_with_index do |(k,v),i|
|
|
if i == 0
|
|
index_val = v.index(temp_value) rescue nil
|
|
if !index_val.nil?
|
|
temp_index = index_val
|
|
else
|
|
closest_value = v.min_by{|x| (temp_value-x).abs}
|
|
temp_index = v.index(closest_value)
|
|
end
|
|
end
|
|
result[k] = v[temp_index]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
#result['lpv'] = -0.51427548* (result['sex_value']- 0.508312) + 0.05764604* (result['Age_value'] - 61.894501) + 0.49138819*(result['cal_value'] - 0.334399) rescue 'error'
|
|
formula = @form_to_show.prediction_formula.gsub("\r\n"," ").gsub("^","**")
|
|
result.keys.each do |k|
|
|
formula = formula.gsub(/#{k}?(-|\+|\*|\s|\=)/){ "result[\"#{k}\"]#{$1}" }
|
|
end
|
|
formula_variables = formula.enum_for(:scan,/([^\=]*)?=/).map { Regexp.last_match[1] }.map{|s| s.strip.split(/(\s*|;\r\n)/).last}
|
|
|
|
@form_to_show.form_show.values.map{|p| p[:variable]}.each{ |k| formula = formula.gsub(/#{k}?(-|\+|\*|\s|\=)/,"result[\"#{k}\"#{$1}]") }
|
|
|
|
eval(formula)
|
|
result['lpv'] = eval(formula_variables.last)
|
|
result['lpv_variable'] = {}
|
|
formula_variables.each do |variable_name|
|
|
eval( "result['lpv_variable']['#{variable_name}'] = #{variable_name}" )
|
|
end
|
|
@years = @form_to_show.years
|
|
result['table'] = '<input id="current_year" type="hidden" value="'+@years[0].to_s+'" index="0"/><p id="cancer_table_texts">'+@form_to_show.table_above_texts[locale].to_s+'</p>'
|
|
result['table'] += ('<a style="display: inline-block;">'+(locale == 'zh_tw' ? '第' : '')+'</a><a style="display: inline-block;">')
|
|
result['years'] = @years
|
|
@years.each{|year| result['table'] += ('<button class="cancer_years cancer_table_btn btn btn-default btn-sm">'+year.to_s+'</button>')}
|
|
result['table'] += ('</a><a style="display: inline-block;">'+(locale == 'zh_tw' ? '年' : '')+'</a>')
|
|
#@head_name = ['Treatment','Additional_Benefit','Overall_Survival']
|
|
@head_name = ['Treatment','Overall_Survival']
|
|
@table_head = @head_name.map{|name| I18n.t('cancerpredict.table.'+name)}
|
|
@therapy_choices = [I18n.t('cancerpredict.table.Surgeryonly')]
|
|
@form_to_show.form_show_in_result.values.each{|choice| @therapy_choices.push choice["name"][locale]}
|
|
@therapy_names = ['Surgery_only']
|
|
@form_to_show.form_show_in_result.values.each{|choice| @therapy_names.push choice["variable"]}
|
|
result['treatmeny_method'] = @therapy_names
|
|
result['table'] += '<table><thead><tr>'
|
|
@table_head.each_with_index{|head,index| result['table'] += ('<th class="cancer_th '+@head_name[index]+'">' + head + '</th>')}
|
|
result['table'] += '</tr></thead><tbody>'
|
|
@therapy_choices.each_with_index do |choice,i|
|
|
result['table'] += '<tr class="'+@therapy_names[i].to_s+'">'
|
|
@table_head.each_with_index do |head,index|
|
|
result['table'] += ('<td class="cancer_td '+ @head_name[index]+'">' + ((index == 0) ? (((i==0)? '' : '+') + choice) : '-') + '</td>')
|
|
end
|
|
result['table'] += '</tr>'
|
|
end
|
|
@lpv_calc = [0.9736358,0.9548993,0.9229336]
|
|
year = params['data']['year'] rescue nil
|
|
if year.nil?
|
|
year = @years.first.to_f
|
|
else
|
|
year = year.to_f
|
|
end
|
|
year_index = @years.index(year)
|
|
#@servive_ratio = ((1-(@lpv_calc[0]**(Math.exp(result['lpv']))))*100).round(2) rescue 1
|
|
@servive_ratio = eval(@form_to_show.years_settings[year_index].gsub('^','**').gsub('exp','Math.exp'))
|
|
@servive_ratio = ((1 - @servive_ratio) * 100).round(2)
|
|
@texts = @form_to_show.text_above_texts[locale].to_s.gsub('<br/>','</span><br/><span>').gsub('{{Surgery_only}}','<span class="'+@therapy_names[0]+' Overall_Survival">'+@servive_ratio.round(2).to_s+'</span>')
|
|
@texts = @texts.split('{{years}}')
|
|
@texts.delete('')
|
|
result['texts'] = '<span>'+@texts[0]
|
|
@years.each{|year| result['texts'] += ('<button class="cancer_years cancer_table_btn btn btn-default btn-sm" style="float:none;">'+year.to_s+'</button>')}
|
|
if @texts.count > 1
|
|
result['texts'] += (@texts[1]+'</span>') if @texts.count > 1
|
|
else
|
|
result['texts'] += '</span>'
|
|
end
|
|
if !@form_to_show.surgery_only_texts[locale].blank?
|
|
@surgery_only_texts = @form_to_show.surgery_only_texts[locale]
|
|
@surgery_only_texts.insert(0,'<p class="show"><span>')
|
|
@surgery_only_texts = @surgery_only_texts.gsub('{{Surgery_only}}','<span class="'+@therapy_names[0]+' Overall_Survival">'+@servive_ratio.round.to_s+'</span><span>')
|
|
@surgery_only_texts = @surgery_only_texts.gsub('{{surgery_year}}','</span><span class="surgery_year">'+@years[-1].to_s+'</span><span>')
|
|
@surgery_only_texts += '</span>'
|
|
else
|
|
@surgery_only_texts = ''
|
|
end
|
|
result['texts'] += @surgery_only_texts
|
|
result['texts'] += '<span class="addition">'+@form_to_show.extra_texts[locale]+'</span><div class="extra-text" style="display:none;"><div class="texts_show" style="clear:both;"></div></div></p>'
|
|
result['extra_therapy_texts'] = @form_to_show.extra_therapy_texts[locale] rescue @form_to_show.extra_therapy_texts['zh_tw']
|
|
result['servive_ratio'] = @servive_ratio
|
|
end
|
|
result = result.merge(params)
|
|
render :json=> result
|
|
# rescue
|
|
# render :json=> params
|
|
#end
|
|
end
|
|
def index
|
|
uid = OrbitHelper.params[:uid] rescue ""
|
|
tags = OrbitHelper.widget_tags
|
|
categories = OrbitHelper.widget_categories || []
|
|
@table_str = File.read('public/cancer_tool_table_tmp_'+I18n.locale.to_s+'.txt')
|
|
{
|
|
"cancerpredict" => [],
|
|
"extras"=>{"table"=> @table_str}
|
|
}
|
|
end
|
|
def widget
|
|
uid = OrbitHelper.params[:uid] rescue ""
|
|
tags = OrbitHelper.widget_tags
|
|
categories = OrbitHelper.widget_categories || []
|
|
end
|
|
def create_first_field
|
|
if Cancerpredictfields.where("title"=>(@app_title + "_back")).count == 0
|
|
@form_to_show = Cancerpredictfields.new()
|
|
@form_to_show.title = @app_title +"_back"
|
|
@form_to_show.save
|
|
end
|
|
@form_to_show
|
|
if Cancerpredictfields.where("title"=>@app_title).count == 0
|
|
@form_to_show = Cancerpredictfields.new()
|
|
@form_to_show.title=@app_title
|
|
@form_to_show.save
|
|
@form_to_show = Cancerpredictfields.where("title"=>@app_title).first
|
|
else
|
|
@form_to_show = Cancerpredictfields.where("title"=>@app_title).first
|
|
end
|
|
end
|
|
def read_mapping_file(mapping_file)
|
|
if mapping_file.class != CancerPredictMappingFile
|
|
mapping_file = CancerPredictMappingFile.find(mapping_file_id) rescue nil
|
|
end
|
|
if !mapping_file.nil?
|
|
csv_rows = CSV.read(mapping_file.temp_file.file.path)
|
|
titles = csv_rows[0]
|
|
infos = {}
|
|
titles.each_with_index do |title,i|
|
|
infos[title] = []
|
|
csv_rows[1..-1].each do |row|
|
|
infos[title] << row[i].to_f
|
|
end
|
|
end
|
|
return infos
|
|
else
|
|
return {}
|
|
end
|
|
end
|
|
end |