]> Programmer Notes

Developer Notes

The following are a collection of notes intended for developers and those writing their own applications based on the PMI Toolbox. The intent is to explain the structure and some of the implementation decisions of the toolbox. This is not meant to be exhaustive; when in doubt, check the source code.

Toolbox API

The PMI toolbox is built around the idea of having many small functions, each of which does one relatively simple task. Each function should accept as broad a range of inputs as possible and should exit with a meaningful error message if it is unable to complete its given task. Unless absolutely necessary, all functions should be able to accept as inputs arbitrary numbers and orderings of wavelengths and (where relevant) modulation frequencies, delay times, and gate widths. By keeping the functions small and focused, we improve code re-use and make the functions easier to debug. This also helps keep the number of function arguments to a minimum.

Out of these small functions, larger and still more general functions are built. For example, genBornMat(), the normal user routine for calculating the forward problem, does little more than look at the imaging geometry and the measurement and decide which low-level forward solver is most appropriate for the arguments passed. User applications (for example, HOMER) are, in turn, built on top of these high-level routines.

Calling Conventions

All the functions in the toolbox (well, almost all the functions) use a standard calling procedure; the order of the first three arguments is "SD, Medium, MeasList." It should always be possible to pass an empty list instead of a measurement list, in which case the full measurement list contained in the SD argument will be used instead. Many functions also support a final optional Debug argument (which is not always documented). This argument, if non-zero, prints extra debugging information to the users screen.

For some functions, not all of the three standard arguments are relevant (for example, plotData() doesn't need a Medium structure to display the data correctly). In these cases it is permissible to leave out the useless structure (hence the arguments to plotData() are SD, MeasList, data, etc.).

Directory Structure

Within the root directory of the PMI toolbox are a number of subdirectories. Functions are placed in different subdirectories based on what the function does (e.g., all the visualization functions can all be found in the Visualize directory). There are also directories for local extensions to the toolbox (Local) and for experimental and development code (Development) that is too unstable to keep in the regular Local directory.

The name and purpose of each top-level directory is:

Data Functions for importing, exporting, and processing experimental data.
Doc Toolbox documentation files
Forward Functions for solving the forward problem.
Noise Functions for adding noise to simulated data
Recon Functions for inverting the forward matrix and reconstructing images.
Util Generic, but useful, utility functions
Visualize Data and volume visualization functions
Local Functions developed locally and not general enough to include in the toolbox.
Development Unstable or experimental functions, will be moved to Local after they stabilize.

Directory structure within the Forward directory

Within the Forward directory there are a number of subdirectories. These subdirectories are:

Born Functions that solve the forward problem in the Born approximation(s) and related functions
Born/FrequencyDomain Frequency-domain imaging functions
Born/TimeDomain Time-domain imaging functions
Born/Correlation Correlation imaging functions (not implemented)
Born/Fluorescence Fluorescence imaging functions (not implemented)
Sphere Functions that solve analytical sphere perturbations
tMCimg Functions to interface with the "tMCimg" Monte Carlo modeler
tFDimg Functions to interface with the "tFDimg" finite difference modeler
TOAST Function to interface with the "TOAST" FEM forward modeling package (not implemented)
*/MEX Hold compiled (MEX) versions of the routines in the parent directory.

Additional Functions

There are a number of low-level routines in the toolbox that, while not things most users will want to call, may be of use to developers. These routines are:

calcExtBnd
Calculate extrapolated boundary length
repackSDAmp
Repack vector coming out of SD Jacobian into the order used by SD.SrcAmp and SD.DetAmp
getImageCharge
Given source Z and extrapolated boundary, calculate the location of the next image charge
moveSrcSlab
Move sources one scattering length into the medium
rowscale
Rescale the rows of a matrix
DPDWBorn1NB, DPDWBorn1SB, DPDWBorn1ZB
Low-level frequency-domain routines to calculate fluence
Hlm2ptNB, Hlm2ptSB, Hlm2ptZB
More low-level frequency-domain routines to calculate fluence
Hlm3ptBorn1NB, Hlm3ptBorn1SB, Hlm3ptBorn1ZB
Low-level frequency-domain routines to calculate Born forward matrix
repackBornFwdMat
Repack matrix from dense matrix (flat storage as returned by the low-level routines) into a sparse block-packed matrix useful for imaging
HlmFullBornNB, HlmFullBornSB, HlmFullBornZB
Low-level FullBorn forward problem solution
MLtoFB
Calculate parameters needed to pack a FullBorn matrix based on the measurement list.
FD_GF, FD_GradGF
Frequency-domain Green's function and its gradient
TD_2ptNB, TD_2ptSB, TD_2ptZB
Low-level time-domain routines to calculate the fluence (matlab)
TD_3ptBorn1NB, TD_3ptBorn1SB, TD_3ptBorn1ZB
Low-level time-domain routines to calculate the Born forward matrix (matlab)
TD_GF, TD_GradGF
Time-domain Green's function and its gradient
mextd2ptNB, mextd2ptSB, mextd2ptZB
Low-level time-domain routines to calculate the time-domain fluence (compiled)
mextd3ptNB, mextd3ptSB, mextd3ptZB
Low-level time-domain routines to calculate the Born forward matrix (compiled)
mexzbnd
Calculate extrapolated boundary length (compiled)
SphHarm, bes_h1, bes_h1d, bes_j, bes_jd, bes_y
Spherical harmonics and spherical bessel functions, used in the analytical solution of spherical perturbations
genSphere, genBlock
Turn a single Medium.Object structure at a single wavelength into a scattered fluence.
Pert_Grad, calcDelMuA, calcDelMuSp
Calculate scattered fluence at multiple wavelengths given list of Object structures.
plotDimensions
Generate aesthetically distributed subplots.
Type "help funcname" from inside Matlab or see the source code for function documentation.