File size: 6,999 Bytes
8034147
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
import streamlit as st
from streamlit_ketcher import st_ketcher
from rdkit import Chem
from rdkit.Chem import Draw, AllChem, rdDetermineBonds, Descriptors

import py3Dmol
from stmol import showmol
from io import StringIO
import sys
import subprocess
import time
import streamlit_shadcn_ui as ui
import streamlit_shadcn_ui as ui


try:
    # from openbabel import OBMol, OBConversion
    import openbabel
except ModuleNotFoundError as e:
    subprocess.Popen([f'{sys.executable} -m pip install --global-option=build_ext --global-option="-I/usr/include/openbabel3" --global-option="-L/usr/lib/openbabel" openbabel==2.4.1'], shell=True)
    subprocess.Popen([f'{sys.executable} -m pip install --global-option=build_ext --global-option="-I/home/appuser/include/openbabel3" --global-option="-L/home/appuser/lib/openbabel" openbabel==2.4.1'], shell=True)
    subprocess.Popen([f'{sys.executable} -m pip install --global-option=build_ext --global-option="-I/home/appuser/usr/include/openbabel3" --global-option="-L/home/appuser/usr/lib/openbabel" openbabel==2.4.1'], shell=True)
    # wait for subprocess to install package before running your actual code below
    #print('openbabel python not importing')
    time.sleep(90)
    
from openbabel import pybel


st.set_page_config(page_title="CHEMSTUDIO24", page_icon="data/favicon.png", layout="centered")
st.logo("data/banner24.png")

st.write("# **:gray[Your] :rainbow[Molecule] :gray[playground]**")
st.markdown((":gray[Visualize and Convert your] :rainbow[Molecule]"))

supported_input_formats =  ['xyz', 'cif', 'pdb','mol', 'mol2','sdf', 'tmol', 'poscar','cub','cube','mcif','mmcif', 'pwscf','smi']
supported_output_formats = ['cif', 'tmol', 'xyz', 'sdf','pdb','smiles', 'cube','mcif','mmcif','mdl','mol','mol2','smi',]
    
data = '''12



C      1.525098    0.401299   -0.169919

C      1.267282   -0.890923   -0.090842

S     -0.375869   -1.429467   -0.350672

C     -1.364069   -0.186583   -0.232712

C     -0.787332    1.146673    0.059053

O      0.519018    1.327928   -0.452149

H      2.534310    0.743140   -0.012656

H      2.085372   -1.592058    0.136539

H     -0.704143   -2.346960    0.640753

H     -2.462024   -0.305561   -0.365090

H     -0.753918    1.233523    1.179450

H     -1.483725    1.898990   -0.341753

'''
    
#   st.components.v1.iframe("https://pubchem.ncbi.nlm.nih.gov/periodic-table/#view=table&embed=true", width=800, height=800, scrolling=True)
col1, col2 = st.columns(2)
col1.write('## Input Molecule')
input_format = col1.selectbox('Firstly, select the input file format',
        supported_input_formats, )

input_text_area = col1.empty()
uploaded_file = col1.file_uploader("or Choose a file from your local data")
if uploaded_file is not None:
        # To read file as bytes:
    bytes_data = uploaded_file.getvalue()
        
    #uploaded_file_name = uploaded_file.name.split(".")
    #input_up_format = uploaded_file_name[-1]
        
    
        # To convert to a string based IO:
    stringio = StringIO(uploaded_file.getvalue().decode("utf-8"))
    
            # To read file as string:
    string_data = stringio.read()
    placeholder_xyz_str = string_data
    input_geom_str = input_text_area.text_area(label='Enter the contents of the source file here', value = placeholder_xyz_str, placeholder = 'Put your text here', height=400)

elif uploaded_file is None:
        
    input_geom_str = input_text_area.text_area(label='Secondly, paste the file contents here', value = data, placeholder = 'Paste the contents of your file here', height=400, key = 'input_text_area')
    # # Get rid of empty lines
    # input_geom_str = os.linesep.join([s for s in input_geom_str.splitlines() if s])
    
mol = pybel.readstring(input_format, input_geom_str)
        # mol.make3D()
    
        
    
    ## OUTPUT ##
col2.write('## Output')
output_format = col2.selectbox('Select the output file format',
        supported_output_formats)
output_geom_str = mol.write(output_format)
col2.text_area(label='Converted file structure', value=output_geom_str, height=400)
col2.download_button(
         label="Download the output",
         data=output_geom_str,
         file_name='your_new_output.'+output_format,
         mime='text/csv',)

st.divider()

st.subheader("Visualization Scene")
col3, col4 = st.columns(2)


def vis_your_molecule():
    newviewer = py3Dmol.view(width=400, height=400)
    structure_for_visualization = ''
    try:
        mol = pybel.readstring(input_format, input_geom_str)
                # mol.make3D()
    
        structure_for_visualization = mol.write('xyz')
    except Exception as e:
        print('There was a problem with the conversion', e)
    
    newviewer.addModel(structure_for_visualization, 'xyz')
    newviewer.setBackgroundColor(bcolor2)
        
    newviewer.setStyle(stylemd2)
    newviewer.setViewStyle({"style": "outline", "color": "#CA86FF", "width": 0.05})
        
    if spin2:
        newviewer.spin(True)
    else:
        newviewer.spin(False)   
    
    if box2:
        newviewer.addBox({'center': {'x': 0,'y': 0,'z': 0},
                    # 'dimensions': {'w': 1, 'h': 1, 'd': 1}, # scalars
                    'dimensions': {'w': {'x': 8, 'y': 8, 'z': 0}, #[1, 1, 0], #np.array([1,1,0]),
                                   'h': {'x': 8, 'y': -8, 'z': 0}, # [1, -1, 0], #np.array([1,-1,0]),
                                   'd': {'x': 0, 'y': 0, 'z': 8}, # [0, 0, 1], #np.array([0,0,1]),
                                   },
                    'color': '#C791FB',
                    'alpha': 0.5,
                    })
    else:
        pass
    
    showmol(newviewer,height=400,width=400)

with col3:

    st.markdown("Select your Model!")
    styles3d2 = {"Line Model": {"line": {}},
                "Cross Model": {"cross":{}},
                "Stick Model": {"stick": {}, "sphere": {"scale": 0}},
                "Ball and Stick Model": {"stick": {}, "sphere": {"scale": 0.3}},
                "CPK Model": {"sphere": {}}
                }
    list_style2 = ['Line', 'Cross', 'Stick', 'Ball and Stick', 'CPK']
    value2 = ui.tabs(options=list_style2, default_value='Line', key="flowers")
    
    spin2 = st.toggle('Animate', value=False, key=5)
    box2 = st.toggle('Show Box', value=False, key=6)
    bcolor2 = st.color_picker('Pick Background Color', '#323232', key=7)

def stylem2(value2):
    if value2 == list_style2[0]:
        value4 = styles3d2["Line Model"]
    elif value2 ==  list_style2[1]:
        value4 = styles3d2["Cross Model"]
    elif value2 == list_style2[2]:
        value4 = styles3d2["Stick Model"]
    elif value2 == list_style2[3]:
        value4 = styles3d2["Ball and Stick Model"]
    elif value2 == list_style2[4]:
        value4 = styles3d2["CPK Model"]
    return value4


stylemd2 = stylem2(value2)



with col4:
    vis_your_molecule()