Isis 3 Programmer Reference
CubeIoHandler.h
Go to the documentation of this file.
1 
24 #ifndef CubeIoHandler_h
25 #define CubeIoHandler_h
26 
27 #include <QRunnable>
28 #include <QThreadPool>
29 
30 #include "Constants.h"
31 #include "Endian.h"
32 #include "PixelType.h"
33 
34 class QFile;
35 class QMutex;
36 class QTime;
37 template <typename A> class QList;
38 template <typename A, typename B> class QMap;
39 template <typename A, typename B> struct QPair;
40 
41 namespace Isis {
42  class Buffer;
43  class CubeCachingAlgorithm;
44  class EndianSwapper;
45  class Pvl;
46  class RawCubeChunk;
47 
126  public:
127  CubeIoHandler(QFile * dataFile, const QList<int> *virtualBandList,
128  const Pvl &label, bool alreadyOnDisk);
129  virtual ~CubeIoHandler();
130 
131  void read(Buffer &bufferToFill) const;
132  void write(const Buffer &bufferToWrite);
133 
134  void addCachingAlgorithm(CubeCachingAlgorithm *algorithm);
135  void clearCache(bool blockForWriteCache = true) const;
136  BigInt getDataSize() const;
137  void setVirtualBands(const QList<int> *virtualBandList);
143  virtual void updateLabels(Pvl &labels) = 0;
144 
145  QMutex *dataFileMutex();
146 
147  protected:
148  int bandCount() const;
149  int getBandCountInChunk() const;
150  BigInt getBytesPerChunk() const;
151  int getChunkCountInBandDimension() const;
152  int getChunkCountInLineDimension() const;
153  int getChunkCountInSampleDimension() const;
154  int getChunkIndex(const RawCubeChunk &) const;
155  BigInt getDataStartByte() const;
156  QFile * getDataFile();
157  int lineCount() const;
158  int getLineCountInChunk() const;
159  PixelType pixelType() const;
160  int sampleCount() const;
161  int getSampleCountInChunk() const;
162 
163  void setChunkSizes(int numSamples, int numLines, int numBands);
164 
173  virtual void readRaw(RawCubeChunk &chunkToFill) = 0;
174 
182  virtual void writeRaw(const RawCubeChunk &chunkToWrite) = 0;
183 
184  private:
202  public:
204  QList<Buffer *> buffersToWrite);
206 
207  void run();
208 
209  private:
221 
222  private:
228  QTime *m_timer;
229  };
230 
231 
237  CubeIoHandler(const CubeIoHandler &other);
238 
246  CubeIoHandler &operator=(const CubeIoHandler &other);
247 
248  void blockUntilThreadPoolEmpty() const;
249 
250  static bool bufferLessThan(Buffer * const &lhs, Buffer * const &rhs);
251 
252  QPair< QList<RawCubeChunk *>, QList<int> > findCubeChunks(int startSample, int numSamples,
253  int startLine, int numLines,
254  int startBand, int numBands) const;
255 
256  void findIntersection(const RawCubeChunk &cube1,
257  const Buffer &cube2, int &startX, int &startY, int &startZ,
258  int &endX, int &endY, int &endZ) const;
259 
260  void flushWriteCache(bool force = false) const;
261 
262  void freeChunk(RawCubeChunk *chunkToFree) const;
263 
264  RawCubeChunk *getChunk(int chunkIndex, bool allocateIfNecessary) const;
265 
266  int getChunkCount() const;
267 
268  void getChunkPlacement(int chunkIndex,
269  int &startSample, int &startLine, int &startBand,
270  int &endSample, int &endLine, int &endBand) const;
271 
272  RawCubeChunk *getNullChunk(int chunkIndex) const;
273 
274  void minimizeCache(const QList<RawCubeChunk *> &justUsed,
275  const Buffer &justRequested) const;
276 
277  void synchronousWrite(const Buffer &bufferToWrite);
278 
279  void writeIntoDouble(const RawCubeChunk &chunk, Buffer &output, int startIndex) const;
280 
281  void writeIntoRaw(const Buffer &buffer, RawCubeChunk &output, int index) const;
282 
283  void writeNullDataToDisk() const;
284 
285  private:
287  QFile * m_dataFile;
288 
295 
298 
300  double m_base;
301 
303  double m_multiplier;
304 
307 
310 
313 
316 
319 
322 
325 
328 
331 
334 
337 
340 
346 
348  mutable QByteArray *m_nullChunkData;
349 
352 
358  mutable QThreadPool *m_ioThreadPool;
359 
370 
373 
375  mutable volatile int m_idealFlushSize;
376 
379  };
380 }
381 
382 #endif
Buffer for reading and writing cube data.
Definition: Buffer.h:69
long long int BigInt
Big int.
Definition: Constants.h:65
BufferToChunkWriter & operator=(const BufferToChunkWriter &rhs)
This is disabled.
void clearCache(bool blockForWriteCache=true) const
Free all cube chunks (cached cube data) from memory and write them to disk.
int getChunkIndex(const RawCubeChunk &) const
Given a chunk, what&#39;s its index in the file.
ByteOrder m_byteOrder
The byte order (endianness) of the data on disk.
void writeNullDataToDisk() const
Write all NULL cube chunks that have not yet been accessed to disk.
void getChunkPlacement(int chunkIndex, int &startSample, int &startLine, int &startBand, int &endSample, int &endLine, int &endBand) const
Get the X/Y/Z (Sample,Line,Band) range of the chunk at the given index.
void write(const Buffer &bufferToWrite)
Write buffer data into the cube data on disk.
int m_linesInChunk
The number of lines in a cube chunk.
int getChunkCountInLineDimension() const
void addCachingAlgorithm(CubeCachingAlgorithm *algorithm)
This will add the given caching algorithm to the list of attempted caching algorithms.
RawCubeChunk * getNullChunk(int chunkIndex) const
This creates a chunk filled with NULLs whose placement is at chunkIndex&#39;s position.
void setChunkSizes(int numSamples, int numLines, int numBands)
This should be called once from the child constructor.
CubeIoHandler & operator=(const CubeIoHandler &other)
Disallow assignments of this object.
QList< Buffer *> * m_buffersToWrite
The buffers that need pushed into the IO handler; we own these.
bool m_lastOperationWasWrite
If the last operation was a write then we need to flush the cache when reading.
int getSampleCountInChunk() const
virtual void readRaw(RawCubeChunk &chunkToFill)=0
This needs to populate the chunkToFill with unswapped raw bytes from the disk.
int getBandCountInChunk() const
QMap< int, RawCubeChunk * > * m_rawData
The map from chunk index to chunk for cached data.
QPair< QList< RawCubeChunk * >, QList< int > > findCubeChunks(int startSample, int numSamples, int startLine, int numLines, int startBand, int numBands) const
Get the cube chunks that correspond to the given cube area.
QMutex * dataFileMutex()
Get the mutex that this IO handler is using around I/Os on the given data file.
QPair< QMutex *, QList< Buffer * > > * m_writeCache
These are the buffers we need to write to raw cube chunks.
void freeChunk(RawCubeChunk *chunkToFree) const
If the chunk is dirty, then we write it to disk.
virtual void writeRaw(const RawCubeChunk &chunkToWrite)=0
This needs to write the chunkToWrite directly to disk with no modifications to the data itself...
volatile int m_idealFlushSize
Ideal write cache flush size.
ByteOrder
Tests the current architecture for byte order.
Definition: Endian.h:59
void writeIntoRaw(const Buffer &buffer, RawCubeChunk &output, int index) const
Write the intersecting area of the buffer into the chunk.
int m_numSamples
The number of samples in the cube.
BigInt getDataStartByte() const
void run()
This is the asynchronous computation.
int m_bandsInChunk
The number of physical bands in a cube chunk.
RawCubeChunk * getChunk(int chunkIndex, bool allocateIfNecessary) const
Retrieve the cached chunk at the given chunk index, if there is one.
int m_numBands
The number of physical bands in the cube.
QList< int > * m_virtualBands
Converts from virtual band to physical band.
virtual ~CubeIoHandler()
Cleans up all allocated memory.
PixelType
Enumerations for Isis Pixel Types.
Definition: PixelType.h:43
Handles converting buffers to and from disk.
CubeIoHandler(QFile *dataFile, const QList< int > *virtualBandList, const Pvl &label, bool alreadyOnDisk)
Creates a new CubeIoHandler using a RegionalCachingAlgorithm.
QMap< int, bool > * m_dataIsOnDiskMap
The map from chunk index to on-disk status, all true if not allocated.
PixelType m_pixelType
The format of each DN in the cube.
int m_numLines
The number of lines in the cube.
CubeIoHandler * m_ioHandler
The IO Handler instance to put the buffers into.
QMutex * m_writeThreadMutex
This enables us to block while the write thread is working.
int getChunkCountInBandDimension() const
bool m_useOptimizedCubeWrite
This is true if the Isis preference for the cube write thread is optimized.
virtual void updateLabels(Pvl &labels)=0
Function to update the labels with a Pvl object.
QByteArray * m_nullChunkData
A raw cube chunk&#39;s data when it was all NULL&#39;s. Used for speed.
BigInt getDataSize() const
static bool bufferLessThan(Buffer *const &lhs, Buffer *const &rhs)
This is used for sorting buffers into the most efficient write order.
void minimizeCache(const QList< RawCubeChunk *> &justUsed, const Buffer &justRequested) const
Apply the caching algorithms and get rid of excess cube data in memory.
A section of raw data on the disk.
Definition: RawCubeChunk.h:42
Byte swapper.
Definition: EndianSwapper.h:55
void flushWriteCache(bool force=false) const
This attempts to write the so-far-unwritten buffers from m_writeCache into the cube&#39;s RawCubeChunk ca...
BigInt getBytesPerChunk() const
void setVirtualBands(const QList< int > *virtualBandList)
This changes the virtual band list.
Container for cube-like labels.
Definition: Pvl.h:135
double m_base
The additive offset of the data on disk.
BufferToChunkWriter(CubeIoHandler *ioHandler, QList< Buffer *> buffersToWrite)
Create a BufferToChunkWriter which is designed to asynchronously move the given buffers into the cube...
BigInt m_startByte
The start byte of the cube data.
int getChunkCountInSampleDimension() const
EndianSwapper * m_byteSwapper
A helper that swaps byte order to and from file order.
double m_multiplier
The multiplicative factor of the data on disk.
QThreadPool * m_ioThreadPool
This contains threads for doing cube writes (and later maybe cube reads).
Namespace for ISIS/Bullet specific routines.
Definition: Apollo.h:31
int m_samplesInChunk
The number of samples in a cube chunk.
void blockUntilThreadPoolEmpty() const
This blocks (doesn&#39;t return) until the number of active runnables in the thread pool goes to 0...
void findIntersection(const RawCubeChunk &cube1, const Buffer &cube2, int &startX, int &startY, int &startZ, int &endX, int &endY, int &endZ) const
Find the intersection between the buffer area and the cube chunk.
QFile * m_dataFile
The file containing cube data.
~BufferToChunkWriter()
We&#39;re done writing our buffers into the cube, clean up.
void writeIntoDouble(const RawCubeChunk &chunk, Buffer &output, int startIndex) const
Write the intersecting area of the chunk into the buffer.
void read(Buffer &bufferToFill) const
Read cube data from disk into the buffer.
This class is designed to handle write() asynchronously.
void synchronousWrite(const Buffer &bufferToWrite)
This method takes the given buffer and synchronously puts it into the Cube&#39;s cache.
int m_consecutiveOverflowCount
How many times the write cache has overflown in a row.
int getLineCountInChunk() const
This is the parent of the caching algorithms
QList< RawCubeChunk * > * m_lastProcessByLineChunks
This is an optimization for process by line.
QTime * m_timer
Used to calculate the lifetime of an instance of this class.
PixelType pixelType() const
QList< CubeCachingAlgorithm * > * m_cachingAlgorithms
The caching algorithms to use, in order of priority.