cmtkGroupwiseRegistrationFunctionalXformTemplate_SplineWarp_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 <Base/cmtkUniformVolume.h>
00036 #include <IO/cmtkVolumeIO.h>
00037 #include <IO/cmtkClassStreamAffineXform.h>
00038 
00039 namespace
00040 cmtk
00041 {
00042 
00045 
00046 ClassStream& 
00047 operator<<
00048   ( ClassStream& stream, const GroupwiseRegistrationFunctionalXformTemplate<SplineWarpXform>& func )
00049 {
00050   stream.Begin( "template" );
00051   stream.WriteIntArray( "dims", func.m_TemplateGrid->GetDims().begin(), 3 );
00052   stream.WriteCoordinateArray( "delta", func.m_TemplateGrid->Deltas().begin(), 3 );
00053   stream.WriteCoordinateArray( "size", func.m_TemplateGrid->Size.begin(), 3 );
00054   stream.WriteCoordinateArray( "origin", func.m_TemplateGrid->m_Offset.begin(), 3 );
00055   stream.End();
00056   
00057   for ( size_t idx = 0; idx < func.m_XformVector.size(); ++idx )
00058     {
00059     stream.WriteString( "target", func.m_OriginalImageVector[idx]->m_MetaInformation[META_FS_PATH].c_str() );
00060     stream << func.GetXformByIndex(idx);
00061     }
00062   
00063   return stream;
00064 }
00065 
00066 ClassStream& 
00067 operator>>
00068 ( ClassStream& stream,  GroupwiseRegistrationFunctionalXformTemplate<SplineWarpXform>& func )
00069 {
00070   if ( ! stream.Seek( "template" ) )
00071     {
00072     StdErr << "ERROR: no 'template' section in input archive\n";
00073     return stream;
00074     }
00075 
00076   int dims[3];
00077   stream.ReadIntArray( "dims", dims, 3 );
00078   Types::Coordinate size[3];
00079   stream.ReadCoordinateArray( "size", size, 3 );
00080   Types::Coordinate origin[3];
00081   stream.ReadCoordinateArray( "origin", origin, 3 );
00082   stream.End();
00083   
00084   UniformVolume::SmartPtr templateGrid( new UniformVolume( UniformVolume::IndexType( dims ), UniformVolume::CoordinateVectorType( size ) ) );
00085   templateGrid->SetOffset( FixedVector<3,Types::Coordinate>( origin ) );
00086 
00087   std::vector<UniformVolume::SmartPtr> imageVector;
00088   std::vector<AffineXform::SmartPtr> xformVector;
00089 
00090   char* targetPath = stream.ReadString( "target", NULL /*default*/, false /*forward*/ );
00091   while ( targetPath )
00092     {
00093 #ifdef CMTK_BUILD_MPI
00094     UniformVolume::SmartPtr image( NULL );
00095     if ( MPI::COMM_WORLD.Get_rank() == (imageVector.size() % MPI::COMM_WORLD.Get_size() ) )
00096       {
00097       image = UniformVolume::SmartPtr( VolumeIO::ReadOriented( targetPath, true ) );
00098       if ( ! image || ! image->GetData() )
00099         {
00100         StdErr << "Could not open image " << targetPath << "\n";
00101         exit( 1 );
00102         }
00103       }
00104     else
00105       {
00106       image = UniformVolume::SmartPtr( VolumeIO::ReadGridOriented( targetPath, true ) );
00107       }
00108 #else
00109     UniformVolume::SmartPtr image( VolumeIO::ReadOriented( targetPath, true ) );
00110     if ( ! image || ! image->GetData() )
00111       {
00112       StdErr << "Could not open image " << targetPath << "\n";
00113       exit( 1 );
00114       }
00115 #endif
00116     imageVector.push_back( image );
00117 
00118     AffineXform::SmartPtr xform;
00119     stream >> xform;
00120     xformVector.push_back( xform );
00121 
00122     free( targetPath );
00123     targetPath = stream.ReadString( "target", NULL /*default*/, true /*forward*/ );
00124     }
00125 
00126   func.m_InitialAffineXformsVector = xformVector;
00127   func.SetTargetImages( imageVector );
00128   func.SetTemplateGrid( templateGrid );
00129 
00130   return stream;
00131 }
00132 
00133 } // namespace cmtk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines