yashm commited on
Commit
1a77f6d
·
verified ·
1 Parent(s): f3e881b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +36 -35
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 extract_features(genbank_path, feature_type='CDS'):
18
- """Extracts features from a GenBank file."""
19
- with open(genbank_path, 'r') as file:
20
- record = SeqIO.read(file, "genbank")
21
- features = [feature for feature in record.features if feature.type == feature_type]
22
- return features, record
 
 
23
 
24
- def design_primers_for_feature(feature, sequence, num_to_return=5):
25
- """Design primers for a specific feature."""
26
- start, end = int(feature.location.start), int(feature.location.end)
27
- sequence_template = str(sequence)
28
  target = [start, end - start]
29
- primer_design_results = primer3.bindings.designPrimers(
30
  {
31
- 'SEQUENCE_ID': feature.qualifiers.get('gene', [''])[0],
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
- temp_gb_path = os.path.join(temp_dir, uploaded_file.name)
51
- with open(temp_gb_path, 'wb') as f:
52
- f.write(uploaded_file.getvalue())
 
 
 
 
 
 
 
53
 
54
- features, record = extract_features(temp_gb_path)
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
- selected_feature = next(feature for feature in features if feature.qualifiers.get('gene', [''])[0] == selected_gene)
60
- primers = design_primers_for_feature(selected_feature, record.seq)
61
  primer_df = pd.DataFrame({
62
- 'Primer': ['Left Primer', 'Right Primer'] * len(primers) // 2,
63
- 'Sequence': [primers[f'PRIMER_LEFT_{i}_SEQUENCE'] for i in range(len(primers) // 2)] +
64
- [primers[f'PRIMER_RIGHT_{i}_SEQUENCE'] for i in range(len(primers) // 2)],
65
- 'Tm (°C)': [primers[f'PRIMER_LEFT_{i}_TM'] for i in range(len(primers) // 2)] +
66
- [primers[f'PRIMER_RIGHT_{i}_TM'] for i in range(len(primers) // 2)],
67
- 'Length': [primers[f'PRIMER_LEFT_{i}_SIZE'] for i in range(len(primers) // 2)] +
68
- [primers[f'PRIMER_RIGHT_{i}_SIZE'] for i in range(len(primers) // 2)],
69
- 'GC%': [primers[f'PRIMER_LEFT_{i}_GC_PERCENT'] for i in range(len(primers) // 2)] +
70
- [primers[f'PRIMER_RIGHT_{i}_GC_PERCENT'] for i in range(len(primers) // 2)],
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')