docs: private void addNewTracks() {
  		trackerLeft.spawnTracks();
  		trackerRight.spawnTracks();
  
  		List<PointTrack> newLeft = trackerLeft.getNewTracks(null);
  		List<PointTrack> newRight = trackerRight.getNewTracks(null);
  
  		// get a list of new tracks and their descriptions
  		addNewToList(inputLeft, newLeft, pointsLeft, descLeft);
  		addNewToList(inputRight,newRight,pointsRight,descRight);
  
  		// associate using L2R
  		assocL2R.setSource(pointsLeft,descLeft);
  		assocL2R.setDestination(pointsRight, descRight);
  		assocL2R.associate();
  		FastQueue<AssociatedIndex> matches = assocL2R.getMatches();
  
  		// storage for the triangulated location in the camera frame
  		Point3D_F64 cameraP3 = new Point3D_F64();
  
  		for( int i = 0; i < matches.size; i++ ) {
  			AssociatedIndex m = matches.get(i);
  
  			PointTrack trackL = newLeft.get(m.src);
  			PointTrack trackR = newRight.get(m.dst);
  
  			// declare additional track information stored in each track.  Tracks can be recycled so it
  			// might not always need to be declared
  			LeftTrackInfo infoLeft = trackL.getCookie();
  			if( infoLeft == null )
  				trackL.cookie = infoLeft = new LeftTrackInfo();
  
  			RightTrackInfo infoRight = trackR.getCookie();
  			if( infoRight == null )
  				trackR.cookie = infoRight = new RightTrackInfo();
  
  			Stereo2D3D p2d3d = infoLeft.location;
  
  			// convert pixel observations into normalized image coordinates
  			leftImageToNorm.compute(trackL.x,trackL.y,p2d3d.leftObs);
  			rightImageToNorm.compute(trackR.x,trackR.y,p2d3d.rightObs);
  
  			// triangulate 3D coordinate in the current camera frame
  			if( triangulate.triangulate(p2d3d.leftObs,p2d3d.rightObs,leftToRight,cameraP3) )
  			{
  				// put the track into the current keyframe coordinate system
  				SePointOps_F64.transform(currToKey,cameraP3,p2d3d.location);
  				// save a reference to the matching track in the right camera frame
  				infoLeft.right = trackR;
  				infoLeft.lastConsistent = infoLeft.lastInlier = tick;
  				infoRight.left = trackL;
  			} else {
  				// triangulation failed, drop track
  				trackerLeft.dropTrack(trackL);
  				// TODO need way to mark right tracks which are unassociated after this loop
  				throw new RuntimeException("This special case needs to be handled!");
  			}
  		}
  
  		// drop tracks that were not associated
  		GrowQueue_I32 unassignedRight = assocL2R.getUnassociatedDestination();
  		for( int i = 0; i < unassignedRight.size; i++ ) {
  			int index = unassignedRight.get(i);
  //			System.out.println(" unassigned right "+newRight.get(index).x+" "+newRight.get(index).y);
  			trackerRight.dropTrack(newRight.get(index));
  		}
  		GrowQueue_I32 unassignedLeft = assocL2R.getUnassociatedSource();
  		for( int i = 0; i < unassignedLeft.size; i++ ) {
  			int index = unassignedLeft.get(i);
  			trackerLeft.dropTrack(newLeft.get(index));
  		}
  
  //		System.out.println("Total left "+trackerLeft.getAllTracks(null).size()+"  right "+trackerRight.getAllTracks(null).size());
  
  //		System.out.println("Associated: "+matches.size+" new left "+newLeft.size()+" new right "+newRight.size());
  //		System.out.println("New Tracks: Total: Left "+trackerLeft.getAllTracks(null).size()+" right "+
  //				trackerRight.getAllTracks(null).size());
  
  //		List<PointTrack> temp = trackerLeft.getActiveTracks(null);
  //		for( PointTrack t : temp ) {
  //			if( t.cookie == null )
  //				System.out.println("BUG!");
  //		}
  //		temp = trackerRight.getActiveTracks(null);
  //		for( PointTrack t : temp ) {
  //			if( t.cookie == null )
  //				System.out.println("BUG!");
  //		}
  	}