Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,10 +1,8 @@
|
|
| 1 |
import streamlit as st
|
| 2 |
import pandas as pd
|
| 3 |
-
from Bio import SeqIO
|
| 4 |
-
from Bio.SeqFeature import SeqFeature, FeatureLocation
|
| 5 |
import primer3
|
|
|
|
| 6 |
import os
|
| 7 |
-
from collections import Counter
|
| 8 |
|
| 9 |
# Ensure the 'temp' directory exists for saving temporary files
|
| 10 |
temp_dir = "temp"
|
|
@@ -14,22 +12,21 @@ os.makedirs(temp_dir, exist_ok=True)
|
|
| 14 |
st.set_page_config(page_title="PCR Primer Design", page_icon="🧬", layout="wide")
|
| 15 |
uploaded_file = st.file_uploader("Upload a GenBank file", type=['gb', 'gbk'])
|
| 16 |
|
| 17 |
-
def
|
| 18 |
-
"""Extracts features from a GenBank
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
|
|
|
|
|
|
| 23 |
|
| 24 |
-
def
|
| 25 |
-
"""Design primers for a specific
|
| 26 |
-
start, end = int(feature.location.start), int(feature.location.end)
|
| 27 |
-
sequence_template = str(sequence)
|
| 28 |
target = [start, end - start]
|
| 29 |
-
|
| 30 |
{
|
| 31 |
-
'
|
| 32 |
-
'SEQUENCE_TEMPLATE': sequence_template,
|
| 33 |
'SEQUENCE_TARGET': target,
|
| 34 |
},
|
| 35 |
{
|
|
@@ -44,30 +41,34 @@ def design_primers_for_feature(feature, sequence, num_to_return=5):
|
|
| 44 |
'PRIMER_NUM_RETURN': num_to_return,
|
| 45 |
}
|
| 46 |
)
|
| 47 |
-
return primer_design_results
|
| 48 |
|
| 49 |
if uploaded_file is not None:
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
|
| 54 |
-
|
| 55 |
-
gene_names = [feature.qualifiers.get('gene', ['N/A'])[0] for feature in features]
|
| 56 |
-
selected_gene = st.selectbox('Select a gene to design primers for:', gene_names)
|
| 57 |
|
| 58 |
-
if st.button('Design Primers'):
|
| 59 |
-
|
| 60 |
-
primers =
|
| 61 |
primer_df = pd.DataFrame({
|
| 62 |
-
'Primer': ['Left Primer'
|
| 63 |
-
'Sequence': [primers[f'PRIMER_LEFT_{i}_SEQUENCE'] for i in range(
|
| 64 |
-
[primers[f'PRIMER_RIGHT_{i}_SEQUENCE'] for i in range(
|
| 65 |
-
'Tm (°C)': [primers[f'PRIMER_LEFT_{i}_TM'] for i in range(
|
| 66 |
-
[primers[f'PRIMER_RIGHT_{i}_TM'] for i in range(
|
| 67 |
-
'Length': [primers[f'PRIMER_LEFT_{i}_SIZE'] for i in range(
|
| 68 |
-
[primers[f'PRIMER_RIGHT_{i}_SIZE'] for i in range(
|
| 69 |
-
'GC%': [primers[f'PRIMER_LEFT_{i}_GC_PERCENT'] for i in range(
|
| 70 |
-
[primers[f'PRIMER_RIGHT_{i}_GC_PERCENT'] for i in range(
|
| 71 |
})
|
| 72 |
|
| 73 |
st.write('### Designed Primers')
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
import pandas as pd
|
|
|
|
|
|
|
| 3 |
import primer3
|
| 4 |
+
from Bio import SeqIO
|
| 5 |
import os
|
|
|
|
| 6 |
|
| 7 |
# Ensure the 'temp' directory exists for saving temporary files
|
| 8 |
temp_dir = "temp"
|
|
|
|
| 12 |
st.set_page_config(page_title="PCR Primer Design", page_icon="🧬", layout="wide")
|
| 13 |
uploaded_file = st.file_uploader("Upload a GenBank file", type=['gb', 'gbk'])
|
| 14 |
|
| 15 |
+
def extract_features_from_genbank(genbank_content, feature_types=['CDS', 'tRNA', 'gene']):
|
| 16 |
+
"""Extracts specified features from a GenBank content."""
|
| 17 |
+
record = SeqIO.read(genbank_content, "genbank")
|
| 18 |
+
features = {ftype: [] for ftype in feature_types}
|
| 19 |
+
for feature in record.features:
|
| 20 |
+
if feature.type in feature_types:
|
| 21 |
+
features[feature.type].append(feature)
|
| 22 |
+
return features, record
|
| 23 |
|
| 24 |
+
def design_primers_for_region(sequence, start, end, num_to_return=5):
|
| 25 |
+
"""Design primers for a specific region within a sequence."""
|
|
|
|
|
|
|
| 26 |
target = [start, end - start]
|
| 27 |
+
return primer3.bindings.designPrimers(
|
| 28 |
{
|
| 29 |
+
'SEQUENCE_TEMPLATE': str(sequence),
|
|
|
|
| 30 |
'SEQUENCE_TARGET': target,
|
| 31 |
},
|
| 32 |
{
|
|
|
|
| 41 |
'PRIMER_NUM_RETURN': num_to_return,
|
| 42 |
}
|
| 43 |
)
|
|
|
|
| 44 |
|
| 45 |
if uploaded_file is not None:
|
| 46 |
+
features, record = extract_features_from_genbank(uploaded_file)
|
| 47 |
+
feature_type = st.selectbox('Select feature type:', ['CDS', 'tRNA', 'gene'])
|
| 48 |
+
|
| 49 |
+
# Create a selection box for genes based on chosen feature
|
| 50 |
+
feature_options = [f"{feature.qualifiers.get('locus_tag', [''])[0]}: {feature.location}" for feature in features[feature_type]]
|
| 51 |
+
selected_feature_option = st.selectbox(f'Select a {feature_type}:', feature_options)
|
| 52 |
+
selected_feature = features[feature_type][feature_options.index(selected_feature_option)]
|
| 53 |
+
|
| 54 |
+
start, end = int(selected_feature.location.start), int(selected_feature.location.end)
|
| 55 |
+
st.write(f"Selected {feature_type} size: {end - start} bp")
|
| 56 |
|
| 57 |
+
product_size_range = st.text_input("Enter desired PCR product size range (e.g., 150-500):", value="150-500")
|
|
|
|
|
|
|
| 58 |
|
| 59 |
+
if st.button(f'Design Primers for {feature_type}'):
|
| 60 |
+
size_range = [tuple(map(int, r.split('-'))) for r in product_size_range.split(',')]
|
| 61 |
+
primers = design_primers_for_region(record.seq, start, end, num_to_return=5)
|
| 62 |
primer_df = pd.DataFrame({
|
| 63 |
+
'Primer': ['Left Primer'] * 5 + ['Right Primer'] * 5,
|
| 64 |
+
'Sequence': [primers[f'PRIMER_LEFT_{i}_SEQUENCE'] for i in range(5)] +
|
| 65 |
+
[primers[f'PRIMER_RIGHT_{i}_SEQUENCE'] for i in range(5)],
|
| 66 |
+
'Tm (°C)': [primers[f'PRIMER_LEFT_{i}_TM'] for i in range(5)] +
|
| 67 |
+
[primers[f'PRIMER_RIGHT_{i}_TM'] for i in range(5)],
|
| 68 |
+
'Length': [primers[f'PRIMER_LEFT_{i}_SIZE'] for i in range(5)] +
|
| 69 |
+
[primers[f'PRIMER_RIGHT_{i}_SIZE'] for i in range(5)],
|
| 70 |
+
'GC%': [primers[f'PRIMER_LEFT_{i}_GC_PERCENT'] for i in range(5)] +
|
| 71 |
+
[primers[f'PRIMER_RIGHT_{i}_GC_PERCENT'] for i in range(5)],
|
| 72 |
})
|
| 73 |
|
| 74 |
st.write('### Designed Primers')
|