Spaces:
Running
Running
Commit
·
1b33af5
1
Parent(s):
54ac992
add more functions
Browse files
app.py
CHANGED
|
@@ -237,7 +237,7 @@ def analyze_single_smiles(smiles):
|
|
| 237 |
#'Peptide Cycles': 'Error',
|
| 238 |
#'Aromatic Cycles': 'Error'
|
| 239 |
}
|
| 240 |
-
|
| 241 |
def annotate_cyclic_structure(mol, sequence):
|
| 242 |
"""Create annotated 2D structure with clear, non-overlapping residue labels"""
|
| 243 |
# Generate 2D coordinates
|
|
@@ -332,6 +332,36 @@ def annotate_cyclic_structure(mol, sequence):
|
|
| 332 |
|
| 333 |
return img
|
| 334 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 335 |
def create_enhanced_linear_viz(sequence, smiles):
|
| 336 |
"""
|
| 337 |
Create an enhanced linear representation showing segment identification process
|
|
@@ -515,9 +545,15 @@ def process_input(smiles_input=None, file_obj=None, show_linear=False):
|
|
| 515 |
# Handle file input
|
| 516 |
if file_obj is not None:
|
| 517 |
try:
|
| 518 |
-
content
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 519 |
output_text = ""
|
| 520 |
-
for line in
|
| 521 |
smiles = line.strip()
|
| 522 |
if smiles:
|
| 523 |
if not is_peptide(smiles):
|
|
@@ -528,6 +564,7 @@ def process_input(smiles_input=None, file_obj=None, show_linear=False):
|
|
| 528 |
output_text += f"Is Cyclic: {result['Is Cyclic']}\n"
|
| 529 |
output_text += "-" * 50 + "\n"
|
| 530 |
return output_text, None, None
|
|
|
|
| 531 |
except Exception as e:
|
| 532 |
return f"Error processing file: {str(e)}", None, None
|
| 533 |
|
|
@@ -544,7 +581,8 @@ iface = gr.Interface(
|
|
| 544 |
),
|
| 545 |
gr.File(
|
| 546 |
label="Or upload a text file with SMILES",
|
| 547 |
-
file_types=[".txt"]
|
|
|
|
| 548 |
),
|
| 549 |
gr.Checkbox(
|
| 550 |
label="Show linear representation"
|
|
@@ -573,9 +611,13 @@ iface = gr.Interface(
|
|
| 573 |
|
| 574 |
Input: Either enter a SMILES string directly or upload a text file containing SMILES strings
|
| 575 |
|
| 576 |
-
Example SMILES strings:
|
| 577 |
-
|
| 578 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 579 |
""",
|
| 580 |
flagging_mode="never"
|
| 581 |
)
|
|
|
|
| 237 |
#'Peptide Cycles': 'Error',
|
| 238 |
#'Aromatic Cycles': 'Error'
|
| 239 |
}
|
| 240 |
+
"""
|
| 241 |
def annotate_cyclic_structure(mol, sequence):
|
| 242 |
"""Create annotated 2D structure with clear, non-overlapping residue labels"""
|
| 243 |
# Generate 2D coordinates
|
|
|
|
| 332 |
|
| 333 |
return img
|
| 334 |
|
| 335 |
+
"""
|
| 336 |
+
def annotate_cyclic_structure(mol, sequence):
|
| 337 |
+
"""Create structure visualization with just the sequence header"""
|
| 338 |
+
# Generate 2D coordinates
|
| 339 |
+
AllChem.Compute2DCoords(mol)
|
| 340 |
+
|
| 341 |
+
# Create drawer with larger size for annotations
|
| 342 |
+
drawer = Draw.rdMolDraw2D.MolDraw2DCairo(2000, 2000) # Even larger size
|
| 343 |
+
|
| 344 |
+
# Draw molecule first
|
| 345 |
+
drawer.drawOptions().addAtomIndices = False
|
| 346 |
+
drawer.DrawMolecule(mol)
|
| 347 |
+
drawer.FinishDrawing()
|
| 348 |
+
|
| 349 |
+
# Convert to PIL Image
|
| 350 |
+
img = Image.open(BytesIO(drawer.GetDrawingText()))
|
| 351 |
+
draw = ImageDraw.Draw(img)
|
| 352 |
+
small_font = ImageFont.load_default()
|
| 353 |
+
|
| 354 |
+
# Add just the sequence header at the top
|
| 355 |
+
seq_text = f"Sequence: {sequence}"
|
| 356 |
+
bbox = draw.textbbox((1000, 100), seq_text, font=small_font)
|
| 357 |
+
padding = 10
|
| 358 |
+
draw.rectangle([bbox[0]-padding, bbox[1]-padding,
|
| 359 |
+
bbox[2]+padding, bbox[3]+padding],
|
| 360 |
+
fill='white', outline='white')
|
| 361 |
+
draw.text((1000, 100), seq_text,
|
| 362 |
+
font=small_font, fill='black', anchor="mm")
|
| 363 |
+
|
| 364 |
+
return img
|
| 365 |
def create_enhanced_linear_viz(sequence, smiles):
|
| 366 |
"""
|
| 367 |
Create an enhanced linear representation showing segment identification process
|
|
|
|
| 545 |
# Handle file input
|
| 546 |
if file_obj is not None:
|
| 547 |
try:
|
| 548 |
+
# Handle file content based on file object type
|
| 549 |
+
if hasattr(file_obj, 'name'): # If it's a file path
|
| 550 |
+
with open(file_obj.name, 'r') as f:
|
| 551 |
+
content = f.read()
|
| 552 |
+
else: # If it's file content
|
| 553 |
+
content = file_obj.decode('utf-8') if isinstance(file_obj, bytes) else str(file_obj)
|
| 554 |
+
|
| 555 |
output_text = ""
|
| 556 |
+
for line in content.splitlines():
|
| 557 |
smiles = line.strip()
|
| 558 |
if smiles:
|
| 559 |
if not is_peptide(smiles):
|
|
|
|
| 564 |
output_text += f"Is Cyclic: {result['Is Cyclic']}\n"
|
| 565 |
output_text += "-" * 50 + "\n"
|
| 566 |
return output_text, None, None
|
| 567 |
+
|
| 568 |
except Exception as e:
|
| 569 |
return f"Error processing file: {str(e)}", None, None
|
| 570 |
|
|
|
|
| 581 |
),
|
| 582 |
gr.File(
|
| 583 |
label="Or upload a text file with SMILES",
|
| 584 |
+
file_types=[".txt"],
|
| 585 |
+
type="binary"
|
| 586 |
),
|
| 587 |
gr.Checkbox(
|
| 588 |
label="Show linear representation"
|
|
|
|
| 611 |
|
| 612 |
Input: Either enter a SMILES string directly or upload a text file containing SMILES strings
|
| 613 |
|
| 614 |
+
Example SMILES strings (copy and paste):
|
| 615 |
+
```
|
| 616 |
+
CC(C)C[C@@H]1NC(=O)[C@@H](CC(C)C)N(C)C(=O)[C@@H](C)N(C)C(=O)[C@H](Cc2ccccc2)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@H]2CCCN2C1=O
|
| 617 |
+
```
|
| 618 |
+
```
|
| 619 |
+
C(C)C[C@@H]1NC(=O)[C@@H]2CCCN2C(=O)[C@@H](CC(C)C)NC(=O)[C@@H](CC(C)C)N(C)C(=O)[C@H](C)NC(=O)[C@H](Cc2ccccc2)NC1=O
|
| 620 |
+
```
|
| 621 |
""",
|
| 622 |
flagging_mode="never"
|
| 623 |
)
|