cmtkGroupwiseRegistrationFunctionalXformTemplate_Affine_IO.cxx

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 1997-2009 Torsten Rohlfing
00004 //
00005 //  Copyright 2004-2010 SRI International
00006 //
00007 //  This file is part of the Computational Morphometry Toolkit.
00008 //
00009 //  http://www.nitrc.org/projects/cmtk/
00010 //
00011 //  The Computational Morphometry Toolkit is free software: you can
00012 //  redistribute it and/or modify it under the terms of the GNU General Public
00013 //  License as published by the Free Software Foundation, either version 3 of
00014 //  the License, or (at your option) any later version.
00015 //
00016 //  The Computational Morphometry Toolkit is distributed in the hope that it
00017 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00018 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 //  GNU General Public License for more details.
00020 //
00021 //  You should have received a copy of the GNU General Public License along
00022 //  with the Computational Morphometry Toolkit.  If not, see
00023 //  <http://www.gnu.org/licenses/>.
00024 //
00025 //  $Revision: 2398 $
00026 //
00027 //  $LastChangedDate: 2010-10-05 14:54:37 -0700 (Tue, 05 Oct 2010) $
00028 //
00029 //  $LastChangedBy: torstenrohlfing $
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 /*default*/, false /*forward*/ );
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 /*default*/, true /*forward*/ );
00123     }
00124 
00125   func.SetTargetImages( imageVector );
00126   func.SetTemplateGrid( templateGrid );
00127   func.SetXforms( xformVector );
00128 
00129   return stream;
00130 }
00131 
00132 } // namespace cmtk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines