In addition, you can increase the dimensionality and join lattices [10,20] and [10,20] to [10,20,2]. This is done by specifying the concatenation axis to be higher than currently exists in the input lattices
The LatticeConcat object does not copy the input lattices, it
just references them. You can use the Lattice
If you use the putSlice function, be aware that it will change the
underlying lattices if they are writable.
Default constructor. Sets the concatenation axis to 0
and tempClose is True
Copy constructor (reference semantics)
Destructor
Assignment operator (reference semantics)
Sets a new lattice into the list to be concatenated.
Exception thrown if lattices are incompatible
Return the number of lattices set so far
Returns the current concatenation axis (0 relative)
Returns the tempClose constructor state
Returns the number of dimensions of the *input* lattices (may be different
by one from output lattice). Returns 0 if none yet set.
Return pointer for specified lattice. Do not delete this.
Handle the (un)locking and syncing, etc..
Close/reopen a specific lattice. It is your responsibility to leave the
LatticeConcat object in a fully closed state. So always pair
a reopen with a tempClose.
Name. Since many lattices may go into the concatenation, the name
is rather meaningless. Returns the string "Concatenation :"
Make a copy of the derived object (reference semantics).
Has the object really a mask?
Get the region used (always returns 0).
If all of the underlying lattices are writable returns True
Does the lattice have a pixelmask?
Get access to the pixelmask.
An exception is thrown if the lattice does not have a pixelmask
Find the shape that the concatenated lattice will be.
Returns a null IPosition if function setLattice has not yet
been called
Return the best cursor shape. This isn't very meaningful for a LatticeConcat
Lattice since it isn't on disk ! But if you do copy it out, this is
what you should use. The maxPixels aregument is ignored.
Do the actual get of the data.
The return value is always False, thus the buffer does not reference
another array. Generally the user should use function getSlice
Do the actual get of the mask data.
The return value is always False, thus the buffer does not reference
another array. Generally the user should use function getMaskSlice
Do the actual put of the data into the Lattice. This will change the underlying
lattices (if they are writable) that were used to create the
LatticeConcat object. It throws an exception if not writable.
Generally the user should use function putSlice
Example
// Make ArrayLattices
ArrayLattice<Float> al1(a1); al1.set(1.0);
ArrayLattice<Float> al2(a2); al2.set(10.0);
// Turn these into MaskedLattices
SubLattice<Float> ml1(al1, True);
SubLattice<Float> ml2(al2, True);
// Concatenate along axis 1
LatticeConcat<Float> lc (1);
lc.setLattice(ml1);
lc.setLattice(ml2);
// Make output
ArrayLattice<Float> al3(lc.shape());
SubLattice<Float> ml3(al3, True);
// Copy data to output (mask has to be copied separately)
ml3.copyData(lc);
In this example no masks are involved. See tLatticeConcat
for more examples.
Motivation
Image concatentation is a useful enduser requirement. An object of
this class is contained by an ImageConcat object.
To Do
Member Description
LatticeConcat (uInt axis, Bool tempClose=True)
Constructor. Argument axis specifies the concatenation
axis (0 relative). If this is one more than the number of axes
in the input lattices (set with function setLattice)
then the resultant concatenated lattice has dimension
one greater than that the input lattices.
Argument tempClose specifies whether you wish
all internal lattice copies to be
opened/closed on demand, rather than just being left open.
This prevents open file limits being reached
LatticeConcat ()
LatticeConcat(const LatticeConcat<T> &other)
virtual ~LatticeConcat ()
LatticeConcat<T> &operator=(const LatticeConcat<T> &other)
void setLattice (MaskedLattice<T>& lattice)
uInt nlattices() const
uInt axis () const
Bool isTempClose () const
uInt latticeDim() const
MaskedLattice<T>* lattice(uInt i) const
virtual Bool lock (FileLocker::LockType, uInt nattempts)
virtual void unlock()
virtual Bool hasLock (FileLocker::LockType) const
virtual void resync()
virtual void flush()
virtual void tempClose()
virtual void reopen()
void tempClose(uInt which)
void reopen(uInt which)
virtual String name (Bool stripPath=False) const
virtual LatticeConcat<T>* cloneML() const
virtual Bool isMasked() const
virtual const LatticeRegion* getRegionPtr() const
virtual Bool isWritable() const
virtual Bool hasPixelMask() const
virtual const Lattice<Bool>& pixelMask() const
virtual Lattice<Bool>& pixelMask()
virtual IPosition shape () const
virtual IPosition doNiceCursorShape (uInt maxPixels) const
virtual Bool doGetSlice (Array<T>& buffer, const Slicer& section)
virtual Bool doGetMaskSlice (Array<Bool>& buffer, const Slicer& section)
virtual void doPutSlice (const Array<T>& sourceBuffer, const IPosition& where, const IPosition& stride)
void checkAxis(uInt axis, uInt ndim) const
void setup1 (IPosition& blc, IPosition& trc, IPosition& stride, IPosition& blc2, IPosition& trc2, IPosition& blc3, IPosition& trc3, IPosition& stride3, const Slicer& section)
Slicer setup2 (Bool& first, IPosition& blc2, IPosition& trc2, Int shape2, Int axis, const IPosition& blc, const IPosition& trc, const IPosition& stride, Int start)
Bool getSlice1 (Array<T>& buffer, const Slicer& section, uInt nLattices)
Bool getSlice2 (Array<T>& buffer, const Slicer& section, uInt nLattices)
Bool putSlice1 (const Array<T>& buffer, const IPosition& where, const IPosition& stride, uInt nLattices)
Bool putSlice2 (const Array<T>& buffer, const IPosition& where, const IPosition& stride, uInt nLattices)
Bool getMaskSlice1 (Array<Bool>& buffer, const Slicer& section, uInt nLattices)
Bool getMaskSlice2 (Array<Bool>& buffer, const Slicer& section, uInt nLattices)