| """ |
| Data Models for FastAPI Requests and Responses |
| """ |
| from pydantic import BaseModel, Field |
| from typing import List, Optional |
| from enum import Enum |
|
|
| class DiseaseSearchRequest(BaseModel): |
| """Request model for disease target search""" |
| disease_name: str = Field(..., description="Name of the disease to search for") |
| top_n: int = Field(10, ge=1, le=100, description="Number of top targets to retrieve") |
|
|
| class Config: |
| example = {"disease_name": "Type 2 Diabetes", "top_n": 10} |
|
|
|
|
| class TargetInfo(BaseModel): |
| """Protein target information""" |
| symbol: str |
| name: Optional[str] = None |
| score: float |
| sequence: Optional[str] = None |
| uniprot_id: str = "" |
| pdb_ids: List[str] = [] |
|
|
| class Config: |
| example = { |
| "symbol": "INSR", |
| "name": "Insulin Receptor", |
| "score": 0.85, |
| "sequence": None, |
| "uniprot_id": "P06213", |
| "pdb_ids": ["2HR7", "3EKN", "4IBM"] |
| } |
|
|
|
|
| class DrugInfo(BaseModel): |
| """Drug information""" |
| name: str |
| smiles: str |
| drug_id: Optional[str] = None |
|
|
| class Config: |
| example = { |
| "name": "Drug_001", |
| "smiles": "CC(=O)Oc1ccccc1C(=O)O", |
| "drug_id": "1" |
| } |
|
|
|
|
| class DrugCandidate(BaseModel): |
| """Drug-target prediction candidate""" |
| drug_name: str |
| smiles: str = "" |
| target_symbol: str |
| uniprot_id: str = "" |
| binding_score: float |
| rank: int = 0 |
| status: Optional[str] = None |
|
|
| class Config: |
| example = { |
| "drug_name": "Drug_001", |
| "smiles": "CC(=O)Oc1ccccc1C(=O)O", |
| "target_symbol": "INSR", |
| "uniprot_id": "P06213", |
| "binding_score": 0.85, |
| "rank": 1, |
| "status": "๐ Potential Discovery" |
| } |
|
|
|
|
| class ScreeningRequest(BaseModel): |
| """Request model for virtual drug screening""" |
| disease_name: str = Field(..., description="Disease name for target identification") |
| min_score: float = Field(0.0, ge=0.0, le=1.0, description="Minimum binding affinity score") |
| top_n_targets: int = Field(10, ge=1, le=50, description="Number of targets to use") |
| known_drugs: List[str] = Field( |
| default=["Metformin"], |
| description="List of known drugs for the disease (for filtering)" |
| ) |
|
|
| class Config: |
| example = { |
| "disease_name": "Type 2 Diabetes", |
| "min_score": 0.5, |
| "top_n_targets": 10, |
| "known_drugs": ["Metformin", "Insulin"] |
| } |
|
|
|
|
| class ScreeningResponse(BaseModel): |
| """Response model for screening results""" |
| disease_name: str |
| total_targets_found: int |
| total_drugs_screened: int |
| total_pairs_evaluated: int |
| top_candidates: List[DrugCandidate] |
| warnings: List[str] = [] |
|
|
| class Config: |
| example = { |
| "disease_name": "Type 2 Diabetes", |
| "total_targets_found": 10, |
| "total_drugs_screened": 200, |
| "total_pairs_evaluated": 2000, |
| "top_candidates": [ |
| { |
| "drug_name": "Drug_001", |
| "smiles": "CC(=O)Oc1ccccc1C(=O)O", |
| "target_symbol": "INSR", |
| "uniprot_id": "P06213", |
| "binding_score": 0.85, |
| "rank": 1, |
| "status": "๐ Potential Discovery" |
| } |
| ], |
| "warnings": [] |
| } |
|
|
|
|
| class HealthCheckResponse(BaseModel): |
| """Health check response""" |
| status: str |
| version: str |
| service: str |
|
|
| class Config: |
| example = { |
| "status": "healthy", |
| "version": "1.0.0", |
| "service": "Drug Repurposing API" |
| } |
|
|
|
|
| class EnrichedTargetResponse(BaseModel): |
| """Response model for enriched targets endpoint""" |
| disease: str |
| disease_id: str |
| total_targets: int |
| targets: List[TargetInfo] |
|
|
| class Config: |
| example = { |
| "disease": "Type 2 Diabetes", |
| "disease_id": "EFO_0001360", |
| "total_targets": 10, |
| "targets": [ |
| { |
| "symbol": "INSR", |
| "name": "Insulin Receptor", |
| "score": 0.85, |
| "sequence": None, |
| "uniprot_id": "P06213", |
| "pdb_ids": ["2HR7", "3EKN", "4IBM"] |
| } |
| ] |
| } |
|
|
|
|
| class ErrorResponse(BaseModel): |
| """Error response model""" |
| detail: str |
| error_code: Optional[str] = None |
|
|
| class Config: |
| example = { |
| "detail": "Disease not found", |
| "error_code": "DISEASE_NOT_FOUND" |
| } |
|
|