Skip to content

Commit 1e3c37b

Browse files
authored
2360 - Fix ellipsoid_multiple_domain_mesh example not working Use Case (#2362)
* Fix #2360 - ellipsoid_multiple_domain_mesh example not working * Change order of alignment so that global doesn't use the local alignment. * Fix MLPCA when not using only X,Y,Z
1 parent 789d637 commit 1e3c37b

File tree

3 files changed

+68
-61
lines changed

3 files changed

+68
-61
lines changed

Examples/Python/ellipsoid_multiple_domain_mesh.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,7 @@ def Run_Pipeline(args):
3838
else:
3939
dataset_name = "ellipsoid_multiple_domain_mesh"
4040
sw.download_dataset(dataset_name, output_directory)
41-
dataset_name = "ellipsoid_joint_rotation"
42-
mesh_files = sorted(glob.glob(output_directory +
43-
dataset_name + "/meshes/*.vtk"))
41+
mesh_files = sorted(glob.glob(output_directory + "/meshes/*.vtk"))
4442

4543
if args.use_subsample:
4644
inputMeshes =[sw.Mesh(filename) for filename in mesh_files]

Libs/Groom/Groom.cpp

Lines changed: 57 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -529,58 +529,9 @@ bool Groom::run_alignment() {
529529

530530
// per-domain alignment
531531
for (size_t domain = 0; domain < num_domains; domain++) {
532-
if (abort_) {
533-
return false;
534-
}
535-
536532
auto params = GroomParameters(project_, project_->get_domain_names()[domain]);
537-
if (params.get_alignment_enabled()) {
538-
any_alignment = true;
539-
}
540-
541533
if (params.get_use_icp()) {
542534
global_icp = true;
543-
std::vector<Mesh> reference_meshes;
544-
std::vector<Mesh> meshes;
545-
for (size_t i = 0; i < subjects.size(); i++) {
546-
if (!subjects[i]->is_excluded()) {
547-
Mesh mesh = get_mesh(i, domain, true);
548-
// if fixed subjects are present, only add the fixed subjects
549-
if (subjects[i]->is_fixed() || !project_->get_fixed_subjects_present()) {
550-
reference_meshes.push_back(mesh);
551-
}
552-
meshes.push_back(mesh);
553-
}
554-
}
555-
556-
reference_index = params.get_alignment_reference();
557-
subset_size = params.get_alignment_subset_size();
558-
559-
Mesh reference_mesh = vtkSmartPointer<vtkPolyData>::New();
560-
if (reference_index < 0 || reference_index >= subjects.size()) {
561-
reference_index = MeshUtils::findReferenceMesh(reference_meshes, subset_size);
562-
reference_index = reference_meshes[reference_index].get_id();
563-
}
564-
reference_mesh = get_mesh(reference_index, domain, true);
565-
566-
params.set_alignment_reference_chosen(reference_index);
567-
params.save_to_project();
568-
569-
auto transforms = Groom::get_icp_transforms(meshes, reference_mesh);
570-
assign_transforms(transforms, domain);
571-
} else if (params.get_use_landmarks()) {
572-
global_landmarks = true;
573-
std::vector<vtkSmartPointer<vtkPoints>> landmarks;
574-
for (size_t i = 0; i < subjects.size(); i++) {
575-
landmarks.push_back(get_landmarks(i, domain));
576-
}
577-
578-
int reference_index = Groom::find_reference_landmarks(landmarks);
579-
params.set_alignment_reference_chosen(reference_index);
580-
params.save_to_project();
581-
582-
auto transforms = Groom::get_landmark_transforms(landmarks, reference_index);
583-
assign_transforms(transforms, domain);
584535
}
585536
}
586537

@@ -652,6 +603,63 @@ bool Groom::run_alignment() {
652603
}
653604
}
654605

606+
// per-domain alignment
607+
for (size_t domain = 0; domain < num_domains; domain++) {
608+
if (abort_) {
609+
return false;
610+
}
611+
612+
auto params = GroomParameters(project_, project_->get_domain_names()[domain]);
613+
if (params.get_alignment_enabled()) {
614+
any_alignment = true;
615+
}
616+
617+
if (params.get_use_icp()) {
618+
global_icp = true;
619+
std::vector<Mesh> reference_meshes;
620+
std::vector<Mesh> meshes;
621+
for (size_t i = 0; i < subjects.size(); i++) {
622+
if (!subjects[i]->is_excluded()) {
623+
Mesh mesh = get_mesh(i, domain, true);
624+
// if fixed subjects are present, only add the fixed subjects
625+
if (subjects[i]->is_fixed() || !project_->get_fixed_subjects_present()) {
626+
reference_meshes.push_back(mesh);
627+
}
628+
meshes.push_back(mesh);
629+
}
630+
}
631+
632+
reference_index = params.get_alignment_reference();
633+
subset_size = params.get_alignment_subset_size();
634+
635+
Mesh reference_mesh = vtkSmartPointer<vtkPolyData>::New();
636+
if (reference_index < 0 || reference_index >= subjects.size()) {
637+
reference_index = MeshUtils::findReferenceMesh(reference_meshes, subset_size);
638+
reference_index = reference_meshes[reference_index].get_id();
639+
}
640+
reference_mesh = get_mesh(reference_index, domain, true);
641+
642+
params.set_alignment_reference_chosen(reference_index);
643+
params.save_to_project();
644+
645+
auto transforms = Groom::get_icp_transforms(meshes, reference_mesh);
646+
assign_transforms(transforms, domain);
647+
} else if (params.get_use_landmarks()) {
648+
global_landmarks = true;
649+
std::vector<vtkSmartPointer<vtkPoints>> landmarks;
650+
for (size_t i = 0; i < subjects.size(); i++) {
651+
landmarks.push_back(get_landmarks(i, domain));
652+
}
653+
654+
int reference_index = Groom::find_reference_landmarks(landmarks);
655+
params.set_alignment_reference_chosen(reference_index);
656+
params.save_to_project();
657+
658+
auto transforms = Groom::get_landmark_transforms(landmarks, reference_index);
659+
assign_transforms(transforms, domain);
660+
}
661+
}
662+
655663
return true;
656664
}
657665

Libs/Particles/ParticleShapeStatistics.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -212,12 +212,13 @@ void ParticleShapeStatistics::compute_multi_level_analysis_statistics(std::vecto
212212
m += (this->num_particles_array_[idx]);
213213
}
214214
super_matrix_.resize(m, n);
215+
215216
for (unsigned int i = 0; i < points.size(); i++) {
216217
unsigned int p = super_matrix_.rows();
217218
for (unsigned int j = 0; j < p; j++) {
218-
super_matrix_(j, i * values_per_particle_) = points[i][j * values_per_particle_];
219-
super_matrix_(j, i * values_per_particle_ + 1) = points[i][j * values_per_particle_ + 1];
220-
super_matrix_(j, i * values_per_particle_ + 2) = points[i][j * values_per_particle_ + 2];
219+
for (int k = 0; k < values_per_particle_; k++) {
220+
super_matrix_(j, i * values_per_particle_ + k) = points[i][j * values_per_particle_ + k];
221+
}
221222
}
222223
}
223224

@@ -263,9 +264,9 @@ void ParticleShapeStatistics::compute_multi_level_analysis_statistics(std::vecto
263264
for (unsigned int i = 0; i < num_samples_; i++) {
264265
unsigned int p = m;
265266
for (unsigned int j = 0; j < p; j++) {
266-
z_shape_dev_objective(j * values_per_particle_, i) = z_shape_dev_centered(j, i * values_per_particle_);
267-
z_shape_dev_objective(j * values_per_particle_ + 1, i) = z_shape_dev_centered(j, i * values_per_particle_ + 1);
268-
z_shape_dev_objective(j * values_per_particle_ + 2, i) = z_shape_dev_centered(j, i * values_per_particle_ + 2);
267+
for (int k = 0; k < values_per_particle_; k++) {
268+
z_shape_dev_objective(j * values_per_particle_ + k, i) = z_shape_dev_centered(j, i * values_per_particle_ + k);
269+
}
269270
}
270271
}
271272
points_minus_mean_shape_dev_.resize(M, num_samples_);
@@ -277,9 +278,9 @@ void ParticleShapeStatistics::compute_multi_level_analysis_statistics(std::vecto
277278
z_rel_pose_objective.resize(domains_per_shape_ * values_per_particle_, num_samples_);
278279
for (unsigned int k = 0; k < domains_per_shape_; k++) {
279280
for (unsigned int i = 0; i < num_samples_; i++) {
280-
z_rel_pose_objective(k * values_per_particle_, i) = z_rel_pose_centered(k, i * values_per_particle_);
281-
z_rel_pose_objective(k * values_per_particle_ + 1, i) = z_rel_pose_centered(k, i * values_per_particle_ + 1);
282-
z_rel_pose_objective(k * values_per_particle_ + 2, i) = z_rel_pose_centered(k, i * values_per_particle_ + 2);
281+
for (int j = 0; j < values_per_particle_; j++) {
282+
z_rel_pose_objective(k * values_per_particle_ + j, i) = z_rel_pose_centered(k, i * values_per_particle_ + j);
283+
}
283284
}
284285
}
285286
points_minus_mean_rel_pose_.resize(domains_per_shape_ * values_per_particle_, num_samples_);

0 commit comments

Comments
 (0)