Skip to content

Commit

Permalink
implemented oil extraction of slice
Browse files Browse the repository at this point in the history
  • Loading branch information
Erik Tuerke committed Jul 13, 2012
1 parent d8815f5 commit 68aece0
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 84 deletions.
57 changes: 14 additions & 43 deletions lib/core/data/data_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,60 +35,31 @@ namespace glance
{
namespace data
{

#ifdef ISIS_GLANCE_USE_LIBOIL

namespace _internal
{

template<>
void _oilExtractSagittal< int8_t > ( int8_t *destPtr, const int8_t *srcPtr, const int32_t *permutation, const size_t &length )
{
oil_permute_s8( destPtr, 0, srcPtr, 0, permutation, 0, length );
#define IMPL_OIL_EXTRACT_SAG( TYPE, OIL_SUFFIX ) \
template<> void oilExtractSagittal<TYPE>( TYPE *destPtr, const TYPE *srcPtr, const int32_t *permutation, const size_t &length ) {\
oil_permute_ ## OIL_SUFFIX ( destPtr, sizeof(TYPE), srcPtr, sizeof(TYPE), permutation, 4, length ); \
}

template<>
void _oilExtractSagittal< uint8_t > ( uint8_t *destPtr, const uint8_t *srcPtr, const int32_t *permutation, const size_t &length )
{
oil_permute_u8( destPtr, 0, srcPtr, 0, permutation, 0, length );
}
IMPL_OIL_EXTRACT_SAG( int8_t, s8 )
IMPL_OIL_EXTRACT_SAG( uint8_t, u8 )

template<>
void _oilExtractSagittal< double > ( double *destPtr, const double *srcPtr, const int32_t *permutation, const size_t &length )
{
oil_permute_f64( destPtr, 0, srcPtr, 0, permutation, 0, length );
}
IMPL_OIL_EXTRACT_SAG( int16_t, s16 )
IMPL_OIL_EXTRACT_SAG( uint16_t, u16 )

template<>
void _oilExtractSagittal< float > ( float *destPtr, const float *srcPtr, const int32_t *permutation, const size_t &length )
{
oil_permute_f32( destPtr, 0, srcPtr, 0, permutation, 0, length );
}
IMPL_OIL_EXTRACT_SAG( int32_t, s32 )
IMPL_OIL_EXTRACT_SAG( uint32_t, u32 )

template<>
void _oilExtractSagittal< int16_t > ( int16_t *destPtr, const int16_t *srcPtr, const int32_t *permutation, const size_t &length )
{
oil_permute_s16( destPtr, 0, srcPtr, 0, permutation, 0, length );
}
IMPL_OIL_EXTRACT_SAG( double, f64 )
IMPL_OIL_EXTRACT_SAG( float, f32 )

template<>
void _oilExtractSagittal< uint16_t > ( uint16_t *destPtr, const uint16_t *srcPtr, const int32_t *permutation, const size_t &length )
{
oil_permute_u16( destPtr, 0, srcPtr, 0, permutation, 0, length );
}

template<>
void _oilExtractSagittal< int32_t > ( int32_t *destPtr, const int32_t *srcPtr, const int32_t *permutation, const size_t &length )
{
oil_permute_s32( destPtr, 0, srcPtr, 0, permutation, 0, length );
}

template<>
void _oilExtractSagittal< uint32_t > ( uint32_t *destPtr, const uint32_t *srcPtr, const int32_t *permutation, const size_t &length )
{
oil_permute_u32( destPtr, 0, srcPtr, 0, permutation, 0, length );
}


}
#endif

Slice DataHandler::extractSagittal ( const Volume &vol, const int32_t &x )
{
Expand Down
46 changes: 15 additions & 31 deletions lib/core/data/data_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,52 +48,36 @@ namespace glance
namespace data
{

#ifdef ISIS_GLANCE_USE_LIBOIL
namespace _internal
{
struct OilInitializer {
OilInitializer() {
#ifdef ISIS_GLANCE_USE_LIBOIL
oil_init();
#endif // ISIS_USE_LIBOIL
}
};

#ifdef ISIS_GLANCE_USE_LIBOIL
template<typename T>
void _oilExtractSagittal( T *destPtr, const T *srcPtr, const int32_t *permutation, const size_t &length )
template<typename TYPE>
void oilExtractSagittal( TYPE *destPtr, const TYPE *srcPtr, const int32_t *permutation, const size_t &length )
{
for ( size_t index = 0; index < length; index++ ) {
destPtr[index] = srcPtr[permutation[index]];
}
}

template<>
void _oilExtractSagittal<uint8_t>( uint8_t *destPtr, const uint8_t *srcPtr, const int32_t *permutation, const size_t &length );

template<>
void _oilExtractSagittal<int8_t>( int8_t *destPtr, const int8_t *srcPtr, const int32_t *permutation, const size_t &length );

template<>
void _oilExtractSagittal<float>( float *destPtr, const float *srcPtr, const int32_t *permutation, const size_t &length );

template<>
void _oilExtractSagittal<double>( double *destPtr, const double *srcPtr, const int32_t *permutation, const size_t &length );
#define DECL_OIL_EXTRACT_SAG( TYPE ) template<> void oilExtractSagittal<TYPE>( TYPE *destPtr, const TYPE *srcPtr, const int32_t *permutation, const size_t &length )

template<>
void _oilExtractSagittal<int16_t>( int16_t *destPtr, const int16_t *srcPtr, const int32_t *permutation, const size_t &length );
DECL_OIL_EXTRACT_SAG( int8_t );
DECL_OIL_EXTRACT_SAG( uint8_t );
DECL_OIL_EXTRACT_SAG( int16_t );
DECL_OIL_EXTRACT_SAG( uint16_t );
DECL_OIL_EXTRACT_SAG( int32_t );
DECL_OIL_EXTRACT_SAG( uint32_t );
DECL_OIL_EXTRACT_SAG( float );
DECL_OIL_EXTRACT_SAG( double );

template<>
void _oilExtractSagittal<uint16_t>( uint16_t *destPtr, const uint16_t *srcPtr, const int32_t *permutation, const size_t &length );

template<>
void _oilExtractSagittal<int32_t>( int32_t *destPtr, const int32_t *srcPtr, const int32_t *permutation, const size_t &length );

template<>
void _oilExtractSagittal<uint32_t>( uint32_t *destPtr, const uint32_t *srcPtr, const int32_t *permutation, const size_t &length );


#endif
}
#endif

class Volume;
class DataHandler
Expand All @@ -107,11 +91,11 @@ class DataHandler
private:
template<typename T>
static Slice _extractSagittal( const isis::data::ValueArrayBase &src, const size_t &col, const size_t &slice, const size_t &offset, DataHandler::PermutationType permutation ) {
const T *srcPtr = static_cast<const T *>( src.getRawAddress( offset ).get() );
const T *srcPtr = static_cast<const T *>( src.getRawAddress( offset * sizeof(T) ).get() );
const isis::data::ValueArrayReference dest = src.cloneToNew( col * slice );
T *destPtr = static_cast<T *>( dest->getRawAddress().get() );
#ifdef ISIS_GLANCE_USE_LIBOIL
_internal::_oilExtractSagittal<T>( destPtr, srcPtr, permutation.get(), col * slice );
_internal::oilExtractSagittal<T>( destPtr, srcPtr, permutation.get(), col * slice );
#else

for ( size_t index = 0; index < ( col * slice ); index++ ) {
Expand Down
6 changes: 5 additions & 1 deletion tests/data/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
find_path(LibOil_INCLUDE_DIR "liboil/liboil.h" PATH_SUFFIXES "liboil" "liboil-0.3")
find_library(LibOil_LIBRARY NAMES "oil-0.3")
include_directories(${LibOil_INCLUDE_DIR})

add_executable( ioFactoryTest ioFactoryTest.cpp )

target_link_libraries(ioFactoryTest ${Boost_LIBRARIES} ${ISIS_LIB} isis_glance )
target_link_libraries(ioFactoryTest ${Boost_LIBRARIES} ${ISIS_LIB} isis_glance ${LibOil_LIBRARY} )

add_test(NAME ioFactoryTest COMMAND ioFactoryTest)
34 changes: 25 additions & 9 deletions tests/data/ioFactoryTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,36 @@
#include "util/generic_plugin_loader.hpp"
#include "util/widget_base.hpp"

extern "C" {
#include <liboil/liboil.h>
}

int main( int /*argc*/, char **argv )
{
// ENABLE_LOG( isis::glance::data::Debug, isis::util::DefaultMsgPrint, isis::verbose_info );
// ENABLE_LOG( isis::glance::util::Debug, isis::util::DefaultMsgPrint, isis::verbose_info );
// ENABLE_LOG( isis::glance::data::Runtime, isis::util::DefaultMsgPrint, isis::verbose_info );

// const int dstr = atoi(argv[1]);
// const int sstr1 = atoi(argv[2]);
// const int sstr2 = atoi(argv[3]);
// oil_init();
// size_t length = 10;
// const int32_t perm[] = { 0,2,4,6,8,1,3,5,7,9 };
// const uint16_t src[] = { 10,11,12,13,14,15,16,17,18,19 };
// uint16_t dest[10];
// oil_permute_u16( dest, dstr, src, sstr1, perm, sstr2, length );
//
// for( size_t i = 0; i < length; i++ ) {
// std::cout << (float)dest[i] << " ";
// }
// std::cout << std::endl;


isis::util::slist paths;
paths.push_back( argv[1] );

boost::timer timer;

// isis::glance::data::Image::signal_content_changed.get().connect( &printPath );
// isis::glance::data::IOFactory::setUseProposedDataType( true );
// isis::glance::data::IOFactory::setProposedDataType( isis::glance::data::ImageDataProperties::SCALAR, isis::glance::data::types::BOOL );
isis::glance::data::Image::SharedPointer image = isis::glance::data::IOFactory::load( paths ).front();

const isis::glance::data::Volume &vol = image->operator[]( 0 );
Expand All @@ -34,16 +50,16 @@ int main( int /*argc*/, char **argv )
coords[2] = image->image_size[2] / 2;

timer.restart();
// for( unsigned int i = 0; i < 30000; i++ )
for( unsigned int i = 0; i < 30000; i++ )
isis::glance::data::Slice slice = vol.extractSlice( perp, coords );
std::cout << timer.elapsed() << " seconds sagittal" << std::endl;



isis::data::Chunk chunk( slice, slice.getSizeAsVector()[0], slice.getSizeAsVector()[1], 1, 1, true );
isis::data::Image imageOut( chunk );

isis::data::IOFactory::write( imageOut, "/tmp/gna.nii" );
// isis::data::Chunk chunk( slice, slice.getSizeAsVector()[0], slice.getSizeAsVector()[1], 1, 1, true );
// isis::data::Image imageOut( chunk );
//
// isis::data::IOFactory::write( imageOut, "/tmp/gna.nii" );



Expand Down

0 comments on commit 68aece0

Please sign in to comment.