             x1 > nx2 or x2 < nx1 or y1 > ny2 or y2 < ny1
 
       ### TODO different force for each arc ###
-      force = d3.layout.force()
-        .nodes(nodes)
-        .links([])
-        .linkStrength(0)
-        .size([layoutWidth(), layoutHeight()])
-
-      force
+      launchForces = (arc) ->
+        forces.push(d3.layout.force()
+          .nodes(arc)
+          .links([])
+          .linkStrength(0)
+          .size([layoutWidth(), layoutHeight()]))
+      launchForces(ring) for ring, i_r in slice for slice, i_s in data
+
+      masterForce
         .gravity(forceGravity())
         .alpha(forceAlpha())
         .charge(forceCharge())
         .friction(forceFriction())
         .start()
-      nodeEnterSelection.call(force.drag)
+
+      masterForce.apply (force)->
+        nodeEnterSelection.call(force.drag)
 
       ### Initialize directionality tracking vars ###
       nodes.forEach (o) ->

    layoutHeight = defineControl("Layout height", true, true, 0, 1200, 700)
    padding = defineControl("Node padding", true, false, 0, 15, 6)

    forceGravity = defineControl("Gravity", false, false, 0, 1, 0, (g) -> force.gravity(g))
    forceAlpha = defineControl("Alpha", false, false, 0, 3, 0.1, (a) -> force.alpha(a))
    forceCharge = defineControl("Charge", false, false, -50, 50, -20, (c) -> force.charge(c))
    forceFriction = defineControl("Friction", false, false, .9, 1, .95, (f) -> force.friction(f))

    containerForce = defineControl("Container force", false, false, 0, 100, 50)
    minAlpha = defineControl("Minimum alpha", false, false, 0, 1, 0, (a) -> if forceAlpha() < a then forceAlpha(a))

          d_r =
            if o.r < (nodeArc.innerRadius + containerPadding) then Math.max(k_r, min_k_r)
            else if (nodeArc.outerRadius - containerPadding) < o.r then -Math.max(k_r, min_k_r)
            else if (o.r - (0.5 * (nodeArc.innerRadius + nodeArc.outerRadius)) > 0) then 0 else 0

          d_thetaDirection = 0
          smallestAngleBetween = (source, target) ->
