about summary refs log tree commit diff
path: root/wqflask/maintenance/gen_select_dataset.py
diff options
context:
space:
mode:
Diffstat (limited to 'wqflask/maintenance/gen_select_dataset.py')
-rw-r--r--wqflask/maintenance/gen_select_dataset.py724
1 files changed, 119 insertions, 605 deletions
diff --git a/wqflask/maintenance/gen_select_dataset.py b/wqflask/maintenance/gen_select_dataset.py
index 7d2605c1..33813051 100644
--- a/wqflask/maintenance/gen_select_dataset.py
+++ b/wqflask/maintenance/gen_select_dataset.py
@@ -19,622 +19,136 @@
 #
 #
 # This module is used by GeneNetwork project (www.genenetwork.org)
-#
-# Created by GeneNetwork Core Team 2010/08/10
-#
-# Last updated by NL 2011/01/27
 
-# created by Ning Liu 07/01/2010
-# This script is to generate selectDatasetMenu.js file for cascade menu in the main search page http://www.genenetwork.org/.
-# This script will be run automatically every one hour or manually when database has been changed .
+# This script is to generate the data for the main menus on the home page
+# It needs to be run manually when database has been changed .
 
 from __future__ import print_function, division
 
-import sys, os
+import sys
 
-current_file_name = __file__
-pathname = os.path.dirname( current_file_name )
-abs_path = os.path.abspath(pathname)
-sys.path.insert(0, abs_path + '/..')
+sys.path.insert(0, "..")
 
 import MySQLdb
-import os
-import string
-import time
-import datetime
-
-from base import template
-from base import webqtlConfig
-
-#################################################################################
-# input: searchArray, targetValue
-# function: retrieve index info of target value in designated array (searchArray)
-# output: return index info
-##################################################################################
-def getIndex(searchArray=None, targetValue=None):
-    for index in range(len(searchArray)):
-        if searchArray[index][0]==targetValue:
-            return index
-
-# build MySql database connection
-con = MySQLdb.Connect(db=webqtlConfig.DB_NAME,host=webqtlConfig.MYSQL_SERVER, user=webqtlConfig.DB_USER,passwd=webqtlConfig.DB_PASSWD)
-cursor = con.cursor()
 
-# create js_select.js file
-fileHandler = open(webqtlConfig.HTMLPATH + 'javascript/selectDatasetMenu.js', 'w')
+import simplejson as json
 
-# define SpeciesString, GroupString, TypeString, DatabasingString, LinkageString for output
-# outputSpeciesStr is for building Species Array(sArr) in js file; outputGroupStr is for Group Array(gArr)
-# outputTypeStr is for Type Array(tArr); outputDatabaseStr is for Database Array(dArr)
-# outputLinkStr is for Linkage Array(lArr)
-outputTimeStr ="/* Generated Date : %s , Time : %s */ \n" % (datetime.date.today(),time.strftime("%H:%M ", time.localtime()))
-outputTimeStr =""
-outputSpeciesStr ='var sArr = [\n{txt:\'\',val:\'\'},\n'
-outputGroupStr ='var gArr = [\n{txt:\'\',val:\'\'},\n'
-outputTypeStr ='var tArr = [\n{txt:\'\',val:\'\'},\n'
-outputDatabaseStr ='var dArr = [\n{txt:\'\',val:\'\'},\n'
-outputLinkStr ='var lArr = [\n null,\n'
+from pprint import pformat as pf
 
-# built speices array in js file for select menu in the main search page http://www.genenetwork.org/
-cursor.execute("select Name, MenuName from Species order by OrderId")
-speciesResult = cursor.fetchall()
-speciesTotalResult = list(speciesResult)
-speciesResultsTotalNum = cursor.rowcount
-if speciesResultsTotalNum >0:
-    for speciesItem in speciesResult:
-        speciesVal = speciesItem[0]
-        speciesTxt = speciesItem[1]
-        outputSpeciesStr += '{txt:\'%s\',val:\'%s\'},\n'%(speciesTxt,speciesVal)
-# 'All Species' option for 'Species' select menu
-outputSpeciesStr +='{txt:\'All Species\',val:\'All Species\'}];\n\n'
-#speciesTotalResult is a list which inclues all species' options
-speciesTotalResult.append(('All Species','All Species'))
-
-# built group array in js file for select menu in the main search page http://www.genenetwork.org/
-cursor.execute("select distinct InbredSet.Name, InbredSet.FullName from InbredSet, Species, ProbeFreeze, GenoFreeze, PublishFreeze where InbredSet.SpeciesId= Species.Id and InbredSet.Name != 'BXD300' and (PublishFreeze.InbredSetId = InbredSet.Id or GenoFreeze.InbredSetId = InbredSet.Id or ProbeFreeze.InbredSetId = InbredSet.Id) order by InbredSet.Name")
-groupResults = cursor.fetchall()
-groupTotalResults = list(groupResults)
-groupResultsTotalNum = cursor.rowcount
-if groupResultsTotalNum > 0:
-    for groupItem in groupResults:
-        groupVal = groupItem[0]
-        groupTxt = groupItem[1]
-        outputGroupStr += '{txt:\'%s\',val:\'%s\'},\n'%(groupTxt,groupVal)
-# add 'All Groups' option for 'Group' select menu
-outputGroupStr +='{txt:\'All Groups\',val:\'all groups\'}];\n\n'
-# groupTotalResults is a list which inclues all groups' options
-groupTotalResults.append(('all groups','All Groups'))
-
-# built type array in js file for select menu in the main search page http://www.genenetwork.org/
-cross = groupVal
-cursor.execute("select distinct Tissue.Name, concat(Tissue.Name, ' mRNA') from ProbeFreeze, ProbeSetFreeze, InbredSet, Tissue where ProbeFreeze.TissueId = Tissue.Id and ProbeFreeze.InbredSetId = InbredSet.Id and ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and ProbeSetFreeze.public > %d order by Tissue.Name" % (webqtlConfig.PUBLICTHRESH))
-typeResults = cursor.fetchall()
-typeTotalResults = list(typeResults)
-typeResultsTotalNum = cursor.rowcount
-if typeResultsTotalNum > 0:
-    for typeItem in typeResults:
-        typeVal = typeItem[0]
-        typeTxt = typeItem[1]
-        outputTypeStr += '{txt:\'%s\',val:\'%s\'},\n'%(typeTxt,typeVal)
-# add 'Phenotypes' and 'Genotypes' options for 'Type' select menu
-outputTypeStr +='{txt:\'Phenotypes\',val:\'Phenotypes\'},\n'
-outputTypeStr +='{txt:\'Genotypes\',val:\'Genotypes\'}];\n\n'
-# typeTotalResults is a list which inclues all types' options
-typeTotalResults.append(('Phenotypes','Phenotypes'))
-typeTotalResults.append(('Genotypes','Genotypes'))
-
-# built dataset array in js file for select menu in the main search page http://www.genenetwork.org/
-tissue = typeVal
-cursor.execute("select ProbeSetFreeze.Name, ProbeSetFreeze.FullName from ProbeSetFreeze, ProbeFreeze, InbredSet, Tissue where ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and ProbeFreeze.TissueId = Tissue.Id and ProbeFreeze.InbredSetId = InbredSet.Id and ProbeSetFreeze.public > %d order by ProbeSetFreeze.CreateTime desc" % (webqtlConfig.PUBLICTHRESH))
-datasetResults = cursor.fetchall()
-datasetTotalResults = list(datasetResults)
-datasetResultsTotalNum = cursor.rowcount
-if datasetResultsTotalNum > 0:
-    for datasetItem in datasetResults:
-        datasetVal = datasetItem[0]
-        datasetTxt = datasetItem[1]
-        outputDatabaseStr += '{txt:\'%s\',val:\'%s\'},\n'%(datasetTxt,datasetVal)
-
-# This part is to built linkage array in js file, the linkage is among Species, Group, Type and Database.
-# The format of linkage array is [speciesIndex, groupIndex, typeIndex, databaseIndex]
-if speciesResultsTotalNum >0:
-    for speciesItem in speciesResult:
-        speciesVal = speciesItem[0]
-        sIndex = getIndex(searchArray=speciesTotalResult,targetValue=speciesVal)+1
-
-        # retrieve group info based on specie
-        cursor.execute("select distinct InbredSet.Name, InbredSet.FullName from InbredSet, Species, ProbeFreeze, GenoFreeze, PublishFreeze where InbredSet.SpeciesId= Species.Id and Species.Name='%s' and InbredSet.Name != 'BXD300' and (PublishFreeze.InbredSetId = InbredSet.Id or GenoFreeze.InbredSetId = InbredSet.Id or ProbeFreeze.InbredSetId = InbredSet.Id) order by InbredSet.Name" % speciesVal)
-        groupResults = cursor.fetchall()
-        groupResultsNum = cursor.rowcount
+from base import webqtlConfig
 
-        if groupResultsNum > 0:
-            for groupItem in groupResults:
-                groupVal = groupItem[0]
-                gIndex = getIndex(searchArray=groupTotalResults, targetValue=groupVal)+1
 
-                cross = groupVal
-                # if group also exists in PublishFreeze table, then needs to add related Published Phenotypes in Database Array(dArr) and Linkage Array(lArr)
-                # 'MDP' case is related to 'Mouse Phenome Database'
-                cursor.execute("select PublishFreeze.Id from PublishFreeze, InbredSet where PublishFreeze.InbredSetId = InbredSet.Id and InbredSet.Name = '%s'" % cross)
-                if (cursor.fetchall()):
-                    typeVal = "Phenotypes"
-                    if cross=='MDP':
-                        datasetTxt = "Mouse Phenome Database"
+# build MySql database connection
+Con = MySQLdb.Connect(db=webqtlConfig.DB_NAME,host=webqtlConfig.MYSQL_SERVER,
+                      user=webqtlConfig.DB_USER,
+                      passwd=webqtlConfig.DB_PASSWD)
+Cursor = Con.cursor()
+
+
+def get_species():
+    """Build species list"""
+    Cursor.execute("select Name, MenuName from Species order by OrderId")
+    species = list(Cursor.fetchall())
+    return species
+
+
+def get_groups(species):
+    """Build groups list"""
+    groups = {}
+    for species_name, _species_full_name in species:
+        Cursor.execute("""select InbredSet.Name, InbredSet.FullName from InbredSet,
+                       Species,
+                       ProbeFreeze, GenoFreeze, PublishFreeze where Species.Name = %s
+                       and InbredSet.SpeciesId = Species.Id and InbredSet.Name != 'BXD300' and
+                       (PublishFreeze.InbredSetId = InbredSet.Id
+                            or GenoFreeze.InbredSetId = InbredSet.Id
+                            or ProbeFreeze.InbredSetId = InbredSet.Id)
+                        group by InbredSet.Name
+                        order by InbredSet.Name""", (species_name))
+        groups[species_name] = list(Cursor.fetchall())
+    return groups
+
+
+def get_types(groups):
+    """Build types list"""
+    types = {}
+    for species, group_dict in groups.iteritems():
+        types[species] = {}
+        for group_name, _group_full_name in group_dict:
+            # make group an alias to shorten the code
+            group = types[species][group_name] = [("Phenotypes", "Phenotypes"),
+                                                  ("Genotypes", "Genotypes")]           
+            Cursor.execute("""select distinct Tissue.Name, concat(Tissue.Name, ' mRNA') from
+                       ProbeFreeze,
+                       ProbeSetFreeze, InbredSet, Tissue where ProbeFreeze.TissueId = Tissue.Id and
+                       ProbeFreeze.InbredSetId = InbredSet.Id and
+                       InbredSet.Name = %s and ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and
+                       ProbeSetFreeze.public > %s
+                       order by Tissue.Name""", (group_name, webqtlConfig.PUBLICTHRESH))
+            group += Cursor.fetchall()
+    return types
+
+
+def get_datasets(types):
+    """Build datasets list"""
+    datasets = {}
+    for species, group_dict in types.iteritems():
+        datasets[species] = {}
+        for group, type_list in group_dict.iteritems():
+            datasets[species][group] = {}
+            for type_name, type_full_name in type_list:
+                dataset_text = dataset_value = None
+                if type_name == "Phenotypes":
+                    dataset_value = "%sPublish" % group
+                    if group == 'MDP':
+                        dataset_text = "Mouse Phenome Database"
                     else:
-                        datasetTxt = "%s Published Phenotypes" % cross
-                    datasetVal = "%sPublish" % cross
-                    outputDatabaseStr += '{txt:\'%s\',val:\'%s\'},\n'% (datasetTxt,datasetVal)
-                    datasetTotalResults.append(('%s'% datasetVal,'%s' % datasetTxt))
-
-                    tIndex = getIndex(searchArray=typeTotalResults,targetValue=typeVal)+1
-                    dIndex = getIndex(searchArray=datasetTotalResults, targetValue=datasetVal)+1
-                    outputLinkStr +='[%d,%d,%d,%d],\n'%(sIndex,gIndex,tIndex,dIndex)
-
-                # if group also exists in GenoFreeze table, then needs to add related Genotypes in database Array(dArr)
-                cursor.execute("select GenoFreeze.Id from GenoFreeze, InbredSet where GenoFreeze.InbredSetId = InbredSet.Id and InbredSet.Name = '%s'" % cross)
-                if (cursor.fetchall()):
-                    typeVal = "Genotypes"
-                    datasetTxt = "%s Genotypes" % cross
-                    datasetVal = "%sGeno" % cross
-                    outputDatabaseStr += '{txt:\'%s\',val:\'%s\'},\n'%(datasetTxt,datasetVal)
-                    typeTotalResults.append(('Genotypes','Genotypes'))
-                    datasetTotalResults.append(('%s'% datasetVal,'%s' % datasetTxt))
-
-                    tIndex = getIndex(searchArray=typeTotalResults,targetValue=typeVal)+1
-                    dIndex = getIndex(searchArray=datasetTotalResults, targetValue=datasetVal)+1
-                    outputLinkStr +='[%d,%d,%d,%d],\n'%(sIndex,gIndex,tIndex,dIndex)
-
-                # retrieve type(tissue) info based on group
-                # if cross is equal to 'BXD', then need to seach for 'BXD' and 'BXD300' InbredSet
-                if cross == "BXD":
-                    cross2 = "BXD', 'BXD300"
+                        dataset_text = "%s Published Phenotypes" % group
+
+                elif type_name == "Genotypes":
+                    dataset_value = "%sGeno" % group
+                    dataset_text = "%s Genotypes" % group
+                    
+                if dataset_value:
+                    datasets[species][group][type_name] = [(dataset_value, dataset_text)]
                 else:
-                    cross2 = cross
-                cursor.execute("select distinct Tissue.Name, concat(Tissue.Name, ' mRNA') from ProbeFreeze, ProbeSetFreeze, InbredSet, Tissue where ProbeFreeze.TissueId = Tissue.Id and ProbeFreeze.InbredSetId = InbredSet.Id and InbredSet.Name in ('%s') and ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and ProbeSetFreeze.public > %d order by Tissue.Name" % (cross2, webqtlConfig.PUBLICTHRESH))
-                typeResults = cursor.fetchall()
-                typeResultsNum = cursor.rowcount
-
-                if typeResultsNum > 0:
-                    for typeItem in typeResults:
-                        typeVal = typeItem[0]
-                        tIndex = getIndex(searchArray=typeTotalResults, targetValue=typeVal)+1
-                        # retrieve database(dataset) info based on group(InbredSet) and type(Tissue)
-                        tissue = typeVal
-                        cursor.execute("select ProbeSetFreeze.Name, ProbeSetFreeze.FullName from ProbeSetFreeze, ProbeFreeze, InbredSet, Tissue where ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and ProbeFreeze.TissueId = Tissue.Id and ProbeFreeze.InbredSetId = InbredSet.Id and InbredSet.Name in ('%s') and Tissue.name = '%s' and ProbeSetFreeze.public > %d order by ProbeSetFreeze.CreateTime desc" % (cross2, tissue, webqtlConfig.PUBLICTHRESH))
-                        datasetResults = cursor.fetchall()
-                        datasetResultsNum = cursor.rowcount
-
-                        if datasetResultsNum > 0:
-                            for datasetItem in datasetResults:
-                                datasetVal = datasetItem[0]
-                                dIndex = getIndex(searchArray=datasetTotalResults, targetValue=datasetVal)+1
-                                outputLinkStr +='[%d,%d,%d,%d],\n'%(sIndex,gIndex,tIndex,dIndex)
-
-# add 'All Phenotypes' option for 'Database' select menu
-# for 'All Species'option in 'Species' select menu, 'Database' select menu will show 'All Phenotypes' option
-outputDatabaseStr += '{txt:\'%s\',val:\'%s\'}];\n\n'%('All Phenotypes','_allPublish')
-datasetTotalResults.append(('_allPublish','All Phenotypes'))
-
-sIndex = getIndex(searchArray=speciesTotalResult,targetValue='All Species')+1
-gIndex = getIndex(searchArray=groupTotalResults, targetValue='all groups')+1
-tIndex = getIndex(searchArray=typeTotalResults,targetValue='Phenotypes')+1
-dIndex = getIndex(searchArray=datasetTotalResults, targetValue='_allPublish')+1
-outputLinkStr +='[%d,%d,%d,%d]];\n\n'%(sIndex,gIndex,tIndex,dIndex)
-
-# Combine sArr, gArr, tArr, dArr and lArr output string together
-outputStr = outputTimeStr+outputSpeciesStr+outputGroupStr+outputTypeStr+outputDatabaseStr+outputLinkStr
-outputStr +='''
-
-/*
-*  function: based on different browser use, will have different initial actions;
-*  Once the index.html page is loaded, this function will be called
-*/
-function initialDatasetSelection()
-{
-        defaultSpecies =getDefaultValue('species');
-        defaultSet =getDefaultValue('cross');
-        defaultType =getDefaultValue('tissue');
-        defaultDB =getDefaultValue('database');
-
-        if (navigator.userAgent.indexOf('MSIE')>=0)
-        {
-                sOptions = fillOptionsForIE(null,defaultSpecies);
-                var menu0 ="<SELECT NAME='species' ID='species' SIZE='1' onChange='fillOptions(\\"species\\");'>"+sOptions+"</Select>";
-                document.getElementById('menu0').innerHTML = menu0;
-
-                gOptions = fillOptionsForIE('species',defaultSet);
-                var menu1 ="<Select NAME='cross' size=1 id='cross' onchange='fillOptions(\\"cross\\");'>"+gOptions+"</Select><input type=\\"button\\" class=\\"button\\" value=\\"Info\\" onCLick=\\"javascript:crossinfo();\\">";
-                document.getElementById('menu1').innerHTML =menu1;
-
-                tOptions = fillOptionsForIE('cross',defaultType);
-                var menu2 ="<Select NAME='tissue' size=1 id='tissue' onchange='fillOptions(\\"tissue\\");'>"+tOptions+"</Select>";
-                document.getElementById('menu2').innerHTML =menu2;
-
-                dOptions = fillOptionsForIE('tissue',defaultDB);
-                var menu3 ="<Select NAME='database' size=1 id='database'>"+dOptions+"</Select><input type=\\"button\\" class=\\"button\\" value=\\"Info\\" onCLick=\\"javascript:databaseinfo();\\">";
-                document.getElementById('menu3').innerHTML =menu3;
-
-        }else{
-                fillOptions(null);
-    }
-        searchtip();
-}
-
-/*
-*  input: selectObjId (designated select menu, such as species, cross, etc... )
-*  defaultValue (default Value of species, cross,tissue or database)
-*  function: special for IE browser,setting options value for select menu dynamically based on linkage array(lArr),
-*  output: options string
-*/
-function fillOptionsForIE(selectObjId,defaultValue)
-{
-        var options='';
-        if(selectObjId==null)
-        {
-                var len = sArr.length;
-                for (var i=1; i < len; i++) {
-                    // setting Species' option
-                        if( sArr[i].val==defaultValue){
-                                options =options+"<option selected=\\"selected\\" value='"+sArr[i].val+"'>"+sArr[i].txt+"</option>";
-                        }else{
-                                options =options+"<option value='"+sArr[i].val+"'>"+sArr[i].txt+"</option>";
-                        }
-                }
-        }else if(selectObjId=='species')
-        {
-                var speciesObj = document.getElementById('species');
-                var len = lArr.length;
-                var arr = [];
-                var idx = 0;
-                for (var i=1; i < len; i++) {
-                        //get group(cross) info from lArr
-                        if(lArr[i][0]==(getIndexByValue('species',speciesObj.value)).toString()&&!Contains(arr,lArr[i][1]))
-                        {
-                                arr[idx++]=lArr[i][1];
-                        }
-                }
-                idx=0;
-                len = arr.length;
-                removeOptions("cross");
-                for (var i=0; i < len; i++) {
-                        // setting Group's option
-                        if( gArr[arr[i]].val==defaultValue){
-                                options =options+"<option selected=\\"selected\\" value='"+gArr[arr[i]].val+"'>"+gArr[arr[i]].txt+"</option>";
-                        }else{
-                                options =options+"<option value='"+gArr[arr[i]].val+"'>"+gArr[arr[i]].txt+"</option>";
-                        }
-
-                }
-        }else if(selectObjId=='cross')
-        {
-                var speciesObj = document.getElementById('species');
-                var groupObj = document.getElementById('cross');
-                var len = lArr.length;
-                var arr = [];
-                var idx = 0;
-                for (var i=1; i < len; i++) {
-                        //get type(tissue) info from lArr
-                        if(lArr[i][0]==(getIndexByValue('species',speciesObj.value)).toString()&&lArr[i][1]==(getIndexByValue('cross',groupObj.value)).toString()&&!Contains(arr,lArr[i][2]))
-                        {
-                                arr[idx++]=lArr[i][2];
-                        }
-                }
-                idx=0;
-                len = arr.length;
-                removeOptions("tissue");
-                for (var i=0; i < len; i++) {
-                        // setting Type's option
-                        if( tArr[arr[i]].val==defaultValue){
-                                options =options+"<option selected=\\"selected\\" value='"+tArr[arr[i]].val+"'>"+tArr[arr[i]].txt+"</option>";
-                        }else{
-                                options =options+"<option value='"+tArr[arr[i]].val+"'>"+tArr[arr[i]].txt+"</option>";
-                        }
-                }
-
-        }else if(selectObjId=='tissue')
-        {
-                var speciesObj = document.getElementById('species');
-                var groupObj = document.getElementById('cross');
-                var typeObj = document.getElementById('tissue');
-
-                var len = lArr.length;
-                var arr = [];
-                var idx = 0;
-                for (var i=1; i < len; i++) {
-                        //get dataset(database) info from lArr
-                        if(lArr[i][0]==(getIndexByValue('species',speciesObj.value)).toString()&&lArr[i][1]==(getIndexByValue('cross',groupObj.value)).toString()&&lArr[i][2]==(getIndexByValue('tissue',typeObj.value)).toString()&&!Contains(arr,lArr[i][3]))
-                        {
-                                arr[idx++]=lArr[i][3];
-                        }
-                }
-                idx=0;
-                len = arr.length;
-                removeOptions("database");
-                for (var i=0; i < len; i++) {
-                        // setting Database's option
-                        if( dArr[arr[i]].val==defaultValue){
-                                options =options+"<option SELECTED value='"+dArr[arr[i]].val+"'>"+dArr[arr[i]].txt+"</option>";
-                        }else{
-                                options =options+"<option value='"+dArr[arr[i]].val+"'>"+dArr[arr[i]].txt+"</option>";
-                        }
-                }
-        }
-        return options;
-}
-/*
-*  input: selectObjId (designated select menu, such as species, cross, etc... )
-*  function: setting options value for select menu dynamically based on linkage array(lArr)
-*  output: null
-*/
-function fillOptions(selectObjId)
-{
-        if(selectObjId==null)
-        {
-
-                var speciesObj = document.getElementById('species');
-                var len = sArr.length;
-                for (var i=1; i < len; i++) {
-                    // setting Species' option
-                        speciesObj.options[i-1] = new Option(sArr[i].txt, sArr[i].val);
-                }
-                updateChocie('species');
-
-        }else if(selectObjId=='species')
-        {
-                var speciesObj = document.getElementById('species');
-                var groupObj = document.getElementById('cross');
-                var len = lArr.length;
-                var arr = [];
-                var idx = 0;
-                for (var i=1; i < len; i++) {
-                        //get group(cross) info from lArr
-                        if(lArr[i][0]==(getIndexByValue('species',speciesObj.value)).toString()&&!Contains(arr,lArr[i][1]))
-                        {
-                                arr[idx++]=lArr[i][1];
-                        }
-                }
-                idx=0;
-                len = arr.length;
-                removeOptions("cross");
-                for (var i=0; i < len; i++) {
-                        // setting Group's option
-                        groupObj.options[idx++] = new Option(gArr[arr[i]].txt, gArr[arr[i]].val);
-                }
-                updateChocie('cross');
-
-        }else if(selectObjId=='cross')
-        {
-                var speciesObj = document.getElementById('species');
-                var groupObj = document.getElementById('cross');
-                var typeObj = document.getElementById('tissue');
-                var len = lArr.length;
-                var arr = [];
-                var idx = 0;
-                for (var i=1; i < len; i++) {
-                        //get type(tissue) info from lArr
-                        if(lArr[i][0]==(getIndexByValue('species',speciesObj.value)).toString()&&lArr[i][1]==(getIndexByValue('cross',groupObj.value)).toString()&&!Contains(arr,lArr[i][2]))
-                        {
-                                arr[idx++]=lArr[i][2];
-                        }
-                }
-                idx=0;
-                len = arr.length;
-                removeOptions("tissue");
-                for (var i=0; i < len; i++) {
-                        // setting Type's option
-                        typeObj.options[idx++] = new Option(tArr[arr[i]].txt, tArr[arr[i]].val);
-                }
-                updateChocie('tissue');
-
-        }else if(selectObjId=='tissue')
-        {
-                var speciesObj = document.getElementById('species');
-                var groupObj = document.getElementById('cross');
-                var typeObj = document.getElementById('tissue');
-                var databaseObj = document.getElementById('database');
-
-                var len = lArr.length;
-                var arr = [];
-                var idx = 0;
-                for (var i=1; i < len; i++) {
-                        //get dataset(database) info from lArr
-                        if(lArr[i][0]==(getIndexByValue('species',speciesObj.value)).toString()&&lArr[i][1]==(getIndexByValue('cross',groupObj.value)).toString()&&lArr[i][2]==(getIndexByValue('tissue',typeObj.value)).toString()&&!Contains(arr,lArr[i][3]))
-                        {
-                                arr[idx++]=lArr[i][3];
-                        }
-                }
-                idx=0;
-                len = arr.length;
-                removeOptions("database");
-                for (var i=0; i < len; i++) {
-                        // setting Database's option
-                        databaseObj.options[idx++] = new Option(dArr[arr[i]].txt, dArr[arr[i]].val);
-                }
-                updateChocie('database');
-        }
-}
-
-/*
-*  input: arr (targeted array); obj (targeted value)
-*  function: check whether targeted array contains targeted value or not
-*  output: return true, if array contains targeted value, otherwise return false
-*/
-function Contains(arr,obj) {
-        var i = arr.length;
-        while (i--) {
-                if (arr[i] == obj) {
-                        return true;
-                }
-        }
-        return false;
-}
-
-/*
-* input: selectObj (designated select menu, such as species, cross, etc... )
-* function: clear designated select menu's option
-* output: null
-*/
-function removeOptions(selectObj) {
-        if (typeof selectObj != 'object'){
-                selectObj = document.getElementById(selectObj);
-        }
-        var len = selectObj.options.length;
-        for (var i=0; i < len; i++)     {
-                // clear current selection
-                selectObj.options[0] = null;
-        }
-}
-
-/*
-*  input: selectObjId (designated select menu, such as species, cross, etc... )
-*         Value: target value
-*  function: retrieve Index info of target value in designated array
-*  output: index info
-*/
-function getIndexByValue(selectObjId,val)
-{
-        if(selectObjId=='species')
-        {
-                for(var i=1;i<sArr.length;i++){
-                        if(sArr[i].val==val)
-                                return i;
-                }
-        }else if(selectObjId=='cross')
-        {
-                for(var i=1;i<gArr.length;i++)
-                        if(gArr[i].val==val)
-                                return i;
-        }else if(selectObjId=='tissue')
-        {
-                for(var i=1;i<tArr.length;i++)
-                        if(tArr[i].val==val)
-                                return i;
-        }
-        else return;
-}
-
-/*
-*  input: objId (designated select menu, such as species, cross, etc... )
-*                 val(targeted value)
-*  function: setting option's selected status for designated select menu based on target value, also update the following select menu in the main search page
-*  output: return true if selected status has been set, otherwise return false.
-*/
-function setChoice(objId,val)
-{
-        var Obj = document.getElementById(objId);
-        var idx=-1;
-
-        for(i=0;i<Obj.options.length;i++){
-                if(Obj.options[i].value==val){
-                        idx=i;
-                        break;
-                }
-        }
-
-        if(idx>=0){
-                //setting option's selected status
-                Obj.options[idx].selected=true;
-                //update the following select menu
-                fillOptions(objId);
-        }else{
-                Obj.options[0].selected=true;
-                fillOptions(objId);
-        }
-}
-
-// setting option's selected status based on default setting or cookie setting for Species, Group, Type and Database select menu in the main search page http://www.genenetwork.org/
-function updateChocie(selectObjId){
-
-        if (selectObjId =='species')
-        {
-                defaultSpecies= getDefaultValue('species');
-                //setting option's selected status
-                setChoice('species',defaultSpecies);
-        }else if (selectObjId =='cross')
-        {
-                defaultSet= getDefaultValue('cross');
-                //setting option's selected status
-                setChoice('cross',defaultSet);
-        }else if (selectObjId =='tissue')
-        {
-                defaultType= getDefaultValue('tissue');
-                //setting option's selected status
-                setChoice('tissue',defaultType);
-        }else if (selectObjId =='database')
-        {
-                defaultDB= getDefaultValue('database');
-                //setting option's selected status
-                setChoice('database',defaultDB);
-        }
-}
-
-//get default value;if cookie exists, then use cookie value, otherwise use default value
-function getDefaultValue(selectObjId){
-        //define default value
-        var defaultSpecies = 'mouse'
-        var defaultSet = 'BXD'
-        var defaultType = 'Hippocampus'
-        var defaultDB = 'HC_M2_0606_P'
-
-        if (selectObjId =='species')
-        {
-                //if cookie exists, then use cookie value, otherwise use default value
-                var cookieSpecies = getCookie('defaultSpecies');
-                if(cookieSpecies)
-                {
-                        defaultSpecies= cookieSpecies;
-                }
-                return defaultSpecies;
-        }else if (selectObjId =='cross'){
-                var cookieSet = getCookie('defaultSet');
-                if(cookieSet){
-                        defaultSet= cookieSet;
-                }
-                return defaultSet;
-        }else if (selectObjId =='tissue'){
-                var cookieType = getCookie('defaultType');
-                if(cookieType){
-                        defaultType= cookieType;
-                }
-                return defaultType;
-        }else if (selectObjId =='database')
-        {
-                var cookieDB = getCookie('defaultDB');
-                if(cookieDB){
-                        defaultDB= cookieDB;
-                }
-                return defaultDB;
-        }
-
-}
-
-//setting default value into cookies for the dropdown menus: Species,Group, Type, and Database
-function setDefault(thisform){
-
-        setCookie('cookieTest', 'cookieTest', 1);
-        var cookieTest = getCookie('cookieTest');
-        delCookie('cookieTest');
-        if (cookieTest){
-                var defaultSpecies = thisform.species.value;
-                setCookie('defaultSpecies', defaultSpecies, 10);
-                var defaultSet = thisform.cross.value;
-                setCookie('defaultSet', defaultSet, 10);
-                var defaultType = thisform.tissue.value;
-                setCookie('defaultType', defaultType, 10);
-                var defaultDB = thisform.database.value;
-                setCookie('defaultDB', defaultDB, 10);
-                updateChocie('species');
-                updateChocie('cross');
-                updateChocie('tissue');
-                updateChocie('database');
-                alert("The current settings are now your default");
-        }
-        else{
-                alert("You need to enable Cookies in your browser.");
-        }
-}
-
-'''
-# write all strings' info into selectDatasetMenu.js file
-fileHandler.write(outputStr)
-fileHandler.close()
+                    Cursor.execute("""select ProbeSetFreeze.Name, ProbeSetFreeze.FullName from
+                                ProbeSetFreeze, ProbeFreeze, InbredSet, Tissue where
+                                ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and Tissue.Name = %s
+                                and ProbeFreeze.TissueId = Tissue.Id and ProbeFreeze.InbredSetId =
+                                InbredSet.Id and ProbeSetFreeze.public > %s order by
+                                ProbeSetFreeze.CreateTime desc""", (type_name,
+                                                                    webqtlConfig.PUBLICTHRESH))
+                    datasets[species][group][type_name] = Cursor.fetchall()
+            
+    return datasets
+
+
+def main():
+    species = get_species()
+    groups = get_groups(species)
+    types = get_types(groups)
+    datasets = get_datasets(types)
+    
+    species.append(('All Species', 'All Species'))
+    groups['All Species'] = [('All Groups', 'All Groups')]
+    types['All Species'] = {}
+    types['All Species']['All Groups'] = [('Phenotypes', 'Phenotypes')]
+    datasets['All Species'] = {}
+    datasets['All Species']['All Groups'] = {}
+    datasets['All Species']['All Groups']['Phenotypes'] = [('All Phenotypes','All Phenotypes')]
+    
+    data = dict(species=species,
+                groups=groups,
+                types=types,
+                datasets=datasets,
+                )
+    
+    output_file = """../wqflask/static/new/javascript/dataset_menu_structure.json"""
+    
+    with open(output_file, 'w') as fh:
+        json.dump(data, fh, indent="   ", sort_keys=True)
+    
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file