Raw content of XrefMapper::Interpro package XrefMapper::Interpro; use vars '@ISA'; @ISA = qw{ XrefMapper::BasicMapper }; use strict; use warnings; use XrefMapper::BasicMapper; sub new { my($class, $mapper) = @_; my $self ={}; bless $self,$class; $self->core($mapper->core); $self->xref($mapper->xref); $self->verbose($mapper->verbose); return $self; } sub process{ my $self = shift; print "Writing InterPro\n" if($self->verbose); my( $ipro_count, $xref_count, $oxref_count, $goxref_count ) = (0,0,0,0); my $object_xref_id; my $sth = $self->xref->dbc->prepare("select max(object_xref_id) from object_xref"); $sth->execute(); $sth->bind_columns(\$object_xref_id); $sth->fetch(); $sth->finish; $object_xref_id++; my $add_object_xref_sth = $self->xref->dbc->prepare('insert into object_xref (object_xref_id, ensembl_id,ensembl_object_type, xref_id, linkage_type, ox_status ) values (?, ?, ?, ?, ?, "DUMP_OUT")'); local $add_object_xref_sth->{RaiseError}; #catch duplicates local $add_object_xref_sth->{PrintError}; # cut down on error messages my $add_go_xref_sth = $self->xref->dbc->prepare('insert into go_xref (object_xref_id, linkage_type) values (?, ?)'); # Get a mapping of protein domains to ensembl translations for # interpro dependent xrefs my $core_sql = "SELECT hit_name, translation_id FROM protein_feature" ; my $core_sth = $self->core->dbc->prepare($core_sql); $core_sth->execute(); my %domain_to_translation = (); my ($domain, $translation); $core_sth->bind_columns(\$domain, \$translation); while ($core_sth->fetch()) { $domain_to_translation{$domain} ||= []; push @{$domain_to_translation{$domain}}, $translation; } # Get a list of interpro data, including dependent xrefs if avail $sth = $self->xref->dbc->prepare(" SELECT ip.interpro, ip.pfam, x2.xref_id, x2.source_id, dx.linkage_annotation FROM interpro ip, xref x LEFT JOIN dependent_xref dx ON x.xref_id=dx.master_xref_id LEFT JOIN xref x2 ON dx.dependent_xref_id=x2.xref_id WHERE ip.interpro = x.accession"); my $rv = $sth->execute(); # my %interpro_cache; my %added; my $dup=0; while( my $row = $sth->fetchrow_arrayref() ){ my ( $interpro, $pfam, $dx_xref_id, $dx_source_id, $go_linkage ) = @$row; if( $dx_xref_id ){ foreach my $ensembl_id( @{$domain_to_translation{$pfam}||[]} ){ #...And the interpro domain maps to a translation $add_object_xref_sth->execute($object_xref_id, $ensembl_id, 'Translation', $dx_xref_id, 'DEPENDENT'); if($add_object_xref_sth->err){ my $err = $add_object_xref_sth->errstr; if($err =~ /Duplicate/){ $dup++; next; } else{ die "Problem adding object xref for interpro data\n"; } } $added{$dx_source_id}++; $oxref_count++; if($go_linkage){ $add_go_xref_sth->execute($object_xref_id, $go_linkage ); $goxref_count ++; } $object_xref_id++; } } } $sth->finish(); print "\n".$dup." already existed\n\n" if($self->verbose); print(" Wrote $ipro_count interpro table entries\n") if($self->verbose); print(" including $oxref_count object xrefs, \n") if($self->verbose); print(" and $goxref_count go xrefs\n") if($self->verbose); # foreach my $key (keys %added){ # print "id= $key has ".$added{$key}. " object xrefs added\n"; # } } 1;