private void SetupHeatmaps()
    {
        _loopsCounter = 0;

        // Initialize parent object
        if (heatmapsParent == null)
        {
            CreateParent(ref heatmapsParent);
            heatmapsParent.name = "Heatmaps";
            heatmaps            = new HeatMap[NUM_HEATMAPS];
        }

        // Init custom search lists
        List <Brick> officeTypes = new List <Brick> {
            Brick.OL, Brick.OM, Brick.OS
        };
        List <Brick> resTypes = new List <Brick> {
            Brick.RL, Brick.RM, Brick.RS
        };
        List <Brick> parkTypes = new List <Brick> {
            Brick.PARK
        };
        List <Brick> allTypes = new List <Brick> ();

        foreach (Brick brick in System.Enum.GetValues(typeof(Brick)))
        {
            allTypes.Add(brick);
        }

        for (int i = 0; i < NUM_HEATMAPS; i++)
        {
            heatmaps[i] = new HeatMap(_gridX - 1, _gridY, _windowSearchDim, _cellSize, _cellShrink, _addToYHeight, ((HeatmapType)i).ToString());
            heatmaps[i].SetParent(heatmapsParent);

            // Set up search types & origin types for each heatmap
            if (i == (int)HeatmapType.OFFICE)
            {
                heatmaps [i].SetOriginTypes(resTypes);
                heatmaps [i].SetSearchTypes(officeTypes);
                heatmaps [i].CreateTitle("Proximity to work spaces");
            }
            else if (i == (int)HeatmapType.RES)
            {
                heatmaps [i].SetOriginTypes(officeTypes);
                heatmaps [i].SetSearchTypes(resTypes);
                heatmaps [i].CreateTitle("Proximity to residential spaces");
            }
            else if (i == (int)HeatmapType.PARK)
            {
                heatmaps [i].SetOriginTypes(allTypes);
                heatmaps [i].SetSearchTypes(parkTypes);
                heatmaps [i].CreateTitle("Proximity to parks");
            }
        }

        // Initialize geos
        for (int x = 0; x < _gridX - 1; x++)
        {
            for (int y = 0; y < _gridY; y++)
            {
                if (siteData.GetType(_loopsCounter) != _outOfBoundsType)                   // if not on the area which is out of the physical model space
                // Init heatmap geometries for each heatmap object
                {
                    foreach (HeatMap hm in heatmaps)
                    {
                        hm.CreateHeatmapGeo(x, y, _loopsCounter, siteData.GetType(_loopsCounter), meshYPositions [_loopsCounter]);
                    }
                }
                _loopsCounter++;
            }
        }

        UpdateHeatmaps();
    }