slicerprostate / slicetracker Goto Github PK
View Code? Open in Web Editor NEWSliceTracker is a 3D Slicer extension to support the workflow of MR-guided prostate biopsies.
Home Page: https://slicerprostate.gitbooks.io/slicetracker
License: Other
SliceTracker is a 3D Slicer extension to support the workflow of MR-guided prostate biopsies.
Home Page: https://slicerprostate.gitbooks.io/slicetracker
License: Other
While creating segmentation, the user is required to set fiducials/markups for creation of the surface. When the user creates only fiducials/markups in one slice, no surface is created...
Solution: adding check for fiducials/markups to see if min one fiducial/markup is positioned within another slice.
While patients can move a lot during cases, it's appropriate to provide the possibility to recreate the segmentation for the "difficult" needle image.
Labels made problems when created since there was a new node type invented.
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.
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...
When user sets tip in evaluation step:
@che85 lets talk about this today
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
When calling CLI between each CLI call shall be some feedback given for the user to display that the application did not get stuck and is making progress..
Since the functionality nearly is complete, it's important to provide the best possible usability.
We need to think about:
While being in tab 2 label creation and selecting another reference volume, the actual displayed volume does not change and segmentation is still done on the initially set reference volume!
Button activated when:
a) preop data valid AND
b) intraop selected AND
c) at least one series is selected
Changes of project week needs to be merged
The user is only notified about differences between the selected patient ID and the intraop data which is not valid. The user could also select a preop directory with data of a completely different patient.
The user should not be allowed to select multiple series for Re-Registration.
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!
Instead of using a patient selector, the patient information should be retrieved from the preop data:
This issue is marked as high because it's very important that preop and intraop belong to the same patient.
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..?
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
Since SliceTracker is dependent to VolumeClip extension
in Registration Step:
in Evaluation Step:
Changing the selector or preop/intraop volume/labels should also updated displayed side by side viewers. For instance if the prostate has been segmented twice, the user shall be able to select the different segmentations before registration and the most important aspect is hier the viewers update.
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.
for instance:
proposal:
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
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.
After new data has been arrived, the series listview should still show all available series and not only the new arrived series
When setting the needle tip and afterwards looking at other registration results like rigid/affine/BSpline the needle tip remains in the same position but the actual target from the preop data moves.
The user should be able to skip a needle image where it doesn't make sense to retry registration with manual segmentation.
A button "skip" should be available.
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
see Modules/Scripted/DICOMLib/DICOMProcesses.py line 115
User needs to be notified that connection to DICOM workstation is estabilshed (using echoscu DCMTK tool)
Currently it seems that the logic depends or uses methods of the widget.
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.