logo Netzschleuder network catalog, repository, and centrifuge

History of giant_tissue_networks

The changes to the source code of this entry in the repository, newest first, each with the differences it made to the entry's files. They are also listed on GitLab.

[entries] Add the date when each entry was added, and remove icon_hash by Tiago de Paula Peixoto beff7c9
The dates are those of the commits that first added the entries' files
(2020-08-11 for the entries of the initial commit); renamed entries keep
the date of their first name.

Changed: none
diff --git a/entries/giant_tissue_networks/__init__.py b/entries/giant_tissue_networks/__init__.py
index c9a111b..93724f3 100644
--- a/entries/giant_tissue_networks/__init__.py
+++ b/entries/giant_tissue_networks/__init__.py
@@ -39,7 +39,7 @@ url = ['https://hb.flatironinstitute.org/download',
        'https://www.ncbi.nlm.nih.gov/gene']
 citation = [('C. S. Greene, A. Krishnan, A. K. Wong, E. Ricciotti, R. A. Zelaya, D. S. Himmelstein, R. Zhang, B. M. Hartmann, E. Zaslavsky, S. C. Sealfon, D. I. Chasman, G. A. FitzGerald, K. Dolinski, T. Grosser, O. G. Troyanskaya, "Understanding multicellular function and disease with human tissue-specific networks." Nature Genetics 47, 569-576 (2015)',
              'https://doi.org/10.1038/ng.3259')]
-icon_hash = None
+date_added = '2026-10-28'
 # No license is stated by HumanBase (the citation of the paper is requested);
 # NCBI Gene data are in the public domain
 upstream_license = None
[entries] Prefix the properties in the descriptions with (Node), (Edge) or (Graph) by Tiago de Paula Peixoto bc3dbbd
The lists of properties at the end of the descriptions marked edge
properties with "Edge" but left node properties unmarked, or grouped
them in "Nodes: `a`, ...; `b`, ..." items, so the kind of a property
was often unclear. Every item now starts with (Node), (Edge) or (Graph),
followed by the property names, a colon and the explanation, one item
per property or group of properties; qualifications (kinds of nodes,
networks) follow the names in parentheses. Properties that were only
named got a short explanation, and a few items that named the wrong
kind of property were corrected.
diff --git a/entries/giant_tissue_networks/__init__.py b/entries/giant_tissue_networks/__init__.py
index 318dbd8..c9a111b 100644
--- a/entries/giant_tissue_networks/__init__.py
+++ b/entries/giant_tissue_networks/__init__.py
@@ -28,12 +28,12 @@ The complete networks give a probability for every pair of about 25,000 genes (2
 
 The networks have the following properties:
 
-- `entrez_id`: the NCBI Entrez Gene identifier of the gene.
-- `symbol`: the official symbol of the gene, e.g. `TP53`, from the current NCBI Gene database (empty if the identifier was discontinued since).
-- `description`: the name of the gene, e.g. `tumor protein p53` (empty if the identifier was discontinued).
-- Edge `weight`: the posterior probability of a functional relationship between the two genes in the tissue (between 0.1 and 1).
-- `tissue` (graph): the name of the tissue or cell type in the BRENDA Tissue Ontology (`global` for the global network).
-- `bto_id` (graph): the identifier of the tissue or cell type in the BRENDA Tissue Ontology, e.g. `BTO:0000671` (empty for the global network)."""
+- (Node) `entrez_id`: the NCBI Entrez Gene identifier of the gene.
+- (Node) `symbol`: the official symbol of the gene, e.g. `TP53`, from the current NCBI Gene database (empty if the identifier was discontinued since).
+- (Node) `description`: the name of the gene, e.g. `tumor protein p53` (empty if the identifier was discontinued).
+- (Edge) `weight`: the posterior probability of a functional relationship between the two genes in the tissue (between 0.1 and 1).
+- (Node) `tissue` (graph): the name of the tissue or cell type in the BRENDA Tissue Ontology (`global` for the global network).
+- (Node) `bto_id` (graph): the identifier of the tissue or cell type in the BRENDA Tissue Ontology, e.g. `BTO:0000671` (empty for the global network)."""
 tags = ['Biological', 'Genetic', 'Weighted', 'Metadata']
 url = ['https://hb.flatironinstitute.org/download',
        'https://www.ncbi.nlm.nih.gov/gene']
[entries] Remove unneeded code from the entries by Tiago de Paula Peixoto 2c69f19
Unneeded "global files" statements, unused imports and variables,
f-strings without placeholders, duplicate keys in foodweb_little_rock
(keeping the order and the values used), and the second definition of
get_lines() in twitter_higgs. Nothing changes in the networks or
descriptions.

Changed: none
diff --git a/entries/giant_tissue_networks/__init__.py b/entries/giant_tissue_networks/__init__.py
index 02738ce..318dbd8 100644
--- a/entries/giant_tissue_networks/__init__.py
+++ b/entries/giant_tissue_networks/__init__.py
@@ -18,7 +18,6 @@
 
 import pyarrow
 import pyarrow.csv
-import pyarrow.compute as pc
 
 from .. import *
 
[entries] New entry: giant_tissue_networks by Tiago de Paula Peixoto 0069122
diff --git a/entries/giant_tissue_networks/__init__.py b/entries/giant_tissue_networks/__init__.py
new file mode 100644
index 0000000..02738ce
--- /dev/null
+++ b/entries/giant_tissue_networks/__init__.py
@@ -0,0 +1,306 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2026 Tiago de Paula Peixoto <tiago@skewed.de>
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Affero General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Affero General Public License along
+# with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import pyarrow
+import pyarrow.csv
+import pyarrow.compute as pc
+
+from .. import *
+
+title = "Human tissue-specific functional gene networks (GIANT/HumanBase, 2015)"
+description = r"""Functional gene networks of 144 human tissues and cell types, from GIANT (Genome-scale Integrated Analysis of gene Networks in Tissues), now part of HumanBase (Flatiron Institute). Nodes are human genes, and an edge between two genes is weighted by the probability that they are functionally related (e.g. take part in the same biological process) in the tissue. The networks were built by integrating about 38,000 genome-scale experiments (gene expression data sets, protein-protein interactions, transcription factor binding, chemical and genetic perturbations, microRNA targets) with a Bayesian approach: for each tissue, the gold standard of related genes was restricted to those expressed in the tissue (from tissue-specific expression data in the literature and the Human Protein Reference Database), so that the data sets informative of that tissue are weighted accordingly. The tissues and cell types are terms of the BRENDA Tissue Ontology (BTO), and include e.g. organs (`kidney`, `liver`, `heart`), brain regions (`hippocampus`, `substantia_nigra`), cell types (`neuron`, `t_lymphocyte`, `hepatocyte`) and fluids (`blood_plasma`); the network `global` is the tissue-naive network, built with the gold standard of all genes.
+
+The complete networks give a probability for every pair of about 25,000 genes (291 GB of files). The networks here are the "top edges" networks provided by HumanBase: they contain only the edges whose probability exceeds the prior probability of a functional relationship, 0.1, which leaves between about 30 and 280 million edges per network (e.g. 39 million for `global`, 62 million for `kidney`, 283 million for `cochlea`). Each network contains the genes with at least one such edge. The probabilities assume this prior (as the networks shown on the HumanBase website). The gold standards of the tissues (the positive and negative examples used for training) are not included.
+
+The networks have the following properties:
+
+- `entrez_id`: the NCBI Entrez Gene identifier of the gene.
+- `symbol`: the official symbol of the gene, e.g. `TP53`, from the current NCBI Gene database (empty if the identifier was discontinued since).
+- `description`: the name of the gene, e.g. `tumor protein p53` (empty if the identifier was discontinued).
+- Edge `weight`: the posterior probability of a functional relationship between the two genes in the tissue (between 0.1 and 1).
+- `tissue` (graph): the name of the tissue or cell type in the BRENDA Tissue Ontology (`global` for the global network).
+- `bto_id` (graph): the identifier of the tissue or cell type in the BRENDA Tissue Ontology, e.g. `BTO:0000671` (empty for the global network)."""
+tags = ['Biological', 'Genetic', 'Weighted', 'Metadata']
+url = ['https://hb.flatironinstitute.org/download',
+       'https://www.ncbi.nlm.nih.gov/gene']
+citation = [('C. S. Greene, A. Krishnan, A. K. Wong, E. Ricciotti, R. A. Zelaya, D. S. Himmelstein, R. Zhang, B. M. Hartmann, E. Zaslavsky, S. C. Sealfon, D. I. Chasman, G. A. FitzGerald, K. Dolinski, T. Grosser, O. G. Troyanskaya, "Understanding multicellular function and disease with human tissue-specific networks." Nature Genetics 47, 569-576 (2015)',
+             'https://doi.org/10.1038/ng.3259')]
+icon_hash = None
+# No license is stated by HumanBase (the citation of the paper is requested);
+# NCBI Gene data are in the public domain
+upstream_license = None
+
+# The top-edges files (156 MB to 1.6 GB each, 75 GB in total; also
+# available as a single archive of 70 GB, all_top_edges.tar.gz), unchanged
+# since November 2016
+upstream_prefix = 'https://s3-us-west-2.amazonaws.com/humanbase/networks'
+# The NCBI gene information of human genes (5 MB), only for the gene symbols
+# and names: replaced in place daily, so that the cached copy is the one used
+gene_info_prefix = 'https://ftp.ncbi.nlm.nih.gov/gene/DATA/GENE_INFO/Mammalia'
+GENE_INFO = 'Homo_sapiens.gene_info.gz'
+
+# The networks of HumanBase, from its list of integrations
+# (https://humanbase.io/api/integrations/): those of the BRENDA Tissue
+# Ontology terms and the global one, as (name, tissue, BTO identifier)
+TISSUES = [
+    ('adipose_tissue', 'adipose tissue', 'BTO:0001487'),
+    ('adrenal_cortex', 'adrenal cortex', 'BTO:0000045'),
+    ('adrenal_gland', 'adrenal gland', 'BTO:0000047'),
+    ('amygdala', 'amygdala', 'BTO:0001042'),
+    ('aorta', 'aorta', 'BTO:0000135'),
+    ('artery', 'artery', 'BTO:0000573'),
+    ('astrocyte', 'astrocyte', 'BTO:0000099'),
+    ('b_lymphocyte', 'B-lymphocyte', 'BTO:0000776'),
+    ('basal_ganglion', 'basal ganglion', 'BTO:0000235'),
+    ('basophil', 'basophil', 'BTO:0000129'),
+    ('blood', 'blood', 'BTO:0000089'),
+    ('blood_plasma', 'blood plasma', 'BTO:0000131'),
+    ('blood_platelet', 'blood platelet', 'BTO:0000132'),
+    ('blood_vessel', 'blood vessel', 'BTO:0001102'),
+    ('bone', 'bone', 'BTO:0000140'),
+    ('bone_marrow', 'bone marrow', 'BTO:0000141'),
+    ('brain', 'brain', 'BTO:0000142'),
+    ('bronchial_epithelial_cell', 'bronchial epithelial cell', 'BTO:0002922'),
+    ('bronchus', 'bronchus', 'BTO:0001340'),
+    ('cardiac_muscle', 'cardiac muscle', 'BTO:0000199'),
+    ('cartilage', 'cartilage', 'BTO:0000206'),
+    ('caudate_nucleus', 'caudate nucleus', 'BTO:0000211'),
+    ('caudate_putamen', 'caudate putamen', 'BTO:0000212'),
+    ('cecum', 'cecum', 'BTO:0000166'),
+    ('central_nervous_system', 'central nervous system', 'BTO:0000227'),
+    ('cerebellar_cortex', 'cerebellar cortex', 'BTO:0000043'),
+    ('cerebellum', 'cerebellum', 'BTO:0000232'),
+    ('cerebral_cortex', 'cerebral cortex', 'BTO:0000233'),
+    ('chondrocyte', 'chondrocyte', 'BTO:0000249'),
+    ('choroid', 'choroid', 'BTO:0001829'),
+    ('cochlea', 'cochlea', 'BTO:0000267'),
+    ('colon', 'colon', 'BTO:0000269'),
+    ('cornea', 'cornea', 'BTO:0000286'),
+    ('corpus_callosum', 'corpus callosum', 'BTO:0000615'),
+    ('corpus_luteum', 'corpus luteum', 'BTO:0000292'),
+    ('corpus_striatum', 'corpus striatum', 'BTO:0001311'),
+    ('culture_condition_cd8_cell', 'culture condition:CD8+ cell', 'BTO:0004410'),
+    ('dendritic_cell', 'dendritic cell', 'BTO:0002042'),
+    ('dentate_gyrus', 'dentate gyrus', 'BTO:0002496'),
+    ('diencephalon', 'diencephalon', 'BTO:0000342'),
+    ('duodenum', 'duodenum', 'BTO:0000365'),
+    ('ear', 'ear', 'BTO:0000368'),
+    ('embryo', 'embryo', 'BTO:0000379'),
+    ('eosinophil', 'eosinophil', 'BTO:0000399'),
+    ('epidermis', 'epidermis', 'BTO:0000404'),
+    ('esophagus', 'esophagus', 'BTO:0000959'),
+    ('eye', 'eye', 'BTO:0000439'),
+    ('fetus', 'fetus', 'BTO:0000449'),
+    ('forebrain', 'forebrain', 'BTO:0000478'),
+    ('frontal_lobe', 'frontal lobe', 'BTO:0000484'),
+    ('gastrointestinal_tract', 'gastrointestinal tract', 'BTO:0000511'),
+    ('glia', 'glia', 'BTO:0000524'),
+    ('global', 'global', ''),
+    ('granulocyte', 'granulocyte', 'BTO:0000539'),
+    ('hair_follicle', 'hair follicle', 'BTO:0000554'),
+    ('heart', 'heart', 'BTO:0000562'),
+    ('hematopoietic_stem_cell', 'hematopoietic stem cell', 'BTO:0000725'),
+    ('hepatocyte', 'hepatocyte', 'BTO:0000575'),
+    ('hippocampus', 'hippocampus', 'BTO:0000601'),
+    ('hypophysis', 'hypophysis', 'BTO:0001073'),
+    ('hypothalamus', 'hypothalamus', 'BTO:0000614'),
+    ('ileum', 'ileum', 'BTO:0000620'),
+    ('intestine', 'intestine', 'BTO:0000648'),
+    ('jejunum', 'jejunum', 'BTO:0000657'),
+    ('keratinocyte', 'keratinocyte', 'BTO:0000667'),
+    ('kidney', 'kidney', 'BTO:0000671'),
+    ('large_intestine', 'large intestine', 'BTO:0000706'),
+    ('lens', 'lens', 'BTO:0000723'),
+    ('leukocyte', 'leukocyte', 'BTO:0000751'),
+    ('liver', 'liver', 'BTO:0000759'),
+    ('locus_ceruleus', 'locus ceruleus', 'BTO:0001408'),
+    ('lung', 'lung', 'BTO:0000763'),
+    ('lymph_node', 'lymph node', 'BTO:0000784'),
+    ('lymphocyte', 'lymphocyte', 'BTO:0000775'),
+    ('macrophage', 'macrophage', 'BTO:0000801'),
+    ('mammary_epithelium', 'mammary epithelium', 'BTO:0001430'),
+    ('mammary_gland', 'mammary gland', 'BTO:0000817'),
+    ('mast_cell', 'mast cell', 'BTO:0000830'),
+    ('medulla_oblongata', 'medulla oblongata', 'BTO:0000041'),
+    ('megakaryocyte', 'megakaryocyte', 'BTO:0000843'),
+    ('midbrain', 'midbrain', 'BTO:0000138'),
+    ('monocyte', 'monocyte', 'BTO:0000876'),
+    ('mononuclear_phagocyte', 'mononuclear phagocyte', 'BTO:0001433'),
+    ('muscle', 'muscle', 'BTO:0000887'),
+    ('myometrium', 'myometrium', 'BTO:0000907'),
+    ('natural_killer_cell', 'natural killer cell', 'BTO:0000914'),
+    ('nephron', 'nephron', 'BTO:0000924'),
+    ('nervous_system', 'nervous system', 'BTO:0001484'),
+    ('neuron', 'neuron', 'BTO:0000938'),
+    ('neutrophil', 'neutrophil', 'BTO:0000130'),
+    ('nucleus_accumbens', 'nucleus accumbens', 'BTO:0001862'),
+    ('occipital_lobe', 'occipital lobe', 'BTO:0000293'),
+    ('occipital_pole', 'occipital pole', 'BTO:0001868'),
+    ('osteoblast', 'osteoblast', 'BTO:0001593'),
+    ('ovarian_follicle', 'ovarian follicle', 'BTO:0000475'),
+    ('ovary', 'ovary', 'BTO:0000975'),
+    ('oviduct', 'oviduct', 'BTO:0000980'),
+    ('pancreas', 'pancreas', 'BTO:0000988'),
+    ('pancreatic_islet', 'pancreatic islet', 'BTO:0000991'),
+    ('parietal_lobe', 'parietal lobe', 'BTO:0001001'),
+    ('peripheral_nervous_system', 'peripheral nervous system', 'BTO:0001028'),
+    ('placenta', 'placenta', 'BTO:0001078'),
+    ('podocyte', 'podocyte', 'BTO:0002295'),
+    ('pons', 'pons', 'BTO:0001101'),
+    ('prostate_gland', 'prostate gland', 'BTO:0001129'),
+    ('renal_glomerulus', 'renal glomerulus', 'BTO:0000530'),
+    ('renal_tubule', 'renal tubule', 'BTO:0000343'),
+    ('retina', 'retina', 'BTO:0001175'),
+    ('salivary_gland', 'salivary gland', 'BTO:0001203'),
+    ('serum', 'serum', 'BTO:0001239'),
+    ('skeletal_muscle', 'skeletal muscle', 'BTO:0001103'),
+    ('skin', 'skin', 'BTO:0001253'),
+    ('skin_fibroblast', 'skin fibroblast', 'BTO:0001255'),
+    ('small_intestine', 'small intestine', 'BTO:0000651'),
+    ('smooth_muscle', 'smooth muscle', 'BTO:0001260'),
+    ('spermatid', 'spermatid', 'BTO:0001274'),
+    ('spermatocyte', 'spermatocyte', 'BTO:0001275'),
+    ('spermatogonium', 'spermatogonium', 'BTO:0000958'),
+    ('spinal_cord', 'spinal cord', 'BTO:0001279'),
+    ('spleen', 'spleen', 'BTO:0001281'),
+    ('stomach', 'stomach', 'BTO:0001307'),
+    ('substantia_nigra', 'substantia nigra', 'BTO:0000143'),
+    ('subthalamic_nucleus', 'subthalamic nucleus', 'BTO:0002252'),
+    ('t_lymphocyte', 'T-lymphocyte', 'BTO:0000782'),
+    ('tear_gland', 'tear gland', 'BTO:0000044'),
+    ('telencephalon', 'telencephalon', 'BTO:0000239'),
+    ('temporal_lobe', 'temporal lobe', 'BTO:0001355'),
+    ('testis', 'testis', 'BTO:0001363'),
+    ('thalamus', 'thalamus', 'BTO:0001365'),
+    ('thymocyte', 'thymocyte', 'BTO:0001372'),
+    ('thyroid_gland', 'thyroid gland', 'BTO:0001379'),
+    ('tonsil', 'tonsil', 'BTO:0001387'),
+    ('tooth', 'tooth', 'BTO:0000397'),
+    ('trachea', 'trachea', 'BTO:0001388'),
+    ('trophoblast', 'trophoblast', 'BTO:0001079'),
+    ('umbilical_cord', 'umbilical cord', 'BTO:0001415'),
+    ('umbilical_vein_endothelial_cell', 'umbilical vein endothelial cell', 'BTO:0004296'),
+    ('urinary_bladder', 'urinary bladder', 'BTO:0001418'),
+    ('uroepithelium', 'uroepithelium', 'BTO:0003906'),
+    ('uterine_cervix', 'uterine cervix', 'BTO:0001421'),
+    ('uterine_endometrium', 'uterine endometrium', 'BTO:0001422'),
+    ('uterus', 'uterus', 'BTO:0001424'),
+    ('vascular_endothelial_cell', 'vascular endothelial cell', 'BTO:0001854'),
+    ('vascular_endothelium', 'vascular endothelium', 'BTO:0001853'),
+    ('vermiform_appendix', 'vermiform appendix', 'BTO:0000084'),
+]
+
+# The networks have about 165,000 to 245,000 edges per MB of their files:
+# from about 30 million edges (fetus) to 283 million (cochlea, the largest
+# file), whose parse needs an estimated 25 GB of memory (about 90 bytes per
+# edge)
+
+files = [((f"{t}_top.gz", GENE_INFO), t, None) for t, tissue, bto in TISSUES]
+
+def fetch_upstream(force=False):
+    name = __name__.split(".")[-1]
+    fetch_upstream_files(name, upstream_prefix,
+                         [(fnames[0], alt, fmt) for fnames, alt, fmt in files],
+                         force)
+    fetch_upstream_files(name, gene_info_prefix, [(GENE_INFO, None, None)], force)
+
+def read_gene_info(name, fname):
+    "Symbols and names of the human genes, by Entrez identifier."
+    with open_upstream_file(name, fname, "rb") as f:
+        t = pyarrow.csv.read_csv(
+            f,
+            parse_options=pyarrow.csv.ParseOptions(delimiter="\t", quote_char=False),
+            convert_options=pyarrow.csv.ConvertOptions(
+                include_columns=["GeneID", "Symbol", "description"],
+                column_types={"GeneID": pyarrow.int64(),
+                              "Symbol": pyarrow.string(),
+                              "description": pyarrow.string()}))
+    return dict(zip(t.column("GeneID").to_pylist(),
+                    zip(t.column("Symbol").to_pylist(),
+                        t.column("description").to_pylist())))
+
+def read_edges(name, fname):
+    """The edges of the top-edges file `fname`, as an array of pairs of vertex
+    indices (int32), their probabilities, and the Entrez identifiers of the
+    vertices, read in blocks (the largest files have several hundred million
+    edges)."""
+    genes = numpy.zeros(0, dtype="int64")      # known identifiers, sorted
+    vidx = numpy.zeros(0, dtype="int32")       # their vertex indices
+    order = []                                 # identifiers, by vertex index
+    edges, weights = [], []
+    with open_upstream_file(name, fname, "rb") as f:
+        # <gene> <gene> <probability>
+        reader = pyarrow.csv.open_csv(
+            f,
+            read_options=pyarrow.csv.ReadOptions(column_names=["u", "v", "w"],
+                                                 block_size=1 << 26),
+            parse_options=pyarrow.csv.ParseOptions(delimiter="\t",
+                                                   quote_char=False),
+            convert_options=pyarrow.csv.ConvertOptions(
+                column_types={"u": pyarrow.int64(), "v": pyarrow.int64(),
+                              "w": pyarrow.float64()}))
+        for batch in reader:
+            u = batch.column("u").to_numpy()
+            v = batch.column("v").to_numpy()
+            new = numpy.setdiff1d(numpy.union1d(u, v), genes)
+            if len(new) > 0:
+                order.extend(new.tolist())
+                genes = numpy.concatenate([genes, new])
+                vidx = numpy.concatenate([vidx, numpy.arange(len(order) - len(new),
+                                                             len(order),
+                                                             dtype="int32")])
+                s = numpy.argsort(genes)
+                genes, vidx = genes[s], vidx[s]
+            e = numpy.empty((len(u), 2), dtype="int32")
+            e[:, 0] = vidx[numpy.searchsorted(genes, u)]
+            e[:, 1] = vidx[numpy.searchsorted(genes, v)]
+            edges.append(e)
+            weights.append(batch.column("w").to_numpy())
+    return edges, weights, numpy.array(order, dtype="int64")
+
+@cache_network()
+@coerce_props()
+@annotate()
+def parse(alts=None):
+    name = __name__.split(".")[-1]
+    info = None
+    tissues = {t: (tissue, bto) for t, tissue, bto in TISSUES}
+    for fnames, alt, fmt in files:
+        if alts is not None and alt not in alts:
+            continue
+        if info is None:
+            info = read_gene_info(name, fnames[1])
+        edges, weights, genes = read_edges(name, fnames[0])
+        g = Graph(directed=False)
+        g.add_vertex(len(genes))
+        g.ep.weight = g.new_ep("double")
+        i = 0
+        while edges:
+            e, w = edges.pop(0), weights.pop(0)
+            g.add_edge_list(e)
+            g.ep.weight.a[i:i + len(w)] = w
+            i += len(w)
+            del e, w
+        g.vp.entrez_id = g.new_vp("int64_t", vals=genes)
+        gi = [info.get(int(x), ("", "")) for x in genes]
+        g.vp.symbol = g.new_vp("string", vals=[x[0] for x in gi])
+        g.vp.description = g.new_vp("string", vals=[x[1] for x in gi])
+        tissue, bto = tissues[alt]
+        g.gp.tissue = g.new_gp("string", val=tissue)
+        g.gp.bto_id = g.new_gp("string", val=bto)
+        yield alt, g