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;
211 std::vector<int> odim = obj.
getSize();
212 std::vector<float> osz( odim.begin(), odim.end() );
213 for( dim=0; dim<osz.size(); ++dim )
215 rc_ptr<Transformation> tolpir = ref.toOrientation(
"LPI", osz );
218 std::unique_ptr<AffineTransformationBase> itolpi = tolpi.
inverse();
221 for( dim=0; dim<lpi_size.size(); ++dim )
222 lpi_size[dim] = std::abs( lpi_size[dim] );
229 options->setProperty(
"unallocated",
true );
234 dsi->header()->copyProperties( lpi_header );
235 std::vector<int> size;
236 lpi_header->getProperty(
"volume_dimension", size );
237 dsi->header()->setProperty(
"sizeX", size[0] );
238 dsi->header()->setProperty(
"sizeY", size[1] );
239 dsi->header()->setProperty(
"sizeZ", size[2] );
240 dsi->header()->setProperty(
"sizeT", size[3] );
246 position[0] = (int) rint( options->getProperty(
"ox" )->getScalar() );
250 position[1] = (int) rint( options->getProperty(
"oy" )->getScalar() );
254 position[2] = (int) rint( options->getProperty(
"oz" )->getScalar() );
259 position[3] = (int) rint( options->getProperty(
"ot" )->getScalar() );
264 for( dim=0; dim<carto::Volume<T>::DIM_MAX; ++dim )
268 std::stringstream skey;
269 skey <<
"ox" << dim+1;
270 std::string key = skey.str();
271 value = (int) rint( options->getProperty( key )->getScalar() );
272 options->removeProperty( key );
273 while( position.size() <= dim )
274 position.push_back( 0 );
275 position[ dim ] = value;
284 std::vector<long> strides( ndim );
285 for( dim=0; dim<ndim; ++dim )
287 std::vector<int> pos( ndim, 0 );
289 strides[dim] = &obj( pos ) - &obj(0,0,0,0);
295 std::vector<int> opos = position;
296 std::vector<int> oview = view;
297 const T* start = &obj(0);
300 std::vector<int> p = std::vector<int>( ndim, 0 );
301 std::vector<int> pi = itolpi->transform( p );
304 for( dim=0; dim<oview.size(); ++dim )
305 oview[dim] = std::abs( oview[dim] );
306 for( dim=0; dim<ndim; ++dim )
309 pi = itolpi->transformVector( p );
310 strides[dim] = &obj.
at( pi ) - &obj.
at( 0 );
315 *dsi =
_imw->writeHeader( *dsi, start, opos, oview,
323 std::vector<int> file_sz( ndim, 1 );
324 if( !dsi->header()->getProperty(
"volume_dimension", file_sz ) )
326 dsi->header()->getProperty(
"sizeX", file_sz[0] );
327 dsi->header()->getProperty(
"sizeY", file_sz[1] );
328 dsi->header()->getProperty(
"sizeZ", file_sz[2] );
329 dsi->header()->getProperty(
"sizeT", file_sz[3] );
331 for( dim=0; dim<ndim; ++dim )
333 if( file_sz.size() <= dim )
334 file_sz.push_back( 1 );
335 if( opos[dim] + oview[dim] > file_sz[dim] )
337 localMsg(
"view is larger than the volume." );
350 _imw->write( data, *dsi, opos, oview, strides, options );
MappingMode allocatorType() const