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)