code: private void sortTracksForEstimation() {
  		// reset data structures
  		planeSamples.reset();
  		farAngles.reset();
  		tracksOnPlane.clear();
  		tracksFar.clear();
  
  		// list of active tracks
  		List<PointTrack> active = tracker.getActiveTracks(null);
  
  		for (PointTrack t : active) {
  			VoTrack p = t.getCookie();
  
  			// compute normalized image coordinate
  			pixelToNorm.compute(t.x, t.y, n);
  
  			// rotate pointing vector into plane reference frame
  			pointing.set(n.x, n.y, 1);
  			GeometryMath_F64.mult(cameraToPlane.getR(), pointing, pointing);
  			pointing.normalize();
  
  			if (p.onPlane) {
  				// see if it still intersects the plane
  				if (pointing.y > 0) {
  					// create data structure for robust motion estimation
  					PlanePtPixel ppp = planeSamples.grow();
  					ppp.normalizedCurr.set(n);
  					ppp.planeKey.set(p.ground);
  
  					tracksOnPlane.add(t);
  				}
  			} else {
  				// if the point is not on the plane visually and (optionally) if it passes a strict y-axis rotation
  				// test, consider using the point for estimating rotation.
  				boolean allGood = pointing.y < 0;
  				if (strictFar) {
  					allGood = isRotationFromAxisY(t, pointing);
  				}
  				// is it still above the ground plane and only has motion consistent with rotation on ground plane axis
  				if (allGood) {
  					computeAngleOfRotation(t, pointing);
  					tracksFar.add(t);
  				}
  			}
  		}
  	}
docs: Splits the set of active tracks into on plane and infinity sets.  For each set also perform specific sanity
  checks to make sure basic constraints are still being meet.  If not then the track will not be considered for
  motion estimation.