Example — Trust scorecard¶
Category: Small (no AI) · Script: examples/small/03_trust_score.py
Minimal (2 lines): examples/minimal/trust.py
Curation trust check for BIOMD0000000206.
How to run¶
pip install -e "src/praisonai-bio"
python examples/small/03_trust_score.py
Needs: Internet.
Tested output¶
Live capture from ./scripts/capture_example_outputs.sh.
Click to view full output
{
"model_id": "BIOMD0000000206",
"trust_score": 0,
"reasons": [],
"metadata": "\n\n\n\n<!doctype html>\n\n\n\n\n\n\n\n\n\n\n\n\n<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->\n<!--[if lt IE 7]> <html class=\"no-js ie6 oldie\" lang=\"en\"> <![endif]-->\n<!--[if IE 7]> <html class=\"no-js ie7 oldie\" lang=\"en\"> <![endif]-->\n<!--[if IE 8]> <html class=\"no-js ie8 oldie\" lang=\"en\"> <![endif]-->\n<!-- Consider adding an manifest.appcache: h5bp.com/d/Offline -->\n<!--[if gt IE 8]> <html class=\"no-js\" lang=\"en\"> <![endif]-->\n\n<html lang=\"en\">\n<head>\n \n\n\n\n\n\n\n<meta charset=\"utf-8\">\n<!-- Use the .htaccess and remove these lines to avoid edge case issues.\n More info: h5bp.com/b/378 -->\n<!-- Not yet implemented -->\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n<!-- Describe what this page is about -->\n<meta name=\"description\" content=\"BioModels is a repository of freely-available mathematical models of biological and biomedical systems. It hosts a vast selection of physiologically and pharmaceutically\nrelevant mechanistic models in standard formats.\"/>\n<meta name=\"keywords\" content=\"BioModels Database, biomodels, systems biology, bioinformatics, computational\n modelling, systems modelling, model repository, model database, SBML, PharmML, COMBINE Archive, OMEX,\n public domain\">\n<meta name=\"author\" content=\"BioModels\"/>\n<meta name=\"google\" content=\"notranslate\"/>\n<meta name=\"google-site-verification\" content=\"Lw3ylc1DHWxe6umaxo3tA-Dm-QWs5YsG1b1EXIhNmPw\"/>\n<meta name=\"ebi:masthead-color\" content=\"#254146\">\n<meta name=\"ebi:masthead-image\" content=\"//ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/images/backgrounds/embl-ebi-background.jpg\"/>\n\n<!-- Mobile viewport optimized: j.mp/bplateviewport -->\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n\n<!-- Place favicon.ico and apple-touch-icon.png in the root directory: mathiasbynens.be/notes/touch-icons -->\n\n<link rel=\"apple-touch-icon\" sizes=\"57x57\" href=\"https://www.biomodels.org/images/biomodels/apple-icon-57x57.png\">\n<link rel=\"apple-touch-icon\" sizes=\"60x60\" href=\"https://www.biomodels.org/images/biomodels/apple-icon-60x60.png\">\n<link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"https://www.biomodels.org/images/biomodels/apple-icon-72x72.png\">\n<link rel=\"apple-touch-icon\" sizes=\"76x76\" href=\"https://www.biomodels.org/images/biomodels/apple-icon-76x76.png\">\n<link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"https://www.biomodels.org/images/biomodels/apple-icon-114x114.png\">\n<link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"https://www.biomodels.org/images/biomodels/apple-icon-120x120.png\">\n<link rel=\"apple-touch-icon\" sizes=\"144x144\" href=\"https://www.biomodels.org/images/biomodels/apple-icon-144x144.png\">\n<link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"https://www.biomodels.org/images/biomodels/apple-icon-152x152.png\">\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"https://www.biomodels.org/images/biomodels/apple-icon-180x180.png\">\n<link rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"https://www.biomodels.org/images/biomodels/android-icon-192x192.png\">\n<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://www.biomodels.org/images/biomodels/favicon-32x32.png\">\n<link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"https://www.biomodels.org/images/biomodels/favicon-96x96.png\">\n<link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://www.biomodels.org/images/biomodels/favicon-16x16.png\">\n<link rel=\"manifest\" href=\"https://www.biomodels.org/images/biomodels/manifest.json\">\n<meta name=\"msapplication-TileColor\" content=\"#ffffff\">\n<meta name=\"msapplication-TileImage\" content=\"https://www.biomodels.org/images/biomodels/ms-icon-144x144.png\">\n<meta name=\"theme-color\" content=\"#ffffff\">\n\n<!-- If you link to any other sites frequently, consider optimising performance with a DNS prefetch -->\n<link rel=\"dns-prefetch\" href=\"https://ebi.emblstatic.net/\" />\n<!-- CSS: implied media=all -->\n<!-- CSS concatenated and minified via ant build script -->\n<link rel=\"stylesheet\" type=\"text/css\"\n href=\"https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/css/ebi-global.css\"\n media=\"none\" onload=\"if(media!=='all') media='all'\">\n<link rel=\"stylesheet\" type=\"text/css\"\n href=\"https://ebi.emblstatic.net/web_guidelines/EBI-Icon-fonts/v1.3/fonts.css\"\n media=\"none\" onload=\"if(media!=='all') media='all'\">\n\n<!-- you can replace this with [projectname]-colours.css. See http://frontier.ebi.ac.uk/web/style/colour\nfor details of how to do this -->\n<style>\n /* You have the option of setting a maximum width for your page, and making sure everything is centered */\n body {\n margin: 2px 5px auto;\n }\n li.divider {\n border-top: 1px solid #999;\n }\n\n #local-masthead nav ul.menu li:hover {\n background: rgb(0,124,130);\n }\n</style>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"/css/common.css\">\n<!-- end CSS-->\n<script src=\"https://code.jquery.com/jquery-1.11.1.min.js\"\n integrity=\"sha256-VAvG3sHdS5LqTT+5A/aeq/bZGa/Uj04xKxY8KM/w9EE=\" crossorigin=\"anonymous\"></script>\n\n<script src=\"https://code.jquery.com/ui/1.11.4/jquery-ui.min.js\"\n integrity=\"sha256-xNjb53/rY+WmG+4L6tTl9m6PpqknWZvRt0rO1SRnJzw=\" crossorigin=\"anonymous\"></script>\n\n<title>Login | BioModels</title>\n\n <script type=\"text/javascript\">\r\n\n $.appName = \"biomodels\";\n $.serverUrl = \"https://www.biomodels.org\";\n var helpHidden=1;\n\n \n var helpWidth=-1;\n var maxWidth=-1;\n var maxHelpWidth=800;\n var minHelpWidth=50;\n var stepWidth=30;\n var syncResize=0;\n function adjustWidth(newWidth) {\n if (syncResize==1) {\n var delta= helpWidth - newWidth;\n var mainWidth=$(\"#mainframe\" ).width();\n if (maxWidth==-1) {\n maxWidth=mainWidth;\n }\n if (maxWidth<(mainWidth+delta)) {\n mainWidth=maxWidth;\n }\n else {\n mainWidth+=delta;\n }\n $( \"#mainframe\" ).width(mainWidth);\n helpWidth=newWidth;\n }\n }\n\n function hideHelp() {\n $( \"#helpPanel\" ).removeClass(\"helpHeightWorkaround\")\n adjustWidth(0);\n $( \"#helpPanel\" ).hide();\n helpHidden=1;\n helpWidth=-1;\n $('#toggleHelp').text(\"More about this page\");\n $('#toggleHelp').attr(\"title\", \"Access help for this page\");\n }\n\n function showHelp() {\n $( \"#helpPanel\" ).addClass(\"helpHeightWorkaround\")\n helpWidth=-1;\n $(\"html, body\").animate({ scrollTop: 0 }, \"medium\");\n $( \"#helpPanel\" ).width(800);\n $( \"#helpPanel\" ).show();\n adjustWidth(800);\n $( \"#helpPanel\" ).position({\n my: \"right-1 bottom\",\n at: \"right-1 bottom\",\n of: \".main-menu\"\n });\n helpHidden=0;\n $('#toggleHelp').text(\"Hide help\");\n $('#toggleHelp').attr(\"title\", \"Hide help\");\n }\n var isDragged=false;\n \n $(function() {\n \n \n $(\"#helpPanel\").resizable({\n handles: 'n,e,s,w',\n maxWidth: maxHelpWidth,\n animate: true,\n resize: function( event, ui ) {\n if (helpWidth==-1) {\n helpWidth=ui.originalSize.width;\n }\n adjustWidth(ui.size.width);\n }\n });\n $( \"#helpPanel\").draggable({ cursor: \"move\",\n revert: false,\n containment: \"body\",\n start: function() {\n isDragged=true;\n },\n stop: function( event, ui ) {\n isDragged=false;\n }\n });\n $( \"#helpPanel\" ).hide();\n\n $(\"#toolbar\").mouseleave(function() {\n if (isDragged) {\n $( \"#helpPanel\" ).draggable( \"disable\" );\n $( \"#helpPanel\" ).draggable( \"enable\" );\n }\n })\n\n\n $( \"#expand\" ).button({\n text: false,\n icons: {\n primary: \"ui-icon-circle-plus\"\n }\n }).click(function() {\n helpWidth=$(\"#helpPanel\" ).width();\n if (maxHelpWidth<(helpWidth+stepWidth)) {\n helpWidth=maxHelpWidth;\n }\n else {\n helpWidth+=stepWidth;\n }\n var windowRight = document.body.getBoundingClientRect ().right\n console.log(windowRight);\n $( \"#helpPanel\" ).width(helpWidth);\n var el= document.getElementById (\"helpPanel\");\n var helpRight = el.getBoundingClientRect ().right\n if (helpRight > windowRight) {\n var offset = helpRight - windowRight + 10\n $('#helpPanel').animate({\n 'marginLeft' : \"-=\" + offset + \"px\"\n });\n }\n\n });\n $( \"#contract\" ).button({\n text: false,\n icons: {\n primary: \"ui-icon-circle-minus\"\n }\n }).click(function() {\n helpWidth=$(\"#helpPanel\" ).width();\n if (minHelpWidth>helpWidth-stepWidth) {\n helpWidth=minHelpWidth\n }\n else {\n helpWidth-=stepWidth;\n }\n $( \"#helpPanel\" ).width(helpWidth);\n var addedPercentage = (helpWidth - 400) / 400\n var basic = 99+addedPercentage;\n $( \"#helpFrame\" ).width(basic+\"%\");\n });\n $( \"#close\" ).button({\n text: false,\n icons: {\n primary: \"ui-icon-circle-close\"\n }\n }).click(function() {\n hideHelp();\n });\n\n $( \"#snap\" ).button({\n text: false,\n icons: {\n primary: \"ui-icon-arrowrefresh-1-e\"\n }\n }).click(function() {\n hideHelp();\n showHelp();\n });\n $( \"#outlink\" ).button({\n text: false,\n icons: {\n primary: \"ui-icon-extlink\"\n }\n }).click(function() {\n hideHelp();\n window.open('https://www.biomodels.org/user-guide/login.html','_blank');\n });\n $('#toggleHelp').click(function(event) {\n event.preventDefault();\n if (helpHidden==1) {\n showHelp();\n }\n else {\n hideHelp();\n }\n });\n \n });\n \r\n</script>\r\n\n <script src=\"/js/jummp.js\" type=\"text/javascript\"></script>\r\n\n <script src=\"/js/notification.js\" type=\"text/javascript\"></script>\r\n\n\n <link rel=\"stylesheet\" href=\"/css/notification.css\" />\n <link rel=\"stylesheet\" href=\"/css/biomodels/layout.css\" />\n <link rel=\"stylesheet\" href=\"/css/biomodels/biomodels.css\" />\n <link rel=\"stylesheet\" href=\"/css/jqueryui/smoothness/jquery-ui-1.10.3.custom.min.css\" />\n \n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n <meta name=\"layout\" content=\"biomodels/main\"/>\n \n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>\n<meta name=\"layout\" content=\"biomodels/main\"/>\n<!-- Latest compiled and minified CSS -->\n<link rel=\"stylesheet\"\n href=\"https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.css\"/>\n<link rel=\"stylesheet\"\n href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css\">\n<style>\n .field-icon {\n float: right;\n margin-left: -25px;\n margin-top: -42px;\n margin-right: 10px;\n position: relative;\n z-index: 2;\n }\n</style>\n<script async src=\"https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js\"></script>\n \n</head>\n<!-- open body tag -->\n\n<body class=\"level2 full-width\">\n\n<div id=\"mainframe\">\n \n\n\n\n\n\n<div id=\"skip-to\">\n <a href=\"#content\">Skip to main content</a>\n</div>\n<header id=\"masthead-black-bar\" class=\"clearfix masthead-black-bar\">\n <!-- EBML-EBI menu items will be rendered by the script in script.js -->\n</header>\n\n<div data-sticky-container class=\"sticky-container\">\n <!-- Suggested layout containers -->\n <header id=\"masthead\" class=\"masthead\" data-sticky data-sticky-on=\"large\" data-top-anchor=\"content:top\"\n data-btm-anchor=\"content:bottom\">\n\n <!-- local-title, local search -->\n <div class=\"masthead-inner row expanded\">\n <div id=\"local-title\"\n class=\"hide-for-small-only medium-12 large-4 columns padding-top-none padding-bottom-none padding-left-none padding-right-none\">\n <h1>\n <a href=\"https://www.biomodels.org/\" title=\"Back to BioModels homepage\"\n style=\"text-decoration: none; border-bottom-style: none\">\n <img src=\"https://www.biomodels.org/images/biomodels/logo_small.png\"\n title=\"BioModels Homepage\"/>\n <span class=\"hide-for-small-only\">BioModels</span></a>\n </h1>\n </div>\n <!-- local-search -->\n <div id=\"localsearch\" class=\"small-12 medium-12 large-8 columns float-right\">\n \n\n\n\n\n\n\n<style type=\"text/css\">\n #clearsearch {\n display: block;\n outline: none;\n text-align: center;\n padding-left: 10px;\n padding-right: 8px;\n }\n .search_box_style {\n background-color: white;\n color: #0a0a0a;\n cursor: pointer;\n border: none;\n }\n .clearable {\n position: relative;\n text-align: left;\n }\n\n #domain_switcher {\n float: right;\n }\n .example-label {\n font-size: 0.8rem;\n }\n</style>\n<form id=\"local-search\" name=\"local-search\"\n action=\"/search\" method=\"post\">\n <fieldset><div class=\"row\">\n <div class=\"input-group margin-bottom-none margin-top-large padding-bottom-medium\">\n <div class=\"input-group-field columns large-3 medium-3 small-12\" style=\"vertical-align: text-top\">\n <select class=\"margin-bottom-none align-self-top\" id=\"domain_switcher\" name=\"domain_switcher\" title=\"Please choose a domain\">\n <option value=\"biomodels_all\">All Models</option>\n <option value=\"biomodels\">Individual Models</option>\n <option value=\"biomodels_autogen\">Autogenerated Models</option>\n </select>\n <br/><br/>\n <a class=\"help-text label-floating-left secondary label\"\n title=\"Learn more\"\n data-open=\"domainSwitcherExplanationBox\">What is this box used for?</a>\n <input type=\"text\" id=\"chosenDomain\" name=\"chosenDomain\" style=\"display: none\" value=\"biomodels\" aria-label=\"Choose a domain\"/>\n </div>\n\n <div class=\"input-group-field columns large-8 medium-8 small-12\">\n <input type=\"text\" name=\"search_block_form\" id=\"local-search-box\"\n placeholder=\"Search...\" class=\"input-group-field search_box_style clearable\"\n title=\"Search\"\n tabindex=\"1\" style=\"width: 100%;\">\n <p id=\"example\" class=\"example-label\">\n Examples:\n <a href=\"/search?query=*%3A*\" class=\"secondary label\" title=\"Search all\">*:*</a>\n <a href=\"/search?query=MAPK+cascade\" class=\"secondary label\" title=\"Search by GO term\">MAPK cascade</a>\n <a href=\"/search?query=homo+sapiens\" class=\"secondary label\" title=\"Search by Taxonomy term\">homo sapiens</a>\n <a href=\"/search?query=lung+cancer\" class=\"secondary label\" title=\"Search by Disease term\">lung cancer</a>\n <a title=\"Search tips/tricks\" data-open=\"searchTipsBox\"\n class=\"secondary label label-floating-right\">Search tips</a>\n </p></div>\n <div class=\"input-group-button columns large-1 medium-2 small-12\" style=\"float: left\">\n <input id=\"btn-search-submit\" class=\"button icon icon-functional\" tabindex=\"2\"\n type=\"submit\" name=\"searchSubmit\" value=\"1\" />\n </div>\n </div>\n </div></fieldset>\n</form>\n<script type=\"text/javascript\">\n $(document).ready(function () {\n let domain = \"\";\n // biomodels is the default domain\n let chosenDomain = domain.length > 0 ? domain : \"biomodels\";\n $('#chosenDomain').val(chosenDomain);\n $('#domain_switcher').val(chosenDomain);\n\n const urlParams = new URLSearchParams(window.location.search);\n const query = urlParams.get('query');\n\n if (query) {\n $(\"#local-search-box\").val(query);\n }\n\n });\n $(document).on('change', '#domain_switcher', {}, function(e) {\n e.preventDefault();\n let domain = $(this).val();\n $('#chosenDomain').val(domain);\n });\n\n /* Use event capturing (runs before other handlers) */\n document.getElementById('local-search').addEventListener('submit', function(e) {\n e.preventDefault();\n e.stopImmediatePropagation();\n\n const query = document.getElementById('local-search-box').value;\n const domain = document.getElementById('chosenDomain').value;\n const urlParams = new URLSearchParams(window.location.search);\n urlParams.set('query', query);\n urlParams.set('domain', domain);\n const searchPattern = /^\\/search(?:\\/|$)/i;\n let newURL;\n if (searchPattern.test(window.location.pathname)) {\n // Matches /search or /search/ but NOT /search-results\n newURL = window.location.pathname + '?' + urlParams.toString();\n } else {\n newURL = \"https://www.biomodels.org/search?\" + urlParams.toString();\n }\n window.location.href = newURL;\n\n return false;\n }, true); // true = use capture phase\n</script>\n\n </div>\n <!-- local navigation bar -->\n \n\n\n<div id=\"biomodels-toggle-bar\" class=\"hide-for-medium\">\n <button class=\"menu-icon\" type=\"button\" id=\"biomodels-hamburger\"></button>\n <div class=\"title-bar-title\">Menu</div>\n</div>\n<nav>\n<div id=\"biomodels-menu\">\n<div class=\"top-bar-left\">\n<ul id=\"local-nav\" class=\"main-menu dropdown menu\"\n data-description=\"navigational\" data-dropdown-menu role=\"menubar\">\n <li class=\"main-menu-item\"\n role=\"menuitem\">\n <a href=\"https://www.biomodels.org/\" title=\"Back to BioModels homepage\">\n <i class=\"icon icon-generic\" data-icon=\"H\"></i> Home</a>\n </li>\n \n <li class=\"main-menu-item\"\n role=\"menuitem\">\n <a><i class=\"icon icon-common\" data-icon=\"b\"></i> Browse</a>\n <ul class=\"menu\">\n <li><a href=\"/search?query=*%3A*\">All\n models</a></li>\n <li><a\n href=\"/parameterSearch/index\">BioModels Parameters Search</a>\n </li>\n <li><a href=\"/covid-19\">COVID-19</a></li>\n \n <li><a href=\"/agedbrain\">Neurodegeneration models</a></li>\n <li><a href=\"/path2models\">Path2Models models</a></li>\n <li>\n <a href=\"/pdgsmm/index\">\n PDGSM models\n </a>\n </li>\n <li><a href=\"/reproducibility\">Reproducibility</a></li>\n </ul>\n </li>\n <li class=\"main-menu-item\"\n role=\"menuitem\">\n <a href=\"/model/submission-guidelines-and-agreement\">\n <i class=\"icon icon-common icon-submit\"></i> Submit</a>\n </li>\n <li class=\"main-menu-item\"role=\"menuitem\">\n <a><i class=\"icon icon-common icon-cogs\"></i> Curation</a>\n <ul class=\"menu\">\n \n <li><a href=\"/curation/fbc\">FBC</a></li>\n </ul>\n </li>\n <li class=\"main-menu-item\"role=\"menuitem\">\n <a><i class=\"icon icon-common icon-support\"></i> Help</a>\n <ul class=\"menu\">\n <li><a href=\"/faq\">FAQs</a></li>\n <li class=\"divider\"></li>\n <li><a href=\"https://www.biomodels.org/user-guide/manual.html\" target=\"_blank\">User Manual</a></li>\n <li class=\"divider\"></li>\n <li><a href=\"/curation-docs\">Curator's Zone</a></li>\n <li class=\"divider\"></li>\n <li><a href=\"/dev\">Developer's Zone</a></li>\n <li class=\"divider\"></li>\n <li><a href=\"/courses\">Courses</a></li>\n <li><a href=\"//www.ebi.ac.uk/biomodels/tools/converters/\" target=\"_blank\">Online converters</a></li>\n </ul>\n </li>\n <li class=\"main-menu-item\"role=\"menuitem\">\n <a><i class=\"icon icon-common icon-info\"></i> About us</a>\n <ul class=\"menu\">\n <li><a href=\"/privacy\">Privacy Policy</a></li>\n \n <li><a href=\"/termsofuse\">Terms of Use</a></li>\n <li class=\"divider\"></li>\n <li><a href=\"/citation\">Citation</a></li>\n <li><a href=\"/news\">News</a></li>\n <li><a href=\"/acknowledgements\">Acknowledgements</a></li>\n <li><a href=\"/jobs\">Jobs</a></li>\n <li><a href=\"/jummp/curators\">Curators</a></li>\n <li class=\"divider\"></li>\n <li><a>Model of the Year</a>\n <ul class=\"menu\">\n <li><a href='/competition/model-of-the-year-2025'>MOY2025</a></li>\n <li><a href='/competition/model-of-the-year-2024'>MOY2024</a></li>\n <li><a href='/competition/model-of-the-year-2023'>MOY2023</a></li>\n </ul>\n </li>\n </ul>\n </li>\n <li class=\"main-menu-item\"role=\"menuitem\">\n <a href=\"/contact\">\n <i class=\"icon icon-common icon-contact\"></i> Contact us\n </a>\n </li>\n <li style=\"border-right: none\" id=\"menuItemFeedback\" data-open=\"rate_review_form\"\n role=\"menuitem\" class=\"main-menu-item\">\n <!-- rate_review_form is the identifier of the modal feedback form defined in the footer.\n This form is rendered using the feedback template of the web plugin -->\n <a><i class=\"icon icon-common icon-comment\"></i> Feedback</a>\n </li>\n <!-- If you need to include functional (as opposed to purely navigational) links in your local menu,\n add them here, and give them a class of \"functional\". Remember: you'll need a class of \"last\" for\n whichever one will show up last... For example: -->\n</ul></div>\n<div class=\"top-bar-right\">\n<ul class=\"main-menu dropdown menu\"\n data-description=\"navigational\" data-dropdown-menu role=\"menubar\">\n \n \n <li class=\"main-menu-item functional first float-right \"\n role=\"menuitem\">\n <a href='/registration' class=\"icon icon-functional\"\n data-icon=\"7\">Register</a>\n </li>\n <li class=\"active main-menu-item functional first float-right \" \n role=\"menuitem\">\n <a href=\"https://www.biomodels.org/login/auth\">\n <span class=\"icon icon-common icon-sign-in-alt\"> </span>Login\n </a>\n </li>\n \n</ul>\n</div></div>\n</nav>\n\n </div><!-- /local-title -->\n </header>\n</div>\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n<div id=\"content\" role=\"main\" class=\"row\">\n <div data-sticky-container class=\"sticky-container\">\n \n <!-- Facets search is unavailable -->\n \n <div id=\"main-content\" class=\"small-12 medium-12 large-12 columns\">\n <div class=\"row\" style=\"padding: 5px 0px 0px 0px\">\n <div class=\"columns small-12 medium-12 large-12\">\n <div class='flashNotificationDiv'>\n \n \n <script type=\"text/javascript\">\r\n\n hideNow()\n \r\n</script>\r\n\n \n \n\n </div>\n </div>\n</div>\n\n \n \n <script type=\"text/javascript\">\r\n\n // define the variables tied to the current user for later usages in common.js\n // Some of these variables are populated by the server-side ones\n var currentUsername = \"\";\n var currentEmail = \"\";\n var currentRealName = \"\";\n var currentOrcid = \"\";\n var actionName = \"auth\";\n\r\n</script>\r\n\n\n <div id=\"login\" class=\"row\">\n <div class=\"small-12 medium-6 medium-centered large-4 large-centered columns\">\n <form action=\"/j_spring_security_check\" method=\"post\" id=\"loginForm\" class=\"cssform\" autocomplete=\"on\">\n <div class=\"row column log-in-form\">\n <h3 class=\"text-center\">Log in to your account</h3>\n <label>Username\n <input type='text' name='j_username' id='username' placeholder=\"Username\">\n </label>\n <label>Password\n <input type='password' name='j_password' id='password' placeholder=\"Password\" autocomplete=\"on\"/>\n <span id=\"toggle-password\"\n class=\"fa fa-fw fa-eye field-icon toggle-password\"></span>\n </label>\n <label for='j_previousURL'>\n <input type='text' name='j_previousURL' id='j_previousURL' value=\"\"\n style=\"display: none\"/></label>\n <label for=\"j_deviceInfo\">\n <input type='text' name='j_deviceInfo' id='j_deviceInfo' value=\"\"\n style=\"display: none\"/>\n </label>\n <p><button type=\"button\" class=\"button expanded\" id=\"btnLogIn\">Log In</button></p>\n <p class=\"text-center\">\n <a href=\"https://www.biomodels.org/forgotpassword\">Forgot your password?</a></p>\n \n <p class=\"text-center\">\n <a href=\"https://www.biomodels.org/registration\">Register</a></p>\n \n </div>\n </form>\n\n </div>\n </div>\n\n <!--\n common-script.gsp is as the placeholder to define scripts where they need to use\n Grails tag-libs or server side variables.\n -->\n\n\n<script type=\"text/javascript\">\r\n\nfunction verifyCompromisedPassword(password) {\n const URL = \"/usermanagement/verifyCompromisedPassword\";\n fetch(URL, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json; charset=utf-8',\n 'Content-Type': 'application/json; charset=utf-8'\n },\n body: JSON.stringify({'password': password})\n }).then(response => {\n if (!response.ok) {\n throw new Error('Network response failed!!!');\n }\n return response.json();\n }).then(data => {\n if (data[\"result\"]) {\n let msg = \"<h4 style='color: red'><b>Compromised Password Alert!</b></h4>\";\n if (['editPassword', 'reset'].includes(\"auth\")) {\n msg += \"This password is known to cybercriminals far and wide! \" +\n \"It has been publicly exposed in one or more data breaches.\";\n } else if (\"auth\" === 'auth') {\n msg += \"This password has appeared in one or more data breaches which puts your account at \" +\n \"high risk of compromise. You should change your password immediately.\"\n }\n showNotification(msg);\n } else {\n clearNotification();\n hideNow();\n }\n }).catch(error => {\n console.error('Error: ', error);\n });\n}\n\nfunction checkCompromisedPasswordOnServerSide(username, password) {\n const URL = \"/usermanagement/verifyCompromisedPasswordAndNotifyUser\";\n fetch(URL, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json; charset=utf-8',\n 'Content-Type': 'application/json; charset=utf-8'\n },\n body: JSON.stringify({'username': username, 'password': password})\n }).then(response => {\n if (!response.ok) {\n throw new Error('Network response failed!!!');\n }\n return response.json();\n }).then(data => {\n if (data[\"compromised\"]) {\n console.log(\"Sent the verification compromised password to the server side.\");\n } else {\n console.log(\"Cannot verify compromised password to the server side.\");\n }\n }).catch(error => {\n console.error('Error: ', error);\n });\n}\n\nfunction checkPasswordStrength(password) {\n // source: https://martech.zone/javascript-password-strength/\n // Initialize variables\n let strength = 0;\n let strengthLevel;\n let tips = [];\n\n // Check password length\n let tip = \"Make the password longer.\";\n if (password.length < 10) {\n tips.push(tip);\n } else {\n strength += 1;\n // tips.splice( $.inArray(tip, tips), 1);\n tips = jQuery.grep(tips, function(value) { return value !== tip; });\n }\n\n // Check for mixed case\n tip = \"Use both lowercase and uppercase letters.\";\n if (password.match(/[a-z]/) && password.match(/[A-Z]/)) {\n strength += 1;\n // tips.splice( $.inArray(tip, tips), 1);\n tips = jQuery.grep(tips, function(value) { return value !== tip; });\n } else {\n tips.push(tip);\n }\n\n // Check for numbers\n tip = \"Include at least one number.\";\n if (password.match(/\\d/)) {\n strength += 1;\n // tips.splice( $.inArray(tip, tips), 1);\n tips = jQuery.grep(tips, function(value) { return value !== tip; });\n } else {\n tips.push(tip);\n }\n\n // Check for special characters\n tip = \"Include at least one special character.\";\n if (password.match(/[^a-zA-Z\\d]/)) {\n strength += 1;\n // tips.splice( $.inArray(tip, tips), 1);\n tips = jQuery.grep(tips, function(value) { return value !== tip; });\n } else {\n tips.push(tip);\n }\n\n // Return results\n if (strength < 2) {\n strengthLevel = \"Easy to guess.\";\n } else if (strength === 2) {\n strengthLevel = \"Medium difficulty.\" ;\n } else if (strength === 3) {\n strengthLevel = \"Difficult.\";\n } else {\n strengthLevel = \"Extremely difficult.\";\n }\n return { strength: strength, strengthLevel: strengthLevel, tips: tips };\n}\n\nfunction validateNewPassword(newPassword, newPasswordHelp, showWarning = false) {\n const newPasswordVal = newPassword.val();\n verifyCompromisedPassword(newPasswordVal);\n let s = checkPasswordStrength(newPasswordVal);\n let colourCode;\n let retVal = false;\n switch (s.strengthLevel) {\n case \"Easy to guess.\":\n colourCode = \"red\";\n if (showWarning) {\n toastr.error(s.strengthLevel);\n }\n break;\n case \"Medium difficulty.\":\n colourCode = \"orange\";\n if (showWarning) {\n toastr.warning(s.strengthLevel);\n }\n break;\n case \"Difficult.\":\n retVal = true;\n colourCode = \"cornflowerblue\";\n if (showWarning) {\n toastr.info(s.strengthLevel);\n }\n break;\n case \"Extremely difficult.\":\n retVal = true;\n colourCode = \"green\";\n if (showWarning) {\n toastr.success(s.strengthLevel);\n }\n break;\n }\n let msg = '<span style=\"color: ' + colourCode + '\">' + s.strengthLevel + '</span>';\n if (s.tips.length !== 0) {\n msg += \"<br/>\" + s.tips.join(\"<br/>\");\n }\n newPasswordHelp.show();\n newPasswordHelp.html(msg);\n\n return retVal;\n}\n\nfunction validateNewPasswordRpt(newPassword, newPasswordRpt, newPasswordRptHelp) {\n const newPasswordRptVal = newPasswordRpt.val();\n const newPasswordVal = newPassword.val();\n let retVal;\n if (newPasswordRptVal.length === 0) {\n retVal = false;\n newPasswordRptHelp.show();\n newPasswordRptHelp.html(\"Please retype your new password!\");\n } else if (newPasswordVal !== newPasswordRptVal) {\n retVal = false;\n newPasswordRptHelp.show();\n newPasswordRptHelp.html(\"New password does not match!\");\n } else {\n retVal = true;\n newPasswordRptHelp.hide();\n }\n return retVal;\n}\n\r\n</script>\r\n\n\n <script type='text/javascript'>\n const referrer = document.referrer;\n const loginInput = $(\"#loginForm input\");\n const loginForm = $(\"#loginForm\");\n const loginUsername = $(\"#username\");\n const loginPassword = $(\"#password\");\n loginInput.focus(function() {\n if ($(this).data(\"reset\") === undefined) {\n $(this).val(\"\");\n $(this).data(\"reset\", true);\n }\n });\n loginInput.on(\"keyup\", function(event) {\n // magic value 13 is entered\n if (event.which === 13) {\n loginForm.submit();\n checkCompromisedPasswordOnServerSide(loginUsername.val(), loginPassword.val());\n }\n });\n const loginSubmit = $(\"#btnLogIn\");\n loginSubmit.on(\"click\", function() {\n const deviceInfo = $(\"#j_deviceInfo\");\n $(deviceInfo).val(localStorage.getItem(loginUsername.val()));\n loginForm.submit();\n checkCompromisedPasswordOnServerSide(loginUsername.val(), loginPassword.val());\n });\n $(document).ready(function() {\n if (referrer.indexOf(\"biomodels/MODEL\") > 0) {\n const previousURL = $(\"#j_previousURL\");\n previousURL.val(referrer);\n }\n });\n loginPassword.on(\"focus\", function() {\n clearNotification();\n hideNow();\n });\n loginPassword.on(\"blur\", function() {\n // the function below was defined in the common-script.gsp template\n verifyCompromisedPassword($(this).val());\n });\n </script>\n <script type=\"text/javascript\">\r\n\n $(\".toggle-password\").on(\"click\", function() {\n $(this).toggleClass(\"fa-eye fa-eye-slash\");\n let input = $(\"#password\");\n if ([\"editPassword\", \"reset\"].includes(\"auth\")) {\n input = $(\"#newPassword\");\n }\n if (input.attr(\"type\") === \"password\") {\n input.attr(\"type\", \"text\");\n } else {\n input.attr(\"type\", \"password\");\n }\n });\n\r\n</script>\r\n\n\n \n </div>\n \n \n </div>\n</div>\n\n \n\n\n\n<footer id=\"local-footer\" class=\"local-footer\">\n <!-- Optional local footer (insert citation / project-specific copyright / etc here -->\n <div id=\"footer\" class=\"row\">\n <div>\n <div class=\"small-12 medium-6 large-6 columns\">\n <span style=\"font-size: small\">Build: <a href=\"//bitbucket.org/biomodels/jummp-biomodels/commits/all?search=8f9b24217\">8f9b24217</a> | Sat, 9 May 2026 12:04:37 +0100</span>\n </div>\n <div class=\"small-12 medium-6 large-6 columns\" style=\"text-align: right\">\n <span style=\"font-size: small\">\n \n </div>\n </div>\n <div class=\"clear\"></div>\n </div>\n <div id=\"elixir-banner\" data-color=\"grey\" data-name=\"This service\"\n data-description=\"BioModels is an ELIXIR Deposition Database\"\n data-more-information-link=\"//www.elixir-europe.org/platforms/data/elixir-deposition-databases\"\n data-use-basic-styles=\"true\"></div>\n <script defer=\"defer\"\n src=\"https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/js/elixirBanner.js\"></script>\n\n <style>\n .elixir-ribbon {\n padding: 1rem 0;\n /*background-color: rgb(79,138,156);*/\n background-color: rgb(0, 124, 130);\n /*background-color:#008080;*/\n vertical-align: middle;\n }\n\n .elixir-ribbon,\n .elixir-ribbon h5,\n .elixir-ribbon a,\n .elixir-ribbon a:active,\n .elixir-ribbon a:visited,\n .elixir-ribbon a:hover {\n color: #fff;\n text-decoration: none;\n }\n .elixir-ribbon a:hover {\n opacity: .8;\n }\n .elixir-ribbon .readmore {\n border-bottom: 1px dotted #fff;\n }\n .elixir-ribbon h5 {\n margin: 0;\n }\n .elixir-ribbon .elixir-logo-kite {\n background: 80% 58% url(\"https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.2/images/logos/assorted/elixir_kitemark-60px.png\") no-repeat;\n position: relative;\n /*top: -5px;*/\n /*margin: 0 1rem -.5rem 0;*/\n margin-left: 1.25rem;\n height: 60px;\n width: 60px;\n display: inline-block;\n float: left;\n background-size: 60px;\n vertical-align: middle;\n }\n .elixir-ribbon .row {\n margin: 0 !important;\n }\n </style>\n <!-- End optional local footer -->\n\n <div id=\"global-footer\" class=\"global-footer\">\n <nav id=\"global-nav-expanded\" class=\"row global-nav-expanded\">\n <!-- Footer will be automatically inserted by footer.js -->\n </nav>\n <section id=\"ebi-footer-meta\" class=\"row ebi-footer-meta\">\n <!-- Footer meta will be automatically inserted by footer.js -->\n </section>\n </div>\n <div class=\"reveal\" id=\"rate_review_form\" data-reveal>\n <h3 id=\"messageTitle\"\n style=\"border-bottom: 1px solid grey\">Please give your feedback</h3>\n <button class=\"close-button\" data-close aria-label=\"Close modal\" type=\"button\">\n <span aria-hidden=\"true\">×</span>\n </button>\n <div class=\"contact-panel\" id=\"feedback_panel\" data-toggler=\".is-active\">\n <table class=\"responsive-table\">\n \n <div class=\"rating\">\n <span id=\"star5\" class=\"star-icon\">☆</span>\n <span id=\"star4\" class=\"star-icon\">☆</span>\n <span id=\"star3\" class=\"star-icon\">☆</span>\n <span id=\"star2\" class=\"star-icon\">☆</span>\n <span id=\"star1\" class=\"star-icon\">☆</span></div>\n <input id=\"rateStar\" name=\"rateStar\" hidden required=\"true\" />\n \n </table>\n <form action=\"\">\n <div class=\"row\">\n <label>Email (Optional)\n <input type=\"email\" id=\"emailAddress\" placeholder=\"Email address\">\n </label>\n <label>Additional comments (Optional)\n <textarea id=\"additionalComment\"\n placeholder=\"Share details of your experience with this site.\"\n rows=\"3\"></textarea>\n </label>\n </div>\n <div class=\"contact-panel-actions\">\n <input id=\"submitButtonRate\" type=\"submit\"\n class=\"button submit-button\" value=\"Submit\">\n </div>\n </form>\n </div>\n</div>\n\n \n<div class=\"reveal\" id=\"searchTipsBox\" data-reveal>\n <h3 id=\"messageTitle\"\n style=\"border-bottom: 1px solid grey\">Search Tips/Tricks</h3>\n <button class=\"close-button\" data-close aria-label=\"Close modal\" type=\"button\">\n <span aria-hidden=\"true\">×</span>\n </button>\n\n <div class=\"search-tips-panel\" id=\"searchTips_panel\" data-toggler=\".is-active\">\n <ul>\n <li>Search is based on exact word matches. Make sure your <strong>spelling</strong> is correct.\n Example: the misspelled terms like <a href=\"/search?query=CelCycle\" class=\"secondary label\" title=\"Search by CelCycle term\" target=\"_blank\">CelCycle</a> (missing \"l\") will not find any results.</li>\n <li>Search for the phrase \"Glucose\" in the name field. Example: <a href=\"/search?query=name%3AGlucose\" class=\"secondary label\" title=\"Search by Glucose term in the 'name' field\" target=\"_blank\">name:\"Glucose\"</a></li>\n <li>Matches all models having model elements that were annotated with Gene Ontology term cell growth. Example:\n <a href=\"/search?query=GO%3A0016049\" class=\"secondary label\" title=\"Search by Gene Ontology term cell growth\" target=\"_blank\">GO:0016049</a></li>\n </ul>\n <p><a href=\"https://www.biomodels.org/user-guide/model_search.html\"\n target=\"_blank\">Learn more about searching models</a></p>\n </div>\n</div>\n\n <script>\n $(document).ready(() => {\n const elixirRibbon = $(\"div.elixir-ribbon > div.row > div.column\");\n if (elixirRibbon.length) {\n elixirRibbon.removeClass(\"column\");\n elixirRibbon.addClass(\"columns small-12 medium-6 large-6\");\n $('<div class=\"columns small-12 medium-6 large-6\">' +\n '<h5><a href=\"https://www.ebi.ac.uk/licencing\" target=\"_blank\">EMBL-EBI Licencing</a><br/>' +\n '<a href=\"https://www.ebi.ac.uk/long-term-data-preservation\" target=\"_blank\">' +\n 'EMBL-EBI Data Preservation</a></h5></div>').insertAfter(elixirRibbon);\n }\n });\n</script>\n\n <div class=\"reveal\" id=\"domainSwitcherExplanationBox\" data-reveal>\n <h3 id=\"messageTitle\"\n style=\"border-bottom: 1px solid grey\">What are BioModels domains?</h3>\n <button class=\"close-button\" data-close aria-label=\"Close modal\" type=\"button\">\n <span aria-hidden=\"true\">×</span>\n </button>\n\n <div class=\"explanation-panel\" id=\"domainSwitcherExplanationPanel\" data-toggler=\".is-active\">\n <p>This drop down box allows you to filter which models appear in the search results:\n <ul>\n <li><strong>Autogenerated Models</strong>: large-scale or automatically-generated submissions such as <a href=\"/path2models\" target=\"_blank\">Path2Models</a> or\n <a href=\"/pdgsmm/index\" target=\"_blank\">Patient-derived genome scale metabolic models (PDGSMM)</a> </li>\n <li><strong>Individual Models</strong>: models described in the literature that have been submitted individually to BioModels</li>\n <li><strong>All Models</strong>: the whole BioModels content</li>\n </ul>\n </p>\n <p>The default search domain is <strong>Individual Models</strong>.</p>\n\n <p><a href=\"https://www.biomodels.org/user-guide/model_search.html\"\n target=\"_blank\">Learn more about searching models</a></p>\n </div>\n</div>\n\n</footer>\n\n\n \n <div id=\"helpbutton\">\n <a id=\"toggleHelp\" title=\"Access help for this page\" href=\"#\">More about this page</a>\n </div>\n <div id=\"helpPanel\">\n <div id=\"toolbar\" class=\"ui-widget-header ui-corner-all\">\n <button id=\"expand\">Increase help size</button>\n <button id=\"contract\">Decrease help size</button>\n <button id=\"snap\">Reset help</button>\n <button id=\"outlink\">Open in a new tab</button>\n <button id=\"close\">Close</button>\n </div>\n <iframe id='helpFrame' src='https://www.biomodels.org/user-guide/login.html#contextSpecific/800'></iframe>\n </div>\n \n</div>\n\n<!-- JavaScript at the bottom for fast page loading -->\n<script src=\"https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/js/script.js\"></script>\n<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if offline -->\n\n<!-- The Foundation theme JavaScript -->\n<script src=\"https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/libraries/foundation-6/js/foundation.js\"></script>\n<script src=\"https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/js/foundationExtendEBI.js\"></script>\n<script type=\"text/JavaScript\">$(document).foundation();</script>\n<script type=\"text/JavaScript\">$(document).foundationExtendEBI();</script>\n\n<!-- customised scripts -->\n<script src=\"/js/common.js\" type=\"text/javascript\"></script>\r\n\n<!-- end scripts-->\n\n\n\n</body>\n</html>\n"
}