From 1749c660a7e71f10bbdec04f8bf7bb77df3f3eef Mon Sep 17 00:00:00 2001 From: Zachary Sloan Date: Wed, 21 Nov 2012 17:54:13 -0600 Subject: Changed parser to allow for bother square brackets and parentheses Changed show_trait.coffee to get the stats table working again Still need to get stats table to work with changed values --- wqflask/wqflask/do_search.py | 6 +- wqflask/wqflask/parser.py | 40 +++++-- wqflask/wqflask/show_trait/show_trait.py | 16 +-- .../static/new/javascript/show_trait.coffee | 57 +++++---- .../wqflask/static/new/javascript/show_trait.js | 46 ++++---- .../wqflask/templates/show_trait_edit_data.html | 130 ++++++++++----------- 6 files changed, 167 insertions(+), 128 deletions(-) (limited to 'wqflask') diff --git a/wqflask/wqflask/do_search.py b/wqflask/wqflask/do_search.py index 61bfbaba..fd03f359 100644 --- a/wqflask/wqflask/do_search.py +++ b/wqflask/wqflask/do_search.py @@ -5,8 +5,12 @@ from __future__ import print_function, division from pprint import pformat as pf +import sys +sys.path.append("..") + from dbFunction import webqtlDatabaseFunction + class DoSearch(object): """Parent class containing parameters/functions used for all searches""" @@ -423,8 +427,6 @@ if __name__ == "__main__": import MySQLdb import sys - sys.path.append("/home/zas1024/gene/wqflask") - print("Path is:", sys.path) from base import webqtlConfig diff --git a/wqflask/wqflask/parser.py b/wqflask/wqflask/parser.py index 74343b8a..dc33fc52 100644 --- a/wqflask/wqflask/parser.py +++ b/wqflask/wqflask/parser.py @@ -1,12 +1,33 @@ +""" +Parses search terms input by user + +Searches take two primary forms: +- search term by itself (ex. "shh" or "brain") +- key / separator / value(s) (ex. "LRS=(9 99 Chr4 122 155)" or "GO:342533") + +In the example of "LRS=(9 99 Chr4 122 155)", the key is "LRS", the separator is "=" and the value +is everything within the parentheses. + +Both "=" and ":" can be used as separators; in the future, it would also be good to allow no +separator at all (ex. "cisLRS(9 999 10)") + +Both square brackets and parentheses can be used interchangeably. Both can also be used to +encapsulate a single value; "cisLRS=[9 999 10)" would +be acceptable.] + +""" + from __future__ import print_function, division import re from pprint import pformat as pf - def parse(pstring): - pstring = re.split(r"""(?:(\w+\s*=\s*\([^)]*\))|(\w+\s*[=:]\w+)|(\w+))""", pstring) + pstring = re.split(r"""(?:(\w+\s*=\s*[\(\[][^)]*[\)\]]) | # LRS=(1 2 3), cisLRS=[4 5 6], etc + (\w+\s*[=:]\w+) | # wiki=bar, GO:foobar, etc + (\w+)) # shh, brain, etc """, pstring, + flags=re.VERBOSE) pstring = [item.strip() for item in pstring if item and item.strip()] print(pstring) @@ -21,19 +42,12 @@ def parse(pstring): seperator = None if seperator: - if '(' in value: - assert value.startswith("("), "Invalid token" - assert value.endswith(")"), "Invalid token" + if '(' in value or '[' in value: + assert value.startswith(("(", "[")), "Invalid token" + assert value.endswith((")", "]")), "Invalid token" value = value[1:-1] # Get rid of the parenthesis values = re.split(r"""\s+|,""", value) value = [value.strip() for value in values if value.strip()] - # Brackets can also be used to encapsulate values - elif '[' in value: - assert value.startswith("["), "Invalid token" - assert value.endswith("]"), "Invalid token" - value = value[1:-1] # Get rid of the brackets - values = re.split(r"""\s+|,""", value) - value = [value.strip() for value in values if value.strip()] term = dict(key=key, seperator=seperator, search_term=value) @@ -47,6 +61,8 @@ def parse(pstring): return(items) if __name__ == '__main__': + parse("foo=[3 2 1]") + parse("foo=[3 2 1)") parse("foo=(3 2 1)") parse("shh") parse("shh grep") diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py index 86a0a992..19e67c43 100755 --- a/wqflask/wqflask/show_trait/show_trait.py +++ b/wqflask/wqflask/show_trait/show_trait.py @@ -159,9 +159,9 @@ class ShowTrait(templatePage): self.hddn = hddn self.sample_group_types = OrderedDict() - self.sample_group_types['primary_only'] = fd.RISet + " Only" - self.sample_group_types['other_only'] = "Non-" + fd.RISet - self.sample_group_types['all_cases'] = "All Cases" + self.sample_group_types['samples_primary'] = fd.RISet + " Only" + self.sample_group_types['samples_other'] = "Non-" + fd.RISet + self.sample_group_types['samples_all'] = "All Cases" sample_lists = [group.sample_list for group in self.sample_groups] print("sample_lists is:", pf(sample_lists)) js_data = dict(sample_group_types = self.sample_group_types, @@ -176,16 +176,16 @@ class ShowTrait(templatePage): #if traitInfos: # database, ProbeSetID, CellID = traitInfos #else: - database = self.fd['database'] - probe_set_id = self.fd['ProbeSetID'] + dataset = self.fd['dataset'] + trait_id = self.fd['trait_id'] cell_id = self.fd.get('CellID') - this_trait = webqtlTrait(db=database, name=probe_set_id, cellid=cell_id, cursor=self.cursor) + this_trait = webqtlTrait(db=dataset, name=trait_id, cellid=cell_id, cursor=self.cursor) ##identification, etc. - self.fd.identification = '%s : %s' % (this_trait.db.shortname, probe_set_id) + self.fd.identification = '%s : %s' % (this_trait.db.shortname, trait_id) this_trait.returnURL = webqtlConfig.CGIDIR + webqtlConfig.SCRIPTFILE + '?FormID=showDatabase&database=%s\ - &ProbeSetID=%s&RISet=%s&parentsf1=on' %(database, probe_set_id, self.fd['RISet']) + &ProbeSetID=%s&RISet=%s&parentsf1=on' %(dataset, trait_id, self.fd['RISet']) if cell_id: self.fd.identification = '%s/%s'%(self.fd.identification, cell_id) diff --git a/wqflask/wqflask/static/new/javascript/show_trait.coffee b/wqflask/wqflask/static/new/javascript/show_trait.coffee index 10671e78..6e22119f 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.coffee +++ b/wqflask/wqflask/static/new/javascript/show_trait.coffee @@ -26,45 +26,62 @@ $ -> current_value = parseFloat($(in_box)).toFixed(decimal_places) + console.log("urgh:", category, value_type) the_value = sample_sets[category][value_type]() + console.log("After running sample_sets, the_value is:", the_value) if decimal_places > 0 the_value = the_value.toFixed(decimal_places) + console.log("*-* the_value:", the_value) + console.log("*-* current_value:", current_value) if the_value != current_value $(id).html(the_value).effect("highlight") update_stat_values = (sample_sets)-> - for category in ['primary_only', 'other_only', 'all_cases'] + for category in ['samples_primary', 'samples_other', 'samples_all'] change_stats_value(sample_sets, category, "n_of_samples", 0) for stat in ["mean", "median", "std_dev", "std_error"] + console.log("Calling change_stats_value") change_stats_value(sample_sets, category, stat, 2) edit_data_change = -> sample_sets = - primary_only: new Stats([]) - other_only: new Stats([]) - all_cases: new Stats([]) + samples_primary: new Stats([]) + samples_other: new Stats([]) + samples_all: new Stats([]) console.log("at beginning:", sample_sets) - values = $('#value_table').find(".edit_sample_value") - for value in values - real_value = $(value).val() - row = $(value).closest("tr") - category = row[0].id - checkbox = $(row).find(".edit_sample_checkbox") - checked = $(checkbox).attr('checked') - - if checked and is_number(real_value) and real_value != "" - real_value = parseFloat(real_value) - if _(category).startsWith("Primary") - sample_sets.primary_only.add_value(real_value) - else if _(category).startsWith("Other") - sample_sets.other_only.add_value(real_value) - sample_sets.all_cases.add_value(real_value) + # ########## + # Bug here #value_table doesn't exist and why is it a class? + # ########## + + #values = $('.value_table').find(".edit_sample_value") + + + tables = ['samples_primary', 'samples_other'] + for table in tables + rows = $("#" + table).find('tr') + console.log("[fuji3] rows:", rows) + for row in rows + real_value = $(row).find('.edit_sample_value').val() + #row = $(value).closest("tr") + #category = row[0].id + console.log("real_value:", real_value) + checkbox = $(row).find(".edit_sample_checkbox") + checked = $(checkbox).attr('checked') + + if checked and is_number(real_value) and real_value != "" + console.log("in the iffy if") + real_value = parseFloat(real_value) + #if _(category).startsWith("Primary") + sample_sets[table].add_value(real_value) + #else if _(category).startsWith("Other") + # sample_sets.other_only.add_value(real_value) + sample_sets['samples_all'].add_value(real_value) console.log("towards end:", sample_sets) update_stat_values(sample_sets) - + make_table = -> header = " " diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js index db40b547..919bc766 100644 --- a/wqflask/wqflask/static/new/javascript/show_trait.js +++ b/wqflask/wqflask/static/new/javascript/show_trait.js @@ -32,17 +32,21 @@ console.log("the_id:", id); in_box = $(id).html; current_value = parseFloat($(in_box)).toFixed(decimal_places); + console.log("urgh:", category, value_type); the_value = sample_sets[category][value_type](); + console.log("After running sample_sets, the_value is:", the_value); if (decimal_places > 0) { the_value = the_value.toFixed(decimal_places); } + console.log("*-* the_value:", the_value); + console.log("*-* current_value:", current_value); if (the_value !== current_value) { return $(id).html(the_value).effect("highlight"); } }; update_stat_values = function(sample_sets) { var category, stat, _i, _len, _ref, _results; - _ref = ['primary_only', 'other_only', 'all_cases']; + _ref = ['samples_primary', 'samples_other', 'samples_all']; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { category = _ref[_i]; @@ -53,6 +57,7 @@ _results1 = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { stat = _ref1[_j]; + console.log("Calling change_stats_value"); _results1.push(change_stats_value(sample_sets, category, stat, 2)); } return _results1; @@ -61,29 +66,30 @@ return _results; }; edit_data_change = function() { - var category, checkbox, checked, real_value, row, sample_sets, value, values, _i, _len; + var checkbox, checked, real_value, row, rows, sample_sets, table, tables, _i, _j, _len, _len1; sample_sets = { - primary_only: new Stats([]), - other_only: new Stats([]), - all_cases: new Stats([]) + samples_primary: new Stats([]), + samples_other: new Stats([]), + samples_all: new Stats([]) }; console.log("at beginning:", sample_sets); - values = $('#value_table').find(".edit_sample_value"); - for (_i = 0, _len = values.length; _i < _len; _i++) { - value = values[_i]; - real_value = $(value).val(); - row = $(value).closest("tr"); - category = row[0].id; - checkbox = $(row).find(".edit_sample_checkbox"); - checked = $(checkbox).attr('checked'); - if (checked && is_number(real_value) && real_value !== "") { - real_value = parseFloat(real_value); - if (_(category).startsWith("Primary")) { - sample_sets.primary_only.add_value(real_value); - } else if (_(category).startsWith("Other")) { - sample_sets.other_only.add_value(real_value); + tables = ['samples_primary', 'samples_other']; + for (_i = 0, _len = tables.length; _i < _len; _i++) { + table = tables[_i]; + rows = $("#" + table).find('tr'); + console.log("[fuji3] rows:", rows); + for (_j = 0, _len1 = rows.length; _j < _len1; _j++) { + row = rows[_j]; + real_value = $(row).find('.edit_sample_value').val(); + console.log("real_value:", real_value); + checkbox = $(row).find(".edit_sample_checkbox"); + checked = $(checkbox).attr('checked'); + if (checked && is_number(real_value) && real_value !== "") { + console.log("in the iffy if"); + real_value = parseFloat(real_value); + sample_sets[table].add_value(real_value); + sample_sets['samples_all'].add_value(real_value); } - sample_sets.all_cases.add_value(real_value); } } console.log("towards end:", sample_sets); diff --git a/wqflask/wqflask/templates/show_trait_edit_data.html b/wqflask/wqflask/templates/show_trait_edit_data.html index ce1642d3..6c9b1073 100644 --- a/wqflask/wqflask/templates/show_trait_edit_data.html +++ b/wqflask/wqflask/templates/show_trait_edit_data.html @@ -82,78 +82,76 @@

{{ sample_type.header }}

-
- - - - - - - - {% if sample_type.se_exists() %} - - - - {% endif %} - - {% for attribute in sample_type.attributes|sort() %} - - {% endfor %} - - - {% for sample in sample_type.sample_list %} - - - - - - {# Todo: Add IDs #} - +
IndexSampleValue SE - {{ sample_type.attributes[attribute].name }} -
- {{ loop.index }} - - - - {{ sample.name }} - - - -
+ + + + + {% if sample_type.se_exists() %} - - - {# Todo: Add IDs #} - + + + {% endif %} - {# Loop through each attribute type and input value #} {% for attribute in sample_type.attributes|sort() %} - + {% endfor %} - - {% endfor %} - -
IndexSampleValue - ± - - -  SE - {{ sample.extra_attributes[sample_type.attributes[attribute].name] }} - + {{ sample_type.attributes[attribute].name }} +
-
+ + + {% for sample in sample_type.sample_list %} + + + {{ loop.index }} + + + + + + {{ sample.name }} + + + + {# Todo: Add IDs #} + + + + + {% if sample_type.se_exists() %} + + ± + + + {# Todo: Add IDs #} + + + + {% endif %} + + {# Loop through each attribute type and input value #} + {% for attribute in sample_type.attributes|sort() %} + + {{ sample.extra_attributes[sample_type.attributes[attribute].name] }} + + {% endfor %} + + {% endfor %} + +
{% endfor %} -- cgit v1.2.3