34 #ifndef CARTODATA_IO_VOLUMEFORMATWRITER_D_H 35 #define CARTODATA_IO_VOLUMEFORMATWRITER_D_H 55 #define localMsg( message ) cartoCondMsg( 4, message, "VOLUMEFORMATWRITER" ) 96 localMsg(
"checking for memory mapping..." );
101 localMsg(
"reading resolution level..." );
103 if( options->hasProperty(
"resolution_level" ) ) {
104 options->getProperty(
"resolution_level", level );
108 level += dsi->
header()->getProperty(
"resolutions_dimension" )
117 localMsg(
"checking for partial writing..." );
118 bool partial =
false;
119 if( options->hasProperty(
"partial_writing" ) )
123 localMsg(
" -> partial writing enabled." );
126 size_t dim, ndim = obj.
getSize().size();
127 std::vector<int> position( ndim, 0 );
128 std::vector<int> view( ndim, 0 );
129 std::vector<int> size( ndim, 1 );
132 localMsg(
"checking if object is a view..." );
138 localMsg( std::string(
"object ") + ( parent1 ?
"is" :
"isn't" ) +
" a view and " 143 localMsg( std::string(
"parent1 exists and ")
149 localMsg( std::string(
"parent2 exists and ")
159 localMsg(
"reading full volume size and view position..." );
164 }
else if( parent2 ) {
169 for( i=0; i<ndim; ++i )
178 localMsg(
" -> from self (no partial writing)" )
180 position = std::vector<int>( ndim, 0 );
183 localMsg(
" -> Full volume size : ( " 200 localMsg(
"checking for borders..." );
201 bool withborders =
false;
204 localMsg( std::string(
" -> ") + ( withborders ?
"with borders" :
"without borders" ) );
205 withborders = withborders;
212 options->setProperty(
"unallocated",
true );
216 dsi->
header()->copyProperties(
219 dsi->
header()->setProperty(
"volume_dimension", size );
220 dsi->
header()->setProperty(
"sizeX", size[ 0 ] );
221 dsi->
header()->setProperty(
"sizeY", size[ 1 ] );
222 dsi->
header()->setProperty(
"sizeZ", size[ 2 ] );
223 dsi->
header()->setProperty(
"sizeT", size[ 3 ] );
224 if( !dsi->
header()->hasProperty(
"voxel_size" ) )
226 std::vector<float> voxel_size( 4, 1. );
227 dsi->
header()->setProperty(
"voxel_size", voxel_size );
234 position[0] = (int) rint( options->getProperty(
"ox" )->getScalar() );
238 position[1] = (int) rint( options->getProperty(
"oy" )->getScalar() );
242 position[2] = (int) rint( options->getProperty(
"oz" )->getScalar() );
247 position[3] = (int) rint( options->getProperty(
"ot" )->getScalar() );
252 for( dim=0; dim<carto::Volume<T>::DIM_MAX; ++dim )
256 std::stringstream skey;
257 skey <<
"ox" << dim+1;
258 std::string key = skey.str();
259 value = (int) rint( options->getProperty( key )->getScalar() );
260 options->removeProperty( key );
261 while( position.size() <= dim )
262 position.push_back( 0 );
263 position[ dim ] = value;
272 std::vector<long> strides( ndim );
273 for( dim=0; dim<ndim; ++dim )
275 std::vector<int> pos( ndim, 0 );
277 strides[dim] = &obj( pos ) - &obj(0,0,0,0);
280 this->filterProperties(dsi->
header(), options);
283 *dsi = _imw->writeHeader( *dsi, (T*) &obj(0,0,0,0), position, view,
291 std::vector<int> file_sz( ndim, 1 );
292 if( !dsi->header()->getProperty(
"volume_dimension", file_sz ) )
294 dsi->header()->getProperty(
"sizeX", file_sz[0] );
295 dsi->header()->getProperty(
"sizeY", file_sz[1] );
296 dsi->header()->getProperty(
"sizeZ", file_sz[2] );
297 dsi->header()->getProperty(
"sizeT", file_sz[3] );
299 for( dim=0; dim<ndim; ++dim )
301 if( file_sz.size() <= dim )
302 file_sz.push_back( 1 );
303 if( position[dim] + view[dim] > file_sz[dim] )
305 localMsg(
"view is larger than the volume." );
315 data = reinterpret_cast<const T*>( &obj(0,0,0,0) );
317 _imw->write( data, *dsi, position, view, strides, options );
347 template <
typename T>
357 template <
typename T>
362 template <
typename T>
373 template <
typename T>
380 return vfw.
write( *obj, dsi, options );
383 template <
typename T>
const Position & posInRefVolume() const
Get position in parent volume.
MappingMode allocatorType() const
Convenient handle for a Volume - this is normally the entry point for all volumes handling...
static Object reference(T &value)
std::vector< int > getSize() const
get the 4 dimensions in a vector
const AllocatorContext & allocatorContext() const
returns volume's AllocatorContext
rc_ptr< Volume< T > > refVolume() const
Get parent volume.
static void filter(carto::Object header, carto::Object options=carto::none())
std::string toString(const T &object)
const carto::Object & header() const