aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzsloan2022-12-21 18:55:29 +0000
committerzsloan2022-12-21 13:04:07 -0600
commite98e9aee54034bc2c3ab349fdda38ff6138ab09e (patch)
tree5f41e3ef3e7c79b7b4b7c827c055f86edd7d5045
parented1340777e03e6c69419d28b34b93684b923260a (diff)
downloadgenenetwork2-e98e9aee54034bc2c3ab349fdda38ff6138ab09e.tar.gz
Add code drawing homology band in mapping figure
-rw-r--r--wqflask/wqflask/marker_regression/display_mapping_results.py194
1 files changed, 170 insertions, 24 deletions
diff --git a/wqflask/wqflask/marker_regression/display_mapping_results.py b/wqflask/wqflask/marker_regression/display_mapping_results.py
index 2ca1fa5f..44067a5d 100644
--- a/wqflask/wqflask/marker_regression/display_mapping_results.py
+++ b/wqflask/wqflask/marker_regression/display_mapping_results.py
@@ -429,6 +429,10 @@ class DisplayMappingResults:
self.SNPChecked = start_vars['showSNP']
else:
self.SNPChecked = False
+ if 'showHomology' in list(start_vars.keys()):
+ self.homologyChecked = start_vars['showHomology']
+ else:
+ self.homologyChecked = False
if 'showGenes' in list(start_vars.keys()):
self.geneChecked = start_vars['showGenes']
else:
@@ -490,28 +494,6 @@ class DisplayMappingResults:
else:
self.GraphInterval = self.cMGraphInterval # cM
-# BEGIN HaplotypeAnalyst
-# count the amount of individuals to be plotted, and increase self.graphHeight
- if self.haplotypeAnalystChecked and self.selectedChr > -1:
- thisTrait = self.this_trait
- smd = []
- for sample in self.sample_vals_dict.keys():
- if self.sample_vals_dict[sample] != "x":
- temp = GeneralObject(name=sample, value=float(
- self.sample_vals_dict[sample]))
- smd.append(temp)
- else:
- continue
- samplelist = list(self.genotype.prgy)
- for j, _geno in enumerate(self.genotype[0][1].genotype):
- for item in smd:
- if item.name == samplelist[j]:
- self.NR_INDIVIDUALS = self.NR_INDIVIDUALS + 1
-# default:
- self.graphHeight = self.graphHeight + 2 * \
- (self.NR_INDIVIDUALS + 10) * self.EACH_GENE_HEIGHT
-# END HaplotypeAnalyst
-
#########################
# Get the sorting column
#########################
@@ -550,7 +532,8 @@ class DisplayMappingResults:
geneTable = ""
self.geneCol = None
- if self.plotScale == 'physic' and self.selectedChr > -1 and (self.intervalAnalystChecked or self.geneChecked):
+ self.homology = None
+ if self.plotScale == 'physic' and self.selectedChr > -1 and (self.intervalAnalystChecked or self.geneChecked or self.homologyChecked):
# Draw the genes for this chromosome / region of this chromosome
webqtldatabase = self.dataset.name
@@ -561,6 +544,7 @@ class DisplayMappingResults:
chrName = self.selectedChr
self.geneCol = GeneUtil.loadGenes(
str(chrName), self.diffCol, self.startMb, self.endMb, "mouse")
+ self.homology = GeneUtil.load_homology(str(chrName), self.startMb, self.endMb)
elif self.dataset.group.species == "rat":
if self.selectedChr == 21:
chrName = "X"
@@ -580,6 +564,34 @@ class DisplayMappingResults:
self.geneTable(self.geneCol, GENEID)
+# BEGIN HaplotypeAnalyst
+# count the amount of individuals to be plotted, and increase self.graphHeight
+ if self.haplotypeAnalystChecked and self.selectedChr > -1:
+ thisTrait = self.this_trait
+ smd = []
+ for sample in self.sample_vals_dict.keys():
+ if self.sample_vals_dict[sample] != "x":
+ temp = GeneralObject(name=sample, value=float(
+ self.sample_vals_dict[sample]))
+ smd.append(temp)
+ else:
+ continue
+ samplelist = list(self.genotype.prgy)
+ for j, _geno in enumerate(self.genotype[0][1].genotype):
+ for item in smd:
+ if item.name == samplelist[j]:
+ self.NR_INDIVIDUALS = self.NR_INDIVIDUALS + 1
+# default:
+ self.graphHeight = self.graphHeight + 2 * \
+ (self.NR_INDIVIDUALS + 10) * self.EACH_GENE_HEIGHT
+# END HaplotypeAnalyst
+
+ if self.homologyChecked and self.homology and (self.endMb - self.startMb < 2) and self.geneChecked and self.geneCol:
+ self.graphHeight = self.graphHeight + (self.NUM_GENE_ROWS) * self.EACH_GENE_HEIGHT
+ if self.geneChecked and self.geneCol:
+ self.graphHeight = self.graphHeight + (self.NUM_GENE_ROWS) * self.EACH_GENE_HEIGHT
+
+
################################################################
# Plots goes here
################################################################
@@ -685,9 +697,12 @@ class DisplayMappingResults:
drawAreaHeight -= 4 * self.BAND_HEIGHT + 4 * self.BAND_SPACING + 10 * zoom
else:
drawAreaHeight -= 3 * self.BAND_HEIGHT + 3 * self.BAND_SPACING + 10 * zoom
+ if self.homologyChecked:
+ drawAreaHeight -= self.NUM_GENE_ROWS * \
+ self.EACH_GENE_HEIGHT + 3 * self.BAND_SPACING
if self.geneChecked:
drawAreaHeight -= self.NUM_GENE_ROWS * \
- self.EACH_GENE_HEIGHT + 3 * self.BAND_SPACING + 10 * zoom
+ self.EACH_GENE_HEIGHT + 3 * self.BAND_SPACING
else:
if self.selectedChr > -1:
drawAreaHeight -= 20
@@ -720,9 +735,16 @@ class DisplayMappingResults:
if self.plotScale == 'physic' and self.selectedChr > -1:
self.drawClickBand(canvas, gifmap, plotXScale, offset=newoffset,
zoom=zoom, startMb=startMb, endMb=endMb)
+
if self.geneChecked and self.geneCol:
self.drawGeneBand(canvas, gifmap, plotXScale, offset=newoffset,
zoom=zoom, startMb=startMb, endMb=endMb)
+ if self.homologyChecked and self.homology and (endMb - startMb < 2):
+ if self.geneChecked and self.geneCol:
+ yTopOffset = newoffset[3] + self.NUM_GENE_ROWS * \
+ self.EACH_GENE_HEIGHT + 3 * self.BAND_SPACING + 10
+ self.drawHomologyBand(canvas, gifmap, plotXScale, offset=(xLeftOffset, xRightOffset, yTopOffset, yBottomOffset),
+ zoom=zoom, startMb=startMb, endMb=endMb)
if self.SNPChecked:
self.drawSNPTrackNew(
canvas, offset=newoffset, zoom=2 * zoom, startMb=startMb, endMb=endMb)
@@ -1317,6 +1339,130 @@ class DisplayMappingResults:
text=string6, xy=(xLeftOffset, y_constant * fontZoom),
font=labelFont, fill=labelColor)
+ def drawHomologyBand(self, canvas, gifmap, plotXScale, offset=(40, 120, 80, 10), zoom=1, startMb=None, endMb=None):
+ im_drawer = ImageDraw.Draw(canvas)
+ if self.plotScale != 'physic' or self.selectedChr == -1 or not self.homology:
+ return
+
+ xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
+ plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
+ plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
+ yZero = canvas.size[1] - yBottomOffset
+ fontZoom = zoom
+ if zoom == 2:
+ fontZoom = 1.5
+
+ yPaddingTop = yTopOffset
+
+ for index, homology_dict in enumerate(self.homology):
+ if self.dataset.group.species == "mouse":
+ mm10_start = homology_dict["mm10_start"]
+ mm10_end = homology_dict["mm10_end"]
+ hg38_chr = homology_dict["hg38_chr"]
+ hg38_strand = homology_dict["hg38_strand"]
+ hg38_start = homology_dict["hg38_start"]
+ hg38_end = homology_dict["hg38_end"]
+ geneLength = (mm10_end - mm10_start) * 1000.0
+ tenPercentLength = geneLength * 0.0001
+
+ geneStartPix = xLeftOffset + \
+ plotXScale * (float(mm10_start) - startMb)
+ geneEndPix = xLeftOffset + plotXScale * \
+ (float(mm10_end) - startMb) # at least one pixel
+
+ if (geneEndPix < xLeftOffset):
+ return # this gene is not on the screen
+ elif (geneEndPix > xLeftOffset + plotWidth):
+ geneEndPix = xLeftOffset + plotWidth # clip the last in-range gene
+ if (geneStartPix > xLeftOffset + plotWidth):
+ return # we are outside the valid on-screen range, so stop drawing genes
+ elif (geneStartPix < xLeftOffset):
+ geneStartPix = xLeftOffset # clip the first in-range gene
+
+ # color the gene based on SNP density
+ # found earlier, needs to be recomputed as snps are added
+ # always apply colors now, even if SNP Track not checked - Zach 11/24/2010
+
+ myColor = BLACK
+
+ outlineColor = myColor
+ fillColor = myColor
+
+ TITLE = f"hg38: Chr {hg38_chr} from {hg38_start:.3f} to {hg38_end:.3f} Mb"
+ HREF = f"http://genome.ucsc.edu/cgi-bin/hgTracks?db=hg38&position=chr{hg38_chr}:{int(hg38_start * 1000000)}-{int(hg38_end * 1000000)}"
+
+ # Draw Genes
+ geneYLocation = yPaddingTop + \
+ (index % self.NUM_GENE_ROWS) * self.EACH_GENE_HEIGHT * zoom
+ if self.dataset.group.species == "mouse" or self.dataset.group.species == "rat":
+ geneYLocation += 4 * self.BAND_HEIGHT + 4 * self.BAND_SPACING
+ else:
+ geneYLocation += 3 * self.BAND_HEIGHT + 3 * self.BAND_SPACING
+
+ # draw the detail view
+ if self.endMb - self.startMb <= self.DRAW_DETAIL_MB and geneEndPix - geneStartPix > self.EACH_GENE_ARROW_SPACING * 3:
+ utrColor = ImageColor.getrgb("rgb(66%, 66%, 66%)")
+ arrowColor = ImageColor.getrgb("rgb(70%, 70%, 70%)")
+
+ # draw the line that runs the entire length of the gene
+ im_drawer.line(
+ xy=(
+ (geneStartPix, geneYLocation + \
+ self.EACH_GENE_HEIGHT / 2 * zoom),
+ (geneEndPix, geneYLocation + self.EACH_GENE_HEIGHT / 2 * zoom)),
+ fill=outlineColor, width=1)
+
+ # draw the arrows
+ if geneEndPix - geneStartPix < 1:
+ genePixRange = 1
+ else:
+ genePixRange = int(geneEndPix - geneStartPix)
+ for xCoord in range(0, genePixRange):
+
+ if (xCoord % self.EACH_GENE_ARROW_SPACING == 0 and xCoord + self.EACH_GENE_ARROW_SPACING < geneEndPix - geneStartPix) or xCoord == 0:
+ if hg38_strand == "+":
+ im_drawer.line(
+ xy=((geneStartPix + xCoord, geneYLocation),
+ (geneStartPix + xCoord + self.EACH_GENE_ARROW_WIDTH,
+ geneYLocation + (self.EACH_GENE_HEIGHT / 2) * zoom)),
+ fill=arrowColor, width=1)
+ im_drawer.line(
+ xy=((geneStartPix + xCoord,
+ geneYLocation + self.EACH_GENE_HEIGHT * zoom),
+ (geneStartPix + xCoord + self.EACH_GENE_ARROW_WIDTH,
+ geneYLocation + (self.EACH_GENE_HEIGHT / 2) * zoom)),
+ fill=arrowColor, width=1)
+ else:
+ im_drawer.line(
+ xy=((geneStartPix + xCoord + self.EACH_GENE_ARROW_WIDTH,
+ geneYLocation),
+ (geneStartPix + xCoord,
+ geneYLocation + (self.EACH_GENE_HEIGHT / 2) * zoom)),
+ fill=arrowColor, width=1)
+ im_drawer.line(
+ xy=((geneStartPix + xCoord + self.EACH_GENE_ARROW_WIDTH,
+ geneYLocation + self.EACH_GENE_HEIGHT * zoom),
+ (geneStartPix + xCoord,
+ geneYLocation + (self.EACH_GENE_HEIGHT / 2) * zoom)),
+ fill=arrowColor, width=1)
+ # draw the genes as rectangles
+ else:
+ im_drawer.rectangle(
+ xy=((geneStartPix, geneYLocation),
+ (geneEndPix, (geneYLocation + self.EACH_GENE_HEIGHT * zoom))),
+ outline=outlineColor, fill=fillColor)
+
+ COORDS = "%d, %d, %d, %d" % (
+ geneStartPix, geneYLocation, geneEndPix, (geneYLocation + self.EACH_GENE_HEIGHT))
+ # NL: 06-02-2011 Rob required to display NCBI info in a new window
+ gifmap.append(
+ HtmlGenWrapper.create_area_tag(
+ shape='rect',
+ coords=COORDS,
+ href=HREF,
+ title=TITLE,
+ target="_blank"))
+
def drawGeneBand(self, canvas, gifmap, plotXScale, offset=(40, 120, 80, 10), zoom=1, startMb=None, endMb=None):
im_drawer = ImageDraw.Draw(canvas)
if self.plotScale != 'physic' or self.selectedChr == -1 or not self.geneCol: