Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <Registration/cmtkGroupwiseRegistrationFunctionalXformTemplate.h>
00034
00035 #include <IO/cmtkVolumeIO.h>
00036 #include <IO/cmtkClassStreamAffineXform.h>
00037
00038 namespace
00039 cmtk
00040 {
00041
00044
00045 ClassStream&
00046 operator<<
00047 ( ClassStream& stream, const GroupwiseRegistrationFunctionalXformTemplate<AffineXform>& func )
00048 {
00049 stream.Begin( "template" );
00050 stream.WriteIntArray( "dims", func.m_TemplateGrid->GetDims().begin(), 3 );
00051 stream.WriteCoordinateArray( "delta", func.m_TemplateGrid->Deltas().begin(), 3 );
00052 stream.WriteCoordinateArray( "size", func.m_TemplateGrid->Size.begin(), 3 );
00053 stream.WriteCoordinateArray( "origin", func.m_TemplateGrid->m_Offset.begin(), 3 );
00054 stream.End();
00055
00056 for ( size_t idx = 0; idx < func.m_XformVector.size(); ++idx )
00057 {
00058 stream.WriteString( "target", func.m_OriginalImageVector[idx]->m_MetaInformation[META_FS_PATH].c_str() );
00059 stream << (*func.GetXformByIndex( idx ));
00060 }
00061
00062 return stream;
00063 }
00064
00065 ClassStream&
00066 operator>>
00067 ( ClassStream& stream, GroupwiseRegistrationFunctionalXformTemplate<AffineXform>& func )
00068 {
00069 if ( ! stream.Seek( "template" ) )
00070 {
00071 StdErr << "ERROR: no 'template' section in input archive\n";
00072 return stream;
00073 }
00074
00075 int dims[3];
00076 stream.ReadIntArray( "dims", dims, 3 );
00077 Types::Coordinate size[3];
00078 stream.ReadCoordinateArray( "size", size, 3 );
00079 Types::Coordinate origin[3];
00080 stream.ReadCoordinateArray( "origin", origin, 3 );
00081 stream.End();
00082
00083 UniformVolume::SmartPtr templateGrid( new UniformVolume( UniformVolume::IndexType( dims ), UniformVolume::CoordinateVectorType( size ) ) );
00084 templateGrid->SetOffset( FixedVector<3,Types::Coordinate>( origin ) );
00085
00086 std::vector<UniformVolume::SmartPtr> imageVector;
00087 std::vector<AffineXform::SmartPtr> xformVector;
00088
00089 char* targetPath = stream.ReadString( "target", NULL , false );
00090 while ( targetPath )
00091 {
00092 #ifdef CMTK_BUILD_MPI
00093 UniformVolume::SmartPtr image( NULL );
00094 if ( MPI::COMM_WORLD.Get_rank() == (imageVector.size() % MPI::COMM_WORLD.Get_size() ) )
00095 {
00096 image = UniformVolume::SmartPtr( VolumeIO::ReadOriented( targetPath, true ) );
00097 if ( ! image || ! image->GetData() )
00098 {
00099 StdErr << "Could not open image " << targetPath << "\n";
00100 exit( 1 );
00101 }
00102 }
00103 else
00104 {
00105 image = UniformVolume::SmartPtr( VolumeIO::ReadGridOriented( targetPath, true ) );
00106 }
00107 #else
00108 UniformVolume::SmartPtr image( VolumeIO::ReadOriented( targetPath, true ) );
00109 if ( ! image || ! image->GetData() )
00110 {
00111 StdErr << "Could not open image " << targetPath << "\n";
00112 exit( 1 );
00113 }
00114 #endif
00115 imageVector.push_back( image );
00116
00117 AffineXform::SmartPtr xform;
00118 stream >> xform;
00119 xformVector.push_back( xform );
00120
00121 free( targetPath );
00122 targetPath = stream.ReadString( "target", NULL , true );
00123 }
00124
00125 func.SetTargetImages( imageVector );
00126 func.SetTemplateGrid( templateGrid );
00127 func.SetXforms( xformVector );
00128
00129 return stream;
00130 }
00131
00132 }