@@ -70,6 +70,9 @@ Parameters ReadH5EspritDataFilter::parameters() const
70
70
OEMEbsdScanSelectionParameter::ValueType{},
71
71
/* OEMEbsdScanSelectionParameter::AllowedManufacturers{EbsdLib::OEM::Bruker, EbsdLib::OEM::DREAM3D},*/
72
72
OEMEbsdScanSelectionParameter::EbsdReaderType::Esprit, OEMEbsdScanSelectionParameter::ExtensionsType{" .h5" , " .hdf5" }));
73
+ params.insertLinkableParameter (std::make_unique<BoolParameter>(
74
+ k_CombineScans_Key, " Combine Scans" , " If true combines each of the multiple scans into a single image geometry along the z axis, else each will result in an individual geometry" , true ));
75
+ params.insert (std::make_unique<Float32Parameter>(k_ZSpacing_Key, " Z Spacing (Microns)" , " The spacing in microns between each layer." , 1 .0f ));
73
76
params.insert (std::make_unique<VectorFloat32Parameter>(k_Origin_Key, " Origin" , " The origin of the volume" , std::vector<float32>{0 .0F , 0 .0F , 0 .0F }, std::vector<std::string>{" x" , " y" , " z" }));
74
77
params.insert (std::make_unique<Float32Parameter>(k_ZSpacing_Key, " Z Spacing (Microns)" , " The spacing in microns between each layer." , 1 .0f ));
75
78
params.insert (std::make_unique<BoolParameter>(k_DegreesToRadians_Key, " Convert Euler Angles to Radians" , " Whether or not to convert the euler angles to radians" , true ));
@@ -83,13 +86,22 @@ Parameters ReadH5EspritDataFilter::parameters() const
83
86
params.insert (std::make_unique<DataObjectNameParameter>(k_CellEnsembleAttributeMatrixName_Key, " Ensemble Attribute Matrix" , " The Attribute Matrix where the phase information is stored." ,
84
87
" Cell Ensemble Data" ));
85
88
89
+ // Link Parameters
90
+ params.linkParameters (k_CombineScans_Key, k_Origin_Key, true );
91
+ params.linkParameters (k_CombineScans_Key, k_CreatedImageGeometryPath_Key, true );
92
+
86
93
return params;
87
94
}
88
95
89
96
// ------------------------------------------------------------------------------
90
97
IFilter::VersionType ReadH5EspritDataFilter::parametersVersion () const
91
98
{
92
- return 1 ;
99
+ return 2 ;
100
+
101
+ // Version 1 -> 2
102
+ // Change 1:
103
+ // Added - k_CombineScans_Key = "combine_scans";
104
+ // Solution - default parameter value 'true' preserves backwards functionality;
93
105
}
94
106
95
107
// ------------------------------------------------------------------------------
@@ -103,6 +115,7 @@ IFilter::PreflightResult ReadH5EspritDataFilter::preflightImpl(const DataStructu
103
115
const std::atomic_bool& shouldCancel) const
104
116
{
105
117
auto pSelectedScanNamesValue = filterArgs.value <OEMEbsdScanSelectionParameter::ValueType>(k_SelectedScanNames_Key);
118
+ auto pCombineScansValue = filterArgs.value <bool >(k_CombineScans_Key); // V2 Param
106
119
auto pZSpacingValue = filterArgs.value <float32>(k_ZSpacing_Key);
107
120
auto pOriginValue = filterArgs.value <VectorFloat32Parameter::ValueType>(k_Origin_Key);
108
121
auto pDegreesToRadiansValue = filterArgs.value <bool >(k_DegreesToRadians_Key);
@@ -111,10 +124,9 @@ IFilter::PreflightResult ReadH5EspritDataFilter::preflightImpl(const DataStructu
111
124
auto pCellAttributeMatrixNameValue = filterArgs.value <std::string>(k_CellAttributeMatrixName_Key);
112
125
auto pCellEnsembleAttributeMatrixNameValue = filterArgs.value <std::string>(k_CellEnsembleAttributeMatrixName_Key);
113
126
114
- DataPath cellEnsembleAMPath = pImageGeometryNameValue. createChildPath (pCellEnsembleAttributeMatrixNameValue) ;
115
- DataPath cellAMPath = pImageGeometryNameValue. createChildPath (pCellAttributeMatrixNameValue) ;
127
+ DataPath cellEnsembleAMPath = {} ;
128
+ DataPath cellAMPath = {} ;
116
129
117
- PreflightResult preflightResult;
118
130
nx::core::Result<OutputActions> resultOutputActions;
119
131
std::vector<PreflightValue> preflightUpdatedValues;
120
132
@@ -131,81 +143,107 @@ IFilter::PreflightResult ReadH5EspritDataFilter::preflightImpl(const DataStructu
131
143
H5EspritReader::Pointer reader = H5EspritReader::New ();
132
144
reader->setFileName (pSelectedScanNamesValue.inputFilePath .string ());
133
145
reader->setReadPatternData (pReadPatternDataValue);
134
- reader->setHDF5Path (pSelectedScanNamesValue.scanNames .front ());
135
- if (const int err = reader->readHeaderOnly (); err < 0 )
136
- {
137
- return MakePreflightErrorResult (-9682 , fmt::format (" An error occurred while reading the header data\n {} : {}" , err, reader->getErrorMessage ()));
138
- }
139
146
140
- // create the Image Geometry and it's attribute matrices
141
- const CreateImageGeometryAction::DimensionType dims = {static_cast <usize>(reader->getXDimension ()), static_cast <usize>(reader->getYDimension ()), pSelectedScanNamesValue.scanNames .size ()};
142
- const std::vector<usize> tupleDims = {dims[2 ], dims[1 ], dims[0 ]};
147
+ for (const auto & name : pSelectedScanNamesValue.scanNames )
143
148
{
144
- CreateImageGeometryAction::SpacingType spacing = { static_cast <float32>( reader->getXStep ()), static_cast <float32>(reader-> getYStep ()), pZSpacingValue} ;
145
- for ( float & value : spacing )
149
+ reader->setHDF5Path (name) ;
150
+ if ( const int err = reader-> readHeaderOnly (); err < 0 )
146
151
{
147
- value = (value == 0 . 0f ? 1 . 0f : value );
152
+ return MakePreflightErrorResult (- 9682 , fmt::format ( " An error occurred while reading the header data \n {} : {} " , err, reader-> getErrorMessage ()) );
148
153
}
149
- auto createDataGroupAction = std::make_unique<CreateImageGeometryAction>(pImageGeometryNameValue, dims, pOriginValue, spacing, pCellAttributeMatrixNameValue);
150
- resultOutputActions.value ().appendAction (std::move (createDataGroupAction));
151
- }
152
- const auto phases = reader->getPhaseVector ();
153
- std::vector<usize> ensembleTupleDims{phases.size () + 1 };
154
- {
155
- auto createAttributeMatrixAction = std::make_unique<CreateAttributeMatrixAction>(cellEnsembleAMPath, ensembleTupleDims);
156
- resultOutputActions.value ().appendAction (std::move (createAttributeMatrixAction));
157
- }
158
154
159
- // create the cell ensemble arrays : these arrays are purposely created using the AngFile constant names to match the corresponding Oim import filter!
160
- {
161
- auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::uint32, ensembleTupleDims, std::vector<usize>{1 }, cellEnsembleAMPath.createChildPath (EbsdLib::AngFile::CrystalStructures));
162
- resultOutputActions.value ().appendAction (std::move (createArrayAction));
163
- }
164
- {
165
- auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::float32, ensembleTupleDims, std::vector<usize>{6 }, cellEnsembleAMPath.createChildPath (EbsdLib::AngFile::LatticeConstants));
166
- resultOutputActions.value ().appendAction (std::move (createArrayAction));
167
- }
168
- {
169
- auto createArrayAction = std::make_unique<CreateStringArrayAction>(ensembleTupleDims, cellEnsembleAMPath.createChildPath (EbsdLib::AngFile::MaterialName));
170
- resultOutputActions.value ().appendAction (std::move (createArrayAction));
171
- }
155
+ CreateImageGeometryAction::SpacingType spacing = {static_cast <CreateImageGeometryAction::SpacingType::value_type>(reader->getXStep ()),
156
+ static_cast <CreateImageGeometryAction::SpacingType::value_type>(reader->getYStep ()), pZSpacingValue};
157
+ std::transform (spacing.cbegin (), spacing.cend (), spacing.begin (), [](CreateImageGeometryAction::SpacingType::value_type value) { return (value == 0 .0f ? 1 .0f : value); });
172
158
173
- // create the cell data arrays
174
- H5EspritFields espritFeatures;
175
- const auto names = espritFeatures.getFilterFeatures <std::vector<std::string>>();
176
- for (const auto & name : names)
177
- {
178
- if (name == EbsdLib::H5Esprit::phi1 || name == EbsdLib::H5Esprit::PHI || name == EbsdLib::H5Esprit::phi2)
159
+ CreateImageGeometryAction::DimensionType dims = {static_cast <CreateImageGeometryAction::DimensionType::value_type>(reader->getXDimension ()),
160
+ static_cast <CreateImageGeometryAction::DimensionType::value_type>(reader->getYDimension ()),
161
+ pCombineScansValue ? pSelectedScanNamesValue.scanNames .size () : static_cast <CreateImageGeometryAction::DimensionType::value_type>(1 )};
162
+ const std::vector<CreateImageGeometryAction::DimensionType::value_type> tupleDims = {dims[2 ], dims[1 ], dims[0 ]};
163
+
164
+ if (pCombineScansValue)
165
+ {
166
+ cellEnsembleAMPath = pImageGeometryNameValue.createChildPath (pCellEnsembleAttributeMatrixNameValue);
167
+ cellAMPath = pImageGeometryNameValue.createChildPath (pCellAttributeMatrixNameValue);
168
+
169
+ auto createDataGroupAction = std::make_unique<CreateImageGeometryAction>(pImageGeometryNameValue, dims, pOriginValue, spacing, pCellAttributeMatrixNameValue);
170
+ resultOutputActions.value ().appendAction (std::move (createDataGroupAction));
171
+ }
172
+ else
173
+ {
174
+ DataPath imagePath = DataPath ({name});
175
+ cellEnsembleAMPath = imagePath.createChildPath (pCellEnsembleAttributeMatrixNameValue);
176
+ cellAMPath = imagePath.createChildPath (pCellAttributeMatrixNameValue);
177
+ CreateImageGeometryAction::OriginType origin = {reader->getXStar (), reader->getYStar (), reader->getZStar ()};
178
+
179
+ auto createDataGroupAction = std::make_unique<CreateImageGeometryAction>(imagePath, dims, origin, spacing, pCellAttributeMatrixNameValue);
180
+ resultOutputActions.value ().appendAction (std::move (createDataGroupAction));
181
+ }
182
+
183
+ const auto phases = reader->getPhaseVector ();
184
+ std::vector<usize> ensembleTupleDims{phases.size () + 1 };
179
185
{
180
- continue ;
186
+ auto createAttributeMatrixAction = std::make_unique<CreateAttributeMatrixAction>(cellEnsembleAMPath, ensembleTupleDims);
187
+ resultOutputActions.value ().appendAction (std::move (createAttributeMatrixAction));
181
188
}
182
189
183
- if (reader-> getPointerType (name) == EbsdLib::NumericTypes::Type::Int32)
190
+ // create the cell ensemble arrays : these arrays are purposely created using the AngFile constant names to match the corresponding Oim import filter!
184
191
{
185
- auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::int32, tupleDims , std::vector<usize>{1 }, cellAMPath .createChildPath (name ));
192
+ auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::uint32, ensembleTupleDims , std::vector<usize>{1 }, cellEnsembleAMPath .createChildPath (EbsdLib::AngFile::CrystalStructures ));
186
193
resultOutputActions.value ().appendAction (std::move (createArrayAction));
187
194
}
188
- else if (reader->getPointerType (name) == EbsdLib::NumericTypes::Type::Float)
189
195
{
190
- auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::float32, tupleDims , std::vector<usize>{1 }, cellAMPath .createChildPath (name ));
196
+ auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::float32, ensembleTupleDims , std::vector<usize>{6 }, cellEnsembleAMPath .createChildPath (EbsdLib::AngFile::LatticeConstants ));
191
197
resultOutputActions.value ().appendAction (std::move (createArrayAction));
192
198
}
193
- }
194
- {
195
- auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::float32, tupleDims, std::vector<usize>{3 }, cellAMPath.createChildPath (EbsdLib::Esprit::EulerAngles));
196
- resultOutputActions.value ().appendAction (std::move (createArrayAction));
197
- }
198
- if (pReadPatternDataValue)
199
- {
200
- std::array<int32, 2 > patternDims = {{0 , 0 }};
201
- reader->getPatternDims (patternDims);
202
- if (patternDims[0 ] == 0 || patternDims[1 ] == 0 )
203
199
{
204
- return MakePreflightErrorResult (-9683 , fmt::format (" The parameter 'Read Pattern Data' has been enabled but there does not seem to be any pattern data in the file for the scan name selected" ));
200
+ auto createArrayAction = std::make_unique<CreateStringArrayAction>(ensembleTupleDims, cellEnsembleAMPath.createChildPath (EbsdLib::AngFile::MaterialName));
201
+ resultOutputActions.value ().appendAction (std::move (createArrayAction));
202
+ }
203
+
204
+ // create the cell data arrays
205
+ H5EspritFields espritFeatures;
206
+ const auto names = espritFeatures.getFilterFeatures <std::vector<std::string>>();
207
+ for (const auto & featureName : names)
208
+ {
209
+ if (featureName == EbsdLib::H5Esprit::phi1 || featureName == EbsdLib::H5Esprit::PHI || featureName == EbsdLib::H5Esprit::phi2)
210
+ {
211
+ continue ;
212
+ }
213
+
214
+ if (reader->getPointerType (featureName) == EbsdLib::NumericTypes::Type::Int32)
215
+ {
216
+ auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::int32, tupleDims, std::vector<usize>{1 }, cellAMPath.createChildPath (featureName));
217
+ resultOutputActions.value ().appendAction (std::move (createArrayAction));
218
+ }
219
+ else if (reader->getPointerType (featureName) == EbsdLib::NumericTypes::Type::Float)
220
+ {
221
+ auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::float32, tupleDims, std::vector<usize>{1 }, cellAMPath.createChildPath (featureName));
222
+ resultOutputActions.value ().appendAction (std::move (createArrayAction));
223
+ }
224
+ }
225
+
226
+ {
227
+ auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::float32, tupleDims, std::vector<usize>{3 }, cellAMPath.createChildPath (EbsdLib::Esprit::EulerAngles));
228
+ resultOutputActions.value ().appendAction (std::move (createArrayAction));
229
+ }
230
+ if (pReadPatternDataValue)
231
+ {
232
+ std::array<int32, 2 > patternDims = {{0 , 0 }};
233
+ reader->getPatternDims (patternDims);
234
+ if (patternDims[0 ] == 0 || patternDims[1 ] == 0 )
235
+ {
236
+ return MakePreflightErrorResult (-9683 , fmt::format (" The parameter 'Read Pattern Data' has been enabled but there does not seem to be any pattern data in the file for the scan name selected" ));
237
+ }
238
+ auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::uint8, tupleDims, std::vector<usize>{static_cast <usize>(patternDims[0 ]), static_cast <usize>(patternDims[1 ])},
239
+ cellAMPath.createChildPath (EbsdLib::H5Esprit::RawPatterns));
240
+ resultOutputActions.value ().appendAction (std::move (createArrayAction));
241
+ }
242
+
243
+ if (pCombineScansValue)
244
+ {
245
+ break ;
205
246
}
206
- auto createArrayAction = std::make_unique<CreateArrayAction>(DataType::uint8, tupleDims, std::vector<usize>{static_cast <usize>(patternDims[0 ]), static_cast <usize>(patternDims[1 ])},
207
- cellAMPath.createChildPath (EbsdLib::H5Esprit::RawPatterns));
208
- resultOutputActions.value ().appendAction (std::move (createArrayAction));
209
247
}
210
248
211
249
return {std::move (resultOutputActions), std::move (preflightUpdatedValues)};
@@ -216,13 +254,15 @@ Result<> ReadH5EspritDataFilter::executeImpl(DataStructure& dataStructure, const
216
254
const std::atomic_bool& shouldCancel) const
217
255
{
218
256
ReadH5DataInputValues inputValues;
219
- ReadH5EspritDataInputValues espritInputValues;
220
257
221
258
inputValues.SelectedScanNames = filterArgs.value <OEMEbsdScanSelectionParameter::ValueType>(k_SelectedScanNames_Key);
259
+ inputValues.CombineScans = filterArgs.value <bool >(k_CombineScans_Key);
222
260
inputValues.ReadPatternData = filterArgs.value <bool >(k_ReadPatternData_Key);
223
261
inputValues.ImageGeometryPath = filterArgs.value <DataPath>(k_CreatedImageGeometryPath_Key);
224
- inputValues.CellEnsembleAttributeMatrixPath = inputValues.ImageGeometryPath .createChildPath (filterArgs.value <std::string>(k_CellEnsembleAttributeMatrixName_Key));
225
- inputValues.CellAttributeMatrixPath = inputValues.ImageGeometryPath .createChildPath (filterArgs.value <std::string>(k_CellAttributeMatrixName_Key));
262
+ inputValues.CellEnsembleAttributeMatrixName = filterArgs.value <std::string>(k_CellEnsembleAttributeMatrixName_Key);
263
+ inputValues.CellAttributeMatrixName = filterArgs.value <std::string>(k_CellAttributeMatrixName_Key);
264
+
265
+ ReadH5EspritDataInputValues espritInputValues;
226
266
espritInputValues.DegreesToRadians = filterArgs.value <bool >(k_DegreesToRadians_Key);
227
267
228
268
return ReadH5EspritData (dataStructure, messageHandler, shouldCancel, &inputValues, &espritInputValues)();
0 commit comments