Skip to content

Commit f8d9c06

Browse files
authored
Merge pull request #2127 from SCIInstitute/2124-vtk_particles
2124 vtk particles
2 parents 96a9a64 + 75817e7 commit f8d9c06

46 files changed

Lines changed: 3559 additions & 1142 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Applications/shapeworks/Commands.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,10 @@ void OptimizeCommand::buildParser() {
102102

103103
parser.add_option("--name").action("store").type("string").set_default("").help("Path to project file.");
104104
parser.add_option("--progress").action("store_true").set_default(false).help("Show progress [default: false].");
105-
parser.add_option("--xmlconsole").action("store_true").set_default(false).help("XML console output [default: false].");
105+
parser.add_option("--xmlconsole")
106+
.action("store_true")
107+
.set_default(false)
108+
.help("XML console output [default: false].");
106109

107110
Command::buildParser();
108111
}
@@ -133,7 +136,6 @@ bool OptimizeCommand::execute(const optparse::Values& options, SharedCommandData
133136
return false;
134137
}
135138

136-
137139
const auto oldBasePath = boost::filesystem::current_path();
138140
auto base = StringUtils::getPath(projectFile);
139141
if (base != projectFile) {
@@ -179,7 +181,10 @@ void GroomCommand::buildParser() {
179181

180182
parser.add_option("--name").action("store").type("string").set_default("").help("Path to project file.");
181183
parser.add_option("--progress").action("store_true").set_default(false).help("Show progress [default: false].");
182-
parser.add_option("--xmlconsole").action("store_true").set_default(false).help("XML console output [default: false].");
184+
parser.add_option("--xmlconsole")
185+
.action("store_true")
186+
.set_default(false)
187+
.help("XML console output [default: false].");
183188

184189
Command::buildParser();
185190
}
@@ -236,8 +241,10 @@ void AnalyzeCommand::buildParser() {
236241

237242
parser.add_option("--name").action("store").type("string").set_default("").help("Path to project file.");
238243
parser.add_option("--output").action("store").type("string").set_default("").help("Path to output file.");
239-
parser.add_option("--range").action("store").type("float").set_default(3.0f).help("Standard deviation range for PCA [default: 3.0].");
240-
parser.add_option("--steps").action("store").type("int").set_default(21).help("Number of steps to use for PCA [default: 21].");
244+
parser.add_option("--range").action("store").type("float").set_default(3.0f).help(
245+
"Standard deviation range for PCA [default: 3.0].");
246+
parser.add_option("--steps").action("store").type("int").set_default(21).help(
247+
"Number of steps to use for PCA [default: 21].");
241248

242249
Command::buildParser();
243250
}

Libs/Optimize/Optimize.cpp

Lines changed: 77 additions & 95 deletions
Large diffs are not rendered by default.

Libs/Optimize/Optimize.h

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,6 @@ class Optimize {
174174
void SetOptimizationIterationsCompleted(int optimization_iterations_completed);
175175
//! Set the number of iterations per split
176176
void SetIterationsPerSplit(int iterations_per_split);
177-
//! Set the init criterion (TODO: details)
178-
void SetInitializationCriterion(double init_criterion);
179-
//! Set the optimization criterion (TODO: details)
180-
void SetOptimizationCriterion(double opt_criterion);
181177
//! Set if shape statistics should be used in initialization
182178
void SetUseShapeStatisticsInInit(bool use_shape_statistics_in_init);
183179
//! Set the interval for running procrustes (0 to disable)
@@ -208,9 +204,9 @@ class Optimize {
208204
//! Set if mixed effects should be used (TODO: details)
209205
void SetUseMixedEffects(bool use_mixed_effects);
210206

211-
//! Set if optimization should be done using disentangled spatiotemporal SSM method
207+
//! Set if optimization should be done using disentangled spatiotemporal SSM method
212208
void SetUseDisentangledSpatiotemporalSSM(bool use_disentangled_ssm_4d);
213-
//! Returns true if optimization is to be done using disentangled spatiotemporal SSM method
209+
//! Returns true if optimization is to be done using disentangled spatiotemporal SSM method
214210
bool GetUseDisentangledSpatiotemporalSSM();
215211

216212
//! For good/bad analysis, set the normal angle to use (TODO: details)
@@ -291,7 +287,7 @@ class Optimize {
291287
//! n * number_of_triangles
292288
void SetGeodesicsCacheSizeMultiplier(size_t n);
293289

294-
shapeworks::OptimizationVisualizer& GetVisualizer();
290+
OptimizationVisualizer& GetVisualizer();
295291
void SetShowVisualizer(bool show);
296292
bool GetShowVisualizer();
297293

@@ -302,6 +298,8 @@ class Optimize {
302298

303299
void UpdateProgress();
304300

301+
void set_particle_format(std::string format) { particle_format_ = format; }
302+
305303
protected:
306304
//! Set the iteration callback. Derived classes should override to set their own callback
307305
virtual void SetIterationCallback();
@@ -399,8 +397,6 @@ class Optimize {
399397
int m_optimization_iterations = 2000;
400398
int m_optimization_iterations_completed = 0;
401399
int m_iterations_per_split = 1000;
402-
double m_initialization_criterion = 1e-6;
403-
double m_optimization_criterion = 1e-6;
404400
bool m_use_shape_statistics_in_init = false;
405401
unsigned int m_procrustes_interval = 3;
406402
bool m_procrustes_scaling = true;
@@ -459,6 +455,7 @@ class Optimize {
459455
bool show_visualizer_ = false;
460456
shapeworks::OptimizationVisualizer visualizer_;
461457

458+
std::string particle_format_ = "particles";
462459
std::shared_ptr<Project> project_;
463460

464461
std::chrono::system_clock::time_point m_start_time;

Libs/Optimize/OptimizeParameterFile.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -339,16 +339,6 @@ bool OptimizeParameterFile::set_optimization_parameters(TiXmlHandle* docHandle,
339339
optimize->SetIterationsPerSplit(atoi(elem->GetText()));
340340
}
341341

342-
elem = docHandle->FirstChild("init_criterion").Element();
343-
if (elem) {
344-
optimize->SetInitializationCriterion(atof(elem->GetText()));
345-
}
346-
347-
elem = docHandle->FirstChild("opt_criterion").Element();
348-
if (elem) {
349-
optimize->SetOptimizationCriterion(atof(elem->GetText()));
350-
}
351-
352342
elem = docHandle->FirstChild("use_shape_statistics_in_init").Element();
353343
if (elem) {
354344
optimize->SetUseShapeStatisticsInInit((bool)atoi(elem->GetText()));

Libs/Optimize/OptimizeParameters.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ const std::string field_attributes = "field_attributes";
4848
const std::string field_attribute_weights = "field_attribute_weights";
4949
const std::string use_geodesics_to_landmarks = "use_geodesics_to_landmarks";
5050
const std::string geodesics_to_landmarks_weight = "geodesics_to_landmarks_weight";
51+
const std::string particle_format = "particle_format";
5152
} // namespace Keys
5253

5354
//---------------------------------------------------------------------------
@@ -87,9 +88,8 @@ OptimizeParameters::OptimizeParameters(ProjectHandle project) {
8788
Keys::use_geodesics_to_landmarks,
8889
Keys::geodesics_to_landmarks_weight,
8990
Keys::keep_checkpoints,
90-
Keys::use_disentangled_ssm
91-
92-
};
91+
Keys::use_disentangled_ssm,
92+
Keys::particle_format};
9393

9494
// check if params_ has any unknown keys
9595
for (auto& param : params_.get_map()) {
@@ -348,6 +348,7 @@ bool OptimizeParameters::set_up_optimize(Optimize* optimize) {
348348
optimize->SetOutputDir(get_output_prefix());
349349
optimize->SetMeshFFCMode(get_mesh_ffc_mode());
350350
optimize->SetUseDisentangledSpatiotemporalSSM(get_use_disentangled_ssm());
351+
optimize->set_particle_format(get_particle_format());
351352

352353
// TODO Remove this once Studio has controls for shared boundary
353354
optimize->SetSharedBoundaryEnabled(true);
@@ -616,9 +617,10 @@ bool OptimizeParameters::set_up_optimize(Optimize* optimize) {
616617

617618
auto name = StringUtils::getBaseFilenameWithoutExtension(filename);
618619

620+
auto extension = get_particle_format();
619621
auto prefix = get_output_prefix();
620-
local_particle_filenames.push_back(prefix + name + "_local.particles");
621-
world_particle_filenames.push_back(prefix + name + "_world.particles");
622+
local_particle_filenames.push_back(prefix + name + "_local." + extension);
623+
world_particle_filenames.push_back(prefix + name + "_world." + extension);
622624
}
623625
s->set_local_particle_filenames(local_particle_filenames);
624626
s->set_world_particle_filenames(world_particle_filenames);
@@ -710,3 +712,9 @@ double OptimizeParameters::get_geodesic_to_landmarks_weight() {
710712
void OptimizeParameters::set_geodesic_to_landmarks_weight(double value) {
711713
params_.set(Keys::geodesics_to_landmarks_weight, value);
712714
}
715+
716+
//---------------------------------------------------------------------------
717+
std::string OptimizeParameters::get_particle_format() { return params_.get(Keys::particle_format, "particles"); }
718+
719+
//---------------------------------------------------------------------------
720+
void OptimizeParameters::set_particle_format(std::string format) { params_.set(Keys::particle_format, format); }

Libs/Optimize/OptimizeParameters.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ class OptimizeParameters {
124124
double get_geodesic_to_landmarks_weight();
125125
void set_geodesic_to_landmarks_weight(double value);
126126

127+
std::string get_particle_format();
128+
void set_particle_format(std::string format);
129+
130+
127131
private:
128132
std::string get_output_prefix();
129133

Libs/Optimize/Sampler.cpp

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22
#include "Sampler.h"
33

44
#include <Logging.h>
5+
#include <Particles/ParticleFile.h>
56

67
#include "Libs/Optimize/Domain/ContourDomain.h"
7-
#include "Libs/Optimize/Domain/ImageDomain.h"
88
#include "Libs/Optimize/Utils/ObjectReader.h"
9-
#include "itkImageRegionIterator.h"
10-
#include "itkParticlePositionReader.h"
9+
1110

1211
namespace shapeworks {
1312

@@ -73,7 +72,6 @@ void Sampler::AllocateDomainsAndNeighborhoods() {
7372
// *after* registering the attributes to the particle system since some of
7473
// them respond to AddDomain.
7574
// Here, the Constraints actually get added to the constraints class
76-
int ctr = 0;
7775
for (unsigned int i = 0; i < this->m_DomainList.size(); i++) {
7876
auto domain = m_DomainList[i];
7977

@@ -91,8 +89,6 @@ void Sampler::AllocateDomainsAndNeighborhoods() {
9189
}
9290
}
9391

94-
auto imageDomain = static_cast<ImplicitSurfaceDomain<ImageType::PixelType>*>(domain.get());
95-
9692
// Adding free-form constraints to constraint object
9793
// std::cout << "m_FFCs.size() " << m_FFCs.size() << std::endl;
9894
if (m_FFCs.size() > i) {
@@ -133,10 +129,8 @@ void Sampler::ReadPointsFiles() {
133129
// If points file names have been specified, then read the initial points.
134130
for (unsigned int i = 0; i < m_PointsFiles.size(); i++) {
135131
if (m_PointsFiles[i] != "") {
136-
ParticlePositionReader::Pointer reader = ParticlePositionReader::New();
137-
reader->SetFileName(m_PointsFiles[i].c_str());
138-
reader->Update();
139-
this->GetParticleSystem()->AddPositionList(reader->GetOutput(), i);
132+
auto points = particles::read_particles_as_vector(m_PointsFiles[i]);
133+
this->GetParticleSystem()->AddPositionList(points, i);
140134
}
141135
}
142136

@@ -148,7 +142,6 @@ void Sampler::ReadPointsFiles() {
148142
void Sampler::InitializeOptimizationFunctions() {
149143
// Set the minimum neighborhood radius and maximum sigma based on the
150144
// domain of the 1st input image.
151-
unsigned int maxdim = 0;
152145
double maxradius = -1.0;
153146
double minimumNeighborhoodRadius = this->m_Spacing;
154147

Libs/Optimize/Utils/ParticleGaussianModeWriter.txx

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#pragma once
22

3+
#include <Particles/ParticleFile.h>
4+
35
#include <string>
46

5-
#include "Libs/Optimize/Domain/ImageDomainWithGradients.h"
6-
#include "itkParticlePositionWriter.h"
7+
//#include "Libs/Optimize/Domain/ImageDomainWithGradients.h"
78
#include "vnl/algo/vnl_symmetric_eigensystem.h"
89

910
namespace shapeworks {
@@ -74,11 +75,7 @@ void ParticleGaussianModeWriter<VDimension>::Update() const {
7475
meanlist.push_back(p);
7576
}
7677

77-
std::string tmpstr = fn + ".mean";
78-
ParticlePositionWriter::Pointer writer = ParticlePositionWriter::New();
79-
writer->SetFileName(tmpstr.c_str());
80-
writer->SetInput(meanlist);
81-
writer->Update();
78+
particles::write_particles_from_vector(fn + ".mean", meanlist);
8279

8380
int modenum = 0;
8481
for (int mode = num_samples - 1; mode > num_samples - (m_NumberOfModes + 1); mode--, modenum++) {
@@ -99,10 +96,9 @@ void ParticleGaussianModeWriter<VDimension>::Update() const {
9996

10097
char fp[255];
10198
::sprintf(fp, ".%d.%d.mode", s, modenum);
102-
tmpstr = fn + fp;
103-
writer->SetFileName(tmpstr.c_str());
104-
writer->SetInput(modelist);
105-
writer->Update();
99+
std::string tmpstr = fn + fp;
100+
101+
particles::write_particles_from_vector(tmpstr, modelist);
106102
}
107103
}
108104
}

Libs/Particles/CMakeLists.txt

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
# Particles library
22

33
set(Particles_sources
4-
ParticleSystemEvaluation.cpp
5-
ParticleShapeStatistics.cpp
6-
ShapeEvaluation.cpp
7-
ReconstructSurface.cpp
8-
ParticleNormalEvaluation.cpp
9-
)
4+
ParticleSystemEvaluation.cpp
5+
ParticleShapeStatistics.cpp
6+
ShapeEvaluation.cpp
7+
ReconstructSurface.cpp
8+
ParticleNormalEvaluation.cpp
9+
ParticleFile.cpp
10+
)
1011

1112
set(Particles_headers
12-
ParticleSystemEvaluation.h
13-
ParticleShapeStatistics.h
14-
itkParticlePositionReader.h
15-
itkParticlePositionWriter.h
16-
EvaluationUtil.h
17-
ShapeEvaluation.h
18-
ReconstructSurface.h
19-
ParticleNormalEvaluation.h
20-
)
13+
ParticleSystemEvaluation.h
14+
ParticleShapeStatistics.h
15+
EvaluationUtil.h
16+
ShapeEvaluation.h
17+
ReconstructSurface.h
18+
ParticleNormalEvaluation.h
19+
ParticleFile.h
20+
)
2121

2222
add_library(Particles STATIC
2323
${Particles_sources}

0 commit comments

Comments
 (0)