code: private void secondWalk(TreeNode v, double m, int level, double levelStart) {
  		// construct the position from the prelim and the level information
  
  		// The rootLocation affects the way how x and y are changed and in what
  		// direction.
  		double levelChangeSign = getLevelChangeSign();
  		boolean levelChangeOnYAxis = isLevelChangeInYAxis();
  		double levelSize = getSizeOfLevel(level);
  
  		double x = getPrelim(v) + m;
  
  		double y;
  		AlignmentInLevel alignment = configuration.getAlignmentInLevel();
  		if (alignment == AlignmentInLevel.Center) {
  			y = levelStart + levelChangeSign * (levelSize / 2);
  		} else if (alignment == AlignmentInLevel.TowardsRoot) {
  			y = levelStart + levelChangeSign * (getNodeThickness(v) / 2);
  		} else {
  			y = levelStart + levelSize - levelChangeSign
  					* (getNodeThickness(v) / 2);
  		}
  
  		if (!levelChangeOnYAxis) {
  			double t = x;
  			x = y;
  			y = t;
  		}
  
  		positions.put(v, new NormalizedPosition(x, y));
  
  		// update the bounds
  		updateBounds(v, x, y);
  
  		// recurse
  		if (!tree.isLeaf(v)) {
  			double nextLevelStart = levelStart
  					+ (levelSize + configuration.getGapBetweenLevels(level + 1))
  					* levelChangeSign;
  			for (TreeNode w : tree.getChildren(v)) {
  				secondWalk(w, m + getMod(v), level + 1, nextLevelStart);
  			}
  		}
  	}
docs: In difference to the original algorithm we also pass in extra level
  information.
  
  @param v
  @param m
  @param level
  @param levelStart