[ENH] Add /imaging-modalities route for getting available imaging modality term instances & labels#513
Conversation
Reviewer's GuideAdds a new /imaging-modalities API surface built on the existing route factory, wires it into the app and configuration fetching, and extends term retrieval logic to enrich imaging modality term instances with vocabulary-derived metadata such as abbreviation and data_type, with corresponding tests. Sequence diagram for the new /imaging-modalities term instance retrievalsequenceDiagram
actor Client
participant FastAPIApp
participant ImagingModalitiesRouter
participant RouteFactory
participant GetInstancesHandler
participant CRUD as CRUD_get_terms
participant VocabConfig
Client->>FastAPIApp: GET /imaging-modalities
FastAPIApp->>ImagingModalitiesRouter: Route request
activate ImagingModalitiesRouter
ImagingModalitiesRouter->>RouteFactory: create_get_instances_handler(DataElementURI.image)
RouteFactory-->>ImagingModalitiesRouter: GetInstancesHandler
ImagingModalitiesRouter->>GetInstancesHandler: Invoke handler
deactivate ImagingModalitiesRouter
activate GetInstancesHandler
GetInstancesHandler->>VocabConfig: Load standardized vocabulary for Image
VocabConfig-->>GetInstancesHandler: namespace_terms for nb:Image
GetInstancesHandler->>CRUD: get_terms(data_element_URI="nb:Image")
activate CRUD
CRUD->>CRUD: Build term_label_dicts
CRUD->>CRUD: Find matched_term in namespace_terms by term_id
CRUD->>CRUD: Create term_entry with TermURL and Label
CRUD->>CRUD: Add abbreviation and data_type when data_element_URI is nb:Image
CRUD-->>GetInstancesHandler: list of term_entry objects
deactivate CRUD
GetInstancesHandler-->>FastAPIApp: JSON response with imaging modality term instances
deactivate GetInstancesHandler
FastAPIApp-->>Client: 200 OK with enriched imaging modality terms
Updated class diagram for DataElementURI and imaging modalities routingclassDiagram
class DataElementURI {
<<enumeration>>
assessment : str = "nb:Assessment"
diagnosis : str = "nb:Diagnosis"
image : str = "nb:Image"
}
class StandardizedTermVocabularyNamespace {
+str prefix
+str uri
+str label
}
class StandardizedTermVocabularyResponse {
+list~StandardizedTermVocabularyNamespace~ namespaces
}
class ImagingModalitiesRouter {
+GET_imaging_modalities()
+GET_imaging_modalities_vocab() StandardizedTermVocabularyResponse
}
class RouteFactory {
+create_get_instances_handler(data_element_uri: str)
+create_get_vocab_handler(data_element_uri: str)
}
DataElementURI <.. ImagingModalitiesRouter : uses
RouteFactory <.. ImagingModalitiesRouter : uses
StandardizedTermVocabularyResponse <.. ImagingModalitiesRouter : returns
StandardizedTermVocabularyNamespace <.. StandardizedTermVocabularyResponse : contains
File-Level Changes
Assessment against linked issues
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #513 +/- ##
==========================================
+ Coverage 96.87% 96.94% +0.06%
==========================================
Files 32 33 +1
Lines 1152 1177 +25
==========================================
+ Hits 1116 1141 +25
Misses 36 36 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
alyssadai
left a comment
There was a problem hiding this comment.
Thanks @rmanaem! I haven't tested this out locally, but the logic all makes sense to me 🎉
I left some suggestions mostly related to renaming some local variables for easier maintenance, since this will be our first instances endpoint that returns term metadata other than just labels + URIs, and some minor refactoring to reduce duplication.
Approving now, but feel free to re-request a review if you want another pair of eyes on the changes!
|
🚀 PR was released in |
/imaging-modalitiesroute for getting available imaging modality term instances & labels #502Changes proposed in this pull request:
Example response from instances endpoint:
{ "nb:Image": [ { "TermURL": "nidm:T1Weighted", "Label": "T1-weighted image", "abbreviation": "T1w", "data_type": "anat" }, { "TermURL": "nidm:FlowWeighted", "Label": "Blood-Oxygen-Level Dependent image", "abbreviation": "bold", "data_type": "func" } ] }Example response from vocab endpoint:
[ { "vocabulary_name": "Neurobagel vocabulary of imaging modality terms", "namespace_url": "http://purl.org/nidash/nidm#", "namespace_prefix": "nidm", "version": "1.0.0", "terms": [ { "name": "T1-weighted image", "id": "T1Weighted", "abbreviation": "T1w", "data_type": "anat" }, { "name": "T2-weighted image", "id": "T2Weighted", "abbreviation": "T2w", "data_type": "anat" }, { "name": "Diffusion-weighted image", "id": "DiffusionWeighted", "abbreviation": "dwi", "data_type": "anat" }, { "name": "Blood-Oxygen-Level Dependent image", "id": "FlowWeighted", "abbreviation": "bold", "data_type": "func" }, { "name": "Arterial Spin Labeling", "id": "ArterialSpinLabeling", "abbreviation": "asl", "data_type": "perf" }, { "name": "Electroencephalography", "id": "Electroencephalography", "abbreviation": "eeg", "data_type": "eeg" }, { "name": "Magnetoencephalography", "id": "Magnetoencephalography", "abbreviation": "meg", "data_type": "meg" }, { "name": "Positron Emission Tomography", "id": "PositronEmissionTomography", "abbreviation": "pet", "data_type": "pet" } ] } ]Checklist
This section is for the PR reviewer
[ENH],[FIX],[REF],[TST],[CI],[MNT],[INF],[MODEL],[DOC]) (see our Contributing Guidelines for more info)skip-release(to be applied by maintainers only)Closes #XXXXFor new features:
For bug fixes:
Summary by Sourcery
Add an imaging modalities API surface and extend term instance metadata to support imaging-specific fields.
New Features:
Enhancements:
Tests: