33 #ifndef CARTODATA_IO_VOLUMEUTILIO_D_H
34 #define CARTODATA_IO_VOLUMEUTILIO_D_H
52 #define localMsg( message ) cartoCondMsg( 3, message, "VOLUMEUTILIO" )
60 template <
typename T> std::set<std::string>
63 std::set<std::string> properties;
64 properties.insert(
"ox" );
65 properties.insert(
"oy" );
66 properties.insert(
"oz" );
67 properties.insert(
"ot" );
68 properties.insert(
"sx" );
69 properties.insert(
"sy" );
70 properties.insert(
"sz" );
71 properties.insert(
"st" );
72 properties.insert(
"bx" );
73 properties.insert(
"by" );
74 properties.insert(
"bz" );
75 properties.insert(
"border" );
76 properties.insert(
"ox1" );
77 properties.insert(
"ox2" );
78 properties.insert(
"ox3" );
79 properties.insert(
"ox4" );
80 properties.insert(
"ox5" );
81 properties.insert(
"ox6" );
82 properties.insert(
"ox7" );
83 properties.insert(
"ox8" );
84 properties.insert(
"sx1" );
85 properties.insert(
"sx2" );
86 properties.insert(
"sx3" );
87 properties.insert(
"sx4" );
88 properties.insert(
"sx5" );
89 properties.insert(
"sx6" );
90 properties.insert(
"sx7" );
91 properties.insert(
"sx8" );
105 localMsg(
"VolumeUtilIO<T>::read" );
108 std::vector<int> position( 4, 0 );
109 std::vector<int> frame( 4, -1 );
110 std::vector<int> borders( 4, 0 );
112 position[0] = (int) rint(options->getProperty(
"ox" )->getScalar() );
113 options->removeProperty(
"ox" );
116 position[1] = (int) rint( options->getProperty(
"oy" )->getScalar() );
117 options->removeProperty(
"oy" );
120 position[2] = (int) rint( options->getProperty(
"oz" )->getScalar() );
121 options->removeProperty(
"oz" );
124 position[3] = (int) rint( options->getProperty(
"ot" )->getScalar() );
125 options->removeProperty(
"ot" );
128 frame[0] = (int) rint( options->getProperty(
"sx" )->getScalar() );
129 options->removeProperty(
"sx" );
132 frame[1] = (int) rint( options->getProperty(
"sy" )->getScalar() );
133 options->removeProperty(
"sy" );
136 frame[2] = (int) rint( options->getProperty(
"sz" )->getScalar() );
137 options->removeProperty(
"sz" );
140 frame[3] = (int) rint( options->getProperty(
"st" )->getScalar() );
141 options->removeProperty(
"st" );
144 borders[0] = (int) rint( options->getProperty(
"border" )->getScalar() );
145 borders[1] = (int) rint( options->getProperty(
"border" )->getScalar() );
146 borders[2] = (int) rint( options->getProperty(
"border" )->getScalar() );
147 options->removeProperty(
"border" );
150 borders[0] = (int) rint( options->getProperty(
"bx" )->getScalar() );
151 options->removeProperty(
"bx" );
154 borders[1] = (int) rint( options->getProperty(
"by" )->getScalar() );
155 options->removeProperty(
"by" );
158 borders[2] = (int) rint( options->getProperty(
"bz" )->getScalar() );
159 options->removeProperty(
"bz" );
163 for( dim=0; dim<carto::Volume<T>::DIM_MAX; ++dim )
167 std::stringstream skey;
168 skey <<
"ox" << dim+1;
169 std::string key = skey.str();
170 value = (int) rint( options->getProperty( key )->getScalar() );
171 options->removeProperty( key );
172 if( position.size() <= dim )
173 position.resize( dim + 1, 0 );
174 position[ dim ] = value;
179 std::stringstream skey;
180 skey <<
"sx" << dim+1;
181 std::string key = skey.str();
182 value = (int) rint( options->getProperty( key )->getScalar() );
183 options->removeProperty( key );
184 if( frame.size() <= dim )
185 frame.resize( dim + 1, -1 );
186 frame[ dim ] = value;
191 bool partial =
false;
192 for( dim=0; !partial && dim<position.size(); ++dim )
193 if( position[dim] != 0 )
195 for( dim=0; !partial && dim<frame.size(); ++dim )
196 if( frame[dim] != -1 )
200 return readPartial( obj, dsi, position, frame, borders, options );
202 return readFull( obj, dsi, borders, options );
208 std::vector<int> borders,
217 std::vector<int> fullsize;
218 std::vector<int> bordersize;
219 std::vector<int> volumepos;
221 if( borders[0] !=0 || borders[1] !=0 || borders[2] !=0 )
224 localMsg(
"=== READING FULL VOLUME SIZE" );
226 newoptions->copyProperties( options );
227 localMsg(
"checking full volume..." );
228 *dsi = dsil.
check( *dsi, options );
230 if( !dsi->header()->getProperty(
"volume_dimension", fullsize ) )
232 fullsize[0] = (int) rint(
233 dsi->header()->getProperty(
"sizeX" )->getScalar() );
234 fullsize[1] = (int) rint(
235 dsi->header()->getProperty(
"sizeY" )->getScalar() );
236 fullsize[2] = (int) rint(
237 dsi->header()->getProperty(
"sizeZ" )->getScalar() );
238 fullsize[3] = (int) rint(
239 dsi->header()->getProperty(
"sizeT" )->getScalar() );
241 if( fullsize.size() < 4 )
242 fullsize.resize( 4, 1 );
243 volumepos.resize( fullsize.size(), 0 );
244 volumepos[0] = borders[0];
245 volumepos[1] = borders[1];
246 volumepos[2] = borders[2];
255 localMsg(
"=== ALLOCATED BORDERS VOLUME" );
257 bordersize = fullsize;
258 bordersize[0] = fullsize[0] + 2*borders[0];
259 bordersize[1] = fullsize[1] + 2*borders[1];
260 bordersize[2] = fullsize[2] + 2*borders[2];
261 localMsg(
"creating allocated volume..." );
272 localMsg(
"=== UNALLOCATED FULL VIEW" );
275 newoptions->copyProperties( options );
276 newoptions->setProperty(
"keep_allocation",
true );
278 localMsg(
"creating volume view..." );
295 localMsg(
"reading unallocated volume..." );
321 localMsg(
"=== ALLOCATED FULL VIEW" );
324 newoptions->copyProperties( options );
336 std::vector<int> position,
337 std::vector<int> frame,
338 std::vector<int> borders,
342 localMsg(
"VolumeUtilIO<T>::readPartial" );
343 std::vector<int> viewframe( frame );
344 size_t dim, ndim =
std::max( position.size(), frame.size() );
345 if( viewframe.size() < ndim )
346 viewframe.resize( ndim, -1 );
347 std::vector<int> viewpos( position );
348 if( viewpos.size() < ndim )
349 viewpos.resize( ndim, 0 );
350 std::vector<int> fullsize;
351 std::vector<int> borderframe( ndim, 1 );
352 std::vector<int> borderpos;
353 std::vector<int> readframe( ndim, 0 );
354 std::vector<int> readpos( ndim, 0 );
362 localMsg(
"=== UNALLOCATED FULL VOLUME" );
365 newoptions->setProperty(
"unallocated",
true );
366 newoptions->copyProperties( options );
368 localMsg(
"reading unallocated volume..." );
370 localMsg(
"reading size from volume..." );
371 fullsize = fullVolume->
getSize();
387 for( dim=0; dim<ndim; ++dim )
388 if( viewframe[ dim ] == -1 )
389 viewframe[ dim ] = (fullsize[ dim ] - position[ dim ]);
394 std::vector<int> loverflow(3,0), uoverflow(3, 0);
395 loverflow[0] = (viewpos[0] < 0 ? -viewpos[0] : 0);
396 loverflow[1] = (viewpos[1] < 0 ? -viewpos[1] : 0);
397 loverflow[2] = (viewpos[2] < 0 ? -viewpos[2] : 0);
399 uoverflow[0] = (viewpos[0] + viewframe[0] - fullsize[0] > 0 ?
400 viewpos[0] + viewframe[0] - fullsize[0] : 0);
401 uoverflow[1] = (viewpos[1] + viewframe[1] - fullsize[1] > 0 ?
402 viewpos[1] + viewframe[1] - fullsize[1] : 0);
403 uoverflow[2] = (viewpos[2] + viewframe[2] - fullsize[2] > 0 ?
404 viewpos[2] + viewframe[2] - fullsize[2] : 0);
410 int overflow_policy = 0;
415 overflow_policy = int( overflow_pol->getScalar() );
421 if( borders[0] != 0 || borders[1] != 0 || borders[2] != 0
422 || (overflow_policy == 1 &&
423 (loverflow[0] > 0 || loverflow[1] > 0 || loverflow[2] > 0
424 || uoverflow[0] > 0 || uoverflow[1] > 0 || uoverflow[2] > 0 ) ) )
427 localMsg(
"=== ALLOCATED BORDERS VOLUME" );
431 borderpos[0] -= borders[0];
432 borderpos[1] -= borders[1];
433 borderpos[2] -= borders[2];
435 borderframe = viewframe;
436 borderframe[0] += 2*borders[0];
437 borderframe[1] += 2*borders[1];
438 borderframe[2] += 2*borders[2];
464 localMsg(
"=== UNALLOCATED READ VIEW" );
465 localMsg(
"computing read frame..." );
467 readpos[0] = ( borderpos[0] < 0 ? borders[0] + loverflow[0] : 0 );
468 readpos[1] = ( borderpos[1] < 0 ? borders[1] + loverflow[1] : 0 );
469 readpos[2] = ( borderpos[2] < 0 ? borders[2] + loverflow[2] : 0 );
471 std::vector<int> borderdep( 3, 0 );
472 borderdep[0] = ( borderpos[0] + borderframe[0] - fullsize[0] > 0
473 ? borderpos[0] + borderframe[0] - fullsize[0] : 0 );
474 borderdep[1] = ( borderpos[1] + borderframe[1] - fullsize[1] > 0
475 ? borderpos[1] + borderframe[1] - fullsize[1] : 0 );
476 borderdep[2] = ( borderpos[2] + borderframe[2] - fullsize[2] > 0
477 ? borderpos[2] + borderframe[2] - fullsize[2] : 0 );
478 readframe[0] = borderframe[0] - readpos[0] - borderdep[0];
479 readframe[1] = borderframe[1] - readpos[1] - borderdep[1];
480 readframe[2] = borderframe[2] - readpos[2] - borderdep[2];
481 readframe[3] = borderframe[3];
484 newoptions->setProperty(
"partial_reading",
true );
485 newoptions->copyProperties( options );
487 localMsg(
"creating read volume..." );
511 rView.
read( *readVolume );
521 localMsg(
"=== UNALLOCATED PROCESSED VOLUME" );
522 localMsg(
"computing view frame..." );
524 if (overflow_policy == 1)
526 viewframe[0] -= loverflow[0] + uoverflow[0];
527 viewframe[1] -= loverflow[1] + uoverflow[1];
528 viewframe[2] -= loverflow[2] + uoverflow[2];
530 viewpos[0] = borders[0] + loverflow[0];
531 viewpos[1] = borders[1] + loverflow[1];
532 viewpos[2] = borders[2] + loverflow[2];
536 viewpos[0] = borders[0];
537 viewpos[1] = borders[1];
538 viewpos[2] = borders[2];
557 bool keep_allocation =
false;
562 keep_allocation = bool( keep_alloc->getScalar() );
567 if( !keep_allocation )
604 localMsg(
"=== ALLOCATED PROCESSED VOLUME" );
607 newoptions->setProperty(
"partial_reading",
true );
608 newoptions->copyProperties( options );
615 bool keep_allocation =
false;
620 keep_allocation = bool( keep_alloc->getScalar() );
625 if( keep_allocation )
652 if ( loverflow[0] > 0 || loverflow[1] > 0 || loverflow[2] > 0
653 || uoverflow[0] > 0 || uoverflow[1] > 0 || uoverflow[2] > 0 )
656 localMsg(
"=== UNALLOCATED READ VIEW" );
657 localMsg(
"computing read frame for overflows..." );
659 readpos[0] = loverflow[0];
660 readpos[1] = loverflow[1];
661 readpos[2] = loverflow[2];
663 readframe[0] = viewframe[0] - loverflow[0] - uoverflow[0];
664 readframe[1] = viewframe[1] - loverflow[1] - uoverflow[1];
665 readframe[2] = viewframe[2] - loverflow[2] - uoverflow[2];
666 readframe[3] = viewframe[3];
667 localMsg(
"creating read volume..." );
687 readpos, readframe ) );
696 localMsg(
"reading partial volume using read view ..." );
697 rView.
read( *readVolume );
700 localMsg(
"reading partial volume..." );
virtual void copyProperties(Object source)
void setProperty(const std::string &, const T &)
bool getProperty(const std::string &, T &) const
Convenient handle for a Volume - this is normally the entry point for all volumes handling.
std::vector< int > getSize() const
const PropertySet & header() const
const AllocatorContext & allocatorContext() const
returns volume's AllocatorContext
std::vector< size_t > getStrides() const
Get strides for the volume.
const T & at(long x, long y=0, long z=0, long t=0) const
DataSourceInfo check(DataSourceInfo dsi, carto::Object options=carto::none(), int passbegin=1, int passend=3)
void setAllocatorContext(const AllocatorContext &ac)
const carto::rc_ptr< DataSourceInfo > & dataSourceInfo() const
virtual bool read(T &obj, carto::Object header=carto::none(), int passbegin=1, int passend=4)
void setOptions(carto::Object options)
static std::set< std::string > listReadProperties()
list of properties triggering partial reading and/or borders
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.
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.
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.
std::string toString(const T &object)
T max(const Volume< T > &vol)
Returns the maximum value of the volume.
#define localMsg(message)