33 #ifndef CARTODATA_IO_VOLUMEUTILIO_D_H 34 #define CARTODATA_IO_VOLUMEUTILIO_D_H 52 #define localMsg( message ) cartoCondMsg( 3, message, "VOLUMEUTILIO" ) 58 template <
typename T> std::set<std::string>
61 std::set<std::string> properties;
62 properties.insert(
"ox" );
63 properties.insert(
"oy" );
64 properties.insert(
"oz" );
65 properties.insert(
"ot" );
66 properties.insert(
"sx" );
67 properties.insert(
"sy" );
68 properties.insert(
"sz" );
69 properties.insert(
"st" );
70 properties.insert(
"bx" );
71 properties.insert(
"by" );
72 properties.insert(
"bz" );
73 properties.insert(
"border" );
74 properties.insert(
"ox1" );
75 properties.insert(
"ox1" );
76 properties.insert(
"ox2" );
77 properties.insert(
"ox3" );
78 properties.insert(
"ox4" );
79 properties.insert(
"ox5" );
80 properties.insert(
"ox6" );
81 properties.insert(
"ox7" );
82 properties.insert(
"ox8" );
83 properties.insert(
"sx1" );
84 properties.insert(
"sx2" );
85 properties.insert(
"sx3" );
86 properties.insert(
"sx4" );
87 properties.insert(
"sx5" );
88 properties.insert(
"sx6" );
89 properties.insert(
"sx7" );
90 properties.insert(
"sx8" );
103 std::vector<int> position( 4, 0 );
104 std::vector<int> frame( 4, 0 );
105 std::vector<int> borders( 4, 0 );
107 position[0] = (int) rint(options->getProperty(
"ox" )->getScalar() );
108 options->removeProperty(
"ox" );
111 position[1] = (int) rint( options->getProperty(
"oy" )->getScalar() );
112 options->removeProperty(
"oy" );
115 position[2] = (int) rint( options->getProperty(
"oz" )->getScalar() );
116 options->removeProperty(
"oz" );
119 position[3] = (int) rint( options->getProperty(
"ot" )->getScalar() );
120 options->removeProperty(
"ot" );
123 frame[0] = (int) rint( options->getProperty(
"sx" )->getScalar() );
124 options->removeProperty(
"sx" );
127 frame[1] = (int) rint( options->getProperty(
"sy" )->getScalar() );
128 options->removeProperty(
"sy" );
131 frame[2] = (int) rint( options->getProperty(
"sz" )->getScalar() );
132 options->removeProperty(
"sz" );
135 frame[3] = (int) rint( options->getProperty(
"st" )->getScalar() );
136 options->removeProperty(
"st" );
139 borders[0] = (int) rint( options->getProperty(
"border" )->getScalar() );
140 borders[1] = (int) rint( options->getProperty(
"border" )->getScalar() );
141 borders[2] = (int) rint( options->getProperty(
"border" )->getScalar() );
142 options->removeProperty(
"border" );
145 borders[0] = (int) rint( options->getProperty(
"bx" )->getScalar() );
146 options->removeProperty(
"bx" );
149 borders[1] = (int) rint( options->getProperty(
"by" )->getScalar() );
150 options->removeProperty(
"by" );
153 borders[2] = (int) rint( options->getProperty(
"bz" )->getScalar() );
154 options->removeProperty(
"bz" );
158 for( dim=0; dim<carto::Volume<T>::DIM_MAX; ++dim )
162 std::stringstream skey;
163 skey <<
"ox" << dim+1;
164 std::string key = skey.str();
165 value = (int) rint( options->getProperty( key )->getScalar() );
166 options->removeProperty( key );
167 if( position.size() <= dim )
168 position.resize( dim + 1, 0 );
169 position[ dim ] = value;
174 std::stringstream skey;
175 skey <<
"sx" << dim+1;
176 std::string key = skey.str();
177 value = (int) rint( options->getProperty( key )->getScalar() );
178 options->removeProperty( key );
179 if( frame.size() <= dim )
180 frame.resize( dim + 1, 0 );
181 frame[ dim ] = value;
186 bool partial =
false;
187 for( dim=0; !partial && dim<position.size(); ++dim )
188 if( position[dim] != 0 )
190 for( dim=0; !partial && dim<frame.size(); ++dim )
191 if( frame[dim] != 0 )
195 return readPartial( obj, dsi, position, frame, borders, options );
197 return readFull( obj, dsi, borders, options );
203 std::vector<int> borders,
212 std::vector<int> fullsize;
213 std::vector<int> bordersize;
214 std::vector<int> volumepos;
216 if( borders[0] !=0 || borders[1] !=0 || borders[2] !=0 )
219 localMsg(
"=== READING FULL VOLUME SIZE" );
221 newoptions->copyProperties( options );
222 localMsg(
"checking full volume..." );
223 *dsi = dsil.
check( *dsi, options );
225 if( !dsi->
header()->getProperty(
"volume_dimension", fullsize ) )
227 fullsize[0] = (int) rint(
228 dsi->
header()->getProperty(
"sizeX" )->getScalar() );
229 fullsize[1] = (int) rint(
230 dsi->
header()->getProperty(
"sizeY" )->getScalar() );
231 fullsize[2] = (int) rint(
232 dsi->
header()->getProperty(
"sizeZ" )->getScalar() );
233 fullsize[3] = (int) rint(
234 dsi->
header()->getProperty(
"sizeT" )->getScalar() );
236 if( fullsize.size() < 4 )
237 fullsize.resize( 4, 1 );
238 volumepos.resize( fullsize.size(), 0 );
239 volumepos[0] = borders[0];
240 volumepos[1] = borders[1];
241 volumepos[2] = borders[2];
250 localMsg(
"=== ALLOCATED BORDERS VOLUME" );
252 bordersize = fullsize;
253 bordersize[0] = fullsize[0] + 2*borders[0];
254 bordersize[1] = fullsize[1] + 2*borders[1];
255 bordersize[2] = fullsize[2] + 2*borders[2];
256 localMsg(
"creating allocated volume..." );
267 localMsg(
"=== UNALLOCATED FULL VIEW" );
270 newoptions->copyProperties( options );
271 newoptions->setProperty(
"keep_allocation",
true );
273 localMsg(
"creating volume view..." );
290 localMsg(
"reading unallocated volume..." );
306 bordersVolume->
header().setProperty(
"voxel_size", vs );
316 localMsg(
"=== ALLOCATED FULL VIEW" );
319 newoptions->copyProperties( options );
331 std::vector<int> position,
332 std::vector<int> frame,
333 std::vector<int> borders,
337 std::vector<int> viewframe( frame );
338 size_t dim, ndim =
std::max( position.size(), frame.size() );
339 if( viewframe.size() < ndim )
340 viewframe.resize( ndim, 0 );
341 std::vector<int> viewpos( position );
342 if( viewpos.size() < ndim )
343 viewpos.resize( ndim, 0 );
344 std::vector<int> fullsize;
345 std::vector<int> borderframe( ndim, 1 );
346 std::vector<int> borderpos;
347 std::vector<int> readframe( ndim, 0 );
348 std::vector<int> readpos( ndim, 0 );
356 localMsg(
"=== UNALLOCATED FULL VOLUME" );
359 newoptions->setProperty(
"unallocated",
true );
360 newoptions->copyProperties( options );
362 localMsg(
"reading unallocated volume..." );
364 localMsg(
"reading size from volume..." );
365 fullsize = fullVolume->
getSize();
381 for( dim=0; dim<ndim; ++dim )
382 if( viewframe[ dim ] == 0
383 || viewframe[ dim ] + position[ dim ] > fullsize[ dim ] )
384 viewframe[ dim ] = (fullsize[ dim ] - position[ dim ]);
387 if( borders[0] != 0 || borders[1] != 0 || borders[2] != 0 )
390 localMsg(
"=== ALLOCATED BORDERS VOLUME" );
394 borderpos[0] -= borders[0];
395 borderpos[1] -= borders[1];
396 borderpos[2] -= borders[2];
397 borderframe = viewframe;
398 borderframe[0] += 2*borders[0];
399 borderframe[1] += 2*borders[1];
400 borderframe[2] += 2*borders[2];
425 localMsg(
"=== UNALLOCATED READ VIEW" );
426 localMsg(
"computing read frame..." );
428 readpos[0] = ( borderpos[0] < 0 ? borders[0] : 0 );
429 readpos[1] = ( borderpos[1] < 0 ? borders[1] : 0 );
430 readpos[2] = ( borderpos[2] < 0 ? borders[2] : 0 );
432 std::vector<int> borderdep( 3, 0 );
433 borderdep[0] = ( borderpos[0] + borderframe[0] - fullsize[0] > 0
434 ? borderpos[0] + borderframe[0] - fullsize[0] : 0 );
435 borderdep[1] = ( borderpos[1] + borderframe[1] - fullsize[1] > 0
436 ? borderpos[1] + borderframe[1] - fullsize[1] : 0 );
437 borderdep[2] = ( borderpos[2] + borderframe[2] - fullsize[2] > 0
438 ? borderpos[2] + borderframe[2] - fullsize[2] : 0 );
439 readframe[0] = borderframe[0] - readpos[0] - borderdep[0];
440 readframe[1] = borderframe[1] - readpos[1] - borderdep[1];
441 readframe[2] = borderframe[2] - readpos[2] - borderdep[2];
442 readframe[3] = borderframe[3];
445 newoptions->setProperty(
"partial_reading",
true );
446 newoptions->copyProperties( options );
472 rView.
read( *readVolume );
482 localMsg(
"=== UNALLOCATED PROCESSED VOLUME" );
483 localMsg(
"computing view frame..." );
485 viewpos[0] = borders[0];
486 viewpos[1] = borders[1];
487 viewpos[2] = borders[2];
522 bordersVolume->
header().setProperty(
"voxel_size", vs );
538 localMsg(
"=== ALLOCATED PROCESSED VOLUME" );
541 newoptions->setProperty(
"partial_reading",
true );
542 newoptions->copyProperties( options );
550 localMsg(
"reading partial volume..." );
T max(const Volume< T > &vol)
Returns the maximum value of the volume.
Convenient handle for a Volume - this is normally the entry point for all volumes handling...
const AllocatorContext & allocatorContext() const
returns volume's AllocatorContext
static carto::Volume< T > * readFull(carto::Volume< T > *obj, carto::rc_ptr< DataSourceInfo > dsi, std::vector< int > borders, carto::Object options)
Worker for full reading case.
const PropertySet & header() const
const carto::rc_ptr< DataSourceInfo > & dataSourceInfo() const
void setProperty(const std::string &, const T &)
static carto::Volume< T > * readPartial(carto::Volume< T > *obj, carto::rc_ptr< DataSourceInfo > dsi, std::vector< int > position, std::vector< int > frame, std::vector< int > borders, carto::Object options)
Worker for partial reading case.
void setAllocatorContext(const AllocatorContext &ac)
static carto::Volume< T > * read(carto::Volume< T > *obj, carto::rc_ptr< DataSourceInfo > dsi, carto::Object options)
Manages all the volumes necessary and returns the final Volume.
#define localMsg(message)
DataSourceInfo check(DataSourceInfo dsi, carto::Object options=carto::none(), int passbegin=1, int passend=3)
std::vector< int > getSize() const
void setOptions(carto::Object options)
static std::set< std::string > listReadProperties()
list of properties triggering partial reading and/or borders
virtual bool read(T &obj, carto::Object header=carto::none(), int passbegin=1, int passend=4)
std::string toString(const T &object)
const carto::Object & header() const