// Display metadata for the Bioactivity Screening tab: source-database links and // the canonical activity-class vocabulary (for the filter + proper labels). export interface DbInfo { label: string url: string } // Source databases (peptide bioactivity/cytotoxicity). Keyed by the lowercase slug // the screener emits; labels use each DB's own capitalisation, urls point at the DB home. export const SOURCE_DBS: Record = { ahtpdb: { label: 'AHTPDB', url: 'https://webs.iiitd.edu.in/raghava/ahtpdb/' }, apd3: { label: 'APD3', url: 'https://aps.unmc.edu/' }, biopep_uwm_typed: { label: 'BIOPEP-UWM', url: 'https://biochemia.uwm.edu.pl/biopep-uwm/' }, biopepdb: { label: 'BioPepDB', url: 'https://bis.zju.edu.cn/biopepdbr/' }, dbaasp: { label: 'DBAASP', url: 'https://dbaasp.org/' }, dbamp: { label: 'dbAMP', url: 'https://awi.cuhk.edu.cn/dbAMP/' }, dfbp: { label: 'DFBP', url: 'http://www.cqudfbp.net/' }, dramp: { label: 'DRAMP', url: 'https://dramp.cpu-bioinfor.org/' }, fermfoodb: { label: 'FermFooDb', url: 'https://webs.iiitd.edu.in/raghava/fermfoodb/' }, plantpepdb: { label: 'PlantPepDB', url: 'http://14.139.61.8/PlantPepDB/' }, toxinpred2: { label: 'ToxinPred', url: 'https://webs.iiitd.edu.in/raghava/toxinpred2/' }, iedb: { label: 'IEDB', url: 'https://www.iedb.org/' }, } // Allergen-protein sources (protein tab). The screener emits combos like "AllergenOnline | WHO/IUIS". export const ALLERGEN_SOURCES: Record = { allergenonline: { label: 'AllergenOnline', url: 'http://www.allergenonline.org/' }, 'who/iuis': { label: 'WHO/IUIS', url: 'http://www.allergen.org/' }, } export function sourceDb(slug: string): DbInfo { return SOURCE_DBS[slug.trim().toLowerCase()] ?? { label: slug.trim(), url: '' } } // Split a screener 'sources' string ("a;b;c") into DbInfo, in a stable order. export function parseSources(sources: string): DbInfo[] { return sources .split(';') .map((s) => s.trim()) .filter(Boolean) .map(sourceDb) } export function parseAllergenSources(source: string): DbInfo[] { return source .split('|') .map((s) => s.trim()) .filter(Boolean) .map((s) => ALLERGEN_SOURCES[s.toLowerCase()] ?? { label: s, url: '' }) } // Canonical activity classes (the 10 present in the master list), for the filter and // for proper-cased chip labels. `axis` groups them in the filter UI. export type Axis = 'bioactive' | 'cytotoxic' | 'allergen' export interface ActivityClass { id: string label: string axis: Axis } export const ACTIVITY_CLASSES: ActivityClass[] = [ { id: 'ace_inhibitory', label: 'ACE-inhibitory', axis: 'bioactive' }, { id: 'antihypertensive', label: 'Antihypertensive', axis: 'bioactive' }, { id: 'antioxidant', label: 'Antioxidant', axis: 'bioactive' }, { id: 'antimicrobial', label: 'Antimicrobial', axis: 'bioactive' }, { id: 'dpp_iv_inhibitory', label: 'DPP-IV-inhibitory', axis: 'bioactive' }, { id: 'immunomodulatory', label: 'Immunomodulatory', axis: 'bioactive' }, { id: 'opioid', label: 'Opioid', axis: 'bioactive' }, { id: 'other', label: 'Other bioactive', axis: 'bioactive' }, { id: 'cytotoxic', label: 'Cytotoxic', axis: 'cytotoxic' }, { id: 'ige_epitope', label: 'IgE epitope (exact)', axis: 'allergen' }, ] const CLASS_LABEL: Record = Object.fromEntries( ACTIVITY_CLASSES.map((c) => [c.id, c.label]), ) export function classLabel(id: string): string { return CLASS_LABEL[id] ?? id.replace(/_/g, ' ') } export const AXIS_LABEL: Record = { bioactive: 'Bioactivity', cytotoxic: 'Cytotoxicity', allergen: 'Allergen', } export const ALL_CLASS_IDS = ACTIVITY_CLASSES.map((c) => c.id)