from gn3.db.species import get_all_species def gen_dropdown_json(conn): """Generates and outputs (as json file) the data for the main dropdown menus on the home page """ species = get_all_species(conn) groups = get_groups(species, conn) types = get_types(groups, conn) datasets = get_datasets(types, conn) return dict(species=species, groups=groups, types=types, datasets=datasets) def get_groups(species, conn): """Build groups list""" groups = {} with conn.cursor() as cursor: for species_name, _species_full_name in species: groups[species_name] = [] query = ("SELECT InbredSet.Name, InbredSet.FullName, " "IFNULL(InbredSet.Family, 'None') " "FROM InbredSet, Species WHERE Species.Name = '{}' " "AND InbredSet.SpeciesId = Species.Id GROUP by " "InbredSet.Name ORDER BY IFNULL(InbredSet.FamilyOrder, " "InbredSet.FullName) ASC, IFNULL(InbredSet.Family, " "InbredSet.FullName) ASC, InbredSet.FullName ASC, " "InbredSet.MenuOrderId ASC").format(species_name) cursor.execute(query) results = cursor.fetchall() for result in results: family_name = "Family:" + str(result[2]) groups[species_name].append( [str(result[0]), str(result[1]), family_name]) return groups def get_types(groups, conn): """Build types list""" types = {} for species, group_dict in list(groups.items()): types[species] = {} for group_name, _group_full_name, _family_name in group_dict: if phenotypes_exist(group_name, conn): types[species][group_name] = [ ("Phenotypes", "Traits and Cofactors", "Phenotypes")] if genotypes_exist(group_name, conn): if group_name in types[species]: types[species][group_name] += [ ("Genotypes", "DNA Markers and SNPs", "Genotypes")] else: types[species][group_name] = [ ("Genotypes", "DNA Markers and SNPs", "Genotypes")] if group_name in types[species]: types_list = build_types(species, group_name, conn) if len(types_list) > 0: types[species][group_name] += types_list else: types_list = build_types(species, group_name, conn) if len(types_list) > 0: types[species][group_name] = types_list else: types[species].pop(group_name, None) groups[species] = list( group for group in groups[species] if group[0] != group_name) return types def phenotypes_exist(group_name, conn): results = [] with conn.cursor() as cursor: cursor.execute( ("SELECT Name FROM PublishFreeze " "WHERE PublishFreeze.Name = " "'{}'").format(group_name + "Publish")) results = cursor.fetchone() return bool(results) def genotypes_exist(group_name, conn): with conn.cursor() as cursor: cursor.execute( ("SELECT Name FROM GenoFreeze " + "WHERE GenoFreeze.Name = '{}'").format( group_name + "Geno")) results = cursor.fetchone() return bool(results) def build_types(species, group, conn): """Fetches tissues Gets the tissues with data for this species/group (all types except phenotype/genotype are tissues) """ query = ("SELECT DISTINCT Tissue.Name " "FROM ProbeFreeze, ProbeSetFreeze, InbredSet, " "Tissue, Species WHERE Species.Name = '{0}' " "AND Species.Id = InbredSet.SpeciesId AND " "InbredSet.Name = '{1}' AND ProbeFreeze.TissueId = " "Tissue.Id AND ProbeFreeze.InbredSetId = InbredSet.Id " "AND ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id " "ORDER BY Tissue.Name").format(species, group) results = [] with conn.cursor() as cursor: cursor.execute(query) for result in cursor.fetchall(): if bool(result): these_datasets = build_datasets(species, group, result[0], conn) if len(these_datasets) > 0: results.append([str(result[0]), str(result[0]), "Molecular Traits"]) return results def get_datasets(types, conn): """Build datasets list""" datasets = {} for species, group_dict in list(types.items()): datasets[species] = {} for group, type_list in list(group_dict.items()): datasets[species][group] = {} for type_name in type_list: these_datasets = build_datasets(species, group, type_name[0], conn) if bool(these_datasets): datasets[species][group][type_name[0]] = these_datasets return datasets def build_datasets(species, group, type_name, conn): """Gets dataset names from database""" dataset_text = dataset_value = None datasets = [] with conn.cursor() as cursor: if type_name == "Phenotypes": cursor.execute( ("SELECT InfoFiles.GN_AccesionId, PublishFreeze.Name, " "PublishFreeze.FullName FROM InfoFiles, PublishFreeze, " "InbredSet WHERE InbredSet.Name = '{}' AND " "PublishFreeze.InbredSetId = InbredSet.Id AND " "InfoFiles.InfoPageName = PublishFreeze.Name " "ORDER BY PublishFreeze.CreateTime ASC").format(group)) results = cursor.fetchall() if bool(results): for result in results: dataset_id = str(result[0]) dataset_value = str(result[1]) dataset_text = str(result[2]) if group == 'MDP': dataset_text = "Mouse Phenome Database" datasets.append([dataset_id, dataset_value, dataset_text]) else: cursor.execute( ("SELECT PublishFreeze.Name, PublishFreeze.FullName " "FROM PublishFreeze, InbredSet " "WHERE InbredSet.Name = '{}' AND " "PublishFreeze.InbredSetId = InbredSet.Id " "ORDER BY PublishFreeze.CreateTime ASC") .format(group)) result = cursor.fetchone() dataset_id = "None" dataset_value = str(result[0]) dataset_text = str(result[1]) datasets.append([dataset_id, dataset_value, dataset_text]) elif type_name == "Genotypes": cursor.execute( ("SELECT InfoFiles.GN_AccesionId " "FROM InfoFiles, GenoFreeze, InbredSet " "WHERE InbredSet.Name = '{}' AND " "GenoFreeze.InbredSetId = InbredSet.Id AND " "InfoFiles.InfoPageName = GenoFreeze.ShortName " "ORDER BY GenoFreeze.CreateTime " "DESC").format(group)) results = cursor.fetchone() dataset_id = "None" if bool(results): dataset_id = str(results[0]) dataset_value = "%sGeno" % group dataset_text = "%s Genotypes" % group datasets.append([dataset_id, dataset_value, dataset_text]) else: # for mRNA expression/ProbeSet cursor.execute( ("SELECT ProbeSetFreeze.Id, ProbeSetFreeze.Name, " "ProbeSetFreeze.FullName FROM ProbeSetFreeze, " "ProbeFreeze, InbredSet, Tissue, Species WHERE " "Species.Name = '{0}' AND Species.Id = " "InbredSet.SpeciesId AND InbredSet.Name = '{1}' " "AND ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id " "AND Tissue.Name = '{2}' AND ProbeFreeze.TissueId = " "Tissue.Id AND ProbeFreeze.InbredSetId = InbredSet.Id " "AND ProbeSetFreeze.public > 0 " "ORDER BY -ProbeSetFreeze.OrderList DESC, " "ProbeSetFreeze.CreateTime " "DESC").format(species, group, type_name)) results = cursor.fetchall() datasets = [] for dataset_info in results: this_dataset_info = [] for info in dataset_info: this_dataset_info.append(str(info)) datasets.append(this_dataset_info) return datasets