     @lines_object = lines_object
 
   start: (data) ->
+    data = sanitizeData data
     # Convert lines data to tree structure
     root = linesToTree data
-
     # Add empty Object3Ds
     root = @addObjects root
-
     # Position objects
     root = @positionObjects root
-
     @animateLines root
       .then =>
         @fadeAll @lines_object.children, 0, 2000
       .then =>
         @lines_object.remove.apply(@lines_object, @lines_object.children)
 
-  ########################
+  ######################################################################
   # ANIMATE LINES
   animateLines: (root) =>
     # Fade in the root

      parent.children.forEach traverse

    return parent
    
  chainedFadeIn: (array, duration) ->
    reduction = (promise, curr, index, array) =>
      promise.then =>
        curr._text_object._all_here = true
        par = curr._text_object.parent
        subset = par.children.filter (d) -> d._all_here
        obj = @getObjectFromSubset par, subset
        # @adjustCameraWidth obj
        @fadeToArray(1, 1000) curr._text_object.children

    promise = array.reduce reduction, Promise.resolve()

  # TODO: Make this much more general and add it to Main
  alignToNode: (parent) ->

    @fadeToArray(1, 1000) root._text_object.children
    @panCameraToObject root._text_object
      .then => return @traverse root

  traverse: (node) =>
    console.assert node.word isnt "", "node.word is '#{node.word}'", node
