about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLei Yan2013-06-19 21:08:43 +0000
committerLei Yan2013-06-19 21:08:43 +0000
commit0dd5dfb3925b2198487480d6093eed0d92201fc6 (patch)
treecc103e4067d42442b0d86602f104a406d172945d
parent71f1a5d52d58d07294ef3f2cfa87026025358e74 (diff)
parentaac1dd2f9c5b216b24c6e35676ba5d50f9d5d3c2 (diff)
downloadgenenetwork2-0dd5dfb3925b2198487480d6093eed0d92201fc6.tar.gz
Merge branch 'flask' of git://github.com/zsloan/genenetwork into flask
Conflicts:
	wqflask/base/data_set.py
-rw-r--r--misc/notes.txt8
-rwxr-xr-xwqflask/base/data_set.py2
-rwxr-xr-xwqflask/base/trait.py2
-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/do_search.py8
-rwxr-xr-xwqflask/wqflask/marker_regression/marker_regression.py5
-rw-r--r--wqflask/wqflask/my_pylmm/pyLMM/lmm.py103
-rw-r--r--wqflask/wqflask/my_pylmm/pyLMM/process_plink.py127
-rw-r--r--wqflask/wqflask/search_results.py51
-rw-r--r--wqflask/wqflask/templates/all_results.html134
-rw-r--r--wqflask/wqflask/templates/index_page.html12
-rw-r--r--wqflask/wqflask/templates/quick_search.html317
-rw-r--r--wqflask/wqflask/templates/show_trait_details.html4
-rw-r--r--wqflask/wqflask/views.py36
17 files changed, 1020 insertions, 240 deletions
diff --git a/misc/notes.txt b/misc/notes.txt
index 678e71b8..01f2c96d 100644
--- a/misc/notes.txt
+++ b/misc/notes.txt
@@ -105,6 +105,14 @@ sudo /etc/init.d/redis_6379 start
 
 ===========================================
 
+Run pylint:
+pylint file_name
+
+For options:
+pylint --help 
+
+===========================================
+
 Start screen session:
 
 If "no option -R":
diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py
index 0903bf16..07fe9cd9 100755
--- a/wqflask/base/data_set.py
+++ b/wqflask/base/data_set.py
@@ -394,7 +394,7 @@ class PhenotypeDataSet(DataSet):
                 continue   # for now
                 if not webqtlUtil.hasAccessToConfidentialPhenotypeTrait(privilege=self.privilege, userName=self.userName, authorized_users=this_trait.authorized_users):
                     description = this_trait.pre_publication_description
-            this_trait.description_display = description
+            this_trait.description_display = unicode(description, "utf8")
 
             if not this_trait.year.isdigit():
                 this_trait.pubmed_text = "N/A"
diff --git a/wqflask/base/trait.py b/wqflask/base/trait.py
index 82e013ae..38b3a625 100755
--- a/wqflask/base/trait.py
+++ b/wqflask/base/trait.py
@@ -319,7 +319,7 @@ class GeneralTrait(object):
 
             #XZ: assign SQL query result to trait attributes.
             for i, field in enumerate(self.dataset.display_fields):
-                setattr(self, field, traitInfo[i])
+                setattr(self, field, str(traitInfo[i]))
 
             if self.dataset.type == 'Publish':
                 self.confidential = 0
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/do_search.py b/wqflask/wqflask/do_search.py
index 1b1b56fb..7b3e0869 100644
--- a/wqflask/wqflask/do_search.py
+++ b/wqflask/wqflask/do_search.py
@@ -36,7 +36,7 @@ class DoSearch(object):
     def execute(self, query):
         """Executes query and returns results"""
         query = self.normalize_spaces(query)
-        print("in do_search query is:", pf(query))
+        #print("in do_search query is:", pf(query))
         results = g.db.execute(query, no_parameters=True).fetchall()
         #results = self.cursor.fetchall()
         return results
@@ -90,7 +90,7 @@ class QuickMrnaAssaySearch(DoSearch):
                     AGAINST ('%s' IN BOOLEAN MODE))
                             """ % (escape(self.search_term[0]))
 
-        print("final query is:", pf(query))
+        #print("final query is:", pf(query))
 
         return self.execute(query)
 
@@ -134,7 +134,7 @@ class MrnaAssaySearch(DoSearch):
                                     where_clause,
                                     escape(self.dataset.id)))        
 
-        print("query is:", pf(query))
+        #print("query is:", pf(query))
 
         return query
 
@@ -155,7 +155,7 @@ class MrnaAssaySearch(DoSearch):
                             """ % (escape(self.search_term[0]),
                             escape(str(self.dataset.id)))
 
-        print("final query is:", pf(query))
+        #print("final query is:", pf(query))
 
         return self.execute(query)
 
diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py
index 6ae1318e..334ce631 100755
--- a/wqflask/wqflask/marker_regression/marker_regression.py
+++ b/wqflask/wqflask/marker_regression/marker_regression.py
@@ -78,8 +78,9 @@ class MarkerRegression(object):
             
             genotype_matrix = np.array(trimmed_genotype_data).T
             
-            print("pheno_vector is: ", pf(pheno_vector))
-            print("genotype_matrix is: ", pf(genotype_matrix))
+            print("pheno_vector: ", pf(pheno_vector))
+            print("genotype_matrix: ", pf(genotype_matrix))
+            print("genotype_matrix.shape: ", pf(genotype_matrix.shape))
             
             t_stats, p_values = lmm.run(
                 pheno_vector,
diff --git a/wqflask/wqflask/my_pylmm/pyLMM/lmm.py b/wqflask/wqflask/my_pylmm/pyLMM/lmm.py
index a3ba8fdb..5bfc3a01 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,6 +56,20 @@ def run_human(pheno_vector,
     keep = True - v
     keep = keep.reshape((len(keep),))
 
+    identifier = str(uuid.uuid4())
+    
+    print("pheno_vector: ", pf(pheno_vector))
+    print("kinship_matrix: ", pf(kinship_matrix))
+    print("kinship_matrix.shape: ", pf(kinship_matrix.shape))
+
+    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))
@@ -60,16 +79,18 @@ def run_human(pheno_vector,
         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 = []
 
-    print("input_file: ", plink_input_file)
+    #print("input_file: ", plink_input_file)
 
     with Bench("Opening and loading pickle file"):
         with gzip.open(plink_input_file, "rb") as input_file:
@@ -87,45 +108,65 @@ def run_human(pheno_vector,
         with Bench("Create list of inputs"):
             inputs = list(plink_input)
             
+        print("len(genotypes): ", len(inputs))
+
         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
 
 
+#class HumanAssociation(object):
+#    def __init__(self):
+#        
+
 def human_association(snp,
                       n,
                       keep,
@@ -202,6 +243,8 @@ def run(pheno_vector,
     with Bench("LMM_ob fitting"):
         lmm_ob.fit()
 
+    print("genotype_matrix: ", genotype_matrix.shape)
+
     with Bench("Doing GWAS"):
         t_stats, p_values = GWAS(pheno_vector,
                                 genotype_matrix,
@@ -304,7 +347,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 4238aa7f..bb0313b3 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
@@ -74,6 +73,7 @@ class SearchResultPage(object):
             self.quick = True
             self.search_terms = kw['q']
             print("self.search_terms is: ", self.search_terms)
+            self.trait_type = kw['trait_type']
             self.quick_search()
         else:
             self.results = []
@@ -124,24 +124,53 @@ class SearchResultPage(object):
                     FROM QuickSearch
                     WHERE MATCH (terms)
                           AGAINST ('{}' IN BOOLEAN MODE) """.format(search_terms)
-        dbresults = g.db.execute(query, no_parameters=True).fetchall()
+        
+        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)
-            
-            self.results[type_dict[dbresult.table_name]].append(this_result)
+            if self.trait_type == type_dict[dbresult.table_name] or self.trait_type == 'all':
+                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 this_species not in self.species_groups:
+                    self.species_groups[this_species] = {}
+                if type_dict[dbresult.table_name] not in self.species_groups[this_species]:
+                    self.species_groups[this_species][type_dict[dbresult.table_name]] = []
+                if this_group not in self.species_groups[this_species][type_dict[dbresult.table_name]]:
+                    self.species_groups[this_species][type_dict[dbresult.table_name]].append(this_group)
+                #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] = []
+                #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']))
+        import redis
+        Redis = redis.Redis()
+        
+        
+        
+    #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 +238,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/all_results.html b/wqflask/wqflask/templates/all_results.html
new file mode 100644
index 00000000..a42e42d8
--- /dev/null
+++ b/wqflask/wqflask/templates/all_results.html
@@ -0,0 +1,134 @@
+            <ul class="nav nav-tabs">

+                {% for species in species_groups %}

+                <li> <a href="#tab{{ loop.index }}" data-toggle="tab">{{ species }}</a></li>

+                {% endfor %}

+            </ul>

+            <div class="tab-content">

+                {% for species in species_groups %}

+                <div class="tab-pane active" id="tab{{ loop.index }}">

+                    <div class="tabbable tabs-left">

+                        <ul class="nav nav-tabs">

+                            {% if species_groups[species]['phenotype'] %}

+                            <li class="active"> <a href="#tab{{ loop.index }}_1" data-toggle="tab">Phenotype</a></li>

+                            {% endif %}

+                            {% if species_groups[species]['mrna_assay'] %}

+                            <li> <a href="#tab{{ loop.index }}_2" data-toggle="tab">mRNA Assay</a></li>

+                            {% endif %}

+                            {% if species_groups[species]['genotype'] %}

+                            <li> <a href="#tab{{ loop.index }}_3" data-toggle="tab">Genotype</a></li>

+                            {% endif %}

+                        </ul>

+                        <div class="tab-content">

+                            {% if species_groups[species]['phenotype'] %}

+                            <div class="tab-pane active" id="tab{{ loop.index }}_1">

+                                <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>

+                            {% endif %}

+                            {% if species_groups[species]['mrna_assay'] %}

+                            <div class="tab-pane" id="tab{{ loop.index }}_2">

+                                <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>

+                            {% endif %}

+                            {% if species_groups[species]['genotype'] %}

+                            <div class="tab-pane" id="tab{{ loop.index }}_3">

+                                <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>

+                            {% endif %}

+                        </div>

+                    </div>

+                </div>

+                {% endfor %}

+            </div>
\ No newline at end of file
diff --git a/wqflask/wqflask/templates/index_page.html b/wqflask/wqflask/templates/index_page.html
index 0cc1c353..a9f2cb24 100644
--- a/wqflask/wqflask/templates/index_page.html
+++ b/wqflask/wqflask/templates/index_page.html
@@ -9,7 +9,6 @@
         <div class="container">
             <h1>GeneNetwork</h1>
             <p class="lead">Open source bioinformatics for systems genetics</p>
-            <p>- Lei Yan</p>
         </div>
     </header>
 
@@ -33,7 +32,14 @@
                     </div>
                     <form method="get" action="/search"  name="SEARCHFORM">
                         <fieldset>
-                            <label for="quick">Search:</label>
+                            <div class="input-prepend">
+                                <select id="trait_type" name="trait_type" class="span2">
+                                    <option value="all">All</option>
+                                    <option value="mrna_assay">Molecular Assays</option>
+                                    <option value="phenotype">Phenotypes</option>
+                                    <option value="genotype">Genotypes</option>
+                                </select>
+                            </div>
                             <div class="input-append">
                                 <input class="input-xlarge"
                                     id="quick" name="q"
@@ -43,11 +49,9 @@
                                     class="btn btn-primary" value="Search">
                             </div>
                         </fieldset>
-                       
                     </form>
                 </section>
                 <section id="search">
-                    
                     <div class="page-header">
                         <h1>Select and search</h1>
                     </div>
diff --git a/wqflask/wqflask/templates/quick_search.html b/wqflask/wqflask/templates/quick_search.html
index d50b4937..b0e38708 100644
--- a/wqflask/wqflask/templates/quick_search.html
+++ b/wqflask/wqflask/templates/quick_search.html
@@ -21,30 +21,158 @@
         <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>
-        
-        <p>To study a record, click on its ID below.<br />
-        Check records below and click Add button to add to selection.</p>
+
 
         <div class="tabbable"> <!-- Only required for left/right tabs -->
+            {% if trait_type == 'all' %}
+                {% include 'all_results.html' %}
+            {% else %}
             <ul class="nav nav-tabs">
-                <li class="active"> <a href="#tab1" data-toggle="tab">Phenotype</a></li>
-                <li>                <a href="#tab2" data-toggle="tab">mRNA Assay</a></li>
-                <li>                <a href="#tab3" data-toggle="tab">Genotype</a></li>
+                {% for species in species_groups %}
+                <li> <a href="#tab{{ loop.index }}" data-toggle="tab">{{ species }}</a></li>
+                {% endfor %}
             </ul>
             <div class="tab-content">
-                <div class="tab-pane active" id="tab1">
-                    <table class="table table-hover">
+                {% for species in species_groups %}
+                <div class="tab-pane active" id="tab{{ loop.index }}">
+                    <div>
+                        {#
+                        <ul class="nav nav-tabs">
+                            {% if species_groups[species]['phenotype'] %}
+                            <li class="active"> <a href="#tab{{ loop.index }}_1" data-toggle="tab">Phenotype</a></li>
+                            {% endif %}
+                            {% if species_groups[species]['mrna_assay'] %}
+                            <li> <a href="#tab{{ loop.index }}_2" data-toggle="tab">mRNA Assay</a></li>
+                            {% endif %}
+                            {% if species_groups[species]['genotype'] %}
+                            <li> <a href="#tab{{ loop.index }}_3" data-toggle="tab">Genotype</a></li>
+                            {% endif %}
+                        </ul>
+                        #}
+                        <div>
+                            {% if trait_type == 'phenotype' and species_groups[species]['phenotype'] %}
+                                <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>
+                            {% endif %}
+                            {% if trait_type == 'mrna_assay' and species_groups[species]['mrna_assay'] %}
+                                <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>
+                            {% endif %}
+                            {% if trait_type == 'genotype' and species_groups[species]['genotype'] %}
+                                <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>
+                            {% endif %}
+                        </div>
+                    </div>
+                </div>
+                {% endfor %}
+            </div>
+            {% endif %}
+        </div>
+    </div>
+
+<!-- End of body -->
+
+{% endblock %}
+
+                {#
+                    <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 +185,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 +219,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 +249,58 @@
                             </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>-->
-
-    </div>
-
-<!-- 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 %}
+
diff --git a/wqflask/wqflask/templates/show_trait_details.html b/wqflask/wqflask/templates/show_trait_details.html
index c3abfc9f..b57c3c21 100644
--- a/wqflask/wqflask/templates/show_trait_details.html
+++ b/wqflask/wqflask/templates/show_trait_details.html
@@ -19,11 +19,11 @@
             BLAT Specifity
         </a>
     </dt>
-    <dd>{{ "%.1f" % (this_trait.probe_set_specificity) }}</dd>
+    <dd>{{ "%s" % (this_trait.probe_set_specificity) }}</dd>
     {% endif %}
     {% if this_trait.probe_set_blat_score %}
     <dt>BLAT Score</dt>
-    <dd>{{ "%i" % (this_trait.probe_set_blat_score) }}</dd>
+    <dd>{{ "%s" % (this_trait.probe_set_blat_score) }}</dd>
     {% endif %}
 </dl>
 
diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py
index 102863f0..d50a9aa2 100644
--- a/wqflask/wqflask/views.py
+++ b/wqflask/wqflask/views.py
@@ -78,17 +78,28 @@ def search_page():
         else:
             return render_template("data_sharing.html", **template_vars.__dict__)
     else:
-        print("calling search_results.SearchResultPage")
-        the_search = search_results.SearchResultPage(request.args)
-        print("template_vars is:", pf(the_search.__dict__))
-        #print("trait_list is:", pf(the_search.__dict__['trait_list'][0].__dict__))
-        #for trait in the_search.trait_list:
-        #    print(" -", trait.description_display)
-
-        if the_search.quick:
-            return render_template("quick_search.html", **the_search.__dict__)
+        key = "search_results:v2:" + json.dumps(request.args, sort_keys=True)
+        print("key is:", pf(key))
+        with Bench("Loading cache"):
+            result = Redis.get(key)
+            
+        if result:
+            print("Cache hit!!!")
+            with Bench("Loading results"):
+                result = pickle.loads(result)
         else:
-            return render_template("search_result_page.html", **the_search.__dict__)
+            print("calling search_results.SearchResultPage")
+            the_search = search_results.SearchResultPage(request.args)
+            result = the_search.__dict__
+            
+            print("result: ", pf(result))
+            Redis.set(key, pickle.dumps(result))
+            Redis.expire(key, 60*60)
+
+        if result['quick']:
+            return render_template("quick_search.html", **result)
+        else:
+            return render_template("search_result_page.html", **result)
 
 
 @app.route("/whats_new")
@@ -173,9 +184,10 @@ def marker_regression_page():
     for key, value in initial_start_vars.iteritems():
         if key in wanted or key.startswith(('value:')):
             start_vars[key] = value
-    
+
     version = "v14"
     key = "marker_regression:{}:".format(version) + json.dumps(start_vars, sort_keys=True)
+    print("key is:", pf(key))
     with Bench("Loading cache"):
         result = Redis.get(key)
     
@@ -258,4 +270,4 @@ def json_default_handler(obj):
     
 #@app.after_request
 #def after_request(response):
-#    gc.collect()
\ No newline at end of file
+#    gc.collect()