next up previous [pdf]

Next: Future Work Up: Functionality Previous: Functionality

Classes

The application, qthead is written in C++ using the QT[*] toolkit. The most basic building block for the application is the headers class. The headers is the basic storage mechanism for the headers. It has the ability to return an array of floats, doubles, or integers for all the headers currently stored in memory. The io class is the interface to read and write header values to disk. Currently only the ability to read/write SEP3D volumes is implemented but expansion to support SEG-Y, SU, etc. would require minimal effort. The my_data replicates most of the functionality of Headermath and Window_key such as creating keys, rotating, and windowing. It is the basic interface to the headers for all of the other components.

The fact that the entire header volume can not be assumed to fit into main memory resulted into several design decisions. Reading in a random subset of the data to interactively manipulate is an effective visualization strategy but is not sufficient to create an output volume to use for further processing. The need to rerun all of the commands on the entire dataset led to the creation of the action generic class. This class includes virtual functions (that result in calls to the my_data class) to perform desired actions.

The history class operates as the control unit for qthead. It keeps track of all the actions that user has performed. It has the ability to run a series of actions on a given my_data object which is useful both for when the user wants to remove a processing step and when the final output volume needs to be created. This ability to run a series of processing steps on an arbitrary header volume allows the history class to replace the functionality of Sort3d, Stack3d, and Infill3d. It can loop through a given dataset, reading manageable subsets and performing a series of actions before writing out the final dataset.

The most sophisticated class is the io_thread class. This class, a separate thread created when the application is started, is responsible for reading in random subsets of the headers. It starts by reading random subsets of the headers in chunks of several MB. After each chunk is read it applies all of the current actions using the functionality of the history class. Once all of the allotted header memory is used it stays dormant until one of two conditions is met. If the user requests that an action is undone. This results in the current data volume is abandoned, random subsections are reread, and the remaining processing steps run on it. The second reason for the thread to be awoken is when a windowing option is performed. After a windowing operation the thread will read in more of the headers, applying all of the current actions, until either the entire volume has been read or the maximum allotted space is again reached. Disk I/O can be a significant bottleneck, particularly given the random read approach used by qthead. To get around this problem we use Ecoram (Clapp, 2009), a type of solid state memory with a read rate of around 2GB/s, which seems sufficient for this application.


next up previous [pdf]

Next: Future Work Up: Functionality Previous: Functionality

2012-10-29