[ITK-users] get outputs from a std::vector list of smart-pointers of image-filters

Grothausmann, Roman Dr. grothausmann.roman at mh-hannover.de
Fri Sep 16 07:42:24 EDT 2016


On 12/09/16 17:41, Dženan Zukić wrote:
> can you turn
> smoother->SetInput(savedPointers[i]->GetOutput());
> into
> if (i==0)
>
> smoother->SetInput(static_cast<CastFilterType::Pointer>(savedPointers[i])->GetOutput());
> else
>
> smoother->SetInput(static_cast<GaussianFilterType::Pointer>(savedPointers[i])->GetOutput());
> or something similar and see whether that works?

Did so,
https://github.com/romangrothausmann/ITK-CLIs/commit/2cd1fbe4406eccbd6552e88e8be0a0ab1aad4ba6
but still getting compile errors like:
resample.cxx:73:5: error: no matching function for call to 
?std::vector<itk::SmartPointer<itk::ProcessObject> 
 >::push_back(itk::CastImageFilter<itk::Image<float, 1u>, itk::Image<float, 1u> 
 >::Pointer&)?
      savedPointers.push_back(caster);

and

resample.cxx:80:25: error: invalid user-defined conversion from 
?itk::SmartPointer<itk::ProcessObject>? to 
?itk::SmartPointer<itk::CastImageFilter<itk::Image<float, 1u>, itk::Image<float, 
1u> > >::ObjectType* {aka itk::CastImageFilter<itk::Image<float, 1u>, 
itk::Image<float, 1u> >*}? [-fpermissive]
       smoother->SetInput(static_cast<typename 
CastFilterType::Pointer>(savedPointers[i])->GetOutput());



I also tried Your suggestion on the .GetPointer() variant:
https://github.com/romangrothausmann/ITK-CLIs/commit/4a96d962430461c0b26de9363a1ccf623b9c9840
which compiles but segfaults when executed.



A third variant stores the Output SPs in a separate list:
https://github.com/romangrothausmann/ITK-CLIs/commit/d9b5c3f1a786b595255a9153da9ceafd88d2a189
but compilation stops with:
resample.cxx:77:5: error: request for member ?GetPointer? in 
?caster.itk::SmartPointer<TObjectType>::operator-><itk::CastImageFilter<itk::Image<float, 
1u>, itk::Image<float, 1u> > >()->itk::CastImageFilter<itk::Image<float, 1u>, 
itk::Image<float, 1u> 
 >::<anonymous>.itk::UnaryFunctorImageFilter<itk::Image<float, 1u>, 
itk::Image<float, 1u>, itk::Functor::Cast<float, float> 
 >::<anonymous>.itk::InPlaceImageFilter<itk::Image<float, 1u>, itk::Image<float, 
1u> >::<anonymous>.itk::ImageToImageFilter<itk::Image<float, 1u>, 
itk::Image<float, 1u> 
 >::<anonymous>.itk::ImageSource<TOutputImage>::GetOutput<itk::Image<float, 1u> 
 >()?, which is of pointer type ?itk::ImageSource<itk::Image<float, 1u> 
 >::OutputImageType* {aka itk::Image<float, 1u>*}? (maybe you meant to use ?->? ?)
      savedOutPointers.push_back(caster->GetOutput().GetPointer());
      ^

Any other ideas how to get this working?

Many thanks for looking into this.
Roman


> On Mon, Sep 12, 2016 at 5:41 AM, Grothausmann, Roman Dr.
> <grothausmann.roman at mh-hannover.de <mailto:grothausmann.roman at mh-hannover.de>>
> wrote:
>
>     On 09/09/16 16:21, Dženan Zukić wrote:
>
>         Hi Roman,
>
>         you should not save the pointer the SmartPointer encapsulates, but
>         rather the
>         SmartPointer itself. The saving line of code should not be
>         savedPointers.push_back(caster.GetPointer());
>         but rather
>         savedPointers.push_back(caster);
>         and later usage should not be
>         smoother->SetInput(dynamic_cast<ISType*>(savedPointers[i].GetPointer())->GetOutput());
>         but rather
>         smoother->SetInput(savedPointers[i]->GetOutput());
>
>
>     Many thanks Dženan for Your reply. I tried as You suggested:
>
>     https://github.com/romangrothausmann/ITK-CLIs/commit/b00551faf951192f50e4090d683300524b4c95ba
>     <https://github.com/romangrothausmann/ITK-CLIs/commit/b00551faf951192f50e4090d683300524b4c95ba>
>
>     but am getting:
>
>     resample.cxx:79:49: error: no matching function for call to
>     ?itk::ProcessObject::GetOutput()?
>       smoother->SetInput(savedPointers[i]->GetOutput());
>                                                      ^
>     resample.cxx:79:49: note: candidates are:
>     In file included from resample.cxx:5:
>     /opt/itk-4.9.1/include/ITK-4.9/itkProcessObject.h:612:16: note:
>     itk::DataObject* itk::ProcessObject::GetOutput(const DataObjectIdentifierType&)
>        DataObject * GetOutput(const DataObjectIdentifierType & key);
>                     ^
>
>     I also tried:
>     std::vector<itk::ProcessObject> savedPointers;
>     std::vector<itk::ISType> savedPointers;
>     std::vector< itk::SmartPointer<itk::ProcessObject> > savedPointers;
>     but always got compile errors.
>     I am confused when to use the smart-pointer as is and when with .GetPointer().
>
>     According to
>
>     https://cmake.org/pipermail/insight-users/2007-May/022374.html
>     <https://cmake.org/pipermail/insight-users/2007-May/022374.html>
>
>     I also tried storing the output-pointers (without pipe-line disconnection)
>     in a separate list
>
>     https://github.com/romangrothausmann/ITK-CLIs/commit/d9b5c3f1a786b595255a9153da9ceafd88d2a189
>     <https://github.com/romangrothausmann/ITK-CLIs/commit/d9b5c3f1a786b595255a9153da9ceafd88d2a189>
>
>     which does not compile either:
>
>     resample.cxx:77:5: error: request for member ?GetPointer? in
>     ?caster.itk::SmartPointer<TObjectType>::operator-><itk::CastImageFilter<itk::Image<float,
>     1u>, itk::Image<float, 1u> > >()->itk::CastImageFilter<itk::Image<float,
>     1u>, itk::Image<float, 1u>
>     >::<anonymous>.itk::UnaryFunctorImageFilter<itk::Image<float, 1u>,
>     itk::Image<float, 1u>, itk::Functor::Cast<float, float>
>     >::<anonymous>.itk::InPlaceImageFilter<itk::Image<float, 1u>,
>     itk::Image<float, 1u>
>     >::<anonymous>.itk::ImageToImageFilter<itk::Image<float, 1u>,
>     itk::Image<float, 1u>
>     >::<anonymous>.itk::ImageSource<TOutputImage>::GetOutput<itk::Image<float,
>     1u> >()?, which is of pointer type ?itk::ImageSource<itk::Image<float, 1u>
>     >::OutputImageType* {aka itk::Image<float, 1u>*}? (maybe you meant to use
>     ?->? ?)
>          savedOutPointers.push_back(caster->GetOutput().GetPointer());
>          ^
>
>     I'm wondering if construct as needed is not possible at all because I can't
>     find anything like that in the ITK-sources or examples. For the code
>     snippets I can find in the MLs it is not clear whether they got tested and
>     were accepted by a compiler.
>
>     Any further ideas?
>
>     Best
>     Roman
>
>
>         On Fri, Sep 9, 2016 at 8:29 AM, Grothausmann, Roman Dr.
>         <grothausmann.roman at mh-hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>
>         <mailto:grothausmann.roman at mh-hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>>>
>         wrote:
>
>             On 22/07/16 14:49, Lowekamp, Bradley (NIH/NLM/LHC) [C] wrote:
>
>                 Hi,
>
>                 Who is holding the pointer to the newly created ImageFileReader
>         outside of
>                 the loop? For that type of operation I’ll frequently just stash
>         smart
>                 pointers into a std::vector or list.
>
>
>             I tried to change the resample example
>
>         (https://itk.org/Doxygen/html/Examples_2Filtering_2ResampleVolumesToBeIsotropic_8cxx-example.html
>         <https://itk.org/Doxygen/html/Examples_2Filtering_2ResampleVolumesToBeIsotropic_8cxx-example.html>
>
>         <https://itk.org/Doxygen/html/Examples_2Filtering_2ResampleVolumesToBeIsotropic_8cxx-example.html
>         <https://itk.org/Doxygen/html/Examples_2Filtering_2ResampleVolumesToBeIsotropic_8cxx-example.html>>
>             that uses itkRecursiveGaussianImageFilter for each dimension) such
>         that it works
>             for any dimensional image.
>             Doing as Brad suggested and storing each smart-pointer of
>             itkRecursiveGaussianImageFilter in a std::vector I get a program
>
>         (https://github.com/romangrothausmann/ITK-CLIs/blob/0968dd25af2abc37ffb0c0503cc4c2972b3b2098/resample.cxx
>         <https://github.com/romangrothausmann/ITK-CLIs/blob/0968dd25af2abc37ffb0c0503cc4c2972b3b2098/resample.cxx>
>
>         <https://github.com/romangrothausmann/ITK-CLIs/blob/0968dd25af2abc37ffb0c0503cc4c2972b3b2098/resample.cxx
>         <https://github.com/romangrothausmann/ITK-CLIs/blob/0968dd25af2abc37ffb0c0503cc4c2972b3b2098/resample.cxx>>)
>             that compiles but segfaults when used. I guess the way I'm trying to
>             dereference a pointer from the list is not correct
>
>         (https://github.com/romangrothausmann/ITK-CLIs/commit/0968dd25af2abc37ffb0c0503cc4c2972b3b2098#diff-cb1b1c6837c6074372c220250cfdbb36R80
>         <https://github.com/romangrothausmann/ITK-CLIs/commit/0968dd25af2abc37ffb0c0503cc4c2972b3b2098#diff-cb1b1c6837c6074372c220250cfdbb36R80>
>
>         <https://github.com/romangrothausmann/ITK-CLIs/commit/0968dd25af2abc37ffb0c0503cc4c2972b3b2098#diff-cb1b1c6837c6074372c220250cfdbb36R80
>         <https://github.com/romangrothausmann/ITK-CLIs/commit/0968dd25af2abc37ffb0c0503cc4c2972b3b2098#diff-cb1b1c6837c6074372c220250cfdbb36R80>>)
>             but I could not find an example except the one referenced in the
>         code line.
>             So how to correctly dereference a pointer from the list of
>         smart-pointers to
>             get its output?
>
>             Thank for any help or hints
>             Roman
>
>                     On Jul 22, 2016, at 6:00 AM, Grothausmann, Roman Dr.
>                     <grothausmann.roman at mh-hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>
>                     <mailto:grothausmann.roman at mh-hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>>> wrote:
>
>                     Many thanks Brad for Your detailed reply. I understand now
>         the problems
>                     concerning streaming TileImageFilter. However I still wonder
>         why my
>                     non-streaming version also does not work any more after
>         moving the
>                     creation
>                     of reader instances into the for-loop:
>
>         https://github.com/romangrothausmann/ITK-CLIs/blob/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9/tile.cxx#L46-L50
>         <https://github.com/romangrothausmann/ITK-CLIs/blob/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9/tile.cxx#L46-L50>
>
>         <https://github.com/romangrothausmann/ITK-CLIs/blob/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9/tile.cxx#L46-L50
>         <https://github.com/romangrothausmann/ITK-CLIs/blob/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9/tile.cxx#L46-L50>>
>
>
>
>             Is this construct inappropriate for the TileImageFilter?
>
>                     Why does it work for:
>
>         https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2
>         <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2>
>
>         <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2
>         <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2>>
>
>
>
>             On 21/07/16 15:41, Lowekamp, Bradley (NIH/NLM/LHC) [C] wrote:
>
>                         Hello,
>
>                         The TileImageFilter does not fully stream [1]. The
>         filter also
>                         has some
>                         odd behavior, and other older implementation details. If
>         you are
>                         going to
>                         work on a streaming pipelines it is best practice to
>         examine the
>                         filters
>                         to determine how the Requested regions behave.
>
>                         However, there is no reason that the TileImageFilter
>         algorithm
>                         couldn’t
>                         support streaming. It is just a matter of code and a
>         bunch of
>                         testing. A
>                         contribution for this issue would be welcomed! Also this
>         filter
>                         is in
>                         need a refactoring and bring it up to several other best
>                         practices. There
>                         are several issue with the current implementation that would
>                         cause it not
>                         to work correctly with a streaming pipeline, and cause
>         excessive
>                         execution.
>
>                         You can also use the PipelieMoniotorImageFilter to
>         record and
>                         print the
>                         pipeline interaction during Update [2]. This information
>         helps with
>                         debugging and diagnosing problems, but if the pipeline is
>                         mis-behaving (
>                         as the TileImageFilter may ), the information may not be
>         correct.
>
>                         I have tried similar streaming with the
>         JoinSeriesImageFilter.
>                         However I
>                         ran into many problems with having hundreds of ImageIO being
>                         utilized at
>                         the same time. There were problems with having too many
>         files
>                         open at the
>                         same time along with ImageIO libraries that couldn’t
>         handle single
>                         threaded access to multiple files.
>
>                         [1]
>
>         https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageGrid/include/itkTileImageFilter.hxx#L125-L136
>         <https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageGrid/include/itkTileImageFilter.hxx#L125-L136>
>
>         <https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageGrid/include/itkTileImageFilter.hxx#L125-L136
>         <https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageGrid/include/itkTileImageFilter.hxx#L125-L136>>
>
>
>
>
>             [2]
>         https://itk.org/Doxygen/html/classitk_1_1PipelineMonitorImageFilter.html
>         <https://itk.org/Doxygen/html/classitk_1_1PipelineMonitorImageFilter.html>
>
>         <https://itk.org/Doxygen/html/classitk_1_1PipelineMonitorImageFilter.html <https://itk.org/Doxygen/html/classitk_1_1PipelineMonitorImageFilter.html>>
>
>
>                             On Jul 21, 2016, at 6:41 AM, Grothausmann, Roman Dr.
>                             <grothausmann.roman at mh-hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>
>                             <mailto:grothausmann.roman at mh-hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>>> wrote:
>
>                             Dear mailing list members,
>
>
>                             Based on the examples for TileImageFilter I've created a
>                             working CLI
>                             to append an arbitrary number of inputs
>
>         (https://github.com/romangrothausmann/ITK-CLIs/blob/4fdf5778022598dcf83fb38e6002df72bd67bef3/tile.cxx
>         <https://github.com/romangrothausmann/ITK-CLIs/blob/4fdf5778022598dcf83fb38e6002df72bd67bef3/tile.cxx>
>
>         <https://github.com/romangrothausmann/ITK-CLIs/blob/4fdf5778022598dcf83fb38e6002df72bd67bef3/tile.cxx
>         <https://github.com/romangrothausmann/ITK-CLIs/blob/4fdf5778022598dcf83fb38e6002df72bd67bef3/tile.cxx>>).
>
>
>
>
>             As there is an example that does not apply Update and
>         DisconnectPipeline on
>             the readers
>
>         (https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2
>         <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2>
>
>         <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2
>         <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2>>)
>
>
>
>                             I changed my code such that a reader instance is
>         created for
>                             each input
>                             in a for-loop:
>
>         https://github.com/romangrothausmann/ITK-CLIs/commit/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9
>         <https://github.com/romangrothausmann/ITK-CLIs/commit/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9>
>
>         <https://github.com/romangrothausmann/ITK-CLIs/commit/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9
>         <https://github.com/romangrothausmann/ITK-CLIs/commit/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9>>
>
>
>
>
>
>             However, the update from the writer seems not to propagate to the
>         readers
>             whether streaming or not. Can the TileImageFilter not stream in such
>         a case
>             or are further modifications necessary?
>
>
>                             Thanks for any help or hints Roman
>
>
>                             On 18/08/14 17:01, Michka Popoff wrote:
>
>                                 Hi
>
>                                 Going the way described in the CreateVolume
>         example is
>                                 the way to
>                                 go.
>
>                                 Why did you uncomment the DisconnectPipeline()
>         call and
>                                 Update() call
>                                 in the for loop ? They need to stay there, else
>         you will
>                                 always use
>                                 the last image. That’s why you see the same
>         image, the
>                                 single update
>                                 call will be triggered at the end of the script
>         and read
>                                 only one
>                                 image.
>
>                                 You don’t need to call tileFilter->Update(), you can
>                                 remove this
>                                 line. The writer->Update() will take care of the
>                                 pipeline update. As
>                                 a bonus, you may wrap your writer->Update() call, to
>                                 fetch errors at
>                                 the end of the pipeline:
>
>                                 try { writer->Update(); } catch(
>         itk::ExceptionObject &
>                                 error ) {
>                                 std::cerr << "Error: " << error << std::endl; return
>                                 EXIT_FAILURE; }
>
>                                 I made a little Python prototype, the syntax is
>         a little bit
>                                 different than in C++ but it gives you the main
>         idea.
>
>                                 Michka
>
>
>                             -- Dr. Roman Grothausmann
>
>                             Tomographie und Digitale Bildverarbeitung Tomography and
>                             Digital Image
>                             Analysis
>
>                             Institut für Funktionelle und Angewandte Anatomie,
>         OE 4120
>                             Medizinische Hochschule Hannover Carl-Neuberg-Str. 1
>         D-30625
>                             Hannover
>
>                             Tel. +49 511 532-2900 <tel:%2B49%20511%20532-2900>
>         <tel:%2B49%20511%20532-2900>
>                             _____________________________________ Powered by
>                             www.kitware.com <http://www.kitware.com>
>         <http://www.kitware.com>
>
>                             Visit other Kitware open-source projects at
>                             http://www.kitware.com/opensource/opensource.html
>         <http://www.kitware.com/opensource/opensource.html>
>                             <http://www.kitware.com/opensource/opensource.html
>         <http://www.kitware.com/opensource/opensource.html>>
>
>                             Kitware offers ITK Training Courses, for more
>         information visit:
>                             http://www.kitware.com/products/protraining.php
>         <http://www.kitware.com/products/protraining.php>
>                             <http://www.kitware.com/products/protraining.php
>         <http://www.kitware.com/products/protraining.php>>
>
>                             Please keep messages on-topic and check the ITK FAQ at:
>                             http://www.itk.org/Wiki/ITK_FAQ
>         <http://www.itk.org/Wiki/ITK_FAQ>
>                             <http://www.itk.org/Wiki/ITK_FAQ
>         <http://www.itk.org/Wiki/ITK_FAQ>>
>
>                             Follow this link to subscribe/unsubscribe:
>
>         http://public.kitware.com/mailman/listinfo/insight-users
>         <http://public.kitware.com/mailman/listinfo/insight-users>
>
>         <http://public.kitware.com/mailman/listinfo/insight-users
>         <http://public.kitware.com/mailman/listinfo/insight-users>>
>                             _______________________________________________
>         Community
>                             mailing list
>                             Community at itk.org <mailto:Community at itk.org>
>         <mailto:Community at itk.org <mailto:Community at itk.org>>
>                             http://public.kitware.com/mailman/listinfo/community
>         <http://public.kitware.com/mailman/listinfo/community>
>
>         <http://public.kitware.com/mailman/listinfo/community
>         <http://public.kitware.com/mailman/listinfo/community>>
>
>
>
>                     -- Dr. Roman Grothausmann
>
>                     Tomographie und Digitale Bildverarbeitung Tomography and
>         Digital Image
>                     Analysis
>
>                     Institut für Funktionelle und Angewandte Anatomie, OE 4120
>         Medizinische
>                     Hochschule Hannover Carl-Neuberg-Str. 1 D-30625 Hannover
>
>                     Tel. +49 511 532-2900 <tel:%2B49%20511%20532-2900>
>         <tel:%2B49%20511%20532-2900>
>
>
>
>             --
>             Dr. Roman Grothausmann
>
>             Tomographie und Digitale Bildverarbeitung
>             Tomography and Digital Image Analysis
>
>             Institut für Funktionelle und Angewandte Anatomie, OE 4120
>             Medizinische Hochschule Hannover
>             Carl-Neuberg-Str. 1
>             D-30625 Hannover
>
>             Tel. +49 511 532-2900 <tel:%2B49%20511%20532-2900>
>         <tel:%2B49%20511%20532-2900>
>             _____________________________________
>             Powered by www.kitware.com <http://www.kitware.com>
>         <http://www.kitware.com>
>
>             Visit other Kitware open-source projects at
>             http://www.kitware.com/opensource/opensource.html
>         <http://www.kitware.com/opensource/opensource.html>
>             <http://www.kitware.com/opensource/opensource.html
>         <http://www.kitware.com/opensource/opensource.html>>
>
>             Kitware offers ITK Training Courses, for more information visit:
>             http://www.kitware.com/products/protraining.php
>         <http://www.kitware.com/products/protraining.php>
>             <http://www.kitware.com/products/protraining.php
>         <http://www.kitware.com/products/protraining.php>>
>
>             Please keep messages on-topic and check the ITK FAQ at:
>             http://www.itk.org/Wiki/ITK_FAQ <http://www.itk.org/Wiki/ITK_FAQ>
>         <http://www.itk.org/Wiki/ITK_FAQ <http://www.itk.org/Wiki/ITK_FAQ>>
>
>             Follow this link to subscribe/unsubscribe:
>             http://public.kitware.com/mailman/listinfo/insight-users
>         <http://public.kitware.com/mailman/listinfo/insight-users>
>             <http://public.kitware.com/mailman/listinfo/insight-users
>         <http://public.kitware.com/mailman/listinfo/insight-users>>
>
>
>
>     --
>     Dr. Roman Grothausmann
>
>     Tomographie und Digitale Bildverarbeitung
>     Tomography and Digital Image Analysis
>
>     Institut für Funktionelle und Angewandte Anatomie, OE 4120
>     Medizinische Hochschule Hannover
>     Carl-Neuberg-Str. 1
>     D-30625 Hannover
>
>     Tel. +49 511 532-2900 <tel:%2B49%20511%20532-2900>
>
>

-- 
Dr. Roman Grothausmann

Tomographie und Digitale Bildverarbeitung
Tomography and Digital Image Analysis

Institut für Funktionelle und Angewandte Anatomie, OE 4120
Medizinische Hochschule Hannover
Carl-Neuberg-Str. 1
D-30625 Hannover

Tel. +49 511 532-2900


More information about the Insight-users mailing list