From 6b270da8c5563d1e1f67350249fefdf3a67c81ef Mon Sep 17 00:00:00 2001
From: Martijn Vermaat <martijn@vermaat.name>
Date: Tue, 11 Oct 2011 16:08:31 +0000
Subject: [PATCH] Fix Genome Browser link (issue #61)

Link to UCSC Genome Browser now has a more proper implementation. Still todo
is error checking and such.

It uses the same infrastrucure as the position converter and is thus also
limited to variants on transcripts with c. notations.


git-svn-id: https://humgenprojects.lumc.nl/svn/mutalyzer/branches/browser-link-branch@390 eb6bd6ab-9ccd-42b9-aceb-e2899b4a52f1
---
 mutalyzer/__init__.py          |  2 +-
 mutalyzer/mapping.py           | 28 ++++++++++++++++++++++++++++
 mutalyzer/templates/check.html |  3 +--
 mutalyzer/variantchecker.py    | 11 +++++++++++
 mutalyzer/website.py           | 19 ++++++-------------
 5 files changed, 47 insertions(+), 16 deletions(-)

diff --git a/mutalyzer/__init__.py b/mutalyzer/__init__.py
index 08757422..6eed6494 100644
--- a/mutalyzer/__init__.py
+++ b/mutalyzer/__init__.py
@@ -22,7 +22,7 @@ import os
 
 RELEASE = False
 
-__version_info__ = ('2', '0', 'beta-12', 'dev')
+__version_info__ = ('2', '0', 'beta-12', 'browser-link-branch', 'dev')
 __date__ = '30 Sep 2011'
 
 
diff --git a/mutalyzer/mapping.py b/mutalyzer/mapping.py
index afc5b837..ac02d555 100644
--- a/mutalyzer/mapping.py
+++ b/mutalyzer/mapping.py
@@ -446,6 +446,34 @@ class Converter(object) :
         return "%s:%s" % (chromAcc, var_in_g)
     #c2chrom
 
+    def positions_to_chromosomal_region(self, reference, version, positions):
+        """
+        Convert c. positions to chromosomal region.
+        """
+        #if not parseTree.RefSeqAcc: #In case of LRG for example
+        #    self.__output.addMessage(__file__, 4, "EONLYGB",
+        #        "Currently we only support GenBank Records")
+        #    return None
+
+        #if parseTree.RefType != 'c':
+        #    return None
+
+        self._FieldsFromDb(reference, version)
+
+        mapper = self.makeCrossmap()
+        if not mapper:
+            return None
+
+        g = []
+
+        for position in positions:
+            main = mapper.main2int(position.MainSgn +  position.Main)
+            offset = mapper.offset2int(position.OffSgn +  position.Offset)
+            g.append(mapper.x2g(main, offset))
+
+        return self.dbFields['chromosome'], min(g), max(g)
+    #coding_to_chromosomal
+
     def correctChrVariant(self, variant) :
         """
         @arg variant:
diff --git a/mutalyzer/templates/check.html b/mutalyzer/templates/check.html
index c04c888c..1eaab372 100644
--- a/mutalyzer/templates/check.html
+++ b/mutalyzer/templates/check.html
@@ -48,6 +48,7 @@
             </div>
           </div>
         </div> <!-- not:visualisation -->
+        <a tal:condition = "browserLink" tal:attributes = "href browserLink"><br>View region in UCSC Genome Browser</a>
       </div> <!-- form area -->
       <br>
       <div tal:condition = "lastpost">
@@ -264,8 +265,6 @@
             <a tal:content = "reference"
                tal:attributes = "href string:Reference/${reference}"></a>
             <br>
-            <a tal:condition = "browserLink" tal:attributes = "href browserLink">UCSC Genome Browser</a>
-            <br>
             <br>
           </div> <!-- interactive -->
         </div> <!-- reference -->
diff --git a/mutalyzer/variantchecker.py b/mutalyzer/variantchecker.py
index 9adb2889..005a5546 100644
--- a/mutalyzer/variantchecker.py
+++ b/mutalyzer/variantchecker.py
@@ -22,6 +22,7 @@ from Bio.Alphabet import IUPAC
 from mutalyzer import util
 from mutalyzer.grammar import Grammar
 from mutalyzer.mutator import Mutator
+from mutalyzer.mapping import Converter
 from mutalyzer import Retriever
 from mutalyzer import GenRecord
 from mutalyzer import Db
@@ -979,6 +980,8 @@ def process_raw_variant(mutator, variant, record, transcript, output):
                 # Coding positioning.
                 first, last = _coding_to_genomic(first_location, last_location,
                                                  transcript, output)
+                output.addOutput('rawCodingLocations', first_location)
+                output.addOutput('rawCodingLocations', last_location)
             else:
                 # Genomic positioning.
                 first, last = _genomic_to_genomic(first_location, last_location)
@@ -1545,6 +1548,14 @@ def check_variant(description, config, output):
     output.addOutput('original', str(mutator.orig))
     output.addOutput('mutated', str(mutator.mutated))
 
+    # Chromosomal region
+    locations = output.getOutput('rawCodingLocations')
+    if locations:
+        converter = Converter('hg19', config, output)
+        region = converter.positions_to_chromosomal_region(parsed_description.RefSeqAcc, parsed_description.Version, set(locations))
+        if region:
+            output.addOutput('chromosomalRegion', region)
+
     # Protein.
     for gene in record.record.geneList:
         for transcript in gene.transcriptList:
diff --git a/mutalyzer/website.py b/mutalyzer/website.py
index ce81b1f5..e0cadd77 100644
--- a/mutalyzer/website.py
+++ b/mutalyzer/website.py
@@ -727,21 +727,14 @@ class Check:
 
         # Create a link to the UCSC Genome Browser
         # This is an ugly proof of concept.
+        # NM_003002.2:c.274G>T
+        # http://genome.ucsc.edu/cgi-bin/hgTracks?db=hg19&position=chr11:111959695
         browser_link = None
         if output.getIndexedOutput('organism', 0) == 'Homo sapiens':
-            converter = Converter('hg19', config, output)
-            variant = converter.c2chrom(str(name))
-            if variant:
-                import re
-                match = re.match('NC_(\d+)\.\d+:g.(\d+)_?(\d*)[^_\d]', variant)
-                if match:
-                    # Todo: convert NC_0000XX to chr1...chrY
-                    chromosome, start, stop = match.groups()
-                    if stop:
-                        position = 'chr%i:%i-%i' % (int(chromosome), int(start), int(stop))
-                    else:
-                        position = 'chr%i:%i' % (int(chromosome), int(start))
-                    browser_link = 'http://genome.ucsc.edu/cgi-bin/hgTracks?db=hg19&position=%s' % position
+            region = output.getIndexedOutput('chromosomalRegion', 0)
+            if region:
+                chromosome, first, last = region
+                browser_link = 'http://genome.ucsc.edu/cgi-bin/hgTracks?db=hg19&position=%s:%i-%i' % (chromosome, first - 10, last + 10)
 
         # Todo: Generate the fancy HTML views for the proteins here instead
         # of in mutalyzer/variantchecker.py.
-- 
GitLab