//Keep track of nearest object by setting others to null.
		private void TrackNearestObject ( float distance, ref float nearestDistance, Cell returnedCell, ref Cell nearestCell, DistalSynapse returnedDistalSynapse, ref DistalSynapse nearestDistalSynapse, ProximalSynapse returnedProximalSynapse, ref ProximalSynapse nearestProximalSynapse )
		{
			if (distance < nearestDistance)
			{
				nearestDistance = distance;

				if (returnedCell != null)
				{
					nearestCell = returnedCell;
					nearestDistalSynapse = null;
					nearestProximalSynapse = null;
				}
				if (returnedDistalSynapse != null)
				{
					nearestCell = null;
					nearestDistalSynapse = returnedDistalSynapse;
					nearestProximalSynapse = null;
				}
				if (returnedProximalSynapse != null)
				{
					nearestCell = null;
					nearestDistalSynapse = null;
					nearestProximalSynapse = returnedProximalSynapse;
				}
			}
		}
		private float PickProximalSynapseConnections ( Ray ray, Column column, ref ProximalSynapse returnedProximalSynapse )
		{
			float intersectDistance = float.MaxValue;
			float minDistance = float.MaxValue;

			returnedProximalSynapse = null;

			// Draw Connections if existing
			if (column.IsDataGridSelected || (Simulation3D.Form.ShowSpatialLearning && column.ActiveState[Global.T]))
			{
				Vector3 rayP1 = ray.Position;
				Vector3 rayP2 = rayP1 + ray.Direction;

				foreach (ProximalSynapse synapse in column.ProximalSegment.Synapses)
				{
					synapse.mouseOver = false;

					if (column.Statistics.StepCounter > 0)
					{
						//var proximalSynapse = synapse as ProximalSynapse;

						// Get the two vectors to draw line between
						var startPosition = new Vector3 ( column.PositionInRegion.X, 0, column.PositionInRegion.Y + _zHtmRegion );

						// Get input source position
						int x = synapse.InputSource.X;
						int y = (int)_yHtmPlane;
						int z = synapse.InputSource.Y;
						var endPosition = new Vector3 ( x, y, z + _zHtmPlane );
							
						bool intersect;
						Vector3 Line1ClosestPt = new Vector3 ();
						Vector3 Line2ClosestPt = new Vector3 ();
						intersect = Math3D.ClosestPointsLineSegmentToLine ( out Line1ClosestPt, out Line2ClosestPt, startPosition, endPosition, rayP1, rayP2, 0.1f, out intersectDistance );

						if (intersect && intersectDistance < minDistance)
						{
							minDistance = intersectDistance;
							returnedProximalSynapse = synapse;
						}
					}
				}
			}

			return minDistance;
		}
 /// <summary>
 /// Create a new synapse for this segment attached to the specified input cell.
 /// </summary>
 /// <param name="inputSource">the input source of the synapse to create.</param>
 /// <param name="initialPermanence">the initial permanence of the synapse.</param>
 internal void CreateSynapse(InputCell inputSource, double initialPermanence)
 {
     var newSynapse = new ProximalSynapse(this, inputSource, (float)initialPermanence);
     this.Synapses.Add(newSynapse);
 }
		/// <summary>
		/// Helper Method to get color from proximal synapse state
		/// </summary>
		/// <param name="proximalSynapse"></param>
		/// <param name="color"></param>
		/// <param name="alphaValue"></param>
		private void GetColorFromProximalSynapse ( ProximalSynapse proximalSynapse, out Color color, out float alphaValue )
		{
			color = this._dictionaryProximalSynapseColors[HtmProximalSynapseColors.Default].HtmColor;
			alphaValue = .1f; // All conditions can be false. 
			Simulation3DForm visualizerForm = Simulation3D.Form;

			try
			{
				if (proximalSynapse.IsActive ( Global.T ))
				{
					if (proximalSynapse.IsConnected ())	// Active & connected.
					{
						//this._connectionLine.SetUpVertices ( startPosition, endPosition, Color.Green );
						{
							alphaValue = 1f;
							color = this._dictionaryProximalSynapseColors[HtmProximalSynapseColors.ActiveConnected].HtmColor;
						}
					}
					else	// Active.
					{
						//this._connectionLine.SetUpVertices ( startPosition, endPosition, Color.Orange );
						alphaValue = 1f;
						color = this._dictionaryProximalSynapseColors[HtmProximalSynapseColors.Active].HtmColor;
					}
				}
				else // Not active.
				{
					//this._connectionLine.SetUpVertices ( startPosition, endPosition, Color.White );
					alphaValue = 1f;
					color = this._dictionaryProximalSynapseColors[HtmProximalSynapseColors.Default].HtmColor;
				}

				//selected
				if (proximalSynapse.mouseSelected)
				{
					color = selectedColor;
					alphaValue = 1f;
					//color = this._dictionaryProximalSynapseColors[HtmProximalSynapseColors.MouseSelected].HtmColor;
				}
				//mouseOver
				if (proximalSynapse.mouseOver)
				{
					color = mouseOverColor;
					alphaValue = 1f;
					//color = this._dictionaryProximalSynapseColors[HtmProximalSynapseColors.MouseOver].HtmColor;
				}
			}
			catch (Exception)
			{

			}
		}
        /// <summary>
        /// Create a new synapse for this segment attached to the specified input cell.
        /// </summary>
        /// <param name="inputSource">the input source of the synapse to create.</param>
        /// <param name="initialPermanence">the initial permanence of the synapse.</param>
        internal void CreateSynapse(InputCell inputSource, double initialPermanence)
        {
            var newSynapse = new ProximalSynapse(this, inputSource, (float)initialPermanence);

            this.Synapses.Add(newSynapse);
        }