diff --git a/mutalyzer/Db.py b/mutalyzer/Db.py index 73c400467b58d51d68c4c159b6504f69c9919675..5bd25f3396680cd42ad2eeeb19f42ed23706bffe 100644 --- a/mutalyzer/Db.py +++ b/mutalyzer/Db.py @@ -275,7 +275,7 @@ class Mapping(Db) : return self.query(statement) #get_Transcripts - def get_TranscriptsByGeneName(self, geneName) : + def get_TranscriptsByGeneName(self, gene): """ Get a list of transcripts, given a gene name. @@ -288,21 +288,19 @@ class Mapping(Db) : Returns: list ; A list of transcripts. """ - statement = """ - SELECT transcript, version + SELECT transcript, + start, stop, + cds_start, cds_stop, + exon_starts, exon_stops, + gene, chromosome, + orientation, protein, + version FROM Mapping WHERE gene = %s; - """, geneName + """, gene - ret = self.query(statement) - if ret : - l = [] - for i in ret : - l.append(i[0] + '.' + str(i[1])) - return l - #if - return [] + return self.query(statement) #get_TranscriptsByGeneName def get_GeneName(self, mrnaAcc) : diff --git a/mutalyzer/mapping.py b/mutalyzer/mapping.py index f3c55a250217df507465ff77af5478eeff83012c..3117f2b36906994282a71c1b4fd2e3df781bf8ed 100644 --- a/mutalyzer/mapping.py +++ b/mutalyzer/mapping.py @@ -511,12 +511,15 @@ class Converter(object) : return variant #correctChrVariant - def chrom2c(self, variant, rt) : + def chrom2c(self, variant, rt, gene=None): """ @arg variant: a variant description @type variant: string @arg rt: the return type @type rt: string + @kwarg gene: Optional gene name. If given, return variant descriptions + on all transcripts for this gene. + @type gene: string @return: HGVS_notatations ; @rtype: dictionary or list @@ -543,14 +546,20 @@ class Converter(object) : loc2 = int(self.parseTree.RawVar.EndLoc.PtLoc.Main) else : loc2 = loc - transcripts = self.__database.get_Transcripts(\ - chrom, loc-5000, loc2+5000, 1) + + if gene: + transcripts = self.__database.get_TranscriptsByGeneName(gene) + else: + transcripts = self.__database.get_Transcripts(chrom, loc-5000, loc2+5000, 1) HGVS_notatations = defaultdict(list) NM_list = [] for transcript in transcripts : self._reset() self._FieldsFromValues(transcript) + if self.dbFields['chromosome'] != chrom: + # Could be the case if we got transcripts by gene name + continue M = self._coreMapping() if M is None : #balen diff --git a/mutalyzer/webservice.py b/mutalyzer/webservice.py index 2feecd256ef36e4f5ba652eae8cc0192aa5b57a9..e969c04249cd6a823e57662a28edc77808a3ebe8 100644 --- a/mutalyzer/webservice.py +++ b/mutalyzer/webservice.py @@ -213,7 +213,13 @@ class MutalyzerService(DefinitionBase): "Finished processing getTranscriptsByGene(%s %s)" % ( build, name)) - return ret + if ret : + l = [] + for i in ret : + l.append(i[0] + '.' + str(i[11])) + return l + + return [] #getTranscriptsByGene @soap(Mandatory.String, Mandatory.String, Mandatory.Integer, @@ -481,17 +487,19 @@ class MutalyzerService(DefinitionBase): return result #chromosomeName - @soap(Mandatory.String, Mandatory.String, _returns = Array(Mandatory.String)) - def numberConversion(self, build, variant) : + @soap(Mandatory.String, Mandatory.String, String, _returns = Array(Mandatory.String)) + def numberConversion(self, build, variant, gene=None): """ Converts I{c.} to I{g.} notation or vice versa - @arg build: The human genome build (hg19 or hg18). @type build: string @arg variant: The variant in either I{c.} or I{g.} notation, full HGVS - notation, including NM_ or NC_ accession number. + notation, including NM_ or NC_ accession number. @type variant: string + @kwarg gene: Optional gene name. If given, return variant descriptions + on all transcripts for this gene. + @type gene: string @return: The variant(s) in either I{g.} or I{c.} notation. @rtype: list @@ -507,7 +515,7 @@ class MutalyzerService(DefinitionBase): if "c." in variant : result = [converter.c2chrom(variant)] elif "g." in variant : - result = converter.chrom2c(variant, "list") + result = converter.chrom2c(variant, "list", gene=gene) else: result = [""] diff --git a/tests/test_webservice.py b/tests/test_webservice.py index d470168056906ad52ddb6e0a72165a988d3c354f..5c7437843943c9473338402ce4db0825391a091c 100644 --- a/tests/test_webservice.py +++ b/tests/test_webservice.py @@ -116,6 +116,40 @@ class TestWebservice(): assert_equal(type(r.string), list) assert 'NC_000001.10:g.159272155del' in r.string + def test_numberconversion_gtoc_gene(self): + """ + Running numberConversion with valid g variant and a gene name should + give a list of c variant names on transcripts for the given gene. + """ + r = self.client.service.numberConversion(build='hg19', + variant='NC_000011.9:g.111959693G>T', + gene='C11orf57') + assert_equal(type(r.string), list) + assert 'NM_001082969.1:c.*2178+d3819G>T' in r.string + assert 'NM_001082970.1:c.*2178+d3819G>T' in r.string + assert 'NM_018195.3:c.*2178+d3819G>T' in r.string + + def test_numberconversion_gtoc_no_transcripts(self): + """ + Running numberConversion with valid g variant but no transcripts + close to it should give an empty list. + """ + r = self.client.service.numberConversion(build='hg19', + variant='chr7:g.345T>C') + assert_false(r) + + def test_numberconversion_gtoc_required_gene(self): + """ + Running numberConversion with valid g variant but no transcripts + close to it, but with a gene name, should give a list of c variant + names on transcripts for the given gene. + """ + r = self.client.service.numberConversion(build='hg19', + variant='chr7:g.345T>C', + gene='LOC100132858') + assert_equal(type(r.string), list) + assert 'XM_001715131.2:c.1155+d19483A>G' in r.string + def test_gettranscriptsbygenename_valid(self): """ Running getTranscriptsByGeneName with valid gene name should give a @@ -133,6 +167,15 @@ class TestWebservice(): 'NM_004022.2']: assert t in r.string + def test_gettranscriptsbygenename_invalid(self): + """ + Running getTranscriptsByGeneName with invalid gene name should not + give a result. + """ + r = self.client.service.getTranscriptsByGeneName(build='hg19', + name='BOGUSGENE') + assert_false(r) + def test_gettranscriptsandinfo_valid(self): """ Running getTranscriptsAndInfo with a valid genomic reference should @@ -206,7 +249,7 @@ class TestWebservice(): def test_gettranscripts(self): """ - Running getTranscriptsByGeneName should give a list of transcripts. + Running getTranscripts should give a list of transcripts. """ r = self.client.service.getTranscripts(build='hg19', chrom='chrX', pos=32237295) @@ -222,7 +265,7 @@ class TestWebservice(): def test_gettranscripts_with_versions(self): """ - Running getTranscriptsByGeneName with versions=True should give a list + Running getTranscripts with versions=True should give a list of transcripts with version numbers. """ r = self.client.service.getTranscripts(build='hg19', chrom='chrX',