diff --git a/client/src/components/home/HomeFeatures.vue b/client/src/components/home/HomeFeatures.vue index ac430b96..d065f430 100644 --- a/client/src/components/home/HomeFeatures.vue +++ b/client/src/components/home/HomeFeatures.vue @@ -14,7 +14,15 @@
Data format
- Support and promote the bedRMod format. This format is similar to the + Support and promote the + bedRMod + format. This format is similar to the ENCODE bedMethyl - format (BED9+2), but includes a header. + format (BED9+2).
@@ -31,8 +39,8 @@
Database
- Starting with m6A and Ψ, we continuously add new data encompassing a wide range of - modifications, RNA types (mRNA, tRNA, rRNA), technologies, and species. + Starting with m6A, m5C, and Ψ (whole-transcriptome), we continuously add new data + encompassing a wide range of modifications, RNA types, technologies, and species.
@@ -41,7 +49,7 @@
Tools
- Search and compare modifications across dataset. More tools coming: genome browser, + Search and compare modifications across datasets. More tools coming: genome browser, visualization.
@@ -51,7 +59,8 @@
Access
- Login with data upload, access management, sharing, and more.
diff --git a/client/src/components/home/HomeViews.vue b/client/src/components/home/HomeViews.vue index 92eabe8b..e8a68ebf 100644 --- a/client/src/components/home/HomeViews.vue +++ b/client/src/components/home/HomeViews.vue @@ -17,7 +17,7 @@ import CardLink from '@/components/ui/CardLink.vue'
- +
diff --git a/client/src/views/DocumentationView.vue b/client/src/views/DocumentationView.vue index d39240e4..db7a1b07 100644 --- a/client/src/views/DocumentationView.vue +++ b/client/src/views/DocumentationView.vue @@ -15,14 +15,13 @@ import SubTitle from '@/components/ui/SubTitle.vue' Introduction

- Sci-ModoM is under active development. Consult our roadmap for 2024 - - - -

@@ -99,11 +103,12 @@ import SubTitle from '@/components/ui/SubTitle.vue' Search

- To query the database for RNA modifications, first select a modification and species, then - available technologies. Sci-ModoM contains a large amount of records; selecting a - particular gene or genomic region can significantly reduce the query time. The search can - also be narrowed down by selecting a biotype or a genomic feature. Selected records can be - exported to CSV. To download all records for a given dataset, use + Search modifications site-wise across whole transcriptomes. To query the database, first + select a modification and species, then available technologies. Some dataset may contain a + large amount of records; selecting a particular gene of interest or a genomic region can + significantly reduce the query time. The search can also be narrowed down by selecting a + biotype or a genomic feature. Selected records can be exported to CSV. To download all + records for a given dataset, use Browse.

@@ -115,22 +120,31 @@ import SubTitle from '@/components/ui/SubTitle.vue' Browse

- Query the database to find projects, studies and/or dataset. You can refine your search - using global filters (top left of table), or table filters (RNA type and modification, - organism, cell, tissue and/or organ, or technology). Click the + Query the database to find projects and/or datasets. You can refine your search using + global filters (top left of table), or table filters (RNA type and modification, organism, + cell, tissue and/or organ, or technology). Click the button to see project-related information and - additional attachments. A dataset can be downloaded as a bedRMod file. Records can be - exported to CSV. + additional attachments. A dataset can be downloaded as a + bedRMod + file. The list of datasets and their metadata can be exported to CSV.

Compare

- Compare dataset by finding modification sites common to multiple dataset (intersection) or - those only found in a group of dataset (difference). You can also find modification sites - in a given dataset that are close to, but not intersecting with sites in other dataset - (closest). You can perform these operations using available dataset, but you can also - compare dataset with your own data. + Compare datasets site-wise, including your own, without registration or login. You can + compare datasets to one another by finding modification sites common to multiple datasets + (intersection) or those only found in a group of datasets (difference). You can also find + modification sites in a given dataset that are close to, but not intersecting with sites + in other datasets (closest). You can perform these operations strand-aware or unaware. You + can use available datasets, or upload your own data to compare it against database + records. You data is securely handled and is automatically deleted afterwards.

1. First select a given organism, then select up to 3 @@ -162,7 +176,7 @@ import SubTitle from '@/components/ui/SubTitle.vue' Sci-ModoM is freely available, and does not require login or registration. Interested users can however register to propose new projects, and eventually upload - dataset and attachments that are made publicly available to all users. + datasets and attachments that are made publicly available to all users.

Project template @@ -205,6 +219,17 @@ import SubTitle from '@/components/ui/SubTitle.vue' Use the Attach BAM files form to upload attachments. Attaching BAM files to a given dataset allow users to access read-level information.

+

+ bedRMod + uses a 0-based, half-open coordinate system. If you use a 1-based index, all your + modification sites will be off-by-one! +

Dataset upload errors

diff --git a/server/docs/source/bedrmod.rst b/server/docs/source/bedrmod.rst index bd1f9a97..67599d7e 100644 --- a/server/docs/source/bedrmod.rst +++ b/server/docs/source/bedrmod.rst @@ -98,6 +98,11 @@ The data section The first nine columns generally follow the standard `BED specification `_, but the name (4th column) must conform to the `MODOMICS `_ nomenclature for the modification short name, and the score (5th column) is a site-specific measure of confidence. The last two columns contain the coverage (10th column), or number of reads at this position, and the frequency (11th column), or the integer value capped at 100 representing the precentage of reads that are modified at this position. These columns must be separated by tabs and each row must have the same number of columns. + +.. attention:: + + bedRMod is essentially a BED-formatted file, it uses a 0-based, half-open coordinate system. If you use a 1-based index, all your modification sites will be *off-by-one*! + .. attention:: For data upload to Sci-ModoM, chromosomes (1st column) must be formatted following the Ensembl short format *e.g.* 1 and not chr1, or MT and not chrM. diff --git a/server/tests/unit/api/test_dataset_api.py b/server/tests/unit/api/test_dataset_api.py index df5ca28f..f34f2d0f 100644 --- a/server/tests/unit/api/test_dataset_api.py +++ b/server/tests/unit/api/test_dataset_api.py @@ -214,7 +214,7 @@ def comparison_services(mocker): @pytest.mark.parametrize( - "reference,comparison,upload,is_euf,strand", + "reference,comparison,upload,euf,strand", [ (["datasetidAxx"], ["datasetidBxx"], None, None, True), (["datasetidAxx", "datasetidBxx"], ["datasetidCxx"], None, None, True), @@ -224,11 +224,11 @@ def comparison_services(mocker): ], ) def test_intersect( - test_client, comparison_services, reference, comparison, upload, is_euf, strand + test_client, comparison_services, reference, comparison, upload, euf, strand ): result = test_client.get( get_compare_url_parameters( - "intersect", reference, comparison, upload, is_euf, strand + "intersect", reference, comparison, upload, euf, strand ) ) assert result.status == "200 OK" @@ -236,10 +236,10 @@ def test_intersect( IntersectResponse.model_validate_json(result.text).records == MockBedtoolsService.INTERSECT_RESULT ) - check_comparison_mocks("intersect", reference, comparison, upload, is_euf, strand) + check_comparison_mocks("intersect", reference, comparison, upload, euf, strand) -def check_comparison_mocks(operation, reference, comparison, upload, is_euf, strand): +def check_comparison_mocks(operation, reference, comparison, upload, euf, strand): assert MockBedtoolsService.last_operation == operation assert MockBedtoolsService.last_is_strand == strand assert MockBedtoolsService.last_a_dataset == get_a_datasets_as_comparison_records( @@ -251,7 +251,7 @@ def check_comparison_mocks(operation, reference, comparison, upload, is_euf, str == get_b_dataset_list_as_comparison_records(*comparison) ) if upload is not None: - if is_euf: + if euf: assert MockBedtoolsService.last_b_dataset_list == [ MockEufImporter.RESULT_AS_COMPARISON ] @@ -262,7 +262,7 @@ def check_comparison_mocks(operation, reference, comparison, upload, is_euf, str def get_compare_url_parameters( - operation, reference, comparison=None, upload=None, is_euf=False, strand=True + operation, reference, comparison=None, upload=None, euf=False, strand=True ): parameters = [] for r in reference: @@ -276,8 +276,8 @@ def get_compare_url_parameters( parameters.append("strand=false") if upload is not None: parameters.append(f"upload={upload}") - if is_euf: - parameters.append("is_euf=true") + if euf: + parameters.append("euf=true") return f"/{operation}?" + "&".join(parameters) @@ -300,7 +300,7 @@ def get_b_dataset_list_as_comparison_records(*dataset_ids): @pytest.mark.parametrize( - "reference,comparison,upload,is_euf,strand", + "reference,comparison,upload,euf,strand", [ (["datasetidAxx"], ["datasetidBxx"], None, None, True), (["datasetidAxx", "datasetidBxx"], ["datasetidCxx"], None, None, True), @@ -310,11 +310,11 @@ def get_b_dataset_list_as_comparison_records(*dataset_ids): ], ) def test_closest( - test_client, comparison_services, reference, comparison, upload, is_euf, strand + test_client, comparison_services, reference, comparison, upload, euf, strand ): result = test_client.get( get_compare_url_parameters( - "closest", reference, comparison, upload, is_euf, strand + "closest", reference, comparison, upload, euf, strand ) ) assert result.status == "200 OK" @@ -322,11 +322,11 @@ def test_closest( ClosestResponse.model_validate_json(result.text).records == MockBedtoolsService.CLOSEST_RESULT ) - check_comparison_mocks("closest", reference, comparison, upload, is_euf, strand) + check_comparison_mocks("closest", reference, comparison, upload, euf, strand) @pytest.mark.parametrize( - "reference,comparison,upload,is_euf,strand", + "reference,comparison,upload,euf,strand", [ (["datasetidAxx"], ["datasetidBxx"], None, None, True), (["datasetidAxx", "datasetidBxx"], ["datasetidCxx"], None, None, True), @@ -336,11 +336,11 @@ def test_closest( ], ) def test_subtract( - test_client, comparison_services, reference, comparison, upload, is_euf, strand + test_client, comparison_services, reference, comparison, upload, euf, strand ): result = test_client.get( get_compare_url_parameters( - "subtract", reference, comparison, upload, is_euf, strand + "subtract", reference, comparison, upload, euf, strand ) ) assert result.status == "200 OK" @@ -348,7 +348,7 @@ def test_subtract( SubtractResponse.model_validate_json(result.text).records == MockBedtoolsService.SUBTRACT_RESULT ) - check_comparison_mocks("subtract", reference, comparison, upload, is_euf, strand) + check_comparison_mocks("subtract", reference, comparison, upload, euf, strand) @pytest.mark.parametrize(