Skip to content

Commit 2df39de

Browse files
committed
BUG: Fixes incorrect number of found features in the feature Attribute Matrix
1 parent 8c40a5f commit 2df39de

File tree

9 files changed

+161
-97
lines changed

9 files changed

+161
-97
lines changed

src/Plugins/OrientationAnalysis/src/OrientationAnalysis/Filters/EBSDSegmentFeaturesFilter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Parameters EBSDSegmentFeaturesFilter::parameters() const
6464
params.insertSeparator(Parameters::Separator{"Input Parameter(s)"});
6565
params.insert(std::make_unique<Float32Parameter>(k_MisorientationTolerance_Key, "Misorientation Tolerance (Degrees)",
6666
"Tolerance (in degrees) used to determine if neighboring Cells belong to the same Feature", 5.0f));
67-
params.insert(std::make_unique<BoolParameter>(k_RandomizeFeatureIds_Key, "Randomize Feature IDs", "Specifies if feature IDs should be randomized during calculations", false));
67+
params.insert(std::make_unique<BoolParameter>(k_RandomizeFeatureIds_Key, "Randomize Feature Ids", "Specifies if feature IDs should be randomized during calculations", false));
6868
params.insert(std::make_unique<ChoicesParameter>(k_NeighborScheme_Key, "Neighbor Scheme", "How many neighbors to use", segment_features::k_6NeighborIndex, segment_features::k_OperationChoices));
6969

7070
params.insertSeparator(Parameters::Separator{"Optional Data Mask"});
Lines changed: 83 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
#include <catch2/catch.hpp>
22

3-
#include "simplnx/UnitTest/UnitTestCommon.hpp"
4-
53
#include "OrientationAnalysis/Filters/CAxisSegmentFeaturesFilter.hpp"
64
#include "OrientationAnalysis/OrientationAnalysis_test_dirs.hpp"
5+
#include "OrientationAnalysisTestUtils.hpp"
6+
7+
#include "simplnx/Core/Application.hpp"
8+
#include "simplnx/Parameters/ArrayCreationParameter.hpp"
9+
#include "simplnx/Parameters/Dream3dImportParameter.hpp"
10+
#include "simplnx/Parameters/GeometrySelectionParameter.hpp"
11+
#include "simplnx/UnitTest/UnitTestCommon.hpp"
712

813
#include <filesystem>
914

@@ -13,98 +18,120 @@ using namespace nx::core::Constants;
1318

1419
namespace
1520
{
16-
const std::string k_ComputedFeatureIds = "NX_FeatureIds";
17-
const std::string k_ComputedCellFeatureData = "NX_CellFeatureData";
18-
} // namespace
21+
}
1922

20-
TEST_CASE("OrientationAnalysis::CAxisSegmentFeaturesFilter: Valid Filter Execution", "[OrientationAnalysis][CAxisSegmentFeaturesFilter]")
23+
TEST_CASE("OrientationAnalysis::CAxisSegmentFeatures:No_Mask", "[OrientationAnalysis][CAxisSegmentFeatures]")
2124
{
2225
UnitTest::LoadPlugins();
23-
const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_CMakeExecutable, nx::core::unit_test::k_TestFilesDir, "caxis_data.tar.gz", "caxis_data");
2426

27+
const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_CMakeExecutable, nx::core::unit_test::k_TestFilesDir, "segment_features_test_data.tar.gz",
28+
"segment_features_test_data");
2529
// Read Exemplar DREAM3D File Filter
26-
auto exemplarFilePath = fs::path(fmt::format("{}/caxis_data/6_6_caxis_segment_features.dream3d", unit_test::k_TestFilesDir));
30+
auto exemplarFilePath = fs::path(fmt::format("{}/segment_features_test_data/segment_features_test_data.dream3d", unit_test::k_TestFilesDir));
2731
DataStructure dataStructure = UnitTest::LoadDataStructure(exemplarFilePath);
2832

29-
// CAxis Segment Features Filter
33+
// EBSD Segment Features/Semgent Features (Misorientation) Filter
3034
{
31-
// Instantiate the filter, a DataStructure object and an Arguments Object
3235
CAxisSegmentFeaturesFilter filter;
3336
Arguments args;
3437

3538
// Create default Parameters for the filter.
39+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_MisorientationTolerance_Key, std::make_any<float32>(5.0F));
40+
41+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_UseMask_Key, std::make_any<bool>(false));
42+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_MaskArrayPath_Key, std::make_any<DataPath>(k_MaskArrayPath));
43+
3644
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_SelectedImageGeometryPath_Key, std::make_any<DataPath>(k_DataContainerPath));
37-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_MisorientationTolerance_Key, std::make_any<float32>(5.0f));
38-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_UseMask_Key, std::make_any<bool>(true));
39-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_RandomizeFeatureIds_Key, std::make_any<bool>(false));
4045
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_QuatsArrayPath_Key, std::make_any<DataPath>(k_QuatsArrayPath));
4146
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_CellPhasesArrayPath_Key, std::make_any<DataPath>(k_PhasesArrayPath));
42-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_MaskArrayPath_Key, std::make_any<DataPath>(k_MaskArrayPath));
4347
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_CrystalStructuresArrayPath_Key, std::make_any<DataPath>(k_CrystalStructuresArrayPath));
44-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_FeatureIdsArrayName_Key, std::make_any<std::string>(k_ComputedFeatureIds));
45-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_CellFeatureAttributeMatrixName_Key, std::make_any<std::string>(k_ComputedCellFeatureData));
48+
49+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_FeatureIdsArrayName_Key, std::make_any<std::string>(k_FeatureIds));
50+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_CellFeatureAttributeMatrixName_Key, std::make_any<std::string>(k_Grain_Data));
4651
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_ActiveArrayName_Key, std::make_any<std::string>(k_ActiveName));
52+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_RandomizeFeatureIds_Key, std::make_any<bool>(false));
4753

4854
// Preflight the filter and check result
4955
auto preflightResult = filter.preflight(dataStructure, args);
50-
SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions)
56+
SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions);
5157

5258
// Execute the filter and check the result
5359
auto executeResult = filter.execute(dataStructure, args);
54-
SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result)
60+
SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result);
5561
}
62+
5663
{
57-
DataPath activeArrayDataPath = k_DataContainerPath.createChildPath(k_ComputedCellFeatureData).createChildPath(k_ActiveName);
64+
DataPath activeArrayDataPath = k_DataContainerPath.createChildPath(k_Grain_Data).createChildPath(k_ActiveName);
5865
UInt8Array& actives = dataStructure.getDataRefAs<UInt8Array>(activeArrayDataPath);
5966
size_t numFeatures = actives.getNumberOfTuples();
60-
REQUIRE(numFeatures == 31229);
67+
REQUIRE(numFeatures == 51);
6168
}
62-
6369
// Loop and compare each array from the 'Exemplar Data / CellData' to the 'Data Container / CellData' group
6470
{
65-
const auto& generatedFeatureIds = dataStructure.getDataRefAs<Int32Array>(k_CellAttributeMatrix.createChildPath(k_ComputedFeatureIds));
66-
const auto& exemplarFeatureIds = dataStructure.getDataRefAs<Int32Array>(k_FeatureIdsArrayPath);
67-
UnitTest::CompareDataArrays<int32>(generatedFeatureIds, exemplarFeatureIds);
71+
const auto& generatedDataArray = dataStructure.getDataRefAs<Int32Array>(k_FeatureIdsArrayPath);
72+
const auto& exemplarDataArray = dataStructure.getDataRefAs<Int32Array>(k_CellAttributeMatrix.createChildPath("CAxis_FeatureIds"));
73+
74+
UnitTest::CompareDataArrays<int32>(generatedDataArray, exemplarDataArray);
6875
}
6976

70-
UnitTest::CheckArraysInheritTupleDims(dataStructure);
77+
UnitTest::CheckArraysInheritTupleDims(dataStructure, SmallIn100::k_TupleCheckIgnoredPaths);
7178
}
7279

73-
TEST_CASE("OrientationAnalysis::CAxisSegmentFeaturesFilter: Invalid Filter Execution", "[OrientationAnalysis][CAxisSegmentFeaturesFilter]")
80+
TEST_CASE("OrientationAnalysis::CAxisSegmentFeatures:Mask", "[OrientationAnalysis][CAxisSegmentFeatures]")
7481
{
82+
const DataPath k_EbsdMaskArrayPath = k_CellAttributeMatrix.createChildPath("Mask (Y Pos)");
83+
7584
UnitTest::LoadPlugins();
76-
const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_CMakeExecutable, nx::core::unit_test::k_TestFilesDir, "caxis_data.tar.gz", "caxis_data");
7785

86+
const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_CMakeExecutable, nx::core::unit_test::k_TestFilesDir, "segment_features_test_data.tar.gz",
87+
"segment_features_test_data");
7888
// Read Exemplar DREAM3D File Filter
79-
auto exemplarFilePath = fs::path(fmt::format("{}/caxis_data/7_0_find_caxis_data.dream3d", unit_test::k_TestFilesDir));
89+
auto exemplarFilePath = fs::path(fmt::format("{}/segment_features_test_data/segment_features_test_data.dream3d", unit_test::k_TestFilesDir));
8090
DataStructure dataStructure = UnitTest::LoadDataStructure(exemplarFilePath);
8191

82-
auto& crystalStructs = dataStructure.getDataRefAs<UInt32Array>(k_CrystalStructuresArrayPath);
83-
crystalStructs[1] = 1;
84-
85-
// Instantiate the filter, a DataStructure object and an Arguments Object
86-
CAxisSegmentFeaturesFilter filter;
87-
Arguments args;
88-
89-
// Invalid crystal structure type : should fail in execute
90-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_SelectedImageGeometryPath_Key, std::make_any<DataPath>(k_DataContainerPath));
91-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_MisorientationTolerance_Key, std::make_any<float32>(5.0f));
92-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_UseMask_Key, std::make_any<bool>(false));
93-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_RandomizeFeatureIds_Key, std::make_any<bool>(false));
94-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_QuatsArrayPath_Key, std::make_any<DataPath>(k_QuatsArrayPath));
95-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_CellPhasesArrayPath_Key, std::make_any<DataPath>(k_PhasesArrayPath));
96-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_CrystalStructuresArrayPath_Key, std::make_any<DataPath>(k_CrystalStructuresArrayPath));
97-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_FeatureIdsArrayName_Key, std::make_any<std::string>(k_ComputedFeatureIds));
98-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_CellFeatureAttributeMatrixName_Key, std::make_any<std::string>(k_ComputedCellFeatureData));
99-
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_ActiveArrayName_Key, std::make_any<std::string>(k_ActiveName));
100-
101-
// Preflight the filter and check result
102-
auto preflightResult = filter.preflight(dataStructure, args);
103-
SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions)
104-
105-
// Execute the filter and check the result
106-
auto executeResult = filter.execute(dataStructure, args);
107-
SIMPLNX_RESULT_REQUIRE_INVALID(executeResult.result)
108-
109-
UnitTest::CheckArraysInheritTupleDims(dataStructure);
92+
// EBSD Segment Features/Semgent Features (Misorientation) Filter
93+
{
94+
CAxisSegmentFeaturesFilter filter;
95+
Arguments args;
96+
97+
// Create default Parameters for the filter.
98+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_MisorientationTolerance_Key, std::make_any<float32>(5.0F));
99+
100+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_UseMask_Key, std::make_any<bool>(true));
101+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_MaskArrayPath_Key, std::make_any<DataPath>(k_EbsdMaskArrayPath));
102+
103+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_SelectedImageGeometryPath_Key, std::make_any<DataPath>(k_DataContainerPath));
104+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_QuatsArrayPath_Key, std::make_any<DataPath>(k_QuatsArrayPath));
105+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_CellPhasesArrayPath_Key, std::make_any<DataPath>(k_PhasesArrayPath));
106+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_CrystalStructuresArrayPath_Key, std::make_any<DataPath>(k_CrystalStructuresArrayPath));
107+
108+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_FeatureIdsArrayName_Key, std::make_any<std::string>(k_FeatureIds));
109+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_CellFeatureAttributeMatrixName_Key, std::make_any<std::string>(k_Grain_Data));
110+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_ActiveArrayName_Key, std::make_any<std::string>(k_ActiveName));
111+
args.insertOrAssign(CAxisSegmentFeaturesFilter::k_RandomizeFeatureIds_Key, std::make_any<bool>(false));
112+
113+
// Preflight the filter and check result
114+
auto preflightResult = filter.preflight(dataStructure, args);
115+
SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions);
116+
117+
// Execute the filter and check the result
118+
auto executeResult = filter.execute(dataStructure, args);
119+
SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result);
120+
}
121+
122+
{
123+
DataPath activeArrayDataPath = k_DataContainerPath.createChildPath(k_Grain_Data).createChildPath(k_ActiveName);
124+
UInt8Array& actives = dataStructure.getDataRefAs<UInt8Array>(activeArrayDataPath);
125+
size_t numFeatures = actives.getNumberOfTuples();
126+
REQUIRE(numFeatures == 36);
127+
}
128+
// Loop and compare each array from the 'Exemplar Data / CellData' to the 'Data Container / CellData' group
129+
{
130+
const auto& generatedDataArray = dataStructure.getDataRefAs<Int32Array>(k_FeatureIdsArrayPath);
131+
const auto& exemplarDataArray = dataStructure.getDataRefAs<Int32Array>(k_CellAttributeMatrix.createChildPath("CAxis_FeatureIds_Mask"));
132+
133+
UnitTest::CompareDataArrays<int32>(generatedDataArray, exemplarDataArray);
134+
}
135+
136+
UnitTest::CheckArraysInheritTupleDims(dataStructure, SmallIn100::k_TupleCheckIgnoredPaths);
110137
}

src/Plugins/OrientationAnalysis/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ if(EXISTS "${DREAM3D_DATA_DIR}" AND SIMPLNX_DOWNLOAD_TEST_FILES)
153153
download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME 7_ComputeAvgOrientation.tar.gz SHA512 5ee425b9a45da4daab1d43a870b54d57ac8d8e300acda162fa7a974a22b9f5662a98e768cebac1844eb87fcb2bb01624ffaf117d3aacc722aa8701712cbf3c52)
154154
download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME 7_read_oem_ebsd_h5_files.tar.gz SHA512 95fa4cc0fb6bce26bfd6d28c0205a9e0f6497ad876a7cc4381117e668836936b35683ed5ec757cadd124a6c6fec7b38fe11f72512105bbd677bcf4210892ac19)
155155
download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME compute_feature_neighbor_caxis_misalignments.tar.gz SHA512 955cd35b7ae24579ef9c533df34e1118012a8e5e2a71f8613117c714fc220c5dfa78d91a2964b41752e70684b79d4aa790e488e9a7be4c9dcf7b642ee2897ceb)
156+
download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME segment_features_test_data.tar.gz SHA512 c2b9582062a1776063bacac181828479ca73802e83abc6da8b3e58213395f7003aaaadd24df801e8dad35af955c368a68050c666f8ccc88ddde85abb9b5bedd4)
156157

157158
endif()
158159

0 commit comments

Comments
 (0)