mgbam commited on
Commit
0a68542
·
verified ·
1 Parent(s): 029d137

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +108 -106
app.py CHANGED
@@ -10,11 +10,10 @@ import matplotlib.pyplot as plt
10
  import seaborn as sns
11
  import logging
12
  import re
13
- from io import BytesIO
14
- from typing import Optional, Dict, List
15
  from openai import OpenAI
16
 
17
- # Configure comprehensive logging for traceability and diagnostics
18
  logging.basicConfig(
19
  level=logging.INFO,
20
  format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
@@ -23,15 +22,17 @@ logging.basicConfig(
23
  logger = logging.getLogger("PRIS")
24
 
25
  # -----------------------------
26
- # GLOBAL CONSTANTS & ENDPOINTS
27
  # -----------------------------
28
  API_ENDPOINTS = {
29
  "clinical_trials": "https://clinicaltrials.gov/api/v2/studies",
30
  "fda_drug_approval": "https://api.fda.gov/drug/label.json",
31
- "pubchem": "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/name/{}/JSON"
 
32
  }
 
33
  DEFAULT_HEADERS = {
34
- "User-Agent": "PharmaResearchIntelligenceSuite/2.0 (Advanced Research)",
35
  "Accept": "application/json"
36
  }
37
 
@@ -39,6 +40,7 @@ DEFAULT_HEADERS = {
39
  # SECRETS MANAGEMENT
40
  # -----------------------------
41
  class APIConfigurationError(Exception):
 
42
  pass
43
 
44
  try:
@@ -46,6 +48,7 @@ try:
46
  BIOPORTAL_API_KEY = st.secrets["BIOPORTAL_API_KEY"]
47
  PUB_EMAIL = st.secrets["PUB_EMAIL"]
48
  OPENFDA_KEY = st.secrets["OPENFDA_KEY"]
 
49
  if not all([OPENAI_API_KEY, BIOPORTAL_API_KEY, PUB_EMAIL, OPENFDA_KEY]):
50
  raise APIConfigurationError("One or more required API credentials are missing.")
51
  except (KeyError, APIConfigurationError) as e:
@@ -56,16 +59,26 @@ except (KeyError, APIConfigurationError) as e:
56
  # CORE INFRASTRUCTURE
57
  # -----------------------------
58
  class PharmaResearchEngine:
59
- """Core engine for data integration and advanced analysis in pharma research."""
 
60
  def __init__(self):
61
  self.openai_client = OpenAI(api_key=OPENAI_API_KEY)
62
-
63
  @staticmethod
64
- def api_request(endpoint: str, params: Optional[Dict] = None, headers: Optional[Dict] = None) -> Optional[Dict]:
65
- """Robust API request handler with detailed logging and user feedback."""
 
 
 
 
66
  try:
67
- response = requests.get(endpoint, params=params, headers={**DEFAULT_HEADERS, **(headers or {})}, timeout=(3.05, 15))
68
- response.raise_for_status()
 
 
 
 
 
69
  return response.json()
70
  except requests.exceptions.HTTPError as e:
71
  logger.error(f"HTTP Error {e.response.status_code} for {endpoint} with params {params}")
@@ -77,49 +90,34 @@ class PharmaResearchEngine:
77
 
78
  def get_compound_profile(self, identifier: str) -> Optional[Dict]:
79
  """
80
- Retrieve comprehensive chemical profile from PubChem.
81
- Uses advanced input validation and fallback mechanisms.
82
  """
83
  if not self._is_valid_compound_input(identifier):
84
- msg = (f"Input '{identifier}' does not appear to be a valid compound name or SMILES. "
85
- "If you are seeking disease-related information, please try the Clinical Trial Analytics module.")
86
  logger.warning(msg)
87
  st.error(msg)
88
  return None
89
-
90
  pubchem_url = API_ENDPOINTS["pubchem"].format(identifier)
91
  pubchem_data = self.api_request(pubchem_url)
92
  if not pubchem_data or not pubchem_data.get("PC_Compounds"):
93
- msg = f"No compound data returned for '{identifier}'. Please verify your input."
94
- logger.warning(msg)
95
- st.error(msg)
96
  return None
97
-
98
  compound = pubchem_data["PC_Compounds"][0]
99
- profile = {
100
  'molecular_formula': self._extract_property(compound, 'Molecular Formula'),
101
  'iupac_name': self._extract_property(compound, 'IUPAC Name'),
102
  'canonical_smiles': self._extract_property(compound, 'Canonical SMILES'),
103
  'molecular_weight': self._extract_property(compound, 'Molecular Weight'),
104
  'logp': self._extract_property(compound, 'LogP')
105
  }
106
- # Validate that we have a plausible SMILES; if not, attempt a fallback search
107
- if profile['canonical_smiles'] in ["N/A", ""]:
108
- logger.warning("Canonical SMILES is missing, attempting fallback retrieval.")
109
- profile['canonical_smiles'] = self._fallback_smiles(compound)
110
- return profile
111
-
112
- def _fallback_smiles(self, compound: Dict) -> str:
113
- """Fallback routine to extract a valid SMILES string from alternative PubChem data fields."""
114
- # Sometimes the data may be nested in a different property.
115
- for prop in compound.get("props", []):
116
- val = prop.get("value", {}).get("sval")
117
- if val and any(char in val for char in "CNOPS"):
118
- return val
119
- return "N/A"
120
 
121
  def _extract_property(self, compound: Dict, prop_name: str) -> str:
122
- """Helper to extract a property value from PubChem compound data."""
123
  for prop in compound.get("props", []):
124
  if prop.get("urn", {}).get("label") == prop_name:
125
  return prop["value"].get("sval", "N/A")
@@ -128,25 +126,35 @@ class PharmaResearchEngine:
128
  @staticmethod
129
  def _is_valid_compound_input(user_input: str) -> bool:
130
  """
131
- Use regex and keyword heuristics to check if input is a valid compound name or SMILES.
132
- Reject common disease terms.
 
133
  """
134
- # Check for a valid SMILES-like string (simple heuristic)
135
- smiles_pattern = re.compile(r'^[BCNOFPSIbcnofpsi0-9@+\-\[\]\(\)=#$]+$')
136
- if smiles_pattern.fullmatch(user_input.strip()):
137
- return True
138
- # Block disease terms
139
  disease_terms = ['diabetes', 'cancer', 'hypertension', 'asthma']
140
- if any(term in user_input.lower() for term in disease_terms):
141
  return False
142
- # Assume other alphabetic strings may be valid chemical names
143
- return True
 
 
 
 
 
 
 
 
144
 
145
  # -----------------------------
146
  # INTELLIGENCE MODULES
147
  # -----------------------------
148
  class ClinicalIntelligence:
149
- """Module for clinical trial and regulatory intelligence."""
 
 
 
 
150
  def __init__(self):
151
  self.engine = PharmaResearchEngine()
152
 
@@ -154,9 +162,8 @@ class ClinicalIntelligence:
154
  params = {"query.term": query, "retmax": 10} if not query.startswith("NCT") else {"id": query}
155
  trials = self.engine.api_request(API_ENDPOINTS["clinical_trials"], params=params)
156
  if trials is None:
157
- msg = f"Clinical trial data could not be retrieved for '{query}'."
158
- logger.error(msg)
159
- st.error(msg)
160
  return []
161
  return trials.get("studies", [])[:5]
162
 
@@ -164,6 +171,7 @@ class ClinicalIntelligence:
164
  if not OPENFDA_KEY:
165
  st.error("OpenFDA API key not configured.")
166
  return None
 
167
  params = {
168
  "api_key": OPENFDA_KEY,
169
  "search": f'openfda.brand_name:"{drug_name}"',
@@ -172,54 +180,53 @@ class ClinicalIntelligence:
172
  data = self.engine.api_request(API_ENDPOINTS["fda_drug_approval"], params=params)
173
  if data and data.get("results"):
174
  return data["results"][0]
175
- logger.warning(f"No FDA data found for '{drug_name}'.")
176
  st.error("No FDA regulatory data found for the specified drug.")
177
  return None
178
 
179
  class AIDrugInnovator:
180
- """GPT-4 powered module for generating cutting-edge drug development strategies."""
 
 
 
181
  def __init__(self):
182
  self.engine = PharmaResearchEngine()
183
-
184
  def generate_strategy(self, target: str, strategy: str) -> str:
185
- prompt = f"""# First-In-Class Strategy for {target.capitalize()}
186
 
187
  **Target Validation Approach**
188
- Our target validation will involve:
189
- - A comprehensive literature review to understand disease pathophysiology.
190
- - Pre-clinical in vitro and in vivo studies to validate target functionality.
191
- - Genomic and proteomic analyses to confirm the role of the target.
192
- - Collaborative efforts with leading academic and clinical research institutions.
193
 
194
  **Lead Optimization Tactics**
195
- Post validation, we will:
196
- - Employ chemical modification and high-throughput screening to optimize lead compounds.
197
- - Run extensive biological assays to fine-tune efficacy and safety.
198
- - Utilize in vivo studies to assess pharmacokinetics and toxicity.
199
- - Regularly review patent landscapes to ensure novelty.
200
 
201
  **Clinical Trial Design**
202
- Our patient-centric clinical trial phases will include:
203
- - **Phase I:** Safety and dosage optimization.
204
- - **Phase II:** Efficacy and side-effect profiling.
205
- - **Phase III:** Large-scale comparative trials.
206
- - **Phase IV:** Post-marketing surveillance for long-term outcomes.
207
- We may also incorporate adaptive trial designs to expedite development.
208
 
209
  **Regulatory Pathway Analysis**
210
- Key regulatory steps:
211
- - Early pre-IND consultations with regulatory agencies.
212
- - Compilation of robust pre-clinical data for IND submission.
213
- - Continuous dialogue with regulators during clinical phases.
214
- - Exploring expedited pathways like Fast Track or Breakthrough Therapy designations.
215
 
216
  **Commercial Potential Assessment**
217
- We will conduct:
218
- - In-depth market research to understand competitive landscapes.
219
- - Patient segmentation analyses to tailor our therapy.
220
- - Pricing, reimbursement, and go-to-market strategy development to maximize impact.
221
 
222
- Please note: This strategy is generated by an AI system leveraging state-of-the-art insights and is intended to support, not replace, expert human judgment."""
223
  try:
224
  response = self.engine.openai_client.chat.completions.create(
225
  model="gpt-4",
@@ -237,7 +244,11 @@ Please note: This strategy is generated by an AI system leveraging state-of-the-
237
  # STREAMLIT INTERFACE
238
  # -----------------------------
239
  class PharmaResearchInterface:
240
- """Next-generation Streamlit interface for PRIS with enhanced UI/UX."""
 
 
 
 
241
  def __init__(self):
242
  self.clinical_intel = ClinicalIntelligence()
243
  self.ai_innovator = AIDrugInnovator()
@@ -251,15 +262,16 @@ class PharmaResearchInterface:
251
  )
252
  st.markdown("""
253
  <style>
254
- .main {background-color: #f0f2f6; font-family: 'Helvetica Neue', Arial, sans-serif;}
255
- .stAlert {padding: 20px; font-size: 1.1em;}
 
256
  </style>
257
  """, unsafe_allow_html=True)
258
 
259
  def render(self):
260
  st.title("Next-Generation Pharmaceutical Research Intelligence Suite")
261
  self._render_navigation()
262
-
263
  def _render_navigation(self):
264
  tabs = st.tabs([
265
  "🚀 Drug Innovation",
@@ -325,7 +337,7 @@ class PharmaResearchInterface:
325
 
326
  def _compound_profiler(self):
327
  st.header("Advanced Multi-Omics Compound Profiler")
328
- compound = st.text_input("Analyze Compound:", placeholder="Enter drug name or SMILES (e.g., Aspirin, C1=CC=CC=C1O)")
329
  if st.button("Profile Compound"):
330
  with st.spinner("Decoding molecular profile..."):
331
  profile = PharmaResearchEngine().get_compound_profile(compound)
@@ -334,30 +346,20 @@ class PharmaResearchInterface:
334
  with col1:
335
  st.subheader("Structural Insights")
336
  smiles = profile.get('canonical_smiles', '')
337
- if smiles != "N/A":
338
- try:
339
- mol = Chem.MolFromSmiles(smiles)
340
- if mol:
341
- # Convert RDKit image to a stream for better handling
342
- img = Draw.MolToImage(mol, size=(400, 300))
343
- buf = BytesIO()
344
- img.save(buf, format="PNG")
345
- st.image(buf.getvalue(), caption="2D Molecular Structure")
346
- else:
347
- st.error("Generated SMILES appears invalid. Please verify the compound input.")
348
- except Exception as ex:
349
- logger.error(f"Error generating molecular image: {ex}")
350
- st.error("Error generating molecular structure image. Verify the SMILES string.")
351
  else:
352
- st.error("No valid SMILES available. The compound profile may be incomplete.")
353
  with col2:
354
  st.subheader("Physicochemical Profile")
355
- st.metric("Molecular Weight", profile.get('molecular_weight', 'N/A'))
356
- st.metric("LogP", profile.get('logp', 'N/A'))
357
- st.metric("IUPAC Name", profile.get('iupac_name', 'N/A'))
358
  st.code(f"SMILES: {profile.get('canonical_smiles', 'N/A')}")
359
  else:
360
- st.warning("Compound profiling failed. Ensure that you have entered a valid chemical compound.")
361
 
362
  def _regulatory_hub(self):
363
  st.header("Regulatory Intelligence Hub")
@@ -375,7 +377,7 @@ class PharmaResearchInterface:
375
  def _ai_strategist(self):
376
  st.header("AI Drug Development Strategist")
377
  st.write("Leverage GPT-4 to generate cutting-edge drug development strategies.")
378
- target = st.text_input("Enter Target Disease or Pathway:", placeholder="e.g., Diabetics")
379
  if st.button("Generate AI Strategy"):
380
  with st.spinner("Generating AI-driven strategy..."):
381
  strategy = self.ai_innovator.generate_strategy(target, "First-in-class")
 
10
  import seaborn as sns
11
  import logging
12
  import re
13
+ from typing import Optional, Dict, List, Any
 
14
  from openai import OpenAI
15
 
16
+ # Configure advanced logging for full traceability and diagnostics
17
  logging.basicConfig(
18
  level=logging.INFO,
19
  format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
 
22
  logger = logging.getLogger("PRIS")
23
 
24
  # -----------------------------
25
+ # GLOBAL CONSTANTS
26
  # -----------------------------
27
  API_ENDPOINTS = {
28
  "clinical_trials": "https://clinicaltrials.gov/api/v2/studies",
29
  "fda_drug_approval": "https://api.fda.gov/drug/label.json",
30
+ "pubchem": "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/name/{}/JSON",
31
+ # ... other endpoints omitted for brevity ...
32
  }
33
+
34
  DEFAULT_HEADERS = {
35
+ "User-Agent": "PharmaResearchIntelligenceSuite/1.0 (Professional Use)",
36
  "Accept": "application/json"
37
  }
38
 
 
40
  # SECRETS MANAGEMENT
41
  # -----------------------------
42
  class APIConfigurationError(Exception):
43
+ """Custom exception for missing API configurations."""
44
  pass
45
 
46
  try:
 
48
  BIOPORTAL_API_KEY = st.secrets["BIOPORTAL_API_KEY"]
49
  PUB_EMAIL = st.secrets["PUB_EMAIL"]
50
  OPENFDA_KEY = st.secrets["OPENFDA_KEY"]
51
+
52
  if not all([OPENAI_API_KEY, BIOPORTAL_API_KEY, PUB_EMAIL, OPENFDA_KEY]):
53
  raise APIConfigurationError("One or more required API credentials are missing.")
54
  except (KeyError, APIConfigurationError) as e:
 
59
  # CORE INFRASTRUCTURE
60
  # -----------------------------
61
  class PharmaResearchEngine:
62
+ """Core engine for integrating diverse pharmaceutical datasets and performing advanced analyses."""
63
+
64
  def __init__(self):
65
  self.openai_client = OpenAI(api_key=OPENAI_API_KEY)
66
+
67
  @staticmethod
68
+ def api_request(endpoint: str,
69
+ params: Optional[Dict] = None,
70
+ headers: Optional[Dict] = None) -> Optional[Dict]:
71
+ """
72
+ Enterprise-grade API request handler with detailed error logging.
73
+ """
74
  try:
75
+ response = requests.get(
76
+ endpoint,
77
+ params=params,
78
+ headers={**DEFAULT_HEADERS, **(headers or {})},
79
+ timeout=(3.05, 15)
80
+ )
81
+ response.raise_for_status() # Raises HTTPError for 4xx/5xx responses
82
  return response.json()
83
  except requests.exceptions.HTTPError as e:
84
  logger.error(f"HTTP Error {e.response.status_code} for {endpoint} with params {params}")
 
90
 
91
  def get_compound_profile(self, identifier: str) -> Optional[Dict]:
92
  """
93
+ Retrieve comprehensive chemical profile data from PubChem for a given compound.
94
+ Accepts both common compound names and SMILES strings.
95
  """
96
  if not self._is_valid_compound_input(identifier):
97
+ msg = (f"The input '{identifier}' appears to reference a disease term rather than a chemical compound. "
98
+ "For disease-related inquiries, please use the Clinical Trial Analytics module.")
99
  logger.warning(msg)
100
  st.error(msg)
101
  return None
102
+
103
  pubchem_url = API_ENDPOINTS["pubchem"].format(identifier)
104
  pubchem_data = self.api_request(pubchem_url)
105
  if not pubchem_data or not pubchem_data.get("PC_Compounds"):
106
+ logger.warning(f"No compound data returned for identifier: {identifier}")
107
+ st.error("No compound data found. Please verify your input (e.g., check for typos or use a recognized compound name).")
 
108
  return None
109
+
110
  compound = pubchem_data["PC_Compounds"][0]
111
+ return {
112
  'molecular_formula': self._extract_property(compound, 'Molecular Formula'),
113
  'iupac_name': self._extract_property(compound, 'IUPAC Name'),
114
  'canonical_smiles': self._extract_property(compound, 'Canonical SMILES'),
115
  'molecular_weight': self._extract_property(compound, 'Molecular Weight'),
116
  'logp': self._extract_property(compound, 'LogP')
117
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
 
119
  def _extract_property(self, compound: Dict, prop_name: str) -> str:
120
+ """Helper to extract a specific property from PubChem compound data."""
121
  for prop in compound.get("props", []):
122
  if prop.get("urn", {}).get("label") == prop_name:
123
  return prop["value"].get("sval", "N/A")
 
126
  @staticmethod
127
  def _is_valid_compound_input(user_input: str) -> bool:
128
  """
129
+ Determines whether the user input is a valid chemical compound identifier.
130
+ Accepts both conventional compound names and SMILES strings.
131
+ Rejects inputs containing known disease terms.
132
  """
133
+ input_lower = user_input.lower().strip()
134
+ # Known disease terms that should not be processed as compounds
 
 
 
135
  disease_terms = ['diabetes', 'cancer', 'hypertension', 'asthma']
136
+ if any(term in input_lower for term in disease_terms):
137
  return False
138
+
139
+ # If the input contains characters common in SMILES (e.g., '=', '(', ')', '#'), treat as SMILES.
140
+ if re.search(r"[=\(\)#]", user_input):
141
+ return True
142
+
143
+ # Otherwise, if input is alphanumeric with spaces or hyphens, assume it's a valid compound name.
144
+ if re.match(r'^[A-Za-z0-9\s\-]+$', user_input):
145
+ return True
146
+
147
+ return False
148
 
149
  # -----------------------------
150
  # INTELLIGENCE MODULES
151
  # -----------------------------
152
  class ClinicalIntelligence:
153
+ """
154
+ Module for clinical trial and regulatory intelligence.
155
+ Provides deep insights into trial landscapes and FDA approval data.
156
+ """
157
+
158
  def __init__(self):
159
  self.engine = PharmaResearchEngine()
160
 
 
162
  params = {"query.term": query, "retmax": 10} if not query.startswith("NCT") else {"id": query}
163
  trials = self.engine.api_request(API_ENDPOINTS["clinical_trials"], params=params)
164
  if trials is None:
165
+ logger.error(f"Clinical trial API returned no data for query: {query}")
166
+ st.error("Failed to retrieve clinical trials. Please try a different query or check your network connection.")
 
167
  return []
168
  return trials.get("studies", [])[:5]
169
 
 
171
  if not OPENFDA_KEY:
172
  st.error("OpenFDA API key not configured.")
173
  return None
174
+
175
  params = {
176
  "api_key": OPENFDA_KEY,
177
  "search": f'openfda.brand_name:"{drug_name}"',
 
180
  data = self.engine.api_request(API_ENDPOINTS["fda_drug_approval"], params=params)
181
  if data and data.get("results"):
182
  return data["results"][0]
183
+ logger.warning(f"No FDA data found for drug: {drug_name}")
184
  st.error("No FDA regulatory data found for the specified drug.")
185
  return None
186
 
187
  class AIDrugInnovator:
188
+ """
189
+ GPT-4 powered module for generating advanced, cutting-edge drug development strategies.
190
+ """
191
+
192
  def __init__(self):
193
  self.engine = PharmaResearchEngine()
194
+
195
  def generate_strategy(self, target: str, strategy: str) -> str:
196
+ prompt = f"""As the Chief Scientific Officer at a leading pharmaceutical company, please develop a {strategy} strategy for the target: {target}.
197
 
198
  **Target Validation Approach**
199
+ - Perform an exhaustive literature review to understand the molecular basis of the disease.
200
+ - Validate targets using in vitro and in vivo models.
201
+ - Integrate genomic and proteomic data to identify actionable targets.
202
+ - Collaborate with top-tier academic and clinical institutions.
 
203
 
204
  **Lead Optimization Tactics**
205
+ - Conduct chemical optimization to improve potency, selectivity, and pharmacokinetic properties.
206
+ - Utilize high-throughput screening and biological assays for iterative lead refinement.
207
+ - Perform rigorous in vivo efficacy and safety evaluations.
208
+ - Secure intellectual property through comprehensive patent landscaping.
 
209
 
210
  **Clinical Trial Design**
211
+ - Initiate Phase I trials focused on safety and dosage determination.
212
+ - Scale to Phase II for efficacy and side-effect profiling in a broader patient cohort.
213
+ - Execute large-scale Phase III trials to validate clinical benefits against current standards of care.
214
+ - Plan for Phase IV post-marketing surveillance for long-term outcome assessment.
215
+ - Incorporate adaptive trial designs to enhance responsiveness and efficiency.
 
216
 
217
  **Regulatory Pathway Analysis**
218
+ - Engage in early pre-IND consultations with regulatory authorities.
219
+ - Prepare robust IND submissions incorporating comprehensive preclinical data.
220
+ - Maintain continuous dialogue with regulators throughout clinical development.
221
+ - Strategize for expedited review pathways (e.g., Fast Track, Breakthrough Therapy).
 
222
 
223
  **Commercial Potential Assessment**
224
+ - Conduct detailed market research to understand the competitive landscape and unmet needs.
225
+ - Segment patient populations to tailor therapeutic approaches.
226
+ - Devise dynamic pricing and reimbursement strategies aligned with payer requirements.
227
+ - Formulate a comprehensive go-to-market plan leveraging multi-channel marketing strategies.
228
 
229
+ Please format your response in Markdown with clear section headers."""
230
  try:
231
  response = self.engine.openai_client.chat.completions.create(
232
  model="gpt-4",
 
244
  # STREAMLIT INTERFACE
245
  # -----------------------------
246
  class PharmaResearchInterface:
247
+ """
248
+ Next-generation Streamlit interface for the Pharma Research Intelligence Suite.
249
+ Provides an integrated, intuitive dashboard for advanced pharmaceutical data analytics and AI-driven strategy generation.
250
+ """
251
+
252
  def __init__(self):
253
  self.clinical_intel = ClinicalIntelligence()
254
  self.ai_innovator = AIDrugInnovator()
 
262
  )
263
  st.markdown("""
264
  <style>
265
+ .main {background-color: #f0f2f6;}
266
+ .stAlert {padding: 20px;}
267
+ .reportview-container .markdown-text-container {font-family: 'Helvetica Neue', Arial, sans-serif}
268
  </style>
269
  """, unsafe_allow_html=True)
270
 
271
  def render(self):
272
  st.title("Next-Generation Pharmaceutical Research Intelligence Suite")
273
  self._render_navigation()
274
+
275
  def _render_navigation(self):
276
  tabs = st.tabs([
277
  "🚀 Drug Innovation",
 
337
 
338
  def _compound_profiler(self):
339
  st.header("Advanced Multi-Omics Compound Profiler")
340
+ compound = st.text_input("Analyze Compound:", placeholder="Enter drug name or SMILES (e.g., Aspirin, CC(=O)OC1=CC=CC=C1C(=O)O)")
341
  if st.button("Profile Compound"):
342
  with st.spinner("Decoding molecular profile..."):
343
  profile = PharmaResearchEngine().get_compound_profile(compound)
 
346
  with col1:
347
  st.subheader("Structural Insights")
348
  smiles = profile.get('canonical_smiles', '')
349
+ mol = Chem.MolFromSmiles(smiles) if smiles != "N/A" else None
350
+ if mol:
351
+ img = Draw.MolToImage(mol, size=(400, 300))
352
+ st.image(img, caption="2D Molecular Structure")
 
 
 
 
 
 
 
 
 
 
353
  else:
354
+ st.error("Could not generate molecular structure image. Verify the SMILES string or compound name.")
355
  with col2:
356
  st.subheader("Physicochemical Profile")
357
+ st.metric("Molecular Weight", profile.get('molecular_weight', "N/A"))
358
+ st.metric("LogP", profile.get('logp', "N/A"))
359
+ st.metric("IUPAC Name", profile.get('iupac_name', "N/A"))
360
  st.code(f"SMILES: {profile.get('canonical_smiles', 'N/A')}")
361
  else:
362
+ st.warning("Compound profiling failed. Please ensure you have entered a valid chemical compound.")
363
 
364
  def _regulatory_hub(self):
365
  st.header("Regulatory Intelligence Hub")
 
377
  def _ai_strategist(self):
378
  st.header("AI Drug Development Strategist")
379
  st.write("Leverage GPT-4 to generate cutting-edge drug development strategies.")
380
+ target = st.text_input("Enter Target Disease or Pathway:", placeholder="e.g., KRAS G12C mutation")
381
  if st.button("Generate AI Strategy"):
382
  with st.spinner("Generating AI-driven strategy..."):
383
  strategy = self.ai_innovator.generate_strategy(target, "First-in-class")