hydropd / website /src /data /screenMeta.ts
rikardsaqe's picture
Bioactivity tab: filter + DB links + exact/contains clarity
fd820af verified
Raw
History Blame Contribute Delete
3.7 kB
// 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<string, DbInfo> = {
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<string, DbInfo> = {
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<string, string> = 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<Axis, string> = {
bioactive: 'Bioactivity',
cytotoxic: 'Cytotoxicity',
allergen: 'Allergen',
}
export const ALL_CLASS_IDS = ACTIVITY_CLASSES.map((c) => c.id)