Git Product home page Git Product logo

slicetracker's Introduction

Alt text

Overview

SliceTracker is a 3D Slicer extension designed to support the workflow of the in-bore MRI-guided targeted prostate biopsy (MRgBx) (see references below for clinical context). SliceTracker was developed and tested to support transperineal MRgBx procedure in the Advanced Multimodality Image Guided Operating (AMIGO) at the Brigham and Women's Hospital, Boston. Its applicability to other types of procedures has not been evaluated.

Capabilities of SliceTracker include:

  • automatic processing of the patient DICOM images
  • planning of the procedure (biopsy target localization)
  • calibration of the intra-procedural image frame of reference with the transperineal biopsy template
  • automated segmentation of the prostate gland
  • deformable intensity-based registration to support
  • re-identification of the pre-procedurally defined targets in the intra-procedural images
  • automated, continuous tracking of the biopsy targets during the course of the procedure
  • structured collection of the relevant data during the course of the procedure (images, results of segmentation and registration, target tracking)
  • visualization of the intra-procedural images and support of specialized hanging protocols to facilitate needle tracking, biopsy template and calibration device visualization, assessment of the image registration results, etc.

For more details, please read SliceTracker user guide.

Disclaimer

SlicerTracker, same as 3D Slicer, is a research software. SliceTracker is NOT an FDA-approved medical device. It is not intended for clinical use. The user assumes full responsibility to comply with the appropriate regulations.

Support

Please feel free to contact us for questions, feedback, suggestions, bugs, or you can create issues in the issue tracker: https://github.com/SlicerProstate/SliceTracker/issues

Acknowledgments

This is the main publication describing SliceTracker:

Herz, C., MacNeil, K., Behringer, P. A., Tokuda, J., Mehrtash, A., Mousavi, P., Kikinis, R., Fennessy, F. M., Tempany, C. M., Tuncali, K. & Fedorov, A. Open Source Platform for Transperineal In-bore MRI-guided Targeted Prostate Biopsy. IEEE Transactions on Biomedical Engineering 1–1 (2019). DOI: 10.1109/TBME.2019.2918731 PMID: 31135342

Development of SliceTracker is supported in part by the following NIH grants:

  • P41 EB015898 National Center for Image Guided Therapy (NCIGT), http://ncigt.org
  • U24 CA180918 Quantitative Image Informatics for Cancer Research (QIICR), http://qiicr.org
  • R01 CA111288 Enabling Technologies for MRI-guided prostate interventions

Several components of SliceTracker were adopted from other open source projects as follows:

References

The following publications cover different aspects of work that led to the development of SliceTracker.

  1. Behringer P., Herz C., Penzkofer T., Tuncali K., Tempany C., Fedorov A. 2015. Open-­source Platform for Prostate Motion Tracking during in­-bore Targeted MRI­-guided Biopsy. In: MICCAI Workshop on Clinical Image-based Procedures: Translational Research in Medical Imaging. DOI: 10.1007/978-3-319-31808-0_15 (also see the accompanying web site): software development, prostate motion tracking.
  2. Fedorov A., Beichel R., Kalpathy-Cramer J., Finet J., Fillion-Robin J-CC., Pujol S., Bauer C., Jennings D., Fennessy F., Sonka M., Buatti J., Aylward S., Miller J V., Pieper S., Kikinis R. 2012. 3D Slicer as an image computing platform for the Quantitative Imaging Network. Magnetic resonance imaging 30:1323–1341. DOI: 10.1016/j.mri.2012.05.001: 3D Slicer platform.
  3. Fedorov A., Tuncali K., Fennessy FM., Tokuda J., Hata N., Wells WM., Kikinis R., Tempany CM. 2012. Image registration for targeted MRI-guided transperineal prostate biopsy. Journal of magnetic resonance imaging: JMRI 36:987–992. DOI: 10.1002/jmri.23688: deformable registration approach.
  4. Penzkofer T., Tuncali K., Fedorov A., Song S-E., Tokuda J., Fennessy FM., Vangel MG., Kibel AS., Mulkern RV., Wells WM., Hata N., Tempany CMC. 2015. Transperineal in-bore 3-T MR imaging-guided prostate biopsy: a prospective clinical observational study. Radiology 274:170–180. DOI: 10.1148/radiol.14140221: clinical results.
  5. Tokuda J., Tuncali K., Iordachita I., Song S-EE., Fedorov A., Oguro S., Lasso A., Fennessy FM., Tempany CM., Hata N. 2012. In-bore setup and software for 3T MRI-guided transperineal prostate biopsy. Physics in medicine and biology 57:5823–5840. DOI: 10.1088/0031-9155/57/18/5823: procedure technical setup.

slicetracker's People

Contributors

che85 avatar fedorov avatar kmacneil0102 avatar leochan2009 avatar mehrtash avatar peterbehringer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

slicetracker's Issues

Patient Selector needed

Do we really need the patient selector? Since we load peop data, patient information can be extracted from there, right?

Anyway we need to use the DICOM data.

Bias Correction shall be done if endorectal coil was used

Since the functionality for creating bias correction does not exist in PCampReview, the user is prompted to answer if an endorectal coil was used. If so, an bias correction is directly done after selection of preop data directory in PCampReview style

Improve User Experience

Since the functionality nearly is complete, it's important to provide the best possible usability.

We need to think about:

  • Namings
  • Buttons
  • Slice Annotations
    • confusing that annotations are called PREOP and INTRAOP:
      • left: displays currently acquired image with registered BSpline volume to lay over —> COMPARISON ORIGINAL/REGISTERED
      • right: displays currently acquired image —> naming COVER PROSTATE or NEEDLE IMAGE or REGISTERED TARGETS?
  • UI element positioning
    • ...
  • Feedback
    • Specific prompts
    • (more) Guidance

Update registration parameters

As discussed on the call, bspline should be initialized with the result of affine, and no registration steps with fewer deg of freedom than affine should be enabled.

@che85 has a fix!

Intraop Directory Structure

We need to specify the directory structure for intraop data.

Case PCAMRGBX-00137_20050607_1301_20050607_1301 of @PeterBehringer has:

Intraop
-- Series
-- -- DICOM
-- -- -- DICOM files
-- -- SNAPSHOTS

Expected was:
Intraop
-- all DICOM files

Deleting cloned/registered targets while retrying segmentation causes Slicer to crash

When retrying segmentation because of failing registration, the current registration results are discarded and therefore created volumes, transforms and targets can be deleted.

Deleting the Rigid/(Affine)/BSpline cloned/transformed targets causes Slicer to crash completely

Maybe it's the way they are cloned?

Process:               Slicer [5037]
Path:                  /Applications/Slicer.app/Contents/MacOS/Slicer
Identifier:            ???
Version:               4.4.0 (4.4.0-2015-10-06)
Code Type:             X86-64 (Native)
Parent Process:        ??? [1]
Responsible:           Slicer [5037]
User ID:               501

Date/Time:             2015-10-07 14:04:28.089 -0400
OS Version:            Mac OS X 10.11 (15A284)
Report Version:        11
Anonymous UUID:        F3F400F6-F5B7-5764-17FC-E68372E411EA

Sleep/Wake UUID:       AB85E62B-825C-4F0D-8C8F-10E4F29CA5B6

Time Awake Since Boot: 10000 seconds
Time Since Wake:       3200 seconds

System Integrity Protection: enabled

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_BAD_ACCESS (SIGSEGV)
Exception Codes:       KERN_INVALID_ADDRESS at 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

VM Regions Near 0:
--> 
    __TEXT                 0000000100000000-0000000100039000 [  228K] r-x/rwx SM=COW  /Applications/Slicer.app/Contents/MacOS/Slicer

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libvtkCommon-6.3.1.dylib        0x000000010d52ab14 vtkObjectBase::GetClassName() const + 4
1   libMRMLCore.dylib               0x0000000104e59524 vtkMRMLScene::GetNodeByID(char const*) + 180
2   libMRMLCore.dylib               0x0000000104e3c329 vtkMRMLNode::UpdateReferences() + 265
3   libMRMLCore.dylib               0x0000000104e54514 vtkMRMLScene::RemoveNode(vtkMRMLNode*) + 788
4   libvtkSlicerDataModuleLogic.dylib   0x000000011c06c16c vtkSlicerDataModuleLogic::OnMRMLSceneNodeRemoved(vtkMRMLNode*) + 620
5   libMRMLLogic.dylib              0x0000000102cc43b3 vtkMRMLAbstractLogic::MRMLSceneCallback(vtkObject*, unsigned long, void*, void*) + 83
6   libvtkCommon-6.3.1.dylib        0x000000010d4308b1 vtkCallbackCommand::Execute(vtkObject*, unsigned long, void*) + 33
7   libMRMLCore.dylib               0x0000000104d83829 vtkEventBroker::InvokeObservation(vtkObservation*, unsigned long, void*) + 169
8   libMRMLCore.dylib               0x0000000104d833ff vtkEventBroker::ProcessEvent(vtkObservation*, vtkObject*, unsigned long, void*) + 111
9   libvtkCommon-6.3.1.dylib        0x000000010d4308b1 vtkCallbackCommand::Execute(vtkObject*, unsigned long, void*) + 33
10  libvtkCommon-6.3.1.dylib        0x000000010d52c1ae vtkSubjectHelper::InvokeEvent(unsigned long, void*, vtkObject*) + 1134
11  libMRMLCore.dylib               0x0000000104e542b0 vtkMRMLScene::RemoveNode(vtkMRMLNode*) + 176
12  libqMRMLWidgets.dylib           0x00000001006212db qMRMLTreeView::deleteCurrentNode() + 139
13  libqMRMLWidgets.dylib           0x000000010063cb5c qMRMLTreeView::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) + 364
14  QtCore                          0x000000010a9b22ae QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 2030
15  QtGui                           0x0000000109bc3887 QAction::activate(QAction::ActionEvent) + 151
16  QtGui                           0x0000000109f930e2 QMenuPrivate::activateCausedStack(QList<QPointer<QWidget> > const&, QAction*, QAction::ActionEvent, bool) + 66
17  QtGui                           0x0000000109f91b77 QMenuPrivate::activateAction(QAction*, QAction::ActionEvent, bool) + 503
18  QtGui                           0x0000000109f96241 QMenu::mouseReleaseEvent(QMouseEvent*) + 145
19  QtGui                           0x0000000109c151d4 QWidget::event(QEvent*) + 308
20  QtGui                           0x0000000109f9668d QMenu::event(QEvent*) + 589
21  QtGui                           0x0000000109bcc128 QApplicationPrivate::notify_helper(QObject*, QEvent*) + 264
22  QtGui                           0x0000000109bcde5f QApplication::notify(QObject*, QEvent*) + 2847
23  libqSlicerBaseQTGUI.dylib       0x000000010033cef3 qSlicerApplication::notify(QObject*, QEvent*) + 19
24  QtCore                          0x000000010a99bcb3 QCoreApplication::notifyInternal(QObject*, QEvent*) + 99
25  QtGui                           0x0000000109bcca5c QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) + 444
26  QtGui                           0x0000000109b7d136 qt_mac_handleMouseEvent(NSEvent*, QEvent::Type, Qt::MouseButton, QWidget*, bool) + 1030
27  com.apple.AppKit                0x00007fff8d34c8bf -[NSWindow _handleMouseUpEvent:isDelayedEvent:] + 119
28  com.apple.AppKit                0x00007fff8d34d559 -[NSWindow _reallySendEvent:isDelayedEvent:] + 212
29  com.apple.AppKit                0x00007fff8cd92d31 -[NSWindow sendEvent:] + 517
30  QtGui                           0x0000000109b6d1e2 -[QCocoaPanel sendEvent:] + 114
31  com.apple.AppKit                0x00007fff8cd12ccb -[NSApplication sendEvent:] + 2540
32  QtGui                           0x0000000109b79662 -[QNSApplication sendEvent:] + 82
33  com.apple.AppKit                0x00007fff8cb79f3e -[NSApplication run] + 796
34  QtGui                           0x0000000109b821a2 QEventDispatcherMac::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 994
35  QtCore                          0x000000010a999157 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 487
36  QtGui                           0x0000000109f950fa QMenu::exec(QPoint const&, QAction*) + 106
37  libqMRMLWidgets.dylib           0x000000010062037e qMRMLTreeView::mousePressEvent(QMouseEvent*) + 110
38  QtGui                           0x0000000109c151c0 QWidget::event(QEvent*) + 288
39  QtGui                           0x0000000109f565c7 QFrame::event(QEvent*) + 183
40  QtGui                           0x0000000109fd2bb8 QAbstractScrollArea::viewportEvent(QEvent*) + 120
41  QtGui                           0x000000010a052bd6 QAbstractItemView::viewportEvent(QEvent*) + 342
42  QtGui                           0x000000010a0922f4 QTreeView::viewportEvent(QEvent*) + 228
43  QtGui                           0x0000000109fd3365 QAbstractScrollAreaFilter::eventFilter(QObject*, QEvent*) + 37
44  QtCore                          0x000000010a99bf69 QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject*, QEvent*) + 105
45  QtGui                           0x0000000109bcc113 QApplicationPrivate::notify_helper(QObject*, QEvent*) + 243
46  QtGui                           0x0000000109bcde5f QApplication::notify(QObject*, QEvent*) + 2847
47  libqSlicerBaseQTGUI.dylib       0x000000010033cef3 qSlicerApplication::notify(QObject*, QEvent*) + 19
48  QtCore                          0x000000010a99bcb3 QCoreApplication::notifyInternal(QObject*, QEvent*) + 99
49  QtGui                           0x0000000109bcca5c QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) + 444
50  QtGui                           0x0000000109b7d136 qt_mac_handleMouseEvent(NSEvent*, QEvent::Type, Qt::MouseButton, QWidget*, bool) + 1030
51  com.apple.AppKit                0x00007fff8d34dcc1 -[NSWindow _reallySendEvent:isDelayedEvent:] + 2108
52  com.apple.AppKit                0x00007fff8cd92d31 -[NSWindow sendEvent:] + 517
53  QtGui                           0x0000000109b74882 -[QCocoaWindow sendEvent:] + 114
54  com.apple.AppKit                0x00007fff8cd12d5a -[NSApplication sendEvent:] + 2683
55  QtGui                           0x0000000109b79662 -[QNSApplication sendEvent:] + 82
56  com.apple.AppKit                0x00007fff8cb79f3e -[NSApplication run] + 796
57  QtGui                           0x0000000109b821a2 QEventDispatcherMac::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 994
58  QtCore                          0x000000010a999157 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 487
59  QtCore                          0x000000010a99c1de QCoreApplication::exec() + 206
60                                  0x0000000100037646 main + 7158
61                                  0x0000000100035a44 start + 52

Thread 1:: Dispatch queue: com.apple.libdispatch-manager
0   libsystem_kernel.dylib          0x00007fff955b30a2 kevent_qos + 10
1   libdispatch.dylib               0x00007fff88eb91ad _dispatch_mgr_invoke + 216
2   libdispatch.dylib               0x00007fff88eb8e15 _dispatch_mgr_thread + 52

Thread 2:
0   libsystem_kernel.dylib          0x00007fff955b22b2 __semwait_signal + 10
1   libsystem_c.dylib               0x00007fff938b9a75 nanosleep + 199
2   libsystem_c.dylib               0x00007fff938b9968 usleep + 54
3   libSlicerBaseLogic.dylib        0x0000000102ba7373 vtkSlicerApplicationLogic::ProcessProcessingTasks() + 371
4   libSlicerBaseLogic.dylib        0x0000000102ba7095 vtkSlicerApplicationLogic::ProcessingThreaderCallback(void*) + 37
5   libsystem_pthread.dylib         0x00007fff964c39b1 _pthread_body + 131
6   libsystem_pthread.dylib         0x00007fff964c392e _pthread_start + 168
7   libsystem_pthread.dylib         0x00007fff964c1385 thread_start + 13

Thread 3:
0   libsystem_kernel.dylib          0x00007fff955b22b2 __semwait_signal + 10
1   libsystem_c.dylib               0x00007fff938b9a75 nanosleep + 199
2   libsystem_c.dylib               0x00007fff938b9968 usleep + 54
3   libSlicerBaseLogic.dylib        0x0000000102ba7523 vtkSlicerApplicationLogic::ProcessNetworkingTasks() + 371
4   libSlicerBaseLogic.dylib        0x0000000102ba70c5 vtkSlicerApplicationLogic::NetworkingThreaderCallback(void*) + 37
5   libsystem_pthread.dylib         0x00007fff964c39b1 _pthread_body + 131
6   libsystem_pthread.dylib         0x00007fff964c392e _pthread_start + 168
7   libsystem_pthread.dylib         0x00007fff964c1385 thread_start + 13

Thread 4:
0   libsystem_kernel.dylib          0x00007fff955b1f5e __psynch_cvwait + 10
1   libsystem_pthread.dylib         0x00007fff964c473d _pthread_cond_wait + 767
2   QtScript                        0x0000000103242b58 QTWTF::TCMalloc_PageHeap::scavengerThread() + 88
3   QtScript                        0x0000000103242af9 QTWTF::TCMalloc_PageHeap::runScavengerThread(void*) + 9
4   libsystem_pthread.dylib         0x00007fff964c39b1 _pthread_body + 131
5   libsystem_pthread.dylib         0x00007fff964c392e _pthread_start + 168
6   libsystem_pthread.dylib         0x00007fff964c1385 thread_start + 13

Thread 5:: ctkFDHandler
0   libsystem_kernel.dylib          0x00007fff955b350a read + 10
1   libCTKCore.0.1.dylib            0x0000000103433d01 ctkFDHandler::run() + 97
2   QtCore                          0x000000010a8a4b68 QThreadPrivate::start(void*) + 504
3   libsystem_pthread.dylib         0x00007fff964c39b1 _pthread_body + 131
4   libsystem_pthread.dylib         0x00007fff964c392e _pthread_start + 168
5   libsystem_pthread.dylib         0x00007fff964c1385 thread_start + 13

Thread 6:: ctkFDHandler
0   libsystem_kernel.dylib          0x00007fff955b350a read + 10
1   libCTKCore.0.1.dylib            0x0000000103433d01 ctkFDHandler::run() + 97
2   QtCore                          0x000000010a8a4b68 QThreadPrivate::start(void*) + 504
3   libsystem_pthread.dylib         0x00007fff964c39b1 _pthread_body + 131
4   libsystem_pthread.dylib         0x00007fff964c392e _pthread_start + 168
5   libsystem_pthread.dylib         0x00007fff964c1385 thread_start + 13

Thread 7:
0   libsystem_kernel.dylib          0x00007fff955b1f5e __psynch_cvwait + 10
1   libsystem_pthread.dylib         0x00007fff964c473d _pthread_cond_wait + 767
2   QtWebKit                        0x00000001013dbca8 WTF::TCMalloc_PageHeap::scavengerThread() + 88
3   QtWebKit                        0x00000001013dbc49 WTF::TCMalloc_PageHeap::runScavengerThread(void*) + 9
4   libsystem_pthread.dylib         0x00007fff964c39b1 _pthread_body + 131
5   libsystem_pthread.dylib         0x00007fff964c392e _pthread_start + 168
6   libsystem_pthread.dylib         0x00007fff964c1385 thread_start + 13

Thread 8:: QThread
0   libsystem_kernel.dylib          0x00007fff955b2222 __select + 10
1   QtCore                          0x000000010a9c46c6 qt_safe_select(int, fd_set*, fd_set*, fd_set*, timeval const*) + 70
2   QtCore                          0x000000010a9c78a3 QEventDispatcherUNIXPrivate::doSelect(QFlags<QEventLoop::ProcessEventsFlag>, timeval*) + 803
3   QtCore                          0x000000010a9c91a1 QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 225
4   QtCore                          0x000000010a999157 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 487
5   QtCore                          0x000000010a8a2f3f QThread::exec() + 223
6   QtCore                          0x000000010a8a4b68 QThreadPrivate::start(void*) + 504
7   libsystem_pthread.dylib         0x00007fff964c39b1 _pthread_body + 131
8   libsystem_pthread.dylib         0x00007fff964c392e _pthread_start + 168
9   libsystem_pthread.dylib         0x00007fff964c1385 thread_start + 13

Thread 9:: com.apple.NSEventThread
0   libsystem_kernel.dylib          0x00007fff955acc96 mach_msg_trap + 10
1   libsystem_kernel.dylib          0x00007fff955ac0d7 mach_msg + 55
2   com.apple.CoreFoundation        0x00007fff88f6b024 __CFRunLoopServiceMachPort + 212
3   com.apple.CoreFoundation        0x00007fff88f6a4ec __CFRunLoopRun + 1356
4   com.apple.CoreFoundation        0x00007fff88f69d38 CFRunLoopRunSpecific + 296
5   com.apple.AppKit                0x00007fff8ccdbeed _NSEventThread + 149
6   libsystem_pthread.dylib         0x00007fff964c39b1 _pthread_body + 131
7   libsystem_pthread.dylib         0x00007fff964c392e _pthread_start + 168
8   libsystem_pthread.dylib         0x00007fff964c1385 thread_start + 13

Thread 10:: QProcessManager
0   libsystem_kernel.dylib          0x00007fff955b2222 __select + 10
1   QtCore                          0x000000010a97308f QProcessManager::run() + 191
2   QtCore                          0x000000010a8a4b68 QThreadPrivate::start(void*) + 504
3   libsystem_pthread.dylib         0x00007fff964c39b1 _pthread_body + 131
4   libsystem_pthread.dylib         0x00007fff964c392e _pthread_start + 168
5   libsystem_pthread.dylib         0x00007fff964c1385 thread_start + 13

Thread 11:: com.apple.CFSocket.private
0   libsystem_kernel.dylib          0x00007fff955b2222 __select + 10
1   com.apple.CoreFoundation        0x00007fff88fa829a __CFSocketManager + 762
2   libsystem_pthread.dylib         0x00007fff964c39b1 _pthread_body + 131
3   libsystem_pthread.dylib         0x00007fff964c392e _pthread_start + 168
4   libsystem_pthread.dylib         0x00007fff964c1385 thread_start + 13

Thread 12:: QKqueueFileSystemWatcherEngine
0   libsystem_kernel.dylib          0x00007fff955b3072 kevent + 10
1   QtCore                          0x000000010a980ab9 QKqueueFileSystemWatcherEngine::run() + 137
2   QtCore                          0x000000010a8a4b68 QThreadPrivate::start(void*) + 504
3   libsystem_pthread.dylib         0x00007fff964c39b1 _pthread_body + 131
4   libsystem_pthread.dylib         0x00007fff964c392e _pthread_start + 168
5   libsystem_pthread.dylib         0x00007fff964c1385 thread_start + 13

Thread 13:
0   libsystem_kernel.dylib          0x00007fff955b278a __workq_kernreturn + 10
1   libsystem_pthread.dylib         0x00007fff964c358c _pthread_wqthread + 1283
2   libsystem_pthread.dylib         0x00007fff964c1375 start_wqthread + 13

Thread 14:
0   libsystem_kernel.dylib          0x00007fff955b278a __workq_kernreturn + 10
1   libsystem_pthread.dylib         0x00007fff964c358c _pthread_wqthread + 1283
2   libsystem_pthread.dylib         0x00007fff964c1375 start_wqthread + 13

Thread 0 crashed with X86 Thread State (64-bit):
  rax: 0x00007fff5fbfd1b0  rbx: 0x00007fff5fbfd1b0  rcx: 0x0000000000000058  rdx: 0x0000000000000000
  rdi: 0x0000000000000000  rsi: 0x0000000104f82714  rbp: 0x00007fff5fbfd180  rsp: 0x00007fff5fbfd180
   r8: 0x0000000000000000   r9: 0x0000000000000004  r10: 0x0000000000000000  r11: 0x000000003a42d643
  r12: 0x00000001438a7010  r13: 0x0000000000000000  r14: 0x0000000000000000  r15: 0x0000000000000000
  rip: 0x000000010d52ab14  rfl: 0x0000000000010246  cr2: 0x0000000000000000

Logical CPU:     2
Error Code:      0x00000004
Trap Number:     14

Notify user if input data is missing

When choosing a preop data directory which doesn't include the expected files

(Targets.fcsv, t2ax.nrrd, t2-label.nrrd, t2-N4.nrrd), the user shall be notified about that with additional information about namings

Switching between steps

Make sure that restrictions for switching between steps work properly and has restrictions.

For instance going from Registration back to Create Label and then forward to Registration still has the same Layout of Create Label...

PatientWatchBox displays the current date

The PatientWatchBox should display information retrieved from the DICOM database. The study date actually is the current date, which should also be retrieved from DICOM...

image

Change of Registration result from dropdown in evaluation step shall not reset to BSpline

Resetting to BSpline registration result displaying is not helpful when comparing different results

For instance: "Needle image 2 fails and user retries with manual segmentation and wants to compare with the failed needle image" - expectation would be: user clicks on "Show Rigid Result" and then switches to retried registration result, the viewer should still show the rigid result and not switch to BSpline

If possible it should also show the same position..?

label creation

  • additional "cancel" button for QuickMode
  • arrow icons for forward and backward buttons

Remove PatientSelector by only using DICOM from preop

Instead of using a patient selector, the patient information should be retrieved from the preop data:

  • below the PCampReview directory structure, we also can find DICOM files (organizing DICOM with PCampReviewProcessor should be a requirement)
  • retrieving the information from the very first DICOM file should work fine and we can get rid of the patient selector and doing proper checking of patientID between preop and intraop data selection

This issue is marked as high because it's very important that preop and intraop belong to the same patient.

Preop directory selection

When selecting the preop directory, the file data structure must be parsed depending on the structure used for saving in PCampReview Preprocessor: https://github.com/fedorov/PCampReview

This file data structure is as follows:

RESOURCES
|-- ##
|-- DICOM
|-- Reconstructions
|-- ##.nrrd
|-- ##.xml
|-- e.g. WholeGland.nrrd
|-- ...

In order to use the right reconstruction and possible segmentations. All case directories must be parsed for the right t2ax image. If next to this nrrd file are other segmentations found, then these labels should be provided within the module. The user shall be able to select the labels which later can be used to create preop segmentations.

Update Layout

in Registration Step:

  • recentering of preop image

in Evaluation Step:

  • when result buttons are clicked
  • recentering of preop image
  • red text annotation for preop intraop

evaluation - troubleshooting

In the case of registration failure due to large prostate motion, software workflow allows for manual segmentation of the needle image. A button "Re-Register again with manual mask", where the user is guided to "step 2: create label" and then re-registration is performed needs to be implemented.

Check if a series already has been registered once

When a series already was used during the registration process and the user did not start the whole process from the beginning, there should be a warning, that the selected series has already been used.

Otherwise the user could accidentally select a needle guided series which already was registered....

This could be done by holding a list of SeriesInstanceUIDs

Error Checking

  • We cannot expect the user to always select everything correct
  • The current state of that module is:
    -- no checks if directories or files exist
    -- expectations of filenames which can vary, e.g. "t2-label.nrrd" and "t2ax-label.nrrd"
    -- especially no checking for valid nodes that hinder the execution, e.g. if "t2-label.nrrd" could not be loaded...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.