From fcb94479ed43c2eefda9a487f887c2629da813c7 Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 13 Jan 2017 15:04:46 +0000 Subject: update for version 1.0.0; added fingerprint model and prediction --- VERSION | 2 +- application.rb | 135 ++++++++++++++++++++++------------- nano-lazar.gemspec | 2 +- views/predict.haml | 194 ++++++++++++++++++++++++++++++++++++-------------- views/prediction.haml | 74 ++++++++++--------- 5 files changed, 268 insertions(+), 139 deletions(-) diff --git a/VERSION b/VERSION index 81340c7..3eefcb9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.4 +1.0.0 diff --git a/application.rb b/application.rb index baba620..3e7dfc2 100644 --- a/application.rb +++ b/application.rb @@ -5,6 +5,11 @@ $ambit_search = "http://data.enanomapper.net/substance?type=name&search=" include OpenTox +# collect nanoparticles from training dataset (Au + Ag) +dataset = Dataset.find_by(:name=> "Protein Corona Fingerprinting Predicts the Cellular Interaction of Gold and Silver Nanoparticles") +$nanoparticles = dataset.nanoparticles +$coating_list = $nanoparticles.collect{|n| n if !n.coating[0].smiles.nil?}.compact.uniq + configure :development do #$logger = Logger.new(STDOUT) end @@ -18,7 +23,7 @@ get '/?' do end #=begin get '/qmrf-report/:id' do - prediction_model = Model::NanoPrediction.find(params[:id]) + prediction_model = OpenTox::Model::Validation.find(params[:id]) if prediction_model model = prediction_model.model model_type = "regression" @@ -74,24 +79,35 @@ end #=end get '/predict/?' do @prediction_models = [] - prediction_models = Model::NanoPrediction.all - prediction_models.each{|m| m.model[:algorithms]["descriptors"]["categories"] == ["P-CHEM"] ? @prediction_models[0] = m : @prediction_models[1] = m} - # define type (pc or pcp) - @prediction_models.each_with_index{|m,idx| idx == 0 ? m[:pc_model] = true : m[:pcp_model] = true} - # collect nanoparticles by training dataset (Ag + Au) - dataset = Dataset.find_by(:name=> "Protein Corona Fingerprinting Predicts the Cellular Interaction of Gold and Silver Nanoparticles") - nanoparticles = dataset.nanoparticles + models = OpenTox::Model::Validation.all + prediction_models = models.delete_if{|m| m.model.name !~ /\b(Net cell association)\b/} + + # sort and collect prediction models + @prediction_models[0] = prediction_models.find{|m| m.model[:algorithms]["descriptors"]["method"] == "fingerprint"} + @prediction_models[1] = prediction_models.delete_if{|m| m.model[:algorithms]["descriptors"]["method"] == "fingerprint"}.find{|m| m.model[:algorithms]["descriptors"]["categories"][0] =~ /P-CHEM/} + @prediction_models[2] = prediction_models.find{|m| m.model[:algorithms]["descriptors"]["categories"][0] == "Proteomics"} + + # define type (fingerprint,physchem,proteomics) + @prediction_models[0]["type"] = "fingerprint" + @prediction_models[1]["type"] = "physchem" + @prediction_models[2]["type"] = "proteomics" + + # select relevant features for each model + @fingerprint_relevant_features = @prediction_models[0].model.substance_ids.collect{|id| Substance.find(id)} + fingerprint = $coating_list.sample + fingerprint.properties.delete_if{|id,v| !@fingerprint_relevant_features.include?(Feature.find(id))} + @example_fingerprint = fingerprint - # select physchem_parameters by relevant features for each model - @pc_relevant_features = @prediction_models[0].model.descriptor_ids.collect{|id, v| Feature.find(id)} - @pcp_relevant_features = @prediction_models[1].model.descriptor_ids.collect{|id, v| Feature.find(id)} - pcp = nanoparticles.sample - pcp.properties.delete_if{|id,v| !@pcp_relevant_features.include?(Feature.find(id))} - @example_pcp = pcp + @physchem_relevant_features = @prediction_models[1].model.descriptor_ids.collect{|id, v| Feature.find(id)} + physchem = $nanoparticles.sample + physchem.properties.delete_if{|id,v| !@physchem_relevant_features.include?(Feature.find(id))} + @example_physchem = physchem + + @proteomics_relevant_features = @prediction_models[2].model.descriptor_ids.collect{|id, v| Feature.find(id)} + proteomics = $nanoparticles.sample + proteomics.properties.delete_if{|id,v| !@proteomics_relevant_features.include?(Feature.find(id))} + @example_proteomics = proteomics - pc = nanoparticles.sample - pc.properties.delete_if{|id,v| !@pc_relevant_features.include?(Feature.find(id))} - @example_pc = pc haml :predict end @@ -102,50 +118,69 @@ get '/license' do end post '/predict/?' do - # choose the right prediction model - prediction_model = Model::NanoPrediction.find(params[:prediction_model]) + # select the prediction model + prediction_model = OpenTox::Model::Validation.find(params[:prediction_model]) size = params[:size].to_i @type = params[:type] - example_core = eval(params[:example_core]) - example_coating = eval(params[:example_coating]) + example_core = params[:example_core] + example_coating = params[:example_coating] example_pc = eval(params[:example_pc]) - - in_core = eval(params[:in_core]) - in_core["name"] = params[:input_core] - input_core = in_core - - in_coating = eval(params[:in_coating]) - in_coating[0]["name"] = params[:input_coating] - input_coating = in_coating + + input_core = params[:input_core] + input_coating = params[:input_coating] input_pc = {} - (1..size).each{|i| input_pc["#{params["input_key_#{i}"]}"] = [params["input_value_#{i}"].to_f] unless params["input_value_#{i}"] == "-"} - + if @type =~ /physchem|proteomics/ + (1..size).each{|i| input_pc["#{params["input_key_#{i}"]}"] = [params["input_value_#{i}"].to_f] unless params["input_value_#{i}"] == ""} + end # define relevant_features by input - @type = "pc" ? (@pc_relevant_features = input_pc.collect{|id,v| Feature.find(id)}) : (@pc_relevant_features = []) - @type = "pcp" ? (@pcp_relevant_features = input_pc.collect{|id,v| Feature.find(id)}) : (@pcp_relevant_features = []) - - if input_pc == example_pc && input_core == example_core && input_coating == example_coating - # unchanged input = database hit - nanoparticle = Nanoparticle.find_by(:id => params[:example_id]) - nanoparticle.properties = input_pc - @match = true - @nanoparticle = nanoparticle - @name = nanoparticle.name - else - # changed input = create nanoparticle to predict - nanoparticle = Nanoparticle.new - nanoparticle.core = input_core - nanoparticle.coating = input_coating - nanoparticle.properties = input_pc - @match = false - @nanoparticle = nanoparticle + (@type == "fingerprint") ? (@fingerprint_relevant_features = input_pc.collect{|id,v| Feature.find(id)}) : (@physchem_relevant_features = []) + (@type == "physchem") ? (@physchem_relevant_features = input_pc.collect{|id,v| Feature.find(id)}) : (@physchem_relevant_features = []) + (@type == "proteomics") ? (@proteomics_relevant_features = input_pc.collect{|id,v| Feature.find(id)}) : (@proteomics_relevant_features = []) + + + if @type =~ /physchem|proteomics/ + if input_pc == example_pc && input_core == example_core && input_coating == example_coating + # unchanged input = database hit + nanoparticle = Nanoparticle.find_by(:id => params[:example_id]) + nanoparticle.properties = input_pc + @match = true + @nanoparticle = nanoparticle + @name = nanoparticle.name + else + # changed input = create nanoparticle to predict + nanoparticle = Nanoparticle.new + nanoparticle.core_id = Compound.find_by(:name=>input_core).id.to_s + nanoparticle.coating_ids = [Compound.find_by(:name=>input_coating).id.to_s] + nanoparticle.properties = input_pc + @match = false + @nanoparticle = nanoparticle + end + end + + if @type == "fingerprint" + if input_core == example_core && input_coating == example_coating + # unchanged input = database hit + nanoparticle = Nanoparticle.find_by(:id => params[:example_id]) + #nanoparticle.properties = input_pc + @match = true + @nanoparticle = nanoparticle + @name = nanoparticle.name + else + # changed input = create nanoparticle to predict + nanoparticle = Nanoparticle.new + nanoparticle.core_id = Compound.find_by(:name=>input_core).id.to_s + nanoparticle.coating_ids = [Compound.find_by(:name=>input_coating).id.to_s] + @match = false + @nanoparticle = nanoparticle + end end + + # prediction output @input = input_pc @prediction = prediction_model.model.predict nanoparticle - haml :prediction end diff --git a/nano-lazar.gemspec b/nano-lazar.gemspec index f3ec373..e0153c3 100644 --- a/nano-lazar.gemspec +++ b/nano-lazar.gemspec @@ -20,7 +20,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency "rdiscount" s.add_runtime_dependency "haml" s.add_runtime_dependency "unicorn" - s.add_runtime_dependency "gem-path", "~> 0.6.1", '>= 0.6.1' + s.add_runtime_dependency "gem-path" s.post_install_message = %q{ How to build nano-lazar prediction models described over here: https://github.com/opentox/lazar-public-data . diff --git a/views/predict.haml b/views/predict.haml index 7819698..e54f8b4 100644 --- a/views/predict.haml +++ b/views/predict.haml @@ -3,6 +3,7 @@ $("img.circle").show(); }; + %div.well %h3.help-block Select an endpoint: @@ -11,10 +12,23 @@ - @prediction_models.each_with_index do |m, idx| %li{:class => ("active" if idx == 0)} %a{:href => "#model_#{idx}", :id => "linkTab#{idx}", data: {toggle:"tab"}} - = "#{idx+1}. #{m[:pcp_model] ? "Physchem & Proteomics" : "Physchem" }" + = "#{idx+1}. #{m["type"].capitalize}" %div.tab-content - @prediction_models.each_with_index do |m, idx| - - m[:pc_model] ? (example = @example_pc; type = "pc"; relevant_features = @pc_relevant_features) : (example = @example_pcp; type = "pcp"; relevant_features = @pcp_relevant_features) + - case m["type"] + - when "fingerprint" + - example = @example_fingerprint + - type = "fingerprint" + - relevant_features = @fingerprint_relevant_features + - when "physchem" + - example = @example_physchem + - type = "physchem" + - relevant_features = @physchem_relevant_features + - when "proteomics" + - example = @example_proteomics + - type = "proteomics" + - relevant_features = @proteomics_relevant_features + #model.tab-pane{:id=>"#{idx}", :class => ("active" if idx == 0)} %b Model: %br @@ -51,18 +65,16 @@ = m.model.algorithms["prediction"]["method"] %br Feature selection: - = m.model.algorithms["feature_selection"]["method"].split(".").last + = m.model.algorithms["feature_selection"]["method"].split(".").last if m.model.algorithms["feature_selection"] %br Descriptors: = m.model.algorithms["descriptors"]["method"]+"," = m.model.algorithms["descriptors"]["categories"] %p %b Independent crossvalidations (log2 transformed): - - crossvalidations =[] - - m.repeated_crossvalidation.crossvalidation_ids.each{|cv| c = OpenTox::Validation::CrossValidation.find(cv); crossvalidations << c} %div.row{:id=>"validations#{m.id}", :style=>"background-color:#f5f5f5;"} - - crossvalidations.each do |cv| - %span.col-xs-4.col-sm-4.col-md-4.col-lg-4 + - m.crossvalidations.each do |cv| + %span.col-xs-2.col-sm-2.col-md-2.col-lg-2 = "Num folds:\t" = cv.folds %br @@ -88,56 +100,132 @@ %form{:id=>idx, :role=>"form", :action=> to("/predict"), :method=>"post"} %h3.help-block Please characterise a nanoparticle: - #input - %div.form-group - // type pcp || pc - %input{:id=>"type",:type=>"hidden",:name=>"type",:value=>"#{type}"} - // example data to compare - %input{:id=>"example_core",:type=>"hidden",:name=>"example_core",:value=>"#{example.core}"} - %input{:id=>"example_coating",:type=>"hidden",:name=>"example_coating",:value=>"#{example.coating}"} - %input{:id=>"example_pc",:type=>"hidden",:name=>"example_pc",:value=>"#{example.properties}"} - - size = relevant_features.size - %input{:id=>"size",:type=>"hidden",:name=>"size",:value=>size} - %input{:id=>"id",:type=>"hidden",:name=>"example_id",:value=>example.id} + + - if type == "fingerprint" + + // core + %div.form-group + // type = fingerprint + // send hidden example data to compare + %input{:id=>"type",:type=>"hidden",:name=>"type",:value=>"#{type}"} + %input{:id=>"example_core",:type=>"hidden",:name=>"example_core",:value=>"#{example.core["name"]}"} + %input{:id=>"example_coating",:type=>"hidden",:name=>"example_coating",:value=>"#{example.coating[0]["name"]}"} + %input{:id=>"example_pc",:type=>"hidden",:name=>"example_pc",:value=>"#{example.properties}"} + - size = relevant_features.size + %input{:id=>"size",:type=>"hidden",:name=>"size",:value=>size} + %input{:id=>"id",:type=>"hidden",:name=>"example_id",:value=>example.id} + // input form parameters to transfer + // core %div.form-group %label{:for=>"selCore#{idx}"} Core - /%p= example.core["name"] %select.form-control{:id=>"selCore#{idx}", :autocomplete=>"off", :name=>"input_core",:value=>example.core["name"]} - %option{:selected => ("selected" if example.core["name"] == "Ag")} Ag - %option{:selected => ("selected" if example.core["name"] == "Au")} Au - %input{:id=>"input_core",:type=>"hidden",:name=>"in_core",:value=>"#{example.core}"} - //%h5 Coating - //%input.input-sm.form-control{:id=>"coating",:type=>"text",:disabled=>"disabled",:name=>"coating",:value=>example.coating[0]["name"]} - %input.input-sm.form-control{:id=>"coating",:type=>"hidden",:name=>"input_coating",:value=>example.coating[0]["name"]} - %input{:id=>"input_coating",:type=>"hidden",:name=>"in_coating",:value=>example.coating} - // prediction model id - %input{:id=>"prediction_model",:type=>"hidden",:name=>"prediction_model",:value=>m.id} - //sort the relevant features - - pc = relevant_features.collect{|f| f if f.category == "P-CHEM"}.compact - - pcp = relevant_features.collect{|f| f if f.category == "Proteomics"}.compact - - relevant_features = pc.sort_by{|f| f.name} + pcp.sort_by{|f| f.name} - - relevant_features.each_with_index do |relf,id| - - feature = relf - - v = example.properties.find{|id,v| id == feature.id.to_s } - - name = feature.name - - if feature[:conditions] && !feature[:conditions]["MEDIUM"].blank? - - name = feature.name + " / " + feature[:conditions]["MEDIUM"] - - else - - name = feature.name - - val = !v.nil? ? v[1] : "-" - - id = id + 1 - - if feature.category == "Proteomics" - %h5 - %a{:href=>"http://www.uniprot.org/uniprot/#{name}", :rel=>"external"}= name + (feature.unit.blank? ? "" : " (#{feature.unit})") - - if feature.category == "P-CHEM" - %h5 - %a.descriptor{:href=>$npo[feature.name], :rel=>"external"}= name + (feature.unit.blank? ? "" : " (#{feature.unit})") - // input physchem parameters - %input.input-sm.form-control{:id=>id,:type=>"text",:name=>"input_value_#{id}",:value=>"#{val[0] if val[0]}", :disabled=>("disabled" if val[0] == "-")} - - if val[0] == "-" - %input{:id=>id,:type=>"hidden",:name=>"input_value_#{id}",:value=>"-"} - %input{:id=>id,:type=>"hidden",:name=>"input_key_#{id}",:value=>feature.id} + %option{:selected => ("selected" if example.core["name"] == "Ag"), :value => "Ag"} Ag + %option{:selected => ("selected" if example.core["name"] == "Au"), :value => "Au"} Au + + // coating + %div.form-group + %label{:for=>"selCoating#{idx}"} Coating + %select.form-control{:id=>"selCoating#{idx}", :autocomplete=>"off", :name=>"input_coating",:value=>example.coating[0]["name"]} + - coatings = $coating_list.collect{|co| co.coating[0]["name"]}.uniq + - coatings.each do |co| + %option{:selected => ("selected" if example.coating[0]["name"] == co), :value => co} + = co + + - if type =~ /physchem/ + %div.form-group + // type = physchem,proteomics + // send hidden example data to compare + %input{:id=>"type",:type=>"hidden",:name=>"type",:value=>"#{type}"} + %input{:id=>"example_core",:type=>"hidden",:name=>"example_core",:value=>"#{example.core["name"]}"} + %input{:id=>"example_coating",:type=>"hidden",:name=>"example_coating",:value=>"#{example.coating[0]["name"]}"} + %input{:id=>"example_pc",:type=>"hidden",:name=>"example_pc",:value=>"#{example.properties}"} + - size = relevant_features.size + %input{:id=>"size",:type=>"hidden",:name=>"size",:value=>size} + %input{:id=>"id",:type=>"hidden",:name=>"example_id",:value=>example.id} + + // input form parameters to transfer + // core + %div.form-group + %label{:for=>"selCore#{idx}"} Core + %select.form-control{:id=>"selCore#{idx}", :autocomplete=>"off", :name=>"input_core",:value=>example.core["name"]} + //%option{:selected => "selected", :value => "-- select a core --", :style=>"display:none;"} + %option{:selected => ("selected" if example.core["name"] == "Ag"), :value => "Ag"} Ag + %option{:selected => ("selected" if example.core["name"] == "Au"), :value => "Au"} Au + //%option{:value => "Ag"} Ag + //%option{:value => "Au"} Au + + // coating + //%h5 Coating + //%input.input-sm.form-control{:id=>"coating",:type=>"text",:disabled=>"disabled",:name=>"coating",:value=>example.coating[0]["name"]} + %input.input-sm.form-control{:id=>"coating",:type=>"hidden",:name=>"input_coating",:value=>example.coating[0]["name"]} + + // relevant features + - relevant_features.sort_by{|f| f.name}.each_with_index do |relf,id| + - feature = relf + - v = example.properties.find{|id,v| id == feature.id.to_s } + - name = feature.name + - if feature[:conditions] && !feature[:conditions]["MEDIUM"].blank? + - name = feature.name + " / " + feature[:conditions]["MEDIUM"] + - else + - name = feature.name + - val = !v.nil? ? v[1] : "" + - id = id + 1 + + %h5 + %a.descriptor{:href=>$npo[feature.name], :rel=>"external"}= name + (feature.unit.blank? ? "" : " (#{feature.unit})") + + // input physchem parameters + %input.input-sm.form-control{:id=>"#{id}",:type=>"text",:name=>"input_value_#{id}",:value=>"#{val[0]}"} + %input{:id=>id,:type=>"hidden",:name=>"input_key_#{id}",:value=>feature.id} + + - if type =~ /proteomics/ + %div.form-group + // type = physchem,proteomics + // send hidden example data to compare + %input{:id=>"type",:type=>"hidden",:name=>"type",:value=>"#{type}"} + %input{:id=>"example_core",:type=>"hidden",:name=>"example_core",:value=>"#{example.core["name"]}"} + %input{:id=>"example_coating",:type=>"hidden",:name=>"example_coating",:value=>"#{example.coating[0]["name"]}"} + %input{:id=>"example_pc",:type=>"hidden",:name=>"example_pc",:value=>"#{example.properties}"} + - size = relevant_features.size + %input{:id=>"size",:type=>"hidden",:name=>"size",:value=>size} + %input{:id=>"id",:type=>"hidden",:name=>"example_id",:value=>example.id} + + // input form parameters to transfer + // core + %div.form-group + %label{:for=>"selCore#{idx}"} Core + %select.form-control{:id=>"selCore#{idx}", :autocomplete=>"off", :name=>"input_core",:value=>example.core["name"]} + %option{:selected => ("selected" if example.core["name"] == "Ag"), :value => "Ag"} Ag + %option{:selected => ("selected" if example.core["name"] == "Au"), :value => "Au"} Au + + // coating + //%h5 Coating + //%input.input-sm.form-control{:id=>"coating",:type=>"text",:disabled=>"disabled",:name=>"coating",:value=>example.coating[0]["name"]} + %input.input-sm.form-control{:id=>"coating",:type=>"hidden",:name=>"input_coating",:value=>example.coating[0]["name"]} + + // relevant features + - relevant_features.sort_by{|f| f.name}.each_with_index do |relf,id| + - feature = relf + - v = example.properties.find{|id,v| id == feature.id.to_s } + - name = feature.name + - if feature[:conditions] && !feature[:conditions]["MEDIUM"].blank? + - name = feature.name + " / " + feature[:conditions]["MEDIUM"] + - else + - name = feature.name + - val = !v.nil? ? v[1] : "" + - id = id + 1 + + %h5 + %a{:href=>"http://www.uniprot.org/uniprot/#{name}", :rel=>"external"}= name + (feature.unit.blank? ? "" : " (#{feature.unit})") + + // input physchem parameters + %input.input-sm.form-control{:id=>"#{id}",:type=>"text",:name=>"input_value_#{id}",:value=>"#{val[0]}"} + %input{:id=>id,:type=>"hidden",:name=>"input_key_#{id}",:value=>feature.id} + + // prediction model id + %input{:id=>"prediction_model",:type=>"hidden",:name=>"prediction_model",:value=>m.id} + %hr #predict %button.btn.btn-success{:id=>"submitbutton", :type=>"submit", :onclick=>"showcircle();"} diff --git a/views/prediction.haml b/views/prediction.haml index e451c5f..08fe4ba 100644 --- a/views/prediction.haml +++ b/views/prediction.haml @@ -43,15 +43,16 @@ Net cell association %br [mL/ug(Mg)] - - @input.each{|d| Feature.find(d[0]).category}.each do |key| - - feature = Feature.find_by(:id=>key[0]) - - name = feature.name - - if (feature[:conditions] && !feature[:conditions]["MEDIUM"].blank?) - - name = feature.name + " / " + feature[:conditions]["MEDIUM"] - - else + - if @type =~ /physchem|proteomics/ + - @input.each{|d| Feature.find(d[0]).category}.each do |key| + - feature = Feature.find_by(:id=>key[0]) - name = feature.name - %th.physchem.sorter-false - %a.descriptor{:href=>$npo[feature.name], :rel=>"external"}= name + (feature.unit.blank? ? "" : " (#{feature.unit})") + - if (feature[:conditions] && !feature[:conditions]["MEDIUM"].blank?) + - name = feature.name + " / " + feature[:conditions]["MEDIUM"] + - else + - name = feature.name + %th.physchem.sorter-false + %a.descriptor{:href=>$npo[feature.name], :rel=>"external"}= name + (feature.unit.blank? ? "" : " (#{feature.unit})") %tbody / query and match combined %tr.static @@ -70,20 +71,15 @@ %h5.th5 x / composition %td - - if @match - %h5.th5 Core: - %a{:href=>@nanoparticle[:core]["uri"], :rel=>"external"}= "["+@nanoparticle[:core]["name"]+"]" - /%br - /%h5.th5 Coating: - /= @nanoparticle[:coating][0]["name"] - /%br - - else - %h5.th5 Core: - = "["+@nanoparticle[:core]["name"]+"]" - /%br - /%h5.th5 Coating: - /= @nanoparticle[:coating][0]["name"] - /%br + - core = Substance.find @nanoparticle[:core_id] + %h5.th5 Core: + %a{:href=>core.source, :rel=>"external"}= "["+core.name+"]" + %br + - if @type == "fingerprint" + - coating = Substance.find @nanoparticle[:coating_ids][0] + %h5.th5 Coating: + %a{:href=>coating.source, :rel=>"external"}= coating.name + %br / tox %td.tox - if @prediction[:value] @@ -107,18 +103,21 @@ - if !@prediction[:value] && !@prediction[:measurements] %h5.th5 not available / physchem - - @input.each do |v| - %td.physchem - %div{:style=>"display:inline-block;padding-right:20px;"} - - if v[1].nil? - %p x - - else - %p= v[1][0].round(3) + - if @type =~ /physchem|proteomics/ + - @input.each do |v| + %td.physchem + %div{:style=>"display:inline-block;padding-right:20px;"} + - if v[1].nil? + %p x + - else + %p= v[1][0].round(3) / neighbors - if @prediction[:neighbors] - @prediction[:neighbors].each_with_index do |neighbor,idx| - nano = Nanoparticle.find(neighbor[:id]) + - core = Substance.find nano.core_id + - coating = Substance.find nano.coating_ids[0] %tr / ID %td @@ -130,15 +129,22 @@ / Composition %td %h5.th5 Core: - %a{:href=>nano[:core]["uri"], :rel=> "external"}= "["+nano[:core]["name"]+"]" + %a{:href=>core.source, :rel=> "external"}= "["+core.name+"]" %br %h5.th5 Coating: - %a{:href=>nano[:coating][0]["uri"], :rel=>"external"}= nano[:coating][0]["name"] + %a{:href=>coating.source, :rel=>"external"}= coating.name / Tox %td.tox %h5.th5 Measurement: = neighbor[:measurement] / Physchem - - nano.properties.delete_if{|id,v| @type == "pc" ? !@pc_relevant_features.include?(Feature.find(id)) : !@pcp_relevant_features.include?(Feature.find(id))}.sort_by{|id,v| @pc_relevant_features.index Feature.find(id)}.each do |k,v| - %td.physchem - = v[0].round(3) unless v.nil? + - case @type + - when "physchem" + - nano.properties.delete_if{|id,v| !@physchem_relevant_features.include?(Feature.find(id))}.sort_by{|id,v| @physchem_relevant_features.index Feature.find(id)}.each do |k,v| + %td.physchem + = v[0].round(3) unless v.nil? + - when "proteomics" + - nano.properties.delete_if{|id,v| !@proteomics_relevant_features.include?(Feature.find(id))}.sort_by{|id,v| @proteomics_relevant_features.index Feature.find(id)}.each do |k,v| + %td.physchem + = v[0].round(3) unless v.nil? + -- cgit v1.2.3