34 #ifndef CARTODATA_IO_VOLUMEFORMATWRITER_D_H
35 #define CARTODATA_IO_VOLUMEFORMATWRITER_D_H
55 #define localMsg( message ) cartoCondMsg( 4, message, "VOLUMEFORMATWRITER" )
94 localMsg(
"writing: " + dsi->url() );
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 if( position.size() < rndim )
170 position.resize( rndim, 0 );
171 for( i=0; i<rndim; ++i )
180 localMsg(
" -> from self (no partial writing)" )
182 position = std::vector<int>( ndim, 0 );
185 localMsg(
" -> Full volume size : ( "
202 localMsg(
"checking for borders..." );
203 bool withborders =
false;
206 localMsg( std::string(
" -> ") + ( withborders ?
"with borders" :
"without borders" ) );
207 withborders = withborders;
214 options->setProperty(
"unallocated",
true );
218 dsi->header()->copyProperties(
221 dsi->header()->setProperty(
"volume_dimension", size );
222 dsi->header()->setProperty(
"sizeX", size[ 0 ] );
223 dsi->header()->setProperty(
"sizeY", size[ 1 ] );
224 dsi->header()->setProperty(
"sizeZ", size[ 2 ] );
225 dsi->header()->setProperty(
"sizeT", size[ 3 ] );
226 if( !dsi->header()->hasProperty(
"voxel_size" ) )
228 std::vector<float> voxel_size( 4, 1. );
229 dsi->header()->setProperty(
"voxel_size", voxel_size );
236 position[0] = (int) rint( options->getProperty(
"ox" )->getScalar() );
240 position[1] = (int) rint( options->getProperty(
"oy" )->getScalar() );
244 position[2] = (int) rint( options->getProperty(
"oz" )->getScalar() );
249 position[3] = (int) rint( options->getProperty(
"ot" )->getScalar() );
254 for( dim=0; dim<carto::Volume<T>::DIM_MAX; ++dim )
258 std::stringstream skey;
259 skey <<
"ox" << dim+1;
260 std::string key = skey.str();
261 value = (int) rint( options->getProperty( key )->getScalar() );
262 options->removeProperty( key );
263 while( position.size() <= dim )
264 position.push_back( 0 );
265 position[ dim ] = value;
274 std::vector<long> strides( ndim );
275 for( dim=0; dim<ndim; ++dim )
277 std::vector<int> pos( ndim, 0 );
279 strides[dim] = &obj( pos ) - &obj(0,0,0,0);
282 this->filterProperties(dsi->header(), options);
285 *dsi = _imw->writeHeader( *dsi, (T*) &obj(0,0,0,0), position, view,
293 std::vector<int> file_sz( ndim, 1 );
294 if( !dsi->header()->getProperty(
"volume_dimension", file_sz ) )
296 dsi->header()->getProperty(
"sizeX", file_sz[0] );
297 dsi->header()->getProperty(
"sizeY", file_sz[1] );
298 dsi->header()->getProperty(
"sizeZ", file_sz[2] );
299 dsi->header()->getProperty(
"sizeT", file_sz[3] );
301 for( dim=0; dim<ndim; ++dim )
303 if( file_sz.size() <= dim )
304 file_sz.push_back( 1 );
305 if( position[dim] + view[dim] > file_sz[dim] )
307 localMsg(
"view is larger than the volume." );
317 data =
reinterpret_cast<const T*
>( &obj(0,0,0,0) );
319 _imw->write( data, *dsi, position, view, strides, options );
349 template <
typename T>
359 template <
typename T>
364 template <
typename T>
375 template <
typename T>
382 return vfw.
write( *obj, dsi, options );
385 template <
typename T>
Object reference(Object &value)
std::vector< int > getSize() const
get the 4 dimensions in a vector
Convenient handle for a Volume - this is normally the entry point for all volumes handling.
const AllocatorContext & allocatorContext() const
returns volume's AllocatorContext
const Position & posInRefVolume() const
Get position in parent volume.
rc_ptr< Volume< T > > refVolume() const
Get parent volume.
MappingMode allocatorType() const
static void filter(carto::Object header, carto::Object options=carto::none())
std::string toString(const T &object)