Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -644,7 +644,10 @@ def compute_gene_statistics(gene_shap: np.ndarray) -> Dict[str, float]:
|
|
644 |
}
|
645 |
|
646 |
def create_simple_genome_diagram(gene_results: List[Dict[str, Any]], genome_length: int) -> Image.Image:
|
647 |
-
"""
|
|
|
|
|
|
|
648 |
from PIL import Image, ImageDraw, ImageFont
|
649 |
|
650 |
# Validate inputs
|
@@ -659,7 +662,7 @@ def create_simple_genome_diagram(gene_results: List[Dict[str, Any]], genome_leng
|
|
659 |
gene['start'] = max(0, int(gene['start']))
|
660 |
gene['end'] = min(genome_length, int(gene['end']))
|
661 |
if gene['start'] >= gene['end']:
|
662 |
-
print(f"Warning: Invalid coordinates for gene {gene
|
663 |
|
664 |
# Image dimensions
|
665 |
width = 1500
|
@@ -689,7 +692,7 @@ def create_simple_genome_diagram(gene_results: List[Dict[str, Any]], genome_leng
|
|
689 |
# Calculate scale factor
|
690 |
scale = float(width - 2 * margin) / float(genome_length)
|
691 |
|
692 |
-
# Determine a reasonable step for scale markers
|
693 |
num_ticks = 10
|
694 |
if genome_length < num_ticks:
|
695 |
step = 1
|
@@ -712,43 +715,50 @@ def create_simple_genome_diagram(gene_results: List[Dict[str, Any]], genome_leng
|
|
712 |
for idx, gene in enumerate(sorted_genes):
|
713 |
# Calculate position and ensure integers
|
714 |
start_x = margin + int(gene['start'] * scale)
|
715 |
-
end_x
|
716 |
|
717 |
# Calculate color based on SHAP value
|
718 |
-
|
719 |
-
|
720 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
721 |
else:
|
722 |
-
|
723 |
-
color = (
|
724 |
|
725 |
-
# Draw gene
|
726 |
draw.rectangle([
|
727 |
(int(start_x), int(line_y - track_height // 2)),
|
728 |
(int(end_x), int(line_y + track_height // 2))
|
729 |
], fill=color, outline='black')
|
730 |
|
731 |
# Prepare gene name label
|
732 |
-
label =
|
733 |
|
734 |
-
#
|
|
|
|
|
735 |
label_mask = font.getmask(label)
|
736 |
label_width, label_height = label_mask.size
|
737 |
|
738 |
-
# Alternate label positions above/below
|
739 |
if idx % 2 == 0:
|
740 |
text_y = line_y - track_height - 15
|
741 |
else:
|
742 |
text_y = line_y + track_height + 5
|
743 |
|
744 |
-
# Decide to rotate text
|
745 |
gene_width = end_x - start_x
|
746 |
if gene_width > label_width:
|
747 |
-
# Draw horizontally
|
748 |
text_x = start_x + (gene_width - label_width) // 2
|
749 |
draw.text((int(text_x), int(text_y)), label, fill='black', font=font)
|
750 |
elif gene_width > 20:
|
751 |
-
# Create rotated text
|
752 |
txt_img = Image.new('RGBA', (label_width, label_height), (255, 255, 255, 0))
|
753 |
txt_draw = ImageDraw.Draw(txt_img)
|
754 |
txt_draw.text((0, 0), label, font=font, fill='black')
|
@@ -800,6 +810,7 @@ def create_simple_genome_diagram(gene_results: List[Dict[str, Any]], genome_leng
|
|
800 |
return img
|
801 |
|
802 |
|
|
|
803 |
def analyze_gene_features(sequence_file: str,
|
804 |
features_file: str,
|
805 |
fasta_text: str = "",
|
|
|
644 |
}
|
645 |
|
646 |
def create_simple_genome_diagram(gene_results: List[Dict[str, Any]], genome_length: int) -> Image.Image:
|
647 |
+
"""
|
648 |
+
Create a simple genome diagram using PIL, forcing a minimum color intensity
|
649 |
+
so that small SHAP values don't appear white.
|
650 |
+
"""
|
651 |
from PIL import Image, ImageDraw, ImageFont
|
652 |
|
653 |
# Validate inputs
|
|
|
662 |
gene['start'] = max(0, int(gene['start']))
|
663 |
gene['end'] = min(genome_length, int(gene['end']))
|
664 |
if gene['start'] >= gene['end']:
|
665 |
+
print(f"Warning: Invalid coordinates for gene {gene.get('gene_name','?')}: {gene['start']}-{gene['end']}")
|
666 |
|
667 |
# Image dimensions
|
668 |
width = 1500
|
|
|
692 |
# Calculate scale factor
|
693 |
scale = float(width - 2 * margin) / float(genome_length)
|
694 |
|
695 |
+
# Determine a reasonable step for scale markers
|
696 |
num_ticks = 10
|
697 |
if genome_length < num_ticks:
|
698 |
step = 1
|
|
|
715 |
for idx, gene in enumerate(sorted_genes):
|
716 |
# Calculate position and ensure integers
|
717 |
start_x = margin + int(gene['start'] * scale)
|
718 |
+
end_x = margin + int(gene['end'] * scale)
|
719 |
|
720 |
# Calculate color based on SHAP value
|
721 |
+
avg_shap = gene['avg_shap']
|
722 |
+
|
723 |
+
# Convert shap -> color intensity (0 to 255)
|
724 |
+
# Then clamp to a minimum intensity so it never ends up plain white
|
725 |
+
intensity = int(abs(avg_shap) * 500)
|
726 |
+
intensity = max(50, min(255, intensity)) # clamp between 50 and 255
|
727 |
+
|
728 |
+
if avg_shap > 0:
|
729 |
+
# Red-ish for positive
|
730 |
+
color = (255, 255 - intensity, 255 - intensity)
|
731 |
else:
|
732 |
+
# Blue-ish for negative or zero
|
733 |
+
color = (255 - intensity, 255 - intensity, 255)
|
734 |
|
735 |
+
# Draw gene rectangle
|
736 |
draw.rectangle([
|
737 |
(int(start_x), int(line_y - track_height // 2)),
|
738 |
(int(end_x), int(line_y + track_height // 2))
|
739 |
], fill=color, outline='black')
|
740 |
|
741 |
# Prepare gene name label
|
742 |
+
label = str(gene.get('gene_name','?'))
|
743 |
|
744 |
+
# If getsize() or textsize() is missing, use getmask(...).size as fallback
|
745 |
+
# But if your Pillow version supports font.getsize, you can do:
|
746 |
+
# label_width, label_height = font.getsize(label)
|
747 |
label_mask = font.getmask(label)
|
748 |
label_width, label_height = label_mask.size
|
749 |
|
750 |
+
# Alternate label positions above/below line
|
751 |
if idx % 2 == 0:
|
752 |
text_y = line_y - track_height - 15
|
753 |
else:
|
754 |
text_y = line_y + track_height + 5
|
755 |
|
756 |
+
# Decide whether to rotate text based on space
|
757 |
gene_width = end_x - start_x
|
758 |
if gene_width > label_width:
|
|
|
759 |
text_x = start_x + (gene_width - label_width) // 2
|
760 |
draw.text((int(text_x), int(text_y)), label, fill='black', font=font)
|
761 |
elif gene_width > 20:
|
|
|
762 |
txt_img = Image.new('RGBA', (label_width, label_height), (255, 255, 255, 0))
|
763 |
txt_draw = ImageDraw.Draw(txt_img)
|
764 |
txt_draw.text((0, 0), label, font=font, fill='black')
|
|
|
810 |
return img
|
811 |
|
812 |
|
813 |
+
|
814 |
def analyze_gene_features(sequence_file: str,
|
815 |
features_file: str,
|
816 |
fasta_text: str = "",
|