2019-11-15 09:02:17 +00:00
|
|
|
# encoding: utf-8
|
|
|
|
require 'rubyXL'
|
|
|
|
class CancerpredictsController < ApplicationController
|
|
|
|
def initialize
|
|
|
|
super
|
|
|
|
@app_title = "cancerpredict"
|
|
|
|
end
|
2019-12-03 13:17:09 +00:00
|
|
|
def calculate
|
|
|
|
uid = OrbitHelper.params[:uid] rescue ""
|
|
|
|
tags = OrbitHelper.widget_tags
|
|
|
|
categories = OrbitHelper.widget_categories || []
|
2019-12-07 13:01:52 +00:00
|
|
|
create_first_field
|
2019-12-15 13:08:41 +00:00
|
|
|
#begin
|
|
|
|
if params['header'].to_i == 1
|
2020-01-12 05:14:58 +00:00
|
|
|
locale = params['locale'].to_s rescue 'zh_tw'
|
|
|
|
locale = 'zh_tw' if locale == 'zh_cn'
|
2019-12-15 13:08:41 +00:00
|
|
|
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
|
2019-12-28 10:54:28 +00:00
|
|
|
@head_images[@image.sort_number.to_i] = ('<img class="head_logo" alt ="' + Pathname.new(@image.temp_file.file.file).basename.to_s+'" src="'+@url+'"/>')
|
2019-12-15 13:08:41 +00:00
|
|
|
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
|
2019-12-28 10:54:28 +00:00
|
|
|
@head_images[@image.sort_number.to_i] = ('<img class="head_logo" alt ="' + Pathname.new(@image.temp_file.file.file).basename.to_s+'" src="'+@url+'"/>')
|
2019-12-15 13:08:41 +00:00
|
|
|
end
|
2020-01-12 05:14:58 +00:00
|
|
|
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]]
|
2019-12-03 13:17:09 +00:00
|
|
|
else
|
2019-12-15 13:08:41 +00:00
|
|
|
@record = Cancerpredictrecord.new
|
|
|
|
@record.title = @app_title
|
2019-12-27 05:49:20 +00:00
|
|
|
@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|
|
2019-12-15 13:08:41 +00:00
|
|
|
@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 = {}
|
2019-12-17 13:27:11 +00:00
|
|
|
result['age1'] = (params['data']['age'].to_f/100)**(0.5)
|
|
|
|
result['age2'] = ((params['data']['age'].to_f/100)**(0.5))*Math.log(params['data']['age'].to_f/100,Math.exp(1))
|
|
|
|
result['size1'] = Math.log(params['data']['size'].to_f/10,Math.exp(1))
|
2020-01-12 05:14:58 +00:00
|
|
|
if params['data']['lymph_nodes_examined'].to_i != 0
|
|
|
|
result['ratio'] = params['data']['lymph_nodes_positive'].to_f/params['data']['lymph_nodes_examined'].to_f rescue 0
|
|
|
|
else
|
|
|
|
result['ratio'] = 0
|
|
|
|
end
|
2019-12-21 15:50:17 +00:00
|
|
|
result['ratio'] = 1 if result['ratio'] > 1
|
|
|
|
result['nposit'] = ((result['ratio'].to_f+0.1)/0.1)**0.5
|
|
|
|
@T = ''
|
|
|
|
if params['data']['tumor_direct_extension'].to_i != 1
|
|
|
|
if params['data']['size'].to_i <= 20
|
|
|
|
@T = 'T1'
|
|
|
|
elsif params['data']['size'].to_i > 20 && params['data']['size'].to_i <= 50
|
|
|
|
@T = 'T2'
|
|
|
|
elsif params['data']['size'].to_i > 50
|
|
|
|
@T = 'T3'
|
|
|
|
end
|
|
|
|
else
|
|
|
|
@T = 'T4'
|
|
|
|
end
|
2020-01-12 05:14:58 +00:00
|
|
|
result['T'] = @T
|
2019-12-21 15:50:17 +00:00
|
|
|
@N = ''
|
|
|
|
if params['data']['lymph_nodes_positive'].to_i == 0
|
|
|
|
@N = 'N0'
|
|
|
|
elsif params['data']['lymph_nodes_positive'].to_i >= 1 && params['data']['lymph_nodes_positive'].to_i <= 3 && params['data']['micrometastasis'].to_i != 1
|
|
|
|
@N = 'N1'
|
|
|
|
elsif params['data']['lymph_nodes_positive'].to_i >= 1 && params['data']['lymph_nodes_positive'].to_i <= 3 && params['data']['micrometastasis'].to_i == 1
|
|
|
|
@N = 'N1mi'
|
|
|
|
elsif params['data']['lymph_nodes_positive'].to_i >= 4 && params['data']['lymph_nodes_positive'].to_i <= 9
|
|
|
|
@N = 'N2'
|
|
|
|
elsif params['data']['lymph_nodes_positive'].to_i >= 10
|
|
|
|
@N = 'N3'
|
|
|
|
end
|
2020-01-12 05:14:58 +00:00
|
|
|
result['N'] = @N
|
2019-12-21 15:50:17 +00:00
|
|
|
@M = ''
|
|
|
|
if params['data']['Distant_Metastasis'].to_i != 1
|
|
|
|
@M = 'M0'
|
|
|
|
else
|
|
|
|
@M = 'M1'
|
|
|
|
end
|
2020-01-12 05:14:58 +00:00
|
|
|
result['M'] = @M
|
2019-12-21 15:50:17 +00:00
|
|
|
if @M == 'M0'
|
|
|
|
if @T == 'T1' && (@N == 'N0' || @N == 'N1mi')
|
|
|
|
result['pstage'] = 1
|
|
|
|
elsif ((@T == 'T2' || @T == 'T3') && (@N == 'N0')) || ((@T == 'T1' || @T == 'T2') && (@N == 'N1'))
|
|
|
|
result['pstage'] = 2
|
|
|
|
elsif (@T == 'T4' && @N == 'N0') || ((@T == 'T3' || @T == 'T4') && @N == 'N1') || (@N == 'N2' || @N == 'N3')
|
|
|
|
result['pstage'] = 3
|
|
|
|
end
|
|
|
|
else
|
|
|
|
result['pstage'] = 4
|
|
|
|
end
|
|
|
|
if (params['data']['ER_status'].to_i != 2 || params['data']['PR_status'].to_i != 2) && (params['data']['HER2_status'].to_i != 1)
|
|
|
|
result['subtype'] = 1
|
2020-01-28 10:24:52 +00:00
|
|
|
elsif params['data']['HER2_status'].to_i == 1
|
2019-12-21 15:50:17 +00:00
|
|
|
result['subtype'] = 2
|
|
|
|
elsif params['data']['ER_status'].to_i == 2 && params['data']['PR_status'].to_i == 2 && (params['data']['HER2_status'].to_i != 1)
|
|
|
|
result['subtype'] = 3
|
|
|
|
end
|
2019-12-27 05:49:20 +00:00
|
|
|
if params['data']['grade'].to_i == 2 || params['data']['grade'].to_i == 4
|
2019-12-15 13:08:41 +00:00
|
|
|
result['grade_2'] = 1
|
|
|
|
else
|
|
|
|
result['grade_2'] = 0
|
|
|
|
end
|
|
|
|
if params['data']['grade'].to_i == 3
|
|
|
|
result['grade_3'] = 1
|
|
|
|
else
|
|
|
|
result['grade_3'] = 0
|
|
|
|
end
|
2019-12-21 15:50:17 +00:00
|
|
|
if result['subtype'].to_i == 2
|
2019-12-15 13:08:41 +00:00
|
|
|
result['subtype_HER2'] = 1
|
|
|
|
else
|
|
|
|
result['subtype_HER2'] = 0
|
|
|
|
end
|
2019-12-21 15:50:17 +00:00
|
|
|
if result['subtype'].to_i == 3
|
2019-12-15 13:08:41 +00:00
|
|
|
result['subtype_triple'] = 1
|
|
|
|
else
|
|
|
|
result['subtype_triple'] = 0
|
|
|
|
end
|
2019-12-21 15:50:17 +00:00
|
|
|
if result['pstage'].to_i == 2
|
2019-12-15 13:08:41 +00:00
|
|
|
result['pstage_2'] = 1
|
|
|
|
else
|
|
|
|
result['pstage_2'] = 0
|
|
|
|
end
|
2019-12-21 15:50:17 +00:00
|
|
|
if result['pstage'].to_i == 3
|
2019-12-15 13:08:41 +00:00
|
|
|
result['pstage_3'] = 1
|
|
|
|
else
|
|
|
|
result['pstage_3'] = 0
|
|
|
|
end
|
2019-12-21 15:50:17 +00:00
|
|
|
if result['pstage'].to_i == 4
|
2019-12-15 13:08:41 +00:00
|
|
|
result['pstage_4'] = 1
|
|
|
|
else
|
|
|
|
result['pstage_4'] = 0
|
|
|
|
end
|
|
|
|
if params['data']['lvi'].to_i == 1
|
|
|
|
result['lvi_yes'] = 1
|
|
|
|
else
|
|
|
|
result['lvi_yes'] = 0
|
|
|
|
end
|
2019-12-17 13:27:11 +00:00
|
|
|
result['lpv'] = ((result['age1']-0.7276655)*(-10.87)+(result['age2']+0.4540707)*8.968+(result['size1']-0.643632)*0.7678+(result['nposit']-1.346932)*0.5339+
|
2019-12-15 13:08:41 +00:00
|
|
|
result['grade_2']*0.4795+result['grade_3']*0.818+result['subtype_HER2']*0.1806+result['subtype_triple']*0.6457+result['pstage_2']*0.5311+
|
|
|
|
result['pstage_3']*1.134+result['pstage_4']*2.172+result['lvi_yes']*0.3321-0.04 rescue 'error')
|
2020-01-12 05:14:58 +00:00
|
|
|
@years = @form_to_show.years
|
|
|
|
result['table'] = '<input id="current_year" type="hidden" value="'+@years[-1].to_s+'" index="0"/><p id="cancer_table_texts">'+@form_to_show.table_above_texts[locale]+'</p>'
|
|
|
|
result['table'] += '<a style="display: inline-block;">第</a><a style="display: inline-block;">'
|
2019-12-15 13:08:41 +00:00
|
|
|
result['years'] = @years
|
2020-01-12 05:14:58 +00:00
|
|
|
@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;">年</a>'
|
2019-12-15 13:08:41 +00:00
|
|
|
@table_head = (locale == "zh_tw") ? ['治療','額外治療效益','總生存率(%)'] :['Treatment','Additional Benefit','Overall Survival(%)']
|
|
|
|
@head_name = ['Treatment','Additional_Benefit','Overall_Survival']
|
|
|
|
@therapy_choices = (locale == "zh_tw") ? ['純手術'] :['Surgery only']
|
|
|
|
@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>'
|
2019-12-07 13:01:52 +00:00
|
|
|
end
|
2020-01-12 05:14:58 +00:00
|
|
|
@texts = @form_to_show.text_above_texts[locale].gsub('<br/>','</span><br/><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
|
2019-12-21 15:50:17 +00:00
|
|
|
@lpv_calc = [-0.001476145,-0.01261639,-0.02519608]
|
2020-01-28 10:24:52 +00:00
|
|
|
@servive_ratio = ((Math.exp(@lpv_calc[-1])**(Math.exp(result['lpv'])))*100).round(2)
|
2020-01-12 05:14:58 +00:00
|
|
|
@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>'
|
|
|
|
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']
|
2019-12-15 13:08:41 +00:00
|
|
|
result['servive_ratio'] = @servive_ratio
|
2019-12-07 13:01:52 +00:00
|
|
|
end
|
2019-12-03 13:17:09 +00:00
|
|
|
result = result.merge(params)
|
|
|
|
render :json=> result
|
2019-12-15 13:08:41 +00:00
|
|
|
# rescue
|
|
|
|
# render :json=> params
|
|
|
|
#end
|
2019-12-03 13:17:09 +00:00
|
|
|
end
|
2019-11-15 09:02:17 +00:00
|
|
|
def index
|
|
|
|
uid = OrbitHelper.params[:uid] rescue ""
|
|
|
|
tags = OrbitHelper.widget_tags
|
|
|
|
categories = OrbitHelper.widget_categories || []
|
2020-01-28 10:24:52 +00:00
|
|
|
@table_str = File.read('public/cancer_tool_table_tmp_'+I18n.locale.to_s+'.txt')
|
2019-11-23 08:14:56 +00:00
|
|
|
{
|
|
|
|
"cancerpredict" => [],
|
|
|
|
"extras"=>{"table"=> @table_str}
|
|
|
|
}
|
2019-11-15 09:02:17 +00:00
|
|
|
end
|
|
|
|
def widget
|
|
|
|
uid = OrbitHelper.params[:uid] rescue ""
|
|
|
|
tags = OrbitHelper.widget_tags
|
|
|
|
categories = OrbitHelper.widget_categories || []
|
|
|
|
end
|
2019-11-23 08:14:56 +00:00
|
|
|
def create_first_field
|
|
|
|
if Cancerpredictfields.where("title"=>(@app_title + "_back")).take_while{true}.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).take_while{true}.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
|
2019-11-15 09:02:17 +00:00
|
|
|
end
|
|
|
|
end
|