Difference between revisions of "CTSC Slicer XNE"
Line 69: | Line 69: | ||
* Subject: { All SubjectIDs} (eventually a checkbox for "include shared subjects") | * Subject: { All SubjectIDs} (eventually a checkbox for "include shared subjects") | ||
* Experiments: { All ExperimentIDs } (eventually a checkbox for "include shared experiments") | * Experiments: { All ExperimentIDs } (eventually a checkbox for "include shared experiments") | ||
− | + | ** Scans: { } | |
− | + | ** Reconstructions: { } | |
− | + | ** Assessors: { } | |
− | |||
** Non-imaging Assessments: { } | ** Non-imaging Assessments: { } | ||
− | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects?format=xml --cookie JSESSIONID=$ | + | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects?format=xml --cookie JSESSIONID=$JsessionID |
'''parse response''' into list of SubjectIDs | '''parse response''' into list of SubjectIDs | ||
for each id in list of SubjectIDs | for each id in list of SubjectIDs | ||
{ | { | ||
− | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$id/experiments?format=xml --cookie JSESSIONID=$ | + | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$id/experiments?format=xml --cookie JSESSIONID=$JSessionID |
'''parse response''' and add to list of ExperimentIDs | '''parse response''' and add to list of ExperimentIDs | ||
} | } | ||
Line 88: | Line 87: | ||
* Subject: $SubjectID | * Subject: $SubjectID | ||
* Experiments: { All for $SubjectID } | * Experiments: { All for $SubjectID } | ||
− | + | ** Scans: { Allfor $SubjectID } | |
− | + | ** Reconstructions: { All for $SubjectID } | |
− | + | ** Assessors: { All for $SubjectID } | |
− | |||
** Non-imaging Assessments: { All for $SubjectID } | ** Non-imaging Assessments: { All for $SubjectID } | ||
− | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/$SubjectID/experiments?format=xml --cookie JSESSIONID=$ | + | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/$SubjectID/experiments?format=xml --cookie JSESSIONID=$JsessionID |
'''parse response''' into list of ExperimentIDs | '''parse response''' into list of ExperimentIDs | ||
for each id in list of ExperimentIDs | for each id in list of ExperimentIDs | ||
{ | { | ||
− | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$ | + | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$id/scans?format=xml --cookie JSESSIONID=$JSessionID |
'''parse response''' and add to list of ScanIDs | '''parse response''' and add to list of ScanIDs | ||
− | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$ | + | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$id/reconstructions?format=xml --cookie JSESSIONID=$JSessionID |
'''parse response''' and add to list of ReconstructionIDs | '''parse response''' and add to list of ReconstructionIDs | ||
− | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$ | + | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$idD/assessors?format=xml --cookie JSESSIONID=$JSessionID |
'''parse response''' and add to list of AssessorIDs | '''parse response''' and add to list of AssessorIDs | ||
} | } | ||
Line 110: | Line 108: | ||
* Subject: { All for $ExperimentID } | * Subject: { All for $ExperimentID } | ||
* Experiments: $ExperimentID | * Experiments: $ExperimentID | ||
− | + | ** Scans: { All for $ExperimentID } | |
− | + | ** Reconstructions: { All for $ExperimentID } | |
− | + | ** Assessors: { All for $ExperimentID } | |
− | |||
** Non-imaging Assessments: { All for $ExperimentID } | ** Non-imaging Assessments: { All for $ExperimentID } | ||
+ | |||
+ | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/experiments/$ExperimentID/subjects?format=xml --cookie JSESSIONID=$JsessionID | ||
+ | '''parse response''' into list of SubjectIDs | ||
+ | for each id in list of SubjectIDs | ||
+ | { | ||
+ | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$id/experiments/$ExperimentID/scans?format=xml --cookie JSESSIONID=$JSessionID | ||
+ | '''parse response''' and add to list of ScanIDs | ||
+ | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$id/experiments/$ExperimentID/reconstructions?format=xml --cookie JSESSIONID=$JSessionID | ||
+ | '''parse response''' and add to list of ReconstructionIDs | ||
+ | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$id/experiments/$ExperimentID/assessors?format=xml --cookie JSESSIONID=$JSessionID | ||
+ | '''parse response''' and add to list of AssessorIDs | ||
+ | } | ||
+ | update GUI | ||
Line 120: | Line 130: | ||
* Subject: $SubjectIDs | * Subject: $SubjectIDs | ||
* Experiments: $ExperimentID | * Experiments: $ExperimentID | ||
− | + | ** Scans: { All for $SubjectID && $ExperimentID } | |
− | + | ** Reconstructions: { Focused for $SubjectID && $ExperimentID } | |
− | + | ** Assessors: { Focused for $SubjectID && $ExperimentID } | |
− | + | ** Non-imaging Assessments: { Focused for $SubjectID && $ExperimentID } | |
− | ** Non-imaging Assessments: { | ||
+ | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$ExperimentID/scans?format=xml --cookie JSESSIONID=$JSessionID | ||
+ | '''parse response''' and add to list of ScanIDs | ||
+ | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$ExperimentID/reconstructions?format=xml --cookie JSESSIONID=$JSessionID | ||
+ | '''parse response''' and add to list of ReconstructionIDs | ||
+ | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$ExperimentID/assessors?format=xml --cookie JSESSIONID=$JSessionID | ||
+ | '''parse response''' and add to list of AssessorIDs | ||
+ | update GUI | ||
− | ''''' 7d. A | + | |
+ | ''''' 7d. A ScanID is selected; Filters are updated''''' | ||
* Subject: $SubjectIDs | * Subject: $SubjectIDs | ||
* Experiments: $ExperimentID | * Experiments: $ExperimentID | ||
− | + | ** Scans: { $ScanID } | |
− | + | ** Reconstructions: { } | |
− | + | ** Assessors: { } | |
− | + | ** Non-imaging Assessments: { } | |
− | ** Non-imaging Assessments: { | + | |
+ | |||
+ | '''query:''' curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$ExperimentID/scans/$ScanID/format=xml --cookie JSESSIONID=$JSessionID | ||
+ | '''parse response''' and add to list of ScanIDs | ||
+ | update GUI | ||
=== 8. Example Query XNAT for All Scans for Selected Experiment === | === 8. Example Query XNAT for All Scans for Selected Experiment === |
Revision as of 18:28, 4 August 2009
Home < CTSC Slicer XNEContents
- 1 UXP & functionality planning for Slicer's XNE client
- 1.1 Workflow & Implementation approaches
- 1.1.1 All Workflow Steps:
- 1.1.2 1. Select XNAT Enterprise Server
- 1.1.3 2. Authentication Dialog Presented
- 1.1.4 3. Process Dialog Input
- 1.1.5 4. Query XNAT for Projects Available to User
- 1.1.6 5. User Selects One Project
- 1.1.7 6. Query XNAT for Subjects in Selected Project
- 1.1.8 7. User Selects One Subject, Configures Filters to Narrow Search & Selects Search
- 1.1.9 8. Example Query XNAT for All Scans for Selected Experiment
- 1.1.10 9. User Selects One Scan and Clicks Download
- 1.1.11 10. Scan is Loaded into Slicer
- 1.1 Workflow & Implementation approaches
UXP & functionality planning for Slicer's XNE client
Workflow & Implementation approaches
All Workflow Steps:
- Select XNAT Enterprise server
- Authentication dialog presented
- Dialog input is processed
- XNAT queried for projects
- response is checked for http error codes
- xml parsed to get list of projects
- GUI populated
- One project selected
- XNAT queried for subjects in that project
- response is checked for http error codes
- xml parsed to get list of subjects
- GUI populated
- One subject and filters selected to narrow search
- User selects "search" for all scans
- XNAT queried for appropriate scans
- response is checked for http error codes
- xml is parsed to get list of scans
- GUI is populated
- User selects one scan and "download"
- Scan is loaded into Slicer
Each step is detailed below.
1. Select XNAT Enterprise Server
This sets the current URI handler to be the XNE_HttpHandler for subsequent REST-based client calls to XNE web services.
2. Authentication Dialog Presented
- Enter user name and password
3. Process Dialog Input
- Save the username (XNE_UserName) and password (XNE_Password)
- Authenticate and create a session:
curl -d POST $XNE_Svr/REST/JSESSION -u $XNE_UserName:$XNE_Password
4. Query XNAT for Projects Available to User
- XNAT queried for appropriate projects
curl $XNE_Srv/REST/projects?format=xml --cookie JSESSIONID=$sessionID
- response is checked for http error codes
- if error is found, report to user
- else xml is parsed to get list of scans
5. User Selects One Project
6. Query XNAT for Subjects in Selected Project
- XNAT queried for appropriate subjects
curl $XNE_Svr/REST/projects/$projectID/subjects?format=xml --cookie JSESSIONID=$sessionID
- response is checked for http error codes
- if error is found, report to user
- else xml is parsed to get list of scans
7. User Selects One Subject, Configures Filters to Narrow Search & Selects Search
Presents a search that only requires SubjectID or ExperimentID to be selected in order to populate the list of scans, but each additional selection (corresponding to the basic XNE data model) can be used to focus the search:
7a. Initial Presentation
- Subject: { All SubjectIDs} (eventually a checkbox for "include shared subjects")
- Experiments: { All ExperimentIDs } (eventually a checkbox for "include shared experiments")
- Scans: { }
- Reconstructions: { }
- Assessors: { }
- Non-imaging Assessments: { }
query: curl $XNE_Svr/REST/projects/$ProjectID/subjects?format=xml --cookie JSESSIONID=$JsessionID parse response into list of SubjectIDs for each id in list of SubjectIDs { query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$id/experiments?format=xml --cookie JSESSIONID=$JSessionID parse response and add to list of ExperimentIDs } update GUI
7b1. Just a Subject ID is selected; Filters are updated
- Subject: $SubjectID
- Experiments: { All for $SubjectID }
- Scans: { Allfor $SubjectID }
- Reconstructions: { All for $SubjectID }
- Assessors: { All for $SubjectID }
- Non-imaging Assessments: { All for $SubjectID }
query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/$SubjectID/experiments?format=xml --cookie JSESSIONID=$JsessionID parse response into list of ExperimentIDs for each id in list of ExperimentIDs { query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$id/scans?format=xml --cookie JSESSIONID=$JSessionID parse response and add to list of ScanIDs query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$id/reconstructions?format=xml --cookie JSESSIONID=$JSessionID parse response and add to list of ReconstructionIDs query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$idD/assessors?format=xml --cookie JSESSIONID=$JSessionID parse response and add to list of AssessorIDs } update GUI
7b2. OR, just an Experiment ID is selected; Filters are updated
- Subject: { All for $ExperimentID }
- Experiments: $ExperimentID
- Scans: { All for $ExperimentID }
- Reconstructions: { All for $ExperimentID }
- Assessors: { All for $ExperimentID }
- Non-imaging Assessments: { All for $ExperimentID }
query: curl $XNE_Svr/REST/projects/$ProjectID/experiments/$ExperimentID/subjects?format=xml --cookie JSESSIONID=$JsessionID parse response into list of SubjectIDs for each id in list of SubjectIDs { query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$id/experiments/$ExperimentID/scans?format=xml --cookie JSESSIONID=$JSessionID parse response and add to list of ScanIDs query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$id/experiments/$ExperimentID/reconstructions?format=xml --cookie JSESSIONID=$JSessionID parse response and add to list of ReconstructionIDs query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$id/experiments/$ExperimentID/assessors?format=xml --cookie JSESSIONID=$JSessionID parse response and add to list of AssessorIDs } update GUI
7c. Both SubjectID && Experiment ID have been selected; Filters are updated
- Subject: $SubjectIDs
- Experiments: $ExperimentID
- Scans: { All for $SubjectID && $ExperimentID }
- Reconstructions: { Focused for $SubjectID && $ExperimentID }
- Assessors: { Focused for $SubjectID && $ExperimentID }
- Non-imaging Assessments: { Focused for $SubjectID && $ExperimentID }
query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$ExperimentID/scans?format=xml --cookie JSESSIONID=$JSessionID parse response and add to list of ScanIDs query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$ExperimentID/reconstructions?format=xml --cookie JSESSIONID=$JSessionID parse response and add to list of ReconstructionIDs query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$ExperimentID/assessors?format=xml --cookie JSESSIONID=$JSessionID parse response and add to list of AssessorIDs update GUI
7d. A ScanID is selected; Filters are updated
- Subject: $SubjectIDs
- Experiments: $ExperimentID
- Scans: { $ScanID }
- Reconstructions: { }
- Assessors: { }
- Non-imaging Assessments: { }
query: curl $XNE_Svr/REST/projects/$ProjectID/subjects/subjects/$SubjectID/experiments/$ExperimentID/scans/$ScanID/format=xml --cookie JSESSIONID=$JSessionID parse response and add to list of ScanIDs update GUI
8. Example Query XNAT for All Scans for Selected Experiment
- XNAT queried for appropriate scans
curl $XNE_Svr/REST/projects/$ProjectID/subjects/$SubjectID/experiments/$ExpID/scans?format=xml --cookie JSESSION=$sessionID
- response is checked for http error codes
- if error is found, report to user
- else xml is parsed to get list of scans
9. User Selects One Scan and Clicks Download
curl $XNE_Svr/projects/$ProjectID/subjects/$SubjectID/experiments/$ExpID/scans/$ScanID/resources/DICOM/files
This returns a list of URIs which Slicer uses to populate a vtkMRMLVolumeArchetypeStorageNode:URI and vtkMRMLVolumeArchetypeStorageNode::URIListMembers
10. Scan is Loaded into Slicer
vtkMRMLVolumeArchetypeStorageNode::ReadData( vtkMRMLVolumeArchetypeStorage *node) is called, which calls vtkMRMLStorageNode::StageReadData (*node) to download data using the XNE_HttpHandler.