Commit 5c34ca37 authored by Benoit Martin's avatar Benoit Martin

Merge branch 'rc-4.0.2' into 'master'

New sobolev gradient for the multi-object case.

See merge request aramislab/deformetrica!12
parents 474b1a65 e784b717
Pipeline #50175068 canceled with stages
in 2 minutes and 8 seconds
......@@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## [4.0.2] - 2018-08-23
- Corrects the sobolev gradient in the multi-object case
## [4.0.1] - 2018-06-27
- Add different polyline VTK format
......@@ -12,11 +16,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
## [4.0.0] - 2018-06-14
### Added
- Bugfix: version file not found. issue #24
- Easy install with `conda install -c pytorch -c conda-forge -c anaconda -c aramislab deformetrica`, without any manual compilation.
- All existing deformetrica functionalities now work with 2d or 3d gray level images.
- Easy install with `conda install -c pytorch -c conda-forge -c anaconda -c aramislab deformetrica`, without any manual compilation.
- All existing deformetrica functionalities now work with 2d or 3d gray level images.
- A L-BFGS optimization method can now be used for registration, regression, deterministic and bayesian atlases.
- Gradients are now automagically computed using PyTorch's autograd.
- It is now possible to perform all computations on the gpu through the `use-cuda` option.
- It is now possible to perform all computations on the gpu through the `use-cuda` option.
### Changed
- C++ is replaced by Python.
......@@ -25,4 +29,3 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
### Removed
- The Nesterov scheme for the gradient ascent optimizer (which was named "FastGradientAscent") is not available anymore. L-BFGS is more efficient though!
# Deformetrica 4.0.0
# Deformetrica 4.0.2
Website: [www.deformetrica.org](http://www.deformetrica.org/)
......@@ -15,14 +15,14 @@ _Deformetrica_ has very little requirements about the data it can deal with. In
- **Requirements**: [Anaconda 3](https://www.anaconda.com/download), Linux or Mac OS X distributions
- **Best practice**: `conda (env) create -n deformetrica && source activate deformetrica`
- **Conda install**: `conda install -c pytorch -c conda-forge -c anaconda -c aramislab deformetrica`
- **Conda install**: `conda install -c pytorch -c conda-forge -c anaconda -c aramislab deformetrica`
- **Run** an [example](https://gitlab.icm-institute.org/aramislab/deformetrica/builds/artifacts/v4.0.0/browse?job=package_and_deploy%3Aexamples): `deformetrica model.xml data_set.xml optimization_parameters.xml`
- **Documentation**: [wiki](https://gitlab.icm-institute.org/aramislab/deformetrica/wikis/home)
## Community
- **Need help?** Ask the [Deformetrica Google group](https://groups.google.com/forum/#!forum/deformetrica).
- Spotted an **issue**? Have a **feature request**? Let us know in the [dedicated Gitlab section](https://gitlab.icm-institute.org/aramislab/deformetrica/issues).
- Spotted an **issue**? Have a **feature request**? Let us know in the [dedicated Gitlab section](https://gitlab.icm-institute.org/aramislab/deformetrica/issues).
## References
......
4.0.1
\ No newline at end of file
4.0.2
......@@ -4,7 +4,7 @@ import torch
from core.model_tools.deformations.exponential import Exponential
from core.models.abstract_statistical_model import AbstractStatisticalModel
from core.models.model_functions import create_regular_grid_of_points, compute_sobolev_gradient
from core.models.model_functions import create_regular_grid_of_points
from core.observations.deformable_objects.deformable_multi_object import DeformableMultiObject
from in_out.array_readers_and_writers import *
from in_out.dataset_functions import create_template_metadata, compute_noise_dimension
......@@ -12,8 +12,10 @@ from support.probability_distributions.inverse_wishart_distribution import Inver
from support.probability_distributions.multi_scalar_inverse_wishart_distribution import \
MultiScalarInverseWishartDistribution
from support.probability_distributions.normal_distribution import NormalDistribution
import support.kernels as kernel_factory
import logging
logger = logging.getLogger(__name__)
......@@ -184,9 +186,11 @@ class BayesianAtlas(AbstractStatisticalModel):
if not self.freeze_template:
if 'landmark_points' in template_data.keys():
if self.use_sobolev_gradient:
gradient['landmark_points'] = compute_sobolev_gradient(
template_points['landmark_points'].grad.detach(),
self.smoothing_kernel_width, self.template).cpu().numpy()
sobolev_kernel = kernel_factory.factory(self.exponential.kernel.kernel_type,
self.smoothing_kernel_width)
gradient['landmark_points'] = sobolev_kernel.convolve(
template_data['landmark_points'].detach(), template_data['landmark_points'].detach(),
template_points['landmark_points'].grad.detach()).cpu().numpy()
else:
gradient['landmark_points'] = template_points['landmark_points'].grad.detach().cpu().numpy()
if 'image_intensities' in template_data.keys():
......@@ -253,7 +257,7 @@ class BayesianAtlas(AbstractStatisticalModel):
prior_scale_matrix = self.priors['covariance_momenta'].scale_matrix
prior_dof = self.priors['covariance_momenta'].degrees_of_freedom
covariance_momenta = (sufficient_statistics['S1'] + prior_dof * np.transpose(prior_scale_matrix)) \
/ (dataset.number_of_subjects + prior_dof)
/ (dataset.number_of_subjects + prior_dof)
self.set_covariance_momenta(covariance_momenta)
# Variance of the residual noise update.
......
......@@ -6,11 +6,11 @@ from torch.multiprocessing import Pool
from core.model_tools.attachments.multi_object_attachment import MultiObjectAttachment
from core.model_tools.deformations.exponential import Exponential
from core.models.abstract_statistical_model import AbstractStatisticalModel
from core.models.model_functions import create_regular_grid_of_points, compute_sobolev_gradient, \
remove_useless_control_points
from core.models.model_functions import create_regular_grid_of_points, remove_useless_control_points
from core.observations.deformable_objects.deformable_multi_object import DeformableMultiObject
from in_out.array_readers_and_writers import *
from in_out.dataset_functions import create_template_metadata
import support.kernels as kernel_factory
import logging
logger = logging.getLogger(__name__)
......@@ -59,9 +59,11 @@ def _subject_attachment_and_regularity(arg):
if not freeze_template:
if 'landmark_points' in template_data.keys():
if use_sobolev_gradient:
gradient['landmark_points'] = compute_sobolev_gradient(
template_points['landmark_points'].grad.detach(),
smoothing_kernel_width, template).cpu().numpy()
sobolev_kernel = kernel_factory.factory(exponential.kernel.kernel_type,
smoothing_kernel_width)
gradient['landmark_points'] = sobolev_kernel.convolve(
template_data['landmark_points'].detach(), template_data['landmark_points'].detach(),
template_points['landmark_points'].grad.detach()).cpu().numpy()
else:
gradient['landmark_points'] = template_points['landmark_points'].grad.detach().cpu().numpy()
if 'image_intensities' in template_data.keys():
......@@ -305,9 +307,11 @@ class DeterministicAtlas(AbstractStatisticalModel):
if not self.freeze_template:
if 'landmark_points' in template_data.keys():
if self.use_sobolev_gradient:
gradient['landmark_points'] = compute_sobolev_gradient(
template_points['landmark_points'].grad.detach(),
self.smoothing_kernel_width, self.template).cpu().numpy()
sobolev_kernel = kernel_factory.factory(self.exponential.kernel.kernel_type,
self.smoothing_kernel_width)
gradient['landmark_points'] = sobolev_kernel.convolve(
template_data['landmark_points'].detach(), template_data['landmark_points'].detach(),
template_points['landmark_points'].grad.detach()).cpu().numpy()
else:
gradient['landmark_points'] = template_points['landmark_points'].grad.detach().cpu().numpy()
if 'image_intensities' in template_data.keys():
......
......@@ -4,10 +4,11 @@ from torch.autograd import Variable
from core.model_tools.attachments.multi_object_attachment import MultiObjectAttachment
from core.model_tools.deformations.geodesic import Geodesic
from core.models.abstract_statistical_model import AbstractStatisticalModel
from core.models.model_functions import create_regular_grid_of_points, compute_sobolev_gradient
from core.models.model_functions import create_regular_grid_of_points
from core.observations.deformable_objects.deformable_multi_object import DeformableMultiObject
from in_out.array_readers_and_writers import *
from in_out.dataset_functions import create_template_metadata
import support.kernels as kernel_factory
import logging
......@@ -154,8 +155,11 @@ class GeodesicRegression(AbstractStatisticalModel):
# gradient[key] = value.grad
if self.use_sobolev_gradient and 'landmark_points' in gradient.keys():
gradient['landmark_points'] = compute_sobolev_gradient(
gradient['landmark_points'], self.smoothing_kernel_width, self.template)
sobolev_kernel = kernel_factory.factory(self.geodesic.forward_exponential.kernel.kernel_type,
self.smoothing_kernel_width)
gradient['landmark_points'] = sobolev_kernel.convolve(
template_data['landmark_points'].detach(), template_data['landmark_points'].detach(),
gradient['landmark_points'].detach())
# Control points and momenta.
if not self.freeze_control_points: gradient['control_points'] = control_points.grad
......
......@@ -12,13 +12,14 @@ import gc
from core.model_tools.deformations.spatiotemporal_reference_frame import SpatiotemporalReferenceFrame
from core.models.abstract_statistical_model import AbstractStatisticalModel
from core.models.model_functions import create_regular_grid_of_points, compute_sobolev_gradient
from core.models.model_functions import create_regular_grid_of_points
from core.observations.deformable_objects.deformable_multi_object import DeformableMultiObject
from in_out.array_readers_and_writers import *
from in_out.dataset_functions import create_template_metadata, compute_noise_dimension
from support.probability_distributions.multi_scalar_inverse_wishart_distribution import \
MultiScalarInverseWishartDistribution
from support.probability_distributions.multi_scalar_normal_distribution import MultiScalarNormalDistribution
import support.kernels as kernel_factory
import logging
logger = logging.getLogger(__name__)
......@@ -292,8 +293,11 @@ class LongitudinalAtlas(AbstractStatisticalModel):
# gradient[key] = value.grad
if self.use_sobolev_gradient and 'landmark_points' in gradient.keys():
gradient['landmark_points'] = compute_sobolev_gradient(
gradient['landmark_points'], self.smoothing_kernel_width, self.template)
sobolev_kernel = kernel_factory.factory(
self.spatiotemporal_reference_frame.exponential.kernel.kernel_type, self.smoothing_kernel_width)
gradient['landmark_points'] = sobolev_kernel.convolve(
template_data['landmark_points'].detach(), template_data['landmark_points'].detach(),
gradient['landmark_points'].detach()).cpu().numpy()
# Other gradients.
if not self.is_frozen['control_points']: gradient['control_points'] = control_points.grad
......
......@@ -105,34 +105,4 @@ def remove_useless_control_points(control_points, image, kernel_width):
neighbouring_voxels[:, 2]] > threshold)):
final_control_points.append(control_point)
return np.array(final_control_points)
def compute_sobolev_gradient(template_gradient, smoothing_kernel_width, template, square_root=False):
"""
Smoothing of the template gradient (for landmarks).
Fully torch input / outputs.
"""
template_sobolev_gradient = torch.zeros(template_gradient.size()).type(Settings().tensor_scalar_type)
kernel = kernel_factory.factory(kernel_factory.Type.TorchKernel)
kernel.kernel_width = smoothing_kernel_width
cursor = 0
for template_object in template.object_list:
# TODO : assert if obj is image or not.
object_data = torch.from_numpy(template_object.get_points()).type(Settings().tensor_scalar_type)
if square_root:
kernel_matrix = kernel.get_kernel_matrix(object_data).data.numpy()
kernel_matrix_sqrt = Variable(torch.from_numpy(
scipy.linalg.sqrtm(kernel_matrix).real).type(Settings().tensor_scalar_type), requires_grad=False)
template_sobolev_gradient[cursor:cursor + len(object_data)] = torch.mm(
kernel_matrix_sqrt, template_gradient[cursor:cursor + len(object_data)])
else:
template_sobolev_gradient[cursor:cursor + len(object_data)] = kernel.convolve(
object_data, object_data, template_gradient[cursor:cursor + len(object_data)])
cursor += len(object_data)
return template_sobolev_gradient
return np.array(final_control_points)
\ No newline at end of file
2454.984575762239 3902.636595782329
3291.315084698552 3297.9208024771506
7096.955818062823 4299.350562084379
4235.302995162259 4892.930458037736
2484.4499216327677 4003.3698095923464
3305.148342566972 3361.7981827348412
7274.197212744213 4420.3319112166355
4356.07976194052 5006.586611980005
......@@ -3,53 +3,53 @@ vtk output
ASCII
DATASET POLYDATA
POINTS 47 float
146.986899279 152.246879445 73.3763394408
142.955667669 148.518035336 72.5403864745
147.675274345 118.023342484 50.5311595705
153.495977191 144.350709759 68.6743315965
144.831607211 130.575007178 57.3306426124
144.417386844 142.564093539 62.333365538
157.450499498 128.441717471 60.1977404851
144.587858966 150.731952349 73.8977038764
142.263629958 149.867663359 72.0049141105
149.888268441 152.644740612 69.3931835533
155.466775813 150.448467542 67.3365691171
153.04280799 151.849995717 70.1253702888
149.97558055 151.817621918 72.7468271672
144.901691943 119.352077908 51.0068343042
141.470294191 123.541342113 55.6281965086
142.419851579 120.718493132 53.8300173352
150.386616612 118.917687894 50.0034232072
153.312711411 119.89138407 51.8040054304
146.259491049 150.527694187 67.062667205
150.60409744 132.151798773 54.9407555431
146.714173956 124.426188048 51.3996776653
147.329698246 146.600809849 72.0045693961
150.575446468 147.165680822 71.5637088881
150.416472101 121.041441274 57.4724123195
150.15476193 123.68384282 60.5137135939
144.801023572 139.058492822 61.3694134243
145.008057215 132.763741078 59.09037776
145.174896786 138.171822322 62.7993426238
142.769418724 126.929065826 60.0584623011
157.737733175 137.127011388 58.9247108294
157.163876583 127.699514553 55.607319244
157.919003465 144.981961469 65.6033571461
158.118360019 135.107768127 62.400844028
143.762937948 149.710349784 67.3168506697
145.422568587 128.953366204 55.3608422076
152.533380602 151.021733541 66.4619926538
152.537781026 123.998621539 51.104221807
155.083903116 128.741242675 53.7717706997
144.326910884 121.985549275 58.3848018776
142.591206169 123.980219226 59.3655171069
145.576897925 126.122781904 61.4235404867
155.79543909 123.155558953 57.1880684705
146.986899279 152.246879445 73.3763394408
146.986899279 152.246879445 73.3763394408
149.97558055 151.817621918 72.7468271672
146.986899279 152.246879445 73.3763394408
152.533380602 151.021733541 66.4619926538
146.99050316648058 152.24159572339772 73.36533323968845
142.9642659248649 148.51625026894789 72.53216517470558
147.66285985020397 118.02737288480667 50.53725567025462
153.48710295233641 144.35049887178138 68.65514498396057
144.83845688530263 130.57596946667508 57.33649859917174
144.4277699137158 142.55367618241328 62.347814763852845
157.43105793893258 128.44883017293955 60.19747643245543
144.59414983514984 150.72886210091033 73.88751479024324
142.2726911673847 149.86470405936134 71.99845842066061
149.8877040218689 152.63507014264226 69.3852723005342
155.45619871663035 150.43936661352726 67.32933315325656
153.03666492584043 151.84199180289156 70.1141728594219
149.9748773134091 151.8120084664562 72.73320173560863
144.88949296027135 119.35844073144092 51.01124178976088
141.463399717458 123.55306526859465 55.627391901814576
142.40665511764385 120.7292937491802 53.82999098903962
150.37618496054048 118.92128140008381 50.01382883491851
153.3018027809203 119.89689997282588 51.81566150381594
146.26638952167812 150.51849529542406 67.06050456588007
150.59907351238374 132.1457511086579 54.95727636831245
146.70961734567746 124.43116563773853 51.41243695201065
147.33383237550086 146.6013740411771 71.98764493296545
150.57346832038778 147.16584988591833 71.54240467807375
150.40517945990933 121.05928161258163 57.474342567615096
150.14619286058777 123.70600970058813 60.50919720027613
144.81167179457626 139.04902900415937 61.38344285276378
145.017019528206 132.7616047217896 59.09694050683955
145.18502923556264 138.16483991003642 62.80920164126587
142.76970842211236 126.94230123416487 60.053213587160194
157.71855950216397 137.1146124713169 58.939896800186105
157.14420775791783 127.70351340870315 55.61580779851885
157.90344831006533 144.97446737246915 65.59877706089773
158.09800558023105 135.1018901301524 62.40573570258896
143.77319527336078 149.7030865088196 67.31656476657214
145.4262510094748 128.95557537404412 55.36916659415134
152.52742775149088 151.01073484882895 66.45714862784038
152.52609389252308 124.00308193515018 51.11995812583912
155.06724266952253 128.74151839121737 53.7861150598213
144.31411970445336 122.00541095815912 58.379495245305534
142.58343949244957 123.99811441846646 59.359070637932405
145.57417231051448 126.14151239841009 61.415746551853964
155.78186000841708 123.16840242213983 57.19241907754957
146.99050316648058 152.24159572339772 73.36533323968845
146.99050316648058 152.24159572339772 73.36533323968845
149.9748773134091 151.8120084664562 72.73320173560863
146.99050316648058 152.24159572339772 73.36533323968845
152.52742775149088 151.01073484882895 66.45714862784038
POLYGONS 80 320
3 8 33 1
3 7 8 1
......
......@@ -3,53 +3,53 @@ vtk output
ASCII
DATASET POLYDATA
POINTS 47 float
147.00075206 152.29733552 73.5551330348
142.913262448 148.571363984 72.6925421104
147.474070139 117.835655405 50.3067013484
153.699645325 144.446287711 68.8965401497
144.67869678 130.609052147 57.0993652567
144.370659189 142.777507632 62.1857400965
157.648675241 128.319568897 60.1847722748
144.569323135 150.776567692 74.0634175024
142.216385399 149.924788613 72.1337448243
149.958902403 152.741212187 69.5544866851
155.632866848 150.566407719 67.4830947076
153.16441625 151.934518608 70.3256698918
150.041108234 151.875455351 72.9621328926
144.650456928 119.202301478 50.7637653509
141.187061316 123.436133834 55.4712868311
142.125124032 120.575968418 53.6448617103
150.268059283 118.719716076 49.7689814636
153.274572269 119.651158059 51.6053154482
146.266238166 150.668402302 67.1411553997
150.70098114 132.234138183 54.5849636817
146.545437631 124.333477106 51.0650892707
147.363703004 146.66179636 72.2398628151
150.686728184 147.233259507 71.8348411547
150.289786661 120.700931297 57.4603144503
150.080470771 123.376586313 60.6009003831
144.747394441 139.2533714 61.1852126523
144.894638762 132.844141075 58.8924920573
145.130734534 138.331775062 62.6784984627
142.529288698 126.838582921 60.017175686
157.989537125 137.2525543 58.7715101816
157.3402713 127.603547099 55.4308603065
158.135794282 145.103741067 65.6937793387
158.368785057 135.148151509 62.3844992792
143.722629578 149.837233817 67.3750098747
145.263464935 128.955283595 55.0730300862
152.672002798 151.168246405 66.577508812
152.554112831 123.853370176 50.7990726226
155.250730796 128.69635237 53.4845363911
144.032802456 121.758216868 58.3629724319
142.309705338 123.822317392 59.3473649022
145.38647201 125.954344359 61.4664422518
155.874257702 122.889094612 57.1442830669
147.00075206 152.29733552 73.5551330348
147.00075206 152.29733552 73.5551330348
150.041108234 151.875455351 72.9621328926
147.00075206 152.29733552 73.5551330348
152.672002798 151.168246405 66.577508812
147.0044315237802 152.29217146589244 73.54425054564071
142.9219163458794 148.56969307360075 72.68442153902839
147.46130934776102 117.83972575602093 50.31273780339911
153.69082946086337 144.44654882264354 68.87668573116899
144.68576049298122 130.60995107240444 57.10538080821071
144.3812824844915 142.7669433406371 62.20068407207417
157.6294355890311 128.3267220955485 60.18432502338862
144.5756697746301 150.77358115843322 74.05336679111882
142.2254835694712 149.9219346057768 72.12739382869874
149.95842329945853 152.73171850715605 69.54655730674178
155.62242845805127 150.55754533145944 67.47578295486419
153.1583639853322 151.92672306705484 70.31442723315024
150.04049359740506 151.87000549133984 72.94856979410557
144.6380724005519 119.2088187807137 50.768177557845014
141.18032412155472 123.44819739127722 55.47037766549249
142.11202441886454 120.58713345594524 53.644801285604515
150.25728072045334 118.72316374547121 49.77928852871662
153.2634476852692 119.65643215602768 51.616950409694034
146.2732970610467 150.65933501290257 67.13903408724009
150.69580011349615 132.22778106545607 54.60201462520723
146.54069176125972 124.33844275020691 51.07793829524252
147.36797304694215 146.66262492443127 72.22281643385524
150.68486032409606 147.23378857273812 71.81323849611137
150.27842713453128 120.7192135808036 57.46182928387545
150.07207486618645 123.39957432090755 60.59557600568767
144.75832686079562 139.24365835834698 61.19979460707894
144.90387217720843 132.8418563271625 58.89930767841833
145.14117619236134 138.32454297183773 62.688856419162995
142.52972972801277 126.85223347596146 60.011475266017754
157.97072572572796 137.24004779982744 58.786886350699874
157.3207259801161 127.60744253990818 55.43921768152249
158.1205153669384 145.0964919200647 65.68912223525989
158.3487001381828 135.14219422580754 62.389526588001914
143.73302051161014 149.83008799373226 67.37483496340121
145.26727550661093 128.95744374975052 55.08158203376401
152.66611167894888 151.1574440153464 66.57255419270842
152.54220112019505 123.85768266251574 50.81473112979269
155.23399272595032 128.6964890832718 53.49890381903498
144.0200473001342 121.77884337784496 58.356973138000924
142.30208889105637 123.84084402044815 59.34032595843128
145.38393012476539 125.97378080366315 61.45788975525956
155.8607897994185 122.90200968629782 57.14847217875932
147.0044315237802 152.29217146589244 73.54425054564071
147.0044315237802 152.29217146589244 73.54425054564071
150.04049359740506 151.87000549133984 72.94856979410557
147.0044315237802 152.29217146589244 73.54425054564071
152.66611167894888 151.1574440153464 66.57255419270842
POLYGONS 80 320
3 8 33 1
3 7 8 1
......
......@@ -3,53 +3,53 @@ vtk output
ASCII
DATASET POLYDATA
POINTS 47 float
146.956165313 152.292719992 73.4617995301
142.882463138 148.565735036 72.6031312832
147.996316426 118.166958687 50.6812776999
153.636721408 144.428485306 68.775623758
145.086268168 130.675659585 57.2927589051
144.433682701 142.715489957 62.1854596566
157.810738875 128.468415758 60.2183617022
144.532287684 150.77294344 73.9753472239
142.186785995 149.918429742 72.0535552988
149.900126821 152.727727482 69.4530488374
155.564042862 150.545359816 67.3872025377
153.098332008 151.92251135 70.21593725
149.984397553 151.869392445 72.8531853442
145.170184066 119.503453791 51.1414834767
141.668652551 123.669709141 55.6885387446
142.644343386 120.873609801 53.93640827
150.735658606 119.017398933 50.1268833311
153.708586744 119.954751526 51.9048637656
146.220941748 150.644990552 67.0522492208
150.970042574 132.236977583 54.8708238211
147.026258964 124.518414963 51.4653070975
147.315566729 146.654938512 72.1138117868
150.621104926 147.224730239 71.6972795982
150.839545462 121.144448535 57.5711069533
150.550302027 123.773613787 60.5727503372
144.890124406 139.197435589 61.2250384115
145.229684866 132.872450322 59.0165550346
145.277152347 138.297586773 62.6882218384
142.971191088 127.044205775 60.0658953129
158.017877165 137.220342619 58.8532079764
157.533323843 127.723426254 55.6133506019
158.079776184 145.075308367 65.6290691214
158.403353163 135.167487813 62.3949159651
143.691510246 149.815874162 67.2967497149
145.712251437 129.047353959 55.3529578939
152.603601707 151.142281092 66.4813461707
152.918628303 124.043751368 51.1558661066
155.471719869 128.777723239 53.7590505239
144.589779693 122.142701074 58.4587749832
142.797559417 124.117533287 59.4048704454
145.844908226 126.24014798 61.4438127082
156.209667508 123.1832906 57.2460961461
146.956165313 152.292719992 73.4617995301
146.956165313 152.292719992 73.4617995301
149.984397553 151.869392445 72.8531853442
146.956165313 152.292719992 73.4617995301
152.603601707 151.142281092 66.4813461707
146.95978996659977 152.2875373002875 73.45081777003425
142.89107961292527 148.56404348563584 72.59492208053204
147.9837860189212 118.17112226771404 50.687390556700734
153.62795351073086 144.42861855351376 68.75591626763142
145.0932865523231 130.67664705435487 57.29859251720055
144.44432590060825 142.7050046659878 62.20020959131922
157.7918155670263 128.47566248148152 60.2180613197838
144.53858537209553 150.76994100701987 73.96519621265155
142.19584653740466 149.9155577638611 72.04711643809843
149.89960535008672 152.71819863934368 69.44505997162108
155.55355639027306 150.5364431533337 67.37984510580831
153.09223013240592 151.91467523213458 70.20463629063916
149.98372605571114 151.86391451506148 72.83953276604653
145.15775072013972 119.50981957122369 51.14579256980266
141.6615728659545 123.681269580172 55.687572851425635
142.63079452986963 120.88423019932817 53.93616259740876
150.7253887363345 119.02115578456777 50.13737717829351
153.6979671663887 119.96038659859197 51.91657772861209
146.22797246248723 150.63588715144382 67.0500727310211
150.9652019704341 132.2309772485762 54.887486770822306
147.021790380546 124.52346361993199 51.478018539332744
147.319805516051 146.65570734216146 72.09672657235157
150.6192115623954 147.2251779734974 71.67567804355238
150.82812711811562 121.16233216152229 57.57284005215056
150.5417124041325 123.79579815002734 60.56804644656969
144.90109533040484 139.1879070087578 61.239361832396476
145.23889521571198 132.87033094654853 59.02317665865005
145.28757836297058 138.29052450466318 62.69835894338564
142.97150101721522 127.05735833269382 60.06052382047809
157.99930499565582 137.2079996762079 58.8685059567298
157.5142390795147 127.72754595351101 55.621842820487664
158.0644749047101 145.06799292687592 65.62438982351179
158.3834915781174 135.1616844617825 62.399860101337744
143.70186701190013 149.80869884663724 67.29649193240095
145.7160354855595 129.04959464460478 55.36122851168166
152.5976936282084 151.13142925545628 66.47637216169511
152.90730522474354 124.0483472037514 51.171644001504454
155.45552195036421 128.77812476187245 53.77343303997049
144.5766948010724 122.16239629932703 58.453230558658746
142.78965056225286 124.1352452427272 59.39826053249618
145.84219571537585 126.25879477669216 61.435857615724856
156.196388491107 123.19622660808922 57.250398452315636
146.95978996659977 152.2875373002875 73.45081777003425
146.95978996659977 152.2875373002875 73.45081777003425
149.98372605571114 151.86391451506148 72.83953276604653
146.95978996659977 152.2875373002875 73.45081777003425
152.5976936282084 151.13142925545628 66.47637216169511
POLYGONS 80 320
3 8 33 1
3 7 8 1
......
......@@ -3,53 +3,53 @@ vtk output
ASCII
DATASET POLYDATA
POINTS 47 float
146.945202616 152.333976699 73.5687065263
142.835416703 148.618901138 72.700495975
147.19158139 117.387503884 50.3980527603
153.613232653 144.55164894 68.9236238695
144.357411867 130.802015995 57.2660582118
144.181620361 142.932847916 62.1432022471
157.762325798 128.495316483 60.372182566
144.508538851 150.813360095 74.0751789271
142.145913293 149.967261475 72.1366502867
149.896097478 152.793879686 69.5585940782
155.577971896 150.629690371 67.4858695431
153.109629531 151.985555128 70.340317955
149.984790245 151.917955764 72.9815022452
144.265216392 118.839480463 50.8573411799
140.767576461 123.399331014 55.6214978462
141.679165031 120.362958455 53.7521806876
150.135037066 118.327730666 49.9140049558
153.299090119 119.352385765 51.8006868809
146.17265496 150.742052623 67.1207143254
150.568253208 132.395164196 54.6883498749
146.264423357 124.202625295 51.240726194
147.26784459 146.732745179 72.263104127
150.602756991 147.305222891 71.8637847144
150.242486343 120.64483248 57.6919507651
150.038700288 123.570058326 60.8834857702
144.515652488 139.451649998 61.1854232935
144.594551923 133.080705536 59.0297628563
144.894485157 138.544649618 62.7117762866
142.146050612 127.037697067 60.2354174522
157.963286637 137.397624526 58.7869278351
157.424141319 127.677932175 55.5976393742
158.08181665 145.191329072 65.6939757399
158.371713431 135.313084078 62.4614883575
143.624986987 149.90747419 67.3527992024
144.948421407 129.075759225 55.2474614198
152.603032505 151.24083451 66.5683627553
152.522800772 123.715366 51.0010241662
155.271546079 128.759868775 53.634401632
143.618004831 121.778519879 58.546223378
141.890682704 123.938893743 59.544048033
145.069547344 126.214029442 61.7322201752
156.050388218 122.91291002 57.3827172317
146.945202616 152.333976699 73.5687065263
146.945202616 152.333976699 73.5687065263
149.984790245 151.917955764 72.9815022452
146.945202616 152.333976699 73.5687065263
152.603032505 151.24083451 66.5683627553
146.9488009764703 152.32888260101197 73.55781760397456
142.84397844461418 148.61730776733356 72.69236773897133
147.1781588862065 117.39176489688575 50.40405963411018
153.6042574756425 144.55210858778204 68.90359637076263
144.3645682038702 130.80312330300728 57.2721865989807
144.19211879799803 142.92245487772968 62.15835967309592
157.74284599007893 128.5028510931347 60.37199332989139
144.51480258552812 150.81044076454043 74.06512643059862
142.1549244060659 149.9644770251245 72.13029243662733
149.89552668649063 152.7844776985655 69.55062714512749
155.56742348458476 150.62095730680704 67.47850299625154
153.10347974842756 151.97786250726455 70.32902883091278
149.9840839037151 151.9125925835206 72.96791644027093
144.25250912383908 118.84647561103002 50.86177899421752
140.7610892262483 123.41178003080584 55.62058705672831
141.6662205150739 120.3747820639237 53.75219266214414
150.12371796861922 118.33117563564832 49.92438147919449