about summary refs log tree commit diff
path: root/wqflask
diff options
context:
space:
mode:
Diffstat (limited to 'wqflask')
-rw-r--r--wqflask/maintenance/print_benchmark.py43
-rw-r--r--wqflask/maintenance/quick_search_table.py137
-rw-r--r--wqflask/other_config/pylintrc264
-rw-r--r--wqflask/wqflask/correlation/correlation_plot.py7
-rw-r--r--wqflask/wqflask/my_pylmm/pyLMM/lmm.py93
-rw-r--r--wqflask/wqflask/my_pylmm/pyLMM/process_plink.py127
-rw-r--r--wqflask/wqflask/search_results.py35
-rw-r--r--wqflask/wqflask/templates/quick_search.html321
8 files changed, 823 insertions, 204 deletions
diff --git a/wqflask/maintenance/print_benchmark.py b/wqflask/maintenance/print_benchmark.py
new file mode 100644
index 00000000..540e0904
--- /dev/null
+++ b/wqflask/maintenance/print_benchmark.py
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+
+from __future__ import absolute_import, print_function, division
+
+import time
+
+from pprint import pformat as pf
+
+
+class TheCounter(object):
+    Counters = {}
+    
+    def __init__(self):
+        start_time = time.time()
+        for counter in range(170000):
+            self.print_it(counter)
+        self.time_took = time.time() - start_time
+        TheCounter.Counters[self.__class__.__name__] = self.time_took        
+
+class PrintAll(TheCounter): 
+    def print_it(self, counter):
+        print(counter)
+        
+class PrintSome(TheCounter):
+    def print_it(self, counter):
+        if counter % 1000 == 0:
+            print(counter)
+            
+class PrintNone(TheCounter):
+    def print_it(self, counter):
+        pass
+    
+    
+def new_main():
+    print("Running new_main")
+    tests = [PrintAll, PrintSome, PrintNone]
+    for test in tests:
+        test()
+        
+    print(pf(TheCounter.Counters))
+
+if __name__ == '__main__':
+    new_main()
\ No newline at end of file
diff --git a/wqflask/maintenance/quick_search_table.py b/wqflask/maintenance/quick_search_table.py
index 046a05c4..b07e7656 100644
--- a/wqflask/maintenance/quick_search_table.py
+++ b/wqflask/maintenance/quick_search_table.py
@@ -1,17 +1,17 @@
-from __future__ import print_function, division, absolute_import
+"""Creates a table used for the quick search feature.
+
+One column contains the terms to match the user's search against. Another contains the result
+fields in json format
 
-"""
 Results will be returned for each of several trait types: mRNA assays, phenotypes, genotypes, and
 (maybe later) genes
 
-For each trait type, the results for each species should be given; for example, have a "Mouse" tab
-with the mouse traits in a table inside it
-
-This table will then list each trait, its dataset, and several columns determined by its trait type
-(phenotype, genotype, etc)
+For each trait type, the results for each species should be given This table will then list
+each trait, its dataset, and several columns determined by its trait type (phenotype, genotype, etc)
 
 """
 
+from __future__ import print_function, division, absolute_import
 
 import sys
 sys.path.append("../../..")
@@ -19,19 +19,17 @@ sys.path.append("../../..")
 import simplejson as json
 
 import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
-from sqlalchemy.orm import scoped_session, sessionmaker, relationship, backref
-from sqlalchemy.orm.exc import NoResultFound
+from sqlalchemy.orm import scoped_session, sessionmaker
 from sqlalchemy.ext.declarative import declarative_base
 
-from pprint import pformat as pf
+#from pprint import pformat as pf
 
 import zach_settings as settings
 
 Engine = sa.create_engine(settings.SQLALCHEMY_DATABASE_URI,
                        #encoding='utf-8',
                        #client_encoding='utf-8',
-                       #echo="debug",
+                       #echo="debug",w
                        )
 
 Session = scoped_session(sessionmaker(bind=Engine)) #, extension=VersionedListener()))
@@ -41,6 +39,14 @@ Metadata = sa.MetaData()
 Metadata.bind = Engine
 
 class PublishXRef(Base):
+    """Class that corresponds with the PublishXRef table in the database.
+    
+    The PublishXRef table links phenotype traits and their publications.
+    
+    This class is used to add phenotype traits to the quick search table.
+    
+    """
+    
     __tablename__ = 'PublishXRef'
 
     Id = sa.Column(sa.Integer, primary_key=True)
@@ -56,15 +62,16 @@ class PublishXRef(Base):
 
     @classmethod
     def run(cls):
+        """Connects to database and inserts phenotype trait info into the Quicksearch table."""
         conn = Engine.connect()
         counter = 0
-        for ps in page_query(Session.query(cls)):   #all()
+        for pub_row in page_query(Session.query(cls)):   #all()
             values = {}
             values['table_name'] = cls.__tablename__
-            values['the_key'] = json.dumps([ps.Id, ps.InbredSetId])
-            values['terms'] = cls.get_unique_terms(ps.Id, ps.InbredSetId)
+            values['the_key'] = json.dumps([pub_row.Id, pub_row.InbredSetId])
+            values['terms'] = cls.get_unique_terms(pub_row.Id, pub_row.InbredSetId)
             print("terms is:", values['terms'])
-            values['result_fields'] = cls.get_result_fields(ps.Id, ps.InbredSetId)
+            values['result_fields'] = cls.get_result_fields(pub_row.Id, pub_row.InbredSetId)
             ins = QuickSearch.insert().values(**values)
             conn.execute(ins)
             counter += 1
@@ -72,6 +79,7 @@ class PublishXRef(Base):
 
     @staticmethod
     def get_unique_terms(publishxref_id, inbredset_id):
+        """Finds unique terms for each item in the PublishXRef table to match a query against"""
         results = Session.query(
                 "pre_publication_description",
                 "post_publication_description",
@@ -119,6 +127,7 @@ class PublishXRef(Base):
 
     @staticmethod
     def get_result_fields(publishxref_id, inbredset_id):
+        """Gets the result fields (columns) that appear on the result page as a json string"""
         results = Session.query(
                 "phenotype_id",
                 "species",
@@ -136,7 +145,7 @@ class PublishXRef(Base):
                 "Phenotype.Original_description as description, "
                 "PublishXRef.LRS as lrs, "
                 "PublishXRef.PublicationId as publication_id, "
-                "Publication.PubMed_ID"
+                "Publication.PubMed_ID as pubmed_id, "
                 "Publication.Year as year, "
                 "Publication.Authors as authors "
                 "FROM PublishXRef, "
@@ -150,17 +159,10 @@ class PublishXRef(Base):
                 "PublishXRef.PublicationId = Publication.Id and "
                 "InbredSet.Id = :inbredset_id and "
                 "Species.Id = InbredSet.SpeciesId ").params(publishxref_id=publishxref_id,
-                                                            inbredset_id=inbredset_id).all()                
-                #"InbredSet.SpeciesId = Species.Id and "
-                #"Geno.SpeciesId = Species.Id and "
-                #"Geno.Name = PublishXRef.Locus ").params(publishxref_id=publishxref_id,
-                #                                            inbredset_id=inbredset_id).all()
-        #for result in results:
-        #    print("****", result)
+                                                            inbredset_id=inbredset_id).all()
 
         assert len(set(result for result in results)) == 1, "Different results or no results"
 
-        #print("results are:", results)
         result = results[0]
         result = row2dict(result)
         try:
@@ -176,7 +178,16 @@ class PublishXRef(Base):
 
         return json_results
 
+
 class GenoXRef(Base):
+    """Class that corresponds with the GenoXRef table in the database.
+    
+    The GenoXRef table links genotype traits and their data.
+    
+    This class is used to add genotype traits to the quick search table.
+    
+    """
+    
     __tablename__ = 'GenoXRef'
     
     GenoFreezeId = sa.Column(sa.Integer, primary_key=True)
@@ -187,6 +198,7 @@ class GenoXRef(Base):
 
     @classmethod
     def run(cls):
+        """Connects to database and inserts genotype trait info into the Quicksearch table."""
         conn = Engine.connect()
         counter = 0
         for item in page_query(Session.query(cls)):   #all()
@@ -201,9 +213,10 @@ class GenoXRef(Base):
                 conn.execute(ins)
             counter += 1
             print("Done:", counter)
-    
+
     @staticmethod
     def get_unique_terms(geno_id):
+        """Finds unique terms for each item in the GenoXRef table to match a query against"""
         print("geno_id: ", geno_id)
         results = Session.query(
                 "name",
@@ -214,8 +227,6 @@ class GenoXRef(Base):
                 "FROM Geno "
                 "WHERE Geno.Id = :geno_id ").params(geno_id=geno_id).all()
         
-        #print("results: ", pf(results))
-        
         unique = set()
         if len(results):
             for item in results[0]:
@@ -234,12 +245,12 @@ class GenoXRef(Base):
                             continue 
                         
                         unique.add(token)
-        #print("\nUnique terms are: {}\n".format(unique))
         return " ".join(unique)
 
 
     @staticmethod
     def get_result_fields(geno_id, dataset_id):
+        """Gets the result fields (columns) that appear on the result page as a json string"""
         results = Session.query(
                 "name",
                 "marker_name",
@@ -271,11 +282,8 @@ class GenoXRef(Base):
                 "InbredSet.Id = GenoFreeze.InbredSetId and "
                 "InbredSet.SpeciesId = Species.Id ").params(geno_id=geno_id,
                                                                     dataset_id=dataset_id).all()
-        #for result in results:
-        #    print(result)
         assert len(set(result for result in results)) == 1, "Different results"
         
-        #print("results are:", results)
         result = results[0]
         result = row2dict(result)
         try:
@@ -292,6 +300,14 @@ class GenoXRef(Base):
         return json_results    
 
 class ProbeSetXRef(Base):
+    """Class that corresponds with the ProbeSetXRef table in the database.
+    
+    The ProbeSetXRef table links mRNA expression traits and their sample data.
+    
+    This class is used to add mRNA expression traits to the quick search table.
+    
+    """
+    
     __tablename__ = 'ProbeSetXRef'
     
     ProbeSetFreezeId = sa.Column(sa.Integer, primary_key=True)
@@ -310,16 +326,17 @@ class ProbeSetXRef(Base):
 
     @classmethod
     def run(cls):
+        """Connects to db and inserts mRNA expression trait info into the Quicksearch table."""
         conn = Engine.connect()
         counter = 0
-        for ps in page_query(Session.query(cls)):   #all()
+        for ps_row in page_query(Session.query(cls)):   #all()
             values = {}
             values['table_name'] = cls.__tablename__
-            values['the_key'] = json.dumps([ps.ProbeSetId, ps.ProbeSetFreezeId])
-            values['terms'] = cls.get_unique_terms(ps.ProbeSetId)
+            values['the_key'] = json.dumps([ps_row.ProbeSetId, ps_row.ProbeSetFreezeId])
+            values['terms'] = cls.get_unique_terms(ps_row.ProbeSetId)
             print("terms is:", values['terms'])
-            #values['species'] = get_species("ProbeSet", ps.Id)
-            values['result_fields'] = cls.get_result_fields(ps.ProbeSetId, ps.ProbeSetFreezeId)
+            values['result_fields'] = cls.get_result_fields(ps_row.ProbeSetId,
+                                                            ps_row.ProbeSetFreezeId)
             if values['result_fields'] == None:
                 continue
             ins = QuickSearch.insert().values(**values)
@@ -329,6 +346,7 @@ class ProbeSetXRef(Base):
     
     @staticmethod
     def get_unique_terms(probeset_id):
+        """Finds unique terms for each item in the ProbeSetXRef table to match a query against"""
         results = Session.query(
                 "name",
                 "symbol",
@@ -345,7 +363,6 @@ class ProbeSetXRef(Base):
         unique = set()
         if len(results):
             for item in results[0]:
-                #print("locals:", locals())
                 if not item:
                     continue
                 for token in item.split():
@@ -366,12 +383,12 @@ class ProbeSetXRef(Base):
                             continue 
                         
                         unique.add(token)
-            #print("\nUnique terms are: {}\n".format(unique))
             return " ".join(unique)
 
 
     @staticmethod
     def get_result_fields(probeset_id, dataset_id):
+        """Gets the result fields (columns) that appear on the result page as a json string"""
         print("probeset_id: ", probeset_id)
         print("dataset_id: ", dataset_id)
         results = Session.query(
@@ -420,14 +437,10 @@ class ProbeSetXRef(Base):
                 "ProbeFreeze.InbredSetId = InbredSet.Id and "
                 "InbredSet.SpeciesId = Species.Id ").params(probeset_id=probeset_id,
                                                                     dataset_id=dataset_id).all()
-        #for result in results:
-        #    print("-", result)
             
         if len(set(result for result in results)) != 1:
             return None
-        #assert len(set(result for result in results)) == 1, "Different results"
-        
-        #print("results are:", results)
+
         result = results[0]
         result = row2dict(result)
         try:
@@ -443,42 +456,48 @@ class ProbeSetXRef(Base):
 
         return json_results    
 
-
 QuickSearch = sa.Table("QuickSearch", Metadata,
+        # table_name is the table that item is inserted from
         sa.Column('table_name', sa.String(15),
-                  primary_key=True, nullable=False, autoincrement=False), # table that item is inserted from
+                  primary_key=True, nullable=False, autoincrement=False), 
         sa.Column('the_key', sa.String(30),
                   primary_key=True, nullable=False, autoincrement=False), # key in database table
         sa.Column('terms', sa.Text), # terms to compare search string with
-        sa.Column('result_fields', sa.Text)  # json
+        sa.Column('result_fields', sa.Text),  # json
+        mysql_engine = 'MyISAM',
                     )
 
-QuickSearch.drop(Engine, checkfirst=True)
-Metadata.create_all(Engine)
+#QuickSearch.drop(Engine, checkfirst=True)
+#Metadata.create_all(Engine)
 
 
 def row2dict(row):
-    """http://stackoverflow.com/a/2848519/1175849"""
+    """From http://stackoverflow.com/a/2848519/1175849"""
     return dict(zip(row.keys(), row))
 
 
-def page_query(q):
-    """http://stackoverflow.com/a/1217947/1175849"""
+def page_query(query):
+    """From http://stackoverflow.com/a/1217947/1175849"""
     offset = 0
     while True:
-        r = False
-        for elem in q.limit(1000).offset(offset):
-           r = True
-           yield elem
+        rrr = False
+        for elem in query.limit(1000).offset(offset):
+            rrr = True
+            yield elem
         offset += 1000
-        if not r:
+        if not rrr:
             break
 
 
 def main():
+    """Populate the QuickSearch table that is used with the quick search features.
+    
+    Add all items from the ProbeSetXRef, GenoXRef, and PublishXRef tables to the QuickSearch tables.
+    
+    """
     ProbeSetXRef.run()
-    GenoXRef.run()
-    PublishXRef.run()
+    #GenoXRef.run()
+    #PublishXRef.run()
 
 if __name__ == "__main__":
     main()
\ No newline at end of file
diff --git a/wqflask/other_config/pylintrc b/wqflask/other_config/pylintrc
new file mode 100644
index 00000000..b23af7a4
--- /dev/null
+++ b/wqflask/other_config/pylintrc
@@ -0,0 +1,264 @@
+[MASTER]
+
+# Specify a configuration file.
+#rcfile=
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+#init-hook=
+
+# Profiled execution.
+profile=no
+
+# Add files or directories to the blacklist. They should be base names, not
+# paths.
+ignore=CVS
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+
+[MESSAGES CONTROL]
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time. See also the "--disable" option for examples.
+#enable=
+
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once).You can also use "--disable=all" to
+# disable everything first and then reenable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use"--disable=all --enable=classes
+# --disable=W"
+disable=no-init, star-args, no-member, import-error
+
+
+[REPORTS]
+
+# Set the output format. Available formats are text, parseable, colorized, msvs
+# (visual studio) and html. You can also give a reporter class, eg
+# mypackage.mymodule.MyReporterClass.
+output-format=text
+
+# Include message's id in output
+include-ids=no
+
+# Include symbolic ids of messages in output
+symbols=no
+
+# Put messages in a separate file for each module / package specified on the
+# command line instead of printing them on stdout. Reports (if any) will be
+# written in a file name "pylint_global.[txt|html]".
+files-output=no
+
+# Tells whether to display a full report or only the messages
+reports=yes
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note). You have access to the variables errors warning, statement which
+# respectively contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (RP0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Add a comment according to your evaluation note. This is used by the global
+# evaluation report (RP0004).
+comment=no
+
+
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+# Ignore imports when computing similarities.
+ignore-imports=no
+
+
+[VARIABLES]
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching the beginning of the name of dummy variables
+# (i.e. not used).
+dummy-variables-rgx=_|dummy
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+
+[BASIC]
+
+# Required attributes for module, separated by a comma
+required-attributes=
+
+# List of builtins function names that should not be used, separated by a comma
+bad-functions=map,filter,apply,input
+
+# Regular expression which should only match correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression which should only match correct module level names
+const-rgx=(([A-Z_][A-Za-z0-9_]*)|(__.*__))$
+
+# Regular expression which should only match correct class names
+class-rgx=[A-Z_][a-zA-Z0-9]+$
+
+# Regular expression which should only match correct function names
+function-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct method names
+method-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct instance attribute names
+attr-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct argument names
+argument-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct variable names
+variable-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct list comprehension /
+# generator expression variable names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# Regular expression which should only match functions or classes name which do
+# not require a docstring
+no-docstring-rgx=__.*__
+
+
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=100
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string='    '
+
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
+
+
+[TYPECHECK]
+
+# Tells whether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# List of classes names for which member attributes should not be checked
+# (useful for classes with attributes dynamically set).
+ignored-classes=SQLObject
+
+# When zope mode is activated, add a predefined set of Zope acquired attributes
+# to generated-members.
+zope=no
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E0201 when accessed. Python regular
+# expressions are accepted.
+generated-members=REQUEST,acl_users,aq_parent
+
+
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=5
+
+# Argument names that match this expression will be ignored. Default to name
+# with leading underscore
+ignored-argument-names=_.*
+
+# Maximum number of locals for function / method body
+max-locals=15
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of branch for function / method body
+max-branchs=12
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=7
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report RP0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report RP0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report RP0402 must
+# not be disabled)
+int-import-graph=
+
+
+[CLASSES]
+
+# List of interface methods to ignore, separated by a comma. This is used for
+# instance to not check methods defines in Zope's Interface base class.
+ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+# List of valid names for the first argument in a class method.
+valid-classmethod-first-arg=cls
+
+# List of valid names for the first argument in a metaclass class method.
+valid-metaclass-classmethod-first-arg=mcs
+
+
+[EXCEPTIONS]
+
+# Exceptions that will emit a warning when being caught. Defaults to
+# "Exception"
+overgeneral-exceptions=Exception
diff --git a/wqflask/wqflask/correlation/correlation_plot.py b/wqflask/wqflask/correlation/correlation_plot.py
index 4b043fc3..c2b64d70 100644
--- a/wqflask/wqflask/correlation/correlation_plot.py
+++ b/wqflask/wqflask/correlation/correlation_plot.py
@@ -24,6 +24,10 @@ class CorrelationPlot(object):
         self.samples_1 = self.get_samples(self.dataset1, sample_names_1, self.trait1)
         self.samples_2 = self.get_samples(self.dataset2, sample_names_2, self.trait2)
 
+        coords = {}
+        for sample in self.samples_1:
+            coords[sample.name] = (sample.val)
+
 
     def get_sample_names(self, dataset):
         if dataset.group.parlist:
@@ -45,4 +49,5 @@ class CorrelationPlot(object):
                             sample_group_type='primary',
                             header="%s Only" % (dataset.group.name))
 
-        return samples
\ No newline at end of file
+        return samples
+        
\ No newline at end of file
diff --git a/wqflask/wqflask/my_pylmm/pyLMM/lmm.py b/wqflask/wqflask/my_pylmm/pyLMM/lmm.py
index a3ba8fdb..fc021a0b 100644
--- a/wqflask/wqflask/my_pylmm/pyLMM/lmm.py
+++ b/wqflask/wqflask/my_pylmm/pyLMM/lmm.py
@@ -28,6 +28,8 @@ from scipy import stats
 import pdb
 
 import gzip
+import zlib
+import datetime
 import cPickle as pickle
 import simplejson as json
 
@@ -38,6 +40,9 @@ from utility import temp_data
 
 from wqflask.my_pylmm.pyLMM import chunks
 
+import redis
+Redis = redis.Redis()
+
 #np.seterr('raise')
 
 def run_human(pheno_vector,
@@ -51,20 +56,32 @@ def run_human(pheno_vector,
     keep = True - v
     keep = keep.reshape((len(keep),))
 
+    identifier = str(uuid.uuid4())
+    
+    lmm_vars = pickle.dumps(dict(
+        pheno_vector = pheno_vector,
+        covariate_matrix = covariate_matrix,
+        kinship_matrix = kinship_matrix
+    ))
+    Redis.hset(identifier, "lmm_vars", lmm_vars)
+    Redis.expire(identifier, 60*60)
+
     if v.sum():
         pheno_vector = pheno_vector[keep]
         #print("pheno_vector shape is now: ", pf(pheno_vector.shape))
         covariate_matrix = covariate_matrix[keep,:]
-        #print("kinship_matrix shape is: ", pf(kinship_matrix.shape))
+        print("kinship_matrix shape is: ", pf(kinship_matrix.shape))
         #print("len(keep) is: ", pf(keep.shape))
         kinship_matrix = kinship_matrix[keep,:][:,keep]
 
     n = kinship_matrix.shape[0]
+    print("n is:", n)
     lmm_ob = LMM(pheno_vector,
                 kinship_matrix,
                 covariate_matrix)
     lmm_ob.fit()
 
+
     # Buffers for pvalues and t-stats
     p_values = []
     t_stats = []
@@ -86,42 +103,56 @@ def run_human(pheno_vector,
 
         with Bench("Create list of inputs"):
             inputs = list(plink_input)
-            
+
         with Bench("Divide into chunks"):
             results = chunks.divide_into_chunks(inputs, 64)
 
         result_store = []
-        identifier = uuid.uuid4()
+
+        key = "plink_inputs"
+        
+        # Todo: Delete below line when done testing
+        Redis.delete(key)
+        
+        timestamp = datetime.datetime.utcnow().isoformat()
+
+        print("Starting adding loop")
         for part, result in enumerate(results):
-            # todo: Don't use TempData here. Instead revert old one and store this stuff as a list
-            data_store = temp_data.TempData(identifier, "plink", part)
+            #data = pickle.dumps(result, pickle.HIGHEST_PROTOCOL)
+            holder = pickle.dumps(dict(
+                identifier = identifier,
+                part = part,
+                timestamp = timestamp,
+                result = result
+            ), pickle.HIGHEST_PROTOCOL)
             
-            data_store.store("data", pickle.dumps(result, pickle.HIGHEST_PROTOCOL))
-            result_store.append(data_store)
-
+            print("Adding:", part)
+            Redis.rpush(key, zlib.compress(holder))
+        print("End adding loop")
+        print("***** Added to {} queue *****".format(key))
         for snp, this_id in plink_input:
-            with Bench("part before association"):
-                if count > 2000:
-                    break
-                count += 1
-
-                percent_complete = (float(count) / total_snps) * 100
-                #print("percent_complete: ", percent_complete)
-                loading_progress.store("percent_complete", percent_complete)
-        
-            with Bench("actual association"):
-                ps, ts = human_association(snp,
-                                           n,
-                                           keep,
-                                           lmm_ob,
-                                           pheno_vector,
-                                           covariate_matrix,
-                                           kinship_matrix,
-                                           refit)
-
-            with Bench("after association"):
-                p_values.append(ps)
-                t_stats.append(ts)
+            #with Bench("part before association"):
+            if count > 2000:
+                break
+            count += 1
+
+            percent_complete = (float(count) / total_snps) * 100
+            #print("percent_complete: ", percent_complete)
+            loading_progress.store("percent_complete", percent_complete)
+
+            #with Bench("actual association"):
+            ps, ts = human_association(snp,
+                                       n,
+                                       keep,
+                                       lmm_ob,
+                                       pheno_vector,
+                                       covariate_matrix,
+                                       kinship_matrix,
+                                       refit)
+
+            #with Bench("after association"):
+            p_values.append(ps)
+            t_stats.append(ts)
         
     return p_values, t_stats
 
@@ -304,7 +335,7 @@ def GWAS(pheno_vector,
     covariate_matrix - n x q covariate matrix
     restricted_max_likelihood - use restricted maximum likelihood
     refit - refit the variance component for each SNP
-      
+    
     """
     if kinship_eigen_vals == None:
         kinship_eigen_vals = []
diff --git a/wqflask/wqflask/my_pylmm/pyLMM/process_plink.py b/wqflask/wqflask/my_pylmm/pyLMM/process_plink.py
new file mode 100644
index 00000000..e47c18e1
--- /dev/null
+++ b/wqflask/wqflask/my_pylmm/pyLMM/process_plink.py
@@ -0,0 +1,127 @@
+from __future__ import absolute_import, print_function, division
+
+import sys
+sys.path.append("../../..")
+
+print("sys.path: ", sys.path)
+
+import numpy as np
+
+import zlib
+import cPickle as pickle
+import redis
+Redis = redis.Redis()
+
+import lmm
+
+class ProcessLmmChunk(object):
+    
+    def __init__(self):
+        self.get_snp_data()
+        self.get_lmm_vars()
+        
+        keep = self.trim_matrices()
+        
+        self.do_association(keep)
+        
+        print("p_values is: ", self.p_values)
+        
+    def get_snp_data(self):
+        plink_pickled = zlib.decompress(Redis.lpop("plink_inputs"))
+        plink_data = pickle.loads(plink_pickled)
+        
+        self.snps = np.array(plink_data['result'])
+        self.identifier = plink_data['identifier']
+        
+    def get_lmm_vars(self):
+        lmm_vars_pickled = Redis.hget(self.identifier, "lmm_vars")
+        lmm_vars = pickle.loads(lmm_vars_pickled)
+        
+        self.pheno_vector = np.array(lmm_vars['pheno_vector'])
+        self.covariate_matrix = np.array(lmm_vars['covariate_matrix'])
+        self.kinship_matrix = np.array(lmm_vars['kinship_matrix'])
+        
+    def trim_matrices(self):
+        v = np.isnan(self.pheno_vector)
+        keep = True - v
+        keep = keep.reshape((len(keep),))
+        
+        if v.sum():
+            self.pheno_vector = self.pheno_vector[keep]
+            self.covariate_matrix = self.covariate_matrix[keep,:]
+            self.kinship_matrix = self.kinship_matrix[keep,:][:,keep]
+
+        return keep
+    
+    def do_association(self, keep):
+        n = self.kinship_matrix.shape[0]
+        lmm_ob = lmm.LMM(self.pheno_vector,
+                    self.kinship_matrix,
+                    self.covariate_matrix)
+        lmm_ob.fit()
+    
+        self.p_values = []
+        
+        for snp in self.snps:
+            snp = snp[0]
+            p_value, t_stat = lmm.human_association(snp,
+                                        n,
+                                        keep,
+                                        lmm_ob,
+                                        self.pheno_vector,
+                                        self.covariate_matrix,
+                                        self.kinship_matrix,
+                                        False)
+        
+            self.p_values.append(p_value)
+            
+
+#plink_pickled = zlib.decompress(Redis.lpop("plink_inputs"))
+#
+#plink_data = pickle.loads(plink_pickled)
+#result = np.array(plink_data['result'])
+#print("snp size is: ", result.shape)
+#identifier = plink_data['identifier']
+#
+#lmm_vars_pickled = Redis.hget(identifier, "lmm_vars")
+#lmm_vars = pickle.loads(lmm_vars_pickled)
+#
+#pheno_vector = np.array(lmm_vars['pheno_vector'])
+#covariate_matrix = np.array(lmm_vars['covariate_matrix'])
+#kinship_matrix = np.array(lmm_vars['kinship_matrix'])
+#
+#v = np.isnan(pheno_vector)
+#keep = True - v
+#keep = keep.reshape((len(keep),))
+#print("keep is: ", keep)
+#
+#if v.sum():
+#    pheno_vector = pheno_vector[keep]
+#    covariate_matrix = covariate_matrix[keep,:]
+#    kinship_matrix = kinship_matrix[keep,:][:,keep]
+#
+#n = kinship_matrix.shape[0]
+#print("n is: ", n)
+#lmm_ob = lmm.LMM(pheno_vector,
+#            kinship_matrix,
+#            covariate_matrix)
+#lmm_ob.fit()
+#
+#p_values = []
+#
+#for snp in result:
+#    snp = snp[0]
+#    p_value, t_stat = lmm.human_association(snp,
+#                                n,
+#                                keep,
+#                                lmm_ob,
+#                                pheno_vector,
+#                                covariate_matrix,
+#                                kinship_matrix,
+#                                False)
+#
+#    p_values.append(p_value)
+    
+
+
+
diff --git a/wqflask/wqflask/search_results.py b/wqflask/wqflask/search_results.py
index dc872a8b..5f3c036f 100644
--- a/wqflask/wqflask/search_results.py
+++ b/wqflask/wqflask/search_results.py
@@ -26,8 +26,7 @@ from MySQLdb import escape_string as escape
 from htmlgen import HTMLgen2 as HT
 
 from base import webqtlConfig
-from utility.THCell import THCell
-from utility.TDCell import TDCell
+from utility.benchmark import Bench
 from base.data_set import create_dataset
 from base.trait import GeneralTrait
 from wqflask import parser
@@ -75,6 +74,7 @@ class SearchResultPage(object):
             self.search_terms = kw['q']
             print("self.search_terms is: ", self.search_terms)
             self.quick_search()
+            self.get_group_species_tree()
         else:
             self.results = []
             #self.quick_search = False
@@ -124,24 +124,43 @@ class SearchResultPage(object):
                     FROM QuickSearch
                     WHERE MATCH (terms)
                           AGAINST ('{}' IN BOOLEAN MODE) """.format(search_terms)
-        dbresults = g.db.execute(query, no_parameters=True).fetchall()
+        #print("query is: ", query)
+        
+        with Bench("Doing QuickSearch Query: "):
+            dbresults = g.db.execute(query, no_parameters=True).fetchall()
         #print("results: ", pf(results))
         
         self.results = collections.defaultdict(list)
         
         type_dict = {'PublishXRef': 'phenotype',
-                   'ProbesetXRef': 'mrna_assay',
+                   'ProbeSetXRef': 'mrna_assay',
                    'GenoXRef': 'genotype'}
-
+        
+        self.species_groups = {}
         for dbresult in dbresults:
             this_result = {}
             this_result['table_name'] = dbresult.table_name
             this_result['key'] = dbresult.the_key
             this_result['result_fields'] = json.loads(dbresult.result_fields)
-            
+            this_species = this_result['result_fields']['species']
+            this_group = this_result['result_fields']['group_name']
+            if type_dict[dbresult.table_name] not in self.species_groups:
+                self.species_groups[type_dict[dbresult.table_name]] = {}
+            if this_species not in self.species_groups[type_dict[dbresult.table_name]]:
+                self.species_groups[type_dict[dbresult.table_name]][this_species] = collections.defaultdict(list)
+            if this_group not in self.species_groups[type_dict[dbresult.table_name]][this_species]:
+                self.species_groups[type_dict[dbresult.table_name]][this_species].append(this_group)
             self.results[type_dict[dbresult.table_name]].append(this_result)
             
-        print("results: ", pf(self.results['phenotype']))
+        #print("results: ", pf(self.results['phenotype']))
+        
+    #def get_group_species_tree(self):
+    #    self.species_groups = collections.default_dict(list)
+    #    for key in self.results:
+    #        for item in self.results[key]:
+    #            self.species_groups[item['result_fields']['species']].append(
+    #                                        item['result_fields']['group_name'])
+
 
     #def quick_search(self):
     #    self.search_terms = parser.parse(self.search_terms)
@@ -209,6 +228,6 @@ class SearchResultPage(object):
                                     self.dataset,
                                     )
             self.results.extend(the_search.run())
-            print("in the search results are:", self.results)
+            #print("in the search results are:", self.results)
 
         self.header_fields = the_search.header_fields
diff --git a/wqflask/wqflask/templates/quick_search.html b/wqflask/wqflask/templates/quick_search.html
index d50b4937..9d5b0c74 100644
--- a/wqflask/wqflask/templates/quick_search.html
+++ b/wqflask/wqflask/templates/quick_search.html
@@ -21,9 +21,7 @@
         <ul>
             {% if search_terms %}
             <li>
-                {% for word in search_terms %}
-                    <strong>{{word}}</strong> {% if not loop.last %} or {% endif %}
-                {% endfor %}
+                <strong>{{search_terms}}</strong> 
             </li>
             {% endif %}
         </ul>
@@ -33,18 +31,166 @@
 
         <div class="tabbable"> <!-- Only required for left/right tabs -->
             <ul class="nav nav-tabs">
+                {% if results.phenotype %}
                 <li class="active"> <a href="#tab1" data-toggle="tab">Phenotype</a></li>
+                {% endif %}
+                {% if results.mrna_assay %}
                 <li>                <a href="#tab2" data-toggle="tab">mRNA Assay</a></li>
+                {% endif %}
+                {% if results.genotype %}
                 <li>                <a href="#tab3" data-toggle="tab">Genotype</a></li>
+                {% endif %}
             </ul>
             <div class="tab-content">
                 <div class="tab-pane active" id="tab1">
-                    <table class="table table-hover">
+                    <div class="tabbable tabs-left">
+                        <ul class="nav nav-tabs">
+                            {% for species in species_groups.phenotype %}
+                            <li> <a href="#tab1_{{ loop.index }}" data-toggle="tab">{{ species }}</a></li>
+                            {% endfor %}
+                        </ul>
+                        <div class="tab-content">
+                            {% for species in species_groups.phenotype %}
+                            <div class="tab-pane active" id="tab{{ loop.index }}">
+                                <table id="pheno_results" class="table table-hover table-striped table-bordered">
+                                    <thead>
+                                        <tr>
+                                        <th>Id</th>
+                                        <th>Species</th>
+                                        <th>Group</th>
+                                        <th>Description</th>
+                                        <th>LRS</th>
+                                        <th>Year</th>
+                                        <th>Authors</th>
+                                        </tr>
+                                    </thead>
+                                    <tbody>
+                                        {% for result in results.phenotype %}
+                                        {% if result.result_fields['species'] == species %}
+                                        <tr>
+                                            <td>{{ result.result_fields['phenotype_id'] }}</td>
+                                            <td>{{ result.result_fields['species'] }}</td>
+                                            <td>{{ result.result_fields['group_name'] }}</td>
+                                            <td>{{ result.result_fields['description'] }}</td>
+                                            <td>{{ result.result_fields['lrs'] }}</td>
+                                            <td>
+                                                <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids={{ result.result_fields['pubmed_id'] }}&dopt=Abstract">
+                                                    {{ result.result_fields['year'] }}
+                                                </a>
+                                            </td>
+                                            <td>{{ result.result_fields['authors'] }}</td>
+                                        </tr>
+                                        {% endif %}
+                                        {% endfor %}
+                                    </tbody>
+                                </table>
+                            </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+                <div class="tab-pane active" id="tab2">
+                    <div class="tabbable tabs-left">
+                        <ul class="nav nav-tabs">
+                            {% for species in species_groups.mrna_assay %}
+                            <li> <a href="#tab2_{{ loop.index }}" data-toggle="tab">{{ species }}</a></li>
+                            {% endfor %}
+                        </ul>
+                        <div class="tab-content">
+                            {% for species in species_groups.mrna_assay %}
+                            <div class="tab-pane active" id="tab{{ loop.index }}">
+                                <table id="mrna_assay_results" class="table table-hover table-striped table-bordered">
+                                    <thead>
+                                        <tr>
+                                        <th>Record ID</th>
+                                        <th>Species</th>
+                                        <th>Group</th>
+                                        <th>Data Set</th>
+                                        <th>Symbol</th>
+                                        <th>Description</th>
+                                        <th>Location</th>
+                                        <th>Mean Expr</th>
+                                        <th>Max LRS</th>
+                                        </tr>
+                                    </thead>
+                                    <tbody>
+                                        {% for result in results.mrna_assay %}
+                                        {% if result.result_fields['species'] == species %}
+                                        <tr>
+                                            <td>
+                                                <a href="http://gn2python.genenetwork.org/show_trait?trait_id={{ result.result_fields['name'] }}&dataset={{ result.result_fields['dataset'] }}"
+                                                   {{ result.result_fields['name'] }}
+                                                </a>
+                                            </td>
+                                            <td>{{ result.result_fields['species'] }}</td>
+                                            <td>{{ result.result_fields['group_name'] }}</td>
+                                            <td>{{ result.result_fields['dataset_name'] }}</td>
+                                            <td>{{ result.result_fields['symbol'] }}</td>
+                                            <td>{{ result.result_fields['description'] }}</td>
+                                            <td>{{ result.result_fields['chr'] }} : {{ result['mb'] }}</td>
+                                            <td>{{ result.result_fields['mean'] }}</td>
+                                            <td>{{ result.result_fields['lrs'] }}</td>
+                                        </tr>
+                                        {% endif %}
+                                        {% endfor %}
+                                    </tbody>
+                                </table>       
+                            </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+                <div class="tab-pane active" id="tab3">
+                    <div class="tabbable tabs-left">
+                        <ul class="nav nav-tabs">
+                            {% for species in species_groups.genotype %}
+                            <li> <a href="#tab3_{{ loop.index }}" data-toggle="tab">{{ species }}</a></li>
+                            {% endfor %}
+                        </ul>
+                        <div class="tab-content">
+                            {% for species in species_groups.genotype %}
+                            <div class="tab-pane active" id="tab{{ loop.index }}">
+                                <table id="geno_results" class="table table-hover table-striped table-bordered">
+                                    <thead>
+                                        <tr>
+                                        <th>Marker</th>
+                                        <th>Species</th>
+                                        <th>Group</th>
+                                        <th>Data Set</th>
+                                        <th>Location</th>
+                                        </tr>
+                                    </thead>
+                                    <tbody>
+                                        {% for result in results.genotype %}
+                                        {% if result.result_fields['species'] == species %}
+                                        <tr>
+                                            <td>
+                                                <a href="http://gn2python.genenetwork.org/show_trait?trait_id={{ result.result_fields['marker_name'] }}&dataset={{ result.result_fields['dataset'] }}">
+                                                    {{ result.result_fields['marker_name'] }}
+                                                </a>
+                                            </td>
+                                            <td>{{ result.result_fields['species'] }}</td>
+                                            <td>{{ result.result_fields['group_name'] }}</td>
+                                            <td>{{ result.result_fields['dataset_name'] }}</td>
+                                            <td>{{ result.result_fields['chr'] }} : {{ result.result_fields['mb'] }}</td>
+                                        </tr>
+                                        {% endif %}
+                                        {% endfor %}
+                                    </tbody>
+                                </table>   
+                            </div>
+                            {% endfor %}
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    
+                {#
+                    <table id="pheno_results" class="table table-hover table-striped table-bordered">
                         <thead>
                             <tr>
-                       <!--     {% for key, _value in results.phenotype[0].result_fields.items() %}
-                                <th>{{key}}</th>
-                            {% endfor %}-->
                             <th>Id</th>
                             <th>Species</th>
                             <th>Group</th>
@@ -57,26 +203,24 @@
                         <tbody>
                             {% for result in results.phenotype %}
                             <tr>
-                                {% for result in result.result_fields.items() %}
-                                <td>{{ result['phenotype_id'] }}</td>
-                                <td>{{ result['species'] }}</td>
-                                <td>{{ result['group_name'] }}</td>
-                                <td>{{ result['description'] }}</td>
-                                <td>{{ result['lrs'] }}</td>
+                                <td>{{ result.result_fields['phenotype_id'] }}</td>
+                                <td>{{ result.result_fields['species'] }}</td>
+                                <td>{{ result.result_fields['group_name'] }}</td>
+                                <td>{{ result.result_fields['description'] }}</td>
+                                <td>{{ result.result_fields['lrs'] }}</td>
                                 <td>
-                                    <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids={{ result['pubmed_id'] }}&dopt=Abstract">
-                                        {{ result['year'] }}
+                                    <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=PubMed&list_uids={{ result.result_fields['pubmed_id'] }}&dopt=Abstract">
+                                        {{ result.result_fields['year'] }}
                                     </a>
                                 </td>
-                                <td>{{ result['authors'] }}</td>
-                                {% endfor %}
+                                <td>{{ result.result_fields['authors'] }}</td>
                             </tr>
                             {% endfor %}
                         </tbody>
                     </table>
                 </div>
                 <div class="tab-pane" id="tab2">
-                    <table class="table table-hover">
+                    <table id="mrna_assay_results" class="table table-hover table-striped table-bordered">
                         <thead>
                             <tr>
                             <th>Record ID</th>
@@ -93,28 +237,26 @@
                         <tbody>
                             {% for result in results.mrna_assay %}
                             <tr>
-                                {% for result in result.result_fields.items() %}
                                 <td>
-                                    <a href="http://gn2python.genenetwork.org/show_trait?trait_id={{ result['name'] }}&dataset={{ result['dataset'] }}"
-                                       {{ result['name'] }}
+                                    <a href="http://gn2python.genenetwork.org/show_trait?trait_id={{ result.result_fields['name'] }}&dataset={{ result.result_fields['dataset'] }}"
+                                       {{ result.result_fields['name'] }}
                                     </a>
                                 </td>
-                                <td>{{ result['species'] }}</td>
-                                <td>{{ result['group_name'] }}</td>
-                                <td>{{ result['dataset_name'] }}</td>
-                                <td>{{ result['symbol'] }}</td>
-                                <td>{{ result['description'] }}</td>
-                                <td>{{ result['chr'] }} : {{ result['mb'] }}</td>
-                                <td>{{ result['mean'] }}</td>
-                                <td>{{ result['lrs'] }}</td>
-                                {% endfor %}
+                                <td>{{ result.result_fields['species'] }}</td>
+                                <td>{{ result.result_fields['group_name'] }}</td>
+                                <td>{{ result.result_fields['dataset_name'] }}</td>
+                                <td>{{ result.result_fields['symbol'] }}</td>
+                                <td>{{ result.result_fields['description'] }}</td>
+                                <td>{{ result.result_fields['chr'] }} : {{ result['mb'] }}</td>
+                                <td>{{ result.result_fields['mean'] }}</td>
+                                <td>{{ result.result_fields['lrs'] }}</td>
                             </tr>
                             {% endfor %}
                         </tbody>
                     </table>                    
                 </div>
                 <div class="tab-pane" id="tab3">
-                    <table class="table table-hover">
+                    <table id="geno_results" class="table table-hover table-striped table-bordered">
                         <thead>
                             <tr>
                             <th>Marker</th>
@@ -125,91 +267,60 @@
                             </tr>
                         </thead>
                         <tbody>
-                            {% for result in results.mrna_assay %}
+                            {% for result in results.genotype %}
                             <tr>
-                                {% for result in result.result_fields.items() %}
                                 <td>
-                                    <a href="http://gn2python.genenetwork.org/show_trait?trait_id={{ result['marker_name'] }}&dataset={{ result['dataset'] }}">
-                                        {{ result['marker_name'] }}
+                                    <a href="http://gn2python.genenetwork.org/show_trait?trait_id={{ result.result_fields['marker_name'] }}&dataset={{ result.result_fields['dataset'] }}">
+                                        {{ result.result_fields['marker_name'] }}
                                     </a>
                                 </td>
-                                <td>{{ result['species'] }}</td>
-                                <td>{{ result['group_name'] }}</td>
-                                <td>{{ result['dataset_name'] }}</td>
-                                <td>{{ result['chr'] }} : {{ result['mb'] }}</td>
-                                {% endfor %}
+                                <td>{{ result.result_fields['species'] }}</td>
+                                <td>{{ result.result_fields['group_name'] }}</td>
+                                <td>{{ result.result_fields['dataset_name'] }}</td>
+                                <td>{{ result.result_fields['chr'] }} : {{ result.result_fields['mb'] }}</td>
                             </tr>
                             {% endfor %}
                         </tbody>
                     </table>                     
                 </div>
-            </div>
-        </div>
-        
-        
-
-        <!--<div class="bs-docs-example">
-            <table class="table table-hover">
-                <thead>
-                    <tr>
-                    {% for header in header_fields %}
-                        <th>{{header}}</th>
-                    {% endfor %}
-                    </tr>
-                </thead>
-
-                <tbody>
-                    {% for this_trait in trait_list %}
-                    <TR id="{{ this_trait }}">
-                        <TD>
-                            <INPUT TYPE="checkbox" NAME="searchResult" class="checkbox"
-                                   VALUE="{{ this_trait }}">
-                        </TD>
-                        <TD>
-                            <a href="{{ url_for('show_trait_page',
-                                    trait_id = this_trait.name,
-                                    dataset = dataset.name
-                                    )}}">
-                                {{ this_trait.name }}
-                            </a>
-                        </TD>
-                        {% if dataset.type == 'ProbeSet' %}
-                            <TD>{{ this_trait.symbol }}</TD>
-                            <TD>{{ this_trait.description_display }}</TD>
-                            <TD>{{ this_trait.location_repr }}</TD>
-                            <TD>{{ this_trait.mean }}</TD>
-                            <TD>{{ this_trait.LRS_score_repr }}</TD>
-                            <TD>{{ this_trait.LRS_location_repr }}</TD>
-                        {% elif dataset.type == 'Publish' %}
-                            <TD>{{ this_trait.description_display }}</TD>
-                            <TD>{{ this_trait.authors }}</TD>
-                            <TD>
-                                <a href="{{ this_trait.pubmed_link }}">
-                                    {{ this_trait.pubmed_text }}
-                                </a>
-                            </TD>
-                            <TD>{{ this_trait.LRS_score_repr }}</TD>
-                            <TD>{{ this_trait.LRS_location_repr }}</TD>
-                        {% elif dataset.type == 'Geno' %}
-                            <TD>{{ this_trait.location_repr }}</TD>
-                        {% endif %}
-                    </TR>
-                {% endfor %}
-                </tbody>
+                #}
 
-            </table>
-
-            <br />
-
-            <button class="btn"><i class="icon-ok"></i> Select</button>
-            <button class="btn"><i class="icon-remove"></i> Deselect</button>
-            <button class="btn"><i class="icon-resize-vertical"></i> Invert</button>
-            <button class="btn"><i class="icon-plus-sign"></i> Add</button>
-            <button class="btn btn-primary pull-right"><i class="icon-download icon-white"></i> Download Table</button>
-        </div>-->
+<!-- End of body -->
 
-    </div>
+{% endblock %}
 
-<!-- End of body -->
+{% block js %}  
+    <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.js"></script>
+    <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.min.js"></script>
+    <script language="javascript" type="text/javascript" src="/static/packages/DT_bootstrap/DT_bootstrap.js"></script>
+    <script language="javascript" type="text/javascript" src="/static/packages/TableTools/media/js/TableTools.min.js"></script>
+    <script language="javascript" type="text/javascript" src="/static/packages/underscore/underscore-min.js"></script>
 
+    
+    <script type="text/javascript" charset="utf-8">
+        $(document).ready( function () {
+            console.time("Creating table");
+            $('#pheno_results, #mrna_assay_results, #geno_results').dataTable( {
+                //"sDom": "<<'span3'l><'span3'T><'span4'f>'row-fluid'r>t<'row-fluid'<'span6'i><'span6'p>>",
+                "sDom": "lTftipr",
+                "oTableTools": {
+                    "aButtons": [
+                        "copy",
+                        "print",
+                        {
+                            "sExtends":    "collection",
+                            "sButtonText": 'Save <span class="caret" />',
+                            "aButtons":    [ "csv", "xls", "pdf" ]
+                        }
+                    ],
+                    "sSwfPath": "/static/packages/TableTools/media/swf/copy_csv_xls_pdf.swf"
+                },
+                "iDisplayLength": 50,
+                "bLengthChange": true,
+                "bDeferRender": true,
+                "bSortClasses": false
+            } );
+            console.timeEnd("Creating table");
+        });
+    </script>
 {% endblock %}