#include "ttkTensorScalarMapsProcess.h" #include #include #include #include #include #include #include // //////////////////////////////////////////// // Headers from TTK #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include ttkTensorScalarMapsProcess::ttkTensorScalarMapsProcess(QObject *parent) : medAbstractDiffusionScalarMapsProcess(parent) { m_filter = 0; m_scalarMapRequested = "fa"; } ttkTensorScalarMapsProcess::~ttkTensorScalarMapsProcess() { } QString ttkTensorScalarMapsProcess::caption() const { return "Tensor scalar maps"; } QString ttkTensorScalarMapsProcess::description() const { return "Compute scalar maps from tensors data"; } void ttkTensorScalarMapsProcess::selectRequestedScalarMap(QString mapRequested) { m_scalarMapRequested = mapRequested; } medAbstractJob::medJobExitStatus ttkTensorScalarMapsProcess::run() { medAbstractJob::medJobExitStatus jobExitSatus = medAbstractJob::MED_JOB_EXIT_FAILURE; if(this->input()) { QString id = this->input()->identifier(); if ( id == "itkDataTensorImageFloat3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataTensorImageDouble3" ) { jobExitSatus = this->_run(); } } return jobExitSatus; } template medAbstractJob::medJobExitStatus ttkTensorScalarMapsProcess::_run() { typedef itk::Tensor TensorType; typedef itk::Image TensorImageType; typedef itk::Image ImageType; typedef itk::TensorToScalarTensorImageFilter FilterType; typename TensorImageType::Pointer inData = dynamic_cast((itk::Object*)(this->input()->data())); if (!inData) return medAbstractJob::MED_JOB_EXIT_FAILURE; itk::CStyleCommand::Pointer callback = itk::CStyleCommand::New(); callback->SetClientData((void*)this); callback->SetCallback(ttkTensorScalarMapsProcess::eventCallback); if (m_scalarMapRequested == "ColorFA") { typedef itk::RGBAPixel ColorType; typedef itk::Image ColorImageType; typedef itk::TensorToScalarTensorImageFilter ColorFilterType; typename ColorFilterType::Pointer mainFilter = ColorFilterType::New(); medAbstractImageData *output = qobject_cast (medAbstractDataFactory::instance()->create ("itkDataImageRGBA3")); output->setData(mainFilter->GetOutput()); m_filter = mainFilter; mainFilter->SetInput(inData); typedef itk::TensorToColorFAFunction FunctionType; mainFilter->SetTensorToScalarFunction (FunctionType::New()); FunctionType *colorFunction = dynamic_cast (mainFilter->GetTensorToScalarFunction().GetPointer()); colorFunction->SetTransformColorWithDirection(true); colorFunction->SetDirection(mainFilter->GetInput()->GetDirection()); mainFilter->AddObserver(itk::ProgressEvent(), callback); try { mainFilter->Update(); } catch (itk::ProcessAborted &e) { return medAbstractJob::MED_JOB_EXIT_CANCELLED; } output->setMetaData(medMetaDataKeys::SeriesDescription.key(), this->input()->metadata(medMetaDataKeys::SeriesDescription.key()) + " " + m_scalarMapRequested); this->setOutput(output); return medAbstractJob::MED_JOB_EXIT_SUCCESS; } typename FilterType::Pointer filter = FilterType::New(); filter->SetInput(inData); filter->AddObserver(itk::ProgressEvent(), callback); m_filter = filter; if( m_scalarMapRequested=="FA" ) filter->SetTensorToScalarFunction( itk::TensorToFAFunction::New() ); else if( m_scalarMapRequested=="LogFA" ) filter->SetTensorToScalarFunction( itk::TensorToLogFAFunction::New() ); else if( m_scalarMapRequested=="ADC" ) filter->SetTensorToScalarFunction( itk::TensorToADCFunction::New() ); else if( m_scalarMapRequested=="Cl" ) filter->SetTensorToScalarFunction( itk::TensorToClFunction::New() ); else if( m_scalarMapRequested=="Cp" ) filter->SetTensorToScalarFunction( itk::TensorToCpFunction::New() ); else if( m_scalarMapRequested=="Cs" ) filter->SetTensorToScalarFunction( itk::TensorToCsFunction::New() ); else if( m_scalarMapRequested=="RA" ) filter->SetTensorToScalarFunction( itk::TensorToRAFunction::New() ); else if( m_scalarMapRequested=="VR" ) filter->SetTensorToScalarFunction( itk::TensorToVRFunction::New() ); else if( m_scalarMapRequested=="Lambda1" ) { typename itk::TensorToLambdaFunction::Pointer function = itk::TensorToLambdaFunction::New(); function->SetLambdaIndex (2); filter->SetTensorToScalarFunction( function ); } else if( m_scalarMapRequested=="Lambda2" ) { typename itk::TensorToLambdaFunction::Pointer function = itk::TensorToLambdaFunction::New(); function->SetLambdaIndex (1); filter->SetTensorToScalarFunction( function ); } else if( m_scalarMapRequested=="Lambda3" ) { typename itk::TensorToLambdaFunction::Pointer function = itk::TensorToLambdaFunction::New(); function->SetLambdaIndex (0); filter->SetTensorToScalarFunction( function ); } try { filter->Update(); } catch(itk::ProcessAborted &e) { return medAbstractJob::MED_JOB_EXIT_CANCELLED; } medAbstractImageData *output; if (this->input()->identifier().contains("Double")) output = qobject_cast (medAbstractDataFactory::instance()->create ("itkDataImageDouble3")); else output = qobject_cast (medAbstractDataFactory::instance()->create ("itkDataImageFloat3")); output->setData(filter->GetOutput()); output->setMetaData(medMetaDataKeys::SeriesDescription.key(), this->input()->metadata(medMetaDataKeys::SeriesDescription.key()) + " " + m_scalarMapRequested); this->setOutput(output); return medAbstractJob::MED_JOB_EXIT_SUCCESS; } void ttkTensorScalarMapsProcess::cancel() { if(this->isRunning()) { if (m_filter.IsNotNull()) m_filter->AbortGenerateDataOn(); } }