public class VesselSegm extends ImageReviewer implements ij.plugin.PlugIn
Modifier and Type | Field and Description |
---|---|
protected int |
adjustedDiff |
protected int |
adjustedMin |
protected boolean[][][] |
airwayMask |
protected boolean |
autoRun |
protected float |
badAngleThresh |
protected int |
bigVesselBrightness |
protected Rectangle3D |
bodyRect |
protected float |
branchRadRatioThresh |
protected float |
closingOpSize |
protected boolean[][][] |
connTissueMask |
protected boolean |
didBodyCrop |
protected boolean |
didVesselCrop |
protected ArrayDisplay |
distAd |
protected boolean |
havePulmTrunkMask |
protected int |
imagemax |
protected int |
imagemin |
protected boolean[][][] |
leftAtriumMask |
protected int |
leftAtriumSeedx |
protected int |
leftAtriumSeedy |
protected int |
leftAtriumSeedz |
protected int[][] |
loopLocs |
protected boolean |
masksWereSaved |
int |
maxDiff |
int |
maxVoxelCount |
protected boolean[][][] |
mediastinumMask |
int |
minthresh |
protected java.lang.String |
name_ext |
protected int |
nLoopPts |
protected int |
nOrphanedBranches |
protected int[][][] |
orphanedBranches |
protected java.lang.String |
outputdir |
protected float |
parRadRatioThresh |
protected boolean[][][] |
pulmTrunkMask |
protected int |
seedVoxelValue |
protected int |
seedx |
protected int |
seedy |
protected int |
seedz |
protected boolean |
showDistAd |
protected ArrayDisplay |
skelAd |
protected java.lang.String |
slash |
protected boolean |
terminateOnSegmClose |
protected ArrayDisplay |
threshAd |
protected int |
trunkMaxThresh |
protected int |
trunkMinThresh |
protected int |
trunkSeedx |
protected int |
trunkSeedy |
protected int |
trunkSeedz |
protected Point3Dint |
trunkSkelStartPt |
protected boolean |
useDistanceTransform |
protected Rectangle3D |
vesselRect |
working_canvas
Constructor and Description |
---|
VesselSegm() |
Modifier and Type | Method and Description |
---|---|
void |
AddLoopLocIfUnique(int xto,
int yto,
int zto,
int loopedFromBr,
int loopedFromTree)
xto, yto, zto is first point on looped-to branch
|
void |
addOrphanedBranchLastPt(int trat,
int brat) |
void |
addOrphanedBranchPt(int trat,
int brat) |
void |
adjustBranchRadii()
set Branch average radii, correcting for skeleton points that intersect parent/child vessel.
|
boolean |
areBranchesPaired(int tree1,
int br1,
boolean isfront1,
int tree2,
int br2,
boolean isfront2)
goal to test whether these 2 branches have similar trajectories and radii to indicate that they
are really the same branch that has been interrupted by a crossing branch.
|
boolean |
areBranchesPaired(VesselBranch branch1,
boolean isfront1,
VesselBranch branch2,
boolean isfront2) |
boolean |
areRadiiMatched(int tree1,
int br1,
int tree2,
int br2) |
boolean |
areRadiiMatched(VesselBranch branch1,
VesselBranch branch2) |
int[] |
backTraceToMostOffendingBranch(int loopLocIndex) |
int[] |
backTraceToMostOffendingBranch(int treeAt,
int connBrIndex) |
void |
checkRemoveHyperskelPair(Point3Dint checkLoc) |
void |
create3BrTestTree() |
void |
create3DcrossingTestTree() |
short[][][] |
createCrossingCylSimImage() |
byte[][][] |
createCylinderTestSimImage() |
boolean |
createHyperSkelPair(int treeFrom,
int brFrom,
boolean onfront1,
int treeTo,
int brTo,
boolean onfront2) |
void |
createHyperSkelPair(int treeFrom,
int brFrom,
Point3Dint pt1,
Point3Dint pt2) |
protected void |
cropToRect(Rectangle3D curRect) |
void |
customButFunc() |
void |
DeleteLoopLoc(int llAt)
llAt is index to current loopLoc array
|
void |
deleteOrphanedBranchPt(int del) |
void |
deleteTopOrphanedBranchPt() |
void |
deleteTree(int treeAt) |
void |
Draw() |
void |
Draw(ArrayDisplay adat) |
void |
Draw(ArrayDisplay adat,
boolean drawAsRadius) |
void |
Draw(boolean drawAsRadius) |
void |
extendBranchEnds()
attempt to fix error of skeletonization routine that cuts each branch short at the ends
Requires characterized branch tree and object mask. |
protected Point3Dint |
findClosestSkeletonPt(int seedx,
int seedy,
int seedz) |
protected Point3Dint |
findClosestSkeletonPt(Point3Dint seedpt)
start by searching near seed point for best distance value
|
Point3Dint |
findSkeletonTop(int locx,
int locy,
int locz,
int levelAt) |
Point3Dint |
findSkeletonTop(Point3Dint ptat,
int levelAt)
3/22/2013 after plugging all of the false connections between trees with calls to splitTreeAtConnection()
we want to generate updated masks for each tree to enable colored display in MIPsColor.
|
Point3Dint |
findSkeletonTopTry(int locx,
int locy,
int locz,
int levelAt)
WO 7/17/2012 this is working correctly for 2D test image, but fails usually
for human 3D pulmonary tree and for the colon.
|
Point3Dint |
findSkeletonTopTry(int locx,
int locy,
int locz,
int levelAt,
boolean onLastPath,
boolean findBiggestAngle) |
Point3Dint |
findSkeletonTopTry(Point3Dint ptat,
int levelAt) |
Point3Dint |
findSkeletonTopTry(Point3Dint ptat,
int levelAt,
boolean onLastPath,
boolean findBiggestAngle) |
int |
forwardTraceToLargestBranch(int curTree,
int connBrIndex) |
int |
forwardTraceToLargeTerminusBranch(int curTree,
int connBrIndex) |
int |
forwardTraceToTreeTop(int curTree,
int connBrIndex) |
int |
get2ndHyperSkelPairIndex(int x,
int y,
int z,
int knownPt) |
int |
get2ndHyperSkelPairIndex(Point3Dint checkLoc,
int knownPt) |
float[] |
getChild1FrontVec(int treeAt,
int brAt) |
int |
getChild1Index(int treeAt,
int brAt) |
float[] |
getChild2FrontVec(int treeAt,
int brAt) |
int |
getChild2Index(int treeAt,
int brAt) |
float |
getChildrenBifurAngle(int treeAt,
int brAt) |
int |
getFalse2DConnectionScore(int conntrindex,
int connbrindex) |
int |
getFalseLadderConnectionScore(int conntrindex,
int connbrindex) |
int |
getHyperSkelPairIndex(int x,
int y,
int z) |
int |
getHyperSkelPairIndex(Point3Dint checkLoc) |
Point3Dint |
getHyperskelPairPt(int locx,
int locy,
int locz) |
Point3Dint |
getHyperskelPairPt(Point3Dint checkLoc) |
Point3Dint |
getHyperskelPairPt(Point3Dint checkLoc,
int pairAt) |
float |
getLargestChildRadius(int tree1,
int br1) |
float |
getLargestParentSiblingRadius(int tree1,
int br1) |
float[][] |
getLengthHistogram(int nBins) |
int |
getLoopedLocIndexForFromBr(int treeAt,
int brAt)
uses int[][] loopLocs[nLoopPts][4] = [looped-to br, looped-to tree, looped-from br, looped-from tree].
|
int |
getLoopedLocIndexForToBr(int treeAt,
int brAt)
uses int[][] loopLocs[nLoopPts][4] = [looped-to br, looped-to tree, looped-from br, looped-from tree].
|
int |
getOrphanedBranchOfTopPt(int[] testPt) |
float |
getPairNCCC(int tree1index,
int br1index,
int tree2index,
int br2index) |
float |
getPairTrimmedNCCC(int tree1index,
int br1index,
int tree2index,
int br2index) |
float[][] |
getRadiusHistogram(int nBins) |
float |
getSepAngle(int tree1,
int br1,
boolean isfront1,
int tree2,
int br2,
boolean isfront2)
goal to compute the trajectory angle in degrees between the two branch ends, skipping the first few points
because their trajectory can be altered by the presence of the bifurcation or crossing.
|
float |
getSepAngle(VesselBranch branch1,
boolean isfront1,
VesselBranch branch2,
boolean isfront2) |
float |
getSiblingBifurAngle(int treeAt,
int brAt) |
float[] |
getSiblingFrontVec(int treeAt,
int brAt) |
byte[][][] |
getSimImage() |
byte[][][] |
getSimImage(int maxTreeNumber) |
int |
getTopLocIndex(Point3Dint testPt) |
Point4Dint[] |
getTreeBranchLabels() |
float[] |
getTrimmedBranchEndVec(int treeAt,
int brAt) |
float[] |
getTrimmedBranchFrontVec(int treeAt,
int brAt) |
float |
getTrimmedBranchLength(int treeAt,
int brAt) |
float |
getTrimmedBranchRadius(int treeAt,
int brAt) |
float |
getTrimmedBranchRadius(int treeAt,
int brAt,
float searchRadFront,
float searchRadEnd) |
void |
handleFailedBranchRepair(int fromtree,
int curbrindex)
if got here then could not find any matches.
|
boolean |
hasMultipleLoopPairings(int treeAt,
int brAt) |
boolean |
initialTraceAlongBranch(int treeID,
int locx,
int locy,
int locz,
int branchIndex)
This traverses a tree (treeID) starting from skeletal/branch point loc x,y,z on branch (branchIndex).
|
boolean |
isAhyperSkelPt(int x,
int y,
int z) |
boolean |
isAhyperSkelPt(Point3Dint checkLoc) |
boolean |
isALoopedFromLoc(int testTree,
int testBr) |
boolean |
isALoopedToLoc(int testTree,
int testBr) |
boolean |
isAtopLoc(Point3Dint testPt) |
boolean |
isPointInAnyTree(int x,
int y,
int z) |
boolean |
readInOrComputeAirwayMask() |
boolean |
readInOrComputeConnTissMask() |
boolean |
readInOrComputeLungVolMask() |
boolean |
readInOrComputePTLAmasks() |
boolean |
readInPTLAmasks() |
boolean |
ReadSimTreeParams(java.lang.String descr) |
boolean |
reallocateLoopedBranchesChildren(int llAt)
reallocate branch points and children from loopedFrom side to loopedTo side.
|
boolean |
reallocateLoopLoc(int llAt)
goal is to reallocate the points on the fromBr onto the To branch, then redefine the loopLoc pair
uses int[][] loopLocs[nLoopPts][4] = [looped-to br, looped-to tree, looped-from br, looped-from tree]. |
boolean |
repairBranchConnection(int fromtree,
int connBrIndex,
int pathChildIndex)
repairLoopLoc() identified likely place where the false connection exists, though can be off up/down one level.
|
void |
repairFalse2DConnection(int conntrindex,
int connbrindex) |
void |
repairFalseLadderConnection(int conntrindex,
int connbrindex) |
boolean |
repairLoopLocs() |
protected void |
rmConnTissue() |
void |
run(java.lang.String arg)
This method is called when the plugin is loaded.
|
void |
run(java.lang.String arg,
ij.ImagePlus passedimp) |
void |
setPointRadii()
set to match distance map [mm], where the distmap was computed correctly even for
sliceCenterSep != mmPerPxelX,Y.
|
void |
setupMIPs(byte[][][] maskedImg,
byte[][][] labelsImg) |
void |
showBiggestTree() |
void |
showCenterlinePts() |
void |
shuffleLoopLocs()
put first loopLoc to last to setup to rerun repairLoopLocs()
|
void |
spaceWindowsOnScreen() |
void |
splitTreeAtConnection(int connectingTree,
int connectingBr)
11/20/2012 intent is to be given a child branch that is suspected to connect 2 distinct trees
-- where the current tree traversal encountered an instance where the child was larger than its parent and we presume that it jumped from the original tree to branch on the 2nd tree. |
protected void |
traceCenterline(Point3Dint startPt) |
protected void |
traceCenterlines(Point3Dint[] startPts,
int nstpts) |
boolean |
traverseToFindTreeTop(int t) |
void |
trimBranchEndPts(int treeAt,
int brAt,
boolean onfront,
float radius) |
void |
trimSmoothEndPts(int treeAt,
int brAt,
boolean atFront,
float radius) |
boolean |
trimTreeStubs()
intent is to go through all the tree branches and remove any branches with only 1 point that are
not a looped-to location.
|
void |
updateMIPs(boolean[][][] mask) |
void |
updateMIPs(byte[][][] maskedImg) |
void |
updateMIPs(byte[][][] maskedImg,
byte[][][] labelsImg) |
protected void |
updateThreshold() |
void |
writeAllTreesSTL() |
void |
writeBiggestTreeParams() |
void |
writeBiggestTreeParams(java.lang.String descr) |
adjustCurSlice, cropToObjectROI, customChoiceFunc, findClosestMark, get3Dview, get3DviewOfmark, getObjectMaskFromFiles, getObjectMaskFromFiles, getPtInputDirInfo, redisplay, resetwidgets, runGUI, setGUIWinLevelWidgets, setNewSlice, setNewStudy, setupImg, setupImg, setupImg, setupImg, toString, updateMarkingPanel, UpdateScreen, UpdateSelection, UpdateSelectionImageReviewer
keyPressed, mouseDragged, mouseMoved, mousePressed, mouseReleased
protected int nOrphanedBranches
protected int[][][] orphanedBranches
public int minthresh
public int maxDiff
public int maxVoxelCount
protected int adjustedMin
protected int adjustedDiff
protected float closingOpSize
protected int bigVesselBrightness
protected java.lang.String outputdir
protected java.lang.String slash
protected java.lang.String name_ext
protected ArrayDisplay threshAd
protected ArrayDisplay skelAd
protected ArrayDisplay distAd
protected int seedx
protected int seedy
protected int seedz
protected int seedVoxelValue
protected float parRadRatioThresh
protected float branchRadRatioThresh
protected int[][] loopLocs
protected int nLoopPts
protected float badAngleThresh
protected Rectangle3D bodyRect
protected Rectangle3D vesselRect
protected int imagemax
protected int imagemin
protected boolean didBodyCrop
protected boolean didVesselCrop
protected boolean autoRun
protected boolean useDistanceTransform
protected boolean showDistAd
protected boolean havePulmTrunkMask
protected boolean[][][] pulmTrunkMask
protected boolean[][][] leftAtriumMask
protected boolean[][][] airwayMask
protected boolean[][][] connTissueMask
protected boolean[][][] mediastinumMask
protected int trunkSeedx
protected int trunkSeedy
protected int trunkSeedz
protected int leftAtriumSeedx
protected int leftAtriumSeedy
protected int leftAtriumSeedz
protected Point3Dint trunkSkelStartPt
protected int trunkMinThresh
protected int trunkMaxThresh
protected boolean masksWereSaved
protected boolean terminateOnSegmClose
public void run(java.lang.String arg)
ij.plugin.PlugIn
run
in interface ij.plugin.PlugIn
run
in class ImageReviewer
public void run(java.lang.String arg, ij.ImagePlus passedimp)
run
in class ImageReviewer
public void customButFunc()
customButFunc
in class ImageReviewer
public void spaceWindowsOnScreen()
spaceWindowsOnScreen
in class ImageReviewer
protected Point3Dint findClosestSkeletonPt(Point3Dint seedpt)
protected Point3Dint findClosestSkeletonPt(int seedx, int seedy, int seedz)
protected void traceCenterline(Point3Dint startPt)
protected void traceCenterlines(Point3Dint[] startPts, int nstpts)
public boolean initialTraceAlongBranch(int treeID, int locx, int locy, int locz, int branchIndex)
Requires skeleton[][][] image and assumes you are starting at the tree top, have already created the branch you will be working on using VTrees[treeID].addBranch(parent, level) and have already added the first point with br.addPt()
1/10/2013 new algorithm:
1. first want to define and assign every branch. This is done in initialTraceAlongBranch().
2. if during traversal a looping branch was found (= connected one sub-tree to another;
identified as hitting the beginning of a yet-untraced branch), put the looping pair of points
into the loopLocs[][] array to be processed later in repairLoopLocs(), but continue to traverse tree.
Does not create additional trees, just branches. Also does not delete skeletal points.
WO 5/27/2015 Need to come up with better way to find the tree top. If I select one branch down then
it currently can not find the top and gets into an infinite loop because it finds the back traversing up
to the labeled tree top finds even the top having child > parent radius. There should be some way to use
that back traversal finding to identify a likely new tree top.
Question 1 is does the tree top always occur at a bifuraction or can it occur at a bend in a branch?
@returns true if adjustments were made and this tree needs to be retraversed from scratch
sets (global)looplocs[nloopPts][4]=[looped-to br, looped-to tree, looped-from br, looped-from tree].
public boolean repairBranchConnection(int fromtree, int connBrIndex, int pathChildIndex)
fromtree
- index of tree that the selected belongs toconnBrIndex
- index of the branch above the last branch where child > parent or child-sibling angle is too large.pathChildIndex
- index of the child branch that is along the loop path. Is set in repairLoopLocs. If called from
elsewhere a -1 is passed in.public int getFalseLadderConnectionScore(int conntrindex, int connbrindex)
public void repairFalseLadderConnection(int conntrindex, int connbrindex)
public void repairFalse2DConnection(int conntrindex, int connbrindex)
public int getFalse2DConnectionScore(int conntrindex, int connbrindex)
public float getPairNCCC(int tree1index, int br1index, int tree2index, int br2index)
public float getPairTrimmedNCCC(int tree1index, int br1index, int tree2index, int br2index)
public void handleFailedBranchRepair(int fromtree, int curbrindex)
public void splitTreeAtConnection(int connectingTree, int connectingBr)
Starting from this connecting branch, search up this child to look for it's real root.
It's true parent will currently be labeled as one of it's progeny.
WO 2/12/2013 old version reallocated branches and branch points. New approach is to
modify the skeleton and rerun the traversal for each tree.
4/28/2014 implementing doing multiple tree seed pts simultaneously, so before creating a new tree
check whether the seed is already part of an existing tree.
connectingTree
- The index to the current tree of the erroneously connected branch.connectingBr
- The index to the erroneously connected branch.public boolean trimTreeStubs()
This will remove skeleton points of the stub branches then will need to retraverse the tree from scratch.
uses int[][] loopLocs[nLoopPts][4] = [looped-to br, looped-to tree, looped-from br, looped-from tree].
WO 2/14/2014 should use a distance measure such as branch length must be > parent radius or diameter.
4/28/2014 adding consideration of multiple tree start Pts. Do not delete an end branch that is the top of another tree.
public float getTrimmedBranchLength(int treeAt, int brAt)
public float getTrimmedBranchRadius(int treeAt, int brAt)
public float getTrimmedBranchRadius(int treeAt, int brAt, float searchRadFront, float searchRadEnd)
public float[] getTrimmedBranchFrontVec(int treeAt, int brAt)
public float[] getTrimmedBranchEndVec(int treeAt, int brAt)
public void trimBranchEndPts(int treeAt, int brAt, boolean onfront, float radius)
public void trimSmoothEndPts(int treeAt, int brAt, boolean atFront, float radius)
public float[] getSiblingFrontVec(int treeAt, int brAt)
public int getChild1Index(int treeAt, int brAt)
public int getChild2Index(int treeAt, int brAt)
public float[] getChild1FrontVec(int treeAt, int brAt)
public float[] getChild2FrontVec(int treeAt, int brAt)
public float getSiblingBifurAngle(int treeAt, int brAt)
public float getChildrenBifurAngle(int treeAt, int brAt)
public float getSepAngle(int tree1, int br1, boolean isfront1, int tree2, int br2, boolean isfront2)
public float getSepAngle(VesselBranch branch1, boolean isfront1, VesselBranch branch2, boolean isfront2)
public boolean areBranchesPaired(int tree1, int br1, boolean isfront1, int tree2, int br2, boolean isfront2)
public boolean areBranchesPaired(VesselBranch branch1, boolean isfront1, VesselBranch branch2, boolean isfront2)
public float getLargestParentSiblingRadius(int tree1, int br1)
public float getLargestChildRadius(int tree1, int br1)
public boolean areRadiiMatched(int tree1, int br1, int tree2, int br2)
public boolean areRadiiMatched(VesselBranch branch1, VesselBranch branch2)
public int[] backTraceToMostOffendingBranch(int loopLocIndex)
public int[] backTraceToMostOffendingBranch(int treeAt, int connBrIndex)
public boolean traverseToFindTreeTop(int t)
public int forwardTraceToTreeTop(int curTree, int connBrIndex)
public int forwardTraceToLargestBranch(int curTree, int connBrIndex)
public int forwardTraceToLargeTerminusBranch(int curTree, int connBrIndex)
public boolean repairLoopLocs()
public boolean isALoopedToLoc(int testTree, int testBr)
public boolean isALoopedFromLoc(int testTree, int testBr)
public int getLoopedLocIndexForToBr(int treeAt, int brAt)
public int getLoopedLocIndexForFromBr(int treeAt, int brAt)
public boolean hasMultipleLoopPairings(int treeAt, int brAt)
public boolean reallocateLoopLoc(int llAt)
public boolean reallocateLoopedBranchesChildren(int llAt)
llAt
- index to loopLoc arraypublic void shuffleLoopLocs()
public void AddLoopLocIfUnique(int xto, int yto, int zto, int loopedFromBr, int loopedFromTree)
public void DeleteLoopLoc(int llAt)
public boolean createHyperSkelPair(int treeFrom, int brFrom, boolean onfront1, int treeTo, int brTo, boolean onfront2)
public void createHyperSkelPair(int treeFrom, int brFrom, Point3Dint pt1, Point3Dint pt2)
public boolean isAhyperSkelPt(int x, int y, int z)
public boolean isAhyperSkelPt(Point3Dint checkLoc)
public int getHyperSkelPairIndex(int x, int y, int z)
public int getHyperSkelPairIndex(Point3Dint checkLoc)
public int get2ndHyperSkelPairIndex(int x, int y, int z, int knownPt)
public int get2ndHyperSkelPairIndex(Point3Dint checkLoc, int knownPt)
public Point3Dint getHyperskelPairPt(int locx, int locy, int locz)
public Point3Dint getHyperskelPairPt(Point3Dint checkLoc)
public Point3Dint getHyperskelPairPt(Point3Dint checkLoc, int pairAt)
public void checkRemoveHyperskelPair(Point3Dint checkLoc)
public void addOrphanedBranchPt(int trat, int brat)
public void addOrphanedBranchLastPt(int trat, int brat)
public void deleteOrphanedBranchPt(int del)
public void deleteTopOrphanedBranchPt()
public int getOrphanedBranchOfTopPt(int[] testPt)
public void deleteTree(int treeAt)
public boolean isPointInAnyTree(int x, int y, int z)
public int getTopLocIndex(Point3Dint testPt)
public boolean isAtopLoc(Point3Dint testPt)
public Point3Dint findSkeletonTop(Point3Dint ptat, int levelAt)
public Point3Dint findSkeletonTop(int locx, int locy, int locz, int levelAt)
public Point3Dint findSkeletonTopTry(Point3Dint ptat, int levelAt)
public Point3Dint findSkeletonTopTry(Point3Dint ptat, int levelAt, boolean onLastPath, boolean findBiggestAngle)
public Point3Dint findSkeletonTopTry(int locx, int locy, int locz, int levelAt)
onLastPath
- will traverse down each path (child). Some debug statements depend on whether on the last of the available paths.public Point3Dint findSkeletonTopTry(int locx, int locy, int locz, int levelAt, boolean onLastPath, boolean findBiggestAngle)
public void adjustBranchRadii()
public void setPointRadii()
public void extendBranchEnds()
protected void rmConnTissue()
protected void updateThreshold()
protected void cropToRect(Rectangle3D curRect)
public boolean readInOrComputeLungVolMask()
public boolean readInPTLAmasks()
public boolean readInOrComputePTLAmasks()
public boolean readInOrComputeConnTissMask()
public boolean readInOrComputeAirwayMask()
public void Draw()
public void Draw(ArrayDisplay adat)
public void Draw(boolean drawAsRadius)
public void Draw(ArrayDisplay adat, boolean drawAsRadius)
public void showCenterlinePts()
public void showBiggestTree()
public void writeAllTreesSTL()
public void writeBiggestTreeParams()
public void writeBiggestTreeParams(java.lang.String descr)
public boolean ReadSimTreeParams(java.lang.String descr)
public byte[][][] getSimImage()
public byte[][][] getSimImage(int maxTreeNumber)
public void setupMIPs(byte[][][] maskedImg, byte[][][] labelsImg)
public void updateMIPs(boolean[][][] mask)
public void updateMIPs(byte[][][] maskedImg)
public void updateMIPs(byte[][][] maskedImg, byte[][][] labelsImg)
public Point4Dint[] getTreeBranchLabels()
public void create3BrTestTree()
public void create3DcrossingTestTree()
public byte[][][] createCylinderTestSimImage()
public short[][][] createCrossingCylSimImage()
public float[][] getLengthHistogram(int nBins)
public float[][] getRadiusHistogram(int nBins)