aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--HACKING.org8
-rw-r--r--README.md88
-rw-r--r--gn3/api/correlation.py8
-rw-r--r--gn3/api/general.py4
-rw-r--r--gn3/api/rqtl.py4
-rw-r--r--gn3/computations/correlations.py36
-rw-r--r--gn3/computations/correlations2.py50
-rw-r--r--gn3/computations/heatmap.py177
-rw-r--r--gn3/computations/rqtl.py77
-rw-r--r--gn3/computations/slink.py198
-rw-r--r--gn3/db/__init__.py2
-rw-r--r--gn3/db/datasets.py291
-rw-r--r--gn3/db/traits.py736
-rw-r--r--gn3/function_helpers.py36
-rw-r--r--gn3/heatmaps/heatmaps.py54
-rw-r--r--guix.scm28
-rw-r--r--main.py6
-rw-r--r--scripts/rqtl_wrapper.R2
-rwxr-xr-xsql/map-database.sh15
-rw-r--r--sql/schema-from-in-db-documentation.org1817
-rw-r--r--sql/schema-original.sql2334
-rw-r--r--sql/schema.org39
-rw-r--r--sql/schema.pngbin0 -> 1412091 bytes
-rw-r--r--sql/schema.sql2406
-rw-r--r--sql/schema.svg1430
-rw-r--r--sql/update/README.md (renamed from sql/README.md)0
-rw-r--r--sql/update/metadata_audit.sql (renamed from sql/metadata_audit.sql)2
-rw-r--r--tests/integration/test_correlation.py2
-rw-r--r--tests/unit/computations/test_correlation.py48
-rw-r--r--tests/unit/computations/test_heatmap.py143
-rw-r--r--tests/unit/computations/test_slink.py311
-rw-r--r--tests/unit/db/test_datasets.py133
-rw-r--r--tests/unit/db/test_traits.py224
-rw-r--r--wsgi.py13
35 files changed, 10578 insertions, 147 deletions
diff --git a/.gitignore b/.gitignore
index 5b9ff95..c5cf3e2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -179,3 +179,6 @@ dmypy.json
# Pyre type checker
.pyre/
+
+# emacs temporary files
+/**/*~ \ No newline at end of file
diff --git a/HACKING.org b/HACKING.org
new file mode 100644
index 0000000..8c26a29
--- /dev/null
+++ b/HACKING.org
@@ -0,0 +1,8 @@
+* Introduction
+
+We are getting away from GitHub CI, and hosting our own CI servers. From GitHub, once a person makes a push, we'll be using [[https://github.com/adnanh/webhook][webhook]] to initiate laminar.
+
+
+First install laminar (use the appropriate binary):
+
+: wget https://github.com/adnanh/webhook/releases/download/2.8.0/webhook-linux-amd64.tar.gz && tar xf webhook-linux-amd64.tar.gz
diff --git a/README.md b/README.md
index c1acba1..750f55d 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,17 @@ GeneNetwork3 REST API for data science and machine learning
## Installation
-#### Using guix
+#### GNU Guix packages
+
+Install GNU Guix - this can be done on every running Linux system.
+
+There are at least three ways to start GeneNetwork3 with GNU Guix:
+
+1. Create an environment with `guix environment`
+2. Create a container with `guix environment -C`
+3. Use a profile and shell settings with `source ~/opt/genenetwork3/etc/profile`
+
+#### Create an environment:
Simply load up the environment (for development purposes):
@@ -11,7 +21,7 @@ Simply load up the environment (for development purposes):
guix environment --load=guix.scm
```
-Also, make sure you have the *guix-bioinformatics* channel set up.
+Also, make sure you have the [guix-bioinformatics](https://git.genenetwork.org/guix-bioinformatics/guix-bioinformatics) channel set up.
```bash
env GUIX_PACKAGE_PATH=~/guix-bioinformatics/ ~/.config/guix/current/bin/guix environment --load=guix.scm
@@ -19,13 +29,52 @@ python3
import redis
```
-Better run a proper container
+#### Run a Guix container
+
+```
+env GUIX_PACKAGE_PATH=~/guix-bioinformatics/ ~/.config/guix/current/bin/guix environment -C --network --load=guix.scm
+```
+
+
+#### Using a Guix profile (or rolling back)
+
+Create a new profile with
+
+```
+env GUIX_PACKAGE_PATH=~/guix-bioinformatics/ ~/.config/guix/current/bin/guix package -i genenetwork3 -p ~/opt/genenetwork3
+```
+
+and load the profile settings with
+
+```
+source ~/opt/genenetwork3/etc/profile
+start server...
+```
+
+Note that GN2 profiles include the GN3 profile (!). To roll genenetwork3 back you can use either in the same fashion (probably best to start a new shell first)
+
+```
+bash
+source ~/opt/genenetwork2-older-version/etc/profile
+set|grep store
+run tests, server etc...
+```
+
+#### Troubleshooting Guix packages
+
+If you get a Guix error, such as `ice-9/boot-9.scm:1669:16: In procedure raise-exception:
+error: python-sqlalchemy-stubs: unbound variable` it typically means an update to guix latest is required (i.e., guix pull):
```
-env GUIX_PACKAGE_PATH=~/guix-bioinformatics/ ~/.config/guix/current/bin/guix environment -C --network --load=guix.scm
+guix pull
+source ~/.config/guix/current/etc/profile
```
-#### Running Tests
+and try again. Also make sure your ~/guix-bioinformatics is up to date.
+
+See also instructions in [.guix.scm](.guix.scm).
+
+## Running Tests
(assuming you are in a guix container; otherwise use venv!)
@@ -47,15 +96,36 @@ Running mypy(type-checker):
mypy .
```
-#### Running the flask app
+## Running the GN3 web service
-To spin up the server:
+To spin up the server on its own (for development):
```bash
env FLASK_DEBUG=1 FLASK_APP="main.py" flask run --port=8080
```
-##### Using python-pip
+And test with
+
+```
+curl localhost:8080/api/version
+"1.0"
+```
+
+To run with gunicorn
+
+```
+gunicorn --bind 0.0.0.0:8080 wsgi:app
+```
+
+consider the following options for development `--bind 0.0.0.0:$SERVER_PORT --workers=1 --timeout 180 --reload wsgi`.
+
+And for the scalable production version run
+
+```
+gunicorn --bind 0.0.0.0:8080 --workers 8 --keep-alive 6000 --max-requests 10 --max-requests-jitter 5 --timeout 1200 wsgi:app
+```
+
+## Using python-pip
IMPORTANT NOTE: we do not recommend using pip tools, use Guix instead
@@ -71,7 +141,7 @@ virtualenv --python python3 venv
```bash
# The --ignore-installed flag forces packages to
-# get installed in the venv even if they existed
+# get installed in the venv even if they existed
# in the global env
pip install -r requirements.txt --ignore-installed
```
diff --git a/gn3/api/correlation.py b/gn3/api/correlation.py
index e7e89cf..46121f8 100644
--- a/gn3/api/correlation.py
+++ b/gn3/api/correlation.py
@@ -5,7 +5,7 @@ from flask import request
from gn3.computations.correlations import compute_all_sample_correlation
from gn3.computations.correlations import compute_all_lit_correlation
-from gn3.computations.correlations import compute_all_tissue_correlation
+from gn3.computations.correlations import compute_tissue_correlation
from gn3.computations.correlations import map_shared_keys_to_values
from gn3.db_utils import database_connector
@@ -78,8 +78,8 @@ def compute_tissue_corr(corr_method="pearson"):
primary_tissue_dict = tissue_input_data["primary_tissue"]
target_tissues_dict = tissue_input_data["target_tissues_dict"]
- results = compute_all_tissue_correlation(primary_tissue_dict=primary_tissue_dict,
- target_tissues_data=target_tissues_dict,
- corr_method=corr_method)
+ results = compute_tissue_correlation(primary_tissue_dict=primary_tissue_dict,
+ target_tissues_data=target_tissues_dict,
+ corr_method=corr_method)
return jsonify(results)
diff --git a/gn3/api/general.py b/gn3/api/general.py
index cebb2e3..69ec343 100644
--- a/gn3/api/general.py
+++ b/gn3/api/general.py
@@ -11,6 +11,10 @@ from gn3.commands import run_cmd
general = Blueprint("general", __name__)
+@general.route("/version")
+def version():
+ """Get API version."""
+ return jsonify("1.0")
@general.route("/metadata/upload/", methods=["POST"],
strict_slashes=False)
diff --git a/gn3/api/rqtl.py b/gn3/api/rqtl.py
index b0405f4..6548e1a 100644
--- a/gn3/api/rqtl.py
+++ b/gn3/api/rqtl.py
@@ -48,8 +48,8 @@ run the rqtl_wrapper script and return the results as JSON
"output", rqtl_cmd.get('output_file'))):
os.system(rqtl_cmd.get('rqtl_cmd'))
- if "pairscan" in boolean_kwargs:
- rqtl_output['results'] = process_rqtl_pairscan(rqtl_cmd.get('output_file'))
+ if "pairscan" in rqtl_bool_kwargs:
+ rqtl_output['results'] = process_rqtl_pairscan(rqtl_cmd.get('output_file'), genofile)
else:
rqtl_output['results'] = process_rqtl_mapping(rqtl_cmd.get('output_file'))
diff --git a/gn3/computations/correlations.py b/gn3/computations/correlations.py
index bc738a7..bb13ff1 100644
--- a/gn3/computations/correlations.py
+++ b/gn3/computations/correlations.py
@@ -1,4 +1,5 @@
"""module contains code for correlations"""
+import math
import multiprocessing
from typing import List
@@ -90,7 +91,7 @@ def compute_sample_r_correlation(trait_name, corr_method, trait_vals,
target_values=sanitized_target_vals,
corr_method=corr_method)
- if corr_coefficient is not None:
+ if corr_coefficient is not None and not math.isnan(corr_coefficient):
return (trait_name, corr_coefficient, p_value, num_overlap)
return None
@@ -123,11 +124,12 @@ def filter_shared_sample_keys(this_samplelist,
return (this_vals, target_vals)
-def compute_all_sample_correlation(this_trait,
- target_dataset,
- corr_method="pearson") -> List:
+def fast_compute_all_sample_correlation(this_trait,
+ target_dataset,
+ corr_method="pearson") -> List:
"""Given a trait data sample-list and target__datasets compute all sample
correlation
+ this functions uses multiprocessing if not use the normal fun
"""
# xtodo fix trait_name currently returning single one
@@ -159,9 +161,9 @@ def compute_all_sample_correlation(this_trait,
key=lambda trait_name: -abs(list(trait_name.values())[0]["corr_coefficient"]))
-def benchmark_compute_all_sample(this_trait,
- target_dataset,
- corr_method="pearson") -> List:
+def compute_all_sample_correlation(this_trait,
+ target_dataset,
+ corr_method="pearson") -> List:
"""Temp function to benchmark with compute_all_sample_r alternative to
compute_all_sample_r where we use multiprocessing
@@ -173,6 +175,7 @@ def benchmark_compute_all_sample(this_trait,
target_trait_data = target_trait["trait_sample_data"]
this_vals, target_vals = filter_shared_sample_keys(
this_trait_samples, target_trait_data)
+
sample_correlation = compute_sample_r_correlation(
trait_name=trait_name,
corr_method=corr_method,
@@ -189,7 +192,9 @@ def benchmark_compute_all_sample(this_trait,
"num_overlap": num_overlap
}
corr_results.append({trait_name: corr_result})
- return corr_results
+ return sorted(
+ corr_results,
+ key=lambda trait_name: -abs(list(trait_name.values())[0]["corr_coefficient"]))
def tissue_correlation_for_trait(
@@ -335,9 +340,9 @@ def compute_all_lit_correlation(conn, trait_lists: List,
return sorted_lit_results
-def compute_all_tissue_correlation(primary_tissue_dict: dict,
- target_tissues_data: dict,
- corr_method: str):
+def compute_tissue_correlation(primary_tissue_dict: dict,
+ target_tissues_data: dict,
+ corr_method: str):
"""Function acts as an abstraction for tissue_correlation_for_trait\
required input are target tissue object and primary tissue trait\
target tissues data contains the trait_symbol_dict and symbol_tissue_vals
@@ -357,8 +362,7 @@ def compute_all_tissue_correlation(primary_tissue_dict: dict,
target_tissues_values=target_tissue_vals,
trait_id=trait_id,
corr_method=corr_method)
- tissue_result_dict = {trait_id: tissue_result}
- tissues_results.append(tissue_result_dict)
+ tissues_results.append(tissue_result)
return sorted(
tissues_results,
key=lambda trait_name: -abs(list(trait_name.values())[0]["tissue_corr"]))
@@ -381,9 +385,9 @@ def process_trait_symbol_dict(trait_symbol_dict, symbol_tissue_vals_dict) -> Lis
return traits_tissue_vals
-def compute_tissue_correlation(primary_tissue_dict: dict,
- target_tissues_data: dict,
- corr_method: str):
+def fast_compute_tissue_correlation(primary_tissue_dict: dict,
+ target_tissues_data: dict,
+ corr_method: str):
"""Experimental function that uses multiprocessing for computing tissue
correlation
diff --git a/gn3/computations/correlations2.py b/gn3/computations/correlations2.py
new file mode 100644
index 0000000..93db3fa
--- /dev/null
+++ b/gn3/computations/correlations2.py
@@ -0,0 +1,50 @@
+"""
+DESCRIPTION:
+ TODO: Add a description for the module
+
+FUNCTIONS:
+compute_correlation:
+ TODO: Describe what the function does..."""
+
+from math import sqrt
+from functools import reduce
+## From GN1: mostly for clustering and heatmap generation
+
+def __items_with_values(dbdata, userdata):
+ """Retains only corresponding items in the data items that are not `None` values.
+ This should probably be renamed to something sensible"""
+ def both_not_none(item1, item2):
+ """Check that both items are not the value `None`."""
+ if (item1 is not None) and (item2 is not None):
+ return (item1, item2)
+ return None
+ def split_lists(accumulator, item):
+ """Separate the 'x' and 'y' items."""
+ return [accumulator[0] + [item[0]], accumulator[1] + [item[1]]]
+ return reduce(
+ split_lists,
+ filter(lambda x: x is not None, map(both_not_none, dbdata, userdata)),
+ [[], []])
+
+def compute_correlation(dbdata, userdata):
+ """Compute some form of correlation.
+
+ This is extracted from
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/utility/webqtlUtil.py#L622-L647
+ """
+ x_items, y_items = __items_with_values(dbdata, userdata)
+ if len(x_items) < 6:
+ return (0.0, len(x_items))
+ meanx = sum(x_items)/len(x_items)
+ meany = sum(y_items)/len(y_items)
+ def cal_corr_vals(acc, item):
+ xitem, yitem = item
+ return [
+ acc[0] + ((xitem - meanx) * (yitem - meany)),
+ acc[1] + ((xitem - meanx) * (xitem - meanx)),
+ acc[2] + ((yitem - meany) * (yitem - meany))]
+ xyd, sxd, syd = reduce(cal_corr_vals, zip(x_items, y_items), [0.0, 0.0, 0.0])
+ try:
+ return ((xyd/(sqrt(sxd)*sqrt(syd))), len(x_items))
+ except ZeroDivisionError:
+ return(0, len(x_items))
diff --git a/gn3/computations/heatmap.py b/gn3/computations/heatmap.py
new file mode 100644
index 0000000..3c35029
--- /dev/null
+++ b/gn3/computations/heatmap.py
@@ -0,0 +1,177 @@
+"""
+This module will contain functions to be used in computation of the data used to
+generate various kinds of heatmaps.
+"""
+
+from functools import reduce
+from typing import Any, Dict, Sequence
+from gn3.computations.slink import slink
+from gn3.db.traits import retrieve_trait_data, retrieve_trait_info
+from gn3.computations.correlations2 import compute_correlation
+
+def export_trait_data(
+ trait_data: dict, strainlist: Sequence[str], dtype: str = "val",
+ var_exists: bool = False, n_exists: bool = False):
+ """
+ Export data according to `strainlist`. Mostly used in calculating
+ correlations.
+
+ DESCRIPTION:
+ Migrated from
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/base/webqtlTrait.py#L166-L211
+
+ PARAMETERS
+ trait: (dict)
+ The dictionary of key-value pairs representing a trait
+ strainlist: (list)
+ A list of strain names
+ type: (str)
+ ... verify what this is ...
+ var_exists: (bool)
+ A flag indicating existence of variance
+ n_exists: (bool)
+ A flag indicating existence of ndata
+ """
+ def __export_all_types(tdata, strain):
+ sample_data = []
+ if tdata[strain]["value"]:
+ sample_data.append(tdata[strain]["value"])
+ if var_exists:
+ if tdata[strain]["variance"]:
+ sample_data.append(tdata[strain]["variance"])
+ else:
+ sample_data.append(None)
+ if n_exists:
+ if tdata[strain]["ndata"]:
+ sample_data.append(tdata[strain]["ndata"])
+ else:
+ sample_data.append(None)
+ else:
+ if var_exists and n_exists:
+ sample_data += [None, None, None]
+ elif var_exists or n_exists:
+ sample_data += [None, None]
+ else:
+ sample_data.append(None)
+
+ return tuple(sample_data)
+
+ def __exporter(accumulator, strain):
+ # pylint: disable=[R0911]
+ if strain in trait_data["data"]:
+ if dtype == "val":
+ return accumulator + (trait_data["data"][strain]["value"], )
+ if dtype == "var":
+ return accumulator + (trait_data["data"][strain]["variance"], )
+ if dtype == "N":
+ return accumulator + (trait_data["data"][strain]["ndata"], )
+ if dtype == "all":
+ return accumulator + __export_all_types(trait_data["data"], strain)
+ raise KeyError("Type `%s` is incorrect" % dtype)
+ if var_exists and n_exists:
+ return accumulator + (None, None, None)
+ if var_exists or n_exists:
+ return accumulator + (None, None)
+ return accumulator + (None,)
+
+ return reduce(__exporter, strainlist, tuple())
+
+def trait_display_name(trait: Dict):
+ """
+ Given a trait, return a name to use to display the trait on a heatmap.
+
+ DESCRIPTION
+ Migrated from
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/base/webqtlTrait.py#L141-L157
+ """
+ if trait.get("db", None) and trait.get("trait_name", None):
+ if trait["db"]["dataset_type"] == "Temp":
+ desc = trait["description"]
+ if desc.find("PCA") >= 0:
+ return "%s::%s" % (
+ trait["db"]["displayname"],
+ desc[desc.rindex(':')+1:].strip())
+ return "%s::%s" % (
+ trait["db"]["displayname"],
+ desc[:desc.index('entered')].strip())
+ prefix = "%s::%s" % (
+ trait["db"]["dataset_name"], trait["trait_name"])
+ if trait["cellid"]:
+ return "%s::%s" % (prefix, trait["cellid"])
+ return prefix
+ return trait["description"]
+
+def cluster_traits(traits_data_list: Sequence[Dict]):
+ """
+ Clusters the trait values.
+
+ DESCRIPTION
+ Attempts to replicate the clustering of the traits, as done at
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/heatmap/Heatmap.py#L138-L162
+ """
+ def __compute_corr(tdata_i, tdata_j):
+ if tdata_i[0] == tdata_j[0]:
+ return 0.0
+ corr_vals = compute_correlation(tdata_i[1], tdata_j[1])
+ corr = corr_vals[0]
+ if (1 - corr) < 0:
+ return 0.0
+ return 1 - corr
+
+ def __cluster(tdata_i):
+ return tuple(
+ __compute_corr(tdata_i, tdata_j)
+ for tdata_j in enumerate(traits_data_list))
+
+ return tuple(__cluster(tdata_i) for tdata_i in enumerate(traits_data_list))
+
+def heatmap_data(formd, search_result, conn: Any):
+ """
+ heatmap function
+
+ DESCRIPTION
+ This function is an attempt to reproduce the initialisation at
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/heatmap/Heatmap.py#L46-L64
+ and also the clustering and slink computations at
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/heatmap/Heatmap.py#L138-L165
+ with the help of the `gn3.computations.heatmap.cluster_traits` function.
+
+ It does not try to actually draw the heatmap image.
+
+ PARAMETERS:
+ TODO: Elaborate on the parameters here...
+ """
+ threshold = 0 # webqtlConfig.PUBLICTHRESH
+ cluster_checked = formd.formdata.getvalue("clusterCheck", "")
+ strainlist = [
+ strain for strain in formd.strainlist if strain not in formd.parlist]
+ genotype = formd.genotype
+
+ def __retrieve_traitlist_and_datalist(threshold, fullname):
+ trait = retrieve_trait_info(threshold, fullname, conn)
+ return (
+ trait,
+ export_trait_data(retrieve_trait_data(trait, conn), strainlist))
+
+ traits_details = [
+ __retrieve_traitlist_and_datalist(threshold, fullname)
+ for fullname in search_result]
+ traits_list = map(lambda x: x[0], traits_details)
+ traits_data_list = map(lambda x: x[1], traits_details)
+
+ return {
+ "target_description_checked": formd.formdata.getvalue(
+ "targetDescriptionCheck", ""),
+ "cluster_checked": cluster_checked,
+ "slink_data": (
+ slink(cluster_traits(traits_data_list))
+ if cluster_checked else False),
+ "sessionfile": formd.formdata.getvalue("session"),
+ "genotype": genotype,
+ "nLoci": sum(map(len, genotype)),
+ "strainlist": strainlist,
+ "ppolar": formd.ppolar,
+ "mpolar":formd.mpolar,
+ "traits_list": traits_list,
+ "traits_data_list": traits_data_list
+ }
diff --git a/gn3/computations/rqtl.py b/gn3/computations/rqtl.py
index 00e1db9..38c5000 100644
--- a/gn3/computations/rqtl.py
+++ b/gn3/computations/rqtl.py
@@ -1,6 +1,7 @@
"""Procedures related rqtl computations"""
import os
-from typing import Dict, List, Union
+from bisect import bisect
+from typing import Dict, List, Tuple, Union
import numpy as np
@@ -80,15 +81,15 @@ def process_rqtl_mapping(file_name: str) -> List:
return marker_obs
-def process_rqtl_pairscan(file_name: str) -> List:
+def process_rqtl_pairscan(file_name: str, geno_file: str) -> List:
"""Given an output file name, read in R/qtl pair-scan results and return
a list of both the JSON needed for the d3panels figure and a list of results
to be used when generating the results table (which will include marker names)
"""
- figure_data = pairscan_results_for_figure(file_name)
- table_data = pairscan_results_for_table(file_name)
+ figure_data = pairscan_for_figure(file_name)
+ table_data = pairscan_for_table(file_name, geno_file)
return [figure_data, table_data]
@@ -119,15 +120,14 @@ def pairscan_for_figure(file_name: str) -> Dict:
if i == 0: # Skip first line
continue
line_items = [item.rstrip('\n') for item in line.split(",")]
- chr_list.append(line_items[1])
+ chr_list.append(line_items[1][1:-1])
pos_list.append(line_items[2])
figure_data['chr'] = chr_list
figure_data['pos'] = pos_list
return figure_data
-
-def pairscan_for_table(file_name: str) -> List:
+def pairscan_for_table(file_name: str, geno_file: str) -> List:
"""Given an output file name, read in R/qtl pair-scan results and return
a list of results to be used when generating the results table (which will include marker names)
@@ -148,32 +148,85 @@ def pairscan_for_table(file_name: str) -> List:
marker_list.append(this_marker)
+ # Get the list of original markers from the .geno file
+ original_markers = build_marker_pos_dict(geno_file)
+
# Open the file with the actual results and write the results as
# they will be displayed in the results table
with open(os.path.join(current_app.config.get("TMPDIR", "/tmp"),
"output", file_name), "r") as the_file:
for i, line in enumerate(the_file.readlines()[1:]):
marker_1 = marker_list[i]
+ proximal1, distal1 = find_nearest_marker(marker_1['chr'], marker_1['pos'], original_markers)
line_items = [item.rstrip('\n') for item in line.split(",")]
for j, item in enumerate(line_items[1:]):
marker_2 = marker_list[j]
+ proximal2, distal2 = find_nearest_marker(marker_2['chr'], marker_2['pos'], original_markers)
try:
lod_score = f"{float(item):.3f}"
except:
lod_score = f"{item}"
this_line = {
- 'marker1': f"{marker_1['name']}",
+ 'proximal1': proximal1,
+ 'distal1': distal1,
'pos1': f"Chr {marker_1['chr']} @ {float(marker_1['pos']):.1f} cM",
'lod': lod_score,
- 'marker2': f"{marker_2['name']}",
+ 'proximal2': proximal2,
+ 'distal2': distal2,
'pos2': f"Chr {marker_2['chr']} @ {float(marker_2['pos']):.1f} cM"
}
- table_data.append(this_line)
- return table_data
+ table_data.append(this_line)
+
+ return sorted(table_data, key = lambda i: float(i['lod']), reverse=True)[:500]
+
+def build_marker_pos_dict(genotype_file: str) -> Dict:
+ """
+ Gets list of markers and their positions from .geno file
+
+ Basically a pared-down version of parse_genotype_file for R/qtl pair-scan
+ """
+
+ with open(genotype_file, "r") as infile:
+ contents = infile.readlines()
+
+ # Get all lines after the metadata
+ lines = tuple(line for line in contents if
+ ((not line.strip().startswith("#")) and
+ (not line.strip().startswith("@")) and
+ (not line.strip() == "")))
+
+ header_items = lines[0].split("\t")
+ mb_exists = "Mb" in header_items
+ pos_column = header_items.index("Mb") if mb_exists else header_items.index("cM")
+
+ the_markers = {}
+ for line in lines[1:]: # The lines with markers
+ line_items = line.split("\t")
+ this_chr = line_items[0]
+ if this_chr not in the_markers:
+ the_markers[this_chr] = {}
+ the_markers[this_chr][str(float(line_items[pos_column]))] = line_items[1]
+
+ return the_markers
+
+def find_nearest_marker(the_chr: str, the_pos: str, marker_list: Dict) -> Tuple[str, str]:
+ """
+ Given a chromosome and position of a pseudomarker (from R/qtl pair-scan results),
+ return the nearest real marker
+ """
+
+ pos_list = [float(pos) for pos in marker_list[the_chr]]
+
+ # Get the position of the pseudomarker in the list of markers for the chr
+ the_pos_index = bisect(pos_list, float(the_pos))
+
+ proximal_marker = marker_list[the_chr][str(pos_list[the_pos_index-1])]
+ distal_marker = marker_list[the_chr][str(pos_list[the_pos_index])]
+ return proximal_marker, distal_marker
-def process_perm_output(file_name: str):
+def process_perm_output(file_name: str) -> Tuple[List, float, float]:
"""Given base filename, read in R/qtl permutation output and calculate
suggestive and significant thresholds
diff --git a/gn3/computations/slink.py b/gn3/computations/slink.py
new file mode 100644
index 0000000..3d7a576
--- /dev/null
+++ b/gn3/computations/slink.py
@@ -0,0 +1,198 @@
+"""
+DESCRIPTION:
+ TODO: Add a description for the module
+
+FUNCTIONS:
+slink:
+ TODO: Describe what the function does...
+"""
+import logging
+from typing import Union, Sequence
+
+NumType = Union[int, float]
+SeqOfNums = Sequence[NumType]
+
+class LengthError(BaseException):
+ """Raised whenever child lists/tuples are not the same length as the parent
+ list of tuple."""
+
+class MirrorError(BaseException):
+ """Raised if the distance from child A to child B is not the same as the
+ distance from child B to child A."""
+
+def __is_list_or_tuple(item):
+ return type(item) in [list, tuple]
+
+def __raise_valueerror_if_data_is_not_lists_or_tuples(lists):
+ """Check that `lists` is a list of lists: If not, raise an exception."""
+
+ if (not __is_list_or_tuple(lists)) or (not all(map(__is_list_or_tuple, lists))):
+ raise ValueError("Expected list or tuple")
+
+def __raise_valueerror_if_lists_empty(lists):
+ """Check that the list and its direct children are not empty."""
+ def empty(lst):
+ return len(lst) == 0
+ if (empty(lists)) or not all(map(lambda x: not empty(x), lists)):
+ raise ValueError("List/Tuple should NOT be empty!")
+
+def __raise_lengtherror_if_child_lists_are_not_same_as_parent(lists):
+ def len_is_same_as_parent(lst):
+ return len(lst) == len(lists)
+ if not all(map(len_is_same_as_parent, lists)):
+ raise LengthError("All children lists should be same length as the parent.")
+
+def __raise_valueerror_if_child_list_distance_from_itself_is_not_zero(lists):
+ def get_child_distance(child):
+ idx = lists.index(child)
+ return lists[idx][idx]
+ def distance_is_zero(dist):
+ return dist == 0
+ children_distances = map(get_child_distance, lists)
+ if not all(map(distance_is_zero, children_distances)):
+ raise ValueError("Distance of each child list/tuple from itself should be zero!")
+
+def __raise_mirrorerror_of_distances_one_way_are_not_same_other_way(lists):
+ """Check that the distance from A to B, is the same as the distance from B to A.
+If the two distances are different, throw an exception."""
+ inner_coords = range(len(lists))
+ coords = ((i, j) for i in inner_coords for j in inner_coords)
+ def __is_same_reversed(coord):
+ return lists[coord[0]][coord[1]] == lists[coord[1]][coord[0]]
+ if not all(map(__is_same_reversed, coords)):
+ raise MirrorError((
+ "Distance from one child to the other should be the same in both "
+ "directions."))
+
+def __raise_valueerror_on_negative_distances(lists):
+ """Check that distances between 'somethings' are all positive, otherwise,
+raise an exception."""
+ def zero_or_positive(val):
+ return val >= 0
+ # flatten lists
+ flattened = __flatten_list_of_lists(lists)
+ if not all(map(zero_or_positive, flattened)):
+ raise ValueError("Distances should be positive.")
+
+def __flatten_list_of_lists(parent):
+ return [item for child in parent for item in child]
+
+# i and j are Union[SeqOfNums, NumType], but that leads to errors where the
+# values of i or j are indexed, since the NumType type is not indexable.
+# I don't know how to type this so that it does not fail on running `mypy .`
+def nearest(lists: Sequence[SeqOfNums], i, j) -> NumType:
+ """
+ Computes shortest distance between member(s) in `i` and member(s) in `j`.
+
+ Description:
+ This is 'copied' over from genenetwork1, from
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/heatmap/slink.py#L42-L64.
+
+ This description should be updated to better describe what 'member' means in
+ the context where the function is used.
+
+ Parameters:
+ lists (list of lists of distances): Represents a list of members and their
+ distances from each other.
+ Each inner list represents the distances the member at that coordinate
+ is from other members in the list: for example, a member at index 0 with
+ the values [0, 9, 1, 7] indicates that the member is:
+ - 0 units of distance away from itself
+ - 9 units of distance away from member at coordinate 1
+ - 1 unit of distance away from member at coordinate 2
+ - 7 units of distance away from member at coordinate 3
+ i (int or list of ints): Represents the coordinate of a member, or a list of
+ coordinates of members on the `lists` list.
+ j (int or list of ints): Represents the coordinate of a member, or a list of
+ coordinates of members on the `lists` list.
+
+ Returns:
+ int: Represents the shortest distance between member(s) in `i` and member(s)
+ in `j`."""
+
+ #### Guard Functions: Should we do this a different way? ####
+ __raise_valueerror_if_data_is_not_lists_or_tuples(lists)
+ __raise_valueerror_if_lists_empty(lists)
+ __raise_lengtherror_if_child_lists_are_not_same_as_parent(lists)
+ __raise_valueerror_if_child_list_distance_from_itself_is_not_zero(lists)
+ __raise_mirrorerror_of_distances_one_way_are_not_same_other_way(lists)
+ __raise_valueerror_on_negative_distances(lists)
+ #### END: Guard Functions ####
+ if isinstance(i, int) and isinstance(j, int): # From member i to member j
+ return lists[i][j]
+
+ if isinstance(i, int) and __is_list_or_tuple(j):
+ return min(map(lambda j_new: nearest(lists, i, j_new), j[:-1]))
+ if isinstance(j, int) and __is_list_or_tuple(i):
+ return min(map(lambda i_new: nearest(lists, i_new, j), i[:-1]))
+
+ if __is_list_or_tuple(i) and __is_list_or_tuple(j):
+ coordinate_pairs = __flatten_list_of_lists(
+ [[(itemi, itemj) for itemj in j[:-1]] for itemi in i[:-1]])
+ return min(map(lambda x: nearest(lists, x[0], x[1]), coordinate_pairs))
+
+ raise ValueError("member values (i or j) should be lists/tuples of integers or integers")
+
+# `lists` here could be Sequence[SeqOfNums], but that leads to errors I do not
+# understand down the line
+# Might have to re-implement the function especially since the errors are thrown
+# where `listindexcopy` is involved
+def slink(lists):
+ """
+ DESCRIPTION:
+ TODO: Not quite sure what this function does. Work through the code with a
+ fine tooth comb, once we understand the context of its use, so as to
+ give a better description
+
+ The name of the function does not clearly establish what the function
+ does either, meaning, once that is established, the function should be
+ renamed to give the user an idea of what it does without necessarily
+ reading through a ton of code.
+
+ We should also look into refactoring the function to reduce/eliminate
+ the multiple levels of nested-loops and conditionals
+
+ PARAMETERS:
+ lists (list of lists of numbers): Give this a better name.
+ Each item of this list is a list of coordinates of the members in the
+ group.
+ What 'member' and 'group' in this context means, is not yet established.
+ """
+ try:
+ size = len(lists)
+ listindexcopy = list(range(size))
+ listscopy = [list(child[:]) for child in lists]
+ init_size = size
+ candidate = []
+ while init_size > 2:
+ mindist = 1e10
+ for i in range(init_size):
+ for j in range(i+1, init_size):
+ if listscopy[i][j] < mindist:
+ mindist = listscopy[i][j]
+ candidate = [[i, j]]
+ elif listscopy[i][j] == mindist:
+ mindist = listscopy[i][j]
+ candidate.append([i, j])
+ else:
+ pass
+ newmem = (
+ listindexcopy[candidate[0][0]], listindexcopy[candidate[0][1]],
+ mindist)
+ listindexcopy.pop(candidate[0][1])
+ listindexcopy[candidate[0][0]] = newmem
+
+ init_size -= 1
+ for i in range(init_size):
+ for j in range(i+1, init_size):
+ listscopy[i][j] = nearest(
+ lists, listindexcopy[i], listindexcopy[j])
+ listscopy[j][i] = listscopy[i][j]
+ listindexcopy.append(
+ nearest(lists, listindexcopy[0], listindexcopy[1]))
+ return listindexcopy
+ except (LengthError, MirrorError, TypeError, IndexError) as exc:
+ # Look into making the logging log output to the system's
+ # configured logger(s)
+ logging.warning("Exception: %s, %s", type(exc), exc)
+ return []
diff --git a/gn3/db/__init__.py b/gn3/db/__init__.py
index 5ab9f3c..149a344 100644
--- a/gn3/db/__init__.py
+++ b/gn3/db/__init__.py
@@ -1,7 +1,7 @@
# pylint: disable=[R0902, R0903]
"""Module that exposes common db operations"""
from dataclasses import asdict, astuple
-from typing import Any, Dict, List, Optional, Generator, Union
+from typing import Any, Dict, List, Optional, Generator, Tuple, Union
from typing_extensions import Protocol
from gn3.db.metadata_audit import MetadataAudit
diff --git a/gn3/db/datasets.py b/gn3/db/datasets.py
new file mode 100644
index 0000000..4a05499
--- /dev/null
+++ b/gn3/db/datasets.py
@@ -0,0 +1,291 @@
+"""
+This module contains functions relating to specific trait dataset manipulation
+"""
+from typing import Any
+
+def retrieve_probeset_trait_dataset_name(
+ threshold: int, name: str, connection: Any):
+ """
+ Get the ID, DataScale and various name formats for a `ProbeSet` trait.
+ """
+ query = (
+ "SELECT Id, Name, FullName, ShortName, DataScale "
+ "FROM ProbeSetFreeze "
+ "WHERE "
+ "public > %(threshold)s "
+ "AND "
+ "(Name = %(name)s OR FullName = %(name)s OR ShortName = %(name)s)")
+ with connection.cursor() as cursor:
+ cursor.execute(
+ query,
+ {
+ "threshold": threshold,
+ "name": name
+ })
+ return dict(zip(
+ ["dataset_id", "dataset_name", "dataset_fullname",
+ "dataset_shortname", "dataset_datascale"],
+ cursor.fetchone()))
+
+def retrieve_publish_trait_dataset_name(
+ threshold: int, name: str, connection: Any):
+ """
+ Get the ID, DataScale and various name formats for a `Publish` trait.
+ """
+ query = (
+ "SELECT Id, Name, FullName, ShortName "
+ "FROM PublishFreeze "
+ "WHERE "
+ "public > %(threshold)s "
+ "AND "
+ "(Name = %(name)s OR FullName = %(name)s OR ShortName = %(name)s)")
+ with connection.cursor() as cursor:
+ cursor.execute(
+ query,
+ {
+ "threshold": threshold,
+ "name": name
+ })
+ return dict(zip(
+ ["dataset_id", "dataset_name", "dataset_fullname",
+ "dataset_shortname"],
+ cursor.fetchone()))
+
+def retrieve_geno_trait_dataset_name(
+ threshold: int, name: str, connection: Any):
+ """
+ Get the ID, DataScale and various name formats for a `Geno` trait.
+ """
+ query = (
+ "SELECT Id, Name, FullName, ShortName "
+ "FROM GenoFreeze "
+ "WHERE "
+ "public > %(threshold)s "
+ "AND "
+ "(Name = %(name)s OR FullName = %(name)s OR ShortName = %(name)s)")
+ with connection.cursor() as cursor:
+ cursor.execute(
+ query,
+ {
+ "threshold": threshold,
+ "name": name
+ })
+ return dict(zip(
+ ["dataset_id", "dataset_name", "dataset_fullname",
+ "dataset_shortname"],
+ cursor.fetchone()))
+
+def retrieve_temp_trait_dataset_name(
+ threshold: int, name: str, connection: Any):
+ """
+ Get the ID, DataScale and various name formats for a `Temp` trait.
+ """
+ query = (
+ "SELECT Id, Name, FullName, ShortName "
+ "FROM TempFreeze "
+ "WHERE "
+ "public > %(threshold)s "
+ "AND "
+ "(Name = %(name)s OR FullName = %(name)s OR ShortName = %(name)s)")
+ with connection.cursor() as cursor:
+ cursor.execute(
+ query,
+ {
+ "threshold": threshold,
+ "name": name
+ })
+ return dict(zip(
+ ["dataset_id", "dataset_name", "dataset_fullname",
+ "dataset_shortname"],
+ cursor.fetchone()))
+
+def retrieve_dataset_name(
+ trait_type: str, threshold: int, trait_name: str, dataset_name: str,
+ conn: Any):
+ """
+ Retrieve the name of a trait given the trait's name
+
+ This is extracted from the `webqtlDataset.retrieveName` function as is
+ implemented at
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/base/webqtlDataset.py#L140-L169
+ """
+ fn_map = {
+ "ProbeSet": retrieve_probeset_trait_dataset_name,
+ "Publish": retrieve_publish_trait_dataset_name,
+ "Geno": retrieve_geno_trait_dataset_name,
+ "Temp": retrieve_temp_trait_dataset_name}
+ if trait_type == "Temp":
+ return retrieve_temp_trait_dataset_name(threshold, trait_name, conn)
+ return fn_map[trait_type](threshold, dataset_name, conn)
+
+
+def retrieve_geno_riset_fields(name, conn):
+ """
+ Retrieve the RISet, and RISetID values for various Geno trait types.
+ """
+ query = (
+ "SELECT InbredSet.Name, InbredSet.Id "
+ "FROM InbredSet, GenoFreeze "
+ "WHERE GenoFreeze.InbredSetId = InbredSet.Id "
+ "AND GenoFreeze.Name = %(name)s")
+ with conn.cursor() as cursor:
+ cursor.execute(query, {"name": name})
+ return dict(zip(["riset", "risetid"], cursor.fetchone()))
+ return {}
+
+def retrieve_publish_riset_fields(name, conn):
+ """
+ Retrieve the RISet, and RISetID values for various Publish trait types.
+ """
+ query = (
+ "SELECT InbredSet.Name, InbredSet.Id "
+ "FROM InbredSet, PublishFreeze "
+ "WHERE PublishFreeze.InbredSetId = InbredSet.Id "
+ "AND PublishFreeze.Name = %(name)s")
+ with conn.cursor() as cursor:
+ cursor.execute(query, {"name": name})
+ return dict(zip(["riset", "risetid"], cursor.fetchone()))
+ return {}
+
+def retrieve_probeset_riset_fields(name, conn):
+ """
+ Retrieve the RISet, and RISetID values for various ProbeSet trait types.
+ """
+ query = (
+ "SELECT InbredSet.Name, InbredSet.Id "
+ "FROM InbredSet, ProbeSetFreeze, ProbeFreeze "
+ "WHERE ProbeFreeze.InbredSetId = InbredSet.Id "
+ "AND ProbeFreeze.Id = ProbeSetFreeze.ProbeFreezeId "
+ "AND ProbeSetFreeze.Name = %(name)s")
+ with conn.cursor() as cursor:
+ cursor.execute(query, {"name": name})
+ return dict(zip(["riset", "risetid"], cursor.fetchone()))
+ return {}
+
+def retrieve_temp_riset_fields(name, conn):
+ """
+ Retrieve the RISet, and RISetID values for `Temp` trait types.
+ """
+ query = (
+ "SELECT InbredSet.Name, InbredSet.Id "
+ "FROM InbredSet, Temp "
+ "WHERE Temp.InbredSetId = InbredSet.Id "
+ "AND Temp.Name = %(name)s")
+ with conn.cursor() as cursor:
+ cursor.execute(query, {"name": name})
+ return dict(zip(["riset", "risetid"], cursor.fetchone()))
+ return {}
+
+def retrieve_riset_fields(trait_type, trait_name, dataset_info, conn):
+ """
+ Retrieve the RISet, and RISetID values for various trait types.
+ """
+ riset_fns_map = {
+ "Geno": retrieve_geno_riset_fields,
+ "Publish": retrieve_publish_riset_fields,
+ "ProbeSet": retrieve_probeset_riset_fields
+ }
+
+ if trait_type == "Temp":
+ riset_info = retrieve_temp_riset_fields(trait_name, conn)
+ else:
+ riset_info = riset_fns_map[trait_type](dataset_info["dataset_name"], conn)
+
+ return {
+ **dataset_info,
+ **riset_info,
+ "riset": (
+ "BXD" if riset_info.get("riset") == "BXD300"
+ else riset_info.get("riset", ""))
+ }
+
+def retrieve_temp_trait_dataset():
+ """
+ Retrieve the dataset that relates to `Temp` traits
+ """
+ # pylint: disable=[C0330]
+ return {
+ "searchfield": ["name", "description"],
+ "disfield": ["name", "description"],
+ "type": "Temp",
+ "dataset_id": 1,
+ "fullname": "Temporary Storage",
+ "shortname": "Temp"
+ }
+
+def retrieve_geno_trait_dataset():
+ """
+ Retrieve the dataset that relates to `Geno` traits
+ """
+ # pylint: disable=[C0330]
+ return {
+ "searchfield": ["name", "chr"],
+ "disfield": ["name", "chr", "mb", "source2", "sequence"],
+ "type": "Geno"
+ }
+
+def retrieve_publish_trait_dataset():
+ """
+ Retrieve the dataset that relates to `Publish` traits
+ """
+ # pylint: disable=[C0330]
+ return {
+ "searchfield": [
+ "name", "post_publication_description", "abstract", "title",
+ "authors"],
+ "disfield": [
+ "name", "pubmed_id", "pre_publication_description",
+ "post_publication_description", "original_description",
+ "pre_publication_abbreviation", "post_publication_abbreviation",
+ "lab_code", "submitter", "owner", "authorized_users",
+ "authors", "title", "abstract", "journal", "volume", "pages",
+ "month", "year", "sequence", "units", "comments"],
+ "type": "Publish"
+ }
+
+def retrieve_probeset_trait_dataset():
+ """
+ Retrieve the dataset that relates to `ProbeSet` traits
+ """
+ # pylint: disable=[C0330]
+ return {
+ "searchfield": [
+ "name", "description", "probe_target_description", "symbol",
+ "alias", "genbankid", "unigeneid", "omim", "refseq_transcriptid",
+ "probe_set_specificity", "probe_set_blat_score"],
+ "disfield": [
+ "name", "symbol", "description", "probe_target_description", "chr",
+ "mb", "alias", "geneid", "genbankid", "unigeneid", "omim",
+ "refseq_transcriptid", "blatseq", "targetseq", "chipid", "comments",
+ "strand_probe", "strand_gene", "probe_set_target_region",
+ "proteinid", "probe_set_specificity", "probe_set_blat_score",
+ "probe_set_blat_mb_start", "probe_set_blat_mb_end",
+ "probe_set_strand", "probe_set_note_by_rw", "flag"],
+ "type": "ProbeSet"
+ }
+
+def retrieve_trait_dataset(trait_type, trait, threshold, conn):
+ """
+ Retrieve the dataset that relates to a specific trait.
+ """
+ dataset_fns = {
+ "Temp": retrieve_temp_trait_dataset,
+ "Geno": retrieve_geno_trait_dataset,
+ "Publish": retrieve_publish_trait_dataset,
+ "ProbeSet": retrieve_probeset_trait_dataset
+ }
+ dataset_name_info = {
+ "dataset_id": None,
+ "dataset_name": trait["db"]["dataset_name"],
+ **retrieve_dataset_name(
+ trait_type, threshold, trait["trait_name"],
+ trait["db"]["dataset_name"], conn)
+ }
+ riset = retrieve_riset_fields(
+ trait_type, trait["trait_name"], dataset_name_info, conn)
+ return {
+ "display_name": dataset_name_info["dataset_name"],
+ **dataset_name_info,
+ **dataset_fns[trait_type](),
+ **riset
+ }
diff --git a/gn3/db/traits.py b/gn3/db/traits.py
index 4860a07..1031e44 100644
--- a/gn3/db/traits.py
+++ b/gn3/db/traits.py
@@ -1,92 +1,668 @@
-"""This contains all the necessary functions that are required to add traits
-to the published database"""
-from dataclasses import dataclass
-from typing import Any, Dict, Optional
+"""This class contains functions relating to trait data manipulation"""
+from typing import Any, Dict, Union, Sequence
+from gn3.function_helpers import compose
+from gn3.db.datasets import retrieve_trait_dataset
-@dataclass(frozen=True)
-class Riset:
- """Class for keeping track of riset. A riset is a group e.g. rat HSNIH-Palmer,
-BXD
+def get_trait_csv_sample_data(conn: Any,
+ trait_name: int, phenotype_id: int):
+ """Fetch a trait and return it as a csv string"""
+ sql = ("SELECT DISTINCT Strain.Id, PublishData.Id, Strain.Name, "
+ "PublishData.value, "
+ "PublishSE.error, NStrain.count FROM "
+ "(PublishData, Strain, PublishXRef, PublishFreeze) "
+ "LEFT JOIN PublishSE ON "
+ "(PublishSE.DataId = PublishData.Id AND "
+ "PublishSE.StrainId = PublishData.StrainId) "
+ "LEFT JOIN NStrain ON (NStrain.DataId = PublishData.Id AND "
+ "NStrain.StrainId = PublishData.StrainId) WHERE "
+ "PublishXRef.InbredSetId = PublishFreeze.InbredSetId AND "
+ "PublishData.Id = PublishXRef.DataId AND "
+ "PublishXRef.Id = %s AND PublishXRef.PhenotypeId = %s "
+ "AND PublishData.StrainId = Strain.Id Order BY Strain.Name")
+ csv_data = ["Strain Id,Strain Name,Value,SE,Count"]
+ publishdata_id = ""
+ with conn.cursor() as cursor:
+ cursor.execute(sql, (trait_name, phenotype_id,))
+ for record in cursor.fetchall():
+ (strain_id, publishdata_id,
+ strain_name, value, error, count) = record
+ csv_data.append(
+ ",".join([str(val) if val else "x"
+ for val in (strain_id, strain_name,
+ value, error, count)]))
+ return f"# Publish Data Id: {publishdata_id}\n\n" + "\n".join(csv_data)
+
+
+def update_sample_data(conn: Any,
+ strain_name: str,
+ strain_id: int,
+ publish_data_id: int,
+ value: Union[int, float, str],
+ error: Union[int, float, str],
+ count: Union[int, str]):
+ """Given the right parameters, update sample-data from the relevant
+ table."""
+ # pylint: disable=[R0913, R0914]
+ STRAIN_ID_SQL: str = "UPDATE Strain SET Name = %s WHERE Id = %s"
+ PUBLISH_DATA_SQL: str = ("UPDATE PublishData SET value = %s "
+ "WHERE StrainId = %s AND Id = %s")
+ PUBLISH_SE_SQL: str = ("UPDATE PublishSE SET error = %s "
+ "WHERE StrainId = %s AND DataId = %s")
+ N_STRAIN_SQL: str = ("UPDATE NStrain SET count = %s "
+ "WHERE StrainId = %s AND DataId = %s")
+
+ updated_strains: int = 0
+ updated_published_data: int = 0
+ updated_se_data: int = 0
+ updated_n_strains: int = 0
+
+ with conn.cursor() as cursor:
+ # Update the Strains table
+ cursor.execute(STRAIN_ID_SQL, (strain_name, strain_id))
+ updated_strains: int = cursor.rowcount
+ # Update the PublishData table
+ cursor.execute(PUBLISH_DATA_SQL,
+ (None if value == "x" else value,
+ strain_id, publish_data_id))
+ updated_published_data: int = cursor.rowcount
+ # Update the PublishSE table
+ cursor.execute(PUBLISH_SE_SQL,
+ (None if error == "x" else error,
+ strain_id, publish_data_id))
+ updated_se_data: int = cursor.rowcount
+ # Update the NStrain table
+ cursor.execute(N_STRAIN_SQL,
+ (None if count == "x" else count,
+ strain_id, publish_data_id))
+ updated_n_strains: int = cursor.rowcount
+ return (updated_strains, updated_published_data,
+ updated_se_data, updated_n_strains)
+
+def retrieve_publish_trait_info(trait_data_source: Dict[str, Any], conn: Any):
+ """Retrieve trait information for type `Publish` traits.
+
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/base/webqtlTrait.py#L399-L421"""
+ keys = (
+ "Id", "PubMed_ID", "Pre_publication_description",
+ "Post_publication_description", "Original_description",
+ "Pre_publication_abbreviation", "Post_publication_abbreviation",
+ "Lab_code", "Submitter", "Owner", "Authorized_Users", "Authors",
+ "Title", "Abstract", "Journal", "Volume", "Pages", "Month", "Year",
+ "Sequence", "Units", "comments")
+ columns = (
+ "PublishXRef.Id, Publication.PubMed_ID, "
+ "Phenotype.Pre_publication_description, "
+ "Phenotype.Post_publication_description, "
+ "Phenotype.Original_description, "
+ "Phenotype.Pre_publication_abbreviation, "
+ "Phenotype.Post_publication_abbreviation, "
+ "Phenotype.Lab_code, Phenotype.Submitter, Phenotype.Owner, "
+ "Phenotype.Authorized_Users, CAST(Publication.Authors AS BINARY), "
+ "Publication.Title, Publication.Abstract, Publication.Journal, "
+ "Publication.Volume, Publication.Pages, Publication.Month, "
+ "Publication.Year, PublishXRef.Sequence, Phenotype.Units, "
+ "PublishXRef.comments")
+ query = (
+ "SELECT "
+ "{columns} "
+ "FROM "
+ "PublishXRef, Publication, Phenotype, PublishFreeze "
+ "WHERE "
+ "PublishXRef.Id = %(trait_name)s AND "
+ "Phenotype.Id = PublishXRef.PhenotypeId AND "
+ "Publication.Id = PublishXRef.PublicationId AND "
+ "PublishXRef.InbredSetId = PublishFreeze.InbredSetId AND "
+ "PublishFreeze.Id =%(trait_dataset_id)s").format(columns=columns)
+ with conn.cursor() as cursor:
+ cursor.execute(
+ query,
+ {
+ k:v for k, v in trait_data_source.items()
+ if k in ["trait_name", "trait_dataset_id"]
+ })
+ return dict(zip([k.lower() for k in keys], cursor.fetchone()))
+
+def set_confidential_field(trait_type, trait_info):
+ """Post processing function for 'Publish' trait types.
+
+ It sets the value for the 'confidential' key."""
+ if trait_type == "Publish":
+ return {
+ **trait_info,
+ "confidential": 1 if (
+ trait_info.get("pre_publication_description", None)
+ and not trait_info.get("pubmed_id", None)) else 0}
+ return trait_info
+
+def retrieve_probeset_trait_info(trait_data_source: Dict[str, Any], conn: Any):
+ """Retrieve trait information for type `ProbeSet` traits.
+
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/base/webqtlTrait.py#L424-L435"""
+ keys = (
+ "name", "symbol", "description", "probe_target_description", "chr",
+ "mb", "alias", "geneid", "genbankid", "unigeneid", "omim",
+ "refseq_transcriptid", "blatseq", "targetseq", "chipid", "comments",
+ "strand_probe", "strand_gene", "probe_set_target_region", "proteinid",
+ "probe_set_specificity", "probe_set_blat_score",
+ "probe_set_blat_mb_start", "probe_set_blat_mb_end", "probe_set_strand",
+ "probe_set_note_by_rw", "flag")
+ query = (
+ "SELECT "
+ "{columns} "
+ "FROM "
+ "ProbeSet, ProbeSetFreeze, ProbeSetXRef "
+ "WHERE "
+ "ProbeSetXRef.ProbeSetFreezeId = ProbeSetFreeze.Id AND "
+ "ProbeSetXRef.ProbeSetId = ProbeSet.Id AND "
+ "ProbeSetFreeze.Name = %(trait_dataset_name)s AND "
+ "ProbeSet.Name = %(trait_name)s").format(
+ columns=", ".join(["ProbeSet.{}".format(x) for x in keys]))
+ with conn.cursor() as cursor:
+ cursor.execute(
+ query,
+ {
+ k:v for k, v in trait_data_source.items()
+ if k in ["trait_name", "trait_dataset_name"]
+ })
+ return dict(zip(keys, cursor.fetchone()))
+
+def retrieve_geno_trait_info(trait_data_source: Dict[str, Any], conn: Any):
+ """Retrieve trait information for type `Geno` traits.
+
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/base/webqtlTrait.py#L438-L449"""
+ keys = ("name", "chr", "mb", "source2", "sequence")
+ query = (
+ "SELECT "
+ "{columns} "
+ "FROM "
+ "Geno, GenoFreeze, GenoXRef "
+ "WHERE "
+ "GenoXRef.GenoFreezeId = GenoFreeze.Id AND GenoXRef.GenoId = Geno.Id AND "
+ "GenoFreeze.Name = %(trait_dataset_name)s AND "
+ "Geno.Name = %(trait_name)s").format(
+ columns=", ".join(["Geno.{}".format(x) for x in keys]))
+ with conn.cursor() as cursor:
+ cursor.execute(
+ query,
+ {
+ k:v for k, v in trait_data_source.items()
+ if k in ["trait_name", "trait_dataset_name"]
+ })
+ return dict(zip(keys, cursor.fetchone()))
+
+def retrieve_temp_trait_info(trait_data_source: Dict[str, Any], conn: Any):
+ """Retrieve trait information for type `Temp` traits.
+
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/base/webqtlTrait.py#L450-452"""
+ keys = ("name", "description")
+ query = (
+ "SELECT {columns} FROM Temp "
+ "WHERE Name = %(trait_name)s").format(columns=", ".join(keys))
+ with conn.cursor() as cursor:
+ cursor.execute(
+ query,
+ {
+ k:v for k, v in trait_data_source.items()
+ if k in ["trait_name"]
+ })
+ return dict(zip(keys, cursor.fetchone()))
+
+def set_haveinfo_field(trait_info):
+ """
+ Common postprocessing function for all trait types.
+ Sets the value for the 'haveinfo' field."""
+ return {**trait_info, "haveinfo": 1 if trait_info else 0}
+
+def set_homologene_id_field_probeset(trait_info, conn):
"""
- name: Optional[str]
- r_id: Optional[int]
+ Postprocessing function for 'ProbeSet' traits.
+ Sets the value for the 'homologene' key.
+ """
+ query = (
+ "SELECT HomologeneId FROM Homologene, Species, InbredSet"
+ " WHERE Homologene.GeneId = %(geneid)s AND InbredSet.Name = %(riset)s"
+ " AND InbredSet.SpeciesId = Species.Id AND"
+ " Species.TaxonomyId = Homologene.TaxonomyId")
+ with conn.cursor() as cursor:
+ cursor.execute(
+ query,
+ {
+ k:v for k, v in trait_info.items()
+ if k in ["geneid", "riset"]
+ })
+ res = cursor.fetchone()
+ if res:
+ return {**trait_info, "homologeneid": res[0]}
+ return {**trait_info, "homologeneid": None}
-@dataclass(frozen=True)
-class WebqtlCaseData:
- """Class for keeping track of one case data in one trait"""
- value: Optional[float] = None
- variance: Optional[float] = None
- count: Optional[int] = None # Number of Individuals
+def set_homologene_id_field(trait_type, trait_info, conn):
+ """
+ Common postprocessing function for all trait types.
- def __str__(self):
- _str = ""
- if self.value:
- _str += f"value={self.value:.3f}"
- if self.variance:
- _str += f" variance={self.variance:.3f}"
- if self.count:
- _str += " n_data={self.count}"
- return _str
+ Sets the value for the 'homologene' key."""
+ set_to_null = lambda ti: {**ti, "homologeneid": None}
+ functions_table = {
+ "Temp": set_to_null,
+ "Geno": set_to_null,
+ "Publish": set_to_null,
+ "ProbeSet": lambda ti: set_homologene_id_field_probeset(ti, conn)
+ }
+ return functions_table[trait_type](trait_info)
+def load_publish_qtl_info(trait_info, conn):
+ """
+ Load extra QTL information for `Publish` traits
+ """
+ query = (
+ "SELECT PublishXRef.Locus, PublishXRef.LRS, PublishXRef.additive "
+ "FROM PublishXRef, PublishFreeze "
+ "WHERE PublishXRef.Id = %(trait_name)s "
+ "AND PublishXRef.InbredSetId = PublishFreeze.InbredSetId "
+ "AND PublishFreeze.Id = %(dataset_id)s")
+ with conn.cursor() as cursor:
+ cursor.execute(
+ query,
+ {
+ "trait_name": trait_info["trait_name"],
+ "dataset_id": trait_info["db"]["dataset_id"]
+ })
+ return dict(zip(["locus", "lrs", "additive"], cursor.fetchone()))
+ return {"locus": "", "lrs": "", "additive": ""}
-def lookup_webqtldataset_name(riset_name: str, conn: Any):
- """Given a group name(riset), return it's name e.g. BXDPublish,
-HLCPublish."""
+def load_probeset_qtl_info(trait_info, conn):
+ """
+ Load extra QTL information for `ProbeSet` traits
+ """
+ query = (
+ "SELECT ProbeSetXRef.Locus, ProbeSetXRef.LRS, ProbeSetXRef.pValue, "
+ "ProbeSetXRef.mean, ProbeSetXRef.additive "
+ "FROM ProbeSetXRef, ProbeSet "
+ "WHERE ProbeSetXRef.ProbeSetId = ProbeSet.Id "
+ " AND ProbeSet.Name = %(trait_name)s "
+ "AND ProbeSetXRef.ProbeSetFreezeId = %(dataset_id)s")
with conn.cursor() as cursor:
cursor.execute(
- "SELECT PublishFreeze.Name FROM "
- "PublishFreeze, InbredSet WHERE "
- "PublishFreeze.InbredSetId = InbredSet.Id "
- "AND InbredSet.Name = '%s'" % riset_name)
- _result, *_ = cursor.fetchone()
- return _result
-
-
-def get_riset(data_type: str, name: str, conn: Any):
- """Get the groups given the data type and it's PublishFreeze or GenoFreeze
-name
-
- """
- query, _name, _id = None, None, None
- if data_type == "Publish":
- query = ("SELECT InbredSet.Name, InbredSet.Id FROM InbredSet, "
- "PublishFreeze WHERE PublishFreeze.InbredSetId = "
- "InbredSet.Id AND PublishFreeze.Name = '%s'" % name)
- elif data_type == "Geno":
- query = ("SELECT InbredSet.Name, InbredSet.Id FROM InbredSet, "
- "GenoFreeze WHERE GenoFreeze.InbredSetId = "
- "InbredSet.Id AND GenoFreeze.Name = '%s'" % name)
- elif data_type == "ProbeSet":
- query = ("SELECT InbredSet.Name, InbredSet.Id FROM "
- "InbredSet, ProbeSetFreeze, ProbeFreeze WHERE "
- "ProbeFreeze.InbredSetId = InbredSet.Id AND "
- "ProbeFreeze.Id = ProbeSetFreeze.ProbeFreezeId AND "
- "ProbeSetFreeze.Name = '%s'" % name)
- if query:
- with conn.cursor() as cursor:
- _name, _id = cursor.fetchone()
- if _name == "BXD300":
- _name = "BXD"
- return Riset(_name, _id)
-
-
-def insert_publication(pubmed_id: int, publication: Optional[Dict],
- conn: Any):
- """Creates a new publication record if it's not available"""
- sql = ("SELECT Id FROM Publication where "
- "PubMed_ID = %d" % pubmed_id)
- _id = None
+ query,
+ {
+ "trait_name": trait_info["trait_name"],
+ "dataset_id": trait_info["db"]["dataset_id"]
+ })
+ return dict(zip(
+ ["locus", "lrs", "pvalue", "mean", "additive"], cursor.fetchone()))
+ return {"locus": "", "lrs": "", "pvalue": "", "mean": "", "additive": ""}
+
+def load_qtl_info(qtl, trait_type, trait_info, conn):
+ """
+ Load extra QTL information for traits
+
+ DESCRIPTION:
+ Migrated from
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/base/webqtlTrait.py#L500-L534
+
+ PARAMETERS:
+ qtl: boolean
+ trait_type: string
+ The type of the trait in consideration
+ trait_info: map/dictionary
+ A dictionary of the trait's key-value pairs
+ conn:
+ A database connection object
+ """
+ if not qtl:
+ return trait_info
+ qtl_info_functions = {
+ "Publish": load_publish_qtl_info,
+ "ProbeSet": load_probeset_qtl_info
+ }
+ if trait_info["name"] not in qtl_info_functions.keys():
+ return trait_info
+
+ return qtl_info_functions[trait_type](trait_info, conn)
+
+def build_trait_name(trait_fullname):
+ """
+ Initialises the trait's name, and other values from the search data provided
+ """
+ def dataset_type(dset_name):
+ if dset_name.find('Temp') >= 0:
+ return "Temp"
+ if dset_name.find('Geno') >= 0:
+ return "Geno"
+ if dset_name.find('Publish') >= 0:
+ return "Publish"
+ return "ProbeSet"
+
+ name_parts = trait_fullname.split("::")
+ assert len(name_parts) >= 2, "Name format error"
+ dataset_name = name_parts[0]
+ dataset_type = dataset_type(dataset_name)
+ return {
+ "db": {
+ "dataset_name": dataset_name,
+ "dataset_type": dataset_type},
+ "trait_fullname": trait_fullname,
+ "trait_name": name_parts[1],
+ "cellid": name_parts[2] if len(name_parts) == 3 else ""
+ }
+
+def retrieve_probeset_sequence(trait, conn):
+ """
+ Retrieve a 'ProbeSet' trait's sequence information
+ """
+ query = (
+ "SELECT ProbeSet.BlatSeq "
+ "FROM ProbeSet, ProbeSetFreeze, ProbeSetXRef "
+ "WHERE ProbeSet.Id=ProbeSetXRef.ProbeSetId "
+ "AND ProbeSetFreeze.Id = ProbeSetXRef.ProbeSetFreezeId "
+ "AND ProbeSet.Name = %(trait_name)s "
+ "AND ProbeSetFreeze.Name = %(dataset_name)s")
with conn.cursor() as cursor:
- cursor.execute(sql)
- _id = cursor.fetchone()
- if not _id and publication:
- # The Publication contains the fields: 'authors', 'title', 'abstract',
- # 'journal','volume','pages','month','year'
- insert_query = ("INSERT into Publication (%s) Values (%s)" %
- (", ".join(publication.keys()),
- ", ".join(['%s'] * len(publication))))
- with conn.cursor() as cursor:
- cursor.execute(insert_query, tuple(publication.values()))
+ cursor.execute(
+ query,
+ {
+ "trait_name": trait["trait_name"],
+ "dataset_name": trait["db"]["dataset_name"]
+ })
+ seq = cursor.fetchone()
+ return {**trait, "sequence": seq[0] if seq else ""}
+
+def retrieve_trait_info(
+ threshold: int, trait_full_name: str, conn: Any,
+ qtl=None):
+ """Retrieves the trait information.
+
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/base/webqtlTrait.py#L397-L456
+
+ This function, or the dependent functions, might be incomplete as they are
+ currently."""
+ trait = build_trait_name(trait_full_name)
+ trait_dataset_type = trait["db"]["dataset_type"]
+ trait_info_function_table = {
+ "Publish": retrieve_publish_trait_info,
+ "ProbeSet": retrieve_probeset_trait_info,
+ "Geno": retrieve_geno_trait_info,
+ "Temp": retrieve_temp_trait_info
+ }
+
+ common_post_processing_fn = compose(
+ lambda ti: load_qtl_info(qtl, trait_dataset_type, ti, conn),
+ lambda ti: set_homologene_id_field(trait_dataset_type, ti, conn),
+ lambda ti: {"trait_type": trait_dataset_type, **ti},
+ lambda ti: {**trait, **ti})
+
+ trait_post_processing_functions_table = {
+ "Publish": compose(
+ lambda ti: set_confidential_field(trait_dataset_type, ti),
+ common_post_processing_fn),
+ "ProbeSet": compose(
+ lambda ti: retrieve_probeset_sequence(ti, conn),
+ common_post_processing_fn),
+ "Geno": common_post_processing_fn,
+ "Temp": common_post_processing_fn
+ }
+
+ retrieve_info = compose(
+ set_haveinfo_field, trait_info_function_table[trait_dataset_type])
+
+ trait_dataset = retrieve_trait_dataset(
+ trait_dataset_type, trait, threshold, conn)
+ trait_info = retrieve_info(
+ {
+ "trait_name": trait["trait_name"],
+ "trait_dataset_id": trait_dataset["dataset_id"],
+ "trait_dataset_name": trait_dataset["dataset_name"]
+ },
+ conn)
+ if trait_info["haveinfo"]:
+ return {
+ **trait_post_processing_functions_table[trait_dataset_type](
+ {**trait_info, "riset": trait_dataset["riset"]}),
+ "db": {**trait["db"], **trait_dataset}
+ }
+ return trait_info
+
+def retrieve_temp_trait_data(trait_info: dict, conn: Any):
+ """
+ Retrieve trait data for `Temp` traits.
+ """
+ query = (
+ "SELECT "
+ "Strain.Name, TempData.value, TempData.SE, TempData.NStrain, "
+ "TempData.Id "
+ "FROM TempData, Temp, Strain "
+ "WHERE TempData.StrainId = Strain.Id "
+ "AND TempData.Id = Temp.DataId "
+ "AND Temp.name = %(trait_name)s "
+ "ORDER BY Strain.Name")
+ with conn.cursor() as cursor:
+ cursor.execute(
+ query,
+ {"trait_name": trait_info["trait_name"]})
+ return [dict(zip(
+ ["strain_name", "value", "se_error", "nstrain", "id"], row))
+ for row in cursor.fetchall()]
+ return []
+
+def retrieve_species_id(riset, conn: Any):
+ """
+ Retrieve a species id given the RISet value
+ """
+ with conn.cursor as cursor:
+ cursor.execute(
+ "SELECT SpeciesId from InbredSet WHERE Name = %(riset)s",
+ {"riset": riset})
+ return cursor.fetchone()[0]
+ return None
+
+def retrieve_geno_trait_data(trait_info: Dict, conn: Any):
+ """
+ Retrieve trait data for `Geno` traits.
+ """
+ query = (
+ "SELECT Strain.Name, GenoData.value, GenoSE.error, GenoData.Id "
+ "FROM (GenoData, GenoFreeze, Strain, Geno, GenoXRef) "
+ "LEFT JOIN GenoSE ON "
+ "(GenoSE.DataId = GenoData.Id AND GenoSE.StrainId = GenoData.StrainId) "
+ "WHERE Geno.SpeciesId = %(species_id)s "
+ "AND Geno.Name = %(trait_name)s AND GenoXRef.GenoId = Geno.Id "
+ "AND GenoXRef.GenoFreezeId = GenoFreeze.Id "
+ "AND GenoFreeze.Name = %(dataset_name)s "
+ "AND GenoXRef.DataId = GenoData.Id "
+ "AND GenoData.StrainId = Strain.Id "
+ "ORDER BY Strain.Name")
+ with conn.cursor() as cursor:
+ cursor.execute(
+ query,
+ {"trait_name": trait_info["trait_name"],
+ "dataset_name": trait_info["db"]["dataset_name"],
+ "species_id": retrieve_species_id(
+ trait_info["db"]["riset"], conn)})
+ return [dict(zip(
+ ["strain_name", "value", "se_error", "id"], row))
+ for row in cursor.fetchall()]
+ return []
+
+def retrieve_publish_trait_data(trait_info: Dict, conn: Any):
+ """
+ Retrieve trait data for `Publish` traits.
+ """
+ query = (
+ "SELECT "
+ "Strain.Name, PublishData.value, PublishSE.error, NStrain.count, "
+ "PublishData.Id "
+ "FROM (PublishData, Strain, PublishXRef, PublishFreeze) "
+ "LEFT JOIN PublishSE ON "
+ "(PublishSE.DataId = PublishData.Id "
+ "AND PublishSE.StrainId = PublishData.StrainId) "
+ "LEFT JOIN NStrain ON "
+ "(NStrain.DataId = PublishData.Id "
+ "AND NStrain.StrainId = PublishData.StrainId) "
+ "WHERE PublishXRef.InbredSetId = PublishFreeze.InbredSetId "
+ "AND PublishData.Id = PublishXRef.DataId "
+ "AND PublishXRef.Id = %(trait_name)s "
+ "AND PublishFreeze.Id = %(dataset_id)s "
+ "AND PublishData.StrainId = Strain.Id "
+ "ORDER BY Strain.Name")
+ with conn.cursor() as cursor:
+ cursor.execute(
+ query,
+ {"trait_name": trait_info["trait_name"],
+ "dataset_id": trait_info["db"]["dataset_id"]})
+ return [dict(zip(
+ ["strain_name", "value", "se_error", "nstrain", "id"], row))
+ for row in cursor.fetchall()]
+ return []
+
+def retrieve_cellid_trait_data(trait_info: Dict, conn: Any):
+ """
+ Retrieve trait data for `Probe Data` types.
+ """
+ query = (
+ "SELECT "
+ "Strain.Name, ProbeData.value, ProbeSE.error, ProbeData.Id "
+ "FROM (ProbeData, ProbeFreeze, ProbeSetFreeze, ProbeXRef, Strain,"
+ " Probe, ProbeSet) "
+ "LEFT JOIN ProbeSE ON "
+ "(ProbeSE.DataId = ProbeData.Id "
+ " AND ProbeSE.StrainId = ProbeData.StrainId) "
+ "WHERE Probe.Name = %(cellid)s "
+ "AND ProbeSet.Name = %(trait_name)s "
+ "AND Probe.ProbeSetId = ProbeSet.Id "
+ "AND ProbeXRef.ProbeId = Probe.Id "
+ "AND ProbeXRef.ProbeFreezeId = ProbeFreeze.Id "
+ "AND ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id "
+ "AND ProbeSetFreeze.Name = %(dataset_name)s "
+ "AND ProbeXRef.DataId = ProbeData.Id "
+ "AND ProbeData.StrainId = Strain.Id "
+ "ORDER BY Strain.Name")
+ with conn.cursor() as cursor:
+ cursor.execute(
+ query,
+ {"cellid": trait_info["cellid"],
+ "trait_name": trait_info["trait_name"],
+ "dataset_id": trait_info["db"]["dataset_id"]})
+ return [dict(zip(
+ ["strain_name", "value", "se_error", "id"], row))
+ for row in cursor.fetchall()]
+ return []
+
+def retrieve_probeset_trait_data(trait_info: Dict, conn: Any):
+ """
+ Retrieve trait data for `ProbeSet` traits.
+ """
+ query = (
+ "SELECT Strain.Name, ProbeSetData.value, ProbeSetSE.error, "
+ "ProbeSetData.Id "
+ "FROM (ProbeSetData, ProbeSetFreeze, Strain, ProbeSet, ProbeSetXRef) "
+ "LEFT JOIN ProbeSetSE ON "
+ "(ProbeSetSE.DataId = ProbeSetData.Id "
+ "AND ProbeSetSE.StrainId = ProbeSetData.StrainId) "
+ "WHERE ProbeSet.Name = %(trait_name)s "
+ "AND ProbeSetXRef.ProbeSetId = ProbeSet.Id "
+ "AND ProbeSetXRef.ProbeSetFreezeId = ProbeSetFreeze.Id "
+ "AND ProbeSetFreeze.Name = %(dataset_name)s "
+ "AND ProbeSetXRef.DataId = ProbeSetData.Id "
+ "AND ProbeSetData.StrainId = Strain.Id "
+ "ORDER BY Strain.Name")
+
+ with conn.cursor() as cursor:
+ cursor.execute(
+ query,
+ {"trait_name": trait_info["trait_name"],
+ "dataset_name": trait_info["db"]["dataset_name"]})
+ return [dict(zip(
+ ["strain_name", "value", "se_error", "id"], row))
+ for row in cursor.fetchall()]
+ return []
+
+def with_strainlist_data_setup(strainlist: Sequence[str]):
+ """
+ Build function that computes the trait data from provided list of strains.
+
+ PARAMETERS
+ strainlist: (list)
+ A list of strain names
+
+ RETURNS:
+ Returns a function that given some data from the database, computes the
+ strain's value, variance and ndata values, only if the strain is present
+ in the provided `strainlist` variable.
+ """
+ def setup_fn(tdata):
+ if tdata["strain_name"] in strainlist:
+ val = tdata["value"]
+ if val is not None:
+ return {
+ "strain_name": tdata["strain_name"],
+ "value": val,
+ "variance": tdata["se_error"],
+ "ndata": tdata.get("nstrain", None)
+ }
+ return None
+ return setup_fn
+
+def without_strainlist_data_setup():
+ """
+ Build function that computes the trait data.
+
+ RETURNS:
+ Returns a function that given some data from the database, computes the
+ strain's value, variance and ndata values.
+ """
+ def setup_fn(tdata):
+ val = tdata["value"]
+ if val is not None:
+ return {
+ "strain_name": tdata["strain_name"],
+ "value": val,
+ "variance": tdata["se_error"],
+ "ndata": tdata.get("nstrain", None)
+ }
+ return None
+ return setup_fn
+
+def retrieve_trait_data(trait: dict, conn: Any, strainlist: Sequence[str] = tuple()):
+ """
+ Retrieve trait data
+
+ DESCRIPTION
+ Retrieve trait data as is done in
+ https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/base/webqtlTrait.py#L258-L386
+ """
+ # I do not like this section, but it retains the flow in the old codebase
+ if trait["db"]["dataset_type"] == "Temp":
+ results = retrieve_temp_trait_data(trait, conn)
+ elif trait["db"]["dataset_type"] == "Publish":
+ results = retrieve_publish_trait_data(trait, conn)
+ elif trait["cellid"]:
+ results = retrieve_cellid_trait_data(trait, conn)
+ elif trait["db"]["dataset_type"] == "ProbeSet":
+ results = retrieve_probeset_trait_data(trait, conn)
+ else:
+ results = retrieve_geno_trait_data(trait, conn)
+
+ if results:
+ # do something with mysqlid
+ mysqlid = results[0]["id"]
+ if strainlist:
+ data = [
+ item for item in
+ map(with_strainlist_data_setup(strainlist), results)
+ if item is not None]
+ else:
+ data = [
+ item for item in
+ map(without_strainlist_data_setup(), results)
+ if item is not None]
+
+ return {
+ "mysqlid": mysqlid,
+ "data": dict(map(
+ lambda x: (
+ x["strain_name"],
+ {k:v for k, v in x.items() if x != "strain_name"}),
+ data))}
+ return {}
diff --git a/gn3/function_helpers.py b/gn3/function_helpers.py
new file mode 100644
index 0000000..397b2da
--- /dev/null
+++ b/gn3/function_helpers.py
@@ -0,0 +1,36 @@
+"""
+This module will contain helper functions that should assist in maintaining a
+mostly functional way of programming.
+
+It will also contain miscellaneous functions that can be used globally, and thus
+do not fit well in any other module.
+
+FUNCTIONS:
+compose: This function is used to compose multiple functions into a single
+ function. It passes the results of calling one function to the other until
+ all the functions to be composed are called.
+"""
+from functools import reduce
+
+def compose(*functions):
+ """Compose multiple functions into a single function.
+
+ The utility in this function is not specific to this module, and as such,
+ this function can, and probably should, be moved to a more global module.
+
+ DESCRIPTION:
+ Given `cfn = compose(f_1, f_2, ... f_(n-1), f_n )`, calling
+ `cfn(arg_1, arg_2, ..., arg_m)` should call `f_n` with the arguments passed
+ to `cfn` and the results of that should be passed as arguments to `f_(n-1)`
+ and so on until `f_1` is called with the results of the cumulative calls and
+ that is the result of the entire chain of calls.
+
+ PARAMETERS:
+ functions: a variable argument list of function.
+ """
+ def composed_function(*args, **kwargs):
+ return reduce(
+ lambda res, fn: fn(res),
+ reversed(functions[:-1]),
+ functions[-1](*args, **kwargs))
+ return composed_function
diff --git a/gn3/heatmaps/heatmaps.py b/gn3/heatmaps/heatmaps.py
new file mode 100644
index 0000000..3bf7917
--- /dev/null
+++ b/gn3/heatmaps/heatmaps.py
@@ -0,0 +1,54 @@
+import random
+import plotly.express as px
+
+#### Remove these ####
+
+heatmap_dir = "heatmap_images"
+
+def generate_random_data(data_stop: float = 2, width: int = 10, height: int = 30):
+ """
+ This is mostly a utility function to be used to generate random data, useful
+ for development of the heatmap generation code, without access to the actual
+ database data.
+ """
+ return [[random.uniform(0,data_stop) for i in range(0, width)]
+ for j in range(0, height)]
+
+def heatmap_x_axis_names():
+ return [
+ "UCLA_BXDBXH_CARTILAGE_V2::ILM103710672",
+ "UCLA_BXDBXH_CARTILAGE_V2::ILM2260338",
+ "UCLA_BXDBXH_CARTILAGE_V2::ILM3140576",
+ "UCLA_BXDBXH_CARTILAGE_V2::ILM5670577",
+ "UCLA_BXDBXH_CARTILAGE_V2::ILM2070121",
+ "UCLA_BXDBXH_CARTILAGE_V2::ILM103990541",
+ "UCLA_BXDBXH_CARTILAGE_V2::ILM1190722",
+ "UCLA_BXDBXH_CARTILAGE_V2::ILM6590722",
+ "UCLA_BXDBXH_CARTILAGE_V2::ILM4200064",
+ "UCLA_BXDBXH_CARTILAGE_V2::ILM3140463"]
+#### END: Remove these ####
+
+# Grey + Blue + Red
+def generate_heatmap():
+ rows = 20
+ data = generate_random_data(height=rows)
+ y = (["%s"%x for x in range(1, rows+1)][:-1] + ["X"]) #replace last item with x for now
+ fig = px.imshow(
+ data,
+ x=heatmap_x_axis_names(),
+ y=y,
+ width=500)
+ fig.update_traces(xtype="array")
+ fig.update_traces(ytype="array")
+ # fig.update_traces(xgap=10)
+ fig.update_xaxes(
+ visible=True,
+ title_text="Traits",
+ title_font_size=16)
+ fig.update_layout(
+ coloraxis_colorscale=[
+ [0.0, '#3B3B3B'], [0.4999999999999999, '#ABABAB'],
+ [0.5, '#F5DE11'], [1.0, '#FF0D00']])
+
+ fig.write_html("%s/%s"%(heatmap_dir, "test_image.html"))
+ return fig
diff --git a/guix.scm b/guix.scm
index f20d62a..729d089 100644
--- a/guix.scm
+++ b/guix.scm
@@ -17,6 +17,17 @@
;;; You should have received a copy of the GNU General Public License
;;; along with genenetwork3. If not, see https://www.gnu.org/licenses/.
+;; To use this file to build HEAD of gemma:
+;;
+;; env GUIX_PACKAGE_PATH=~/guix-bioinformatics/ guix build -f guix.scm
+;;
+;; After checking out the git repo
+;; cd ~ ; git clone https://git.genenetwork.org/guix-bioinformatics/guix-bioinformatics
+;;
+;; To get a development container (e.g., run in emacs shell).
+;;
+;; env GUIX_PACKAGE_PATH=~/guix-bioinformatics/ guix environment -C -l guix.scm
+
(use-modules
(srfi srfi-1)
(srfi srfi-26)
@@ -27,10 +38,12 @@
(gn packages python)
(gnu packages base)
(gnu packages check)
+ (gnu packages graph)
(gnu packages cran)
(gnu packages databases)
(gnu packages statistics)
(gnu packages bioconductor)
+ (gn packages golang)
(gnu packages python)
(gnu packages python-check)
(gnu packages python-crypto)
@@ -70,8 +83,9 @@
#:recursive? #t
#:select? git-file?))
(propagated-inputs `(("coreutils" ,coreutils)
- ("diffutils" ,diffutils)
+ ("csvdiff" ,go-github-com-aswinkarthik-csvdiff)
("gemma-wrapper" ,gemma-wrapper)
+ ("gunicorn" ,gunicorn)
("python" ,python-wrapper)
("python-bcrypt" ,python-bcrypt)
("python-flask" ,python-flask)
@@ -84,15 +98,13 @@
("python-redis" ,python-redis)
("python-requests" ,python-requests)
("python-scipy" ,python-scipy)
- ("python-sqlalchemy-stubs" ,python-sqlalchemy-stubs)
- ("r" ,r)
- ("r-qtl" ,r-qtl)
+ ("python-sqlalchemy-stubs"
+ ,python-sqlalchemy-stubs)
("r-optparse" ,r-optparse)
+ ("r-qtl" ,r-qtl)
("r-stringi" ,r-stringi)
- ("r-stringr" ,r-stringr)
- ("r-testthat" ,r-testthat)
- ("r-wgcna" ,r-wgcna)
- ))
+ ("python-plotly" ,python-plotly)
+ ("python-pandas" ,python-pandas)))
(build-system python-build-system)
(home-page "https://github.com/genenetwork/genenetwork3")
(synopsis "GeneNetwork3 API for data science and machine learning.")
diff --git a/main.py b/main.py
index e3ca41a..a587697 100644
--- a/main.py
+++ b/main.py
@@ -2,6 +2,8 @@
from gn3.app import create_app
-
app = create_app()
-app.run(host="0.0.0.0")
+
+if __name__ == '__main__':
+ print("Starting app...")
+ app.run()
diff --git a/scripts/rqtl_wrapper.R b/scripts/rqtl_wrapper.R
index f9c2c3b..ffff5b9 100644
--- a/scripts/rqtl_wrapper.R
+++ b/scripts/rqtl_wrapper.R
@@ -172,7 +172,7 @@ if (!is.null(opt$addcovar)) {
if (!is.null(opt$pstrata)) {
covar_names = trait_names[3:length(trait_names) - 1]
} else {
- covar_names = trait_names[3:length(trait_names)]
+ covar_names = trait_names[2:length(trait_names)]
}
covars <- pull.pheno(cross_object, covar_names)
}
diff --git a/sql/map-database.sh b/sql/map-database.sh
new file mode 100755
index 0000000..2e4d1d7
--- /dev/null
+++ b/sql/map-database.sh
@@ -0,0 +1,15 @@
+#! /bin/sh -e
+
+# This scripts visualizes schema.sql into schema.png and schema.svg. It uses
+# sqlt-graph from the perl-sql-transform package. Sadly, perl-sql-transform is
+# not packaged for Guix yet. We will likely deprecate this script in favor of
+# a custom scheme script that does not depend on perl-sql-transform.
+
+skip_tables=AvgMethod,CeleraINFO_mm6,Chr_Length,DatasetMapInvestigator,DatasetStatus,Dataset_mbat,EnsemblProbe,EnsemblProbeLocation,GORef,GeneCategory,GeneIDXRef,GeneList_rn3,GeneList_rn33,GeneMap_cuiyan,GeneRIFXRef,GenoCode,GenoFile,GenoSE,H2,InfoFiles,InfoFilesUser_md5,LCorrRamin3,RatSnpPattern,Sample,SampleXRef,SnpAllRat,SnpAllele_to_be_deleted,SnpPattern,SnpSource,Vlookup,metadata_audit,pubmedsearch,temporary
+
+clusters="Others=AccessLog,Docs,Investigators,MachineAccessLog,News,Organizations,TableComments,TableFieldAnnotation,User,UserPrivilege,login,role,roles_users,user,user_collection,user_openids"
+
+flags="--db MySQL --skip-tables $skip_tables --cluster $clusters"
+
+sqlt-graph $flags --output-type png --output schema.png schema.sql
+sqlt-graph $flags --output-type svg --output schema.svg schema.sql
diff --git a/sql/schema-from-in-db-documentation.org b/sql/schema-from-in-db-documentation.org
new file mode 100644
index 0000000..6ed7579
--- /dev/null
+++ b/sql/schema-from-in-db-documentation.org
@@ -0,0 +1,1817 @@
+This is a description of the GeneNetwork database extracted from the tables
+/TableFieldAnnotation/ and /TableComments/.
+
+* Vlookup
+It's been used by Arthur for annotation updates.
+** alias
+** AlignID
+** assembly
+** AvgMethodId
+** BlatSeq
+** CAS_number
+** cdsEnd
+** cdsStart
+** ChEBI_ID
+** ChEMBL_ID
+** ChemSpider_ID
+** Chr
+** DatasetId
+** description
+** EC_number
+** exonCount
+** exonEnds
+** exonStarts
+** Full_Description
+** GeneChipId
+** GeneId
+** GN_AccesionId
+** HMDB_ID
+** Id
+** InbredSetId
+** InfoFileId
+** InfoPageName
+** KEGG_ID
+** kgID
+** Mb
+** Molecular_Weight
+** Name
+** NM_ID
+** Nugowiki_ID
+** Position
+** Probe_set_Blat_Mb_end
+** Probe_set_Blat_Mb_start
+** ProteinID
+** PubChem_ID
+** SnpName
+** SpeciesId
+** Strand
+** Symbol
+** TissueId
+** TxEnd
+** TxStart
+** UNII_ID
+** VLBlatSeq
+** VLProbeSetId
+
+* user_openids
+TO BE IMPLEMENTED (maybe). Table to link to OpenID. Probably not needed.
+** openid_url
+** user_id
+
+* user_collection
+GN2 user collection of traits.
+** changed_timestamp
+** created_timestamp
+** id
+** members
+** name
+** user
+
+* UserPrivilege
+Used to define if an Assay data set (old "ProbeSetFreeze") can be opened and downloaded.
+** download_result_priv
+** ProbeSetFreezeId
+** UserId
+
+* USER
+GN2 only.
+
+Comment on User type and password.
+This table has 47 users in GN2 as of Mar 2016.
+** active
+** confirmed
+** createtime
+** disable
+** email
+** email_address
+** full_name
+** grpName
+** id
+** lastlogin
+** name
+** organization
+** password
+this is a hash value of user's password
+** privilege
+** registration_info
+** superuser
+** user_ip
+
+* TissueProbeSetData
+These 'Tissue' tables are used by the Tissue Correlation tool in GN1. Not implemented yet in GN2. Mainly Illumina Mouse version 6.1 data.
+** Id
+** TissueID
+** value
+
+* TissueProbeFreeze
+These 'Tissue' tables are used by the Tissue Correlation tool in GN1. Not implemented yet in GN2.
+** ChipId
+** CreateTime
+** FullName
+** Id
+** InbredSetId
+** Name
+** ShortName
+** StrainId
+
+* Tissue
+(RWW Nov 2007): A small table that may be used to build pull-down menus in GN1 and GN2. This table contains simple one to three word terms describing the tissue, cell, organ, or other biological material used in the microarray experiment. This table is used in conjunction with the FIND RECORDS "Type" field.
+
+As of Nov 2007 this table contained only 15 rows:
+As of Mar 2016 this table contains 158 rows.
+
+Whole Brain
+Cerebellum
+Hematopoietic Cells
+Liver
+etc.
+
+How is this table used? Probably to create menu fields. Talk with Chris Mungall and colleagues about controlled vocabulary for APIs.
+
+** BIRN_lex_ID
+Need to get official IDs for tissues, cells, etc.
+** BIRN_lex_Name
+Need to get official IDs for tissues, cells, etc.
+** Id
+Incremented integer uniquely identifies the record.
+** Name
+Name of the biological material used in the experiment.
+** Short_Name
+** TissueId
+** TissueName
+
+* temporary
+This is probably the content of the user's collection. Lost at end of user's session.
+** GeneID
+** HomoloGene
+** OMIM
+** Other_GeneID
+** Symbol
+** tax_id
+
+* TempData
+
+** Id
+** NStrain
+** SE
+** StrainId
+** value
+
+* Temp
+
+** createtime
+** DataId
+** description
+** Id
+** InbredSetId
+** IP
+** Name
+
+* StrainXRef
+RENAME something like "SubjectXRef". This table links the information in the Strain table with InbredSet and provides order for the strains in the mapping population.
+** InbredSetId
+Foreign key to InbredSet:Id
+The Id of the mapping population in the InbredSet table.
+** OrderId
+Order of the strains in the Genotype file or mapping population, follows the pattern 10, 20 rather than 1,2.
+** PedigreeStatus
+** StrainId
+Foreign key to Strain:Id
+The Id of the mapping population strain in Strain table.
+** Used_for_mapping
+
+* Strain
+RENAME "SubjectDescription" . This table to keep track of case/subject identifiers (cases or F2 or strains). But we have the problem that there may be multiple observation per subject or the time series data for one case, (multiple ages for one strain, etc). Generic sample/case identifiers here.
+Contains 14,000 rows as of March 2016. We really need a new table "ObservationOfSubject" (RWW 2016)
+
+Apurva would like to extend this table to include "DateOfBirth" and "BatchNumber".
+
+
+** Alias
+** Id
+GN internal identifier for the strain
+** Name
+official strain name/symbol
+** Name2
+** SpeciesId
+Foreign key to Species:Id
+species of strain
+** Symbol
+short strain symbol used in graphs and tables
+
+* Species
+Contains the internal Ids and names for various species.
+** Id
+internal GeneNetwork species identifier
+** Name
+the common name of the species
+
+* Source
+This table contains one record for every SNP dataset represented in the Snp table.
+[Created by Robert Crowell, August 18, 2005. Annotation of table, Robert Crowell, Aug 22, 2005.]
+
+<b>See also:</b>
+<a href="/cgi-bin/beta/schema.py#Snp">Snp</a>
+** DateAdded
+date when the data source was added to our database
+** DateCreated
+date when the data source was produced
+** Name
+name of this source
+** SourceId
+internal GeneNetwork identifier for the source dataset
+
+* SNP_perlegen
+DEPRECATED: use the Snp table instead.
+
+The complete perlegen dataset. This table is deprecated.
+Created by Robert Crowell, 2005.
+** Id
+** mb
+** A_J
+** AKR_J
+** BALB_CBYJ
+** BTBR_T_TF_J
+** C3H_HEJ
+** C57BL_6J
+** DBA_2J
+** FVB_NJ
+** KK_H1J
+** MOLF_EIJ
+** NOD_LTJ
+** NZW_LACJ
+** PWD_PHJ
+** WSB_EIJ
+** 129S1_SVIMJ
+** chr
+** B6_D2
+** B6_AJ
+** D2_AJ
+** old
+old=1 SNPs belong to the Flint dataset (chr2 only)
+** source
+** nes
+** nc
+** length
+** 5_flanking
+** 5_assay
+** observed
+** 3_assay
+** 3_flanking
+** sequence
+** strand
+** score
+** fraction
+** major_count
+** minor_count
+** n_count
+** state_string
+** CAST_EIJ
+** Score_Blat
+** chr_Blat
+** Mb_Blat
+
+* SNP_mpd
+The complete MPD dataset. This table is soon to be deprecated.
+** id
+** chr
+** mb
+** class
+** function
+** 129S1_SvImJ
+** 129X1_SvJ
+** A_HeJ
+** A_J
+** AKR_J
+** ALR_LtJ
+** ALS_LtJ
+** D2_Hc_0_H2_d_H2_T18_c_oSnJ
+** BALB_cByJ
+** BALB_cJ
+** BPH_2J
+** BPN_3J
+** BTBR_T_tf_J
+** BUB_BnJ
+** C3H_HeJ
+** C3HeB_FeJ
+** C57BL_10J
+** C57BL_6J
+** C57BR_cdJ
+** C57L_J
+** C58_J
+** CAST_EiJ
+** CBA_CaJ
+** CBA_J
+** CE_J
+** CZECHII_EiJ
+** DBA_1J
+** DBA_2J
+** FVB_NJ
+** I_LnJ
+** KK_HlJ
+** LG_J
+** LP_J
+** MA_MyJ
+** MRL_MpJ
+** NOD_LtJ
+** NON_LtJ
+** NZB_BlNJ
+** NZW_LacJ
+** PERA_EiJ
+** PL_J
+** RF_J
+** RIIIS_J
+** SB_LeJ
+** SEA_GnJ
+** SJL_J
+** SM_J
+** SPRET_EiJ
+** ST_bJ
+** SWR_J
+** WSB_EiJ
+** ZALENDE_EiJ
+** source
+** ss
+** ss_orientation
+** rs
+** nmappings
+** snpID
+** insertions
+** B6_D2
+** B6_AJ
+** D2_AJ
+
+* SnpPattern
+Data used by SNP Browser. Variant browser needs to be redone from scratch using a decent architecture. 80 million SNPs in this table from sequence data of 2011 (Keane et al. Nature) but imputed to many other strains.
+** 129P2/OlaHsd
+** 129S1/SvImJ
+** 129S2/SvHsd
+** 129S4/SvJae
+** 129S5/SvEvBrd
+** 129S6/SvEv
+** 129T2/SvEmsJ
+** 129X1/SvJ
+** A/J
+** AKR/J
+** B6A6_Esline_Regeneron
+** BALB/cByJ
+** BALB/cJ
+** BPH/2J
+** BPL/1J
+** BPN/3J
+** BTBRT<+>tf/J
+** BUB/BnJ
+** C2T1_Esline_Nagy
+** C3H/HeJ
+** C3HeB/FeJ
+** C57BL/10J
+** C57BL/6ByJ
+** C57BL/6J
+** C57BL/6JBomTac
+** C57BL/6JCrl
+** C57BL/6JOlaHsd
+** C57BL/6NCrl
+** C57BL/6NHsd
+** C57BL/6NJ
+** C57BL/6NNIH
+** C57BL/6NTac
+** C57BLKS/J
+** C57BR/cdJ
+** C57L/J
+** C58/J
+** CALB/RkJ
+** CAST/EiJ
+** CBA/J
+** CE/J
+** CZECHII/EiJ
+** DBA/1J
+** DBA/2J
+** DDK/Pas
+** DDY/JclSidSeyFrkJ
+** EL/SuzSeyFrkJ
+** Fline
+** FVB/NJ
+** HTG/GoSfSnJ
+** I/LnJ
+** ILS/IbgTejJ
+** IS/CamRkJ
+** ISS/IbgTejJ
+** JF1/Ms
+** KK/HlJ
+** LEWES/EiJ
+** LG/J
+** Lline
+** LP/J
+** MA/MyJ
+** MAI/Pas
+** MOLF/EiJ
+** MOLG/DnJ
+** MRL/MpJ
+** MSM/Ms
+** NOD/ShiLtJ
+** NON/LtJ
+** NOR/LtJ
+** NZB/BlNJ
+** NZL/LtJ
+** NZO/HlLtJ
+** NZW/LacJ
+** O20
+** P/J
+** PERA/EiJ
+** PERC/EiJ
+** PL/J
+** PWD/PhJ
+** PWK/PhJ
+** Qsi5
+** RBA/DnJ
+** RF/J
+** RIIIS/J
+** SEA/GnJ
+** SEG/Pas
+** SJL/J
+** SKIVE/EiJ
+** SM/J
+** SnpId
+** SOD1/EiJ
+** SPRET/EiJ
+** ST/bJ
+** SWR/J
+** TALLYHO/JngJ
+** WSB/EiJ
+** ZALENDE/EiJ
+
+* SnpAllele_to_be_deleted
+OK, delete this then. (RWW March 2016)
+** Base
+** Id
+** Info
+
+* SnpAll
+CHECK, UPDATE or DELETE. Antique data that may be used by SNP Browser or by SNP displays in GN1 maps (single chromosome views). Probably only data for mouse in the table although structured for other species too.
+** 3Prime_UTR
+** 5Prime_UTR
+** Alleles
+** BlatScore
+** Chromosome
+** Class
+** conservation
+** ConservationScore
+** Domain
+** Downstream
+** Exon
+** Flanking3
+** Flanking5
+** Function
+** Gene
+** Id
+** Intergenic
+** Intron
+** Mb
+** MbCelera
+** Mb_mm6
+** ncbi
+** Non_Splice_Site
+** Non_Synonymous_Coding
+** Position
+** Rs
+** SnpName
+** Source
+** SourceId
+** SpeciesId
+** Splice_Site
+** Ss
+** Start_Gained
+** Start_Lost
+** Stop_Gained
+** Stop_Lost
+** Strand
+** Synonymous_Coding
+** Type
+** Unknown_Effect_In_Exon
+** Upstream
+
+* Snp
+This table contains a record for every SNP available in GN. To locate SNPs at a certain location, first query the SNP table. Using the Id values, the Allele table can be queried to obtain the allele calls for all strains for this SNP.
+[Created by Robert Crowell, August 18, 2005. Annotation of table, Robert Crowell, Aug 24, 2005.]
+
+<b>See also:</b>
+<a href="/cgi-bin/beta/schema.py#Allele">Allele</a>
+<a href="/cgi-bin/beta/schema.py#Source">Source</a>
+** BlatScore
+score of the BLAT alignment
+** Chromosome
+chromosome from the UCSC Genome Brower; for mouse SNPs we have used mm6 BLAT analysis or other source
+** Class
+if a singleton occurs in a wild strain Class is 0, otherwise it is the same as MinorCount
+** Flanking3
+100 base sequence on the 3' side of this SNP
+** Flanking5
+100 base sequence on the 5' side of this SNP
+** Function
+function class annotation using conventions of Mouse Phenome project SNP display
+** Id
+internal GeneNetwork identifier for this SNP
+** MajorAllele
+the more common allele for all strains in this SNP
+** MajorCount
+number of strains in the dataset containing this SNP's major allele (see MajorAllele below)
+** Mb
+position in megabases from the BLAT alignment or other source
+** MbCelera
+position in megabases given by Celera (obsolete field)
+** MinorAllele
+the less common allele for all strains in this SNP
+** MinorCount
+number of strains in the dataset containing this SNP's minor allele (see MinorAllele below)
+** MissingCount
+number of strains in the dataset without an allele call
+** Rs
+dbSNP rs#
+** SnpId
+commonly used identifier of a SNP from dbSNP, Celera, Perlegen or other source
+** SourceId
+Foreign key to Source.SourceId
+internal GeneNetwork identifier for the source dataset
+** Type
+polymorphism classification using conventions of Mouse Phenome project SNP display
+
+* SE
+This simple but huge table contains Standard Error of the Mean data that matches the "Data" table.
+
+Created by Jintao, March 2003.
+To retrieve or insert the data for an experiment there should be also corresponding entries in the ProbeXRef table for the raw data (references ProbeFreeze) or in the ProbeSetXRef table for transformed data (references ProbeSetFreeze).
+** DataId
+** error
+** StrainId
+
+* SampleXRef
+DEPRECATED. Used only in GN1 from 2004 to 2006 to display CEL files and array scan images for QC.
+** ProbeFreezeId
+** SampleId
+
+* Sample
+DEPRECATED. Only used in GN1 between 2004 and about 2006 to display images of microarray data.
+
+A table that provides access to low-level array data in GeneNetwork. This table is used only from tables embedded in INFO files such as http://www.genenetwork.org/dbdoc/BR_U_1203_MR.html. The table will call an Image URL and CEL file URL, a DAT file URL, etc. This format and table has not been used since about 2005. We should develop a better method to allow access to raw data from GN.
+
+** Age
+** CELURL
+** CHPURL
+** CreateTime
+** DATURL
+** EXPURL
+** FromSrc
+** Id
+** ImageURL
+** Name
+** RPTURL
+** Sex
+** StrainId
+** TissueType
+** TXTURL
+
+* role
+Noble intent table. Can be deleted or implemented. Idea was "administrator", "curator", "owner", "user"
+** description
+** name
+** the_id
+
+* QuickSearch
+Check if needed by GN2 with Zach. If not, then delete (Lei Yan March 2016).
+** result_fields
+** table_name
+** terms
+** the_key
+
+* PValue
+
+** DataId
+** pvalue
+
+* pubmedsearch
+Data table used to find gene symbols associated with authors. Created by Lei Yan for Author search functions in GN1. Check if this works in GN2. This function has alrways been a bit flaky.
+** authorfullname
+** authorshortname
+** geneid
+** id
+** institute
+** pubmedid
+** title
+
+* PublishXRef
+
+** comments
+** DataId
+** Id
+** InbredSetId
+** PhenotypeId
+** PublicationId
+** Sequence
+
+* PublishSE
+Table contains the standard error of the phenotype value.
+** DataId
+** error
+** StrainId
+
+* PublishFreeze
+This is a table of cohorts/populations that have associated Phenotype data in the "Type" menu of the GN "Select and Search" page. As of March 2016 this table has 34 rows corresponding to 34 Published Phenotype data sets for different groups. When we enter a new group (cohort or population or RI set) that will have phenotypes into GeneNetwork, then we need to add data to this table. Be careful, when you add a new "PublishFreeze.Name" here then you must also make sure that the Group name (e.g. "BXD" in the "InbredSet" table) exactly matches the first part of the PublishFreeze.Name" or else the code will generate an error.
+
+** AuthorisedUsers
+** confidentiality
+** CreateTime
+** FullName
+This is the long name that goes into the menu. Order is not controlled yet but this could be added.
+** Id
+Unique integer. Just an integer that unique specifies one of the Published Phenotype data sets. 1 = BXDPublish, 34 = HSNIHPPublish
+** InbredSetId
+** Name
+Must be unique. This is the name of the Published (and unpublished) data associated with a cohort or population. The name here (example "BXDPublish") must match a specific cohort name (e.g. "BXD", also known as an "InbredSet" name).
+** public
+** ShortName
+
+* PublishData
+Data on phenotypes. Equivalent roughly to ProbeSetData. 1 million records as of March 2016. Much of these data are actually not published yet.
+This is really "StandardPhenotypeData". Currently also includes some metagenomic data.
+** Id
+** StrainId
+** value
+
+* Publiction
+Comment
+
+* Publication
+Used by Phenotypes data sets. Each published phenotype is associated with a PubMed ID. All data should ideally be populated automatically from PubMed rather entered by users.
+** Abstract
+** Authors
+** Id
+** Journal
+** Month
+** Pages
+** PubMed_ID
+** Title
+** Volume
+** Year
+
+* ProbeXRef
+
+** DataId
+** ProbeFreezeId
+** ProbeId
+
+* ProbeSetXRef_TEMP
+
+** DataId
+** Locus
+** Locus_old
+** LRS
+** LRS_old
+** mean
+** ProbeSetFreezeId
+** ProbeSetId
+** pValue
+** pValue_old
+** se
+
+* ProbeSetXRef
+This table contains summary data used by the Advanced Search feature in GN1 and GN2 (e.g "mean=(6 20)", for a particular data sets, including information on average expression of probe sets and probes, phenotypes, LRS values of single best QTL, p values of single best QTL, additive effect of single best QTL, locus ID of the marker closest to the single best QTL, etc.
+** additive
+additive effect size from QTL Reaper at highest QTL peak
+** DataId
+** h2
+** Locus
+locus or marker closest to highest QTL peak
+** Locus_old
+** LRS
+LRS from QTL Reaper of highest QTL peak
+** LRS_old
+** mean
+average expression across data set for a particular probe set
+** ProbeSetFreezeId
+** ProbeSetId
+** pValue
+p value based on QTL Reaper of highest QTL peak
+** pValue_old
+** se
+range of expression (not actually SE) across data set for a particular probe set
+
+* ProbeSetSE
+Contains standard error of assays in ProbeSetData. Roughly 0.5 billion rows as of March 2016. Human data do not have error terms usually.
+** DataId
+** error
+** StrainId
+
+* ProbeSetFreeze
+RENAME: AssayDataSet or something more neutral. Delete the word "Freeze" from this table.
+
+ProbeSetFreeze contains the information of the data analysis method used in the processing the microarray experiment data described in the ProbeFreeze table and the confidentiality of the resulting data. New records should be inserted only if the relevant ProbeFreeze and AvgMethod records are in place. The use of the four different name fields effectively containing 4 versions of the same information needs to be clarified. 120 records on Dec 2006. About 700 records March 2016.
+
+The name of a data set in GN is "ProbeSetFreeze.FullName" and is used in several output tables and graphs, for example ClusterMap in this format -- ProbesetID::FullName
+
+
+Comment by PP and RW March 2016: This key table needs to be evaluated and renamed. Was initially designed to hold large microarray data, but now must accommodate any large "omics" data, but not genotypes and not classic phenotypes. Some trait data is ambiguous such as metagenomics. Metagenomics probably should be included here rather than in Phenotypes.
+** AuthorisedUsers
+** AvgID
+Foreign key to AvgMethod:Id
+Links to the method used in the processing of the microarray experiment data (like RMA, MAS etc.). ID1206
+** confidentiality
+0 = not confidential, 1 = confidential. ID1206. confidential means the dataset will appear in the search page, but will be serached only after the user login
+** CreateTime
+now()
+** DataScale
+** FullName
+Similar to ProbeFreeze name (institute tissue chip date)+ the data analysis method used. ID1206
+** Id
+Foreign key to Primary Key
+Incremented integer, uniquely identifies the record. ID1206
+** Name
+Very short abbreviation of the microarray experiment description, the use needs to be clarified. Contains tissue abbreviaton_chip abbreviation_date_processing method abbreviation. ID1206
+** Name2
+The same as in Name, only a bit longer - tissue_chip_method_date. The use needs to be clarified. ID1206
+** OrderList
+** ProbeFreezeId
+Foreign key to ProbeFreeze:Id
+Links to the microarray experiment description in ProbeFreeze table. ID1206
+** public
+1 = beta data, 2 = available in GeneNetwork. ID1206. beta means the dataset will not appear in the search page if the user does not login
+** ShortName
+Similar to FullName with random items abbreviated. ID1206
+
+* ProbeSetData
+Almost all important molecular assay data is in this table including probe set data, RNA-seq data, proteomic data, and metabolomic data. 2.5 billion rows March 2016. In comparison, ProbeData contains data only for Affymetrix probe level data (e.g. Exon array probes and M430 probes).
+
+
+"StrainId" should be "CaseId" or "SampleId".
+
+"ProbeSetData" should probably be "AssayData" or something more neutral.
+** Id
+** StrainId
+** value
+
+* ProbeSet
+PLEASE CHANGE TABLE NAME and rework fields carefully. This is a terrible table but it works well (RWW March 2016). It is used in combination with the crucial TRAIT DATA and ANALYSIS pages in GN1 and GN2. It is also used by annotators using the UPDATE INFO AND DATA web form to correct and update annotation. It is used by Arthur to enter new annotation files and metadata for arrays, genes, proteins, metabolites. The main problem with this table is that it is doing too much work.
+
+Initially (2003) this table contained only Affymetrix ProbeSet data for mouse (U74aV2 initially). Many other array platforms for different species were added. At least four other major categories of molecular assays have been added since about 2010.
+
+1. RNA-seq annotation and sequence data for transcripts using ENSEMBL identifiers or NCBI NM_XXXXX and NR_XXXXX type identifiers
+
+2. Protein and peptide annotation and sequence data (see BXD Liver Proteome data, SRM and SWATH type data) with identifiers such as "abcb10_q9ji39_t311" for SRM data and "LLGNMIVIVLGHHLGKDFTPAAQAA" for SWATH data where the latter is just the peptide fragment that has been quantified. Data first entered in 2015 for work by Rudi Aebersold and colleagues.
+
+3. Metabolite annotation and metadata (see BXD Liver Metabolome data) with identifiers that are usually Mass charge ratios such as "149.0970810_MZ"
+
+4. Epigenomic and methylome data (e.g. Human CANDLE Methylation data with identifiers such as "cg24523000")
+
+It would make good sense to break this table into four or more types of molecular assay metadata or annotation tables) (AssayRNA_Anno, AssayProtein_Anno, AssayMetabolite_Anno, AssayEpigenome_Anno, AssayMetagenome_Anno), since these assays will have many differences in annotation content compared to RNAs.
+
+Some complex logic is used to update contents of this table when annotators modify and correct the information (for example, updating gene symbols). These features requested by Rob so that annotating one gene symbol in one species would annotate all gene symbols in the same species based on common NCBI GeneID number. For example, changing the gene alias for one ProbeSet.Id will changing the list of aliases in all instances with the same gene symbol.
+
+If the ProbeSet.BlatSeq (or is this ProbSetTargetSeq) is identical between different ProbeSet.Ids then annotation is forced to be the same even if the symbol or geneID is different. This "feature" was implemented when we found many probe sets with identical sequence but different annotations and identifiers.
+
+Annotation by Rob Williams, Aug 19, 2005. Created by Jintao Wang, 2003. This annotation updated March 22, 2016 by Rob.
+** alias
+gene aliases and old symbols associated with the gene assigned to the probe set or probe (editable using Update page interface)
+** alias_H
+official human gene description from NCBI ftp site (Build 35)
+** Biotype_ENS
+** BlatSeq
+probe sequence or concatenated probe set sequence ( trimmed of overlap) used for BLAT alignment to genome (viewable but not editable from Update page)
+** CAS_number
+** ChEBI_ID
+** ChEMBL_ID
+** ChemSpider_ID
+** ChipId
+identifier of the array type
+** Chr
+chromosome assigned to the probe set or probe (editable using Update page interface)
+** chromosome_H
+official human gene description from UCSC ftp site (Build 35)
+** Chr_mm8
+** chr_num
+the numerical value of chromosomes, for example, X is 20 or 21 depending on species
+** comments
+record of modification time and person making modifications. Used to prevent overwriting of modified records.
+** Confidence
+** description
+gene description assigned to the probe set or probe (editable using Update page interface)
+** description_H
+official human gene description from NCBI ftp site (Build 35)
+** EC_number
+** flag
+a status flag on the probe set: 0=mismatch between blat results and affy symbols (Problem!!!!); 1=match between blat results and affy symbols (Excellent); 2=symbols from TIGR or replaced by Blat symbols (The original affy symbols have "///" or "_predicted") (ok); 3: symbols from BLAT (ok); 4. symbols from Affy (not bad) or no symbol (sad); 5. symbols from target sequence blating (??); 6. symbols from genebank sequence blating (???); 7=symbols from blating to mouse genome(????)
+** Flybase_Id
+** GenbankId
+GenBank ID assigned to the probe set or probe as given to us by Affymetrix or Agilent (not editable from Update page)
+** GeneId
+Entrez gene ID assigned to the probe set or probe (editable using Update page interface)
+** GeneId_H
+official human gene description from NCBI ftp site (Build 35)
+** HMDB_ID
+** HomoloGeneID
+** Id
+internal identifer used by GeneNetwork
+** KEGG_ID
+** Mb
+** MB_H
+Converted from ProbeSet.Mb_mm6 by Batch Coordinate Conversion
+** Mb_mm6
+megabase position assigned to the probe set or probe (editable using Update page interface). The most proximal Mb was used irrespective of whether this was 3' or 5' end. mm6 refers to a particular mouse assembly (perhaps inappropriate)
+** Mb_mm8
+** Molecular_Weight
+** Name
+Affymetrix probe set identifier or Agilent probe identifier
+** name_num
+the numerical value of Affymetrix probe set identifier or Agilent probe identifier
+** Nugowiki_ID
+** OMIM
+OMIM identifier assigned to the probe set or probe (editable using Update page interface)
+** PeptideSequence
+** PrimaryName
+** Probe_set_Blat_Mb_end
+the distal (high) megabase position matched by the probe set sequence (5' or 3' end)
+** Probe_set_Blat_Mb_end_mm8
+** Probe_set_Blat_Mb_start
+the proximal (low) megabase position matched by the probe set sequence (3' or 5' end)
+** Probe_set_Blat_Mb_start_mm8
+** Probe_set_BLAT_score
+the BLAT score generated by the concatenated probe set (or probe) sequence for the correct target mRNA. This will usually be the highest BLAT score, but in some cases a non-trasncribed genomic sequence may match better than the actual transcribed mRNA target sequence.
+** Probe_set_Note_by_JG
+notes on the probe set by Jing Gu
+** Probe_set_Note_by_RW
+notes of the probe set by Robert Williams
+** Probe_set_specificity
+the BLAT score of the correct probe set target mRNA divided by the best or next best BLAT score
+** Probe_set_strand
+the DNA strand (+ or -) that is identical to the probe set nucleotide sequence. By convention, correctly directed probe sets have the same direction as the gene.
+** Probe_set_target_region
+DO NOT USE. Unknown use. May want to delete this field after review of possible use.
+** Probe_Target_Description
+description of the region of the gene and transcript targetted by the probe set or probe (this text is displayed after the semicolon in Search Results; this is a searchable field)
+** ProteinID
+** ProteinName
+** PubChem_ID
+** RefSeq_TranscriptId
+the reference sequence of the mRNA associated with the probe set. These are always receded with "NM_". This field was added to allow easier linkage from the UCSC Genome Browser to GN.
+** SecondaryNames
+** SNP
+unknown use
+** Strand_Gene
+the DNA strand (+ or -) of the gene assigned to the probe set or probe (editable using Update page interface)
+** Strand_Probe
+unknown use (redundant with Probe_set_strand ?) (editable using Update page interface)
+** symbol
+gene symbol assigned to the probe set or probe (editable using Update page interface)
+** symbol_H
+official human gene symbol from UCSC ftp site (hg17)
+** TargetId
+** TargetSeq
+target sequence as given to us by Affymetrix (viewable but not editable from Update page)
+** Tissue
+** Type
+** UniGeneId
+chromosome assigned to the probe set or probe (viewable but not editable from Update page)
+** UNII_ID
+
+* ProbeH2
+DEPRECATED. Will not be used in GN2. Please compare to H2. Used only for some the heritability of probes shown in the Probe table.
+** h2
+** ProbeFreezeId
+** ProbeId
+** weight
+
+* ProbeFreeze
+About the Name: ProbeFreeze is a stupid (historic) name for this table. The table should be renamed to more general and sensible such as "Data_Set_Group_Info" table and ProbeSetFreeze should be changed to something like "Data_Set_Info" table. At present, every ProbeSetFreeze record needs a parent ProbeFreeze record, even when the relation is 1-to-1.
+
+About This Table: The ProbeFreeze table provides information about the overall set of microarray hybridization experiments - a meaningful name that identifies the experiment, the link to the microarray chip name, the link to tissue, organ or other generic biological material name, the link to the mapping population, inbred strain set name or similar used in the experiment.
+
+A ProbeFreeze may have a subset of ProbeSetFreezes (one ProbeFreeze to many ProbeSetFreezes) to which it belongs as children data sets (for example, male data only, female data only, RMA data or MAS5 data. The name provides a short description of the experiment. New records in the table should be inserted only after the relevant records in the GeneChip, Tissue and InbredSet are in place. 34 records on Dec14,2006. ID1206
+** ChipId
+Foreign key to GeneChip:Id
+Links to the information about the microarray chip used. ID1206
+** CreateTime
+now()
+** FullName
+Empty field. ID1206
+** Id
+Foreign key to Primary key
+Incremented integer, uniquely idenifies the record. ID1206
+** InbredSetId
+Foreign key to InbredSet:Id
+Links to the information about the cross, mapping population, inbred strain set or similar used in the experiment. ID1206
+** Name
+Abbreviated description that identifies the microarray experiment. The existing records contain institute id, short biological material description, the microarray chip name and date in brackets, but the field can contain any meaningful description of the microarray experiment. ID1206
+** ProbeFreezeId
+** ShortName
+Empty field. ID1206
+** TissueId
+Foreign key to Tissue:Id
+Links to the information about the biological material analysed . ID1206
+
+* ProbeData
+Table with fine-grained probe level Affymetrix data only. Contains 1 billion rows March 2016. This table may be deletable since it is only used by the Probe Table display in GN1. Not used in GN2 (double-check).
+
+In comparison the "ProbeSetData" table contains more molecular assay data, including probe set data, RNA-seq data, proteomic data, and metabolomic data. 2.5 billion rows March 2016. In comparison, ProbeData contains data only for Affymetrix probe level data (e.g. Exon array probes and M430 probes).
+
+
+"ProbeData.StrainId" should be "CaseId" or "SampleId".
+
+"ProbeData" should probably be "AssayData" or something more neutral.
+** Id
+** StrainId
+** value
+
+* Probe
+DEPRECATED. Used only for a few array platforms in GN1. Not used for GN2. This table contains data on the characteristics of individual Affymetrix probes (not probe sets). Data are used to populate the Probe Tables which display sequences of the perfect match and mismatch probes. This table could also contain data on the Agilent 60-mer probes.
+Created by Yanhua Qu and Jintao Wang, 2003.
+** ExonNo
+exon to which the probe sequence corresponds. When a probe straddles two exons we use the format 10*11
+** E_GSB
+the gene-specific binding energy computed using Li Zhang's PDNN method. Data provided by Li Zhang
+** E_NSB
+the non-specific binding energy computed using Li Zhang's PDNN method. Data provided by Li Zhang
+** Id
+internal identifier
+** Name
+six to eight character name (depending on array) XXX coordinate then YYY coordinate with 0 used a buffer
+** ProbeSetId
+Affymetrix probe set identifier to which the probe belongs using the conventional CDF probe-probeset mapping
+** Sequence
+25 nucleotide sequence
+** SerialOrder
+probe order from the most 3' probe to the most 5' probe
+** Tm
+theoretical melting temperature of a DNA-DNA hybrid. The actual probes are cRNA
+
+* Phenotype
+This table contains names, full descriptions, and short symbols for traits and phenotype used primarily in the Published Phenotypes databases.
+
+Contains 10k rows, March 2016, of which 5000 are for the BXDs).
+
+Created by Jintao Wang, March 2003.
+** Abbreviation
+abbreviation of the phenotype
+** Authorized_Users
+** Id
+** Lab_code
+** Name
+description of the phenotype
+** Original_description
+** Owner
+** Post_publication_abbreviation
+** Post_publication_description
+** Pre_publication_abbreviation
+** Pre_publication_description
+** Submitter
+** Units
+units of measurement of the phenotype
+
+* Organizations
+Table generated by Arthur Centeno for INFO files and metadata.
+** OrganizationId
+** OrganizationName
+
+* NStrain
+Merge this table to "PublishSE" and "PublishData". Values are used to track n of cases or n or strains for "published" phenotype values. Move these data to PublishSE and PublishData, phenotype SE, and N strain are three columns shows to users of Published Phenotypes. Unknown function at this time, seems like this contains information which is derived, so looks like it might be unneeded (DA March 2016).
+
+Contains 160,000 rows, March 2016.
+** count
+** DataId
+** StrainId
+
+* MStrain
+Comment
+
+* MappingMethod
+Needs to be updated, but this is used in GN1 to select mapping methods for different cohorts/populations. PLINK is used for map human cohorts in GN1. Happy is not implemented as of March 2016 in either GN1 or GN2. R/qtl implemented by DA in GN2 in 2015. FastMap probably equal pyLMM and should be renamed. QTL Reaper = Haley Knott regression mapping and probably should be renamed HKMap.
+
+QTL Reaper, R/qtl, Happy, PLINK, FastMap
+** Id
+** Name
+
+* MachineAccessLog
+
+** accesstime
+** action
+** data_id
+** db_id
+** id
+** ip_address
+
+* login
+Used by GN2. Just a login file. 277 login in GN2 as of March 2016.
+** assumed_by
+** id
+** ip_address
+** session_id
+** successful
+** timestamp
+** user
+
+* LitCorr
+
+** ProbeSetId1
+** ProbeSetId2
+** value
+
+* LCorrRamin3
+Should be updated in 2016. Literature correlations by Prof Ramin Homayouni (v3) in GN1 and GN2. These are mouse GeneIDs (table starts with GeneId1 = 381629 = the gene with symbol Atraid in mouse. This genes maps to HomoloGene 15412 and to human ATRAID (human GeneId 51374). This table should ideally work for mouse, human, and rat since most genes will have 1-to-1 homologs with matched symbols.
+** GeneId1
+Entrez gene ID values (mouse)
+** GeneId2
+Entrez gene ID values (mouse)
+** value
+Latent sematic index scorel, value between 0 and 1
+
+* LCorr
+
+** GeneId1
+** GeneId2
+** value
+
+* Investigators
+What is this used for? This is part of Arthur Centeno's database for INFO files.
+As of March 2016 has about 86.54 rows.
+** Address
+** City
+** Country
+** Email
+** FirstName
+** InvestigatorId
+** LastName
+** OrganizationId
+** Phone
+** State
+** Url
+** UserDate
+** UserLevel
+** UserName
+** UserPass
+** ZipCode
+
+* InfoFilesUser_md5
+Password information GN1 (unsecure no salt) use SALT !
+Only two users as of March 2016, Rob and Arthur.
+** Password
+** Username
+
+* InfoFiles
+INFO file metadata. INFO files are currently limited to molecular data sets (mRNA, protein, metabolomes). Majority of mRNA transcriptome data sets. This table set up by Arthur 2014-2015. Compare to "Datasets" which appears to be a subset of this table.
+
+"InfoFiles" has 700 rows whereas "Datasets" has only 230 rows (RWW March 2016)
+** About_Array_Platform
+** About_Cases
+** About_Data_Values_Processing
+** About_Download
+** About_Tissue
+** AuthorizedUsers
+** AvgMethodId
+** Citation
+** City
+** Contact_Name
+** Contributor
+** Country
+** DatasetId
+** Data_Source_Acknowledge
+** DB_Name
+** Department
+** Emails
+** Experiment_Type
+** GeneChipId
+** GEO_Series
+** GN_AccesionId
+** InbredSet
+** InbredSetId
+** InfoFileId
+** InfoPageName
+** InfoPageTitle
+** Laboratory
+** Normalization
+** Organism
+** Organism_Id
+** Organization_Name
+** Overall_Design
+** Phone
+** Platforms
+** Progreso
+** QualityControlStatus
+** Samples
+** Species
+** SpeciesId
+** State
+** Status
+** Street
+** Submission_Date
+** Summary
+** Tissue
+** TissueId
+** Title
+** URL
+** ZIP
+
+* IndelXRef
+Just for C57BL/6J and DBA/2J indels with 140,000 rows
+** IndelId
+** StrainId1
+** StrainId2
+
+* IndelAll
+Information about indels (comaprable to the SNP data) used by the Mouse SNP browser GN1 only at this time. Only B6 versus D2 mouse indels have been entered so far. Has 140,000 rows but should have at least twice as many. Probably entered at an early stage of sequence analysis (circa 2010) (DA March 2016)
+** Chromosome
+** Id
+** InDelSequence
+** Mb_end
+** Mb_start
+** Name
+** Size
+** SourceId
+** SpeciesId
+** Strand
+** Type
+
+* InbredSet
+Important table that is used to select appropriate analytic and mapping methods. We should change the name of this table to "Population_Description" or "Sample_Description" (RWW March 2016)
+
+"orderid" is used to set the order of in the pull-down menu.
+** FullName
+** GeneticType
+e.g. intercross
+** Id
+** InbredSetId
+** InbredSetName
+** MappingMethodId
+prefered mapping method to use ??
+** Name
+** orderid
+** public
+** SpeciesId
+
+* HumanGene
+
+** description
+** hLocusId
+** Id
+** mLocusId
+** Name
+** rLocusId
+
+* Homologene
+Coupling genes to other genes using homology between them. (DA March 2016)
+** GeneId
+** HomologeneId
+** TaxonomyId
+
+* H2
+Deprecated or delete this table (RWW March 2016). Compare to "Probe h2" used in Probe Table. Plain "H2" table has 60,000. This could be at the probe set level whereas "Probe h2" is for the individual probes on the probe set. (Danny Arends = DA March 2016)
+** DataId
+** H2SE
+heritability standard error ??
+** HPH2
+** ICH2
+
+* GORef
+Gene Ontology identifiers linked to gene symbols. Only properly implemented for mouse. Note that this table does not have a GORef.species field. GN1 code does return hits even for Drosophila but symbols have mouse format. Check how this happens. (RWW March 2016)
+
+ Important and should probably be updated periodically. Used for GO searches in GN1 and GN2. E.g. GO:0045202 searches for synapse-associated genes listed in the Gene Ontology using information in this table.
+** genes
+** goterm
+** id
+
+* GenoXRef
+The table is used to establish links to other tables that contain genotype data. contains the information on which markers should be used for QTL mapping
+** cM
+cM is the centiMorgan location of the marker
+** DataId
+DataID is an identifier for a specific vector of genotypes
+** GenoFreezeId
+The GenoFreezeID is the number that references a single coherent genotype file. For example the first BXDgeno file is 0001.
+** GenoId
+GenoID is an identifier for a specific marker (SNP or other)
+** Used_for_mapping
+Flag used to decide if a marker is used for mapping or not
+
+* GenoSE
+DELETE THIS TABLE. This is to be a stupid table that can be deleted (Rob W, March 2016). Likely to have been added as a parallel table similar to those used from phenotypes and quantitative traits.
+** DataId
+** error
+** StrainId
+
+* GenoFreeze
+Population or cohort description. Links the population or cohort data described here with the genotype information. The entry in this table must be present to enter the genotype data in the GenXRef and Data tables.
+
+As of March 2016 has about 26 rows for mouse, rat, Drosopholia, potatoe, human, etc.
+** AuthorisedUsers
+** confidentiality
+0 = not confidential, 1 = confidential.
+** CreateTime
+now()
+** FullName
+Extended genotype file name for the cohort.
+** Id
+Primary key referenced in GenoXRef.GenoFreezeId.
+** InbredSetId
+Foreign key to InbredSet.Id
+links to the mapping population.
+** Name
+Genotype file for the cohort name.
+** public
+1 = beta data, 2 = available in GeneNetwork.
+** ShortName
+Shortened genotype name.
+
+* GenoData
+This is the table that actually contains genotypes for individuals. Could be renamed "Genotype_Data". The GenoData.value will need to be updated to allow a wider range of values and probabilities to accommodate complex crosses and cohorts. Right now the GenoData.value is labeled as a "float" but most of the code in GN expects to see values of -1, 0, or 1.
+
+As of March 2016 (140 million rows where each row is genotype from individual X at marker Y)
+** Id
+Primary key identifier
+** StrainId
+This field should be renamed SampleID.
+** value
+The actual genotype of the case. Usually -1, 0, 1. U is not allowed yet. No blank allowed.
+
+* GenoCode
+Only has one row as of March 2016 and used exclusively for BXD or B6xD2 crosses.
+May be used for Haplotype Analyst display function in QTL maps. May also be used to determine polarity of effect size (B allele defined as -1 and D allele defined as 1).
+
+Inbred Set 1, AlleleType values mat, pat, het, unk, and AlleleSymbol B, D, H, U, and DatabaseValue -1, 1, 0 or NULL
+
+"InbredSetId" should be renamed "GroupID" or "CohortID"
+** AlleleSymbol
+** AlleleType
+** DatabaseValue
+** InbredSetId
+
+* GenoAssembly
+Small table which identifies the assembly of the genotype markers, or similar, information important for mouse data, where there is more than one assembly per species. The entry in this table must be present before enering the data in GenoPos table. ID1206
+** Comment
+** Disable
+'Y','N' The disabled assemblies are not used in the analysis? Not verified. ID1206
+** Id
+PK referenced in GenoPos.AssemblyId, ProbeSetPos.AssemblyId. ID1206
+** Name
+Name of assembly. ID1206
+** SpeciesId
+Foreign key to Species.Id
+
+* Geno2
+Contains descriptions of markers used in the genotype (.geno file).
+This table looks like abbreviated Geno table. It has the same number of records as Geno and Geno_0609. ID1206
+** Id
+Can reference Geno.Id, Geno_0609.Id and GenoXRef.GenoId. ID1206
+** Name
+Marker name or other identificator
+** Sequence
+Marker sequence, if known.
+** Source
+The provider of the information, could be institute. ID1206
+** Source_Old
+The provider of the information, could be institute. Often the same as Source. ID1206
+** SpeciesId
+Foreign key to Species.Id
+References Species table
+
+* Geno
+Genotype marker information, not the actual genotypes. Should probably be renamed "Marker_Information" or "Genotype_Marker_Info". If genotype data is held in MySQL, then this table is used for updating genotypes and for the production of a new ".GENO" file after an update. Currently, the update feature i used almost exclusively for BXD mouse cohort. Contains 400,000 rows each with sequence data around markers (usually SNPs, but some microsatellites and other weird variants). (RWW March 2016)
+
+This table contains descriptions of markers, the same ones that are used in the corresponding .geno file. This table is exactly the same as Geno_0609, so one of them might be redundant and also has one-to-one relationship with Geno2 table. For some information there is more than one entry (marker name, position) which may lead to inconsistent state. The marker fields look like references to single nucleotide poymorphisms within the marker, but this hasn't been confirmed.
+
+For a few groups, this table can be updated by authorized users using an interface at www.genenetwork.org/manager.html (Update Genotype functions) (comment updated March 14, 2016 by RWW)
+** Chr
+Foreign key to Chr_Length.Name
+** Chr_mm8
+Chromosome name. Should be deleted or updated to mm10 (March2016)
+** chr_num
+Foreign key to Chr_Length.OrderId
+This is a number used to order chromosomes, thus Chr X in mouse = Chr 20, and Chr Y = 21
+** cM
+** Comments
+Comment
+** Id
+Primary key, used in Geno2, GenoXRef
+** Marker_Name
+** Mb
+This may be the genome-wide megabase values that is cumulative. Chr 2 starts at about 200 Mb. (Double check)
+** Mb_mm8
+Megabase position (not bp). Should be deleted or updated to mm10 (March2016)
+** MB_UCSC
+Position, not sure about the units. MB probably. ID1206
+** Name
+Marker name, or other ID used in .geno file
+** Sequence
+The sequence of the marker, if known. Usually 100 nt on each side of the SNP with the SNP is square brackets for BLAT analysis. gctcctaattgctgagatttctctccagctc<br> TGCCTCCCTTTCACACTCTCCTGCCCGTCCC<br> AATCAGAACATTAGAGCTGATAAGATTTACT<br> TATGGAC[CT]GATCTAAAATAGAAGTCCTT<br> TGGAGAACTTTGAGAGCTTTTCCAAGAAGTA<br> AAGTCGGTTAGTTGCTTTTCCAAAGAAATAA<br> AGTTAGTGATTCTCCACA
+** SNP_129x1_SvJ
+** SNP_AJ
+** SNP_B6
+** SNP_BALBc
+** SNP_C3H
+** SNP_DBA2
+** Source
+The provider of the information, could be institute.
+** Source2
+The provider of the information, could be institute, often the same as Source.
+** SpeciesId
+** used_by_geno_file
+This is a flag that determines if a marker is used for mapping. Can be set by authorized users using the "Update Genotype" function. May be redundant with field in GenoXRef.
+
+* GeneRIF_BASIC
+Gene Reference into Function data table from NCBI. Data are updated each night from NCBI and used to perform RIF queries in GN1 and GN2. (RWW March 2016). Probably should be called "GeneRIF_Data_NCBI"
+** comment
+** createtime
+** GeneId
+** PubMed_ID
+** SpeciesId
+** symbol
+** VersionId
+
+* GeneRIFXRef
+Gene RIF link to corresponding NCBI PubMed Reference ID. (RWW March 2016). Odd that there are three primary keys. (RWW March 2016)
+** GeneCategoryId
+** GeneRIFId
+** versionId
+
+* GeneRIF
+This is to be more than just GeneRIF but also includes GeneWIKI fields used to allow users to enter new GeneWiki data sets. Should be renamed GeneWiki_Entry_Data
+** comment
+** createtime
+** display
+** email
+** Id
+** initial
+** PubMed_ID
+** reason
+** SpeciesId
+** symbol
+Official gene symbol taken from NCBI
+** user_ip
+** versionId
+** weburl
+
+* GeneMap_cuiyan
+Deprecated. This is a table used to link from GN1 single chromosome maps to Yan Cui's polyMiRTS database of microRNA binding sites linked to SNPs.
+** GeneID
+** id
+** Symbol
+** TranscriptID
+
+* GeneList_rn3
+This table contains information on recognized genes in Rattus norvegicus (rn) from the rat build 3 (RGSC v3.4 of November 2004; see http://www.ncbi.nlm.nih.gov/genome/guide/rat/release_notes.html). Data are used by the Interval Analyst table in WebQTL. Data originally taken from UCSC ftp site July 2005. Annotation by Rob Williams and Senhua Yu, Aug. 2005. Created by Evan Williams, July 2005.
+** chromosome
+** flag
+Check status of this field. Really a probe set field, not a gene field.
+** genBankID
+GenBank identifier
+** geneDescription
+official gene description
+** geneID
+Entrez gene ID
+** geneSymbol
+official gene symbol
+** id
+** identity
+** kgID
+** ProbeSet
+** qEnd
+** qSize
+** qStart
+** score
+** sequence
+Check status of this field. Really a probe set field, not a gene field.
+** span
+** specificity
+Check status of this field. Really a probe set field, not a gene field.
+** strand
+** txEnd
+** txSize
+** txStart
+** unigenID
+Unigene identifier (Build 144)
+
+* GeneList_mm8
+Annotation by Samina (November 15, 2006)
+** agilentProbeSetID
+** alignID
+** cdsEnd
+End of the coding sequence
+** cdsStart
+Start of the coding sequence
+** chromosome
+Chromosome where the gene is found
+** exonCount
+Number of exons in this gene
+** exonEnds
+Ending position of the exons
+** exonStarts
+Starting position of the exons
+** geneDescription
+Description of the gene
+** geneID
+Gene identifier
+** geneSymbol
+Gene Symbol
+** id
+Internal identifier used by GeneNetwork
+** m430ProbeSetID
+** NM_ID
+** proteinID
+Protein identifier
+** strand
+Sense strand (+) or Antisense strand (-)
+** txEnd
+End position of the gene
+** txStart
+Starting position of the gene
+** u74ProbeSetID
+Affymetrix u74av2 array probe set identifier
+
+* GeneList_mm6
+This table contains the complete dataset from the Mar 2005 (mm6) mouse genome from UCSC.
+** agilentProbeSetID
+** alignID
+** cdsEnd
+** cdsStart
+** chromosome
+** exonCount
+** exonEnds
+** exonStarts
+** geneDescription
+** geneID
+** geneSymbol
+** id
+** m430ProbeSetID
+** NM_ID
+** proteinID
+** strand
+** txEnd
+** txStart
+** u74ProbeSetID
+
+* GeneList_hg17
+
+** alignID
+** cdsEnd
+** cdsStart
+** chromosome
+** exonCount
+** exonEnds
+** exonStarts
+** geneID
+** geneSymbol
+** id
+** isGuess
+** NM_ID
+** proteinID
+** strand
+** txEnd
+** txStart
+
+* GeneList
+Out of date in 2016. May be used by chromosome QTL maps and by SNP Tables. GN would need these data for multiple species. This is apparently meant as a generic table for any species. Should be updated periodically from BioMart or UCSC Genome Browser.
+** AlignID
+** cdsEnd
+This is the end of the coding sequence (cds = protein coding part of mRNA)
+** cdsEnd_mm8
+** cdsStart
+This is the start of the coding sequence (cds = protein coding part of mRNA)
+** cdsStart_mm8
+** Chromosome
+** Chromosome_mm8
+** exonCount
+** exonCount_mm8
+** exonEnds
+This is a concatenated list of exon starts, separated by comma
+** exonEnds_mm8
+** exonStarts
+This is a concatenated list of exon starts, separated by comma
+** exonStarts_mm8
+** GenBankID
+** GeneDescription
+** GeneID
+This is the GeneID which used to be called the LocusLinkID
+** GeneSymbol
+** Id
+** Info_mm9
+** kgID
+** NM_ID
+This is the messenger RNA reference id number (nucleotide Message)
+** ProteinID
+** SpeciesId
+** Strand
+** Strand_mm8
+** TxEnd
+We currently think that this should be the end of the 3' UTR but need to confirm
+** TxEnd_mm8
+** TxStart
+We currently think that this should be the start of the 5' UTR but need to confirm
+** TxStart_mm8
+** UnigenID
+Unigene IDs, often multiple
+
+* GeneChip
+This table lists the array platforms that are used by the GeneNetwork. For example Affymetrix U74Av2, M430A, RAE230A. etc.
+The name 'GeneChip' is much too specific. 'Platform' would be better term.
+
+A new record can be inserted only if the relevant record in Species table is in place. ID1206
+
+Please use the following conventions for naming array platform:
+
+MG_U74AV2 is a good form but
+Affy_U74Av2 would be better
+
+Start with a four letter vendor code (Upper case lower case underscore)
+"Affy_" for Affymetrix
+"Illu_" for Illumina
+"Agil_"
+
+then use the name of the array given by the vendor
+for example: U74AV2, MOE430A, MOE430B, MOE430V2, RAE230A, G4121A, MOUSE6.0, MOUSE6.1, MOUSE6.2
+** GeneChipId
+** GeneChipName
+** GeoPlatform
+** GO_tree_value
+** Id
+internal GN identifier of the array platform
+** Name
+array platform long identifier or name
+** SpeciesId
+Foreign key to Species:Id
+species for which this array was designed to work best (U74Av2 for mouse, RAE230A for rat)
+** Title
+
+* GeneCategory
+DEPRECATED. Used by GeneWiki notes to classify notes. This table has never been used.
+If this table is deleted then please delete all checkboxes associated with GeneWiki data entry. RWW March 2016.
+** Id
+** Name
+
+* Genbank
+DEPRECATED. Apparently only used by the "Probe Tools". This table contains a complete or truncated copy of GenBank sequence data associated with particular Affymetrix Probe sets. When a GenBank sequence entry was long, we took only the most terminal 1000 nt under the assumption that this was the 3' end of the sequence. This assumption will often be incorrect. This table is used primarily in association with Affymetrix Probe sets generated using GenBank sequence. The Probe Tools table in GN is able to BLAT the GenBank sequences provided in this table.
+Created by Yanhua Qu, August 2005. Deprecated by RWW March 2016.
+** GenbankId
+** Id
+conventional GenBank identifier of the sequence
+** Sequence
+up to 1000 nucleotides of sequence
+** SpeciesId
+species identifier used by GenBank and NCBI
+
+* EnsemblChip
+Deprecated and not a function in GN2. For that matter, not even a function of most array data in GN1. One of several tables created by Hongqiang Li to be used with Probe Tool functions for M430 Affymetrix array to show location of probes only in mouse. All locations are equivalent to mm8 in mouse. Xusheng Wang points out that this could be done from UCSC browser.
+
+This table should also be updated at some point.
+
+
+Probe locations were obtained from Ensembl ftp://ftp.ensembl.org/pub/current_mus_musculus/data/mysql/mus_musculus_core_43 by Hongqiang Li. We made use of text files and MySQL tables called:
+
+oligo_feature.txt.table.gz (25774 KB file of 3/1/07 1:53:00 AM)
+oligo_probe.txt.table.gz (24411 KB 3/1/07 1:54:00 AM)
+seq_region.txt.table.gz (383 KB, 3/1/07 1:59:00 AM)
+** Id
+** Name
+** ProbeSetSize
+** Type
+
+* Docs
+Rob suspects that this table is used to track images, PDF, etc, that are uploaded into GN documentation (e.g., References and Glossary). Check with Arthur or Lei. (RWW March 2016)
+** content
+** entry
+** id
+** title
+
+* Description_of_Schema
+<P>This page provides a partial description of the database tables used by The GeneNetwork. This schema is dynamically updated from the MySQL database. Short text annotation at the top of many tables is entered manually. [Implemented by Hongqiang Li, Aug 2005.]
+
+<P><B>Suggested Conventions for Table Names</B>: Please start with an upper case character for each distinct word used to name the table, for example "AccessLog", "AvgMethod", "ProbeFreeze". A mix of upper case and lower case is fine. In general, avoid unscore. However, use of the underscore character is apppropriate for particular freezes or source of data in a table, for example, "GeneList_hg17" and "CeleraInfo_mm6".
+
+<P><B>Suggested Conventions for Field Names</B>: Use of lower case is preferred when possible. Separate words in a field name with underscore: examples: ip_address, allele_B6. Please try to make field names self-explanatory to a bioinformatics expert. Please annotate and describe the field name when you make a new table or add a new field. Avoid cryptic suffixes and prefixes to field names.
+
+<P>Last edited March 21, 2016
+
+* DBType
+
+** Id
+** Name
+
+* DBList
+
+** Code
+** DBTypeId
+** FreezeId
+** Id
+** Name
+
+* Dataset_mbat
+DEPRECATED. What is mbat? Is this associated with 8 tissues and phenotypes of BXD only. Hippocampus, brain, cerebellum, eye, neocortex, NAc, PFC, striatum and phenotypes. All before 2008. (RWW Mar 2016)
+** cross
+** database
+** database_LongName
+** id
+** species
+** switch
+** tissue
+
+* DatasetStatus
+This is the private versus public flag for a large molecular phenotype data sets (aka prior to 2016 as a ProbeSetFreeze) (RWW March 2016). This table probably created by Arthur Centeno in 2014-2015.
+** DatasetStatusId
+** DatasetStatusName
+
+* Datasets
+DEPRECATED in favor of "InfoFiles". Check if this is still needed (March 2016). These are the annotation/metadata fields used to describe molecular phenotypes only (aka ProbeSetFreezes). This table designed by Arthur Centeno and used to generate and modify "INFO" tables. Created in 2014-2015.
+** AboutCases
+** AboutDataProcessing
+** AboutPlatform
+** AboutTissue
+** Acknowledgment
+** Citation
+** Contributors
+** DatasetId
+** DatasetName
+** DatasetStatusId
+** ExperimentDesign
+** GeoSeries
+** InvestigatorId
+** Notes
+** PublicationTitle
+** Summary
+
+* DatasetMapInvestigator
+Dataset owner or creator. Not sure how this is used? Is it used to for data access or password control? Check with Arthur Centeno or Lei Yan if this is used to define private ProbeSetFreeze (RWW Mar 2016). Probably created by Arthur Centeno 2014-2015. Why is the word "Map" in the table name?
+** DatasetId
+** Id
+** InvestigatorId
+
+* Data
+This simple but huge table actually contains the bulk of data in GeneNetwork. Almost all trait data is defined by a data identifier and a case value (e.g., strain or F2 or individual). This table only contains the main value (typically the mean or average) for each case, strain, or individual. The Standard Error of the Mean is kept in the table called "SE".
+
+Created by Jintao, March 2003.
+To retrieve or insert the data for an experiment there should be also corresponding entries in the ProbeXRef table for the raw data (references ProbeFreeze) or in the ProbeSetXRef table for transformed data (references ProbeSetFreeze). ID1206
+** Id
+** StrainId
+Foreign key to InbredStrain:Id
+** value
+
+* Chr_Length_Evan
+This is a table created by Evan Williams, July 2006. Not sure what it is for. [Rob Williams, July 24, 2006)
+** Length
+length of the chromosome, presumably in megabases
+** Name
+name of the chromosome, usually a number but also UN=unknown, X, Y, Mt (mitochondria)
+** OrderId
+Not
+** SpeciesId
+the identifier for the species from NCBI
+
+* Chr_Length_0609
+PLEASE DELETE IF POSSIBLE. May be used by ARCHIVE SITE. This table is identical to Chr_Length table, both structure and records. One of them could be redundant.
+ID1206
+** Length
+** Name
+** OrderId
+** SpeciesId
+Foreign key to Species.Id
+
+* Chr_Length
+This table provides the approximate length of a chromosome in megabases taken from the most recent public genome assemblies of several species. As of Aug. 2005, this table contains lengths for mouse, rat, and Arabidopsis chromosomes. No data for Barley since there is not physical assembly yet. We are usually missing the Y chromosome and the mitochondrial genome (Chr Y and Chr M, respectively).
+
+Some of these fields should be semantically registered (SpeciesId, Chromosome_name).
+Created by Jintao Wang, 2004.
+** Length
+the length of the chromosome in megabase units
+** Name
+At most 3 letter name of the chromosome ID1206
+** OrderId
+the numerical order of chromosomes for purposes of generating whole genome maps (Chr X is 20 in mouse)
+** SpeciesId
+Foreign key to Species.Id
+the identifier for the species. This may be the official NCBI species code or just an internal GN code. Check
+
+* CeleraINFO_mm6
+PLEASE DELETE: DEPRECATED: use the Snp table instead.
+
+CeleraINFO_mm6 provides information on single nucelotide polymorphisms (SNPs) for five strains of mice, C57BL/6J, DBA/2J, A/J, 129S1/SvImJ, and 129X1/SvJ, obtained from Celera Genomics by Alex Williams and Chris Vincent, summer 2003.
+
+"mm6" refers to the megabase positions taken from the sixth build of Mus musculus as presented in UCSC Genome Browser (also known as NCBI Mouse Build 34 that was current from March 2005 through approximately March 2006).
+
+mm6 data were generated by Yanhua Qu by BLAT sequence alignment of ~300 bp of sequence around each SNP. This table was generated by Robert Crowell and Yanhua Qu, June 2005, for use on WebQTL physical maps.
+
+** allele_AJ
+the allele of A/J
+** allele_B6
+the allele of C57BL/6J
+** allele_D2
+the allele of DBA/2J
+** allele_S1
+** allele_X1
+** B6_AJ
+same as above but used for the AXB/BXA cross
+** B6_D2
+a flag (0 or 1) that denotes if B6 and D2 have ths same allele (0) or a different allele (1) that is used in generating SNP tracks on BXD physical maps
+** chromosome
+mouse chromosome from BLAT alignment
+** D2_AJ
+same as above
+** flanking3
+** flanking5
+** id
+** MB_celera
+megabase position given by Celera
+** MB_UCSC
+mouse mm6 position in megabases from the UCSC Genome Brower mm6 BLAT analysis (NCBI Build 34)
+** MB_UCSC_OLD
+the mm5 position values
+** SNPID
+from Celera Genomics
+
+* CeleraINFO_mm5
+OBSOLETE: Replaced by CeleraINFO_mm6
+
+CeleraINFO_mm5 provides information on single nucelotide polymorphisms (SNPs) for three strains of mice--C57BL/6J, DBA/2J, and A/J--obtained from Celera Genomics by Alex Williams and Chris Vincent, summer 2003.
+
+"mm5" refers to the megabase positions taken from the fifth build of Mus musculus as presented in UCSC Genome Browser (also known as NCBI Mouse Build 33 that was current until March 2005).
+
+mm5 values were generated by Yanhua Qu by BLAT sequence alignment of ~300 bp of sequence of about 3 million Celera SNP sequences. This table was generated by Alex Williams and Robert Crowell (?), July-August 2004, for use on WebQTL physical maps.
+
+This table is now replaced by CeleraINFO_mm6.
+
+
+* CeleraINFO
+Obsolete table. Jintao, can we delete this table?
+
+* CaseAttributeXRef
+Table used for handle database metadata. One to one mapping for ProbeSetFreeze etc.
+** CaseAttributeId
+** ProbeSetFreezeId
+** StrainId
+** Value
+
+* CaseAttribute
+This is a new table created by Zach Sloan and Lei Yan in 2014-2015 to allow us to add cofactors and metadata that typically display in the Trait Data and Analysis page along side of the phenotype values for each case/sample. For example, if you review any of the human data sets where GROUP = "Brain, Development: Normal Gene Expression (Yale/Sestan)" you will find CaseAttribute data for the expression data sets such as Sex, PostMortem Interval (PMI), Age, Ethnicity, Tissue, pH.
+
+This table may not really be necessary, since all data here could also be put into the Phenotype data table. But then we need code that would allow the user (or programmer or annotator) to decide what cofactors to show in the Trait Data and Analysis page.
+** Id
+** Name
+The name of the cofactor shown in the Trait Data and Analysis page (e.g. "Ethn.", "pH", "Sex")
+
+* B_D_Tissue_CNS_GI_Merged_Average_Spearman
+This static table was precomputed by Xusheng Wang, Sept 2008. It provides the correlations of gene expression across 23 tissues (combined data from both C57BL/6J (B) male and DBA/2J (D) male). The 23 "tissues" are actually based on data for about 60 samples, but manny of the samples are not independent and were pooled together prior to computing the correlations (for example, many brain regions were combined). The following tissues were included in computing the Spearman rank order Rho correlation. P values were also precomputed by Xusheng. The GeneId1 and GeneId2 are currently all mouse GeneIds. However, we probably should us HomolGene Ids or have ids for multiple species (animals only at this point). This table should be usable for mouse, rat, human, and other vertebrates.
+** Correlation
+** GeneId1
+** GeneId2
+** PValue
+
+* B_D_Tissue_CNS_GI_Merged_Average_Pearson
+This static table was precomputed by Xusheng Wang, Sept 2008. It provides the correlations of gene expression across 23 tissues (combined data from both C57BL/6J (B) male and DBA/2J (D) male). The following tissues were included in computing the Pearson product moment correlations. P values were also precomputed by Xusheng. The GeneId1 and GeneId2 are currently all mouse GeneIds. However, we probably should us HomolGene Ids or have ids for multiple species (animals only at this point). This table should be usable for mouse, rat, human, and other vertebrates.
+** Correlation
+** GeneId1
+** GeneId2
+** PValue
+
+* BXDSnpPosition
+PLEASE CORRECT TALBE AND FIELD NAMES. A table created by Hongqiang (October 2007) to be used to display SNPs on the interval maps for all crosses of mice including BXD, AXB, AKXD and B6D2F2 mouse crosses. Field are not well annotated. All data in this table is taken from the main mouse SNP table. This table should be refreshed every day or week. Hongqiang would need to write a script to do this. Not done yet (Nov 13, 2007). Reviewed by Kev and Rob, July 2008. Evan may have used this table to get SNPs to show up on the BHF2 interval maps. Still needs to be renamed. Needs to handle CXB RI set and LXS RI set.
+** Chr
+Chromosome
+** Mb
+SNP position in megabases rather than basepairs from mm8. Is this really mm8. Should be mm9 up to Mar 2016.
+** StrainId1
+Not sure, Strain identifier (probably C57BL/6J)
+** StrainId2
+Not sure, Strain identifier (probably DBA/2J
+
+* AvgMethod
+Should be deprecated. Used by ProbeSetFreeze (March 2016 by RWW)
+
+A table that simply lists the transformations used to generate microarray probe or probe set data. For example, for the Affymetrix platform MAS5, PDNN, RMA, are common transformation methods. For Illumina, the transform methods included Rank, RankInv, LOESS, LOESS_NB (no background). A single raw data set can be transformed in several ways, giving rise to a family of related data sets. This table was originally set up by Jintao Wang. We should confirm that this table is still used. Possibly a development vestige. "mlratio" was added by Evan Williams June 2008 to describe the Agilent "mean log" method used by Lusis and colleagues.
+The table is referenced in ProbeSetFreeze, so it is still in use on Dec 14,2006. 6 records on Dec14, 2006. ID12065
+** AvgMethodId
+** Id
+internal identifier
+** Name
+name or abbreviation of the method used to generate the probe set consensus estimates of transcript abundance
+** Normalization
+
+* Allele
+This table is one of a group of four tables used by the SNP Viewer component of GeneNetwork. Contains one record for every allele for all SNPs across all datasets.
+[Created by Robert Crowell, August 18, 2005. Annotation of table, RWW, Aug 19, 2005; Robert Crowell, Aug 22, 2005.]
+
+<b>See also:</b>
+<a href="/cgi-bin/beta/schema.py#Snp">Snp</a>
+<a href="/cgi-bin/beta/schema.py#Strain">Strain</a>
+** Id
+internal GeneNetwork identifier for allele
+** SnpId
+Foreign key to Snp.Id
+internal GeneNetwork identifier for this SNP
+** StrainId
+Foreign key to Strain.Id
+internal GeneNetwork identifier for strain
+** Value
+allele nucleotide in strain; conventions: upper case are firm SNPs, lower case imputed, heterozygotes (e.g., A/C), dash (-) used for deletion, w,x,y,z,~ used for deprecated A,C,G,T,- SNPs.
+
+* AccessLog
+This table tracks access time and IP addresses. Used for logging in registered users and tracking cookies.
+Created by Jintao Wang, 2004.
+** accesstime
+time stamp of login
+** id
+internal identifier
+** ip_address
+Internet protocol address
+
diff --git a/sql/schema-original.sql b/sql/schema-original.sql
new file mode 100644
index 0000000..8803d8a
--- /dev/null
+++ b/sql/schema-original.sql
@@ -0,0 +1,2334 @@
+-- MySQL dump 10.16 Distrib 10.1.41-MariaDB, for debian-linux-gnu (x86_64)
+--
+-- Host: localhost Database: db_webqtl
+-- ------------------------------------------------------
+-- Server version 10.5.8-MariaDB-log
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `AccessLog`
+--
+
+DROP TABLE IF EXISTS `AccessLog`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `AccessLog` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `accesstime` datetime /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `ip_address` char(20) NOT NULL DEFAULT '0.0.0.0',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=1366832 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `AvgMethod`
+--
+
+DROP TABLE IF EXISTS `AvgMethod`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `AvgMethod` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `AvgMethodId` int(5) DEFAULT NULL,
+ `Name` char(30) NOT NULL DEFAULT '',
+ `Normalization` varchar(30) DEFAULT NULL,
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `BXDSnpPosition`
+--
+
+DROP TABLE IF EXISTS `BXDSnpPosition`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `BXDSnpPosition` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `Chr` char(2) DEFAULT NULL,
+ `StrainId1` int(11) DEFAULT NULL,
+ `StrainId2` int(11) DEFAULT NULL,
+ `Mb` double DEFAULT NULL,
+ `Mb_2016` double DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `BXDSnpPosition` (`Chr`,`StrainId1`,`StrainId2`,`Mb`)
+) ENGINE=MyISAM AUTO_INCREMENT=7791982 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `CaseAttribute`
+--
+
+DROP TABLE IF EXISTS `CaseAttribute`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `CaseAttribute` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` varchar(30) NOT NULL DEFAULT '',
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=34 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `CaseAttributeXRef`
+--
+
+DROP TABLE IF EXISTS `CaseAttributeXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `CaseAttributeXRef` (
+ `ProbeSetFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `CaseAttributeId` smallint(5) NOT NULL DEFAULT 0,
+ `Value` varchar(100) NOT NULL DEFAULT '',
+ PRIMARY KEY (`ProbeSetFreezeId`,`StrainId`,`CaseAttributeId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `CaseAttributeXRefNew`
+--
+
+DROP TABLE IF EXISTS `CaseAttributeXRefNew`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `CaseAttributeXRefNew` (
+ `InbredSetId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `StrainId` int(8) unsigned NOT NULL DEFAULT 0,
+ `CaseAttributeId` smallint(5) NOT NULL DEFAULT 0,
+ `Value` varchar(100) NOT NULL DEFAULT '',
+ PRIMARY KEY (`InbredSetId`,`StrainId`,`CaseAttributeId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `CeleraINFO_mm6`
+--
+
+DROP TABLE IF EXISTS `CeleraINFO_mm6`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `CeleraINFO_mm6` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `SNPID` char(14) NOT NULL DEFAULT '',
+ `chromosome` char(3) DEFAULT NULL,
+ `MB_UCSC` double DEFAULT NULL,
+ `MB_celera` double DEFAULT NULL,
+ `allele_B6` char(4) DEFAULT NULL,
+ `allele_D2` char(4) DEFAULT NULL,
+ `allele_AJ` char(4) DEFAULT NULL,
+ `B6_D2` char(1) DEFAULT NULL,
+ `B6_AJ` char(1) DEFAULT NULL,
+ `D2_AJ` char(1) DEFAULT NULL,
+ `MB_UCSC_OLD` double DEFAULT NULL,
+ `allele_S1` char(4) DEFAULT NULL,
+ `allele_X1` char(4) DEFAULT NULL,
+ `flanking5` char(100) DEFAULT NULL,
+ `flanking3` char(100) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ KEY `celeraIndex` (`chromosome`,`MB_celera`),
+ KEY `celeraIndex2` (`chromosome`,`MB_UCSC`),
+ KEY `chromosome_2` (`chromosome`,`MB_UCSC`),
+ KEY `MB_UCSC_2` (`MB_UCSC`,`chromosome`),
+ KEY `SNPID` (`SNPID`)
+) ENGINE=MyISAM AUTO_INCREMENT=3028848 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Chr_Length`
+--
+
+DROP TABLE IF EXISTS `Chr_Length`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Chr_Length` (
+ `Name` char(3) NOT NULL DEFAULT '',
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `OrderId` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Length` int(10) unsigned NOT NULL DEFAULT 0,
+ `Length_2016` int(10) unsigned NOT NULL DEFAULT 0,
+ `Length_mm8` int(10) unsigned DEFAULT NULL,
+ UNIQUE KEY `nameIdx` (`SpeciesId`,`Name`),
+ UNIQUE KEY `SpeciesIdx` (`SpeciesId`,`OrderId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `DBList`
+--
+
+DROP TABLE IF EXISTS `DBList`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `DBList` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `DBTypeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `FreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` char(50) NOT NULL DEFAULT '',
+ `Code` char(50) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Cde` (`Code`),
+ KEY `DBIndex` (`DBTypeId`,`FreezeId`)
+) ENGINE=MyISAM AUTO_INCREMENT=907 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `DBType`
+--
+
+DROP TABLE IF EXISTS `DBType`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `DBType` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` char(30) NOT NULL DEFAULT '',
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `DatasetMapInvestigator`
+--
+
+DROP TABLE IF EXISTS `DatasetMapInvestigator`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `DatasetMapInvestigator` (
+ `Id` mediumint(9) NOT NULL AUTO_INCREMENT,
+ `DatasetId` int(6) NOT NULL,
+ `InvestigatorId` int(6) NOT NULL,
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=2403 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `DatasetStatus`
+--
+
+DROP TABLE IF EXISTS `DatasetStatus`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `DatasetStatus` (
+ `DatasetStatusId` int(5) NOT NULL,
+ `DatasetStatusName` varchar(20) DEFAULT NULL,
+ UNIQUE KEY `DatasetStatusId` (`DatasetStatusId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Dataset_mbat`
+--
+
+DROP TABLE IF EXISTS `Dataset_mbat`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Dataset_mbat` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `switch` int(1) DEFAULT NULL,
+ `species` varchar(255) DEFAULT NULL,
+ `cross` varchar(255) DEFAULT NULL,
+ `tissue` varchar(255) DEFAULT NULL,
+ `database` varchar(255) DEFAULT NULL,
+ `database_LongName` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Datasets`
+--
+
+DROP TABLE IF EXISTS `Datasets`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Datasets` (
+ `DatasetId` int(6) NOT NULL AUTO_INCREMENT,
+ `DatasetName` varchar(255) DEFAULT NULL,
+ `GeoSeries` varchar(30) DEFAULT NULL,
+ `PublicationTitle` longtext DEFAULT NULL,
+ `Summary` longtext DEFAULT NULL,
+ `ExperimentDesign` longtext DEFAULT NULL,
+ `AboutCases` longtext DEFAULT NULL,
+ `AboutTissue` longtext DEFAULT NULL,
+ `AboutPlatform` longtext DEFAULT NULL,
+ `AboutDataProcessing` longtext DEFAULT NULL,
+ `Contributors` longtext DEFAULT NULL,
+ `Citation` longtext DEFAULT NULL,
+ `Acknowledgment` longtext DEFAULT NULL,
+ `Notes` longtext DEFAULT NULL,
+ `InvestigatorId` int(5) NOT NULL,
+ `DatasetStatusId` int(5) NOT NULL,
+ PRIMARY KEY (`DatasetId`),
+ UNIQUE KEY `DatasetId` (`DatasetId`)
+) ENGINE=MyISAM AUTO_INCREMENT=301 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Docs`
+--
+
+DROP TABLE IF EXISTS `Docs`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Docs` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `entry` varchar(255) NOT NULL,
+ `title` varchar(255) NOT NULL,
+ `content` text NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `EnsemblChip`
+--
+
+DROP TABLE IF EXISTS `EnsemblChip`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `EnsemblChip` (
+ `Id` int(11) NOT NULL,
+ `ProbeSetSize` int(11) NOT NULL,
+ `Name` varchar(40) NOT NULL,
+ `Type` enum('AFFY','OLIGO') DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `EnsemblProbe`
+--
+
+DROP TABLE IF EXISTS `EnsemblProbe`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `EnsemblProbe` (
+ `Id` int(11) NOT NULL,
+ `ChipId` int(11) NOT NULL,
+ `ProbeSet` varchar(40) DEFAULT NULL,
+ `Name` varchar(40) DEFAULT NULL,
+ `length` int(11) NOT NULL,
+ KEY `EnsemblProbeId` (`Id`),
+ KEY `EnsemblProbeName` (`Name`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `EnsemblProbeLocation`
+--
+
+DROP TABLE IF EXISTS `EnsemblProbeLocation`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `EnsemblProbeLocation` (
+ `Chr` char(2) NOT NULL,
+ `Start` int(11) NOT NULL,
+ `Start_2016` int(11) DEFAULT NULL,
+ `End` int(11) NOT NULL,
+ `End_2016` int(11) DEFAULT NULL,
+ `Strand` int(11) NOT NULL,
+ `MisMataches` int(11) DEFAULT NULL,
+ `ProbeId` int(11) NOT NULL,
+ KEY `EnsemblLocationProbeId` (`ProbeId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GORef`
+--
+
+DROP TABLE IF EXISTS `GORef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GORef` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `goterm` varchar(255) DEFAULT NULL,
+ `genes` text DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=17510 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Genbank`
+--
+
+DROP TABLE IF EXISTS `Genbank`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Genbank` (
+ `Id` varchar(20) NOT NULL DEFAULT '',
+ `Sequence` text DEFAULT NULL,
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ PRIMARY KEY (`Id`),
+ KEY `Id` (`Id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneCategory`
+--
+
+DROP TABLE IF EXISTS `GeneCategory`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneCategory` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`Id`),
+ KEY `name_idx` (`Name`)
+) ENGINE=MyISAM AUTO_INCREMENT=22 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneChip`
+--
+
+DROP TABLE IF EXISTS `GeneChip`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneChip` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `GeneChipId` int(5) DEFAULT NULL,
+ `GeneChipName` varchar(200) DEFAULT NULL,
+ `Name` char(30) NOT NULL DEFAULT '',
+ `GeoPlatform` char(15) DEFAULT NULL,
+ `Title` varchar(100) DEFAULT NULL,
+ `SpeciesId` int(5) DEFAULT 1,
+ `GO_tree_value` varchar(50) DEFAULT NULL,
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=67 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneChipEnsemblXRef`
+--
+
+DROP TABLE IF EXISTS `GeneChipEnsemblXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneChipEnsemblXRef` (
+ `GeneChipId` int(11) NOT NULL,
+ `EnsemblChipId` int(11) NOT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneIDXRef`
+--
+
+DROP TABLE IF EXISTS `GeneIDXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneIDXRef` (
+ `mouse` int(11) NOT NULL DEFAULT 0,
+ `rat` int(11) NOT NULL DEFAULT 0,
+ `human` int(11) NOT NULL DEFAULT 0,
+ KEY `mouse_index` (`mouse`),
+ KEY `rat_index` (`rat`),
+ KEY `human_index` (`human`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneList`
+--
+
+DROP TABLE IF EXISTS `GeneList`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneList` (
+ `SpeciesId` int(5) unsigned NOT NULL DEFAULT 1,
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `GeneSymbol` varchar(15) DEFAULT NULL,
+ `GeneDescription` text DEFAULT NULL,
+ `Chromosome` varchar(10) DEFAULT NULL,
+ `TxStart` double DEFAULT NULL,
+ `TxStart_2016` double DEFAULT NULL,
+ `TxEnd` double DEFAULT NULL,
+ `TxEnd_2016` double DEFAULT NULL,
+ `Strand` char(1) DEFAULT NULL,
+ `GeneID` varchar(10) DEFAULT NULL,
+ `NM_ID` varchar(15) DEFAULT NULL,
+ `kgID` varchar(10) DEFAULT NULL,
+ `GenBankID` varchar(15) DEFAULT NULL,
+ `UnigenID` varchar(15) DEFAULT NULL,
+ `ProteinID` varchar(15) DEFAULT NULL,
+ `AlignID` varchar(10) DEFAULT NULL,
+ `exonCount` int(7) NOT NULL DEFAULT 0,
+ `exonStarts` text DEFAULT NULL,
+ `exonEnds` text DEFAULT NULL,
+ `cdsStart` double DEFAULT NULL,
+ `cdsStart_2016` double DEFAULT NULL,
+ `cdsEnd` double DEFAULT NULL,
+ `cdsEnd_2016` double DEFAULT NULL,
+ `TxStart_mm8` double DEFAULT NULL,
+ `TxEnd_mm8` double DEFAULT NULL,
+ `Strand_mm8` char(1) DEFAULT NULL,
+ `exonCount_mm8` int(7) DEFAULT NULL,
+ `exonStarts_mm8` text DEFAULT NULL,
+ `exonEnds_mm8` text DEFAULT NULL,
+ `cdsStart_mm8` double DEFAULT NULL,
+ `cdsEnd_mm8` double DEFAULT NULL,
+ `Chromosome_mm8` varchar(10) DEFAULT NULL,
+ `Info_mm9` text DEFAULT NULL,
+ `RGD_ID` int(10) DEFAULT NULL,
+ UNIQUE KEY `geneId` (`SpeciesId`,`Id`),
+ KEY `geneSymbol` (`GeneSymbol`),
+ KEY `geneSymbol2` (`SpeciesId`,`GeneSymbol`),
+ KEY `Loc1` (`SpeciesId`,`Chromosome`,`TxStart`),
+ KEY `Loc2` (`SpeciesId`,`Chromosome`,`TxEnd`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneList_rn3`
+--
+
+DROP TABLE IF EXISTS `GeneList_rn3`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneList_rn3` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `ProbeSet` varchar(16) DEFAULT NULL,
+ `geneSymbol` varchar(15) DEFAULT NULL,
+ `geneID` varchar(10) DEFAULT NULL,
+ `kgID` varchar(10) DEFAULT NULL,
+ `geneDescription` text DEFAULT NULL,
+ `genBankID` varchar(15) DEFAULT NULL,
+ `unigenID` varchar(15) DEFAULT NULL,
+ `score` int(4) DEFAULT NULL,
+ `qStart` int(3) DEFAULT NULL,
+ `qEnd` int(3) DEFAULT NULL,
+ `qSize` int(3) DEFAULT NULL,
+ `identity` varchar(7) DEFAULT NULL,
+ `chromosome` varchar(8) DEFAULT NULL,
+ `strand` char(1) DEFAULT NULL,
+ `txStart` double DEFAULT NULL,
+ `txEnd` double DEFAULT NULL,
+ `txSize` double DEFAULT NULL,
+ `span` int(7) DEFAULT NULL,
+ `specificity` double DEFAULT NULL,
+ `sequence` text DEFAULT NULL,
+ `flag` int(1) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `geneSymbol` (`geneSymbol`),
+ KEY `Loc1` (`chromosome`,`txStart`),
+ KEY `Loc2` (`chromosome`,`txEnd`)
+) ENGINE=MyISAM AUTO_INCREMENT=14917 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneList_rn33`
+--
+
+DROP TABLE IF EXISTS `GeneList_rn33`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneList_rn33` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `geneSymbol` varchar(15) DEFAULT NULL,
+ `txStart` double DEFAULT NULL,
+ `txEnd` double DEFAULT NULL,
+ `exonCount` int(7) DEFAULT NULL,
+ `NM_ID` varchar(15) DEFAULT NULL,
+ `chromosome` varchar(8) DEFAULT NULL,
+ `strand` char(1) DEFAULT NULL,
+ `cdsStart` double DEFAULT NULL,
+ `cdsEnd` double DEFAULT NULL,
+ `exonStarts` text DEFAULT NULL,
+ `exonEnds` text DEFAULT NULL,
+ `kgID` varchar(10) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `geneSymbol` (`geneSymbol`),
+ KEY `Loc1` (`chromosome`,`txStart`),
+ KEY `Loc2` (`chromosome`,`txEnd`)
+) ENGINE=MyISAM AUTO_INCREMENT=9790 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneMap_cuiyan`
+--
+
+DROP TABLE IF EXISTS `GeneMap_cuiyan`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneMap_cuiyan` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `TranscriptID` varchar(255) DEFAULT NULL,
+ `GeneID` varchar(255) DEFAULT NULL,
+ `Symbol` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=10537 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneRIF`
+--
+
+DROP TABLE IF EXISTS `GeneRIF`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneRIF` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `versionId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `symbol` varchar(30) NOT NULL DEFAULT '',
+ `PubMed_ID` varchar(255) DEFAULT NULL,
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `comment` text DEFAULT NULL,
+ `email` varchar(50) DEFAULT NULL,
+ `createtime` datetime /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `user_ip` varchar(20) DEFAULT NULL,
+ `weburl` varchar(255) DEFAULT NULL,
+ `initial` varchar(10) DEFAULT NULL,
+ `display` tinyint(4) DEFAULT 1,
+ `reason` varchar(100) NOT NULL DEFAULT '',
+ PRIMARY KEY (`Id`,`versionId`),
+ KEY `name_idx` (`symbol`),
+ KEY `status` (`display`),
+ KEY `timestamp` (`createtime`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneRIFXRef`
+--
+
+DROP TABLE IF EXISTS `GeneRIFXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneRIFXRef` (
+ `GeneRIFId` int(10) unsigned NOT NULL DEFAULT 0,
+ `versionId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `GeneCategoryId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ PRIMARY KEY (`GeneRIFId`,`versionId`,`GeneCategoryId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneRIF_BASIC`
+--
+
+DROP TABLE IF EXISTS `GeneRIF_BASIC`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneRIF_BASIC` (
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `GeneId` int(10) unsigned NOT NULL DEFAULT 0,
+ `symbol` varchar(255) NOT NULL DEFAULT '',
+ `PubMed_ID` int(10) unsigned NOT NULL DEFAULT 0,
+ `createtime` datetime /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `comment` text DEFAULT NULL,
+ `VersionId` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`GeneId`,`SpeciesId`,`createtime`,`PubMed_ID`,`VersionId`),
+ KEY `symbol` (`symbol`,`SpeciesId`,`createtime`),
+ FULLTEXT KEY `commts` (`comment`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Geno`
+--
+
+DROP TABLE IF EXISTS `Geno`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Geno` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `Name` varchar(40) NOT NULL DEFAULT '',
+ `Marker_Name` varchar(40) DEFAULT NULL,
+ `Chr` char(3) DEFAULT NULL,
+ `Mb` double DEFAULT NULL,
+ `Mb_2016` double DEFAULT NULL,
+ `Sequence` text DEFAULT NULL,
+ `Source` varchar(40) DEFAULT NULL,
+ `chr_num` smallint(5) unsigned DEFAULT NULL,
+ `Source2` varchar(40) DEFAULT NULL,
+ `Comments` varchar(255) DEFAULT NULL,
+ `used_by_geno_file` varchar(40) DEFAULT NULL,
+ `Mb_mm8` double DEFAULT NULL,
+ `Chr_mm8` char(3) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `species_name` (`SpeciesId`,`Name`),
+ KEY `Name` (`Name`)
+) ENGINE=MyISAM AUTO_INCREMENT=716770 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoCode`
+--
+
+DROP TABLE IF EXISTS `GenoCode`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoCode` (
+ `InbredSetId` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `AlleleType` char(3) NOT NULL DEFAULT '',
+ `AlleleSymbol` char(2) NOT NULL DEFAULT '',
+ `DatabaseValue` smallint(5) DEFAULT NULL,
+ PRIMARY KEY (`InbredSetId`,`AlleleType`,`AlleleSymbol`),
+ UNIQUE KEY `InbredSetId_AlleleType` (`InbredSetId`,`AlleleType`),
+ UNIQUE KEY `InbredSetId_AlleleSymbol` (`InbredSetId`,`AlleleSymbol`),
+ UNIQUE KEY `InbredSetId_DatabaseValue` (`InbredSetId`,`DatabaseValue`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoData`
+--
+
+DROP TABLE IF EXISTS `GenoData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoData` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `value` float NOT NULL,
+ UNIQUE KEY `DataId` (`Id`,`StrainId`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoFile`
+--
+
+DROP TABLE IF EXISTS `GenoFile`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoFile` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `server` varchar(100) NOT NULL,
+ `InbredSetID` int(11) NOT NULL,
+ `location` varchar(255) NOT NULL,
+ `title` varchar(255) NOT NULL,
+ `sort` int(3) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoFreeze`
+--
+
+DROP TABLE IF EXISTS `GenoFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '2001-01-01',
+ `public` tinyint(4) NOT NULL DEFAULT 0,
+ `InbredSetId` smallint(5) unsigned DEFAULT 1,
+ `confidentiality` tinyint(3) unsigned DEFAULT 0,
+ `AuthorisedUsers` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=37 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoSE`
+--
+
+DROP TABLE IF EXISTS `GenoSE`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoSE` (
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `error` float NOT NULL,
+ UNIQUE KEY `DataId` (`DataId`,`StrainId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoXRef`
+--
+
+DROP TABLE IF EXISTS `GenoXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoXRef` (
+ `GenoFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `GenoId` int(10) unsigned NOT NULL DEFAULT 0,
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `cM` double DEFAULT 0,
+ `Used_for_mapping` char(1) DEFAULT 'N',
+ UNIQUE KEY `ProbeSetId` (`GenoFreezeId`,`GenoId`),
+ UNIQUE KEY `DataId` (`DataId`),
+ KEY `GenoId` (`GenoId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `H2`
+--
+
+DROP TABLE IF EXISTS `H2`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `H2` (
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `ICH2` double NOT NULL DEFAULT 0,
+ `H2SE` double NOT NULL DEFAULT 0,
+ `HPH2` double NOT NULL DEFAULT 0,
+ UNIQUE KEY `DataId` (`DataId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Homologene`
+--
+
+DROP TABLE IF EXISTS `Homologene`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Homologene` (
+ `HomologeneId` int(11) DEFAULT NULL,
+ `GeneId` int(11) DEFAULT NULL,
+ `TaxonomyId` int(11) DEFAULT NULL,
+ KEY `GeneId` (`GeneId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `InbredSet`
+--
+
+DROP TABLE IF EXISTS `InbredSet`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `InbredSet` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `InbredSetId` int(5) DEFAULT NULL,
+ `InbredSetName` varchar(100) DEFAULT NULL,
+ `Name` char(30) NOT NULL DEFAULT '',
+ `SpeciesId` smallint(5) unsigned DEFAULT 1,
+ `FullName` varchar(100) DEFAULT NULL,
+ `public` tinyint(3) unsigned DEFAULT 2,
+ `MappingMethodId` char(50) DEFAULT '1',
+ `GeneticType` varchar(255) DEFAULT NULL,
+ `Family` varchar(100) DEFAULT NULL,
+ `FamilyOrder` int(5) DEFAULT NULL,
+ `MenuOrderId` double NOT NULL,
+ `InbredSetCode` varchar(5) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ KEY `Name` (`Name`),
+ KEY `SpeciesId` (`SpeciesId`),
+ KEY `Id` (`Id`),
+ KEY `InbredSetCode` (`InbredSetCode`)
+) ENGINE=MyISAM AUTO_INCREMENT=83 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `IndelAll`
+--
+
+DROP TABLE IF EXISTS `IndelAll`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `IndelAll` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `SpeciesId` smallint(5) unsigned DEFAULT 1,
+ `SourceId` smallint(5) unsigned DEFAULT NULL,
+ `Name` char(30) DEFAULT NULL,
+ `Chromosome` char(2) DEFAULT NULL,
+ `Mb_start` double DEFAULT NULL,
+ `Mb_start_2016` double DEFAULT NULL,
+ `Strand` char(1) DEFAULT NULL,
+ `Type` char(15) DEFAULT NULL,
+ `Mb_end` double DEFAULT NULL,
+ `Mb_end_2016` double DEFAULT NULL,
+ `Size` double DEFAULT NULL,
+ `InDelSequence` char(30) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `SnpId` (`SpeciesId`,`Name`),
+ KEY `SnpId2` (`Name`),
+ KEY `Position` (`SpeciesId`,`Chromosome`,`Mb_start`) USING BTREE
+) ENGINE=MyISAM AUTO_INCREMENT=142895 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `IndelXRef`
+--
+
+DROP TABLE IF EXISTS `IndelXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `IndelXRef` (
+ `IndelId` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId1` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `StrainId2` smallint(5) unsigned DEFAULT NULL,
+ PRIMARY KEY (`IndelId`,`StrainId1`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `InfoFiles`
+--
+
+DROP TABLE IF EXISTS `InfoFiles`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `InfoFiles` (
+ `DatasetId` int(5) DEFAULT NULL,
+ `SpeciesId` int(5) DEFAULT NULL,
+ `TissueId` int(5) DEFAULT NULL,
+ `InbredSetId` int(5) DEFAULT NULL,
+ `GeneChipId` int(5) DEFAULT NULL,
+ `AvgMethodId` int(5) DEFAULT NULL,
+ `InfoFileTitle` longtext DEFAULT NULL,
+ `Specifics` longtext DEFAULT NULL,
+ `Status` varchar(255) DEFAULT NULL,
+ `Title` varchar(255) DEFAULT NULL,
+ `Organism` varchar(255) DEFAULT NULL,
+ `Experiment_Type` longtext DEFAULT NULL,
+ `Summary` longtext DEFAULT NULL,
+ `Overall_Design` longtext DEFAULT NULL,
+ `Contributor` longtext DEFAULT NULL,
+ `Citation` longtext DEFAULT NULL,
+ `Submission_Date` varchar(255) DEFAULT NULL,
+ `Contact_Name` varchar(255) DEFAULT NULL,
+ `Emails` varchar(255) DEFAULT NULL,
+ `Phone` varchar(255) DEFAULT NULL,
+ `URL` varchar(255) DEFAULT NULL,
+ `Organization_Name` varchar(255) DEFAULT NULL,
+ `Department` varchar(255) DEFAULT NULL,
+ `Laboratory` varchar(255) DEFAULT NULL,
+ `Street` varchar(255) DEFAULT NULL,
+ `City` varchar(255) DEFAULT NULL,
+ `State` varchar(255) DEFAULT NULL,
+ `ZIP` varchar(255) DEFAULT NULL,
+ `Country` varchar(255) DEFAULT NULL,
+ `Platforms` varchar(255) DEFAULT NULL,
+ `Samples` longtext DEFAULT NULL,
+ `Species` varchar(255) DEFAULT NULL,
+ `Normalization` varchar(255) DEFAULT NULL,
+ `InbredSet` varchar(255) DEFAULT NULL,
+ `InfoPageName` varchar(255) NOT NULL,
+ `DB_Name` varchar(255) DEFAULT NULL,
+ `Organism_Id` varchar(60) DEFAULT NULL,
+ `InfoPageTitle` varchar(255) DEFAULT NULL,
+ `GN_AccesionId` int(4) DEFAULT NULL,
+ `Tissue` varchar(60) DEFAULT NULL,
+ `AuthorizedUsers` varchar(100) DEFAULT NULL,
+ `About_Cases` longtext DEFAULT NULL,
+ `About_Tissue` longtext DEFAULT NULL,
+ `About_Download` longtext DEFAULT NULL,
+ `About_Array_Platform` longtext DEFAULT NULL,
+ `About_Data_Values_Processing` longtext DEFAULT NULL,
+ `Data_Source_Acknowledge` longtext DEFAULT NULL,
+ `Progreso` varchar(20) DEFAULT NULL,
+ `QualityControlStatus` longtext DEFAULT NULL,
+ `InfoFileId` int(6) NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`InfoFileId`),
+ UNIQUE KEY `InfoPageName` (`InfoPageName`),
+ UNIQUE KEY `GN_AccesionId` (`GN_AccesionId`)
+) ENGINE=MyISAM AUTO_INCREMENT=1470 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `InfoFilesUser_md5`
+--
+
+DROP TABLE IF EXISTS `InfoFilesUser_md5`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `InfoFilesUser_md5` (
+ `Username` varchar(16) DEFAULT NULL,
+ `Password` varchar(32) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Investigators`
+--
+
+DROP TABLE IF EXISTS `Investigators`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Investigators` (
+ `FirstName` varchar(20) DEFAULT NULL,
+ `LastName` varchar(20) DEFAULT NULL,
+ `Address` varchar(200) DEFAULT NULL,
+ `City` varchar(20) DEFAULT NULL,
+ `State` varchar(20) DEFAULT NULL,
+ `ZipCode` varchar(20) DEFAULT NULL,
+ `Phone` varchar(200) DEFAULT NULL,
+ `Email` varchar(200) DEFAULT NULL,
+ `Country` varchar(35) DEFAULT NULL,
+ `Url` text DEFAULT NULL,
+ `UserName` varchar(30) DEFAULT NULL,
+ `UserPass` varchar(50) DEFAULT NULL,
+ `UserDate` datetime /* mariadb-5.3 */ DEFAULT NULL,
+ `UserLevel` int(8) DEFAULT NULL,
+ `OrganizationId` int(5) NOT NULL,
+ `InvestigatorId` int(5) NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`InvestigatorId`)
+) ENGINE=MyISAM AUTO_INCREMENT=151 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `LCorrRamin3`
+--
+
+DROP TABLE IF EXISTS `LCorrRamin3`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `LCorrRamin3` (
+ `GeneId1` int(12) unsigned DEFAULT NULL,
+ `GeneId2` int(12) unsigned DEFAULT NULL,
+ `value` double DEFAULT NULL,
+ KEY `GeneId1` (`GeneId1`),
+ KEY `GeneId2` (`GeneId2`),
+ KEY `GeneId1_2` (`GeneId1`,`GeneId2`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `MachineAccessLog`
+--
+
+DROP TABLE IF EXISTS `MachineAccessLog`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `MachineAccessLog` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `accesstime` datetime /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `ip_address` char(20) NOT NULL DEFAULT '0.0.0.0',
+ `db_id` tinyint(3) unsigned NOT NULL DEFAULT 0,
+ `data_id` int(10) unsigned DEFAULT NULL,
+ `action` char(10) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=514946 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `MappingMethod`
+--
+
+DROP TABLE IF EXISTS `MappingMethod`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `MappingMethod` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` varchar(100) NOT NULL DEFAULT '',
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `NStrain`
+--
+
+DROP TABLE IF EXISTS `NStrain`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `NStrain` (
+ `DataId` int(10) unsigned DEFAULT NULL,
+ `StrainId` smallint(5) unsigned DEFAULT NULL,
+ `count` varchar(5) DEFAULT NULL,
+ UNIQUE KEY `DataId` (`DataId`,`StrainId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `News`
+--
+
+DROP TABLE IF EXISTS `News`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `News` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `date` date DEFAULT NULL,
+ `details` text DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=296 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Organizations`
+--
+
+DROP TABLE IF EXISTS `Organizations`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Organizations` (
+ `OrganizationId` int(5) NOT NULL AUTO_INCREMENT,
+ `OrganizationName` varchar(200) NOT NULL,
+ PRIMARY KEY (`OrganizationId`),
+ UNIQUE KEY `OrganizationId` (`OrganizationId`),
+ UNIQUE KEY `OrganizationName` (`OrganizationName`)
+) ENGINE=MyISAM AUTO_INCREMENT=92 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Phenotype`
+--
+
+DROP TABLE IF EXISTS `Phenotype`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Phenotype` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Pre_publication_description` text DEFAULT NULL,
+ `Post_publication_description` text DEFAULT NULL,
+ `Original_description` text DEFAULT NULL,
+ `Units` varchar(100) NOT NULL DEFAULT 'Unknown',
+ `Pre_publication_abbreviation` varchar(40) DEFAULT NULL,
+ `Post_publication_abbreviation` varchar(40) DEFAULT NULL,
+ `Lab_code` varchar(255) DEFAULT NULL,
+ `Submitter` varchar(255) DEFAULT NULL,
+ `Owner` varchar(255) DEFAULT NULL,
+ `Authorized_Users` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ KEY `Post_publication_description_Index` (`Post_publication_description`(255)),
+ KEY `Pre_publication_description_Index` (`Pre_publication_description`(255)),
+ KEY `Pre_publication_abbreviation_Index` (`Pre_publication_abbreviation`),
+ KEY `Post_publication_abbreviation_Index` (`Post_publication_abbreviation`),
+ KEY `Lab_code` (`Lab_code`),
+ FULLTEXT KEY `Post_publication_description` (`Post_publication_description`),
+ FULLTEXT KEY `Pre_publication_description` (`Pre_publication_description`),
+ FULLTEXT KEY `Pre_publication_abbreviation` (`Pre_publication_abbreviation`),
+ FULLTEXT KEY `Post_publication_abbreviation` (`Post_publication_abbreviation`),
+ FULLTEXT KEY `Lab_code1` (`Lab_code`),
+ FULLTEXT KEY `SEARCH_FULL_IDX` (`Post_publication_description`,`Pre_publication_description`,`Pre_publication_abbreviation`,`Post_publication_abbreviation`,`Lab_code`)
+) ENGINE=MyISAM AUTO_INCREMENT=29299 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Probe`
+--
+
+DROP TABLE IF EXISTS `Probe`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Probe` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `ProbeSetId` int(10) unsigned NOT NULL DEFAULT 0,
+ `Name` char(20) DEFAULT NULL,
+ `Sequence` char(30) DEFAULT NULL,
+ `ExonNo` char(7) DEFAULT NULL,
+ `SerialOrder` double DEFAULT NULL,
+ `Tm` double DEFAULT NULL,
+ `E_GSB` double DEFAULT NULL,
+ `E_NSB` double DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `ProbeSetId` (`ProbeSetId`,`Name`),
+ KEY `SerialOrder` (`ProbeSetId`,`SerialOrder`)
+) ENGINE=MyISAM AUTO_INCREMENT=19054073 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeData`
+--
+
+DROP TABLE IF EXISTS `ProbeData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeData` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `value` float NOT NULL,
+ UNIQUE KEY `DataId` (`Id`,`StrainId`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeFreeze`
+--
+
+DROP TABLE IF EXISTS `ProbeFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `ProbeFreezeId` int(5) DEFAULT NULL,
+ `ChipId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `TissueId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '0000-00-00',
+ `InbredSetId` smallint(5) unsigned DEFAULT 1,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`Name`),
+ KEY `TissueId` (`TissueId`),
+ KEY `InbredSetId` (`InbredSetId`)
+) ENGINE=MyISAM AUTO_INCREMENT=416 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeH2`
+--
+
+DROP TABLE IF EXISTS `ProbeH2`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeH2` (
+ `ProbeFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `ProbeId` int(10) unsigned NOT NULL DEFAULT 0,
+ `h2` double DEFAULT NULL,
+ `weight` double DEFAULT NULL,
+ UNIQUE KEY `ProbeId` (`ProbeFreezeId`,`ProbeId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSE`
+--
+
+DROP TABLE IF EXISTS `ProbeSE`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSE` (
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `error` float NOT NULL,
+ UNIQUE KEY `DataId` (`DataId`,`StrainId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSet`
+--
+
+DROP TABLE IF EXISTS `ProbeSet`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSet` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `ChipId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` varchar(100) DEFAULT NULL,
+ `TargetId` varchar(150) DEFAULT NULL,
+ `Symbol` varchar(100) DEFAULT NULL,
+ `description` longtext DEFAULT NULL,
+ `Chr` char(3) DEFAULT NULL,
+ `Mb` double DEFAULT NULL,
+ `Chr_2016` char(3) DEFAULT NULL,
+ `Mb_2016` double DEFAULT NULL,
+ `alias` longtext DEFAULT NULL,
+ `GeneId` varchar(20) DEFAULT NULL,
+ `GenbankId` varchar(1000) DEFAULT NULL,
+ `SNP` int(2) DEFAULT NULL,
+ `BlatSeq` text NOT NULL,
+ `TargetSeq` text DEFAULT NULL,
+ `UniGeneId` varchar(100) DEFAULT NULL,
+ `Strand_Probe` char(1) DEFAULT NULL,
+ `Strand_Gene` char(1) DEFAULT NULL,
+ `OMIM` varchar(20) DEFAULT NULL,
+ `comments` text NOT NULL,
+ `Probe_set_target_region` varchar(255) DEFAULT NULL,
+ `Probe_set_specificity` double DEFAULT NULL,
+ `Probe_set_BLAT_score` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_start` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_end` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_start_2016` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_end_2016` double DEFAULT NULL,
+ `Probe_set_strand` varchar(255) DEFAULT NULL,
+ `Probe_set_Note_by_RW` varchar(255) DEFAULT NULL,
+ `flag` char(1) DEFAULT NULL,
+ `Symbol_H` varchar(100) DEFAULT NULL,
+ `description_H` varchar(255) DEFAULT NULL,
+ `chromosome_H` char(3) DEFAULT NULL,
+ `MB_H` double DEFAULT NULL,
+ `alias_H` varchar(255) DEFAULT NULL,
+ `GeneId_H` varchar(20) DEFAULT NULL,
+ `chr_num` smallint(5) unsigned DEFAULT 30,
+ `name_num` int(10) unsigned DEFAULT 4294967290,
+ `Probe_Target_Description` varchar(225) DEFAULT NULL,
+ `RefSeq_TranscriptId` varchar(255) DEFAULT NULL,
+ `ENSEMBLGeneId` varchar(50) DEFAULT NULL,
+ `Chr_mm8` char(3) DEFAULT NULL,
+ `Mb_mm8` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_start_mm8` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_end_mm8` double DEFAULT NULL,
+ `HomoloGeneID` varchar(20) DEFAULT NULL,
+ `Biotype_ENS` varchar(255) DEFAULT NULL,
+ `ProteinID` varchar(50) DEFAULT NULL,
+ `ProteinName` varchar(50) DEFAULT NULL,
+ `UniProtID` varchar(20) DEFAULT NULL,
+ `Flybase_Id` varchar(25) DEFAULT NULL,
+ `RGD_ID` int(10) DEFAULT NULL,
+ `HMDB_ID` varchar(255) DEFAULT NULL,
+ `Confidence` int(5) DEFAULT NULL,
+ `ChEBI_ID` int(10) DEFAULT NULL,
+ `ChEMBL_ID` varchar(100) DEFAULT NULL,
+ `CAS_number` varchar(100) DEFAULT NULL,
+ `PubChem_ID` int(10) DEFAULT NULL,
+ `ChemSpider_ID` int(10) DEFAULT NULL,
+ `UNII_ID` varchar(100) DEFAULT NULL,
+ `EC_number` varchar(100) DEFAULT NULL,
+ `KEGG_ID` varchar(100) DEFAULT NULL,
+ `Molecular_Weight` double DEFAULT NULL,
+ `Nugowiki_ID` int(10) DEFAULT NULL,
+ `Type` varchar(255) DEFAULT NULL,
+ `Tissue` varchar(255) DEFAULT NULL,
+ `PrimaryName` varchar(255) DEFAULT NULL,
+ `SecondaryNames` longtext DEFAULT NULL,
+ `PeptideSequence` varchar(20) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `ProbeSetId` (`ChipId`,`Name`),
+ KEY `Name_IDX` (`Name`),
+ KEY `symbol_IDX` (`Symbol`),
+ KEY `RefSeq_TranscriptId` (`RefSeq_TranscriptId`),
+ KEY `GENBANK_IDX` (`GenbankId`),
+ KEY `TargetId` (`TargetId`),
+ KEY `Position` (`Chr`),
+ KEY `GeneId_IDX` (`GeneId`),
+ FULLTEXT KEY `SEARCH_GENE_IDX` (`Symbol`,`alias`),
+ FULLTEXT KEY `SEARCH_FULL_IDX` (`Name`,`description`,`Symbol`,`alias`,`GenbankId`,`UniGeneId`,`Probe_Target_Description`),
+ FULLTEXT KEY `RefSeq_FULL_IDX` (`RefSeq_TranscriptId`)
+) ENGINE=MyISAM AUTO_INCREMENT=12118724 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSetData`
+--
+
+DROP TABLE IF EXISTS `ProbeSetData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSetData` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `value` float NOT NULL,
+ UNIQUE KEY `DataId` (`Id`,`StrainId`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSetFreeze`
+--
+
+DROP TABLE IF EXISTS `ProbeSetFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSetFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `ProbeFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `AvgID` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` varchar(40) DEFAULT NULL,
+ `Name2` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '0000-00-00',
+ `OrderList` int(5) DEFAULT NULL,
+ `public` tinyint(4) NOT NULL DEFAULT 0,
+ `confidentiality` tinyint(4) NOT NULL DEFAULT 0,
+ `AuthorisedUsers` varchar(300) NOT NULL,
+ `DataScale` varchar(20) NOT NULL DEFAULT 'log2',
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `FullName` (`FullName`),
+ UNIQUE KEY `Name` (`Name`),
+ KEY `NameIndex` (`Name2`),
+ KEY `ShortName` (`ShortName`),
+ KEY `ProbeFreezeId` (`ProbeFreezeId`),
+ KEY `conf_and_public` (`confidentiality`,`public`)
+) ENGINE=MyISAM AUTO_INCREMENT=1006 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSetSE`
+--
+
+DROP TABLE IF EXISTS `ProbeSetSE`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSetSE` (
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `error` float NOT NULL,
+ UNIQUE KEY `DataId` (`DataId`,`StrainId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSetXRef`
+--
+
+DROP TABLE IF EXISTS `ProbeSetXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSetXRef` (
+ `ProbeSetFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `ProbeSetId` int(10) unsigned NOT NULL DEFAULT 0,
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `Locus_old` char(20) DEFAULT NULL,
+ `LRS_old` double DEFAULT NULL,
+ `pValue_old` double DEFAULT NULL,
+ `mean` double DEFAULT NULL,
+ `se` double DEFAULT NULL,
+ `Locus` char(20) DEFAULT NULL,
+ `LRS` double DEFAULT NULL,
+ `pValue` double DEFAULT NULL,
+ `additive` double DEFAULT NULL,
+ `h2` float DEFAULT NULL,
+ UNIQUE KEY `ProbeSetId` (`ProbeSetFreezeId`,`ProbeSetId`),
+ UNIQUE KEY `DataId_IDX` (`DataId`),
+ KEY `ProbeSetId1` (`ProbeSetId`),
+ KEY `Locus` (`Locus`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeXRef`
+--
+
+DROP TABLE IF EXISTS `ProbeXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeXRef` (
+ `ProbeFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `ProbeId` int(10) unsigned NOT NULL DEFAULT 0,
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ UNIQUE KEY `ProbeId` (`ProbeFreezeId`,`ProbeId`),
+ UNIQUE KEY `DataId_IDX` (`DataId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Publication`
+--
+
+DROP TABLE IF EXISTS `Publication`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Publication` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `PubMed_ID` int(10) unsigned DEFAULT NULL,
+ `Abstract` text DEFAULT NULL,
+ `Authors` text NOT NULL,
+ `Title` varchar(255) DEFAULT NULL,
+ `Journal` varchar(255) DEFAULT NULL,
+ `Volume` varchar(255) DEFAULT NULL,
+ `Pages` varchar(255) DEFAULT NULL,
+ `Month` varchar(255) DEFAULT NULL,
+ `Year` varchar(255) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`PubMed_ID`),
+ KEY `PubMed_ID` (`PubMed_ID`),
+ FULLTEXT KEY `Abstract1` (`Abstract`),
+ FULLTEXT KEY `Title1` (`Title`),
+ FULLTEXT KEY `Authors1` (`Authors`),
+ FULLTEXT KEY `SEARCH_FULL_IDX` (`Abstract`,`Title`,`Authors`)
+) ENGINE=MyISAM AUTO_INCREMENT=26076 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `PublishData`
+--
+
+DROP TABLE IF EXISTS `PublishData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `PublishData` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `value` float(14,6) DEFAULT NULL,
+ UNIQUE KEY `DataId` (`Id`,`StrainId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `PublishFreeze`
+--
+
+DROP TABLE IF EXISTS `PublishFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `PublishFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '2001-01-01',
+ `public` tinyint(4) NOT NULL DEFAULT 0,
+ `InbredSetId` smallint(5) unsigned DEFAULT 1,
+ `confidentiality` tinyint(3) DEFAULT 0,
+ `AuthorisedUsers` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ KEY `InbredSetId` (`InbredSetId`)
+) ENGINE=MyISAM AUTO_INCREMENT=60 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `PublishSE`
+--
+
+DROP TABLE IF EXISTS `PublishSE`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `PublishSE` (
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `error` float NOT NULL,
+ UNIQUE KEY `DataId` (`DataId`,`StrainId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `PublishXRef`
+--
+
+DROP TABLE IF EXISTS `PublishXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `PublishXRef` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `InbredSetId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `PhenotypeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `PublicationId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `mean` double DEFAULT NULL,
+ `Locus` char(50) DEFAULT NULL,
+ `LRS` double DEFAULT NULL,
+ `additive` double DEFAULT NULL,
+ `Sequence` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `comments` text NOT NULL,
+ UNIQUE KEY `InbredSet` (`InbredSetId`,`Id`),
+ UNIQUE KEY `record` (`InbredSetId`,`PhenotypeId`,`PublicationId`,`Sequence`),
+ UNIQUE KEY `PhenotypeId` (`PhenotypeId`),
+ UNIQUE KEY `DataId` (`DataId`),
+ KEY `InbredSetId` (`InbredSetId`),
+ KEY `Locus` (`Locus`),
+ KEY `PublicationId` (`PublicationId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `RatSnpPattern`
+--
+
+DROP TABLE IF EXISTS `RatSnpPattern`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `RatSnpPattern` (
+ `Id` int(12) NOT NULL AUTO_INCREMENT,
+ `SnpId` int(12) NOT NULL,
+ `BN` char(1) DEFAULT NULL,
+ `F344` char(1) DEFAULT NULL,
+ `ACI` char(1) DEFAULT NULL,
+ `BBDP` char(1) DEFAULT NULL,
+ `FHH` char(1) DEFAULT NULL,
+ `FHL` char(1) DEFAULT NULL,
+ `GK` char(1) DEFAULT NULL,
+ `LE` char(1) DEFAULT NULL,
+ `LEW` char(1) DEFAULT NULL,
+ `LH` char(1) DEFAULT NULL,
+ `LL` char(1) DEFAULT NULL,
+ `LN` char(1) DEFAULT NULL,
+ `MHS` char(1) DEFAULT NULL,
+ `MNS` char(1) DEFAULT NULL,
+ `SBH` char(1) DEFAULT NULL,
+ `SBN` char(1) DEFAULT NULL,
+ `SHR` char(1) DEFAULT NULL,
+ `SHRSP` char(1) DEFAULT NULL,
+ `SR` char(1) DEFAULT NULL,
+ `SS` char(1) DEFAULT NULL,
+ `WAG` char(1) DEFAULT NULL,
+ `WLI` char(1) DEFAULT NULL,
+ `WMI` char(1) DEFAULT NULL,
+ `WKY` char(1) DEFAULT NULL,
+ `ACI_N` char(1) DEFAULT NULL,
+ `BN_N` char(1) DEFAULT NULL,
+ `BUF_N` char(1) DEFAULT NULL,
+ `F344_N` char(1) DEFAULT NULL,
+ `M520_N` char(1) DEFAULT NULL,
+ `MR_N` char(1) DEFAULT NULL,
+ `WKY_N` char(1) DEFAULT NULL,
+ `WN_N` char(1) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `SnpId` (`SnpId`)
+) ENGINE=MyISAM AUTO_INCREMENT=4711685 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Sample`
+--
+
+DROP TABLE IF EXISTS `Sample`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Sample` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` varchar(30) DEFAULT NULL,
+ `Age` smallint(6) NOT NULL DEFAULT 0,
+ `Sex` enum('F','M') NOT NULL DEFAULT 'F',
+ `CreateTime` date NOT NULL DEFAULT '2001-01-01',
+ `TissueType` varchar(30) DEFAULT NULL,
+ `FromSrc` varchar(10) DEFAULT NULL,
+ `ImageURL` varchar(100) DEFAULT NULL,
+ `CELURL` varchar(120) DEFAULT NULL,
+ `DATURL` varchar(100) DEFAULT NULL,
+ `CHPURL` varchar(100) DEFAULT NULL,
+ `RPTURL` varchar(100) DEFAULT NULL,
+ `EXPURL` varchar(100) DEFAULT NULL,
+ `TXTURL` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`StrainId`,`Name`,`CreateTime`)
+) ENGINE=MyISAM AUTO_INCREMENT=252 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SampleXRef`
+--
+
+DROP TABLE IF EXISTS `SampleXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SampleXRef` (
+ `SampleId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `ProbeFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ PRIMARY KEY (`ProbeFreezeId`,`SampleId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SnpAll`
+--
+
+DROP TABLE IF EXISTS `SnpAll`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SnpAll` (
+ `Id` int(20) unsigned NOT NULL AUTO_INCREMENT,
+ `SpeciesId` smallint(5) unsigned DEFAULT 1,
+ `SnpName` char(30) DEFAULT NULL,
+ `Rs` char(30) DEFAULT NULL,
+ `Chromosome` char(2) DEFAULT NULL,
+ `Position` double DEFAULT NULL,
+ `Position_2016` double DEFAULT NULL,
+ `Alleles` char(5) DEFAULT NULL,
+ `Source` char(35) DEFAULT NULL,
+ `ConservationScore` double DEFAULT NULL,
+ `3Prime_UTR` text DEFAULT NULL,
+ `5Prime_UTR` text DEFAULT NULL,
+ `Upstream` text DEFAULT NULL,
+ `Downstream` text DEFAULT NULL,
+ `Intron` char(1) DEFAULT NULL,
+ `Non_Splice_Site` text DEFAULT NULL,
+ `Splice_Site` text DEFAULT NULL,
+ `Intergenic` char(1) DEFAULT NULL,
+ `Exon` char(1) DEFAULT NULL,
+ `Non_Synonymous_Coding` text DEFAULT NULL,
+ `Synonymous_Coding` text DEFAULT NULL,
+ `Start_Gained` text DEFAULT NULL,
+ `Start_Lost` text DEFAULT NULL,
+ `Stop_Gained` text DEFAULT NULL,
+ `Stop_Lost` text DEFAULT NULL,
+ `Unknown_Effect_In_Exon` text DEFAULT NULL,
+ `Domain` varchar(50) DEFAULT NULL,
+ `Gene` varchar(30) DEFAULT NULL,
+ `Transcript` varchar(50) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ KEY `SnpName` (`SnpName`),
+ KEY `Rs` (`Rs`),
+ KEY `Position` (`Chromosome`,`Position`),
+ KEY `Source` (`Source`)
+) ENGINE=InnoDB AUTO_INCREMENT=84086331 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SnpAllRat`
+--
+
+DROP TABLE IF EXISTS `SnpAllRat`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SnpAllRat` (
+ `Id` int(20) NOT NULL AUTO_INCREMENT,
+ `SpeciesId` int(5) DEFAULT 2,
+ `SnpName` char(30) DEFAULT NULL,
+ `Chromosome` char(2) DEFAULT NULL,
+ `Position` double DEFAULT NULL,
+ `Alleles` char(5) DEFAULT NULL,
+ `Source` char(35) DEFAULT NULL,
+ `ConservationScore` double DEFAULT NULL,
+ `Domain` varchar(50) DEFAULT NULL,
+ `Gene` varchar(30) DEFAULT NULL,
+ `Transcript` varchar(50) DEFAULT NULL,
+ `Function` varchar(50) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ KEY `SnpName` (`SnpName`),
+ KEY `Position` (`Chromosome`,`Position`),
+ KEY `Source` (`Source`)
+) ENGINE=MyISAM AUTO_INCREMENT=97663615 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SnpAllele_to_be_deleted`
+--
+
+DROP TABLE IF EXISTS `SnpAllele_to_be_deleted`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SnpAllele_to_be_deleted` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Base` char(20) DEFAULT NULL,
+ `Info` char(255) DEFAULT NULL,
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SnpPattern`
+--
+
+DROP TABLE IF EXISTS `SnpPattern`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SnpPattern` (
+ `SnpId` int(10) unsigned NOT NULL DEFAULT 0,
+ `129P2/OlaHsd` char(1) DEFAULT NULL,
+ `129S1/SvImJ` char(1) DEFAULT NULL,
+ `129S5/SvEvBrd` char(1) DEFAULT NULL,
+ `AKR/J` char(1) DEFAULT NULL,
+ `A/J` char(1) DEFAULT NULL,
+ `BALB/cJ` char(1) DEFAULT NULL,
+ `C3H/HeJ` char(1) DEFAULT NULL,
+ `C57BL/6J` char(1) DEFAULT NULL,
+ `CAST/EiJ` char(1) DEFAULT NULL,
+ `CBA/J` char(1) DEFAULT NULL,
+ `DBA/2J` char(1) DEFAULT NULL,
+ `LP/J` char(1) DEFAULT NULL,
+ `NOD/ShiLtJ` char(1) DEFAULT NULL,
+ `NZO/HlLtJ` char(1) DEFAULT NULL,
+ `PWK/PhJ` char(1) DEFAULT NULL,
+ `SPRET/EiJ` char(1) DEFAULT NULL,
+ `WSB/EiJ` char(1) DEFAULT NULL,
+ `PWD/PhJ` char(1) DEFAULT NULL,
+ `SJL/J` char(1) DEFAULT NULL,
+ `NZL/LtJ` char(1) DEFAULT NULL,
+ `CZECHII/EiJ` char(1) DEFAULT NULL,
+ `CALB/RkJ` char(1) DEFAULT NULL,
+ `ST/bJ` char(1) DEFAULT NULL,
+ `ISS/IbgTejJ` char(1) DEFAULT NULL,
+ `C57L/J` char(1) DEFAULT NULL,
+ `Qsi5` char(1) DEFAULT NULL,
+ `B6A6_Esline_Regeneron` char(1) DEFAULT NULL,
+ `129T2/SvEmsJ` char(1) DEFAULT NULL,
+ `BALB/cByJ` char(1) DEFAULT NULL,
+ `NZB/BlNJ` char(1) DEFAULT NULL,
+ `P/J` char(1) DEFAULT NULL,
+ `I/LnJ` char(1) DEFAULT NULL,
+ `PERC/EiJ` char(1) DEFAULT NULL,
+ `TALLYHO/JngJ` char(1) DEFAULT NULL,
+ `CE/J` char(1) DEFAULT NULL,
+ `MRL/MpJ` char(1) DEFAULT NULL,
+ `PERA/EiJ` char(1) DEFAULT NULL,
+ `IS/CamRkJ` char(1) DEFAULT NULL,
+ `ZALENDE/EiJ` char(1) DEFAULT NULL,
+ `Fline` char(1) DEFAULT NULL,
+ `BTBRT<+>tf/J` char(1) DEFAULT NULL,
+ `O20` char(1) DEFAULT NULL,
+ `C58/J` char(1) DEFAULT NULL,
+ `BPH/2J` char(1) DEFAULT NULL,
+ `DDK/Pas` char(1) DEFAULT NULL,
+ `C57BL/6NHsd` char(1) DEFAULT NULL,
+ `C57BL/6NTac` char(1) DEFAULT NULL,
+ `129S4/SvJae` char(1) DEFAULT NULL,
+ `BPL/1J` char(1) DEFAULT NULL,
+ `BPN/3J` char(1) DEFAULT NULL,
+ `PL/J` char(1) DEFAULT NULL,
+ `DBA/1J` char(1) DEFAULT NULL,
+ `MSM/Ms` char(1) DEFAULT NULL,
+ `MA/MyJ` char(1) DEFAULT NULL,
+ `NZW/LacJ` char(1) DEFAULT NULL,
+ `C57BL/10J` char(1) DEFAULT NULL,
+ `C57BL/6ByJ` char(1) DEFAULT NULL,
+ `RF/J` char(1) DEFAULT NULL,
+ `C57BR/cdJ` char(1) DEFAULT NULL,
+ `129S6/SvEv` char(1) DEFAULT NULL,
+ `MAI/Pas` char(1) DEFAULT NULL,
+ `RIIIS/J` char(1) DEFAULT NULL,
+ `C57BL/6NNIH` char(1) DEFAULT NULL,
+ `FVB/NJ` char(1) DEFAULT NULL,
+ `SEG/Pas` char(1) DEFAULT NULL,
+ `MOLF/EiJ` char(1) DEFAULT NULL,
+ `C3HeB/FeJ` char(1) DEFAULT NULL,
+ `Lline` char(1) DEFAULT NULL,
+ `SKIVE/EiJ` char(1) DEFAULT NULL,
+ `C57BL/6NCrl` char(1) DEFAULT NULL,
+ `KK/HlJ` char(1) DEFAULT NULL,
+ `LG/J` char(1) DEFAULT NULL,
+ `C57BLKS/J` char(1) DEFAULT NULL,
+ `SM/J` char(1) DEFAULT NULL,
+ `NOR/LtJ` char(1) DEFAULT NULL,
+ `ILS/IbgTejJ` char(1) DEFAULT NULL,
+ `C57BL/6JOlaHsd` char(1) DEFAULT NULL,
+ `SWR/J` char(1) DEFAULT NULL,
+ `C57BL/6JBomTac` char(1) DEFAULT NULL,
+ `SOD1/EiJ` char(1) DEFAULT NULL,
+ `NON/LtJ` char(1) DEFAULT NULL,
+ `JF1/Ms` char(1) DEFAULT NULL,
+ `129X1/SvJ` char(1) DEFAULT NULL,
+ `C2T1_Esline_Nagy` char(1) DEFAULT NULL,
+ `C57BL/6NJ` char(1) DEFAULT NULL,
+ `LEWES/EiJ` char(1) DEFAULT NULL,
+ `RBA/DnJ` char(1) DEFAULT NULL,
+ `DDY/JclSidSeyFrkJ` char(1) DEFAULT NULL,
+ `SEA/GnJ` char(1) DEFAULT NULL,
+ `C57BL/6JCrl` char(1) DEFAULT NULL,
+ `EL/SuzSeyFrkJ` char(1) DEFAULT NULL,
+ `HTG/GoSfSnJ` char(1) DEFAULT NULL,
+ `129S2/SvHsd` char(1) DEFAULT NULL,
+ `MOLG/DnJ` char(1) DEFAULT NULL,
+ `BUB/BnJ` char(1) DEFAULT NULL,
+ PRIMARY KEY (`SnpId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SnpSource`
+--
+
+DROP TABLE IF EXISTS `SnpSource`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SnpSource` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` char(35) DEFAULT NULL,
+ `DateCreated` date DEFAULT NULL,
+ `DateAdded` date DEFAULT NULL,
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=29 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Species`
+--
+
+DROP TABLE IF EXISTS `Species`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Species` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `SpeciesId` int(5) DEFAULT NULL,
+ `SpeciesName` varchar(50) DEFAULT NULL,
+ `Name` char(30) NOT NULL DEFAULT '',
+ `MenuName` char(50) DEFAULT NULL,
+ `FullName` char(100) NOT NULL DEFAULT '',
+ `TaxonomyId` int(11) DEFAULT NULL,
+ `OrderId` smallint(6) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ KEY `Name` (`Name`)
+) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Strain`
+--
+
+DROP TABLE IF EXISTS `Strain`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Strain` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` varchar(100) DEFAULT NULL,
+ `Name2` varchar(100) DEFAULT NULL,
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Symbol` char(5) DEFAULT NULL,
+ `Alias` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`Name`,`SpeciesId`),
+ KEY `Symbol` (`Symbol`)
+) ENGINE=MyISAM AUTO_INCREMENT=63438 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `StrainXRef`
+--
+
+DROP TABLE IF EXISTS `StrainXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `StrainXRef` (
+ `InbredSetId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `OrderId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Used_for_mapping` char(1) DEFAULT 'N',
+ `PedigreeStatus` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`InbredSetId`,`StrainId`),
+ UNIQUE KEY `Orders` (`InbredSetId`,`OrderId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TableComments`
+--
+
+DROP TABLE IF EXISTS `TableComments`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TableComments` (
+ `TableName` varchar(100) NOT NULL DEFAULT '',
+ `Comment` text DEFAULT NULL,
+ PRIMARY KEY (`TableName`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TableFieldAnnotation`
+--
+
+DROP TABLE IF EXISTS `TableFieldAnnotation`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TableFieldAnnotation` (
+ `TableField` varchar(100) NOT NULL DEFAULT '',
+ `Foreign_Key` varchar(100) DEFAULT NULL,
+ `Annotation` text DEFAULT NULL,
+ PRIMARY KEY (`TableField`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Temp`
+--
+
+DROP TABLE IF EXISTS `Temp`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Temp` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `dbdisplayname` varchar(255) DEFAULT NULL,
+ `Name` varchar(30) DEFAULT NULL,
+ `description` text DEFAULT NULL,
+ `createtime` datetime /* mariadb-5.3 */ NOT NULL DEFAULT '2004-01-01 12:00:00',
+ `DataId` int(11) NOT NULL DEFAULT 0,
+ `InbredSetId` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `IP` varchar(20) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`Name`)
+) ENGINE=MyISAM AUTO_INCREMENT=98608 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TempData`
+--
+
+DROP TABLE IF EXISTS `TempData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TempData` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `value` double NOT NULL DEFAULT 0,
+ `SE` double DEFAULT NULL,
+ `NStrain` smallint(6) DEFAULT NULL,
+ UNIQUE KEY `DataId` (`Id`,`StrainId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Tissue`
+--
+
+DROP TABLE IF EXISTS `Tissue`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Tissue` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `TissueId` int(5) DEFAULT NULL,
+ `TissueName` varchar(50) DEFAULT NULL,
+ `Name` char(50) DEFAULT NULL,
+ `Short_Name` char(30) NOT NULL DEFAULT '',
+ `BIRN_lex_ID` char(30) DEFAULT NULL,
+ `BIRN_lex_Name` char(30) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Short_Name` (`Short_Name`),
+ UNIQUE KEY `Name` (`Name`)
+) ENGINE=MyISAM AUTO_INCREMENT=180 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TissueProbeFreeze`
+--
+
+DROP TABLE IF EXISTS `TissueProbeFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TissueProbeFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `ChipId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `StrainId` varchar(100) NOT NULL DEFAULT '0',
+ `Name` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '0000-00-00',
+ `InbredSetId` smallint(5) unsigned DEFAULT 1,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`Name`),
+ UNIQUE KEY `FullName` (`FullName`)
+) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TissueProbeSetData`
+--
+
+DROP TABLE IF EXISTS `TissueProbeSetData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TissueProbeSetData` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `TissueID` int(10) unsigned NOT NULL DEFAULT 0,
+ `value` float NOT NULL DEFAULT 0,
+ PRIMARY KEY (`Id`,`TissueID`)
+) ENGINE=MyISAM AUTO_INCREMENT=90563 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TissueProbeSetFreeze`
+--
+
+DROP TABLE IF EXISTS `TissueProbeSetFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TissueProbeSetFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `TissueProbeFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `AvgID` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` varchar(40) DEFAULT NULL,
+ `Name2` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '0000-00-00',
+ `public` tinyint(4) NOT NULL DEFAULT 0,
+ `confidentiality` tinyint(4) NOT NULL DEFAULT 0,
+ `AuthorisedUsers` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `FullName` (`FullName`),
+ UNIQUE KEY `Name` (`Name`),
+ KEY `NameIndex` (`Name2`)
+) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TissueProbeSetXRef`
+--
+
+DROP TABLE IF EXISTS `TissueProbeSetXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TissueProbeSetXRef` (
+ `TissueProbeSetFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `ProbesetId` int(10) unsigned NOT NULL DEFAULT 0,
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `Mean` float DEFAULT 0,
+ `useStatus` char(1) DEFAULT NULL,
+ `Symbol` varchar(100) DEFAULT NULL,
+ `GeneId` varchar(20) DEFAULT NULL,
+ `Chr` char(3) DEFAULT NULL,
+ `Mb` double DEFAULT NULL,
+ `Mb_2016` double DEFAULT NULL,
+ `description` varchar(255) DEFAULT NULL,
+ `Probe_Target_Description` varchar(225) DEFAULT NULL,
+ PRIMARY KEY (`TissueProbeSetFreezeId`,`ProbesetId`),
+ UNIQUE KEY `DataId_IDX` (`DataId`),
+ KEY `symbol_IDX` (`Symbol`),
+ KEY `GeneId_IDX` (`GeneId`),
+ KEY `Position` (`Chr`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TraitMetadata`
+--
+
+DROP TABLE IF EXISTS `TraitMetadata`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TraitMetadata` (
+ `type` varchar(255) DEFAULT NULL,
+ `value` longtext DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `User`
+--
+
+DROP TABLE IF EXISTS `User`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `User` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(100) NOT NULL DEFAULT '',
+ `password` varchar(100) NOT NULL DEFAULT '',
+ `email` varchar(100) DEFAULT NULL,
+ `createtime` datetime /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `user_ip` varchar(20) DEFAULT NULL,
+ `lastlogin` datetime /* mariadb-5.3 */ NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `disable` enum('Y','N') DEFAULT 'N',
+ `privilege` enum('guest','user','admin','root') DEFAULT NULL,
+ `grpName` varchar(40) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `name_index` (`name`)
+) ENGINE=MyISAM AUTO_INCREMENT=353 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `UserPrivilege`
+--
+
+DROP TABLE IF EXISTS `UserPrivilege`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `UserPrivilege` (
+ `UserId` int(10) unsigned NOT NULL,
+ `ProbeSetFreezeId` smallint(5) unsigned NOT NULL,
+ `download_result_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ KEY `userId` (`UserId`,`ProbeSetFreezeId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Vlookup`
+--
+
+DROP TABLE IF EXISTS `Vlookup`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Vlookup` (
+ `Id` int(11) NOT NULL AUTO_INCREMENT,
+ `VLProbeSetId` text DEFAULT NULL,
+ `VLBlatSeq` longtext DEFAULT NULL,
+ `InfoFileId` int(5) DEFAULT NULL,
+ `DatasetId` int(5) DEFAULT NULL,
+ `SpeciesId` int(5) DEFAULT NULL,
+ `TissueId` int(5) DEFAULT NULL,
+ `InbredSetId` int(5) DEFAULT NULL,
+ `GeneChipId` int(5) DEFAULT NULL,
+ `AvgMethodId` int(5) DEFAULT NULL,
+ `InfoPageName` varchar(255) DEFAULT NULL,
+ `GN_AccesionId` int(5) DEFAULT NULL,
+ `Name` varchar(100) DEFAULT NULL,
+ `GeneId` varchar(10) DEFAULT NULL,
+ `Mb` double DEFAULT NULL,
+ `Chr` varchar(10) DEFAULT NULL,
+ `Probe_set_Blat_Mb_start` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_end` double DEFAULT NULL,
+ `Strand` char(1) DEFAULT NULL,
+ `TxStart` double DEFAULT NULL,
+ `TxEnd` double DEFAULT NULL,
+ `cdsStart` double DEFAULT NULL,
+ `cdsEnd` double DEFAULT NULL,
+ `exonCount` int(7) DEFAULT NULL,
+ `exonStarts` text DEFAULT NULL,
+ `exonEnds` text DEFAULT NULL,
+ `ProteinID` varchar(15) DEFAULT NULL,
+ `AlignID` varchar(10) DEFAULT NULL,
+ `kgID` varchar(10) DEFAULT NULL,
+ `NM_ID` varchar(15) DEFAULT NULL,
+ `SnpName` char(30) DEFAULT NULL,
+ `Position` double DEFAULT NULL,
+ `HMDB_ID` varchar(255) DEFAULT NULL,
+ `Symbol` varchar(100) DEFAULT NULL,
+ `description` longtext DEFAULT NULL,
+ `alias` longtext DEFAULT NULL,
+ `Full_Description` longtext DEFAULT NULL,
+ `BlatSeq` text DEFAULT NULL,
+ `ChEBI_ID` int(10) DEFAULT NULL,
+ `ChEMBL_ID` varchar(100) DEFAULT NULL,
+ `CAS_number` varchar(100) DEFAULT NULL,
+ `PubChem_ID` int(10) DEFAULT NULL,
+ `ChemSpider_ID` varchar(10) DEFAULT NULL,
+ `UNII_ID` varchar(100) DEFAULT NULL,
+ `EC_number` varchar(100) DEFAULT NULL,
+ `KEGG_ID` varchar(100) DEFAULT NULL,
+ `Molecular_Weight` varchar(100) DEFAULT NULL,
+ `Nugowiki_ID` varchar(100) DEFAULT NULL,
+ `assembly` varchar(10) DEFAULT NULL,
+ KEY `Id` (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=753474564 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `login`
+--
+
+DROP TABLE IF EXISTS `login`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `login` (
+ `id` varchar(36) NOT NULL,
+ `user` varchar(36) DEFAULT NULL,
+ `timestamp` datetime /* mariadb-5.3 */ DEFAULT NULL,
+ `ip_address` varchar(39) DEFAULT NULL,
+ `successful` tinyint(1) NOT NULL,
+ `session_id` text DEFAULT NULL,
+ `assumed_by` varchar(36) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `user` (`user`),
+ KEY `assumed_by` (`assumed_by`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `metadata_audit`
+--
+
+DROP TABLE IF EXISTS `metadata_audit`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `metadata_audit` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `dataset_id` int(11) NOT NULL,
+ `editor` varchar(255) NOT NULL,
+ `json_diff_data` varchar(2048) NOT NULL,
+ `time_stamp` timestamp NOT NULL DEFAULT current_timestamp(),
+ PRIMARY KEY (`id`),
+ CONSTRAINT `CONSTRAINT_1` CHECK (json_valid(`json_diff_data`))
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `pubmedsearch`
+--
+
+DROP TABLE IF EXISTS `pubmedsearch`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `pubmedsearch` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `pubmedid` bigint(20) DEFAULT NULL,
+ `title` text DEFAULT NULL,
+ `authorfullname` text DEFAULT NULL,
+ `authorshortname` text DEFAULT NULL,
+ `institute` text DEFAULT NULL,
+ `geneid` varchar(20) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `NewIndex4` (`geneid`),
+ FULLTEXT KEY `NewIndex1` (`institute`),
+ FULLTEXT KEY `NewIndex3` (`authorfullname`,`authorshortname`)
+) ENGINE=MyISAM AUTO_INCREMENT=1401371 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `role`
+--
+
+DROP TABLE IF EXISTS `role`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `role` (
+ `the_id` varchar(36) NOT NULL,
+ `name` varchar(80) NOT NULL,
+ `description` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`the_id`),
+ UNIQUE KEY `name` (`name`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `roles_users`
+--
+
+DROP TABLE IF EXISTS `roles_users`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `roles_users` (
+ `user_id` int(11) DEFAULT NULL,
+ `role_id` int(11) DEFAULT NULL,
+ KEY `user_id` (`user_id`),
+ KEY `role_id` (`role_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `temporary`
+--
+
+DROP TABLE IF EXISTS `temporary`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `temporary` (
+ `tax_id` varchar(20) DEFAULT NULL,
+ `GeneID` varchar(20) DEFAULT NULL,
+ `Symbol` varchar(100) DEFAULT NULL,
+ `OMIM` varchar(100) DEFAULT NULL,
+ `HomoloGene` varchar(100) DEFAULT NULL,
+ `Other_GeneID` varchar(20) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `user`
+--
+
+DROP TABLE IF EXISTS `user`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `user` (
+ `id` varchar(36) NOT NULL,
+ `email_address` varchar(50) NOT NULL,
+ `password` text NOT NULL,
+ `full_name` varchar(50) DEFAULT NULL,
+ `organization` varchar(50) DEFAULT NULL,
+ `active` tinyint(1) NOT NULL,
+ `registration_info` text DEFAULT NULL,
+ `confirmed` text DEFAULT NULL,
+ `superuser` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `email_address` (`email_address`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `user_collection`
+--
+
+DROP TABLE IF EXISTS `user_collection`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `user_collection` (
+ `id` varchar(36) NOT NULL,
+ `user` varchar(36) DEFAULT NULL,
+ `name` text DEFAULT NULL,
+ `created_timestamp` datetime /* mariadb-5.3 */ DEFAULT NULL,
+ `changed_timestamp` datetime /* mariadb-5.3 */ DEFAULT NULL,
+ `members` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `user` (`user`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `user_openids`
+--
+
+DROP TABLE IF EXISTS `user_openids`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `user_openids` (
+ `openid_url` varchar(255) NOT NULL,
+ `user_id` varchar(36) NOT NULL,
+ PRIMARY KEY (`openid_url`),
+ KEY `user_id` (`user_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2021-07-14 5:26:53
diff --git a/sql/schema.org b/sql/schema.org
new file mode 100644
index 0000000..2db8a27
--- /dev/null
+++ b/sql/schema.org
@@ -0,0 +1,39 @@
+#+TITLE: GeneNetwork Database Schema
+
+This is an attempt to reverse engineer and understand the schema of the
+GeneNetwork database. The goal is to prune redundant tables, fields, etc. and
+arrive at a simplified schema. This simplified schema will be useful when
+migrating the database.
+
+* Species
+** Id
+ Primary key
+** SpeciesId
+ Looks like a redundant key referred to as a foreign key from many other
+ tables. This field should be replaced by Id.
+** SpeciesName
+ Common name of the species. This field can be replaced by MenuName.
+** Name
+ Downcased common name used as key for the species in dictionaries
+** MenuName
+ Name in the Species dropdown menu. This is the SpeciesName, but sometimes
+ with the reference genome identifier mentioned in brackets.
+** FullName
+ Binomial name of the species
+** TaxonomyId
+ Foreign keys?
+** OrderId
+ Foreign keys?
+
+* Strain
+** Id
+ Primary key
+** Name
+ Name of the strain
+** Name2
+ A second name. For most rows, this is the same as Name. Why is this
+ necessary?
+** SpeciesId
+ Foreign key into the Species table
+** Symbol
+** Alias
diff --git a/sql/schema.png b/sql/schema.png
new file mode 100644
index 0000000..fbcf28c
--- /dev/null
+++ b/sql/schema.png
Binary files differ
diff --git a/sql/schema.sql b/sql/schema.sql
new file mode 100644
index 0000000..c37754b
--- /dev/null
+++ b/sql/schema.sql
@@ -0,0 +1,2406 @@
+-- This is a work-in-progress schema for the GeneNetwork database. The
+-- GeneNetwork database has no foreign key constraint information. This schema
+-- has them manually added. But, the work is not complete, and there may be
+-- errors. A visualization of this schema can be found in schema.png and
+-- schema.svg.
+
+-- MySQL dump 10.16 Distrib 10.1.41-MariaDB, for debian-linux-gnu (x86_64)
+--
+-- Host: localhost Database: db_webqtl
+-- ------------------------------------------------------
+-- Server version 10.5.8-MariaDB-log
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `AccessLog`
+--
+
+DROP TABLE IF EXISTS `AccessLog`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `AccessLog` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `accesstime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `ip_address` char(20) NOT NULL DEFAULT '0.0.0.0',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=1366832 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `AvgMethod`
+--
+
+DROP TABLE IF EXISTS `AvgMethod`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `AvgMethod` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `AvgMethodId` int(5) DEFAULT NULL,
+ `Name` char(30) NOT NULL DEFAULT '',
+ `Normalization` varchar(30) DEFAULT NULL,
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `BXDSnpPosition`
+--
+
+DROP TABLE IF EXISTS `BXDSnpPosition`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `BXDSnpPosition` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `Chr` char(2) DEFAULT NULL,
+ `StrainId1` int(11) DEFAULT NULL,
+ `StrainId2` int(11) DEFAULT NULL,
+ `Mb` double DEFAULT NULL,
+ `Mb_2016` double DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (StrainId1) REFERENCES Strain(Id),
+ FOREIGN KEY (StrainId2) REFERENCES Strain(Id),
+ KEY `BXDSnpPosition` (`Chr`,`StrainId1`,`StrainId2`,`Mb`)
+) ENGINE=MyISAM AUTO_INCREMENT=7791982 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `CaseAttribute`
+--
+
+DROP TABLE IF EXISTS `CaseAttribute`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `CaseAttribute` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` varchar(30) NOT NULL DEFAULT '',
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=34 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `CaseAttributeXRef`
+--
+
+DROP TABLE IF EXISTS `CaseAttributeXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `CaseAttributeXRef` (
+ `ProbeSetFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `CaseAttributeId` smallint(5) NOT NULL DEFAULT 0,
+ `Value` varchar(100) NOT NULL DEFAULT '',
+ PRIMARY KEY (`ProbeSetFreezeId`,`StrainId`,`CaseAttributeId`),
+ FOREIGN KEY (ProbeSetFreezeId) REFERENCES ProbeSetFreeze(Id),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id),
+ FOREIGN KEY (CaseAttributeId) REFERENCES CaseAttribute(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `CaseAttributeXRefNew`
+--
+
+DROP TABLE IF EXISTS `CaseAttributeXRefNew`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `CaseAttributeXRefNew` (
+ `InbredSetId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `StrainId` int(8) unsigned NOT NULL DEFAULT 0,
+ `CaseAttributeId` smallint(5) NOT NULL DEFAULT 0,
+ `Value` varchar(100) NOT NULL DEFAULT '',
+ PRIMARY KEY (`InbredSetId`,`StrainId`,`CaseAttributeId`),
+ FOREIGN KEY (InbredSetId) REFERENCES InbredSet(InbredSetId),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id),
+ FOREIGN KEY (CaseAttributeId) REFERENCES CaseAttribute(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `CeleraINFO_mm6`
+--
+
+DROP TABLE IF EXISTS `CeleraINFO_mm6`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `CeleraINFO_mm6` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `SNPID` char(14) NOT NULL DEFAULT '',
+ `chromosome` char(3) DEFAULT NULL,
+ `MB_UCSC` double DEFAULT NULL,
+ `MB_celera` double DEFAULT NULL,
+ `allele_B6` char(4) DEFAULT NULL,
+ `allele_D2` char(4) DEFAULT NULL,
+ `allele_AJ` char(4) DEFAULT NULL,
+ `B6_D2` char(1) DEFAULT NULL,
+ `B6_AJ` char(1) DEFAULT NULL,
+ `D2_AJ` char(1) DEFAULT NULL,
+ `MB_UCSC_OLD` double DEFAULT NULL,
+ `allele_S1` char(4) DEFAULT NULL,
+ `allele_X1` char(4) DEFAULT NULL,
+ `flanking5` char(100) DEFAULT NULL,
+ `flanking3` char(100) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ KEY `celeraIndex` (`chromosome`,`MB_celera`),
+ KEY `celeraIndex2` (`chromosome`,`MB_UCSC`),
+ KEY `chromosome_2` (`chromosome`,`MB_UCSC`),
+ KEY `MB_UCSC_2` (`MB_UCSC`,`chromosome`),
+ KEY `SNPID` (`SNPID`)
+) ENGINE=MyISAM AUTO_INCREMENT=3028848 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Chr_Length`
+--
+
+DROP TABLE IF EXISTS `Chr_Length`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Chr_Length` (
+ `Name` char(3) NOT NULL DEFAULT '',
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `OrderId` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Length` int(10) unsigned NOT NULL DEFAULT 0,
+ `Length_2016` int(10) unsigned NOT NULL DEFAULT 0,
+ `Length_mm8` int(10) unsigned DEFAULT NULL,
+ UNIQUE KEY `nameIdx` (`SpeciesId`,`Name`),
+ UNIQUE KEY `SpeciesIdx` (`SpeciesId`,`OrderId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `DBList`
+--
+
+DROP TABLE IF EXISTS `DBList`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `DBList` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `DBTypeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `FreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` char(50) NOT NULL DEFAULT '',
+ `Code` char(50) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Cde` (`Code`),
+ FOREIGN KEY (DBTypeId) REFERENCES DBType(Id),
+ KEY `DBIndex` (`DBTypeId`,`FreezeId`)
+) ENGINE=MyISAM AUTO_INCREMENT=907 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `DBType`
+--
+
+DROP TABLE IF EXISTS `DBType`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `DBType` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` char(30) NOT NULL DEFAULT '',
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `DatasetMapInvestigator`
+--
+
+DROP TABLE IF EXISTS `DatasetMapInvestigator`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `DatasetMapInvestigator` (
+ `Id` mediumint(9) NOT NULL AUTO_INCREMENT,
+ `DatasetId` int(6) NOT NULL,
+ `InvestigatorId` int(6) NOT NULL,
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=2403 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `DatasetStatus`
+--
+
+DROP TABLE IF EXISTS `DatasetStatus`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `DatasetStatus` (
+ `DatasetStatusId` int(5) NOT NULL,
+ `DatasetStatusName` varchar(20) DEFAULT NULL,
+ UNIQUE KEY `DatasetStatusId` (`DatasetStatusId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Dataset_mbat`
+--
+
+DROP TABLE IF EXISTS `Dataset_mbat`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Dataset_mbat` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `switch` int(1) DEFAULT NULL,
+ `species` varchar(255) DEFAULT NULL,
+ `cross` varchar(255) DEFAULT NULL,
+ `tissue` varchar(255) DEFAULT NULL,
+ `database` varchar(255) DEFAULT NULL,
+ `database_LongName` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Datasets`
+--
+
+DROP TABLE IF EXISTS `Datasets`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Datasets` (
+ `DatasetId` int(6) NOT NULL AUTO_INCREMENT,
+ `DatasetName` varchar(255) DEFAULT NULL,
+ `GeoSeries` varchar(30) DEFAULT NULL,
+ `PublicationTitle` longtext DEFAULT NULL,
+ `Summary` longtext DEFAULT NULL,
+ `ExperimentDesign` longtext DEFAULT NULL,
+ `AboutCases` longtext DEFAULT NULL,
+ `AboutTissue` longtext DEFAULT NULL,
+ `AboutPlatform` longtext DEFAULT NULL,
+ `AboutDataProcessing` longtext DEFAULT NULL,
+ `Contributors` longtext DEFAULT NULL,
+ `Citation` longtext DEFAULT NULL,
+ `Acknowledgment` longtext DEFAULT NULL,
+ `Notes` longtext DEFAULT NULL,
+ `InvestigatorId` int(5) NOT NULL,
+ `DatasetStatusId` int(5) NOT NULL,
+ PRIMARY KEY (`DatasetId`),
+ UNIQUE KEY `DatasetId` (`DatasetId`)
+) ENGINE=MyISAM AUTO_INCREMENT=301 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Docs`
+--
+
+DROP TABLE IF EXISTS `Docs`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Docs` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `entry` varchar(255) NOT NULL,
+ `title` varchar(255) NOT NULL,
+ `content` text NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `EnsemblChip`
+--
+
+DROP TABLE IF EXISTS `EnsemblChip`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `EnsemblChip` (
+ `Id` int(11) NOT NULL,
+ `ProbeSetSize` int(11) NOT NULL,
+ `Name` varchar(40) NOT NULL,
+ `Type` enum('AFFY','OLIGO') DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `EnsemblProbe`
+--
+
+DROP TABLE IF EXISTS `EnsemblProbe`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `EnsemblProbe` (
+ `Id` int(11) NOT NULL,
+ `ChipId` int(11) NOT NULL,
+ `ProbeSet` varchar(40) DEFAULT NULL,
+ `Name` varchar(40) DEFAULT NULL,
+ `length` int(11) NOT NULL,
+ KEY `EnsemblProbeId` (`Id`),
+ KEY `EnsemblProbeName` (`Name`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `EnsemblProbeLocation`
+--
+
+DROP TABLE IF EXISTS `EnsemblProbeLocation`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `EnsemblProbeLocation` (
+ `Chr` char(2) NOT NULL,
+ `Start` int(11) NOT NULL,
+ `Start_2016` int(11) DEFAULT NULL,
+ `End` int(11) NOT NULL,
+ `End_2016` int(11) DEFAULT NULL,
+ `Strand` int(11) NOT NULL,
+ `MisMataches` int(11) DEFAULT NULL,
+ `ProbeId` int(11) NOT NULL,
+ KEY `EnsemblLocationProbeId` (`ProbeId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GORef`
+--
+
+DROP TABLE IF EXISTS `GORef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GORef` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `goterm` varchar(255) DEFAULT NULL,
+ `genes` text DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=17510 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Genbank`
+--
+
+DROP TABLE IF EXISTS `Genbank`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Genbank` (
+ `Id` varchar(20) NOT NULL DEFAULT '',
+ `Sequence` text DEFAULT NULL,
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ PRIMARY KEY (`Id`),
+ FOREIGN KEY (SpeciesId) REFERENCES Species(SpeciesId),
+ KEY `Id` (`Id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneCategory`
+--
+
+DROP TABLE IF EXISTS `GeneCategory`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneCategory` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`Id`),
+ KEY `name_idx` (`Name`)
+) ENGINE=MyISAM AUTO_INCREMENT=22 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneChip`
+--
+
+DROP TABLE IF EXISTS `GeneChip`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneChip` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `GeneChipId` int(5) DEFAULT NULL,
+ `GeneChipName` varchar(200) DEFAULT NULL,
+ `Name` char(30) NOT NULL DEFAULT '',
+ `GeoPlatform` char(15) DEFAULT NULL,
+ `Title` varchar(100) DEFAULT NULL,
+ `SpeciesId` int(5) DEFAULT 1,
+ `GO_tree_value` varchar(50) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ FOREIGN KEY (SpeciesId) REFERENCES Species(SpeciesId)
+) ENGINE=MyISAM AUTO_INCREMENT=67 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneChipEnsemblXRef`
+--
+
+DROP TABLE IF EXISTS `GeneChipEnsemblXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneChipEnsemblXRef` (
+ `GeneChipId` int(11) NOT NULL,
+ `EnsemblChipId` int(11) NOT NULL,
+ FOREIGN KEY (GeneChipId) REFERENCES GeneChip(GeneChipId),
+ FOREIGN KEY (EnsemblChipId) REFERENCES EnsemblChip(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneIDXRef`
+--
+
+DROP TABLE IF EXISTS `GeneIDXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneIDXRef` (
+ `mouse` int(11) NOT NULL DEFAULT 0,
+ `rat` int(11) NOT NULL DEFAULT 0,
+ `human` int(11) NOT NULL DEFAULT 0,
+ KEY `mouse_index` (`mouse`),
+ KEY `rat_index` (`rat`),
+ KEY `human_index` (`human`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneList`
+--
+
+DROP TABLE IF EXISTS `GeneList`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneList` (
+ `SpeciesId` int(5) unsigned NOT NULL DEFAULT 1,
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `GeneSymbol` varchar(15) DEFAULT NULL,
+ `GeneDescription` text DEFAULT NULL,
+ `Chromosome` varchar(10) DEFAULT NULL,
+ `TxStart` double DEFAULT NULL,
+ `TxStart_2016` double DEFAULT NULL,
+ `TxEnd` double DEFAULT NULL,
+ `TxEnd_2016` double DEFAULT NULL,
+ `Strand` char(1) DEFAULT NULL,
+ `GeneID` varchar(10) DEFAULT NULL,
+ `NM_ID` varchar(15) DEFAULT NULL,
+ `kgID` varchar(10) DEFAULT NULL,
+ `GenBankID` varchar(15) DEFAULT NULL,
+ `UnigenID` varchar(15) DEFAULT NULL,
+ `ProteinID` varchar(15) DEFAULT NULL,
+ `AlignID` varchar(10) DEFAULT NULL,
+ `exonCount` int(7) NOT NULL DEFAULT 0,
+ `exonStarts` text DEFAULT NULL,
+ `exonEnds` text DEFAULT NULL,
+ `cdsStart` double DEFAULT NULL,
+ `cdsStart_2016` double DEFAULT NULL,
+ `cdsEnd` double DEFAULT NULL,
+ `cdsEnd_2016` double DEFAULT NULL,
+ `TxStart_mm8` double DEFAULT NULL,
+ `TxEnd_mm8` double DEFAULT NULL,
+ `Strand_mm8` char(1) DEFAULT NULL,
+ `exonCount_mm8` int(7) DEFAULT NULL,
+ `exonStarts_mm8` text DEFAULT NULL,
+ `exonEnds_mm8` text DEFAULT NULL,
+ `cdsStart_mm8` double DEFAULT NULL,
+ `cdsEnd_mm8` double DEFAULT NULL,
+ `Chromosome_mm8` varchar(10) DEFAULT NULL,
+ `Info_mm9` text DEFAULT NULL,
+ `RGD_ID` int(10) DEFAULT NULL,
+ UNIQUE KEY `geneId` (`SpeciesId`,`Id`),
+ FOREIGN KEY (SpeciesId) REFERENCES Species(SpeciesId),
+ FOREIGN KEY (GenBankID) REFERENCES Genbank(Id),
+ KEY `geneSymbol` (`GeneSymbol`),
+ KEY `geneSymbol2` (`SpeciesId`,`GeneSymbol`),
+ KEY `Loc1` (`SpeciesId`,`Chromosome`,`TxStart`),
+ KEY `Loc2` (`SpeciesId`,`Chromosome`,`TxEnd`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneList_rn3`
+--
+
+DROP TABLE IF EXISTS `GeneList_rn3`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneList_rn3` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `ProbeSet` varchar(16) DEFAULT NULL,
+ `geneSymbol` varchar(15) DEFAULT NULL,
+ `geneID` varchar(10) DEFAULT NULL,
+ `kgID` varchar(10) DEFAULT NULL,
+ `geneDescription` text DEFAULT NULL,
+ `genBankID` varchar(15) DEFAULT NULL,
+ `unigenID` varchar(15) DEFAULT NULL,
+ `score` int(4) DEFAULT NULL,
+ `qStart` int(3) DEFAULT NULL,
+ `qEnd` int(3) DEFAULT NULL,
+ `qSize` int(3) DEFAULT NULL,
+ `identity` varchar(7) DEFAULT NULL,
+ `chromosome` varchar(8) DEFAULT NULL,
+ `strand` char(1) DEFAULT NULL,
+ `txStart` double DEFAULT NULL,
+ `txEnd` double DEFAULT NULL,
+ `txSize` double DEFAULT NULL,
+ `span` int(7) DEFAULT NULL,
+ `specificity` double DEFAULT NULL,
+ `sequence` text DEFAULT NULL,
+ `flag` int(1) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `geneSymbol` (`geneSymbol`),
+ KEY `Loc1` (`chromosome`,`txStart`),
+ KEY `Loc2` (`chromosome`,`txEnd`)
+) ENGINE=MyISAM AUTO_INCREMENT=14917 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneList_rn33`
+--
+
+DROP TABLE IF EXISTS `GeneList_rn33`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneList_rn33` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `geneSymbol` varchar(15) DEFAULT NULL,
+ `txStart` double DEFAULT NULL,
+ `txEnd` double DEFAULT NULL,
+ `exonCount` int(7) DEFAULT NULL,
+ `NM_ID` varchar(15) DEFAULT NULL,
+ `chromosome` varchar(8) DEFAULT NULL,
+ `strand` char(1) DEFAULT NULL,
+ `cdsStart` double DEFAULT NULL,
+ `cdsEnd` double DEFAULT NULL,
+ `exonStarts` text DEFAULT NULL,
+ `exonEnds` text DEFAULT NULL,
+ `kgID` varchar(10) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `geneSymbol` (`geneSymbol`),
+ KEY `Loc1` (`chromosome`,`txStart`),
+ KEY `Loc2` (`chromosome`,`txEnd`)
+) ENGINE=MyISAM AUTO_INCREMENT=9790 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneMap_cuiyan`
+--
+
+DROP TABLE IF EXISTS `GeneMap_cuiyan`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneMap_cuiyan` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `TranscriptID` varchar(255) DEFAULT NULL,
+ `GeneID` varchar(255) DEFAULT NULL,
+ `Symbol` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=10537 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneRIF`
+--
+
+DROP TABLE IF EXISTS `GeneRIF`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneRIF` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `versionId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `symbol` varchar(30) NOT NULL DEFAULT '',
+ `PubMed_ID` varchar(255) DEFAULT NULL,
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `comment` text DEFAULT NULL,
+ `email` varchar(50) DEFAULT NULL,
+ `createtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `user_ip` varchar(20) DEFAULT NULL,
+ `weburl` varchar(255) DEFAULT NULL,
+ `initial` varchar(10) DEFAULT NULL,
+ `display` tinyint(4) DEFAULT 1,
+ `reason` varchar(100) NOT NULL DEFAULT '',
+ PRIMARY KEY (`Id`,`versionId`),
+ FOREIGN KEY (SpeciesId) REFERENCES Species(SpeciesId),
+ KEY `name_idx` (`symbol`),
+ KEY `status` (`display`),
+ KEY `timestamp` (`createtime`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneRIFXRef`
+--
+
+DROP TABLE IF EXISTS `GeneRIFXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneRIFXRef` (
+ `GeneRIFId` int(10) unsigned NOT NULL DEFAULT 0,
+ `versionId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `GeneCategoryId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ PRIMARY KEY (`GeneRIFId`,`versionId`,`GeneCategoryId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GeneRIF_BASIC`
+--
+
+DROP TABLE IF EXISTS `GeneRIF_BASIC`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GeneRIF_BASIC` (
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `GeneId` int(10) unsigned NOT NULL DEFAULT 0,
+ `symbol` varchar(255) NOT NULL DEFAULT '',
+ `PubMed_ID` int(10) unsigned NOT NULL DEFAULT 0,
+ `createtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `comment` text DEFAULT NULL,
+ `VersionId` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`GeneId`,`SpeciesId`,`createtime`,`PubMed_ID`,`VersionId`),
+ FOREIGN KEY (SpeciesId) REFERENCES Species(SpeciesId),
+ KEY `symbol` (`symbol`,`SpeciesId`,`createtime`),
+ FULLTEXT KEY `commts` (`comment`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Geno`
+--
+
+DROP TABLE IF EXISTS `Geno`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Geno` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `Name` varchar(40) NOT NULL DEFAULT '',
+ `Marker_Name` varchar(40) DEFAULT NULL,
+ `Chr` char(3) DEFAULT NULL,
+ `Mb` double DEFAULT NULL,
+ `Mb_2016` double DEFAULT NULL,
+ `Sequence` text DEFAULT NULL,
+ `Source` varchar(40) DEFAULT NULL,
+ `chr_num` smallint(5) unsigned DEFAULT NULL,
+ `Source2` varchar(40) DEFAULT NULL,
+ `Comments` varchar(255) DEFAULT NULL,
+ `used_by_geno_file` varchar(40) DEFAULT NULL,
+ `Mb_mm8` double DEFAULT NULL,
+ `Chr_mm8` char(3) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `species_name` (`SpeciesId`,`Name`),
+ FOREIGN KEY (SpeciesId) REFERENCES Species(SpeciesId),
+ KEY `Name` (`Name`)
+) ENGINE=MyISAM AUTO_INCREMENT=716770 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoCode`
+--
+
+DROP TABLE IF EXISTS `GenoCode`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoCode` (
+ `InbredSetId` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `AlleleType` char(3) NOT NULL DEFAULT '',
+ `AlleleSymbol` char(2) NOT NULL DEFAULT '',
+ `DatabaseValue` smallint(5) DEFAULT NULL,
+ PRIMARY KEY (`InbredSetId`,`AlleleType`,`AlleleSymbol`),
+ UNIQUE KEY `InbredSetId_AlleleType` (`InbredSetId`,`AlleleType`),
+ UNIQUE KEY `InbredSetId_AlleleSymbol` (`InbredSetId`,`AlleleSymbol`),
+ UNIQUE KEY `InbredSetId_DatabaseValue` (`InbredSetId`,`DatabaseValue`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoData`
+--
+
+DROP TABLE IF EXISTS `GenoData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoData` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `value` float NOT NULL,
+ UNIQUE KEY `DataId` (`Id`,`StrainId`),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoFile`
+--
+
+DROP TABLE IF EXISTS `GenoFile`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoFile` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `server` varchar(100) NOT NULL,
+ `InbredSetID` int(11) NOT NULL,
+ `location` varchar(255) NOT NULL,
+ `title` varchar(255) NOT NULL,
+ `sort` int(3) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoFreeze`
+--
+
+DROP TABLE IF EXISTS `GenoFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '2001-01-01',
+ `public` tinyint(4) NOT NULL DEFAULT 0,
+ `InbredSetId` smallint(5) unsigned DEFAULT 1,
+ `confidentiality` tinyint(3) unsigned DEFAULT 0,
+ `AuthorisedUsers` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ FOREIGN KEY (InbredSetId) REFERENCES InbredSet(InbredSetId),
+) ENGINE=MyISAM AUTO_INCREMENT=37 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoSE`
+--
+
+DROP TABLE IF EXISTS `GenoSE`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoSE` (
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `error` float NOT NULL,
+ UNIQUE KEY `DataId` (`DataId`,`StrainId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `GenoXRef`
+--
+
+DROP TABLE IF EXISTS `GenoXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `GenoXRef` (
+ `GenoFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `GenoId` int(10) unsigned NOT NULL DEFAULT 0,
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `cM` double DEFAULT 0,
+ `Used_for_mapping` char(1) DEFAULT 'N',
+ UNIQUE KEY `ProbeSetId` (`GenoFreezeId`,`GenoId`),
+ UNIQUE KEY `DataId` (`DataId`),
+ FOREIGN KEY (GenoFreezeId) REFERENCES GenoFreeze(Id),
+ FOREIGN KEY (GenoId) REFERENCES Geno(Id),
+ KEY `GenoId` (`GenoId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `H2`
+--
+
+DROP TABLE IF EXISTS `H2`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `H2` (
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `ICH2` double NOT NULL DEFAULT 0,
+ `H2SE` double NOT NULL DEFAULT 0,
+ `HPH2` double NOT NULL DEFAULT 0,
+ UNIQUE KEY `DataId` (`DataId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Homologene`
+--
+
+DROP TABLE IF EXISTS `Homologene`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Homologene` (
+ `HomologeneId` int(11) DEFAULT NULL,
+ `GeneId` int(11) DEFAULT NULL,
+ `TaxonomyId` int(11) DEFAULT NULL,
+ KEY `GeneId` (`GeneId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `InbredSet`
+--
+
+DROP TABLE IF EXISTS `InbredSet`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `InbredSet` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `InbredSetId` int(5) DEFAULT NULL,
+ `InbredSetName` varchar(100) DEFAULT NULL,
+ `Name` char(30) NOT NULL DEFAULT '',
+ `SpeciesId` smallint(5) unsigned DEFAULT 1,
+ `FullName` varchar(100) DEFAULT NULL,
+ `public` tinyint(3) unsigned DEFAULT 2,
+ `MappingMethodId` char(50) DEFAULT '1',
+ `GeneticType` varchar(255) DEFAULT NULL,
+ `Family` varchar(100) DEFAULT NULL,
+ `FamilyOrder` int(5) DEFAULT NULL,
+ `MenuOrderId` double NOT NULL,
+ `InbredSetCode` varchar(5) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ FOREIGN KEY (SpeciesId) REFERENCES Species(SpeciesId),
+ FOREIGN KEY (MappingMethodId) REFERENCES MappingMethod(Id),
+ KEY `Name` (`Name`),
+ KEY `SpeciesId` (`SpeciesId`),
+ KEY `Id` (`Id`),
+ KEY `InbredSetCode` (`InbredSetCode`)
+) ENGINE=MyISAM AUTO_INCREMENT=83 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `IndelAll`
+--
+
+DROP TABLE IF EXISTS `IndelAll`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `IndelAll` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `SpeciesId` smallint(5) unsigned DEFAULT 1,
+ `SourceId` smallint(5) unsigned DEFAULT NULL,
+ `Name` char(30) DEFAULT NULL,
+ `Chromosome` char(2) DEFAULT NULL,
+ `Mb_start` double DEFAULT NULL,
+ `Mb_start_2016` double DEFAULT NULL,
+ `Strand` char(1) DEFAULT NULL,
+ `Type` char(15) DEFAULT NULL,
+ `Mb_end` double DEFAULT NULL,
+ `Mb_end_2016` double DEFAULT NULL,
+ `Size` double DEFAULT NULL,
+ `InDelSequence` char(30) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `SnpId` (`SpeciesId`,`Name`),
+ FOREIGN KEY (SpeciesId) REFERENCES Species(SpeciesId),
+ KEY `SnpId2` (`Name`),
+ KEY `Position` (`SpeciesId`,`Chromosome`,`Mb_start`) USING BTREE
+) ENGINE=MyISAM AUTO_INCREMENT=142895 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `IndelXRef`
+--
+
+DROP TABLE IF EXISTS `IndelXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `IndelXRef` (
+ `IndelId` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId1` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `StrainId2` smallint(5) unsigned DEFAULT NULL,
+ PRIMARY KEY (`IndelId`,`StrainId1`),
+ FOREIGN KEY (IndelId) REFERENCES IndelAll(Id),
+ FOREIGN KEY (StrainId1) REFERENCES Strain(Id),
+ FOREIGN KEY (StrainId2) REFERENCES Strain(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `InfoFiles`
+--
+
+DROP TABLE IF EXISTS `InfoFiles`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `InfoFiles` (
+ `DatasetId` int(5) DEFAULT NULL,
+ `SpeciesId` int(5) DEFAULT NULL,
+ `TissueId` int(5) DEFAULT NULL,
+ `InbredSetId` int(5) DEFAULT NULL,
+ `GeneChipId` int(5) DEFAULT NULL,
+ `AvgMethodId` int(5) DEFAULT NULL,
+ `InfoFileTitle` longtext DEFAULT NULL,
+ `Specifics` longtext DEFAULT NULL,
+ `Status` varchar(255) DEFAULT NULL,
+ `Title` varchar(255) DEFAULT NULL,
+ `Organism` varchar(255) DEFAULT NULL,
+ `Experiment_Type` longtext DEFAULT NULL,
+ `Summary` longtext DEFAULT NULL,
+ `Overall_Design` longtext DEFAULT NULL,
+ `Contributor` longtext DEFAULT NULL,
+ `Citation` longtext DEFAULT NULL,
+ `Submission_Date` varchar(255) DEFAULT NULL,
+ `Contact_Name` varchar(255) DEFAULT NULL,
+ `Emails` varchar(255) DEFAULT NULL,
+ `Phone` varchar(255) DEFAULT NULL,
+ `URL` varchar(255) DEFAULT NULL,
+ `Organization_Name` varchar(255) DEFAULT NULL,
+ `Department` varchar(255) DEFAULT NULL,
+ `Laboratory` varchar(255) DEFAULT NULL,
+ `Street` varchar(255) DEFAULT NULL,
+ `City` varchar(255) DEFAULT NULL,
+ `State` varchar(255) DEFAULT NULL,
+ `ZIP` varchar(255) DEFAULT NULL,
+ `Country` varchar(255) DEFAULT NULL,
+ `Platforms` varchar(255) DEFAULT NULL,
+ `Samples` longtext DEFAULT NULL,
+ `Species` varchar(255) DEFAULT NULL,
+ `Normalization` varchar(255) DEFAULT NULL,
+ `InbredSet` varchar(255) DEFAULT NULL,
+ `InfoPageName` varchar(255) NOT NULL,
+ `DB_Name` varchar(255) DEFAULT NULL,
+ `Organism_Id` varchar(60) DEFAULT NULL,
+ `InfoPageTitle` varchar(255) DEFAULT NULL,
+ `GN_AccesionId` int(4) DEFAULT NULL,
+ `Tissue` varchar(60) DEFAULT NULL,
+ `AuthorizedUsers` varchar(100) DEFAULT NULL,
+ `About_Cases` longtext DEFAULT NULL,
+ `About_Tissue` longtext DEFAULT NULL,
+ `About_Download` longtext DEFAULT NULL,
+ `About_Array_Platform` longtext DEFAULT NULL,
+ `About_Data_Values_Processing` longtext DEFAULT NULL,
+ `Data_Source_Acknowledge` longtext DEFAULT NULL,
+ `Progreso` varchar(20) DEFAULT NULL,
+ `QualityControlStatus` longtext DEFAULT NULL,
+ `InfoFileId` int(6) NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`InfoFileId`),
+ UNIQUE KEY `InfoPageName` (`InfoPageName`),
+ UNIQUE KEY `GN_AccesionId` (`GN_AccesionId`)
+) ENGINE=MyISAM AUTO_INCREMENT=1470 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `InfoFilesUser_md5`
+--
+
+DROP TABLE IF EXISTS `InfoFilesUser_md5`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `InfoFilesUser_md5` (
+ `Username` varchar(16) DEFAULT NULL,
+ `Password` varchar(32) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Investigators`
+--
+
+DROP TABLE IF EXISTS `Investigators`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Investigators` (
+ `FirstName` varchar(20) DEFAULT NULL,
+ `LastName` varchar(20) DEFAULT NULL,
+ `Address` varchar(200) DEFAULT NULL,
+ `City` varchar(20) DEFAULT NULL,
+ `State` varchar(20) DEFAULT NULL,
+ `ZipCode` varchar(20) DEFAULT NULL,
+ `Phone` varchar(200) DEFAULT NULL,
+ `Email` varchar(200) DEFAULT NULL,
+ `Country` varchar(35) DEFAULT NULL,
+ `Url` text DEFAULT NULL,
+ `UserName` varchar(30) DEFAULT NULL,
+ `UserPass` varchar(50) DEFAULT NULL,
+ `UserDate` datetime DEFAULT NULL,
+ `UserLevel` int(8) DEFAULT NULL,
+ `OrganizationId` int(5) NOT NULL,
+ `InvestigatorId` int(5) NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`InvestigatorId`),
+ FOREIGN KEY (OrganizationId) REFERENCES Organizations(OrganizationId)
+) ENGINE=MyISAM AUTO_INCREMENT=151 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `LCorrRamin3`
+--
+
+DROP TABLE IF EXISTS `LCorrRamin3`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `LCorrRamin3` (
+ `GeneId1` int(12) unsigned DEFAULT NULL,
+ `GeneId2` int(12) unsigned DEFAULT NULL,
+ `value` double DEFAULT NULL,
+ KEY `GeneId1` (`GeneId1`),
+ KEY `GeneId2` (`GeneId2`),
+ KEY `GeneId1_2` (`GeneId1`,`GeneId2`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `MachineAccessLog`
+--
+
+DROP TABLE IF EXISTS `MachineAccessLog`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `MachineAccessLog` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `accesstime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `ip_address` char(20) NOT NULL DEFAULT '0.0.0.0',
+ `db_id` tinyint(3) unsigned NOT NULL DEFAULT 0,
+ `data_id` int(10) unsigned DEFAULT NULL,
+ `action` char(10) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=514946 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `MappingMethod`
+--
+
+DROP TABLE IF EXISTS `MappingMethod`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `MappingMethod` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` varchar(100) NOT NULL DEFAULT '',
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `NStrain`
+--
+
+DROP TABLE IF EXISTS `NStrain`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `NStrain` (
+ `DataId` int(10) unsigned DEFAULT NULL,
+ `StrainId` smallint(5) unsigned DEFAULT NULL,
+ `count` varchar(5) DEFAULT NULL,
+ UNIQUE KEY `DataId` (`DataId`,`StrainId`),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `News`
+--
+
+DROP TABLE IF EXISTS `News`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `News` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `date` date DEFAULT NULL,
+ `details` text DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=296 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Organizations`
+--
+
+DROP TABLE IF EXISTS `Organizations`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Organizations` (
+ `OrganizationId` int(5) NOT NULL AUTO_INCREMENT,
+ `OrganizationName` varchar(200) NOT NULL,
+ PRIMARY KEY (`OrganizationId`),
+ UNIQUE KEY `OrganizationId` (`OrganizationId`),
+ UNIQUE KEY `OrganizationName` (`OrganizationName`)
+) ENGINE=MyISAM AUTO_INCREMENT=92 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Phenotype`
+--
+
+DROP TABLE IF EXISTS `Phenotype`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Phenotype` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Pre_publication_description` text DEFAULT NULL,
+ `Post_publication_description` text DEFAULT NULL,
+ `Original_description` text DEFAULT NULL,
+ `Units` varchar(100) NOT NULL DEFAULT 'Unknown',
+ `Pre_publication_abbreviation` varchar(40) DEFAULT NULL,
+ `Post_publication_abbreviation` varchar(40) DEFAULT NULL,
+ `Lab_code` varchar(255) DEFAULT NULL,
+ `Submitter` varchar(255) DEFAULT NULL,
+ `Owner` varchar(255) DEFAULT NULL,
+ `Authorized_Users` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ KEY `Post_publication_description_Index` (`Post_publication_description`(255)),
+ KEY `Pre_publication_description_Index` (`Pre_publication_description`(255)),
+ KEY `Pre_publication_abbreviation_Index` (`Pre_publication_abbreviation`),
+ KEY `Post_publication_abbreviation_Index` (`Post_publication_abbreviation`),
+ KEY `Lab_code` (`Lab_code`),
+ FULLTEXT KEY `Post_publication_description` (`Post_publication_description`),
+ FULLTEXT KEY `Pre_publication_description` (`Pre_publication_description`),
+ FULLTEXT KEY `Pre_publication_abbreviation` (`Pre_publication_abbreviation`),
+ FULLTEXT KEY `Post_publication_abbreviation` (`Post_publication_abbreviation`),
+ FULLTEXT KEY `Lab_code1` (`Lab_code`),
+ FULLTEXT KEY `SEARCH_FULL_IDX` (`Post_publication_description`,`Pre_publication_description`,`Pre_publication_abbreviation`,`Post_publication_abbreviation`,`Lab_code`)
+) ENGINE=MyISAM AUTO_INCREMENT=29299 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Probe`
+--
+
+DROP TABLE IF EXISTS `Probe`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Probe` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `ProbeSetId` int(10) unsigned NOT NULL DEFAULT 0,
+ `Name` char(20) DEFAULT NULL,
+ `Sequence` char(30) DEFAULT NULL,
+ `ExonNo` char(7) DEFAULT NULL,
+ `SerialOrder` double DEFAULT NULL,
+ `Tm` double DEFAULT NULL,
+ `E_GSB` double DEFAULT NULL,
+ `E_NSB` double DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `ProbeSetId` (`ProbeSetId`,`Name`),
+ FOREIGN KEY (ProbeSetId) REFERENCES ProbeSet(ProbeSetId),
+ KEY `SerialOrder` (`ProbeSetId`,`SerialOrder`)
+) ENGINE=MyISAM AUTO_INCREMENT=19054073 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeData`
+--
+
+DROP TABLE IF EXISTS `ProbeData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeData` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `value` float NOT NULL,
+ UNIQUE KEY `DataId` (`Id`,`StrainId`),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeFreeze`
+--
+
+DROP TABLE IF EXISTS `ProbeFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `ProbeFreezeId` int(5) DEFAULT NULL,
+ `ChipId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `TissueId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '0000-00-00',
+ `InbredSetId` smallint(5) unsigned DEFAULT 1,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`Name`),
+ FOREIGN KEY (TissueId) REFERENCES Tissue(TissueId),
+ KEY `TissueId` (`TissueId`),
+ KEY `InbredSetId` (`InbredSetId`)
+) ENGINE=MyISAM AUTO_INCREMENT=416 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeH2`
+--
+
+DROP TABLE IF EXISTS `ProbeH2`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeH2` (
+ `ProbeFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `ProbeId` int(10) unsigned NOT NULL DEFAULT 0,
+ `h2` double DEFAULT NULL,
+ `weight` double DEFAULT NULL,
+ UNIQUE KEY `ProbeId` (`ProbeFreezeId`,`ProbeId`),
+ FOREIGN KEY (ProbeFreezeId) REFERENCES ProbeFreeze(ProbeFreezeId),
+ FOREIGN KEY (ProbeId) REFERENCES Probe(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSE`
+--
+
+DROP TABLE IF EXISTS `ProbeSE`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSE` (
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `error` float NOT NULL,
+ UNIQUE KEY `DataId` (`DataId`,`StrainId`),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSet`
+--
+
+DROP TABLE IF EXISTS `ProbeSet`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSet` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `ChipId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` varchar(100) DEFAULT NULL,
+ `TargetId` varchar(150) DEFAULT NULL,
+ `Symbol` varchar(100) DEFAULT NULL,
+ `description` longtext DEFAULT NULL,
+ `Chr` char(3) DEFAULT NULL,
+ `Mb` double DEFAULT NULL,
+ `Chr_2016` char(3) DEFAULT NULL,
+ `Mb_2016` double DEFAULT NULL,
+ `alias` longtext DEFAULT NULL,
+ `GeneId` varchar(20) DEFAULT NULL,
+ `GenbankId` varchar(1000) DEFAULT NULL,
+ `SNP` int(2) DEFAULT NULL,
+ `BlatSeq` text NOT NULL,
+ `TargetSeq` text DEFAULT NULL,
+ `UniGeneId` varchar(100) DEFAULT NULL,
+ `Strand_Probe` char(1) DEFAULT NULL,
+ `Strand_Gene` char(1) DEFAULT NULL,
+ `OMIM` varchar(20) DEFAULT NULL,
+ `comments` text NOT NULL,
+ `Probe_set_target_region` varchar(255) DEFAULT NULL,
+ `Probe_set_specificity` double DEFAULT NULL,
+ `Probe_set_BLAT_score` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_start` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_end` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_start_2016` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_end_2016` double DEFAULT NULL,
+ `Probe_set_strand` varchar(255) DEFAULT NULL,
+ `Probe_set_Note_by_RW` varchar(255) DEFAULT NULL,
+ `flag` char(1) DEFAULT NULL,
+ `Symbol_H` varchar(100) DEFAULT NULL,
+ `description_H` varchar(255) DEFAULT NULL,
+ `chromosome_H` char(3) DEFAULT NULL,
+ `MB_H` double DEFAULT NULL,
+ `alias_H` varchar(255) DEFAULT NULL,
+ `GeneId_H` varchar(20) DEFAULT NULL,
+ `chr_num` smallint(5) unsigned DEFAULT 30,
+ `name_num` int(10) unsigned DEFAULT 4294967290,
+ `Probe_Target_Description` varchar(225) DEFAULT NULL,
+ `RefSeq_TranscriptId` varchar(255) DEFAULT NULL,
+ `ENSEMBLGeneId` varchar(50) DEFAULT NULL,
+ `Chr_mm8` char(3) DEFAULT NULL,
+ `Mb_mm8` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_start_mm8` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_end_mm8` double DEFAULT NULL,
+ `HomoloGeneID` varchar(20) DEFAULT NULL,
+ `Biotype_ENS` varchar(255) DEFAULT NULL,
+ `ProteinID` varchar(50) DEFAULT NULL,
+ `ProteinName` varchar(50) DEFAULT NULL,
+ `UniProtID` varchar(20) DEFAULT NULL,
+ `Flybase_Id` varchar(25) DEFAULT NULL,
+ `RGD_ID` int(10) DEFAULT NULL,
+ `HMDB_ID` varchar(255) DEFAULT NULL,
+ `Confidence` int(5) DEFAULT NULL,
+ `ChEBI_ID` int(10) DEFAULT NULL,
+ `ChEMBL_ID` varchar(100) DEFAULT NULL,
+ `CAS_number` varchar(100) DEFAULT NULL,
+ `PubChem_ID` int(10) DEFAULT NULL,
+ `ChemSpider_ID` int(10) DEFAULT NULL,
+ `UNII_ID` varchar(100) DEFAULT NULL,
+ `EC_number` varchar(100) DEFAULT NULL,
+ `KEGG_ID` varchar(100) DEFAULT NULL,
+ `Molecular_Weight` double DEFAULT NULL,
+ `Nugowiki_ID` int(10) DEFAULT NULL,
+ `Type` varchar(255) DEFAULT NULL,
+ `Tissue` varchar(255) DEFAULT NULL,
+ `PrimaryName` varchar(255) DEFAULT NULL,
+ `SecondaryNames` longtext DEFAULT NULL,
+ `PeptideSequence` varchar(20) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `ProbeSetId` (`ChipId`,`Name`),
+ FOREIGN KEY (HomoloGeneID) REFERENCES Homologene(HomologeneId),
+ KEY `Name_IDX` (`Name`),
+ KEY `symbol_IDX` (`Symbol`),
+ KEY `RefSeq_TranscriptId` (`RefSeq_TranscriptId`),
+ KEY `GENBANK_IDX` (`GenbankId`),
+ KEY `TargetId` (`TargetId`),
+ KEY `Position` (`Chr`),
+ KEY `GeneId_IDX` (`GeneId`),
+ FULLTEXT KEY `SEARCH_GENE_IDX` (`Symbol`,`alias`),
+ FULLTEXT KEY `SEARCH_FULL_IDX` (`Name`,`description`,`Symbol`,`alias`,`GenbankId`,`UniGeneId`,`Probe_Target_Description`),
+ FULLTEXT KEY `RefSeq_FULL_IDX` (`RefSeq_TranscriptId`)
+) ENGINE=MyISAM AUTO_INCREMENT=12118724 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSetData`
+--
+
+DROP TABLE IF EXISTS `ProbeSetData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSetData` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `value` float NOT NULL,
+ UNIQUE KEY `DataId` (`Id`,`StrainId`),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSetFreeze`
+--
+
+DROP TABLE IF EXISTS `ProbeSetFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSetFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `ProbeFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `AvgID` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` varchar(40) DEFAULT NULL,
+ `Name2` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '0000-00-00',
+ `OrderList` int(5) DEFAULT NULL,
+ `public` tinyint(4) NOT NULL DEFAULT 0,
+ `confidentiality` tinyint(4) NOT NULL DEFAULT 0,
+ `AuthorisedUsers` varchar(300) NOT NULL,
+ `DataScale` varchar(20) NOT NULL DEFAULT 'log2',
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `FullName` (`FullName`),
+ UNIQUE KEY `Name` (`Name`),
+ FOREIGN KEY (ProbeFreezeId) REFERENCES ProbeFreeze(ProbeFreezeId),
+ KEY `NameIndex` (`Name2`),
+ KEY `ShortName` (`ShortName`),
+ KEY `ProbeFreezeId` (`ProbeFreezeId`),
+ KEY `conf_and_public` (`confidentiality`,`public`)
+) ENGINE=MyISAM AUTO_INCREMENT=1006 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSetSE`
+--
+
+DROP TABLE IF EXISTS `ProbeSetSE`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSetSE` (
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `error` float NOT NULL,
+ UNIQUE KEY `DataId` (`DataId`,`StrainId`),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeSetXRef`
+--
+
+DROP TABLE IF EXISTS `ProbeSetXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeSetXRef` (
+ `ProbeSetFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `ProbeSetId` int(10) unsigned NOT NULL DEFAULT 0,
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `Locus_old` char(20) DEFAULT NULL,
+ `LRS_old` double DEFAULT NULL,
+ `pValue_old` double DEFAULT NULL,
+ `mean` double DEFAULT NULL,
+ `se` double DEFAULT NULL,
+ `Locus` char(20) DEFAULT NULL,
+ `LRS` double DEFAULT NULL,
+ `pValue` double DEFAULT NULL,
+ `additive` double DEFAULT NULL,
+ `h2` float DEFAULT NULL,
+ UNIQUE KEY `ProbeSetId` (`ProbeSetFreezeId`,`ProbeSetId`),
+ UNIQUE KEY `DataId_IDX` (`DataId`),
+ FOREIGN KEY (ProbeSetFreezeId) REFERENCES ProbeSetFreeze(Id),
+ FOREIGN KEY (ProbeSetId) REFERENCES ProbeSet(Id),
+ KEY `ProbeSetId1` (`ProbeSetId`),
+ KEY `Locus` (`Locus`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ProbeXRef`
+--
+
+DROP TABLE IF EXISTS `ProbeXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ProbeXRef` (
+ `ProbeFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `ProbeId` int(10) unsigned NOT NULL DEFAULT 0,
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ UNIQUE KEY `ProbeId` (`ProbeFreezeId`,`ProbeId`),
+ UNIQUE KEY `DataId_IDX` (`DataId`),
+ FOREIGN KEY (ProbeFreezeId) REFERENCES ProbeFreeze(ProbeFreezeId),
+ FOREIGN KEY (ProbeId) REFERENCES Probe(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Publication`
+--
+
+DROP TABLE IF EXISTS `Publication`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Publication` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `PubMed_ID` int(10) unsigned DEFAULT NULL,
+ `Abstract` text DEFAULT NULL,
+ `Authors` text NOT NULL,
+ `Title` varchar(255) DEFAULT NULL,
+ `Journal` varchar(255) DEFAULT NULL,
+ `Volume` varchar(255) DEFAULT NULL,
+ `Pages` varchar(255) DEFAULT NULL,
+ `Month` varchar(255) DEFAULT NULL,
+ `Year` varchar(255) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`PubMed_ID`),
+ KEY `PubMed_ID` (`PubMed_ID`),
+ FULLTEXT KEY `Abstract1` (`Abstract`),
+ FULLTEXT KEY `Title1` (`Title`),
+ FULLTEXT KEY `Authors1` (`Authors`),
+ FULLTEXT KEY `SEARCH_FULL_IDX` (`Abstract`,`Title`,`Authors`)
+) ENGINE=MyISAM AUTO_INCREMENT=26076 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `PublishData`
+--
+
+DROP TABLE IF EXISTS `PublishData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `PublishData` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `value` float(14,6) DEFAULT NULL,
+ UNIQUE KEY `DataId` (`Id`,`StrainId`),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `PublishFreeze`
+--
+
+DROP TABLE IF EXISTS `PublishFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `PublishFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '2001-01-01',
+ `public` tinyint(4) NOT NULL DEFAULT 0,
+ `InbredSetId` smallint(5) unsigned DEFAULT 1,
+ `confidentiality` tinyint(3) DEFAULT 0,
+ `AuthorisedUsers` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ FOREIGN KEY (InbredSetId) REFERENCES InbredSet(InbredSetId),
+ KEY `InbredSetId` (`InbredSetId`)
+) ENGINE=MyISAM AUTO_INCREMENT=60 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `PublishSE`
+--
+
+DROP TABLE IF EXISTS `PublishSE`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `PublishSE` (
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `error` float NOT NULL,
+ UNIQUE KEY `DataId` (`DataId`,`StrainId`),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `PublishXRef`
+--
+
+DROP TABLE IF EXISTS `PublishXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `PublishXRef` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `InbredSetId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `PhenotypeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `PublicationId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `mean` double DEFAULT NULL,
+ `Locus` char(50) DEFAULT NULL,
+ `LRS` double DEFAULT NULL,
+ `additive` double DEFAULT NULL,
+ `Sequence` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `comments` text NOT NULL,
+ UNIQUE KEY `InbredSet` (`InbredSetId`,`Id`),
+ UNIQUE KEY `record` (`InbredSetId`,`PhenotypeId`,`PublicationId`,`Sequence`),
+ UNIQUE KEY `PhenotypeId` (`PhenotypeId`),
+ UNIQUE KEY `DataId` (`DataId`),
+ FOREIGN KEY (InbredSetId) REFERENCES InbredSet(InbredSetId),
+ FOREIGN KEY (PhenotypeId) REFERENCES Phenotype(Id),
+ FOREIGN KEY (PublicationId) REFERENCES Publication(Id),
+ KEY `InbredSetId` (`InbredSetId`),
+ KEY `Locus` (`Locus`),
+ KEY `PublicationId` (`PublicationId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `RatSnpPattern`
+--
+
+DROP TABLE IF EXISTS `RatSnpPattern`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `RatSnpPattern` (
+ `Id` int(12) NOT NULL AUTO_INCREMENT,
+ `SnpId` int(12) NOT NULL,
+ `BN` char(1) DEFAULT NULL,
+ `F344` char(1) DEFAULT NULL,
+ `ACI` char(1) DEFAULT NULL,
+ `BBDP` char(1) DEFAULT NULL,
+ `FHH` char(1) DEFAULT NULL,
+ `FHL` char(1) DEFAULT NULL,
+ `GK` char(1) DEFAULT NULL,
+ `LE` char(1) DEFAULT NULL,
+ `LEW` char(1) DEFAULT NULL,
+ `LH` char(1) DEFAULT NULL,
+ `LL` char(1) DEFAULT NULL,
+ `LN` char(1) DEFAULT NULL,
+ `MHS` char(1) DEFAULT NULL,
+ `MNS` char(1) DEFAULT NULL,
+ `SBH` char(1) DEFAULT NULL,
+ `SBN` char(1) DEFAULT NULL,
+ `SHR` char(1) DEFAULT NULL,
+ `SHRSP` char(1) DEFAULT NULL,
+ `SR` char(1) DEFAULT NULL,
+ `SS` char(1) DEFAULT NULL,
+ `WAG` char(1) DEFAULT NULL,
+ `WLI` char(1) DEFAULT NULL,
+ `WMI` char(1) DEFAULT NULL,
+ `WKY` char(1) DEFAULT NULL,
+ `ACI_N` char(1) DEFAULT NULL,
+ `BN_N` char(1) DEFAULT NULL,
+ `BUF_N` char(1) DEFAULT NULL,
+ `F344_N` char(1) DEFAULT NULL,
+ `M520_N` char(1) DEFAULT NULL,
+ `MR_N` char(1) DEFAULT NULL,
+ `WKY_N` char(1) DEFAULT NULL,
+ `WN_N` char(1) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `SnpId` (`SnpId`)
+) ENGINE=MyISAM AUTO_INCREMENT=4711685 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Sample`
+--
+
+DROP TABLE IF EXISTS `Sample`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Sample` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` varchar(30) DEFAULT NULL,
+ `Age` smallint(6) NOT NULL DEFAULT 0,
+ `Sex` enum('F','M') NOT NULL DEFAULT 'F',
+ `CreateTime` date NOT NULL DEFAULT '2001-01-01',
+ `TissueType` varchar(30) DEFAULT NULL,
+ `FromSrc` varchar(10) DEFAULT NULL,
+ `ImageURL` varchar(100) DEFAULT NULL,
+ `CELURL` varchar(120) DEFAULT NULL,
+ `DATURL` varchar(100) DEFAULT NULL,
+ `CHPURL` varchar(100) DEFAULT NULL,
+ `RPTURL` varchar(100) DEFAULT NULL,
+ `EXPURL` varchar(100) DEFAULT NULL,
+ `TXTURL` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`StrainId`,`Name`,`CreateTime`)
+) ENGINE=MyISAM AUTO_INCREMENT=252 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SampleXRef`
+--
+
+DROP TABLE IF EXISTS `SampleXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SampleXRef` (
+ `SampleId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `ProbeFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ PRIMARY KEY (`ProbeFreezeId`,`SampleId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SnpAll`
+--
+
+DROP TABLE IF EXISTS `SnpAll`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SnpAll` (
+ `Id` int(20) unsigned NOT NULL AUTO_INCREMENT,
+ `SpeciesId` smallint(5) unsigned DEFAULT 1,
+ `SnpName` char(30) DEFAULT NULL,
+ `Rs` char(30) DEFAULT NULL,
+ `Chromosome` char(2) DEFAULT NULL,
+ `Position` double DEFAULT NULL,
+ `Position_2016` double DEFAULT NULL,
+ `Alleles` char(5) DEFAULT NULL,
+ `Source` char(35) DEFAULT NULL,
+ `ConservationScore` double DEFAULT NULL,
+ `3Prime_UTR` text DEFAULT NULL,
+ `5Prime_UTR` text DEFAULT NULL,
+ `Upstream` text DEFAULT NULL,
+ `Downstream` text DEFAULT NULL,
+ `Intron` char(1) DEFAULT NULL,
+ `Non_Splice_Site` text DEFAULT NULL,
+ `Splice_Site` text DEFAULT NULL,
+ `Intergenic` char(1) DEFAULT NULL,
+ `Exon` char(1) DEFAULT NULL,
+ `Non_Synonymous_Coding` text DEFAULT NULL,
+ `Synonymous_Coding` text DEFAULT NULL,
+ `Start_Gained` text DEFAULT NULL,
+ `Start_Lost` text DEFAULT NULL,
+ `Stop_Gained` text DEFAULT NULL,
+ `Stop_Lost` text DEFAULT NULL,
+ `Unknown_Effect_In_Exon` text DEFAULT NULL,
+ `Domain` varchar(50) DEFAULT NULL,
+ `Gene` varchar(30) DEFAULT NULL,
+ `Transcript` varchar(50) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ FOREIGN KEY (SpeciesId) REFERENCES Species(SpeciesId),
+ KEY `SnpName` (`SnpName`),
+ KEY `Rs` (`Rs`),
+ KEY `Position` (`Chromosome`,`Position`),
+ KEY `Source` (`Source`)
+) ENGINE=InnoDB AUTO_INCREMENT=84086331 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SnpAllRat`
+--
+
+DROP TABLE IF EXISTS `SnpAllRat`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SnpAllRat` (
+ `Id` int(20) NOT NULL AUTO_INCREMENT,
+ `SpeciesId` int(5) DEFAULT 2,
+ `SnpName` char(30) DEFAULT NULL,
+ `Chromosome` char(2) DEFAULT NULL,
+ `Position` double DEFAULT NULL,
+ `Alleles` char(5) DEFAULT NULL,
+ `Source` char(35) DEFAULT NULL,
+ `ConservationScore` double DEFAULT NULL,
+ `Domain` varchar(50) DEFAULT NULL,
+ `Gene` varchar(30) DEFAULT NULL,
+ `Transcript` varchar(50) DEFAULT NULL,
+ `Function` varchar(50) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ KEY `SnpName` (`SnpName`),
+ KEY `Position` (`Chromosome`,`Position`),
+ KEY `Source` (`Source`)
+) ENGINE=MyISAM AUTO_INCREMENT=97663615 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SnpAllele_to_be_deleted`
+--
+
+DROP TABLE IF EXISTS `SnpAllele_to_be_deleted`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SnpAllele_to_be_deleted` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Base` char(20) DEFAULT NULL,
+ `Info` char(255) DEFAULT NULL,
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SnpPattern`
+--
+
+DROP TABLE IF EXISTS `SnpPattern`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SnpPattern` (
+ `SnpId` int(10) unsigned NOT NULL DEFAULT 0,
+ `129P2/OlaHsd` char(1) DEFAULT NULL,
+ `129S1/SvImJ` char(1) DEFAULT NULL,
+ `129S5/SvEvBrd` char(1) DEFAULT NULL,
+ `AKR/J` char(1) DEFAULT NULL,
+ `A/J` char(1) DEFAULT NULL,
+ `BALB/cJ` char(1) DEFAULT NULL,
+ `C3H/HeJ` char(1) DEFAULT NULL,
+ `C57BL/6J` char(1) DEFAULT NULL,
+ `CAST/EiJ` char(1) DEFAULT NULL,
+ `CBA/J` char(1) DEFAULT NULL,
+ `DBA/2J` char(1) DEFAULT NULL,
+ `LP/J` char(1) DEFAULT NULL,
+ `NOD/ShiLtJ` char(1) DEFAULT NULL,
+ `NZO/HlLtJ` char(1) DEFAULT NULL,
+ `PWK/PhJ` char(1) DEFAULT NULL,
+ `SPRET/EiJ` char(1) DEFAULT NULL,
+ `WSB/EiJ` char(1) DEFAULT NULL,
+ `PWD/PhJ` char(1) DEFAULT NULL,
+ `SJL/J` char(1) DEFAULT NULL,
+ `NZL/LtJ` char(1) DEFAULT NULL,
+ `CZECHII/EiJ` char(1) DEFAULT NULL,
+ `CALB/RkJ` char(1) DEFAULT NULL,
+ `ST/bJ` char(1) DEFAULT NULL,
+ `ISS/IbgTejJ` char(1) DEFAULT NULL,
+ `C57L/J` char(1) DEFAULT NULL,
+ `Qsi5` char(1) DEFAULT NULL,
+ `B6A6_Esline_Regeneron` char(1) DEFAULT NULL,
+ `129T2/SvEmsJ` char(1) DEFAULT NULL,
+ `BALB/cByJ` char(1) DEFAULT NULL,
+ `NZB/BlNJ` char(1) DEFAULT NULL,
+ `P/J` char(1) DEFAULT NULL,
+ `I/LnJ` char(1) DEFAULT NULL,
+ `PERC/EiJ` char(1) DEFAULT NULL,
+ `TALLYHO/JngJ` char(1) DEFAULT NULL,
+ `CE/J` char(1) DEFAULT NULL,
+ `MRL/MpJ` char(1) DEFAULT NULL,
+ `PERA/EiJ` char(1) DEFAULT NULL,
+ `IS/CamRkJ` char(1) DEFAULT NULL,
+ `ZALENDE/EiJ` char(1) DEFAULT NULL,
+ `Fline` char(1) DEFAULT NULL,
+ `BTBRT<+>tf/J` char(1) DEFAULT NULL,
+ `O20` char(1) DEFAULT NULL,
+ `C58/J` char(1) DEFAULT NULL,
+ `BPH/2J` char(1) DEFAULT NULL,
+ `DDK/Pas` char(1) DEFAULT NULL,
+ `C57BL/6NHsd` char(1) DEFAULT NULL,
+ `C57BL/6NTac` char(1) DEFAULT NULL,
+ `129S4/SvJae` char(1) DEFAULT NULL,
+ `BPL/1J` char(1) DEFAULT NULL,
+ `BPN/3J` char(1) DEFAULT NULL,
+ `PL/J` char(1) DEFAULT NULL,
+ `DBA/1J` char(1) DEFAULT NULL,
+ `MSM/Ms` char(1) DEFAULT NULL,
+ `MA/MyJ` char(1) DEFAULT NULL,
+ `NZW/LacJ` char(1) DEFAULT NULL,
+ `C57BL/10J` char(1) DEFAULT NULL,
+ `C57BL/6ByJ` char(1) DEFAULT NULL,
+ `RF/J` char(1) DEFAULT NULL,
+ `C57BR/cdJ` char(1) DEFAULT NULL,
+ `129S6/SvEv` char(1) DEFAULT NULL,
+ `MAI/Pas` char(1) DEFAULT NULL,
+ `RIIIS/J` char(1) DEFAULT NULL,
+ `C57BL/6NNIH` char(1) DEFAULT NULL,
+ `FVB/NJ` char(1) DEFAULT NULL,
+ `SEG/Pas` char(1) DEFAULT NULL,
+ `MOLF/EiJ` char(1) DEFAULT NULL,
+ `C3HeB/FeJ` char(1) DEFAULT NULL,
+ `Lline` char(1) DEFAULT NULL,
+ `SKIVE/EiJ` char(1) DEFAULT NULL,
+ `C57BL/6NCrl` char(1) DEFAULT NULL,
+ `KK/HlJ` char(1) DEFAULT NULL,
+ `LG/J` char(1) DEFAULT NULL,
+ `C57BLKS/J` char(1) DEFAULT NULL,
+ `SM/J` char(1) DEFAULT NULL,
+ `NOR/LtJ` char(1) DEFAULT NULL,
+ `ILS/IbgTejJ` char(1) DEFAULT NULL,
+ `C57BL/6JOlaHsd` char(1) DEFAULT NULL,
+ `SWR/J` char(1) DEFAULT NULL,
+ `C57BL/6JBomTac` char(1) DEFAULT NULL,
+ `SOD1/EiJ` char(1) DEFAULT NULL,
+ `NON/LtJ` char(1) DEFAULT NULL,
+ `JF1/Ms` char(1) DEFAULT NULL,
+ `129X1/SvJ` char(1) DEFAULT NULL,
+ `C2T1_Esline_Nagy` char(1) DEFAULT NULL,
+ `C57BL/6NJ` char(1) DEFAULT NULL,
+ `LEWES/EiJ` char(1) DEFAULT NULL,
+ `RBA/DnJ` char(1) DEFAULT NULL,
+ `DDY/JclSidSeyFrkJ` char(1) DEFAULT NULL,
+ `SEA/GnJ` char(1) DEFAULT NULL,
+ `C57BL/6JCrl` char(1) DEFAULT NULL,
+ `EL/SuzSeyFrkJ` char(1) DEFAULT NULL,
+ `HTG/GoSfSnJ` char(1) DEFAULT NULL,
+ `129S2/SvHsd` char(1) DEFAULT NULL,
+ `MOLG/DnJ` char(1) DEFAULT NULL,
+ `BUB/BnJ` char(1) DEFAULT NULL,
+ PRIMARY KEY (`SnpId`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `SnpSource`
+--
+
+DROP TABLE IF EXISTS `SnpSource`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SnpSource` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` char(35) DEFAULT NULL,
+ `DateCreated` date DEFAULT NULL,
+ `DateAdded` date DEFAULT NULL,
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=29 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Species`
+--
+
+DROP TABLE IF EXISTS `Species`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Species` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `SpeciesId` int(5) DEFAULT NULL,
+ `SpeciesName` varchar(50) DEFAULT NULL,
+ `Name` char(30) NOT NULL DEFAULT '',
+ `MenuName` char(50) DEFAULT NULL,
+ `FullName` char(100) NOT NULL DEFAULT '',
+ `TaxonomyId` int(11) DEFAULT NULL,
+ `OrderId` smallint(6) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ KEY `Name` (`Name`)
+) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Strain`
+--
+
+DROP TABLE IF EXISTS `Strain`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Strain` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `Name` varchar(100) DEFAULT NULL,
+ `Name2` varchar(100) DEFAULT NULL,
+ `SpeciesId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Symbol` char(5) DEFAULT NULL,
+ `Alias` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`Name`,`SpeciesId`),
+ FOREIGN KEY (SpeciesId) REFERENCES Species(SpeciesId),
+ KEY `Symbol` (`Symbol`)
+) ENGINE=MyISAM AUTO_INCREMENT=63438 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `StrainXRef`
+--
+
+DROP TABLE IF EXISTS `StrainXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `StrainXRef` (
+ `InbredSetId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `OrderId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Used_for_mapping` char(1) DEFAULT 'N',
+ `PedigreeStatus` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`InbredSetId`,`StrainId`),
+ UNIQUE KEY `Orders` (`InbredSetId`,`OrderId`),
+ FOREIGN KEY (InbredSetId) REFERENCES InbredSet(InbredSetId),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TableComments`
+--
+
+DROP TABLE IF EXISTS `TableComments`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TableComments` (
+ `TableName` varchar(100) NOT NULL DEFAULT '',
+ `Comment` text DEFAULT NULL,
+ PRIMARY KEY (`TableName`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TableFieldAnnotation`
+--
+
+DROP TABLE IF EXISTS `TableFieldAnnotation`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TableFieldAnnotation` (
+ `TableField` varchar(100) NOT NULL DEFAULT '',
+ `Foreign_Key` varchar(100) DEFAULT NULL,
+ `Annotation` text DEFAULT NULL,
+ PRIMARY KEY (`TableField`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Temp`
+--
+
+DROP TABLE IF EXISTS `Temp`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Temp` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `dbdisplayname` varchar(255) DEFAULT NULL,
+ `Name` varchar(30) DEFAULT NULL,
+ `description` text DEFAULT NULL,
+ `createtime` datetime NOT NULL DEFAULT '2004-01-01 12:00:00',
+ `DataId` int(11) NOT NULL DEFAULT 0,
+ `InbredSetId` smallint(5) unsigned NOT NULL DEFAULT 1,
+ `IP` varchar(20) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`Name`),
+ FOREIGN KEY (InbredSetId) REFERENCES InbredSet(InbredSetId)
+) ENGINE=MyISAM AUTO_INCREMENT=98608 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TempData`
+--
+
+DROP TABLE IF EXISTS `TempData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TempData` (
+ `Id` int(10) unsigned NOT NULL DEFAULT 0,
+ `StrainId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `value` double NOT NULL DEFAULT 0,
+ `SE` double DEFAULT NULL,
+ `NStrain` smallint(6) DEFAULT NULL,
+ UNIQUE KEY `DataId` (`Id`,`StrainId`),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Tissue`
+--
+
+DROP TABLE IF EXISTS `Tissue`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Tissue` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `TissueId` int(5) DEFAULT NULL,
+ `TissueName` varchar(50) DEFAULT NULL,
+ `Name` char(50) DEFAULT NULL,
+ `Short_Name` char(30) NOT NULL DEFAULT '',
+ `BIRN_lex_ID` char(30) DEFAULT NULL,
+ `BIRN_lex_Name` char(30) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Short_Name` (`Short_Name`),
+ UNIQUE KEY `Name` (`Name`)
+) ENGINE=MyISAM AUTO_INCREMENT=180 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TissueProbeFreeze`
+--
+
+DROP TABLE IF EXISTS `TissueProbeFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TissueProbeFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `ChipId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `StrainId` varchar(100) NOT NULL DEFAULT '0',
+ `Name` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '0000-00-00',
+ `InbredSetId` smallint(5) unsigned DEFAULT 1,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `Name` (`Name`),
+ UNIQUE KEY `FullName` (`FullName`),
+ FOREIGN KEY (StrainId) REFERENCES Strain(Id)
+) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TissueProbeSetData`
+--
+
+DROP TABLE IF EXISTS `TissueProbeSetData`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TissueProbeSetData` (
+ `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `TissueID` int(10) unsigned NOT NULL DEFAULT 0,
+ `value` float NOT NULL DEFAULT 0,
+ PRIMARY KEY (`Id`,`TissueID`),
+ FOREIGN KEY (TissueID) REFERENCES Tissue(TissueId)
+) ENGINE=MyISAM AUTO_INCREMENT=90563 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TissueProbeSetFreeze`
+--
+
+DROP TABLE IF EXISTS `TissueProbeSetFreeze`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TissueProbeSetFreeze` (
+ `Id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `TissueProbeFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `AvgID` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `Name` varchar(40) DEFAULT NULL,
+ `Name2` varchar(100) NOT NULL DEFAULT '',
+ `FullName` varchar(100) NOT NULL DEFAULT '',
+ `ShortName` varchar(100) NOT NULL DEFAULT '',
+ `CreateTime` date NOT NULL DEFAULT '0000-00-00',
+ `public` tinyint(4) NOT NULL DEFAULT 0,
+ `confidentiality` tinyint(4) NOT NULL DEFAULT 0,
+ `AuthorisedUsers` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`Id`),
+ UNIQUE KEY `FullName` (`FullName`),
+ UNIQUE KEY `Name` (`Name`),
+ FOREIGN KEY (TissueProbeFreezeId) REFERENCES TissueProbeFreeze(Id),
+ KEY `NameIndex` (`Name2`)
+) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TissueProbeSetXRef`
+--
+
+DROP TABLE IF EXISTS `TissueProbeSetXRef`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TissueProbeSetXRef` (
+ `TissueProbeSetFreezeId` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `ProbesetId` int(10) unsigned NOT NULL DEFAULT 0,
+ `DataId` int(10) unsigned NOT NULL DEFAULT 0,
+ `Mean` float DEFAULT 0,
+ `useStatus` char(1) DEFAULT NULL,
+ `Symbol` varchar(100) DEFAULT NULL,
+ `GeneId` varchar(20) DEFAULT NULL,
+ `Chr` char(3) DEFAULT NULL,
+ `Mb` double DEFAULT NULL,
+ `Mb_2016` double DEFAULT NULL,
+ `description` varchar(255) DEFAULT NULL,
+ `Probe_Target_Description` varchar(225) DEFAULT NULL,
+ PRIMARY KEY (`TissueProbeSetFreezeId`,`ProbesetId`),
+ UNIQUE KEY `DataId_IDX` (`DataId`),
+ FOREIGN KEY (TissueProbeSetFreezeId) REFERENCES TissueProbeSetFreeze(Id),
+ FOREIGN KEY (ProbesetId) REFERENCES ProbeSet(Id),
+ KEY `symbol_IDX` (`Symbol`),
+ KEY `GeneId_IDX` (`GeneId`),
+ KEY `Position` (`Chr`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `TraitMetadata`
+--
+
+DROP TABLE IF EXISTS `TraitMetadata`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `TraitMetadata` (
+ `type` varchar(255) DEFAULT NULL,
+ `value` longtext DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `User`
+--
+
+DROP TABLE IF EXISTS `User`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `User` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(100) NOT NULL DEFAULT '',
+ `password` varchar(100) NOT NULL DEFAULT '',
+ `email` varchar(100) DEFAULT NULL,
+ `createtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `user_ip` varchar(20) DEFAULT NULL,
+ `lastlogin` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `disable` enum('Y','N') DEFAULT 'N',
+ `privilege` enum('guest','user','admin','root') DEFAULT NULL,
+ `grpName` varchar(40) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `name_index` (`name`)
+) ENGINE=MyISAM AUTO_INCREMENT=353 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `UserPrivilege`
+--
+
+DROP TABLE IF EXISTS `UserPrivilege`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `UserPrivilege` (
+ `UserId` int(10) unsigned NOT NULL,
+ `ProbeSetFreezeId` smallint(5) unsigned NOT NULL,
+ `download_result_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ KEY `userId` (`UserId`,`ProbeSetFreezeId`),
+ FOREIGN KEY (UserId) REFERENCES User(id),
+ FOREIGN KEY (ProbeSetFreezeId) REFERENCES ProbeSetFreeze(Id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `Vlookup`
+--
+
+DROP TABLE IF EXISTS `Vlookup`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `Vlookup` (
+ `Id` int(11) NOT NULL AUTO_INCREMENT,
+ `VLProbeSetId` text DEFAULT NULL,
+ `VLBlatSeq` longtext DEFAULT NULL,
+ `InfoFileId` int(5) DEFAULT NULL,
+ `DatasetId` int(5) DEFAULT NULL,
+ `SpeciesId` int(5) DEFAULT NULL,
+ `TissueId` int(5) DEFAULT NULL,
+ `InbredSetId` int(5) DEFAULT NULL,
+ `GeneChipId` int(5) DEFAULT NULL,
+ `AvgMethodId` int(5) DEFAULT NULL,
+ `InfoPageName` varchar(255) DEFAULT NULL,
+ `GN_AccesionId` int(5) DEFAULT NULL,
+ `Name` varchar(100) DEFAULT NULL,
+ `GeneId` varchar(10) DEFAULT NULL,
+ `Mb` double DEFAULT NULL,
+ `Chr` varchar(10) DEFAULT NULL,
+ `Probe_set_Blat_Mb_start` double DEFAULT NULL,
+ `Probe_set_Blat_Mb_end` double DEFAULT NULL,
+ `Strand` char(1) DEFAULT NULL,
+ `TxStart` double DEFAULT NULL,
+ `TxEnd` double DEFAULT NULL,
+ `cdsStart` double DEFAULT NULL,
+ `cdsEnd` double DEFAULT NULL,
+ `exonCount` int(7) DEFAULT NULL,
+ `exonStarts` text DEFAULT NULL,
+ `exonEnds` text DEFAULT NULL,
+ `ProteinID` varchar(15) DEFAULT NULL,
+ `AlignID` varchar(10) DEFAULT NULL,
+ `kgID` varchar(10) DEFAULT NULL,
+ `NM_ID` varchar(15) DEFAULT NULL,
+ `SnpName` char(30) DEFAULT NULL,
+ `Position` double DEFAULT NULL,
+ `HMDB_ID` varchar(255) DEFAULT NULL,
+ `Symbol` varchar(100) DEFAULT NULL,
+ `description` longtext DEFAULT NULL,
+ `alias` longtext DEFAULT NULL,
+ `Full_Description` longtext DEFAULT NULL,
+ `BlatSeq` text DEFAULT NULL,
+ `ChEBI_ID` int(10) DEFAULT NULL,
+ `ChEMBL_ID` varchar(100) DEFAULT NULL,
+ `CAS_number` varchar(100) DEFAULT NULL,
+ `PubChem_ID` int(10) DEFAULT NULL,
+ `ChemSpider_ID` varchar(10) DEFAULT NULL,
+ `UNII_ID` varchar(100) DEFAULT NULL,
+ `EC_number` varchar(100) DEFAULT NULL,
+ `KEGG_ID` varchar(100) DEFAULT NULL,
+ `Molecular_Weight` varchar(100) DEFAULT NULL,
+ `Nugowiki_ID` varchar(100) DEFAULT NULL,
+ `assembly` varchar(10) DEFAULT NULL,
+ KEY `Id` (`Id`)
+) ENGINE=MyISAM AUTO_INCREMENT=753474564 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `login`
+--
+
+DROP TABLE IF EXISTS `login`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `login` (
+ `id` varchar(36) NOT NULL,
+ `user` varchar(36) DEFAULT NULL,
+ `timestamp` datetime DEFAULT NULL,
+ `ip_address` varchar(39) DEFAULT NULL,
+ `successful` tinyint(1) NOT NULL,
+ `session_id` text DEFAULT NULL,
+ `assumed_by` varchar(36) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (user) REFERENCES user(id),
+ KEY `user` (`user`),
+ KEY `assumed_by` (`assumed_by`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `metadata_audit`
+--
+
+DROP TABLE IF EXISTS `metadata_audit`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `metadata_audit` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `dataset_id` int(11) NOT NULL,
+ `editor` varchar(255) NOT NULL,
+ `json_diff_data` varchar(2048) NOT NULL,
+ `time_stamp` timestamp NOT NULL DEFAULT current_timestamp(),
+ PRIMARY KEY (`id`),
+ CONSTRAINT `CONSTRAINT_1` CHECK (json_valid(`json_diff_data`))
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `pubmedsearch`
+--
+
+DROP TABLE IF EXISTS `pubmedsearch`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `pubmedsearch` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `pubmedid` bigint(20) DEFAULT NULL,
+ `title` text DEFAULT NULL,
+ `authorfullname` text DEFAULT NULL,
+ `authorshortname` text DEFAULT NULL,
+ `institute` text DEFAULT NULL,
+ `geneid` varchar(20) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `NewIndex4` (`geneid`),
+ FULLTEXT KEY `NewIndex1` (`institute`),
+ FULLTEXT KEY `NewIndex3` (`authorfullname`,`authorshortname`)
+) ENGINE=MyISAM AUTO_INCREMENT=1401371 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `role`
+--
+
+DROP TABLE IF EXISTS `role`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `role` (
+ `the_id` varchar(36) NOT NULL,
+ `name` varchar(80) NOT NULL,
+ `description` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`the_id`),
+ UNIQUE KEY `name` (`name`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `roles_users`
+--
+
+DROP TABLE IF EXISTS `roles_users`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `roles_users` (
+ `user_id` int(11) DEFAULT NULL,
+ `role_id` int(11) DEFAULT NULL,
+ KEY `user_id` (`user_id`),
+ KEY `role_id` (`role_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `temporary`
+--
+
+DROP TABLE IF EXISTS `temporary`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `temporary` (
+ `tax_id` varchar(20) DEFAULT NULL,
+ `GeneID` varchar(20) DEFAULT NULL,
+ `Symbol` varchar(100) DEFAULT NULL,
+ `OMIM` varchar(100) DEFAULT NULL,
+ `HomoloGene` varchar(100) DEFAULT NULL,
+ `Other_GeneID` varchar(20) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `user`
+--
+
+DROP TABLE IF EXISTS `user`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `user` (
+ `id` varchar(36) NOT NULL,
+ `email_address` varchar(50) NOT NULL,
+ `password` text NOT NULL,
+ `full_name` varchar(50) DEFAULT NULL,
+ `organization` varchar(50) DEFAULT NULL,
+ `active` tinyint(1) NOT NULL,
+ `registration_info` text DEFAULT NULL,
+ `confirmed` text DEFAULT NULL,
+ `superuser` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `email_address` (`email_address`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `user_collection`
+--
+
+DROP TABLE IF EXISTS `user_collection`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `user_collection` (
+ `id` varchar(36) NOT NULL,
+ `user` varchar(36) DEFAULT NULL,
+ `name` text DEFAULT NULL,
+ `created_timestamp` datetime DEFAULT NULL,
+ `changed_timestamp` datetime DEFAULT NULL,
+ `members` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (user) REFERENCES user(id),
+ KEY `user` (`user`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `user_openids`
+--
+
+DROP TABLE IF EXISTS `user_openids`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `user_openids` (
+ `openid_url` varchar(255) NOT NULL,
+ `user_id` varchar(36) NOT NULL,
+ PRIMARY KEY (`openid_url`),
+ FOREIGN KEY (user_id) REFERENCES user(id),
+ KEY `user_id` (`user_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2021-07-14 5:26:53
diff --git a/sql/schema.svg b/sql/schema.svg
new file mode 100644
index 0000000..2451899
--- /dev/null
+++ b/sql/schema.svg
@@ -0,0 +1,1430 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.42.3 (20191010.1750)
+ -->
+<!-- Title: test Pages: 1 -->
+<svg width="5065pt" height="3178pt"
+ viewBox="0.00 0.00 5065.18 3178.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 3174)">
+<title>test</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-3174 5061.18,-3174 5061.18,4 -4,4"/>
+<g id="clust1" class="cluster">
+<title>cluster_Others</title>
+<polygon fill="none" stroke="black" points="3495,-615.5 3495,-1429.5 5014,-1429.5 5014,-615.5 3495,-615.5"/>
+<text text-anchor="middle" x="4254.5" y="-1414.3" font-family="Times,serif" font-size="14.00">Others</text>
+</g>
+<!-- node2 -->
+<g id="node1" class="node">
+<title>node2</title>
+<polygon fill="white" stroke="black" points="933.5,-699 933.5,-820 1066.5,-820 1066.5,-699 933.5,-699"/>
+<text text-anchor="middle" x="1000" y="-804.8" font-family="Times,serif" font-size="14.00">BXDSnpPosition</text>
+<polyline fill="none" stroke="black" points="933.5,-797 1066.5,-797 "/>
+<text text-anchor="start" x="941.5" y="-781.8" font-family="Times,serif" font-size="14.00">&#45; id</text>
+<text text-anchor="start" x="941.5" y="-766.8" font-family="Times,serif" font-size="14.00">&#45; Chr</text>
+<text text-anchor="start" x="941.5" y="-751.8" font-family="Times,serif" font-size="14.00">&#45; StrainId1</text>
+<text text-anchor="start" x="941.5" y="-736.8" font-family="Times,serif" font-size="14.00">&#45; StrainId2</text>
+<text text-anchor="start" x="941.5" y="-721.8" font-family="Times,serif" font-size="14.00">&#45; Mb</text>
+<text text-anchor="start" x="941.5" y="-706.8" font-family="Times,serif" font-size="14.00">&#45; Mb_2016</text>
+</g>
+<!-- node3 -->
+<g id="node2" class="node">
+<title>node3</title>
+<polygon fill="white" stroke="black" points="2127,-1277 2127,-1338 2243,-1338 2243,-1277 2127,-1277"/>
+<text text-anchor="middle" x="2185" y="-1322.8" font-family="Times,serif" font-size="14.00">CaseAttribute</text>
+<polyline fill="none" stroke="black" points="2127,-1315 2243,-1315 "/>
+<text text-anchor="start" x="2135" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="2135" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+</g>
+<!-- node4 -->
+<g id="node3" class="node">
+<title>node4</title>
+<polygon fill="white" stroke="black" points="2346.5,-714 2346.5,-805 2501.5,-805 2501.5,-714 2346.5,-714"/>
+<text text-anchor="middle" x="2424" y="-789.8" font-family="Times,serif" font-size="14.00">CaseAttributeXRef</text>
+<polyline fill="none" stroke="black" points="2346.5,-782 2501.5,-782 "/>
+<text text-anchor="start" x="2354.5" y="-766.8" font-family="Times,serif" font-size="14.00">&#45; ProbeSetFreezeId</text>
+<text text-anchor="start" x="2354.5" y="-751.8" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="2354.5" y="-736.8" font-family="Times,serif" font-size="14.00">&#45; CaseAttributeId</text>
+<text text-anchor="start" x="2354.5" y="-721.8" font-family="Times,serif" font-size="14.00">&#45; Value</text>
+</g>
+<!-- node3&#45;&gt;node4 -->
+<g id="edge1" class="edge">
+<title>node3&#45;&gt;node4</title>
+<path fill="none" stroke="black" d="M2204.49,-1276.97C2235.74,-1228.64 2297.55,-1128.9 2337,-1038 2369.52,-963.07 2395.68,-872.01 2410.54,-815.14"/>
+<polygon fill="black" stroke="black" points="2413.97,-815.84 2413.09,-805.28 2407.2,-814.09 2413.97,-815.84"/>
+</g>
+<!-- node5 -->
+<g id="node4" class="node">
+<title>node5</title>
+<polygon fill="white" stroke="black" points="1970,-714 1970,-805 2152,-805 2152,-714 1970,-714"/>
+<text text-anchor="middle" x="2061" y="-789.8" font-family="Times,serif" font-size="14.00">CaseAttributeXRefNew</text>
+<polyline fill="none" stroke="black" points="1970,-782 2152,-782 "/>
+<text text-anchor="start" x="1978" y="-766.8" font-family="Times,serif" font-size="14.00">&#45; InbredSetId</text>
+<text text-anchor="start" x="1978" y="-751.8" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="1978" y="-736.8" font-family="Times,serif" font-size="14.00">&#45; CaseAttributeId</text>
+<text text-anchor="start" x="1978" y="-721.8" font-family="Times,serif" font-size="14.00">&#45; Value</text>
+</g>
+<!-- node3&#45;&gt;node5 -->
+<g id="edge2" class="edge">
+<title>node3&#45;&gt;node5</title>
+<path fill="none" stroke="black" d="M2178.25,-1276.76C2158.28,-1188.84 2099.32,-929.21 2073.43,-815.22"/>
+<polygon fill="black" stroke="black" points="2076.8,-814.28 2071.18,-805.3 2069.98,-815.83 2076.8,-814.28"/>
+</g>
+<!-- node6 -->
+<g id="node5" class="node">
+<title>node6</title>
+<polygon fill="white" stroke="black" points="3616,-2268 3616,-2374 3712,-2374 3712,-2268 3616,-2268"/>
+<text text-anchor="middle" x="3664" y="-2358.8" font-family="Times,serif" font-size="14.00">DBList</text>
+<polyline fill="none" stroke="black" points="3616,-2351 3712,-2351 "/>
+<text text-anchor="start" x="3624" y="-2335.8" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="3624" y="-2320.8" font-family="Times,serif" font-size="14.00">&#45; DBTypeId</text>
+<text text-anchor="start" x="3624" y="-2305.8" font-family="Times,serif" font-size="14.00">&#45; FreezeId</text>
+<text text-anchor="start" x="3624" y="-2290.8" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="3624" y="-2275.8" font-family="Times,serif" font-size="14.00">&#45; Code</text>
+</g>
+<!-- node7 -->
+<g id="node6" class="node">
+<title>node7</title>
+<polygon fill="white" stroke="black" points="3627.5,-3003.5 3627.5,-3064.5 3700.5,-3064.5 3700.5,-3003.5 3627.5,-3003.5"/>
+<text text-anchor="middle" x="3664" y="-3049.3" font-family="Times,serif" font-size="14.00">DBType</text>
+<polyline fill="none" stroke="black" points="3627.5,-3041.5 3700.5,-3041.5 "/>
+<text text-anchor="start" x="3635.5" y="-3026.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="3635.5" y="-3011.3" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+</g>
+<!-- node7&#45;&gt;node6 -->
+<g id="edge3" class="edge">
+<title>node7&#45;&gt;node6</title>
+<path fill="none" stroke="black" d="M3664,-3003.35C3664,-2896.78 3664,-2531.61 3664,-2384.32"/>
+<polygon fill="black" stroke="black" points="3667.5,-2384.1 3664,-2374.1 3660.5,-2384.1 3667.5,-2384.1"/>
+</g>
+<!-- node8 -->
+<g id="node7" class="node">
+<title>node8</title>
+<polygon fill="white" stroke="black" points="3718.5,-2898.5 3718.5,-3169.5 3897.5,-3169.5 3897.5,-2898.5 3718.5,-2898.5"/>
+<text text-anchor="middle" x="3808" y="-3154.3" font-family="Times,serif" font-size="14.00">Datasets</text>
+<polyline fill="none" stroke="black" points="3718.5,-3146.5 3897.5,-3146.5 "/>
+<text text-anchor="start" x="3726.5" y="-3131.3" font-family="Times,serif" font-size="14.00">&#45; DatasetId</text>
+<text text-anchor="start" x="3726.5" y="-3116.3" font-family="Times,serif" font-size="14.00">&#45; DatasetName</text>
+<text text-anchor="start" x="3726.5" y="-3101.3" font-family="Times,serif" font-size="14.00">&#45; GeoSeries</text>
+<text text-anchor="start" x="3726.5" y="-3086.3" font-family="Times,serif" font-size="14.00">&#45; PublicationTitle</text>
+<text text-anchor="start" x="3726.5" y="-3071.3" font-family="Times,serif" font-size="14.00">&#45; Summary</text>
+<text text-anchor="start" x="3726.5" y="-3056.3" font-family="Times,serif" font-size="14.00">&#45; ExperimentDesign</text>
+<text text-anchor="start" x="3726.5" y="-3041.3" font-family="Times,serif" font-size="14.00">&#45; AboutCases</text>
+<text text-anchor="start" x="3726.5" y="-3026.3" font-family="Times,serif" font-size="14.00">&#45; AboutTissue</text>
+<text text-anchor="start" x="3726.5" y="-3011.3" font-family="Times,serif" font-size="14.00">&#45; AboutPlatform</text>
+<text text-anchor="start" x="3726.5" y="-2996.3" font-family="Times,serif" font-size="14.00">&#45; AboutDataProcessing</text>
+<text text-anchor="start" x="3726.5" y="-2981.3" font-family="Times,serif" font-size="14.00">&#45; Contributors</text>
+<text text-anchor="start" x="3726.5" y="-2966.3" font-family="Times,serif" font-size="14.00">&#45; Citation</text>
+<text text-anchor="start" x="3726.5" y="-2951.3" font-family="Times,serif" font-size="14.00">&#45; Acknowledgment</text>
+<text text-anchor="start" x="3726.5" y="-2936.3" font-family="Times,serif" font-size="14.00">&#45; Notes</text>
+<text text-anchor="start" x="3726.5" y="-2921.3" font-family="Times,serif" font-size="14.00">&#45; InvestigatorId</text>
+<text text-anchor="start" x="3726.5" y="-2906.3" font-family="Times,serif" font-size="14.00">&#45; DatasetStatusId</text>
+</g>
+<!-- node10 -->
+<g id="node8" class="node">
+<title>node10</title>
+<polygon fill="white" stroke="black" points="431,-1262 431,-1353 553,-1353 553,-1262 431,-1262"/>
+<text text-anchor="middle" x="492" y="-1337.8" font-family="Times,serif" font-size="14.00">EnsemblChip</text>
+<polyline fill="none" stroke="black" points="431,-1330 553,-1330 "/>
+<text text-anchor="start" x="439" y="-1314.8" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="439" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; ProbeSetSize</text>
+<text text-anchor="start" x="439" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="439" y="-1269.8" font-family="Times,serif" font-size="14.00">&#45; Type</text>
+</g>
+<!-- node13 -->
+<g id="node11" class="node">
+<title>node13</title>
+<polygon fill="white" stroke="black" points="104,-729 104,-790 286,-790 286,-729 104,-729"/>
+<text text-anchor="middle" x="195" y="-774.8" font-family="Times,serif" font-size="14.00">GeneChipEnsemblXRef</text>
+<polyline fill="none" stroke="black" points="104,-767 286,-767 "/>
+<text text-anchor="start" x="112" y="-751.8" font-family="Times,serif" font-size="14.00">&#45; GeneChipId</text>
+<text text-anchor="start" x="112" y="-736.8" font-family="Times,serif" font-size="14.00">&#45; EnsemblChipId</text>
+</g>
+<!-- node10&#45;&gt;node13 -->
+<g id="edge4" class="edge">
+<title>node10&#45;&gt;node13</title>
+<path fill="none" stroke="black" d="M490.64,-1261.97C486.62,-1209.8 472.04,-1124.12 421,-1074 379.45,-1033.19 337.55,-1077.77 295,-1038 226.88,-974.34 205.07,-860.87 198.16,-800.64"/>
+<polygon fill="black" stroke="black" points="201.61,-799.96 197.07,-790.38 194.65,-800.7 201.61,-799.96"/>
+</g>
+<!-- node11 -->
+<g id="node9" class="node">
+<title>node11</title>
+<polygon fill="white" stroke="black" points="571.5,-1269.5 571.5,-1345.5 666.5,-1345.5 666.5,-1269.5 571.5,-1269.5"/>
+<text text-anchor="middle" x="619" y="-1330.3" font-family="Times,serif" font-size="14.00">Genbank</text>
+<polyline fill="none" stroke="black" points="571.5,-1322.5 666.5,-1322.5 "/>
+<text text-anchor="start" x="579.5" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="579.5" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; Sequence</text>
+<text text-anchor="start" x="579.5" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; SpeciesId</text>
+</g>
+<!-- node14 -->
+<g id="node12" class="node">
+<title>node14</title>
+<polygon fill="white" stroke="black" points="304,-481.5 304,-1037.5 466,-1037.5 466,-481.5 304,-481.5"/>
+<text text-anchor="middle" x="385" y="-1022.3" font-family="Times,serif" font-size="14.00">GeneList</text>
+<polyline fill="none" stroke="black" points="304,-1014.5 466,-1014.5 "/>
+<text text-anchor="start" x="312" y="-999.3" font-family="Times,serif" font-size="14.00">&#45; SpeciesId</text>
+<text text-anchor="start" x="312" y="-984.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="312" y="-969.3" font-family="Times,serif" font-size="14.00">&#45; GeneSymbol</text>
+<text text-anchor="start" x="312" y="-954.3" font-family="Times,serif" font-size="14.00">&#45; GeneDescription</text>
+<text text-anchor="start" x="312" y="-939.3" font-family="Times,serif" font-size="14.00">&#45; Chromosome</text>
+<text text-anchor="start" x="312" y="-924.3" font-family="Times,serif" font-size="14.00">&#45; TxStart</text>
+<text text-anchor="start" x="312" y="-909.3" font-family="Times,serif" font-size="14.00">&#45; TxStart_2016</text>
+<text text-anchor="start" x="312" y="-894.3" font-family="Times,serif" font-size="14.00">&#45; TxEnd</text>
+<text text-anchor="start" x="312" y="-879.3" font-family="Times,serif" font-size="14.00">&#45; TxEnd_2016</text>
+<text text-anchor="start" x="312" y="-864.3" font-family="Times,serif" font-size="14.00">&#45; Strand</text>
+<text text-anchor="start" x="312" y="-849.3" font-family="Times,serif" font-size="14.00">&#45; GeneID</text>
+<text text-anchor="start" x="312" y="-834.3" font-family="Times,serif" font-size="14.00">&#45; NM_ID</text>
+<text text-anchor="start" x="312" y="-819.3" font-family="Times,serif" font-size="14.00">&#45; kgID</text>
+<text text-anchor="start" x="312" y="-804.3" font-family="Times,serif" font-size="14.00">&#45; GenBankID</text>
+<text text-anchor="start" x="312" y="-789.3" font-family="Times,serif" font-size="14.00">&#45; UnigenID</text>
+<text text-anchor="start" x="312" y="-774.3" font-family="Times,serif" font-size="14.00">&#45; ProteinID</text>
+<text text-anchor="start" x="312" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; AlignID</text>
+<text text-anchor="start" x="312" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; exonCount</text>
+<text text-anchor="start" x="312" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; exonStarts</text>
+<text text-anchor="start" x="312" y="-714.3" font-family="Times,serif" font-size="14.00">&#45; exonEnds</text>
+<text text-anchor="start" x="312" y="-699.3" font-family="Times,serif" font-size="14.00">&#45; cdsStart</text>
+<text text-anchor="start" x="312" y="-684.3" font-family="Times,serif" font-size="14.00">&#45; cdsStart_2016</text>
+<text text-anchor="start" x="312" y="-669.3" font-family="Times,serif" font-size="14.00">&#45; cdsEnd</text>
+<text text-anchor="start" x="312" y="-654.3" font-family="Times,serif" font-size="14.00">&#45; cdsEnd_2016</text>
+<text text-anchor="start" x="312" y="-639.3" font-family="Times,serif" font-size="14.00">&#45; TxStart_mm8</text>
+<text text-anchor="start" x="312" y="-624.3" font-family="Times,serif" font-size="14.00">&#45; TxEnd_mm8</text>
+<text text-anchor="start" x="312" y="-609.3" font-family="Times,serif" font-size="14.00">&#45; Strand_mm8</text>
+<text text-anchor="start" x="312" y="-594.3" font-family="Times,serif" font-size="14.00">&#45; exonCount_mm8</text>
+<text text-anchor="start" x="312" y="-579.3" font-family="Times,serif" font-size="14.00">&#45; exonStarts_mm8</text>
+<text text-anchor="start" x="312" y="-564.3" font-family="Times,serif" font-size="14.00">&#45; exonEnds_mm8</text>
+<text text-anchor="start" x="312" y="-549.3" font-family="Times,serif" font-size="14.00">&#45; cdsStart_mm8</text>
+<text text-anchor="start" x="312" y="-534.3" font-family="Times,serif" font-size="14.00">&#45; cdsEnd_mm8</text>
+<text text-anchor="start" x="312" y="-519.3" font-family="Times,serif" font-size="14.00">&#45; Chromosome_mm8</text>
+<text text-anchor="start" x="312" y="-504.3" font-family="Times,serif" font-size="14.00">&#45; Info_mm9</text>
+<text text-anchor="start" x="312" y="-489.3" font-family="Times,serif" font-size="14.00">&#45; RGD_ID</text>
+</g>
+<!-- node11&#45;&gt;node14 -->
+<g id="edge5" class="edge">
+<title>node11&#45;&gt;node14</title>
+<path fill="none" stroke="black" d="M619.75,-1269.26C618.77,-1219.08 609.78,-1129.66 562,-1074 534.74,-1042.25 503.4,-1068.73 475,-1038 474.23,-1037.16 473.46,-1036.32 472.7,-1035.47"/>
+<polygon fill="none" stroke="black" points="475.18,-1032.99 466.03,-1027.65 469.86,-1037.53 475.18,-1032.99"/>
+</g>
+<!-- node12 -->
+<g id="node10" class="node">
+<title>node12</title>
+<polygon fill="white" stroke="black" points="126.5,-1232 126.5,-1383 263.5,-1383 263.5,-1232 126.5,-1232"/>
+<text text-anchor="middle" x="195" y="-1367.8" font-family="Times,serif" font-size="14.00">GeneChip</text>
+<polyline fill="none" stroke="black" points="126.5,-1360 263.5,-1360 "/>
+<text text-anchor="start" x="134.5" y="-1344.8" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="134.5" y="-1329.8" font-family="Times,serif" font-size="14.00">&#45; GeneChipId</text>
+<text text-anchor="start" x="134.5" y="-1314.8" font-family="Times,serif" font-size="14.00">&#45; GeneChipName</text>
+<text text-anchor="start" x="134.5" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="134.5" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; GeoPlatform</text>
+<text text-anchor="start" x="134.5" y="-1269.8" font-family="Times,serif" font-size="14.00">&#45; Title</text>
+<text text-anchor="start" x="134.5" y="-1254.8" font-family="Times,serif" font-size="14.00">&#45; SpeciesId</text>
+<text text-anchor="start" x="134.5" y="-1239.8" font-family="Times,serif" font-size="14.00">&#45; GO_tree_value</text>
+</g>
+<!-- node12&#45;&gt;node13 -->
+<g id="edge6" class="edge">
+<title>node12&#45;&gt;node13</title>
+<path fill="none" stroke="black" d="M195,-1231.73C195,-1114.43 195,-891.23 195,-800.42"/>
+<polygon fill="black" stroke="black" points="198.5,-800.27 195,-790.27 191.5,-800.27 198.5,-800.27"/>
+</g>
+<!-- node15 -->
+<g id="node13" class="node">
+<title>node15</title>
+<polygon fill="white" stroke="black" points="0,-1194.5 0,-1420.5 108,-1420.5 108,-1194.5 0,-1194.5"/>
+<text text-anchor="middle" x="54" y="-1405.3" font-family="Times,serif" font-size="14.00">GeneRIF</text>
+<polyline fill="none" stroke="black" points="0,-1397.5 108,-1397.5 "/>
+<text text-anchor="start" x="8" y="-1382.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="8" y="-1367.3" font-family="Times,serif" font-size="14.00">&#45; versionId</text>
+<text text-anchor="start" x="8" y="-1352.3" font-family="Times,serif" font-size="14.00">&#45; symbol</text>
+<text text-anchor="start" x="8" y="-1337.3" font-family="Times,serif" font-size="14.00">&#45; PubMed_ID</text>
+<text text-anchor="start" x="8" y="-1322.3" font-family="Times,serif" font-size="14.00">&#45; SpeciesId</text>
+<text text-anchor="start" x="8" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; comment</text>
+<text text-anchor="start" x="8" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; email</text>
+<text text-anchor="start" x="8" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; createtime</text>
+<text text-anchor="start" x="8" y="-1262.3" font-family="Times,serif" font-size="14.00">&#45; user_ip</text>
+<text text-anchor="start" x="8" y="-1247.3" font-family="Times,serif" font-size="14.00">&#45; weburl</text>
+<text text-anchor="start" x="8" y="-1232.3" font-family="Times,serif" font-size="14.00">&#45; initial</text>
+<text text-anchor="start" x="8" y="-1217.3" font-family="Times,serif" font-size="14.00">&#45; display</text>
+<text text-anchor="start" x="8" y="-1202.3" font-family="Times,serif" font-size="14.00">&#45; reason</text>
+</g>
+<!-- node16 -->
+<g id="node14" class="node">
+<title>node16</title>
+<polygon fill="white" stroke="black" points="281.5,-1239.5 281.5,-1375.5 412.5,-1375.5 412.5,-1239.5 281.5,-1239.5"/>
+<text text-anchor="middle" x="347" y="-1360.3" font-family="Times,serif" font-size="14.00">GeneRIF_BASIC</text>
+<polyline fill="none" stroke="black" points="281.5,-1352.5 412.5,-1352.5 "/>
+<text text-anchor="start" x="289.5" y="-1337.3" font-family="Times,serif" font-size="14.00">&#45; SpeciesId</text>
+<text text-anchor="start" x="289.5" y="-1322.3" font-family="Times,serif" font-size="14.00">&#45; GeneId</text>
+<text text-anchor="start" x="289.5" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; symbol</text>
+<text text-anchor="start" x="289.5" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; PubMed_ID</text>
+<text text-anchor="start" x="289.5" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; createtime</text>
+<text text-anchor="start" x="289.5" y="-1262.3" font-family="Times,serif" font-size="14.00">&#45; comment</text>
+<text text-anchor="start" x="289.5" y="-1247.3" font-family="Times,serif" font-size="14.00">&#45; VersionId</text>
+</g>
+<!-- node17 -->
+<g id="node15" class="node">
+<title>node17</title>
+<polygon fill="white" stroke="black" points="1741.5,-1179.5 1741.5,-1435.5 1894.5,-1435.5 1894.5,-1179.5 1741.5,-1179.5"/>
+<text text-anchor="middle" x="1818" y="-1420.3" font-family="Times,serif" font-size="14.00">Geno</text>
+<polyline fill="none" stroke="black" points="1741.5,-1412.5 1894.5,-1412.5 "/>
+<text text-anchor="start" x="1749.5" y="-1397.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="1749.5" y="-1382.3" font-family="Times,serif" font-size="14.00">&#45; SpeciesId</text>
+<text text-anchor="start" x="1749.5" y="-1367.3" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="1749.5" y="-1352.3" font-family="Times,serif" font-size="14.00">&#45; Marker_Name</text>
+<text text-anchor="start" x="1749.5" y="-1337.3" font-family="Times,serif" font-size="14.00">&#45; Chr</text>
+<text text-anchor="start" x="1749.5" y="-1322.3" font-family="Times,serif" font-size="14.00">&#45; Mb</text>
+<text text-anchor="start" x="1749.5" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; Mb_2016</text>
+<text text-anchor="start" x="1749.5" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; Sequence</text>
+<text text-anchor="start" x="1749.5" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; Source</text>
+<text text-anchor="start" x="1749.5" y="-1262.3" font-family="Times,serif" font-size="14.00">&#45; chr_num</text>
+<text text-anchor="start" x="1749.5" y="-1247.3" font-family="Times,serif" font-size="14.00">&#45; Source2</text>
+<text text-anchor="start" x="1749.5" y="-1232.3" font-family="Times,serif" font-size="14.00">&#45; Comments</text>
+<text text-anchor="start" x="1749.5" y="-1217.3" font-family="Times,serif" font-size="14.00">&#45; used_by_geno_file</text>
+<text text-anchor="start" x="1749.5" y="-1202.3" font-family="Times,serif" font-size="14.00">&#45; Mb_mm8</text>
+<text text-anchor="start" x="1749.5" y="-1187.3" font-family="Times,serif" font-size="14.00">&#45; Chr_mm8</text>
+</g>
+<!-- node20 -->
+<g id="node18" class="node">
+<title>node20</title>
+<polygon fill="white" stroke="black" points="2264,-293.5 2264,-399.5 2422,-399.5 2422,-293.5 2264,-293.5"/>
+<text text-anchor="middle" x="2343" y="-384.3" font-family="Times,serif" font-size="14.00">GenoXRef</text>
+<polyline fill="none" stroke="black" points="2264,-376.5 2422,-376.5 "/>
+<text text-anchor="start" x="2272" y="-361.3" font-family="Times,serif" font-size="14.00">&#45; GenoFreezeId</text>
+<text text-anchor="start" x="2272" y="-346.3" font-family="Times,serif" font-size="14.00">&#45; GenoId</text>
+<text text-anchor="start" x="2272" y="-331.3" font-family="Times,serif" font-size="14.00">&#45; DataId</text>
+<text text-anchor="start" x="2272" y="-316.3" font-family="Times,serif" font-size="14.00">&#45; cM</text>
+<text text-anchor="start" x="2272" y="-301.3" font-family="Times,serif" font-size="14.00">&#45; Used_for_mapping</text>
+</g>
+<!-- node17&#45;&gt;node20 -->
+<g id="edge7" class="edge">
+<title>node17&#45;&gt;node20</title>
+<path fill="none" stroke="black" d="M1876.29,-1179.2C1893.94,-1135.33 1911.43,-1085.32 1922,-1038 1935.52,-977.45 1919.45,-527.07 1961,-481 2023.25,-411.98 2079.36,-475.95 2167,-445 2196.87,-434.45 2227.66,-419.14 2254.98,-403.77"/>
+<polygon fill="black" stroke="black" points="2256.77,-406.78 2263.72,-398.78 2253.3,-400.7 2256.77,-406.78"/>
+</g>
+<!-- node18 -->
+<g id="node16" class="node">
+<title>node18</title>
+<polygon fill="white" stroke="black" points="1084.5,-721.5 1084.5,-797.5 1171.5,-797.5 1171.5,-721.5 1084.5,-721.5"/>
+<text text-anchor="middle" x="1128" y="-782.3" font-family="Times,serif" font-size="14.00">GenoData</text>
+<polyline fill="none" stroke="black" points="1084.5,-774.5 1171.5,-774.5 "/>
+<text text-anchor="start" x="1092.5" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="1092.5" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="1092.5" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; value</text>
+</g>
+<!-- node19 -->
+<g id="node17" class="node">
+<title>node19</title>
+<polygon fill="white" stroke="black" points="2672,-676.5 2672,-842.5 2818,-842.5 2818,-676.5 2672,-676.5"/>
+<text text-anchor="middle" x="2745" y="-827.3" font-family="Times,serif" font-size="14.00">GenoFreeze</text>
+<polyline fill="none" stroke="black" points="2672,-819.5 2818,-819.5 "/>
+<text text-anchor="start" x="2680" y="-804.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="2680" y="-789.3" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="2680" y="-774.3" font-family="Times,serif" font-size="14.00">&#45; FullName</text>
+<text text-anchor="start" x="2680" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; ShortName</text>
+<text text-anchor="start" x="2680" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; CreateTime</text>
+<text text-anchor="start" x="2680" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; public</text>
+<text text-anchor="start" x="2680" y="-714.3" font-family="Times,serif" font-size="14.00">&#45; InbredSetId</text>
+<text text-anchor="start" x="2680" y="-699.3" font-family="Times,serif" font-size="14.00">&#45; confidentiality</text>
+<text text-anchor="start" x="2680" y="-684.3" font-family="Times,serif" font-size="14.00">&#45; AuthorisedUsers</text>
+</g>
+<!-- node19&#45;&gt;node20 -->
+<g id="edge8" class="edge">
+<title>node19&#45;&gt;node20</title>
+<path fill="none" stroke="black" d="M2739.35,-676.23C2731.16,-615.63 2711.24,-534.74 2663,-481 2603,-414.15 2504.21,-379.87 2432.25,-362.91"/>
+<polygon fill="black" stroke="black" points="2432.8,-359.45 2422.28,-360.63 2431.24,-366.27 2432.8,-359.45"/>
+</g>
+<!-- node21 -->
+<g id="node19" class="node">
+<title>node21</title>
+<polygon fill="white" stroke="black" points="3410.5,-2996 3410.5,-3072 3539.5,-3072 3539.5,-2996 3410.5,-2996"/>
+<text text-anchor="middle" x="3475" y="-3056.8" font-family="Times,serif" font-size="14.00">Homologene</text>
+<polyline fill="none" stroke="black" points="3410.5,-3049 3539.5,-3049 "/>
+<text text-anchor="start" x="3418.5" y="-3033.8" font-family="Times,serif" font-size="14.00">&#45; HomologeneId</text>
+<text text-anchor="start" x="3418.5" y="-3018.8" font-family="Times,serif" font-size="14.00">&#45; GeneId</text>
+<text text-anchor="start" x="3418.5" y="-3003.8" font-family="Times,serif" font-size="14.00">&#45; TaxonomyId</text>
+</g>
+<!-- node37 -->
+<g id="node31" class="node">
+<title>node37</title>
+<polygon fill="white" stroke="black" points="3352,-1780.5 3352,-2861.5 3598,-2861.5 3598,-1780.5 3352,-1780.5"/>
+<text text-anchor="middle" x="3475" y="-2846.3" font-family="Times,serif" font-size="14.00">ProbeSet</text>
+<polyline fill="none" stroke="black" points="3352,-2838.5 3598,-2838.5 "/>
+<text text-anchor="start" x="3360" y="-2823.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="3360" y="-2808.3" font-family="Times,serif" font-size="14.00">&#45; ChipId</text>
+<text text-anchor="start" x="3360" y="-2793.3" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="3360" y="-2778.3" font-family="Times,serif" font-size="14.00">&#45; TargetId</text>
+<text text-anchor="start" x="3360" y="-2763.3" font-family="Times,serif" font-size="14.00">&#45; Symbol</text>
+<text text-anchor="start" x="3360" y="-2748.3" font-family="Times,serif" font-size="14.00">&#45; description</text>
+<text text-anchor="start" x="3360" y="-2733.3" font-family="Times,serif" font-size="14.00">&#45; Chr</text>
+<text text-anchor="start" x="3360" y="-2718.3" font-family="Times,serif" font-size="14.00">&#45; Mb</text>
+<text text-anchor="start" x="3360" y="-2703.3" font-family="Times,serif" font-size="14.00">&#45; Chr_2016</text>
+<text text-anchor="start" x="3360" y="-2688.3" font-family="Times,serif" font-size="14.00">&#45; Mb_2016</text>
+<text text-anchor="start" x="3360" y="-2673.3" font-family="Times,serif" font-size="14.00">&#45; alias</text>
+<text text-anchor="start" x="3360" y="-2658.3" font-family="Times,serif" font-size="14.00">&#45; GeneId</text>
+<text text-anchor="start" x="3360" y="-2643.3" font-family="Times,serif" font-size="14.00">&#45; GenbankId</text>
+<text text-anchor="start" x="3360" y="-2628.3" font-family="Times,serif" font-size="14.00">&#45; SNP</text>
+<text text-anchor="start" x="3360" y="-2613.3" font-family="Times,serif" font-size="14.00">&#45; BlatSeq</text>
+<text text-anchor="start" x="3360" y="-2598.3" font-family="Times,serif" font-size="14.00">&#45; TargetSeq</text>
+<text text-anchor="start" x="3360" y="-2583.3" font-family="Times,serif" font-size="14.00">&#45; UniGeneId</text>
+<text text-anchor="start" x="3360" y="-2568.3" font-family="Times,serif" font-size="14.00">&#45; Strand_Probe</text>
+<text text-anchor="start" x="3360" y="-2553.3" font-family="Times,serif" font-size="14.00">&#45; Strand_Gene</text>
+<text text-anchor="start" x="3360" y="-2538.3" font-family="Times,serif" font-size="14.00">&#45; OMIM</text>
+<text text-anchor="start" x="3360" y="-2523.3" font-family="Times,serif" font-size="14.00">&#45; comments</text>
+<text text-anchor="start" x="3360" y="-2508.3" font-family="Times,serif" font-size="14.00">&#45; Probe_set_target_region</text>
+<text text-anchor="start" x="3360" y="-2493.3" font-family="Times,serif" font-size="14.00">&#45; Probe_set_specificity</text>
+<text text-anchor="start" x="3360" y="-2478.3" font-family="Times,serif" font-size="14.00">&#45; Probe_set_BLAT_score</text>
+<text text-anchor="start" x="3360" y="-2463.3" font-family="Times,serif" font-size="14.00">&#45; Probe_set_Blat_Mb_start</text>
+<text text-anchor="start" x="3360" y="-2448.3" font-family="Times,serif" font-size="14.00">&#45; Probe_set_Blat_Mb_end</text>
+<text text-anchor="start" x="3360" y="-2433.3" font-family="Times,serif" font-size="14.00">&#45; Probe_set_Blat_Mb_start_2016</text>
+<text text-anchor="start" x="3360" y="-2418.3" font-family="Times,serif" font-size="14.00">&#45; Probe_set_Blat_Mb_end_2016</text>
+<text text-anchor="start" x="3360" y="-2403.3" font-family="Times,serif" font-size="14.00">&#45; Probe_set_strand</text>
+<text text-anchor="start" x="3360" y="-2388.3" font-family="Times,serif" font-size="14.00">&#45; Probe_set_Note_by_RW</text>
+<text text-anchor="start" x="3360" y="-2373.3" font-family="Times,serif" font-size="14.00">&#45; flag</text>
+<text text-anchor="start" x="3360" y="-2358.3" font-family="Times,serif" font-size="14.00">&#45; Symbol_H</text>
+<text text-anchor="start" x="3360" y="-2343.3" font-family="Times,serif" font-size="14.00">&#45; description_H</text>
+<text text-anchor="start" x="3360" y="-2328.3" font-family="Times,serif" font-size="14.00">&#45; chromosome_H</text>
+<text text-anchor="start" x="3360" y="-2313.3" font-family="Times,serif" font-size="14.00">&#45; MB_H</text>
+<text text-anchor="start" x="3360" y="-2298.3" font-family="Times,serif" font-size="14.00">&#45; alias_H</text>
+<text text-anchor="start" x="3360" y="-2283.3" font-family="Times,serif" font-size="14.00">&#45; GeneId_H</text>
+<text text-anchor="start" x="3360" y="-2268.3" font-family="Times,serif" font-size="14.00">&#45; chr_num</text>
+<text text-anchor="start" x="3360" y="-2253.3" font-family="Times,serif" font-size="14.00">&#45; name_num</text>
+<text text-anchor="start" x="3360" y="-2238.3" font-family="Times,serif" font-size="14.00">&#45; Probe_Target_Description</text>
+<text text-anchor="start" x="3360" y="-2223.3" font-family="Times,serif" font-size="14.00">&#45; RefSeq_TranscriptId</text>
+<text text-anchor="start" x="3360" y="-2208.3" font-family="Times,serif" font-size="14.00">&#45; ENSEMBLGeneId</text>
+<text text-anchor="start" x="3360" y="-2193.3" font-family="Times,serif" font-size="14.00">&#45; Chr_mm8</text>
+<text text-anchor="start" x="3360" y="-2178.3" font-family="Times,serif" font-size="14.00">&#45; Mb_mm8</text>
+<text text-anchor="start" x="3360" y="-2163.3" font-family="Times,serif" font-size="14.00">&#45; Probe_set_Blat_Mb_start_mm8</text>
+<text text-anchor="start" x="3360" y="-2148.3" font-family="Times,serif" font-size="14.00">&#45; Probe_set_Blat_Mb_end_mm8</text>
+<text text-anchor="start" x="3360" y="-2133.3" font-family="Times,serif" font-size="14.00">&#45; HomoloGeneID</text>
+<text text-anchor="start" x="3360" y="-2118.3" font-family="Times,serif" font-size="14.00">&#45; Biotype_ENS</text>
+<text text-anchor="start" x="3360" y="-2103.3" font-family="Times,serif" font-size="14.00">&#45; ProteinID</text>
+<text text-anchor="start" x="3360" y="-2088.3" font-family="Times,serif" font-size="14.00">&#45; ProteinName</text>
+<text text-anchor="start" x="3360" y="-2073.3" font-family="Times,serif" font-size="14.00">&#45; UniProtID</text>
+<text text-anchor="start" x="3360" y="-2058.3" font-family="Times,serif" font-size="14.00">&#45; Flybase_Id</text>
+<text text-anchor="start" x="3360" y="-2043.3" font-family="Times,serif" font-size="14.00">&#45; RGD_ID</text>
+<text text-anchor="start" x="3360" y="-2028.3" font-family="Times,serif" font-size="14.00">&#45; HMDB_ID</text>
+<text text-anchor="start" x="3360" y="-2013.3" font-family="Times,serif" font-size="14.00">&#45; Confidence</text>
+<text text-anchor="start" x="3360" y="-1998.3" font-family="Times,serif" font-size="14.00">&#45; ChEBI_ID</text>
+<text text-anchor="start" x="3360" y="-1983.3" font-family="Times,serif" font-size="14.00">&#45; ChEMBL_ID</text>
+<text text-anchor="start" x="3360" y="-1968.3" font-family="Times,serif" font-size="14.00">&#45; CAS_number</text>
+<text text-anchor="start" x="3360" y="-1953.3" font-family="Times,serif" font-size="14.00">&#45; PubChem_ID</text>
+<text text-anchor="start" x="3360" y="-1938.3" font-family="Times,serif" font-size="14.00">&#45; ChemSpider_ID</text>
+<text text-anchor="start" x="3360" y="-1923.3" font-family="Times,serif" font-size="14.00">&#45; UNII_ID</text>
+<text text-anchor="start" x="3360" y="-1908.3" font-family="Times,serif" font-size="14.00">&#45; EC_number</text>
+<text text-anchor="start" x="3360" y="-1893.3" font-family="Times,serif" font-size="14.00">&#45; KEGG_ID</text>
+<text text-anchor="start" x="3360" y="-1878.3" font-family="Times,serif" font-size="14.00">&#45; Molecular_Weight</text>
+<text text-anchor="start" x="3360" y="-1863.3" font-family="Times,serif" font-size="14.00">&#45; Nugowiki_ID</text>
+<text text-anchor="start" x="3360" y="-1848.3" font-family="Times,serif" font-size="14.00">&#45; Type</text>
+<text text-anchor="start" x="3360" y="-1833.3" font-family="Times,serif" font-size="14.00">&#45; Tissue</text>
+<text text-anchor="start" x="3360" y="-1818.3" font-family="Times,serif" font-size="14.00">&#45; PrimaryName</text>
+<text text-anchor="start" x="3360" y="-1803.3" font-family="Times,serif" font-size="14.00">&#45; SecondaryNames</text>
+<text text-anchor="start" x="3360" y="-1788.3" font-family="Times,serif" font-size="14.00">&#45; PeptideSequence</text>
+</g>
+<!-- node21&#45;&gt;node37 -->
+<g id="edge9" class="edge">
+<title>node21&#45;&gt;node37</title>
+<path fill="none" stroke="black" d="M3475,-2995.77C3475,-2966.92 3475,-2923.23 3475,-2871.69"/>
+<polygon fill="none" stroke="black" points="3478.5,-2871.62 3475,-2861.62 3471.5,-2871.62 3478.5,-2871.62"/>
+</g>
+<!-- node22 -->
+<g id="node20" class="node">
+<title>node22</title>
+<polygon fill="white" stroke="black" points="2443,-1194.5 2443,-1420.5 2601,-1420.5 2601,-1194.5 2443,-1194.5"/>
+<text text-anchor="middle" x="2522" y="-1405.3" font-family="Times,serif" font-size="14.00">InbredSet</text>
+<polyline fill="none" stroke="black" points="2443,-1397.5 2601,-1397.5 "/>
+<text text-anchor="start" x="2451" y="-1382.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="2451" y="-1367.3" font-family="Times,serif" font-size="14.00">&#45; InbredSetId</text>
+<text text-anchor="start" x="2451" y="-1352.3" font-family="Times,serif" font-size="14.00">&#45; InbredSetName</text>
+<text text-anchor="start" x="2451" y="-1337.3" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="2451" y="-1322.3" font-family="Times,serif" font-size="14.00">&#45; SpeciesId</text>
+<text text-anchor="start" x="2451" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; FullName</text>
+<text text-anchor="start" x="2451" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; public</text>
+<text text-anchor="start" x="2451" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; MappingMethodId</text>
+<text text-anchor="start" x="2451" y="-1262.3" font-family="Times,serif" font-size="14.00">&#45; GeneticType</text>
+<text text-anchor="start" x="2451" y="-1247.3" font-family="Times,serif" font-size="14.00">&#45; Family</text>
+<text text-anchor="start" x="2451" y="-1232.3" font-family="Times,serif" font-size="14.00">&#45; FamilyOrder</text>
+<text text-anchor="start" x="2451" y="-1217.3" font-family="Times,serif" font-size="14.00">&#45; MenuOrderId</text>
+<text text-anchor="start" x="2451" y="-1202.3" font-family="Times,serif" font-size="14.00">&#45; InbredSetCode</text>
+</g>
+<!-- node22&#45;&gt;node5 -->
+<g id="edge10" class="edge">
+<title>node22&#45;&gt;node5</title>
+<path fill="none" stroke="black" d="M2442.8,-1225.71C2391.74,-1176.97 2322.01,-1116.33 2252,-1074 2214.78,-1051.5 2191.28,-1069.23 2161,-1038 2101.31,-976.45 2076.93,-876.71 2067.19,-815.06"/>
+<polygon fill="black" stroke="black" points="2070.65,-814.5 2065.7,-805.13 2063.73,-815.54 2070.65,-814.5"/>
+</g>
+<!-- node22&#45;&gt;node19 -->
+<g id="edge11" class="edge">
+<title>node22&#45;&gt;node19</title>
+<path fill="none" stroke="black" d="M2548.33,-1194.49C2561.76,-1153.65 2581.29,-1108.95 2609,-1074 2626.92,-1051.4 2645.89,-1061.22 2663,-1038 2702.93,-983.81 2723.53,-910.32 2734.09,-852.58"/>
+<polygon fill="none" stroke="black" points="2737.54,-853.18 2735.82,-842.72 2730.64,-851.97 2737.54,-853.18"/>
+</g>
+<!-- node45 -->
+<g id="node39" class="node">
+<title>node45</title>
+<polygon fill="white" stroke="black" points="2836,-676.5 2836,-842.5 2982,-842.5 2982,-676.5 2836,-676.5"/>
+<text text-anchor="middle" x="2909" y="-827.3" font-family="Times,serif" font-size="14.00">PublishFreeze</text>
+<polyline fill="none" stroke="black" points="2836,-819.5 2982,-819.5 "/>
+<text text-anchor="start" x="2844" y="-804.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="2844" y="-789.3" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="2844" y="-774.3" font-family="Times,serif" font-size="14.00">&#45; FullName</text>
+<text text-anchor="start" x="2844" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; ShortName</text>
+<text text-anchor="start" x="2844" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; CreateTime</text>
+<text text-anchor="start" x="2844" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; public</text>
+<text text-anchor="start" x="2844" y="-714.3" font-family="Times,serif" font-size="14.00">&#45; InbredSetId</text>
+<text text-anchor="start" x="2844" y="-699.3" font-family="Times,serif" font-size="14.00">&#45; confidentiality</text>
+<text text-anchor="start" x="2844" y="-684.3" font-family="Times,serif" font-size="14.00">&#45; AuthorisedUsers</text>
+</g>
+<!-- node22&#45;&gt;node45 -->
+<g id="edge12" class="edge">
+<title>node22&#45;&gt;node45</title>
+<path fill="none" stroke="black" d="M2539.14,-1194.37C2551.46,-1150.63 2572.63,-1103.91 2609,-1074 2684.85,-1011.63 2753.4,-1103.02 2827,-1038 2879.25,-991.84 2898.95,-914.18 2906.03,-852.74"/>
+<polygon fill="none" stroke="black" points="2909.53,-852.95 2907.1,-842.63 2902.57,-852.21 2909.53,-852.95"/>
+</g>
+<!-- node47 -->
+<g id="node41" class="node">
+<title>node47</title>
+<polygon fill="white" stroke="black" points="3000,-661.5 3000,-857.5 3120,-857.5 3120,-661.5 3000,-661.5"/>
+<text text-anchor="middle" x="3060" y="-842.3" font-family="Times,serif" font-size="14.00">PublishXRef</text>
+<polyline fill="none" stroke="black" points="3000,-834.5 3120,-834.5 "/>
+<text text-anchor="start" x="3008" y="-819.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="3008" y="-804.3" font-family="Times,serif" font-size="14.00">&#45; InbredSetId</text>
+<text text-anchor="start" x="3008" y="-789.3" font-family="Times,serif" font-size="14.00">&#45; PhenotypeId</text>
+<text text-anchor="start" x="3008" y="-774.3" font-family="Times,serif" font-size="14.00">&#45; PublicationId</text>
+<text text-anchor="start" x="3008" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; DataId</text>
+<text text-anchor="start" x="3008" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; mean</text>
+<text text-anchor="start" x="3008" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; Locus</text>
+<text text-anchor="start" x="3008" y="-714.3" font-family="Times,serif" font-size="14.00">&#45; LRS</text>
+<text text-anchor="start" x="3008" y="-699.3" font-family="Times,serif" font-size="14.00">&#45; additive</text>
+<text text-anchor="start" x="3008" y="-684.3" font-family="Times,serif" font-size="14.00">&#45; Sequence</text>
+<text text-anchor="start" x="3008" y="-669.3" font-family="Times,serif" font-size="14.00">&#45; comments</text>
+</g>
+<!-- node22&#45;&gt;node47 -->
+<g id="edge13" class="edge">
+<title>node22&#45;&gt;node47</title>
+<path fill="none" stroke="black" d="M2537.8,-1194.31C2549.9,-1150.01 2571.27,-1102.88 2609,-1074 2676.7,-1022.17 2926.37,-1093.61 2991,-1038 3039.29,-996.45 3056.51,-926.83 3061.67,-867.71"/>
+<polygon fill="black" stroke="black" points="3065.17,-867.81 3062.44,-857.57 3058.19,-867.27 3065.17,-867.81"/>
+</g>
+<!-- node51 -->
+<g id="node45" class="node">
+<title>node51</title>
+<polygon fill="white" stroke="black" points="2170,-706.5 2170,-812.5 2328,-812.5 2328,-706.5 2170,-706.5"/>
+<text text-anchor="middle" x="2249" y="-797.3" font-family="Times,serif" font-size="14.00">StrainXRef</text>
+<polyline fill="none" stroke="black" points="2170,-789.5 2328,-789.5 "/>
+<text text-anchor="start" x="2178" y="-774.3" font-family="Times,serif" font-size="14.00">&#45; InbredSetId</text>
+<text text-anchor="start" x="2178" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="2178" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; OrderId</text>
+<text text-anchor="start" x="2178" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; Used_for_mapping</text>
+<text text-anchor="start" x="2178" y="-714.3" font-family="Times,serif" font-size="14.00">&#45; PedigreeStatus</text>
+</g>
+<!-- node22&#45;&gt;node51 -->
+<g id="edge14" class="edge">
+<title>node22&#45;&gt;node51</title>
+<path fill="none" stroke="black" d="M2442.9,-1206.97C2406.91,-1158.16 2365.99,-1097.23 2337,-1038 2302.47,-967.45 2277.43,-880.28 2263.09,-822.68"/>
+<polygon fill="black" stroke="black" points="2266.4,-821.51 2260.62,-812.63 2259.6,-823.18 2266.4,-821.51"/>
+</g>
+<!-- node54 -->
+<g id="node46" class="node">
+<title>node54</title>
+<polygon fill="white" stroke="black" points="2520,-684 2520,-835 2654,-835 2654,-684 2520,-684"/>
+<text text-anchor="middle" x="2587" y="-819.8" font-family="Times,serif" font-size="14.00">Temp</text>
+<polyline fill="none" stroke="black" points="2520,-812 2654,-812 "/>
+<text text-anchor="start" x="2528" y="-796.8" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="2528" y="-781.8" font-family="Times,serif" font-size="14.00">&#45; dbdisplayname</text>
+<text text-anchor="start" x="2528" y="-766.8" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="2528" y="-751.8" font-family="Times,serif" font-size="14.00">&#45; description</text>
+<text text-anchor="start" x="2528" y="-736.8" font-family="Times,serif" font-size="14.00">&#45; createtime</text>
+<text text-anchor="start" x="2528" y="-721.8" font-family="Times,serif" font-size="14.00">&#45; DataId</text>
+<text text-anchor="start" x="2528" y="-706.8" font-family="Times,serif" font-size="14.00">&#45; InbredSetId</text>
+<text text-anchor="start" x="2528" y="-691.8" font-family="Times,serif" font-size="14.00">&#45; IP</text>
+</g>
+<!-- node22&#45;&gt;node54 -->
+<g id="edge15" class="edge">
+<title>node22&#45;&gt;node54</title>
+<path fill="none" stroke="black" d="M2535.35,-1194.36C2547.68,-1090.78 2565.73,-939.17 2576.9,-845.33"/>
+<polygon fill="black" stroke="black" points="2580.39,-845.65 2578.09,-835.31 2573.44,-844.82 2580.39,-845.65"/>
+</g>
+<!-- node23 -->
+<g id="node21" class="node">
+<title>node23</title>
+<polygon fill="white" stroke="black" points="950.5,-1194.5 950.5,-1420.5 1083.5,-1420.5 1083.5,-1194.5 950.5,-1194.5"/>
+<text text-anchor="middle" x="1017" y="-1405.3" font-family="Times,serif" font-size="14.00">IndelAll</text>
+<polyline fill="none" stroke="black" points="950.5,-1397.5 1083.5,-1397.5 "/>
+<text text-anchor="start" x="958.5" y="-1382.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="958.5" y="-1367.3" font-family="Times,serif" font-size="14.00">&#45; SpeciesId</text>
+<text text-anchor="start" x="958.5" y="-1352.3" font-family="Times,serif" font-size="14.00">&#45; SourceId</text>
+<text text-anchor="start" x="958.5" y="-1337.3" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="958.5" y="-1322.3" font-family="Times,serif" font-size="14.00">&#45; Chromosome</text>
+<text text-anchor="start" x="958.5" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; Mb_start</text>
+<text text-anchor="start" x="958.5" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; Mb_start_2016</text>
+<text text-anchor="start" x="958.5" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; Strand</text>
+<text text-anchor="start" x="958.5" y="-1262.3" font-family="Times,serif" font-size="14.00">&#45; Type</text>
+<text text-anchor="start" x="958.5" y="-1247.3" font-family="Times,serif" font-size="14.00">&#45; Mb_end</text>
+<text text-anchor="start" x="958.5" y="-1232.3" font-family="Times,serif" font-size="14.00">&#45; Mb_end_2016</text>
+<text text-anchor="start" x="958.5" y="-1217.3" font-family="Times,serif" font-size="14.00">&#45; Size</text>
+<text text-anchor="start" x="958.5" y="-1202.3" font-family="Times,serif" font-size="14.00">&#45; InDelSequence</text>
+</g>
+<!-- node24 -->
+<g id="node22" class="node">
+<title>node24</title>
+<polygon fill="white" stroke="black" points="484.5,-721.5 484.5,-797.5 577.5,-797.5 577.5,-721.5 484.5,-721.5"/>
+<text text-anchor="middle" x="531" y="-782.3" font-family="Times,serif" font-size="14.00">IndelXRef</text>
+<polyline fill="none" stroke="black" points="484.5,-774.5 577.5,-774.5 "/>
+<text text-anchor="start" x="492.5" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; IndelId</text>
+<text text-anchor="start" x="492.5" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; StrainId1</text>
+<text text-anchor="start" x="492.5" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; StrainId2</text>
+</g>
+<!-- node23&#45;&gt;node24 -->
+<g id="edge16" class="edge">
+<title>node23&#45;&gt;node24</title>
+<path fill="none" stroke="black" d="M1006.53,-1194.48C996.53,-1150.35 977.38,-1103.3 941,-1074 879.42,-1024.4 645.58,-1091.11 587,-1038 522.85,-979.83 520.48,-870.29 525.23,-807.63"/>
+<polygon fill="black" stroke="black" points="528.72,-807.89 526.08,-797.62 521.75,-807.29 528.72,-807.89"/>
+</g>
+<!-- node27 -->
+<g id="node23" class="node">
+<title>node27</title>
+<polygon fill="white" stroke="black" points="2455,-1630 2455,-1691 2589,-1691 2589,-1630 2455,-1630"/>
+<text text-anchor="middle" x="2522" y="-1675.8" font-family="Times,serif" font-size="14.00">MappingMethod</text>
+<polyline fill="none" stroke="black" points="2455,-1668 2589,-1668 "/>
+<text text-anchor="start" x="2463" y="-1652.8" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="2463" y="-1637.8" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+</g>
+<!-- node27&#45;&gt;node22 -->
+<g id="edge17" class="edge">
+<title>node27&#45;&gt;node22</title>
+<path fill="none" stroke="black" d="M2522,-1629.88C2522,-1586.24 2522,-1502.15 2522,-1430.93"/>
+<polygon fill="none" stroke="black" points="2525.5,-1430.53 2522,-1420.53 2518.5,-1430.53 2525.5,-1430.53"/>
+</g>
+<!-- node28 -->
+<g id="node24" class="node">
+<title>node28</title>
+<polygon fill="white" stroke="black" points="1190,-721.5 1190,-797.5 1274,-797.5 1274,-721.5 1190,-721.5"/>
+<text text-anchor="middle" x="1232" y="-782.3" font-family="Times,serif" font-size="14.00">NStrain</text>
+<polyline fill="none" stroke="black" points="1190,-774.5 1274,-774.5 "/>
+<text text-anchor="start" x="1198" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; DataId</text>
+<text text-anchor="start" x="1198" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="1198" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; count</text>
+</g>
+<!-- node31 -->
+<g id="node25" class="node">
+<title>node31</title>
+<polygon fill="white" stroke="black" points="2618.5,-1209.5 2618.5,-1405.5 2857.5,-1405.5 2857.5,-1209.5 2618.5,-1209.5"/>
+<text text-anchor="middle" x="2738" y="-1390.3" font-family="Times,serif" font-size="14.00">Phenotype</text>
+<polyline fill="none" stroke="black" points="2618.5,-1382.5 2857.5,-1382.5 "/>
+<text text-anchor="start" x="2626.5" y="-1367.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="2626.5" y="-1352.3" font-family="Times,serif" font-size="14.00">&#45; Pre_publication_description</text>
+<text text-anchor="start" x="2626.5" y="-1337.3" font-family="Times,serif" font-size="14.00">&#45; Post_publication_description</text>
+<text text-anchor="start" x="2626.5" y="-1322.3" font-family="Times,serif" font-size="14.00">&#45; Original_description</text>
+<text text-anchor="start" x="2626.5" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; Units</text>
+<text text-anchor="start" x="2626.5" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; Pre_publication_abbreviation</text>
+<text text-anchor="start" x="2626.5" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; Post_publication_abbreviation</text>
+<text text-anchor="start" x="2626.5" y="-1262.3" font-family="Times,serif" font-size="14.00">&#45; Lab_code</text>
+<text text-anchor="start" x="2626.5" y="-1247.3" font-family="Times,serif" font-size="14.00">&#45; Submitter</text>
+<text text-anchor="start" x="2626.5" y="-1232.3" font-family="Times,serif" font-size="14.00">&#45; Owner</text>
+<text text-anchor="start" x="2626.5" y="-1217.3" font-family="Times,serif" font-size="14.00">&#45; Authorized_Users</text>
+</g>
+<!-- node31&#45;&gt;node47 -->
+<g id="edge19" class="edge">
+<title>node31&#45;&gt;node47</title>
+<path fill="none" stroke="black" d="M2771.49,-1209.49C2792.26,-1162.46 2823.43,-1108.76 2867,-1074 2911.86,-1038.21 2951.22,-1079.36 2991,-1038 3034.34,-992.94 3051.74,-925.06 3058.23,-867.71"/>
+<polygon fill="black" stroke="black" points="3061.74,-867.81 3059.28,-857.5 3054.77,-867.09 3061.74,-867.81"/>
+</g>
+<!-- node32 -->
+<g id="node26" class="node">
+<title>node32</title>
+<polygon fill="white" stroke="black" points="3326,-1577.5 3326,-1743.5 3436,-1743.5 3436,-1577.5 3326,-1577.5"/>
+<text text-anchor="middle" x="3381" y="-1728.3" font-family="Times,serif" font-size="14.00">Probe</text>
+<polyline fill="none" stroke="black" points="3326,-1720.5 3436,-1720.5 "/>
+<text text-anchor="start" x="3334" y="-1705.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="3334" y="-1690.3" font-family="Times,serif" font-size="14.00">&#45; ProbeSetId</text>
+<text text-anchor="start" x="3334" y="-1675.3" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="3334" y="-1660.3" font-family="Times,serif" font-size="14.00">&#45; Sequence</text>
+<text text-anchor="start" x="3334" y="-1645.3" font-family="Times,serif" font-size="14.00">&#45; ExonNo</text>
+<text text-anchor="start" x="3334" y="-1630.3" font-family="Times,serif" font-size="14.00">&#45; SerialOrder</text>
+<text text-anchor="start" x="3334" y="-1615.3" font-family="Times,serif" font-size="14.00">&#45; Tm</text>
+<text text-anchor="start" x="3334" y="-1600.3" font-family="Times,serif" font-size="14.00">&#45; E_GSB</text>
+<text text-anchor="start" x="3334" y="-1585.3" font-family="Times,serif" font-size="14.00">&#45; E_NSB</text>
+</g>
+<!-- node35 -->
+<g id="node29" class="node">
+<title>node35</title>
+<polygon fill="white" stroke="black" points="3315.5,-1262 3315.5,-1353 3446.5,-1353 3446.5,-1262 3315.5,-1262"/>
+<text text-anchor="middle" x="3381" y="-1337.8" font-family="Times,serif" font-size="14.00">ProbeH2</text>
+<polyline fill="none" stroke="black" points="3315.5,-1330 3446.5,-1330 "/>
+<text text-anchor="start" x="3323.5" y="-1314.8" font-family="Times,serif" font-size="14.00">&#45; ProbeFreezeId</text>
+<text text-anchor="start" x="3323.5" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; ProbeId</text>
+<text text-anchor="start" x="3323.5" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; h2</text>
+<text text-anchor="start" x="3323.5" y="-1269.8" font-family="Times,serif" font-size="14.00">&#45; weight</text>
+</g>
+<!-- node32&#45;&gt;node35 -->
+<g id="edge20" class="edge">
+<title>node32&#45;&gt;node35</title>
+<path fill="none" stroke="black" d="M3381,-1577.21C3381,-1511.4 3381,-1420.95 3381,-1363.61"/>
+<polygon fill="black" stroke="black" points="3384.5,-1363.3 3381,-1353.3 3377.5,-1363.3 3384.5,-1363.3"/>
+</g>
+<!-- node42 -->
+<g id="node36" class="node">
+<title>node42</title>
+<polygon fill="white" stroke="black" points="3166.5,-1269.5 3166.5,-1345.5 3297.5,-1345.5 3297.5,-1269.5 3166.5,-1269.5"/>
+<text text-anchor="middle" x="3232" y="-1330.3" font-family="Times,serif" font-size="14.00">ProbeXRef</text>
+<polyline fill="none" stroke="black" points="3166.5,-1322.5 3297.5,-1322.5 "/>
+<text text-anchor="start" x="3174.5" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; ProbeFreezeId</text>
+<text text-anchor="start" x="3174.5" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; ProbeId</text>
+<text text-anchor="start" x="3174.5" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; DataId</text>
+</g>
+<!-- node32&#45;&gt;node42 -->
+<g id="edge21" class="edge">
+<title>node32&#45;&gt;node42</title>
+<path fill="none" stroke="black" d="M3325.94,-1578.48C3318.71,-1566.2 3311.81,-1553.47 3306,-1541 3277.26,-1479.35 3255.46,-1403.56 3243.2,-1355.63"/>
+<polygon fill="black" stroke="black" points="3246.57,-1354.68 3240.73,-1345.84 3239.78,-1356.39 3246.57,-1354.68"/>
+</g>
+<!-- node33 -->
+<g id="node27" class="node">
+<title>node33</title>
+<polygon fill="white" stroke="black" points="1292,-721.5 1292,-797.5 1384,-797.5 1384,-721.5 1292,-721.5"/>
+<text text-anchor="middle" x="1338" y="-782.3" font-family="Times,serif" font-size="14.00">ProbeData</text>
+<polyline fill="none" stroke="black" points="1292,-774.5 1384,-774.5 "/>
+<text text-anchor="start" x="1300" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="1300" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="1300" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; value</text>
+</g>
+<!-- node34 -->
+<g id="node28" class="node">
+<title>node34</title>
+<polygon fill="white" stroke="black" points="3087.5,-1577.5 3087.5,-1743.5 3218.5,-1743.5 3218.5,-1577.5 3087.5,-1577.5"/>
+<text text-anchor="middle" x="3153" y="-1728.3" font-family="Times,serif" font-size="14.00">ProbeFreeze</text>
+<polyline fill="none" stroke="black" points="3087.5,-1720.5 3218.5,-1720.5 "/>
+<text text-anchor="start" x="3095.5" y="-1705.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="3095.5" y="-1690.3" font-family="Times,serif" font-size="14.00">&#45; ProbeFreezeId</text>
+<text text-anchor="start" x="3095.5" y="-1675.3" font-family="Times,serif" font-size="14.00">&#45; ChipId</text>
+<text text-anchor="start" x="3095.5" y="-1660.3" font-family="Times,serif" font-size="14.00">&#45; TissueId</text>
+<text text-anchor="start" x="3095.5" y="-1645.3" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="3095.5" y="-1630.3" font-family="Times,serif" font-size="14.00">&#45; FullName</text>
+<text text-anchor="start" x="3095.5" y="-1615.3" font-family="Times,serif" font-size="14.00">&#45; ShortName</text>
+<text text-anchor="start" x="3095.5" y="-1600.3" font-family="Times,serif" font-size="14.00">&#45; CreateTime</text>
+<text text-anchor="start" x="3095.5" y="-1585.3" font-family="Times,serif" font-size="14.00">&#45; InbredSetId</text>
+</g>
+<!-- node34&#45;&gt;node35 -->
+<g id="edge22" class="edge">
+<title>node34&#45;&gt;node35</title>
+<path fill="none" stroke="black" d="M3218.59,-1621.61C3248.94,-1601.16 3283.23,-1573.45 3306,-1541 3343.84,-1487.08 3363.37,-1413.02 3372.88,-1363.1"/>
+<polygon fill="black" stroke="black" points="3376.34,-1363.6 3374.7,-1353.13 3369.46,-1362.34 3376.34,-1363.6"/>
+</g>
+<!-- node39 -->
+<g id="node33" class="node">
+<title>node39</title>
+<polygon fill="white" stroke="black" points="3002,-1194.5 3002,-1420.5 3148,-1420.5 3148,-1194.5 3002,-1194.5"/>
+<text text-anchor="middle" x="3075" y="-1405.3" font-family="Times,serif" font-size="14.00">ProbeSetFreeze</text>
+<polyline fill="none" stroke="black" points="3002,-1397.5 3148,-1397.5 "/>
+<text text-anchor="start" x="3010" y="-1382.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="3010" y="-1367.3" font-family="Times,serif" font-size="14.00">&#45; ProbeFreezeId</text>
+<text text-anchor="start" x="3010" y="-1352.3" font-family="Times,serif" font-size="14.00">&#45; AvgID</text>
+<text text-anchor="start" x="3010" y="-1337.3" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="3010" y="-1322.3" font-family="Times,serif" font-size="14.00">&#45; Name2</text>
+<text text-anchor="start" x="3010" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; FullName</text>
+<text text-anchor="start" x="3010" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; ShortName</text>
+<text text-anchor="start" x="3010" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; CreateTime</text>
+<text text-anchor="start" x="3010" y="-1262.3" font-family="Times,serif" font-size="14.00">&#45; OrderList</text>
+<text text-anchor="start" x="3010" y="-1247.3" font-family="Times,serif" font-size="14.00">&#45; public</text>
+<text text-anchor="start" x="3010" y="-1232.3" font-family="Times,serif" font-size="14.00">&#45; confidentiality</text>
+<text text-anchor="start" x="3010" y="-1217.3" font-family="Times,serif" font-size="14.00">&#45; AuthorisedUsers</text>
+<text text-anchor="start" x="3010" y="-1202.3" font-family="Times,serif" font-size="14.00">&#45; DataScale</text>
+</g>
+<!-- node34&#45;&gt;node39 -->
+<g id="edge23" class="edge">
+<title>node34&#45;&gt;node39</title>
+<path fill="none" stroke="black" d="M3134.71,-1577.21C3125,-1533.51 3112.88,-1478.96 3102.1,-1430.44"/>
+<polygon fill="black" stroke="black" points="3105.48,-1429.51 3099.89,-1420.51 3098.64,-1431.03 3105.48,-1429.51"/>
+</g>
+<!-- node34&#45;&gt;node42 -->
+<g id="edge24" class="edge">
+<title>node34&#45;&gt;node42</title>
+<path fill="none" stroke="black" d="M3171.52,-1577.21C3187.05,-1508.2 3208.68,-1412.11 3221.42,-1355.5"/>
+<polygon fill="black" stroke="black" points="3224.84,-1356.27 3223.62,-1345.74 3218.01,-1354.73 3224.84,-1356.27"/>
+</g>
+<!-- node36 -->
+<g id="node30" class="node">
+<title>node36</title>
+<polygon fill="white" stroke="black" points="1402,-721.5 1402,-797.5 1486,-797.5 1486,-721.5 1402,-721.5"/>
+<text text-anchor="middle" x="1444" y="-782.3" font-family="Times,serif" font-size="14.00">ProbeSE</text>
+<polyline fill="none" stroke="black" points="1402,-774.5 1486,-774.5 "/>
+<text text-anchor="start" x="1410" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; DataId</text>
+<text text-anchor="start" x="1410" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="1410" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; error</text>
+</g>
+<!-- node37&#45;&gt;node32 -->
+<g id="edge25" class="edge">
+<title>node37&#45;&gt;node32</title>
+<path fill="none" stroke="black" d="M3397.97,-1780.37C3396.64,-1771.07 3395.37,-1762.15 3394.16,-1753.68"/>
+<polygon fill="black" stroke="black" points="3397.59,-1752.98 3392.72,-1743.58 3390.66,-1753.97 3397.59,-1752.98"/>
+</g>
+<!-- node41 -->
+<g id="node35" class="node">
+<title>node41</title>
+<polygon fill="white" stroke="black" points="3202.5,-646.5 3202.5,-872.5 3357.5,-872.5 3357.5,-646.5 3202.5,-646.5"/>
+<text text-anchor="middle" x="3280" y="-857.3" font-family="Times,serif" font-size="14.00">ProbeSetXRef</text>
+<polyline fill="none" stroke="black" points="3202.5,-849.5 3357.5,-849.5 "/>
+<text text-anchor="start" x="3210.5" y="-834.3" font-family="Times,serif" font-size="14.00">&#45; ProbeSetFreezeId</text>
+<text text-anchor="start" x="3210.5" y="-819.3" font-family="Times,serif" font-size="14.00">&#45; ProbeSetId</text>
+<text text-anchor="start" x="3210.5" y="-804.3" font-family="Times,serif" font-size="14.00">&#45; DataId</text>
+<text text-anchor="start" x="3210.5" y="-789.3" font-family="Times,serif" font-size="14.00">&#45; Locus_old</text>
+<text text-anchor="start" x="3210.5" y="-774.3" font-family="Times,serif" font-size="14.00">&#45; LRS_old</text>
+<text text-anchor="start" x="3210.5" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; pValue_old</text>
+<text text-anchor="start" x="3210.5" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; mean</text>
+<text text-anchor="start" x="3210.5" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; se</text>
+<text text-anchor="start" x="3210.5" y="-714.3" font-family="Times,serif" font-size="14.00">&#45; Locus</text>
+<text text-anchor="start" x="3210.5" y="-699.3" font-family="Times,serif" font-size="14.00">&#45; LRS</text>
+<text text-anchor="start" x="3210.5" y="-684.3" font-family="Times,serif" font-size="14.00">&#45; pValue</text>
+<text text-anchor="start" x="3210.5" y="-669.3" font-family="Times,serif" font-size="14.00">&#45; additive</text>
+<text text-anchor="start" x="3210.5" y="-654.3" font-family="Times,serif" font-size="14.00">&#45; h2</text>
+</g>
+<!-- node37&#45;&gt;node41 -->
+<g id="edge26" class="edge">
+<title>node37&#45;&gt;node41</title>
+<path fill="none" stroke="black" d="M3478.52,-1780.31C3478.33,-1476.13 3473.65,-1143.37 3455,-1074 3436.26,-1004.29 3398.67,-933.5 3363.11,-876.86"/>
+<polygon fill="black" stroke="black" points="3365.96,-874.83 3357.65,-868.26 3360.05,-878.58 3365.96,-874.83"/>
+</g>
+<!-- node60 -->
+<g id="node52" class="node">
+<title>node60</title>
+<polygon fill="white" stroke="black" points="3603,-0.5 3603,-211.5 3813,-211.5 3813,-0.5 3603,-0.5"/>
+<text text-anchor="middle" x="3708" y="-196.3" font-family="Times,serif" font-size="14.00">TissueProbeSetXRef</text>
+<polyline fill="none" stroke="black" points="3603,-188.5 3813,-188.5 "/>
+<text text-anchor="start" x="3611" y="-173.3" font-family="Times,serif" font-size="14.00">&#45; TissueProbeSetFreezeId</text>
+<text text-anchor="start" x="3611" y="-158.3" font-family="Times,serif" font-size="14.00">&#45; ProbesetId</text>
+<text text-anchor="start" x="3611" y="-143.3" font-family="Times,serif" font-size="14.00">&#45; DataId</text>
+<text text-anchor="start" x="3611" y="-128.3" font-family="Times,serif" font-size="14.00">&#45; Mean</text>
+<text text-anchor="start" x="3611" y="-113.3" font-family="Times,serif" font-size="14.00">&#45; useStatus</text>
+<text text-anchor="start" x="3611" y="-98.3" font-family="Times,serif" font-size="14.00">&#45; Symbol</text>
+<text text-anchor="start" x="3611" y="-83.3" font-family="Times,serif" font-size="14.00">&#45; GeneId</text>
+<text text-anchor="start" x="3611" y="-68.3" font-family="Times,serif" font-size="14.00">&#45; Chr</text>
+<text text-anchor="start" x="3611" y="-53.3" font-family="Times,serif" font-size="14.00">&#45; Mb</text>
+<text text-anchor="start" x="3611" y="-38.3" font-family="Times,serif" font-size="14.00">&#45; Mb_2016</text>
+<text text-anchor="start" x="3611" y="-23.3" font-family="Times,serif" font-size="14.00">&#45; description</text>
+<text text-anchor="start" x="3611" y="-8.3" font-family="Times,serif" font-size="14.00">&#45; Probe_Target_Description</text>
+</g>
+<!-- node37&#45;&gt;node60 -->
+<g id="edge27" class="edge">
+<title>node37&#45;&gt;node60</title>
+<path fill="none" stroke="black" d="M3598.18,-1788.55C3601.06,-1785.64 3604,-1782.79 3607,-1780 4072.64,-1346.72 4591.07,-2012.47 5018,-1541 5087.52,-1464.22 5034,-1412.08 5034,-1308.5 5034,-1308.5 5034,-1308.5 5034,-758.5 5034,-634.96 5095.21,-577.44 5018,-481 4866.15,-291.35 4114.38,-165.23 3823.35,-122.81"/>
+<polygon fill="black" stroke="black" points="3823.59,-119.31 3813.19,-121.34 3822.58,-126.24 3823.59,-119.31"/>
+</g>
+<!-- node38 -->
+<g id="node32" class="node">
+<title>node38</title>
+<polygon fill="white" stroke="black" points="1676,-721.5 1676,-797.5 1792,-797.5 1792,-721.5 1676,-721.5"/>
+<text text-anchor="middle" x="1734" y="-782.3" font-family="Times,serif" font-size="14.00">ProbeSetData</text>
+<polyline fill="none" stroke="black" points="1676,-774.5 1792,-774.5 "/>
+<text text-anchor="start" x="1684" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="1684" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="1684" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; value</text>
+</g>
+<!-- node39&#45;&gt;node4 -->
+<g id="edge28" class="edge">
+<title>node39&#45;&gt;node4</title>
+<path fill="none" stroke="black" d="M3062.04,-1194.41C3050.97,-1149.99 3030.56,-1102.74 2993,-1074 2907.7,-1008.73 2595.14,-1104.76 2511,-1038 2443.84,-984.71 2427.5,-880.03 2424.11,-815.58"/>
+<polygon fill="black" stroke="black" points="2427.59,-815.04 2423.65,-805.2 2420.59,-815.35 2427.59,-815.04"/>
+</g>
+<!-- node39&#45;&gt;node41 -->
+<g id="edge29" class="edge">
+<title>node39&#45;&gt;node41</title>
+<path fill="none" stroke="black" d="M3113.63,-1194.46C3127.07,-1156.15 3142.44,-1113.11 3157,-1074 3180.68,-1010.42 3208.16,-940.07 3231.14,-882.14"/>
+<polygon fill="black" stroke="black" points="3234.49,-883.17 3234.93,-872.59 3227.99,-880.59 3234.49,-883.17"/>
+</g>
+<!-- node63 -->
+<g id="node56" class="node">
+<title>node63</title>
+<polygon fill="white" stroke="black" points="3867,-721.5 3867,-797.5 4045,-797.5 4045,-721.5 3867,-721.5"/>
+<text text-anchor="middle" x="3956" y="-782.3" font-family="Times,serif" font-size="14.00">UserPrivilege</text>
+<polyline fill="none" stroke="black" points="3867,-774.5 4045,-774.5 "/>
+<text text-anchor="start" x="3875" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; UserId</text>
+<text text-anchor="start" x="3875" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; ProbeSetFreezeId</text>
+<text text-anchor="start" x="3875" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; download_result_priv</text>
+</g>
+<!-- node39&#45;&gt;node63 -->
+<g id="edge30" class="edge">
+<title>node39&#45;&gt;node63</title>
+<path fill="none" stroke="black" d="M3089.8,-1194.33C3101.19,-1150.71 3121.35,-1104.1 3157,-1074 3229.02,-1013.2 3276.1,-1066.31 3366,-1038 3560.8,-976.65 3774.09,-863.93 3883.04,-802.73"/>
+<polygon fill="black" stroke="black" points="3884.98,-805.65 3891.98,-797.69 3881.55,-799.55 3884.98,-805.65"/>
+</g>
+<!-- node40 -->
+<g id="node34" class="node">
+<title>node40</title>
+<polygon fill="white" stroke="black" points="1810.5,-721.5 1810.5,-797.5 1913.5,-797.5 1913.5,-721.5 1810.5,-721.5"/>
+<text text-anchor="middle" x="1862" y="-782.3" font-family="Times,serif" font-size="14.00">ProbeSetSE</text>
+<polyline fill="none" stroke="black" points="1810.5,-774.5 1913.5,-774.5 "/>
+<text text-anchor="start" x="1818.5" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; DataId</text>
+<text text-anchor="start" x="1818.5" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="1818.5" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; error</text>
+</g>
+<!-- node43 -->
+<g id="node37" class="node">
+<title>node43</title>
+<polygon fill="white" stroke="black" points="2876,-1217 2876,-1398 2984,-1398 2984,-1217 2876,-1217"/>
+<text text-anchor="middle" x="2930" y="-1382.8" font-family="Times,serif" font-size="14.00">Publication</text>
+<polyline fill="none" stroke="black" points="2876,-1375 2984,-1375 "/>
+<text text-anchor="start" x="2884" y="-1359.8" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="2884" y="-1344.8" font-family="Times,serif" font-size="14.00">&#45; PubMed_ID</text>
+<text text-anchor="start" x="2884" y="-1329.8" font-family="Times,serif" font-size="14.00">&#45; Abstract</text>
+<text text-anchor="start" x="2884" y="-1314.8" font-family="Times,serif" font-size="14.00">&#45; Authors</text>
+<text text-anchor="start" x="2884" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; Title</text>
+<text text-anchor="start" x="2884" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; Journal</text>
+<text text-anchor="start" x="2884" y="-1269.8" font-family="Times,serif" font-size="14.00">&#45; Volume</text>
+<text text-anchor="start" x="2884" y="-1254.8" font-family="Times,serif" font-size="14.00">&#45; Pages</text>
+<text text-anchor="start" x="2884" y="-1239.8" font-family="Times,serif" font-size="14.00">&#45; Month</text>
+<text text-anchor="start" x="2884" y="-1224.8" font-family="Times,serif" font-size="14.00">&#45; Year</text>
+</g>
+<!-- node43&#45;&gt;node47 -->
+<g id="edge31" class="edge">
+<title>node43&#45;&gt;node47</title>
+<path fill="none" stroke="black" d="M2951.32,-1216.95C2974.08,-1121.36 3010.14,-969.91 3034.42,-867.95"/>
+<polygon fill="black" stroke="black" points="3037.89,-868.47 3036.8,-857.93 3031.08,-866.85 3037.89,-868.47"/>
+</g>
+<!-- node44 -->
+<g id="node38" class="node">
+<title>node44</title>
+<polygon fill="white" stroke="black" points="596,-721.5 596,-797.5 700,-797.5 700,-721.5 596,-721.5"/>
+<text text-anchor="middle" x="648" y="-782.3" font-family="Times,serif" font-size="14.00">PublishData</text>
+<polyline fill="none" stroke="black" points="596,-774.5 700,-774.5 "/>
+<text text-anchor="start" x="604" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="604" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="604" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; value</text>
+</g>
+<!-- node46 -->
+<g id="node40" class="node">
+<title>node46</title>
+<polygon fill="white" stroke="black" points="718,-721.5 718,-797.5 808,-797.5 808,-721.5 718,-721.5"/>
+<text text-anchor="middle" x="763" y="-782.3" font-family="Times,serif" font-size="14.00">PublishSE</text>
+<polyline fill="none" stroke="black" points="718,-774.5 808,-774.5 "/>
+<text text-anchor="start" x="726" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; DataId</text>
+<text text-anchor="start" x="726" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="726" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; error</text>
+</g>
+<!-- node48 -->
+<g id="node42" class="node">
+<title>node48</title>
+<polygon fill="white" stroke="black" points="723.5,-1074.5 723.5,-1540.5 932.5,-1540.5 932.5,-1074.5 723.5,-1074.5"/>
+<text text-anchor="middle" x="828" y="-1525.3" font-family="Times,serif" font-size="14.00">SnpAll</text>
+<polyline fill="none" stroke="black" points="723.5,-1517.5 932.5,-1517.5 "/>
+<text text-anchor="start" x="731.5" y="-1502.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="731.5" y="-1487.3" font-family="Times,serif" font-size="14.00">&#45; SpeciesId</text>
+<text text-anchor="start" x="731.5" y="-1472.3" font-family="Times,serif" font-size="14.00">&#45; SnpName</text>
+<text text-anchor="start" x="731.5" y="-1457.3" font-family="Times,serif" font-size="14.00">&#45; Rs</text>
+<text text-anchor="start" x="731.5" y="-1442.3" font-family="Times,serif" font-size="14.00">&#45; Chromosome</text>
+<text text-anchor="start" x="731.5" y="-1427.3" font-family="Times,serif" font-size="14.00">&#45; Position</text>
+<text text-anchor="start" x="731.5" y="-1412.3" font-family="Times,serif" font-size="14.00">&#45; Position_2016</text>
+<text text-anchor="start" x="731.5" y="-1397.3" font-family="Times,serif" font-size="14.00">&#45; Alleles</text>
+<text text-anchor="start" x="731.5" y="-1382.3" font-family="Times,serif" font-size="14.00">&#45; Source</text>
+<text text-anchor="start" x="731.5" y="-1367.3" font-family="Times,serif" font-size="14.00">&#45; ConservationScore</text>
+<text text-anchor="start" x="731.5" y="-1352.3" font-family="Times,serif" font-size="14.00">&#45; 3Prime_UTR</text>
+<text text-anchor="start" x="731.5" y="-1337.3" font-family="Times,serif" font-size="14.00">&#45; 5Prime_UTR</text>
+<text text-anchor="start" x="731.5" y="-1322.3" font-family="Times,serif" font-size="14.00">&#45; Upstream</text>
+<text text-anchor="start" x="731.5" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; Downstream</text>
+<text text-anchor="start" x="731.5" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; Intron</text>
+<text text-anchor="start" x="731.5" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; Non_Splice_Site</text>
+<text text-anchor="start" x="731.5" y="-1262.3" font-family="Times,serif" font-size="14.00">&#45; Splice_Site</text>
+<text text-anchor="start" x="731.5" y="-1247.3" font-family="Times,serif" font-size="14.00">&#45; Intergenic</text>
+<text text-anchor="start" x="731.5" y="-1232.3" font-family="Times,serif" font-size="14.00">&#45; Exon</text>
+<text text-anchor="start" x="731.5" y="-1217.3" font-family="Times,serif" font-size="14.00">&#45; Non_Synonymous_Coding</text>
+<text text-anchor="start" x="731.5" y="-1202.3" font-family="Times,serif" font-size="14.00">&#45; Synonymous_Coding</text>
+<text text-anchor="start" x="731.5" y="-1187.3" font-family="Times,serif" font-size="14.00">&#45; Start_Gained</text>
+<text text-anchor="start" x="731.5" y="-1172.3" font-family="Times,serif" font-size="14.00">&#45; Start_Lost</text>
+<text text-anchor="start" x="731.5" y="-1157.3" font-family="Times,serif" font-size="14.00">&#45; Stop_Gained</text>
+<text text-anchor="start" x="731.5" y="-1142.3" font-family="Times,serif" font-size="14.00">&#45; Stop_Lost</text>
+<text text-anchor="start" x="731.5" y="-1127.3" font-family="Times,serif" font-size="14.00">&#45; Unknown_Effect_In_Exon</text>
+<text text-anchor="start" x="731.5" y="-1112.3" font-family="Times,serif" font-size="14.00">&#45; Domain</text>
+<text text-anchor="start" x="731.5" y="-1097.3" font-family="Times,serif" font-size="14.00">&#45; Gene</text>
+<text text-anchor="start" x="731.5" y="-1082.3" font-family="Times,serif" font-size="14.00">&#45; Transcript</text>
+</g>
+<!-- node49 -->
+<g id="node43" class="node">
+<title>node49</title>
+<polygon fill="white" stroke="black" points="767,-1585 767,-1736 889,-1736 889,-1585 767,-1585"/>
+<text text-anchor="middle" x="828" y="-1720.8" font-family="Times,serif" font-size="14.00">Species</text>
+<polyline fill="none" stroke="black" points="767,-1713 889,-1713 "/>
+<text text-anchor="start" x="775" y="-1697.8" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="775" y="-1682.8" font-family="Times,serif" font-size="14.00">&#45; SpeciesId</text>
+<text text-anchor="start" x="775" y="-1667.8" font-family="Times,serif" font-size="14.00">&#45; SpeciesName</text>
+<text text-anchor="start" x="775" y="-1652.8" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="775" y="-1637.8" font-family="Times,serif" font-size="14.00">&#45; MenuName</text>
+<text text-anchor="start" x="775" y="-1622.8" font-family="Times,serif" font-size="14.00">&#45; FullName</text>
+<text text-anchor="start" x="775" y="-1607.8" font-family="Times,serif" font-size="14.00">&#45; TaxonomyId</text>
+<text text-anchor="start" x="775" y="-1592.8" font-family="Times,serif" font-size="14.00">&#45; OrderId</text>
+</g>
+<!-- node49&#45;&gt;node11 -->
+<g id="edge32" class="edge">
+<title>node49&#45;&gt;node11</title>
+<path fill="none" stroke="black" d="M767.26,-1584.63C764.23,-1581.95 761.13,-1579.39 758,-1577 727.98,-1554.07 705.25,-1569.97 681,-1541 636.84,-1488.26 623.84,-1407.18 620.18,-1356.03"/>
+<polygon fill="black" stroke="black" points="623.67,-1355.67 619.55,-1345.91 616.68,-1356.11 623.67,-1355.67"/>
+</g>
+<!-- node49&#45;&gt;node12 -->
+<g id="edge33" class="edge">
+<title>node49&#45;&gt;node12</title>
+<path fill="none" stroke="black" d="M770.56,-1584.74C766.54,-1581.83 762.35,-1579.21 758,-1577 661.47,-1527.9 357.39,-1607.61 272,-1541 227.21,-1506.06 208.2,-1444.27 200.26,-1393.17"/>
+<polygon fill="none" stroke="black" points="203.7,-1392.51 198.81,-1383.1 196.77,-1393.5 203.7,-1392.51"/>
+</g>
+<!-- node49&#45;&gt;node14 -->
+<g id="edge34" class="edge">
+<title>node49&#45;&gt;node14</title>
+<path fill="none" stroke="black" d="M766.85,-1585.98C763.91,-1582.9 760.95,-1579.9 758,-1577 739.97,-1559.29 725.76,-1563.36 714,-1541 665.52,-1448.83 745.07,-1151.04 675,-1074 614.23,-1007.18 543.04,-1097.39 475,-1038 474.52,-1037.58 474.05,-1037.16 473.58,-1036.74"/>
+<polygon fill="black" stroke="black" points="475.81,-1034.04 466.15,-1029.7 471,-1039.12 475.81,-1034.04"/>
+</g>
+<!-- node49&#45;&gt;node15 -->
+<g id="edge35" class="edge">
+<title>node49&#45;&gt;node15</title>
+<path fill="none" stroke="black" d="M771.07,-1584.98C766.9,-1581.96 762.54,-1579.26 758,-1577 630.27,-1513.45 227.83,-1630.84 117,-1541 83.84,-1514.12 67.11,-1471.72 58.97,-1430.44"/>
+<polygon fill="black" stroke="black" points="62.41,-1429.76 57.18,-1420.54 55.52,-1431.01 62.41,-1429.76"/>
+</g>
+<!-- node49&#45;&gt;node16 -->
+<g id="edge36" class="edge">
+<title>node49&#45;&gt;node16</title>
+<path fill="none" stroke="black" d="M770.47,-1584.91C766.48,-1581.96 762.32,-1579.29 758,-1577 691.63,-1541.86 480.26,-1588.38 422,-1541 376.03,-1503.62 357.9,-1437.81 350.91,-1385.72"/>
+<polygon fill="black" stroke="black" points="354.35,-1385 349.66,-1375.5 347.4,-1385.85 354.35,-1385"/>
+</g>
+<!-- node49&#45;&gt;node17 -->
+<g id="edge37" class="edge">
+<title>node49&#45;&gt;node17</title>
+<path fill="none" stroke="black" d="M889.29,-1649.97C986.8,-1633.79 1182.45,-1597.13 1341,-1541 1483.39,-1490.59 1639.05,-1409.38 1732.58,-1357.5"/>
+<polygon fill="black" stroke="black" points="1734.4,-1360.49 1741.43,-1352.57 1730.99,-1354.38 1734.4,-1360.49"/>
+</g>
+<!-- node49&#45;&gt;node22 -->
+<g id="edge38" class="edge">
+<title>node49&#45;&gt;node22</title>
+<path fill="none" stroke="black" d="M889.22,-1659.39C1128.57,-1658.2 2000.19,-1646.56 2252,-1541 2322.14,-1511.59 2387.19,-1456.8 2435.86,-1407.79"/>
+<polygon fill="none" stroke="black" points="2438.41,-1410.19 2442.92,-1400.61 2433.41,-1405.29 2438.41,-1410.19"/>
+</g>
+<!-- node49&#45;&gt;node23 -->
+<g id="edge39" class="edge">
+<title>node49&#45;&gt;node23</title>
+<path fill="none" stroke="black" d="M889.13,-1605.65C907.81,-1586.71 927.07,-1564.3 941,-1541 961.15,-1507.29 976.66,-1467.59 988.26,-1430.63"/>
+<polygon fill="none" stroke="black" points="991.69,-1431.38 991.27,-1420.79 984.99,-1429.33 991.69,-1431.38"/>
+</g>
+<!-- node49&#45;&gt;node48 -->
+<g id="edge40" class="edge">
+<title>node49&#45;&gt;node48</title>
+<path fill="none" stroke="black" d="M828,-1584.63C828,-1574.01 828,-1562.66 828,-1550.82"/>
+<polygon fill="none" stroke="black" points="831.5,-1550.77 828,-1540.77 824.5,-1550.77 831.5,-1550.77"/>
+</g>
+<!-- node50 -->
+<g id="node44" class="node">
+<title>node50</title>
+<polygon fill="white" stroke="black" points="1237.5,-1247 1237.5,-1368 1332.5,-1368 1332.5,-1247 1237.5,-1247"/>
+<text text-anchor="middle" x="1285" y="-1352.8" font-family="Times,serif" font-size="14.00">Strain</text>
+<polyline fill="none" stroke="black" points="1237.5,-1345 1332.5,-1345 "/>
+<text text-anchor="start" x="1245.5" y="-1329.8" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="1245.5" y="-1314.8" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="1245.5" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; Name2</text>
+<text text-anchor="start" x="1245.5" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; SpeciesId</text>
+<text text-anchor="start" x="1245.5" y="-1269.8" font-family="Times,serif" font-size="14.00">&#45; Symbol</text>
+<text text-anchor="start" x="1245.5" y="-1254.8" font-family="Times,serif" font-size="14.00">&#45; Alias</text>
+</g>
+<!-- node49&#45;&gt;node50 -->
+<g id="edge41" class="edge">
+<title>node49&#45;&gt;node50</title>
+<path fill="none" stroke="black" d="M889.09,-1641C945.49,-1621.95 1029.71,-1588.35 1092,-1541 1152.33,-1495.14 1206.03,-1427 1241.37,-1376.33"/>
+<polygon fill="black" stroke="black" points="1244.29,-1378.26 1247.1,-1368.04 1238.54,-1374.28 1244.29,-1378.26"/>
+</g>
+<!-- node50&#45;&gt;node2 -->
+<g id="edge42" class="edge">
+<title>node50&#45;&gt;node2</title>
+<path fill="none" stroke="black" d="M1237.32,-1258.22C1189.7,-1207.44 1117.63,-1123.21 1075,-1038 1041.67,-971.37 1021.71,-888.08 1010.86,-830.22"/>
+<polygon fill="none" stroke="black" points="1014.24,-829.29 1009,-820.09 1007.36,-830.55 1014.24,-829.29"/>
+</g>
+<!-- node50&#45;&gt;node4 -->
+<g id="edge43" class="edge">
+<title>node50&#45;&gt;node4</title>
+<path fill="none" stroke="black" d="M1332.76,-1272.93C1411.6,-1219.6 1575.8,-1117.15 1732,-1074 1796.91,-1056.07 2283.93,-1079.46 2337,-1038 2404.79,-985.04 2420.88,-879.65 2424.06,-815.08"/>
+<polygon fill="black" stroke="black" points="2427.56,-815.22 2424.47,-805.08 2420.57,-814.93 2427.56,-815.22"/>
+</g>
+<!-- node50&#45;&gt;node5 -->
+<g id="edge44" class="edge">
+<title>node50&#45;&gt;node5</title>
+<path fill="none" stroke="black" d="M1332.5,-1275.8C1411.95,-1225.86 1578.26,-1127.25 1732,-1074 1813.21,-1045.87 1853.42,-1089.8 1922,-1038 1994.96,-982.9 2032.26,-878.94 2049.13,-815.09"/>
+<polygon fill="black" stroke="black" points="2052.57,-815.75 2051.66,-805.2 2045.79,-814.02 2052.57,-815.75"/>
+</g>
+<!-- node50&#45;&gt;node18 -->
+<g id="edge45" class="edge">
+<title>node50&#45;&gt;node18</title>
+<path fill="none" stroke="black" d="M1258.27,-1246.79C1235.11,-1193.07 1202.07,-1111.52 1181,-1038 1158.23,-958.55 1142.47,-863.46 1134.36,-807.74"/>
+<polygon fill="black" stroke="black" points="1137.82,-807.21 1132.93,-797.81 1130.89,-808.2 1137.82,-807.21"/>
+</g>
+<!-- node50&#45;&gt;node24 -->
+<g id="edge46" class="edge">
+<title>node50&#45;&gt;node24</title>
+<path fill="none" stroke="black" d="M1254.06,-1246.76C1221.79,-1191.31 1165.61,-1111.82 1092,-1074 991.93,-1022.59 671.48,-1112.31 587,-1038 521.98,-980.81 519.93,-870.89 524.98,-807.92"/>
+<polygon fill="black" stroke="black" points="528.47,-808.13 525.87,-797.86 521.5,-807.5 528.47,-808.13"/>
+</g>
+<!-- node50&#45;&gt;node28 -->
+<g id="edge47" class="edge">
+<title>node50&#45;&gt;node28</title>
+<path fill="none" stroke="black" d="M1279.2,-1246.77C1268.58,-1137.33 1246.2,-906.81 1236.57,-807.57"/>
+<polygon fill="none" stroke="black" points="1240.05,-807.15 1235.6,-797.54 1233.08,-807.83 1240.05,-807.15"/>
+</g>
+<!-- node50&#45;&gt;node33 -->
+<g id="edge48" class="edge">
+<title>node50&#45;&gt;node33</title>
+<path fill="none" stroke="black" d="M1290.8,-1246.77C1301.42,-1137.33 1323.8,-906.81 1333.43,-807.57"/>
+<polygon fill="black" stroke="black" points="1336.92,-807.83 1334.4,-797.54 1329.95,-807.15 1336.92,-807.83"/>
+</g>
+<!-- node50&#45;&gt;node36 -->
+<g id="edge49" class="edge">
+<title>node50&#45;&gt;node36</title>
+<path fill="none" stroke="black" d="M1312.99,-1246.94C1337.2,-1193.32 1371.6,-1111.84 1393,-1038 1415.98,-958.72 1430.8,-863.57 1438.25,-807.8"/>
+<polygon fill="black" stroke="black" points="1441.73,-808.23 1439.56,-797.86 1434.79,-807.32 1441.73,-808.23"/>
+</g>
+<!-- node50&#45;&gt;node38 -->
+<g id="edge50" class="edge">
+<title>node50&#45;&gt;node38</title>
+<path fill="none" stroke="black" d="M1332.57,-1286.63C1414.1,-1250.03 1580.05,-1164.01 1666,-1038 1713.99,-967.64 1728.19,-866.84 1732.35,-808.08"/>
+<polygon fill="black" stroke="black" points="1735.85,-808.16 1732.99,-797.96 1728.86,-807.72 1735.85,-808.16"/>
+</g>
+<!-- node50&#45;&gt;node40 -->
+<g id="edge51" class="edge">
+<title>node50&#45;&gt;node40</title>
+<path fill="none" stroke="black" d="M1332.59,-1281.76C1460.27,-1215.37 1800.75,-1038.33 1801,-1038 1852.79,-970.4 1862.47,-867.78 1863.28,-808.11"/>
+<polygon fill="black" stroke="black" points="1866.78,-807.86 1863.34,-797.84 1859.78,-807.82 1866.78,-807.86"/>
+</g>
+<!-- node50&#45;&gt;node44 -->
+<g id="edge52" class="edge">
+<title>node50&#45;&gt;node44</title>
+<path fill="none" stroke="black" d="M1253.72,-1246.86C1221.28,-1191.69 1165.06,-1112.58 1092,-1074 1016.41,-1034.08 773.04,-1094.63 709,-1038 643.89,-980.43 639.51,-870.66 643.11,-807.81"/>
+<polygon fill="black" stroke="black" points="646.6,-807.97 643.77,-797.77 639.62,-807.51 646.6,-807.97"/>
+</g>
+<!-- node50&#45;&gt;node46 -->
+<g id="edge53" class="edge">
+<title>node50&#45;&gt;node46</title>
+<path fill="none" stroke="black" d="M1253.09,-1246.93C1220.37,-1192.21 1164.12,-1113.78 1092,-1074 984.07,-1014.46 906.82,-1122.42 817,-1038 754.15,-978.94 752.14,-870.21 757.06,-807.83"/>
+<polygon fill="black" stroke="black" points="760.55,-808.13 757.94,-797.86 753.57,-807.51 760.55,-808.13"/>
+</g>
+<!-- node50&#45;&gt;node51 -->
+<g id="edge54" class="edge">
+<title>node50&#45;&gt;node51</title>
+<path fill="none" stroke="black" d="M1332.57,-1273.58C1411.45,-1220.92 1576.13,-1119.1 1732,-1074 1823.9,-1047.41 2086.23,-1097.69 2161,-1038 2225.58,-986.44 2243.57,-887.55 2248.13,-822.81"/>
+<polygon fill="black" stroke="black" points="2251.63,-822.92 2248.75,-812.73 2244.64,-822.49 2251.63,-822.92"/>
+</g>
+<!-- node55 -->
+<g id="node47" class="node">
+<title>node55</title>
+<polygon fill="white" stroke="black" points="826.5,-706.5 826.5,-812.5 915.5,-812.5 915.5,-706.5 826.5,-706.5"/>
+<text text-anchor="middle" x="871" y="-797.3" font-family="Times,serif" font-size="14.00">TempData</text>
+<polyline fill="none" stroke="black" points="826.5,-789.5 915.5,-789.5 "/>
+<text text-anchor="start" x="834.5" y="-774.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="834.5" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="834.5" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; value</text>
+<text text-anchor="start" x="834.5" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; SE</text>
+<text text-anchor="start" x="834.5" y="-714.3" font-family="Times,serif" font-size="14.00">&#45; NStrain</text>
+</g>
+<!-- node50&#45;&gt;node55 -->
+<g id="edge55" class="edge">
+<title>node50&#45;&gt;node55</title>
+<path fill="none" stroke="black" d="M1251.54,-1246.93C1218.18,-1193.21 1161.89,-1116.32 1092,-1074 1026.68,-1034.44 977.39,-1092.6 924,-1038 868.62,-981.36 862.02,-885.74 864.7,-822.86"/>
+<polygon fill="black" stroke="black" points="868.2,-822.84 865.22,-812.68 861.21,-822.48 868.2,-822.84"/>
+</g>
+<!-- node57 -->
+<g id="node49" class="node">
+<title>node57</title>
+<polygon fill="white" stroke="black" points="1504.5,-684 1504.5,-835 1657.5,-835 1657.5,-684 1504.5,-684"/>
+<text text-anchor="middle" x="1581" y="-819.8" font-family="Times,serif" font-size="14.00">TissueProbeFreeze</text>
+<polyline fill="none" stroke="black" points="1504.5,-812 1657.5,-812 "/>
+<text text-anchor="start" x="1512.5" y="-796.8" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="1512.5" y="-781.8" font-family="Times,serif" font-size="14.00">&#45; ChipId</text>
+<text text-anchor="start" x="1512.5" y="-766.8" font-family="Times,serif" font-size="14.00">&#45; StrainId</text>
+<text text-anchor="start" x="1512.5" y="-751.8" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="1512.5" y="-736.8" font-family="Times,serif" font-size="14.00">&#45; FullName</text>
+<text text-anchor="start" x="1512.5" y="-721.8" font-family="Times,serif" font-size="14.00">&#45; ShortName</text>
+<text text-anchor="start" x="1512.5" y="-706.8" font-family="Times,serif" font-size="14.00">&#45; CreateTime</text>
+<text text-anchor="start" x="1512.5" y="-691.8" font-family="Times,serif" font-size="14.00">&#45; InbredSetId</text>
+</g>
+<!-- node50&#45;&gt;node57 -->
+<g id="edge56" class="edge">
+<title>node50&#45;&gt;node57</title>
+<path fill="none" stroke="black" d="M1332.92,-1256.94C1380.04,-1205.8 1451.1,-1121.89 1495,-1038 1526.99,-976.87 1549.35,-901.84 1563.23,-845.22"/>
+<polygon fill="black" stroke="black" points="1566.7,-845.77 1565.64,-835.22 1559.9,-844.13 1566.7,-845.77"/>
+</g>
+<!-- node56 -->
+<g id="node48" class="node">
+<title>node56</title>
+<polygon fill="white" stroke="black" points="1880,-2253 1880,-2389 2020,-2389 2020,-2253 1880,-2253"/>
+<text text-anchor="middle" x="1950" y="-2373.8" font-family="Times,serif" font-size="14.00">Tissue</text>
+<polyline fill="none" stroke="black" points="1880,-2366 2020,-2366 "/>
+<text text-anchor="start" x="1888" y="-2350.8" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="1888" y="-2335.8" font-family="Times,serif" font-size="14.00">&#45; TissueId</text>
+<text text-anchor="start" x="1888" y="-2320.8" font-family="Times,serif" font-size="14.00">&#45; TissueName</text>
+<text text-anchor="start" x="1888" y="-2305.8" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="1888" y="-2290.8" font-family="Times,serif" font-size="14.00">&#45; Short_Name</text>
+<text text-anchor="start" x="1888" y="-2275.8" font-family="Times,serif" font-size="14.00">&#45; BIRN_lex_ID</text>
+<text text-anchor="start" x="1888" y="-2260.8" font-family="Times,serif" font-size="14.00">&#45; BIRN_lex_Name</text>
+</g>
+<!-- node56&#45;&gt;node34 -->
+<g id="edge57" class="edge">
+<title>node56&#45;&gt;node34</title>
+<path fill="none" stroke="black" d="M2020.32,-2281.51C2231.98,-2165.65 2861.84,-1820.87 3078.68,-1702.18"/>
+<polygon fill="black" stroke="black" points="3080.36,-1705.25 3087.45,-1697.38 3077,-1699.11 3080.36,-1705.25"/>
+</g>
+<!-- node58 -->
+<g id="node50" class="node">
+<title>node58</title>
+<polygon fill="white" stroke="black" points="587,-1622.5 587,-1698.5 749,-1698.5 749,-1622.5 587,-1622.5"/>
+<text text-anchor="middle" x="668" y="-1683.3" font-family="Times,serif" font-size="14.00">TissueProbeSetData</text>
+<polyline fill="none" stroke="black" points="587,-1675.5 749,-1675.5 "/>
+<text text-anchor="start" x="595" y="-1660.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="595" y="-1645.3" font-family="Times,serif" font-size="14.00">&#45; TissueID</text>
+<text text-anchor="start" x="595" y="-1630.3" font-family="Times,serif" font-size="14.00">&#45; value</text>
+</g>
+<!-- node56&#45;&gt;node58 -->
+<g id="edge58" class="edge">
+<title>node56&#45;&gt;node58</title>
+<path fill="none" stroke="black" d="M1879.67,-2294.38C1689.38,-2223.36 1152.2,-2011.4 758,-1744 741.72,-1732.96 725.41,-1719.08 711.24,-1705.87"/>
+<polygon fill="black" stroke="black" points="713.27,-1702.96 703.6,-1698.62 708.45,-1708.04 713.27,-1702.96"/>
+</g>
+<!-- node59 -->
+<g id="node51" class="node">
+<title>node59</title>
+<polygon fill="white" stroke="black" points="1981.5,-248.5 1981.5,-444.5 2158.5,-444.5 2158.5,-248.5 1981.5,-248.5"/>
+<text text-anchor="middle" x="2070" y="-429.3" font-family="Times,serif" font-size="14.00">TissueProbeSetFreeze</text>
+<polyline fill="none" stroke="black" points="1981.5,-421.5 2158.5,-421.5 "/>
+<text text-anchor="start" x="1989.5" y="-406.3" font-family="Times,serif" font-size="14.00">&#45; Id</text>
+<text text-anchor="start" x="1989.5" y="-391.3" font-family="Times,serif" font-size="14.00">&#45; TissueProbeFreezeId</text>
+<text text-anchor="start" x="1989.5" y="-376.3" font-family="Times,serif" font-size="14.00">&#45; AvgID</text>
+<text text-anchor="start" x="1989.5" y="-361.3" font-family="Times,serif" font-size="14.00">&#45; Name</text>
+<text text-anchor="start" x="1989.5" y="-346.3" font-family="Times,serif" font-size="14.00">&#45; Name2</text>
+<text text-anchor="start" x="1989.5" y="-331.3" font-family="Times,serif" font-size="14.00">&#45; FullName</text>
+<text text-anchor="start" x="1989.5" y="-316.3" font-family="Times,serif" font-size="14.00">&#45; ShortName</text>
+<text text-anchor="start" x="1989.5" y="-301.3" font-family="Times,serif" font-size="14.00">&#45; CreateTime</text>
+<text text-anchor="start" x="1989.5" y="-286.3" font-family="Times,serif" font-size="14.00">&#45; public</text>
+<text text-anchor="start" x="1989.5" y="-271.3" font-family="Times,serif" font-size="14.00">&#45; confidentiality</text>
+<text text-anchor="start" x="1989.5" y="-256.3" font-family="Times,serif" font-size="14.00">&#45; AuthorisedUsers</text>
+</g>
+<!-- node57&#45;&gt;node59 -->
+<g id="edge59" class="edge">
+<title>node57&#45;&gt;node59</title>
+<path fill="none" stroke="black" d="M1585.66,-683.88C1593.4,-621.86 1613.76,-535.28 1667,-481 1747.71,-398.71 1880.2,-367.14 1971.09,-355.03"/>
+<polygon fill="black" stroke="black" points="1971.66,-358.49 1981.14,-353.75 1970.77,-351.54 1971.66,-358.49"/>
+</g>
+<!-- node59&#45;&gt;node60 -->
+<g id="edge60" class="edge">
+<title>node59&#45;&gt;node60</title>
+<path fill="none" stroke="black" d="M2158.74,-289.8C2188.32,-273.7 2222.13,-257.84 2255,-248 2505.22,-173.09 3294.44,-127.4 3592.5,-112.44"/>
+<polygon fill="black" stroke="black" points="3593.08,-115.92 3602.9,-111.92 3592.73,-108.93 3593.08,-115.92"/>
+</g>
+<!-- node61 -->
+<g id="node53" class="node">
+<title>node61</title>
+<polygon fill="white" stroke="black" points="3915.5,-3003.5 3915.5,-3064.5 4034.5,-3064.5 4034.5,-3003.5 3915.5,-3003.5"/>
+<text text-anchor="middle" x="3975" y="-3049.3" font-family="Times,serif" font-size="14.00">TraitMetadata</text>
+<polyline fill="none" stroke="black" points="3915.5,-3041.5 4034.5,-3041.5 "/>
+<text text-anchor="start" x="3923.5" y="-3026.3" font-family="Times,serif" font-size="14.00">&#45; type</text>
+<text text-anchor="start" x="3923.5" y="-3011.3" font-family="Times,serif" font-size="14.00">&#45; value</text>
+</g>
+<!-- node30 -->
+<g id="node54" class="node">
+<title>node30</title>
+<polygon fill="white" stroke="black" points="4846,-1277 4846,-1338 5006,-1338 5006,-1277 4846,-1277"/>
+<text text-anchor="middle" x="4926" y="-1322.8" font-family="Times,serif" font-size="14.00">Organizations</text>
+<polyline fill="none" stroke="black" points="4846,-1315 5006,-1315 "/>
+<text text-anchor="start" x="4854" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; OrganizationId</text>
+<text text-anchor="start" x="4854" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; OrganizationName</text>
+</g>
+<!-- node25 -->
+<g id="node55" class="node">
+<title>node25</title>
+<polygon fill="white" stroke="black" points="4867,-624 4867,-895 4999,-895 4999,-624 4867,-624"/>
+<text text-anchor="middle" x="4933" y="-879.8" font-family="Times,serif" font-size="14.00">Investigators</text>
+<polyline fill="none" stroke="black" points="4867,-872 4999,-872 "/>
+<text text-anchor="start" x="4875" y="-856.8" font-family="Times,serif" font-size="14.00">&#45; FirstName</text>
+<text text-anchor="start" x="4875" y="-841.8" font-family="Times,serif" font-size="14.00">&#45; LastName</text>
+<text text-anchor="start" x="4875" y="-826.8" font-family="Times,serif" font-size="14.00">&#45; Address</text>
+<text text-anchor="start" x="4875" y="-811.8" font-family="Times,serif" font-size="14.00">&#45; City</text>
+<text text-anchor="start" x="4875" y="-796.8" font-family="Times,serif" font-size="14.00">&#45; State</text>
+<text text-anchor="start" x="4875" y="-781.8" font-family="Times,serif" font-size="14.00">&#45; ZipCode</text>
+<text text-anchor="start" x="4875" y="-766.8" font-family="Times,serif" font-size="14.00">&#45; Phone</text>
+<text text-anchor="start" x="4875" y="-751.8" font-family="Times,serif" font-size="14.00">&#45; Email</text>
+<text text-anchor="start" x="4875" y="-736.8" font-family="Times,serif" font-size="14.00">&#45; Country</text>
+<text text-anchor="start" x="4875" y="-721.8" font-family="Times,serif" font-size="14.00">&#45; Url</text>
+<text text-anchor="start" x="4875" y="-706.8" font-family="Times,serif" font-size="14.00">&#45; UserName</text>
+<text text-anchor="start" x="4875" y="-691.8" font-family="Times,serif" font-size="14.00">&#45; UserPass</text>
+<text text-anchor="start" x="4875" y="-676.8" font-family="Times,serif" font-size="14.00">&#45; UserDate</text>
+<text text-anchor="start" x="4875" y="-661.8" font-family="Times,serif" font-size="14.00">&#45; UserLevel</text>
+<text text-anchor="start" x="4875" y="-646.8" font-family="Times,serif" font-size="14.00">&#45; OrganizationId</text>
+<text text-anchor="start" x="4875" y="-631.8" font-family="Times,serif" font-size="14.00">&#45; InvestigatorId</text>
+</g>
+<!-- node30&#45;&gt;node25 -->
+<g id="edge18" class="edge">
+<title>node30&#45;&gt;node25</title>
+<path fill="none" stroke="black" d="M4926.38,-1276.76C4927.27,-1207.64 4929.51,-1032.4 4931.14,-905.23"/>
+<polygon fill="black" stroke="black" points="4934.65,-905.05 4931.28,-895.01 4927.65,-904.96 4934.65,-905.05"/>
+</g>
+<!-- node62 -->
+<g id="node57" class="node">
+<title>node62</title>
+<polygon fill="white" stroke="black" points="4562.5,-1217 4562.5,-1398 4665.5,-1398 4665.5,-1217 4562.5,-1217"/>
+<text text-anchor="middle" x="4614" y="-1382.8" font-family="Times,serif" font-size="14.00">User</text>
+<polyline fill="none" stroke="black" points="4562.5,-1375 4665.5,-1375 "/>
+<text text-anchor="start" x="4570.5" y="-1359.8" font-family="Times,serif" font-size="14.00">&#45; id</text>
+<text text-anchor="start" x="4570.5" y="-1344.8" font-family="Times,serif" font-size="14.00">&#45; name</text>
+<text text-anchor="start" x="4570.5" y="-1329.8" font-family="Times,serif" font-size="14.00">&#45; password</text>
+<text text-anchor="start" x="4570.5" y="-1314.8" font-family="Times,serif" font-size="14.00">&#45; email</text>
+<text text-anchor="start" x="4570.5" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; createtime</text>
+<text text-anchor="start" x="4570.5" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; user_ip</text>
+<text text-anchor="start" x="4570.5" y="-1269.8" font-family="Times,serif" font-size="14.00">&#45; lastlogin</text>
+<text text-anchor="start" x="4570.5" y="-1254.8" font-family="Times,serif" font-size="14.00">&#45; disable</text>
+<text text-anchor="start" x="4570.5" y="-1239.8" font-family="Times,serif" font-size="14.00">&#45; privilege</text>
+<text text-anchor="start" x="4570.5" y="-1224.8" font-family="Times,serif" font-size="14.00">&#45; grpName</text>
+</g>
+<!-- node62&#45;&gt;node63 -->
+<g id="edge61" class="edge">
+<title>node62&#45;&gt;node63</title>
+<path fill="none" stroke="black" d="M4611.74,-1216.74C4605.82,-1168.38 4590.48,-1111.17 4553,-1074 4506.77,-1028.15 4471.02,-1063.23 4411,-1038 4258.65,-973.95 4097.4,-864.19 4013.83,-803.68"/>
+<polygon fill="black" stroke="black" points="4015.64,-800.67 4005.5,-797.63 4011.53,-806.34 4015.64,-800.67"/>
+</g>
+<!-- node67 -->
+<g id="node58" class="node">
+<title>node67</title>
+<polygon fill="white" stroke="black" points="4684,-1224.5 4684,-1390.5 4828,-1390.5 4828,-1224.5 4684,-1224.5"/>
+<text text-anchor="middle" x="4756" y="-1375.3" font-family="Times,serif" font-size="14.00">user</text>
+<polyline fill="none" stroke="black" points="4684,-1367.5 4828,-1367.5 "/>
+<text text-anchor="start" x="4692" y="-1352.3" font-family="Times,serif" font-size="14.00">&#45; id</text>
+<text text-anchor="start" x="4692" y="-1337.3" font-family="Times,serif" font-size="14.00">&#45; email_address</text>
+<text text-anchor="start" x="4692" y="-1322.3" font-family="Times,serif" font-size="14.00">&#45; password</text>
+<text text-anchor="start" x="4692" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; full_name</text>
+<text text-anchor="start" x="4692" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; organization</text>
+<text text-anchor="start" x="4692" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; active</text>
+<text text-anchor="start" x="4692" y="-1262.3" font-family="Times,serif" font-size="14.00">&#45; registration_info</text>
+<text text-anchor="start" x="4692" y="-1247.3" font-family="Times,serif" font-size="14.00">&#45; confirmed</text>
+<text text-anchor="start" x="4692" y="-1232.3" font-family="Times,serif" font-size="14.00">&#45; superuser</text>
+</g>
+<!-- node64 -->
+<g id="node59" class="node">
+<title>node64</title>
+<polygon fill="white" stroke="black" points="4735.5,-691.5 4735.5,-827.5 4848.5,-827.5 4848.5,-691.5 4735.5,-691.5"/>
+<text text-anchor="middle" x="4792" y="-812.3" font-family="Times,serif" font-size="14.00">login</text>
+<polyline fill="none" stroke="black" points="4735.5,-804.5 4848.5,-804.5 "/>
+<text text-anchor="start" x="4743.5" y="-789.3" font-family="Times,serif" font-size="14.00">&#45; id</text>
+<text text-anchor="start" x="4743.5" y="-774.3" font-family="Times,serif" font-size="14.00">&#45; user</text>
+<text text-anchor="start" x="4743.5" y="-759.3" font-family="Times,serif" font-size="14.00">&#45; timestamp</text>
+<text text-anchor="start" x="4743.5" y="-744.3" font-family="Times,serif" font-size="14.00">&#45; ip_address</text>
+<text text-anchor="start" x="4743.5" y="-729.3" font-family="Times,serif" font-size="14.00">&#45; successful</text>
+<text text-anchor="start" x="4743.5" y="-714.3" font-family="Times,serif" font-size="14.00">&#45; session_id</text>
+<text text-anchor="start" x="4743.5" y="-699.3" font-family="Times,serif" font-size="14.00">&#45; assumed_by</text>
+</g>
+<!-- node67&#45;&gt;node64 -->
+<g id="edge62" class="edge">
+<title>node67&#45;&gt;node64</title>
+<path fill="none" stroke="black" d="M4761.41,-1224.46C4768.31,-1119.84 4780.15,-940.26 4786.9,-837.9"/>
+<polygon fill="none" stroke="black" points="4790.41,-837.85 4787.57,-827.64 4783.42,-837.39 4790.41,-837.85"/>
+</g>
+<!-- node68 -->
+<g id="node60" class="node">
+<title>node68</title>
+<polygon fill="white" stroke="black" points="4419.5,-699 4419.5,-820 4588.5,-820 4588.5,-699 4419.5,-699"/>
+<text text-anchor="middle" x="4504" y="-804.8" font-family="Times,serif" font-size="14.00">user_collection</text>
+<polyline fill="none" stroke="black" points="4419.5,-797 4588.5,-797 "/>
+<text text-anchor="start" x="4427.5" y="-781.8" font-family="Times,serif" font-size="14.00">&#45; id</text>
+<text text-anchor="start" x="4427.5" y="-766.8" font-family="Times,serif" font-size="14.00">&#45; user</text>
+<text text-anchor="start" x="4427.5" y="-751.8" font-family="Times,serif" font-size="14.00">&#45; name</text>
+<text text-anchor="start" x="4427.5" y="-736.8" font-family="Times,serif" font-size="14.00">&#45; created_timestamp</text>
+<text text-anchor="start" x="4427.5" y="-721.8" font-family="Times,serif" font-size="14.00">&#45; changed_timestamp</text>
+<text text-anchor="start" x="4427.5" y="-706.8" font-family="Times,serif" font-size="14.00">&#45; members</text>
+</g>
+<!-- node67&#45;&gt;node68 -->
+<g id="edge63" class="edge">
+<title>node67&#45;&gt;node68</title>
+<path fill="none" stroke="black" d="M4743.82,-1224.34C4732.93,-1175.7 4712.59,-1115.64 4675,-1074 4649.68,-1045.96 4623.19,-1066.15 4598,-1038 4545.86,-979.75 4522.45,-891.42 4512.06,-830.12"/>
+<polygon fill="none" stroke="black" points="4515.5,-829.46 4510.44,-820.15 4508.59,-830.58 4515.5,-829.46"/>
+</g>
+<!-- node69 -->
+<g id="node61" class="node">
+<title>node69</title>
+<polygon fill="white" stroke="black" points="4607,-729 4607,-790 4717,-790 4717,-729 4607,-729"/>
+<text text-anchor="middle" x="4662" y="-774.8" font-family="Times,serif" font-size="14.00">user_openids</text>
+<polyline fill="none" stroke="black" points="4607,-767 4717,-767 "/>
+<text text-anchor="start" x="4615" y="-751.8" font-family="Times,serif" font-size="14.00">&#45; openid_url</text>
+<text text-anchor="start" x="4615" y="-736.8" font-family="Times,serif" font-size="14.00">&#45; user_id</text>
+</g>
+<!-- node67&#45;&gt;node69 -->
+<g id="edge64" class="edge">
+<title>node67&#45;&gt;node69</title>
+<path fill="none" stroke="black" d="M4741.88,-1224.46C4721.37,-1105.34 4684.13,-889.02 4668.83,-800.19"/>
+<polygon fill="black" stroke="black" points="4672.27,-799.52 4667.12,-790.26 4665.37,-800.7 4672.27,-799.52"/>
+</g>
+<!-- node1 -->
+<g id="node62" class="node">
+<title>node1</title>
+<polygon fill="white" stroke="black" points="4440,-1269.5 4440,-1345.5 4544,-1345.5 4544,-1269.5 4440,-1269.5"/>
+<text text-anchor="middle" x="4492" y="-1330.3" font-family="Times,serif" font-size="14.00">AccessLog</text>
+<polyline fill="none" stroke="black" points="4440,-1322.5 4544,-1322.5 "/>
+<text text-anchor="start" x="4448" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; id</text>
+<text text-anchor="start" x="4448" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; accesstime</text>
+<text text-anchor="start" x="4448" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; ip_address</text>
+</g>
+<!-- node9 -->
+<g id="node63" class="node">
+<title>node9</title>
+<polygon fill="white" stroke="black" points="4342,-1262 4342,-1353 4422,-1353 4422,-1262 4342,-1262"/>
+<text text-anchor="middle" x="4382" y="-1337.8" font-family="Times,serif" font-size="14.00">Docs</text>
+<polyline fill="none" stroke="black" points="4342,-1330 4422,-1330 "/>
+<text text-anchor="start" x="4350" y="-1314.8" font-family="Times,serif" font-size="14.00">&#45; id</text>
+<text text-anchor="start" x="4350" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; entry</text>
+<text text-anchor="start" x="4350" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; title</text>
+<text text-anchor="start" x="4350" y="-1269.8" font-family="Times,serif" font-size="14.00">&#45; content</text>
+</g>
+<!-- node26 -->
+<g id="node64" class="node">
+<title>node26</title>
+<polygon fill="white" stroke="black" points="4172,-1247 4172,-1368 4324,-1368 4324,-1247 4172,-1247"/>
+<text text-anchor="middle" x="4248" y="-1352.8" font-family="Times,serif" font-size="14.00">MachineAccessLog</text>
+<polyline fill="none" stroke="black" points="4172,-1345 4324,-1345 "/>
+<text text-anchor="start" x="4180" y="-1329.8" font-family="Times,serif" font-size="14.00">&#45; id</text>
+<text text-anchor="start" x="4180" y="-1314.8" font-family="Times,serif" font-size="14.00">&#45; accesstime</text>
+<text text-anchor="start" x="4180" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; ip_address</text>
+<text text-anchor="start" x="4180" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; db_id</text>
+<text text-anchor="start" x="4180" y="-1269.8" font-family="Times,serif" font-size="14.00">&#45; data_id</text>
+<text text-anchor="start" x="4180" y="-1254.8" font-family="Times,serif" font-size="14.00">&#45; action</text>
+</g>
+<!-- node29 -->
+<g id="node65" class="node">
+<title>node29</title>
+<polygon fill="white" stroke="black" points="4080,-1269.5 4080,-1345.5 4154,-1345.5 4154,-1269.5 4080,-1269.5"/>
+<text text-anchor="middle" x="4117" y="-1330.3" font-family="Times,serif" font-size="14.00">News</text>
+<polyline fill="none" stroke="black" points="4080,-1322.5 4154,-1322.5 "/>
+<text text-anchor="start" x="4088" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; id</text>
+<text text-anchor="start" x="4088" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; date</text>
+<text text-anchor="start" x="4088" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; details</text>
+</g>
+<!-- node52 -->
+<g id="node66" class="node">
+<title>node52</title>
+<polygon fill="white" stroke="black" points="3930.5,-1277 3930.5,-1338 4061.5,-1338 4061.5,-1277 3930.5,-1277"/>
+<text text-anchor="middle" x="3996" y="-1322.8" font-family="Times,serif" font-size="14.00">TableComments</text>
+<polyline fill="none" stroke="black" points="3930.5,-1315 4061.5,-1315 "/>
+<text text-anchor="start" x="3938.5" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; TableName</text>
+<text text-anchor="start" x="3938.5" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; Comment</text>
+</g>
+<!-- node53 -->
+<g id="node67" class="node">
+<title>node53</title>
+<polygon fill="white" stroke="black" points="3743.5,-1269.5 3743.5,-1345.5 3912.5,-1345.5 3912.5,-1269.5 3743.5,-1269.5"/>
+<text text-anchor="middle" x="3828" y="-1330.3" font-family="Times,serif" font-size="14.00">TableFieldAnnotation</text>
+<polyline fill="none" stroke="black" points="3743.5,-1322.5 3912.5,-1322.5 "/>
+<text text-anchor="start" x="3751.5" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; TableField</text>
+<text text-anchor="start" x="3751.5" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; Foreign_Key</text>
+<text text-anchor="start" x="3751.5" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; Annotation</text>
+</g>
+<!-- node65 -->
+<g id="node68" class="node">
+<title>node65</title>
+<polygon fill="white" stroke="black" points="3619,-1269.5 3619,-1345.5 3725,-1345.5 3725,-1269.5 3619,-1269.5"/>
+<text text-anchor="middle" x="3672" y="-1330.3" font-family="Times,serif" font-size="14.00">role</text>
+<polyline fill="none" stroke="black" points="3619,-1322.5 3725,-1322.5 "/>
+<text text-anchor="start" x="3627" y="-1307.3" font-family="Times,serif" font-size="14.00">&#45; the_id</text>
+<text text-anchor="start" x="3627" y="-1292.3" font-family="Times,serif" font-size="14.00">&#45; name</text>
+<text text-anchor="start" x="3627" y="-1277.3" font-family="Times,serif" font-size="14.00">&#45; description</text>
+</g>
+<!-- node66 -->
+<g id="node69" class="node">
+<title>node66</title>
+<polygon fill="white" stroke="black" points="3503,-1277 3503,-1338 3601,-1338 3601,-1277 3503,-1277"/>
+<text text-anchor="middle" x="3552" y="-1322.8" font-family="Times,serif" font-size="14.00">roles_users</text>
+<polyline fill="none" stroke="black" points="3503,-1315 3601,-1315 "/>
+<text text-anchor="start" x="3511" y="-1299.8" font-family="Times,serif" font-size="14.00">&#45; user_id</text>
+<text text-anchor="start" x="3511" y="-1284.8" font-family="Times,serif" font-size="14.00">&#45; role_id</text>
+</g>
+</g>
+</svg>
diff --git a/sql/README.md b/sql/update/README.md
index 2f93d1c..2f93d1c 100644
--- a/sql/README.md
+++ b/sql/update/README.md
diff --git a/sql/metadata_audit.sql b/sql/update/metadata_audit.sql
index 514a2fc..5055666 100644
--- a/sql/metadata_audit.sql
+++ b/sql/update/metadata_audit.sql
@@ -26,4 +26,4 @@ CREATE TABLE metadata_audit (
json_diff_data VARCHAR(2048) NOT NULL,
time_stamp timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
CHECK (JSON_VALID(json_diff_data))
-);
+) CHARACTER SET 'utf8mb4';
diff --git a/tests/integration/test_correlation.py b/tests/integration/test_correlation.py
index e67f58d..bdd9bce 100644
--- a/tests/integration/test_correlation.py
+++ b/tests/integration/test_correlation.py
@@ -80,7 +80,7 @@ class CorrelationIntegrationTest(TestCase):
self.assertEqual(mock_compute_corr.call_count, 1)
self.assertEqual(response.status_code, 200)
- @mock.patch("gn3.api.correlation.compute_all_tissue_correlation")
+ @mock.patch("gn3.api.correlation.compute_tissue_correlation")
def test_tissue_correlation(self, mock_tissue_corr):
"""Test api/correlation/tissue_corr/{corr_method}"""
mock_tissue_corr.return_value = {}
diff --git a/tests/unit/computations/test_correlation.py b/tests/unit/computations/test_correlation.py
index b1bc6ef..fc52ec1 100644
--- a/tests/unit/computations/test_correlation.py
+++ b/tests/unit/computations/test_correlation.py
@@ -1,5 +1,4 @@
"""Module contains the tests for correlation"""
-import unittest
from unittest import TestCase
from unittest import mock
@@ -16,9 +15,10 @@ from gn3.computations.correlations import fetch_lit_correlation_data
from gn3.computations.correlations import query_formatter
from gn3.computations.correlations import map_to_mouse_gene_id
from gn3.computations.correlations import compute_all_lit_correlation
-from gn3.computations.correlations import compute_all_tissue_correlation
+from gn3.computations.correlations import compute_tissue_correlation
from gn3.computations.correlations import map_shared_keys_to_values
from gn3.computations.correlations import process_trait_symbol_dict
+from gn3.computations.correlations2 import compute_correlation
class QueryableMixin:
@@ -172,7 +172,6 @@ class TestCorrelation(TestCase):
self.assertEqual(results, (filtered_this_samplelist,
filtered_target_samplelist))
- @unittest.skip("Test needs to be refactored ")
@mock.patch("gn3.computations.correlations.compute_sample_r_correlation")
@mock.patch("gn3.computations.correlations.filter_shared_sample_keys")
def test_compute_all_sample(self, filter_shared_samples, sample_r_corr):
@@ -180,7 +179,7 @@ class TestCorrelation(TestCase):
filter_shared_samples.return_value = (["1.23", "6.565", "6.456"], [
"6.266", "6.565", "6.456"])
- sample_r_corr.return_value = ([-1.0, 0.9, 6])
+ sample_r_corr.return_value = (["1419792_at", -1.0, 0.9, 6])
this_trait_data = {
"trait_id": "1455376_at",
@@ -203,13 +202,14 @@ class TestCorrelation(TestCase):
}
]
- sample_all_results = [{"1419792_at": {"corr_coeffient": -1.0,
+ sample_all_results = [{"1419792_at": {"corr_coefficient": -1.0,
"p_value": 0.9,
"num_overlap": 6}}]
self.assertEqual(compute_all_sample_correlation(
this_trait=this_trait_data, target_dataset=traits_dataset), sample_all_results)
sample_r_corr.assert_called_once_with(
+ trait_name='1419792_at',
corr_method="pearson", trait_vals=['1.23', '6.565', '6.456'],
target_samples_vals=['6.266', '6.565', '6.456'])
filter_shared_samples.assert_called_once_with(
@@ -406,17 +406,17 @@ class TestCorrelation(TestCase):
target_tissue_data = {"trait_symbol_dict": target_trait_symbol,
"symbol_tissue_vals_dict": target_symbol_tissue_vals}
- mock_tissue_corr.side_effect = [{"tissue_corr": -0.5, "tissue_p_val": 0.9,
- "tissue_number": 3},
- {"tissue_corr": 1.11, "tissue_p_val": 0.2,
- "tissue_number": 3}]
+ mock_tissue_corr.side_effect = [{"1418702_a_at": {"tissue_corr": -0.5, "tissue_p_val": 0.9,
+ "tissue_number": 3}},
+ {"1412_at": {"tissue_corr": 1.11, "tissue_p_val": 0.2,
+ "tissue_number": 3}}]
expected_results = [{"1412_at":
{"tissue_corr": 1.11, "tissue_p_val": 0.2, "tissue_number": 3}},
{"1418702_a_at":
{"tissue_corr": -0.5, "tissue_p_val": 0.9, "tissue_number": 3}}]
- results = compute_all_tissue_correlation(
+ results = compute_tissue_correlation(
primary_tissue_dict=primary_tissue_dict,
target_tissues_data=target_tissue_data,
corr_method="pearson")
@@ -464,3 +464,31 @@ class TestCorrelation(TestCase):
trait_symbol_dict, tissue_values_dict)
self.assertEqual(results, [expected_results])
+
+ def test_compute_correlation(self):
+ """Test that the new correlation function works the same as the original
+ from genenetwork1."""
+ for dbdata, userdata, expected in [
+ [[None, None, None, None, None, None, None, None, None, None],
+ [None, None, None, None, None, None, None, None, None, None],
+ (0.0, 0)],
+ [[None, None, None, None, None, None, None, None, None, 0],
+ [None, None, None, None, None, None, None, None, None, None],
+ (0.0, 0)],
+ [[None, None, None, None, None, None, None, None, None, 0],
+ [None, None, None, None, None, None, None, None, None, 0],
+ (0.0, 1)],
+ [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ (0, 10)],
+ [[9.87, 9.87, 9.87, 9.87, 9.87, 9.87, 9.87, 9.87, 9.87, 9.87],
+ [9.87, 9.87, 9.87, 9.87, 9.87, 9.87, 9.87, 9.87, 9.87, 9.87],
+ (0.9999999999999998, 10)],
+ [[9.3, 2.2, 5.4, 7.2, 6.4, 7.6, 3.8, 1.8, 8.4, 0.2],
+ [0.6, 3.97, 5.82, 8.21, 1.65, 4.55, 6.72, 9.5, 7.33, 2.34],
+ (-0.12720361919462056, 10)],
+ [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
+ [None, None, None, None, 2, None, None, 3, None, None],
+ (0.0, 2)]]:
+ with self.subTest(dbdata=dbdata, userdata=userdata):
+ self.assertEqual(compute_correlation(
+ dbdata, userdata), expected)
diff --git a/tests/unit/computations/test_heatmap.py b/tests/unit/computations/test_heatmap.py
new file mode 100644
index 0000000..650cb45
--- /dev/null
+++ b/tests/unit/computations/test_heatmap.py
@@ -0,0 +1,143 @@
+"""Module contains tests for gn3.computations.heatmap"""
+from unittest import TestCase
+from gn3.computations.heatmap import cluster_traits, export_trait_data
+
+strainlist = ["B6cC3-1", "BXD1", "BXD12", "BXD16", "BXD19", "BXD2"]
+trait_data = {
+ "mysqlid": 36688172,
+ "data": {
+ "B6cC3-1": {"strain_name": "B6cC3-1", "value": 7.51879, "variance": None, "ndata": None},
+ "BXD1": {"strain_name": "BXD1", "value": 7.77141, "variance": None, "ndata": None},
+ "BXD12": {"strain_name": "BXD12", "value": 8.39265, "variance": None, "ndata": None},
+ "BXD16": {"strain_name": "BXD16", "value": 8.17443, "variance": None, "ndata": None},
+ "BXD19": {"strain_name": "BXD19", "value": 8.30401, "variance": None, "ndata": None},
+ "BXD2": {"strain_name": "BXD2", "value": 7.80944, "variance": None, "ndata": None},
+ "BXD21": {"strain_name": "BXD21", "value": 8.93809, "variance": None, "ndata": None},
+ "BXD24": {"strain_name": "BXD24", "value": 7.99415, "variance": None, "ndata": None},
+ "BXD27": {"strain_name": "BXD27", "value": 8.12177, "variance": None, "ndata": None},
+ "BXD28": {"strain_name": "BXD28", "value": 7.67688, "variance": None, "ndata": None},
+ "BXD32": {"strain_name": "BXD32", "value": 7.79062, "variance": None, "ndata": None},
+ "BXD39": {"strain_name": "BXD39", "value": 8.27641, "variance": None, "ndata": None},
+ "BXD40": {"strain_name": "BXD40", "value": 8.18012, "variance": None, "ndata": None},
+ "BXD42": {"strain_name": "BXD42", "value": 7.82433, "variance": None, "ndata": None},
+ "BXD6": {"strain_name": "BXD6", "value": 8.09718, "variance": None, "ndata": None},
+ "BXH14": {"strain_name": "BXH14", "value": 7.97475, "variance": None, "ndata": None},
+ "BXH19": {"strain_name": "BXH19", "value": 7.67223, "variance": None, "ndata": None},
+ "BXH2": {"strain_name": "BXH2", "value": 7.93622, "variance": None, "ndata": None},
+ "BXH22": {"strain_name": "BXH22", "value": 7.43692, "variance": None, "ndata": None},
+ "BXH4": {"strain_name": "BXH4", "value": 7.96336, "variance": None, "ndata": None},
+ "BXH6": {"strain_name": "BXH6", "value": 7.75132, "variance": None, "ndata": None},
+ "BXH7": {"strain_name": "BXH7", "value": 8.12927, "variance": None, "ndata": None},
+ "BXH8": {"strain_name": "BXH8", "value": 6.77338, "variance": None, "ndata": None},
+ "BXH9": {"strain_name": "BXH9", "value": 8.03836, "variance": None, "ndata": None},
+ "C3H/HeJ": {"strain_name": "C3H/HeJ", "value": 7.42795, "variance": None, "ndata": None},
+ "C57BL/6J": {"strain_name": "C57BL/6J", "value": 7.50606, "variance": None, "ndata": None},
+ "DBA/2J": {"strain_name": "DBA/2J", "value": 7.72588, "variance": None, "ndata": None}}}
+
+class TestHeatmap(TestCase):
+ """Class for testing heatmap computation functions"""
+
+ def test_export_trait_data_dtype(self):
+ """
+ Test `export_trait_data` with different values for the `dtype` keyword
+ argument
+ """
+ for dtype, expected in [
+ ["val", (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
+ ["var", (None, None, None, None, None, None)],
+ ["N", (None, None, None, None, None, None)],
+ ["all", (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)]]:
+ with self.subTest(dtype=dtype):
+ self.assertEqual(
+ export_trait_data(trait_data, strainlist, dtype=dtype),
+ expected)
+
+ def test_export_trait_data_dtype_all_flags(self):
+ """
+ Test `export_trait_data` with different values for the `dtype` keyword
+ argument and the different flags set up
+ """
+ for dtype, vflag, nflag, expected in [
+ ["val", False, False,
+ (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
+ ["val", False, True,
+ (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
+ ["val", True, False,
+ (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
+ ["val", True, True,
+ (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
+ ["var", False, False, (None, None, None, None, None, None)],
+ ["var", False, True, (None, None, None, None, None, None)],
+ ["var", True, False, (None, None, None, None, None, None)],
+ ["var", True, True, (None, None, None, None, None, None)],
+ ["N", False, False, (None, None, None, None, None, None)],
+ ["N", False, True, (None, None, None, None, None, None)],
+ ["N", True, False, (None, None, None, None, None, None)],
+ ["N", True, True, (None, None, None, None, None, None)],
+ ["all", False, False,
+ (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944)],
+ ["all", False, True,
+ (7.51879, None, 7.77141, None, 8.39265, None, 8.17443, None,
+ 8.30401, None, 7.80944, None)],
+ ["all", True, False,
+ (7.51879, None, 7.77141, None, 8.39265, None, 8.17443, None,
+ 8.30401, None, 7.80944, None)],
+ ["all", True, True,
+ (7.51879, None, None, 7.77141, None, None, 8.39265, None, None,
+ 8.17443, None, None, 8.30401, None, None, 7.80944, None, None)]
+ ]:
+ with self.subTest(dtype=dtype, vflag=vflag, nflag=nflag):
+ self.assertEqual(
+ export_trait_data(
+ trait_data, strainlist, dtype=dtype, var_exists=vflag,
+ n_exists=nflag),
+ expected)
+
+ def test_cluster_traits(self):
+ """
+ Test that the clustering is working as expected.
+ """
+ traits_data_list = [
+ (7.51879, 7.77141, 8.39265, 8.17443, 8.30401, 7.80944),
+ (6.1427, 6.50588, 7.73705, 6.68328, 7.49293, 7.27398),
+ (8.4211, 8.30581, 9.24076, 8.51173, 9.18455, 8.36077),
+ (10.0904, 10.6509, 9.36716, 9.91202, 8.57444, 10.5731),
+ (10.188, 9.76652, 9.54813, 9.05074, 9.52319, 9.10505),
+ (6.74676, 7.01029, 7.54169, 6.48574, 7.01427, 7.26815),
+ (6.39359, 6.85321, 5.78337, 7.11141, 6.22101, 6.16544),
+ (6.84118, 7.08432, 7.59844, 7.08229, 7.26774, 7.24991),
+ (9.45215, 10.6943, 8.64719, 10.1592, 7.75044, 8.78615),
+ (7.04737, 6.87185, 7.58586, 6.92456, 6.84243, 7.36913)]
+ self.assertEqual(
+ cluster_traits(traits_data_list),
+ ((0.0, 0.20337048635536847, 0.16381088984330505, 1.7388553629398245,
+ 1.5025235756329178, 0.6952839500255574, 1.271661230252733,
+ 0.2100487290977544, 1.4699690641062024, 0.7934461515867415),
+ (0.20337048635536847, 0.0, 0.2198321044997198, 1.5753041735592204,
+ 1.4815755944537086, 0.26087293140686374, 1.6939790104301427,
+ 0.06024619831474998, 1.7430082449189215, 0.4497104244247795),
+ (0.16381088984330505, 0.2198321044997198, 0.0, 1.9073926868549234,
+ 1.0396738891139845, 0.5278328671176757, 1.6275069061182947,
+ 0.2636503792482082, 1.739617877037615, 0.7127042590637039),
+ (1.7388553629398245, 1.5753041735592204, 1.9073926868549234, 0.0,
+ 0.9936846292920328, 1.1169999189889366, 0.6007483980555253,
+ 1.430209221053372, 0.25879514152086425, 0.9313185954797953),
+ (1.5025235756329178, 1.4815755944537086, 1.0396738891139845,
+ 0.9936846292920328, 0.0, 1.027827186339337, 1.1441743109173244,
+ 1.4122477962364253, 0.8968250491499363, 1.1683723389247052),
+ (0.6952839500255574, 0.26087293140686374, 0.5278328671176757,
+ 1.1169999189889366, 1.027827186339337, 0.0, 1.8420471110023269,
+ 0.19179284676938602, 1.4875072385631605, 0.23451785425383564),
+ (1.271661230252733, 1.6939790104301427, 1.6275069061182947,
+ 0.6007483980555253, 1.1441743109173244, 1.8420471110023269, 0.0,
+ 1.6540234785929928, 0.2140799896286565, 1.7413442197913358),
+ (0.2100487290977544, 0.06024619831474998, 0.2636503792482082,
+ 1.430209221053372, 1.4122477962364253, 0.19179284676938602,
+ 1.6540234785929928, 0.0, 1.5225640692832796, 0.33370067057028485),
+ (1.4699690641062024, 1.7430082449189215, 1.739617877037615,
+ 0.25879514152086425, 0.8968250491499363, 1.4875072385631605,
+ 0.2140799896286565, 1.5225640692832796, 0.0, 1.3256191648260216),
+ (0.7934461515867415, 0.4497104244247795, 0.7127042590637039,
+ 0.9313185954797953, 1.1683723389247052, 0.23451785425383564,
+ 1.7413442197913358, 0.33370067057028485, 1.3256191648260216,
+ 0.0)))
diff --git a/tests/unit/computations/test_slink.py b/tests/unit/computations/test_slink.py
new file mode 100644
index 0000000..995393b
--- /dev/null
+++ b/tests/unit/computations/test_slink.py
@@ -0,0 +1,311 @@
+"""Module contains tests for slink"""
+from unittest import TestCase
+
+from gn3.computations.slink import slink
+from gn3.computations.slink import nearest
+from gn3.computations.slink import LengthError
+from gn3.computations.slink import MirrorError
+
+class TestSlink(TestCase):
+ """Class for testing slink functions"""
+
+ def test_nearest_expects_list_of_lists(self):
+ """Test that function only accepts a list of lists."""
+ # This might be better handled with type-hints and mypy
+ for item in [9, "some string", 5.432,
+ [1, 2, 3], ["test", 7.4]]:
+ with self.subTest(item=item):
+ with self.assertRaises(ValueError, msg="Expected list or tuple"):
+ nearest(item, 1, 1)
+
+ def test_nearest_does_not_allow_empty_lists(self):
+ """Test that function does not accept an empty list, or any of the child
+ lists to be empty."""
+ for lst in [[],
+ [[], []],
+ [[], [], []],
+ [[0, 1, 2], [], [1, 2, 0]]]:
+ with self.subTest(lst=lst):
+ with self.assertRaises(ValueError):
+ nearest(lst, 1, 1)
+
+ def test_nearest_expects_children_are_same_length_as_parent(self):
+ """Test that children lists are same length as parent list."""
+ for lst in [[[0, 1]],
+ [[0, 1, 2], [3, 4, 5]],
+ [[0, 1, 2, 3], [4, 5, 6], [7, 8, 9, 0]],
+ [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [1, 2, 3, 4, 5], [2, 3],
+ [3, 4, 5, 6, 7]]]:
+ with self.subTest(lst=lst):
+ with self.assertRaises(LengthError):
+ nearest(lst, 1, 1)
+
+ def test_nearest_expects_member_is_zero_distance_from_itself(self):
+ """Test that distance of a member from itself is zero"""
+ for lst in [[[1]],
+ [[1, 2], [3, 4]],
+ [1, 0, 0], [0, 0, 5], [0, 3, 4],
+ [0, 0, 0, 0], [0, 0, 3, 3], [0, 1, 2, 3], [0, 3, 2, 0]]:
+ with self.subTest(lst=lst):
+ with self.assertRaises(ValueError):
+ nearest(lst, 1, 1)
+
+ def test_nearest_expects_distance_atob_is_equal_to_distance_btoa(self):
+ """Test that the distance from member A to member B is the same as that
+ from member B to member A."""
+ for lst in [[[0, 1], [2, 0]],
+ [[0, 1, 2], [1, 0, 3], [9, 7, 0]],
+ [[0, 1, 2, 3], [7, 0, 2, 3], [2, 3, 0, 1], [8, 9, 5, 0]]]:
+ with self.subTest(lst=lst):
+ with self.assertRaises(MirrorError):
+ nearest(lst, 1, 1)
+
+ def test_nearest_expects_zero_or_positive_distances(self):
+ """Test that all distances are either zero, or greater than zero."""
+ # Based on:
+ # https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/heatmap/slink.py#L87-L89
+ for lst in [[[0, -1, 2, 3], [-1, 0, 3, 4], [2, 3, 0, 5], [3, 4, 5, 0]],
+ [[0, 1, -2, 3], [1, 0, 3, 4], [-2, 3, 0, 5], [3, 4, 5, 0]],
+ [[0, 1, 2, 3], [1, 0, -3, 4], [2, -3, 0, 5], [3, 4, 5, 0]],
+ [[0, 1, 2, -3], [1, 0, 3, 4], [2, 3, 0, 5], [-3, 4, 5, 0]],
+ [[0, 1, 2, 3], [1, 0, 3, -4], [2, 3, 0, 5], [3, -4, 5, 0]],
+ [[0, 1, 2, 3], [1, 0, 3, 4], [2, 3, 0, -5], [3, 4, -5, 0]]]:
+ with self.subTest(lst=lst):
+ with self.assertRaises(ValueError, msg="Distances should be positive."):
+ nearest(lst, 1, 1)
+
+ def test_nearest_returns_shortest_distance_given_coordinates_to_both_group_members(self):
+ """Test that the shortest distance is returned."""
+ # This test is named wrong - at least I think it is, from the expected results
+ # This tests distance when both `i`, and `j` are integers
+ # We still need to add tests for when (either one/both) (is/are) not (an) integer(s)
+ # https://github.com/genenetwork/genenetwork1/blob/master/web/webqtl/heatmap/slink.py#L39-L40
+ for lst, i, j, expected in [
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 0, 0, 0],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 0, 1, 9],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 0, 2, 3],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 0, 3, 6],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 0, 4, 11],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 1, 0, 9],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 1, 1, 0],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 1, 2, 7],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 1, 3, 5],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 1, 4, 10],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 2, 0, 3],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 2, 1, 7],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 2, 2, 0],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 2, 3, 9],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 2, 4, 2],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 3, 0, 6],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 3, 1, 5],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 3, 2, 9],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 3, 3, 0],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 3, 4, 8],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 4, 0, 11],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 4, 1, 10],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 4, 2, 2],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 4, 3, 8],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ 4, 4, 0],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 0, 0, 0],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 0, 1, 9],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 0, 2, 5.5],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 0, 3, 6],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 0, 4, 11],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 1, 0, 9],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 1, 1, 0],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 1, 2, 7],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 1, 3, 5],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 1, 4, 10],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 2, 0, 5.5],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 2, 1, 7],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 2, 2, 0],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 2, 3, 9],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 2, 4, 2],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 3, 0, 6],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 3, 1, 5],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 3, 2, 9],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 3, 3, 0],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 3, 4, 3],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 4, 0, 11],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 4, 1, 10],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 4, 2, 2],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 4, 3, 3],
+ [[[0, 9, 5.5, 6, 11], [9, 0, 7, 5, 10], [5.5, 7, 0, 9, 2],
+ [6, 5, 9, 0, 3], [11, 10, 2, 3, 0]],
+ 4, 4, 0]]:
+ with self.subTest(lst=lst):
+ self.assertEqual(nearest(lst, i, j), expected)
+
+ def test_nearest_gives_shortest_distance_between_list_of_members_and_member(self):
+ """Test that the shortest distance is returned."""
+ for members_distances, members_list, member_coordinate, expected_distance in [
+ [[[0, 9, 3], [9, 0, 7], [3, 7, 0]], (0, 2, 3), 1, 7],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]], [0, 1, 2, 3, 4], 3, 0],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]], [0, 1, 2, 4], 3, 5],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]], [0, 2, 4], 3, 6],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]], [2, 4], 3, 9]]:
+ with self.subTest(
+ members_distances=members_distances,
+ members_list=members_list,
+ member_coordinate=member_coordinate,
+ expected_distance=expected_distance):
+ self.assertEqual(
+ nearest(
+ members_distances, members_list, member_coordinate),
+ expected_distance)
+ self.assertEqual(
+ nearest(
+ members_distances, member_coordinate, members_list),
+ expected_distance)
+
+ def test_nearest_returns_shortest_distance_given_two_lists_of_members(self):
+ """Test that the shortest distance is returned."""
+ for members_distances, members_list, member_list2, expected_distance in [
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], 0],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ [0, 1], [3, 4], 6],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ [0, 1], [2, 3, 4], 3],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8], [11, 10, 2, 8, 0]],
+ [0, 2], [3, 4], 6]]:
+ with self.subTest(
+ members_distances=members_distances,
+ members_list=members_list,
+ member_list2=member_list2,
+ expected_distance=expected_distance):
+ self.assertEqual(
+ nearest(
+ members_distances, members_list, member_list2),
+ expected_distance)
+ self.assertEqual(
+ nearest(
+ members_distances, member_list2, members_list),
+ expected_distance)
+
+ def test_slink_wrong_data_returns_empty_list(self):
+ """Test that empty list is returned for wrong data."""
+ for data in [1, "test", [], 2.945, nearest, [0]]:
+ with self.subTest(data=data):
+ self.assertEqual(slink(data), [])
+
+ def test_slink_with_data(self):
+ """Test slink with example data, and expected results for each data
+ sample."""
+ for data, expected in [
+ [[[0, 9], [9, 0]], [0, 1, 9]],
+ [[[0, 9, 3], [9, 0, 7], [3, 7, 0]], [(0, 2, 3), 1, 7]],
+ [[[0, 9, 3, 6], [9, 0, 7, 5], [3, 7, 0, 9], [6, 5, 9, 0]],
+ [(0, 2, 3), (1, 3, 5), 6]],
+ [[[0, 9, 3, 6, 11], [9, 0, 7, 5, 10], [3, 7, 0, 9, 2],
+ [6, 5, 9, 0, 8],
+ [11, 10, 2, 8, 0]],
+ [(0, (2, 4, 2), 3), (1, 3, 5), 6]]]:
+ with self.subTest(data=data):
+ self.assertEqual(slink(data), expected)
diff --git a/tests/unit/db/test_datasets.py b/tests/unit/db/test_datasets.py
new file mode 100644
index 0000000..38de0e2
--- /dev/null
+++ b/tests/unit/db/test_datasets.py
@@ -0,0 +1,133 @@
+"""Tests for gn3/db/datasets.py"""
+
+from unittest import mock, TestCase
+from gn3.db.datasets import (
+ retrieve_dataset_name,
+ retrieve_riset_fields,
+ retrieve_geno_riset_fields,
+ retrieve_publish_riset_fields,
+ retrieve_probeset_riset_fields)
+
+class TestDatasetsDBFunctions(TestCase):
+ """Test cases for datasets functions."""
+
+ def test_retrieve_dataset_name(self):
+ """Test that the function is called correctly."""
+ for trait_type, thresh, trait_name, dataset_name, columns, table in [
+ ["ProbeSet", 9, "probesetTraitName", "probesetDatasetName",
+ "Id, Name, FullName, ShortName, DataScale", "ProbeSetFreeze"],
+ ["Geno", 3, "genoTraitName", "genoDatasetName",
+ "Id, Name, FullName, ShortName", "GenoFreeze"],
+ ["Publish", 6, "publishTraitName", "publishDatasetName",
+ "Id, Name, FullName, ShortName", "PublishFreeze"],
+ ["Temp", 4, "tempTraitName", "tempTraitName",
+ "Id, Name, FullName, ShortName", "TempFreeze"]]:
+ db_mock = mock.MagicMock()
+ with self.subTest(trait_type=trait_type):
+ with db_mock.cursor() as cursor:
+ cursor.fetchone.return_value = {}
+ self.assertEqual(
+ retrieve_dataset_name(
+ trait_type, thresh, trait_name, dataset_name, db_mock),
+ {})
+ cursor.execute.assert_called_once_with(
+ "SELECT {cols} "
+ "FROM {table} "
+ "WHERE public > %(threshold)s AND "
+ "(Name = %(name)s "
+ "OR FullName = %(name)s "
+ "OR ShortName = %(name)s)".format(
+ table=table, cols=columns),
+ {"threshold": thresh, "name": dataset_name})
+
+ def test_retrieve_probeset_riset_fields(self):
+ """
+ Test that the `riset` and `riset_id` fields are retrieved appropriately
+ for the 'ProbeSet' trait type.
+ """
+ for trait_name, expected in [
+ ["testProbeSetName", {}]]:
+ db_mock = mock.MagicMock()
+ with self.subTest(trait_name=trait_name, expected=expected):
+ with db_mock.cursor() as cursor:
+ cursor.execute.return_value = ()
+ self.assertEqual(
+ retrieve_probeset_riset_fields(trait_name, db_mock),
+ expected)
+ cursor.execute.assert_called_once_with(
+ (
+ "SELECT InbredSet.Name, InbredSet.Id"
+ " FROM InbredSet, ProbeSetFreeze, ProbeFreeze"
+ " WHERE ProbeFreeze.InbredSetId = InbredSet.Id"
+ " AND ProbeFreeze.Id = ProbeSetFreeze.ProbeFreezeId"
+ " AND ProbeSetFreeze.Name = %(name)s"),
+ {"name": trait_name})
+
+ def test_retrieve_riset_fields(self):
+ """
+ Test that the riset fields are set up correctly for the different trait
+ types.
+ """
+ for trait_type, trait_name, dataset_info, expected in [
+ ["Publish", "pubTraitName01", {"dataset_name": "pubDBName01"},
+ {"dataset_name": "pubDBName01", "riset": ""}],
+ ["ProbeSet", "prbTraitName01", {"dataset_name": "prbDBName01"},
+ {"dataset_name": "prbDBName01", "riset": ""}],
+ ["Geno", "genoTraitName01", {"dataset_name": "genoDBName01"},
+ {"dataset_name": "genoDBName01", "riset": ""}],
+ ["Temp", "tempTraitName01", {}, {"riset": ""}],
+ ]:
+ db_mock = mock.MagicMock()
+ with self.subTest(
+ trait_type=trait_type, trait_name=trait_name,
+ dataset_info=dataset_info):
+ with db_mock.cursor() as cursor:
+ cursor.execute.return_value = ("riset_name", 0)
+ self.assertEqual(
+ retrieve_riset_fields(
+ trait_type, trait_name, dataset_info, db_mock),
+ expected)
+
+ def test_retrieve_publish_riset_fields(self):
+ """
+ Test that the `riset` and `riset_id` fields are retrieved appropriately
+ for the 'Publish' trait type.
+ """
+ for trait_name, expected in [
+ ["testPublishName", {}]]:
+ db_mock = mock.MagicMock()
+ with self.subTest(trait_name=trait_name, expected=expected):
+ with db_mock.cursor() as cursor:
+ cursor.execute.return_value = ()
+ self.assertEqual(
+ retrieve_publish_riset_fields(trait_name, db_mock),
+ expected)
+ cursor.execute.assert_called_once_with(
+ (
+ "SELECT InbredSet.Name, InbredSet.Id"
+ " FROM InbredSet, PublishFreeze"
+ " WHERE PublishFreeze.InbredSetId = InbredSet.Id"
+ " AND PublishFreeze.Name = %(name)s"),
+ {"name": trait_name})
+
+ def test_retrieve_geno_riset_fields(self):
+ """
+ Test that the `riset` and `riset_id` fields are retrieved appropriately
+ for the 'Geno' trait type.
+ """
+ for trait_name, expected in [
+ ["testGenoName", {}]]:
+ db_mock = mock.MagicMock()
+ with self.subTest(trait_name=trait_name, expected=expected):
+ with db_mock.cursor() as cursor:
+ cursor.execute.return_value = ()
+ self.assertEqual(
+ retrieve_geno_riset_fields(trait_name, db_mock),
+ expected)
+ cursor.execute.assert_called_once_with(
+ (
+ "SELECT InbredSet.Name, InbredSet.Id"
+ " FROM InbredSet, GenoFreeze"
+ " WHERE GenoFreeze.InbredSetId = InbredSet.Id"
+ " AND GenoFreeze.Name = %(name)s"),
+ {"name": trait_name})
diff --git a/tests/unit/db/test_traits.py b/tests/unit/db/test_traits.py
new file mode 100644
index 0000000..ee98893
--- /dev/null
+++ b/tests/unit/db/test_traits.py
@@ -0,0 +1,224 @@
+"""Tests for gn3/db/traits.py"""
+from unittest import mock, TestCase
+from gn3.db.traits import (
+ build_trait_name,
+ set_haveinfo_field,
+ update_sample_data,
+ retrieve_trait_info,
+ set_confidential_field,
+ set_homologene_id_field,
+ retrieve_geno_trait_info,
+ retrieve_temp_trait_info,
+ retrieve_publish_trait_info,
+ retrieve_probeset_trait_info)
+
+class TestTraitsDBFunctions(TestCase):
+ "Test cases for traits functions"
+
+ def test_retrieve_publish_trait_info(self):
+ """Test retrieval of type `Publish` traits."""
+ db_mock = mock.MagicMock()
+ with db_mock.cursor() as cursor:
+ cursor.fetchone.return_value = tuple()
+ trait_source = {
+ "trait_name": "PublishTraitName", "trait_dataset_id": 1}
+ self.assertEqual(
+ retrieve_publish_trait_info(trait_source, db_mock), {})
+ cursor.execute.assert_called_once_with(
+ ("SELECT "
+ "PublishXRef.Id, Publication.PubMed_ID,"
+ " Phenotype.Pre_publication_description,"
+ " Phenotype.Post_publication_description,"
+ " Phenotype.Original_description,"
+ " Phenotype.Pre_publication_abbreviation,"
+ " Phenotype.Post_publication_abbreviation,"
+ " Phenotype.Lab_code, Phenotype.Submitter, Phenotype.Owner,"
+ " Phenotype.Authorized_Users,"
+ " CAST(Publication.Authors AS BINARY),"
+ " Publication.Title, Publication.Abstract,"
+ " Publication.Journal,"
+ " Publication.Volume, Publication.Pages, Publication.Month,"
+ " Publication.Year, PublishXRef.Sequence, Phenotype.Units,"
+ " PublishXRef.comments"
+ " FROM"
+ " PublishXRef, Publication, Phenotype, PublishFreeze"
+ " WHERE"
+ " PublishXRef.Id = %(trait_name)s"
+ " AND Phenotype.Id = PublishXRef.PhenotypeId"
+ " AND Publication.Id = PublishXRef.PublicationId"
+ " AND PublishXRef.InbredSetId = PublishFreeze.InbredSetId"
+ " AND PublishFreeze.Id =%(trait_dataset_id)s"),
+ trait_source)
+
+ def test_retrieve_probeset_trait_info(self):
+ """Test retrieval of type `Probeset` traits."""
+ db_mock = mock.MagicMock()
+ with db_mock.cursor() as cursor:
+ cursor.fetchone.return_value = tuple()
+ trait_source = {
+ "trait_name": "ProbeSetTraitName",
+ "trait_dataset_name": "ProbeSetDatasetTraitName"}
+ self.assertEqual(
+ retrieve_probeset_trait_info(trait_source, db_mock), {})
+ cursor.execute.assert_called_once_with(
+ (
+ "SELECT "
+ "ProbeSet.name, ProbeSet.symbol, ProbeSet.description, "
+ "ProbeSet.probe_target_description, ProbeSet.chr, "
+ "ProbeSet.mb, ProbeSet.alias, ProbeSet.geneid, "
+ "ProbeSet.genbankid, ProbeSet.unigeneid, ProbeSet.omim, "
+ "ProbeSet.refseq_transcriptid, ProbeSet.blatseq, "
+ "ProbeSet.targetseq, ProbeSet.chipid, ProbeSet.comments, "
+ "ProbeSet.strand_probe, ProbeSet.strand_gene, "
+ "ProbeSet.probe_set_target_region, ProbeSet.proteinid, "
+ "ProbeSet.probe_set_specificity, "
+ "ProbeSet.probe_set_blat_score, "
+ "ProbeSet.probe_set_blat_mb_start, "
+ "ProbeSet.probe_set_blat_mb_end, "
+ "ProbeSet.probe_set_strand, ProbeSet.probe_set_note_by_rw, "
+ "ProbeSet.flag "
+ "FROM "
+ "ProbeSet, ProbeSetFreeze, ProbeSetXRef "
+ "WHERE "
+ "ProbeSetXRef.ProbeSetFreezeId = ProbeSetFreeze.Id "
+ "AND ProbeSetXRef.ProbeSetId = ProbeSet.Id "
+ "AND ProbeSetFreeze.Name = %(trait_dataset_name)s "
+ "AND ProbeSet.Name = %(trait_name)s"), trait_source)
+
+ def test_retrieve_geno_trait_info(self):
+ """Test retrieval of type `Geno` traits."""
+ db_mock = mock.MagicMock()
+ with db_mock.cursor() as cursor:
+ cursor.fetchone.return_value = tuple()
+ trait_source = {
+ "trait_name": "GenoTraitName",
+ "trait_dataset_name": "GenoDatasetTraitName"}
+ self.assertEqual(
+ retrieve_geno_trait_info(trait_source, db_mock), {})
+ cursor.execute.assert_called_once_with(
+ (
+ "SELECT "
+ "Geno.name, Geno.chr, Geno.mb, Geno.source2, Geno.sequence "
+ "FROM "
+ "Geno, GenoFreeze, GenoXRef "
+ "WHERE "
+ "GenoXRef.GenoFreezeId = GenoFreeze.Id "
+ "AND GenoXRef.GenoId = Geno.Id "
+ "AND GenoFreeze.Name = %(trait_dataset_name)s "
+ "AND Geno.Name = %(trait_name)s"),
+ trait_source)
+
+ def test_retrieve_temp_trait_info(self):
+ """Test retrieval of type `Temp` traits."""
+ db_mock = mock.MagicMock()
+ with db_mock.cursor() as cursor:
+ cursor.fetchone.return_value = tuple()
+ trait_source = {"trait_name": "TempTraitName"}
+ self.assertEqual(
+ retrieve_temp_trait_info(trait_source, db_mock), {})
+ cursor.execute.assert_called_once_with(
+ "SELECT name, description FROM Temp WHERE Name = %(trait_name)s",
+ trait_source)
+
+ def test_build_trait_name_with_good_fullnames(self):
+ """
+ Check that the name is built correctly.
+ """
+ for fullname, expected in [
+ ["testdb::testname",
+ {"db": {"dataset_name": "testdb", "dataset_type": "ProbeSet"},
+ "trait_name": "testname", "cellid": "",
+ "trait_fullname": "testdb::testname"}],
+ ["testdb::testname::testcell",
+ {"db": {"dataset_name": "testdb", "dataset_type": "ProbeSet"},
+ "trait_name": "testname", "cellid": "testcell",
+ "trait_fullname": "testdb::testname::testcell"}]]:
+ with self.subTest(fullname=fullname):
+ self.assertEqual(build_trait_name(fullname), expected)
+
+ def test_build_trait_name_with_bad_fullnames(self):
+ """
+ Check that an exception is raised if the full name format is wrong.
+ """
+ for fullname in ["", "test", "test:test"]:
+ with self.subTest(fullname=fullname):
+ with self.assertRaises(AssertionError, msg="Name format error"):
+ build_trait_name(fullname)
+
+ def test_retrieve_trait_info(self):
+ """Test that information on traits is retrieved as appropriate."""
+ for threshold, trait_fullname, expected in [
+ [9, "pubDb::PublishTraitName::pubCell", {"haveinfo": 0}],
+ [5, "prbDb::ProbeSetTraitName::prbCell", {"haveinfo": 0}],
+ [12, "genDb::GenoTraitName", {"haveinfo": 0}],
+ [6, "tmpDb::TempTraitName", {"haveinfo": 0}]]:
+ db_mock = mock.MagicMock()
+ with self.subTest(trait_fullname=trait_fullname):
+ with db_mock.cursor() as cursor:
+ cursor.fetchone.return_value = tuple()
+ self.assertEqual(
+ retrieve_trait_info(
+ threshold, trait_fullname, db_mock),
+ expected)
+
+ def test_update_sample_data(self):
+ """Test that the SQL queries when calling update_sample_data are called with
+ the right calls.
+
+ """
+ db_mock = mock.MagicMock()
+
+ STRAIN_ID_SQL: str = "UPDATE Strain SET Name = %s WHERE Id = %s"
+ PUBLISH_DATA_SQL: str = ("UPDATE PublishData SET value = %s "
+ "WHERE StrainId = %s AND Id = %s")
+ PUBLISH_SE_SQL: str = ("UPDATE PublishSE SET error = %s "
+ "WHERE StrainId = %s AND DataId = %s")
+ N_STRAIN_SQL: str = ("UPDATE NStrain SET count = %s "
+ "WHERE StrainId = %s AND DataId = %s")
+
+ with db_mock.cursor() as cursor:
+ type(cursor).rowcount = 1
+ self.assertEqual(update_sample_data(
+ conn=db_mock, strain_name="BXD11",
+ strain_id=10, publish_data_id=8967049,
+ value=18.7, error=2.3, count=2),
+ (1, 1, 1, 1))
+ cursor.execute.assert_has_calls(
+ [mock.call(STRAIN_ID_SQL, ('BXD11', 10)),
+ mock.call(PUBLISH_DATA_SQL, (18.7, 10, 8967049)),
+ mock.call(PUBLISH_SE_SQL, (2.3, 10, 8967049)),
+ mock.call(N_STRAIN_SQL, (2, 10, 8967049))]
+ )
+
+ def test_set_haveinfo_field(self):
+ """Test that the `haveinfo` field is set up correctly"""
+ for trait_info, expected in [
+ [{}, {"haveinfo": 0}],
+ [{"k1": "v1"}, {"k1": "v1", "haveinfo": 1}]]:
+ with self.subTest(trait_info=trait_info, expected=expected):
+ self.assertEqual(set_haveinfo_field(trait_info), expected)
+
+ def test_set_homologene_id_field(self):
+ """Test that the `homologene_id` field is set up correctly"""
+ for trait_type, trait_info, expected in [
+ ["Publish", {}, {"homologeneid": None}],
+ ["ProbeSet", {}, {"homologeneid": None}],
+ ["Geno", {}, {"homologeneid": None}],
+ ["Temp", {}, {"homologeneid": None}]]:
+ db_mock = mock.MagicMock()
+ with self.subTest(trait_info=trait_info, expected=expected):
+ with db_mock.cursor() as cursor:
+ cursor.fetchone.return_value = ()
+ self.assertEqual(
+ set_homologene_id_field(trait_type, trait_info, db_mock), expected)
+
+ def test_set_confidential_field(self):
+ """Test that the `confidential` field is set up correctly"""
+ for trait_type, trait_info, expected in [
+ ["Publish", {}, {"confidential": 0}],
+ ["ProbeSet", {}, {}],
+ ["Geno", {}, {}],
+ ["Temp", {}, {}]]:
+ with self.subTest(trait_info=trait_info, expected=expected):
+ self.assertEqual(
+ set_confidential_field(trait_type, trait_info), expected)
diff --git a/wsgi.py b/wsgi.py
new file mode 100644
index 0000000..0fcb573
--- /dev/null
+++ b/wsgi.py
@@ -0,0 +1,13 @@
+"""
+WSGI application entry-point.
+"""
+# import main
+from gn3.app import create_app
+
+print("STARTING WSGI APP")
+
+app = create_app()
+
+if __name__ == "__main__":
+ print("Starting wsgi app...")
+ app.run()