Skip to content

Commit

Permalink
New features
Browse files Browse the repository at this point in the history
- path and name of metadata file of unstitched datasets (mdata.bin) can be changed using command line option --mdata_bin
- loading of special cases of unstitched subvolumes has been optimized
  • Loading branch information
iannellog committed Mar 3, 2018
1 parent 95f0161 commit b83b05e
Show file tree
Hide file tree
Showing 15 changed files with 367 additions and 307 deletions.
2 changes: 1 addition & 1 deletion cmake/Version.cmake
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
set(TeraStitcher_VERSION_MAJOR 1)
set(TeraStitcher_VERSION_MINOR 10)
set(TeraStitcher_VERSION_PATCH 11)
set(TeraStitcher_VERSION_PATCH 12)
set(TeraStitcher_VERSION
"${TeraStitcher_VERSION_MAJOR}.${TeraStitcher_VERSION_MINOR}.${TeraStitcher_VERSION_PATCH}")
add_definitions( -DTERASTITCHER_MAJOR=${TeraStitcher_VERSION_MAJOR} )
Expand Down
565 changes: 288 additions & 277 deletions src/imagemanager/UnstitchedVolume.cpp

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/imagemanager/VirtualVolume.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ class iim::VirtualVolume {
src += totalChanSize;
cc++;
}
memcpy(dst,src,totalChanSize);
memcpy(dst,src,(size_t)totalChanSize);
}
}

Expand Down
10 changes: 5 additions & 5 deletions src/iomanager/ioplugins.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// Include plugins headers
#include "plugins/dcimg/dcimg.h"
#include "plugins/IMS_HDF5/IMS_HDF5.h"
#include "plugins/tiff2D/tiff2D.h"
#include "plugins/tiff3D/tiff3D.h"
// Include plugins headers
#include "plugins/dcimg/dcimg.h"
#include "plugins/IMS_HDF5/IMS_HDF5.h"
#include "plugins/tiff2D/tiff2D.h"
#include "plugins/tiff3D/tiff3D.h"
4 changes: 4 additions & 0 deletions src/ui/CLI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
/******************
* CHANGELOG *
*******************
* 2018-03-02. Giulio. @ADDED an option to set a path and a name for the mdata.bin file generated when volumes are created from data
* 2018-01-30. Giulio. @FIXED flags disabling last row and colum were not initialized in non-parallel executions
* 2018-01-28. Giulio. @CHANGED the checks about the image input channel
* 2018-01-23. Giulio. @ADDED check to set always the input format of a MultiVolume dataset as a non-interleaved input format
Expand Down Expand Up @@ -84,6 +85,7 @@ void TeraStitcherCLI::readParams(int argc, char** argv) throw (iom::exception)
TCLAP::SwitchArg p_isotropic("","isotropic","Generate lowest resolution with voxels as much isotropic as possible. Use this flag when the high resolution image has highy anistropic voxels",false);
TCLAP::SwitchArg p_dump("d","dump","Print the entire content of metadata file mdata.bin",false);
TCLAP::SwitchArg p_pluginsinfo("p","pluginsinfo","Display plugins informations",false);
TCLAP::ValueArg<std::string> p_mdata_fname("","mdata_bin","Path and name of mdata.bin file.",false,"","string");
TCLAP::ValueArg<std::string> p_vol_in_path("","volin","Directory path where the volume is stored.",false,"null","string");
TCLAP::ValueArg<std::string> p_vol_out_path("","volout","Directory path where to save the stitched volume.",false,"null","string");
TCLAP::ValueArg<std::string> p_vol_in_plugin("","volin_plugin",vm::strprintf("Plugin that manages the input volume format/organization. Available plugins are: {%s}. Default is \"%s\".", vm::VirtualVolumeFactory::registeredPlugins().c_str(), vm::VOLUME_INPUT_FORMAT_PLUGIN.c_str()),false,vm::VOLUME_INPUT_FORMAT_PLUGIN,"string");
Expand Down Expand Up @@ -211,6 +213,7 @@ void TeraStitcherCLI::readParams(int argc, char** argv) throw (iom::exception)
cmd.add(p_vol_out_path);
cmd.add(p_vol_in_plugin);
cmd.add(p_vol_in_path);
cmd.add(p_mdata_fname);
cmd.add(p_pluginsinfo);
cmd.add(p_dump);
cmd.add(p_stitch);
Expand Down Expand Up @@ -520,6 +523,7 @@ void TeraStitcherCLI::readParams(int argc, char** argv) throw (iom::exception)
this->thresholddisplacements = p_thresholdisplacements.getValue();
this->placetiles = p_placetiles.getValue();
this->mergetiles = p_merge.getValue();
this->mdata_fname = p_mdata_fname.getValue();
this->volume_load_path = p_vol_in_path.getValue();
this->volume_save_path = p_vol_out_path.getValue();
this->projfile_load_path = p_proj_in_path.getValue();
Expand Down
2 changes: 2 additions & 0 deletions src/ui/CLI.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
/******************
* CHANGELOG *
*******************
* 2018-03-02. Giulio. @ADDED an option to set a path and a name for the mdata.bin file generated when volumes are created from data
* 2018-01-23. Giulio. @ADDED include of MCVolume.h
* 2017-06-30. Giulio. @ADDED control over displacement computation of last row and last column of tiles
* 2016-09-04. Giulio. @ADDED the options for setting the configuration of the LibTIFF library
Expand Down Expand Up @@ -66,6 +67,7 @@ class TeraStitcherCLI
bool isotropic; //generate lowest resolutiona with voxels as much isotropic as possible

//STITCHING pipeline parameters
string mdata_fname; //path & file mane of mdata.bin file
string volume_load_path; //directory path where the volume is stored used during the volume import step
string volume_save_path; //directory path where to save the stitched volume
string projfile_load_path; //file path of the project XML file to be loaded
Expand Down
3 changes: 2 additions & 1 deletion src/ui/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
/******************
* CHANGELOG *
*******************
* 2018-03-02. Giulio. @ADDED the possibility to set a path and a name for the mdata.bin file generated when volumes are created from data
* 2018-01-23. Giulio. @ADDED check to set always the input format of a MultiVolume dataset as a non-interleaved input format
* 2017-12-01. Giulio @ADDED conditional code to activate the new merge step
* 2017-06-30. Giulio. @FIXED the coding of iom::CHANS was not coherent with the one used internally by vmVirtualVolume
Expand Down Expand Up @@ -190,7 +191,7 @@ int main(int argc, char** argv)
throw iom::exception(vm::strprintf("Volume \"%s\" is incomplete or not coherent", volume->getSTACKS_DIR()).c_str());
}
else if(cli.import || (cli.computedisplacements && cli.projfile_load_path.compare("null")==0) || cli.stitch || cli.test) {
volume = volumemanager::VirtualVolumeFactory::createFromData(vm::VOLUME_INPUT_FORMAT_PLUGIN, cli.volume_load_path.c_str(), cli.reference_system, cli.VXL_1, cli.VXL_2, cli.VXL_3, true);
volume = volumemanager::VirtualVolumeFactory::createFromData(vm::VOLUME_INPUT_FORMAT_PLUGIN, cli.volume_load_path.c_str(), cli.reference_system, cli.VXL_1, cli.VXL_2, cli.VXL_3, true, cli.mdata_fname);
if ( !volume->check(fillPath(cli.errlogfile_path, volume->getSTACKS_DIR(), "err_log_file", "txt").c_str()) ) {
// save xml for further checking
volume->saveXML(0, fillPath(cli.projfile_save_path, volume->getSTACKS_DIR(), "xml_import", "xml").c_str());
Expand Down
21 changes: 18 additions & 3 deletions src/volumemanager/vmBlockVolume.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
/******************
* CHANGELOG *
*******************
* 2018-03-02. Giulio. @ADDED the possibility to set a path and a name for the mdata.bin file
* 2018-02-03. Giulio. @ADDED call to 'adjustDisplacements' in method reading the xml file to force all displacements of adjacent tile symmetric
* 2017-06-27. Giulio. @CHANGED If the attributes 'resolution' and 'timepoint' in section 'subimage' of xml file are present additional parameters are always enabled
* 2017-04-27. Giulio. @ADDED code to get and initialize the input plugin from the xml if specified
Expand Down Expand Up @@ -90,7 +91,7 @@ const std::string BlockVolume::creator_id1 = volumemanager::VirtualVolumeFactory
const std::string BlockVolume::creator_id2 = volumemanager::VirtualVolumeFactory::registerPluginCreatorData(&createFromData, BlockVolume::id);


BlockVolume::BlockVolume(const char* _stacks_dir, vm::ref_sys _reference_system, float VXL_1, float VXL_2, float VXL_3, bool overwrite_mdata) throw (iom::exception)
BlockVolume::BlockVolume(const char* _stacks_dir, vm::ref_sys _reference_system, float VXL_1, float VXL_2, float VXL_3, bool overwrite_mdata, std::string mdata_fname) throw (iom::exception)
: VirtualVolume(_stacks_dir, _reference_system, VXL_1, VXL_2, VXL_3)
{
#if VM_VERBOSE > 3
Expand All @@ -104,7 +105,12 @@ BlockVolume::BlockVolume(const char* _stacks_dir, vm::ref_sys _reference_system,

//trying to unserialize an already existing metadata file, if it doesn't exist the full initialization procedure is performed and metadata is saved
char mdata_filepath[VM_STATIC_STRINGS_SIZE];
sprintf(mdata_filepath, "%s/%s", stacks_dir, vm::BINARY_METADATA_FILENAME.c_str());
if ( mdata_fname == "" ) { // no metadata file name present in xml file, use default folder and name
sprintf(mdata_filepath, "%s/%s", stacks_dir, vm::BINARY_METADATA_FILENAME.c_str());
}
else {
strcpy(mdata_filepath,mdata_fname.c_str());
}
if(fileExists(mdata_filepath) && !overwrite_mdata)
loadBinaryMetadata(mdata_filepath);
else
Expand Down Expand Up @@ -164,7 +170,16 @@ BlockVolume::BlockVolume(const char *xml_filepath, bool overwrite_mdata) throw (

//trying to unserialize an already existing metadata file, if it doesn't exist the full initialization procedure is performed and metadata is saved
char mdata_filepath[2000];
sprintf(mdata_filepath, "%s/%s", stacks_dir, vm::BINARY_METADATA_FILENAME.c_str());
pelem = hRoot.FirstChildElement("mdata_bin").Element();

if ( pelem == ((TiXmlElement *)0) ) { // no metadata file name present in xml file, use default folder and name
sprintf(mdata_filepath, "%s/%s", stacks_dir, vm::BINARY_METADATA_FILENAME.c_str());
}
else {
strcpy(mdata_filepath, pelem->Attribute("value"));
}

xml.Clear();

// 2014-09-20. Alessandro. @ADDED overwrite_mdata flag
if(fileExists(mdata_filepath) && !overwrite_mdata)
Expand Down
7 changes: 4 additions & 3 deletions src/volumemanager/vmBlockVolume.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
/******************
* CHANGELOG *
*******************
* 2018-03-02. Giulio. @ADDED the possibility to set a path and a name for the mdata.bin file
* 2017-06-26. Giulio. @ADDED methods to set active resolution and active timepoint
* 2017-04-12. Giulio. @ADDED method to release all buffers allocated in VirtualStack
* 2016-10-27. Giulio. @ADDED string fields for control over the subimage to be exposed through the xml import file
Expand Down Expand Up @@ -54,8 +55,8 @@ class vm::BlockVolume : public vm::VirtualVolume
// 2014-09-10. Alessandro. @ADDED plugin creation/registration functions to make 'StackedVolume' a volume format plugin.
static const std::string creator_id1, creator_id2;
static vm::VirtualVolume* createFromXML(const char* xml_path, bool ow_mdata) { return new BlockVolume(xml_path, ow_mdata); }
static vm::VirtualVolume* createFromData(const char* data_path, vm::ref_sys ref, float vxl1, float vxl2, float vxl3, bool ow_mdata) {
return new BlockVolume(data_path, ref, vxl1, vxl2, vxl3, ow_mdata);
static vm::VirtualVolume* createFromData(const char* data_path, vm::ref_sys ref, float vxl1, float vxl2, float vxl3, bool ow_mdata, std::string mdata_fname) {
return new BlockVolume(data_path, ref, vxl1, vxl2, vxl3, ow_mdata,mdata_fname);
}

vm::Block ***BLOCKS; //2-D array of <Block*>
Expand Down Expand Up @@ -96,7 +97,7 @@ class vm::BlockVolume : public vm::VirtualVolume

//CONSTRUCTORS-DECONSTRUCTOR
BlockVolume() : vm::VirtualVolume(){}
BlockVolume(const char* _stacks_dir, vm::ref_sys reference_system, float VXL_1=0, float VXL_2=0, float VXL_3=0, bool overwrite_mdata=false) throw (iom::exception);
BlockVolume(const char* _stacks_dir, vm::ref_sys reference_system, float VXL_1=0, float VXL_2=0, float VXL_3=0, bool overwrite_mdata=false, std::string mdata_fname="") throw (iom::exception);
BlockVolume(const char *xml_filepath, bool overwrite_mdata=false) throw (iom::exception);
~BlockVolume();

Expand Down
7 changes: 7 additions & 0 deletions src/volumemanager/vmMCVolume.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
/******************
* CHANGELOG *
*******************
* 2018-03-01. Giulio. @FIXED global variable 'vm::VOLUME_INPUT_FORMAT_PLUGIN' is set to vm::MCVolume::id in the constructor to signal that it is a non interleaved channel representation
* 2018-01-20. Giulio. @CREATED
*/

Expand Down Expand Up @@ -77,6 +78,9 @@ MCVolume::MCVolume(const char* _stacks_dir, vm::ref_sys _reference_system, float
_stacks_dir,reference_system.first, reference_system.second, reference_system.third, VXL_1, VXL_2, VXL_3);
#endif

// 2018-03-01. Giulio. @FIXED global variable 'vm::VOLUME_INPUT_FORMAT_PLUGIN' has to be set to vm::MCVolume::id to signal that it is a non interleaved channel representation
vm::VOLUME_INPUT_FORMAT_PLUGIN = vm::MCVolume::id;

checked = false;
aligned = false; // no guarantee that subvolumes are aligned

Expand Down Expand Up @@ -118,6 +122,9 @@ MCVolume::MCVolume(const char *xml_filepath, bool overwrite_mdata) throw (iom::e
#if VM_VERBOSE > 3
printf("\t\t\t\tin MCVolume::MCVolume(xml_filepath=%s)\n", xml_filepath);
#endif

// 2018-03-01. Giulio. @FIXED global variable 'vm::VOLUME_INPUT_FORMAT_PLUGIN' has to be set to vm::MCVolume::id to signal that it is a non interleaved channel representation
vm::VOLUME_INPUT_FORMAT_PLUGIN = vm::MCVolume::id;

checked = false;
aligned = false; // no guarantee that subvolumes are aligned
Expand Down
5 changes: 3 additions & 2 deletions src/volumemanager/vmMCVolume.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
/******************
* CHANGELOG *
*******************
* 2018-03-02. Giulio. @ADDED a parameter to set a path and a name for the mdata.bin file for compatibility, but it is not used
* 2018-01-20. Giulio. @CREATED
*/

Expand All @@ -47,8 +48,8 @@ class vm::MCVolume : public vm::VirtualVolume
static const std::string creator_id1, creator_id2;
static vm::VirtualVolume* createFromXML(const char* xml_path, bool ow_mdata = false) { return new MCVolume(xml_path, ow_mdata); }
// 2018-01-21. Giulio @ADDED default parameters to support creation from data (folder containing xml import files)
static vm::VirtualVolume* createFromData(const char* data_path, vm::ref_sys ref = vm::ref_sys(vm::axis(0),vm::axis(0),vm::axis(0)), float vxl1 = 0, float vxl2 = 0, float vxl3 = 0, bool ow_mdata = false) {
return new MCVolume(data_path, ref, vxl1, vxl2, vxl3, ow_mdata);
static vm::VirtualVolume* createFromData(const char* data_path, vm::ref_sys ref = vm::ref_sys(vm::axis(0),vm::axis(0),vm::axis(0)), float vxl1 = 0, float vxl2 = 0, float vxl3 = 0, bool ow_mdata = false, std::string mdata_fname = "") {
return new MCVolume(data_path, ref, vxl1, vxl2, vxl3, ow_mdata); // the mdata_fname parameter is not used for MCVolumes
}

vm::VirtualVolume **subvolumes;
Expand Down
30 changes: 22 additions & 8 deletions src/volumemanager/vmStackedVolume.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
/******************
* CHANGELOG *
*******************
* 2018-03-02. Giulio. @ADDED the possibility to set a path and a name for the mdata.bin file
* 2018-02-03. Giulio. @ADDED call to 'adjustDisplacements' in method reading the xml file to force all displacements of adjacent tile symmetric
* 2017-04-27. Giulio. @ADDED code to get and initialize the input plugin from the xml if specified
* 2017-04-12. Giulio. @ADDED method to release all buffers allocated in VirtualStack
Expand Down Expand Up @@ -91,7 +92,7 @@ const std::string StackedVolume::id = "TiledXY|2Dseries";
const std::string StackedVolume::creator_id1 = volumemanager::VirtualVolumeFactory::registerPluginCreatorXML(&createFromXML, StackedVolume::id);
const std::string StackedVolume::creator_id2 = volumemanager::VirtualVolumeFactory::registerPluginCreatorData(&createFromData, StackedVolume::id);

StackedVolume::StackedVolume(const char* _stacks_dir, vm::ref_sys _reference_system, float VXL_1, float VXL_2, float VXL_3, bool overwrite_mdata) throw (iom::exception)
StackedVolume::StackedVolume(const char* _stacks_dir, vm::ref_sys _reference_system, float VXL_1, float VXL_2, float VXL_3, bool overwrite_mdata, std::string mdata_fname) throw (iom::exception)
: VirtualVolume(_stacks_dir, _reference_system, VXL_1, VXL_2, VXL_3)
{
#if VM_VERBOSE > 3
Expand All @@ -100,8 +101,13 @@ StackedVolume::StackedVolume(const char* _stacks_dir, vm::ref_sys _reference_sys
#endif

//trying to unserialize an already existing metadata file, if it doesn't exist the full initialization procedure is performed and metadata is saved
char mdata_filepath[VM_STATIC_STRINGS_SIZE];
sprintf(mdata_filepath, "%s/%s", stacks_dir, vm::BINARY_METADATA_FILENAME.c_str());
char mdata_filepath[VM_STATIC_STRINGS_SIZE];
if ( mdata_fname == "" ) { // no metadata file name present in xml file, use default folder and name
sprintf(mdata_filepath, "%s/%s", stacks_dir, vm::BINARY_METADATA_FILENAME.c_str());
}
else {
strcpy(mdata_filepath,mdata_fname.c_str());
}
if(fileExists(mdata_filepath) && !overwrite_mdata)
loadBinaryMetadata(mdata_filepath);
else
Expand Down Expand Up @@ -155,13 +161,21 @@ StackedVolume::StackedVolume(const char *xml_filepath, bool overwrite_mdata) thr
TiXmlElement * pelem = hRoot.FirstChildElement("stacks_dir").Element();
this->stacks_dir = new char[strlen(pelem->Attribute("value"))+1];
strcpy(this->stacks_dir, pelem->Attribute("value"));
xml.Clear();

//trying to unserialize an already existing metadata file, if it doesn't exist the full initialization procedure is performed and metadata is saved
char mdata_filepath[2000];
sprintf(mdata_filepath, "%s/%s", stacks_dir, vm::BINARY_METADATA_FILENAME.c_str());
//trying to unserialize an already existing metadata file, if it doesn't exist the full initialization procedure is performed and metadata is saved
char mdata_filepath[VM_STATIC_STRINGS_SIZE];
pelem = hRoot.FirstChildElement("mdata_bin").Element();

if ( pelem == ((TiXmlElement *)0) ) { // no metadata file name present in xml file, use default folder and name
sprintf(mdata_filepath, "%s/%s", stacks_dir, vm::BINARY_METADATA_FILENAME.c_str());
}
else {
strcpy(mdata_filepath, pelem->Attribute("value"));
}

xml.Clear();

// 2014-09-20. Alessandro. @ADDED overwrite_mdata flag
// 2014-09-20. Alessandro. @ADDED overwrite_mdata flag
if(fileExists(mdata_filepath) && !overwrite_mdata)
{
// load mdata.bin content and xml content, also perform consistency check between mdata.bin and xml content
Expand Down
7 changes: 4 additions & 3 deletions src/volumemanager/vmStackedVolume.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
/******************
* CHANGELOG *
*******************
* 2018-03-02. Giulio. @ADDED the possibility to set a path and a name for the mdata.bin file
* 2017-04-12. Giulio. @ADDED method to release all buffers allocated in VirtualStack
* 2015-06-12. Giulio @ADDED 'check' method to check completeness and coherence of a volume
* 2015-02-26. Giulio. @ADDED initChannels private method to initialize fields DIM_C and BYTESxCHAN
Expand Down Expand Up @@ -58,8 +59,8 @@ class vm::StackedVolume : public vm::VirtualVolume
// 2014-09-10. Alessandro. @ADDED plugin creation/registration functions to make 'StackedVolume' a volume format plugin.
static const std::string creator_id1, creator_id2;
static vm::VirtualVolume* createFromXML(const char* xml_path, bool ow_mdata) { return new StackedVolume(xml_path, ow_mdata); }
static vm::VirtualVolume* createFromData(const char* data_path, vm::ref_sys ref, float vxl1, float vxl2, float vxl3, bool ow_mdata) {
return new StackedVolume(data_path, ref, vxl1, vxl2, vxl3, ow_mdata);
static vm::VirtualVolume* createFromData(const char* data_path, vm::ref_sys ref, float vxl1, float vxl2, float vxl3, bool ow_mdata, std::string mdata_fname) {
return new StackedVolume(data_path, ref, vxl1, vxl2, vxl3, ow_mdata, mdata_fname);
}


Expand Down Expand Up @@ -91,7 +92,7 @@ class vm::StackedVolume : public vm::VirtualVolume

//CONSTRUCTORS-DECONSTRUCTOR
StackedVolume() : vm::VirtualVolume(){}
StackedVolume(const char* _stacks_dir, vm::ref_sys reference_system, float VXL_1=0, float VXL_2=0, float VXL_3=0, bool overwrite_mdata=false) throw (iom::exception);
StackedVolume(const char* _stacks_dir, vm::ref_sys reference_system, float VXL_1=0, float VXL_2=0, float VXL_3=0, bool overwrite_mdata=false, std::string mdata_fname="") throw (iom::exception);
StackedVolume(const char *xml_filepath, bool overwrite_mdata=false) throw (iom::exception);
~StackedVolume();

Expand Down
2 changes: 2 additions & 0 deletions src/volumemanager/vmVirtualStack.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
/******************
* CHANGELOG *
*******************
* 2018-03-03. Giulio. @ADDED method 'releaseImageSteckOwnership' to manage cases when the ownership of the internal buffer must be given to other modules
* 2017-07-06. Giulio. @ADDED method 'loadImageStack2' to enable selective reads of data
* 2015-02-28. Giulio. @ADDED fields N_CHANS and BYTESxCHAN
* 2015-01-17. Alessandro. @ADDED support for all-in-one-folder data (import from xml only).
Expand Down Expand Up @@ -179,6 +180,7 @@ class vm::VirtualStack
virtual iom::real_t* loadImageStack(int first_file=-1, int last_file=-1) throw (iom::exception) = 0;
virtual iom::real_t* loadImageStack2(int first_file=-1, int last_file=-1, int V0=-1, int V1=-1, int H0=-1, int H1=-1) throw (iom::exception) = 0;
virtual void releaseImageStack()= 0;
void releaseImageStackOwnership() { STACKED_IMAGE = 0; }

// return true if the given range [z0,z1] does not contain missing slices/blocks
virtual bool isComplete(int z0, int z1);
Expand Down
Loading

0 comments on commit b83b05e

Please sign in to comment.