Exemplo n.º 1
0
    def test_divide_muts_by_sites(self):
        from views.network import divide_muts_by_sites

        # check if null case works
        divide_muts_by_sites([], [])

        # one site
        s_1 = Site(position=1)
        muts_by_sites = divide_muts_by_sites([], [s_1])
        assert muts_by_sites[s_1] == []

        # full test
        s_2 = Site(position=10)
        s_3 = Site(position=20)

        muts_by_pos = {
            pos: [Mutation(position=pos)]
            for pos in (1, 2, 8, 14, 16, 30)
        }

        muts_by_pos[16].append(Mutation(position=16))

        def get_muts_from_pos(*positions):
            lists = [muts_by_pos[p] for p in positions]
            return [mut for mut_list in lists for mut in mut_list]

        muts_by_sites = divide_muts_by_sites([
            mut for muts_on_pos_x in muts_by_pos.values()
            for mut in muts_on_pos_x
        ], [s_1, s_2, s_3])

        assert muts_by_sites[s_1] == get_muts_from_pos(1, 2, 8)
        assert muts_by_sites[s_2] == get_muts_from_pos(8, 14, 16)
        assert muts_by_sites[s_3] == get_muts_from_pos(14, 16)
Exemplo n.º 2
0
    def test_sites(self):

        p = Protein(**test_protein_data())

        sites = [
            Site(position=3, residue='R', type='phosphorylation'),
            Site(position=4, residue='T', type='methylation')
        ]
        db.session.add(p)
        p.sites = sites

        response = self.client.get('/protein/sites/NM_000123')

        assert response.status_code == 200
        assert response.content_type == 'application/json'

        assert len(response.json) == 2

        phospo_site_repr = None

        for site_repr in response.json:
            if site_repr['type'] == 'phosphorylation':
                phospo_site_repr = site_repr

        assert phospo_site_repr
Exemplo n.º 3
0
def create_network():
    p = create_test_protein()
    cancer = Cancer(name='Ovarian', code='OV')

    known_interactor_of_x = create_test_kinase('Kinase Y', 'NM_0009')

    kinase_mutation = Mutation(position=1,
                               alt='T',
                               meta_MC3=[MC3Mutation(cancer=cancer)])

    known_interactor_of_x.protein.mutations = [kinase_mutation]

    drug = Drug(
        name='Drug targeting ' + known_interactor_of_x.name,
        drug_bank_id='DB01',
        target_genes=[known_interactor_of_x.protein.gene],
        # by default only approved drugs are shown
        groups={DrugGroup(name='approved')})

    group = KinaseGroup(name='Group of kinases', )
    s = Site(position=1,
             type='phosphorylation',
             residue='T',
             kinases=[known_interactor_of_x],
             kinase_groups=[group])
    s2 = Site(position=2,
              type='phosphorylation',
              residue='R',
              kinase_groups=[group])
    p.sites = [s, s2]

    predicted_interactor = create_test_kinase('Kinase Z', 'NM_0002')

    protein_mutation = Mutation(position=2,
                                alt='T',
                                meta_MC3=[MC3Mutation(cancer=cancer)],
                                meta_MIMP=[
                                    MIMPMutation(
                                        pwm=known_interactor_of_x.name,
                                        effect='loss',
                                        site=s,
                                        probability=0.1,
                                        position_in_motif=1),
                                    MIMPMutation(pwm=predicted_interactor.name,
                                                 effect='gain',
                                                 site=s,
                                                 probability=0.1,
                                                 position_in_motif=1)
                                ])

    p.mutations = [protein_mutation]
    db.session.add_all([p, drug, predicted_interactor])
    db.session.commit()

    # a new cancer was added, reload is necessary (this should not happen during normal app usage)
    from website.views.filters import cached_queries
    cached_queries.reload()
Exemplo n.º 4
0
    def test_gather_residues(self):
        methylation = SiteType(name='methylation')

        p = Protein(refseq='NM_007', id=1, sequence='ABCD')
        sites = [
            Site(position=2, types={methylation}, protein=p),  # default -> 'B'
            Site(position=4, types={methylation}, residue='D'),
        ]
        db.session.add_all(sites)
        db.session.commit()

        assert methylation.find_modified_residues() == {'B', 'D'}
Exemplo n.º 5
0
    def test_impact_on_ptm(self):

        mutations = [Mutation(position=61)]
        protein = Protein(refseq='NM_00001', mutations=mutations)
        db.session.add(protein)
        protein.sites = [
            Site(position=61),
            Site(position=54),
            Site(position=51)
        ]

        mutation = mutations[0]

        assert mutation.impact_on_ptm() == 'direct'
Exemplo n.º 6
0
    def test_types(self):
        methylation = SiteType(name='methylation')

        p = Protein(refseq='NM_007', id=1, sequence='ABCD')
        db.session.add(p)

        site = Site(position=2, types={methylation}, residue='B', protein=p)
        db.session.add(site)

        db.session.commit()

        query = Protein.query

        assert query.filter(Protein.sites.any(
            Site.types.contains(methylation))).one()
        assert not query.filter(
            Protein.sites.any(~Site.types.contains(methylation))).all()
        assert Site.query.filter(Site.types.contains(methylation)).count() == 1
        assert not Site.query.filter(~Site.types.contains(methylation)).all()

        phosphorylation = SiteType(name='phosphorylation')
        assert not query.filter(
            Protein.sites.any(Site.types.contains(phosphorylation))).all()
        assert query.filter(
            Protein.sites.any(~Site.types.contains(phosphorylation))).one()
        assert Site.query.filter(
            Site.types.contains(phosphorylation)).count() == 0
Exemplo n.º 7
0
def purify_html(request):
    """
    过滤掉多余css,修正图片一些属性,替换超链接
    :param request:
    :return:
    """
    html = request.GET.get('html', None)
    base_url = request.GET.get('baseUrl', None)
    css_path = request.GET.get('cssPath', None)
    # 若果domain已经在数据库了就找到,没有就新建
    domain_name = get_top_domain(base_url)
    site_set = Site.objects.filter(domain_name=domain_name)
    if site_set.exists():
        s = site_set[0]
    else:
        s = Site()
    s.domain_name = domain_name
    # 保存二级页面的主要显示区域的css
    if css_path.strip():
        if not s.second:
            second = SecondModifications()
            second.css_path = css_path.strip()
            second.save()
            s.second = second
        else:
            second = s.second
            second.css_path = css_path.strip()
            second.save()
    s.save()
    res = purify(html, base_url)
    if not res:
        return HttpResponse(status=404)
    return HttpResponse(res)
Exemplo n.º 8
0
def siteconfig(request):

    if request.method == 'GET':
        return render_to_response('admin/siteconfig.html')

    if request.method == 'POST':

        sitename = request.POST.get('sitename')
        keywords = request.POST.get('keywords')
        descriptions = request.POST.get('descriptions')
        copyrightinfo = request.POST.get('copyrightinfo')

        form = PictureForm(request.POST, request.FILES)
        if form.is_valid():
            if 'login' and 'banner' in request.FILES:
                login = request.FILES["login"]
                banner = request.FILES["banner"]
            else:
                login = None
                banner = None
            parser = ImageFile.Parser()
            for chunk in login.chunks() and banner.chunks():
                parser.feed(chunk)

                site = Site()
                site.sitename = sitename
                site.keywords = keywords
                site.descriptions = descriptions
                site.login = login
                site.banner = banner
                site.copyrightinfo = copyrightinfo

                site.save()
        return render_to_response('admin/siteconfig.html')
Exemplo n.º 9
0
def add_site():
    error = None
    if request.method == 'POST':
        title = request.form.get('title', '')
        website = request.form.get('url', '').strip()
        description = request.form.get('description', '')
        source_url = request.form.get('source_url', '')
        tags_names = request.form.get('tags', '').split(',')
        tags_names = filter(lambda s: s, [tag.strip() for tag in tags_names])

        if not website:
            error = 'Site URL is required!'
        else:
            site = Site.query.filter_by(website=website).first()
            if site is None:
                # Add site info to db
                site = Site(title=title,
                            website=website,
                            description=description,
                            source_url=source_url,
                            submitted_by=current_user)
                for tag in map(get_or_create_tag, tags_names):
                    site.tags.append(tag)
                db.session.add(site)
                db.session.commit()
                flash('Site submitted successfully!')
            else:
                flash('This site already submitted by someone!')
            return redirect(url_for('show_site', site_id=site.id))
    return render_template('add_site.html', error=error)
Exemplo n.º 10
0
def list_site_availability(camp_area, start_date, end_date, equipment_type):
    """
    Retrieve the Availability for all Sites in a Camp Area which can host the selected Equipment within a date range
    :param camp_area:
    :param start_date:
    :param end_date:
    :param equipment_type:
    :return:
    """
    data = {
       'mapId':camp_area.map_id,
       'bookingCategoryId':0,
       'startDate':start_date.isoformat(),
       'endDate':end_date.isoformat(),
       'isReserving':True,
       'getDailyAvailability':True,
       'partySize':1,
       'equipmentId':equipment_type,
       'subEquipmentId':equipment_type,
       'generateBreadcrumbs':False,
    }
    results = post_json('MAPDATA', data)
    sites_availability = {}
    for entry in results['resourcesOnMap']:
        site = Site(entry['resourceId'], entry['localizedValues'][0]['name'],entry['localizedValues'][0]['description'])
        allowed_equipment = [Equipment(e['item1'],e['item2'], None) for e in entry['allowedEquipment']]
        availability = [
            SiteAvailability(site, e['availability'], allowed_equipment)
            for e in results['resourceAvailabilityMap'][str(site.resource_id)]
        ]
        sites_availability[site] = availability
    return OrderedDict(sorted(sites_availability.items(), key=lambda sa: sa[0].name.zfill(3)))
Exemplo n.º 11
0
    def test_sites(self):

        mutations = [Mutation(position=x) for x in (0, 5, 12, 57)]

        protein = Protein(refseq='NM_00002',
                          mutations=mutations,
                          sites=[Site(position=x) for x in (10, 14, 15, 57)])

        db.session.add(protein)
        db.session.commit()

        # ==test_find_closest_sites==

        # for mutation at position 0 there is no closest site;
        # for mutation at position 5 there should be 1 closest site
        expected_closest_sites = dict(zip(mutations, [0, 1, 2, 1]))

        for mutation, expected_sites_cnt in expected_closest_sites.items():
            sites_found = mutation.find_closest_sites()
            assert len(sites_found) == expected_sites_cnt

        # ==test_get_affected_ptm_sites==

        expected_affected_sites = dict(zip(mutations, [0, 1, 3, 1]))

        for mutation, expected_sites_cnt in expected_affected_sites.items():
            sites_found = mutation.get_affected_ptm_sites()
            assert len(sites_found) == expected_sites_cnt
Exemplo n.º 12
0
def rename_usergroup_site():
    for group in UserGroup.all():
        site = Site(name=group.name.replace(' - User Group', ''), users=group.users, admins=group.admins)
        site.put()
        for style in group.style_set:
            style.site = site
            style.put()
Exemplo n.º 13
0
def test_prepare_tracks():
    protein = Protein(refseq='NM_01',
                      sequence='123456789',
                      sites=[Site(position=4)])
    sequence_track = SequenceTrack(protein)
    site = sequence_track.subtracks[0].elements[0]
    assert site.start >= 0
Exemplo n.º 14
0
def list_sites(camp_area, start_date, end_date, equipment_type):
    """
    Retrieve Sites within a Camp Area which can host the selected Equipment within a date range
    :param camp_area:
    :param start_date:
    :param end_date:
    :param equipment_type:
    :return:
    """
    data = {
        'mapId': camp_area.map_id,
        'bookingCategoryId': 0,
        'startDate': start_date.isoformat(),
        'endDate': end_date.isoformat(),
        'isReserving': True,
        'getDailyAvailability': True,
        'partySize': 1,
        'equipmentId': equipment_type,
        'subEquipmentId': equipment_type,
        'generateBreadcrumbs': False,
    }
    results = post_json('MAPDATA', data)
    sites = []
    for entry in results['resourcesOnMap']:
        sites.append(
            Site(entry['resourceId'], entry['localizedValues'][0]['name'],
                 entry['localizedValues'][0]['description']))
    sites.sort(key=lambda site: site.name.zfill(3))
    return sites
Exemplo n.º 15
0
    def insert_site(self, domain, robots, url, session):
        sitemaps = list(robots.sitemaps)  # get sitemaps

        if domain not in self.scraped_sites:
            site = Site(domain=domain,
                        robots_content=str(robots),
                        sitemap_content=sitemaps)
            session.add(site)
            session.commit()
            site_id = site.id
            self.scraped_sites.add(domain)

            page = Page(site_id=site_id, page_type_code='FRONTIER', url=url)
            session.add(page)
            session.commit()
            page_id = page.id
            self.scraped_pages.add(url)

            if len(sitemaps) > 0:
                r = requests.get(sitemaps[0])
                root = etree.fromstring(r.content)
                for sitemap in root:
                    children = sitemap.getchildren()
                    candidate = children[
                        0].text  # if sitemap link is not in frontier, add to it
                    if candidate not in self.scraped_pages:
                        self.frontier.put(candidate)
                        self.insert_page(site_id, candidate, page_id, session)

        else:
            site = session.query(Site).filter(Site.domain == domain).first()
            site_id = site.id

        return site_id
Exemplo n.º 16
0
def create_test_models():
    protein = Protein(refseq='NM_0001',
                      gene=Gene(name='SOMEGENE'),
                      sequence='ABCD')
    mutation = Mutation(protein=protein, position=1, alt='E')
    protein.gene.preferred_isoform = protein

    MC3Mutation(mutation=mutation,
                cancer=Cancer(code='CAN'),
                samples='Sample A,Sample B',
                count=2)
    InheritedMutation(mutation=mutation,
                      clin_data=[
                          ClinicalData(disease=Disease(name='Some disease'),
                                       sig_code=5),
                          ClinicalData(disease=Disease(name='Other disease'),
                                       sig_code=2)
                      ])

    protein_kinase = Protein(refseq='NM_0002',
                             gene=Gene(name='OTHERGENE'),
                             sequence='ABCD')
    kinase = Kinase(name='Kinase name', protein=protein_kinase)
    site = Site(protein=protein,
                position=1,
                residue='A',
                kinases={kinase},
                pmid={1, 2},
                types={SiteType(name='glycosylation')})
    protein.sites = [site]

    return locals()
Exemplo n.º 17
0
def sites():
    root_domain = app.config.get("DOMAIN_ROOT")
    port = app.config.get("PORT", None)
    if request.method == "POST":
        domain = request.form["domain"]
        name = request.form["name"]
        if domain and name:
            site = Site()
            site.name = name.strip()
            site.domain = domain.strip()
            conflicting_site = Site.objects.filter(domain=site.domain).first()
            if not conflicting_site:
                site.description = _(
                    "<h1>Introductory text</h1><p>This should "
                    "contain simple help about what is changeable and how."
                    "</p>")
                site.save()
                url = "//%s" % site.domain
                if root_domain:
                    url += ".%s" % root_domain
                if port:
                    url += ":%d" % port
                return redirect(url)
        return redirect(url_for("sites"))
    if root_domain == g.site.domain:
        sites = Site.objects.all()
    else:
        sites = Site.objects.filter(domain__endswith=g.site.domain)
    return render_template("sites.html",
                           sites=sites,
                           root_domain=root_domain,
                           port=port)
Exemplo n.º 18
0
    def add_site(self):
        self.template_path = 'site_add.html'

        # get the site code
        site_code = self.request.get('site_code').strip()
        self.vars['site_code'] = site_code

        # return if there is no site_code, or we are not a post
        if (not site_code) or self.request.method != 'POST':
            return

        # check that the site_code is valid
        if not Site.is_code_valid(site_code):
            self.vars['site_code_error'] = "site code is not valid"
            return

        # check that the site_code is valid
        if Site.is_code_taken(site_code):
            self.vars['site_code_error'] = "site code already exists"
            return

        # ok to create
        site = Site(site_code=site_code, owner=self.person)
        site.put()

        # create the first shared secret
        SharedSecret.new_for_site(site)

        self.redirect('/site/' + site_code)
Exemplo n.º 19
0
def _create_example_site(user):
    site = Site(
        name='Example Site',
        owner=user,
        users=[user],
        admins=[user],
        example=True,
    )
    site.put()

    for v in [4, 5]:
        name = 'Html%d Example' % v
        style = Style(site=site, name=name)
        style.put()
        rev = StyleRevision(parent=style, rev=0)
        rev.put()
        rev.update(render_template('examples/blog-html%d.css' % v))
        style.published_rev = rev
        rev = StyleRevision(parent=style, rev=1)
        rev.put()
        rev.update(render_template('examples/blog-html%d-preview.css' % v))
        style.preview_rev = rev
        style.put()
        page = Page(site=site,
                    name=name,
                    url=url_for('example%d' % v, page_key=0, _external=True),
                    _styles=[style.key()])
        page.put()
        page.url = url_for('example%d' % v,
                           page_key=page.key(),
                           _external=True)
        page.put()
        page.queue_refresh()
Exemplo n.º 20
0
def new_site():
    user = users.get_current_user()
    form = PageForm(request.form)
    if request.method == 'POST':
        if form.validate():
            site = Site(
                name=form.name.data,
                owner=user,
                users=[user],
                admins=[user],
            )
            site.put()
            page = Page.new_page(site, form.name.data, form.url.data)
            new_url = url_for('editor', page_id=page.key().id())
            if request.is_xhr:
                return jsonify(dict(type='success', redirect=new_url))
            else:
                return redirect(new_url)
        elif request.is_xhr:
            return jsonify(
                dict(type='error',
                     errors=render_template('form_errors.html', form=form)))
    if request.is_xhr:
        return render_template('site_creator.html', form=form)
    return render_template('new_site.html', form=form)
Exemplo n.º 21
0
    def test_has_sites_in_range(self):
        mutation_position = 100

        sites_result = {
            (93, 107): True,
            (92, 108): False,
            (100,): True,
            tuple(): False,
            (90,): False,
            (110,): False,
            (94, 95, 96, 97, 98, 99): True,
            (101, 102, 103, 104, 105, 106): True,
            (93,): True,
            (107,): True
        }

        for sites_positions, expected_result in sites_result.items():
            protein = Protein(
                sites=[
                    Site(position=pos)
                    for pos in sites_positions
                ]
            )
            result = protein.has_sites_in_range(mutation_position - 7, mutation_position + 7)
            assert result == expected_result
Exemplo n.º 22
0
def load_sites(filename):
    with open(filename) as json_file:
        data = json.load(json_file)
        for item in data["sites"]:
            adder = DBModelAdder()
            adder.start()

            name = item["name"]
            url = item["url"]
            meta = item["meta"]
            chat = item["chat"]
            api_name = item["api_name"]
            launch_date = datetime.utcfromtimestamp(int(item["launch_date"]))
            language = item["language"]

            site = Site.by_api_name(api_name)
            if site is not None:
                site.name = name
                site.url = url
                site.meta = meta
                site.chat = chat
            else:
                site = Site(name, url, meta, chat, api_name, launch_date,
                            language)

            adder.add(site)
            adder.done()
Exemplo n.º 23
0
 def _tx():
     site = Site.get_by_key_name(loc["id"])
     if site is None:
         site = Site(key_name=loc["id"])
     site.location = GeoPt(lat = loc["location"][0], lon = loc["location"][1])
     site.name = loc["name"]
     site.region = loc["region"]
     site.save()
Exemplo n.º 24
0
    def test_consistency(self):

        p = Protein(refseq='NM_007', id=1, sequence='ABCD')
        db.session.add(p)

        # matching residue (note: for sites, positions are 1-based)
        assert Site(position=2, type='methylation', residue='B', protein=p)

        # mismatched residue
        with pytest.raises(ValidationError):
            Site(position=3, type='methylation', residue='B', protein=p)

        # no residue and position in range
        assert Site(position=2, protein=p)

        # no residue and position outside of range
        with pytest.raises(ValidationError):
            Site(position=5, protein=p)
        with pytest.raises(ValidationError):
            Site(position=-5, protein=p)
Exemplo n.º 25
0
    def test_search_mutations(self):

        s = Site(position=13, types={SiteType(name='methylation')})
        p = Protein(refseq='NM_007', id=7, sites=[s], sequence='XXXXXXXXXXXXV')

        m_in_site = Mutation(protein=p, position=13, alt='V')
        m_out_site = Mutation(protein=p, position=50, alt='K')

        db.session.add(p)

        # points to the same location as first record in VCF_FILE_CONTENT
        test_query = 'chr20 14370 G A'

        from database import bdb

        # map the first genomic mutation from VCF_FILE_CONTENT
        # to some (mocked) protein mutation
        bdb.add_genomic_mut('20', 14370, 'G', 'A', m_in_site, is_ptm=True)

        #
        # basic test - is appropriate mutation in results?
        #
        response = self.search_mutations(mutations=test_query)

        assert response.status_code == 200

        # this mutation is exactly at a PTM site and should be included in results
        assert '<td>{0}</td>'.format(m_in_site.alt).encode() in response.data
        # this mutation lies outside of a PTM site - be default should be filtered out
        assert '<td>{0}</td>'.format(m_out_site.alt).encode() not in response.data

        #
        # count test - is mutation for this query annotated as shown twice?
        #
        response = self.search_mutations(
            mutations='{0}\n{0}'.format(test_query)
        )

        assert response.status_code == 200
        assert b'<td>2</td>' in response.data

        #
        # VCF file test
        #
        response = self.client.post(
            '/search/mutations',
            content_type='multipart/form-data',
            data={
                'vcf-file': (BytesIO(VCF_FILE_CONTENT), 'exemplar_vcf.vcf')
            }
        )

        assert response.status_code == 200
        assert b'NM_007' in response.data
Exemplo n.º 26
0
def site_page(code):
  # Find a site that matches this code
  site = Site(code)
  # Load weather data for this site. Data is not preloaded to avoid
  # downloading entire batch of Environment Canada data on first run.
  template = jinja_env.get_template("site.html")
  return template.render(
    site = site,
    home = home(),
    timetext = site.load_weather()[2],
  )
Exemplo n.º 27
0
    def test_default_residue(self):
        p = Protein(refseq='NM_007', id=1, sequence='ABCD')

        methylation = SiteType(name='methylation')

        # note: for sites, positions are 1-based)
        site = Site(position=2, types={methylation}, protein=p)

        db.session.add(p)
        db.session.commit()

        assert site.residue == 'B'
Exemplo n.º 28
0
    def test_train_model(self):

        phosphorylation = SiteType(name='phosphorylation')

        # non-phosphorylated serine residues are needed to generate negative sites
        p = Protein(refseq='NM_007',
                    sequence='--------SLPA-----------SVIT-------')
        g = Gene(isoforms=[p], preferred_isoform=p)
        db.session.add(g)

        # phosphorylated, with sites
        p = Protein(refseq='NM_001',
                    sequence='--------SPAK-----------SPAR-------')
        g = Gene(isoforms=[p], preferred_isoform=p)
        db.session.add(g)

        k = Kinase(name='CDK1', is_involved_in={phosphorylation})

        for pos in [9, 24]:
            s = Site(position=pos,
                     types={phosphorylation},
                     residue='S',
                     protein=p,
                     kinases={k})
            db.session.add(s)

        db.session.commit()

        with TemporaryDirectory() as temp_dir:
            model = train_model(phosphorylation,
                                sequences_dir=temp_dir,
                                sampling_n=2,
                                threshold=2)

        # the model should have one set of params - for CDK1 kinase
        assert len(model) == 1

        cdk_params = model.rx2('CDK1')
        pwm = cdk_params.rx2('pwm')

        # and the position-specific weight matrix should be created
        assert pwm

        # the very detailed testing should be performed by rMIMP,
        # but why not test the basics?

        weights_of_central_aa = {
            aa: value
            for aa, value in zip(pwm.rownames, pwm.rx(True, 8))
        }
        assert weights_of_central_aa['S'] == max(
            weights_of_central_aa.values())
Exemplo n.º 29
0
 def create_edit_site(form, site_id=None, user=None):
     if site_id:
         site = SiteInstanceResource()._get(site_id=site_id)
     else:
         site = Site()
     site.sitename = form.cleaned_data['sitename']
     site.url = form.cleaned_data['url']
     site.auto_test_mode = int(form.cleaned_data['auto_test_mode'])
     site.save()
     if user:
         user = UserProfileInstanceResource()._get(user=user)
         user.hassites.add(site)
         user.save()
Exemplo n.º 30
0
    def test_interactions(self):

        from models import Protein, Site, Kinase, KinaseGroup

        p1 = Protein(sites=[
            Site(),
            Site(kinases=[Kinase()], kinase_groups=[KinaseGroup()])
        ])
        db.session.add(p1)
        p2 = Protein(sites=[Site(kinases=[Kinase()])])
        db.session.add(p2)

        u_all_interactions = 0
        u_kinases_covered = set()
        u_kinase_groups_covered = set()
        u_proteins_covered = set()
        for protein in models.Protein.query.all():
            for site in protein.sites:
                kinases = site.kinases
                kinase_groups = site.kinase_groups
                u_all_interactions += len(kinases) + len(kinase_groups)
                u_kinases_covered.update(kinases)
                u_kinase_groups_covered.update(kinase_groups)

                if kinases or kinase_groups:
                    u_proteins_covered.add(protein)

        from stats import Statistics
        statistics = Statistics()
        all_interactions = statistics.interactions()
        kinases_covered = statistics.kinases_covered()
        kinase_groups_covered = statistics.kinase_groups_covered()
        proteins_covered = statistics.proteins_covered()

        assert all_interactions == u_all_interactions
        assert kinases_covered == len(u_kinases_covered)
        assert kinase_groups_covered == len(u_kinase_groups_covered)
        assert proteins_covered == len(u_proteins_covered)