diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/404.html b/404.html new file mode 100644 index 000000000..3d7d7d958 --- /dev/null +++ b/404.html @@ -0,0 +1,758 @@ + + + +
+ + + + + + + + + + + + + +NB: Even though the instructions state that this workflow is to be avoided, the other solutions in the current documentation are out of date.
+To refresh the imports, open Docker so it is running in the background. Then open Terminal, navigate to src/ontology directory in the cell-ontology repository and run:
+sh run.sh make imports/merged_import.owl
Running the above command requires > 8GB RAM and sufficient computational power. If the refresh fails to complete due to hardware limitations, create a new issue in GitHub detailing which class(es) need to be imported and another editor can add it on your behalf.
+Once the imports are refreshed, return to Protégé, add the logical axioms that include the newly imported class(es) and create a pull request per standard procedure.
+Note that the import refresh process seems to be quite laborious/computationally expensive as-is, and a centralised database approach may be an improved longterm solution.
+ + + + + + +An upper slim is a set of terms for summarising annotations. CL has both a general slim and domain-specific slims allowing for the generation of general summaries or for domain specific ones. All slims have a context that covers all cells in the domain of interest. In order to fullfil the summarising use-case, a slim should have good % coverage of the domain and, if possible, avoid excluding major cell types. The following are potentially a problem for the grouping use-case:
+Potential clashing concerns: It seems reasonable to want to make sure that very important cell types are covered and are not obscured in generating summaries, but this desire can clash with the considerations above. Some judgement is needed to balance these concerns.
+There is no perfect solution, but some solutions are better (at fulfilling the use case) than others.
+It is important that the name of the slim accurately reflects the content it covers. Specifically, if the intention is to cover all cell types that are specific for an organ, the slim's name should be in the format of "organ_upper_slim". This ensures clarity and helps users understand the scope of the slim.
+Furthermore, the description of the slim should follow a consistent pattern. It is recommended to use the following structure: "a subset of general classes related to specific cell types in the [organ or specific context]". This format provides a concise and informative description of the slim, helping users identify its purpose and content.
+src/templates
):ID | +subset | +label | +
---|---|---|
ID | +AI oboInOwl:inSubset | ++ |
CL:####### | +http://purl.obolibrary.org/obo/cl#XXX_upper_slim | +CL term | +
... | +http://purl.obolibrary.org/obo/cl#XXX_upper_slim | +... | +
Save the CSV file with the name 'XXX_upper_slim.csv' in the src/templates
directory.
Modify src/ontology/cl-odk.yaml
introducing new lines for the new slim (change "XXX" to the subset label):
- id: XXX_upper_slim
- filename: XXX_upper_slim.owl
+ use_template: True
+ templates:
+ - XXX_upper_slim.csv
![image](https://github.com/obophenotype/cell-ontology/assets/94959119/254ad25f-7bf2-4ac2-afe2-9ad067d9c1ea)
+
+src/ontology
file in the terminal. Make sure Docker is running.sh run.sh make update_repo
src/ontology/catalog-v001.xml
file.<uri name="http://purl.obolibrary.org/obo/cl/components/XXX_upper_slim.owl" uri="components/XXX_upper_slim.owl"/>`
+ -
src/ontology/cl-edit.owl
.Add the following import statement (change "XXX" to the subset label):
+Import(<http://purl.obolibrary.org/obo/cl/components/XXX_upper_slim.owl>)
+
Run the command:
+sh run.sh make all_subsets -B
+ - Alternatively, run the following command to run it anyway even if it says it is up to date (change "XXX" to the subset label):
sh run.sh make components/XXX_upper_slim.owl -B
src/ontology/cl.Makefile
.Add the subset label to SLIM_TEMPLATES (without _upper_slim!!!).
+ +Add the term that will be used to test coverage
+ +Add:
+$(REPORTDIR)/XXX_upper_slim.csv: $(TEMPLATEDIR)/XXX_upper_slim.csv
+ $(eval TERM_ID := $(YYY))
+ $(COVERAGECMD)
+ (substitute "XXX" to the subset label and YYY for the tested label)
![image](https://github.com/obophenotype/cell-ontology/assets/94959119/7eb18255-0ef7-4fbc-9f7f-e582372165bf)
+
+src/ontology
.Run the command:
+sh run.sh make slim_coverage
The reports can be accessed at src/ontology/reports/XXX_upper_slim.csv
. First, the coverage percentage is displayed, indicating the proportion of cells covered. Secondly, the number of cells covered by each term of the subset is provided. Finally, a list is presented, indicating all the terms that were expected to be covered but are not currently included.
Ideally, terms would have more than 1 cell covered. Furthermore, a term covering hundreds of cells might indicate that it is too general, and a more specific term (or multiple) should be evaluated, specially if it overlaps with other terms of the subset. Example: For the eye_upper_slim, 'retinal cell' is a (too) general term that overlaps other grouping terms such as 'retinal bipolar neuron', 'retina horizontal cell' or 'amacrine cell'.
+In the case that there is overlapping of terms (term A in the subset covers term B of the subset), a coverage file will be created and it can be accessed at src/ontology/reports/overlapping_terms_XXX_upper_slim.csv
.
^^xsd:string
Diffs¶When you make edits, sometimes there will be large amounts of unintended differences that show up that involves the removal of ^^xsd:string
. If so, you can resolve them by following normalising your cl-edit.owl file.
Update your file from Master (see 'How to resolve merge conflicts' for instructions on how to do this including how to resolve clashes while doing this).
+in the terminal, set directory to the ontology folder in CL: cd .../GitHub/cell-ontology/src/ontology
Run the normaliser in terminal:
+If you have docker installed: sh run.sh make normalise_xsd_string
If you do not have docker installed: make normalise_xsd_string
If make is not installed, on MAC:
+sed -i '' -E "s/Annotation[(](oboInOwl[:]hasDbXref [\"][^\"]*[\"])[)]/Annotation(\1^^xsd:string)/g" cl-edit.owl
+
+This should resolve your ^^xsd:string
issue, after which, you can handle your pull request as per usual.
Cell ontology identifiers (IRIs) are never lost, but they are occasionally deprecated. On the rare occasions that this happens, all logical links to other ontology terms (e.g. recording classification or partonomy) are removed and term is tagged with the annotation owl:deprecated True
. To aid migration of annotations to the latest standard, these terms are also annotated with either a term_replaced_by
or a consider
tag. A term_replaced_by
annotation is used to record the ID of a term it is safe to auto-migrate annotations to. More rarely, consider
is used to record multiple potential replacement terms requiring human consideration to map. In these cases, a comment will be present to provide guidance for mapping.
The Ontology Lookup Service API provides a convenient way to check for deprecated terms & find replacements.
+The term http://purl.obolibrary.org/obo/CL_0000375 has been deprecated and has that tag term_replaced_by
+Querying the OLS API for this:
+https://www.ebi.ac.uk/ols/api/ontologies/cl/terms/http%253A%252F%252Fpurl.obolibrary.org%252Fobo%252FCL_0000375. (Note the query IRI must be double encoded)
+Returns:
+{
+ "iri" : "http://purl.obolibrary.org/obo/CL_0000375",
+ "label" : "obsolete osteoprogenitor cell",
+ "description" : null,
+ "annotation" : {
+ "database_cross_reference" : [ "BTO:0002051" ],
+ "has_obo_namespace" : [ "cell" ],
+ "term replaced by" : [ "CL:0007010" ]
+ },
+ "synonyms" : null,
+ "ontology_name" : "cl",
+ "ontology_prefix" : "CL",
+ "ontology_iri" : "http://purl.obolibrary.org/obo/cl.owl",
+ "is_obsolete" : true,
+ "term_replaced_by" : "CL:0007010",
+ "is_defining_ontology" : true,
+ "has_children" : false,
+ "is_root" : true,
+ "short_form" : "CL_0000375",
+ "obo_id" : "CL:0000375",
+ "in_subset" : null,
+ "obo_definition_citation" : null,
+ "obo_xref" : [{"database":"BTO","id":"0002051","description":null,"url":"http://purl.obolibrary.org/obo/BTO_0002051"}],
+ "obo_synonym" : null,
+ "is_preferred_root" : false,
+ "_links" : {
+ "self" : {
+ "href" : "https://www.ebi.ac.uk/ols/api/ontologies/cl/terms/http%253A%252F%252Fpurl.obolibrary.org%252Fobo%252FCL_0000375"
+ },
+ "graph" : {
+ "href" : "https://www.ebi.ac.uk/ols/api/ontologies/cl/terms/http%253A%252F%252Fpurl.obolibrary.org%252Fobo%252FCL_0000375/graph"
+ }
+ }
+}
+
+The term_replaced_by key points to the ID of a safe replacement term: CL:0007010. This is a CURIE for http://purl.obolibrary.org/obo/CL_0007010 *
+consider
+The term http://purl.obolibrary.org/obo/CL_0000144 has been deprecated and has a consider tag pointing to multiple possible replacement terms, along with a comment for guidance.
+Querying the OLS API for this: https://www.ebi.ac.uk/ols/api/ontologies/cl/terms/http%253A%252F%252Fpurl.obolibrary.org%252Fobo%252FCL_0000144
+Returns
+{
+ "iri" : "http://purl.obolibrary.org/obo/CL_0000144",
+ "label" : "obsolete cell by function",
+ "description" : [ "OBSOLETE: A classification of cells by their primary end goal or behavior." ],
+ "annotation" : {
+ "comment" : [ "This term was made obsolete because there is no difference in meaning between it and 'cell', as any cell can be classified by its function or behavior. If you have used this term in annotation, please replace it with cell (CL:0000000), native cell (CL:0000003), or cell in vitro (CL:0001034) as appropriate." ],
+ "consider" : [ "CL:0001034", "CL:0000000", "CL:0000003" ],
+ "has_obo_namespace" : [ "cell" ]
+ },
+ "synonyms" : null,
+ "ontology_name" : "cl",
+ "ontology_prefix" : "CL",
+ "ontology_iri" : "http://purl.obolibrary.org/obo/cl.owl",
+ "is_obsolete" : true,
+ "term_replaced_by" : null,
+ "is_defining_ontology" : true,
+ "has_children" : false,
+ "is_root" : true,
+ "short_form" : "CL_0000144",
+ "obo_id" : "CL:0000144",
+ "in_subset" : null,
+ "obo_definition_citation" : [{"definition":"OBSOLETE: A classification of cells by their primary end goal or behavior.","oboXrefs":[{"database":"FB","id":"ma","description":null,"url":"http://flybase.org/reports/ma.html"}]}],
+ "obo_xref" : null,
+ "obo_synonym" : null,
+ "is_preferred_root" : false,
+ "_links" : {
+ "self" : {
+ "href" : "https://www.ebi.ac.uk/ols/api/ontologies/cl/terms/http%253A%252F%252Fpurl.obolibrary.org%252Fobo%252FCL_0000144"
+ },
+ "graph" : {
+ "href" : "https://www.ebi.ac.uk/ols/api/ontologies/cl/terms/http%253A%252F%252Fpurl.obolibrary.org%252Fobo%252FCL_0000144/graph"
+ }
+ }
+}
+
+* Warning - due to legacy issues, the values of these tags are either a curie (CL:0000123) or short_form ID (CL_0000123) rather than an iri. Handling code needs to deal with both of these formats.
+ + + + + + +Note- this page is currently under development.
+The Cell Ontology has the following annotation properties:
+Annotation property | +Description | +Example term | +Example annotation | +Must have? | +Only one use per term is allowed? | +
---|---|---|---|---|---|
consider | +To be used on obsoleted classes, to point to a term that should be considered by curators for use in place of the obsoleted term. Multiple consider terms are allowed. It can be useful to combine this with a comment to indicate when replacement would be appropriate. | +CL:0000610 obsolete plant cell |
+PO:0009002 | +No | +No | +
created_by | +Added automatically on term creation with standard Protege settings. Ideally, this should use the "supplied user name" in the Protege User Details preference pane. This has been inconsistently applied in the past. | +CL:0002518 | +tmeehan | +Should | +Yes | +
creation_date | +Added automatically on term creation with standard Protege settings. | +CL:0002518 | +2011-02-08T10:46:34Z | +Should | +Yes | +
database_cross_reference | +Citable references that have helped generate the term and term's definition. Includes PubMed IDs (in the format PMID:XXXXXXXX). | +CL:0011005 GABAergic interneuron |
+PMID:29724907 | +Should | +No | +
dc:contributor | +Use this to annotate a whole ontology file with the identifier of a contributor. ORCID preferred. | +N/A | +https://orcid.org/0000-0001-9990-8331 | +Nice to have, if applicable | +No | +
dc:creator | +Coming Soon | +CL:0001201 B cell, CD19-positive |
+https://orcid.org/0000-0001-9990-8331 | +No | +Yes | +
dc:date | +Coming soon | +CL:0001065 innate lymphoid cell |
+2017-01-30T20:20:48Z | +No | +Yes | +
dc:description | +Use this to annotate a whole ontology file with a brief description of the ontology. | +N/A | +An ontology of cell types. | +No | +No | +
dc:title | +Use this to annotate an ontology, giving it a human readable title. | +N/A | +Cell Ontology | +No | +No | +
dcterms:license | +Use to attach a license to the whole ontology file. | +N/A | +http://creativecommons.org/licenses/by/4.0/ | +No | +No | +
definition | +The textual definition for the ontology class. | +CL:0000946 antibody secreting cell |
+A lymphocyte of B lineage that is devoted to secreting large amounts of immunoglobulin. | +Must | +Yes | +
'expand expression to' | +Coming soon | +Coming soon | +Coming soon | +No | +No | +
foaf:depicted_by | +Use this to add a link to an image that depicts an example of an entity referred to by the term | +Coming soon | +Coming soon | +No | +No | +
has_alternative_id | +In CL this is a legacy property. Do not use. | +CL:0000059 ameloblast |
+CL:0000053 | +No | +No | +
has_broad_synonym | +Used for synonyms where the primary definition accurately describes the synonym, but the definition of the synonym may encompass other structures as well. In some cases where a broad synonym is given, it will be a broad synonym for more than one ontology term. You are encouraged to add a reference that uses the term in this way. | +CL:0000365 animal zygote |
+zygote | +No | +No | +
has_exact_synonym | +Used for synonyms where the definition of the synonym is exactly the same as primary term definition. This is used when the same class can have more than one name. You are encouraged to add a reference that uses the term in this way. | +CL:0000622 acinar cell |
+acinic cell | +Nice to have, if applicable | +No | +
has_narrow_synonym | +Used for synonyms where the definition of the synonym is the same as the primary definition, but has additional qualifiers. You are encouraged to add a reference that uses the term in this way. | +CL:0000362 epidermal cell |
+epithelial cell of skin | +No | +No | +
has_obo_namespace | +This is a legacy annotation property. Do not add this manually. | +CL:0001061 abnormal cell |
+cell | +No | +No | +
has_related_synonym | +This scope is applied when a word of phrase has been used synonymously with the primary term name in the literature, but the usage is not strictly correct. That is, the synonym in fact has a slightly different meaning than the primary term name. Since users may not be aware that the synonym was being used incorrectly when searching for a term, related synonyms are included. | +CL:0000902 induced T-regulatory cell |
+adaptive Treg | +No | +No | +
has_synonym_type | +The target of this relation must be an annotation property of type 'synonym_type_property'. | +N/A | +N/A | +No | +No | +
IAO_0000116 | +Coming soon | +Coming soon | +Coming soon | +No | +No | +
id | +Automatically added by some pathways. Do not add manually. If duplicating a term (with the duplicate getting a new ID), it should be deleted. | +CL:2000074 splenocyte |
+CL:2000074 | +Yes | +Yes | +
in_subset | +Used to add subset tags, used in conjunction with subset_property | +CL:0000039 germ line cell |
+_upper_level | +No | +No | +
is_inferred | +This annotation property is used in some automated pipelines. Do not add manually | +Coming soon | +Coming soon | +No | +No | +
rdfs:comment | +Use to add a clarifying comment to a term. This can be useful for adding examples and for clarifying terminological confusions. | +CL:0007016 adaxial cell |
+In teleosts, adaxial cells give rise to slow muscle myoblasts. | +No | +Yes | +
rdfs:isDefinedBy | +Do not add manually. | +Coming soon | +Coming soon | +No | +Yes | +
rdfs:label | +Primary name - used as a display name by Protege (with standard settings) and most downstream consumers. Add only one of these. It must be unique within an ontology. | +CL:0000418 arcade cell |
+arcade cell | +Must | +Yes | +
RO_0002161 | +Coming soon | +Coming soon | ++ | No | +No | +
'see also' | +Used to link to a webpage, such as a GitHub ticket. | +CL:0000134 mesenchymal stem cell |
+https://github.com/obophenotype/cell-ontology/issues/474 | +No | +No | +
shorthand | +Added automatically by some pipelines. Do not add manually | +Coming soon | +Coming soon | +No | +No | +
subset_property | +A grouping class for subset tags. | +N/A | +N/A | +No | +No | +
subset_property: added_for_HCA | +A subset tag for terms that were requested by the Human Cell Atlas. | +N/A | +N/A | +No | +No | +
subset property: location_grouping | +A subset tag for cell types from a particular anatomical location. | +N/A | +N/A | +No | +No | +
synonym_type_property | +A grouping class for synonym tags. | +N/A | +N/A | +No | +No | +
'term replaced by' | +To be used on obsolete terms to indicate a term that can be automatically substituted for the obsoleted term. | +Coming soon | +Coming soon | +No | +No | +
The Cell Ontology 2016: enhanced content, modularization, and ontology interoperability.
+Alexander D Diehl, Terrence F Meehan, Yvonne M Bradford, Matthew H Brush, Wasila M Dahdul, David S Dougall, Yongqun He, David Osumi-Sutherland, Alan Ruttenberg, Sirarat Sarntivijai, Ceri E Van Slyke, Nicole A Vasilevsky, Melissa A Haendel, Judith A Blake, Christopher J Mungall.
+J Biomed Semantics. 2016 Jul 4;7(1):44.
+PMID:27377652, PMCID:PMC4932724, DOI:10.1186/s13326-016-0088-7
Logical development of the cell ontology. +Terrence F Meehan, Anna Maria Masci, Amina Abdulla, Lindsay G Cowell, Judith A Blake, Christopher J Mungall, Alexander D Diehl. +BMC Bioinformatics. 2011 Jan 5;12:6. +PMID:21208450, PMCID:PMC3024222, DOI:10.1186/1471-2105-12-6
+An ontology for cell types. +Jonathan Bard, Seung Y Rhee, Michael Ashburner. +Genome Biol. 2005;6(2):R21. +PMID:15693950, PMCID:PMC551541, DOI:10.1186/gb-2005-6-2-r21
+ + + + + + +While CL is an ODK ontology, it has a specific workflow for releases due to its large size and the limitations on standard GitHub releases.
+Aside from the standard requirements needed for ODK workflow, GH
is required.
+Instructions on how to install GH
can be found here
You will need to log in to your GitHub account on GH
before you can uses it. To do this, enter the following in your terminal:
gh auth login
+
+You can then follow instructions below for web browser login (or use your prefer means of logging in).
+% gh auth login
+? What account do you want to log into? GitHub.com
+? What is your preferred protocol for Git operations? SSH
+? Generate a new SSH key to add to your GitHub account? Yes
+? Enter a passphrase for your new SSH key (Optional)
+? Title for your SSH key: GitHub SSH
+? How would you like to authenticate GitHub CLI? Login with a web browser
+
+! First copy your one-time code: XXXX-XXXX
+Press Enter to open github.com in your browser...
+✓ Authentication complete.
+- gh config set -h github.com git_protocol ssh
+✓ Configured git protocol
+✓ Uploaded the SSH key to your GitHub account: /Users/username/.ssh/id_ed25519.pub
+✓ Logged in as username
+
+Preparation:
+git status
should say that there are no modified files)git pull
)git checkout -b release-2021-01-01
)docker pull obolibrary/odkfull
To actually run the release, you:
+cd cl/src/ontology
)sh run.sh make cl DEPLOY_GH=false
. This will build all files and copy them to the correct place. (Note: the IMP=false
is used to decouple imports refresh with release)review release
section in ODK-workflow release documentmake deploy_release GHVERSION="v2022-06-20"
on the release branch (DO NOTE CHANGE TO MAIN BRANCH!), replacing the date with the date of release (NOTE: no sh run.sh
)
+Editors note: ODK 1.3.2 will have a feature to run the release from inside the docker container. For now deploy_release has to be run outside.https://github.com/obophenotype/cl/releases/tag/untagged-8935f3432525b27a0d84
+
+Copy the link and paste it in your browser, this should show you a draft release.
+1. Click the edit button (the pencil button on the top right corner) and change the tag to the GHVERSION you entered above (eg v2022-06-20)
+1. Change the TBD.
in the main text to a summary of the main changes in the release if needed.
+1. Scroll down all the way and click the update release
button.
The preferred point of contact for the Cell Ontology is the GitHub Issue Tracker. It is used commonly for requesting new terms or suggesting changes to existing terms. Feel free to open a new issue with any kind of request/question/consideration you might have.
+If you do not have a GitHub account, you can sign up for a free account here.
+The Cell Ontology also has a Slack Channel and monthly meetings, with an open agenda.
+If you want to join the channel or talk about any other topics related to the Cell Ontology, you may reach out to one of the active CL editors. +The official contact for CL listed at the OBO Foundry is Alexander Diehl, but feel free to contact any other individual. A list of active CL editors can be found here.
+Note that requests on the GitHub issue tracker may be addressed more quickly, as individuals are often busy.
+For other details on CL, you may see http://obofoundry.org/ontology/cl.html.
+ + + + + + +We welcome your contributions to CL! Generally, you can follow the editors workflow instructions here.
+However, if you aren't confident in directly editing the ontology, you can contribute by writing up an issue and one of our curators/developers will pick it up and address it.
+If you want a new term added, or want edits to a current term, or spot any mistakes/issues with CL, or you have any other CL related issues, you can write up a ticket using the following steps:
+Add new term
is bad name, while [NTR] larval stage X
is good name.- [ ]
to denote action items. These turn into checkboxes which makes it much faster to assess which comments have been addressed. (Note: it is better to write up multiple issues than one big one with multiple items, e.g. write up one issue for each term you want added rather than an issue with all the terms you want added.)gouttegd
and they will assign it appropriately.Add new terms
is bad. Adding larval stage X term #332
is ok.- [ ]
to denote action items in issues and pull requests, not just comments. These turn into checkboxes which makes it much faster to assess which comments have been addressed and can be ignored.squash merge
rather than merge
for your pull request, to keep the git history short and useful.If your pull request references foreign terms from an external ontology that are not yet present in the import module for that ontology (for example, you’re adding a logical definition that makes use of a GO term for the first time), imports needs to be refreshed for the foreign terms to be available to use.
+If you have the technical skills and/or the required computer resources (refreshing imports can be a memory-intensive task), you may refresh the imports yourself before submitting the pull request, by following the appropriate procedure.
+If you can’t apply the imports refreshing procedure for any reason, you may instead opt for using “bare IRIs” when editing the ontology, everywhere you need a reference to a foreign term. Then, when submitting your pull request, label it with the tag update-imports-required
to ask that a member of the tech support group refresh the imports before the pull request can be merged.
People reviewing pull requests must 1) make sure that if a pull request is referencing bare IRIs, the request is tagged with update-imports-required
(adding the label themselves if needed); and 2) make sure that imports have indeed been updated (either by the author of the pull request, or by someone from the tech support group if requested) before allowing the request to be merged.
-
), slash (/
), and apostrophe ('
).Bear in mind that users will often encounter terms in isolation. Sufficiently descriptive labels are therefore recommended, especially where there is obvious potential for confusion. For example, the label 'peripheral nervous system neuron' is preferred over 'peripheral neuron' as the former has more clarity.
+For classes that refer to cell types in specific anatomical structures, the label may have the adjectival or noun form of the anatomical structure, for example, 'hepatic oval stem cell' or 'liver dendritic cell' ("hepatic" vs. "liver"). To determine which form of the anatomical term to use, it is recommended for the editor to search PubMed/review literature to determine common usage. If there is no clear preference, the editor can defer to use the adjectival form and add the noun form as an exact synonym.
+Try to maintain consistent patterns of naming where possible. However, it may make sense to override this in order to conform to common usage.
+This section is about the textual definition of terms. Logically consistent classification is important, but an ontology is only useful (and maintainable) if all humans that interact with it (users, curators and editors) can quickly find the terms they need and understand what they refer to. This requires clear, unambiguous, human-readable definitions.
+When crafting a definition, editors should aim for a reasonably succinct statement about the class allowing curators and users to easily distinguish it from other, similar classes, and which captures key points of interest about that class. It should capture assertions made in the formal part of the definition (the relationships) as closely as possible without becoming stilted and difficult to read.
+The basic structure of a definition should be as follows:
+++A
+genus
thatdiff1
anddiff2
. It alsodiff3
andgloss
...
where genus
is a general classification and diff1
, diff2
, etc. are the differentia, which state what differentiates this class from others that share the same general classification. The gloss, when present, gives some key points of interest about the class.
The first sentence of the definition should refer to the definiendum in singular form. The rest of the definition may then invoke the plural form.
+It is difficult to specify, a priori, which assertions should be included in a textual definition. However there are some general guidelines.
+Comments should be used for:
+Try to be consistent in how you phrase the various types of comments. For example:
+Extensive addition of synonyms helps “findability” of terms when search. Synonyms can and should be added liberally. Of note, the intention of the ontology is not meant to record how a synonym is used in all specific sources in which it appears. Rather an editor, after doing due diligence in researching the terms/synonyms, must determine how a term is used at the present moment in the scientific community.
+Guidelines on the type of synonyms:
+has_exact_synonym
only when the label and the synonym can be used interchangeably without dispute and refer to the same concept. Example: the terms “leukocyte”, “leucocyte” (spelling variation”) and “white blood cell” (layman’s term) all refer to the exact same concept (a specific cell type) and would be considered exact synonyms.
+has_related_synonym
and with property type “abbreviation” (technically: the synonym annotation assertion axiom should itself be annotated with a http://www.geneontology.org/formats/oboInOwl#hasSynonymType
property with value http://purl.obolibrary.org/obo/OMO_0003000
).Example: “WBC” can stand for “white blood cell” and refer to “leukocyte”, but within the biomedical domain it can also represent “white blood cell count” or, perhaps less frequently, “whole-body counting”, two distinct concepts with separate OBO ontology terms.
+DO check that exact synonyms are unique across the ontology. In other words, if class A has synonym “X”, “X” should NOT be an exact synonym for any other CL term.
+DO be mindful of the “directionality” of the narrow and broad types of synonyms. They qualify the synonym, not the original term.
+Example: asserting that “peripheral blood mononuclear cell” is a narrow synonym of “mononuclear cell” means that “peripheral blood mononuclear cell“ refers to a narrower (more specific) concept than “mononuclear cell”, not the other way around.
+DO use has_related_synonym
where the overlap between the synonym and the term label may be uncler, disputable or not true in all scenarios or contexts, but do want the term to be findable when using the synonym as a search string. This includes abbreviations, which should be annotated as related synonyms with synonym type “abbreviation” (see point 2 above).
If a synonym includes a mix of abbreviations and words, DO use has_related_synonym
EXCEPT when there is enough context within the synonym itself to make it clear that the synonym refers only to the concept being annotated.
Example: “lung TRM CD8-positive, CD103-positive cell” should be an exact synonym of “lung resident memory CD8-positive, CD103-positive, alpha-beta T cell”, even though “TRM” (in this case) is an abbreviation for “tissue resident T cell”. Note that without this context “TRM” should NOT be considered an exact synonym for “tissue resident T cell” as “TRM” could also mean “treatment-related mortality”, another OBO ontology concept. +Compare the previous example to “IMB cell”, which should be a related synonym of “invaginating midget bipolar cell”, as there is not enough context to confidently infer what "IMB" stands for.
+The following considerations apply both to all human-readable fields (names, textual definitions, comments, synonyms).
+&
, +
, or vs
for “versus”. Avoid abbreviations unless they are self-explanatory, commonly understood, or they really do help to reduce the amount of typing enough to enhance readability. Use full chemical element names, not symbols (e.g., “hydrogen” instead of “H+”, “copper” instead of “Cu”, etc.). For biomolecules, spell out the term wherever practical (e.g., “fibroblast growth factor” instead of “FGF”). Abbreviations are acceptable in synonyms, in cases where the abbreviation is the synonym.Assertions in textual definitions, evidence provided in comments, and synonyms should be backed up by citing the appropriate literature.
+Citations are made by cross-references, that is by adding http://www.geneontology.org/formats/oboInOwl#hasDbXref
annotations to the definition, comment, and synonym annotations. Add one such annotation per reference, using the CURIE syntax with well-known prefixes:
PMID:1234567
for a PubMed identifier;doi:xx.yyyy/...
for a DOI;ISBN:...
for a ISBN.If the main source for an assertion is a term in another ontology, the short identifier for that term may be used as a cross-reference. For example, WBbt:0006799
to cross-reference a term in the C. elegans Gross Anatomy Ontology.
If using a MeSH (Medical Subject Heading) term as a cross-reference, add the database_cross_reference annotation using the MeSH Unique ID, NOT MeSH Tree Number. For example, a database_cross_reference can be MESH:D004759, NOT MESH:A03.492.766.440.250.
+ORCID identifiers may also be used when the only available source for an assertion is an individual researcher. However, this should be AVOIDED.
+Technical details of adding a cross-reference using Protégé:
+For CURIEs, ORCIDs: In the "Create Annotation" window, select the annotation property database_cross_reference.
+For adding URLs to text definitions or synonyms: In the "Create Annotation" window, select the annotation property database_cross_reference.
+For adding URLs to axioms that are NOT text definitions or synonyms: In the "Create Annotation" window, select the annotation property source.
+For CURIEs: Enter the CURIE, using the bioregistry OBO context prefix (link to prefixmap), as a Value on the "Literal" tab. Leave Datatype empty.
+In cases where more than one CURIE is available for a resource, either is acceptable, but using the more semantically specific identifier is recommended. For example, when both a PMID and a doi are available for a resource, using the PMID is recommended since it indicates the cross-reference points to a paper, as opposed to a doi which could point to any digital object.
+For ORCIDs: Enter the ORCID as an IRI in the IRI field on the "IRI Editor" tab, for example https://orcid.org/0000-0002-7356-1779
.
For URLs: Enter the URL as a literal string with Datatype xsd:anyURI
selected.
To restate, in all cases above except ORCIDs, the values are entered as literal strings. An ORCID MUST BE entered as an IRI.
+When adding an ORCID to identify a term contributor, in the "Create Annotation" window, select the annotation property dcterms:contributor. The ORCID is still entered as an IRI on the “IRI Editor” tab.
+The formal definition of a class is made up of all the logical axioms about the class (as opposed to the annotation assertion axioms). This includes classification assertions, relationship assertions, equivalence assertions, and disjointness assertions.
+++Note: In OWL formalism, both classification and relationship assertions are represented using
+SubClassOf
axioms. However, in this document, we make a strict distinction between a classification (where a class is a subclass of a named class), and a relationship (where a class is a subclass of an anonymous class expression).For example, in the formal definition of CL:0000392 (“crystal cell”):
++
Class: 'crystal cell' + SubClassOf: 'hemocyte' + SubClassOf: 'develops from' some 'procrystal cell'
The first
+SubClassOf
axiom denotes an actual classification, whereas the second denotes a relationship.
In order to keep the ontology maintainable, asserted classifications should be limited where possible. Ideally, all terms would have only a single asserted parent (also known as “superclass”). Given the presence of suitable logically defined classes (see below) and sufficient relationships for the term you are making, additional classification can be inferred automatically by reasoning.
+However, as we are limited in what types of classification we are able to infer, you may need to assert multiple parents. Two asserted classifications are plainly acceptable. If you must assert three or more classifications, then you should make a note with a suggestion for which of the asserted classifications are good candidates for formalisation and inferred classification.
+Logically defined classes are terms that have formal definitions that specify complete necessary and sufficient conditions for membership of the class. They can be used by a reasoner to auto-classify the ontology by searching for terms that fulfill these conditions.
+++Logically defined classes are variously referred to as “cross-products” (XPs), “genus and differentia definitions”, “equivalent classes”, or “intersections”. In OWL formalism, they are represented using
+EquivalentClasses
axioms.
Generally, logical definitions follow the structure: “Any X
that REL
some Y
[and REL
some Z
...]”, where X
is the genus and each following clause (“that REL
some Y
”) is a differentium.
++Strictly speaking, logical definitions can be arbitrarily complex. It is recommended, however, to stick as much as possible to “simple” logical definitions following the structure above. More complex definitions are harder to understand, and may involve OWL constructs that are legal but not fully supported by the available reasoners.
+
Good candidates for logically defined classes include classes whose only differentium is:
+Care must be taken not to use logically defined classes too liberally. You should be satisfied that all automatic classifications that result would make sense (or at least be justifiable) to a biologist and would cover most cases of usages with as few edge cases as possible.
+If you are unsure whether a characteristic of a cell should be expressed as a relationship or as a differentium in a logically defined class: use a relationship.
+The textual definition of a logically defined class should be a plain English equivalent of the logical definition. However, in some cases it can be useful to add more details in the “gloss” part when relevant.
+Please refer to the relations guide for detailled guidelines about which relations to use for most cases.
+ + + + + + +The Cell Ontology (CL) represents canonical, natural biological cell types in a variety of animal species, with a focus on vertebrates. It works in concert with the Uberon anatomy ontology, and integrates seamlessly with the Gene Ontology (GO). It is part of the Open Biological and Biomedical Ontology (OBO) Foundry. As of April 2022, CL consists of over 2400 classes, and is used by key projects that involve single-cell transcriptomics, such as HuBMAP (HuBMAP Consortium 2019), the Human Cell Atlas (Regev et al. 2017), the EBI Single Cell Expression Atlas (Papatheodorou et al. 2020), and the Brain Data Standards Ontology (Tan et al. 2021).
+ + + + + + +The Cell Ontology (CL) is an OBO Foundry ontology covering the domain of canonical, natural biological cell types.
+The recommended way to browse the ontology is through the ontology lookup service (OLS).
+The main release files can be found in our GitHub repository.
+The main release file can also be found here.
+To see how you can contribute to the cell ontology, please visit our Contributing page.
+The documentations here is intended for maintainers and editors of the cell ontology.
+For general guidance on editing OBO-(ish) ontologies, please see the obook.
+You can also access our front facing website at https://cell-ontology.github.io/
+ + + + + + +For general instructions on how to merge terms, please see this How-to Guide
+In addition to the above, please add the annotation has_alternative_id
on the winning term with the ID of the losing term.
Historically, most repos have been using Travis CI for continuous integration testing and building, but due to +runtime restrictions, we recently switched a lot of our repos to GitHub actions. You can set up your repo with CI by adding +this to your configuration file (src/ontology/cl-odk.yaml):
+ci:
+ - github_actions
+
+When updateing your repo, you will notice a new file being added: .github/workflows/qc.yml
.
This file contains your CI logic, so if you need to change, or add anything, this is the place!
+Alternatively, if your repo is in GitLab instead of GitHub, you can set up your repo with GitLab CI by adding +this to your configuration file (src/ontology/cl-odk.yaml):
+ci:
+ - gitlab-ci
+
+This will add a file called .gitlab-ci.yml
in the root of your repo.
The editors workflow is one of the formal workflows to ensure that the ontology is developed correctly according to ontology engineering principles. There are a few different editors workflows:
+This document only covers the first editing workflow, but more will be added in the future
+Workflow requirements:
+Ensure that there is a ticket on your issue tracker that describes the change you are about to make. While this seems optional, this is a very important part of the social contract of building an ontology - no change to the ontology should be performed without a good ticket, describing the motivation and nature of the intended change.
+In your local environment (e.g. your laptop), make sure you are on the main
(prev. master
) branch and ensure that you have all the upstream changes, for example:
git checkout master
+git pull
+
+Create a new branch. Per convention, we try to use meaningful branch names such as: +- issue23removeprocess (where issue 23 is the related issue on GitHub) +- issue26addcontributor +- release20210101 (for releases)
+On your command line, this looks like this:
+git checkout -b issue23removeprocess
+
+Using your editor of choice, perform the intended edit. For example:
+Protégé
+src/ontology/cl-edit.owl
in ProtégéTextEdit
+src/ontology/cl-edit.owl
in TextEdit (or Sublime, Atom, Vim, Nano)Consider the following when making the edit.
+src/ontology/cl-edit.owl
src/ontology/components
), see here.This step is very important. Rather than simply trusting your change had the intended effect, we should always use a git diff as a first pass for sanity checking.
+In our experience, having a visual git client like GitHub Desktop or sourcetree is really helpful for this part. In case you prefer the command line:
+git status
+git diff
+
+Now it's time to run your quality control checks. This can either happen locally (5a) or through your continuous integration system (7/5b).
+If you chose to run your test locally:
+sh run.sh make IMP=false test
+
+This will run the whole set of configured ODK tests on including your change. If you have a complex DOSDP pattern pipeline you may want to add PAT=false
to skip the potentially lengthy process of rebuilding the patterns.
sh run.sh make IMP=false PAT=false test
+
+When you are happy with the changes, you commit your changes to your feature branch, push them upstream (to GitHub) and create a pull request. For example:
+git add NAMEOFCHANGEDFILES
+git commit -m "Added biological process term #12"
+git push -u origin issue23removeprocess
+
+Then you go to your project on GitHub, and create a new pull request from the branch, for example: https://github.com/INCATools/ontology-development-kit/pulls
+There is a lot of great advise on how to write pull requests, but at the very least you should:
+- mention the tickets affected: see #23
to link to a related ticket, or fixes #23
if, by merging this pull request, the ticket is fixed. Tickets in the latter case will be closed automatically by GitHub when the pull request is merged.
+- summarise the changes in a few sentences. Consider the reviewer: what would they want to know right away.
+- If the diff is large, provide instructions on how to review the pull request best (sometimes, there are many changed files, but only one important change).
If you didn't run and local quality control checks (see 5a), you should have Continuous Integration (CI) set up, for example: +- Travis +- GitHub Actions
+More on how to set this up here. Once the pull request is created, the CI will automatically trigger. If all is fine, it will show up green, otherwise red.
+Once all the automatic tests have passed, it is important to put a second set of eyes on the pull request. Ontologies are inherently social - as in that they represent some kind of community consensus on how a domain is organised conceptually. This seems high brow talk, but it is very important that as an ontology editor, you have your work validated by the community you are trying to serve (e.g. your colleagues, other contributors etc.). In our experience, it is hard to get more than one review on a pull request - two is great. You can set up GitHub branch protection to actually require a review before a pull request can be merged! We recommend this.
+This step seems daunting to some hopefully under-resourced ontologies, but we recommend to put this high up on your list of priorities - train a colleague, reach out!
+When the QC is green and the reviews are in (approvals), it is time to merge the pull request. After the pull request is merged, remember to delete the branch as well (this option will show up as a big button right after you have merged the pull request). If you have not done so, close all the associated tickets fixed by the pull request.
+It is sometimes difficult to keep track of changes made to an ontology. Some ontology teams opt to document changes in a changelog (simply a text file in your repository) so that when release day comes, you know everything you have changed. This is advisable at least for major changes (such as a new release system, a new pattern or template etc.).
+ + + + + + +We can define custom checks using SPARQL. SPARQL queries define bad modelling patterns (missing labels, misspelt URIs, and many more) in the ontology. If these queries return any results, then the build will fail. Custom checks are designed to be run as part of GitHub Actions Continuous Integration testing, but they can also run locally.
+src/sparql
. The name of the file should end with -violation.sparql
. Please give a name that helps to understand which violation the query wants to check.src/ontology/uberon-odk.yaml
:-violation.sparql
part) to the list inside the key custom_sparql_checks
that is inside robot_report
key.If the robot_report
or custom_sparql_checks
keys are not available, please add this code block to the end of the file.
yaml
+ robot_report:
+ release_reports: False
+ fail_on: ERROR
+ use_labels: False
+ custom_profile: True
+ report_on:
+ - edit
+ custom_sparql_checks:
+ - name-of-the-file-check
+3. Update the repository so your new SPARQL check will be included in the QC.
sh run.sh make update_repo
+
+
+
+
+
+
+
+ The documentation for CL is managed in two places (relative to the repository root):
+docs
directory contains all the files that pertain to the content of the documentation (more below)mkdocs.yaml
file contains the documentation config, in particular its navigation bar and theme.The documentation is hosted using GitHub pages, on a special branch of the repository (called gh-pages
). It is important that this branch is never deleted - it contains all the files GitHub pages needs to render and deploy the site. It is also important to note that the gh-pages branch should never be edited manually. All changes to the docs happen inside the docs
directory on the main
branch.
All the documentation is contained in the docs
directory, and is managed in Markdown. Markdown is a very simple and convenient way to produce text documents with formatting instructions, and is very easy to learn - it is also used, for example, in GitHub issues. This is a normal editing workflow:
.md
file you want to change in an editor of choice (a simple text editor is often best). IMPORTANT: Do not edit any files in the docs/odk-workflows/
directory. These files are managed by the ODK system and will be overwritten when the repository is upgraded! If you wish to change these files, make an issue on the ODK issue tracker.The documentation is not automatically updated from the Markdown, and needs to be deployed deliberately. To do this, perform the following steps:
+cd cl/src/ontology
sh run.sh make update_docs
+ Mkdocs now sets off to build the site from the markdown pages. You will be asked toIf everything was successful, you will see a message similar to this one:
+INFO - Your documentation should shortly be available at: https://obophenotype.github.io/cell-ontology/
+3. Just to double check, you can now navigate to your documentation pages (usually https://obophenotype.github.io/cell-ontology/).
+ Just make sure you give GitHub 2-5 minutes to build the pages!
The release workflow recommended by the ODK is based on GitHub releases and works as follows:
+These steps are outlined in detail in the following.
+Preparation:
+git status
should say that there are no modified files)git pull
)git checkout -b release-2021-01-01
)docker pull obolibrary/odkfull
To actually run the release, you:
+cd cl/src/ontology
)sh run.sh make prepare_release -B
. Note that for some ontologies, this process can take up to 90 minutes - especially if there are large ontologies you depend on, like PRO or CHEBI.Release files are now in ../.. - now you should commit, push and make a release on your git hosting site such as GitHub or GitLab
.This will create all the specified release targets (OBO, OWL, JSON, and the variants, ont-full and ont-base) and copy them into your release directory (the top level of your repo).
+cl.obo
- this reflects a useful subset of the whole ontology (everything that can be covered by OBO format). OBO format has that speaking for it: it is very easy to review!cl-base.owl
- this reflects the asserted axioms in your ontology that you have actually edited.cl-full.owl
, which may reveal interesting new inferences you did not know about. Note that the diff of this file is sometimes quite large.Once your CI checks have passed, and your reviews are completed, you can now merge the branch into your main branch (don't forget to delete the branch afterwards - a big button will appear after the merge is finished).
+cl.obo
file and check the data-version:
property. The date needs to be prefixed with a v
, so, for example v2020-02-06
.When you are dealing with large ontologies, you need a lot of memory. When you see error messages relating to large ontologies such as CHEBI, PRO, NCBITAXON, or Uberon, you should think of memory first, see here.
+Sometimes you will get cryptic error messages when using legacy tools using OBO format, such as the ontology release tool (OORT), which is also available as part of the ODK docker container. In these cases, you need to track down what axiom or annotation actually caused the breakdown. In our experience (in about 60% of the cases) the problem lies with duplicate annotations (def
, comment
) which are illegal in OBO. Here is an example recipe of how to deal with such a problem:
make: *** [cl.Makefile:84: oort] Error 255
you might have a OORT error. sh run.sh make IMP=false PAT=false oort -B
(assuming you are already in the ontology folder in your directory) cl-edit.owl
in Protégé and find the offending term and delete all offending issue (e.g. delete ALL definition, if the problem was "multiple def tags not allowed") and save.
+*While this is not idea, as it will remove all definitions from that term, it will be added back again when the term is fixed in the ontology it was imported from and added back in.sh run.sh make IMP=false PAT=false oort -B
and if it all passes, commit your changes to a branch and make a pull request as usual.Your ODK repositories configuration is managed in src/ontology/cl-odk.yaml
. Once you have made your changes, you can run the following to apply your changes to the repository:
sh run.sh make update_repo
+
+There are a large number of options that can be set to configure your ODK, but we will only discuss a few of them here.
+NOTE for Windows users:
+You may get a cryptic failure such as Set Illegal Option -
if the update script located in src/scripts/update_repo.sh
+was saved using Windows Line endings. These need to change to unix line endings. In Notepad++, for example, you can
+click on Edit->EOL Conversion->Unix LF to change this.
You can use the update repository workflow described on this page to perform the following operations to your imports:
+We will discuss all these workflows in the following.
+To add a new import, you first edit your odk config as described above, adding an id
to the product
list in the import_group
section (for the sake of this example, we assume you already import RO, and your goal is to also import GO):
import_group:
+ products:
+ - id: ro
+ - id: go
+
+Note: our ODK file should only have one import_group
which can contain multiple imports (in the products
section). Next, you run the update repo workflow to apply these changes. Note that by default, this module is going to be a SLME Bottom module, see here. To change that or customise your module, see section "Customise an import". To finalise the addition of your import, perform the following steps:
src/ontology/cl-edit.owl
file. We suggest to do this using a text editor, by simply copying an existing import declaration and renaming it to the new ontology import, for example as follows:
+ ...
+ Ontology(<http://purl.obolibrary.org/obo/cl.owl>
+ Import(<http://purl.obolibrary.org/obo/cl/imports/ro_import.owl>)
+ Import(<http://purl.obolibrary.org/obo/cl/imports/go_import.owl>)
+ ...
src/ontology/catalog-v001.xml
, for example:
+ <uri name="http://purl.obolibrary.org/obo/cl/imports/go_import.owl" uri="imports/go_import.owl"/>
Note: The catalog file src/ontology/catalog-v001.xml
has one purpose: redirecting
+imports from URLs to local files. For example, if you have
Import(<http://purl.obolibrary.org/obo/cl/imports/go_import.owl>)
+
+in your editors file (the ontology) and
+<uri name="http://purl.obolibrary.org/obo/cl/imports/go_import.owl" uri="imports/go_import.owl"/>
+
+in your catalog, tools like robot
or Protégé will recognize the statement
+in the catalog file to redirect the URL http://purl.obolibrary.org/obo/cl/imports/go_import.owl
+to the local file imports/go_import.owl
(which is in your src/ontology
directory).
If you simply wish to refresh your import in light of new terms, see here. If you wish to change the type of your module see section "Customise an import".
+To remove an existing import, perform the following steps:
+src/ontology/cl-edit.owl
.src/ontology/cl-odk.yaml
, eg. - id: go
from the list of products
in the import_group
.src/imports/go_import.owl
src/imports/go_terms.txt
src/ontology/catalog-v001.xml
file.By default, an import module extracted from a source ontology will be a SLME module, see here. There are various options to change the default.
+The following change to your repo config (src/ontology/cl-odk.yaml
) will switch the go import from an SLME module to a simple ROBOT filter module:
import_group:
+ products:
+ - id: ro
+ - id: go
+ module_type: filter
+
+A ROBOT filter module is, essentially, importing all external terms declared by your ontology (see here on how to declare external terms to be imported). Note that the filter
module does
+not consider terms/annotations from namespaces other than the base-namespace of the ontology itself. For example, in the
+example of GO above, only annotations / axioms related to the GO base IRI (http://purl.obolibrary.org/obo/GO_) would be considered. This
+behaviour can be changed by adding additional base IRIs as follows:
import_group:
+ products:
+ - id: go
+ module_type: filter
+ base_iris:
+ - http://purl.obolibrary.org/obo/GO_
+ - http://purl.obolibrary.org/obo/CL_
+ - http://purl.obolibrary.org/obo/BFO
+
+If you wish to customise your import entirely, you can specify your own ROBOT command to do so. To do that, add the following to your repo config (src/ontology/cl-odk.yaml
):
import_group:
+ products:
+ - id: ro
+ - id: go
+ module_type: custom
+
+Now add a new goal in your custom Makefile (src/ontology/cl.Makefile
, not src/ontology/Makefile
).
imports/go_import.owl: mirror/ro.owl imports/ro_terms_combined.txt
+ if [ $(IMP) = true ]; then $(ROBOT) query -i $< --update ../sparql/preprocess-module.ru \
+ extract -T imports/ro_terms_combined.txt --force true --individuals exclude --method BOT \
+ query --update ../sparql/inject-subset-declaration.ru --update ../sparql/postprocess-module.ru \
+ annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) --output $@.tmp.owl && mv $@.tmp.owl $@; fi
+
+Now feel free to change this goal to do whatever you wish it to do! It probably makes some sense (albeit not being a strict necessity), to leave most of the goal instead and replace only:
+extract -T imports/ro_terms_combined.txt --force true --individuals exclude --method BOT \
+
+to another ROBOT pipeline.
+A component is an import which belongs to your ontology, e.g. is managed by +you and your team.
+src/ontology/cl-odk.yaml
components
components
section, add a new section called products
.
+This is where all your components are specifiedproducts
section, add a new component, e.g. - filename: mycomp.owl
Example
+components:
+ products:
+ - filename: mycomp.owl
+
+When running sh run.sh make update_repo
, a new file src/ontology/components/mycomp.owl
will
+be created which you can edit as you see fit. Typical ways to edit:
components/mycomp.owl:
make target in src/ontology/cl.Makefile
+and provide a custom command to generate the componentWARNING
: Note that the custom rule to generate the component MUST NOT depend on any other ODK-generated file such as seed files and the like (see issue).src/ontology/cl-odk.yaml
, source
,
+to specify that this component should simply be downloaded from somewhere on the web.Since ODK 1.3.2, it is possible to simply link a ROBOT template to a component without having to specify any of the import logic. In order to add a new component that is connected to one or more template files, follow these steps:
+src/ontology/cl-odk.yaml
.use_templates: TRUE
is set in the global project options. You should also make sure that use_context: TRUE
is set in case you are using prefixes in your templates that are not known to robot
, such as OMOP:
, CPONT:
and more. All non-standard prefixes you are using should be added to config/context.json
.products
section.use_template: TRUE
. This will create an empty template for you in the templates directory, which will automatically be processed when recreating the component (e.g. run.bat make recreate-mycomp
).templates
field to add as many template names as you wish. ODK will look for them in the src/templates
directory.template_options
field. This should be a string with option from robot template. One typical example for additional options you may want to provide is --add-prefixes config/context.json
to ensure the prefix map of your context is provided to robot
, see above.Example:
+components:
+ products:
+ - filename: mycomp.owl
+ use_template: TRUE
+ template_options: --add-prefixes config/context.json
+ templates:
+ - template1.tsv
+ - template2.tsv
+
+Note: if your mirror is particularly large and complex, read this ODK recommendation.
+ + + + + + +The main kinds of files in the repository:
+Release file are the file that are considered part of the official ontology release and to be used by the community. A detailed description of the release artefacts can be found here.
+Imports are subsets of external ontologies that contain terms and axioms you would like to re-use in your ontology. These are considered "external", like dependencies in software development, and are not included in your "base" product, which is the release artefact which contains only those axioms that you personally maintain.
+These are the current imports in CL
+Import | +URL | +Type | +
---|---|---|
pr | +https://raw.githubusercontent.com/obophenotype/pro_obo_slim/master/pr_slim.owl | +None | +
go | +http://purl.obolibrary.org/obo/go.owl | +None | +
uberon | +http://purl.obolibrary.org/obo/uberon.owl | +None | +
ro | +http://purl.obolibrary.org/obo/ro.owl | +None | +
pato | +http://purl.obolibrary.org/obo/pato.owl | +None | +
ncbitaxon | +http://purl.obolibrary.org/obo/ncbitaxon/subsets/taxslim.owl | +None | +
omo | +http://purl.obolibrary.org/obo/omo.owl | +mirror | +
Components, in contrast to imports, are considered full members of the ontology. This means that any axiom in a component is also included in the ontology base - which means it is considered native to the ontology. While this sounds complicated, consider this: conceptually, no component should be part of more than one ontology. If that seems to be the case, we are most likely talking about an import. Components are often not needed for ontologies, but there are some use cases:
+These are the components in CL
+Filename | +URL | +
---|---|
hra_subset.owl | +None | +
mappings.owl | +None | +
blood_and_immune_upper_slim.owl | +None | +
eye_upper_slim.owl | +None | +
general_cell_types_upper_slim.owl | +None | +
One of the most frequent problems with running the ODK for the first time is failure because of lack of memory. This can look like a Java OutOfMemory exception,
+but more often than not it will appear as something like an Error 137
. There are two places you need to consider to set your memory:
robot_java_args: '-Xmx8G'
to your src/ontology/cl-odk.yaml file, see for example here.robot_java_args
variable. You can manage your memory settings
+by right-clicking on the docker whale in your system bar-->Preferences-->Resources-->Advanced, see picture below.This page discusses how to update the contents of your imports, like adding or removing terms. If you are looking to customise imports, like changing the module type, see here.
+Note: some ontologies now use a merged-import system to manage dynamic imports, for these please follow instructions in the section title "Using the Base Module approach".
+Importing a new term is split into two sub-phases:
+There are three ways to declare terms that are to be imported from an external ontology. Choose the appropriate one for your particular scenario (all three can be used in parallel if need be):
+This workflow is to be avoided, but may be appropriate if the editor does not have access to the ODK docker container. +This approach also applies to ontologies that use base module import approach.
+Now you can use this term for example to construct logical definitions. The next time the imports are refreshed (see how to refresh here), the metadata (labels, definitions, etc.) for this term are imported from the respective external source ontology and becomes visible in your ontology.
+Every import has, by default a term file associated with it, which can be found in the imports directory. For example, if you have a GO import in src/ontology/go_import.owl
, you will also have an associated term file src/ontology/go_terms.txt
. You can add terms in there simply as a list:
GO:0008150
+GO:0008151
+
+Now you can run the refresh imports workflow) and the two terms will be imported.
+This workflow is appropriate if:
+To enable this workflow, you add the following to your ODK config file (src/ontology/cl-odk.yaml
), and update the repository:
use_custom_import_module: TRUE
+
+Now you can manage your imported terms directly in the custom external terms template, which is located at src/templates/external_import.owl
. Note that this file is a ROBOT template, and can, in principle, be extended to include any axioms you like. Before extending the template, however, read the following carefully.
The main purpose of the custom import template is to enable the management off all terms to be imported in a centralised place. To enable that, you do not have to do anything other than maintaining the template. So if you, say currently import APOLLO_SV:00000480
, and you wish to import APOLLO_SV:00000532
, you simply add a row like this:
ID Entity Type
+ID TYPE
+APOLLO_SV:00000480 owl:Class
+APOLLO_SV:00000532 owl:Class
+
+When the imports are refreshed see imports refresh workflow, the term(s) will simply be imported from the configured ontologies.
+Now, if you wish to extend the Makefile (which is beyond these instructions) and add, say, synonyms to the imported terms, you can do that, but you need to (a) preserve the ID
and ENTITY
columns and (b) ensure that the ROBOT template is valid otherwise, see here.
WARNING. Note that doing this is a widespread antipattern (see related issue). You should not change the axioms of terms that do not belong into your ontology unless necessary - such changes should always be pushed into the ontology where they belong. However, since people are doing it, whether the OBO Foundry likes it or not, at least using the custom imports module as described here localises the changes to a single simple template and ensures that none of the annotations added this way are merged into the base file.
+If you want to refresh the import yourself (this may be necessary to pass the travis tests), and you have the ODK installed, you can do the following (using go as an example):
+First, you navigate in your terminal to the ontology directory (underneath src in your hpo root directory).
+cd src/ontology
+
+Then, you regenerate the import that will now include any new terms you have added. Note: You must have docker installed.
+sh run.sh make PAT=false imports/go_import.owl -B
+
+Since ODK 1.2.27, it is also possible to simply run the following, which is the same as the above:
+sh run.sh make refresh-go
+
+Note that in case you changed the defaults, you need to add IMP=true
and/or MIR=true
to the command below:
sh run.sh make IMP=true MIR=true PAT=false imports/go_import.owl -B
+
+If you wish to skip refreshing the mirror, i.e. skip downloading the latest version of the source ontology for your import (e.g. go.owl
for your go import) you can set MIR=false
instead, which will do the exact same thing as the above, but is easier to remember:
sh run.sh make IMP=true MIR=false PAT=false imports/go_import.owl -B
+
+Since ODK 1.2.31, we support an entirely new approach to generate modules: Using base files. +The idea is to only import axioms from ontologies that actually belong to it. +A base file is a subset of the ontology that only contains those axioms that nominally +belong there. In other words, the base file does not contain any axioms that belong +to another ontology. An example would be this:
+Imagine this being the full Uberon ontology:
+Axiom 1: BFO:123 SubClassOf BFO:124
+Axiom 1: UBERON:123 SubClassOf BFO:123
+Axiom 1: UBERON:124 SubClassOf UBERON 123
+
+The base file is the set of all axioms that are about UBERON terms:
+Axiom 1: UBERON:123 SubClassOf BFO:123
+Axiom 1: UBERON:124 SubClassOf UBERON 123
+
+I.e.
+Axiom 1: BFO:123 SubClassOf BFO:124
+
+Gets removed.
+The base file pipeline is a bit more complex than the normal pipelines, because +of the logical interactions between the imported ontologies. This is solved by _first +merging all mirrors into one huge file and then extracting one mega module from it.
+Example: Let's say we are importing terms from Uberon, GO and RO in our ontologies. +When we use the base pipelines, we
+1) First obtain the base (usually by simply downloading it, but there is also an option now to create it with ROBOT)
+2) We merge all base files into one big pile
+3) Then we extract a single module imports/merged_import.owl
The first implementation of this pipeline is PATO, see https://github.com/pato-ontology/pato/blob/master/src/ontology/pato-odk.yaml.
+To check if your ontology uses this method, check src/ontology/cl-odk.yaml to see if use_base_merging: TRUE
is declared under import_group
If your ontology uses Base Module approach, please use the following steps:
+First, add the term to be imported to the term file associated with it (see above "Using term files" section if this is not clear to you)
+Next, you navigate in your terminal to the ontology directory (underneath src in your hpo root directory).
+cd src/ontology
+
+Then refresh imports by running
+sh run.sh make imports/merged_import.owl
+
+Note: if your mirrors are updated, you can run sh run.sh make no-mirror-refresh-merged
This requires quite a bit of memory on your local machine, so if you encounter an error, it might be a lack of memory on your computer. A solution would be to create a ticket in an issue tracker requesting for the term to be imported, and one of the local devs should pick this up and run the import for you.
+Lastly, restart Protégé, and the term should be imported in ready to be used.
+ + + + + + +For details on what components are, please see component section of repository file structure document.
+To add custom components to an ODK repo, please follow the following steps:
+1) Locate your odk yaml file and open it with your favourite text editor (src/ontology/cl-odk.yaml) +2) Search if there is already a component section to the yaml file, if not add it accordingly, adding the name of your component:
+components:
+ products:
+ - filename: your-component-name.owl
+
+3) Add the component to your catalog file (src/ontology/catalog-v001.xml)
+ <uri name="http://purl.obolibrary.org/obo/cl/components/your-component-name.owl" uri="components/your-component-name.owl"/>
+
+4) Add the component to the edit file (src/ontology/cl-edit.obo) +for .obo formats:
+import: http://purl.obolibrary.org/obo/cl/components/your-component-name.owl
+
+for .owl formats:
+Import(<http://purl.obolibrary.org/obo/cl/components/your-component-name.owl>)
+
+5) Refresh your repo by running sh run.sh make update_repo
- this should create a new file in src/ontology/components.
+6) In your custom makefile (src/ontology/cl.Makefile) add a goal for your custom make file. In this example, the goal is a ROBOT template.
$(COMPONENTSDIR)/your-component-name.owl: $(SRC) ../templates/your-component-template.tsv
+ $(ROBOT) template --template ../templates/your-component-template.tsv \
+ annotate --ontology-iri $(ONTBASE)/$@ --output $(COMPONENTSDIR)/your-component-name.owl
+
+(If using a ROBOT template, do not forget to add your template tsv in src/templates/)
+7) Make the file by running sh run.sh make components/your-component-name.owl
http://purl.obolibrary.org/obo/cl/cellBearerOfQuality
+A cell that has a specific quality, such as binucleate.
+{cell} and (bearer of some {quality})
+defined_class | +defined_class_label | +cell | +cell_label | +quality | +quality_label | +
---|---|---|---|---|---|
CL:0001061 | +abnormal cell | +CL:0000000 | +cell | +PATO:0000460 | +abnormal | +
CL:0000225 | +anucleate cell | +CL:0000003 | +native cell | +PATO:0001405 | +anucleate | +
CL:0000227 | +binucleate cell | +CL:0000003 | +native cell | +PATO:0001406 | +binucleate | +
CL:0000103 | +bipolar neuron | +CL:0000099 | +interneuron | +PATO:0070006 | +bipolar morphology | +
CL:4023077 | +bitufted neuron | +CL:0000099 | +interneuron | +PATO:0070012 | +bitufted cell morphology | +
See full table here
+ + + + + + +http://purl.obolibrary.org/obo/cl/cellCapableOfBiologicalProcess
+Any cell that is involved in/capable of a particular biological process, such as acid secretion.
+A {cell} that is capable of {biological_process}.
+{cell} and (capable of some {biological_process})
+defined_class | +defined_class_label | +biological_process | +biological_process_label | +cell | +cell_label | +
---|---|---|---|---|---|
CL:0000236 | +B cell | +GO:0019724 | +B cell mediated immunity | +CL:0000945 | +lymphocyte of B lineage | +
CL:0000492 | +CD4-positive helper T cell | +GO:0001816 | +cytokine production | +CL:0000624 | +CD4-positive, alpha-beta T cell | +
CL:0000795 | +CD8-positive, alpha-beta regulatory T cell | +GO:0050777 | +negative regulation of immune response | +CL:0000625 | +CD8-positive, alpha-beta T cell | +
CL:0011005 | +GABAergic interneuron | +GO:0061534 | +gamma-aminobutyric acid secretion, neurotransmission | +CL:0000099 | +interneuron | +
CL:0000617 | +GABAergic neuron | +GO:0061534 | +gamma-aminobutyric acid secretion, neurotransmission | +CL:0000540 | +neuron | +
See full table here
+ + + + + + +http://purl.obolibrary.org/obo/cl/cellHasPlasmaMembranePartX
+A cell type that is characterized by a plasma membrane part, such as a cilium or receptor. Note - that this is only good for cells defined by a single plasma membrane receptor.
+{cell} {plasma_membrane}
+A {cell} that has a {plasma_membrane}.
+{cell} and (has plasma membrane part some {plasma_membrane})
+ + + + + + +http://purl.obolibrary.org/obo/cl/cellPartOfAnatomicalEntity
+A cell that is part of an anatomical entity.
+Any {cell} that is part of a {anatomical_entity}.
+{cell} and (part of some {anatomical_entity})
+defined_class | +defined_class_label | +anatomical_entity | +anatomical_entity_label | +cell | +cell_label | +
---|---|---|---|---|---|
CL:0009032 | +B cell of appendix | +UBERON:0001154 | +vermiform appendix | +CL:0000236 | +B cell | +
CL:0009045 | +B cell of medullary sinus of lymph node | +UBERON:0009744 | +lymph node medullary sinus | +CL:0000236 | +B cell | +
CL:0010007 | +His-Purkinje system cell | +UBERON:0004146 | +His-Purkinje system | +CL:0000003 | +native cell | +
CL:0002680 | +PP cell of intestine | +UBERON:0000160 | +intestine | +CL:0000696 | +PP cell | +
CL:0009015 | +Peyer's patch follicular dendritic cell | +UBERON:0001211 | +Peyer's patch | +CL:0000442 | +follicular dendritic cell | +
See full table here
+ + + + + + +This is a listing of all the patterns hosted as part of this directory
+A cell that has a specific quality, such as binucleate.
+Attribute | +Info | +
---|---|
IRI | +http://purl.obolibrary.org/obo/cl/cellBearerOfQuality | +
Name | +cellBearerOfQuality | +
Classes | +CL:0000000, PATO:0000001, | +
Variables | +cell (CL:0000000), quality (PATO:0000001), | +
Contributors | +0000-0001-5208-3432, 0000-0002-6601-2165, | +
Examples | +mondo | +
defined:class | +defined:class:label | +cell | +cell:label | +quality | +quality:label | +
---|---|---|---|---|---|
CL:0001061 | +abnormal cell | +CL:0000000 | +cell | +PATO:0000460 | +abnormal | +
CL:0000225 | +anucleate cell | +CL:0000003 | +native cell | +PATO:0001405 | +anucleate | +
CL:0000227 | +binucleate cell | +CL:0000003 | +native cell | +PATO:0001406 | +binucleate | +
CL:0000103 | +bipolar neuron | +CL:0000099 | +interneuron | +PATO:0070006 | +bipolar morphology | +
CL:4023077 | +bitufted neuron | +CL:0000099 | +interneuron | +PATO:0070012 | +bitufted cell morphology | +
See full table here
+Any cell that is involved in/capable of a particular biological process, such as acid secretion.
+Attribute | +Info | +
---|---|
IRI | +http://purl.obolibrary.org/obo/cl/cellCapableOfBiologicalProcess | +
Name | +cellCapableOfBiologicalProcess | +
Classes | +CL:0000000, GO:0008150, | +
Variables | +cell (CL:0000000), biological_process (GO:0008150), | +
Contributors | ++ |
Examples | +mondo | +
defined:class | +defined:class:label | +biological:process | +biological:process:label | +cell | +cell:label | +
---|---|---|---|---|---|
CL:0000236 | +B cell | +GO:0019724 | +B cell mediated immunity | +CL:0000945 | +lymphocyte of B lineage | +
CL:0000492 | +CD4-positive helper T cell | +GO:0001816 | +cytokine production | +CL:0000624 | +CD4-positive, alpha-beta T cell | +
CL:0000795 | +CD8-positive, alpha-beta regulatory T cell | +GO:0050777 | +negative regulation of immune response | +CL:0000625 | +CD8-positive, alpha-beta T cell | +
CL:0011005 | +GABAergic interneuron | +GO:0061534 | +gamma-aminobutyric acid secretion, neurotransmission | +CL:0000099 | +interneuron | +
CL:0000617 | +GABAergic neuron | +GO:0061534 | +gamma-aminobutyric acid secretion, neurotransmission | +CL:0000540 | +neuron | +
See full table here
+A cell type that is characterized by a plasma membrane part, such as a cilium or receptor. Note - that this is only good for cells defined by a single plasma membrane receptor.
+Attribute | +Info | +
---|---|
IRI | +http://purl.obolibrary.org/obo/cl/cellHasPlasmaMembranePartX | +
Name | +cellHasPlasmaMembranePartX | +
Classes | +CL:0000000, CL:0000003, GO:0005886, | +
Variables | +cell (CL:0000003), plasma_membrane (GO:0005886), | +
Contributors | +0000-0001-5208-3432, 0000-0002-6601-2165, | +
Examples | ++ |
A cell that is part of an anatomical entity.
+Attribute | +Info | +
---|---|
IRI | +http://purl.obolibrary.org/obo/cl/cellPartOfAnatomicalEntity | +
Name | +cellPartOfAnatomicalEntity | +
Classes | +CL:0000000, UBERON:0001062, | +
Variables | +cell (CL:0000000), anatomical_entity (UBERON:0001062), | +
Contributors | +0000-0001-5208-3432, 0000-0002-6601-2165, | +
Examples | +mondo | +
defined:class | +defined:class:label | +anatomical:entity | +anatomical:entity:label | +cell | +cell:label | +
---|---|---|---|---|---|
CL:0009032 | +B cell of appendix | +UBERON:0001154 | +vermiform appendix | +CL:0000236 | +B cell | +
CL:0009045 | +B cell of medullary sinus of lymph node | +UBERON:0009744 | +lymph node medullary sinus | +CL:0000236 | +B cell | +
CL:0010007 | +His-Purkinje system cell | +UBERON:0004146 | +His-Purkinje system | +CL:0000003 | +native cell | +
CL:0002680 | +PP cell of intestine | +UBERON:0000160 | +intestine | +CL:0000696 | +PP cell | +
CL:0009015 | +Peyer's patch follicular dendritic cell | +UBERON:0001211 | +Peyer's patch | +CL:0000442 | +follicular dendritic cell | +
See full table here
+A cell that is restricted to a specific taxon, such as CL:0001200 'lymphocyte of B lineage, CD19-positive' are only in mammals. Note - this is not to be used for any cell that is restricted to a taxon, this is for taxon-specific subclasses of existing cell types. This should hardly ever be used.
+Attribute | +Info | +
---|---|
IRI | +http://purl.obolibrary.org/obo/cl/taxonSpecific | +
Name | +taxonSpecific | +
Classes | +CL:0000000, NCBITaxon:1, | +
Variables | +cell (CL:0000000), taxon (NCBITaxon:1), | +
Contributors | +0000-0001-5208-3432, 0000-0002-6601-2165, | +
Examples | ++ |
http://purl.obolibrary.org/obo/cl/taxonSpecific
+A cell that is restricted to a specific taxon, such as CL:0001200 'lymphocyte of B lineage, CD19-positive' are only in mammals. Note - this is not to be used for any cell that is restricted to a taxon, this is for taxon-specific subclasses of existing cell types. This should hardly ever be used.
+Any {cell} that is part of a {taxon}.
+Cell Ontology (Genentech presentation) by Nicole Vasilevsky. +Presented on 2021-02-09.
+ + + + + + + +The aim of this document is to provide an accessible guide to how to use relations to record the properties that define cell types including location, lineage, function, morphology and marker genes. The term 'relations' here refers principally to OWL object properties, but also includes annoation properties used as shortcuts for more expressive logical axioms that can be programatically generated from them.
+Relations in this guide are grouped by general use case (e.g. recording location) and each is illustrated by an example e.g.-
+This should be read as ‘all melanocytes have some type of melanosome as a part’ as should all axioms of this form. The examples should all be correct, but may not reflect the full complexity of axioms in the ontology. Where no example is currently present in CL, examples are taken from the Drosophila Anatomy Ontology, which follows the same schema.
+Location of cell types is recorded by relating a cell type to a term in an anatomical ontology. For the Cell Ontology this means a term from Uberon.
+Use part_of for cases where the location is a material anatomical structure (rather than a space, such as a sinus) and all of the cell is within the anatomical structure.
+‘epithelial cell' +subClassOf 'part of' +some epithelium
+‘part of’ is transitive, which means that it applies across chains of relationships. For example,
+‘ileal goblet cell’ part_of some ileum
+ilium ‘part of’ some ‘small intestine’
+‘small intestine’ ‘part of’ some intestine
+=>
+’ileal goblet cell’ ‘part of’ some ‘small intestine’ +& +‘ileal goblet cell’ ‘part of’ some intestine
+To record the location of a cell in an anatomical space (e.g., a sinus), +'located in' is used.
+For example:
+‘lymph node marginal reticular cell’ subClassOf 'located in' some 'subcapsular sinus of lymph node'
+'part of' applies in cases where an entire cell is within an anatomical structure, but some cells have parts in multiple anatomical structures. For example, many neurons span multiple regions of the central nervous system. The general relation for this is overlaps (has some part in).
+overlaps is not currently used directly in the cell ontology (time of writing 05/2023), but more specific relationships exist for recording the location of neurons and their parts. These are described in the next section.
+When neurobiologists talk about the location of vertebrate neurons, they are typically referring to soma location. The importance of soma location to identify is underscored by how commonly cell types are named, in part, by soma location. We therefore have a dedicated relation for recording this: 'has soma location'.
+For example, anterior horn motor neuron has the following subclass axiom:
+'has soma location' some 'ventral horn of spinal cord'
+axiomatization of ‘has soma location’
+subPropertyOf: overlaps # if X has_soma_location some Y, then X overlaps some Y)
+domain: neuron # X has_soma_location some Y => X is inferred to be a subClassOf neuron
+property chain: has_soma_location o part_of --> has_soma_location # If x has soma location y and y is part_of z, then x has_soma_location_z
+Example of reasoning with the property chain:
+'cortical interneuron' equivalentTo 'interneuron' that has_soma_location some 'cerebral cortex'
+'rosehip neuron' subClassOf interneuron and has_soma_location some 'cortical layer 1'
+'cortical layer 1' subClassOf part_of some 'cerebral cortex
+=> 'rosehip neuron' subClassOf 'cortical interneuron'
+A relationship between a neuron and a region, where the neuron has a functionally relevant number of output synapses in that region.
+'adult basket subesophageal neuron' SubClassOf sends synaptic output to region +some inferior posterior slope
+A relationship between a neuron and a region, where the neuron has a functionally relevant number of input synapses:
+e.g. 'adult basket subesophageal neuron' SubClassOf ‘receives synaptic input in region’ +some ‘superior posterior slope’
+Use this to record the tracts or nerves that a neuron’s projections fasciculate with.
+e.g. ‘Betz cell’ subClasssOf ‘fasciculates with’ some ‘corticospinal tract’.
+subPropertyOf: overlaps
+domain: neuron
+range: neuron projection bundle
+To record neuron-to-neuron or motor neuron-to-target muscle connectivity, consider the following object properties. These properties should be used when connectivity is key to the definition, for example, in cases where a motor neuron type is defined by the type of muscle fiber on which it synapses.
+For example, 'alpha motor neuron' SubClassOf synapsed to some 'extrafusal muscle fiber'
+For example, 'extrafusal muscle fiber' SubClassOf synapsed by some 'alpha motor neuron'
+Cellular function is recorded by linking GO biological process terms with the object properties 'capable of' and ‘capable of part of’
+Use this relationships where the cell is capable of carrying out the entirety of the process
+For example, 'hilus cell of ovary' has the following subclass:
+'capable of' some 'androgen secretion'
+Use this relationship where only part of the process occurs in the cell type.
+e.g. 'retinal bipolar neuron' 'capable of part of' some 'visual perception'
+Developmental lineage is recorded between cell types with the object property develops from (a transitive property), or in the case where there are no intermediates between the cells, 'directly develops from' (a non-transitive subproperty of develops_from)
+For example, 'leukocyte' subClassOf develops from some 'hematopoietic stem cell'
+Only markers that are necessary to define a cell type should be recorded.
+The cell ontology has a set of terms for recording cell surface markers.
+The most commonly used relation for recording markers is 'has plasma +membrane part'. This +object property is used to record cell surface markers, especially in +immune cells. There are also more specific properties, 'has low +plasma membrane amount' +and 'has high plasma membrane +amount', that can be used +at an editor's discretion. In each case, a term from the PRotein +Ontology (PRO) or a +protein complex term from the Gene Ontology +(GO) is used as the object +of the relation.
+For example, 'alpha-beta T cell' has the following +equivalence axiom:
+'T cell' and 'has +plasma membrane part' +some 'alpha-beta T cell receptor complex'
+Absence of a marker can be recorded using +lacks_plasma_membrane_part
+Warning - this is used in place of the more accurate OWL expression "NOT has_part some X*** in order to keep within the EL profile of OWL. It's use with a general class as a target can potentially lead to reasoning errors.
+Use this to link a cell type to a gene or gene product that defines it:
+For example:
+'lamp5 GABAergic cortical interneuron' EquivalentTo: +interneuron and ('has soma location' some 'cerebral cortex') +and ('capable of' some 'gamma-aminobutyric acid secretion, neurotransmission') +and (expresses some 'lysosome-associated membrane glycoprotein 5')
+In FBbt, FlyBase Gene IDs are permitted here (using standard resolvable URL pattern). In CL currenly only PRO IDs are permitted. In PCL, a broader range of IDs have been used (depending on data sources used).
+To record parts above the granularity of proteins and complexes, use a 'has part' relationship with an object from the Gene Ontology cellular_component branch.
+e.g. 'melanocyte' subClassOf 'has part' some 'melanosome'
+This GO term can be combined with a PATO quality term (e.g. for shape) where necessary, e.g.
+For example:
+'mature basophil' subClassOf ('has part' some (nucleus and ('has characteristic' some lobed)))
+The ontology PATO, +has a rich set of terms that can be used to record the general +characteristics of cells, such as their morphology. These are recorded +using 'has characteristic'.
+In choosing PATO terms, avoid those referring to some change in +characteristic (e.g,.’ increased branchiness’). The following list of +examples is not exhaustive:
+PATO has a set of general morphology terms which may be applicable to +cells.
+For example, erythrocyte +subClassOf 'has characteristic' +some biconcave
+PATO also has a set of terms for specific cell morphologies (mostly +neuronal), e.g.
+‘Betz cell’ subClassOf ‘has characteristic’ some ‘standard pyramidal morphology’
+To record the number of nuclei in a cell, use a PATO subclass +under the term 'nucleate quality' with the 'has +characteristic' relation.
+ +For example,
+platelet subClassOf ('has_characteristic' some anucleate)
+Note - that PATO includes bridging axioms that infer part relationships +based on these characteristics.
+e.g.
+cell and ('has characteristic' some multinucleate) SubClassOf 'has part' +some nucleus
+See +https://oboacademy.github.io/obook/explanation/taxon-constraints-explainer/.
+ + + + + + +When you come to merge your pull request, you may find that conflicts prevent automated merging back into the master. In some cases, GitHub supports resolution of these through its web interface. However, probably due to file size, this is not currently supported for cl-edit.owl.
+The majority of the time, the conflict is trivial - due to addition of new terms to the same point in the file. Because terms are ordered in the file by ID, this happens whenever two edits add terms without any intervening IDs. Trivial clashes are easy to spot - they involve whole term stanzas + declarations.
+Occassionally non-trivial clashes will happen when two pull requests include edits to the same term or even the same axiom. Ask an editor for help if you don't feel confident resolving these.
+Reserialise the Master file using the Ontology Development Kit (ODK). This requires setting up Docker and ODK. If not already set up, follow the instructions here.
+Open Docker.
+At the line command (PC) or Terminal (Mac), use the cd (change directory) command to navigate to the repository's src/ontology/ directory. + For example,
+''' + cd PATH_TO_ONTOLOGY/src/ontology/ + '''
+Replace "PATH_TO_ONTOLOGY" with the actual file path to the ontology. If you need to orient yourself, use the '''pwd''' (present working directory) or '''ls''' (list) line commands.
+''' +sh run.sh make normalize_src + '''
+If you are resolving a conflict in an .obo file, run:
+''' +sh run.sh make normalize_obo_src + '''
+In CL, edits sometimes result in creating a large amount of uninteded differences involving ^^xsd:string. If you see these differences after running the command above, they can be resolved by following the instructions here.
+In GitHub Desktop:
+Checkout Master and pull to make sure your Master branch is up to date.
+Choose Branch > Update from master:
+GitHub desktop should detect the clash and ask you if you want to open in your text editor of choice (e.g., Atom).
+' + escapeHtml(summary) +'
' + noResultsText + '
'); + } +} + +function doSearch () { + var query = document.getElementById('mkdocs-search-query').value; + if (query.length > min_search_length) { + if (!window.Worker) { + displayResults(search(query)); + } else { + searchWorker.postMessage({query: query}); + } + } else { + // Clear results for short queries + displayResults([]); + } +} + +function initSearch () { + var search_input = document.getElementById('mkdocs-search-query'); + if (search_input) { + search_input.addEventListener("keyup", doSearch); + } + var term = getSearchTermFromLocation(); + if (term) { + search_input.value = term; + doSearch(); + } +} + +function onWorkerMessage (e) { + if (e.data.allowSearch) { + initSearch(); + } else if (e.data.results) { + var results = e.data.results; + displayResults(results); + } else if (e.data.config) { + min_search_length = e.data.config.min_search_length-1; + } +} + +if (!window.Worker) { + console.log('Web Worker API not supported'); + // load index in main thread + $.getScript(joinUrl(base_url, "search/worker.js")).done(function () { + console.log('Loaded worker'); + init(); + window.postMessage = function (msg) { + onWorkerMessage({data: msg}); + }; + }).fail(function (jqxhr, settings, exception) { + console.error('Could not load worker.js'); + }); +} else { + // Wrap search in a web worker + var searchWorker = new Worker(joinUrl(base_url, "search/worker.js")); + searchWorker.postMessage({init: true}); + searchWorker.onmessage = onWorkerMessage; +} diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 000000000..c2450a67c --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"The Cell Ontology \u00b6 The Cell Ontology (CL) is an OBO Foundry ontology covering the domain of canonical, natural biological cell types. OLS \u00b6 The recommended way to browse the ontology is through the ontology lookup service (OLS) . Accessing CL \u00b6 The main release files can be found in our GitHub repository . The main release file can also be found here . Contributing \u00b6 To see how you can contribute to the cell ontology, please visit our Contributing page . Documentation \u00b6 The documentations here is intended for maintainers and editors of the cell ontology. For general guidance on editing OBO-(ish) ontologies, please see the obook . Cell Ontology Website \u00b6 You can also access our front facing website at https://cell-ontology.github.io/","title":"Getting started"},{"location":"#the-cell-ontology","text":"The Cell Ontology (CL) is an OBO Foundry ontology covering the domain of canonical, natural biological cell types.","title":"The Cell Ontology"},{"location":"#ols","text":"The recommended way to browse the ontology is through the ontology lookup service (OLS) .","title":"OLS"},{"location":"#accessing-cl","text":"The main release files can be found in our GitHub repository . The main release file can also be found here .","title":"Accessing CL"},{"location":"#contributing","text":"To see how you can contribute to the cell ontology, please visit our Contributing page .","title":"Contributing"},{"location":"#documentation","text":"The documentations here is intended for maintainers and editors of the cell ontology. For general guidance on editing OBO-(ish) ontologies, please see the obook .","title":"Documentation"},{"location":"#cell-ontology-website","text":"You can also access our front facing website at https://cell-ontology.github.io/","title":"Cell Ontology Website"},{"location":"Adding_classes_from_another_ontology/","text":"How to add (import) classes to the Cell Ontology (CL) from another ontology \u00b6 1. Follow steps 1 - 5 under the heading Protege-based declaration. \u00b6 NB: Even though the instructions state that this workflow is to be avoided, the other solutions in the current documentation are out of date. 2. Refresh the imports \u00b6 To refresh the imports, open Docker so it is running in the background. Then open Terminal, navigate to src/ontology directory in the cell-ontology repository and run: sh run.sh make imports/merged_import.owl Running the above command requires > 8GB RAM and sufficient computational power. If the refresh fails to complete due to hardware limitations, create a new issue in GitHub detailing which class(es) need to be imported and another editor can add it on your behalf. Once the imports are refreshed, return to Prot\u00e9g\u00e9, add the logical axioms that include the newly imported class(es) and create a pull request per standard procedure. Note that the import refresh process seems to be quite laborious/computationally expensive as-is, and a centralised database approach may be an improved longterm solution.","title":"Importing classes from another ontology"},{"location":"Adding_classes_from_another_ontology/#how-to-add-import-classes-to-the-cell-ontology-cl-from-another-ontology","text":"","title":"How to add (import) classes to the Cell Ontology (CL) from another ontology"},{"location":"Adding_classes_from_another_ontology/#1-follow-steps-1-5-under-the-heading-protege-based-declaration","text":"NB: Even though the instructions state that this workflow is to be avoided, the other solutions in the current documentation are out of date.","title":"1. Follow steps 1 - 5 under the heading Protege-based declaration."},{"location":"Adding_classes_from_another_ontology/#2-refresh-the-imports","text":"To refresh the imports, open Docker so it is running in the background. Then open Terminal, navigate to src/ontology directory in the cell-ontology repository and run: sh run.sh make imports/merged_import.owl Running the above command requires > 8GB RAM and sufficient computational power. If the refresh fails to complete due to hardware limitations, create a new issue in GitHub detailing which class(es) need to be imported and another editor can add it on your behalf. Once the imports are refreshed, return to Prot\u00e9g\u00e9, add the logical axioms that include the newly imported class(es) and create a pull request per standard procedure. Note that the import refresh process seems to be quite laborious/computationally expensive as-is, and a centralised database approach may be an improved longterm solution.","title":"2. Refresh the imports"},{"location":"Create_upper_level_slim/","text":"SOP for adding a new slim: \u00b6 Intro \u00b6 An upper slim is a set of terms for summarising annotations. CL has both a general slim and domain-specific slims allowing for the generation of general summaries or for domain specific ones. All slims have a context that covers all cells in the domain of interest. In order to fullfil the summarising use-case, a slim should have good % coverage of the domain and, if possible, avoid excluding major cell types. The following are potentially a problem for the grouping use-case: Classes in the slim with very small numbers of subclasses: Having 0-1 subclass => no capacity to summarise. Classes with disproportionately large numbers of subclasses. Overlapping classes - these clash with some types of summary - e.g. pie charts. Potential clashing concerns: It seems reasonable to want to make sure that very important cell types are covered and are not obscured in generating summaries, but this desire can clash with the considerations above. Some judgement is needed to balance these concerns. There is no perfect solution, but some solutions are better (at fulfilling the use case) than others. Name and definition \u00b6 It is important that the name of the slim accurately reflects the content it covers. Specifically, if the intention is to cover all cell types that are specific for an organ, the slim's name should be in the format of \"organ_upper_slim\". This ensures clarity and helps users understand the scope of the slim. Furthermore, the description of the slim should follow a consistent pattern. It is recommended to use the following structure: \"a subset of general classes related to specific cell types in the [organ or specific context]\". This format provides a concise and informative description of the slim, helping users identify its purpose and content. What files to create and edit \u00b6 1. Preparing the subset: \u00b6 Create XXX_upper_slim in Protege (change \"XXX\" to the subset label). See Adding a new Subset . Create a CSV table with the following characteristics (Find examples in src/templates ): 3 columns ID subset label ID AI oboInOwl:inSubset CL:####### http://purl.obolibrary.org/obo/cl#XXX_upper_slim CL term ... http://purl.obolibrary.org/obo/cl#XXX_upper_slim ... Save the CSV file with the name 'XXX_upper_slim.csv' in the src/templates directory. Modify src/ontology/cl-odk.yaml introducing new lines for the new slim (change \"XXX\" to the subset label): - id: XXX_upper_slim - filename: XXX_upper_slim.owl use_template: True templates: - XXX_upper_slim.csv ![image](https://github.com/obophenotype/cell-ontology/assets/94959119/254ad25f-7bf2-4ac2-afe2-9ad067d9c1ea) 2. Generating the Slim OWL file: \u00b6 Navigate to the src/ontology file in the terminal. Make sure Docker is running. Run the command: sh run.sh make update_repo 3. Modifying the Catalog: \u00b6 Open the src/ontology/catalog-v001.xml file. Add the following line (change \"XXX\" to the subset label):The cell ontology (CL) follows certain conventions regarding taxon constraints. +Please review the following pages before adding taxon constraints to CL terms.
+Explanation of taxon constraints can be found here: +https://oboacademy.github.io/obook/explanation/taxon-constraints-explainer/
+A how-to guide can be found here: +https://oboacademy.github.io/obook/howto/add-taxon-restrictions/
+ + + + + + +