From f9bb77224092c38b8a14c9bca1044dcb843bcbae Mon Sep 17 00:00:00 2001 From: zsloan Date: Wed, 17 Mar 2021 21:03:17 +0000 Subject: Added URL as second value for RRID case attributes, so it can be displayed in the trait page sample table --- wqflask/wqflask/show_trait/SampleList.py | 13 +++++++++++-- wqflask/wqflask/show_trait/show_trait.py | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/wqflask/wqflask/show_trait/SampleList.py b/wqflask/wqflask/show_trait/SampleList.py index ece485ae..6017f895 100644 --- a/wqflask/wqflask/show_trait/SampleList.py +++ b/wqflask/wqflask/show_trait/SampleList.py @@ -2,13 +2,12 @@ import re import itertools from flask import g -from base import webqtlCaseData +from base import webqtlCaseData, webqtlConfig from pprint import pformat as pf from utility import Plot from utility import Bunch - class SampleList(object): def __init__(self, dataset, @@ -70,6 +69,16 @@ class SampleList(object): sample.extra_attributes = self.sample_attribute_values.get( sample_name, {}) + #ZS: Add a url so RRID case attributes can be displayed as links + if 'rrid' in sample.extra_attributes: + if len(sample.extra_attributes['rrid'].split(":")) > 1: + the_rrid = sample.extra_attributes['rrid'].split(":")[1] + sample.extra_attributes['rrid'] = [sample.extra_attributes['rrid']] + if self.dataset.group.species == "mouse": + sample.extra_attributes['rrid'].append(webqtlConfig.RRID_MOUSE_URL % the_rrid) + elif self.dataset.group.species == "rat": + sample.extra_attributes['rrid'].append(webqtlConfig.RRID_RAT_URL % the_rrid) + self.sample_list.append(sample) self.se_exists = any(sample.variance for sample in self.sample_list) diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py index cf3accaa..878c41c0 100644 --- a/wqflask/wqflask/show_trait/show_trait.py +++ b/wqflask/wqflask/show_trait/show_trait.py @@ -269,6 +269,7 @@ class ShowTrait(object): short_description = short_description, unit_type = trait_units, dataset_type = self.dataset.type, + species = self.dataset.group.species, scales_in_geno = self.scales_in_geno, data_scale = self.dataset.data_scale, sample_group_types = self.sample_group_types, -- cgit v1.2.3 From 025811e559a1e6b1f04cd45f4f69a53fa7bbb379 Mon Sep 17 00:00:00 2001 From: zsloan Date: Wed, 17 Mar 2021 21:04:37 +0000 Subject: Added a check for if there's a second value for case attributes, for situations where a case attribute also has a link --- wqflask/wqflask/static/new/javascript/initialize_show_trait_tables.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wqflask/wqflask/static/new/javascript/initialize_show_trait_tables.js b/wqflask/wqflask/static/new/javascript/initialize_show_trait_tables.js index 06e33878..05e4d547 100644 --- a/wqflask/wqflask/static/new/javascript/initialize_show_trait_tables.js +++ b/wqflask/wqflask/static/new/javascript/initialize_show_trait_tables.js @@ -104,7 +104,11 @@ build_columns = function() { attr_name = Object.keys(data.extra_attributes).sort()[meta.col - data.first_attr_col] if (attr_name != null && attr_name != undefined){ + if (Array.isArray(data.extra_attributes[attr_name])){ + return '' + data.extra_attributes[attr_name][0] + '' + } else { return data.extra_attributes[attr_name] + } } else { return "" } -- cgit v1.2.3 From 2eda56348a97abaf61760c732dcc2032232f00aa Mon Sep 17 00:00:00 2001 From: zsloan Date: Wed, 17 Mar 2021 21:33:06 +0000 Subject: Fixed the logic for creating the RRID links to account for the fact that the rat IDs don't have any prefix with a colon --- wqflask/wqflask/show_trait/SampleList.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/wqflask/wqflask/show_trait/SampleList.py b/wqflask/wqflask/show_trait/SampleList.py index 6017f895..112298a1 100644 --- a/wqflask/wqflask/show_trait/SampleList.py +++ b/wqflask/wqflask/show_trait/SampleList.py @@ -71,12 +71,15 @@ class SampleList(object): #ZS: Add a url so RRID case attributes can be displayed as links if 'rrid' in sample.extra_attributes: - if len(sample.extra_attributes['rrid'].split(":")) > 1: - the_rrid = sample.extra_attributes['rrid'].split(":")[1] - sample.extra_attributes['rrid'] = [sample.extra_attributes['rrid']] - if self.dataset.group.species == "mouse": + if self.dataset.group.species == "mouse": + if len(sample.extra_attributes['rrid'].split(":")) > 1: + the_rrid = sample.extra_attributes['rrid'].split(":")[1] + sample.extra_attributes['rrid'] = [sample.extra_attributes['rrid']] sample.extra_attributes['rrid'].append(webqtlConfig.RRID_MOUSE_URL % the_rrid) - elif self.dataset.group.species == "rat": + elif self.dataset.group.species == "rat": + if len(str(sample.extra_attributes['rrid'])): + the_rrid = sample.extra_attributes['rrid'] + sample.extra_attributes['rrid'] = [sample.extra_attributes['rrid']] sample.extra_attributes['rrid'].append(webqtlConfig.RRID_RAT_URL % the_rrid) self.sample_list.append(sample) -- cgit v1.2.3 From 7433bd00b492859e5fc9daeec2c8ba56bfaed495 Mon Sep 17 00:00:00 2001 From: zsloan Date: Wed, 17 Mar 2021 21:34:20 +0000 Subject: Added the RRID urls for mouse and rat to webqtlConfig --- wqflask/base/webqtlConfig.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wqflask/base/webqtlConfig.py b/wqflask/base/webqtlConfig.py index aee8616a..bb8704a5 100644 --- a/wqflask/base/webqtlConfig.py +++ b/wqflask/base/webqtlConfig.py @@ -63,6 +63,8 @@ OPEN_TARGETS_URL = "https://genetics.opentargets.org/gene/%s" UNIPROT_URL = "https://www.uniprot.org/uniprot/%s" RGD_URL = "https://rgd.mcw.edu/rgdweb/elasticResults.html?term=%s&category=Gene&species=%s" PHENOGEN_URL = "https://phenogen.org/gene.jsp?speciesCB=Rn&auto=Y&geneTxt=%s&genomeVer=rn6§ion=geneEQTL" +RRID_MOUSE_URL = "https://www.jax.org/strain/%s" +RRID_RAT_URL = "https://rgd.mcw.edu/rgdweb/report/strain/main.html?id=%s" # Temporary storage (note that this TMPDIR can be set as an # environment variable - use utility.tools.TEMPDIR when you -- cgit v1.2.3 From ed863c84162bddcb97e82d96538055cae11d560b Mon Sep 17 00:00:00 2001 From: zsloan Date: Fri, 19 Mar 2021 17:27:59 +0000 Subject: Added other BXD individual groups to the list of BXD groups used when drawing the Gene Band --- wqflask/wqflask/marker_regression/display_mapping_results.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wqflask/wqflask/marker_regression/display_mapping_results.py b/wqflask/wqflask/marker_regression/display_mapping_results.py index 7e9deb9e..6a5fe2f6 100644 --- a/wqflask/wqflask/marker_regression/display_mapping_results.py +++ b/wqflask/wqflask/marker_regression/display_mapping_results.py @@ -518,7 +518,7 @@ class DisplayMappingResults(object): RISet = self.dataset.group.name if RISet in ('AXB', 'BXA', 'AXBXA'): self.diffCol = ['B6J', 'A/J'] - elif RISet in ('BXD', 'BXD300', 'B6D2F2', 'BDF2-2005', 'BDF2-1999', 'BHHBF2', 'BXD-Harvested'): + elif RISet in ('BXD', 'BXD300', 'B6D2F2', 'BDF2-2005', 'BDF2-1999', 'BHHBF2', 'BXD-Harvested', 'BXD-Longevity', 'BXD-AE', 'B6D2RI', 'BXD-Bone', 'DOD-BXD-GWI', 'BXD-Heart-Metals', 'UTHSC-Cannabinoid'): self.diffCol = ['B6J', 'D2J'] elif RISet in ('CXB'): self.diffCol = ['CBY', 'B6J'] -- cgit v1.2.3 From 0daaa41adafdfbfed10c0dca27ef5eef008441da Mon Sep 17 00:00:00 2001 From: zsloan Date: Fri, 26 Mar 2021 19:41:25 +0000 Subject: Added try/except to deal with the possibility of user_id being stored in Redis as both string and bytes --- wqflask/wqflask/user_session.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wqflask/wqflask/user_session.py b/wqflask/wqflask/user_session.py index d6f3b3fc..c5a577df 100644 --- a/wqflask/wqflask/user_session.py +++ b/wqflask/wqflask/user_session.py @@ -129,7 +129,10 @@ class UserSession(object): if b'user_id' not in self.record: self.record[b'user_id'] = str(uuid.uuid4()) - return self.record[b'user_id'] + try: + return self.record[b'user_id'].decode("utf-8") + except: + return self.record[b'user_id'] @property def redis_user_id(self): -- cgit v1.2.3 From c079bdd969b4e5f18815fad7c9939edab3522866 Mon Sep 17 00:00:00 2001 From: zsloan Date: Fri, 26 Mar 2021 19:43:47 +0000 Subject: Split rat RRID by _ in order to pull out just the ID number, since the number is needed for the links --- wqflask/wqflask/show_trait/SampleList.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wqflask/wqflask/show_trait/SampleList.py b/wqflask/wqflask/show_trait/SampleList.py index 112298a1..857e4456 100644 --- a/wqflask/wqflask/show_trait/SampleList.py +++ b/wqflask/wqflask/show_trait/SampleList.py @@ -78,7 +78,7 @@ class SampleList(object): sample.extra_attributes['rrid'].append(webqtlConfig.RRID_MOUSE_URL % the_rrid) elif self.dataset.group.species == "rat": if len(str(sample.extra_attributes['rrid'])): - the_rrid = sample.extra_attributes['rrid'] + the_rrid = sample.extra_attributes['rrid'].split("_")[1] sample.extra_attributes['rrid'] = [sample.extra_attributes['rrid']] sample.extra_attributes['rrid'].append(webqtlConfig.RRID_RAT_URL % the_rrid) -- cgit v1.2.3 From 19f91de0a78b1805b00b8345523c62c7fee31223 Mon Sep 17 00:00:00 2001 From: zsloan Date: Mon, 29 Mar 2021 19:59:59 +0000 Subject: Check if a trait in a collection is a properly structured string to avoid an error caused by an empty string be stored in a collection's trait list --- wqflask/wqflask/collect.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wqflask/wqflask/collect.py b/wqflask/wqflask/collect.py index e074a3d8..0291f2b8 100644 --- a/wqflask/wqflask/collect.py +++ b/wqflask/wqflask/collect.py @@ -191,6 +191,8 @@ def view_collection(): json_version = [] for atrait in traits: + if ':' not in atrait: + continue name, dataset_name = atrait.split(':') if dataset_name == "Temp": group = name.split("_")[2] -- cgit v1.2.3 From 0a6b9ec767a12bedeb892f400e6b04bbd6160673 Mon Sep 17 00:00:00 2001 From: zsloan Date: Mon, 29 Mar 2021 22:00:44 +0000 Subject: Changed minimum num_overlap to 2, since there apparently need to be that many shared samples torun scipy.stats.pearsonr/spearmanr --- wqflask/wqflask/network_graph/network_graph.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wqflask/wqflask/network_graph/network_graph.py b/wqflask/wqflask/network_graph/network_graph.py index 723a749f..1d5316a2 100644 --- a/wqflask/wqflask/network_graph/network_graph.py +++ b/wqflask/wqflask/network_graph/network_graph.py @@ -99,7 +99,7 @@ class NetworkGraph(object): if num_overlap < self.lowest_overlap: self.lowest_overlap = num_overlap - if num_overlap == 0: + if num_overlap < 2: continue else: pearson_r, pearson_p = scipy.stats.pearsonr( -- cgit v1.2.3 From 6a5576bb1271060c703871aedf16360847c68f8b Mon Sep 17 00:00:00 2001 From: zsloan Date: Tue, 30 Mar 2021 17:14:46 +0000 Subject: Shifted the 'try' in a try/except up some to account for a possible error with calculating PCA that I don't know the cause of yet --- wqflask/wqflask/correlation_matrix/show_corr_matrix.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py index a77877d2..a67ea9f4 100644 --- a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py +++ b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py @@ -150,14 +150,14 @@ class CorrelationMatrix(object): this_trait_vals.append(sample_value) self.trait_data_array.append(this_trait_vals) - corr_result_eigen = np.linalg.eig(np.array(self.pca_corr_results)) - corr_eigen_value, corr_eigen_vectors = sortEigenVectors(corr_result_eigen) + try: + corr_result_eigen = np.linalg.eig(np.array(self.pca_corr_results)) + corr_eigen_value, corr_eigen_vectors = sortEigenVectors(corr_result_eigen) - groups = [] - for sample in self.all_sample_list: - groups.append(1) + groups = [] + for sample in self.all_sample_list: + groups.append(1) - try: if self.do_PCA == True: self.pca_works = "True" self.pca_trait_ids = [] -- cgit v1.2.3 From ef51e08753defdfc7f3e67f8788cd1362d2cf631 Mon Sep 17 00:00:00 2001 From: zsloan Date: Tue, 30 Mar 2021 18:29:56 +0000 Subject: Shifted some code out of the try/except that shouldn't have been inside it --- wqflask/wqflask/correlation_matrix/show_corr_matrix.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py index a67ea9f4..f77761d8 100644 --- a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py +++ b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py @@ -150,14 +150,14 @@ class CorrelationMatrix(object): this_trait_vals.append(sample_value) self.trait_data_array.append(this_trait_vals) + groups = [] + for sample in self.all_sample_list: + groups.append(1) + try: corr_result_eigen = np.linalg.eig(np.array(self.pca_corr_results)) corr_eigen_value, corr_eigen_vectors = sortEigenVectors(corr_result_eigen) - groups = [] - for sample in self.all_sample_list: - groups.append(1) - if self.do_PCA == True: self.pca_works = "True" self.pca_trait_ids = [] -- cgit v1.2.3 From e7b589f05e1c13612ea2f7245d66cc3f054fa14b Mon Sep 17 00:00:00 2001 From: zsloan Date: Fri, 9 Apr 2021 17:40:53 +0000 Subject: Added varaiable 'categorical_attr_exists' tracking whether there are any case attributes with fewer than 10 distinct values, since it currently throws a JS error if case attributes exist but none have fewer than 10 distinct values (specifically when we have RRID as a case attribute) --- wqflask/wqflask/show_trait/show_trait.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py index 878c41c0..d3267190 100644 --- a/wqflask/wqflask/show_trait/show_trait.py +++ b/wqflask/wqflask/show_trait/show_trait.py @@ -203,6 +203,13 @@ class ShowTrait(object): if sample.value < 0: self.negative_vals_exist = "true" + #ZS: Check whether any attributes have few enough distinct values to show the "Block samples by group" option + self.categorical_attr_exists = False + for attribute in self.sample_groups[0].attributes: + if len(self.sample_groups[0].attributes[attribute].distinct_values) <= 10: + self.categorical_attr_exists = True + break + sample_column_width = max_samplename_width * 8 self.stats_table_width, self.trait_table_width = get_table_widths(self.sample_groups, sample_column_width, self.has_num_cases) @@ -277,6 +284,7 @@ class ShowTrait(object): se_exists = self.sample_groups[0].se_exists, has_num_cases = self.has_num_cases, attributes = self.sample_groups[0].attributes, + categorical_attr_exists = self.categorical_attr_exists, categorical_vars = ",".join(categorical_var_list), num_values = self.num_values, qnorm_values = self.qnorm_vals, -- cgit v1.2.3 From 9d7da4653c8b0241af712043bb375e3f2bc52a3f Mon Sep 17 00:00:00 2001 From: zsloan Date: Fri, 9 Apr 2021 17:43:30 +0000 Subject: Store categorical_attr_exists as a string instead of boolean since apparently the boolean doesn't get passed to the template properly --- wqflask/wqflask/show_trait/show_trait.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py index d3267190..6892f02b 100644 --- a/wqflask/wqflask/show_trait/show_trait.py +++ b/wqflask/wqflask/show_trait/show_trait.py @@ -204,10 +204,10 @@ class ShowTrait(object): self.negative_vals_exist = "true" #ZS: Check whether any attributes have few enough distinct values to show the "Block samples by group" option - self.categorical_attr_exists = False + self.categorical_attr_exists = "false" for attribute in self.sample_groups[0].attributes: if len(self.sample_groups[0].attributes[attribute].distinct_values) <= 10: - self.categorical_attr_exists = True + self.categorical_attr_exists = "true" break sample_column_width = max_samplename_width * 8 -- cgit v1.2.3 From 9fa88673447ab13dcd1b899c0e6c2c5915dd0114 Mon Sep 17 00:00:00 2001 From: zsloan Date: Fri, 9 Apr 2021 17:44:03 +0000 Subject: Replaced the conditional for whether to show 'Block samples by group' to instead check categorical_attr_exists --- wqflask/wqflask/templates/show_trait_transform_and_filter.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wqflask/wqflask/templates/show_trait_transform_and_filter.html b/wqflask/wqflask/templates/show_trait_transform_and_filter.html index b70ca590..e3f5ef81 100644 --- a/wqflask/wqflask/templates/show_trait_transform_and_filter.html +++ b/wqflask/wqflask/templates/show_trait_transform_and_filter.html @@ -20,7 +20,7 @@
- {% if sample_groups[0].attributes %} + {% if categorical_attr_exists == "true" %}Paste or Type Multiple Values: You can enter data by pasting a series of numbers representing trait values into this area. diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index 2c0ba586..c4b510d4 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -156,12 +156,6 @@ def index_page(): import_collections = params['import_collections'] if import_collections == "true": g.user_session.import_traits_to_user(params['anon_id']) - #if USE_GN_SERVER: - # # The menu is generated using GN_SERVER - # return render_template("index_page.html", gn_server_url = GN_SERVER_URL, version=GN_VERSION) - #else: - - # Old style static menu (OBSOLETE) return render_template("index_page_orig.html", version=GN_VERSION) @@ -343,14 +337,10 @@ def intro(): @app.route("/tutorials") def tutorials(): - #doc = Docs("links", request.args) - #return render_template("docs.html", **doc.__dict__) return render_template("tutorials.html") @app.route("/credits") def credits(): - #doc = Docs("links", request.args) - #return render_template("docs.html", **doc.__dict__) return render_template("credits.html") @app.route("/update_text", methods=('POST',)) @@ -368,12 +358,9 @@ def submit_trait_form(): @app.route("/create_temp_trait", methods=('POST',)) def create_temp_trait(): logger.info(request.url) - - #template_vars = submit_trait.SubmitTrait(request.form) - doc = Docs("links") return render_template("links.html", **doc.__dict__) - #return render_template("show_trait.html", **template_vars.__dict__) + @app.route('/export_trait_excel', methods=('POST',)) def export_trait_excel(): @@ -487,21 +474,17 @@ def export_perm_data(): mimetype='text/csv', headers={"Content-Disposition":"attachment;filename=" + file_name + ".csv"}) + @app.route("/show_temp_trait", methods=('POST',)) def show_temp_trait_page(): logger.info(request.url) template_vars = show_trait.ShowTrait(request.form) - #logger.info("js_data before dump:", template_vars.js_data) template_vars.js_data = json.dumps(template_vars.js_data, default=json_default_handler, indent=" ") - # Sorting the keys messes up the ordered dictionary, so don't do that - #sort_keys=True) - - #logger.info("js_data after dump:", template_vars.js_data) - #logger.info("show_trait template_vars:", pf(template_vars.__dict__)) return render_template("show_trait.html", **template_vars.__dict__) + @app.route("/show_trait") def show_trait_page(): logger.info(request.url) -- cgit v1.2.3 From 4534daa6fb07c23b90e024560ca64091fc330eed Mon Sep 17 00:00:00 2001 From: BonfaceKilz Date: Mon, 19 Apr 2021 17:46:38 +0300 Subject: Move looped sql query into one statement in "get_species_groups" It's in-efficient to have a sql query executed in a loop. As data grows, the query becomes slower. It's better to let sql handle such queries. --- wqflask/utility/helper_functions.py | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/wqflask/utility/helper_functions.py b/wqflask/utility/helper_functions.py index 15d5b3ab..4ba92ed5 100644 --- a/wqflask/utility/helper_functions.py +++ b/wqflask/utility/helper_functions.py @@ -47,19 +47,18 @@ def get_trait_db_obs(self, trait_db_list): if trait_ob: self.trait_list.append((trait_ob, dataset_ob)) -def get_species_groups(): - - species_query = "SELECT SpeciesId, MenuName FROM Species" - species_ids_and_names = g.db.execute(species_query).fetchall() - - species_and_groups = [] - for species_id, species_name in species_ids_and_names: - this_species_groups = {} - this_species_groups['species'] = species_name - groups_query = "SELECT InbredSetName FROM InbredSet WHERE SpeciesId = %s" % (species_id) - groups = [group[0] for group in g.db.execute(groups_query).fetchall()] - this_species_groups['groups'] = groups - species_and_groups.append(this_species_groups) - - return species_and_groups +def get_species_groups(): + """Group each species into a group""" + _menu = {} + for species, group_name in g.db.execute( + "SELECT s.MenuName, i.InbredSetName FROM InbredSet i " + "INNER JOIN Species s ON s.SpeciesId = i.SpeciesId " + "ORDER BY i.SpeciesId ASC, i.Name ASC").fetchall(): + if _menu.get(species): + _menu = _menu[species].append(group_name) + else: + _menu[species] = [group_name] + return [{"species": key, + "groups": value} for key, value in + list(_menu.items())] -- cgit v1.2.3 From d2e2046a3ce1af0ca97ea1b6d9ccb3a4c9aecf7c Mon Sep 17 00:00:00 2001 From: BonfaceKilz Date: Fri, 23 Apr 2021 17:21:12 +0300 Subject: Add full link to genetic data collected as part of WebQTL project --- wqflask/wqflask/templates/submit_trait.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wqflask/wqflask/templates/submit_trait.html b/wqflask/wqflask/templates/submit_trait.html index 334a608d..2cc18240 100644 --- a/wqflask/wqflask/templates/submit_trait.html +++ b/wqflask/wqflask/templates/submit_trait.html @@ -14,7 +14,7 @@
The trait values that you enter are statistically compared with verified genotypes collected at a set of microsatellite markers in each RI set. The markers are drawn from a set of over 750, but for each set redundant markers have been removed, preferentially retaining those that are most informative.
-These error-checked RI mapping data match theoretical expectations for RI strain sets. The cumulative adjusted length of the RI maps are approximately 1400 cM, a value that matches those of both MIT maps and Chromosome Committee Report maps. See our full description of the genetic data collected as part of the WebQTL project.
+These error-checked RI mapping data match theoretical expectations for RI strain sets. The cumulative adjusted length of the RI maps are approximately 1400 cM, a value that matches those of both MIT maps and Chromosome Committee Report maps. See our full description of the genetic data collected as part of the WebQTL project.