diff --git a/src/dataset/RTTFibers.cpp b/src/dataset/RTTFibers.cpp index bd7fcc3f..35275b07 100644 --- a/src/dataset/RTTFibers.cpp +++ b/src/dataset/RTTFibers.cpp @@ -35,16 +35,20 @@ RTTFibers::RTTFibers() m_FAThreshold( 0.20f ), m_angleThreshold( 35.0f ), m_step( 1.0f ), + m_GMstep( 15 ), m_nbSeed ( 10.0f ), m_nbMeshPt ( 0 ), m_puncture( 0.2f ), m_vinvout( 0.2f ), - m_minFiberLength( 90 ), + m_minFiberLength( 60 ), m_maxFiberLength( 200 ), m_alpha( 1.0f ), m_isHARDI( false ), + m_countGMstep( 0 ), m_stop( false ), - m_pExcludeInfo( NULL ) + m_pExcludeInfo( NULL ), + m_pSeedMapInfo( NULL ), + m_pGMInfo( NULL ) { } @@ -618,7 +622,12 @@ Vector RTTFibers::advecIntegrateHARDI( Vector vin, const std::vector &sti float angleMin = 360.0f; float angle = 0.0f; float puncture = m_vinvout; - float fa = m_pMaskInfo->at(s_number); + float wm = m_pMaskInfo->at(s_number); + float gm = 0; + if(m_pGMInfo != NULL) + { + gm = m_pGMInfo->at(s_number); + } vin.normalize(); for(unsigned int i=0; i < sticks.size()/3; i++) @@ -644,8 +653,12 @@ Vector RTTFibers::advecIntegrateHARDI( Vector vin, const std::vector &sti } } - Vector res = fa * vOut + (1.0 - fa) * ( (1.0 - puncture ) * vin + puncture * vOut); - res.normalize(); + Vector res = 0.5f * wm * vOut + (0.5f * wm) * ( (1.0 - puncture ) * vin + puncture * vOut); + + if(gm != 0) + { + res = (1.0 - gm) * vOut + (gm) * ( (1.0 - puncture ) * vin + puncture * vOut); + } return res; } @@ -1016,10 +1029,23 @@ bool RTTFibers::checkExclude( unsigned int sticksNumber) bool RTTFibers::withinMapThreshold(unsigned int sticksNumber) { bool isOk = false; - - if(m_pMaskInfo->at(sticksNumber) > m_FAThreshold && checkExclude(sticksNumber)) + float gmVal = 0; + if(m_pGMInfo != NULL) + { + gmVal = m_pGMInfo->at(sticksNumber); + if(gmVal > 0) + { + m_countGMstep++; + } + else + { + m_countGMstep = 0; + } + } + + if((m_pMaskInfo->at(sticksNumber) > m_FAThreshold || gmVal > m_FAThreshold) && checkExclude(sticksNumber) && m_countGMstep < m_GMstep) { - isOk = true; + isOk = true; } return isOk; @@ -1061,6 +1087,8 @@ void RTTFibers::performHARDIRTT(Vector seed, int bwdfwd, vector& points, sticksNumber = currVoxelz * columns * rows + currVoxely *columns + currVoxelx; std::vector sticks; + m_countGMstep = 0; + if( sticksNumber < m_pMaximasInfo->getMainDirData()->size() && m_pMaximasInfo->getMainDirData()->at(sticksNumber)[0] != 0 && withinMapThreshold(sticksNumber) && !m_stop) { bool initWithDir = RTTrackingHelper::getInstance()->isInitSeed(); diff --git a/src/dataset/RTTFibers.h b/src/dataset/RTTFibers.h index 704240ce..a8d4a6ab 100644 --- a/src/dataset/RTTFibers.h +++ b/src/dataset/RTTFibers.h @@ -47,6 +47,7 @@ class RTTFibers void setPuncture( float puncture ) { m_puncture = puncture; } void setVinVout( float vinvout ) { m_vinvout = vinvout; } void setStep( float step ) { m_step = step; } + void setGMStep( float step ) { m_GMstep = step; } void setIsHardi( bool method ) { m_isHARDI = method; } void setNbSeed ( float nbSeed ) { m_nbSeed = nbSeed; } void setMinFiberLength( float minLength ) { m_minFiberLength = minLength; } @@ -55,6 +56,7 @@ class RTTFibers void setHARDIInfo( Maximas* info ) { m_pMaximasInfo = info; } void setShellInfo( DatasetInfo* info ) { m_pShellInfo = info; } void setMaskInfo( Anatomy* info ) { m_pMaskInfo = info; } + void setGMInfo( Anatomy* info ) { m_pGMInfo = info; } void setInitSeed( Vector init ) { m_initVec = init; } void setOpacity( float alpha ) { m_alpha = alpha; } @@ -96,6 +98,7 @@ class RTTFibers float m_FAThreshold; float m_angleThreshold; float m_step; + int m_GMstep; float m_nbSeed; float m_nbMeshPt; float m_puncture; @@ -103,12 +106,14 @@ class RTTFibers float m_minFiberLength; float m_maxFiberLength; bool m_isHARDI; + float m_countGMstep; Tensors *m_pTensorsInfo; Maximas *m_pMaximasInfo; DatasetInfo *m_pShellInfo; Anatomy *m_pMaskInfo; Anatomy *m_pExcludeInfo; Anatomy *m_pSeedMapInfo; + Anatomy *m_pGMInfo; Vector m_initVec; float m_alpha; diff --git a/src/gui/TrackingWindow.cpp b/src/gui/TrackingWindow.cpp index 6c81dfef..7a3364c9 100644 --- a/src/gui/TrackingWindow.cpp +++ b/src/gui/TrackingWindow.cpp @@ -107,6 +107,8 @@ TrackingWindow::TrackingWindow( wxWindow *pParent, MainFrame *pMf, wxWindowID id TrackingWindow::TrackingWindow( wxWindow *pParent, MainFrame *pMf, wxWindowID id, const wxPoint &pos, const wxSize &size, int hardi) : wxScrolledWindow( pParent, id, pos, size, wxBORDER_NONE, _T("HARDI RTT Canvas") ), + m_isGMSelected( false ), + m_isWMSelected( false ), m_pMainFrame( pMf ) { SetBackgroundColour( *wxLIGHT_GREY ); @@ -154,7 +156,7 @@ TrackingWindow::TrackingWindow( wxWindow *pParent, MainFrame *pMf, wxWindowID id pBoxRow3->Add( m_pToggleSeedMap, 0, wxALIGN_CENTER | wxALL, 1); m_pTrackingSizer->Add( pBoxRow3, 0, wxFIXED_MINSIZE | wxALL, 2 ); - m_pBtnSelectMap = new wxButton( this, wxID_ANY,wxT("Mask not selected"), wxPoint(30,90), wxSize(230, -1) ); + m_pBtnSelectMap = new wxButton( this, wxID_ANY,wxT("Mask (e.g. WM, FA, etc) not selected"), wxPoint(30,90), wxSize(230, -1) ); Connect( m_pBtnSelectMap->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(TrackingWindow::OnSelectMask) ); m_pBtnSelectMap->SetBackgroundColour(wxColour( 255, 147, 147 )); @@ -162,6 +164,20 @@ TrackingWindow::TrackingWindow( wxWindow *pParent, MainFrame *pMf, wxWindowID id pBoxRow4->Add( m_pBtnSelectMap, 0, wxALIGN_CENTER | wxALL, 1 ); m_pTrackingSizer->Add( pBoxRow4, 0, wxFIXED_MINSIZE | wxALL, 2 ); + m_pBtnSelectGM = new wxButton( this, wxID_ANY,wxT("GM mask not selected"), wxPoint(30,90), wxSize(230, -1) ); + Connect( m_pBtnSelectGM->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(TrackingWindow::OnSelectGM) ); + + wxBoxSizer *pBoxRowGM = new wxBoxSizer( wxHORIZONTAL ); + pBoxRowGM->Add( m_pBtnSelectGM, 0, wxALIGN_CENTER | wxALL, 1 ); + m_pTrackingSizer->Add( pBoxRowGM, 0, wxFIXED_MINSIZE | wxALL, 2 ); + + m_pBtnSelectExclusion = new wxButton( this, wxID_ANY,wxT("Exclusion map (CSF) not selected"), wxDefaultPosition, wxSize(230, -1) ); + Connect( m_pBtnSelectExclusion->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(TrackingWindow::OnSelectExclusion) ); + + wxBoxSizer *pBoxRowEx = new wxBoxSizer( wxHORIZONTAL ); + pBoxRowEx->Add( m_pBtnSelectExclusion, 0, wxALIGN_CENTER | wxALL, 1 ); + m_pTrackingSizer->Add( pBoxRowEx, 0, wxFIXED_MINSIZE | wxALL, 2 ); + wxBoxSizer *pBoxFlips = new wxBoxSizer( wxHORIZONTAL ); pBoxFlips->Add(new wxStaticText( this, wxID_ANY, wxT( "Initialize" ), wxDefaultPosition, wxSize(70, -1), wxALIGN_CENTER ), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxALL, 1 ); @@ -177,15 +193,8 @@ TrackingWindow::TrackingWindow( wxWindow *pParent, MainFrame *pMf, wxWindowID id pBoxFlips->Add( m_pToggleTrackZ, 0, wxALIGN_LEFT | wxALL, 1); m_pTrackingSizer->Add( pBoxFlips,0, wxFIXED_MINSIZE | wxEXPAND, 0 ); - m_pBtnSelectExclusion = new wxButton( this, wxID_ANY,wxT("Exclusion map not selected"), wxDefaultPosition, wxSize(230, -1) ); - Connect( m_pBtnSelectExclusion->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(TrackingWindow::OnSelectExclusion) ); - - wxBoxSizer *pBoxRowEx = new wxBoxSizer( wxHORIZONTAL ); - pBoxRowEx->Add( m_pBtnSelectExclusion, 0, wxALIGN_CENTER | wxALL, 1 ); - m_pTrackingSizer->Add( pBoxRowEx, 0, wxFIXED_MINSIZE | wxALL, 2 ); - m_pTextFA = new wxStaticText( this, wxID_ANY, wxT("Min Mask"), wxPoint(0,120), wxSize(70, -1), wxALIGN_CENTER ); - m_pSliderFA = new MySlider( this, wxID_ANY, 0, 1, 50, wxPoint(60,120), wxSize(100, -1), wxSL_HORIZONTAL | wxSL_AUTOTICKS ); + m_pSliderFA = new MySlider( this, wxID_ANY, 0, 1, 100, wxPoint(60,120), wxSize(100, -1), wxSL_HORIZONTAL | wxSL_AUTOTICKS ); m_pSliderFA->SetValue( 20 ); Connect( m_pSliderFA->GetId(), wxEVT_COMMAND_SLIDER_UPDATED, wxCommandEventHandler(TrackingWindow::OnSliderFAMoved) ); m_pTxtFABox = new wxTextCtrl( this, wxID_ANY, wxT("0.20"), wxPoint(190,120), wxSize(55, -1), wxTE_CENTRE | wxTE_READONLY ); @@ -235,11 +244,23 @@ TrackingWindow::TrackingWindow( wxWindow *pParent, MainFrame *pMf, wxWindowID id pBoxRow8->Add( m_pTxtPunctureBox, 0, wxALIGN_LEFT | wxALL, 1); m_pTrackingSizer->Add( pBoxRow8, 0, wxFIXED_MINSIZE | wxEXPAND, 0 ); + m_pTextGMStep = new wxStaticText( this, wxID_ANY, wxT("GM steps"), wxPoint(0,180), wxSize(70, -1), wxALIGN_CENTER ); + m_pSliderGMStep = new MySlider( this, wxID_ANY, 0, 0, 300, wxPoint(60,180), wxSize(100, -1), wxSL_HORIZONTAL | wxSL_AUTOTICKS ); + m_pSliderGMStep->SetValue( 15 ); + Connect( m_pSliderGMStep->GetId(), wxEVT_COMMAND_SLIDER_UPDATED, wxCommandEventHandler(TrackingWindow::OnSliderGMStepMoved) ); + m_pTxtGMStepBox = new wxTextCtrl( this, wxID_ANY, wxT("15"), wxPoint(190,180), wxSize(55, -1), wxTE_CENTRE | wxTE_READONLY ); + + wxBoxSizer *pBoxRowGMstep = new wxBoxSizer( wxHORIZONTAL ); + pBoxRowGMstep->Add( m_pTextGMStep, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxALL, 1 ); + pBoxRowGMstep->Add( m_pSliderGMStep, 0, wxALIGN_LEFT | wxEXPAND | wxALL, 1); + pBoxRowGMstep->Add( m_pTxtGMStepBox, 0, wxALIGN_LEFT | wxALL, 1); + m_pTrackingSizer->Add( pBoxRowGMstep, 0, wxFIXED_MINSIZE | wxEXPAND, 0 ); + m_pTextMinLength = new wxStaticText( this, wxID_ANY, wxT("Min length"), wxPoint(0,240), wxSize(70, -1), wxALIGN_CENTER ); m_pSliderMinLength = new MySlider( this, wxID_ANY, 0, 0, 400, wxPoint(60,240), wxSize(100, -1), wxSL_HORIZONTAL | wxSL_AUTOTICKS ); - m_pSliderMinLength->SetValue( 90 ); + m_pSliderMinLength->SetValue( 60 ); Connect( m_pSliderMinLength->GetId(), wxEVT_COMMAND_SLIDER_UPDATED, wxCommandEventHandler(TrackingWindow::OnSliderMinLengthMoved) ); - m_pTxtMinLengthBox = new wxTextCtrl( this, wxID_ANY, wxT("90 mm"), wxPoint(190,240), wxSize(55, -1), wxTE_CENTRE | wxTE_READONLY ); + m_pTxtMinLengthBox = new wxTextCtrl( this, wxID_ANY, wxT("60 mm"), wxPoint(190,240), wxSize(55, -1), wxTE_CENTRE | wxTE_READONLY ); wxBoxSizer *pBoxRow9 = new wxBoxSizer( wxHORIZONTAL ); pBoxRow9->Add( m_pTextMinLength, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxALL, 1 ); @@ -407,6 +428,14 @@ void TrackingWindow::OnSliderStepMoved( wxCommandEvent& WXUNUSED(event) ) RTTrackingHelper::getInstance()->setRTTDirty( true ); } +void TrackingWindow::OnSliderGMStepMoved( wxCommandEvent& WXUNUSED(event) ) +{ + int sliderValue = m_pSliderGMStep->GetValue(); + m_pTxtGMStepBox->SetValue(wxString::Format( wxT( "%i"), sliderValue) ); + m_pMainFrame->m_pMainGL->m_pRealTimeFibers->setGMStep( sliderValue ); + RTTrackingHelper::getInstance()->setRTTDirty( true ); +} + void TrackingWindow::OnSliderPunctureMoved( wxCommandEvent& WXUNUSED(event) ) { float sliderValue = m_pSliderPuncture->GetValue() / 100.0f; @@ -658,6 +687,20 @@ void TrackingWindow::OnInitZ( wxCommandEvent& event ) RTTrackingHelper::getInstance()->setRTTDirty( true ); } +void TrackingWindow::OnSelectGM( wxCommandEvent& WXUNUSED(event) ) +{ + //Select map for threshold seeding + long item = m_pMainFrame->getCurrentListIndex(); + Anatomy* pMap = (Anatomy*)DatasetManager::getInstance()->getDataset (MyApp::frame->m_pListCtrl->GetItem( item )); + + if( pMap != NULL && pMap->getBands() == 1 ) + { + m_pBtnSelectGM->SetLabel( pMap->getName() ); + m_pMainFrame->m_pMainGL->m_pRealTimeFibers->setGMInfo( (Anatomy *)DatasetManager::getInstance()->getDataset( m_pMainFrame->m_pListCtrl->GetItem( item ) ) ); + m_isGMSelected = true; + } + } + void TrackingWindow::OnSelectExclusion( wxCommandEvent& WXUNUSED(event) ) { //Select map for threshold seeding diff --git a/src/gui/TrackingWindow.h b/src/gui/TrackingWindow.h index 23d3bce3..adb838bb 100644 --- a/src/gui/TrackingWindow.h +++ b/src/gui/TrackingWindow.h @@ -40,12 +40,14 @@ class TrackingWindow: public wxScrolledWindow void OnClearBox ( wxTreeEvent& event ); void OnSliderFAMoved ( wxCommandEvent& event ); void OnSliderAngleMoved ( wxCommandEvent& event ); + void OnSliderGMStepMoved ( wxCommandEvent& event ); void OnSliderStepMoved ( wxCommandEvent& event ); void OnSelectFileDTI ( wxCommandEvent& event ); void OnSelectFileHARDI ( wxCommandEvent& event ); void OnRandomSeeding ( wxCommandEvent& event ); void OnShellSeeding ( wxCommandEvent& event ); void OnSelectMask ( wxCommandEvent& event ); + void OnSelectGM ( wxCommandEvent& event ); void OnInitX ( wxCommandEvent& event ); void OnInitY ( wxCommandEvent& event ); void OnInitZ ( wxCommandEvent& event ); @@ -85,12 +87,16 @@ class TrackingWindow: public wxScrolledWindow wxSlider *m_pSliderPuncture; wxStaticText *m_pTextPuncture; wxTextCtrl *m_pTxtPunctureBox; + wxSlider *m_pSliderGMStep; + wxStaticText *m_pTextGMStep; + wxTextCtrl *m_pTxtGMStepBox; wxButton *m_pBtnSelectFile; wxButton *m_pBtnSelectShell; wxToggleButton *m_pToggleShell; wxButton *m_pBtnSelectSeed; wxToggleButton *m_pToggleSeedMap; wxButton *m_pBtnSelectMap; + wxButton *m_pBtnSelectGM; wxToggleButton *m_pToggleTrackX; wxToggleButton *m_pToggleTrackY; wxToggleButton *m_pToggleTrackZ; @@ -115,6 +121,9 @@ class TrackingWindow: public wxScrolledWindow wxBitmapButton *m_pBtnStop; wxImage m_bmpPause; wxImage m_bmpPlay; + + bool m_isGMSelected; + bool m_isWMSelected;