<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-GB" xml:lang="en-GB">
<head>
  <base href="https://stain.github.io/ro-crate-paper/v/543870d65a7c891d20497ff87f19ebbbc716c4e1/" />
  <meta charset="utf-8" />
  <meta name="generator" content="pandoc" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  <meta name="author" content="Stian Soiland-Reyes" />
  <meta name="author" content="Peter Sefton" />
  <meta name="author" content="Mercè Crosas" />
  <meta name="author" content="Leyla Jael Castro" />
  <meta name="author" content="Frederik Coppens" />
  <meta name="author" content="José María Fernández" />
  <meta name="author" content="Daniel Garijo" />
  <meta name="author" content="Björn Grüning" />
  <meta name="author" content="Marco La Rosa" />
  <meta name="author" content="Simone Leo" />
  <meta name="author" content="Eoghan Ó Carragáin" />
  <meta name="author" content="Marc Portier" />
  <meta name="author" content="Ana Trisovic" />
  <meta name="author" content="RO-Crate Community" />
  <meta name="author" content="Paul Groth" />
  <meta name="author" content="Carole Goble" />
  <meta name="dcterms.date" content="2021-08-13" />
  <meta name="keywords" content="research object, linked data, scholarly communication, Data publishing, Data packaging, FAIR, Linked Data, Metadata, Reproducibility, Research Object" />
  <title>Packaging research artefacts with RO-Crate</title>
  <style>
    code{white-space: pre-wrap;}
    span.smallcaps{font-variant: small-caps;}
    span.underline{text-decoration: underline;}
    div.column{display: inline-block; vertical-align: top; width: 50%;}
    div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
    ul.task-list{list-style: none;}
    pre > code.sourceCode { white-space: pre; position: relative; }
    pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
    pre > code.sourceCode > span:empty { height: 1.2em; }
    code.sourceCode > span { color: inherit; text-decoration: inherit; }
    div.sourceCode { margin: 1em 0; }
    pre.sourceCode { margin: 0; }
    @media screen {
    div.sourceCode { overflow: auto; }
    }
    @media print {
    pre > code.sourceCode { white-space: pre-wrap; }
    pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
    }
    pre.numberSource code
      { counter-reset: source-line 0; }
    pre.numberSource code > span
      { position: relative; left: -4em; counter-increment: source-line; }
    pre.numberSource code > span > a:first-child::before
      { content: counter(source-line);
        position: relative; left: -1em; text-align: right; vertical-align: baseline;
        border: none; display: inline-block;
        -webkit-touch-callout: none; -webkit-user-select: none;
        -khtml-user-select: none; -moz-user-select: none;
        -ms-user-select: none; user-select: none;
        padding: 0 4px; width: 4em;
        color: #aaaaaa;
      }
    pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
    div.sourceCode
      {   }
    @media screen {
    pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
    }
    code span.al { color: #ff0000; font-weight: bold; } /* Alert */
    code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
    code span.at { color: #7d9029; } /* Attribute */
    code span.bn { color: #40a070; } /* BaseN */
    code span.bu { } /* BuiltIn */
    code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
    code span.ch { color: #4070a0; } /* Char */
    code span.cn { color: #880000; } /* Constant */
    code span.co { color: #60a0b0; font-style: italic; } /* Comment */
    code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
    code span.do { color: #ba2121; font-style: italic; } /* Documentation */
    code span.dt { color: #902000; } /* DataType */
    code span.dv { color: #40a070; } /* DecVal */
    code span.er { color: #ff0000; font-weight: bold; } /* Error */
    code span.ex { } /* Extension */
    code span.fl { color: #40a070; } /* Float */
    code span.fu { color: #06287e; } /* Function */
    code span.im { } /* Import */
    code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
    code span.kw { color: #007020; font-weight: bold; } /* Keyword */
    code span.op { color: #666666; } /* Operator */
    code span.ot { color: #007020; } /* Other */
    code span.pp { color: #bc7a00; } /* Preprocessor */
    code span.sc { color: #4070a0; } /* SpecialChar */
    code span.ss { color: #bb6688; } /* SpecialString */
    code span.st { color: #4070a0; } /* String */
    code span.va { color: #19177c; } /* Variable */
    code span.vs { color: #4070a0; } /* VerbatimString */
    code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
  </style>
  <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  <![endif]-->
  <!--
  Manubot generated metadata rendered from header-includes-template.html.
  Suggest improvements at https://github.com/manubot/manubot/blob/main/manubot/process/header-includes-template.html
  -->
  <meta name="dc.format" content="text/html" />
  <meta name="dc.title" content="Packaging research artefacts with RO-Crate" />
  <meta name="citation_title" content="Packaging research artefacts with RO-Crate" />
  <meta property="og:title" content="Packaging research artefacts with RO-Crate" />
  <meta property="twitter:title" content="Packaging research artefacts with RO-Crate" />
  <meta name="dc.date" content="2021-08-13" />
  <meta name="citation_publication_date" content="2021-08-13" />
  <meta name="dc.language" content="en-GB" />
  <meta name="citation_language" content="en-GB" />
  <meta name="dc.relation.ispartof" content="Manubot" />
  <meta name="dc.publisher" content="Manubot" />
  <meta name="citation_journal_title" content="Manubot" />
  <meta name="citation_technical_report_institution" content="Manubot" />
  <meta name="citation_author" content="Stian Soiland-Reyes" />
  <meta name="citation_author_institution" content="Department of Computer Science, The University of Manchester, UK" />
  <meta name="citation_author_institution" content="Informatics Institute, Faculty of Science, University of Amsterdam, NL" />
  <meta name="citation_author_orcid" content="0000-0001-9842-9718" />
  <meta name="twitter:creator" content="@soilandreyes" />
  <meta name="citation_author" content="Peter Sefton" />
  <meta name="citation_author_institution" content="Faculty of Science, University Technology Sydney, AU" />
  <meta name="citation_author_orcid" content="0000-0002-3545-944X" />
  <meta name="citation_author" content="Mercè Crosas" />
  <meta name="citation_author_institution" content="Institute for Quantitative Social Science, Harvard University, Cambridge, MA, US" />
  <meta name="citation_author_institution" content="Harvard Data Commons is supported by an award from [Harvard University Information Technology](https://huit.harvard.edu/) (HUIT)." />
  <meta name="citation_author_orcid" content="0000-0003-1304-1939" />
  <meta name="twitter:creator" content="@mercecrosas" />
  <meta name="citation_author" content="Leyla Jael Castro" />
  <meta name="citation_author_institution" content="ZB MED Information Centre for Life Sciences, Cologne, DE" />
  <meta name="citation_author_orcid" content="0000-0003-3986-0510" />
  <meta name="twitter:creator" content="@lj_garcia" />
  <meta name="citation_author" content="Frederik Coppens" />
  <meta name="citation_author_institution" content="VIB-UGent Center for Plant Systems Biology, Gent, BE" />
  <meta name="citation_author_orcid" content="0000-0001-6565-5145" />
  <meta name="twitter:creator" content="@FrederikCoppens" />
  <meta name="citation_author" content="José María Fernández" />
  <meta name="citation_author_institution" content="Barcelona Supercomputing Center, Barcelona, ES" />
  <meta name="citation_author_orcid" content="0000-0002-4806-5140" />
  <meta name="twitter:creator" content="@JMFernand3z" />
  <meta name="citation_author" content="Daniel Garijo" />
  <meta name="citation_author_institution" content="Ontology Engineering Group, Universidad Politécnica de Madrid, Madrid, ES" />
  <meta name="citation_author_orcid" content="0000-0003-0454-7145" />
  <meta name="twitter:creator" content="@dgarijov" />
  <meta name="citation_author" content="Björn Grüning" />
  <meta name="citation_author_institution" content="Bioinformatics Group, Department of Computer Science, Albert-Ludwigs-University Freiburg, Freiburg, DE" />
  <meta name="citation_author_orcid" content="0000-0002-3079-6586" />
  <meta name="twitter:creator" content="@bjoerngruening" />
  <meta name="citation_author" content="Marco La Rosa" />
  <meta name="citation_author_orcid" content="0000-0001-5383-6993" />
  <meta name="citation_author" content="Simone Leo" />
  <meta name="citation_author_institution" content="Center for Advanced Studies, Research, and Development in Sardinia (CRS4), Pula (CA) , Italy" />
  <meta name="citation_author_orcid" content="0000-0001-8271-5429" />
  <meta name="twitter:creator" content="@_simleo_" />
  <meta name="citation_author" content="Eoghan Ó Carragáin" />
  <meta name="citation_author_institution" content="University College Cork, IE" />
  <meta name="citation_author_orcid" content="0000-0001-8131-2150" />
  <meta name="twitter:creator" content="@eocarragain" />
  <meta name="citation_author" content="Marc Portier" />
  <meta name="citation_author_institution" content="Vlaams Instituut voor de Zee}, Oostende, BE" />
  <meta name="citation_author_orcid" content="0000-0002-9648-6484" />
  <meta name="twitter:creator" content="@mportier" />
  <meta name="citation_author" content="Ana Trisovic" />
  <meta name="citation_author_institution" content="Institute for Quantitative Social Science, Harvard University, Cambridge, MA, US" />
  <meta name="citation_author_orcid" content="0000-0003-1991-0533" />
  <meta name="twitter:creator" content="@atrisovic" />
  <meta name="citation_author" content="RO-Crate Community" />
  <meta name="citation_author" content="Paul Groth" />
  <meta name="citation_author_institution" content="Informatics Institute, Faculty of Science, University of Amsterdam, NL" />
  <meta name="citation_author_orcid" content="0000-0003-0183-6910" />
  <meta name="twitter:creator" content="@pgroth" />
  <meta name="citation_author" content="Carole Goble" />
  <meta name="citation_author_institution" content="Department of Computer Science, The University of Manchester, UK" />
  <meta name="citation_author_orcid" content="0000-0003-1219-2137" />
  <meta name="twitter:creator" content="@CaroleAnneGoble" />
  <link rel="canonical" href="https://stain.github.io/ro-crate-paper/" />
  <meta property="og:url" content="https://stain.github.io/ro-crate-paper/" />
  <meta property="twitter:url" content="https://stain.github.io/ro-crate-paper/" />
  <meta name="citation_fulltext_html_url" content="https://stain.github.io/ro-crate-paper/" />
  <meta name="citation_pdf_url" content="https://stain.github.io/ro-crate-paper/manuscript.pdf" />
  <link rel="alternate" type="application/pdf" href="https://stain.github.io/ro-crate-paper/manuscript.pdf" />
  <link rel="alternate" type="text/html" href="https://stain.github.io/ro-crate-paper/v/543870d65a7c891d20497ff87f19ebbbc716c4e1/" />
  <meta name="manubot_html_url_versioned" content="https://stain.github.io/ro-crate-paper/v/543870d65a7c891d20497ff87f19ebbbc716c4e1/" />
  <meta name="manubot_pdf_url_versioned" content="https://stain.github.io/ro-crate-paper/v/543870d65a7c891d20497ff87f19ebbbc716c4e1/manuscript.pdf" />
  <meta property="og:type" content="article" />
  <meta property="twitter:card" content="summary_large_image" />
  <link rel="icon" type="image/png" sizes="192x192" href="https://manubot.org/favicon-192x192.png" />
  <link rel="mask-icon" href="https://manubot.org/safari-pinned-tab.svg" color="#ad1457" />
  <meta name="theme-color" content="#ad1457" />
  <!-- end Manubot generated metadata -->
</head>
<body>
<header id="title-block-header">
<h1 class="title">Packaging research artefacts with RO-Crate</h1>
</header>
<p><small><em>
This manuscript
(<a href="https://stain.github.io/ro-crate-paper/v/543870d65a7c891d20497ff87f19ebbbc716c4e1/">permalink</a>)
was automatically generated
from <a href="https://github.com/stain/ro-crate-paper/tree/543870d65a7c891d20497ff87f19ebbbc716c4e1">stain/ro-crate-paper@543870d</a>
on August 13, 2021.
</em></small></p>
<h2 id="authors">Authors</h2>
<ul>
<li><p><strong>Stian Soiland-Reyes</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0001-9842-9718">0000-0001-9842-9718</a>
· <img src="images/github.svg" class="inline_icon" alt="GitHub icon" />
<a href="https://github.com/stain">stain</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/soilandreyes">soilandreyes</a><br>
<small>
Department of Computer Science, The University of Manchester, UK; Informatics Institute, Faculty of Science, University of Amsterdam, NL
· Funded by <a href="https://bioexcel.eu/">BioExcel-2</a> (European Commission <a href="https://cordis.europa.eu/project/id/823830">H2020-INFRAEDI-2018-1 823830</a>); <a href="https://cordis.europa.eu/project/id/730976">IBISBA</a> (H2020-INFRAIA-2017-1-two-stage 730976)
</small></p></li>
<li><p><strong>Peter Sefton</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0002-3545-944X">0000-0002-3545-944X</a>
· <img src="images/github.svg" class="inline_icon" alt="GitHub icon" />
<a href="https://github.com/ptsefton">ptsefton</a><br>
<small>
Faculty of Science, University Technology Sydney, AU
</small></p></li>
<li><p><strong>Mercè Crosas</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0003-1304-1939">0000-0003-1304-1939</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/mercecrosas">mercecrosas</a><br>
<small>
Institute for Quantitative Social Science, Harvard University, Cambridge, MA, US; Harvard Data Commons is supported by an award from <a href="https://huit.harvard.edu/">Harvard University Information Technology</a> (HUIT).
</small></p></li>
<li><p><strong>Leyla Jael Castro</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0003-3986-0510">0000-0003-3986-0510</a>
· <img src="images/github.svg" class="inline_icon" alt="GitHub icon" />
<a href="https://github.com/ljgarcia">ljgarcia</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/lj_garcia">lj_garcia</a><br>
<small>
ZB MED Information Centre for Life Sciences, Cologne, DE
</small></p></li>
<li><p><strong>Frederik Coppens</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0001-6565-5145">0000-0001-6565-5145</a>
· <img src="images/github.svg" class="inline_icon" alt="GitHub icon" />
<a href="https://github.com/frederikcoppens">frederikcoppens</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/FrederikCoppens">FrederikCoppens</a><br>
<small>
VIB-UGent Center for Plant Systems Biology, Gent, BE
</small></p></li>
<li><p><strong>José María Fernández</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0002-4806-5140">0000-0002-4806-5140</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/JMFernand3z">JMFernand3z</a><br>
<small>
Barcelona Supercomputing Center, Barcelona, ES
</small></p></li>
<li><p><strong>Daniel Garijo</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0003-0454-7145">0000-0003-0454-7145</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/dgarijov">dgarijov</a><br>
<small>
Ontology Engineering Group, Universidad Politécnica de Madrid, Madrid, ES
</small></p></li>
<li><p><strong>Björn Grüning</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0002-3079-6586">0000-0002-3079-6586</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/bjoerngruening">bjoerngruening</a><br>
<small>
Bioinformatics Group, Department of Computer Science, Albert-Ludwigs-University Freiburg, Freiburg, DE
· Funded by <a href="https://www.eosc-life.eu/">EOSC-Life</a> (European Commission <a href="https://cordis.europa.eu/project/id/824087">H2020-INFRAEOSC-2018-2 824087</a>); <a href="https://nfdi4plants.de/">DataPLANT</a> (<a href="https://gepris.dfg.de/gepris/projekt/442077441">NFDI 7/1 – 42077441</a>), part of the German <a href="https://www.dfg.de/en/research_funding/programmes/nfdi/">National Research Data Infrastructure</a> (NFDI), funded by the <a href="https://www.dfg.de/">Deutsche Forschungsgemeinschaft</a> (DFG).
</small></p></li>
<li><p><strong>Marco La Rosa</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0001-5383-6993">0000-0001-5383-6993</a><br>
<small>
</small></p></li>
<li><p><strong>Simone Leo</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0001-8271-5429">0000-0001-8271-5429</a>
· <img src="images/github.svg" class="inline_icon" alt="GitHub icon" />
<a href="https://github.com/simleo">simleo</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/_simleo_"><em>simleo</em></a><br>
<small>
Center for Advanced Studies, Research, and Development in Sardinia (CRS4), Pula (CA) , Italy
· Funded by <a href="https://www.eosc-life.eu/">EOSC-Life</a> (European Commission <a href="https://cordis.europa.eu/project/id/824087">H2020-INFRAEOSC-2018-2 824087</a>)
</small></p></li>
<li><p><strong>Eoghan Ó Carragáin</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0001-8131-2150">0000-0001-8131-2150</a>
· <img src="images/github.svg" class="inline_icon" alt="GitHub icon" />
<a href="https://github.com/eocarragain">eocarragain</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/eocarragain">eocarragain</a><br>
<small>
University College Cork, IE
</small></p></li>
<li><p><strong>Marc Portier</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0002-9648-6484">0000-0002-9648-6484</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/mportier">mportier</a><br>
<small>
Vlaams Instituut voor de Zee}, Oostende, BE
</small></p></li>
<li><p><strong>Ana Trisovic</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0003-1991-0533">0000-0003-1991-0533</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/atrisovic">atrisovic</a><br>
<small>
Institute for Quantitative Social Science, Harvard University, Cambridge, MA, US
· Funded by <a href="https://sloan.org/">Alfred P. Sloan Foundation</a> (grant number <a href="https://sloan.org/grant-detail/9555">P-2020-13988</a>).
</small></p></li>
<li><p><strong>RO-Crate Community</strong><br>
<a href="https://www.researchobject.org/ro-crate/community">https://www.researchobject.org/ro-crate/community</a>
· <img src="images/github.svg" class="inline_icon" alt="GitHub icon" />
<a href="https://github.com/researchobject">researchobject</a><br>
<small>
</small></p></li>
<li><p><strong>Paul Groth</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0003-0183-6910">0000-0003-0183-6910</a>
· <img src="images/github.svg" class="inline_icon" alt="GitHub icon" />
<a href="https://github.com/pgroth">pgroth</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/pgroth">pgroth</a><br>
<small>
Informatics Institute, Faculty of Science, University of Amsterdam, NL
</small></p></li>
<li><p><strong>Carole Goble</strong><br>
<img src="images/orcid.svg" class="inline_icon" alt="ORCID icon" />
<a href="https://orcid.org/0000-0003-1219-2137">0000-0003-1219-2137</a>
· <img src="images/github.svg" class="inline_icon" alt="GitHub icon" />
<a href="https://github.com/carolegoble">carolegoble</a>
· <img src="images/twitter.svg" class="inline_icon" alt="Twitter icon" />
<a href="https://twitter.com/CaroleAnneGoble">CaroleAnneGoble</a><br>
<small>
Department of Computer Science, The University of Manchester, UK
· Funded by <a href="https://bioexcel.eu/">BioExcel-2</a> (European Commission <a href="https://cordis.europa.eu/project/id/823830">H2020-INFRAEDI-2018-1 823830</a>); <a href="https://www.eosc-life.eu/">EOSC-Life</a> (European Commission <a href="https://cordis.europa.eu/project/id/824087">H2020-INFRAEOSC-2018-2 824087</a>); <a href="https://ibisba.eu/">IBISBA</a> (European Commission <a href="https://cordis.europa.eu/project/id/730976">H2020-INFRAIA-2017-1-two-stage 730976</a>, <a href="https://cordis.europa.eu/project/id/871118">H2020-INFRADEV-2019-2 871118</a>); <a href="https://www.synthesys.info/">SyntheSys+</a> (European Commission <a href="https://cordis.europa.eu/project/id/823827">H2020-INFRAIA-2018-1 823827</a>)
</small></p></li>
</ul>
<p>An increasing number of researchers support reproducibility by including pointers to and descriptions of datasets, software and methods in their publications. However, scientific articles may be ambiguous, incomplete and difficult to process by automated systems. In this paper we introduce RO-Crate, an open, community-driven, and lightweight approach to packaging research artefacts along with their metadata in a machine readable manner. RO-Crate is based on Schema.org annotations in JSON-LD, aiming to establish best practices to formally describe metadata in an accessible and practical way for their use in a wide variety of situations.</p>
<p>An RO-Crate is a structured archive of all the items that contributed to a research outcome, including their identifiers, provenance, relations and annotations. As a general purpose packaging approach for data and their metadata, RO-Crate is used across multiple areas, including bioinformatics, digital humanities and regulatory sciences. By applying “just enough” Linked Data standards, RO-Crate simplifies the process of making research outputs FAIR while also enhancing research reproducibility.</p>
<p>An <a href="https://www.researchobject.org/2021-packaging-research-artefacts-with-ro-crate/">RO-Crate for this article</a> is archived at <code>https://doi.org/10.5281/zenodo.5146227</code></p>
<h1 id="introduction">Introduction</h1>
<p>The move towards open science has increased the need and demand for the publication of artefacts of the research process <span class="citation" data-cites="19ybGpBJJ">[<a href="#ref-19ybGpBJJ" role="doc-biblioref">1</a>]</span>. This is particularly apparent in domains that rely on computational experiments; for example, the publication of software, datasets and records of the dependencies that such experiments rely on <span class="citation" data-cites="gvyja7v1">[<a href="#ref-gvyja7v1" role="doc-biblioref">2</a>]</span>.</p>
<p>It is often argued that the publication of these assets, and specifically software <span class="citation" data-cites="sbRbAxdT">[<a href="#ref-sbRbAxdT" role="doc-biblioref">3</a>]</span>, workflows <span class="citation" data-cites="nHPbkJXy">[<a href="#ref-nHPbkJXy" role="doc-biblioref">4</a>]</span> and data, should follow the FAIR principles <span class="citation" data-cites="6DjakjNS">[<a href="#ref-6DjakjNS" role="doc-biblioref">5</a>]</span>; namely, that they are Findable, Accessible, Interoperable and Reusable. These principles are agnostic to the <em>implementation</em> strategy needed to comply with them. Hence, there has been an increasing amount of work in the development of platforms and specifications that aim to fulfil these goals <span class="citation" data-cites="r3UZD8uu">[<a href="#ref-r3UZD8uu" role="doc-biblioref">6</a>]</span>.</p>
<p>Important examples include data publication with rich metadata (e.g. Zenodo <span class="citation" data-cites="8xxCWPLQ">[<a href="#ref-8xxCWPLQ" role="doc-biblioref">7</a>]</span>), domain-specific data deposition (e.g., PDB <span class="citation" data-cites="c5hSVgMG">[<a href="#ref-c5hSVgMG" role="doc-biblioref">8</a>]</span>) and following practices for reproducible research software <span class="citation" data-cites="Pf3steOn">[<a href="#ref-Pf3steOn" role="doc-biblioref">9</a>]</span> (e.g. use of containers). While these platforms are useful, experience has shown that it is important to put greater emphasis on the interconnection of the multiple artefacts that make up the research process <span class="citation" data-cites="6OzT7zDz">[<a href="#ref-6OzT7zDz" role="doc-biblioref">10</a>]</span>.</p>
<p>The notion of <strong>Research Objects</strong> <span class="citation" data-cites="sRYUCzCq">[<a href="#ref-sRYUCzCq" role="doc-biblioref">11</a>]</span> was introduced to address this connectivity as semantically rich aggregations of (potentially distributed) resources that provide a layer of structure over a research study and are delivered in a <em>machine-readable format</em>. Research Object combines the ability to bundle multiple types of artefacts together, such as spreadsheets, code, examples, and figures; augmented by relationships that describe their context (e.g. a CSV being used by a script, a figure being a result of a workflow, etc.). This provides a compelling vision as an approach for implementing FAIR data. However, existing Research Object implementations require a large technology stack <span class="citation" data-cites="eWgJ0fZt">[<a href="#ref-eWgJ0fZt" role="doc-biblioref">12</a>]</span>, are typically tailored to a particular platform and are also not easily usable by end-users.</p>
<p>To address this gap, a new community came together <span class="citation" data-cites="19ead6wt6">[<a href="#ref-19ead6wt6" role="doc-biblioref">13</a>]</span> to develop <strong>RO-Crate</strong> — an <em>approach to package and aggregate research artefacts with their metadata and relationships</em>. The aim of this paper is to introduce RO-Crate and assess it as a strategy for making multiple types of research artefacts FAIR. Specifically, the contributions of this paper are as follows:</p>
<ol type="1">
<li>an introduction to RO-Crate, its purpose and context;</li>
<li>a guide to the RO-Crate community and tooling;</li>
<li>an exemplar usage of RO-Crate demonstrating its value as connective tissue for different artefacts from different communities.</li>
</ol>
<p>The rest of this paper is organised as follows. We first describe RO-Crate, the assumptions underlying it, and define RO-Crate technically and formally. We then proceed to introduce the community and tooling. We move to analyse RO-Crate with respect to usage in a diverse set of domains. Finally, we present related work and conclude with some remarks including RO-Crate highlights and future work.</p>
<h1 id="ro-crate">RO-Crate</h1>
<p>RO-Crate aims to provide an approach to packaging research artefacts with their metadata that can be easily adopted. To illustrate this, let us imagine a research paper reporting on the sequence analysis of proteins obtained from an experiment on mice. The sequence output files, sequence analysis code, resulting data and reports summarising statistical measures or outputs are all important and inter-related research outputs, and consequently would ideally all be co-located in a directory and accompanied with their corresponding metadata. In reality, some of the artefacts (e.g. data or software) will be recorded as external references, not necessarily captured in a FAIR way. This directory, along with the relationships between its constituent digital artefacts, is what the RO-Crate model aims to represent, linking together all the elements pertaining to an experiment and required for its reproducibility.</p>
<p>The question then arises as to how the directory with all this material should be packaged in a manner that is accessible and usable by others. This means programmatically and automatically accessible by machines and human readable. A de facto approach to sharing collections of resources is through compressed archives (e.g. a zip file). This solves the problem of “packaging”, but it does not guarantee downstream access to all artefacts in a programmatic fashion, or the role of each file in that particular research. Both features, the ability to automatically access and reason abuot an object, are crucial and lead to the need for explicit metadata about the contents of the folder, describing each and linking them together.</p>
<p>Examples of metadata descriptions across a <a href="https://rdamsc.bath.ac.uk/scheme-index">wide range of domains</a> abound within the literature, both in research data management <span class="citation" data-cites="1GDrMnMDr">[<a href="#ref-1GDrMnMDr" role="doc-biblioref">14</a>]</span> <span class="citation" data-cites="qO3xQviT">[<a href="#ref-qO3xQviT" role="doc-biblioref">15</a>]</span> <span class="citation" data-cites="aCye3KpE">[<a href="#ref-aCye3KpE" role="doc-biblioref">16</a>]</span> and within <a href="https://www.loc.gov/librarians/standards">library and information systems</a> <span class="citation" data-cites="ce8qTQBF">[<a href="#ref-ce8qTQBF" role="doc-biblioref">17</a>]</span> <span class="citation" data-cites="twn3K6TG">[<a href="#ref-twn3K6TG" role="doc-biblioref">18</a>]</span>. However, many of these approaches require knowledge of metadata schemas, particular annotation systems, or the use of complex software stacks. Indeed, particularly within research, these requirements have led to a lack of adoption and growing frustration with current tooling and specifications <span class="citation" data-cites="xaBY9xom">[<a href="#ref-xaBY9xom" role="doc-biblioref">19</a>]</span> <span class="citation" data-cites="DfP2RrQB">[<a href="#ref-DfP2RrQB" role="doc-biblioref">20</a>]</span> <span class="citation" data-cites="WD4Wsy0c">[<a href="#ref-WD4Wsy0c" role="doc-biblioref">21</a>]</span>.</p>
<p>RO-Crate seeks to address this complexity by:</p>
<ol type="1">
<li>being conceptually simple and easy to understand for developers;</li>
<li>strong, easy tooling and integration into community projects</li>
<li>providing a strong and opinionated guide regarding current best practices;</li>
<li>adopting de-facto standards that are widely used on the Web.</li>
</ol>
<p>In the following sections we demonstrate how the RO-Crate specification and ecosystem achieves these goals.</p>
<h2 id="conceptual-definition">Conceptual Definition</h2>
<p>A key premise of RO-Crate is the existence of a wide variety of resources on the Web that can help describe research. As such, RO-Crate relies on the Linked Data principles <span class="citation" data-cites="GOjoQFmf">[<a href="#ref-GOjoQFmf" role="doc-biblioref">22</a>]</span>. Figure <a href="#fig:conceptual">1</a>  shows the main conceptual elements involved in an RO-Crate; an RO-Metadata File (top) describes the research object using structured metadata including external references, coupled with the contained artefacts (bottom) bundled and described by the RO-Crate.</p>
<div id="fig:conceptual" class="fignos">
<figure>
<img src="images/ro-crate-overview.svg" style="width:90.0%" alt="" /><figcaption><span>Figure 1:</span> <strong>Conceptual overview of RO-Crate</strong>. A <em>Persistent Identifier</em> (PID) <span class="citation" data-cites="5ln5TkiV">[<a href="#ref-5ln5TkiV" role="doc-biblioref">23</a>]</span> points to a <em>Research Object</em> (RO), which may be archived using different packaging approaches like BagIt <span class="citation" data-cites="UQNJggmh">[<a href="#ref-UQNJggmh" role="doc-biblioref">24</a>]</span>, OCFL <span class="citation" data-cites="TivFlCqv">[<a href="#ref-TivFlCqv" role="doc-biblioref">25</a>]</span>, git or ZIP. The RO is described within a , providing identifiers for  using ORCID,  using <a href="https://ror.org/">ROR</a> and licences such as Creative Commons using SPDX identifiers. The <em>RO-Crate content</em> is further described with additional metadata. Data can be embedded files and directories, as well as links to external web resources, PIDs and nested RO-Crates.</figcaption>
</figure>
</div>
<h3 id="linked-data-as-a-foundation">Linked Data as a foundation</h3>
<p>The <strong>Linked Data</strong> principles <span class="citation" data-cites="OsBEGq7D">[<a href="#ref-OsBEGq7D" role="doc-biblioref">26</a>]</span> (use of IRIs to identify resources (i.e. artefacts), resolvable via HTTP, enriched with metadata and linked to each other) are core to RO-Crate; therefore <strong>IRI</strong>s<a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a> are used to identify an RO-Crate, its constituent parts and metadata descriptions, and the properties and classes used in the metadata.</p>
<p>RO-Crates are <em>self-described</em>; and follow the Linked Data principles to describe all of their resources in both human and machine readable manner. Hence, resources are identified using global identifiers where possible; and relationships between two resources are defined with links.</p>
<p>The foundation of Linked Data and shared vocabularies also means multiple RO-Crates and other Linked Data resources can be indexed, combined, queried or transformed using existing Semantic Web technologies such as <a href="https://www.w3.org/TR/sparql11-overview">SPARQL</a> and knowledge graph triple stores.</p>
<p>Even though an RO-Crate is not required to be published on the Web, this use of mature web technologies means its developers and consumers are not restricted to the Research Object aspects that have already been specified by the RO-Crate community, but can extend and integrate in multiple standardized ways.</p>
<h3 id="ro-crate-is-a-self-described-container">RO-Crate is a self-described container</h3>
<p>An <a href="https://www.researchobject.org/ro-crate/1.1/structure.html#ro-crate-metadata-file-ro-crate-metadatajson">RO-Crate is defined</a> as a self-described <strong>Root Data Entity</strong> that describes and contains <em>data entities</em>, which are further described using <em>contextual entities</em>. A <strong>data entity</strong> is either a <em>file</em> (i.e. a set of bytes stored on disk somewhere) or a <em>directory</em> (i.e. dataset of named files and other directories). A file does not need to be stored inside the RO-Crate root, it can be referenced via a PID/IRI. A <strong>contextual entity</strong> exists outside the information system (e.g. a Person, a workflow language) and is defined by its metadata. The representation of a <strong>data entity</strong> as a set of bytes makes it possible to store a variety of research artefacts including not only data but also, for instance, software and text.</p>
<p>Any particular IRI might appear as a contextual entity in one RO-Crate and as a data entity in another; their distinction lies in the fact that data entities can be considered to be <em>contained</em> or captured by the RO-Crate (<em>RO Content</em> in <a href="#fig:conceptual">1</a>), while contextual entities mainly <em>explain</em> the RO-Crate, although this distinction is not a formal requirement.</p>
<p>The Root Data Entity is a directory, the RO-Crate root, identified by the presence of the <strong>RO-Crate Metadata File</strong> (<code>ro-crate-metadata.json</code>) (Figure  top). This is a JSON-LD file that describes the RO-Crate, its content and related metadata using Linked Data. JSON-LD is a W3C standard RDF serialisation that has become popular as it is easy to read by humans while also offers some advantages for data exchange on the Internet. JSON-LD is the preferred and widely supported format by RO-Crate tools and community.</p>
<p>The minimal <a href="https://www.researchobject.org/ro-crate/1.1/root-data-entity.html#direct-properties-of-the-root-data-entity">requirements for the root data entity metadata</a> are <code>name</code>, <code>description</code> and <code>datePublished</code>, as well as a contextual entity identifying its <code>license</code> — additional metadata are frequently added to entities depending on the purpose of the particular RO-Crate.</p>
<p>RO-Crate can be stored, transferred or published in multiple ways, e.g. BagIt <span class="citation" data-cites="UQNJggmh">[<a href="#ref-UQNJggmh" role="doc-biblioref">24</a>]</span>, Oxford Common File Layout <span class="citation" data-cites="TivFlCqv">[<a href="#ref-TivFlCqv" role="doc-biblioref">25</a>]</span> (OCFL), downloadable ZIP archives in Zenodo or through dedicated online repositories, as well as published directly on the Web, e.g. using <a href="https://pages.github.com/">GitHub Pages</a>. Combined with Linked Data identifiers, this caters for a diverse set of storage and access requirements across different scientific domains, from metagenomics workflows producing hundreds of gigabytes of genome data to cultural heritage records with access restrictions for personally identifiable data. Specific <a href="https://www.researchobject.org/ro-crate/1.2-DRAFT/profiles.html">RO-Crate profiles</a> may constrain serialization and publication expectations, and require additional contextual types and properties.</p>
<h3 id="data-entities-are-described-using-contextual-entities">Data Entities are described using Contextual Entities</h3>
<p>RO-Crate distinguishes between <a href="https://www.researchobject.org/ro-crate/1.1/contextual-entities.html#contextual-vs-data-entities">data and contextual entities</a> in a similar way to HTTP terminology’s early attempt to separate <em>information</em> (data) and <em>non-information</em> (contextual) resources <span class="citation" data-cites="wmxlb0Fv">[<a href="#ref-wmxlb0Fv" role="doc-biblioref">28</a>]</span>. Data entities are usually files and directories located by relative IRI references within the RO-Crate Root, but they can also be Web resources or restricted data identified with absolute IRIs.</p>
<p>As both types of entities are identified by IRIs, their distinction is allowed to be blurry; data entities can be located anywhere and be complex, while contextual entities can have a Web presence beyond their description inside the RO-Crate. For instance <code>https://orcid.org/0000-0002-1825-0097</code> is primarily an identifier for a person, but secondarily also a web page and their academic work. It follows that an RO-Crate should include a contextual entity that describes that person.</p>
<p>Any particular IRI might appear as a contextual entity in one RO-Crate and as a data entity in another; their distinction lies in the fact that data entities can be considered to be <em>contained</em> or captured by the RO-Crate, while contextual entities mainly <em>explain</em> the RO-Crate and its entities.</p>
<p>Figure  shows a UML view of RO-Crate, highlighting the different types of data entities and contextual entities that can be aggregated and related. While an RO-Crate would usually contain one or more data entities (<code>hasPart</code>), it may also be a pure aggregation of contextual entities (<code>mentions</code>).</p>
<div id="fig:uml" class="fignos">
<figure>
<img src="images/ro-crate-uml.svg" style="width:90.0%" alt="" /><figcaption><span>Figure 2:</span> <strong>UML model view of RO-Crate.</strong> The <em>RO-Crate Metadata File</em> conforms to a version of the specification; and contains a JSON-LD graph that describes the entities that make up the RO-Crate. The <em>RO-Crate Root Data Entity</em> represent the Research Object as a dataset. The RO-Crate aggregates <em>data entities</em> (<code>hasPart</code>) which are further described using <em>contextual entities</em>. Multiple types and relations from Schema.org allow annotations to be more specific, including figures, nested datasets, computational workflows, people, organisations, instruments and places. Contextual entities not otherwise cross-referenced from other entities’ properties (<em>describes</em>) can be grouped under the root entity (<code>mentions</code>).</figcaption>
</figure>
</div>
<h3 id="guide-through-recommended-practices">Guide through Recommended Practices</h3>
<p>RO-Crate as a specification aims to build a set of recommended practices on how to practically apply existing standards in a common way to describe research outputs and their provenance, without having to learn each of the underlying technologies in detail.</p>
<p>As such, the <a href="https://w3id.org/ro/crate/1.1">RO-Crate 1.1</a> specification <span class="citation" data-cites="6Lj8VCHS">[<a href="#ref-6Lj8VCHS" role="doc-biblioref">29</a>]</span> can be seen as an opinionated and example-driven guide to writing <a href="https://schema.org/">Schema.org</a> <span class="citation" data-cites="vC6te3yd">[<a href="#ref-vC6te3yd" role="doc-biblioref">30</a>]</span>) metadata as JSON-LD <span class="citation" data-cites="17q6tYFV2">[<a href="#ref-17q6tYFV2" role="doc-biblioref">31</a>]</span>, which leaves it open for implementers to include additional metadata using other Schema.org types and properties, or even additional Linked Data vocabularies/ontologies or their own ad-hoc terms.</p>
<p>However the primary purpose of the RO-Crate specification is to assist developers in leveraging Linked Data principles for the focused purpose of describing Research Objects in a structured language, while reducing the steep learning curve otherwise involved in Semantic Web adaptation, like ontology development and selection, identifiers, namespaces, and RDF serialization choices.</p>
<h3 id="ensuring-simplicity">Ensuring Simplicity</h3>
<p>One aim of RO-Crate is to be conceptually simple. This simplicity has been repeatedly checked and confirmed through a community review process. For instance, in the discussion on supporting <a href="https://github.com/ResearchObject/ro-crate/issues/71">ad-hoc vocabularies</a> in RO-Crate, the community explored potential Linked Data solutions. The conventional wisdom in <a href="https://www.w3.org/TR/swbp-vocab-pub/">RDF best practice</a> is to establish a vocabulary with a new URI namespace, formalised using <a href="http://www.w3.org/TR/2014/REC-rdf-schema-20140225/">RDF Schema</a> or <a href="http://www.w3.org/TR/2012/REC-owl2-overview-20121211/">OWL</a> ontologies.
However, this may seem excessive learning curve for non-experts in semantic knowledge representation, and the RO-Crate community instead agreed on a dual lightweight approach: (ⅰ) <a href="https://www.researchobject.org/ro-crate/1.1/appendix/jsonld.html#adding-new-or-ad-hoc-vocabulary-terms">Document</a> how projects with their own web-presence can make a pure HTML-based vocabulary, and (ⅱ) provide a community-wide PID namespace under <a href="https://w3id.org/ro/terms/" class="uri">https://w3id.org/ro/terms/</a> that redirect to simple CSV files <a href="https://github.com/ResearchObject/ro-terms">maintained in GitHub</a>.</p>
<p>To further verify this idea, we have formalised the RO-Crate definition (see <em>Appendix A</em>). An important result of this exercise is that the underlying data structure of RO-Crate, although conceptually a graph, is represented as a depth-limited tree. This formalisation also emphasises the <em>boundedness</em> of the structure; namely, the fact that elements are specifically identified as being either semantically <em>contained</em> by the RO-Crate (<code>hasPart</code>) or mainly referenced (<code>mentions</code>) and typed as <em>external</em> to the Research Object (Contextual Entities). It is worth pointing out that this semantic containment can extend beyond the physical containment of files residing within the RO-Crate Root directory on a given storage system, as the RO-Crate data entities may include any data resource globally identifiable using IRIs.</p>
<h3 id="extensibility-and-ro-crate-profiles">Extensibility and RO-Crate profiles</h3>
<p>The RO-Crate specification provides a core set of conventions to describe research outputs using types and properties applicable across scientific domains. However we have found that domain-specific use of RO-Crate will, implicitly or explicitly, form a specialized <strong>profile</strong> of RO-Crate; <em>a set of conventions, types and properties that one minimally can require and expect to be present in that subset of RO-Crates</em>. For instance, RO-Crates used for exchange of workflows will have to contain a data entity of type <code>ComputationalWorkflow</code>, or cultural heritage records should have a <code>contentLocation</code>.</p>
<p>These profiles allow further reliable programmatic consumption and generation of RO-Crates,
Following the RO-Crate mantra of guidance over strictness, profiles are mainly <em>duck-typing</em> rather than strict semantic types, but may also have corresponding machine-readable schemas at multiple levels (file formats, JSON, RDF shapes, RDFS/OWL semantics).</p>
<p>The next version of the RO-Crate specification 1.2 will define a <a href="https://www.researchobject.org/ro-crate/1.2-DRAFT/profiles">formalization</a> for publishing and declaring conformance to RO-Crate profiles, and optionally define a machine-readable profile as a <em>Profile Crate</em> — another RO-Crate that describe the profile and in addition can list schemas for validation, compatible software, accepting repositories, serialization/packaging formats, extension vocabularies, custom JSON-LD contexts and examples. (See for example the <a href="https://about.workflowhub.eu/Workflow-RO-Crate/ro-crate-preview.html">Workflow RO-Crate profile</a>)</p>
<p>In addition, there are sometimes existing domain-specific metadata formats already exist, but they are either not RDF-based (and thus challenging to add terms for in JSON-LD) or are at a different granularity level that might become overwhelming if represented directly in the RO-Crate Metadata file (e.g. W3C PROV bundle detailing a workflow run <span class="citation" data-cites="4Pd3RTmI">[<a href="#ref-4Pd3RTmI" role="doc-biblioref">32</a>]</span>). RO-Crate allow such alternative metadata files to co-exist, and be described as data entities with references to the standards and vocabularies they conform to, enabling their programmatic consumption even where no filename or file extension conventions have emerged for those metadata formats.</p>
<p>Section 4 <em>Profiles of RO-Crate in use</em> examines the observed specialization of RO-Crate use in several domains and their emerging profiles.</p>
<h2 id="technical-implementation-of-the-ro-crate-model">Technical implementation of the RO-Crate model</h2>
<p>The RO-Crate conceptual model has been realised using JSON-LD and Schema.org in a prescriptive form as discussed in the previous sections. These technical choices were made to caters for simplicity.</p>
<p><a href="https://json-ld.org/">JSON-LD</a> <span class="citation" data-cites="17q6tYFV2">[<a href="#ref-17q6tYFV2" role="doc-biblioref">31</a>]</span> provides a way to express Linked Data as a JSON structure, where a <em>context</em> provides mapping to RDF properties and classes. While JSON-LD cannot map arbitrary JSON structures to RDF, we found it does lower the barrier as it follows a JSON structure, nowadays a common and popular format for data exchange on the Web.</p>
<p>However, JSON-LD alone has too many degrees of freedom and hidden complexities for software developers to reliably produce and consume without specialised expertise or large RDF software frameworks. A large part of the RO-Crate specification is therefore dedicated to describing JSON structures.</p>
<h3 id="ro-crate-json-ld">RO-Crate JSON-LD</h3>
<p>RO-Crate mandates the use of <a href="https://www.researchobject.org/ro-crate/1.1/appendix/jsonld.html">flattened, compacted JSON-LD</a> in the RO-Crate Metadata file <code>ro-crate-metadata.json</code><a href="#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a> where a single <code>@graph</code> array contains all the data and contextual entities in a flat list. An example can be seen in the JSON-LD snippet in listing 1 below, describing a simple RO-Crate containing data entities described using contextual entities:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode json"><code class="sourceCode json"><span id="cb1-1"><a href="#cb1-1"></a><span class="fu">{</span> <span class="dt">&quot;@context&quot;</span><span class="fu">:</span> <span class="st">&quot;https://w3id.org/ro/crate/1.1/context&quot;</span><span class="fu">,</span></span>
<span id="cb1-2"><a href="#cb1-2"></a>  <span class="dt">&quot;@graph&quot;</span><span class="fu">:</span> <span class="ot">[</span></span>
<span id="cb1-3"><a href="#cb1-3"></a>    <span class="fu">{</span> <span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;ro-crate-metadata.json&quot;</span><span class="fu">,</span>      </span>
<span id="cb1-4"><a href="#cb1-4"></a>      <span class="dt">&quot;@type&quot;</span><span class="fu">:</span> <span class="st">&quot;CreativeWork&quot;</span><span class="fu">,</span></span>
<span id="cb1-5"><a href="#cb1-5"></a>      <span class="dt">&quot;conformsTo&quot;</span><span class="fu">:</span> <span class="fu">{</span><span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;https://w3id.org/ro/crate/1.1&quot;</span><span class="fu">},</span></span>
<span id="cb1-6"><a href="#cb1-6"></a>      <span class="dt">&quot;about&quot;</span><span class="fu">:</span> <span class="fu">{</span><span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;./&quot;</span><span class="fu">}</span></span>
<span id="cb1-7"><a href="#cb1-7"></a>    <span class="fu">}</span><span class="ot">,</span></span>
<span id="cb1-8"><a href="#cb1-8"></a>    <span class="fu">{</span> <span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;./&quot;</span><span class="fu">,</span></span>
<span id="cb1-9"><a href="#cb1-9"></a>      <span class="dt">&quot;@type&quot;</span><span class="fu">:</span> <span class="st">&quot;Dataset&quot;</span><span class="fu">,</span></span>
<span id="cb1-10"><a href="#cb1-10"></a>      <span class="dt">&quot;name&quot;</span><span class="fu">:</span> <span class="st">&quot;A simplified RO-Crate&quot;</span><span class="fu">,</span></span>
<span id="cb1-11"><a href="#cb1-11"></a>      <span class="dt">&quot;author&quot;</span><span class="fu">:</span> <span class="fu">{</span><span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;#alice&quot;</span><span class="fu">},</span></span>
<span id="cb1-12"><a href="#cb1-12"></a>      <span class="dt">&quot;license&quot;</span><span class="fu">:</span> <span class="fu">{</span><span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;https://spdx.org/licenses/CC-BY-4.0&quot;</span><span class="fu">},</span></span>
<span id="cb1-13"><a href="#cb1-13"></a>      <span class="dt">&quot;hasPart&quot;</span><span class="fu">:</span> <span class="ot">[</span></span>
<span id="cb1-14"><a href="#cb1-14"></a>        <span class="fu">{</span><span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;survey-responses-2019.csv&quot;</span><span class="fu">}</span><span class="ot">,</span></span>
<span id="cb1-15"><a href="#cb1-15"></a>        <span class="fu">{</span><span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;https://example.com/pics/5707039334816454031_o.jpg&quot;</span><span class="fu">}</span></span>
<span id="cb1-16"><a href="#cb1-16"></a>      <span class="ot">]</span></span>
<span id="cb1-17"><a href="#cb1-17"></a>    <span class="fu">}</span><span class="ot">,</span></span>
<span id="cb1-18"><a href="#cb1-18"></a>    <span class="fu">{</span> <span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;survey-responses-2019.csv&quot;</span><span class="fu">,</span></span>
<span id="cb1-19"><a href="#cb1-19"></a>      <span class="dt">&quot;@type&quot;</span><span class="fu">:</span> <span class="st">&quot;File&quot;</span><span class="fu">,</span></span>
<span id="cb1-20"><a href="#cb1-20"></a>      <span class="dt">&quot;author&quot;</span><span class="fu">:</span> <span class="fu">{</span><span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;#alice&quot;</span><span class="fu">}</span></span>
<span id="cb1-21"><a href="#cb1-21"></a>    <span class="fu">}</span><span class="ot">,</span></span>
<span id="cb1-22"><a href="#cb1-22"></a>    <span class="fu">{</span> <span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;https://example.com/pics/5707039334816454031_o.jpg&quot;</span><span class="fu">,</span></span>
<span id="cb1-23"><a href="#cb1-23"></a>      <span class="dt">&quot;@type&quot;</span><span class="fu">:</span> <span class="ot">[</span><span class="st">&quot;File&quot;</span><span class="ot">,</span> <span class="st">&quot;ImageObject&quot;</span><span class="ot">]</span><span class="fu">,</span></span>
<span id="cb1-24"><a href="#cb1-24"></a>      <span class="dt">&quot;contentLocation&quot;</span><span class="fu">:</span> <span class="fu">{</span><span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;http://sws.geonames.org/8152662&quot;</span><span class="fu">},</span></span>
<span id="cb1-25"><a href="#cb1-25"></a>      <span class="dt">&quot;author&quot;</span><span class="fu">:</span> <span class="fu">{</span><span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;https://orcid.org/0000-0002-1825-0097&quot;</span><span class="fu">}</span></span>
<span id="cb1-26"><a href="#cb1-26"></a>    <span class="fu">}</span><span class="ot">,</span></span>
<span id="cb1-27"><a href="#cb1-27"></a>    <span class="fu">{</span> <span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;#alice&quot;</span><span class="fu">,</span></span>
<span id="cb1-28"><a href="#cb1-28"></a>      <span class="dt">&quot;@type&quot;</span><span class="fu">:</span> <span class="st">&quot;Person&quot;</span><span class="fu">,</span></span>
<span id="cb1-29"><a href="#cb1-29"></a>      <span class="dt">&quot;name&quot;</span><span class="fu">:</span> <span class="st">&quot;Alice&quot;</span></span>
<span id="cb1-30"><a href="#cb1-30"></a>    <span class="fu">}</span><span class="ot">,</span></span>
<span id="cb1-31"><a href="#cb1-31"></a>    <span class="fu">{</span> <span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;https://orcid.org/0000-0002-1825-0097&quot;</span><span class="fu">,</span></span>
<span id="cb1-32"><a href="#cb1-32"></a>      <span class="dt">&quot;@type&quot;</span><span class="fu">:</span> <span class="st">&quot;Person&quot;</span><span class="fu">,</span></span>
<span id="cb1-33"><a href="#cb1-33"></a>      <span class="dt">&quot;name&quot;</span><span class="fu">:</span> <span class="st">&quot;Josiah Carberry&quot;</span></span>
<span id="cb1-34"><a href="#cb1-34"></a>    <span class="fu">}</span><span class="ot">,</span></span>
<span id="cb1-35"><a href="#cb1-35"></a>    <span class="fu">{</span> <span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;http://sws.geonames.org/8152662/&quot;</span><span class="fu">,</span></span>
<span id="cb1-36"><a href="#cb1-36"></a>      <span class="dt">&quot;@type&quot;</span><span class="fu">:</span> <span class="st">&quot;Place&quot;</span><span class="fu">,</span></span>
<span id="cb1-37"><a href="#cb1-37"></a>      <span class="dt">&quot;name&quot;</span><span class="fu">:</span> <span class="st">&quot;Catalina Park&quot;</span></span>
<span id="cb1-38"><a href="#cb1-38"></a>    <span class="fu">}</span><span class="ot">,</span></span>
<span id="cb1-39"><a href="#cb1-39"></a>    <span class="fu">{</span> <span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;https://spdx.org/licenses/CC-BY-4.0&quot;</span><span class="fu">,</span></span>
<span id="cb1-40"><a href="#cb1-40"></a>      <span class="dt">&quot;@type&quot;</span><span class="fu">:</span> <span class="st">&quot;CreativeWork&quot;</span><span class="fu">,</span></span>
<span id="cb1-41"><a href="#cb1-41"></a>      <span class="dt">&quot;name&quot;</span><span class="fu">:</span> <span class="st">&quot;Creative Commons Attribution 4.0&quot;</span></span>
<span id="cb1-42"><a href="#cb1-42"></a>    <span class="fu">}</span></span>
<span id="cb1-43"><a href="#cb1-43"></a><span class="ot">]</span> <span class="fu">}</span></span></code></pre></div>
<p><em><strong>Listing 1</strong>: Simplified<a href="#fn3" class="footnote-ref" id="fnref3" role="doc-noteref"><sup>3</sup></a> RO-Crate metadata file showing the flattened compacted JSON-LD <code>@graph</code> array containing the data entities and contextual entities, cross-referenced using <code>@id</code>. The <code>ro-crate-metadata.json</code> entity declares conformance with the RO-Crate specification using a versioned persistent identifier, further RO-Crate descriptions are on the root data entity <code>./</code> or any of the referenced data or contextual entities, as exemplified by the <code>ImageObject</code> referencing contextual entities for <code>contentLocation</code> and <code>author</code> that differs from that of the overall RO-Crate. While <code>Person</code> entities ideally are identified with ORCID PIDs as for Josiah, in contrast <code>#alice</code> is here an RO-Crate local identifier, highlighting the pragmatic “just enough” Linked Data approach</em>.</p>
<p>In this flattened profile of JSON-LD, each <code>{entity}</code> under <code>@graph</code> represents the RDF triples with a common subject (<code>@id</code>), mapped properties like <code>hasPart</code>, and objects — as either literal <code>"string"</code> values, referenced <code>{objects}</code> (which properties are listed in its own entity), or a JSON <code>[list]</code> of these. If processed as JSON-LD, this forms an RDF graph by matching the <code>@id</code> IRIs and applying the <code>@context</code> mapping to schema.org terms.</p>
<h4 id="flattened-json-ld">Flattened JSON-LD</h4>
<p>When JSON-LD 1.0 <span class="citation" data-cites="17q6tYFV2">[<a href="#ref-17q6tYFV2" role="doc-biblioref">31</a>]</span> was proposed, one of the motivations was to seamlessly apply an RDF nature on top of regular JSON as frequently used by Web APIs. JSON objects in APIs are frequently nested with objects at multiple levels, and the perhaps most common form of JSON-LD is the <a href="https://json-ld.org/spec/REC/json-ld/20140116/#compacted-document-form">compacted form</a> which follows this expectation (<a href="https://www.w3.org/TR/2020/REC-json-ld11-20200716/">JSON-LD 1.1</a> further expands these capabilities, e.g. allowing nested <code>@context</code> definitions).</p>
<p>While this feature of JSON-LD can be see as a way to “hide” its RDF nature, we found that the use of nested trees (e.g. a <code>Person</code> entity appearing as <code>author</code> of a <code>File</code> which nests under a <code>Dataset</code> with <code>hasPart</code>) counter-intuitively forces consumers to consider the JSON-LD as an RDF Graph, since an identified <code>Person</code> entity can appear at multiple and repeated points of the tree (e.g. author of multiple files), necessitating node merging or duplication, which can become complicated as this approach also invites the use of <em>blank nodes</em> (entities missing <code>@id</code>).</p>
<p>By comparison, a single flat <code>@graph</code> array approach as preferred by RO-Crate means that applications can process and edit each entity as pure JSON by a simple lookup based on <code>@id</code>. At the same time, lifting all entities to the same level emphasises the principle that describing the context and provenance is just as important as describing the data, and the requirement of <code>@id</code> of every entity forces RO-Crate generators to consciously <a href="https://www.researchobject.org/ro-crate/1.1/appendix/jsonld.html#describing-entities-in-json-ld">consider existing IRIs and identifiers</a>.</p>
<h4 id="json-ld-context">JSON-LD context</h4>
<p>In JSON-LD, the <code>@context</code> is a reference to another JSON-LD document that provides mapping from JSON keys to Linked Data term IRIs, and can enable various JSON-LD directives to cater for customized JSON structures for translating to RDF.</p>
<p>RO-Crate reuses Schema.org vocabulary terms and IRIs, but provides its own versioned <a href="https://w3id.org/ro/crate/1.1/context">JSON-LD context</a>, which has a flat list with the mapping from JSON-LD keys to their URI equivalents (e.g. <code>author</code> maps to <a href="http://schema.org/author">http://schema.org/author</a>).</p>
<p>The rationale behind this decision is to support JSON-based RO-Crate applications that are largely unaware of JSON-LD, that still may want to process the <code>@context</code> to find or add Linked Data definitions of otherwise unknown properties and types. Not reusing the official Schema.org context means RO-Crate is also able to map in additional vocabularies where needed, namely the <em>Portland Common Data Model</em> (PCDM) <span class="citation" data-cites="6UztL3ul">[<a href="#ref-6UztL3ul" role="doc-biblioref">33</a>]</span> for repositories and Bioschemas <span class="citation" data-cites="vDdtcpOe">[<a href="#ref-vDdtcpOe" role="doc-biblioref">34</a>]</span> for describing computational workflows. RO-Crate profiles may <a href="https://www.researchobject.org/ro-crate/1.1/appendix/jsonld.html#extending-ro-crate">extend</a> the <code>@context</code> to re-use additional domain-specific ontologies.</p>
<p>Similarly, while the schema.org context has <code>"@type": "@id"</code> annotations for object properties, RO-Crate JSON-LD distinguishes explicitly between references to other entities (<code>{"@id": "#alice"}</code>) and string values (<code>"Alice"</code>) — meaning RO-Crate applications can find references for corresponding entities and IRIs without parsing the <code>@context</code> to understand a particular property. Notably this is exploited by the <code>ro-crate-html-js</code> <span class="citation" data-cites="hojAyeKY">[<a href="#ref-hojAyeKY" role="doc-biblioref">35</a>]</span> tool to provide reliable HTML rendering for otherwise unknown properties and types.</p>
<h2 id="ro-crate-community">RO-Crate Community</h2>
<p>The RO-Crate conceptual model, implementation and best practices are developed by a growing community of researchers, developers and publishers. The RO-Crate community is a key aspect of its effectiveness in making research artefacts FAIR. Fundamentally, the community provides the overall context of the implementation and model and ensures its interoperability.</p>
<p>The RO-Crate community consists of:</p>
<ol type="1">
<li>a diverse set of people representing a variety of stakeholders;</li>
<li>a set of collective norms;</li>
<li>an open platform that facilitates communication (GitHub, Google Docs, monthly teleconferences).</li>
</ol>
<h3 id="people">People</h3>
<p>The initial concept of RO-Crate was formed at the first Workshop on Research Objects (<a href="https://www.researchobject.org/ro2018/">RO2018</a>), held as part of the IEEE conference on eScience. This workshop followed up on considerations made at a <a href="https://rd-alliance.org/approaches-research-data-packaging-rda-11th-plenary-bof-meeting">Research Data Alliance (RDA) meeting on Research Data Packaging</a> that found similar goals across multiple data packaging efforts <span class="citation" data-cites="19ead6wt6">[<a href="#ref-19ead6wt6" role="doc-biblioref">13</a>]</span>: simplicity, structured metadata and the use of JSON-LD.</p>
<p>An important outcome of discussions that took place at RO2018 was the conclusion that the original Wf4Ever Research Object ontologies <span class="citation" data-cites="eWgJ0fZt">[<a href="#ref-eWgJ0fZt" role="doc-biblioref">12</a>]</span>, in principle sufficient for packaging research artefacts with rich descriptions, were, in practice, considered inaccessible for regular programmers (e.g. web developers) and in danger of being incomprehensible for domain scientists due to their reliance on Semantic Web technologies and other ontologies.</p>
<p>DataCrate <span class="citation" data-cites="1Hsf35Rx7">[<a href="#ref-1Hsf35Rx7" role="doc-biblioref">36</a>]</span> was presented at RO2018 as a promising lightweight alternative approach, and an agreement was made by a group of volunteers to attempt building “RO Lite” as a combination of DataCrate’s implementation and Research Object’s principles.</p>
<p>This group, originally made up of library and Semantic Web experts, has subsequently grown to include domain scientists, developers, publishers and more. This perspective of multiple views led to the specification being used in a variety of domains, from bioinformatics and regulatory submissions to humanities and cultural heritage preservation.</p>
<p>The RO-Crate community is strongly engaged with the European-wide biology/bioinformatics collaborative e-Infrastructure, ELIXIR, <span class="citation" data-cites="U6WvlYl">[<a href="#ref-U6WvlYl" role="doc-biblioref">37</a>]</span>, along with European Open Science Cloud (EOSC) projects including EOSC-Life and FAIRplus. RO-Crate has also established collaborations with Bioschemas, GA4GH, OpenAIRE and multiple H2020 projects.</p>
<p>A key set of stakeholders are developers; the RO-Crate community has made a point of attracting developers who can implement the specifications but, importantly, keeps “developer user experience” in mind. This means that the specifications are straightforward to implement and thus do not require expertise in technologies that are not widely deployed.</p>
<p>This notion of catering to “developer user experience” is an example of the set of norms that have developed and now define the community.</p>
<h3 id="norms">Norms</h3>
<p>The RO-Crate community is driven by conventions or notions that are prevalent within it but not formalised. Here, we distil what we as authors believe are the critical set of norms that have facilitated the development of RO-Crate and contributed to the ability for RO-Crate research packages to be FAIR. This is not to say that there are no other norms within the community or that everyone in the community holds these uniformly. Instead, what we emphasise is that these norms are helpful and also shaped by community practices.</p>
<ol type="1">
<li>Simplicity</li>
<li>Developer friendliness</li>
<li>Focus on examples and best practices rather than rigorous specification</li>
<li>Reuse “just enough” Web standards</li>
</ol>
<p>A core norm of RO-Crate is that of <strong>simplicity</strong>, which sets the scene for how we guide developers to structure metadata with RO-Crate. We focus mainly on documenting simple approaches to the most common use cases, such as authors having an affiliation. This norm also influences our take on <strong>developer friendliness</strong>; for instance, we are using the Web-native JSON format, allowing only a few of JSON-LD’s flexible Linked Data features. Moreover, the RO-Crate documentation is largely built up by <strong>examples</strong> showcasing <strong>best practices</strong>, rather than rigorous specifications. We build on existing <strong>Web standards</strong> that themselves are defined rigorously, which we utilise <em>“<strong>just enough</strong>”</em> in order to benefit from the advantages of Linked Data (e.g. extensions by namespaced vocabularies), without imposing too many developer choices or uncertainties (e.g. having to choose between the many RDF syntaxes).</p>
<p>While the above norms alone could easily lead to the creation of “yet another” JSON format, we keep the goal of <strong>FAIR interoperability</strong> of the captured metadata, and therefore follow closely FAIR best practices and current developments such as data citations, PIDs, open repositories and recommendations for sharing research outputs and software.</p>
<h3 id="open-platforms">Open Platforms</h3>
<p>The critical infrastructure that enables the community around RO-Crate is the use of open development platforms. This underpins the importance of open community access to supporting FAIR. Specifically, it is difficult to build and consume FAIR research artefacts without being able to access the specifications, understand how they are developed, know about any potential implementation issues, and discuss usage to evolve best practices.</p>
<p>The development of RO-Crate was driven by capturing documentation of real-life examples and best practices rather than creating a rigorous specification. At the same time, we agreed to be opinionated on the syntactic form to reduce the jungle of implementation choices; we wanted to keep the important aspects of Linked Data to adhere to the FAIR principles while retaining the option of combining and extending the structured metadata using the existing Semantic Web stack, not just build “yet another” standalone JSON format.</p>
<p>Further work during 2019 started adapting the DataCrate documentation through a more collaborative and exploratory <em>RO-Lite</em> phase, initially using Google Docs for review and discussion, then moving to GitHub as a collaboration space for developing what is now the RO-Crate specification, <a href="https://github.com/researchobject/ro-crate/">maintained as Markdown</a> in GitHub Pages and published through Zenodo.</p>
<p>In addition to the typical Open Source-style development with GitHub issues and pull requests, the RO-Crate Community now has two regular monthly calls, a Slack channel and a mailing list for coordinating the project, and many of its participants collaborate on RO-Crate at multiple conferences and coding events such as the ELIXIR BioHackathon. The community is jointly developing the RO-Crate specification and Open Source tools, as well as providing support and considering new use cases. The <a href="https://www.researchobject.org/ro-crate/community">RO-Crate Community</a> is open for anyone to join, to equally participate under a code of conduct, and currently has more than 40 members.</p>
<h1 id="ro-crate-tooling">RO-Crate Tooling</h1>
<p>The work of the community led to the development of a number of tools for creating and using RO-Crates. Table 1 shows the current set of implementations. Reviewing this list, one can see that tools support commonly used programming languages, including Python, JavaScript, and Ruby. Additionally, these tools can be integrated into commonly used research environments; in particular, the command line (<em>ro-crate-html-js</em>). Furthermore, there are tools that cater to the end-user (<em>Describo</em>, <em>Workflow Hub</em>). For example, Describo was developed to help researchers of the Australian <a href="https://criminalcharacters.com/">Criminal Characters project</a> annotate historical prisoner records to gain greater insight into the history of Australia <span class="citation" data-cites="2TcRcSoZ">[<a href="#ref-2TcRcSoZ" role="doc-biblioref">38</a>]</span>.</p>
<p>While the development of these tools is promising, our analysis of their maturity status shows that the majority of them are in the Beta stage. This is partly due to the fact that the RO-Crate specification itself only recently reached 1.0 status, in November 2019 <span class="citation" data-cites="T8vTlQ1i">[<a href="#ref-T8vTlQ1i" role="doc-biblioref">39</a>]</span>. Now that there is a fixed point of reference, and RO-Crate 1.1 (October 2020) <span class="citation" data-cites="1AdhQs7EG">[<a href="#ref-1AdhQs7EG" role="doc-biblioref">40</a>]</span> has stabilised based on feedback from application development, we expect to see a further increase in the maturity of these tools, along with the creation of new ones.</p>
<p>Given the stage of the specification, these tools have been primarily targeted to developers, essentially providing them with the core libraries for working with RO-Crates. Another target has been that of research data managers who need to manage and curate large amounts of data.</p>
<table>
<colgroup>
<col style="width: 15%" />
<col style="width: 11%" />
<col style="width: 33%" />
<col style="width: 9%" />
<col style="width: 30%" />
</colgroup>
<thead>
<tr class="header">
<th>Tool Name</th>
<th>Targets</th>
<th>Language / Platform</th>
<th>Status</th>
<th>Brief Description</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Describo <span class="citation" data-cites="bSpAL6uW">[<a href="#ref-bSpAL6uW" role="doc-biblioref">41</a>]</span></td>
<td>Research Data Managers</td>
<td>NodeJS (Desktop)</td>
<td>RC</td>
<td>Interactive desktop application to create, update and export RO-Crates for different profiles</td>
</tr>
<tr class="even">
<td>Describo Online <span class="citation" data-cites="12b41YCGR">[<a href="#ref-12b41YCGR" role="doc-biblioref">42</a>]</span></td>
<td>Platform developers</td>
<td>NodeJS (Web)</td>
<td>Alpha</td>
<td>Web-based application to create RO-Crates using cloud storage</td>
</tr>
<tr class="odd">
<td>ro-crate-excel <span class="citation" data-cites="n41B218E">[<a href="#ref-n41B218E" role="doc-biblioref">43</a>]</span></td>
<td>Data managers</td>
<td>JavaScript</td>
<td>Beta</td>
<td>Command-line tool to help create RO-Crates and HTML-readable rendering</td>
</tr>
<tr class="even">
<td>ro-crate-html-js <span class="citation" data-cites="hojAyeKY">[<a href="#ref-hojAyeKY" role="doc-biblioref">35</a>]</span></td>
<td>Developers</td>
<td>JavaScript</td>
<td>Beta</td>
<td>HTML rendering of RO-Crate</td>
</tr>
<tr class="odd">
<td>ro-crate-js <span class="citation" data-cites="1AS14nqw5">[<a href="#ref-1AS14nqw5" role="doc-biblioref">44</a>]</span></td>
<td>Research Data Managers</td>
<td>JavaScript</td>
<td>Alpha</td>
<td>Library for creating/manipulating crates; basic validation code</td>
</tr>
<tr class="even">
<td>ro-crate-ruby <span class="citation" data-cites="joQS4Xno">[<a href="#ref-joQS4Xno" role="doc-biblioref">45</a>]</span></td>
<td>Developers</td>
<td>Ruby</td>
<td>Beta</td>
<td>Ruby library for reading/writing RO-Crate, with workflow support</td>
</tr>
<tr class="odd">
<td>ro-crate-py <span class="citation" data-cites="18CvIJacO">[<a href="#ref-18CvIJacO" role="doc-biblioref">46</a>]</span></td>
<td>Developers</td>
<td>Python</td>
<td>Alpha</td>
<td>Object-oriented Python library for reading/writing RO-Crate</td>
</tr>
<tr class="even">
<td>WorkflowHub <span class="citation" data-cites="syXvUAqM">[<a href="#ref-syXvUAqM" role="doc-biblioref">47</a>]</span></td>
<td>Workflow users</td>
<td>Ruby</td>
<td>Beta</td>
<td>Workflow repository; imports and exports Workflow RO-Crate</td>
</tr>
<tr class="odd">
<td>Life Monitor <span class="citation" data-cites="10Mf5fVVl">[<a href="#ref-10Mf5fVVl" role="doc-biblioref">48</a>]</span></td>
<td>Workflow developers</td>
<td>Python</td>
<td>Alpha</td>
<td>Workflow testing and monitoring service; Workflow Testing profile of RO-Crate</td>
</tr>
<tr class="even">
<td>SCHeMa <span class="citation" data-cites="athenarc-schema">[<span class="citeproc-not-found" data-reference-id="athenarc-schema"><strong>???</strong></span>]</span></td>
<td>Workflow users</td>
<td>PHP</td>
<td>Alpha</td>
<td>Workflow execution using RO-Crate as exchange mechanism <span class="citation" data-cites="1H1OTXp4j">[<a href="#ref-1H1OTXp4j" role="doc-biblioref">49</a>]</span></td>
</tr>
<tr class="odd">
<td>galaxy2cwl <span class="citation" data-cites="6o0SYlZw">[<a href="#ref-6o0SYlZw" role="doc-biblioref">50</a>]</span></td>
<td>Workflow developers</td>
<td>Python</td>
<td>Alpha</td>
<td>Wraps Galaxy workflow as Workflow RO-Crate</td>
</tr>
<tr class="even">
<td>Modern PARADISEC <span class="citation" data-cites="DuSSAwkc">[<a href="#ref-DuSSAwkc" role="doc-biblioref">51</a>]</span></td>
<td>Repository managers</td>
<td>Platform</td>
<td>Beta</td>
<td>Cultural Heritage portal based on OCFL and RO-Crate</td>
</tr>
<tr class="odd">
<td>ONI express <span class="citation" data-cites="oKX4gup6">[<a href="#ref-oKX4gup6" role="doc-biblioref">52</a>]</span></td>
<td>Repository managers</td>
<td>Platform</td>
<td>Beta</td>
<td>Platform for publishing data and documents stored in an OCFL repository via a web interface</td>
</tr>
<tr class="even">
<td>ocfl-tools <span class="citation" data-cites="nS65dWZ">[<a href="#ref-nS65dWZ" role="doc-biblioref">53</a>]</span></td>
<td>Developers</td>
<td>JavaScript (CLI)</td>
<td>Beta</td>
<td>Tools for managing RO-Crates in an OCFL repository</td>
</tr>
<tr class="odd">
<td>RO Composer <span class="citation" data-cites="US9dAQOD">[<a href="#ref-US9dAQOD" role="doc-biblioref">54</a>]</span></td>
<td>Repository developers</td>
<td>Java</td>
<td>Alpha</td>
<td>REST API for gradually building ROs for given profile.</td>
</tr>
<tr class="even">
<td>RDA maDMP Mapper <span class="citation" data-cites="keqQfayg">[<a href="#ref-keqQfayg" role="doc-biblioref">55</a>]</span></td>
<td>Data Management Plan users</td>
<td>Python</td>
<td>Beta</td>
<td>Mapping between machine-actionable data management plans (maDMP) and RO-Crate <span class="citation" data-cites="162NBMW8l">[<a href="#ref-162NBMW8l" role="doc-biblioref">56</a>]</span></td>
</tr>
<tr class="odd">
<td>Ro-Crate_2_ma-DMP <span class="citation" data-cites="16XFBusSZ">[<a href="#ref-16XFBusSZ" role="doc-biblioref">57</a>]</span></td>
<td>Data Management Plan users</td>
<td>Python</td>
<td>Beta</td>
<td>Convert between machine-actionable data management plans (maDMP) and RO-Crate</td>
</tr>
<tr class="even">
<td>CheckMyCrate <span class="citation" data-cites="kYELZGhL">[<a href="#ref-kYELZGhL" role="doc-biblioref">58</a>]</span></td>
<td>Developers</td>
<td>Python (CLI)</td>
<td>Alpha</td>
<td>Validation according to Workflow RO-Crate profile</td>
</tr>
</tbody>
</table>
<p><em><strong>Table 1</strong>: Applications and libraries implementing RO-Crate, targeting different types of users across multiple programming languages. Status is indicative as assessed by this work (Alpha &lt; Beta &lt; Release Candidate (RC) &lt; Release).</em></p>
<h1 id="profiles-of-ro-crate-in-use">Profiles of RO-Crate in use</h1>
<p>RO-Crate is fundamentally an infrastructure to help build FAIR research artefacts. In other words, the key question is whether RO-Crate can be used to share and (re)use research artefacts. Here we look at three research domains where RO-Crate is being applied: Bioinformatics, Regulatory Science and Cultural Heritages. In addition, we note how RO-Crate may have an important role as part of machine-actionable data management plans and institutional repositories.</p>
<p>From these varied uses of RO-Crate we observe a natural differences in their detail level and the type of entities described by the RO-Crate. For instance, on submission of an RO-Crate to a workflow repository, it is reasonable to expect the RO-Crate to contain at least one workflow, ideally with a declared licence and workflow language. Specific additional recommendations such as on identifiers is also needed to meet the emerging requirements of <a href="https://fairdo.org/">FAIR Digital Objects</a>. <a href="https://github.com/ResearchObject/ro-crate/issues/153">Work has now begun</a> to formalise these different <em>profiles</em> of RO-Crates, which may impose additional constraints based on the needs of a specific domain or use case.</p>
<h2 id="bioinformatics-workflows">Bioinformatics workflows</h2>
<p><a href="https://workflowhub.eu/">WorkflowHub.eu</a> is a European cross-domain registry of computational workflows, supported by European Open Science Cloud projects, e.g. <a href="https://www.eosc-life.eu/">EOSC-Life</a>, and research infrastructures including the pan-European bioinformatics network <a href="https://elixir-europe.org/">ELIXIR</a> <span class="citation" data-cites="U6WvlYl">[<a href="#ref-U6WvlYl" role="doc-biblioref">37</a>]</span>. As part of promoting workflows as reusable tools, WorkflowHub includes documentation and high-level rendering of the workflow structure independent of its native workflow definition format. The rationale is that a domain scientist can browse all relevant workflows for their domain, before narrowing down their workflow engine requirements. As such, the WorkflowHub is intended largely as a registry of workflows already deposited in repositories specific to particular workflow languages and domains, such as UseGalaxy.eu <span class="citation" data-cites="l0OIdydM">[<a href="#ref-l0OIdydM" role="doc-biblioref">59</a>]</span> and Nextflow nf-core <span class="citation" data-cites="wq4G2CfQ">[<a href="#ref-wq4G2CfQ" role="doc-biblioref">60</a>]</span>.</p>
<p>We here describe three different RO-Crate profiles developed for use with WorkflowHub.</p>
<h3 id="profile-for-describing-workflows">Profile for describing workflows</h3>
<p>Being cross-domain, WorkflowHub has to cater for many different workflow systems. Many of these, for instance Nextflow <span class="citation" data-cites="4XDvZWxk">[<a href="#ref-4XDvZWxk" role="doc-biblioref">61</a>]</span> and Snakemake <span class="citation" data-cites="NcYZqBux">[<a href="#ref-NcYZqBux" role="doc-biblioref">62</a>]</span>, by virtue of their script-like nature, reference multiple neighbouring files typically maintained in a GitHub repository. This calls for a data exchange method that allows keeping related files together. WorkflowHub has tackled this problem by adopting RO-Crate as the packaging mechanism <span class="citation" data-cites="WDH5DsMv">[<a href="#ref-WDH5DsMv" role="doc-biblioref">63</a>]</span>, typing and annotating the constituent files of a workflow and — crucially — marking up the workflow language, as many workflow engines use common file extensions like <code>*.xml</code> and <code>*.json</code>. Workflows are further described with authors, licence, diagram previews and a listing of their inputs and outputs. RO-Crates can thus be used for interoperable deposition of workflows to WorkflowHub, but are also used as an archive for downloading workflows, embedding metadata registered with the WorkflowHub entry and translated workflow files such as abstract Common Workflow Language (CWL) <span class="citation" data-cites="hNiixe5H">[<a href="#ref-hNiixe5H" role="doc-biblioref">64</a>]</span> definitions and diagrams <span class="citation" data-cites="Sdv3iU46">[<a href="#ref-Sdv3iU46" role="doc-biblioref">65</a>]</span>.</p>
<p>RO-Crate acts therefore as an interoperability layer between registries, repositories and users in WorkflowHub. The iterative development between WorkflowHub developers and the RO-Crate community heavily informed the creation of the Bioschemas <span class="citation" data-cites="vDdtcpOe">[<a href="#ref-vDdtcpOe" role="doc-biblioref">34</a>]</span> profile for <a href="https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/">Computational Workflows</a>, which again informed the <a href="https://www.researchobject.org/ro-crate/1.1/workflows.html">RO-Crate 1.1 specification on workflows</a> and led to the RO-Crate Python library <span class="citation" data-cites="18CvIJacO">[<a href="#ref-18CvIJacO" role="doc-biblioref">46</a>]</span> and WorkflowHub’s <a href="https://about.workflowhub.eu/Workflow-RO-Crate/"><strong>Workflow RO-Crate profile</strong></a>, which, in a similar fashion to RO-Crate itself, recommends which workflow resources and descriptions are required. This co-development across project boundaries exemplifies the drive for simplicity and for establishing best practices.</p>
<h3 id="profile-for-recording-workflow-runs">Profile for recording workflow runs</h3>
<p>RO-Crates in WorkflowHub have so far been focused on workflows that are ready to be run, and development of WorkflowHub is now creating a <strong>Workflow Run RO-Crate profile</strong> for the purposes of benchmarking, testing and executing workflows. As such, RO-Crate serves as a container of both a <em>workflow definition</em> that may be executed and of a particular <em>workflow execution with test results</em>.</p>
<p>This workflow run profile is a continuation of our previous work with capturing workflow provenance in a Research Object in CWLProv <span class="citation" data-cites="4Pd3RTmI">[<a href="#ref-4Pd3RTmI" role="doc-biblioref">32</a>]</span> and TavernaPROV <span class="citation" data-cites="W6bDegHu">[<a href="#ref-W6bDegHu" role="doc-biblioref">66</a>]</span>. In both cases, we used the PROV Ontology [59], including details of every task execution with all the intermediate data, which required significant workflow engine integration<a href="#fn4" class="footnote-ref" id="fnref4" role="doc-noteref"><sup>4</sup></a>.</p>
<p>To simplify from that approach, for this Workflow Run RO-Crate profile we will use a higher level <a href="https://www.researchobject.org/ro-crate/1.1/provenance.html#software-used-to-create-files">schema.org provenance</a> for the input/output boundary of the overall workflow execution. This <em>Level 1 workflow provenance</em> <span class="citation" data-cites="4Pd3RTmI">[<a href="#ref-4Pd3RTmI" role="doc-biblioref">32</a>]</span> can be expressed generally across workflow languages with minimal engine changes, with the option of more detailed provenance traces as separate PROV resources in the RO-Crate. In the current development of <a href="https://github.com/DiSSCo/SDR">Specimen Data Refinery</a> <span class="citation" data-cites="8CVxQAro">[<a href="#ref-8CVxQAro" role="doc-biblioref">68</a>]</span> these RO-Crates will document the text recognition workflow runs of digitised biological specimens, exposed as FAIR Digital Objects <span class="citation" data-cites="k5pGkxd5">[<a href="#ref-k5pGkxd5" role="doc-biblioref">69</a>]</span>.</p>
<p>WorkflowHub has recently enabled minting of Digital Object Identifiers (DOIs), a PID commonly used for scholarly artefacts, for registered workflows, e.g. <code>10.48546/workflowhub.workflow.56.1</code> <span class="citation" data-cites="HJqdR8JL">[<a href="#ref-HJqdR8JL" role="doc-biblioref">70</a>]</span>, lowering the barrier for citing workflows as computational methods along with their FAIR metadata – captured within an RO-Crate. While it is not an aim for WorkflowHub to be a repository of workflow runs and their data, RO-Crates of <em>exemplar workflow runs</em> serve as useful workflow documentation, as well as being an exchange mechanism that preserve FAIR metadata in a diverse workflow execution environment.</p>
<h3 id="profile-for-testing-workflows">Profile for testing workflows</h3>
<p>The value of computational workflows, however, is potentially undermined by the “collapse” over time of the software and services they depend upon: for instance, software dependencies can change in a non-backwards-compatible manner, or active maintenance may cease; an external resource, such as a reference index or a database query service, could shift to a different URL or modify its access protocol; or the workflow itself may develop hard-to-find bugs as it is updated. This can take a big toll on the workflow’s reusability and on the reproducibility of any processes it evokes.</p>
<p>For this reason, WorkflowHub is complemented by a monitoring and testing service called LifeMonitor<span class="citation" data-cites="10Mf5fVVl">[<a href="#ref-10Mf5fVVl" role="doc-biblioref">48</a>]</span>, also supported by EOSC-Life. LifeMonitor’s main goal is to assist in the creation, periodic execution and monitoring of workflow tests, enabling the early detection of software collapse in order to minimise its detrimental effects. The communication of metadata related to workflow testing is achieved through the adoption of a <a href="https://crs4.github.io/life_monitor/workflow_testing_ro_crate"><strong>Workflow Testing RO-Crate profile</strong></a> stacked on top of the <em>Workflow RO-Crate</em> profile. This further specialisation of Workflow RO-Crate allows to specify additional testing-related entities (test suites, instances, services, etc.), leveraging <a href="https://www.researchobject.org/ro-crate/1.1/appendix/jsonld.html#extending-ro-crate">RO-Crate’s extension mechanism</a> through the addition of terms from custom namespaces.</p>
<p>In addition to showcasing RO-Crate’s extensibility, the testing profile is an example of the format’s flexibility and adaptability to the different needs of the research community. Though ultimately related to a computational workflow, in fact, most of the testing-specific entities are more about describing a protocol for interacting with a monitoring service than a set of research outputs and its associated metadata. Indeed, one of LifeMonitor’s main functionalities is monitoring and reporting on test suites running on existing Continuous Integration (CI) services, which is described in terms of service URLs and job identifiers in the testing profile. In principle, in this context, data could disappear altogether, leading to an RO-Crate consisting entirely of contextual entities. Such an RO-Crate acts more as an exchange format for communication between services (WorkflowHub and LifeMonitor) than as an aggregator for research data and metadata, providing a good example of the format’s high versatility.</p>
<h2 id="regulatory-sciences">Regulatory Sciences</h2>
<p><a href="https://www.biocomputeobject.org/">BioCompute Objects</a> (BCO) <span class="citation" data-cites="17fJm3JS">[<a href="#ref-17fJm3JS" role="doc-biblioref">71</a>]</span> is a community-led effort to standardise submissions of computational workflows to biomedical regulators. For instance, a genomics sequencing pipeline, as part of a personalised cancer treatment study, can be submitted to the US Food and Drugs Administration (FDA) for approval. BCOs are formalised in the standard IEEE 2791-2020 <span class="citation" data-cites="R51nz7Xg">[<a href="#ref-R51nz7Xg" role="doc-biblioref">72</a>]</span> as a combination of <a href="https://opensource.ieee.org/2791-object/ieee-2791-schema/">JSON Schemas</a> that define the structure of JSON metadata files describing exemplar workflow runs in detail, covering aspects such as the usability and error domain of the workflow, its runtime requirements, the reference datasets used and representative output data produced.</p>
<p>BCOs provide a structured view over a particular workflow, informing regulators about its workings independently of the underlying workflow definition language. However, BCOs have only limited support for additional metadata<a href="#fn5" class="footnote-ref" id="fnref5" role="doc-noteref"><sup>5</sup></a>. For instance, while the BCO itself can indicate authors and contributors, and in particular regulators and their review decisions, it cannot describe the provenance of individual data files or workflow definitions.</p>
<p>As a custom JSON format, BCOs cannot be extended with Linked Data concepts, except by adding an additional top-level JSON object formalised in another JSON Schema. A BCO and workflow submitted by upload to a regulator will also frequently consist of multiple cross-related files. Crucially, there is no way to tell whether a given <code>*.json</code> file is a BCO file, except by reading its content and check for its <code>spec_version</code>.</p>
<p>We can then consider how a BCO and its referenced artefacts can be packaged and transferred following FAIR principles. <a href="https://biocompute-objects.github.io/bco-ro-crate/"><strong>BCO RO-Crate</strong></a><span class="citation" data-cites="1H1Z87nyU">[<a href="#ref-1H1Z87nyU" role="doc-biblioref">73</a>]</span>, part of the BioCompute Object user guides, defines a set of best practices for wrapping a BCO with a workflow, together with its exemplar outputs in an RO-Crate, which then provides typing and additional provenance metadata of the individual files, workflow definition, referenced data and the BCO metadata itself.</p>
<p>Here the BCO is responsible for describing the <em>purpose</em> of a workflow and its run at an abstraction level suitable for a domain scientist, while the more open-ended RO-Crate describes the surroundings of the workflow, classifying and relating its resources and providing provenance of their existence beyond the BCO. This emerging <em>separation of concerns</em> highlight how RO-Crate is used side-by-side of existing standards, even where there are apparent partial overlaps.</p>
<p>A similar separation of concerns can be found if considering the RO-Crate as a set of files, where the <em>transport-level</em> metadata, such as checksum of files, are <a href="https://www.researchobject.org/ro-crate/1.1/appendix/implementation-notes.html#adding-ro-crate-to-bagit">delegated to BagIt</a> manifests, a standard focusing on the preservation challenges of digital libraries<span class="citation" data-cites="UQNJggmh">[<a href="#ref-UQNJggmh" role="doc-biblioref">24</a>]</span>. As such, RO-Crates are not required to iterate all the files in their folder hierarchy, only those that benefit from being described.</p>
<p>Specifically, a BCO alone is insufficient for reliable re-execution of a workflow, which would need a compatible workflow engine depending on the workflow definition language, so IEEE 2791 recommends using Common Workflow Language <span class="citation" data-cites="hNiixe5H">[<a href="#ref-hNiixe5H" role="doc-biblioref">64</a>]</span> for interoperable pipeline execution. CWL itself relies on tool packaging in software containers using <a href="https://www.docker.com/">Docker</a> or <a href="https://docs.conda.io/">Conda</a>. Thus, we can consider BCO RO-Crate as a stack: transport-level manifests of files (BagIt), provenance, typing and context of those files (RO-Crate), workflow overview and purpose (BCO), interoperable workflow definition (CWL) and tool distribution (Docker).</p>
<figure>
<img src="images/ro-crate-bco-sep-of-concerns.svg" alt="" /><figcaption><strong>Separation of Concerns in BCO RO-Crate</strong>. BioCompute Object (IEEE2791) is a JSON file that structurally explains the purpose and implementation of a computational workflow, for instance implemented in Nextflow, that installs the workflow’s software dependencies as Docker containers or BioConda packages. An example execution of the workflow shows the different kinds of result outputs, which may be external, using GitHub LFS to support larger data. RO-Crate gathers all these local and external resources, relating them and giving individual descriptions, for instance permanent DOI identifiers for reused datasets accessed from Zenodo, but also adding external identifiers to attribute authors using ORCID or to identify which licences apply to individual resources. The RO-Crate and its local files are captured in a BagIt whose checksum ensures completeness, combined with Big Data Bag <span class="citation" data-cites="nCdDRreI">[<a href="#ref-nCdDRreI" role="doc-biblioref">74</a>]</span> features to “complete” the bag with large external files such as the workflow outputs</figcaption>
</figure>
<h2 id="digital-humanities-cultural-heritage">Digital Humanities: Cultural Heritage</h2>
<p><a href="https://www.paradisec.org.au/">PARADISEC</a> (the Pacific And Regional Archive for Digital Sources in Endangered Cultures) maintains a repository of more than 500,000 files documenting endangered languages across more than 16,000 items, collected over many years by researchers interviewing and recording native speakers across the region. As a proposed update of the 18 year old infrastructure, the <a href="https://mod.paradisec.org.au/">Modern PARADISEC demonstrator</a> has been <a href="https://arkisto-platform.github.io/case-studies/paradisec/">developed</a> to also help digitally preserve these artefacts using the <a href="https://ocfl.io/1.0/spec/">Oxford Common File Layout</a> (OCFL) for file consistency and RO-Crate for structuring and capturing the metadata of each item. The existing PARADISEC data collection has been ported and captured as RO-Crates. A web portal then exposes the repository and its entries by indexing the RO-Crate metadata files using Elasticsearch as a “NoSQL” object database, presenting a domain-specific view of the items — the RO-Crate is “hidden” and does not change the user interface.</p>
<p>This use case takes advantage of several RO-Crate features and principles. Firstly, the transcribed metadata are now independent of the PARADISEC platform and can be archived, preserved and processed in its own right, using Schema.org vocabularies augmented with PARADISEC-specific terms. The lightweight infrastructure with RO-Crate as the holder of itemised metadata in regular files (organised using OCFL<span class="citation" data-cites="TivFlCqv">[<a href="#ref-TivFlCqv" role="doc-biblioref">25</a>]</span>, with checksums for integrity checking and versioning) also gives flexibility for future developments and maintenance; for example, potentially using Linked Data software such as a graph database, queried using SPARQL triple patterns across RO-Crates, or a “last resort” fallback to the generic RO-Crate HTML preview <span class="citation" data-cites="hojAyeKY">[<a href="#ref-hojAyeKY" role="doc-biblioref">35</a>]</span>, which can be hosted as static files by any web server, in line with the approach taken by the Endings Project<a href="#fn6" class="footnote-ref" id="fnref6" role="doc-noteref"><sup>6</sup></a>.</p>
<h2 id="machine-actionable-data-management-plans">Machine-actionable Data Management Plans</h2>
<p>Machine-actionable Data Management Plans (maDMPs) have been proposed as an improvement to automate FAIR data management tasks in research <span class="citation" data-cites="1DVC7tcYl">[<a href="#ref-1DVC7tcYl" role="doc-biblioref">75</a>]</span>, e.g. by using PIDs and controlled vocabularies to describe what happens to data over the research life cycle <span class="citation" data-cites="1ZBdroY0">[<a href="#ref-1ZBdroY0" role="doc-biblioref">76</a>]</span>. The Research Data Alliance’s <em>DMP Common Standard</em> for maDMPs <span class="citation" data-cites="T271G9Gd">[<a href="#ref-T271G9Gd" role="doc-biblioref">77</a>]</span> is one such formalisation for expressing maDMPs, which can be expressed as Linked Data using the DMP Common Standard Ontology <span class="citation" data-cites="1FiTt7FKJ">[<a href="#ref-1FiTt7FKJ" role="doc-biblioref">78</a>]</span>, a specialisation of the W3C Data Catalog Vocabulary (DCAT) <span class="citation" data-cites="naVrw7g1">[<a href="#ref-naVrw7g1" role="doc-biblioref">79</a>]</span>. RDA maDMPs are usually expressed using regular JSON, conforming to the DMP JSON Schema.</p>
<p>A mapping has been produced between Research Object Crates and Machine-actionable Data Management Plans <span class="citation" data-cites="162NBMW8l">[<a href="#ref-162NBMW8l" role="doc-biblioref">56</a>]</span>, implemented by the RO-Crate {RDA maDMP Mapper <span class="citation" data-cites="keqQfayg">[<a href="#ref-keqQfayg" role="doc-biblioref">55</a>]</span>. A similar mapping has been implemented by <code>RO-Crate_2_ma-DMP</code> <span class="citation" data-cites="16XFBusSZ">[<a href="#ref-16XFBusSZ" role="doc-biblioref">57</a>]</span>. In both cases, a maDMP can be converted to a RO-Crate, or vice versa. In <span class="citation" data-cites="162NBMW8l">[<a href="#ref-162NBMW8l" role="doc-biblioref">56</a>]</span> this functionality caters for two use cases:</p>
<ol type="1">
<li>Start a skeleton data management plan based on an existing RO-Crate dataset, e.g. from an RO-Crate from WorkflowHub.</li>
<li>Instantiate an RO-Crate based on a data management plan.</li>
</ol>
<p>An important difference here is that data management plans are (ideally) written in advance of data production, while RO-Crates are typically created to describe data after it has been generated. This approach shows the importance of <em>templating</em> to make both tasks more automatable and achievable, and how RO-Crate can fit into earlier stages of the research life cycle.</p>
<h2 id="institutional-data-repositories-harvard-data-commons">Institutional data repositories – Harvard Data Commons</h2>
<p>The concept of a Data Commons for research collaboration was originally defined as “cyber-infrastructure that co-locates data, storage, and computing infrastructure with commonly used tools for analysing and sharing data to create an interoperable resource for the research community” <span class="citation" data-cites="7O1j0YRj">[<a href="#ref-7O1j0YRj" role="doc-biblioref">80</a>]</span>. More recently, it was established to integrate active data-intensive research with data management and archival best practices. It facilitates research by providing computational infrastructure where researchers can use, share and store data, software, workflows and other digital artefacts used in their studies. Furthermore, the Commons feature tools and services, such as computation clusters and storage for scalability, data repositories for disseminating and preserving regular, but also large or sensitive datasets, and other research assets. Multiple initiatives were undertaken to create Data Commons on national, research, and institutional levels. For example, the <a href="https://ardc.edu.au">Australian Research Data Commons (ARDC)</a> <span class="citation" data-cites="1EOrDAznb">[<a href="#ref-1EOrDAznb" role="doc-biblioref">81</a>]</span> is a national initiative that enables local researchers and industries to access computing infrastructure, training, and curated datasets for data-intensive research. NCI’s <a href="https://gdc.cancer.gov/">Genomic Data Commons</a> (GDC) <span class="citation" data-cites="oCofS7oZ">[<a href="#ref-oCofS7oZ" role="doc-biblioref">82</a>]</span> provides the cancer research community with access to a vast volume of genomic and clinical data. Initiatives such as <a href="https://www.rd-alliance.org/groups/global-open-research-commons-ig">Research Data Alliance (RDA) Global Open Research Commons</a> propose standards on the implementation of Data Commons to avoid them becoming “data silos” and enable interoperability from one Data Commons to another.</p>
<p><strong>Harvard Data Commons</strong> <span class="citation" data-cites="1Hh0kF7qr">[<a href="#ref-1Hh0kF7qr" role="doc-biblioref">83</a>]</span> aims to address data access and reuse challenges of cross-disciplinary research within a research institution. It brings together multiple institutional schools, libraries, computing centres and the <a href="https://dataverse.harvard.edu/">Harvard Dataverse data repository</a>. <a href="https://dataverse.org/">Dataverse</a> <span class="citation" data-cites="1GS5Dq9yc">[<a href="#ref-1GS5Dq9yc" role="doc-biblioref">84</a>]</span> is a free and open-source software platform to archive, share and cite research data. The Harvard Dataverse repository is the largest of 70 installations worldwide, containing over 100K datasets with about 1M data files. Toward the goal of facilitating collaboration and data discoverability and management within the university, Harvard Data Commons has the following primary objectives:</p>
<ol type="1">
<li>integrating Harvard Research Computing with Harvard Dataverse by leveraging Globus endpoints <span class="citation" data-cites="7yKqnsAx">[<a href="#ref-7yKqnsAx" role="doc-biblioref">85</a>]</span> that will allow an automatic transfer of large datasets to the repository. In some cases, only the metadata will be transferred while the data stays stored in remote storage;</li>
<li>supporting advanced research workflows and providing packaging options for assets such as code and workflows in the Harvard Dataverse repository to enable reproducibility and reuse, and</li>
<li>integrating repositories supported by Harvard, which are <a href="https://dash.harvard.edu">DASH</a>, the open access institutional repository, the Digital Repository Services (DRS) for preserving digital asset collections, and the Harvard Dataverse.</li>
</ol>
<p>Particularly relevant to this paper is the second objective of the Harvard Data Commons, which aims to support the deposit of research artefacts to Harvard Dataverse with sufficient information in the metadata to allow their future reuse (Figure~). Considering the requirements of incorporating data, code, and other artefacts from various institutional infrastructures, Harvard Data Commons is currently working on RO-Crate adaptation. The RO-Crate metadata provides the necessary structure to make all research artefacts FAIR. The Dataverse software already has extensive support for metadata, including the Data Documentation Initiative (DDI), Dublin Core, DataCite, and Schema.org. Incorporating RO-Crate, which has the flexibility to describe a wide range of research resources, will facilitate their seamless transition from one infrastructure to the other within the Harvard Data Commons.</p>
<div id="fig:hdc" class="fignos">
<figure>
<img src="images/data-commons-ro-crate-figure-5.svg" alt="" /><figcaption><span>Figure 3:</span> <strong>One aspect of Harvard Data Commons</strong>. Automatic encapsulation and deposit of artefacts from data management tools used during active research at the Harvard Dataverse repository.</figcaption>
</figure>
</div>
<p>Even though the Harvard Data Commons is specific to Harvard University, the overall vision and the three objectives can be abstracted and applied to other universities or research organisations. The Commons will be designed and implemented using standards and commonly-used approaches to make it interoperable and reusable by others.</p>
<h1 id="related-work">Related Work</h1>
<p>With the increasing digitisation of research processes, there has been a significant call for the wider adoption of interoperable sharing of data and its associated metadata. For a comprehensive overview and recommendations, in particular for data, we refer to <span class="citation" data-cites="OkXvEtY">[<a href="#ref-OkXvEtY" role="doc-biblioref">86</a>]</span>, which highlights the wide variety of metadata and documentation that the literature prescribes for enabling data reuse.</p>
<p>Here we focus on approaches for bundling research artefacts along with their metadata. This notion of publishing compound objects for scholarly communication has a long history behind it <span class="citation" data-cites="D318Yc35">[<a href="#ref-D318Yc35" role="doc-biblioref">87</a>]</span> <span class="citation" data-cites="16USoLuIY">[<a href="#ref-16USoLuIY" role="doc-biblioref">88</a>]</span>, but recent approaches have followed three main strands: 1) publishing to centralised repositories; 2) packaging approaches similar to RO-Crate; and 3) bundling the computational workflow around a scientific experiment.</p>
<h2 id="bundling-and-packaging-digital-research-artefacts">Bundling and Packaging Digital Research Artefacts</h2>
<p>Early work making the case for publishing compound scholarly communication units <span class="citation" data-cites="16USoLuIY">[<a href="#ref-16USoLuIY" role="doc-biblioref">88</a>]</span> led to the development of the <a href="http://www.openarchives.org/ore/1.0/primer">Object Re-Use and Exchange model</a> (OAI-ORE), providing a structured <strong>resource map</strong> of the digital artefacts that together support a scholarly output.</p>
<p>The challenge of describing computational workflows was one of the main motivations for the early proposal of <em>Research Objects</em> (RO) <span class="citation" data-cites="sRYUCzCq">[<a href="#ref-sRYUCzCq" role="doc-biblioref">11</a>]</span> as first-class citizens for sharing and publishing. The RO approach involves bundling datasets, workflows, scripts and results along with traditional dissemination materials like journal articles and presentations, forming a single package. Crucially, these resources are not just gathered, but also individually typed, described and related to each other using semantic vocabularies. As pointed out in <span class="citation" data-cites="sRYUCzCq">[<a href="#ref-sRYUCzCq" role="doc-biblioref">11</a>]</span> an open-ended <em>Linked Data</em> approach is not sufficient for scholarly communication: a common data model is also needed in addition to common and best practices for managing and annotating lifecycle, ownership, versioning and attributions.</p>
<p>Considering the FAIR principles <span class="citation" data-cites="6DjakjNS">[<a href="#ref-6DjakjNS" role="doc-biblioref">5</a>]</span>, we can say with hindsight that the initial RO approaches strongly targeted <em>Interoperability</em>, with a particular focus on the reproducibility of <em>in-silico experiments</em> involving computational workflows and the reuse of existing RDF vocabularies.</p>
<p>The first implementation of Research Objects for sharing workflows in myExperiment <span class="citation" data-cites="sTNYjVhY">[<a href="#ref-sTNYjVhY" role="doc-biblioref">89</a>]</span> was based on RDF ontologies <span class="citation" data-cites="1zQ0H831">[<a href="#ref-1zQ0H831" role="doc-biblioref">90</a>]</span>, building on Dublin Core, FOAF, SIOC, Creative Commons and OAI-ORE to form myExperiment ontologies for describing social networking, attribution and credit, annotations, aggregation packs, experiments, view statistics, contributions, and workflow components <span class="citation" data-cites="stokk0es">[<a href="#ref-stokk0es" role="doc-biblioref">91</a>]</span>.</p>
<p>This initially workflow-centric approach was further formalized as the Wf4Ever Research Object Model <span class="citation" data-cites="eWgJ0fZt">[<a href="#ref-eWgJ0fZt" role="doc-biblioref">12</a>]</span>, which is a general-purpose research artefact description framework, based on existing ontologies (FOAF, Dublin Core Terms, OAI-ORE and AO/OAC precursors to the W3C Web Annotation Model <span class="citation" data-cites="KGZLxbxf">[<a href="#ref-KGZLxbxf" role="doc-biblioref">92</a>]</span>), adding specializations for workflow models and executions based on W3C PROV-O <span class="citation" data-cites="cLnDUfHN">[<a href="#ref-cLnDUfHN" role="doc-biblioref">93</a>]</span>. The Research Object statements are saved in a <em>manifest</em> (the OAI-ORE <em>resource map</em>), with additional annotation resources containing user-provided details such as title and description.</p>
<p>We can claim that one barrier for adoption of the Wf4Eer Research Object model for general packaging digital research artefacts was exactly this re-use of multiple existing vocabularies (FAIR principle I2: <em>Meta)data use vocabularies that follow FAIR principles</em>), itself a challenge <span class="citation" data-cites="16Tre0SD9">[<a href="#ref-16Tre0SD9" role="doc-biblioref">94</a>]</span>, as developers had to navigate documentation of multiple overlapping ontologies in addition to facing the usual Semantic Web choices for RDF serialization formats, identifier minting and publishing resources on the Web.</p>
<p>Several later developments for Research Objects improved on this situation, such as ROHub used by Earth Sciences <span class="citation" data-cites="tyKVYqu2">[<a href="#ref-tyKVYqu2" role="doc-biblioref">95</a>]</span>, which provides a interactive user-interface for making research objects, along with Research Object Bundle <span class="citation" data-cites="dijZpInF">[<a href="#ref-dijZpInF" role="doc-biblioref">67</a>]</span> (RO Bundle), which is a ZIP-archive embedding data files and a JSON-LD serialization of the manifest has mapping for a limited set of terms and was used for storing workflow run provenance (TavernaPROV <span class="citation" data-cites="W6bDegHu">[<a href="#ref-W6bDegHu" role="doc-biblioref">66</a>]</span>).</p>
<p>RO-Bundle evolved to <a href="https://w3id.org/ro/bagit">Research Object BagIt archives</a>, a variant of RO Bundle as a BagIt archive <span class="citation" data-cites="UQNJggmh">[<a href="#ref-UQNJggmh" role="doc-biblioref">24</a>]</span>, used by Big Data Bags <span class="citation" data-cites="nCdDRreI">[<a href="#ref-nCdDRreI" role="doc-biblioref">74</a>]</span>, CWLProv <span class="citation" data-cites="4Pd3RTmI">[<a href="#ref-4Pd3RTmI" role="doc-biblioref">32</a>]</span> and WholeTale <span class="citation" data-cites="16M9YRYfg">[<a href="#ref-16M9YRYfg" role="doc-biblioref">96</a>]</span> <span class="citation" data-cites="wIuPSf9U">[<a href="#ref-wIuPSf9U" role="doc-biblioref">97</a>]</span>.</p>
<h2 id="fair-digital-objects">FAIR Digital Objects</h2>
<p>FAIR Digital Objects (FDO) <span class="citation" data-cites="k5pGkxd5">[<a href="#ref-k5pGkxd5" role="doc-biblioref">69</a>]</span> have been proposed as a conceptual framework for making digital resources available in a Digital Objects (DO) architecture that encourages active use of the objects and their metadata. In particular, an FDO has five parts: (i) The FDO <em>content</em>, bit sequences stored in an accessible repository; (ii) a <em>Persistent Identifier</em> (PID) such as a DOI that identifies the FDO and can resolve these parts; (iii) Associated rich <em>metadata</em>, as separate FDOs; (iv) Type definitions, also separate FDOs; (v) Associated <em>operations</em> for the given types. A Digital Object typed as a Collection aggregates other DOs by reference.</p>
<p>As an “<a href="https://www.dona.net/sites/default/files/2018-11/DOIPv2Spec_1.svg">abstract protocol</a>”, DOs could be implemented in multiple ways. One suggested implementation is the <a href="https://fairdigitalobjectframework.org/">FAIR Digital Object Framework</a>, based on HTTP and the Linked Data Principles. While there is agreement on using PIDs based on DOIs, consensus on how to represent common metadata, core types and collections as FDOs has not yet been reached. We argue that RO-Crate can play an important role for FDOs:</p>
<ol type="1">
<li>By providing a predictable and extensible serialisation of structured metadata.</li>
<li>By formalising how to aggregate digital objects as collections (and adding their context).</li>
<li>By providing a natural Metadata FDO in the form of the RO-Crate Metadata File.</li>
<li>By being based on Linked Data and schema.org vocabulary, meaning that PIDs already exist for common types and properties.</li>
</ol>
<p>At the same time, it is clear that the goal of FDO is broader than that of RO-Crate; namely, FDOs are active objects with distributed operations, and add further constraints such as PIDs for every element. These features improve FAIR features of digital objects and are also useful for RO-Crate, but they also severely restrict the infrastructure that needs to be implemented and maintained in order for FDOs to remain available. RO-Crate, on the other hand, is more flexible: it can minimally be used within any file system structure, or ideally exposed through a range of Web-based scenarios. A <em>FAIR profile of RO-Crate</em> (e.g. enforcing PID usage) will fit well within a FAIR Digital Object ecosystem.</p>
<h2 id="packaging-workflows">Packaging Workflows</h2>
<p>The use of computational workflows, typically combining a chain of open source tools in an analytical pipeline, has gained prominence, in particular in the life sciences. Workflows may have initially been used to improve computational scalability, but they also assist in making computed data results FAIR <span class="citation" data-cites="nHPbkJXy">[<a href="#ref-nHPbkJXy" role="doc-biblioref">4</a>]</span>, for instance by improving reproducibility <span class="citation" data-cites="1D4gyjbRv">[<a href="#ref-1D4gyjbRv" role="doc-biblioref">98</a>]</span>, but also because programmatic data usage help propagate their metadata and provenance <span class="citation" data-cites="TmTSmrSZ">[<a href="#ref-TmTSmrSZ" role="doc-biblioref">99</a>]</span>. At the same time, workflows raise additional FAIR challenges, since they can be considered important research artefacts themselves, posing the problem of capturing and explaining the computational methods behind the analysis they perform <span class="citation" data-cites="sbRbAxdT">[<a href="#ref-sbRbAxdT" role="doc-biblioref">3</a>]</span>.</p>
<p>Even when researchers follow current best practices for workflow reproducibility, <span class="citation" data-cites="74cIRMFz">[<a href="#ref-74cIRMFz" role="doc-biblioref">100</a>]</span> <span class="citation" data-cites="1D4gyjbRv">[<a href="#ref-1D4gyjbRv" role="doc-biblioref">98</a>]</span> the communication of outcomes through traditional academic publishing routes relying on a textual representation adds barriers that hinder reproducibility and FAIR use of the knowledge previously captured in the workflow.</p>
<p>As a real-life example, let us look at a metagenomics article <span class="citation" data-cites="FG7BdkMW">[<a href="#ref-FG7BdkMW" role="doc-biblioref">101</a>]</span> where the authors have gone to extraordinary efforts to document the individual tools that have been reused, including their citations, versions, settings, parameters and combinations. The <em>Methods</em> section is 2 pages in tight double-columns with 24 additional references, supported by the availability of data on an FTP server (60 GB) <span class="citation" data-cites="fNw8iptq">[<a href="#ref-fNw8iptq" role="doc-biblioref">102</a>]</span> and of open source code in GitHub <a href="https://github.com/Finn-Lab/MGS-gut">Finn-Lab/MGS-gut</a> <span class="citation" data-cites="1BmIQbauY">[<a href="#ref-1BmIQbauY" role="doc-biblioref">103</a>]</span>, including the pipeline as shell scripts and associated analysis scripts in R and Python.</p>
<p>This attention to reporting detail for computational workflows is unfortunately not yet the norm, and although bioinformatics journals have strong <em>data availability</em> requirements, they frequently do not require authors to include or cite <em>software, scripts and pipelines</em> used for analysing and producing results <span class="citation" data-cites="14UO6fjKC">[<a href="#ref-14UO6fjKC" role="doc-biblioref">104</a>]</span> – rather, authors might be penalised for doing so [cite?] as it would detrimentally count against arbitrary limits on number of pages and references.</p>
<p>However detailed this additional information might be, another researcher who wants to reuse a particular computational method may first want to assess if the described tool or workflow is Re-runnable (executable at all), Repeatable (same results for original inputs on same platform), Reproducible (same results for original inputs with different platform or newer tools) and ultimately Reusable (similar results for different input data), Repurposable (reusing parts of the method for making a new method) or Replicable (rewriting the workflow following the method description). <span class="citation" data-cites="jBiuoWG3">[<a href="#ref-jBiuoWG3" role="doc-biblioref">105</a>]</span><span class="citation" data-cites="LrIJVM5a">[<a href="#ref-LrIJVM5a" role="doc-biblioref">106</a>]</span></p>
<p>Following the textual description alone, researchers would be forced to jump straight to evaluate “Replicable” by rewriting the pipeline from scratch. This can be expensive and error-prone. They would firstly need to install all the software dependencies and download reference datasets. This can be a daunting task in and of itself, which may have to be repeated multiple times as workflows typically are developed at small scale on desktop computers, scaled up to local clusters, and potentially put into production using cloud instances, each of which will have different requirements for software installations.</p>
<p>In recent years the situation has been greatly improved by software packaging and container technologies like Docker and Conda, which have seen increased adoption in life sciences <span class="citation" data-cites="a1tub17j">[<a href="#ref-a1tub17j" role="doc-biblioref">107</a>]</span> thanks to collaborative efforts such as BioConda <span class="citation" data-cites="sYguBb3Q">[<a href="#ref-sYguBb3Q" role="doc-biblioref">108</a>]</span> and BioContainers <span class="citation" data-cites="rJUU3iuR">[<a href="#ref-rJUU3iuR" role="doc-biblioref">109</a>]</span>, and support by Linux distributions (e.g. Debian Med <span class="citation" data-cites="8DE4ZSsb">[<a href="#ref-8DE4ZSsb" role="doc-biblioref">110</a>]</span>). As of May 2021, more than 7000 software packages are available [in BioConda alone] (https://anaconda.org/bioconda/), and 9000 containers <a href="https://biocontainers.pro/#/registry">in BioContainers</a>. Docker and Conda have gained integration in workflow systems such as Snakemake <span class="citation" data-cites="NcYZqBux">[<a href="#ref-NcYZqBux" role="doc-biblioref">62</a>]</span>, Galaxy <span class="citation" data-cites="WBsVRA32">[<a href="#ref-WBsVRA32" role="doc-biblioref">111</a>]</span> and Nextflow <span class="citation" data-cites="4XDvZWxk">[<a href="#ref-4XDvZWxk" role="doc-biblioref">61</a>]</span>, meaning a downloaded workflow definition can now be executed on a “blank” machine (except for the workflow engine) with the underlying analytical tools installed on demand – but even here there is a reproducibility challenge, for instance <a href="https://www.docker.com/blog/docker-hub-image-retention-policy-delayed-and-subscription-updates/">Docker Hub’s retention policy will expire container images after 6 months</a>, or lack of recording versions of transitive dependencies of Conda packages could cause incompatibilities if the packages are subsequently updated. Except for brief metadata in their repositories, these containers and packages do not capture any semantic relationships of their content – rather their opaqueness and wrapping of arbitrary binary tools makes such relationships harder to find.</p>
<p>From this we see that computational workflows are themselves complex digital objects that needs to be recorded not just as files, but in the context of their execution environment, dependencies and analytical purpose in research – as well as other metadata (e.g. version, license, attribution and identifiers).</p>
<h1 id="conclusion">Conclusion</h1>
<p>RO-Crate provides an approach to packaging digital research artefacts with structured metadata, assisting developers and researchers to produce and consume FAIR archives of their research.</p>
<p>As a set of best practice recommendations, developed by an open and broad community, RO-Crate shows how to use “just enough” Linked Data standards in a consistent way, with structured metadata using a rich base vocabulary that can cover general-purpose contextual relations, whilst retaining extensibility to domain- and application-specific uses.</p>
<p>The adoption of simple web technologies in the RO-Crate specification has helped a rapid development of a wide variety of supporting open source tools and libraries. RO-Crate fits into the larger landscape of open scholarly communication and FAIR Digital Object infrastructure, and can be integrated into data repository platforms. RO-Crate can be applied as a data/metadata exchange mechanism, assist in long-term archival preservation of metadata and data, or simply used at small-scale by individual researchers. Thanks to its strong community support, new and improved profiles and tools are continuously added to the RO-Crate tooling landscape, making it easier for adopters to find examples and support for their own use case.</p>
<h1 id="acknowledgements">Acknowledgements</h1>
<p>This work has received funding from the European Commission’s Horizon 2020 research and innovation programme for projects <a href="https://cordis.europa.eu/project/id/823830">BioExcel-2</a> (H2020-INFRAEDI-2018-1 823830), <a href="https://cordis.europa.eu/project/id/730976">IBISBA 1.0</a> (H2020-INFRAIA-2017-1-two-stage 730976), <a href="https://cordis.europa.eu/project/id/871118">PREP-IBISBA</a> (H2020-INFRADEV-2019-2 871118), <a href="https://cordis.europa.eu/project/id/824087">EOSC-Life</a> (H2020-INFRAEOSC-2018-2 824087), <a href="https://cordis.europa.eu/project/id/823827">SyntheSys+</a> (H2020-INFRAIA-2018-1 823827).</p>
<p>Björn Grüning is supported by DataPLANT (<a href="https://gepris.dfg.de/gepris/projekt/442077441">NFDI 7/1 – 42077441</a>), part of the German National Research Data Infrastructure (NFDI), funded by the Deutsche Forschungsgemeinschaft (DFG).</p>
<p>Ana Trisovic is funded by the Alfred P. Sloan Foundation <a href="https://sloan.org/grant-detail/9555">(grant number P-2020-13988)</a>. Harvard Data Commons is supported by an award from Harvard University Information Technology (HUIT).</p>
<h2 id="contributions">Contributions</h2>
<p>Author contributions to this article and the RO-Crate projet according to the Contributor Roles Taxonomy <a href="https://casrai.org/credit/">CASRAI CrEDiT</a> <span class="citation" data-cites="ewNBB7el">[<a href="#ref-ewNBB7el" role="doc-biblioref">112</a>]</span>:</p>
<dl>
<dt>Stian Soiland-Reyes</dt>
<dd>Conceptualization, Data curation, Formal Analysis, Funding acquisition, Investigation, Methodology, Project administration, Software, Visualization, Writing – original draft, Writing – review &amp; editing
</dd>
<dt>Peter Sefton</dt>
<dd>Conceptualization, Investigation, Methodology, Project administration, Resources, Software, Writing – review &amp; editing
</dd>
<dt>Mercè Crosas</dt>
<dd>Writing – review &amp; editing
</dd>
<dt>Leyla Jael Castro</dt>
<dd>Methodology, Writing – review &amp; editing
</dd>
<dt>Frederik Coppens</dt>
<dd>Writing – review &amp; editing
</dd>
<dt>José M. Fernández</dt>
<dd>Methodology, Software, Writing – review &amp; editing
</dd>
<dt>Daniel Garijo</dt>
<dd>Methodology, Writing – review &amp; editing
</dd>
<dt>Björn Grüning</dt>
<dd>Writing – review &amp; editing
</dd>
<dt>Marco La Rosa</dt>
<dd>Software, Methodology, Writing – review &amp; editing
</dd>
<dt>Simone Leo</dt>
<dd>Software, Methodology, Writing – review &amp; editing
</dd>
<dt>Eoghan Ó Carragáin</dt>
<dd>Investigation, Methodology, Project administration, Writing – review &amp; editing
</dd>
<dt>Marc Portier</dt>
<dd>Methodology, Writing – review &amp; editing
</dd>
<dt>Ana Trisovic</dt>
<dd>Software, Writing – review &amp; editing
</dd>
<dt>RO-Crate Community</dt>
<dd>Investigation, Software, Validation, Writing – review &amp; editing
</dd>
<dt>Paul Groth</dt>
<dd>Methodology, Supervision, Writing – original draft, Writing – review &amp; editing
</dd>
<dt>Carole Goble</dt>
<dd>Conceptualization, Funding acquisition, Methodology, Project administration, Supervision, Visualization, Writing – review &amp; editing
</dd>
</dl>
<p>We would also like to acknowledge contributions from:</p>
<dl>
<dt>Finn Bacall</dt>
<dd>Software, Methodology
</dd>
<dt>Herbert Van de Sompel</dt>
<dd>Writing – review &amp; editing
</dd>
<dt>Ignacio Eguinoa</dt>
<dd>Software, Methodology
</dd>
<dt>Nick Juty</dt>
<dd>Writing – review &amp; editing
</dd>
<dt>Oscar Corcho</dt>
<dd>Writing – review &amp; editing
</dd>
<dt>Stuart Owen</dt>
<dd>Writing – review &amp; editing
</dd>
<dt>Laura Rodríguez-Navas</dt>
<dd>Software, Visualization, Writing – review &amp; editing
</dd>
</dl>
<h1 id="formalizing-ro-crate-in-first-order-logic">Formalizing RO-Crate in First Order Logic</h1>
<p>Below is a formalization of the concept of RO-Crate as a set of relations using First Order Logic:</p>
<h2 id="language">Language</h2>
<p>Definition of language <code>𝕃𝖗𝖔𝖈𝖗𝖆𝖙𝖊</code>:</p>
<pre><code>𝕃𝖗𝖔𝖈𝖗𝖆𝖙𝖊 = { Property(p), Class(c), Value(x), ℝ, 𝕊 }
       𝔻 =  𝕀𝕣𝕚
       𝕀𝕣𝕚 ≡  { IRIs as defined in RFC3987 }
        ℝ ≡  { real or integer numbers }
        𝕊 ≡  { literal strings }</code></pre>
<p>The domain of discourse is the set of <code>𝕀𝕣𝕚</code> identifiers <span class="citation" data-cites="rqjuXkEf">[<a href="#ref-rqjuXkEf" role="doc-biblioref">27</a>]</span> (notation <code>&lt;http://example.com/&gt;</code>)<a href="#fn7" class="footnote-ref" id="fnref7" role="doc-noteref"><sup>7</sup></a>, with additional descriptions using numbers <code>ℝ</code> (notation <code>13.37</code>) and literal strings <code>𝕊</code> (notation <code>“Hello”</code>).</p>
<p>From this formalized language <code>𝕃𝖗𝖔𝖈𝖗𝖆𝖙𝖊</code> we can interpret an RO-Crate in any representation that can gather these descriptions, their properties, classes, and literal attributes.</p>
<h2 id="minimal-ro-crate">Minimal RO-Crate</h2>
<p>Below we use <code>𝕃𝖗𝖔𝖈𝖗𝖆𝖙𝖊</code> to define a minimal<a href="#fn8" class="footnote-ref" id="fnref8" role="doc-noteref"><sup>8</sup></a> RO-Crate:</p>
<pre><code>               ROCrate(R) ⊨  Root(R) ∧ Mentions(R, R) ∧ hasPart(R, d) ∧ 
                             Mentions(R, d) ∧ DataEntity(d) ∧
                             Mentions(R, c) ∧ ContextualEntity(c)
               ∀r Root(r) ⇒  Dataset(r) ∧ name(r, n) ∧ description(r, d) ∧ 
                             published(r, date) ∧ license(e, l)
          ∀e∀n name(e, n) ⇒  Value(n)
   ∀e∀s description(e, s) ⇒  Value(s)
 ∀e∀d datePublished(e, d) ⇒  Value(d)
       ∀e∀l license(e, l) ⇒  ContextualEntity(l)
            DataEntity(e) ≡  File(e) ⊕ Dataset(e)
                Entity(e) ≡  DataEntity(e) ∨ ContextualEntity(e)
             ∀e Entity(e) ⇒  Class(e)
           Mentions(R, s) ⊨  Relation(s, p, e)  ⊕  Attribute(s, p, l)
        Relation(s, p, o) ⊨  Entity(s) ∧ Property(p) ∧ Entity(o)
       Attribute(s, p, x) ⊨  Entity(s) ∧ Property(p) ∧ Value(x)
                 Value(x) ≡  x ∈ ℝ  ⊕  x ∈ 𝕊</code></pre>
<p>An <code>ROCrate(R)</code> is defined as a self-described <em>Root Data Entity</em>, which describes and contains parts (<em>data entities</em>), which are further described in <em>contextual entities</em>. These terms align with their use in the <a href="https://www.researchobject.org/ro-crate/1.1/terminology">RO-Crate 1.1 terminology</a>.</p>
<p>The <code>Root(r)</code> is a type of <code>Dataset(r)</code>, and must have the metadata to literal attributes to provide a <code>name</code>, <code>description</code> and <code>datePublished</code>, as well as a contextual entity identifying its license. These predicates correspond to the RO-Crate 1.1 <a href="https://www.researchobject.org/ro-crate/1.1/root-data-entity.html#direct-properties-of-the-root-data-entity">requirements for the root data entity</a>.</p>
<p>The concept of an <code>Entity(e)</code> is introduced as being either a DataEntity(e), a <code>ContextualEntity(e)</code>, or <a href="https://www.researchobject.org/ro-crate/1.1/contextual-entities.html#contextual-vs-data-entities">both</a>; and must be typed with at least one <code>Class(e)</code>.</p>
<p>For simplicity in this formalization (and to assist production rules below) <code>R</code> is a constant representing a single RO-Crate, typically written to independent RO-Crate Metadata files. <code>R</code> is used by <code>Mentions(R, e)</code> to indicate that <code>e</code> is an Entity described by the RO-Crate and therefore its metadata (a set of Relation and Attribute predicates) form part of the RO-Crate serialization. <code>Relation(s, p, o)</code> and <code>Attribute(s, p, x)</code> are defined as a <em>subject-predicate-object</em> triple pattern from an <code>Entity(s)</code> using a <code>Property(p)</code> to either another <code>Entity(o)</code> or a <code>Literal(x)</code> value.</p>
<h2 id="example-of-formalized-ro-crate">Example of formalized RO-Crate</h2>
<p>The below is an example RO-Crate represented using the above formalization, assuming a base URI of <code>http://example.com/ro/123/</code>:</p>
<pre><code>RO-Crate(&lt;http://example.com/ro/123/&gt;)
name(&lt;http://example.com/ro/123/, 
    “Data files associated with the manuscript:Effects of …”)
description(&lt;http://example.com/ro/123/, 
    “Palliative care planning for nursing home residents …&quot;)
license(&lt;http://example.com/ro/123/&gt;, 
    &lt;https://spdx.org/licenses/CC-BY-4.0&gt;
datePublished(&lt;http://example.com/ro/123/&gt;, “2017&quot;)
hasPart(&lt;http://example.com/ro/123/&gt;, &lt;http://example.com/ro/123/survey.csv&gt;)
hasPart(&lt;http://example.com/ro/123/&gt;, &lt;http://example.com/ro/123/interviews/&gt;)

ContextualEntity(&lt;https://spdx.org/licenses/CC-BY-4.0&gt;)
name(&lt;https://spdx.org/licenses/CC-BY-4.0, 
    “Creative Commons Attribution 4.0”)

ContextualEntity(&lt;https://spdx.org/licenses/CC-BY-NC-4.0&gt;)
name(&lt;https://spdx.org/licenses/CC-BY-NC-4.0, 
    “Creative Commons Attribution Non Commercial 4.0”)

File(&lt;http://example.com/ro/123/survey.csv&gt;)
name(&lt;http://example.com/ro/123/survey.csv&gt;, “Survey of care providers”)

Dataset(&lt;http://example.com/ro/123/interviews/&gt;)
name(&lt;http://example.com/ro/123/interviews/&gt;, 
    “Audio recordings of care provider interviews”)
license(&lt;http://example.com/ro/123/interviews/&gt;, 
    &lt;https://spdx.org/licenses/CC-BY-NC-4.0&gt;
</code></pre>
<p>Notable from this triple-like formalization is that a RO-Crate R is fully represented as a tree at depth 2 helped by the use of <code>𝕀𝕣𝕚</code> nodes. For instance the aggregation from the root entity <code>hasPart(…interviews/&gt;)</code> is at same level as the data entity’s property <code>license(…CC-BY-NC-4.0&gt;)</code> and that contextual entity’s attribute name <code>(…Non Commercial 4.0”)</code>. As shown in section RO-Crate JSON-LD, the RO-Crate Metadata File serialization is an equivalent shallow tree, although at depth 3 to cater for the JSON-LD preamble of <code>"@context"</code> and <code>"@graph"</code>.</p>
<p>In reality many additional attributes and contextual types from schema.org types like <a href="http://schema.org/affiliation" class="uri">http://schema.org/affiliation</a> and <a href="http://schema.org/Organization" class="uri">http://schema.org/Organization</a> would be used to further describe the RO-Crate and its entities, but as these are optional (<em>SHOULD</em> requirements) they do not form part of this formalization.</p>
<h2 id="mapping-to-rdf-with-schema.org">Mapping to RDF with schema.org</h2>
<p>A formalized RO-Crate can be mapped to different serializations. Assume a simplified<a href="#fn9" class="footnote-ref" id="fnref9" role="doc-noteref"><sup>9</sup></a> language <code>𝕃ʀᴅꜰ</code></p>
<pre><code>                𝕃𝖗𝖉𝖋 = { Triple(s,p,o), IRI(i), BlankNode(b), Literal(s),
                         𝕀𝕣𝕚, ℝ, 𝕊 }
                𝔻𝖗𝖉𝖋 = 𝕊
           ∀i IRI(i) ⇒ i ∈ 𝕀𝕣𝕚
∀s∀p∀o Triple(s,p,o) ⇒( IRI(s) ∨ BlankNode(s) )∧
                        IRI(p) ∧
                      ( IRI(o) ∨ BlankNode(o) ∨ Literal(o) )
          Literal(v) ⊨ Value(v) ∧ Datatype(v,t) ∧ IRI(t)
         ∀v Value(v) ⇒ v ∈ 𝕊
    LanguageTag(v,l) ≡ Datatype(v,
                         http://www.w3.org/1999/02/22-rdf-syntax-ns#langString)</code></pre>
<p>Below follows a mapping from <code>𝕃𝖗𝖔𝖈𝖗𝖆𝖙𝖊</code> to <code>𝕃𝖗𝖉𝖋</code> using schema.org.</p>
<pre><code>        Property(p) ⇒ type(p, &lt;http://www.w3.org/2000/01/rdf-schema#Property&gt;)
           Class(c) ⇒ type(c, &lt;http://www.w3.org/2000/01/rdf-schema#Class&gt;)
         Dataset(d) ⇒ type(d, &lt;http://schema.org/Dataset&gt;)
            File(f) ⇒ type(f, &lt;http://schema.org/MediaObject&gt;)
    CreativeWork(e) ⇒ ContextualEntity(e) ∧
                      type(e, &lt;http://schema.org/CreativeWork&gt;)
      hasPart(e, t) ⇒ Relation(e, &lt;http://schema.org/hasPart&gt;, t)
         name(e, n) ⇒ Attribute(e, &lt;http://schema.org/name&gt;, n)
  description(e, s) ⇒ Attribute(e, &lt;http://schema.org/description&gt;, s)
datePublished(e, d) ⇒ Attribute(e, &lt;http://schema.org/datePublished&gt;, d)
      license(e, l) ⇒ Relation(e, &lt;http://schema.org/license&gt;, l) ∧
                      CreativeWork(l)
         type(e, t) ⇒ Relation(e,
                        &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&gt;, t) ∧
                      Class(t)
          String(s) ≡ Value(s) ∧  s ∈ 𝕊
          String(s) ⇒ Datatype(s, 
                        &lt;http://www.w3.org/2001/XMLSchema#string&gt;)
         Decimal(d) ≡ Value(d) ∧  d ∈ ℝ
         Decimal(d) ⇒ Datatype(d,
                        &lt;http://www.w3.org/2001/XMLSchema#decimal&gt;)
    Relation(s,p,o) ⇒ Triple(s,p,o) ∧ IRI(s) ∧ IRI(o)
   Attribute(s,p,o) ⇒ Triple(s,p,o) ∧ IRI(s) ∧ Literal(o)
</code></pre>
<p>Note that in the JSON-LD serialization of RO-Crate the expression of <code>Class</code> and <code>Property</code>is typically indirect: The JSON-LD <code>@context</code> maps to schema.org IRIs, which, when resolved as Linked Data, embeds their formal definition as RDFa. Extensions may however include such term definitions directly in the RO-Crate.</p>
<h2 id="ro-crate-1.1-metadata-file-descriptor">RO-Crate 1.1 Metadata File Descriptor</h2>
<p>An important RO-Crate principle is that of being <strong>self-described</strong>. Therefore the serialization of the RO-Crate into a file should also describe itself in a <a href="https://www.researchobject.org/ro-crate/1.1/root-data-entity.html#ro-crate-metadata-file-descriptor">Metadata File Descriptor</a>, indicating it is <code>about</code> (describing) the RO-Crate root data entity, and that it <code>conformsTo</code> a particular version of the RO-Crate specification:</p>
<pre><code>               about(s,o) ⇒  Relation(s, &lt;http://schema.org/about&gt;, o)
          conformsTo(s,o) ⇒  Relation(s, 
                               &lt;http://purl.org/dc/terms/conformsTo&gt;, R)
MetadataFileDescriptor(m) ⇒ ( CreativeWork(m) ∧ about(m,R) ∧ ROCrate(R) ∧ 
                             conformsTo(m,
                               &lt;https://w3id.org/ro/crate/1.1&gt;) )</code></pre>
<p>Note that although the metadata file necessarily is an <em>information resource</em> written to disk or served over the network (as JSON-LD), it is not considered to be a contained <em>part</em> of the RO-Crate in the form of a <em>data entity</em>, rather it is described only as a <em>contextual entity</em>.</p>
<p>In the conceptual model the <em>RO-Crate Metadata File</em> can be seen as the top-level node that describes the <em>RO-Crate Root</em>, however in the formal model (and the JSON-LD format) the metadata file descriptor is an additional contextual entity that is not affecting the depth-limit of the RO-Crate.</p>
<h2 id="forward-chained-production-rules-for-json-ld">Forward-chained Production Rules for JSON-LD</h2>
<p>Combining the above predicates and schema.org mapping with rudimentary JSON templates, these forward-chaining production rules can output JSON-LD according to the RO-Crate 1.1 specification<a href="#fn10" class="footnote-ref" id="fnref10" role="doc-noteref"><sup>10</sup></a>:</p>
<pre><code> Mentions(R, s) ∧ Relation(s, p, o) ⇒  Mentions(R, o)
                             IRI(i) ⇒ &quot;i&quot;
                         Decimal(d) ⇒  d
                          String(s) ⇒ &quot;s&quot;
                     ∀e∀t type(e,t) ⇒  { &quot;@id&quot;: s,
                                         &quot;@type&quot;: t }
                                       }     
             ∀s∀p∀o Relation(s,p,o) ⇒  { &quot;@id&quot;: s,
                                         p: { &quot;@id&quot;: o }
                                       }     
            ∀s∀p∀v Attribute(s,p,v) ⇒  { &quot;@id&quot;: s,
                                         p: v 
                                       }
                   ∀r∀c  ROCrate(R) ⇒  { &quot;@graph&quot;: [ 
                                           Mentions(r, c)* 
                                         ]
                                       }
                                  R ⊨  &lt;./&gt;
                                  R ⇒ MetadataFileDescriptor(
                                        &lt;ro-crate-metadata.json&gt;) </code></pre>
<p>This exposes the first order logic domain of discourse of IRIs, with rational numbers and strings as their corresponding JSON-LD representation. These production rules first grow the graph of <code>R</code> by adding a transitive rule that anything described in <code>R</code> which is related to <code>o</code> means that <code>o</code> is also considered mentioned by the RO-Crate <code>R</code>. For simplicity this rule is one-way; in theory the JSON-LD graph can also contain free-standing contextual entities that have outgoing relations to data- and contextual entities, but these are proposed to be bound to the root data entity with schema.org relation <a href="http://schema.org/mentions" class="uri">http://schema.org/mentions</a>.</p>
<h1 id="ro-crate-community-1">RO-Crate Community</h1>
<p>As of 2021-08-13, the <em>RO-Crate</em> Community members are:</p>
<ul>
<li>Peter Sefton <a href="https://orcid.org/0000-0002-3545-944X" class="uri">https://orcid.org/0000-0002-3545-944X</a> (co-chair)</li>
<li>Stian Soiland-Reyes <a href="https://orcid.org/0000-0001-9842-9718" class="uri">https://orcid.org/0000-0001-9842-9718</a> (co-chair)</li>
<li>Eoghan Ó Carragáin <a href="https://orcid.org/0000-0001-8131-2150" class="uri">https://orcid.org/0000-0001-8131-2150</a> (emeritus chair)</li>
<li>Oscar Corcho <a href="https://orcid.org/0000-0002-9260-0753" class="uri">https://orcid.org/0000-0002-9260-0753</a></li>
<li>Daniel Garijo <a href="https://orcid.org/0000-0003-0454-7145" class="uri">https://orcid.org/0000-0003-0454-7145</a></li>
<li>Raul Palma <a href="https://orcid.org/0000-0003-4289-4922" class="uri">https://orcid.org/0000-0003-4289-4922</a></li>
<li>Frederik Coppens <a href="https://orcid.org/0000-0001-6565-5145" class="uri">https://orcid.org/0000-0001-6565-5145</a></li>
<li>Carole Goble <a href="https://orcid.org/0000-0003-1219-2137" class="uri">https://orcid.org/0000-0003-1219-2137</a></li>
<li>José María Fernández <a href="https://orcid.org/0000-0002-4806-5140" class="uri">https://orcid.org/0000-0002-4806-5140</a></li>
<li>Kyle Chard <a href="https://orcid.org/0000-0002-7370-4805" class="uri">https://orcid.org/0000-0002-7370-4805</a></li>
<li>Jose Manuel Gomez-Perez <a href="https://orcid.org/0000-0002-5491-6431" class="uri">https://orcid.org/0000-0002-5491-6431</a></li>
<li>Michael R Crusoe <a href="https://orcid.org/0000-0002-2961-9670" class="uri">https://orcid.org/0000-0002-2961-9670</a></li>
<li>Ignacio Eguinoa <a href="https://orcid.org/0000-0002-6190-122X" class="uri">https://orcid.org/0000-0002-6190-122X</a></li>
<li>Nick Juty <a href="https://orcid.org/0000-0002-2036-8350" class="uri">https://orcid.org/0000-0002-2036-8350</a></li>
<li>Kristi Holmes <a href="https://orcid.org/0000-0001-8420-5254" class="uri">https://orcid.org/0000-0001-8420-5254</a></li>
<li>Jason A. Clark <a href="https://orcid.org/0000-0002-3588-6257" class="uri">https://orcid.org/0000-0002-3588-6257</a></li>
<li>Salvador Capella-Gutierrez <a href="https://orcid.org/0000-0002-0309-604X" class="uri">https://orcid.org/0000-0002-0309-604X</a></li>
<li>Alasdair J. G. Gray <a href="https://orcid.org/0000-0002-5711-4872" class="uri">https://orcid.org/0000-0002-5711-4872</a></li>
<li>Stuart Owen <a href="https://orcid.org/0000-0003-2130-0865" class="uri">https://orcid.org/0000-0003-2130-0865</a></li>
<li>Alan R Williams <a href="https://orcid.org/0000-0003-3156-2105" class="uri">https://orcid.org/0000-0003-3156-2105</a></li>
<li>Giacomo Tartari <a href="https://orcid.org/0000-0003-1130-2154" class="uri">https://orcid.org/0000-0003-1130-2154</a></li>
<li>Finn Bacall <a href="https://orcid.org/0000-0002-0048-3300" class="uri">https://orcid.org/0000-0002-0048-3300</a></li>
<li>Thomas Thelen <a href="https://orcid.org/0000-0002-1756-2128" class="uri">https://orcid.org/0000-0002-1756-2128</a></li>
<li>Hervé Ménager <a href="https://orcid.org/0000-0002-7552-1009" class="uri">https://orcid.org/0000-0002-7552-1009</a></li>
<li>Laura Rodríguez-Navas <a href="https://orcid.org/0000-0003-4929-1219" class="uri">https://orcid.org/0000-0003-4929-1219</a></li>
<li>Paul Walk <a href="https://orcid.org/0000-0003-1541-5631" class="uri">https://orcid.org/0000-0003-1541-5631</a></li>
<li>brandon whitehead <a href="https://orcid.org/0000-0002-0337-8610" class="uri">https://orcid.org/0000-0002-0337-8610</a></li>
<li>Mark Wilkinson <a href="https://orcid.org/0000-0001-6960-357X" class="uri">https://orcid.org/0000-0001-6960-357X</a></li>
<li>Paul Groth <a href="https://orcid.org/0000-0003-0183-6910" class="uri">https://orcid.org/0000-0003-0183-6910</a></li>
<li>Erich Bremer <a href="https://orcid.org/0000-0003-0223-1059" class="uri">https://orcid.org/0000-0003-0223-1059</a></li>
<li>LJ Garcia Castro <a href="https://orcid.org/0000-0003-3986-0510" class="uri">https://orcid.org/0000-0003-3986-0510</a></li>
<li>Karl Sebby <a href="https://orcid.org/0000-0001-6022-9825" class="uri">https://orcid.org/0000-0001-6022-9825</a></li>
<li>Alexander Kanitz <a href="https://orcid.org/0000-0002-3468-0652" class="uri">https://orcid.org/0000-0002-3468-0652</a></li>
<li>Ana Trisovic <a href="https://orcid.org/0000-0003-1991-0533" class="uri">https://orcid.org/0000-0003-1991-0533</a></li>
<li>Gavin Kennedy <a href="https://orcid.org/0000-0003-3910-0474" class="uri">https://orcid.org/0000-0003-3910-0474</a></li>
<li>Mark Graves <a href="https://orcid.org/0000-0003-3486-8193" class="uri">https://orcid.org/0000-0003-3486-8193</a></li>
<li>Jasper Koehorst <a href="https://orcid.org/0000-0001-8172-8981" class="uri">https://orcid.org/0000-0001-8172-8981</a></li>
<li>Simone Leo <a href="https://orcid.org/0000-0001-8271-5429" class="uri">https://orcid.org/0000-0001-8271-5429</a></li>
<li>Marc Portier <a href="https://orcid.org/0000-0002-9648-6484" class="uri">https://orcid.org/0000-0002-9648-6484</a></li>
<li>Paul Brack <a href="https://orcid.org/0000-0002-5432-2748" class="uri">https://orcid.org/0000-0002-5432-2748</a></li>
<li>Milan Ojsteršek <a href="https://orcid.org/0000-0003-1743-8300" class="uri">https://orcid.org/0000-0003-1743-8300</a></li>
<li>Bert Droesbeke <a href="https://orcid.org/0000-0003-0522-5674" class="uri">https://orcid.org/0000-0003-0522-5674</a></li>
<li>Chenxu Niu <a href="https://github.com/UstcChenxu" class="uri">https://github.com/UstcChenxu</a></li>
<li>Kosuke Tanabe <a href="https://orcid.org/0000-0002-9986-7223" class="uri">https://orcid.org/0000-0002-9986-7223</a></li>
<li>Tomasz Miksa <a href="https://orcid.org/0000-0002-4929-7875" class="uri">https://orcid.org/0000-0002-4929-7875</a></li>
<li>Marco La Rosa <a href="https://orcid.org/0000-0001-5383-6993" class="uri">https://orcid.org/0000-0001-5383-6993</a></li>
<li>Cedric Decruw <a href="https://orcid.org/0000-0001-6387-5988" class="uri">https://orcid.org/0000-0001-6387-5988</a></li>
<li>Andreas Czerniak <a href="https://orcid.org/0000-0003-3883-4169" class="uri">https://orcid.org/0000-0003-3883-4169</a></li>
<li>Jeremy Jay <a href="https://orcid.org/0000-0002-5761-7533" class="uri">https://orcid.org/0000-0002-5761-7533</a></li>
<li>Sergio Serra <a href="https://orcid.org/0000-0002-0792-8157" class="uri">https://orcid.org/0000-0002-0792-8157</a></li>
<li>Ronald Siebes <a href="https://orcid.org/0000-0001-8772-7904" class="uri">https://orcid.org/0000-0001-8772-7904</a></li>
</ul>
<h2 class="page_break_before" id="references">References</h2>
<!-- Explicitly insert bibliography here -->
<div id="refs" class="references hanging-indent" role="doc-bibliography">
<div id="ref-19ybGpBJJ">
<p>1. <strong>FAIR Data Management; It’s a lifestyle not a lifecycle - ptsefton.com</strong> <br />
Peter Sefton<br />
<em>ptsefton.com</em> (2021-04-07) <a href="http://ptsefton.com/2021/04/07/rdmpic/">http://ptsefton.com/2021/04/07/rdmpic/</a></p>
</div>
<div id="ref-gvyja7v1">
<p>2. <strong>Enhancing reproducibility for computational methods</strong> <br />
Victoria Stodden, Marcia McNutt, David H Bailey, Ewa Deelman, Yolanda Gil, Brooks Hanson, Michael A Heroux, John PA Ioannidis, Michela Taufer<br />
<em>Science</em> (2016-12-09) <br />
DOI: <a href="https://doi.org/10.1126/science.aah6168">10.1126/science.aah6168</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/27940837">27940837</a></p>
</div>
<div id="ref-sbRbAxdT">
<p>3. <strong>Towards FAIR principles for research software</strong> <br />
Anna-Lena Lamprecht, Leyla Garcia, Mateusz Kuzak, Carlos Martinez, Ricardo Arcila, Eva Martin Del Pico, Victoria Dominguez Del Angel, Stephanie van de Sandt, Jon Ison, Paula Andrea Martinez, … Salvador Capella-Gutierrez<br />
<em>Déviance et société</em> (2019-11-13) <br />
DOI: <a href="https://doi.org/10.3233/DS-190026">10.3233/ds-190026</a></p>
</div>
<div id="ref-nHPbkJXy">
<p>4. <strong>FAIR Computational Workflows</strong> <br />
Carole Goble, Sarah Cohen-Boulakia, Stian Soiland-Reyes, Daniel Garijo, Yolanda Gil, Michael R. Crusoe, Kristian Peters, Daniel Schober<br />
<em>Data Intelligence</em> (2019-11-01) <br />
DOI: <a href="https://doi.org/10.1162/dint\_a\_00033">10.1162/dint\_a\_00033</a></p>
</div>
<div id="ref-6DjakjNS">
<p>5. <strong>The FAIR Guiding Principles for scientific data management and stewardship.</strong> <br />
Mark D Wilkinson, Michel Dumontier, I Jsbrand Jan Aalbersberg, Gabrielle Appleton, Myles Axton, Arie Baak, Niklas Blomberg, Jan-Willem Boiten, Luiz Bonino da Silva Santos, Philip E Bourne, … Barend Mons<br />
<em>Scientific data</em> (2016-03-15) <br />
DOI: <a href="https://doi.org/10.1038/sdata.2016.18">10.1038/sdata.2016.18</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/26978244">26978244</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4792175">PMC4792175</a></p>
</div>
<div id="ref-r3UZD8uu">
<p>6. <strong>Data Stewardship for Open Science</strong> <br />
Barend Mons<br />
<em>Taylor &amp; Francis</em> <br />
ISBN: <a href="https://worldcat.org/isbn/9781315351148">9781315351148</a></p>
</div>
<div id="ref-8xxCWPLQ">
<p>7. <strong>Zenodo, an Archive and Publishing Repository: A tale of two herbarium specimen pilot projects</strong> <br />
Mathias Dillen, Quentin Groom, Donat Agosti, Lars Nielsen<br />
<em>Biodiversity Information Science and Standards</em> (2019-06-18) <br />
DOI: <a href="https://doi.org/10.3897/biss.3.37080">10.3897/biss.3.37080</a></p>
</div>
<div id="ref-c5hSVgMG">
<p>8. <strong>The worldwide Protein Data Bank (wwPDB): ensuring a single, uniform archive of PDB data.</strong> <br />
Helen Berman, Kim Henrick, Haruki Nakamura, John L Markley<br />
<em>Nucleic Acids Research</em> (2007-01) <br />
DOI: <a href="https://doi.org/10.1093/nar/gkl971">10.1093/nar/gkl971</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/17142228">17142228</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1669775">PMC1669775</a></p>
</div>
<div id="ref-Pf3steOn">
<p>9. <strong>Ten simple rules for reproducible computational research.</strong> <br />
Geir Kjetil Sandve, Anton Nekrutenko, James Taylor, Eivind Hovig<br />
<em>PLoS Computational Biology</em> (2013-10-24) <br />
DOI: <a href="https://doi.org/10.1371/journal.pcbi.1003285">10.1371/journal.pcbi.1003285</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/24204232">24204232</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3812051">PMC3812051</a></p>
</div>
<div id="ref-6OzT7zDz">
<p>10. <strong>Talking datasets – Understanding data sensemaking behaviours</strong> <br />
Laura Koesten, Kathleen Gregory, Paul Groth, Elena Simperl<br />
<em>International Journal of Human-Computer Studies</em> (2021-02) <a href="https://doi.org/gmghzh">https://doi.org/gmghzh</a> <br />
DOI: <a href="https://doi.org/10.1016/j.ijhcs.2020.102562">10.1016/j.ijhcs.2020.102562</a></p>
</div>
<div id="ref-sRYUCzCq">
<p>11. <strong>Why linked data is not enough for scientists</strong> <br />
Sean Bechhofer, Iain Buchan, David De Roure, Paolo Missier, John Ainsworth, Jiten Bhagat, Philip Couch, Don Cruickshank, Mark Delderfield, Ian Dunlop, … Carole Goble<br />
<em>Future Generation Computer Systems</em> (2013-02) <br />
DOI: <a href="https://doi.org/10.1016/j.future.2011.08.004">10.1016/j.future.2011.08.004</a></p>
</div>
<div id="ref-eWgJ0fZt">
<p>12. <strong>Using a suite of ontologies for preserving workflow-centric research objects</strong> <br />
Khalid Belhajjame, Jun Zhao, Daniel Garijo, Matthew Gamble, Kristina Hettne, Raul Palma, Eleni Mina, Oscar Corcho, José Manuel Gómez-Pérez, Sean Bechhofer, … Carole Goble<br />
<em>Web Semantics: Science, Services and Agents on the World Wide Web</em> (2015-05) <br />
DOI: <a href="https://doi.org/10.1016/j.websem.2015.01.003">10.1016/j.websem.2015.01.003</a></p>
</div>
<div id="ref-19ead6wt6">
<p>13. <strong>A lightweight approach to research object data packaging</strong> <br />
Eoghan Ó Carragáin, Carole Goble, Peter Sefton, Stian Soiland-Reyes<br />
<em>Zenodo</em> (2019) <br />
DOI: <a href="https://doi.org/10.5281/zenodo.3250687">10.5281/zenodo.3250687</a></p>
</div>
<div id="ref-1GDrMnMDr">
<p>14. <strong>A comparison of research data management platforms: architecture, flexible metadata and interoperability</strong> <br />
Ricardo Carvalho Amorim, João Aguiar Castro, João Rocha da Silva, Cristina Ribeiro<br />
<em>Universal Access in the Information Society</em> (2016-06-11) <br />
DOI: <a href="https://doi.org/10.1007/s10209-016-0475-y">10.1007/s10209-016-0475-y</a></p>
</div>
<div id="ref-qO3xQviT">
<p>15. <strong>Metadata for Research Data: Current Practices and Trends</strong> <br />
Sharon Farnel, Ali Shiri<br />
<em>2014 Proceedings of the International Conference on Dublin Core and Metadata Applications</em> (2014) <a href="https://dcpapers.dublincore.org/pubs/article/view/3714">https://dcpapers.dublincore.org/pubs/article/view/3714</a></p>
</div>
<div id="ref-aCye3KpE">
<p>16. <strong>EOSC Interoperability Framework</strong> <br />
Krzysztof Kurowski, Oscar Corcho, Christine Choirat, Magnus Eriksson, Frederik Coppens, Mark van de Sanden, Milan Ojsteršek<br />
<em>Publications Office of the EU</em> (2021-02-05) <br />
DOI: <a href="https://doi.org/10.2777/620649">10.2777/620649</a></p>
</div>
<div id="ref-ce8qTQBF">
<p>17. <strong>Library of Congress Subject Headings: Principles and Application</strong> <br />
Lois Mai Chan<br />
<em>Libraries Unlimited</em> (1995-09-01) <a href="https://eric.ed.gov/?id=%7BED387146%7D">https://eric.ed.gov/?id={ED387146}</a> <br />
ISBN: <a href="https://worldcat.org/isbn/9781563081910">9781563081910</a></p>
</div>
<div id="ref-twn3K6TG">
<p>18. <strong>National bibliographies in the digital age: guidance and new directions: IFLA working group on guidelines for national bibliographies</strong> <br />
Maja Žumer, Ifla (editors)<br />
<em>Walter de Gruyter – K. G. Saur</em> (2009-01-28) <a href="https://www.ifla.org/node/7858">https://www.ifla.org/node/7858</a> <br />
DOI: <a href="https://doi.org/10.1515/9783598441844">10.1515/9783598441844</a> · ISBN: <a href="https://worldcat.org/isbn/9783598441844">9783598441844</a></p>
</div>
<div id="ref-xaBY9xom">
<p>19. <strong>As a researcher…I’m a bit bloody fed up with Data Management</strong> <br />
Cameron Neylon<br />
<em>Science In The Open</em> (2017-07-16) <a href="https://cameronneylon.net/blog/as-a-researcher-im-a-bit-bloody-fed-up-with-data-management/">https://cameronneylon.net/blog/as-a-researcher-im-a-bit-bloody-fed-up-with-data-management/</a></p>
</div>
<div id="ref-DfP2RrQB">
<p>20. <strong>Why is data sharing in collaborative natural resource efforts so hard and what can we do to improve it?</strong> <br />
Carol J Volk, Yasmin Lucero, Katie Barnas<br />
<em>Environmental Management</em> (2014-05) <br />
DOI: <a href="https://doi.org/10.1007/s00267-014-0258-2">10.1007/s00267-014-0258-2</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/24604667">24604667</a></p>
</div>
<div id="ref-WD4Wsy0c">
<p>21. <strong>COVID-19 pandemic reveals the peril of ignoring metadata standards.</strong> <br />
Lynn M Schriml, Maria Chuvochina, Neil Davies, Emiley A Eloe-Fadrosh, Robert D Finn, Philip Hugenholtz, Christopher I Hunter, Bonnie L Hurwitz, Nikos C Kyrpides, Folker Meyer, … Ramona Walls<br />
<em>Scientific data</em> (2020-06-19) <br />
DOI: <a href="https://doi.org/10.1038/s41597-020-0524-5">10.1038/s41597-020-0524-5</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/32561801">32561801</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7305141">PMC7305141</a></p>
</div>
<div id="ref-GOjoQFmf">
<p>22. <strong>Linked Data: Evolving the Web into a Global Data Space</strong> <br />
Tom Heath, Christian Bizer<br />
<em>Synthesis Lectures on the Semantic Web: Theory and Technology</em> (2011-02-09) <a href="http://www.morganclaypool.com/doi/abs/10.2200/S00334ED1V01Y201102WBE001">http://www.morganclaypool.com/doi/abs/10.2200/S00334ED1V01Y201102WBE001</a> <br />
DOI: <a href="https://doi.org/10.2200/S00334ED1V01Y201102WBE001">10.2200/s00334ed1v01y201102wbe001</a> · ISBN: <a href="https://worldcat.org/isbn/9781608454310">9781608454310</a></p>
</div>
<div id="ref-5ln5TkiV">
<p>23. <strong>Identifiers for the 21st century: How to design, provision, and reuse persistent identifiers to maximize utility and impact of life science data.</strong> <br />
Julie A McMurry, Nick Juty, Niklas Blomberg, Tony Burdett, Tom Conlin, Nathalie Conte, Mélanie Courtot, John Deck, Michel Dumontier, Donal K Fellows, … Helen Parkinson<br />
<em>PLoS Biology</em> (2017-06-29) <br />
DOI: <a href="https://doi.org/10.1371/journal.pbio.2001414">10.1371/journal.pbio.2001414</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/28662064">28662064</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5490878">PMC5490878</a></p>
</div>
<div id="ref-UQNJggmh">
<p>24. <strong>The BagIt File Packaging Format (V1.0)</strong> <br />
J. Kunze, J. Littman, E. Madden, J. Scancella, C. Adams<br />
<em>RFC Editor</em> (2018-10) <a href="https://www.rfc-editor.org/info/rfc8493">https://www.rfc-editor.org/info/rfc8493</a> <br />
DOI: <a href="https://doi.org/10.17487/RFC8493">10.17487/rfc8493</a></p>
</div>
<div id="ref-TivFlCqv">
<p>25. <strong>Oxford Common File Layout Specification</strong> <br />
OCFL<br />
<em>OCFL</em> (2020-07-07) <a href="https://ocfl.io/1.0/spec/">https://ocfl.io/1.0/spec/</a></p>
</div>
<div id="ref-OsBEGq7D">
<p>26. <strong>Linked data: the story so far</strong> <br />
Christian Bizer, Tom Heath, Tim Berners-Lee<br />
<em>Semantic services, interoperability and web applications: emerging concepts</em> (2011) <a href="http://services.igi-global.com/resolvedoi/resolve.aspx?doi=10.4018/978-1-60960-593-3.ch008">http://services.igi-global.com/resolvedoi/resolve.aspx?doi=10.4018/978-1-60960-593-3.ch008</a> <br />
DOI: <a href="https://doi.org/10.4018/978-1-60960-593-3.ch008">10.4018/978-1-60960-593-3.ch008</a> · ISBN: <a href="https://worldcat.org/isbn/9781609605933">9781609605933</a></p>
</div>
<div id="ref-rqjuXkEf">
<p>27. <strong>Internationalized resource identifiers (IRIs)</strong> <br />
M. Duerst, M. Suignard<br />
<em>RFC Editor</em> (2005-01) <a href="https://www.rfc-editor.org/info/rfc3987">https://www.rfc-editor.org/info/rfc3987</a> <br />
DOI: <a href="https://doi.org/10.17487/rfc3987">10.17487/rfc3987</a></p>
</div>
<div id="ref-wmxlb0Fv">
<p>28. <strong>Dereferencing HTTP URIs</strong> <br />
W3C Technical Architecture Group<br />
<em>W3C</em> (2007-08-31) <a href="https://www.w3.org/2001/tag/doc/httpRange-14/2007-08-31/HttpRange-14.html">https://www.w3.org/2001/tag/doc/httpRange-14/2007-08-31/HttpRange-14.html</a></p>
</div>
<div id="ref-6Lj8VCHS">
<p>29. <strong>RO-Crate Metadata Specification 1.1.1</strong> <br />
Peter Sefton, Eoghan Ó Carragáin, Stian Soiland-Reyes, Oscar Corcho, Daniel Garijo, Raul Palma, Frederik Coppens, Carole Goble, José María Fernández, Kyle Chard, … Marc Portier<br />
<em>Zenodo</em> (2021) <a href="https://w3id.org/ro/crate/1.1">https://w3id.org/ro/crate/1.1</a> <br />
DOI: <a href="https://doi.org/10.5281/zenodo.4541002">10.5281/zenodo.4541002</a></p>
</div>
<div id="ref-vC6te3yd">
<p>30. <strong>Schema.org: Evolution of Structured Data on the Web: Big data makes common schemas even more necessary</strong> <br />
Ramanathan V Guha, Dan Brickley, Steve Macbeth<br />
<em>Queue</em> (2015) <br />
DOI: <a href="https://doi.org/10.1145/2857274.2857276">10.1145/2857274.2857276</a></p>
</div>
<div id="ref-17q6tYFV2">
<p>31. <strong>JSON-LD 1.0</strong> <br />
Manu Sporny, Dave Longley, Gregg Kellogg, Markus Lanthaler, Niklas Lindström<br />
<em>W3C</em> (2014-01-16) <a href="https://www.w3.org/TR/2014/REC-json-ld-20140116/">https://www.w3.org/TR/2014/REC-json-ld-20140116/</a></p>
</div>
<div id="ref-4Pd3RTmI">
<p>32. <strong>Sharing interoperable workflow provenance: A review of best practices and their practical application in CWLProv</strong> <br />
Farah Zaib Khan, Stian Soiland-Reyes, Richard O Sinnott, Andrew Lonie, Carole Goble, Michael R Crusoe<br />
<em>GigaScience</em> (2019-11-01) <br />
DOI: <a href="https://doi.org/10.1093/gigascience/giz095">10.1093/gigascience/giz095</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/31675414">31675414</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6824458">PMC6824458</a></p>
</div>
<div id="ref-6UztL3ul">
<p>33. <strong>Portland Common Data Model</strong> <br />
Stefano Cossu, Esmé Cowles, Karen Estlund, Christina Harlow, Tom Johnson, Mark Matienzo, Danny Lamb, Lynette Rayle, Rob Sanderson, Jon Stroop, Andrew Woods<br />
<em>GitHub duraspace/pcdm Wiki</em> (2018-06-15) <a href="https://github.com/duraspace/pcdm/wiki">https://github.com/duraspace/pcdm/wiki</a></p>
</div>
<div id="ref-vDdtcpOe">
<p>34. <strong>Bioschemas: From Potato Salad to Protein Annotation</strong> <br />
Alasdair Gray, Carole Goble, Rafael Jimenez, Bioschemas Community<br />
(2017-10-23) <a href="https://iswc2017.semanticweb.org/paper-579/">https://iswc2017.semanticweb.org/paper-579/</a></p>
</div>
<div id="ref-hojAyeKY">
<p>35. <strong>npm: ro-crate-html-js</strong> <a href="https://www.npmjs.com/package/ro-crate-html-js">https://www.npmjs.com/package/ro-crate-html-js</a></p>
</div>
<div id="ref-1Hsf35Rx7">
<p>36. <strong>Datacrate Submisssion To The Workshop On Research Objects</strong> <br />
Peter Sefton<br />
<em>Zenodo</em> (2018) <br />
DOI: <a href="https://doi.org/10.5281/zenodo.1445817">10.5281/zenodo.1445817</a></p>
</div>
<div id="ref-U6WvlYl">
<p>37. <strong>ELIXIR: a distributed infrastructure for European biological data</strong> <br />
Lindsey C Crosswell, Janet M Thornton<br />
<em>Trends in Biotechnology</em> (2012-05) <a href="http://dx.doi.org/10.1016/j.tibtech.2012.02.002">http://dx.doi.org/10.1016/j.tibtech.2012.02.002</a> <br />
DOI: <a href="https://doi.org/10.1016/j.tibtech.2012.02.002">10.1016/j.tibtech.2012.02.002</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/22417641">22417641</a></p>
</div>
<div id="ref-2TcRcSoZ">
<p>38. <strong>Digital crowdsourcing and public understandings of the past: citizen historians meet Criminal Characters</strong> <br />
Alana Piper<br />
<em>History Australia</em> (2020-07-02) <br />
DOI: <a href="https://doi.org/10.1080/14490854.2020.1796500">10.1080/14490854.2020.1796500</a></p>
</div>
<div id="ref-T8vTlQ1i">
<p>39. <strong>RO-Crate Metadata Specification 1.0</strong> <br />
Peter Sefton, Eoghan Ó Carragáin, Stian Soiland-Reyes, Oscar Corcho, Daniel Garijo, Raul Palma, Frederik Coppens, Carole Goble, José María Fernández, Kyle Chard, … Thomas Thelen<br />
<em>Zenodo</em> (2019) <a href="https://w3id.org/ro/crate/1.0">https://w3id.org/ro/crate/1.0</a> <br />
DOI: <a href="https://doi.org/10.5281/zenodo.3541888">10.5281/zenodo.3541888</a></p>
</div>
<div id="ref-1AdhQs7EG">
<p>40. <strong>RO-Crate Metadata Specification 1.1</strong> <br />
Peter Sefton, Eoghan Ó Carragáin, Stian Soiland-Reyes, Oscar Corcho, Daniel Garijo, Raul Palma, Frederik Coppens, Carole Goble, José María Fernández, Kyle Chard, … Simone Leo<br />
<em>Zenodo</em> (2020) <a href="https://w3id.org/ro/crate/1.1">https://w3id.org/ro/crate/1.1</a> <br />
DOI: <a href="https://doi.org/10.5281/zenodo.4031327">10.5281/zenodo.4031327</a></p>
</div>
<div id="ref-bSpAL6uW">
<p>41. <strong>Arkisto Platform: Describo</strong> <br />
Marco La Rosa, Peter Sefton<br />
<a href="https://arkisto-platform.github.io/describo/">https://arkisto-platform.github.io/describo/</a></p>
</div>
<div id="ref-12b41YCGR">
<p>42. <strong>Arkisto Platform: Describo Online</strong> <br />
Marco La Rosa<br />
<a href="https://arkisto-platform.github.io/describo-online/">https://arkisto-platform.github.io/describo-online/</a></p>
</div>
<div id="ref-n41B218E">
<p>43. <strong>npm: ro-crate-excel</strong> <br />
Mike Lynch, Peter Sefton<br />
<a href="https://www.npmjs.com/package/ro-crate-excel">https://www.npmjs.com/package/ro-crate-excel</a></p>
</div>
<div id="ref-1AS14nqw5">
<p>44. <strong>GitHub - UTS-eResearch/ro-crate-js: Research Object Crate (RO-Crate) utilities</strong> <br />
GitHub<br />
<a href="https://github.com/UTS-eResearch/ro-crate-js">https://github.com/UTS-eResearch/ro-crate-js</a></p>
</div>
<div id="ref-joQS4Xno">
<p>45. <strong>GitHub - ResearchObject/ro-crate-ruby: A Ruby gem for creating, manipulating and reading RO-Crates</strong> <br />
Finn Bacall, Martyn Whitwell<br />
<em>GitHub</em> <a href="https://github.com/ResearchObject/ro-crate-ruby">https://github.com/ResearchObject/ro-crate-ruby</a></p>
</div>
<div id="ref-18CvIJacO">
<p>46. <strong>GitHub - ResearchObject/ro-crate-py: Python library for RO-Crate</strong> <br />
Simone Leo, Ignacio Eguinoa, Stian Soiland-Reyes, Bert Droesbeke, Laura Rodríguez-Navas, Alban Gaignard<br />
<a href="https://github.com/researchobject/ro-crate-py">https://github.com/researchobject/ro-crate-py</a></p>
</div>
<div id="ref-syXvUAqM">
<p>47. <strong>WorkflowHub project Project pages for developing and running the WorkflowHub, a registry of scientific workflows</strong> <a href="https://about.workflowhub.eu/">https://about.workflowhub.eu/</a></p>
</div>
<div id="ref-10Mf5fVVl">
<p>48. <strong>LifeMonitor, a testing and monitoring service for scientific workflows</strong> <br />
CRS4<br />
<a href="https://about.lifemonitor.eu/">https://about.lifemonitor.eu/</a></p>
</div>
<div id="ref-1H1OTXp4j">
<p>49. <strong>Use of RO-Crates in SCHeMa</strong> <br />
Thanasis Vergoulis<br />
<em>Zenodo</em> (2021-04-08) <a href="https://doi.org/gjx264">https://doi.org/gjx264</a> <br />
DOI: <a href="https://doi.org/10.5281/zenodo.4671709">10.5281/zenodo.4671709</a></p>
</div>
<div id="ref-6o0SYlZw">
<p>50. <strong>GitHub - workflowhub-eu/galaxy2cwl: Standalone version tool to get cwl descriptions (initially an abstract cwl interface) of galaxy workflows and Galaxy workflows executions</strong> <a href="https://github.com/workflowhub-eu/galaxy2cwl">https://github.com/workflowhub-eu/galaxy2cwl</a></p>
</div>
<div id="ref-DuSSAwkc">
<p>51. <strong>GitHub - CoEDL/modpdsc</strong> <a href="https://github.com/CoEDL/modpdsc/">https://github.com/CoEDL/modpdsc/</a></p>
</div>
<div id="ref-oKX4gup6">
<p>52. <strong>Tools: Data Portal &amp; Discovery</strong> <a href="https://arkisto-platform.github.io/tools/portal/">https://arkisto-platform.github.io/tools/portal/</a></p>
</div>
<div id="ref-nS65dWZ">
<p>53. <strong>GitHub - CoEDL/ocfl-tools: Tools to process and manipulate an OCFL tree</strong> <a href="https://github.com/CoEDL/ocfl-tools">https://github.com/CoEDL/ocfl-tools</a></p>
</div>
<div id="ref-US9dAQOD">
<p>54. <strong>eScienceLab: RO-Composer</strong> <br />
Finn Bacall, Stian Soiland-Reyes, Marina Soares e Silva<br />
<a href="https://esciencelab.org.uk/projects/ro-composer/">https://esciencelab.org.uk/projects/ro-composer/</a></p>
</div>
<div id="ref-keqQfayg">
<p>55. <strong>RO-Crate RDA maDMP Mapper</strong> <br />
Ghaith Arfaoui, Maroua Jaoua<br />
<em>Zenodo</em> (2020) <br />
DOI: <a href="https://doi.org/10.5281/zenodo.3922136">10.5281/zenodo.3922136</a></p>
</div>
<div id="ref-162NBMW8l">
<p>56. <strong>Research Object Crates and Machine-actionable Data Management Plans</strong> <br />
Tomasz Miksa, Maroua Jaoua, Ghaith Arfaoui<br />
<em>PUBLISSO</em> (2020) <br />
DOI: <a href="https://doi.org/10.4126/frl01-006423291">10.4126/frl01-006423291</a></p>
</div>
<div id="ref-16XFBusSZ">
<p>57. <br />
Gabriel Brenner<br />
<em>Zenodo</em> (2020) <br />
DOI: <a href="https://doi.org/10.5281/zenodo.3903463">10.5281/zenodo.3903463</a></p>
</div>
<div id="ref-kYELZGhL">
<p>58. <strong>KockataEPich/CheckMyCrate: A command line application for validating a RO-Crate object against a JSON profile.</strong> <br />
Kostadin Belchev<br />
<em>GitHub</em> (2021-05) <a href="https://github.com/KockataEPich/CheckMyCrate">https://github.com/KockataEPich/CheckMyCrate</a></p>
</div>
<div id="ref-l0OIdydM">
<p>59. <strong>No more business as usual: Agile and effective responses to emerging pathogen threats require open data and open analytics.</strong> <br />
Dannon Baker, Marius van den Beek, Daniel Blankenberg, Dave Bouvier, John Chilton, Nate Coraor, Frederik Coppens, Ignacio Eguinoa, Simon Gladman, Björn Grüning, … Steven Weaver<br />
<em>PLoS Pathogens</em> (2020-08-13) <br />
DOI: <a href="https://doi.org/10.1371/journal.ppat.1008643">10.1371/journal.ppat.1008643</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/32790776">32790776</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7425854">PMC7425854</a></p>
</div>
<div id="ref-wq4G2CfQ">
<p>60. <strong>The nf-core framework for community-curated bioinformatics pipelines.</strong> <br />
Philip A Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso, Sven Nahnsen<br />
<em>Nature Biotechnology</em> (2020) <br />
DOI: <a href="https://doi.org/10.1038/s41587-020-0439-x">10.1038/s41587-020-0439-x</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/32055031">32055031</a></p>
</div>
<div id="ref-4XDvZWxk">
<p>61. <strong>Nextflow enables reproducible computational workflows.</strong> <br />
Paolo Di Tommaso, Maria Chatzou, Evan W Floden, Pablo Prieto Barja, Emilio Palumbo, Cedric Notredame<br />
<em>Nature Biotechnology</em> (2017-04-11) <br />
DOI: <a href="https://doi.org/10.1038/nbt.3820">10.1038/nbt.3820</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/28398311">28398311</a></p>
</div>
<div id="ref-NcYZqBux">
<p>62. <strong>Snakemake–a scalable bioinformatics workflow engine.</strong> <br />
Johannes Köster, Sven Rahmann<br />
<em>Bioinformatics</em> (2012-10-01) <br />
DOI: <a href="https://doi.org/10.1093/bioinformatics/bts480">10.1093/bioinformatics/bts480</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/22908215">22908215</a></p>
</div>
<div id="ref-WDH5DsMv">
<p>63. <strong>EOSC-Life Methodology framework to enhance reproducibility within EOSC-Life</strong> <br />
Florence Bietrix, José Maria Carazo, Salvador Capella-Gutierrez, Frederik Coppens, Maria Luisa Chiusano, Romain David, Jose Maria Fernandez, Maddalena Fratelli, Jean-Karim Heriche, Carole Goble, … Jing Tang<br />
<em>Zenodo</em> (2021-04-30) <br />
DOI: <a href="https://doi.org/10.5281/zenodo.4705078">10.5281/zenodo.4705078</a></p>
</div>
<div id="ref-hNiixe5H">
<p>64. <strong>Methods Included: Standardizing Computational Reuse and Portability with the Common Workflow Language</strong> <br />
Michael R. Crusoe, Sanne Abeln, Alexandru Iosup, Peter Amstutz, John Chilton, Nebojša Tijanić, Hervé Ménager, Stian Soiland-Reyes, Carole Goble<br />
<em>arXiv</em> (2021) <a href="http://arxiv.org/abs/2105.07028v1">http://arxiv.org/abs/2105.07028v1</a></p>
</div>
<div id="ref-Sdv3iU46">
<p>65. <strong>Implementing FAIR Digital Objects in the EOSC-Life Workflow Collaboratory</strong> <br />
Carole Goble, Stian Soiland-Reyes, Finn Bacall, Stuart Owen, Alan Williams, Ignacio Eguinoa, Bert Droesbeke, Simone Leo, Luca Pireddu, Laura Rodríguez-Navas, … Frederik Coppens<br />
<em>Zenodo</em> (2021) <br />
DOI: <a href="https://doi.org/10.5281/zenodo.4605654">10.5281/zenodo.4605654</a></p>
</div>
<div id="ref-W6bDegHu">
<p>66. <strong>Tracking Workflow Execution With TavernaPROV</strong> <br />
Stian Soiland-Reyes, Pinar Alper, Carole Goble<br />
(2016-06-06) <br />
DOI: <a href="https://doi.org/10.5281/zenodo.51314">10.5281/zenodo.51314</a></p>
</div>
<div id="ref-dijZpInF">
<p>67. <strong>Research Object Bundle 1.0</strong> <br />
Stian Soiland-Reyes, Matthew Gamble, Robert Haines<br />
(2014-11) <a href="https://w3id.org/bundle/2014-11-05/">https://w3id.org/bundle/2014-11-05/</a> <br />
DOI: <a href="https://doi.org/10.5281/zenodo.12586">10.5281/zenodo.12586</a></p>
</div>
<div id="ref-8CVxQAro">
<p>68. <strong>Landscape analysis for the Specimen Data Refinery</strong> <br />
Stephanie Walton, Laurence Livermore, Olaf Bánki, Robert Cubey, Robyn Drinkwater, Markus Englund, Carole Goble, Quentin Groom, Christopher Kermorvant, Isabel Rey, … Zhengzhe Wu<br />
<em>Research Ideas and Outcomes</em> (2020-08-14) <br />
DOI: <a href="https://doi.org/10.3897/rio.6.e57602">10.3897/rio.6.e57602</a></p>
</div>
<div id="ref-k5pGkxd5">
<p>69. <strong>FAIR digital objects for science: from data pieces to actionable knowledge units</strong> <br />
Koenraad De Smedt, Dimitris Koureas, Peter Wittenburg<br />
<em>Publications</em> (2020-04-11) <br />
DOI: <a href="https://doi.org/10.3390/publications8020021">10.3390/publications8020021</a></p>
</div>
<div id="ref-HJqdR8JL">
<p>70. <strong>Protein Ligand Complex MD Setup tutorial using BioExcel Building Blocks (biobb) (jupyter notebook)</strong> <br />
Douglas Lowe, Genís Bayarri<br />
<em>WorkflowHub</em> (2021) <br />
DOI: <a href="https://doi.org/10.48546/workflowhub.workflow.56.1">10.48546/workflowhub.workflow.56.1</a></p>
</div>
<div id="ref-17fJm3JS">
<p>71. <strong>Enabling precision medicine via standard communication of HTS provenance, analysis, and results.</strong> <br />
Gil Alterovitz, Dennis Dean, Carole Goble, Michael R Crusoe, Stian Soiland-Reyes, Amanda Bell, Anais Hayes, Anita Suresh, Anjan Purkayastha, Charles H King, … Raja Mazumder<br />
<em>PLoS Biology</em> (2018-12-31) <br />
DOI: <a href="https://doi.org/10.1371/journal.pbio.3000099">10.1371/journal.pbio.3000099</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/30596645">30596645</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6338479">PMC6338479</a></p>
</div>
<div id="ref-R51nz7Xg">
<p>72. <strong>IEEE Standard for Bioinformatics Analyses Generated by High-Throughput Sequencing (HTS) to Facilitate Communication</strong> <br />
DOI: <a href="https://doi.org/10.1109/IEEESTD.2020.9094416">10.1109/ieeestd.2020.9094416</a> · ISBN: <a href="https://worldcat.org/isbn/978-1-5044-6466-6">978-1-5044-6466-6</a></p>
</div>
<div id="ref-1H1Z87nyU">
<p>73. <strong>Describing and packaging workflows using RO-Crate and BioCompute Objects</strong> <br />
Stian Soiland-Reyes<br />
<em>Zenodo</em> (2021-04) <br />
DOI: <a href="https://doi.org/10.5281/zenodo.4633732">10.5281/zenodo.4633732</a></p>
</div>
<div id="ref-nCdDRreI">
<p>74. <strong>I’ll take that to go: Big data bags and minimal identifiers for exchange of large, complex datasets</strong> <br />
Kyle Chard, Mike D’Arcy, Ben Heavner, Ian Foster, Carl Kesselman, Ravi Madduri, Alexis Rodriguez, Stian Soiland-Reyes, Carole Goble, Kristi Clark, … Arthur Toga<br />
<em>2016 IEEE International Conference on Big Data (Big Data)</em> (2016-12-05) <a href="https://static.aminer.org/pdf/fa/bigdata2016/BigD418.pdf">https://static.aminer.org/pdf/fa/bigdata2016/BigD418.pdf</a> <br />
DOI: <a href="https://doi.org/10.1109/BigData.2016.7840618">10.1109/bigdata.2016.7840618</a> · ISBN: <a href="https://worldcat.org/isbn/978-1-4673-9005-7">978-1-4673-9005-7</a></p>
</div>
<div id="ref-1DVC7tcYl">
<p>75. <strong>Ten principles for machine-actionable data management plans.</strong> <br />
Tomasz Miksa, Stephanie Simms, Daniel Mietchen, Sarah Jones<br />
<em>PLoS Computational Biology</em> (2019-03-28) <br />
DOI: <a href="https://doi.org/10.1371/journal.pcbi.1006750">10.1371/journal.pcbi.1006750</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/30921316">30921316</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6438441">PMC6438441</a></p>
</div>
<div id="ref-1ZBdroY0">
<p>76. <strong>Machine-Actionable Data Management Plans: A Knowledge Retrieval Approach to Automate the Assessment of Funders’ Requirements</strong> <br />
João Cardoso, Diogo Proença, José Borbinha<br />
<em>Advances in Information Retrieval</em> (2020) <br />
DOI: <a href="https://doi.org/10.1007/978-3-030-45442-5_15">10.1007/978-3-030-45442-5_15</a> · ISBN: <a href="https://worldcat.org/isbn/978-3-030-45442-5">978-3-030-45442-5</a></p>
</div>
<div id="ref-T271G9Gd">
<p>77. <strong>RDA DMP Common Standard for Machine-actionable Data Management Plans</strong> <br />
Paul Walk, Tomasz Miksa, Peter Neish<br />
<em>Research Data Alliance</em> (2019) <br />
DOI: <a href="https://doi.org/10.15497/rda00039">10.15497/rda00039</a></p>
</div>
<div id="ref-1FiTt7FKJ">
<p>78. <strong>Towards semantic representation of machine-actionable Data Management Plans</strong> <br />
João Cardoso, Leyla Jael Garcia Castro, Fajar Ekaputra, Marie-Christine Jacquemot-Perbal, Tomasz Miksa, José Borbinha<br />
<em>PUBLISSO</em> (2020) <a href="https://repository.publisso.de/resource/frl:6423289">https://repository.publisso.de/resource/frl:6423289</a> <br />
DOI: <a href="https://doi.org/10.4126/frl01-006423289">10.4126/frl01-006423289</a></p>
</div>
<div id="ref-naVrw7g1">
<p>79. <strong>Data Catalog Vocabulary (DCAT) - Version 2</strong> <br />
Riccardo Albertoni, David Browning, Simon Cox, Alejandra Gonzalez Beltran, Andrea Perego, Peter Winstanley, Dataset Exchange Working Group<br />
<em>W3C</em> (2020-02-04) <a href="https://www.w3.org/TR/2020/REC-vocab-dcat-2-20200204/">https://www.w3.org/TR/2020/REC-vocab-dcat-2-20200204/</a></p>
</div>
<div id="ref-7O1j0YRj">
<p>80. <strong>A case for data commons: toward data science as a service</strong> <br />
Robert L Grossman, Allison Heath, Mark Murphy, Maria Patterson, Walt Wells<br />
<em>Computing in science &amp; engineering</em> (2016) <br />
DOI: <a href="https://doi.org/10.1109/MCSE.2016.92">10.1109/mcse.2016.92</a></p>
</div>
<div id="ref-1EOrDAznb">
<p>81. <strong>The Australian Research Data Commons</strong> <br />
Michelle Barker, Ross Wilkinson, Andrew Treloar<br />
<em>Data Science Journal</em> (2019-09-05) <a href="http://datascience.codata.org/articles/10.5334/dsj-2019-044/">http://datascience.codata.org/articles/10.5334/dsj-2019-044/</a> <br />
DOI: <a href="https://doi.org/10.5334/dsj-2019-044">10.5334/dsj-2019-044</a></p>
</div>
<div id="ref-oCofS7oZ">
<p>82. <strong>The NCI Genomic Data Commons as an engine for precision medicine.</strong> <br />
Mark A Jensen, Vincent Ferretti, Robert L Grossman, Louis M Staudt<br />
<em>Blood</em> (2017-07-27) <br />
DOI: <a href="https://doi.org/10.1182/blood-2017-03-735654">10.1182/blood-2017-03-735654</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/28600341">28600341</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5533202">PMC5533202</a></p>
</div>
<div id="ref-1Hh0kF7qr">
<p>83. <strong>Harvard Data Commons</strong> <br />
Mercè Crosas<br />
<em>Septentrio Conference Series</em> (2020-03-20) <br />
DOI: <a href="https://doi.org/10.7557/5.5422">10.7557/5.5422</a></p>
</div>
<div id="ref-1GS5Dq9yc">
<p>84. <strong>The Dataverse Network: An Open-Source Application for Sharing, Discovering and Preserving Data</strong> <br />
Mercè Crosas<br />
<em>D-Lib Magazine</em> (2011-01) <br />
DOI: <a href="https://doi.org/10.1045/january2011-crosas">10.1045/january2011-crosas</a></p>
</div>
<div id="ref-7yKqnsAx">
<p>85. <strong>Efficient and Secure Transfer, Synchronization, and Sharing of Big Data</strong> <br />
Kyle Chard, Steven Tuecke, Ian Foster<br />
<em>IEEE Cloud Computing</em> (2014) <br />
DOI: <a href="https://doi.org/10.1109/MCC.2014.52">10.1109/mcc.2014.52</a></p>
</div>
<div id="ref-OkXvEtY">
<p>86. <strong>Dataset reuse: toward translating principles to practice</strong> <br />
Laura Koesten, Pavlos Vougiouklis, Elena Simperl, Paul Groth<br />
<em>Patterns (New York, N.Y.)</em> (2020-11-13) <br />
DOI: <a href="https://doi.org/10.1016/j.patter.2020.100136">10.1016/j.patter.2020.100136</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/33294873">33294873</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7691392">PMC7691392</a></p>
</div>
<div id="ref-D318Yc35">
<p>87. <strong>Electronic documents give reproducible research a new meaning</strong> <br />
Jon F. Claerbout, Martin Karrenbach<br />
<em>SEG Technical Program Expanded Abstracts 1992</em> (1992-01) <br />
DOI: <a href="https://doi.org/10.1190/1.1822162">10.1190/1.1822162</a></p>
</div>
<div id="ref-16USoLuIY">
<p>88. <strong>Interoperability for the Discovery, Use, and Re-Use of Units of Scholarly Communication</strong> <br />
Herbert Van de Sompel, Carl Lagoze<br />
<em>CTWatch Quarterly</em> (2007-08) <a href="http://icl.utk.edu/ctwatch/quarterly/articles/2007/08/interoperability-for-the-discovery-use-and-re-use-of-units-of-scholarly-communication/">http://icl.utk.edu/ctwatch/quarterly/articles/2007/08/interoperability-for-the-discovery-use-and-re-use-of-units-of-scholarly-communication/</a></p>
</div>
<div id="ref-sTNYjVhY">
<p>89. <strong>myExperiment: a repository and social network for the sharing of bioinformatics workflows.</strong> <br />
Carole A Goble, Jiten Bhagat, Sergejs Aleksejevs, Don Cruickshank, Danius Michaelides, David Newman, Mark Borkum, Sean Bechhofer, Marco Roos, Peter Li, David De Roure<br />
<em>Nucleic Acids Research</em> (2010-07-01) <br />
DOI: <a href="https://doi.org/10.1093/nar/gkq429">10.1093/nar/gkq429</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/20501605">20501605</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2896080">PMC2896080</a></p>
</div>
<div id="ref-1zQ0H831">
<p>90. <strong>myExperiment: An ontology for e-Research</strong> <br />
David Newman, Sean Bechhofer, David De Roure<br />
<em>Proceedings of the Workshop on Semantic Web Applications in Scientific Discourse (SWASD 2009)</em> (2009-10) <a href="http://ceur-ws.org/Vol-523/Newman.pdf">http://ceur-ws.org/Vol-523/Newman.pdf</a></p>
</div>
<div id="ref-stokk0es">
<p>91. <strong>myExperiment Ontology Modules</strong> (2009) <a href="http://web.archive.org/web/20091115080336/http%3a%2f%2frdf.myexperiment.org/ontologies">http://web.archive.org/web/20091115080336/http%3a%2f%2frdf.myexperiment.org/ontologies</a></p>
</div>
<div id="ref-KGZLxbxf">
<p>92. <strong>Web Annotation as a First-Class Object</strong> <br />
Paolo Ciccarese, Stian Soiland-Reyes, Tim Clark<br />
<em>IEEE Internet Computing</em> (2013-11) <a href="https://doi.org/gmgtkn">https://doi.org/gmgtkn</a> <br />
DOI: <a href="https://doi.org/10.1109/mic.2013.123">10.1109/mic.2013.123</a></p>
</div>
<div id="ref-cLnDUfHN">
<p>93. <strong>PROV-O: The PROV Ontology</strong> <br />
Timothy Lebo, Satya Sahoo, Deborah McGuinness, Khalid Belhajjame, James Cheney, David Corsar, Daniel Garijo, Stian Soiland-Reyes, Stephan Zednik, Jun Zhao<br />
(2013-04-30) <a href="http://www.w3.org/TR/2013/REC-prov-o-20130430/">http://www.w3.org/TR/2013/REC-prov-o-20130430/</a></p>
</div>
<div id="ref-16Tre0SD9">
<p>94. <strong>What Is Ontology Reuse?</strong> <br />
Megan Katsumi, Michael Grüninger<br />
<em>Formal Ontology in Information Systems</em> (2016) <a href="https://doi.org/10.3233/978-1-61499-660-6-9">https://doi.org/10.3233/978-1-61499-660-6-9</a> <br />
DOI: <a href="https://doi.org/10.3233/978-1-61499-660-6-9">10.3233/978-1-61499-660-6-9</a> · ISBN: <a href="https://worldcat.org/isbn/978-1-61499-660-6">978-1-61499-660-6</a></p>
</div>
<div id="ref-tyKVYqu2">
<p>95. <strong>Enabling FAIR research in Earth Science through research objects</strong> <br />
Andres Garcia-Silva, Jose Manuel Gomez-Perez, Raul Palma, Marcin Krystek, Simone Mantovani, Federica Foglini, Valentina Grande, Francesco De Leo, Stefano Salvi, Elisa Trasatti, … Ilkay Altintas<br />
<em>Future Generation Computer Systems</em> (2019-09) <br />
DOI: <a href="https://doi.org/10.1016/j.future.2019.03.046">10.1016/j.future.2019.03.046</a></p>
</div>
<div id="ref-16M9YRYfg">
<p>96. <strong>Toward Enabling Reproducibility for Data-Intensive Research Using the Whole Tale Platform</strong> <br />
Chard Kyle, Gaffney Niall, Hategan Mihael, Kowalik Kacper, Ludäscher Bertram, McPhillips Timothy, Nabrzyski Jarek, Stodden Victoria, Taylor Ian, Thelen Thomas, et al.<br />
<em>Advances in Parallel Computing</em> (2020) <br />
DOI: <a href="https://doi.org/10.3233/APC200107">10.3233/apc200107</a></p>
</div>
<div id="ref-wIuPSf9U">
<p>97. <strong>Application of BagIt-Serialized Research Object Bundles for Packaging and Re-Execution of Computational Analyses</strong> <br />
Kyle Chard, Niall Gaffney, Matthew B. Jones, Kacper Kowalik, Bertram Ludascher, Timothy McPhillips, Jarek Nabrzyski, Victoria Stodden, Ian Taylor, Thomas Thelen, … Craig Willis<br />
<em>15th International Conference on eScience (eScience 2019)</em> (2019-09-24) <a href="https://ieeexplore.ieee.org/document/9041738/">https://ieeexplore.ieee.org/document/9041738/</a> <br />
DOI: <a href="https://doi.org/10.1109/eScience.2019.00068">10.1109/escience.2019.00068</a> · ISBN: <a href="https://worldcat.org/isbn/978-1-7281-2451-3">978-1-7281-2451-3</a></p>
</div>
<div id="ref-1D4gyjbRv">
<p>98. <strong>Scientific workflows for computational reproducibility in the life sciences: Status, challenges and opportunities</strong> <br />
Sarah Cohen-Boulakia, Khalid Belhajjame, Olivier Collin, Jérôme Chopard, Christine Froidevaux, Alban Gaignard, Konrad Hinsen, Pierre Larmande, Yvan Le Bras, Frédéric Lemoine, … Christophe Blanchet<br />
<em>Future Generation Computer Systems</em> (2017-10) <br />
DOI: <a href="https://doi.org/10.1016/j.future.2017.01.012">10.1016/j.future.2017.01.012</a></p>
</div>
<div id="ref-TmTSmrSZ">
<p>99. <strong>Provenance trails in the Wings/Pegasus system</strong> <br />
Jihie Kim, Ewa Deelman, Yolanda Gil, Gaurang Mehta, Varun Ratnakar<br />
<em>Concurrency and Computation: Practice and Experience</em> (2008-04-10) <a href="http://doi.wiley.com/10.1002/cpe.1228">http://doi.wiley.com/10.1002/cpe.1228</a> <br />
DOI: <a href="https://doi.org/10.1002/cpe.1228">10.1002/cpe.1228</a></p>
</div>
<div id="ref-74cIRMFz">
<p>100. <strong>Practical computational reproducibility in the life sciences.</strong> <br />
Björn Grüning, John Chilton, Johannes Köster, Ryan Dale, Nicola Soranzo, Marius van den Beek, Jeremy Goecks, Rolf Backofen, Anton Nekrutenko, James Taylor<br />
<em>Cell Systems</em> (2018-06-27) <br />
DOI: <a href="https://doi.org/10.1016/j.cels.2018.03.014">10.1016/j.cels.2018.03.014</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/29953862">29953862</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6263957">PMC6263957</a></p>
</div>
<div id="ref-FG7BdkMW">
<p>101. <strong>A new genomic blueprint of the human gut microbiota.</strong> <br />
Alexandre Almeida, Alex L Mitchell, Miguel Boland, Samuel C Forster, Gregory B Gloor, Aleksandra Tarkowska, Trevor D Lawley, Robert D Finn<br />
<em>Nature</em> (2019-02-11) <br />
DOI: <a href="https://doi.org/10.1038/s41586-019-0965-1">10.1038/s41586-019-0965-1</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/30745586">30745586</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6784870">PMC6784870</a></p>
</div>
<div id="ref-fNw8iptq">
<p>102. <strong>FTP index of /pub/databases/metagenomics/umgs\_analyses/</strong> <br />
EMBL-EBI Microbiome Informatics Team<br />
<em>ftp.ebi.ac.uk</em> (2019-09-12) <a href="http://ftp.ebi.ac.uk/pub/databases/metagenomics/umgs_analyses/">http://ftp.ebi.ac.uk/pub/databases/metagenomics/umgs_analyses/</a></p>
</div>
<div id="ref-1BmIQbauY">
<p>103. <strong>GitHub - Finn-Lab/MGS-gut: Analysing Metagenomic Species (MGS)</strong> <br />
EMBL-EBI Microbiome Informatics Team<br />
<em>GitHub</em> <a href="https://github.com/Finn-Lab/MGS-gut">https://github.com/Finn-Lab/MGS-gut</a></p>
</div>
<div id="ref-14UO6fjKC">
<p>104. <strong>I am looking for which bioinformatics journals encourage authors to submit their code/pipeline/workflow supporting data analysis</strong> <br />
Stian Soiland-Reyes<br />
<em>Twitter</em> (2020-04-16) <a href="https://twitter.com/soilandreyes/status/1250721245622079488">https://twitter.com/soilandreyes/status/1250721245622079488</a></p>
</div>
<div id="ref-jBiuoWG3">
<p>105. <strong>Re-run, Repeat, Reproduce, Reuse, Replicate: Transforming Code into Scientific Contributions.</strong> <br />
Fabien CY Benureau, Nicolas P Rougier<br />
<em>Frontiers in Neuroinformatics</em> (2017) <br />
DOI: <a href="https://doi.org/10.3389/fninf.2017.00069">10.3389/fninf.2017.00069</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/29354046">29354046</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5758530">PMC5758530</a></p>
</div>
<div id="ref-LrIJVM5a">
<p>106. <strong>What is Reproducibility? The R\* Brouhaha</strong> <br />
Carole Goble<br />
(2016-09-09) <a href="http://repscience2016.research-infrastructures.eu/img/CaroleGoble-ReproScience2016v2.pdf">http://repscience2016.research-infrastructures.eu/img/CaroleGoble-ReproScience2016v2.pdf</a></p>
</div>
<div id="ref-a1tub17j">
<p>107. <strong>Robust Cross-Platform Workflows: How Technical and Scientific Communities Collaborate to Develop, Test and Share Best Practices for Data Analysis</strong> <br />
Steffen Möller, Stuart W. Prescott, Lars Wirzenius, Petter Reinholdtsen, Brad Chapman, Pjotr Prins, Stian Soiland-Reyes, Fabian Klötzl, Andrea Bagnacani, Matúš Kalaš, … Michael R. Crusoe<br />
<em>Data Science and Engineering</em> (2017-11-16) <br />
DOI: <a href="https://doi.org/10.1007/s41019-017-0050-4">10.1007/s41019-017-0050-4</a></p>
</div>
<div id="ref-sYguBb3Q">
<p>108. <strong>Bioconda: sustainable and comprehensive software distribution for the life sciences.</strong> <br />
Björn Grüning, Ryan Dale, Andreas Sjödin, Brad A Chapman, Jillian Rowe, Christopher H Tomkins-Tinch, Renan Valieris, Johannes Köster, Bioconda Team<br />
<em>Nature Methods</em> (2018) <br />
DOI: <a href="https://doi.org/10.1038/s41592-018-0046-7">10.1038/s41592-018-0046-7</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/29967506">29967506</a></p>
</div>
<div id="ref-rJUU3iuR">
<p>109. <strong>BioContainers: an open-source and community-driven framework for software standardization.</strong> <br />
Felipe da Veiga Leprevost, Björn A Grüning, Saulo Alves Aflitos, Hannes L Röst, Julian Uszkoreit, Harald Barsnes, Marc Vaudel, Pablo Moreno, Laurent Gatto, Jonas Weber, … Yasset Perez-Riverol<br />
<em>Bioinformatics</em> (2017-08-15) <br />
DOI: <a href="https://doi.org/10.1093/bioinformatics/btx192">10.1093/bioinformatics/btx192</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/28379341">28379341</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5870671">PMC5870671</a></p>
</div>
<div id="ref-8DE4ZSsb">
<p>110. <strong>Community-driven computational biology with Debian Linux.</strong> <br />
Steffen Möller, Hajo Nils Krabbenhöft, Andreas Tille, David Paleino, Alan Williams, Katy Wolstencroft, Carole Goble, Richard Holland, Dominique Belhachemi, Charles Plessy<br />
<em>BMC Bioinformatics</em> (2010-12-21) <br />
DOI: <a href="https://doi.org/10.1186/1471-2105-11-S12-S5">10.1186/1471-2105-11-s12-s5</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/21210984">21210984</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3040531">PMC3040531</a></p>
</div>
<div id="ref-WBsVRA32">
<p>111. <strong>The Galaxy platform for accessible, reproducible and collaborative biomedical analyses: 2018 update.</strong> <br />
Enis Afgan, Dannon Baker, Bérénice Batut, Marius van den Beek, Dave Bouvier, Martin Cech, John Chilton, Dave Clements, Nate Coraor, Björn A Grüning, … Daniel Blankenberg<br />
<em>Nucleic Acids Research</em> (2018-07-02) <br />
DOI: <a href="https://doi.org/10.1093/nar/gky379">10.1093/nar/gky379</a> · PMID: <a href="https://www.ncbi.nlm.nih.gov/pubmed/29790989">29790989</a> · PMCID: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6030816">PMC6030816</a></p>
</div>
<div id="ref-ewNBB7el">
<p>112. <strong>Beyond authorship: attribution, contribution, collaboration, and credit</strong> <br />
Amy Brand, Liz Allen, Micah Altman, Marjorie Hlava, Jo Scott<br />
<em>Learned Publishing</em> (2015-04-01) <a href="https://doi.org/gc6v3m">https://doi.org/gc6v3m</a> <br />
DOI: <a href="https://doi.org/10.1087/20150211">10.1087/20150211</a></p>
</div>
</div>
<section class="footnotes" role="doc-endnotes">
<hr />
<ol>
<li id="fn1" role="doc-endnote"><p>IRIs<span class="citation" data-cites="rqjuXkEf">[<a href="#ref-rqjuXkEf" role="doc-biblioref">27</a>]</span> are a generalisation of URIs (which include well-known http/https URLs), permitting international Unicode characters without <code>%</code>-encoding, commonly used on the browser address bar and in HTML5.<a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn2" role="doc-endnote"><p>The avid reader may spot that the RO-Crate Metadata file use the extension <code>.json</code> instead of <code>.jsonld</code>, this is to emphasize the developer expectations as a JSON format, while the file’s JSON-LD nature is secondary.<a href="#fnref2" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn3" role="doc-endnote"><p>Recommended properties for shown types in Listing 1 also include <code>description</code>, <code>datePublished</code>, <code>encodingFormat</code>, <code>encodingFormat</code>, <code>affiliation</code>, <code>contactPoint</code>, <code>publisher</code>, <code>funder</code>, <code>citation</code>, <code>identifier</code>, <code>keywords</code>, <code>subjectOf</code>; these properties and corresponding contextual entities are excluded here for brevity.<a href="#fnref3" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn4" role="doc-endnote"><p>CWLProv and TavernaProv predate RO-Crate, but use RO-Bundle<span class="citation" data-cites="dijZpInF">[<a href="#ref-dijZpInF" role="doc-biblioref">67</a>]</span>, a similar Research Object packaging method with JSON-LD metadata.<a href="#fnref4" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn5" role="doc-endnote"><p>IEEE 2791-2020 do permit user extensions in the <em>extension domain</em> by referencing additional JSON Schemas.<a href="#fnref5" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn6" role="doc-endnote"><p>The Endings Project  is a five-year project funded by the Social Sciences and Humanities Research Council (SSHRC) that is creating tools, principles, policies and recommendations for digital scholarship practitioners to create accessible, stable, long-lasting resources in the humanities.<a href="#fnref6" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn7" role="doc-endnote"><p>For simplicity, blank nodes are not included in this formalisation, as RO-Crate
<a href="https://www.researchobject.org/ro-crate/1.1/appendix/jsonld.html#describing-entities-in-json-ld">recommends the use of IRI identifiers</a><a href="#fnref7" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn8" role="doc-endnote"><p>The full list of types, relations and attribute properties from the RO-Crate specification are not included. Examples shown include <code>datePublished</code>, <code>CreativeWork</code> and <code>name</code>.<a href="#fnref8" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn9" role="doc-endnote"><p>This simplification does not cover the extensive list of literal datatypes built-in to RDF 1.1, only strings and decimal real numbers. Likewise, language of literals are not included.<a href="#fnref9" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn10" role="doc-endnote"><p><strong>Limitations:</strong> Contextual entities not related from the RO-Crate (e.g. using inverse relations to a data entity) would not be covered by the single direction <span class="math inline">\(Mentions(R, s)\)</span> production rule; see <a href="https://github.com/ResearchObject/ro-crate/issues/122">issue 122</a>. The <code>datePublished(e, d)</code> rule do not include syntax checks for the ISO 8601 datetime format. Compared with RO-Crate examples, this generated JSON-LD does not use a <code>@context</code> as the IRIs are produced unshortened, a post-step could do JSON-LD Flattening with a versioned RO-Crate context. The <code>@type</code> expansion is included for clarity, even though this is also implied by the <code>type(e, t)</code> expansion to <code>Relation(e, xsd:type)</code>.<a href="#fnref10" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
<!-- default theme -->

<style>
  /* import google fonts */
  @import url("https://fonts.googleapis.com/css?family=Open+Sans:400,600,700");
  @import url("https://fonts.googleapis.com/css?family=Source+Code+Pro");
  @import url("https://fonts.googleapis.com/css2?family=STIX+Two+Text:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&display=swap");

  /* -------------------------------------------------- */
  /* global */
  /* -------------------------------------------------- */

  /* all elements */
  * {
    /* force sans-serif font unless specified otherwise
    font-family: "Open Sans", "Helvetica", sans-serif;*/
    /* Almost same font as in Overleaf and SVG figures */
    font-family: "STIX Two Text", "STIXGeneral", "Garamond", serif;

    /* prevent text inflation on some mobile browsers */
    -webkit-text-size-adjust: none !important;
    -moz-text-size-adjust: none !important;
    -o-text-size-adjust: none !important;
    text-size-adjust: none !important;
  }

  @media only screen {
    /* "page" element */
    body {
      position: relative;
      box-sizing: border-box;
      font-size: 12pt;
      line-height: 1.5;
      max-width: 8.5in;
      margin: 20px auto;
      padding: 40px;
      border-radius: 5px;
      border: solid 1px #bdbdbd;
      box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
      background: #ffffff;
    }
  }

  /* when on screen < 8.5in wide */
  @media only screen and (max-width: 8.5in) {
    /* "page" element */
    body {
      padding: 20px;
      margin: 0;
      border-radius: 0;
      border: none;
      box-shadow: 0 0 20px rgba(0, 0, 0, 0.05) inset;
      background: none;
    }
  }

  /* -------------------------------------------------- */
  /* headings */
  /* -------------------------------------------------- */

  /* all headings */
  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
    margin: 20px 0;
    padding: 0;
    font-weight: bold;
  }

  /* biggest heading */
  h1 {
    margin: 40px 0;
    text-align: center;
  }

  /* second biggest heading */
  h2 {
    margin-top: 30px;
    padding-bottom: 5px;
    border-bottom: solid 1px #bdbdbd;
  }

  /* heading font sizes */
  h1 {
    font-size: 2em;
  }
  h2 {
    font-size: 1.5em;
  }
  h3 {
    font-size: 1.35em;
  }
  h4 {
    font-size: 1.25em;
  }
  h5 {
    font-size: 1.15em;
  }
  h6 {
    font-size: 1em;
  }

  /* -------------------------------------------------- */
  /* manuscript header */
  /* -------------------------------------------------- */

  /* manuscript title */
  header > h1 {
    margin: 0;
  }

  /* manuscript title caption text (ie "automatically generated on") */
  header + p {
    text-align: center;
    margin-top: 10px;
  }

  /* -------------------------------------------------- */
  /* text elements */
  /* -------------------------------------------------- */

  /* links */
  a {
    color: #2196f3;
    overflow-wrap: break-word;
  }

  /* superscripts and subscripts */
  sub,
  sup {
    /* prevent from affecting line height */
    line-height: 0;
  }

  /* unordered and ordered lists*/
  ul,
  ol {
    padding-left: 20px;
  }

  /* class for styling text semibold */
  .semibold {
    font-weight: 600;
  }

  /* class for styling elements horizontally left aligned */
  .left {
    display: block;
    text-align: left;
    margin-left: auto;
    margin-right: 0;
    justify-content: left;
  }

  /* class for styling elements horizontally centered */
  .center {
    display: block;
    text-align: center;
    margin-left: auto;
    margin-right: auto;
    justify-content: center;
  }

  /* class for styling elements horizontally right aligned */
  .right {
    display: block;
    text-align: right;
    margin-left: 0;
    margin-right: auto;
    justify-content: right;
  }

  /* -------------------------------------------------- */
  /* section elements */
  /* -------------------------------------------------- */

  /* horizontal divider line */
  hr {
    border: none;
    height: 1px;
    background: #bdbdbd;
  }

  /* paragraphs, horizontal dividers, figures, tables, code */
  p,
  hr,
  figure,
  table,
  pre {
    /* treat all as "paragraphs", with consistent vertical margins */
    margin-top: 20px;
    margin-bottom: 20px;
  }

  /* -------------------------------------------------- */
  /* figures */
  /* -------------------------------------------------- */

  /* figure */
  figure {
    max-width: 100%;
    margin-left: auto;
    margin-right: auto;
  }

  /* figure caption */
  figcaption {
    padding: 0;
    padding-top: 10px;
  }

  /* figure image element */
  figure > img,
  figure > svg {
    max-width: 100%;
    display: block;
    margin-left: auto;
    margin-right: auto;
  }

  /* figure auto-number */
  img + figcaption > span:first-of-type,
  svg + figcaption > span:first-of-type {
    font-weight: bold;
    margin-right: 5px;
  }

  /* -------------------------------------------------- */
  /* tables */
  /* -------------------------------------------------- */

  /* table */
  table {
    border-collapse: collapse;
    border-spacing: 0;
    width: 100%;
    margin-left: auto;
    margin-right: auto;
  }

  /* table cells */
  th,
  td {
    border: solid 1px #bdbdbd;
    padding: 10px;
    /* squash table if too wide for page by forcing line breaks */
    overflow-wrap: break-word;
    word-break: break-word;
  }

  /* header row and even rows */
  th,
  tr:nth-child(2n) {
    background-color: #fafafa;
  }

  /* odd rows */
  tr:nth-child(2n + 1) {
    background-color: #ffffff;
  }

  /* table caption */
  caption {
    text-align: left;
    padding: 0;
    padding-bottom: 10px;
  }

  /* table auto-number */
  table > caption > span:first-of-type,
  div.table_wrapper > table > caption > span:first-of-type {
    font-weight: bold;
    margin-right: 5px;
  }

  /* -------------------------------------------------- */
  /* code */
  /* -------------------------------------------------- */

  /* multi-line code block */
  pre {
    padding: 10px;
    background-color: #eeeeee;
    color: #000000;
    border-radius: 5px;
    break-inside: avoid;
    text-align: left;
  }

  /* inline code, ie code within normal text */
  :not(pre) > code {
    padding: 0 4px;
    background-color: #eeeeee;
    color: #000000;
    border-radius: 5px;
  }

  /* code text */
  /* apply all children, to reach syntax highlighting sub-elements */
  code,
  code * {
    /* force monospace font */
    font-family: "Source Code Pro", "Courier New", monospace;
  }

  /* -------------------------------------------------- */
  /* quotes */
  /* -------------------------------------------------- */

  /* quoted text */
  blockquote {
    margin: 0;
    padding: 0;
    border-left: 4px solid #bdbdbd;
    padding-left: 16px;
    break-inside: avoid;
  }

  /* -------------------------------------------------- */
  /* banners */
  /* -------------------------------------------------- */

  /* info banners */
  .banner {
    box-sizing: border-box;
    display: block;
    position: relative;
    width: 100%;
    margin-top: 20px;
    margin-bottom: 20px;
    padding: 20px;
    text-align: center;
  }

  /* paragraph in banner */
  .banner > p {
    margin: 0;
  }

  /* -------------------------------------------------- */
  /* highlight colors */
  /* -------------------------------------------------- */

  .white {
    background: #ffffff;
  }
  .lightgrey {
    background: #eeeeee;
  }
  .grey {
    background: #757575;
  }
  .darkgrey {
    background: #424242;
  }
  .black {
    background: #000000;
  }
  .lightred {
    background: #ffcdd2;
  }
  .lightyellow {
    background: #ffecb3;
  }
  .lightgreen {
    background: #dcedc8;
  }
  .lightblue {
    background: #e3f2fd;
  }
  .lightpurple {
    background: #f3e5f5;
  }
  .red {
    background: #f44336;
  }
  .orange {
    background: #ff9800;
  }
  .yellow {
    background: #ffeb3b;
  }
  .green {
    background: #4caf50;
  }
  .blue {
    background: #2196f3;
  }
  .purple {
    background: #9c27b0;
  }
  .white,
  .lightgrey,
  .lightred,
  .lightyellow,
  .lightgreen,
  .lightblue,
  .lightpurple,
  .orange,
  .yellow,
  .white a,
  .lightgrey a,
  .lightred a,
  .lightyellow a,
  .lightgreen a,
  .lightblue a,
  .lightpurple a,
  .orange a,
  .yellow a {
    color: #000000;
  }
  .grey,
  .darkgrey,
  .black,
  .red,
  .green,
  .blue,
  .purple,
  .grey a,
  .darkgrey a,
  .black a,
  .red a,
  .green a,
  .blue a,
  .purple a {
    color: #ffffff;
  }

  /* -------------------------------------------------- */
  /* buttons */
  /* -------------------------------------------------- */

  /* class for styling links like buttons */
  .button {
    display: inline-flex;
    justify-content: center;
    align-items: center;
    margin: 5px;
    padding: 10px 20px;
    font-size: 0.75em;
    font-weight: 600;
    text-transform: uppercase;
    text-decoration: none;
    letter-spacing: 1px;
    background: none;
    color: #2196f3;
    border: solid 1px #bdbdbd;
    border-radius: 5px;
  }

  /* buttons when hovered */
  .button:hover:not([disabled]),
  .icon_button:hover:not([disabled]) {
    cursor: pointer;
    background: #f5f5f5;
  }

  /* buttons when disabled */
  .button[disabled],
  .icon_button[disabled] {
    opacity: 0.35;
    pointer-events: none;
  }

  /* class for styling buttons containg only single icon */
  .icon_button {
    display: inline-flex;
    justify-content: center;
    align-items: center;
    text-decoration: none;
    margin: 0;
    padding: 0;
    background: none;
    border-radius: 5px;
    border: none;
    width: 20px;
    height: 20px;
    min-width: 20px;
    min-height: 20px;
  }

  /* icon button inner svg image */
  .icon_button > svg {
    height: 16px;
  }

  /* -------------------------------------------------- */
  /* icons */
  /* -------------------------------------------------- */

  /* class for styling icons inline with text */
  .inline_icon {
    height: 1em;
    position: relative;
    top: 0.125em;
  }

  /* -------------------------------------------------- */
  /* print control */
  /* -------------------------------------------------- */

  @media print {
    @page {
      /* suggested printing margin */
      margin: 0.5in;
    }

    /* document and "page" elements */
    html,
    body {
      margin: 0;
      padding: 0;
      width: 100%;
      height: 100%;
    }

    /* "page" element */
    body {
      font-size: 11pt !important;
      line-height: 1.35;
    }

    /* all headings */
    h1,
    h2,
    h3,
    h4,
    h5,
    h6 {
      margin: 15px 0;
    }

    /* figures and tables */
    figure,
    table {
      font-size: 0.85em;
    }

    /* table cells */
    th,
    td {
      padding: 5px;
    }

    /* shrink font awesome icons */
    i.fas,
    i.fab,
    i.far,
    i.fal {
      transform: scale(0.85);
    }

    /* decrease banner margins */
    .banner {
      margin-top: 15px;
      margin-bottom: 15px;
      padding: 15px;
    }

    /* class for centering an element vertically on its own page */
    .page_center {
      margin: auto;
      width: 100%;
      height: 100%;
      display: flex;
      align-items: center;
      vertical-align: middle;
      break-before: page;
      break-after: page;
    }

    /* always insert a page break before the element */
    .page_break_before {
      break-before: page;
    }

    /* always insert a page break after the element */
    .page_break_after {
      break-after: page;
    }

    /* avoid page break before the element */
    .page_break_before_avoid {
      break-before: avoid;
    }

    /* avoid page break after the element */
    .page_break_after_avoid {
      break-after: avoid;
    }

    /* avoid page break inside the element */
    .page_break_inside_avoid {
      break-inside: avoid;
    }
  }

  /* -------------------------------------------------- */
  /* override pandoc css quirks */
  /* -------------------------------------------------- */

  .sourceCode {
    /* prevent unsightly overflow in wide code blocks */
    overflow: auto !important;
  }

  div.sourceCode {
    /* prevent background fill on top-most code block  container */
    background: none !important;
  }

  .sourceCode * {
    /* force consistent line spacing */
    line-height: 1.5 !important;
  }

  div.sourceCode {
    /* style code block margins same as <pre> element */
    margin-top: 20px;
    margin-bottom: 20px;
  }

  /* -------------------------------------------------- */
  /* tablenos */
  /* -------------------------------------------------- */

  /* tablenos wrapper */
  .tablenos {
    /* show scrollbar on tables if necessary to prevent overflow */
    width: 100%;
    margin: 20px 0;
  }

  .tablenos > table {
    /* move margins from table to table_wrapper to allow margin collapsing */
    margin: 0;
  }

  @media only screen {
    /* tablenos wrapper */
    .tablenos {
      /* show scrollbar on tables if necessary to prevent overflow */
      overflow-x: auto !important;
    }

    .tablenos th,
    .tablenos td {
      overflow-wrap: unset !important;
      word-break: unset !important;
    }

    /* table in wrapper */
    .tablenos table,
    .tablenos table * {
      /* don't break table words */
      overflow-wrap: normal !important;
    }
  }
</style>
<!-- 
    Plugin Core

    Functions needed for and shared across all first-party plugins.
-->

<script>
  // get element that is target of hash (from link element or url)
  function getHashTarget(link) {
    const hash = link ? link.hash : window.location.hash;
    const id = hash.slice(1);
    let target = document.querySelector(`[id="${id}"]`);
    if (!target) return;

    // if figure or table, modify target to get expected element
    if (id.indexOf("fig:") === 0) target = target.querySelector("figure");
    if (id.indexOf("tbl:") === 0) target = target.querySelector("table");

    return target;
  }

  // get position/dimensions of element or viewport
  function getRectInView(element) {
    let rect = {};
    rect.left = 0;
    rect.top = 0;
    rect.right = document.documentElement.clientWidth;
    rect.bottom = document.documentElement.clientHeight;
    let style = {};

    if (element instanceof HTMLElement) {
      rect = element.getBoundingClientRect();
      style = window.getComputedStyle(element);
    }

    const margin = {};
    margin.left = parseFloat(style.marginLeftWidth) || 0;
    margin.top = parseFloat(style.marginTopWidth) || 0;
    margin.right = parseFloat(style.marginRightWidth) || 0;
    margin.bottom = parseFloat(style.marginBottomWidth) || 0;

    const border = {};
    border.left = parseFloat(style.borderLeftWidth) || 0;
    border.top = parseFloat(style.borderTopWidth) || 0;
    border.right = parseFloat(style.borderRightWidth) || 0;
    border.bottom = parseFloat(style.borderBottomWidth) || 0;

    const newRect = {};
    newRect.left = rect.left + margin.left + border.left;
    newRect.top = rect.top + margin.top + border.top;
    newRect.right = rect.right + margin.right + border.right;
    newRect.bottom = rect.bottom + margin.bottom + border.bottom;
    newRect.width = newRect.right - newRect.left;
    newRect.height = newRect.bottom - newRect.top;

    return newRect;
  }

  // get position of element relative to page
  function getRectInPage(element) {
    const rect = getRectInView(element);
    const body = getRectInView(document.body);

    const newRect = {};
    newRect.left = rect.left - body.left;
    newRect.top = rect.top - body.top;
    newRect.right = rect.right - body.left;
    newRect.bottom = rect.bottom - body.top;
    newRect.width = rect.width;
    newRect.height = rect.height;

    return newRect;
  }

  // get closest element before specified element that matches query
  function firstBefore(element, query) {
    while (element && element !== document.body && !element.matches(query))
      element = element.previousElementSibling || element.parentNode;

    return element;
  }

  // check if element is part of collapsed heading
  function isCollapsed(element) {
    while (element && element !== document.body) {
      if (element.dataset.collapsed === "true") return true;
      element = element.parentNode;
    }
    return false;
  }

  // expand any collapsed parent containers of element if necessary
  function expandElement(element) {
    if (isCollapsed(element)) {
      // accordion plugin
      const heading = firstBefore(element, "h2");
      if (heading) heading.click();
      // details/summary HTML element
      const summary = firstBefore(element, "summary");
      if (summary) summary.click();
    }
  }

  // scroll to and focus element
  function goToElement(element, offset) {
    // expand accordion section if collapsed
    expandElement(element);
    const y =
      getRectInView(element).top -
      getRectInView(document.documentElement).top -
      (offset || 0);

    // trigger any function listening for "onscroll" event
    window.dispatchEvent(new Event("scroll"));
    window.scrollTo(0, y);
    document.activeElement.blur();
    element.focus();
  }

  // get list of elements after a start element up to element matching query
  function nextUntil(element, query, exclude) {
    const elements = [];
    while (((element = element.nextElementSibling), element)) {
      if (element.matches(query)) break;
      if (!element.matches(exclude)) elements.push(element);
    }
    return elements;
  }
</script>
<!--
  Accordion Plugin

  Allows sections of content under h2 headings to be collapsible.
-->

<script type="module">
  // whether to always start expanded ('false'), always start collapsed
  // ('true'), or start collapsed when screen small ('auto')
  const startCollapsed = "auto";

  // start script
  function start() {
    // run through each <h2> heading
    const headings = document.querySelectorAll("h2");
    for (const heading of headings) {
      addArrow(heading);

      // start expanded/collapsed based on option
      if (
        startCollapsed === "true" ||
        (startCollapsed === "auto" && isSmallScreen())
      )
        collapseHeading(heading);
      else expandElement(heading);
    }

    // attach hash change listener to window
    window.addEventListener("hashchange", onHashChange);
  }

  // when hash (eg manuscript.html#introduction) changes
  function onHashChange() {
    const target = getHashTarget();
    if (target) goToElement(target);
  }

  // add arrow to heading
  function addArrow(heading) {
    // add arrow button
    const arrow = document.createElement("button");
    arrow.innerHTML = document.querySelector(".icon_angle_down").innerHTML;
    arrow.classList.add("icon_button", "accordion_arrow");
    heading.insertBefore(arrow, heading.firstChild);

    // attach click listener to heading and button
    heading.addEventListener("click", onHeadingClick);
    arrow.addEventListener("click", onArrowClick);
  }

  // determine if on mobile-like device with small screen
  function isSmallScreen() {
    return Math.min(window.innerWidth, window.innerHeight) < 480;
  }

  // when <h2> heading is clicked
  function onHeadingClick(event) {
    // only collapse if <h2> itself is target of click (eg, user did
    // not click on anchor within <h2>)
    if (event.target === this) toggleCollapse(this);
  }

  // when arrow button is clicked
  function onArrowClick() {
    toggleCollapse(this.parentNode);
  }

  // collapse section if expanded, expand if collapsed
  function toggleCollapse(heading) {
    if (heading.dataset.collapsed === "false") collapseHeading(heading);
    else expandElement(heading);
  }

  // elements to exclude from collapse, such as table of contents panel,
  // hypothesis panel, etc
  const exclude = "#toc_panel, div.annotator-frame, #lightbox_overlay";

  // collapse section
  function collapseHeading(heading) {
    heading.setAttribute("data-collapsed", "true");
    const children = getChildren(heading);
    for (const child of children) child.setAttribute("data-collapsed", "true");
  }

  // expand section
  function expandElement(heading) {
    heading.setAttribute("data-collapsed", "false");
    const children = getChildren(heading);
    for (const child of children) child.setAttribute("data-collapsed", "false");
  }

  // get list of elements between this <h2> and next <h2> or <h1>
  // ("children" of the <h2> section)
  function getChildren(heading) {
    return nextUntil(heading, "h2, h1", exclude);
  }

  // start script when document is finished loading
  window.addEventListener("load", start);
</script>

<!-- angle down icon -->

<template class="icon_angle_down">
  <!-- modified from: https://fontawesome.com/icons/angle-down -->
  <svg width="16" height="16" viewBox="0 0 448 512">
    <path
      fill="currentColor"
      d="M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z"
    ></path>
  </svg>
</template>

<style>
  @media only screen {
    /* accordion arrow button */
    .accordion_arrow {
      margin-right: 10px;
    }

    /* arrow icon when <h2> data-collapsed attribute true */
    h2[data-collapsed="true"] > .accordion_arrow > svg {
      transform: rotate(-90deg);
    }

    /* all elements (except <h2>'s) when data-collapsed attribute true */
    *:not(h2)[data-collapsed="true"] {
      display: none;
    }

    /* accordion arrow button when hovered and <h2>'s when hovered */
    .accordion_arrow:hover,
    h2[data-collapsed="true"]:hover,
    h2[data-collapsed="false"]:hover {
      cursor: pointer;
    }
  }

  /* always hide accordion arrow button on print */
  @media only print {
    .accordion_arrow {
      display: none;
    }
  }
</style>
<!--
  Anchors Plugin

  Adds an anchor next to each of a certain type of element that provides a
  human-readable url to that specific item/position in the document (e.g.
  "manuscript.html#abstract"). It also makes it such that scrolling out of view
  of a target removes its identifier from the url.
-->

<script type="module">
  // which types of elements to add anchors next to, in "document.querySelector"
  // format
  const typesQuery = 'h1, h2, h3, [id^="fig:"], [id^="tbl:"], [id^="eq:"]';

  // start script
  function start() {
    // add anchor to each element of specified types
    const elements = document.querySelectorAll(typesQuery);
    for (const element of elements) addAnchor(element);

    // attach scroll listener to window
    window.addEventListener("scroll", onScroll);
  }

  // when window is scrolled
  function onScroll() {
    // if url has hash and user has scrolled out of view of hash
    // target, remove hash from url
    const tolerance = 100;
    const target = getHashTarget();
    if (target) {
      if (
        target.getBoundingClientRect().top > window.innerHeight + tolerance ||
        target.getBoundingClientRect().bottom < 0 - tolerance
      )
        history.pushState(null, null, " ");
    }
  }

  // add anchor to element
  function addAnchor(element) {
    let addTo; // element to add anchor button to

    // if figure or table, modify withId and addTo to get expected
    // elements
    if (element.id.indexOf("fig:") === 0) {
      addTo = element.querySelector("figcaption");
    } else if (element.id.indexOf("tbl:") === 0) {
      addTo = element.querySelector("caption");
    } else if (element.id.indexOf("eq:") === 0) {
      addTo = element.querySelector(".eqnos-number");
    }

    addTo = addTo || element;
    const id = element.id || null;

    // do not add anchor if element doesn't have assigned id.
    // id is generated by pandoc and is assumed to be unique and
    // human-readable
    if (!id) return;

    // create anchor button
    const anchor = document.createElement("a");
    anchor.innerHTML = document.querySelector(".icon_link").innerHTML;
    anchor.title = "Link to this part of the document";
    anchor.classList.add("icon_button", "anchor");
    anchor.dataset.ignore = "true";
    anchor.href = "#" + id;
    addTo.appendChild(anchor);
  }

  // start script when document is finished loading
  window.addEventListener("load", start);
</script>

<!-- link icon -->

<template class="icon_link">
  <!-- modified from: https://fontawesome.com/icons/link -->
  <svg width="16" height="16" viewBox="0 0 512 512">
    <path
      fill="currentColor"
      d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"
    ></path>
  </svg>
</template>

<style>
  @media only screen {
    /* anchor button */
    .anchor {
      opacity: 0;
      margin-left: 5px;
    }

    /* anchor buttons within <h2>'s */
    h2 .anchor {
      margin-left: 10px;
    }

    /* anchor buttons when hovered/focused and anything containing an anchor button when hovered */
    *:hover > .anchor,
    .anchor:hover,
    .anchor:focus {
      opacity: 1;
    }

    /* anchor button when hovered */
    .anchor:hover {
      cursor: pointer;
    }
  }

  /* always show anchor button on devices with no mouse/hover ability */
  @media (hover: none) {
    .anchor {
      opacity: 1;
    }
  }

  /* always hide anchor button on print */
  @media only print {
    .anchor {
      display: none;
    }
  }
</style>
<!-- 
    Attributes Plugin

    Allows arbitrary HTML attributes to be attached to (almost) any element.
    Place an HTML comment inside or next to the desired element with the content:
    $attribute="value"
-->

<script type="module">
  // start script
  function start() {
    // get list of comments in document
    const comments = findComments();

    for (const comment of comments)
      if (comment.parentElement)
        addAttributes(comment.parentElement, comment.nodeValue.trim());
  }

  // add html attributes to specified element based on string of
  // html attributes and values
  function addAttributes(element, text) {
    // regex's for finding attribute/value pairs in the format of
    // attribute="value" or attribute='value
    const regex2 = /\$([a-zA-Z\-]+)?=\"(.+?)\"/;
    const regex1 = /\$([a-zA-Z\-]+)?=\'(.+?)\'/;

    // loop through attribute/value pairs
    let match;
    while ((match = text.match(regex2) || text.match(regex1))) {
      // get attribute and value from regex capture groups
      let attribute = match[1];
      let value = match[2];

      // remove from string
      text = text.substring(match.index + match[0].length);

      if (!attribute || !value) break;

      // set attribute of parent element
      try {
        element.setAttribute(attribute, value);
      } catch (error) {
        console.log(error);
      }

      // special case for colspan
      if (attribute === "colspan") removeTableCells(element, value);
    }
  }

  // get list of comment elements in document
  function findComments() {
    const comments = [];

    // iterate over comment nodes in document
    function acceptNode(node) {
      return NodeFilter.FILTER_ACCEPT;
    }
    const iterator = document.createNodeIterator(
      document.body,
      NodeFilter.SHOW_COMMENT,
      acceptNode
    );
    let node;
    while ((node = iterator.nextNode())) comments.push(node);

    return comments;
  }

  // remove certain number of cells after specified cell
  function removeTableCells(cell, number) {
    number = parseInt(number);
    if (!number) return;

    // remove elements
    for (; number > 1; number--) {
      if (cell.nextElementSibling) cell.nextElementSibling.remove();
    }
  }

  // start script when document is finished loading
  window.addEventListener("load", start);
</script>
<!--
  Jump to First Plugin

  Adds a button next to each reference entry, figure, and table that jumps the
  page to the first occurrence of a link to that item in the manuscript.
-->

<script type="module">
  // whether to add buttons next to reference entries
  const references = "true";
  // whether to add buttons next to figures
  const figures = "true";
  // whether to add buttons next to tables
  const tables = "true";

  // start script
  function start() {
    if (references !== "false") makeButtons("ref-", "p", "reference");
    if (figures !== "false") makeButtons("fig:", "figcaption", "figure");
    if (tables !== "false") makeButtons("tbl:", "caption", "table");
  }

  // when jump button clicked
  function onButtonClick() {
    const first = getFirstOccurrence(this.dataset.id);
    if (!first) return;

    // update url hash so navigating "back" in history will return user to button
    window.location.hash = this.dataset.id;
    // scroll to link
    const timeout = function () {
      goToElement(first, window.innerHeight * 0.5);
    };
    window.setTimeout(timeout, 0);
  }

  // get first occurrence of link to item in document
  function getFirstOccurrence(id) {
    let query = "a";
    query += '[href="#' + id + '"]';
    // exclude buttons, anchor links, toc links, etc
    query += ":not(.button):not(.icon_button):not(.anchor):not(.toc_link)";
    return document.querySelector(query);
  }

  // add button next to each reference entry, figure, or table
  function makeButtons(query, containerQuery, subject) {
    const elements = document.querySelectorAll(`[id^="${query}"`);
    for (const element of elements) {
      const id = element.id;
      const buttonContainer = element.querySelector(containerQuery);
      const first = getFirstOccurrence(id);

      // if can't find link to reference or place to put button, ignore
      if (!first || !buttonContainer) continue;

      // make jump button
      let button = document.createElement("button");
      button.classList.add("icon_button", "jump_arrow");
      button.title = `Jump to the first occurrence of this ${subject} in the document`;
      const icon = document.querySelector(".icon_angle_double_up");
      button.innerHTML = icon.innerHTML;
      button.dataset.id = id;
      button.dataset.ignore = "true";
      button.addEventListener("click", onButtonClick);
      buttonContainer.prepend(button);
    }
  }

  // start script when document is finished loading
  window.addEventListener("load", start);
</script>

<!-- angle double up icon -->

<template class="icon_angle_double_up">
  <!-- modified from: https://fontawesome.com/icons/angle-double-up -->
  <svg width="16" height="16" viewBox="0 0 320 512">
    <path
      fill="currentColor"
      d="M177 255.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 351.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 425.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1zm-34-192L7 199.7c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l96.4-96.4 96.4 96.4c9.4 9.4 24.6 9.4 33.9 0l22.6-22.6c9.4-9.4 9.4-24.6 0-33.9l-136-136c-9.2-9.4-24.4-9.4-33.8 0z"
    ></path>
  </svg>
</template>

<style>
  @media only screen {
    /* jump button */
    .jump_arrow {
      position: relative;
      top: 0.125em;
      margin-right: 5px;
    }
  }

  /* always hide jump button on print */
  @media only print {
    .jump_arrow {
      display: none;
    }
  }
</style>
<!-- 
    Lightbox Plugin

    Makes it such that when a user clicks on an image, the image fills the
    screen and the user can pan/drag/zoom the image and navigate between other
    images in the document.
-->

<script type="module">
  // list of possible zoom/scale factors
  const zooms =
    "0.1, 0.25, 0.333333, 0.5, 0.666666, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.5, 3, 3.5, 4, 5, 6, 7, 8";
  // whether to fit image to view ('fit'), display at 100% and shrink if
  // necessary ('shrink'), or always display at 100% ('100')
  const defaultZoom = "fit";
  // whether to zoom in/out toward center of view ('true') or mouse ('false')
  const centerZoom = "false";

  // start script
  function start() {
    // run through each <img> element
    const imgs = document.querySelectorAll("figure > img");
    let count = 1;
    for (const img of imgs) {
      img.classList.add("lightbox_document_img");
      img.dataset.number = count;
      img.dataset.total = imgs.length;
      img.addEventListener("click", openLightbox);
      count++;
    }

    // attach mouse and key listeners to window
    window.addEventListener("mousemove", onWindowMouseMove);
    window.addEventListener("keyup", onKeyUp);
  }

  // when mouse is moved anywhere in window
  function onWindowMouseMove(event) {
    window.mouseX = event.clientX;
    window.mouseY = event.clientY;
  }

  // when key pressed
  function onKeyUp(event) {
    if (!event || !event.key) return;

    switch (event.key) {
      // trigger click of prev button
      case "ArrowLeft":
        const prevButton = document.getElementById("lightbox_prev_button");
        if (prevButton) prevButton.click();
        break;
      // trigger click of next button
      case "ArrowRight":
        const nextButton = document.getElementById("lightbox_next_button");
        if (nextButton) nextButton.click();
        break;
      // close on esc
      case "Escape":
        closeLightbox();
        break;
    }
  }

  // open lightbox
  function openLightbox() {
    const lightbox = makeLightbox(this);
    if (!lightbox) return;

    blurBody(lightbox);
    document.body.appendChild(lightbox);
  }

  // make lightbox
  function makeLightbox(img) {
    // delete lightbox if it exists, start fresh
    closeLightbox();

    // create screen overlay containing lightbox
    const overlay = document.createElement("div");
    overlay.id = "lightbox_overlay";

    // create image info boxes
    const numberInfo = document.createElement("div");
    const zoomInfo = document.createElement("div");
    numberInfo.id = "lightbox_number_info";
    zoomInfo.id = "lightbox_zoom_info";

    // create container for image
    const imageContainer = document.createElement("div");
    imageContainer.id = "lightbox_image_container";
    const lightboxImg = makeLightboxImg(
      img,
      imageContainer,
      numberInfo,
      zoomInfo
    );
    imageContainer.appendChild(lightboxImg);

    // create bottom container for caption and navigation buttons
    const bottomContainer = document.createElement("div");
    bottomContainer.id = "lightbox_bottom_container";
    const caption = makeCaption(img);
    const prevButton = makePrevButton(img);
    const nextButton = makeNextButton(img);
    bottomContainer.appendChild(prevButton);
    bottomContainer.appendChild(caption);
    bottomContainer.appendChild(nextButton);

    // attach top middle and bottom to overlay
    overlay.appendChild(numberInfo);
    overlay.appendChild(zoomInfo);
    overlay.appendChild(imageContainer);
    overlay.appendChild(bottomContainer);

    return overlay;
  }

  // make <img> object that is intuitively draggable and zoomable
  function makeLightboxImg(sourceImg, container, numberInfoBox, zoomInfoBox) {
    // create copy of source <img>
    const img = sourceImg.cloneNode(true);
    img.classList.remove("lightbox_document_img");
    img.removeAttribute("id");
    img.removeAttribute("width");
    img.removeAttribute("height");
    img.style.position = "unset";
    img.style.margin = "0";
    img.style.padding = "0";
    img.style.width = "";
    img.style.height = "";
    img.style.minWidth = "";
    img.style.minHeight = "";
    img.style.maxWidth = "";
    img.style.maxHeight = "";
    img.id = "lightbox_img";

    // build sorted list of zoomSteps
    const zoomSteps = zooms.split(/[^0-9.]/).map((step) => parseFloat(step));
    zoomSteps.sort((a, b) => a - b);

    // <img> object property variables
    let zoom = 1;
    let translateX = 0;
    let translateY = 0;
    let clickMouseX = undefined;
    let clickMouseY = undefined;
    let clickTranslateX = undefined;
    let clickTranslateY = undefined;

    updateNumberInfo();

    // update image numbers displayed in info box
    function updateNumberInfo() {
      numberInfoBox.innerHTML =
        sourceImg.dataset.number + " of " + sourceImg.dataset.total;
    }

    // update zoom displayed in info box
    function updateZoomInfo() {
      let zoomInfo = zoom * 100;
      if (!Number.isInteger(zoomInfo)) zoomInfo = zoomInfo.toFixed(2);
      zoomInfoBox.innerHTML = zoomInfo + "%";
    }

    // move to closest zoom step above current zoom
    const zoomIn = function () {
      for (const zoomStep of zoomSteps) {
        if (zoomStep > zoom) {
          zoom = zoomStep;
          break;
        }
      }
      updateTransform();
    };

    // move to closest zoom step above current zoom
    const zoomOut = function () {
      zoomSteps.reverse();
      for (const zoomStep of zoomSteps) {
        if (zoomStep < zoom) {
          zoom = zoomStep;
          break;
        }
      }
      zoomSteps.reverse();

      updateTransform();
    };

    // update display of <img> based on scale/translate properties
    const updateTransform = function () {
      // set transform
      img.style.transform =
        "translate(" +
        (translateX || 0) +
        "px," +
        (translateY || 0) +
        "px) scale(" +
        (zoom || 1) +
        ")";

      // get new width/height after scale
      const rect = img.getBoundingClientRect();
      // limit translate
      translateX = Math.max(translateX, -rect.width / 2);
      translateX = Math.min(translateX, rect.width / 2);
      translateY = Math.max(translateY, -rect.height / 2);
      translateY = Math.min(translateY, rect.height / 2);

      // set transform
      img.style.transform =
        "translate(" +
        (translateX || 0) +
        "px," +
        (translateY || 0) +
        "px) scale(" +
        (zoom || 1) +
        ")";

      updateZoomInfo();
    };

    // fit <img> to container
    const fit = function () {
      // no x/y offset, 100% zoom by default
      translateX = 0;
      translateY = 0;
      zoom = 1;

      // widths of <img> and container
      const imgWidth = img.naturalWidth;
      const imgHeight = img.naturalHeight;
      const containerWidth = parseFloat(
        window.getComputedStyle(container).width
      );
      const containerHeight = parseFloat(
        window.getComputedStyle(container).height
      );

      // how much zooming is needed to fit <img> to container
      const xRatio = imgWidth / containerWidth;
      const yRatio = imgHeight / containerHeight;
      const maxRatio = Math.max(xRatio, yRatio);
      const newZoom = 1 / maxRatio;

      // fit <img> to container according to option
      if (defaultZoom === "shrink") {
        if (maxRatio > 1) zoom = newZoom;
      } else if (defaultZoom === "fit") zoom = newZoom;

      updateTransform();
    };

    // when mouse wheel is rolled anywhere in container
    const onContainerWheel = function (event) {
      if (!event) return;

      // let ctrl + mouse wheel to zoom behave as normal
      if (event.ctrlKey) return;

      // prevent normal scroll behavior
      event.preventDefault();
      event.stopPropagation();

      // point around which to scale img
      const viewRect = container.getBoundingClientRect();
      const viewX = (viewRect.left + viewRect.right) / 2;
      const viewY = (viewRect.top + viewRect.bottom) / 2;
      const originX = centerZoom === "true" ? viewX : mouseX;
      const originY = centerZoom === "true" ? viewY : mouseY;

      // get point on image under origin
      const oldRect = img.getBoundingClientRect();
      const oldPercentX = (originX - oldRect.left) / oldRect.width;
      const oldPercentY = (originY - oldRect.top) / oldRect.height;

      // increment/decrement zoom
      if (event.deltaY < 0) zoomIn();
      if (event.deltaY > 0) zoomOut();

      // get offset between previous image point and origin
      const newRect = img.getBoundingClientRect();
      const offsetX = originX - (newRect.left + newRect.width * oldPercentX);
      const offsetY = originY - (newRect.top + newRect.height * oldPercentY);

      // translate image to keep image point under origin
      translateX += offsetX;
      translateY += offsetY;

      // perform translate
      updateTransform();
    };

    // when container is clicked
    function onContainerClick(event) {
      // if container itself is target of click, and not other
      // element above it
      if (event.target === this) closeLightbox();
    }

    // when mouse button is pressed on image
    const onImageMouseDown = function (event) {
      // store original mouse position relative to image
      clickMouseX = window.mouseX;
      clickMouseY = window.mouseY;
      clickTranslateX = translateX;
      clickTranslateY = translateY;
      event.stopPropagation();
      event.preventDefault();
    };

    // when mouse button is released anywhere in window
    const onWindowMouseUp = function (event) {
      // reset original mouse position
      clickMouseX = undefined;
      clickMouseY = undefined;
      clickTranslateX = undefined;
      clickTranslateY = undefined;

      // remove global listener if lightbox removed from document
      if (!document.body.contains(container))
        window.removeEventListener("mouseup", onWindowMouseUp);
    };

    // when mouse is moved anywhere in window
    const onWindowMouseMove = function (event) {
      if (
        clickMouseX === undefined ||
        clickMouseY === undefined ||
        clickTranslateX === undefined ||
        clickTranslateY === undefined
      )
        return;

      // offset image based on original and current mouse position
      translateX = clickTranslateX + window.mouseX - clickMouseX;
      translateY = clickTranslateY + window.mouseY - clickMouseY;
      updateTransform();
      event.preventDefault();

      // remove global listener if lightbox removed from document
      if (!document.body.contains(container))
        window.removeEventListener("mousemove", onWindowMouseMove);
    };

    // when window is resized
    const onWindowResize = function (event) {
      fit();

      // remove global listener if lightbox removed from document
      if (!document.body.contains(container))
        window.removeEventListener("resize", onWindowResize);
    };

    // attach the necessary event listeners
    img.addEventListener("dblclick", fit);
    img.addEventListener("mousedown", onImageMouseDown);
    container.addEventListener("wheel", onContainerWheel);
    container.addEventListener("mousedown", onContainerClick);
    container.addEventListener("touchstart", onContainerClick);
    window.addEventListener("mouseup", onWindowMouseUp);
    window.addEventListener("mousemove", onWindowMouseMove);
    window.addEventListener("resize", onWindowResize);

    // run fit() after lightbox atttached to document and <img> Loaded
    // so needed container and img dimensions available
    img.addEventListener("load", fit);

    return img;
  }

  // make caption
  function makeCaption(img) {
    const caption = document.createElement("div");
    caption.id = "lightbox_caption";
    const captionSource = img.nextElementSibling;
    if (captionSource.tagName.toLowerCase() === "figcaption") {
      const captionCopy = makeCopy(captionSource);
      caption.innerHTML = captionCopy.innerHTML;
    }

    caption.addEventListener("touchstart", function (event) {
      event.stopPropagation();
    });

    return caption;
  }

  // make carbon copy of html dom element
  function makeCopy(source) {
    const sourceCopy = source.cloneNode(true);

    // delete elements marked with ignore (eg anchor and jump buttons)
    const deleteFromCopy = sourceCopy.querySelectorAll('[data-ignore="true"]');
    for (const element of deleteFromCopy) element.remove();

    // delete certain element attributes
    const attributes = [
      "id",
      "data-collapsed",
      "data-selected",
      "data-highlighted",
      "data-glow",
    ];
    for (const attribute of attributes) {
      sourceCopy.removeAttribute(attribute);
      const elements = sourceCopy.querySelectorAll("[" + attribute + "]");
      for (const element of elements) element.removeAttribute(attribute);
    }

    return sourceCopy;
  }

  // make button to jump to previous image in document
  function makePrevButton(img) {
    const prevButton = document.createElement("button");
    prevButton.id = "lightbox_prev_button";
    prevButton.title = "Jump to the previous image in the document [←]";
    prevButton.classList.add("icon_button", "lightbox_button");
    prevButton.innerHTML = document.querySelector(".icon_caret_left").innerHTML;

    // attach click listeners to button
    prevButton.addEventListener("click", function () {
      getPrevImg(img).click();
    });

    return prevButton;
  }

  // make button to jump to next image in document
  function makeNextButton(img) {
    const nextButton = document.createElement("button");
    nextButton.id = "lightbox_next_button";
    nextButton.title = "Jump to the next image in the document [→]";
    nextButton.classList.add("icon_button", "lightbox_button");
    nextButton.innerHTML = document.querySelector(
      ".icon_caret_right"
    ).innerHTML;

    // attach click listeners to button
    nextButton.addEventListener("click", function () {
      getNextImg(img).click();
    });

    return nextButton;
  }

  // get previous image in document
  function getPrevImg(img) {
    const imgs = document.querySelectorAll(".lightbox_document_img");

    // find index of provided img
    let index;
    for (index = 0; index < imgs.length; index++) {
      if (imgs[index] === img) break;
    }

    // wrap index to other side if < 1
    if (index - 1 >= 0) index--;
    else index = imgs.length - 1;
    return imgs[index];
  }

  // get next image in document
  function getNextImg(img) {
    const imgs = document.querySelectorAll(".lightbox_document_img");

    // find index of provided img
    let index;
    for (index = 0; index < imgs.length; index++) {
      if (imgs[index] === img) break;
    }

    // wrap index to other side if > total
    if (index + 1 <= imgs.length - 1) index++;
    else index = 0;
    return imgs[index];
  }

  // close lightbox
  function closeLightbox() {
    focusBody();

    const lightbox = document.getElementById("lightbox_overlay");
    if (lightbox) lightbox.remove();
  }

  // make all elements behind lightbox non-focusable
  function blurBody(overlay) {
    const all = document.querySelectorAll("*");
    for (const element of all) element.tabIndex = -1;
    document.body.classList.add("body_no_scroll");
  }

  // make all elements focusable again
  function focusBody() {
    const all = document.querySelectorAll("*");
    for (const element of all) element.removeAttribute("tabIndex");
    document.body.classList.remove("body_no_scroll");
  }

  // start script when document is finished loading
  window.addEventListener("load", start);
</script>

<!-- caret left icon -->

<template class="icon_caret_left">
  <!-- modified from: https://fontawesome.com/icons/caret-left -->
  <svg width="16" height="16" viewBox="0 0 192 512">
    <path
      fill="currentColor"
      d="M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z"
    ></path>
  </svg>
</template>

<!-- caret right icon -->

<template class="icon_caret_right">
  <!-- modified from: https://fontawesome.com/icons/caret-right -->
  <svg width="16" height="16" viewBox="0 0 192 512">
    <path
      fill="currentColor"
      d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"
    ></path>
  </svg>
</template>

<style>
  @media only screen {
    /* regular <img> in document when hovered */
    img.lightbox_document_img:hover {
      cursor: pointer;
    }

    .body_no_scroll {
      overflow: hidden !important;
    }

    /* screen overlay */
    #lightbox_overlay {
      display: flex;
      flex-direction: column;
      position: fixed;
      left: 0;
      top: 0;
      right: 0;
      bottom: 0;
      background: rgba(0, 0, 0, 0.75);
      z-index: 3;
    }

    /* middle area containing lightbox image */
    #lightbox_image_container {
      flex-grow: 1;
      display: flex;
      justify-content: center;
      align-items: center;
      overflow: hidden;
      position: relative;
      padding: 20px;
    }

    /* bottom area containing caption */
    #lightbox_bottom_container {
      display: flex;
      justify-content: center;
      align-items: center;
      height: 100px;
      min-height: 100px;
      max-height: 100px;
      background: rgba(0, 0, 0, 0.5);
    }

    /* image number info text box */
    #lightbox_number_info {
      position: absolute;
      color: #ffffff;
      font-weight: 600;
      left: 2px;
      top: 0;
      z-index: 4;
    }

    /* zoom info text box */
    #lightbox_zoom_info {
      position: absolute;
      color: #ffffff;
      font-weight: 600;
      right: 2px;
      top: 0;
      z-index: 4;
    }

    /* copy of image caption */
    #lightbox_caption {
      box-sizing: border-box;
      display: inline-block;
      width: 100%;
      max-height: 100%;
      padding: 10px 0;
      text-align: center;
      overflow-y: auto;
      color: #ffffff;
    }

    /* navigation previous/next button */
    .lightbox_button {
      width: 100px;
      height: 100%;
      min-width: 100px;
      min-height: 100%;
      color: #ffffff;
    }

    /* navigation previous/next button when hovered */
    .lightbox_button:hover {
      background: none !important;
    }

    /* navigation button icon */
    .lightbox_button > svg {
      height: 25px;
    }

    /* figure auto-number */
    #lightbox_caption > span:first-of-type {
      font-weight: bold;
      margin-right: 5px;
    }

    /* lightbox image when hovered */
    #lightbox_img:hover {
      cursor: grab;
    }

    /* lightbox image when grabbed */
    #lightbox_img:active {
      cursor: grabbing;
    }
  }

  /* when on screen < 480px wide */
  @media only screen and (max-width: 480px) {
    /* make navigation buttons skinnier on small screens to make more room for caption text */
    .lightbox_button {
      width: 50px;
      min-width: 50px;
    }
  }

  /* always hide lightbox on print */
  @media only print {
    #lightbox_overlay {
      display: none;
    }
  }
</style>
<!-- 
  Link Highlight Plugin

  Makes it such that when a user hovers or focuses a link, other links that have
  the same target will be highlighted. It also makes it such that when clicking
  a link, the target of the link (eg reference, figure, table) is briefly
  highlighted.
-->

<script type="module">
  // whether to also highlight links that go to external urls
  const externalLinks = "false";
  // whether user must click off to unhighlight instead of just
  // un-hovering
  const clickUnhighlight = "false";
  // whether to also highlight links that are unique
  const highlightUnique = "true";

  // start script
  function start() {
    const links = getLinks();
    for (const link of links) {
      // attach mouse and focus listeners to link
      link.addEventListener("mouseenter", onLinkFocus);
      link.addEventListener("focus", onLinkFocus);
      link.addEventListener("mouseleave", onLinkUnhover);
    }

    // attach click and hash change listeners to window
    window.addEventListener("click", onClick);
    window.addEventListener("touchstart", onClick);
    window.addEventListener("hashchange", onHashChange);

    // run hash change on window load in case user has navigated
    // directly to hash
    onHashChange();
  }

  // when link is focused (tabbed to) or hovered
  function onLinkFocus() {
    highlight(this);
  }

  // when link is unhovered
  function onLinkUnhover() {
    if (clickUnhighlight !== "true") unhighlightAll();
  }

  // when the mouse is clicked anywhere in window
  function onClick(event) {
    unhighlightAll();
  }

  // when hash (eg manuscript.html#introduction) changes
  function onHashChange() {
    const target = getHashTarget();
    if (target) glowElement(target);
  }

  // start glow sequence on an element
  function glowElement(element) {
    const startGlow = function () {
      onGlowEnd();
      element.dataset.glow = "true";
      element.addEventListener("animationend", onGlowEnd);
    };
    const onGlowEnd = function () {
      element.removeAttribute("data-glow");
      element.removeEventListener("animationend", onGlowEnd);
    };
    startGlow();
  }

  // highlight link and all others with same target
  function highlight(link) {
    // force unhighlight all to start fresh
    unhighlightAll();

    // get links with same target
    if (!link) return;
    const sameLinks = getSameLinks(link);

    // if link unique and option is off, exit and don't highlight
    if (sameLinks.length <= 1 && highlightUnique !== "true") return;

    // highlight all same links, and "select" (special highlight) this
    // one
    for (const sameLink of sameLinks) {
      if (sameLink === link) sameLink.setAttribute("data-selected", "true");
      else sameLink.setAttribute("data-highlighted", "true");
    }
  }

  // unhighlight all links
  function unhighlightAll() {
    const links = getLinks();
    for (const link of links) {
      link.setAttribute("data-selected", "false");
      link.setAttribute("data-highlighted", "false");
    }
  }

  // get links with same target
  function getSameLinks(link) {
    const results = [];
    const links = getLinks();
    for (const otherLink of links) {
      if (otherLink.getAttribute("href") === link.getAttribute("href"))
        results.push(otherLink);
    }
    return results;
  }

  // get all links of types we wish to handle
  function getLinks() {
    let query = "a";
    if (externalLinks !== "true") query += '[href^="#"]';
    // exclude buttons, anchor links, toc links, etc
    query += ":not(.button):not(.icon_button):not(.anchor):not(.toc_link)";
    return document.querySelectorAll(query);
  }

  // start script when document is finished loading
  window.addEventListener("load", start);
</script>

<style>
  @media only screen {
    /* anything with data-highlighted attribute true */
    [data-highlighted="true"] {
      background: #ffeb3b;
    }

    /* anything with data-selected attribute true */
    [data-selected="true"] {
      background: #ff8a65 !important;
    }

    /* animation definition for glow */
    @keyframes highlight_glow {
      0% {
        background: none;
      }
      10% {
        background: #bbdefb;
      }
      100% {
        background: none;
      }
    }

    /* anything with data-glow attribute true */
    [data-glow="true"] {
      animation: highlight_glow 2s;
    }
  }
</style>
<!--
  Table of Contents Plugin

  Provides a "table of contents" (toc) panel on the side of the document that
  allows the user to conveniently navigate between sections of the document.
-->

<script type="module">
  // which types of elements to add links for, in "document.querySelector" format
  const typesQuery = "h1, h2, h3";
  // whether toc starts open. use 'true' or 'false', or 'auto' to
  // use 'true' behavior when screen wide enough and 'false' when not
  const startOpen = "false";
  // whether toc closes when clicking on toc link. use 'true' or
  // 'false', or 'auto' to use 'false' behavior when screen wide
  // enough and 'true' when not
  const clickClose = "auto";
  // if list item is more than this many characters, text will be
  // truncated
  const charLimit = "50";
  // whether or not to show bullets next to each toc item
  const bullets = "false";

  // start script
  function start() {
    // make toc panel and populate with entries (links to document
    // sections)
    const panel = makePanel();
    if (!panel) return;
    makeEntries(panel);
    // attach panel to document after making entries, so 'toc' heading
    // in panel isn't included in toc
    document.body.insertBefore(panel, document.body.firstChild);

    // initial panel state
    if (startOpen === "true" || (startOpen === "auto" && !isSmallScreen()))
      openPanel();
    else closePanel();

    // attach click, scroll, and hash change listeners to window
    window.addEventListener("click", onClick);
    window.addEventListener("scroll", onScroll);
    window.addEventListener("hashchange", onScroll);
    window.addEventListener("keyup", onKeyUp);
    onScroll();

    // add class to push document body down out of way of toc button
    document.body.classList.add("toc_body_nudge");
  }

  // determine if screen wide enough to fit toc panel
  function isSmallScreen() {
    // in default theme:
    // 816px = 8.5in = width of "page" (<body>) element
    // 260px = min width of toc panel (*2 for both sides of <body>)
    return window.innerWidth < 816 + 260 * 2;
  }

  // when mouse is clicked anywhere in window
  function onClick() {
    if (isSmallScreen()) closePanel();
  }

  // when window is scrolled or hash changed
  function onScroll() {
    highlightViewed();
  }

  // when key pressed
  function onKeyUp(event) {
    if (!event || !event.key) return;

    // close on esc
    if (event.key === "Escape") closePanel();
  }

  // find entry of currently viewed document section in toc and highlight
  function highlightViewed() {
    const firstId = getFirstInView(typesQuery);

    // get toc entries (links), unhighlight all, then highlight viewed
    const list = document.getElementById("toc_list");
    if (!firstId || !list) return;
    const links = list.querySelectorAll("a");
    for (const link of links) link.dataset.viewing = "false";
    const link = list.querySelector('a[href="#' + firstId + '"]');
    if (!link) return;
    link.dataset.viewing = "true";
  }

  // get first or previous toc listed element in top half of view
  function getFirstInView(query) {
    // get all elements matching query and with id
    const elements = document.querySelectorAll(query);
    const elementsWithIds = [];
    for (const element of elements) {
      if (element.id) elementsWithIds.push(element);
    }

    // get first or previous element in top half of view
    for (let i = 0; i < elementsWithIds.length; i++) {
      const element = elementsWithIds[i];
      const prevElement = elementsWithIds[Math.max(0, i - 1)];
      if (element.getBoundingClientRect().top >= 0) {
        if (element.getBoundingClientRect().top < window.innerHeight / 2)
          return element.id;
        else return prevElement.id;
      }
    }
  }

  // make panel
  function makePanel() {
    // create panel
    const panel = document.createElement("div");
    panel.id = "toc_panel";
    if (bullets === "true") panel.dataset.bullets = "true";

    // create header
    const header = document.createElement("div");
    header.id = "toc_header";

    // create toc button
    const button = document.createElement("button");
    button.id = "toc_button";
    button.innerHTML = document.querySelector(".icon_th_list").innerHTML;
    button.title = "Table of Contents";
    button.classList.add("icon_button");

    // create header text
    const text = document.createElement("h4");
    text.innerHTML = "Table of Contents";

    // create container for toc list
    const list = document.createElement("div");
    list.id = "toc_list";

    // attach click listeners
    panel.addEventListener("click", onPanelClick);
    header.addEventListener("click", onHeaderClick);
    button.addEventListener("click", onButtonClick);

    // attach elements
    header.appendChild(button);
    header.appendChild(text);
    panel.appendChild(header);
    panel.appendChild(list);

    return panel;
  }

  // create toc entries (links) to each element of the specified types
  function makeEntries(panel) {
    const elements = document.querySelectorAll(typesQuery);
    for (const element of elements) {
      // do not add link if element doesn't have assigned id
      if (!element.id) continue;

      // create link/list item
      const link = document.createElement("a");
      link.classList.add("toc_link");
      switch (element.tagName.toLowerCase()) {
        case "h1":
          link.dataset.level = "1";
          break;
        case "h2":
          link.dataset.level = "2";
          break;
        case "h3":
          link.dataset.level = "3";
          break;
        case "h4":
          link.dataset.level = "4";
          break;
      }
      link.title = element.innerText;
      let text = element.innerText;
      if (text.length > charLimit) text = text.slice(0, charLimit) + "...";
      link.innerHTML = text;
      link.href = "#" + element.id;
      link.addEventListener("click", onLinkClick);

      // attach link
      panel.querySelector("#toc_list").appendChild(link);
    }
  }

  // when panel is clicked
  function onPanelClick(event) {
    // stop click from propagating to window/document and closing panel
    event.stopPropagation();
  }

  // when header itself is clicked
  function onHeaderClick(event) {
    togglePanel();
  }

  // when button is clicked
  function onButtonClick(event) {
    togglePanel();
    // stop header underneath button from also being clicked
    event.stopPropagation();
  }

  // when link is clicked
  function onLinkClick(event) {
    if (clickClose === "true" || (clickClose === "auto" && isSmallScreen()))
      closePanel();
    else openPanel();
  }

  // open panel if closed, close if opened
  function togglePanel() {
    const panel = document.getElementById("toc_panel");
    if (!panel) return;

    if (panel.dataset.open === "true") closePanel();
    else openPanel();
  }

  // open panel
  function openPanel() {
    const panel = document.getElementById("toc_panel");
    if (panel) panel.dataset.open = "true";
  }

  // close panel
  function closePanel() {
    const panel = document.getElementById("toc_panel");
    if (panel) panel.dataset.open = "false";
  }

  // start script when document is finished loading
  window.addEventListener("load", start);
</script>

<!-- th list icon -->

<template class="icon_th_list">
  <!-- modified from: https://fontawesome.com/icons/th-list -->
  <svg width="16" height="16" viewBox="0 0 512 512" tabindex="-1">
    <path
      fill="currentColor"
      d="M96 96c0 26.51-21.49 48-48 48S0 122.51 0 96s21.49-48 48-48 48 21.49 48 48zM48 208c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm0 160c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm96-236h352c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h352c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z"
      tabindex="-1"
    ></path>
  </svg>
</template>

<style>
  @media only screen {
    /* toc panel */
    #toc_panel {
      box-sizing: border-box;
      position: fixed;
      top: 0;
      left: 0;
      background: #ffffff;
      box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
      z-index: 2;
    }

    /* toc panel when closed */
    #toc_panel[data-open="false"] {
      min-width: 60px;
      width: 60px;
      height: 60px;
      border-right: solid 1px #bdbdbd;
      border-bottom: solid 1px #bdbdbd;
    }

    /* toc panel when open */
    #toc_panel[data-open="true"] {
      min-width: 260px;
      max-width: 480px;
      /* keep panel edge consistent distance away from "page" edge */
      width: calc(((100vw - 8.5in) / 2) - 30px - 40px);
      bottom: 0;
      border-right: solid 1px #bdbdbd;
    }

    /* toc panel header */
    #toc_header {
      box-sizing: border-box;
      display: flex;
      flex-direction: row;
      align-items: center;
      height: 60px;
      margin: 0;
      padding: 20px;
    }

    /* toc panel header when hovered */
    #toc_header:hover {
      cursor: pointer;
    }

    /* toc panel header when panel open */
    #toc_panel[data-open="true"] > #toc_header {
      border-bottom: solid 1px #bdbdbd;
    }

    /* toc open/close header button */
    #toc_button {
      margin-right: 20px;
    }

    /* hide toc list and header text when closed */
    #toc_panel[data-open="false"] > #toc_header > *:not(#toc_button),
    #toc_panel[data-open="false"] > #toc_list {
      display: none;
    }

    /* toc list of entries */
    #toc_list {
      box-sizing: border-box;
      width: 100%;
      padding: 20px;
      position: absolute;
      top: calc(60px + 1px);
      bottom: 0;
      overflow: auto;
    }

    /* toc entry, link to section in document */
    .toc_link {
      display: block;
      padding: 5px;
      position: relative;
      font-weight: 600;
      text-decoration: none;
    }

    /* toc entry when hovered or when "viewed" */
    .toc_link:hover,
    .toc_link[data-viewing="true"] {
      background: #f5f5f5;
    }

    /* toc entry, level 1 indentation */
    .toc_link[data-level="1"] {
      margin-left: 0;
    }

    /* toc entry, level 2 indentation */
    .toc_link[data-level="2"] {
      margin-left: 20px;
    }

    /* toc entry, level 3 indentation */
    .toc_link[data-level="3"] {
      margin-left: 40px;
    }

    /* toc entry, level 4 indentation */
    .toc_link[data-level="4"] {
      margin-left: 60px;
    }

    /* toc entry bullets */
    #toc_panel[data-bullets="true"] .toc_link[data-level]:before {
      position: absolute;
      left: -15px;
      top: -1px;
      font-size: 1.5em;
    }

    /* toc entry, level 2 bullet */
    #toc_panel[data-bullets="true"] .toc_link[data-level="2"]:before {
      content: "\2022";
    }

    /* toc entry, level 3 bullet */
    #toc_panel[data-bullets="true"] .toc_link[data-level="3"]:before {
      content: "\25AB";
    }

    /* toc entry, level 4 bullet */
    #toc_panel[data-bullets="true"] .toc_link[data-level="4"]:before {
      content: "-";
    }
  }

  /* when on screen < 8.5in wide */
  @media only screen and (max-width: 8.5in) {
    /* push <body> ("page") element down to make room for toc icon */
    .toc_body_nudge {
      padding-top: 60px;
    }

    /* toc icon when panel closed and not hovered */
    #toc_panel[data-open="false"]:not(:hover) {
      background: rgba(255, 255, 255, 0.75);
    }
  }

  /* always hide toc panel on print */
  @media only print {
    #toc_panel {
      display: none;
    }
  }
</style>
<!-- 
  Tooltips Plugin

  Makes it such that when the user hovers or focuses a link to a citation or
  figure, a tooltip appears with a preview of the reference content, along with
  arrows to navigate between instances of the same reference in the document.
-->

<script type="module">
  // whether user must click off to close tooltip instead of just un-hovering
  const clickClose = "false";
  // delay (in ms) between opening and closing tooltip
  const delay = "100";

  // start script
  function start() {
    const links = getLinks();
    for (const link of links) {
      // attach hover and focus listeners to link
      link.addEventListener("mouseover", onLinkHover);
      link.addEventListener("mouseleave", onLinkUnhover);
      link.addEventListener("focus", onLinkFocus);
      link.addEventListener("touchend", onLinkTouch);
    }

    // attach mouse, key, and resize listeners to window
    window.addEventListener("mousedown", onClick);
    window.addEventListener("touchstart", onClick);
    window.addEventListener("keyup", onKeyUp);
    window.addEventListener("resize", onResize);
  }

  // when link is hovered
  function onLinkHover() {
    // function to open tooltip
    const delayOpenTooltip = function () {
      openTooltip(this);
    }.bind(this);

    // run open function after delay
    this.openTooltipTimer = window.setTimeout(delayOpenTooltip, delay);
  }

  // when mouse leaves link
  function onLinkUnhover() {
    // cancel opening tooltip
    window.clearTimeout(this.openTooltipTimer);

    // don't close on unhover if option specifies
    if (clickClose === "true") return;

    // function to close tooltip
    const delayCloseTooltip = function () {
      // if tooltip open and if mouse isn't over tooltip, close
      const tooltip = document.getElementById("tooltip");
      if (tooltip && !tooltip.matches(":hover")) closeTooltip();
    };

    // run close function after delay
    this.closeTooltipTimer = window.setTimeout(delayCloseTooltip, delay);
  }

  // when link is focused (tabbed to)
  function onLinkFocus(event) {
    openTooltip(this);
  }

  // when link is touched on touch screen
  function onLinkTouch(event) {
    // attempt to force hover state on first tap always, and trigger
    // regular link click (and navigation) on second tap
    if (event.target === document.activeElement) event.target.click();
    else {
      document.activeElement.blur();
      event.target.focus();
    }
    if (event.cancelable) event.preventDefault();
    event.stopPropagation();
    return false;
  }

  // when mouse is clicked anywhere in window
  function onClick(event) {
    closeTooltip();
  }

  // when key pressed
  function onKeyUp(event) {
    if (!event || !event.key) return;

    switch (event.key) {
      // trigger click of prev button
      case "ArrowLeft":
        const prevButton = document.getElementById("tooltip_prev_button");
        if (prevButton) prevButton.click();
        break;
      // trigger click of next button
      case "ArrowRight":
        const nextButton = document.getElementById("tooltip_next_button");
        if (nextButton) nextButton.click();
        break;
      // close on esc
      case "Escape":
        closeTooltip();
        break;
    }
  }

  // when window is resized or zoomed
  function onResize() {
    closeTooltip();
  }

  // get all links of types we wish to handle
  function getLinks() {
    const queries = [];
    // exclude buttons, anchor links, toc links, etc
    const exclude =
      ":not(.button):not(.icon_button):not(.anchor):not(.toc_link)";
    queries.push('a[href^="#ref-"]' + exclude); // citation links
    queries.push('a[href^="#fig:"]' + exclude); // figure links
    const query = queries.join(", ");
    return document.querySelectorAll(query);
  }

  // get links with same target, get index of link in set, get total
  // same links
  function getSameLinks(link) {
    const sameLinks = [];
    const links = getLinks();
    for (const otherLink of links) {
      if (otherLink.getAttribute("href") === link.getAttribute("href"))
        sameLinks.push(otherLink);
    }

    return {
      elements: sameLinks,
      index: sameLinks.indexOf(link),
      total: sameLinks.length,
    };
  }

  // open tooltip
  function openTooltip(link) {
    // delete tooltip if it exists, start fresh
    closeTooltip();

    // make tooltip element
    const tooltip = makeTooltip(link);

    // if source couldn't be found and tooltip not made, exit
    if (!tooltip) return;

    // make navbar elements
    const navBar = makeNavBar(link);
    if (navBar) tooltip.firstElementChild.appendChild(navBar);

    // attach tooltip to page
    document.body.appendChild(tooltip);

    // position tooltip
    const position = function () {
      positionTooltip(link);
    };
    position();

    // if tooltip contains images, position again after they've loaded
    const imgs = tooltip.querySelectorAll("img");
    for (const img of imgs) img.addEventListener("load", position);
  }

  // close (delete) tooltip
  function closeTooltip() {
    const tooltip = document.getElementById("tooltip");
    if (tooltip) tooltip.remove();
  }

  // make tooltip
  function makeTooltip(link) {
    // get target element that link points to
    const source = getSource(link);

    // if source can't be found, exit
    if (!source) return;

    // create new tooltip
    const tooltip = document.createElement("div");
    tooltip.id = "tooltip";
    const tooltipContent = document.createElement("div");
    tooltipContent.id = "tooltip_content";
    tooltip.appendChild(tooltipContent);

    // make copy of source node and put in tooltip
    const sourceCopy = makeCopy(source);
    tooltipContent.appendChild(sourceCopy);

    // attach mouse event listeners
    tooltip.addEventListener("click", onTooltipClick);
    tooltip.addEventListener("mousedown", onTooltipClick);
    tooltip.addEventListener("touchstart", onTooltipClick);
    tooltip.addEventListener("mouseleave", onTooltipUnhover);

    // (for interaction with lightbox plugin)
    // transfer click on tooltip copied img to original img
    const sourceImg = source.querySelector("img");
    const sourceCopyImg = sourceCopy.querySelector("img");
    if (sourceImg && sourceCopyImg) {
      const clickImg = function () {
        sourceImg.click();
        closeTooltip();
      };
      sourceCopyImg.addEventListener("click", clickImg);
    }

    return tooltip;
  }

  // make carbon copy of html dom element
  function makeCopy(source) {
    const sourceCopy = source.cloneNode(true);

    // delete elements marked with ignore (eg anchor and jump buttons)
    const deleteFromCopy = sourceCopy.querySelectorAll('[data-ignore="true"]');
    for (const element of deleteFromCopy) element.remove();

    // delete certain element attributes
    const attributes = [
      "id",
      "data-collapsed",
      "data-selected",
      "data-highlighted",
      "data-glow",
    ];
    for (const attribute of attributes) {
      sourceCopy.removeAttribute(attribute);
      const elements = sourceCopy.querySelectorAll("[" + attribute + "]");
      for (const element of elements) element.removeAttribute(attribute);
    }

    return sourceCopy;
  }

  // when tooltip is clicked
  function onTooltipClick(event) {
    // when user clicks on tooltip, stop click from transferring
    // outside of tooltip (eg, click off to close tooltip, or eg click
    // off to unhighlight same refs)
    event.stopPropagation();
  }

  // when tooltip is unhovered
  function onTooltipUnhover(event) {
    if (clickClose === "true") return;

    // make sure new mouse/touch/focus no longer over tooltip or any
    // element within it
    const tooltip = document.getElementById("tooltip");
    if (!tooltip) return;
    if (this.contains(event.relatedTarget)) return;

    closeTooltip();
  }

  // make nav bar to go betwen prev/next instances of same reference
  function makeNavBar(link) {
    // find other links to the same source
    const sameLinks = getSameLinks(link);

    // don't show nav bar when singular reference
    if (sameLinks.total <= 1) return;

    // find prev/next links with same target
    const prevLink = getPrevLink(link, sameLinks);
    const nextLink = getNextLink(link, sameLinks);

    // create nav bar
    const navBar = document.createElement("div");
    navBar.id = "tooltip_nav_bar";
    const text = sameLinks.index + 1 + " of " + sameLinks.total;

    // create nav bar prev/next buttons
    const prevButton = document.createElement("button");
    const nextButton = document.createElement("button");
    prevButton.id = "tooltip_prev_button";
    nextButton.id = "tooltip_next_button";
    prevButton.title =
      "Jump to the previous occurence of this item in the document [←]";
    nextButton.title =
      "Jump to the next occurence of this item in the document [→]";
    prevButton.classList.add("icon_button");
    nextButton.classList.add("icon_button");
    prevButton.innerHTML = document.querySelector(".icon_caret_left").innerHTML;
    nextButton.innerHTML = document.querySelector(
      ".icon_caret_right"
    ).innerHTML;
    navBar.appendChild(prevButton);
    navBar.appendChild(document.createTextNode(text));
    navBar.appendChild(nextButton);

    // attach click listeners to buttons
    prevButton.addEventListener("click", function () {
      onPrevNextClick(link, prevLink);
    });
    nextButton.addEventListener("click", function () {
      onPrevNextClick(link, nextLink);
    });

    return navBar;
  }

  // get previous link with same target
  function getPrevLink(link, sameLinks) {
    if (!sameLinks) sameLinks = getSameLinks(link);
    // wrap index to other side if < 1
    let index;
    if (sameLinks.index - 1 >= 0) index = sameLinks.index - 1;
    else index = sameLinks.total - 1;
    return sameLinks.elements[index];
  }

  // get next link with same target
  function getNextLink(link, sameLinks) {
    if (!sameLinks) sameLinks = getSameLinks(link);
    // wrap index to other side if > total
    let index;
    if (sameLinks.index + 1 <= sameLinks.total - 1) index = sameLinks.index + 1;
    else index = 0;
    return sameLinks.elements[index];
  }

  // get element that is target of link or url hash
  function getSource(link) {
    const hash = link ? link.hash : window.location.hash;
    const id = hash.slice(1);
    let target = document.querySelector('[id="' + id + '"]');
    if (!target) return;

    // if ref or figure, modify target to get expected element
    if (id.indexOf("ref-") === 0) target = target.querySelector("p");
    else if (id.indexOf("fig:") === 0) target = target.querySelector("figure");

    return target;
  }

  // when prev/next arrow button is clicked
  function onPrevNextClick(link, prevNextLink) {
    if (link && prevNextLink)
      goToElement(prevNextLink, window.innerHeight * 0.5);
  }

  // scroll to and focus element
  function goToElement(element, offset) {
    // expand accordion section if collapsed
    expandElement(element);
    const y =
      getRectInView(element).top -
      getRectInView(document.documentElement).top -
      (offset || 0);
    // trigger any function listening for "onscroll" event
    window.dispatchEvent(new Event("scroll"));
    window.scrollTo(0, y);
    document.activeElement.blur();
    element.focus();
  }

  // determine position to place tooltip based on link position in
  // viewport and tooltip size
  function positionTooltip(link, left, top) {
    const tooltipElement = document.getElementById("tooltip");
    if (!tooltipElement) return;

    // get convenient vars for position/dimensions of
    // link/tooltip/page/view
    link = getRectInPage(link);
    const tooltip = getRectInPage(tooltipElement);
    const view = getRectInPage();

    // horizontal positioning
    if (left)
      // use explicit value
      left = left;
    else if (link.left + tooltip.width < view.right)
      // fit tooltip to right of link
      left = link.left;
    else if (link.right - tooltip.width > view.left)
      // fit tooltip to left of link
      left = link.right - tooltip.width;
    // center tooltip in view
    else left = (view.right - view.left) / 2 - tooltip.width / 2;

    // vertical positioning
    if (top)
      // use explicit value
      top = top;
    else if (link.top - tooltip.height > view.top)
      // fit tooltip above link
      top = link.top - tooltip.height;
    else if (link.bottom + tooltip.height < view.bottom)
      // fit tooltip below link
      top = link.bottom;
    else {
      // center tooltip in view
      top = view.top + view.height / 2 - tooltip.height / 2;
      // nudge off of link to left/right if possible
      if (link.right + tooltip.width < view.right) left = link.right;
      else if (link.left - tooltip.width > view.left)
        left = link.left - tooltip.width;
    }

    tooltipElement.style.left = left + "px";
    tooltipElement.style.top = top + "px";
  }

  // start script when document is finished loading
  window.addEventListener("load", start);
</script>

<!-- caret left icon -->

<template class="icon_caret_left">
  <!-- modified from: https://fontawesome.com/icons/caret-left -->
  <svg width="16" height="16" viewBox="0 0 192 512">
    <path
      fill="currentColor"
      d="M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z"
    ></path>
  </svg>
</template>

<!-- caret right icon -->

<template class="icon_caret_right">
  <!-- modified from: https://fontawesome.com/icons/caret-right -->
  <svg width="16" height="16" viewBox="0 0 192 512">
    <path
      fill="currentColor"
      d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"
    ></path>
  </svg>
</template>

<style>
  @media only screen {
    /* tooltip container */
    #tooltip {
      position: absolute;
      width: 50%;
      min-width: 240px;
      max-width: 75%;
      z-index: 1;
    }

    /* tooltip content */
    #tooltip_content {
      margin-bottom: 5px;
      padding: 20px;
      border-radius: 5px;
      border: solid 1px #bdbdbd;
      box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
      background: #ffffff;
      overflow-wrap: break-word;
    }

    /* tooltip copy of paragraphs and figures */
    #tooltip_content > p,
    #tooltip_content > figure {
      margin: 0;
      max-height: 320px;
      overflow-y: auto;
    }

    /* tooltip copy of <img> */
    #tooltip_content > figure > img,
    #tooltip_content > figure > svg {
      max-height: 260px;
    }

    /* navigation bar */
    #tooltip_nav_bar {
      margin-top: 10px;
      text-align: center;
    }

    /* navigation bar previous/next buton */
    #tooltip_nav_bar > .icon_button {
      position: relative;
      top: 3px;
    }

    /* navigation bar previous button */
    #tooltip_nav_bar > .icon_button:first-of-type {
      margin-right: 5px;
    }

    /* navigation bar next button */
    #tooltip_nav_bar > .icon_button:last-of-type {
      margin-left: 5px;
    }
  }

  /* always hide tooltip on print */
  @media only print {
    #tooltip {
      display: none;
    }
  }
</style>
<!--
  Analytics Plugin (third-party) 
  
  Copy and paste code from Google Analytics or similar service here.
-->
<!-- 
  Annotations Plugin

  Allows public annotation of the  manuscript. See https://web.hypothes.is/.
-->

<script>
  // configuration
  window.hypothesisConfig = function () {
    return {
      branding: {
        accentColor: "#2196f3",
        appBackgroundColor: "#f8f8f8",
        ctaBackgroundColor: "#f8f8f8",
        ctaTextColor: "#000000",
        selectionFontFamily: "Open Sans, Helvetica, sans serif",
        annotationFontFamily: "Open Sans, Helvetica, sans serif",
      },
    };
  };

  // hypothesis client script
  const embed = "https://hypothes.is/embed.js";
  // hypothesis annotation count query url
  const query = "https://api.hypothes.is/api/search?limit=0&url=";

  // start script
  function start() {
    const button = makeButton();
    document.body.insertBefore(button, document.body.firstChild);
    insertCount(button);
  }

  // make button
  function makeButton() {
    // create button
    const button = document.createElement("button");
    button.id = "hypothesis_button";
    button.innerHTML = document.querySelector(".icon_hypothesis").innerHTML;
    button.title = "Hypothesis annotations";
    button.classList.add("icon_button");

    function onClick(event) {
      onButtonClick(event, button);
    }

    // attach click listeners
    button.addEventListener("click", onClick);

    return button;
  }

  // insert annotations count
  async function insertCount(button) {
    // get annotation count from Hypothesis based on url
    let count = "-";
    try {
      const canonical = document.querySelector('link[rel="canonical"]');
      const location = window.location;
      const url = encodeURIComponent((canonical || location).href);
      const response = await fetch(query + url);
      const json = await response.json();
      count = json.total || "-";
    } catch (error) {
      console.log(error);
    }

    // put count into button
    const counter = document.createElement("span");
    counter.id = "hypothesis_count";
    counter.innerHTML = count;
    button.title = "View " + count + " Hypothesis annotations";
    button.append(counter);
  }

  // when button is clicked
  function onButtonClick(event, button) {
    const script = document.createElement("script");
    script.src = embed;
    document.body.append(script);
    button.remove();
  }

  // start script when document is finished loading
  window.addEventListener("load", start);
</script>

<!-- hypothesis icon -->

<template class="icon_hypothesis">
  <!-- modified from: https://simpleicons.org/icons/hypothesis.svg / https://git.io/Jf1VB -->
  <svg width="16" height="16" viewBox="0 0 24 24" tabindex="-1">
    <path
      fill="currentColor"
      d="M3.43 0C2.5 0 1.72 .768 1.72 1.72V18.86C1.72 19.8 2.5 20.57 3.43 20.57H9.38L12 24L14.62 20.57H20.57C21.5 20.57 22.29 19.8 22.29 18.86V1.72C22.29 .77 21.5 0 20.57 0H3.43M5.14 3.43H7.72V9.43S8.58 7.72 10.28 7.72C12 7.72 13.74 8.57 13.74 11.24V17.14H11.16V12C11.16 10.61 10.28 10.07 9.43 10.29C8.57 10.5 7.72 11.41 7.72 13.29V17.14H5.14V3.43M18 13.72C18.95 13.72 19.72 14.5 19.72 15.42A1.71 1.71 0 0 1 18 17.13A1.71 1.71 0 0 1 16.29 15.42C16.29 14.5 17.05 13.71 18 13.71Z"
      tabindex="-1"
    ></path>
  </svg>
</template>

<style>
  /* hypothesis activation button */
  #hypothesis_button {
    box-sizing: border-box;
    position: fixed;
    top: 0;
    right: 0;
    width: 60px;
    height: 60px;
    background: #ffffff;
    border-radius: 0;
    border-left: solid 1px #bdbdbd;
    border-bottom: solid 1px #bdbdbd;
    box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
    z-index: 2;
  }

  /* hypothesis button svg */
  #hypothesis_button > svg {
    position: relative;
    top: -4px;
  }

  /* hypothesis annotation count */
  #hypothesis_count {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 5px;
  }

  /* side panel */
  .annotator-frame {
    width: 280px !important;
  }

  /* match highlight color to rest of theme */
  .annotator-highlights-always-on .annotator-hl {
    background-color: #ffeb3b !important;
  }

  /* match focused color to rest of theme */
  .annotator-hl.annotator-hl-focused {
    background-color: #ff8a65 !important;
  }

  /* match bucket bar color to rest of theme */
  .annotator-bucket-bar {
    background: #f5f5f5 !important;
  }

  /* always hide button, toolbar, and tooltip on print */
  @media only print {
    #hypothesis_button {
      display: none;
    }

    .annotator-frame {
      display: none !important;
    }

    hypothesis-adder {
      display: none !important;
    }
  }
</style>
<!-- 
  Mathjax Plugin (third-party) 

  Allows the proper rendering of math/equations written in LaTeX.
  See https://www.mathjax.org/.
-->

<script type="text/x-mathjax-config">
  // configuration
  MathJax.Hub.Config({
    "CommonHTML": { linebreaks: { automatic: true } },
    "HTML-CSS": { linebreaks: { automatic: true } },
    "SVG": { linebreaks: { automatic: true } },
    "fast-preview": { disabled: true }
  });
</script>

<script
  src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"
  integrity="sha512-0doc9hKxR3PYwso42RD1p5ySZpzzuDiOwMrdCEh2WdJZCjcmFKc/wEnL+z8fBQrnHoiNWbo+3fiGkOYXBdQp4A=="
  crossorigin="anonymous"
></script>

<style>
  /* mathjax containers */
  .math.display > span:not(.MathJax_Preview) {
    /* turn inline element (no dimensions) into block (allows fixed width and thus scrolling) */
    display: flex !important;
    overflow-x: auto !important;
    overflow-y: hidden !important;
    justify-content: center;
    align-items: center;
    margin: 0 !important;
  }

  /* right click menu */
  .MathJax_Menu {
    border-radius: 5px !important;
    border: solid 1px #bdbdbd !important;
    box-shadow: none !important;
  }

  /* equation auto-number */
  span[id^="eq:"] > span.math.display + span {
    font-weight: 600;
  }

  /* equation */
  span[id^="eq:"] > span.math.display > span {
    /* nudge to make room for equation auto-number and anchor */
    margin-right: 60px !important;
  }
</style>
</body>
</html>