Skip to content

Commit de7cd68

Browse files
authored
Merge pull request #129 from elixir-europe/improve-docs
Improve docs
2 parents 2199aeb + affd3ae commit de7cd68

File tree

15 files changed

+284
-144
lines changed

15 files changed

+284
-144
lines changed

README.md

Lines changed: 23 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,54 @@
11
# MARS: Multi-omics Adapter for Repository Submissions
22

3-
## Introduction
3+
**MARS** is a framework for submitting multi-omics life-science studies to multiple target repositories using the **ISA-JSON** metadata standard.
44

5-
MARS is a data brokering initiative designed to facilitate the submission of multi-omics life sciences studies to [multiple specialized repositories](#isa-json-support-by-repositories). Built as a modular system, MARS enables seamless data exchange between data producers and repositories using the standardized ISA-JSON format.
5+
Full documentation and concepts are hosted on the MARS website: https://elixir-europe.github.io/MARS/
66

7-
Unlike centralized platforms, MARS functions as a common framework for decentralized data submissions while ensuring consistent interpretation and validation of ISA-JSON metadata across various repositories. This approach preserves important links between multi-omics datasets derived from the same biological source, ensuring mutual understanding and accurate data interpretation.
87

9-
## Stakeholders
8+
## Key components
109

11-
MARS is comprised of multiple stakeholders: the end-user, the platform that generates the ISA-JSON, target repositories and the data broker. Each represents key roles in the data submission process. Read more about it in our [stakeholders page](/stakeholders.md).
10+
![Overview](/docs/src/assets/MARS_overview.svg)
1211

1312

14-
## Components
13+
### ISA-JSON in MARS
1514

16-
![MARS overview](/MARS_overview.svg)
15+
- How MARS uses ISA-JSON for multi-omics metadata exchange: https://elixir-europe.github.io/MARS/#isa-json-as-metadata-carrier
16+
- Human readable presentation of the MARS ISA-JSON schema: https://elixir-europe.github.io/MARS/mars-isa-json
1717

18+
### Stakeholders
1819

19-
### ISA-JSON as metadata carrier
20+
- End-users, ISA-JSON–producing platforms, data brokers, and repositories: https://elixir-europe.github.io/MARS/stakeholders
2021

21-
We use [ISA-JSON](https://isatools.readthedocs.io/en/latest/isamodel.html) to store and interchange metadata between the end-user and the target repositories because:
22+
### Repository API (Adapters)
2223

23-
- **Standardization**: ISA-JSON follows the ISA structure (Investigation- Study - Assay), ensuring structured metadata descriptions.
24-
- **Versatile**: It is not bound to any domain and can represent multi-omics experimental metadata.
25-
- **Interoperability**: Since ISA-JSON follows a standard format, it facilitates interoperability between different software tools and platforms that support the ISA standard.
26-
- **Community Adoption**: Widely adopted within the life sciences research community for metadata standardization.
24+
- Standard for programmatic ISA-JSON ingestion and receipt generation: https://elixir-europe.github.io/MARS/repository-services/repository-api
25+
- Java utilities—including the standard receipt model—for developers building MARS-compatible repository adapters: https://github.com/elixir-europe/mars-repository-lib
2726

28-
ISA-JSON is generated by [ISA-JSON producing platforms](/stakeholders.md#isa-json-producing-platforms) and serves as the metadata input for the Data Broker platform, as outlined below.
27+
### MARS-cli
2928

30-
### Data broker platform
29+
- Python command-line tool and library for multi omics ISA-JSON submissionsubmissions to multiple repositories: https://github.com/elixir-europe/mars-cli
3130

32-
A platform operated by the [Data broker](/stakeholders.md#data-broker) should:
3331

34-
- Accept ISA-JSON as input and submit it to target repositories without any loss of information.
35-
- Extend the ISA-JSON with additional information from the repositories, such as accession numbers assigned to submitted objects.
36-
- Handle error reporting efficiently.
37-
- Maintain an active submission process throughout its duration (up to multiple days), including waiting for repository-side validation steps to complete.
38-
- Enable secure credential management.
39-
- Support data transfer via various protocols (e.g., FTP), ensuring checksum verification for data integrity.
40-
- Allow the Data broker to set up a brokering account or enable end-users to create personal accounts.
32+
## Repository Structure
4133

42-
Examples of Data broker platforms include ARC, Galaxy, and others.
4334

44-
45-
### MARS-CLI
46-
47-
MARS-CLI is a command-line tool (CLI) used by the Data Broker platform to handle the submission of ISA-JSON metadata to multiple repositories. It automates the submission process, updates ISA-JSON with accession numbers based on repository responses, and ensures smooth data integration.
48-
49-
Built as a Python library, MARS-CLI can be integrated into web applications, ARC, Galaxy, and other platforms. The source code and documentation are available in the [mars-cli repository](https://github.com/elixir-europe/mars-cli.git).
50-
51-
### ISA-JSON support by repositories
52-
53-
ISA-JSON API services, also known as adapters, are being developed and deployed by the repositories that are part of the MARS initiative. This includes programmatic submission, the ingestion of ISA-JSON in order to register the metadata objects and the creation of a receipt according to the MARS [repository-api](/repository-services/repository-api.md) standard.
54-
55-
Track the status of each repository here:
56-
57-
| Repository | Programmatic submission | Development status | Deployed | Source code |
58-
|---|---|---|---|---|
59-
| [BioSamples](https://www.ebi.ac.uk/biosamples/) | yes | PoC being improved | no | [GitHub](repository-services/isajson-biosamples) |
60-
| [ENA](https://www.ebi.ac.uk/ena/browser/) | yes | PoC being improved | no | [GitHub](repository-services/isajson-ena) |
61-
| [MetaboLights](https://www.ebi.ac.uk/metabolights/) | yes | Proof of concept | no | |
62-
| [BioStudies/ArrayExpress](https://www.ebi.ac.uk/biostudies/arrayexpress) | yes, in dev | Not started | no | |
63-
| [e!DAL-PGP](https://edal-pgp.ipk-gatersleben.de/) | NA | Not started | no | |
64-
| Your repository here? Join MARS! | | | | |
65-
66-
## File structure in this repo
67-
68-
```
35+
```text
36+
├── docs/
37+
│ └── ...
6938
├── repository-services
7039
│ ├── isajson-biosamples/
71-
│ │── isajson-ena/
72-
│ ├── repository-api.md
40+
│ ├── isajson-ena/
7341
│ └── README.md
42+
├── schemas
7443
│ └── ...
7544
├── test-data
7645
│ └── ...
7746
└── README.md
7847
```
7948

49+
- **docs**: Astro project powering the public MARS documentation site.
8050
- **repository-services**: Code to deploy repository API endpoints that can accept ISAJSON. See [README](/repository-services/README.md) for deployment instructions.
81-
- **repository-api.md**: Describing the receipt standard for repository APIs to follow.
51+
- **schemas**: JSON schema representation of the pydantic models used for syntactic validation of the ISA-JSON
8252
- **test-data**: Test data to be used in a submission.
83-
- **README.md**: This file
84-
85-
## Acknowledgements
53+
- **README.md**: This file.
8654

87-
This project was initiated during the ELIXIR Europe BioHackathon 2022 and has since received continued support through subsequent ELIXIR Hackathons and the ELIXIR Data Platform WP2.

docs/astro.config.mjs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
// @ts-check
22
import { defineConfig } from 'astro/config';
3-
43
import tailwindcss from '@tailwindcss/vite';
54

65
// https://astro.build/config
76
export default defineConfig({
8-
base: '/MARS',
9-
trailingSlash: 'never',
7+
base: '/MARS/',
108
vite: {
119
plugins: [tailwindcss()]
1210
}

docs/package-lock.json

Lines changed: 37 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"astro": "astro"
1010
},
1111
"dependencies": {
12+
"@tailwindcss/typography": "^0.5.19",
1213
"@tailwindcss/vite": "^4.1.14",
1314
"astro": "^5.15.4",
1415
"tailwindcss": "^4.1.14"

docs/src/components/Home.astro

Lines changed: 0 additions & 7 deletions
This file was deleted.

docs/src/components/NavBar.astro

Lines changed: 61 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,81 @@
11
---
22
import astroConfig from "../../astro.config.mjs";
3-
import { Image } from 'astro:assets';
4-
import logo from '../assets/logo-small.png';
3+
import { Image } from "astro:assets";
4+
import logo from "../assets/logo-small.png";
5+
56
const homeUrl = `${astroConfig.base}`;
6-
const isaJsonSpecsUrl = `${astroConfig.base}/mars-isa-json`;
7+
const isaJsonSpecsUrl = `${astroConfig.base}mars-isa-json`;
8+
const stakeholdersUrl = `${astroConfig.base}stakeholders`;
9+
const repositoryApiUrl = `${astroConfig.base}repository-services/repository-api`;
710
---
811

912
<nav class="relative dark:bg-gray-800 dark:border-gray-600 after:pointer-events-none after:absolute after:inset-x-0 after:bottom-0 after:h-px after:bg-white/10">
10-
<div class="mx-auto max-w-7xl px-2 sm:px-6 lg:px-8">
13+
<div class="mx-auto max-w-5xl px-2 sm:px-6 lg:px-8">
1114
<div class="relative flex h-16 items-center justify-between">
12-
<div class="flex flex-1 items-center justify-center sm:items-stretch sm:justify-start">
15+
{/* Logo + desktop links */}
16+
<div class="flex flex-1 items-center sm:items-stretch sm:justify-start">
1317
<div class="flex shrink-0 items-center">
14-
<Image src={logo} alt="Small MARS logo" style="width: 64px;">
18+
<Image src={logo} alt="Small MARS logo" style="width: 64px;" />
1519
</div>
20+
21+
{/* Desktop nav */}
1622
<div class="hidden sm:ml-6 sm:block">
1723
<div class="flex space-x-4">
18-
<a href={homeUrl} aria-current="page" class="rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-white/5 hover:text-white">Home</a>
19-
<a href={isaJsonSpecsUrl} class="rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-white/5 hover:text-white">MARS ISA-JSON model</a>
24+
<a href={homeUrl} class="rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-white/5 hover:text-white">Home</a>
25+
<a href={isaJsonSpecsUrl} class="rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-white/5 hover:text-white">ISA-JSON model</a>
26+
<a href={stakeholdersUrl} class="rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-white/5 hover:text-white">Stakeholders</a>
27+
<a href={repositoryApiUrl} class="rounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-white/5 hover:text-white">Repository API</a>
2028
</div>
2129
</div>
2230
</div>
31+
32+
{/* Mobile menu button */}
33+
<div class="flex sm:hidden">
34+
<button
35+
type="button"
36+
class="inline-flex items-center justify-center rounded-md p-2 text-gray-300 hover:bg-white/5 hover:text-white focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white"
37+
aria-controls="mobile-menu"
38+
aria-expanded="false"
39+
data-mobile-menu-toggle
40+
>
41+
<span class="sr-only">Open main menu</span>
42+
<!-- Simple hamburger icon -->
43+
<svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none"
44+
viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
45+
aria-hidden="true">
46+
<path stroke-linecap="round" stroke-linejoin="round"
47+
d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" />
48+
</svg>
49+
</button>
50+
</div>
2351
</div>
2452
</div>
2553

26-
<el-disclosure id="mobile-menu" hidden class="block sm:hidden">
54+
{/* Mobile menu */}
55+
<div
56+
id="mobile-menu"
57+
class="sm:hidden hidden"
58+
data-mobile-menu
59+
>
2760
<div class="space-y-1 px-2 pt-2 pb-3">
28-
<a href={homeUrl} aria-current="page" class="rounded-md bg-gray-950/50 px-3 py-2 text-sm font-medium text-white">Home</a>
29-
<a href={isaJsonSpecsUrl} class="block rounded-md px-3 py-2 text-base font-medium text-gray-300 hover:bg-white/5 hover:text-white">MARS ISA-JSON model</a>
61+
<a href={homeUrl} class="block rounded-md px-3 py-2 text-base font-medium text-gray-300 hover:bg-white/5 hover:text-white">Home</a>
62+
<a href={isaJsonSpecsUrl} class="block rounded-md px-3 py-2 text-base font-medium text-gray-300 hover:bg-white/5 hover:text-white">ISA-JSON model</a>
63+
<a href={stakeholdersUrl} class="block rounded-md px-3 py-2 text-base font-medium text-gray-300 hover:bg-white/5 hover:text-white">Stakeholders</a>
64+
<a href={repositoryApiUrl} class="block rounded-md px-3 py-2 text-base font-medium text-gray-300 hover:bg-white/5 hover:text-white">Repository API</a>
3065
</div>
31-
</el-disclosure>
66+
</div>
3267
</nav>
68+
69+
<script>
70+
document.addEventListener("DOMContentLoaded", () => {
71+
const toggle = document.querySelector("[data-mobile-menu-toggle]");
72+
const menu = document.querySelector("[data-mobile-menu]");
73+
74+
if (!toggle || !menu) return;
75+
76+
toggle.addEventListener("click", () => {
77+
const isHidden = menu.classList.toggle("hidden"); // true if now hidden
78+
toggle.setAttribute("aria-expanded", String(!isHidden));
79+
});
80+
});
81+
</script>
Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,32 @@
11
---
22
import SchemaProperty from './SchemaProperty.astro';
3+
34
const { title, schema } = Astro.props;
4-
const schemaProperties = Object.entries(schema.properties ?? {})
5+
const schemaProperties = Object.entries(schema.properties ?? {});
56
---
6-
<>
7-
<div class="relative overflow-x-auto my-6">
8-
<h3 class="text-3xl font-extrabold leading-none tracking-tight text-white sm:text-5xl">{title}</h3>
97

10-
<table class="w-full text-sm text-left rtl:text-right bg-gray-50 dark:bg-gray-700 dark:text-gray-400 mt-4">
11-
<thead>
12-
<tr>
13-
<th scope="col" class="px-6 py-3 text-center font-extrabold">Field</th>
14-
<th scope="col" class="px-6 py-3 text-center font-extrabold">Type</th>
15-
<th scope="col" class="px-6 py-3 text-center font-extrabold">Description</th>
16-
<th scope="col" class="px-6 py-3 text-center font-extrabold">Required</th>
17-
<th scope="col" class="px-6 py-3 text-center font-extrabold">Default value</th>
18-
</tr>
19-
</thead>
20-
<tbody>
21-
{
22-
schemaProperties.map(([name, property]) => {
23-
return (<SchemaProperty name={name} property={property} />);
24-
})
25-
}
26-
</tbody>
27-
</table>
28-
</div>
29-
</>
8+
9+
<section class="my-8">
10+
<h3>{title}</h3>
11+
12+
<div class="relative mt-4 max-w-full overflow-x-auto not-prose rounded-lg border border-gray-200 dark:border-gray-600">
13+
<table class="min-w-[640px] w-full text-xs sm:text-sm text-left rtl:text-right bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
14+
<thead>
15+
<tr>
16+
<th scope="col" class="px-3 py-2 sm:px-6 sm:py-3 text-center font-extrabold">Field</th>
17+
<th scope="col" class="px-3 py-2 sm:px-6 sm:py-3 text-center font-extrabold">Type</th>
18+
<th scope="col" class="px-3 py-2 sm:px-6 sm:py-3 text-center font-extrabold">Description</th>
19+
<th scope="col" class="px-3 py-2 sm:px-6 sm:py-3 text-center font-extrabold">Required</th>
20+
<th scope="col" class="px-3 py-2 sm:px-6 sm:py-3 text-center font-extrabold">Default value</th>
21+
</tr>
22+
</thead>
23+
<tbody>
24+
{
25+
schemaProperties.map(([name, property]) => (
26+
<SchemaProperty name={name} property={property} />
27+
))
28+
}
29+
</tbody>
30+
</table>
31+
</div>
32+
</section>

0 commit comments

Comments
 (0)