From 356bbafdd49a9b513c5bcea8f47d2c85b5fade19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20=C3=87=C4=B1nar?= Date: Mon, 20 Apr 2026 13:58:05 +0200 Subject: [PATCH] Revert "RL3 pages " --- app.py | 2324 ++++++++--------- exploreourwork.html | 254 -- impact.html | 273 -- .../implementation/Figure_User_profiles.png | Bin 53734 -> 0 bytes .../Innovation system framework.png | Bin 129755 -> 0 bytes .../implementation/project_structure.png | Bin 135424 -> 0 bytes training.html | 146 -- 7 files changed, 1152 insertions(+), 1845 deletions(-) delete mode 100644 exploreourwork.html delete mode 100644 impact.html delete mode 100644 static/images/implementation/Figure_User_profiles.png delete mode 100644 static/images/implementation/Innovation system framework.png delete mode 100644 static/images/implementation/project_structure.png delete mode 100644 training.html diff --git a/app.py b/app.py index 7633d32..a6d21dc 100644 --- a/app.py +++ b/app.py @@ -1,1172 +1,1152 @@ -################################################################################ -### Loading the required modules -import json -import re - -import requests -import urllib.parse -from flask import Flask, abort, jsonify, render_template, request -from flask_caching import Cache -from jinja2 import TemplateNotFound -from werkzeug.routing import BaseConverter - -# from wikidataintegrator import wdi_core -from wikibaseintegrator import wbi_helpers - -# Import BioStudies extractor -from data.biostudies.search import BioStudiesExtractor -from data.zenodo.search import ZenodoExtractor -from data.mapping import normalize_all - -################################################################################ -CACHE_TIMEOUT = 60 * 60 * 24 * 5 # 5 days -- [Ozan] I created a separate - # timeout object for the tools page because - # a 5-day caching is too long for it. -CACHE_TIMEOUT_SERVICE = 60 # Separate timeout for the tools page -- 60 - # seconds. -### Configuration for BioStudies Integration -# Change these variables to switch between collections -BIOSTUDIES_COLLECTION = "VHP4Safety" # Replace with "EU-ToxRisk" to test -BIOSTUDIES_COLLECTION_NAME = "VHP4Safety" # Display name for the page -ZENODO_COMMUNITY = "vhp4safety" # zenodo community -ZENODO_RECORD_TYPE = "dataset" # only show datasets - -CASESTUDIES = ["thyroid", "kidney", "parkinson"] # List of valid case studies - -###Shared explanation dictionaries for filters (used in both tools and data page) -STAGE_EXPLANATIONS = { - "Chemical Characteristics and Hazard Identification": "A Safety Assessment Workflow Step that categorizes services that use molecular structures, chemical descriptors, and databases to predict or analyze the properties, behavior, and potential risks of chemical substances.", - "Exposure": "A Safety Assessment Workflow Step which categorizes services that evaluate and analyze the route, duration, magnitude and frequency of exposure of an organism or (sub)population to one or multiple chemicals.", - "Toxicokinetics": "A Safety Assessment Workflow Step which categorizes services that analyze the kinetics (absorption, distribution, metabolism and excretion) of chemicals and how these processes influence the internal dose.", - "Toxicodynamics": "A Safety Assessment Workflow Step which categorizes services that use or extend the (quantitative) AOP framework to analyze and assess the interaction of chemicals with biological targets.", - "Adverse Outcome": "A Safety Assessment Workflow Step which specifically refers to clinical and epidemiological effects. It categorizes services that provide information on the toxicological endpoints and adverse outcomes at a clinical or epidemiological level of chemical exposures.", - "Other": "Other or unknown category.", - # Legacy labels (kept for the data/methods pages until their data sources migrate) - "ADME": "Absorption, distribution, metabolism, and excretion of a substance (toxic or not) in a living organism, following exposure to this substance.", - "Hazard Assessment": "The process of assessing the intrinsic hazard a substance poses to human health and/or the environment", - "Chemical Information": "Information about chemical properties and identity.", - "General": "Not specific to a flow step.", - "(External) exposure": "External exposure assessment.", - "Generic": "Generic category.", -} -METHODS_URL = "https://raw.githubusercontent.com/VHP4Safety/cloud/refs/heads/main/cap/methods_index.json" -# TOOLS and SERVICES are synonymous -SERVICES_URL = "https://raw.githubusercontent.com/VHP4Safety/cloud/refs/heads/main/cap/service_index.json" - -REG_QUESTIONS = { - "reg_q_1a": { - "label": "Kidney Case Study (a)", - "explanation": "What is the safe cisplatin dose in cancer patients?", - }, - "reg_q_1b": { - "label": "Kidney Case Study (b)", - "explanation": "What is the intrinsic hazard of tacrolimus for nephrotoxicity?", - }, - "reg_q_2a": { - "label": "Parkinson Case Study (a)", - "explanation": "Can compound Dinoseb cause Parkinson's Disease?", - }, - "reg_q_2b": { - "label": "Parkinson Case Study (b)", - "explanation": "What level of exposure to compound Dinoseb leads to risk for developing Parkinson’s disease?", - }, - "reg_q_3a": { - "label": "Thyroid Case Study (a)", - "explanation": "What information about silychristin do we need to give an advice to women in their early pregnancy to decide whether the substance can be used?", - }, - "reg_q_3b": { - "label": "Thyroid Case Study (b)", - "explanation": "Does silychristin influence the thyroid-mediated brain development in the fetus resulting in cognitive impairment in children?", - }, -} - -# Derived: keep the old structure available for templates expecting {label: explanation} -REG_QUESTION_EXPLANATIONS = { - v["label"]: v["explanation"] for v in REG_QUESTIONS.values() -} - - -################################################################################ -class RegexConverter(BaseConverter): - """Converter for regular expression routes. - - References - ---------- - Scholia views.py - https://stackoverflow.com/questions/5870188 - - """ - - def __init__(self, url_map, *items): - """Set up regular expression matcher.""" - super(RegexConverter, self).__init__(url_map) - self.regex = items[0] - - -cache_config = { - "CACHE_TYPE": "SimpleCache", # Flask-Caching related configs - "CACHE_DEFAULT_TIMEOUT": CACHE_TIMEOUT, # 60 min chaching - "CACHE_SERVICE_TIMEOUT": CACHE_TIMEOUT_SERVICE -} -app = Flask(__name__) -app.config.from_mapping(cache_config) -cache = Cache(app) - - -@cache.memoize(timeout=CACHE_TIMEOUT) -def get_json_dict(url: str, timeout: int = 5) -> dict: - """Fetch xxxx_index.json from the cloud repo and return as a dictionary. - Return an empty dict on any error to avoid breaking pages that depend on it. - """ - try: - resp = requests.get(url, timeout=timeout) - if resp.status_code != 200: - return {} - data = resp.json() - if isinstance(data, dict): - return data - else: - return {} - except Exception: - return {} - - -# A separate get_json_dict function for the tools page with its own timeout. -@cache.memoize(timeout=CACHE_TIMEOUT_SERVICE) -def get_json_dict_service(url: str, timeout: int = 5) -> dict: - """Fetch xxxx_index.json from the cloud repo and return as a dictionary. - Return an empty dict on any error to avoid breaking pages that depend on it. - """ - try: - resp = requests.get(url, timeout=timeout) - if resp.status_code != 200: - return {} - data = resp.json() - if isinstance(data, dict): - return data - else: - return {} - except Exception: - return {} - - -@cache.memoize(timeout=CACHE_TIMEOUT) -def get_repository_data( - search_query: str, - page: int = 1, - page_size: int = 18, - filters: list | None = None, - load_metadata: bool = True, -) -> tuple[dict, dict]: - """ - Extract data from respositories - """ - # Initialize extractor for BIOSTUDIES - bs_extractor = BioStudiesExtractor(collection=BIOSTUDIES_COLLECTION) - - # Fetch data based on search query or list all - if search_query: - bs_results = bs_extractor.search_studies( - search_query, - page=page, - page_size=page_size, - filters=filters, - load_metadata=load_metadata, - ) - else: - bs_results = bs_extractor.list_studies( - page=page, - page_size=page_size, - include_urls=True, - filters=filters, - load_metadata=load_metadata, - ) - - # Initialize extractor for Zenodo - zen_extractor = ZenodoExtractor( - community=ZENODO_COMMUNITY, record_type=ZENODO_RECORD_TYPE - ) - - if not filters: - # We currently do no filter Zenodo datasets. - if search_query: - zen_result = zen_extractor.search_records( - search_query, page=page, size=page_size, load_metadata=load_metadata - ) - else: - # load metadata needed for is_rocrate filtering in template - zen_result = zen_extractor.list_records( - page=page, - size=page_size, - include_urls=True, - load_metadata=load_metadata, - ) - else: - zen_result = {"hits": [], "total": 0, "error": None} - - return bs_results, zen_result - - -# Provide methods list to all templates for the Methods dropdown in the navbar -@app.context_processor -def inject_methods_menu(): - """Fetch methods_index.json and expose a simple list of {id, title} to templates. - Return an empty list on any error to avoid breaking pages. - """ - data = get_json_dict(METHODS_URL) - if data: - items = [] - for key, val in data.items() if isinstance(data, dict) else []: - title = ( - val.get("method") - or val.get("method_name_content") - or val.get("method_name") - or key - ) - items.append({"id": key, "title": title}) - # sort by title - items = sorted(items, key=lambda x: x["title"].lower()) - return {"methods_menu": items} - else: - return {"methods_menu": []} - - -@app.context_processor -def inject_tools_menu(): - """Fetch methods_index.json and expose a simple list of {id, title} to templates. - Return an empty list on any error to avoid breaking pages. - """ - data = get_json_dict_service(SERVICES_URL) - if data: - items = [] - for key, val in data.items() if isinstance(data, dict) else []: - title = val.get("service") or key - items.append({"id": key, "title": title}) - # sort by title - items = sorted(items, key=lambda x: x["title"].lower()) - return {"tools_menu": items} - else: - return {"tools_menu": []} - - -@app.context_processor -def inject_data_menu(): - """Fetch methods_index.json and expose a simple list of {id, title} to templates. - Return an empty list on any error to avoid breaking pages. - """ - bs_results, zen_results = get_repository_data(search_query="") - hits: list = bs_results.get("hits", []) - hits.extend(zen_results.get("hits", [])) - if hits: - items = [] - for hit in hits: - title = hit.get("title") - id = hit.get("accession", "") or hit.get("doi_url", "") or hit.get("id", "") - url = hit.get("url", "") or hit.get("doi_url") - items.append({"id": id, "title": title, "url": url}) - # sort by title - items = sorted(items, key=lambda x: x["title"].lower()) - return {"data_menu": items} - else: - return {"data_menu": []} - - -################################################################################ -### The landing page -@app.route("/") -def home(): - try: - tools = get_json_dict_service( - SERVICES_URL - ) # Geting the service_list.json in the dictionary format. - tools = list(tools.values()) # Converting the dictionary to a list object. - except Exception as e: - return f"Error processing service data: {e}", 500 - num_tools = len(tools) - num_case_studies = len(CASESTUDIES) - bs_res, zen_res = get_repository_data(search_query="") - num_datasets = bs_res["total"] + zen_res["total"] - return render_template( - "home.html", - num_tools=num_tools, - num_case_studies=num_case_studies, - num_datasets=num_datasets, - ) - - -################################################################################ -### The sitemap.xml for search engines -@app.route("/sitemap.xml") -def sitemap(): - sitemapContent = """ - - - https://platform.vhp4safety.nl/ - - - https://platform.vhp4safety.nl/casestudies - - - https://platform.vhp4safety.nl/tools - - - https://platform.vhp4safety.nl/methods - - - https://platform.vhp4safety.nl/data - - -"""; - return Response(sitemapContent, mimetype='text/xml'); - - -################################################################################ -### Pages under 'Data' -@app.route("/data") -def data(): - # Get query parameters for pagination and search - page = request.args.get("page", 1, type=int) - page_size = request.args.get("page_size", 18, type=int) - search_query = request.args.get("query", "", type=str) - - # Get filter parameters - filter_case_study = request.args.get("filter_case_study", "", type=str) - filter_regulatory_question = request.args.get( - "filter_regulatory_question", "", type=str - ) - filter_flow_step = request.args.get("filter_flow_step", "", type=str) - - # Build filter list (only include non-empty filters) - filters = [] - if filter_case_study: - filters.append(("case_study", filter_case_study)) - if filter_regulatory_question: - filters.append(("regulatory_question", filter_regulatory_question)) - if filter_flow_step: - filters.append(("flow_step", filter_flow_step)) - - bs_results, zen_results = get_repository_data( - search_query, page, page_size, filters=filters - ) - - # Extract studies and metadata - studies = bs_results.get("hits", []) - bs_total = bs_results.get("total", 0) - bs_error: str | None = bs_results.get("error", None) - - # Extract datasets and metadata from Zenodo - datasets = zen_results.get("hits", []) - zen_total = zen_results.get("total", 0) - zen_error: str | None = zen_results.get("error", None) - - # enrich with normalized metadata mapping: - - # studies, datasets = normalize_all([studies],[datasets]) - - # combine totals for pagination - total = bs_total + zen_total - - # Get filtering metadata (if filters were applied) - filters_applied = bs_results.get("filters_applied", False) - hits_returned = bs_results.get("hits_returned", len(studies)) - pages_fetched = bs_results.get("pages_fetched", 1) - page_size_met = bs_results.get("page_size_met", True) - - # Calculate pagination info - has_next = (page * page_size) < total - has_prev = page > 1 - - # Pass data to template - return render_template( - "data/data.html", - studies=studies, - datasets=datasets, - total=total, - page=page, - page_size=page_size, - search_query=search_query, - collection_name=BIOSTUDIES_COLLECTION_NAME, - collection=BIOSTUDIES_COLLECTION, - errors={"zenodo": zen_error, "biostudies": bs_error}, - has_next=has_next, - has_prev=has_prev, - filter_case_study=filter_case_study, - filter_regulatory_question=filter_regulatory_question, - filter_flow_step=filter_flow_step, - filters_applied=filters_applied, - hits_returned=hits_returned, - pages_fetched=pages_fetched, - page_size_met=page_size_met, - stage_explanations=STAGE_EXPLANATIONS, - reg_question_explanations=REG_QUESTION_EXPLANATIONS, - ) - - -################################################################################ -### DataSet detail view - - -@app.template_filter("split_text_int") -def split_text_int(value: None|str) -> tuple[str, None|int]: - """ - Splits trailing integer from a string. - 'S-VHPS21' -> ('S-VHPS', 21) - 'ABC' -> ('ABC', None) - 'X-12A' -> ('X-12A', None) # only splits if digits are at the very end - """ - # used to construct ftp file link *POTENTIALLY BRITTLE* - if value is None: - return ("", None) - - s = str(value) - m = re.match(r"^(.*?)(\d+)$", s) - if not m: - return (s, None) - - return (m.group(1), int(m.group(2))) - - -@app.route("/data/") -def data_detail(dataid): - bs_results, zen_results = get_repository_data(dataid) - - studies = bs_results.get("hits", []) - bs_total = bs_results.get("total", 0) - bs_error: str | None = bs_results.get("error", None) - - # Extract datasets and metadata from Zenodo - datasets = zen_results.get("hits", []) - zen_total = zen_results.get("total", 0) - zen_error: str | None = zen_results.get("error", None) - - studies, datasets = normalize_all(studies, datasets) - - if bs_error and not zen_error: - if zen_total != 1: - return abort(404) - elif zen_error and not bs_error: - if bs_total != 1: - return abort(404) - if studies: - return render_template("data/data_details.html", data=studies[0]) - elif datasets: - return render_template("data/data_details.html", data=datasets[0]) - return abort(404) - -################################################################################ -### Pages under 'Models' -@app.route("/models_page") -def models(): - # Get query parameters for pagination and search - page = request.args.get("page", 1, type=int) - page_size = request.args.get("page_size", 18, type=int) - search_query = request.args.get("query", "", type=str) - - # Get filter parameters - filter_case_study = request.args.get("filter_case_study", "", type=str) - filter_regulatory_question = request.args.get( - "filter_regulatory_question", "", type=str - ) - filter_flow_step = request.args.get("filter_flow_step", "", type=str) - - # Build filter list (only include non-empty filters) - filters = [] - if filter_case_study: - filters.append(("case_study", filter_case_study)) - if filter_regulatory_question: - filters.append(("regulatory_question", filter_regulatory_question)) - if filter_flow_step: - filters.append(("flow_step", filter_flow_step)) - - # Initialize extractor - extractor = BioStudiesExtractor(collection=BIOSTUDIES_COLLECTION) - - # Fetch data based on search query or list all - if search_query: - results = extractor.search_studies( - search_query, page=page, page_size=page_size, filters=filters - ) - else: - results = extractor.list_studies( - page=page, page_size=page_size, include_urls=True, filters=filters - ) - - # Extract studies and metadata - studies = results.get("hits", []) - total = results.get("total", 0) - error = results.get("error", None) - - # Get filtering metadata (if filters were applied) - filters_applied = results.get("filters_applied", False) - hits_returned = results.get("hits_returned", len(studies)) - pages_fetched = results.get("pages_fetched", 1) - page_size_met = results.get("page_size_met", True) - - # Calculate pagination info - has_next = (page * page_size) < total - has_prev = page > 1 - - # Pass model data to template - return render_template( - "models_page.html", - studies=studies, - total=total, - page=page, - page_size=page_size, - search_query=search_query, - collection_name=BIOSTUDIES_COLLECTION_NAME, - collection=BIOSTUDIES_COLLECTION, - error=error, - has_next=has_next, - has_prev=has_prev, - filter_case_study=filter_case_study, - filter_regulatory_question=filter_regulatory_question, - filter_flow_step=filter_flow_step, - filters_applied=filters_applied, - hits_returned=hits_returned, - pages_fetched=pages_fetched, - page_size_met=page_size_met, - stage_explanations=STAGE_EXPLANATIONS, - reg_question_explanations=REG_QUESTION_EXPLANATIONS, - ) - - -################################################################################ -### Pages under 'Tools' - - -### Here begins the updated version for creating the tool list page. -@app.route("/tools") -def tools(): - try: - tools = get_json_dict_service( - SERVICES_URL - ) # Geting the service_list.json in the dictionary format. - tools = list(tools.values()) # Converting the dictionary to a list object. - - # Mapping the URLs with glossary IDs to their text values. - stage_mapping = { - "https://vhp4safety.github.io/glossary#VHP0000153": "Chemical Characteristics and Hazard Identification", - "https://vhp4safety.github.io/glossary#VHP0000154": "Exposure", - "https://vhp4safety.github.io/glossary#VHP0000155": "Toxicokinetics", - "https://vhp4safety.github.io/glossary#VHP0000156": "Toxicodynamics", - "https://vhp4safety.github.io/glossary#VHP0000158": "Adverse Outcome", - # Legacy mappings (superseded by the Process Flow Step URIs above) - "https://vhp4safety.github.io/glossary#VHP0000056": "ADME", - "https://vhp4safety.github.io/glossary#VHP0000102": "Hazard Assessment", - "https://vhp4safety.github.io/glossary#VHP0000148": "Chemical Information", - "https://vhp4safety.github.io/glossary#VHP0000149": "General", - } - - for tool in tools: - full_stage_url = tool.get("stage", "") - - # Writing the service name and stage values in the logs for troubleshooting. - # print(f"Tool: {tool['service']}, Stage URL: {full_stage_url}") # Log the full URL - - # Checking if the full URL is in the mapping and updating the stage. - if full_stage_url in stage_mapping: - # print(f"Mapping stage URL {full_stage_url} to {stage_mapping[full_stage_url]}") # Log the mapping - tool["stage"] = stage_mapping[full_stage_url] - elif tool["stage"] in ["NA", "Unknown"]: - tool["stage"] = ( - "Other" # Combining "NA" and "Unknown" stages in a single stage-type, "Other". - ) - - html_name = tool.get("html_name") - md_name = tool.get("md_file_name") - png_name = tool.get("png_file_name") - - tool["url"] = f"https://cloud.vhp4safety.nl/service/{html_name}" - tool["meta_data"] = ( - f"https://raw.githubusercontent.com/VHP4Safety/cloud/main/docs/service/{md_name}" - if md_name - else "md file not found" - ) - - # Check if the tool has the placeholder logo - placeholder_logo = "https://github.com/VHP4Safety/ui-design/blob/main/static/images/logo.png" - if png_name == placeholder_logo: - tool["png"] = None # set to None if it's the common placeholder - else: - tool["png"] = ( - f"https://raw.githubusercontent.com/VHP4Safety/cloud/main/docs/service/{png_name}" - if not png_name.startswith("http") - else png_name - ) - - inst_url = tool.get("inst_url", "no_url") - if not inst_url: # catches "" as well - inst_url = "no_url" - tool["inst_url"] = inst_url - - # Fetch per-tool detail JSON to check hosting status - tool_id = tool.get("id", "") - vhp_hosted = False - if inst_url != "no_url" and tool_id: - try: - detail_url = f"https://cloud.vhp4safety.nl/service/{tool_id}.json" - detail_resp = requests.get(detail_url, timeout=5) - if detail_resp.status_code == 200: - detail = detail_resp.json() - vhp_platform = detail.get("instance", {}).get("vhp-platform", "").lower() - vhp_hosted = vhp_platform not in ("external", "independent", "") - except Exception: - pass - tool["vhp_hosted"] = vhp_hosted - - # Getting selected stages from the URL. - selected_stages = request.args.getlist("stage") - - # Filtering tools by selected stages. - if selected_stages: - tools = [tool for tool in tools if tool.get("stage") in selected_stages] - - # Getting all unique stages from the tools for the filter options. - stages = sorted(set(tool.get("stage") for tool in tools if tool.get("stage"))) - - # Forcing "Other" to be the last item in the list of stages. - if "Other" in stages: - stages.remove("Other") - stages.append("Other") - - # Filtering over the regulatory questions. - reg_questions = {v["label"]: k for k, v in REG_QUESTIONS.items()} - - selected_questions = request.args.getlist("reg_q") - - for question in selected_questions: - field = reg_questions.get(question) - if field: - tools = [ - tool for tool in tools if str(tool.get(field, "")).lower() == "true" - ] - - # Getting the search query from URL to add a search bar based on tool names. - search_query = request.args.get("search", "").strip().lower() - - # Filtering tools by search query. - if search_query: - tools = [ - tool - for tool in tools - if search_query in tool.get("service", "").lower() - ] - - return render_template( - "tools/tools.html", - tools=tools, - stages=stages, - selected_stages=selected_stages, - reg_questions=reg_questions, - selected_questions=selected_questions, - stage_explanations=STAGE_EXPLANATIONS, - reg_question_explanations=REG_QUESTION_EXPLANATIONS, - ) - - except Exception as e: - return f"Error processing service data: {e}", 500 - - -### New route to list methods (similar to the tools page) -@app.route("/methods") -@app.route("/methods/") -def methods(): - """Fetch methods_index.json from the cloud repo, normalize fields and render a methods list page.""" - url = "https://raw.githubusercontent.com/VHP4Safety/cloud/refs/heads/main/cap/methods_index.json" - response = requests.get(url) - - if response.status_code != 200: - return f"Error fetching methods list: {response.status_code}", 503 - - try: - methods = response.json() - methods = list(methods.values()) # convert dict to list - - # Normalize fields for the template and collect stages - stages_set = set() - normalized = [] - for m in methods: - norm = {} - norm["id"] = m.get("id", "") - # template expects 'service' and 'description' - norm["service"] = ( - m.get("method") - or m.get("method_name_content") - or m.get("method_name") - or "" - ) - norm["description"] = ( - m.get("method_description_content") or m.get("method_description") or "" - ) - # main_url used for method webpage (catalog page) - norm["main_url"] = m.get("catalog_webpage_url") or "no_url" - # interactive instance not present in methods index - norm["inst_url"] = m.get("inst_url") or "no_url" - # metadata md file not available in index; keep empty string - norm["meta_data"] = m.get("meta_data") or "" - # placeholder/no png - norm["png"] = None - # keep original raw data for potential details page - norm["raw"] = m - - # collect stages (split comma-separated values) - stage_field = (m.get("vhp4safety_workflow_stage_content") or "").strip() - if stage_field: - for part in [s.strip() for s in stage_field.split(",")]: - if part: - stages_set.add(part) - - normalized.append(norm) - - # Apply search and filters similar to /tools - selected_stages = request.args.getlist("stage") - selected_questions = request.args.getlist("reg_q") - search_query = request.args.get("search", "").strip().lower() - - methods_filtered = normalized - - if selected_stages: - methods_filtered = [ - m - for m in methods_filtered - if any( - s - in ( - (m["raw"].get("vhp4safety_workflow_stage_content") or "").split( - "," - ) - ) - for s in selected_stages - ) - ] - - # Filter by regulatory questions if provided (REG_QUESTIONS keys map to internal fields) - reg_questions = {v["label"]: k for k, v in REG_QUESTIONS.items()} - if selected_questions: - for question in selected_questions: - field = reg_questions.get(question) - if field: - methods_filtered = [ - m - for m in methods_filtered - if str(m["raw"].get(field, "")).lower() == "true" - ] - - if search_query: - methods_filtered = [ - m - for m in methods_filtered - if search_query in m.get("service", "").lower() - ] - - stages = sorted(stages_set) - if "Other" in stages: - stages.remove("Other") - stages.append("Other") - - # Pass everything the template expects - return render_template( - "methods/methods.html", - methods=methods_filtered, - stages=stages, - selected_stages=selected_stages, - reg_questions=reg_questions, - selected_questions=selected_questions, - stage_explanations=STAGE_EXPLANATIONS, - reg_question_explanations=REG_QUESTION_EXPLANATIONS, - ) - - except Exception as e: - return f"Error processing methods data: {e}", 500 - - -@app.route("/methods/") -def method_page(methodid): - """Render a single method page using templates/methods/method.html - Method details are taken from methods_index.json (keyed by method id). - """ - try: - methods = get_json_dict(METHODS_URL) - # methods_index.json is a dict keyed by method id - if methodid not in methods: - abort(404) - method_details = methods[methodid] - except Exception as e: - return f"Error processing methods data: {e}", 500 - - # Try to load the full method JSON from the docs/methods folder (raw github) - method_json = None - # URL-encode the filename part to be safe - encoded = urllib.parse.quote(methodid, safe="") - raw_url = ( - "https://raw.githubusercontent.com/VHP4Safety/cloud/refs/heads/main/docs/methods/" - + f"{encoded}.json" - ) - try: - r = requests.get(raw_url, timeout=5) - if r.status_code == 200: - method_json = r.json() - else: - # fall back to using the index entry as minimal data - method_json = method_details - except Exception as exc: - # on any error, fall back to index entry - method_json = method_details - - # Pass both to the template: some templates expect method_json, others method_details - return render_template( - "methods/method.html", - method=method_details, - method_details=method_details, - method_json=method_json, - ) - - -@app.route("/tools/") -def tool_page(toolname): - # get the tools metadata: - try: - tools = get_json_dict_service(SERVICES_URL) - tools = dict(tools) - # Geting the service_list.json in the dictionary format. - # Converting the dictionary to a list object. - except Exception as e: - return f"Error processing service data: {e}", 500 - - # Map toolname to the correct JSON file in the new tool folder - if toolname not in tools: - abort(404) - - # get the tools metadata: - url = "https://cloud.vhp4safety.nl/service/" + toolname + ".json" - response = requests.get(url) - - if response.status_code != 200: - return f"Error fetching service list: {response.status_code}", 503 - - try: - tool_details = response.json() - tool_details = dict(tool_details) - # Geting the service_list.json in the dictionary format. - # Converting the dictionary to a list object. - except Exception as e: - return f"Error processing service data: {e}", 500 - - # Pass the json filename to the template (for JS to pick up) - return render_template( - "tools/tool.html", tool_json=tools[toolname], tool_details=tool_details - ) - - -################################################################################ -### Pages under 'Implementation' - -# General Explore our work -@app.route("/exploreourwork") -def exploreourwork(): - return render_template("exploreourwork.html") - -# General Training -@app.route("/training") -def training(): - return render_template("training.html") - -# General Impact -@app.route("/impact") -def impact(): - return render_template("impact.html") - -################################################################################ -### Pages under 'Process Flow' - - -# General Safety Assessment Workflow page -@app.route("/Safety_Assessment_Workflow") -def SafetyAssessmentWorkflow(): - return render_template("Safety_Assessment_Workflow.html") - - -################################################################################ -### Pages under 'Case Studies' - - -# General case studies page -@app.route("/casestudies") -def workflows(): - return render_template("case_studies/casestudies.html") - - -# Individual case study page, dynamically filled based on URL -@app.route("/casestudies/", defaults={"step": ""}) -@app.route("/casestudies//") -@app.route("/casestudies///") -# additional routes are parsed client side via js to allow smooth animation -def casestudy(case:str="", question:str="", step:str=""): - if case not in CASESTUDIES: - abort(404) - # JS will handle steps via the URL - return render_template("case_studies/casestudy.html", case=case) - - -@app.route("/workflow/") -def show(workflow): - try: - return render_template( - f"case_studies/parkinson/workflows/{workflow}_workflow.html" - ) - except TemplateNotFound: - abort(404) - - -################################################################################ -### Pages related to chemical compounds - - -def is_valid_qid(qid): - return re.fullmatch(r"Q\d+", qid) is not None - - -@app.route("/compound/") -def show_compound(cwid): - try: - return render_template(f"compound.html", cwid=cwid) - except TemplateNotFound: - abort(404) - - -@app.route("/get_compound_properties/") -def show_compounds_properties_as_json(cwid): - if not is_valid_qid(cwid): - return jsonify({"error": "Invalid compound identifier"}), 400 - compoundwikiEP = "https://compoundcloud.wikibase.cloud/query/sparql" - sparqlquery = ( - "PREFIX wd: \n" - "PREFIX wdt: \n\n" - "SELECT ?cmp ?cmpLabel ?formula ?mass ?inchi ?inchiKey ?SMILES WHERE {\n" - " VALUES ?cmp { wd:" + cwid + " }\n" - " ?cmp wdt:P9 ?inchi ;\n" - " wdt:P10 ?inchiKey .\n" - " OPTIONAL { ?cmp wdt:P2 ?mass }\n" - " OPTIONAL { ?cmp wdt:P3 ?formula }\n" - " OPTIONAL { ?cmp wdt:P7 ?chiralSMILES }\n" - " OPTIONAL { ?cmp wdt:P12 ?nonchiralSMILES }\n" - ' BIND (COALESCE(IF(BOUND(?chiralSMILES), ?chiralSMILES, 1/0), IF(BOUND(?nonchiralSMILES), ?nonchiralSMILES, 1/0), "") AS ?SMILES)\n' - ' SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }\n' - "}" - ) - try: - compound_dat = wbi_helpers.execute_sparql_query( - sparqlquery, endpoint=compoundwikiEP - ) - except Exception as e: - return jsonify({"error": str(e)}), 500 - if not bool(compound_dat): - return jsonify({"error": "No data found"}), 404 - compound_dat = compound_dat["results"]["bindings"][0] - # return jsonify(compound_dat); - compound_list = [ - { - "wcid": compound_dat["cmp"]["value"], - "label": compound_dat["cmpLabel"]["value"], - "inchi": compound_dat["inchi"]["value"], - "inchikey": compound_dat["inchiKey"]["value"], - "SMILES": compound_dat["SMILES"]["value"], - "formula": compound_dat["formula"]["value"], - "mass": compound_dat["mass"]["value"], - } - ] - return jsonify(compound_list), 200 - - -@app.route("/get_compound_identifiers/") -def show_compounds_identifiers_as_json(cwid): - if not is_valid_qid(cwid): - return jsonify({"error": "Invalid compound identifier"}), 400 - compoundwikiEP = "https://compoundcloud.wikibase.cloud/query/sparql" - sparqlquery = ( - "PREFIX wd: \n" - "PREFIX wdt: \n\n" - "SELECT DISTINCT ?propertyLabel ?value ?formatterURL\n" - "WHERE {\n" - " VALUES ?property { wd:P13 wd:P22 wd:P23 wd:P26 wd:P27 wd:P28 wd:P36 wd:P41 wd:P43 wd:P44 wd:P45 }\n" - " ?property wikibase:directClaim ?valueProp .\n" - " OPTIONAL { wd:" + cwid + " ?valueProp ?value }\n" - " OPTIONAL { ?property wdt:P6 ?formatterURL }\n" - ' SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }\n' - "}" - ) - try: - compound_dat = wbi_helpers.execute_sparql_query( - sparqlquery, endpoint=compoundwikiEP - ) - except Exception as e: - return jsonify({"error": str(e)}), 500 - if len(compound_dat["results"]["bindings"]) == 0: - return jsonify({"error": "No data found"}), 404 - compound_dat = compound_dat["results"]["bindings"] - # return jsonify(compound_dat) - - compound_list = [] - for expProp in compound_dat: - if "value" in expProp: - compound_list.append( - { - "propertyLabel": expProp["propertyLabel"]["value"], - "value": expProp["value"]["value"], - "formatterURL": expProp["formatterURL"]["value"], - } - ) - else: - compound_list.append( - { - "propertyLabel": expProp["propertyLabel"]["value"], - "value": "", - "formatterURL": "", - } - ) - return jsonify(compound_list), 200 - - -@app.route("/get_compound_toxicology/") -def show_compounds_toxicology_as_json(cwid): - if not is_valid_qid(cwid): - return jsonify({"error": "Invalid compound identifier"}), 400 - compoundwikiEP = "https://compoundcloud.wikibase.cloud/query/sparql" - sparqlquery = ( - "PREFIX wd: \n" - "PREFIX wdt: \n\n" - "SELECT DISTINCT ?propertyLabel ?value ?formatterURL\n" - "WHERE {\n" - " VALUES ?property { wd:P17 wd:P19 wd:P4 }\n" - " ?property wikibase:directClaim ?valueProp .\n" - " OPTIONAL { wd:" + cwid + " ?valueProp ?value }\n" - " OPTIONAL { ?property wdt:P6 ?formatterURL }\n" - ' SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }\n' - "}" - ) - try: - compound_dat = wbi_helpers.execute_sparql_query( - sparqlquery, endpoint=compoundwikiEP - ) - except Exception as e: - return jsonify({"error": str(e)}), 500 - if len(compound_dat["results"]["bindings"]) == 0: - return jsonify({"error": "No data found"}), 404 - compound_dat = compound_dat["results"]["bindings"] - # return jsonify(compound_dat) - - compound_list = [] - for expProp in compound_dat: - print(expProp) - if "value" in expProp: - compound_list.append( - { - "propertyLabel": expProp["propertyLabel"]["value"], - "value": expProp["value"]["value"], - } - ) - else: - compound_list.append( - {"propertyLabel": expProp["propertyLabel"]["value"], "value": ""} - ) - return jsonify(compound_list), 200 - - -@app.route("/get_compound_expdata/") -def show_compounds_expdata_as_json(cwid): - if not is_valid_qid(cwid): - return jsonify({"error": "Invalid compound identifier"}), 400 - compoundwikiEP = "https://compoundcloud.wikibase.cloud/query/sparql" - sparqlquery = ( - "PREFIX wd: \n" - "PREFIX wdt: \n" - "PREFIX wid: \n" - "PREFIX widt: \n" - "PREFIX prov: \n\n" - "SELECT ?qid WHERE {\n" - " wd:P5 wikibase:directClaim ?identifierProp .\n" - " wd:" + cwid + " ?identifierProp ?wikidata .\n" - ' BIND (iri(CONCAT("http://www.wikidata.org/entity/", ?wikidata)) AS ?qid)\n' - "}" - ) - try: - compound_dat = wbi_helpers.execute_sparql_query( - sparqlquery, endpoint=compoundwikiEP - ) - except Exception as e: - return jsonify({"error": str(e)}), 500 - if not bool(compound_dat): - return jsonify({"error": "No data found"}), 404 - if len(compound_dat["results"]["bindings"]) == 0: - return jsonify({"error": "No data found"}), 404 - compound_dat = compound_dat["results"]["bindings"][0] - qid = compound_dat["qid"]["value"] - # the next query may be affected by https://github.com/ad-freiburg/qlever-control/issues/187 - sparqlquery = ( - "PREFIX wd: \n" - "PREFIX wdt: \n" - "PREFIX prov: \n" - "PREFIX rdfs: \n" - "PREFIX pr: \n" - "PREFIX wikibase: \n\n" - "SELECT DISTINCT ?propEntityLabel ?value ?unitsLabel ?source ?doi ?statement\n" - "WHERE {\n" - " <" + qid + "> ?propp ?statement .\n" - " ?statement a wikibase:BestRank ;\n" - " ?proppsv [ wikibase:quantityAmount ?value ; wikibase:quantityUnit ?units ] .\n" - " #OPTIONAL { ?statement prov:wasDerivedFrom/pr:P248 ?sourceTmp . OPTIONAL { ?sourceTmp wdt:P356 ?doiTmp . } }\n" - " ?property wikibase:claim ?propp ; wikibase:statementValue ?proppsv ; wdt:P1629 ?propEntity ; wdt:P31 wd:Q21077852 .\n" - " ?propEntity @en@rdfs:label ?propEntityLabel .\n" - " ?units @en@rdfs:label ?unitsLabel .\n" - ' BIND (COALESCE(IF(BOUND(?sourceTmp), ?sourceTmp, 1/0), "") AS ?source)\n' - ' BIND (COALESCE(IF(BOUND(?doiTmp), ?doiTmp, 1/0), "") AS ?doi)\n' - "}" - ) - # return sparqlquery - try: - sparqlqueryURL = ( - "https://qlever.cs.uni-freiburg.de/api/wikidata?format=json&query=" - + urllib.parse.quote_plus(sparqlquery) - ) - # return sparqlqueryURL - compound_dat = requests.get(sparqlqueryURL) - # return json.loads(compound_dat.content) - except Exception as e: - return jsonify({"error": str(e)}), 500 - if not bool(compound_dat): - return jsonify({"error": "No data found"}), 404 - compound_dat = json.loads(compound_dat.content)["results"]["bindings"] - # return jsonify(compound_dat) - compound_list = [] - for expProp in compound_dat: - # return jsonify(expProp) - compound_list.append( - { - "propEntityLabel": expProp["propEntityLabel"]["value"], - "value": expProp["value"]["value"], - "unitsLabel": expProp["unitsLabel"]["value"], - "source": expProp["source"]["value"], - "doi": expProp["doi"]["value"], - "seeAlso": expProp["statement"]["value"], - } - ) - return jsonify(compound_list), 200 - - -################################################################################ -### Pages under 'Legal' -@app.route("/legal/terms_of_service") -def terms_of_service(): - return render_template("legal/terms_of_service.html") - - -@app.route("/legal/privacypolicy") -def privacy_policy(): - return render_template("legal/privacypolicy.html") - - -if __name__ == "__main__": - app.run(host="0.0.0.0", port=5050, debug=True) - - \ No newline at end of file +################################################################################ +### Loading the required modules +import json +import re + +import requests +import urllib.parse +from flask import Flask, abort, jsonify, render_template, request, Response +from flask_caching import Cache +from jinja2 import TemplateNotFound +from werkzeug.routing import BaseConverter + +# from wikidataintegrator import wdi_core +from wikibaseintegrator import wbi_helpers + +# Import BioStudies extractor +from data.biostudies.search import BioStudiesExtractor +from data.zenodo.search import ZenodoExtractor +from data.mapping import normalize_all + +################################################################################ +CACHE_TIMEOUT = 60 * 60 * 24 * 5 # 5 days -- [Ozan] I created a separate + # timeout object for the tools page because + # a 5-day caching is too long for it. +CACHE_TIMEOUT_SERVICE = 60 # Separate timeout for the tools page -- 60 + # seconds. +### Configuration for BioStudies Integration +# Change these variables to switch between collections +BIOSTUDIES_COLLECTION = "VHP4Safety" # Replace with "EU-ToxRisk" to test +BIOSTUDIES_COLLECTION_NAME = "VHP4Safety" # Display name for the page +ZENODO_COMMUNITY = "vhp4safety" # zenodo community +ZENODO_RECORD_TYPE = "dataset" # only show datasets + +CASESTUDIES = ["thyroid", "kidney", "parkinson"] # List of valid case studies + +###Shared explanation dictionaries for filters (used in both tools and data page) +STAGE_EXPLANATIONS = { + "Chemical Characteristics and Hazard Identification": "A Safety Assessment Workflow Step that categorizes services that use molecular structures, chemical descriptors, and databases to predict or analyze the properties, behavior, and potential risks of chemical substances.", + "Exposure": "A Safety Assessment Workflow Step which categorizes services that evaluate and analyze the route, duration, magnitude and frequency of exposure of an organism or (sub)population to one or multiple chemicals.", + "Toxicokinetics": "A Safety Assessment Workflow Step which categorizes services that analyze the kinetics (absorption, distribution, metabolism and excretion) of chemicals and how these processes influence the internal dose.", + "Toxicodynamics": "A Safety Assessment Workflow Step which categorizes services that use or extend the (quantitative) AOP framework to analyze and assess the interaction of chemicals with biological targets.", + "Adverse Outcome": "A Safety Assessment Workflow Step which specifically refers to clinical and epidemiological effects. It categorizes services that provide information on the toxicological endpoints and adverse outcomes at a clinical or epidemiological level of chemical exposures.", + "Other": "Other or unknown category.", + # Legacy labels (kept for the data/methods pages until their data sources migrate) + "ADME": "Absorption, distribution, metabolism, and excretion of a substance (toxic or not) in a living organism, following exposure to this substance.", + "Hazard Assessment": "The process of assessing the intrinsic hazard a substance poses to human health and/or the environment", + "Chemical Information": "Information about chemical properties and identity.", + "General": "Not specific to a flow step.", + "(External) exposure": "External exposure assessment.", + "Generic": "Generic category.", +} +METHODS_URL = "https://raw.githubusercontent.com/VHP4Safety/cloud/refs/heads/main/cap/methods_index.json" +# TOOLS and SERVICES are synonymous +SERVICES_URL = "https://raw.githubusercontent.com/VHP4Safety/cloud/refs/heads/main/cap/service_index.json" + +REG_QUESTIONS = { + "reg_q_1a": { + "label": "Kidney Case Study (a)", + "explanation": "What is the safe cisplatin dose in cancer patients?", + }, + "reg_q_1b": { + "label": "Kidney Case Study (b)", + "explanation": "What is the intrinsic hazard of tacrolimus for nephrotoxicity?", + }, + "reg_q_2a": { + "label": "Parkinson Case Study (a)", + "explanation": "Can compound Dinoseb cause Parkinson's Disease?", + }, + "reg_q_2b": { + "label": "Parkinson Case Study (b)", + "explanation": "What level of exposure to compound Dinoseb leads to risk for developing Parkinson’s disease?", + }, + "reg_q_3a": { + "label": "Thyroid Case Study (a)", + "explanation": "What information about silychristin do we need to give an advice to women in their early pregnancy to decide whether the substance can be used?", + }, + "reg_q_3b": { + "label": "Thyroid Case Study (b)", + "explanation": "Does silychristin influence the thyroid-mediated brain development in the fetus resulting in cognitive impairment in children?", + }, +} + +# Derived: keep the old structure available for templates expecting {label: explanation} +REG_QUESTION_EXPLANATIONS = { + v["label"]: v["explanation"] for v in REG_QUESTIONS.values() +} + + +################################################################################ +class RegexConverter(BaseConverter): + """Converter for regular expression routes. + + References + ---------- + Scholia views.py + https://stackoverflow.com/questions/5870188 + + """ + + def __init__(self, url_map, *items): + """Set up regular expression matcher.""" + super(RegexConverter, self).__init__(url_map) + self.regex = items[0] + + +cache_config = { + "CACHE_TYPE": "SimpleCache", # Flask-Caching related configs + "CACHE_DEFAULT_TIMEOUT": CACHE_TIMEOUT, # 60 min chaching + "CACHE_SERVICE_TIMEOUT": CACHE_TIMEOUT_SERVICE +} +app = Flask(__name__) +app.config.from_mapping(cache_config) +cache = Cache(app) + + +@cache.memoize(timeout=CACHE_TIMEOUT) +def get_json_dict(url: str, timeout: int = 5) -> dict: + """Fetch xxxx_index.json from the cloud repo and return as a dictionary. + Return an empty dict on any error to avoid breaking pages that depend on it. + """ + try: + resp = requests.get(url, timeout=timeout) + if resp.status_code != 200: + return {} + data = resp.json() + if isinstance(data, dict): + return data + else: + return {} + except Exception: + return {} + + +# A separate get_json_dict function for the tools page with its own timeout. +@cache.memoize(timeout=CACHE_TIMEOUT_SERVICE) +def get_json_dict_service(url: str, timeout: int = 5) -> dict: + """Fetch xxxx_index.json from the cloud repo and return as a dictionary. + Return an empty dict on any error to avoid breaking pages that depend on it. + """ + try: + resp = requests.get(url, timeout=timeout) + if resp.status_code != 200: + return {} + data = resp.json() + if isinstance(data, dict): + return data + else: + return {} + except Exception: + return {} + + +@cache.memoize(timeout=CACHE_TIMEOUT) +def get_repository_data( + search_query: str, + page: int = 1, + page_size: int = 18, + filters: list | None = None, + load_metadata: bool = True, +) -> tuple[dict, dict]: + """ + Extract data from respositories + """ + # Initialize extractor for BIOSTUDIES + bs_extractor = BioStudiesExtractor(collection=BIOSTUDIES_COLLECTION) + + # Fetch data based on search query or list all + if search_query: + bs_results = bs_extractor.search_studies( + search_query, + page=page, + page_size=page_size, + filters=filters, + load_metadata=load_metadata, + ) + else: + bs_results = bs_extractor.list_studies( + page=page, + page_size=page_size, + include_urls=True, + filters=filters, + load_metadata=load_metadata, + ) + + # Initialize extractor for Zenodo + zen_extractor = ZenodoExtractor( + community=ZENODO_COMMUNITY, record_type=ZENODO_RECORD_TYPE + ) + + if not filters: + # We currently do no filter Zenodo datasets. + if search_query: + zen_result = zen_extractor.search_records( + search_query, page=page, size=page_size, load_metadata=load_metadata + ) + else: + # load metadata needed for is_rocrate filtering in template + zen_result = zen_extractor.list_records( + page=page, + size=page_size, + include_urls=True, + load_metadata=load_metadata, + ) + else: + zen_result = {"hits": [], "total": 0, "error": None} + + return bs_results, zen_result + + +# Provide methods list to all templates for the Methods dropdown in the navbar +@app.context_processor +def inject_methods_menu(): + """Fetch methods_index.json and expose a simple list of {id, title} to templates. + Return an empty list on any error to avoid breaking pages. + """ + data = get_json_dict(METHODS_URL) + if data: + items = [] + for key, val in data.items() if isinstance(data, dict) else []: + title = ( + val.get("method") + or val.get("method_name_content") + or val.get("method_name") + or key + ) + items.append({"id": key, "title": title}) + # sort by title + items = sorted(items, key=lambda x: x["title"].lower()) + return {"methods_menu": items} + else: + return {"methods_menu": []} + + +@app.context_processor +def inject_tools_menu(): + """Fetch methods_index.json and expose a simple list of {id, title} to templates. + Return an empty list on any error to avoid breaking pages. + """ + data = get_json_dict_service(SERVICES_URL) + if data: + items = [] + for key, val in data.items() if isinstance(data, dict) else []: + title = val.get("service") or key + items.append({"id": key, "title": title}) + # sort by title + items = sorted(items, key=lambda x: x["title"].lower()) + return {"tools_menu": items} + else: + return {"tools_menu": []} + + +@app.context_processor +def inject_data_menu(): + """Fetch methods_index.json and expose a simple list of {id, title} to templates. + Return an empty list on any error to avoid breaking pages. + """ + bs_results, zen_results = get_repository_data(search_query="") + hits: list = bs_results.get("hits", []) + hits.extend(zen_results.get("hits", [])) + if hits: + items = [] + for hit in hits: + title = hit.get("title") + id = hit.get("accession", "") or hit.get("doi_url", "") or hit.get("id", "") + url = hit.get("url", "") or hit.get("doi_url") + items.append({"id": id, "title": title, "url": url}) + # sort by title + items = sorted(items, key=lambda x: x["title"].lower()) + return {"data_menu": items} + else: + return {"data_menu": []} + + +################################################################################ +### The landing page +@app.route("/") +def home(): + try: + tools = get_json_dict_service( + SERVICES_URL + ) # Geting the service_list.json in the dictionary format. + tools = list(tools.values()) # Converting the dictionary to a list object. + except Exception as e: + return f"Error processing service data: {e}", 500 + num_tools = len(tools) + num_case_studies = len(CASESTUDIES) + bs_res, zen_res = get_repository_data(search_query="") + num_datasets = bs_res["total"] + zen_res["total"] + return render_template( + "home.html", + num_tools=num_tools, + num_case_studies=num_case_studies, + num_datasets=num_datasets, + ) + + +################################################################################ +### The sitemap.xml for search engines +@app.route("/sitemap.xml") +def sitemap(): + sitemapContent = """ + + + https://platform.vhp4safety.nl/ + + + https://platform.vhp4safety.nl/casestudies + + + https://platform.vhp4safety.nl/tools + + + https://platform.vhp4safety.nl/methods + + + https://platform.vhp4safety.nl/data + + +"""; + return Response(sitemapContent, mimetype='text/xml'); + + +################################################################################ +### Pages under 'Data' +@app.route("/data") +def data(): + # Get query parameters for pagination and search + page = request.args.get("page", 1, type=int) + page_size = request.args.get("page_size", 18, type=int) + search_query = request.args.get("query", "", type=str) + + # Get filter parameters + filter_case_study = request.args.get("filter_case_study", "", type=str) + filter_regulatory_question = request.args.get( + "filter_regulatory_question", "", type=str + ) + filter_flow_step = request.args.get("filter_flow_step", "", type=str) + + # Build filter list (only include non-empty filters) + filters = [] + if filter_case_study: + filters.append(("case_study", filter_case_study)) + if filter_regulatory_question: + filters.append(("regulatory_question", filter_regulatory_question)) + if filter_flow_step: + filters.append(("flow_step", filter_flow_step)) + + bs_results, zen_results = get_repository_data( + search_query, page, page_size, filters=filters + ) + + # Extract studies and metadata + studies = bs_results.get("hits", []) + bs_total = bs_results.get("total", 0) + bs_error: str | None = bs_results.get("error", None) + + # Extract datasets and metadata from Zenodo + datasets = zen_results.get("hits", []) + zen_total = zen_results.get("total", 0) + zen_error: str | None = zen_results.get("error", None) + + # enrich with normalized metadata mapping: + + # studies, datasets = normalize_all([studies],[datasets]) + + # combine totals for pagination + total = bs_total + zen_total + + # Get filtering metadata (if filters were applied) + filters_applied = bs_results.get("filters_applied", False) + hits_returned = bs_results.get("hits_returned", len(studies)) + pages_fetched = bs_results.get("pages_fetched", 1) + page_size_met = bs_results.get("page_size_met", True) + + # Calculate pagination info + has_next = (page * page_size) < total + has_prev = page > 1 + + # Pass data to template + return render_template( + "data/data.html", + studies=studies, + datasets=datasets, + total=total, + page=page, + page_size=page_size, + search_query=search_query, + collection_name=BIOSTUDIES_COLLECTION_NAME, + collection=BIOSTUDIES_COLLECTION, + errors={"zenodo": zen_error, "biostudies": bs_error}, + has_next=has_next, + has_prev=has_prev, + filter_case_study=filter_case_study, + filter_regulatory_question=filter_regulatory_question, + filter_flow_step=filter_flow_step, + filters_applied=filters_applied, + hits_returned=hits_returned, + pages_fetched=pages_fetched, + page_size_met=page_size_met, + stage_explanations=STAGE_EXPLANATIONS, + reg_question_explanations=REG_QUESTION_EXPLANATIONS, + ) + + +################################################################################ +### DataSet detail view + + +@app.template_filter("split_text_int") +def split_text_int(value: None|str) -> tuple[str, None|int]: + """ + Splits trailing integer from a string. + 'S-VHPS21' -> ('S-VHPS', 21) + 'ABC' -> ('ABC', None) + 'X-12A' -> ('X-12A', None) # only splits if digits are at the very end + """ + # used to construct ftp file link *POTENTIALLY BRITTLE* + if value is None: + return ("", None) + + s = str(value) + m = re.match(r"^(.*?)(\d+)$", s) + if not m: + return (s, None) + + return (m.group(1), int(m.group(2))) + + +@app.route("/data/") +def data_detail(dataid): + bs_results, zen_results = get_repository_data(dataid) + + studies = bs_results.get("hits", []) + bs_total = bs_results.get("total", 0) + bs_error: str | None = bs_results.get("error", None) + + # Extract datasets and metadata from Zenodo + datasets = zen_results.get("hits", []) + zen_total = zen_results.get("total", 0) + zen_error: str | None = zen_results.get("error", None) + + studies, datasets = normalize_all(studies, datasets) + + if bs_error and not zen_error: + if zen_total != 1: + return abort(404) + elif zen_error and not bs_error: + if bs_total != 1: + return abort(404) + if studies: + return render_template("data/data_details.html", data=studies[0]) + elif datasets: + return render_template("data/data_details.html", data=datasets[0]) + return abort(404) + +################################################################################ +### Pages under 'Models' +@app.route("/models_page") +def models(): + # Get query parameters for pagination and search + page = request.args.get("page", 1, type=int) + page_size = request.args.get("page_size", 18, type=int) + search_query = request.args.get("query", "", type=str) + + # Get filter parameters + filter_case_study = request.args.get("filter_case_study", "", type=str) + filter_regulatory_question = request.args.get( + "filter_regulatory_question", "", type=str + ) + filter_flow_step = request.args.get("filter_flow_step", "", type=str) + + # Build filter list (only include non-empty filters) + filters = [] + if filter_case_study: + filters.append(("case_study", filter_case_study)) + if filter_regulatory_question: + filters.append(("regulatory_question", filter_regulatory_question)) + if filter_flow_step: + filters.append(("flow_step", filter_flow_step)) + + # Initialize extractor + extractor = BioStudiesExtractor(collection=BIOSTUDIES_COLLECTION) + + # Fetch data based on search query or list all + if search_query: + results = extractor.search_studies( + search_query, page=page, page_size=page_size, filters=filters + ) + else: + results = extractor.list_studies( + page=page, page_size=page_size, include_urls=True, filters=filters + ) + + # Extract studies and metadata + studies = results.get("hits", []) + total = results.get("total", 0) + error = results.get("error", None) + + # Get filtering metadata (if filters were applied) + filters_applied = results.get("filters_applied", False) + hits_returned = results.get("hits_returned", len(studies)) + pages_fetched = results.get("pages_fetched", 1) + page_size_met = results.get("page_size_met", True) + + # Calculate pagination info + has_next = (page * page_size) < total + has_prev = page > 1 + + # Pass model data to template + return render_template( + "models_page.html", + studies=studies, + total=total, + page=page, + page_size=page_size, + search_query=search_query, + collection_name=BIOSTUDIES_COLLECTION_NAME, + collection=BIOSTUDIES_COLLECTION, + error=error, + has_next=has_next, + has_prev=has_prev, + filter_case_study=filter_case_study, + filter_regulatory_question=filter_regulatory_question, + filter_flow_step=filter_flow_step, + filters_applied=filters_applied, + hits_returned=hits_returned, + pages_fetched=pages_fetched, + page_size_met=page_size_met, + stage_explanations=STAGE_EXPLANATIONS, + reg_question_explanations=REG_QUESTION_EXPLANATIONS, + ) + + +################################################################################ +### Pages under 'Tools' + + +### Here begins the updated version for creating the tool list page. +@app.route("/tools") +def tools(): + try: + tools = get_json_dict_service( + SERVICES_URL + ) # Geting the service_list.json in the dictionary format. + tools = list(tools.values()) # Converting the dictionary to a list object. + + # Mapping the URLs with glossary IDs to their text values. + stage_mapping = { + "https://vhp4safety.github.io/glossary#VHP0000153": "Chemical Characteristics and Hazard Identification", + "https://vhp4safety.github.io/glossary#VHP0000154": "Exposure", + "https://vhp4safety.github.io/glossary#VHP0000155": "Toxicokinetics", + "https://vhp4safety.github.io/glossary#VHP0000156": "Toxicodynamics", + "https://vhp4safety.github.io/glossary#VHP0000158": "Adverse Outcome", + # Legacy mappings (superseded by the Process Flow Step URIs above) + "https://vhp4safety.github.io/glossary#VHP0000056": "ADME", + "https://vhp4safety.github.io/glossary#VHP0000102": "Hazard Assessment", + "https://vhp4safety.github.io/glossary#VHP0000148": "Chemical Information", + "https://vhp4safety.github.io/glossary#VHP0000149": "General", + } + + for tool in tools: + full_stage_url = tool.get("stage", "") + + # Writing the service name and stage values in the logs for troubleshooting. + # print(f"Tool: {tool['service']}, Stage URL: {full_stage_url}") # Log the full URL + + # Checking if the full URL is in the mapping and updating the stage. + if full_stage_url in stage_mapping: + # print(f"Mapping stage URL {full_stage_url} to {stage_mapping[full_stage_url]}") # Log the mapping + tool["stage"] = stage_mapping[full_stage_url] + elif tool["stage"] in ["NA", "Unknown"]: + tool["stage"] = ( + "Other" # Combining "NA" and "Unknown" stages in a single stage-type, "Other". + ) + + html_name = tool.get("html_name") + md_name = tool.get("md_file_name") + png_name = tool.get("png_file_name") + + tool["url"] = f"https://cloud.vhp4safety.nl/service/{html_name}" + tool["meta_data"] = ( + f"https://raw.githubusercontent.com/VHP4Safety/cloud/main/docs/service/{md_name}" + if md_name + else "md file not found" + ) + + # Check if the tool has the placeholder logo + placeholder_logo = "https://github.com/VHP4Safety/ui-design/blob/main/static/images/logo.png" + if png_name == placeholder_logo: + tool["png"] = None # set to None if it's the common placeholder + else: + tool["png"] = ( + f"https://raw.githubusercontent.com/VHP4Safety/cloud/main/docs/service/{png_name}" + if not png_name.startswith("http") + else png_name + ) + + inst_url = tool.get("inst_url", "no_url") + if not inst_url: # catches "" as well + inst_url = "no_url" + tool["inst_url"] = inst_url + + # Fetch per-tool detail JSON to check hosting status + tool_id = tool.get("id", "") + vhp_hosted = False + if inst_url != "no_url" and tool_id: + try: + detail_url = f"https://cloud.vhp4safety.nl/service/{tool_id}.json" + detail_resp = requests.get(detail_url, timeout=5) + if detail_resp.status_code == 200: + detail = detail_resp.json() + vhp_platform = detail.get("instance", {}).get("vhp-platform", "").lower() + vhp_hosted = vhp_platform not in ("external", "independent", "") + except Exception: + pass + tool["vhp_hosted"] = vhp_hosted + + # Getting selected stages from the URL. + selected_stages = request.args.getlist("stage") + + # Filtering tools by selected stages. + if selected_stages: + tools = [tool for tool in tools if tool.get("stage") in selected_stages] + + # Getting all unique stages from the tools for the filter options. + stages = sorted(set(tool.get("stage") for tool in tools if tool.get("stage"))) + + # Forcing "Other" to be the last item in the list of stages. + if "Other" in stages: + stages.remove("Other") + stages.append("Other") + + # Filtering over the regulatory questions. + reg_questions = {v["label"]: k for k, v in REG_QUESTIONS.items()} + + selected_questions = request.args.getlist("reg_q") + + for question in selected_questions: + field = reg_questions.get(question) + if field: + tools = [ + tool for tool in tools if str(tool.get(field, "")).lower() == "true" + ] + + # Getting the search query from URL to add a search bar based on tool names. + search_query = request.args.get("search", "").strip().lower() + + # Filtering tools by search query. + if search_query: + tools = [ + tool + for tool in tools + if search_query in tool.get("service", "").lower() + ] + + return render_template( + "tools/tools.html", + tools=tools, + stages=stages, + selected_stages=selected_stages, + reg_questions=reg_questions, + selected_questions=selected_questions, + stage_explanations=STAGE_EXPLANATIONS, + reg_question_explanations=REG_QUESTION_EXPLANATIONS, + ) + + except Exception as e: + return f"Error processing service data: {e}", 500 + + +### New route to list methods (similar to the tools page) +@app.route("/methods") +@app.route("/methods/") +def methods(): + """Fetch methods_index.json from the cloud repo, normalize fields and render a methods list page.""" + url = "https://raw.githubusercontent.com/VHP4Safety/cloud/refs/heads/main/cap/methods_index.json" + response = requests.get(url) + + if response.status_code != 200: + return f"Error fetching methods list: {response.status_code}", 503 + + try: + methods = response.json() + methods = list(methods.values()) # convert dict to list + + # Normalize fields for the template and collect stages + stages_set = set() + normalized = [] + for m in methods: + norm = {} + norm["id"] = m.get("id", "") + # template expects 'service' and 'description' + norm["service"] = ( + m.get("method") + or m.get("method_name_content") + or m.get("method_name") + or "" + ) + norm["description"] = ( + m.get("method_description_content") or m.get("method_description") or "" + ) + # main_url used for method webpage (catalog page) + norm["main_url"] = m.get("catalog_webpage_url") or "no_url" + # interactive instance not present in methods index + norm["inst_url"] = m.get("inst_url") or "no_url" + # metadata md file not available in index; keep empty string + norm["meta_data"] = m.get("meta_data") or "" + # placeholder/no png + norm["png"] = None + # keep original raw data for potential details page + norm["raw"] = m + + # collect stages (split comma-separated values) + stage_field = (m.get("vhp4safety_workflow_stage_content") or "").strip() + if stage_field: + for part in [s.strip() for s in stage_field.split(",")]: + if part: + stages_set.add(part) + + normalized.append(norm) + + # Apply search and filters similar to /tools + selected_stages = request.args.getlist("stage") + selected_questions = request.args.getlist("reg_q") + search_query = request.args.get("search", "").strip().lower() + + methods_filtered = normalized + + if selected_stages: + methods_filtered = [ + m + for m in methods_filtered + if any( + s + in ( + (m["raw"].get("vhp4safety_workflow_stage_content") or "").split( + "," + ) + ) + for s in selected_stages + ) + ] + + # Filter by regulatory questions if provided (REG_QUESTIONS keys map to internal fields) + reg_questions = {v["label"]: k for k, v in REG_QUESTIONS.items()} + if selected_questions: + for question in selected_questions: + field = reg_questions.get(question) + if field: + methods_filtered = [ + m + for m in methods_filtered + if str(m["raw"].get(field, "")).lower() == "true" + ] + + if search_query: + methods_filtered = [ + m + for m in methods_filtered + if search_query in m.get("service", "").lower() + ] + + stages = sorted(stages_set) + if "Other" in stages: + stages.remove("Other") + stages.append("Other") + + # Pass everything the template expects + return render_template( + "methods/methods.html", + methods=methods_filtered, + stages=stages, + selected_stages=selected_stages, + reg_questions=reg_questions, + selected_questions=selected_questions, + stage_explanations=STAGE_EXPLANATIONS, + reg_question_explanations=REG_QUESTION_EXPLANATIONS, + ) + + except Exception as e: + return f"Error processing methods data: {e}", 500 + + +@app.route("/methods/") +def method_page(methodid): + """Render a single method page using templates/methods/method.html + Method details are taken from methods_index.json (keyed by method id). + """ + try: + methods = get_json_dict(METHODS_URL) + # methods_index.json is a dict keyed by method id + if methodid not in methods: + abort(404) + method_details = methods[methodid] + except Exception as e: + return f"Error processing methods data: {e}", 500 + + # Try to load the full method JSON from the docs/methods folder (raw github) + method_json = None + # URL-encode the filename part to be safe + encoded = urllib.parse.quote(methodid, safe="") + raw_url = ( + "https://raw.githubusercontent.com/VHP4Safety/cloud/refs/heads/main/docs/methods/" + + f"{encoded}.json" + ) + try: + r = requests.get(raw_url, timeout=5) + if r.status_code == 200: + method_json = r.json() + else: + # fall back to using the index entry as minimal data + method_json = method_details + except Exception as exc: + # on any error, fall back to index entry + method_json = method_details + + # Pass both to the template: some templates expect method_json, others method_details + return render_template( + "methods/method.html", + method=method_details, + method_details=method_details, + method_json=method_json, + ) + + +@app.route("/tools/") +def tool_page(toolname): + # get the tools metadata: + try: + tools = get_json_dict_service(SERVICES_URL) + tools = dict(tools) + # Geting the service_list.json in the dictionary format. + # Converting the dictionary to a list object. + except Exception as e: + return f"Error processing service data: {e}", 500 + + # Map toolname to the correct JSON file in the new tool folder + if toolname not in tools: + abort(404) + + # get the tools metadata: + url = "https://cloud.vhp4safety.nl/service/" + toolname + ".json" + response = requests.get(url) + + if response.status_code != 200: + return f"Error fetching service list: {response.status_code}", 503 + + try: + tool_details = response.json() + tool_details = dict(tool_details) + # Geting the service_list.json in the dictionary format. + # Converting the dictionary to a list object. + except Exception as e: + return f"Error processing service data: {e}", 500 + + # Pass the json filename to the template (for JS to pick up) + return render_template( + "tools/tool.html", tool_json=tools[toolname], tool_details=tool_details + ) + + +################################################################################ +### Pages under 'Process Flow' + + +# General Safety Assessment Workflow page +@app.route("/Safety_Assessment_Workflow") +def SafetyAssessmentWorkflow(): + return render_template("Safety_Assessment_Workflow.html") + + +################################################################################ +### Pages under 'Case Studies' + + +# General case studies page +@app.route("/casestudies") +def workflows(): + return render_template("case_studies/casestudies.html") + + +# Individual case study page, dynamically filled based on URL +@app.route("/casestudies/", defaults={"step": ""}) +@app.route("/casestudies//") +@app.route("/casestudies///") +# additional routes are parsed client side via js to allow smooth animation +def casestudy(case:str="", question:str="", step:str=""): + if case not in CASESTUDIES: + abort(404) + # JS will handle steps via the URL + return render_template("case_studies/casestudy.html", case=case) + + +@app.route("/workflow/") +def show(workflow): + try: + return render_template( + f"case_studies/parkinson/workflows/{workflow}_workflow.html" + ) + except TemplateNotFound: + abort(404) + + +################################################################################ +### Pages related to chemical compounds + + +def is_valid_qid(qid): + return re.fullmatch(r"Q\d+", qid) is not None + + +@app.route("/compound/") +def show_compound(cwid): + try: + return render_template(f"compound.html", cwid=cwid) + except TemplateNotFound: + abort(404) + + +@app.route("/get_compound_properties/") +def show_compounds_properties_as_json(cwid): + if not is_valid_qid(cwid): + return jsonify({"error": "Invalid compound identifier"}), 400 + compoundwikiEP = "https://compoundcloud.wikibase.cloud/query/sparql" + sparqlquery = ( + "PREFIX wd: \n" + "PREFIX wdt: \n\n" + "SELECT ?cmp ?cmpLabel ?formula ?mass ?inchi ?inchiKey ?SMILES WHERE {\n" + " VALUES ?cmp { wd:" + cwid + " }\n" + " ?cmp wdt:P9 ?inchi ;\n" + " wdt:P10 ?inchiKey .\n" + " OPTIONAL { ?cmp wdt:P2 ?mass }\n" + " OPTIONAL { ?cmp wdt:P3 ?formula }\n" + " OPTIONAL { ?cmp wdt:P7 ?chiralSMILES }\n" + " OPTIONAL { ?cmp wdt:P12 ?nonchiralSMILES }\n" + ' BIND (COALESCE(IF(BOUND(?chiralSMILES), ?chiralSMILES, 1/0), IF(BOUND(?nonchiralSMILES), ?nonchiralSMILES, 1/0), "") AS ?SMILES)\n' + ' SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }\n' + "}" + ) + try: + compound_dat = wbi_helpers.execute_sparql_query( + sparqlquery, endpoint=compoundwikiEP + ) + except Exception as e: + return jsonify({"error": str(e)}), 500 + if not bool(compound_dat): + return jsonify({"error": "No data found"}), 404 + compound_dat = compound_dat["results"]["bindings"][0] + # return jsonify(compound_dat); + compound_list = [ + { + "wcid": compound_dat["cmp"]["value"], + "label": compound_dat["cmpLabel"]["value"], + "inchi": compound_dat["inchi"]["value"], + "inchikey": compound_dat["inchiKey"]["value"], + "SMILES": compound_dat["SMILES"]["value"], + "formula": compound_dat["formula"]["value"], + "mass": compound_dat["mass"]["value"], + } + ] + return jsonify(compound_list), 200 + + +@app.route("/get_compound_identifiers/") +def show_compounds_identifiers_as_json(cwid): + if not is_valid_qid(cwid): + return jsonify({"error": "Invalid compound identifier"}), 400 + compoundwikiEP = "https://compoundcloud.wikibase.cloud/query/sparql" + sparqlquery = ( + "PREFIX wd: \n" + "PREFIX wdt: \n\n" + "SELECT DISTINCT ?propertyLabel ?value ?formatterURL\n" + "WHERE {\n" + " VALUES ?property { wd:P13 wd:P22 wd:P23 wd:P26 wd:P27 wd:P28 wd:P36 wd:P41 wd:P43 wd:P44 wd:P45 }\n" + " ?property wikibase:directClaim ?valueProp .\n" + " OPTIONAL { wd:" + cwid + " ?valueProp ?value }\n" + " OPTIONAL { ?property wdt:P6 ?formatterURL }\n" + ' SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }\n' + "}" + ) + try: + compound_dat = wbi_helpers.execute_sparql_query( + sparqlquery, endpoint=compoundwikiEP + ) + except Exception as e: + return jsonify({"error": str(e)}), 500 + if len(compound_dat["results"]["bindings"]) == 0: + return jsonify({"error": "No data found"}), 404 + compound_dat = compound_dat["results"]["bindings"] + # return jsonify(compound_dat) + + compound_list = [] + for expProp in compound_dat: + if "value" in expProp: + compound_list.append( + { + "propertyLabel": expProp["propertyLabel"]["value"], + "value": expProp["value"]["value"], + "formatterURL": expProp["formatterURL"]["value"], + } + ) + else: + compound_list.append( + { + "propertyLabel": expProp["propertyLabel"]["value"], + "value": "", + "formatterURL": "", + } + ) + return jsonify(compound_list), 200 + + +@app.route("/get_compound_toxicology/") +def show_compounds_toxicology_as_json(cwid): + if not is_valid_qid(cwid): + return jsonify({"error": "Invalid compound identifier"}), 400 + compoundwikiEP = "https://compoundcloud.wikibase.cloud/query/sparql" + sparqlquery = ( + "PREFIX wd: \n" + "PREFIX wdt: \n\n" + "SELECT DISTINCT ?propertyLabel ?value ?formatterURL\n" + "WHERE {\n" + " VALUES ?property { wd:P17 wd:P19 wd:P4 }\n" + " ?property wikibase:directClaim ?valueProp .\n" + " OPTIONAL { wd:" + cwid + " ?valueProp ?value }\n" + " OPTIONAL { ?property wdt:P6 ?formatterURL }\n" + ' SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }\n' + "}" + ) + try: + compound_dat = wbi_helpers.execute_sparql_query( + sparqlquery, endpoint=compoundwikiEP + ) + except Exception as e: + return jsonify({"error": str(e)}), 500 + if len(compound_dat["results"]["bindings"]) == 0: + return jsonify({"error": "No data found"}), 404 + compound_dat = compound_dat["results"]["bindings"] + # return jsonify(compound_dat) + + compound_list = [] + for expProp in compound_dat: + print(expProp) + if "value" in expProp: + compound_list.append( + { + "propertyLabel": expProp["propertyLabel"]["value"], + "value": expProp["value"]["value"], + } + ) + else: + compound_list.append( + {"propertyLabel": expProp["propertyLabel"]["value"], "value": ""} + ) + return jsonify(compound_list), 200 + + +@app.route("/get_compound_expdata/") +def show_compounds_expdata_as_json(cwid): + if not is_valid_qid(cwid): + return jsonify({"error": "Invalid compound identifier"}), 400 + compoundwikiEP = "https://compoundcloud.wikibase.cloud/query/sparql" + sparqlquery = ( + "PREFIX wd: \n" + "PREFIX wdt: \n" + "PREFIX wid: \n" + "PREFIX widt: \n" + "PREFIX prov: \n\n" + "SELECT ?qid WHERE {\n" + " wd:P5 wikibase:directClaim ?identifierProp .\n" + " wd:" + cwid + " ?identifierProp ?wikidata .\n" + ' BIND (iri(CONCAT("http://www.wikidata.org/entity/", ?wikidata)) AS ?qid)\n' + "}" + ) + try: + compound_dat = wbi_helpers.execute_sparql_query( + sparqlquery, endpoint=compoundwikiEP + ) + except Exception as e: + return jsonify({"error": str(e)}), 500 + if not bool(compound_dat): + return jsonify({"error": "No data found"}), 404 + if len(compound_dat["results"]["bindings"]) == 0: + return jsonify({"error": "No data found"}), 404 + compound_dat = compound_dat["results"]["bindings"][0] + qid = compound_dat["qid"]["value"] + # the next query may be affected by https://github.com/ad-freiburg/qlever-control/issues/187 + sparqlquery = ( + "PREFIX wd: \n" + "PREFIX wdt: \n" + "PREFIX prov: \n" + "PREFIX rdfs: \n" + "PREFIX pr: \n" + "PREFIX wikibase: \n\n" + "SELECT DISTINCT ?propEntityLabel ?value ?unitsLabel ?source ?doi ?statement\n" + "WHERE {\n" + " <" + qid + "> ?propp ?statement .\n" + " ?statement a wikibase:BestRank ;\n" + " ?proppsv [ wikibase:quantityAmount ?value ; wikibase:quantityUnit ?units ] .\n" + " #OPTIONAL { ?statement prov:wasDerivedFrom/pr:P248 ?sourceTmp . OPTIONAL { ?sourceTmp wdt:P356 ?doiTmp . } }\n" + " ?property wikibase:claim ?propp ; wikibase:statementValue ?proppsv ; wdt:P1629 ?propEntity ; wdt:P31 wd:Q21077852 .\n" + " ?propEntity @en@rdfs:label ?propEntityLabel .\n" + " ?units @en@rdfs:label ?unitsLabel .\n" + ' BIND (COALESCE(IF(BOUND(?sourceTmp), ?sourceTmp, 1/0), "") AS ?source)\n' + ' BIND (COALESCE(IF(BOUND(?doiTmp), ?doiTmp, 1/0), "") AS ?doi)\n' + "}" + ) + # return sparqlquery + try: + sparqlqueryURL = ( + "https://qlever.cs.uni-freiburg.de/api/wikidata?format=json&query=" + + urllib.parse.quote_plus(sparqlquery) + ) + # return sparqlqueryURL + compound_dat = requests.get(sparqlqueryURL) + # return json.loads(compound_dat.content) + except Exception as e: + return jsonify({"error": str(e)}), 500 + if not bool(compound_dat): + return jsonify({"error": "No data found"}), 404 + compound_dat = json.loads(compound_dat.content)["results"]["bindings"] + # return jsonify(compound_dat) + compound_list = [] + for expProp in compound_dat: + # return jsonify(expProp) + compound_list.append( + { + "propEntityLabel": expProp["propEntityLabel"]["value"], + "value": expProp["value"]["value"], + "unitsLabel": expProp["unitsLabel"]["value"], + "source": expProp["source"]["value"], + "doi": expProp["doi"]["value"], + "seeAlso": expProp["statement"]["value"], + } + ) + return jsonify(compound_list), 200 + + +################################################################################ +### Pages under 'Legal' +@app.route("/legal/terms_of_service") +def terms_of_service(): + return render_template("legal/terms_of_service.html") + + +@app.route("/legal/privacypolicy") +def privacy_policy(): + return render_template("legal/privacypolicy.html") + + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5050, debug=True) diff --git a/exploreourwork.html b/exploreourwork.html deleted file mode 100644 index ff83087..0000000 --- a/exploreourwork.html +++ /dev/null @@ -1,254 +0,0 @@ -{% extends "base.html" %} {% block content %} - - - - - - - - -
- -
- - -
-
-
-

Explore our work

-

A comprehensive set of work practices implemented in the VHP4Safety project

-
-
-
- - - -
-
- - - - - -
-
-
-

The Virtual Human Platform was developed in the VHP4Safety project. Here you can find more information about the VHP4Safety project.

-
- - - -
-

- -

-
-
-

VHP4Safety is a Dutch national project focused on developing the Virtual Human Platform (VHP) to transform safety assessment of chemicals and pharmaceuticals. The project integrates human-relevant data, innovative in vitro models, and in silico tools to enable transparent risk assessment based on human biology. VHP4Safety combines these innovations into structures workflows that support expert decision making.

-
-
-
- - - -
-

- -

-
-
-

Traditional safety testing relies on animal studies, which raise ethical concerns and often fail to predict human responses accurately. New Approach Methodologies (NAMs) and data science, including AI, offer new opportunities to perform human-relevant animal-free safety assessment.

-

VHP4Safety is developed in co-creation with risk assessors, regulators, industry, and societal stakeholders, to ensure usability and regulatory relevance. The consortium aims to establish a reliable, transparent, and sustainable platform for safety assessment, setting a new standard for human-relevant risk assessment.

-
-
-
- - - -
-

- -

-
-
-
-
-
-
- - - -
-

- -

-
-
-

The project is organised into three research lines:

-
  1. Building the VHP: Developing the ICT infrastructure, computational models, and user interface.
  2. -
  3. Feeding the VHP: Generating human-based data using in vitro models..
  4. -
  5. Implementing the VHP: Ensuring accessibility, usability, and acceptance through education, training, and stakeholder engagement.
  6. -
-
- Project structure diagram -
- -
-
-
- - - -
-

- -

-
-
-

The VHP4Safety project was funded by the Dutch Research Council (NWO) through the ‘Netherlands Research Agenda: Research on Routes by Consortia’ (NWA-ORC 1292.19.272). With a 9.9 million euro grant from NWO and additional contributions from foundations, government bodies, and private sector organizations, the project’s total funding amounted to 11.2 million euros.

-
-
-
- -
-
-
- - - - -
-
-

Teaser text to be included later

-
- - - -
-

- -

-
-
-

Solving complex integration challenges and transforming ideas into practical solutions requires focused, hands-on teamwork. VHP4Safety used Hackathons to accelerate innovation and foster rapid progress across disciplines.

-

Hackathons were organized in VHP4Safety several times a year. Hackathons were organized as short, intensive events where consortium partners worked side-by-side to address specific technical, scientific, or regulatory questions. In multidisciplinary teams, participants developed prototypes, integrated new data and tools, and tackled the VHP4Safety regulatory case studies. Preparation included prioritizing urgent topics that could only be addressed interdisciplinary, using the diversity of expertise within the VHP4Safety consortium.

-

Hackathons delivered working prototypes, integrated platform components, and direct feedback from users. Unfinished tasks were tracked for future sprints, keeping momentum high. These events not only speeded up development of the Virtual Human Platform, but also strengthened collaboration and ensured that the platform continuously evolved to meet user needs.

-
-
-
- - - -
-

- -

-
-
-

To develop a future-proof platform for safety assessment for chemicals and pharmaceuticals without the need for animal testing, VHP4Safety organized Designathons as a way of interdisciplinary co-creation. Bringing together expertise from academia, industry, regulatory bodies, and societal organizations ensures that the Virtual Human Platform (VHP) is robust, relevant, and widely supported.

-

During the course of the project, VHP4Safety organized biannual Designathons. These were interactive, consortium-wide workshops where all partners collaborated intensively. During these sessions, participants co-designed the platform’s structure and workflows, aligned on shared goals, and discussed the needs and perspectives of different stakeholders. Special task forces were established to connect the projects research lines, work packages and disciplines, while creative exercises helped shape a common vision for the VHP.

-

Designathons resulted in actionable workflow designs, a unified vision, and prioritized development steps for the platform. They promoted building the VHP4Safety community, thereby fostering open dialogue. Designathons helped to ensure that the Virtual Human Platform is a true product of its stakeholders. ready to meet the real-world needs of next-generation safety assessment.

-
-
-
- - - -
-

- -

-
-
-

The interdisciplinary research in VHP4Safety demands flexibility and continuous adaptation. Traditional project management often lacks the agility needed to respond to fast-changing scientific insights and evolving stakeholder needs. To address these challenges, VHP4Safety adopted the Scrum approach, ensuring the project remains dynamic and user-focused.

-

TInspired by the Scrum framework and agile working method, VHP4Safety worked in short, iterative cycles known as sprints. The team held weekly scrum meetings to coordinate efforts, set priorities, and quickly resolve obstacles. Every three weeks, sprint reviews enabled the team to evaluate progress and gather feedback, making it possible to adjust plans when necessary. Clearly defined roles, such as Product Owner and Scrum Master, provided the VHP4Safety agile working method with structure and clarity. The collaborative hackathons and designathons that were organised in VHP4Safety were integrated into the Scrum workflow, promoting co-creation, interdisciplinary alignment, and responsiveness to new developments.

-

The Scrum approach has significantly improved transparency, teamwork, and stakeholder engagement within VHP4Safety. It allowed for rapid integration of technological innovations and ensured that user feedback could be incorporated throughout the project. Team members experienced greater ownership and satisfaction, while the platform evolved iteratively to meet real needs of its end-users.

-
-
-
- - - -
-

- -

-
-
-

Constructive technology assessment is a way of researching into the design, desirability, costs and impacts of technologies. People interested, affected and influenced by a technology are put at the centre of definition, development and implementation and their active involvement is required from the start.

-

The virtual human platform has been developed with the contribution of multiple stakeholders from academia, industry and regulation. Through designathons and hackathons the perspectives of these stakeholders have been actively involved. Some of these stakeholders have also been addressed as potential users of the platform.

-

A matrix with 9 potential user profiles that could be served by the platform has been defined by focusing on expert users. In addition, expected transformations of the field through the implementation of the platform are proposed. Industry, regulators, and academia each have different needs from a shared platform. Meeting those needs collectively may enable a field-wide shift away from traditional animal testing toward New Approach Methodologies.

-
- Image showcasing a mateix of 9 user profiles -
-
-
-
- -
-
-
- - - - -
-
-

Teaser text to be included later

-
- - - -
-

- -

-
-
-

To add list of publications

-
-
-
- - -
-
-
- -
- -
-
- - -
-{% endblock %} diff --git a/impact.html b/impact.html deleted file mode 100644 index 243ed4d..0000000 --- a/impact.html +++ /dev/null @@ -1,273 +0,0 @@ -{% extends "base.html" %} {% block content %} - - - - - - - - -
- -
- - -
-
-
-

Impact

-

Strategies for future use of the Virtual Human Platform focusing on innovation, acceptance, and impact creation

-
-
-
- - - -
-
- - - - - -
-
-
-

In the VHP we identified five key routes to impact through which research and development projects on New Approach Methodologies (NAMs) pursue societal impact. Each route reflects a set of impact activities that target specific audiences.

-
- - - -
-

- -

-
-
-

The most prominent route is changing policy and regulation, targeting risk assessors, policymakers, and regulators. Community and capacity building focus on training and education to support wider adoption and use of NAMs. Advancing scientific development aims to strengthen the NAM ecosystem through coordination, infrastructure, and harmonization. In addition, projects engage in commercialization and industrial partnerships to bring innovations into industrial practice. Mobilizing civil society, though least common, seeks to involve the general public and civil society organizations.

-

Typically, projects organize11–15 activities across multiple routes to impact. To maximize impact, however, projects should dedicate their efforts to specific routes, as time and capacities are often limited in projects. Moreover, projects should be encouraged to move beyond one-way dissemination toward two-way engagement, fostering active exchange with stakeholders—an area where many initiatives still have room to grow.

-
-
-
- - - - -
-

- -

-
-
-

Place for diagram

-
-
-
- - -
-
-
- - - - -
-
-

Teaser text to be included later

-
- - - -
-

- -

-
-
-

Moving towards human-relevant safety testing of chemicals and pharmaceuticals without the use of animals requires much more than scientific and technological innovation alone. Within the VHP4Safety project, an innovation system approach was developed in collaboration between innovation scholars and toxicologists to identify all the key processes needed to achieve this transition. The framework combines an established implementation curve for New Approach Methodologies (NAMs) with insights from innovation system theory. It can be used to assess for a specific NAM modality, sector or application context where efforts are currently concentrated, where gaps exist and where coordinated action is needed to accelerate the transition to animal-free and human relevant safety assessment.

-
-
-
- - - - -
-

- -

-
-
-

The result is the framework visualised in the figure below. The framework maps seven interconnected key processes that together shape progress towards human-relevant and animal-free safety assessment. Three of these processes being knowledge development, knowledge diffusion, and market formation align with the phases of the established implementation curve for NAMs. Four additional processes that the implementation curve does not capture are also included: resource mobilisation (funding, talent, and infrastructure), entrepreneurial experimentation (private and public actors pioneering new approaches and business models), legitimacy creation (building trust and shifting belief systems among stakeholders and the wider public), and providing directionality (formulating missions, policy goals, and regulatory requirements that guide collective action). Crucially, the framework presents these processes not as a linear sequence but as an interconnected web, in which positive feedback loops between processes can accelerate the transition, while bottlenecks in one area can hamper progress across other processes.

- -
- Innovation system framework diagram -
-
-
-
- - - - -
-

- -

-
-
-

The framework is designed to be used in workshop settings, bringing together a wide range of stakeholders to discuss both the structure and the functioning of the innovation system. To facilitate this, a masterclass was developed consisting of four interactive activities:

-
    -
  1. Mission specification and problem-solution diagnosis: to specify a mission in relation to human relevant safety assessment and to discuss which problem(s) the mission aims to solve and which (technical) solutions are proposed. This defines the scope for framework application in step 2-4.
  2. -
  3. Innovation system structure: to identify relevant actors, networks, and institutions (hard laws and regulations and softer norms) and to discuss the influence and interests of stakeholders in the identified mission.
  4. -
  5. Innovation system functioning: to assess the functioning of the innovation system based on the seven key processes, scored on a scale from 1 (function performs poorly and is hindering) to 5 (function performs well and is driving).
  6. -
  7. Towards action: to discuss activities that can contribute to strengthening the functioning of the innovation system and specifically how stakeholders participating in the workshop can contribute to realising progress towards human-relevant and animal-free safety assessment.
  8. -
-
-
-
- - - - -
-

- -

-
-
-

The framework has been applied to several cases in the VHP4Safety project including the three case-studies in the project. During one of the designathons, project participants and stakeholders also worked on their own cases ranging from very general missions (transition to human relevant chemical risk assesment) to very specific ones (e.g., serum-free medial compositions). Outside the VHP4Safety project, the framework has also been applied in the AFARA project which focuses on the identification of endocrine disrupting chemicals in regulatory contexts. The masterclass was also presented to the European Commission team developing the EU roadmap towards the phasing out of animal testing in chemical safety assessment.

-
-
-
- - - -
-
-
- - - - -
-
-

Teaser text to be included later

-
- - - -
-

- -

-
-
-

To be added later.

-
-
-
- - - -
-
-
- - - - -
-
-

Teaser text to be included later

-
- - - -
-

- -

-
-
-

To be added later.

-
-
-
- - - -
-
-
- - - - -
-
-

Teaser text to be included later

-
- - - -
-

- -

-
-
-

To add later

-
-
-
- - -
-
-
- -
- -
-
- - -
-{% endblock %} \ No newline at end of file diff --git a/static/images/implementation/Figure_User_profiles.png b/static/images/implementation/Figure_User_profiles.png deleted file mode 100644 index 73062ab30823ed7e318487723d0df205de04a557..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53734 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 HJ7E8<&gAmW*!luIUZO?U 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

9s|?s5aSARTAEpik=m~Fi4OXOT*|YFVB)( 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 P00000NkvXXu0mjf%%ClU diff --git a/static/images/implementation/Innovation system framework.png b/static/images/implementation/Innovation system framework.png deleted file mode 100644 index 085fce0f541caf7c970b817886e0f60d0c5d393c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129755 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
2{WM@0Zc=e2zMlbouhCoPX#!886 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 - - - - - - -

- -
- - -
-
-
-

Training

-

Training and education to master the Virtual Human Platform and the principles of NAMs in human-based safety assessment

-
-
-
- - - -
-
- - - - - -
-
-
-

Teaser text to be included later

-
- - - -
-

- -

-
-
-

Content to be added

-
-
-
- - -
-
-
- - - - -
-
-

Teaser text to be included later

-
- - - -
-

- -

-
-
-

To be added later.

-
-
-
- - - -
-
-
- - - - -
-
-

Teaser text to be included later

-
- - - -
-

- -

-
-
-

To add later

-
-
-
- - -
-
-
- -
- -
-
- - -
-{% endblock %} \ No newline at end of file