Commit eb6b5cee authored by Floris Berendsen's avatar Floris Berendsen
Browse files

ENH: updated ElastixComponentTest and WBIRDemoTest with new Monolitic

elx/trx
parent 0f01d58d
......@@ -26,7 +26,6 @@ namespace selx
{
m_transformixFilter = TransformixFilterType::New();
elxParameterObjectPointer elxParameterObject = elxParameterObjectType::New();
m_transformixFilter->ComputeDeformationFieldOn();
m_transformixFilter->LogToConsoleOn();
......@@ -34,6 +33,9 @@ namespace selx
m_transformixFilter->SetOutputDirectory(".");
//TODO m_elastixFilter returns a nullptr GetTransformParameterObject instead of a valid object. However, we need this object to satisfy the input conditions of m_transformixFilter
elxParameterObjectPointer elxParameterObject = elxParameterObjectType::New();
typename elxParameterObjectType::ParameterMapType defaultParameters = elxParameterObject->GetDefaultParameterMap("rigid");
elxParameterObject->SetParameterMap(defaultParameters);
//m_transformixFilter->SetTransformParameterObject(m_elastixFilter->GetTransformParameterObject());
m_transformixFilter->SetTransformParameterObject(elxParameterObject); // supply a dummy object
......@@ -71,8 +73,9 @@ namespace selx
auto transformParameterObject = component->GetTransformParameterObject();
// connect the itk pipeline
this->m_transformixFilter->SetTransformParameterObject(transformParameterObject);
// store the interface for the ReconnectTransform call
// Due to the fact that elastixfilter returns a Null object we cannot use it as a pipeline
//this->m_transformixFilter->SetTransformParameterObject(transformParameterObject);
// Therefore store the interface for the ReconnectTransform call
this->m_TransformParameterObjectInterface = component;
return 0;
}
......@@ -92,7 +95,6 @@ namespace selx
{
// TODO currently, the pipeline with elastix and tranformix can only be created after the update of elastix
this->m_transformixFilter->SetTransformParameterObject(this->m_TransformParameterObjectInterface->GetTransformParameterObject());
//this->m_transformixFilter->Update();
}
......
......@@ -22,9 +22,12 @@
#include "elxParameterObject.h"
#include "selxElastixComponent.h"
#include "selxMonolithicElastix.h"
#include "selxMonolithicTransformix.h"
#include "selxItkImageSink.h"
#include "selxItkImageSourceFixed.h"
#include "selxItkImageSourceMoving.h"
#include "selxRegistrationController.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
......@@ -43,13 +46,18 @@ public:
typedef Blueprint::ParameterMapType ParameterMapType;
typedef Blueprint::ParameterValueType ParameterValueType;
typedef DataManager DataManagerType;
/** register all example components */
/** Make a list of components to be registered for this test*/
typedef TypeList<ElastixComponent<2, float>,
MonolithicElastixComponent<2, float>,
MonolithicTransformixComponent<2, float>,
ItkImageSinkComponent<2, float>,
ItkImageSourceFixedComponent<2, float>,
ItkImageSourceMovingComponent<2, float>,
ItkImageSourceFixedComponent<3, double>,
ItkImageSourceMovingComponent<3, double>> RegisterComponents;
ItkImageSourceMovingComponent<3, double>,
RegistrationControllerComponent<>> RegisterComponents;
typedef SuperElastixFilter<RegisterComponents> SuperElastixFilterType;
typedef itk::Image<float, 2> Image2DType;
......@@ -74,6 +82,8 @@ TEST_F(ElastixComponentTest, ImagesOnly)
ParameterMapType component0Parameters;
component0Parameters["NameOfClass"] = { "ElastixComponent" };
component0Parameters["RegistrationSettings"] = { "rigid" };
component0Parameters["MaximumNumberOfIterations"] = { "2" };
blueprint->AddComponent("RegistrationMethod", component0Parameters);
ParameterMapType component1Parameters;
......@@ -91,6 +101,7 @@ TEST_F(ElastixComponentTest, ImagesOnly)
component3Parameters["Dimensionality"] = { "2" }; // should be derived from the inputs
blueprint->AddComponent("ResultImageSink", component3Parameters);
blueprint->AddComponent("Controller", { { "NameOfClass", { "RegistrationControllerComponent" } } });
ParameterMapType connection1Parameters;
//connection1Parameters["NameOfInterface"] = { "itkImageFixedInterface" };
......@@ -104,6 +115,8 @@ TEST_F(ElastixComponentTest, ImagesOnly)
//connection3Parameters["NameOfInterface"] = { "GetItkImageInterface" };
blueprint->AddConnection("RegistrationMethod", "ResultImageSink", connection3Parameters);
blueprint->AddConnection("RegistrationMethod", "Controller", { {} }); //
blueprint->AddConnection("ResultImageSink", "Controller", { {} }); //
// Instantiate SuperElastix
SuperElastixFilterType::Pointer superElastixFilter;
EXPECT_NO_THROW(superElastixFilter = SuperElastixFilterType::New());
......@@ -135,5 +148,69 @@ TEST_F(ElastixComponentTest, ImagesOnly)
EXPECT_NO_THROW(resultImageWriter->Update());
}
TEST_F(ElastixComponentTest, MonolithicElastixTransformix)
{
/** make example blueprint configuration */
blueprint = Blueprint::New();
blueprint->AddComponent("RegistrationMethod", { { "NameOfClass", { "MonolithicElastixComponent" } },
{ "RegistrationSettings", { "rigid" } }, { "MaximumNumberOfIterations", { "2" } } });
blueprint->AddComponent("TransformDisplacementField", { { "NameOfClass", { "MonolithicTransformixComponent" } } });
blueprint->AddComponent("FixedImageSource", { { "NameOfClass", { "ItkImageSourceFixedComponent" } }, { "Dimensionality", { "2" } } });
blueprint->AddComponent("MovingImageSource", { { "NameOfClass", { "ItkImageSourceMovingComponent" } }, { "Dimensionality", { "2" } } });
blueprint->AddComponent("ResultImageSink", { { "NameOfClass", { "ItkImageSinkComponent" } }, { "Dimensionality", { "2" } } });
blueprint->AddComponent("Controller", { { "NameOfClass", { "RegistrationControllerComponent" } } });
blueprint->AddConnection("FixedImageSource", "RegistrationMethod", { { "NameOfInterface", { "itkImageFixedInterface" } } }); // ;
blueprint->AddConnection("MovingImageSource", "RegistrationMethod", { { "NameOfInterface", { "itkImageMovingInterface" } } }); // ;
blueprint->AddConnection("RegistrationMethod", "TransformDisplacementField", { { "NameOfInterface", { "elastixTransformParameterObjectInterface" } } }); // ;
blueprint->AddConnection("FixedImageSource", "TransformDisplacementField", { { "NameOfInterface", { "itkImageDomainFixedInterface" } } }); // ;
blueprint->AddConnection("MovingImageSource", "TransformDisplacementField", { { "NameOfInterface", { "itkImageMovingInterface" } } }); //;
blueprint->AddConnection("TransformDisplacementField", "ResultImageSink", { { "NameOfInterface", { "itkImageInterface" } } }); // ;
blueprint->AddConnection("RegistrationMethod", "Controller", { {} }); //
blueprint->AddConnection("TransformDisplacementField", "Controller", { {} }); //
blueprint->AddConnection("ResultImageSink", "Controller", { {} }); //
// Instantiate SuperElastix
SuperElastixFilterType::Pointer superElastixFilter;
EXPECT_NO_THROW(superElastixFilter = SuperElastixFilterType::New());
// Data manager provides the paths to the input and output data for unit tests
DataManagerType::Pointer dataManager = DataManagerType::New();
// Set up the readers and writers
ImageReader2DType::Pointer fixedImageReader = ImageReader2DType::New();
fixedImageReader->SetFileName(dataManager->GetInputFile("BrainProtonDensitySliceBorder20.png"));
ImageReader2DType::Pointer movingImageReader = ImageReader2DType::New();
movingImageReader->SetFileName(dataManager->GetInputFile("BrainProtonDensitySliceR10X13Y17.png"));
ImageWriter2DType::Pointer resultImageWriter = ImageWriter2DType::New();
resultImageWriter->SetFileName(dataManager->GetOutputFile("ElastixComponentTest_BrainProtonDensity.mhd"));
// Connect SuperElastix in an itk pipeline
superElastixFilter->SetInput("FixedImageSource", fixedImageReader->GetOutput());
superElastixFilter->SetInput("MovingImageSource", movingImageReader->GetOutput());
resultImageWriter->SetInput(superElastixFilter->GetOutput<Image2DType>("ResultImageSink"));
EXPECT_NO_THROW(superElastixFilter->SetBlueprint(blueprint));
//Optional Update call
//superElastixFilter->Update();
// Update call on the writers triggers SuperElastix to configure and execute
EXPECT_NO_THROW(resultImageWriter->Update());
}
} // namespace selx
......@@ -24,6 +24,9 @@
#include "selxItkImageSource.h"
#include "selxElastixComponent.h"
#include "selxMonolithicElastix.h"
#include "selxMonolithicTransformix.h"
#include "selxItkImageSink.h"
#include "selxItkImageRegistrationMethodv4Component.h"
......@@ -52,20 +55,6 @@
namespace selx {
/** Temporary helper function to handle elastix deformation field output */
template < int Dimensionality, typename PixelType> void CopyselxDeformationField(const std::string filename)
{
typedef itk::ImageFileReader<itk::Image<itk::Vector<PixelType, Dimensionality>, Dimensionality>> ReaderType;
typedef itk::ImageFileWriter<itk::Image<itk::Vector<PixelType, Dimensionality>, Dimensionality>> WriterType;
typename ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName("deformationField.nii");
typename WriterType::Pointer writer = WriterType::New();
writer->SetFileName(filename);
writer->SetInput(reader->GetOutput());
writer->Update();
};
/** A demo for our WBIR paper written as a Unit Test in the Google Test Framework */
class WBIRDemoTest : public ::testing::Test {
......@@ -77,6 +66,8 @@ public:
ItkImageSourceFixedComponent<2, float>,
ItkImageSourceMovingComponent<2, float>,
ElastixComponent<2, float>,
MonolithicElastixComponent<2, float>,
MonolithicTransformixComponent<2, float>,
ItkImageRegistrationMethodv4Component<2, float>,
ItkANTSNeighborhoodCorrelationImageToImageMetricv4Component<2, float>,
ItkMeanSquaresImageToImageMetricv4Component < 2, float >,
......@@ -360,50 +351,42 @@ TEST_F(WBIRDemoTest, itkv4_SVF_MSD)
/** Experiment 1a: elastix framework, B-spline transform, normalized correlation metric */
TEST_F(WBIRDemoTest, elastix_BS_NCC)
{
/** make example blueprint configuration */
/** make blueprint configuration */
blueprint = Blueprint::New();
ParameterMapType component0Parameters;
component0Parameters["NameOfClass"] = { "ElastixComponent" };
//component0Parameters["RegistrationPreset"] = { "rigid" };
component0Parameters["Transform"] = { "BSplineTransform" };
component0Parameters["Metric"] = { "AdvancedNormalizedCorrelation" };
blueprint->AddComponent("RegistrationMethod", component0Parameters);
blueprint->AddComponent("RegistrationMethod", { { "NameOfClass", { "MonolithicElastixComponent" } },
{ "Transform", { "BSplineTransform" } }, { "Metric", { "AdvancedNormalizedCorrelation" } } });
ParameterMapType component1Parameters;
component1Parameters["NameOfClass"] = { "ItkImageSourceFixedComponent" };
blueprint->AddComponent("FixedImageSource", component1Parameters);
blueprint->AddComponent("TransformDisplacementField", { { "NameOfClass", { "MonolithicTransformixComponent" } } });
ParameterMapType component2Parameters;
component2Parameters["NameOfClass"] = { "ItkImageSourceMovingComponent" };
blueprint->AddComponent("MovingImageSource", component2Parameters);
blueprint->AddComponent("FixedImageSource", { { "NameOfClass", { "ItkImageSourceFixedComponent" } } });
blueprint->AddComponent("MovingImageSource", { { "NameOfClass", { "ItkImageSourceMovingComponent" } } });
ParameterMapType component3Parameters;
component3Parameters["NameOfClass"] = { "ItkImageSinkComponent" };
blueprint->AddComponent("ResultImageSink", component3Parameters);
blueprint->AddComponent("ResultImageSink", { { "NameOfClass", { "ItkImageSinkComponent" } } });
blueprint->AddComponent("Controller", { { "NameOfClass", { "RegistrationControllerComponent" } } });
ParameterMapType connection1Parameters;
//optionally, tie properties to connection to avoid ambiguities
//connection1Parameters["NameOfInterface"] = { "itkImageFixedInterface" };
blueprint->AddConnection("FixedImageSource", "RegistrationMethod", connection1Parameters);
ParameterMapType connection2Parameters;
//optionally, tie properties to connection to avoid ambiguities
//connection2Parameters["NameOfInterface"] = { "itkImageMovingInterface" };
blueprint->AddConnection("MovingImageSource", "RegistrationMethod", connection2Parameters);
blueprint->AddConnection("FixedImageSource", "RegistrationMethod", { {} }); // {{"NameOfInterface", { "itkImageFixedInterface" }}};
ParameterMapType connection3Parameters;
//optionally, tie properties to connection to avoid ambiguities
//connection3Parameters["NameOfInterface"] = { "GetItkImageInterface" };
blueprint->AddConnection("RegistrationMethod", "ResultImageSink", connection3Parameters);
blueprint->AddConnection("MovingImageSource", "RegistrationMethod", { {} }); // {{"NameOfInterface", { "itkImageMovingInterface" }}};
blueprint->AddConnection("RegistrationMethod", "TransformDisplacementField", { {} }); // { { "NameOfInterface", { "elastixTransformParameterObjectInterface" } } } ;
blueprint->AddConnection("RegistrationMethod", "Controller", { {} }); //RunRegistrationInterface
//blueprint->AddConnection("Transformix", "Controller", { {} }); //ReconnectTransformInterface
blueprint->AddConnection("ResultImageSink", "Controller", { {} }); //AfterRegistrationInterface
//blueprint->AddConnection("ResultDisplacementFieldSink", "Controller", { {} }); //AfterRegistrationInterface
blueprint->AddConnection("FixedImageSource", "TransformDisplacementField", { {} }); // { { "NameOfInterface", { "itkImageDomainFixedInterface" } } } ;
blueprint->AddConnection("MovingImageSource", "TransformDisplacementField", { {} }); // { { "NameOfInterface", { "itkImageMovingInterface" } } };
blueprint->AddConnection("TransformDisplacementField", "ResultImageSink", { {} }); // { { "NameOfInterface", { "itkImageInterface" } } } ;
blueprint->AddConnection("RegistrationMethod", "Controller", { {} }); // { { "NameOfInterface", { "RunRegistrationInterface" } } } ;
blueprint->AddConnection("TransformDisplacementField", "Controller", { {} }); // { { "NameOfInterface", { "ReconnectTransformInterface" } } } ;
blueprint->AddConnection("ResultImageSink", "Controller", { {} }); // { { "NameOfInterface", { "AfterRegistrationInterface" } } } ;
blueprint->WriteBlueprint("elastix_BS_NCC.dot");
......@@ -463,49 +446,42 @@ TEST_F(WBIRDemoTest, elastix_BS_NCC)
/** Experiment 1b: elastix framework, B-spline transform, mean squared differences metric */
TEST_F(WBIRDemoTest, elastix_BS_MSD)
{
/** make example blueprint configuration */
/** make blueprint configuration */
blueprint = Blueprint::New();
ParameterMapType component0Parameters;
component0Parameters["NameOfClass"] = { "ElastixComponent" };
//component0Parameters["RegistrationPreset"] = { "rigid" };
component0Parameters["Transform"] = { "BSplineTransform" };
component0Parameters["Metric"] = { "AdvancedMeanSquares" };
blueprint->AddComponent("RegistrationMethod", component0Parameters);
blueprint->AddComponent("RegistrationMethod", { { "NameOfClass", { "MonolithicElastixComponent" } },
{ "Transform", { "BSplineTransform" } }, { "Metric", { "AdvancedMeanSquares" } } });
ParameterMapType component1Parameters;
component1Parameters["NameOfClass"] = { "ItkImageSourceFixedComponent" };
blueprint->AddComponent("FixedImageSource", component1Parameters);
blueprint->AddComponent("TransformDisplacementField", { { "NameOfClass", { "MonolithicTransformixComponent" } } });
blueprint->AddComponent("FixedImageSource", { { "NameOfClass", { "ItkImageSourceFixedComponent" } } });
ParameterMapType component2Parameters;
component2Parameters["NameOfClass"] = { "ItkImageSourceMovingComponent" };
blueprint->AddComponent("MovingImageSource", component2Parameters);
blueprint->AddComponent("MovingImageSource", { { "NameOfClass", { "ItkImageSourceMovingComponent" } } });
ParameterMapType component3Parameters;
component3Parameters["NameOfClass"] = { "ItkImageSinkComponent" };
blueprint->AddComponent("ResultImageSink", component3Parameters);
blueprint->AddComponent("ResultImageSink", { { "NameOfClass", { "ItkImageSinkComponent" } } });
blueprint->AddComponent("Controller", { { "NameOfClass", { "RegistrationControllerComponent" } } });
ParameterMapType connection1Parameters;
//optionally, tie properties to connection to avoid ambiguities
//connection1Parameters["NameOfInterface"] = { "itkImageFixedInterface" };
blueprint->AddConnection("FixedImageSource", "RegistrationMethod", connection1Parameters);
ParameterMapType connection2Parameters;
//optionally, tie properties to connection to avoid ambiguities
//connection2Parameters["NameOfInterface"] = { "itkImageMovingInterface" };
blueprint->AddConnection("MovingImageSource", "RegistrationMethod", connection2Parameters);
blueprint->AddConnection("FixedImageSource", "RegistrationMethod", { {} }); // {{"NameOfInterface", { "itkImageFixedInterface" }}};
ParameterMapType connection3Parameters;
//optionally, tie properties to connection to avoid ambiguities
//connection3Parameters["NameOfInterface"] = { "GetItkImageInterface" };
blueprint->AddConnection("RegistrationMethod", "ResultImageSink", connection3Parameters);
blueprint->AddConnection("MovingImageSource", "RegistrationMethod", { {} }); // {{"NameOfInterface", { "itkImageMovingInterface" }}};
blueprint->AddConnection("RegistrationMethod", "Controller", { {} }); //RunRegistrationInterface
//blueprint->AddConnection("Transformix", "Controller", { {} }); //ReconnectTransformInterface
blueprint->AddConnection("ResultImageSink", "Controller", { {} }); //AfterRegistrationInterface
//blueprint->AddConnection("ResultDisplacementFieldSink", "Controller", { {} }); //AfterRegistrationInterface
blueprint->AddConnection("RegistrationMethod", "TransformDisplacementField", { {} }); // { { "NameOfInterface", { "elastixTransformParameterObjectInterface" } } } ;
blueprint->AddConnection("FixedImageSource", "TransformDisplacementField", { {} }); // { { "NameOfInterface", { "itkImageDomainFixedInterface" } } } ;
blueprint->AddConnection("MovingImageSource", "TransformDisplacementField", { {} }); // { { "NameOfInterface", { "itkImageMovingInterface" } } };
blueprint->AddConnection("TransformDisplacementField", "ResultImageSink", { {} }); // { { "NameOfInterface", { "itkImageInterface" } } } ;
blueprint->AddConnection("RegistrationMethod", "Controller", { {} }); // { { "NameOfInterface", { "RunRegistrationInterface" } } } ;
blueprint->AddConnection("TransformDisplacementField", "Controller", { {} }); // { { "NameOfInterface", { "ReconnectTransformInterface" } } } ;
blueprint->AddConnection("ResultImageSink", "Controller", { {} }); // { { "NameOfInterface", { "AfterRegistrationInterface" } } } ;
blueprint->WriteBlueprint("elastix_BS_MSD.dot");
......
......@@ -119,7 +119,7 @@ namespace selx
{
std::stringstream msg;
msg << "Too many criteria for Component " << name << std::endl;
std::runtime_error::runtime_error(msg.str());
throw std::runtime_error::runtime_error(msg.str());
}
// insert new element
......@@ -150,7 +150,7 @@ namespace selx
{
std::stringstream msg;
msg << "Too many criteria for Component " << name << std::endl;
std::runtime_error::runtime_error(msg.str());
throw std::runtime_error::runtime_error(msg.str());
}
}
......@@ -208,7 +208,7 @@ namespace selx
SourceInterface* provingSourceInterface = dynamic_cast<SourceInterface*> (component.GetPointer());
if (provingSourceInterface == nullptr) // is actually a double-check for sanity: based on criterion cast should be successful
{
std::runtime_error::runtime_error("dynamic_cast<SourceInterface*> fails, but based on component criterion it shouldn't");
throw std::runtime_error::runtime_error("dynamic_cast<SourceInterface*> fails, but based on component criterion it shouldn't");
}
sourceInterfaceMap[componentSelector.first]=provingSourceInterface;
......@@ -230,7 +230,7 @@ namespace selx
SinkInterface* provingSinkInterface = dynamic_cast<SinkInterface*> (component.GetPointer());
if (provingSinkInterface == nullptr) // is actually a double-check for sanity: based on criterion cast should be successful
{
std::runtime_error::runtime_error("dynamic_cast<SinkInterface*> fails, but based on component criterion it shouldn't");
throw std::runtime_error::runtime_error("dynamic_cast<SinkInterface*> fails, but based on component criterion it shouldn't");
}
sinkInterfaceMap[componentSelector.first] = provingSinkInterface;
}
......@@ -278,7 +278,7 @@ namespace selx
RunRegistrationInterface* providingRunRegistrationInterface = dynamic_cast<RunRegistrationInterface*> (runRegistrationComponent.GetPointer());
if (providingRunRegistrationInterface == nullptr) // is actually a double-check for sanity: based on criterion cast should be successful
{
std::runtime_error::runtime_error("dynamic_cast<RunRegistrationInterface*> fails, but based on component criterion it shouldn't");
throw std::runtime_error::runtime_error("dynamic_cast<RunRegistrationInterface*> fails, but based on component criterion it shouldn't");
}
// For testing purposes, all Sources are connected to an ImageWriter
providingRunRegistrationInterface->RunRegistration();
......@@ -293,7 +293,7 @@ namespace selx
AfterRegistrationInterface* providingAfterRegistrationInterface = dynamic_cast<AfterRegistrationInterface*> (afterRegistrationComponent.GetPointer());
if (providingAfterRegistrationInterface == nullptr) // is actually a double-check for sanity: based on criterion cast should be successful
{
std::runtime_error::runtime_error("dynamic_cast<AfterRegistrationInterface*> fails, but based on component criterion it shouldn't");
throw std::runtime_error::runtime_error("dynamic_cast<AfterRegistrationInterface*> fails, but based on component criterion it shouldn't");
}
// For testing purposes, all Sources are connected to an ImageWriter
providingAfterRegistrationInterface->AfterRegistration();
......@@ -313,7 +313,7 @@ namespace selx
ReconnectTransformInterface* providingInterface = dynamic_cast<ReconnectTransformInterface*> (component.GetPointer());
if (providingInterface == nullptr) // is actually a double-check for sanity: based on criterion cast should be successful
{
std::runtime_error::runtime_error("dynamic_cast<ReconnectTransformInterface*> fails, but based on component criterion it shouldn't");
throw std::runtime_error::runtime_error("dynamic_cast<ReconnectTransformInterface*> fails, but based on component criterion it shouldn't");
}
// For testing purposes, all Sources are connected to an ImageWriter
providingInterface->ReconnectTransform();
......@@ -351,7 +351,7 @@ namespace selx
RegistrationControllerStartInterface* providingInterface = dynamic_cast<RegistrationControllerStartInterface*> (component.GetPointer());
if (providingInterface == nullptr) // is actually a double-check for sanity: based on criterion cast should be successful
{
std::runtime_error::runtime_error("dynamic_cast<RegistrationControllerStartInterface*> fails, but based on component criterion it shouldn't");
throw std::runtime_error::runtime_error("dynamic_cast<RegistrationControllerStartInterface*> fails, but based on component criterion it shouldn't");
}
providingInterface->RegistrationControllerStart();
}
......@@ -366,7 +366,7 @@ namespace selx
{
std::stringstream msg;
msg << "No Source component found by name:" << inputName;
std::runtime_error::runtime_error(msg.str());
throw std::runtime_error::runtime_error(msg.str());
}
return sources[inputName]->GetInputFileReader();
......@@ -379,7 +379,7 @@ namespace selx
{
std::stringstream msg;
msg << "No Sink component found by name : " << outputName;
std::runtime_error::runtime_error(msg.str());
throw std::runtime_error::runtime_error(msg.str());
}
return sinks[outputName]->GetOutputFileWriter();
......@@ -392,7 +392,7 @@ namespace selx
{
std::stringstream msg;
msg << "No Sink component found by name : " << outputName;
std::runtime_error::runtime_error(msg.str());
throw std::runtime_error::runtime_error(msg.str());
}
return sinks[outputName]->GetInitializedOutput();
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment