Skip to content

Commit 341050b

Browse files
jhlegarretahjmjohnson
authored andcommitted
BUG: Set number of targets for FMUG image filter
Set the number of targets ivar to the appropriate value for the `itk::FastMarchingUpwindGradientImageFilter` class. The existing implementation was not setting the `m_NumberOfTargets` ivar to the appropriate values depending on the `m_TargetReachedMode` value. Ensure that the a sufficien number of target points exists for the desired `m_TargetReachedMode`. Exercise and test all possibilities.
1 parent ca1a1ff commit 341050b

File tree

2 files changed

+68
-6
lines changed

2 files changed

+68
-6
lines changed

Modules/Filtering/FastMarching/include/itkFastMarchingUpwindGradientImageFilter.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,23 +161,50 @@ class ITK_TEMPLATE_EXPORT FastMarchingUpwindGradientImageFilter : public FastMar
161161
SetTargetReachedModeToNoTargets()
162162
{
163163
this->SetTargetReachedMode(NoTargets);
164+
m_NumberOfTargets = 0;
164165
}
165166
void
166167
SetTargetReachedModeToOneTarget()
167168
{
169+
if (!m_TargetPoints || m_TargetPoints->Size() == 0)
170+
{
171+
itkExceptionMacro(<< "No target point set. Cannot set the target reached mode.")
172+
}
168173
this->SetTargetReachedMode(OneTarget);
174+
m_NumberOfTargets = 1;
169175
}
170176
void
171177
SetTargetReachedModeToSomeTargets(SizeValueType numberOfTargets)
172178
{
179+
if (!m_TargetPoints || m_TargetPoints->Size() == 0)
180+
{
181+
itkExceptionMacro(<< "No target point set. Cannot set the target reached mode.")
182+
}
183+
184+
SizeValueType availableNumberOfTargets = m_TargetPoints->Size();
185+
if (numberOfTargets > availableNumberOfTargets)
186+
{
187+
itkExceptionMacro(<< "Not enought target points: Available: " << availableNumberOfTargets
188+
<< "; Requested: " << numberOfTargets);
189+
}
173190
this->SetTargetReachedMode(SomeTargets);
174191
m_NumberOfTargets = numberOfTargets;
175192
}
176193

177194
void
178195
SetTargetReachedModeToAllTargets()
179196
{
197+
if (!m_TargetPoints || m_TargetPoints->Size() == 0)
198+
{
199+
itkExceptionMacro(<< "No target point set. Cannot set the target reached mode.")
200+
}
201+
180202
this->SetTargetReachedMode(AllTargets);
203+
if (m_TargetPoints->Size() == 0)
204+
{
205+
itkExceptionMacro(<< "No target point set. Cannot set the target reached mode.")
206+
}
207+
m_NumberOfTargets = m_TargetPoints->Size();
181208
}
182209

183210
/** Get the number of targets. */

Modules/Filtering/FastMarching/test/itkFastMarchingUpwindGradientTest.cxx

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@ itkFastMarchingUpwindGradientTest(int, char *[])
5353
ITK_EXERCISE_BASIC_OBJECT_METHODS(marcher, FastMarchingUpwindGradientImageFilter, FastMarchingImageFilter);
5454

5555

56+
// Test exceptions
57+
ITK_TRY_EXPECT_EXCEPTION(marcher->SetTargetReachedModeToOneTarget());
58+
59+
itk::SizeValueType numberOfTargets = 0;
60+
ITK_TRY_EXPECT_EXCEPTION(marcher->SetTargetReachedModeToSomeTargets(numberOfTargets));
61+
62+
ITK_TRY_EXPECT_EXCEPTION(marcher->SetTargetReachedModeToAllTargets());
63+
64+
5665
// ShowProgressObject progressWatch(marcher);
5766
// itk::SimpleMemberCommand<ShowProgressObject>::Pointer command;
5867
// command = itk::SimpleMemberCommand<ShowProgressObject>::New();
@@ -241,14 +250,23 @@ itkFastMarchingUpwindGradientTest(int, char *[])
241250
marcher->SetTargetPoints(targetPoints);
242251
ITK_TEST_SET_GET_VALUE(targetPoints, marcher->GetTargetPoints());
243252

253+
// The target reached mode is set to no targets by default
254+
ITK_TEST_SET_GET_VALUE(FloatFMType::NoTargets, marcher->GetTargetReachedMode());
255+
256+
numberOfTargets = 0;
257+
ITK_TEST_EXPECT_EQUAL(numberOfTargets, marcher->GetNumberOfTargets());
258+
244259
// Stop the algorithm when ONE of the targets has been reached.
245260
marcher->SetTargetReachedModeToOneTarget();
246261
ITK_TEST_SET_GET_VALUE(FloatFMType::OneTarget, marcher->GetTargetReachedMode());
247262

248-
marcher->Update();
263+
numberOfTargets = 1;
264+
ITK_TEST_EXPECT_EQUAL(numberOfTargets, marcher->GetNumberOfTargets());
265+
266+
ITK_TRY_EXPECT_NO_EXCEPTION(marcher->Update());
249267

250-
VectorType::size_type reachedTargetPointCount = 1;
251-
ITK_TEST_EXPECT_EQUAL(reachedTargetPointCount, marcher->GetReachedTargetPoints()->Size());
268+
269+
ITK_TEST_EXPECT_EQUAL(numberOfTargets, marcher->GetReachedTargetPoints()->Size());
252270

253271
// Find the smallest reaching time of the TargetPoints. This is the time of the closest
254272
// TargetPoint.
@@ -270,15 +288,32 @@ itkFastMarchingUpwindGradientTest(int, char *[])
270288
passed = false;
271289
}
272290

291+
// Now stop the algorithm once SOME of the targets have been reached.
292+
numberOfTargets = targetPoints->Size() + 1;
293+
ITK_TRY_EXPECT_EXCEPTION(marcher->SetTargetReachedModeToSomeTargets(numberOfTargets));
294+
295+
numberOfTargets = targetPoints->Size() - 1;
296+
marcher->SetTargetReachedModeToSomeTargets(numberOfTargets);
297+
ITK_TEST_SET_GET_VALUE(FloatFMType::SomeTargets, marcher->GetTargetReachedMode());
298+
299+
ITK_TEST_EXPECT_EQUAL(numberOfTargets, marcher->GetNumberOfTargets());
300+
301+
ITK_TRY_EXPECT_NO_EXCEPTION(marcher->Update());
302+
303+
304+
ITK_TEST_EXPECT_EQUAL(numberOfTargets, marcher->GetReachedTargetPoints()->Size());
273305

274306
// Now stop the algorithm once ALL of the targets have been reached.
275307
marcher->SetTargetReachedModeToAllTargets();
276308
ITK_TEST_SET_GET_VALUE(FloatFMType::AllTargets, marcher->GetTargetReachedMode());
277309

278-
marcher->Update();
310+
numberOfTargets = targetPoints->Size();
311+
ITK_TEST_EXPECT_EQUAL(numberOfTargets, marcher->GetNumberOfTargets());
312+
313+
ITK_TRY_EXPECT_NO_EXCEPTION(marcher->Update());
314+
279315

280-
reachedTargetPointCount = marcher->GetTargetPoints()->Size();
281-
ITK_TEST_EXPECT_EQUAL(reachedTargetPointCount, marcher->GetReachedTargetPoints()->Size());
316+
ITK_TEST_EXPECT_EQUAL(numberOfTargets, marcher->GetReachedTargetPoints()->Size());
282317

283318
// Find the largest reaching time of the TargetPoints. This is the largest time of
284319
// all of the target points.

0 commit comments

Comments
 (0)