diff --git a/ippisite/db.sqlite3 b/ippisite/db.sqlite3 index 585c05bac9b5bb713a7f404b36981aaa02f2ba17..8222fa0613fb7defe327ce8452ea41e836d26eeb 100644 Binary files a/ippisite/db.sqlite3 and b/ippisite/db.sqlite3 differ diff --git a/ippisite/ippidb/management/commands/import_v1_data.py b/ippisite/ippidb/management/commands/import_v1_data.py index 67b83282921858fab32d01476f8e4dbd584c8eb4..69948d26554c89e2545dd9f22523133075f2fc94 100644 --- a/ippisite/ippidb/management/commands/import_v1_data.py +++ b/ippisite/ippidb/management/commands/import_v1_data.py @@ -2,7 +2,7 @@ from django.core.management import BaseCommand, CommandError import mysql.connector from ippidb.models import Bibliography, Protein, Taxonomy, MolecularFunction, \ - Domain, ProteinDomainBoundComplex, ProteinDomainPartnerComplex, Symmetry, Ppi + Domain, ProteinDomainBoundComplex, ProteinDomainPartnerComplex, Symmetry, Ppi, PpiComplex class Command(BaseCommand): @@ -31,18 +31,18 @@ class Command(BaseCommand): help='Flush and migrate domains', ) parser.add_argument( - '--complexes', + '--symmetries', action='store_true', - dest='complexes', + dest='symmetries', default=False, - help='Flush and migrate complexes', + help='Flush and create symmetries', ) parser.add_argument( - '--symmetries', + '--ppi', action='store_true', - dest='symmetries', + dest='ppi', default=False, - help='Flush and create symmetries', + help='Flush and migrate ppis and complexes', ) parser.add_argument( '--stoponfail', @@ -117,39 +117,6 @@ class Command(BaseCommand): self.stdout.write(self.style.ERROR('Failed inserting {} {}'.format(row[1], row[2]))) else: self.stdout.write(self.style.SUCCESS('Successfully inserted {} {}'.format(row[1], row[2]))) - if options['complexes']: - sql_request_string = ''' - select distinct protein.NumUniprot, domain.PfamNumAccession , complexe.NbCopy, cmpdAction.IDComplexeBound, bindingSiteEvidence.CodePDB from bindingSite inner join ppi on (bindingSite.IDBindingSite=ppi.IDBindingSite1) inner join complexe on (ppi.IDComplexe1=complexe.IDComplexe) left outer join cmpdAction on (complexe.IDComplexe=cmpdAction.IDComplexeBound) inner join protein on (bindingSite.IDProtein=protein.IDProtein) inner join domain on (bindingSite.IDDomain=domain.IDDomain) union select distinct protein.NumUniprot, domain.PfamNumAccession , complexe.NbCopy, cmpdAction.IDComplexeBound from bindingSite inner join ppi on (bindingSite.IDBindingSite=ppi.IDBindingSite2) inner join complexe on (ppi.IDComplexe2=complexe.IDComplexe) left outer join cmpdAction on (complexe.IDComplexe=cmpdAction.IDComplexeBound) inner join protein on (bindingSite.IDProtein=protein.IDProtein) inner join domain on (bindingSite.IDDomain=domain.IDDomain) left outer join bindingSiteEvidence on (ppi.IDPPI=bindingSiteEvidence.IDPPI)''' - cursor.execute(sql_request_string) - rows = cursor.fetchall() - ProteinDomainBoundComplex.objects.all().delete() - ProteinDomainPartnerComplex.objects.all().delete() - Ppi.objects.all().delete() - self.stdout.write(self.style.SUCCESS('Successfully flushed protein domain complex tables and Ppi')) - for row in rows: - try: - if row[3]=="null": - c = ProteinDomainPartnerComplex() - else: - c = ProteinDomainBoundComplex() - protein = Protein.objects.get(uniprot_id=row[0]) - c.protein_id = protein - domain = Domain.objects.get(pfam_acc=row[1]) - c.domain_id = domain - c.ppc_copy_nb = row[2] - if isinstance(c, ProteinDomainBoundComplex): - c.ppp_copy_nb_per_p = 1 - c.pockets_nb = 1 - c.save() - except Exception as e: - if options['stoponfail']: - import traceback - self.stderr.write(traceback.format_exc()) - raise CommandError('Failed inserting {} {}'.format(row[0], row[1])) - else: - self.stdout.write(self.style.ERROR('Failed inserting {} {}'.format(row[0], row[1]))) - else: - self.stdout.write(self.style.SUCCESS('Successfully inserted {} {}'.format(row[0], row[1]))) if options['symmetries']: Symmetry.objects.all().delete() self.stdout.write(self.style.SUCCESS('Successfully flushed symmetries table')) @@ -179,4 +146,57 @@ class Command(BaseCommand): self.stdout.write(self.style.ERROR('Failed inserting {} {}'.format(row[0], row[1]))) else: self.stdout.write(self.style.SUCCESS('Successfully inserted {} {}'.format(row[0], row[1]))) + if options['ppi']: + sql_request_string = ''' +select distinct protein.NumUniprot, domain.PfamNumAccession, complexe.NbCopy, cmpdAction.IDComplexeBound, bindingSiteEvidence.CodePDB, 'part1', ppi.IDPPI from bindingSite inner join ppi on (bindingSite.IDBindingSite=ppi.IDBindingSite1) inner join complexe on (ppi.IDComplexe1=complexe.IDComplexe) left outer join cmpdAction on (complexe.IDComplexe=cmpdAction.IDComplexeBound) inner join protein on (bindingSite.IDProtein=protein.IDProtein) inner join domain on (bindingSite.IDDomain=domain.IDDomain) left outer join bindingSiteEvidence on (ppi.IDPPI=bindingSiteEvidence.IDPPI) +union +select distinct protein.NumUniprot, domain.PfamNumAccession , complexe.NbCopy, cmpdAction.IDComplexeBound, null, 'part2', ppi.IDPPI from bindingSite inner join ppi on (bindingSite.IDBindingSite=ppi.IDBindingSite2) inner join complexe on (ppi.IDComplexe2=complexe.IDComplexe) left outer join cmpdAction on (complexe.IDComplexe=cmpdAction.IDComplexeBound) inner join protein on (bindingSite.IDProtein=protein.IDProtein) inner join domain on (bindingSite.IDDomain=domain.IDDomain)''' + cursor.execute(sql_request_string) + rows = cursor.fetchall() + ProteinDomainBoundComplex.objects.all().delete() + ProteinDomainPartnerComplex.objects.all().delete() + Ppi.objects.all().delete() + PpiComplex.objects.all().delete() + self.stdout.write(self.style.SUCCESS('Successfully flushed protein domain complex tables and Ppi')) + ppi_ids_mapping = {} + for row in rows: + try: + # create or retrieve Ppi object + if row[5]=='part1': + ppi = Ppi() + ppi.pdb_id = row[4] + ppi.symmetry = Symmetry.objects.get(code='AS') + ppi.save() + ppi_ids_mapping[row[6]]=ppi.id + else: + ppi = Ppi.objects.get(id=ppi_ids_mapping[row[6]]) + # create a complex + if row[3]=="null": + c = ProteinDomainPartnerComplex() + else: + c = ProteinDomainBoundComplex() + protein = Protein.objects.get(uniprot_id=row[0]) + c.protein = protein + domain = Domain.objects.get(pfam_acc=row[1]) + c.domain = domain + c.ppc_copy_nb = row[2] + if isinstance(c, ProteinDomainBoundComplex): + c.ppp_copy_nb_per_p = 1 + c.pockets_nb = 1 + c.save() + # create the PpiComplex object + ppi_complex = PpiComplex() + ppi_complex.ppi = ppi + ppi_complex.complex = c + ppi_complex.cc_nb = 1 + ppi_complex.save() + except Exception as e: + if options['stoponfail']: + import traceback + self.stderr.write(traceback.format_exc()) + raise CommandError('Failed inserting {} {}'.format(row[0], row[1])) + else: + self.stdout.write(self.style.ERROR('Failed inserting {} {}'.format(row[0], row[1]))) + else: + self.stdout.write(self.style.SUCCESS('Successfully inserted {} {}'.format(row[0], row[1]))) diff --git a/ippisite/ippidb/migrations/0011_auto_20170518_1404.py b/ippisite/ippidb/migrations/0011_auto_20170518_1404.py new file mode 100644 index 0000000000000000000000000000000000000000..9abe3d730559d93e1f8dfbcf9b6caa7543b582dd --- /dev/null +++ b/ippisite/ippidb/migrations/0011_auto_20170518_1404.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.1 on 2017-05-18 14:04 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ippidb', '0010_auto_20170518_1142'), + ] + + operations = [ + migrations.AlterField( + model_name='ppi', + name='pdb_id', + field=models.CharField(max_length=4, null=True, verbose_name='PDB ID'), + ), + ] diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py index 50288a93986113f872b57728b47c61ec364e5ebe..4e4f0901e8ea3f2242df1e458ea2bad1f55a8622 100644 --- a/ippisite/ippidb/models.py +++ b/ippisite/ippidb/models.py @@ -150,7 +150,7 @@ class Symmetry(models.Model): return '{} ({})'.format(self.code, self.description) class Ppi(models.Model): - pdb_id = models.CharField('PDB ID', max_length=4) + pdb_id = models.CharField('PDB ID', max_length=4, null=True) symmetry = models.ForeignKey(Symmetry) class PpiComplex(models.Model):