From 8e6c9e9abafd8c65adeeb0774be455a1abc90de5 Mon Sep 17 00:00:00 2001 From: Proton local user Date: Wed, 3 May 2023 16:08:17 +0200 Subject: [PATCH 1/3] Some work on UI --- .../itkDTRrecon/itkImageProcessor.cpp | 159 +++++++++++------- .../itkDTRrecon/itkImageProcessor.h | 15 +- 2 files changed, 108 insertions(+), 66 deletions(-) diff --git a/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp b/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp index 3723431..867ff03 100644 --- a/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp +++ b/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp @@ -471,7 +471,7 @@ int itkImageProcessor::load3DSerieFromFiles( std::vector v_fnames){ imageSeriesReader3D->SetImageIO(dicomIO); imageSeriesReader3D->SetFileNames(v_sortedFnames); - //imageSeriesReader3D->SetNumberOfWorkUnits(8); + imageSeriesReader3D->SetNumberOfWorkUnits(8); imageSeriesReader3D->ForceOrthogonalDirectionOff(); // properly read CTs with gantry tilt //imageSeriesReader3D->SetSpacingWarningRelThreshold(); @@ -1362,6 +1362,85 @@ void itkImageProcessor::CalculateExternalUserTransform(TransformType::Pointer tr m_TransformMetaInfo->SetUserRotations(LPStoIEC_Directions * rotationUser); } +itkImageProcessor::TransformType::Pointer +itkImageProcessor::CalculateInternalTransformV2( + ImageType3D::PointType m_ImportOffsetLPS, + ImageType3D::PointType m_RotationOffsetIEC, + ImageType3D::PointType m_TranslationUserIEC, + ImageType3D::PointType m_RotationUserIEC, + ImageType3D::PointType m_ProjectionCenterLPS, + ImageType3D::PointType m_RTIsocenterLPS, + InternalImageType::DirectionType m_IECtoLPSDirections + ){ + + const double dtr = (atan(1.0) * 4.0) / 180.0; + + ImageType3D::PointType m_ROffsetLPS = + m_IECtoLPSDirections * m_RotationOffsetIEC; + + ImageType3D::PointType m_TUserLPS = + m_IECtoLPSDirections * m_TranslationUserIEC; + + ImageType3D::PointType m_RUserLPS = + m_IECtoLPSDirections * m_RotationUserIEC; + + + TransformType::OutputVectorType translation; + translation[0] = m_TUserLPS[0]; + translation[1] = m_TUserLPS[1]; + translation[2] = m_TUserLPS[2]; + + ImageType3D::PointType m_TransformRotations; + m_TransformRotations[0] = m_ROffsetLPS[0] + m_RUserLPS[0] ; + m_TransformRotations[1] = m_ROffsetLPS[1] + m_RUserLPS[1] ; + m_TransformRotations[2] = m_ROffsetLPS[2] + m_RUserLPS[2] ; + + ImageType3D::PointType m_RTIsocenterLPSNEG; + m_RTIsocenterLPSNEG[0] = -m_RTIsocenterLPS[0] + m_ProjectionCenterLPS[0]; + m_RTIsocenterLPSNEG[1] = -m_RTIsocenterLPS[1] + m_ProjectionCenterLPS[0]; + m_RTIsocenterLPSNEG[2] = -m_RTIsocenterLPS[2] + m_ProjectionCenterLPS[0]; + + // Map user to the projection center + TransformType::Pointer m_IsoTransformZeroAtCTOrigin = + MapTransformToNewOrigin ( + m_RTIsocenterLPSNEG, + translation, + m_TransformRotations + ); + + TransformType::Pointer m_OutputTransform = + TransformType::New(); + m_OutputTransform ->SetComputeZYX(true); + m_OutputTransform ->SetIdentity(); + + TransformType::OutputVectorType translation_Out; + translation_Out[0] = + m_IsoTransformZeroAtCTOrigin->GetTranslation()[0] + + m_ImportOffsetLPS[0] + + m_ProjectionCenterLPS[0]; + translation_Out[1] = + m_IsoTransformZeroAtCTOrigin->GetTranslation()[1] + + m_ImportOffsetLPS[1] + + m_ProjectionCenterLPS[1]; + translation_Out[2] = + m_IsoTransformZeroAtCTOrigin->GetTranslation()[2] + + m_ImportOffsetLPS[2] + + m_ProjectionCenterLPS[2]; + + m_OutputTransform->SetTranslation( + translation_Out); + + m_OutputTransform->SetRotation( + m_IsoTransformZeroAtCTOrigin->GetAngleX(), + m_IsoTransformZeroAtCTOrigin->GetAngleY(), + m_IsoTransformZeroAtCTOrigin->GetAngleZ()); + + m_OutputTransform->SetCenter( + m_ProjectionCenterLPS); + + return m_OutputTransform; + +} itkImageProcessor::TransformType::Pointer itkImageProcessor::CalculateInternalTransform( @@ -1401,7 +1480,7 @@ itkImageProcessor::CalculateInternalTransform( // Map offset to the projection center TransformType::Pointer m_OffsetTransform = MapTransformToNewOrigin ( - m_ProjectionTransformCenter - m_UserTransformCenter,//m_OffsetTransformCenter, + m_ProjectionTransformCenter - m_UserTransformCenter, m_TOffsetLPS, m_ROffsetLPS ); @@ -1429,7 +1508,7 @@ itkImageProcessor::CalculateInternalTransform( m_ProjectionTransformCenter); - std::cout<GetLPS2IECDirections().GetTranspose(); TransformType::Pointer CurrTransform; - //CurrTransform->SetComputeZYX(true); - //CurrTransform->SetIdentity(); if(m_RTMetaInfo == NULL) { @@ -1839,11 +1916,6 @@ void itkImageProcessor::InitializeProjector() ImageType3D::PointType pFakeIsoLPS = m_DRTImage1MetaInfo->GetProjectionOriginLPS(); - //ImageType3D::PointType pFakeIsoLPS = - // m_CTMetaInfo->GetProjectionOriginLPS( - // m_DRTGeometryMetaInfo->GetProjectionCenter1()); - - CurrTransform = CalculateInternalTransform( ZeroPoint, @@ -1855,7 +1927,7 @@ void itkImageProcessor::InitializeProjector() ZeroPoint, IECtoLPS_Directions ); - } else { + } else { CurrTransform = CalculateInternalTransform( @@ -2238,20 +2310,6 @@ void itkImageProcessor::UpdateProjectionGeometryMeta(){ m_DRTImage1MetaInfo->SetProjectionOriginLPSZero( CalibratedIsocenterZeroLPS); -// // This is based on the calibrated iso to be sure... -// std::vector vBounds = m_CTMetaInfo->CalculateRegions( -// NominalIsocenter_wZcorrectionLPS -//// m_DRTImage1MetaInfo->GetProjectionOriginLPS() -// ); - -// std::cout<<"Bounds1: " -// <SetSizeWithBounds( NULL,//vBounds.data(), m_DRTGeometryMetaInfo->GetDRT1Size(), @@ -2270,21 +2328,12 @@ void itkImageProcessor::UpdateProjectionGeometryMeta(){ CalcDRTImageOrigin( m_DRTImage1MetaInfo->GetOrigin(), m_DRTImage1MetaInfo->GetCOV(), - NominalIsocenter_wZcorrectionLPS,//m_DRTImage1MetaInfo->GetProjectionOriginLPS(), - this->CalcProjectionAngleLPS( - m_CTMetaInfo->GetPatientOrientation(), - m_DRTGeometryMetaInfo->GetProjectionAngle1IEC() ), - //m_DRTGeometryMetaInfo->GetProjectionAngle1IEC(),// m_DRTImage1MetaInfo->GetProjectionAngleLPS(), - Std_DRT2LPS - ) /*- - CalcDRTImageOffset( - PanelOffsetIEC1, + NominalIsocenter_wZcorrectionLPS, this->CalcProjectionAngleLPS( m_CTMetaInfo->GetPatientOrientation(), m_DRTGeometryMetaInfo->GetProjectionAngle1IEC() ), Std_DRT2LPS - )*/ - + ) ); std::cout<<"CALIBRATION GetOriginLPS "<GetOriginLPS()<SetProjectionOriginLPS( CalibratedIsocenterLPS); - // m_CTMetaInfo->GetProjectionOriginLPS( - // m_DRTGeometryMetaInfo->GetProjectionCenter2()) - // ); m_DRTImage2MetaInfo->SetProjectionOriginLPSZero( CalibratedIsocenterZeroLPS); - // m_CTMetaInfo->GetProjectionOriginLPSZero( - // m_DRTGeometryMetaInfo->GetProjectionCenter2()) - // ); - -// vBounds.clear(); -// vBounds = m_CTMetaInfo->CalculateRegions( -// NominalIsocenter_wZcorrectionLPS//m_DRTImage2MetaInfo->GetProjectionOriginLPS() -// ); - -// std::cout<<"Bounds2: " -// <SetSizeWithBounds( NULL,//vBounds.data(), @@ -2416,14 +2446,7 @@ void itkImageProcessor::UpdateProjectionGeometryMeta(){ m_DRTGeometryMetaInfo->GetProjectionAngle2IEC()) , //m_DRTGeometryMetaInfo->GetProjectionAngle2IEC(),//m_DRTImage2MetaInfo->GetProjectionAngleLPS(), Std_DRT2LPS - ) /*- - CalcDRTImageOffset( - PanelOffsetIEC2, - this->CalcProjectionAngleLPS( - m_CTMetaInfo->GetPatientOrientation(), - m_DRTGeometryMetaInfo->GetProjectionAngle2IEC() ), - Std_DRT2LPS - )*/ + ) ); @@ -2650,7 +2673,15 @@ void itkImageProcessor::GetProjectionImages(){ m_CTMetaInfo->GetImportOffset(), IECtoLPS_Directions ); - + std::cout<<"GGGG CalculateInternalTransform GGG"<GetIECS2IECScannerR()<GetTranslations()<GetRotations()<GetProjectionOriginLPS()<GetIsocenterLPS()<GetImportOffset()<GetIsocenterLPS() - m_CTMetaInfo->GetImportOffset()<GetImportOffset() <; /** Optimizer which tries to find the minimn (Powell Optimizer)*/ - // using OptimizerType = itk::PowellOptimizer; using AmoebaOptimizerType = itk::AmoebaOptimizer; /** Optimizer which samples the whol space */ using ExhaustiveOptimizerType = itk::ExhaustiveOptimizer; @@ -266,7 +265,9 @@ private: using ITKtoVTKFilterType = itk::ImageToVTKImageFilter; void - CalculateExternalUserTransform(TransformType::Pointer transform, DRTImageMetaInformation::Pointer imageMetaInfo); + CalculateExternalUserTransform( + TransformType::Pointer transform, + DRTImageMetaInformation::Pointer imageMetaInfo); TransformType::Pointer CalculateInternalTransform( @@ -280,6 +281,16 @@ private: InternalImageType::DirectionType m_IECtoLPSDirections ); + TransformType::Pointer + CalculateInternalTransformV2( + ImageType3D::PointType m_ImportOffsetLPS, + ImageType3D::PointType m_RotationOffsetIEC, + ImageType3D::PointType m_TranslationUserIEC, + ImageType3D::PointType m_RotationUserIEC, + ImageType3D::PointType m_ProjectionCenterLPS, + ImageType3D::PointType m_RTIsocenterLPS, + InternalImageType::DirectionType m_IECtoLPSDirections + ); TransformType::Pointer transform1, From 2d9d3d97bd546b37a2189b6cd5002b73145e19d0 Mon Sep 17 00:00:00 2001 From: Proton local user Date: Wed, 3 May 2023 16:43:13 +0200 Subject: [PATCH 2/3] RTPlan data widget as TreeWidget --- .../itkDTRrecon/itkImageProcessor.cpp | 79 ------------------- .../itkDTRrecon/itkImageProcessor.h | 11 +-- 2 files changed, 1 insertion(+), 89 deletions(-) diff --git a/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp b/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp index 2916db1..17e53c8 100644 --- a/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp +++ b/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp @@ -1362,85 +1362,6 @@ void itkImageProcessor::CalculateExternalUserTransform(TransformType::Pointer tr m_TransformMetaInfo->SetUserRotations(LPStoIEC_Directions * rotationUser); } -itkImageProcessor::TransformType::Pointer -itkImageProcessor::CalculateInternalTransformV2( - ImageType3D::PointType m_ImportOffsetLPS, - ImageType3D::PointType m_RotationOffsetIEC, - ImageType3D::PointType m_TranslationUserIEC, - ImageType3D::PointType m_RotationUserIEC, - ImageType3D::PointType m_ProjectionCenterLPS, - ImageType3D::PointType m_RTIsocenterLPS, - InternalImageType::DirectionType m_IECtoLPSDirections - ){ - - const double dtr = (atan(1.0) * 4.0) / 180.0; - - ImageType3D::PointType m_ROffsetLPS = - m_IECtoLPSDirections * m_RotationOffsetIEC; - - ImageType3D::PointType m_TUserLPS = - m_IECtoLPSDirections * m_TranslationUserIEC; - - ImageType3D::PointType m_RUserLPS = - m_IECtoLPSDirections * m_RotationUserIEC; - - - TransformType::OutputVectorType translation; - translation[0] = m_TUserLPS[0]; - translation[1] = m_TUserLPS[1]; - translation[2] = m_TUserLPS[2]; - - ImageType3D::PointType m_TransformRotations; - m_TransformRotations[0] = m_ROffsetLPS[0] + m_RUserLPS[0] ; - m_TransformRotations[1] = m_ROffsetLPS[1] + m_RUserLPS[1] ; - m_TransformRotations[2] = m_ROffsetLPS[2] + m_RUserLPS[2] ; - - ImageType3D::PointType m_RTIsocenterLPSNEG; - m_RTIsocenterLPSNEG[0] = -m_RTIsocenterLPS[0] + m_ProjectionCenterLPS[0]; - m_RTIsocenterLPSNEG[1] = -m_RTIsocenterLPS[1] + m_ProjectionCenterLPS[0]; - m_RTIsocenterLPSNEG[2] = -m_RTIsocenterLPS[2] + m_ProjectionCenterLPS[0]; - - // Map user to the projection center - TransformType::Pointer m_IsoTransformZeroAtCTOrigin = - MapTransformToNewOrigin ( - m_RTIsocenterLPSNEG, - translation, - m_TransformRotations - ); - - TransformType::Pointer m_OutputTransform = - TransformType::New(); - m_OutputTransform ->SetComputeZYX(true); - m_OutputTransform ->SetIdentity(); - - TransformType::OutputVectorType translation_Out; - translation_Out[0] = - m_IsoTransformZeroAtCTOrigin->GetTranslation()[0] + - m_ImportOffsetLPS[0] + - m_ProjectionCenterLPS[0]; - translation_Out[1] = - m_IsoTransformZeroAtCTOrigin->GetTranslation()[1] + - m_ImportOffsetLPS[1] + - m_ProjectionCenterLPS[1]; - translation_Out[2] = - m_IsoTransformZeroAtCTOrigin->GetTranslation()[2] + - m_ImportOffsetLPS[2] + - m_ProjectionCenterLPS[2]; - - m_OutputTransform->SetTranslation( - translation_Out); - - m_OutputTransform->SetRotation( - m_IsoTransformZeroAtCTOrigin->GetAngleX(), - m_IsoTransformZeroAtCTOrigin->GetAngleY(), - m_IsoTransformZeroAtCTOrigin->GetAngleZ()); - - m_OutputTransform->SetCenter( - m_ProjectionCenterLPS); - - return m_OutputTransform; - -} itkImageProcessor::TransformType::Pointer itkImageProcessor::CalculateInternalTransformV2( diff --git a/reg23Topograms/itkDTRrecon/itkImageProcessor.h b/reg23Topograms/itkDTRrecon/itkImageProcessor.h index aba2660..553212e 100644 --- a/reg23Topograms/itkDTRrecon/itkImageProcessor.h +++ b/reg23Topograms/itkDTRrecon/itkImageProcessor.h @@ -294,16 +294,7 @@ private: InternalImageType::DirectionType m_IECtoLPSDirections ); - TransformType::Pointer - CalculateInternalTransformV2( - ImageType3D::PointType m_ImportOffsetLPS, - ImageType3D::PointType m_RotationOffsetIEC, - ImageType3D::PointType m_TranslationUserIEC, - ImageType3D::PointType m_RotationUserIEC, - ImageType3D::PointType m_ProjectionCenterLPS, - ImageType3D::PointType m_RTIsocenterLPS, - InternalImageType::DirectionType m_IECtoLPSDirections - ); + TransformType::Pointer transform1, From 2a6a8d49224618d4bc2c132e83c0f4ba0268f17c Mon Sep 17 00:00:00 2001 From: Proton local user Date: Mon, 8 May 2023 17:54:16 +0200 Subject: [PATCH 3/3] Solved bug that would cause crash when trying to change parameters of regEngine with CT not yet loaded (example loading Scout LONG in DataView). Minor changes in UI functionalities to adjust for this new behaviour. Now loading of scouts is automatically followed by visualisation --- .../itkDTRrecon/itkImageProcessor.cpp | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp b/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp index 17e53c8..c1c6b8c 100644 --- a/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp +++ b/reg23Topograms/itkDTRrecon/itkImageProcessor.cpp @@ -694,13 +694,13 @@ int itkImageProcessor::fill3DVolumeMeta( } if(m_DRTImage2MetaInfo != NULL){ - std::cout << "NEVER HERE m_DRTImage2MetaInfo" << std::endl; - m_DRTImage2MetaInfo = NULL; + std::cout << "NEVER HERE m_DRTImage2MetaInfo" << std::endl; + m_DRTImage2MetaInfo = NULL; } if(m_RTMetaInfo != NULL){ - std::cout << "NEVER HERE m_RTMetaInfo" << std::endl; - m_RTMetaInfo = NULL; + std::cout << "NEVER HERE m_RTMetaInfo" << std::endl; + m_RTMetaInfo = NULL; } @@ -1122,7 +1122,6 @@ int itkImageProcessor::load2D(const char * pcFName){ //double* m_ImageIntensity; DuplicatorType::Pointer m_Duplicator; - bool* m_ImLoaded; TopogramImageMetaInformation::Pointer m_TImageMeta; switch (currProjOrientation) { @@ -1783,6 +1782,7 @@ void itkImageProcessor::InitializeProjector() m_DRTImage2MetaInfo == NULL || m_DRTGeometryMetaInfo == NULL || m_TransformMetaInfo == NULL ){ + return; //TODO } @@ -2076,18 +2076,22 @@ void itkImageProcessor::loadRTPlanInfo( void itkImageProcessor::UpdateProjectionGeometryMeta(){ if(m_CTMetaInfo == NULL){ + return; //TODO. } if(m_DRTGeometryMetaInfo == NULL){ + return; //TODO. } if(m_DRTImage1MetaInfo == NULL){ + return; //TODO. } if(m_DRTImage2MetaInfo == NULL){ + return; //TODO. } @@ -2325,6 +2329,7 @@ void itkImageProcessor::GetProjectionImages(){ m_DRTImage2MetaInfo == NULL || m_DRTGeometryMetaInfo == NULL || m_TransformMetaInfo == NULL ){ + return; //TODO } @@ -2697,6 +2702,14 @@ vtkImageData* itkImageProcessor::GetLocalizer2VTK() vtkImageData* itkImageProcessor::GetProjection1VTK() { + + if(m_DRTImage1MetaInfo == NULL || + m_DRTGeometryMetaInfo == NULL || + m_TransformMetaInfo == NULL ){ + return NULL; + //TODO + } + // Rescale the intensity of the projection images to 0-32768 for output. using RescaleFilterType = itk::RescaleIntensityImageFilter; @@ -2826,6 +2839,13 @@ vtkMatrix4x4 * itkImageProcessor::GetProjection2VTKTransform() vtkImageData* itkImageProcessor::GetProjection2VTK() { + if(m_DRTImage2MetaInfo == NULL || + m_DRTGeometryMetaInfo == NULL || + m_TransformMetaInfo == NULL ){ + return NULL; + //TODO + } + // Rescale the intensity of the projection images to 0-32768 for output. using RescaleFilterType = itk::RescaleIntensityImageFilter;