diff options
Diffstat (limited to 'application.rb')
-rw-r--r-- | application.rb | 102 |
1 files changed, 92 insertions, 10 deletions
diff --git a/application.rb b/application.rb index 4cd247f..02b8978 100644 --- a/application.rb +++ b/application.rb @@ -12,6 +12,7 @@ class Application < Sinatra::Base set :root, File.dirname(__FILE__) # doc @ http://pubchem.ncbi.nlm.nih.gov/pug_rest/ + # doc @ http://pubchem.ncbi.nlm.nih.gov/pug_rest/PUG_REST.html PUG_URI = "http://pubchem.ncbi.nlm.nih.gov/rest/pug/" SIMILARITY_THRESHOLD = 90 MAX_NEIGHBORS = 100 @@ -116,6 +117,53 @@ class Application < Sinatra::Base end end + def csv_file type + case type + when "target" + out = "\"Target Name\";\"Target GeneID\";\"Assay IDs\"\n" + @assays.collect{|a| [a["Target Name"],a["Target GI"]]}.uniq.sort{|a,b| a[0] <=> b[0]}.each do |target| + out += "\"#{target.first}\";\"#{target.last}\";\"" + @assays.select{|a| a["Target GI"] == target.last}.collect{|assay| "http://pubchem.ncbi.nlm.nih.gov/assay/assay.cgi?aid=#{assay["AID"]}"}.join(", ") + "\"\n" + end + when "target_readacross" + out = "\"Target Name\";\"Target GeneID\";\"Assay ID\";\"p_active\";\"p_inactive\"\n" + @assays.sort{|a,b| [b["p_active"],b["p_inactive"]].max <=> [a["p_active"],a["p_inactive"]].max}.each do |assay| + out += "\"#{assay['Target Name']}\";\"#{assay['Target GI']}\";\"http://pubchem.ncbi.nlm.nih.gov/assay/assay.cgi?aid=#{assay['AID']}\";\"#{assay['p_active'].to_f.round(3)}\";\"#{assay['p_inactive'].to_f.round(3)}\"\n" + end + when "assays" + out = "\"Assay Name\";\"Assay ID\"\n" + @assays.sort{|a,b| a["Assay Name"] <=> b["Assay Name"]}.each do |assay| + out += "\"#{assay['Assay Name']}\";\"http://pubchem.ncbi.nlm.nih.gov/assay/assay.cgi?aid=#{assay['AID']}\"\n" + end + when "predicted_assays" + out = "\"Assay Name\";\"Assay ID\";\"p_active\";\"p_inactive\"\n" + @assays.sort{|a,b| [b["p_active"],b["p_inactive"]].max <=> [a["p_active"],a["p_inactive"]].max}.each do |assay| + out += "\"#{assay['Assay Name']}\";\"http://pubchem.ncbi.nlm.nih.gov/assay/assay.cgi?aid=#{assay['AID']}\";\"#{assay["p_active"].to_f.round(3)}\";\"#{assay["p_inactive"].to_f.round(3)}\"\n" + end + when "neighbors" + out = "\"Compound Name\";\"Similarity\"\n" + idx = 0 + while idx < 10 + neighbors(@cid).each do |n| + unless assays(n,"active").empty? and assays(n,"inactive").empty? + out += "\"#{name n}\";\"#{similarity(@cid,n).round(3)}\"\n" + idx += 1 + end + end + end + end + out + end + + def set_accept + case File.extname(params[:file]) + when ".csv" + @accept = "text/csv" + when ".json" + @accept = "application/json" + end + response['Content-Type'] = @accept + end + before '/pug/*' do content_type 'application/json' @result = CACHE.get request.path @@ -127,6 +175,7 @@ class Application < Sinatra::Base end before '/cid/:cid/*' do + @accept = request.env['HTTP_ACCEPT'] @cid = params[:cid] end @@ -156,28 +205,61 @@ class Application < Sinatra::Base end end - get '/cid/:cid/targets/:outcome' do + get '/cid/:cid/targets/:outcome/?:file?' do @assays = targets params[:cid], params[:outcome] - @assays and !@assays.empty? ? haml(:targets, :layout => false) : "<p><em>No PubChem data</em></p>" + set_accept if params[:file] + if @accept == "application/json" + @assays and !@assays.empty? ? JSON.pretty_generate(@assays) : "No PubChem data\n" + elsif @accept == "text/csv" + @assays and !@assays.empty? ? csv_file("target") : "No PubChem data\n" + else + @assays and !@assays.empty? ? haml(:targets, :layout => false) : "<p><em>No PubChem data</em></p>" + end end - get '/cid/:cid/assays/:outcome' do + get '/cid/:cid/assays/:outcome/?:file?' do @assays = assays(params[:cid], params[:outcome]) - targets(params[:cid], params[:outcome]) - @assays and !@assays.empty? ? haml(:assays, :layout => false) : "<p><em>No PubChem data</em></p>" + set_accept if params[:file] + if @accept == "application/json" + @assays and !@assays.empty? ? JSON.pretty_generate(@assays) : "No PubChem data\n" + elsif @accept == "text/csv" + @assays and !@assays.empty? ? csv_file("assays") : "No PubChem data\n" + else + @assays and !@assays.empty? ? haml(:assays, :layout => false) : "<p><em>No PubChem data</em></p>" + end end - get '/cid/:cid/prediction/assays/:outcome' do + get '/cid/:cid/prediction/assays/:outcome/?:file?' do @assays = predicted_assays(params[:cid], params[:outcome]) - predicted_targets(params[:cid], params[:outcome]) - @assays and !@assays.empty? ? haml(:predicted_assays, :layout => false) : "<p><em>Insufficient PubChem data for read across predictions.</em></p>" + set_accept if params[:file] + if @accept == "application/json" + @assays and !@assays.empty? ? JSON.pretty_generate(@assays) : "No PubChem data\n" + elsif @accept == "text/csv" + @assays and !@assays.empty? ? csv_file("predicted_assays") : "No PubChem data\n" + else + @assays and !@assays.empty? ? haml(:predicted_assays, :layout => false) : "<p><em>Insuffucient PubChem data for read across predictions.</em></p>" + end end - get '/cid/:cid/prediction/targets/:outcome' do + get '/cid/:cid/prediction/targets/:outcome/?:file?' do @assays = predicted_targets params[:cid], params[:outcome] - @assays and !@assays.empty? ? haml(:predicted_targets, :layout => false) : "<p><em>Insufficient PubChem data for read across predictions.</em></p>" + set_accept if params[:file] + if @accept == "application/json" + @assays and !@assays.empty? ? JSON.pretty_generate(@assays) : "No PubChem data\n" + elsif @accept == "text/csv" + @assays and !@assays.empty? ? csv_file("target_readacross") : "No PubChem data\n" + else + @assays and !@assays.empty? ? haml(:predicted_targets, :layout => false) : "<p><em>Insuffucient PubChem data for read across predictions.</em></p>" + end end - get '/cid/:cid/neighbors/?' do - haml :neighbors, :layout => false + get '/cid/:cid/neighbors/?:file?' do + set_accept if params[:file] + if @accept == "text/csv" + csv_file("neighbors") + else + haml :neighbors, :layout => false + end end get '/pug/cid/:cid/name' do |