diff --git a/nuplan/planning/script/builders/occlusion_manager_builder.py b/nuplan/planning/script/builders/occlusion_manager_builder.py
index d496b49c267afca7cacef8ae86dc38c3058aba96..2b75cc59d7d4c7b922ced2a140268924e04f6d21 100644
--- a/nuplan/planning/script/builders/occlusion_manager_builder.py
+++ b/nuplan/planning/script/builders/occlusion_manager_builder.py
@@ -2,7 +2,7 @@
 from omegaconf import DictConfig
 
 from nuplan.planning.scenario_builder.abstract_scenario import AbstractScenario
-from nuplan.planning.simulation.occlusion.occlusion_manager import AbstractOcclusionManager
+from nuplan.planning.simulation.occlusion.abstract_occlusion_manager import AbstractOcclusionManager
 from nuplan.planning.simulation.occlusion.range_occlusion_manager import RangeOcclusionManager
 
 def build_occlusion_manager(occlusion_cfg: DictConfig, scenario: AbstractScenario) -> AbstractOcclusionManager:
diff --git a/nuplan/planning/script/builders/simulation_builder.py b/nuplan/planning/script/builders/simulation_builder.py
index 105fa67a52c5593aa80629edbc64f8bb9c649756..52abd74a11c3fc7fc3104946adc9b33a3da52f44 100644
--- a/nuplan/planning/script/builders/simulation_builder.py
+++ b/nuplan/planning/script/builders/simulation_builder.py
@@ -17,7 +17,7 @@ from nuplan.planning.simulation.callback.metric_callback import MetricCallback
 from nuplan.planning.simulation.callback.multi_callback import MultiCallback
 from nuplan.planning.simulation.controller.abstract_controller import AbstractEgoController
 from nuplan.planning.simulation.observation.abstract_observation import AbstractObservation
-from nuplan.planning.simulation.occlusion.occlusion_manager import AbstractOcclusionManager
+from nuplan.planning.simulation.occlusion.abstract_occlusion_manager import AbstractOcclusionManager
 from nuplan.planning.simulation.planner.abstract_planner import AbstractPlanner
 from nuplan.planning.simulation.runner.simulations_runner import SimulationRunner
 from nuplan.planning.simulation.simulation import Simulation
diff --git a/nuplan/planning/simulation/occlusion/occlusion_manager.py b/nuplan/planning/simulation/occlusion/abstract_occlusion_manager.py
similarity index 66%
rename from nuplan/planning/simulation/occlusion/occlusion_manager.py
rename to nuplan/planning/simulation/occlusion/abstract_occlusion_manager.py
index 32ebb332b8c82755806e167fac50963346391ca3..965afceee47186786be0091a7703ebb0919a51ff 100644
--- a/nuplan/planning/simulation/occlusion/occlusion_manager.py
+++ b/nuplan/planning/simulation/occlusion/abstract_occlusion_manager.py
@@ -11,24 +11,38 @@ from nuplan.planning.simulation.observation.observation_type import DetectionsTr
 
 
 class AbstractOcclusionManager(metaclass=ABCMeta):
+    """
+    Interface for a generic occlusion manager.
+    """
+
     def __init__(
         self,
         scenario: AbstractScenario
     ):
-        self._masks = {}
+        self._visible_agent_cache = {}
         self.scenario = scenario
 
     def reset(self) -> None:
-        self._masks = {}
+        """
+        Resets occlusion manager cache.
+        """
+        self._visible_agent_cache = {}
 
     def occlude_input(self, input_buffer: SimulationHistoryBuffer) -> SimulationHistoryBuffer:
+        """
+        Occludes SimulationHistoryBuffer input. Loops through each timestep defined by time_us,
+        checks to see if timestep is already contained in _visible_agent_cache and computes
+        occlusions if not, and occludes timestep using cached results. Repacks output in 
+        SimulationHistoryBuffer.
+        """
+
         ego_state_buffer = input_buffer.ego_state_buffer
         observations_buffer = input_buffer.observation_buffer
         sample_interval = input_buffer.sample_interval
 
         for ego_state, observations in zip(ego_state_buffer, observations_buffer):
-            if ego_state.time_us not in self._masks:
-                self._masks[ego_state.time_us] = self._compute_mask(ego_state, observations)
+            if ego_state.time_us not in self._visible_agent_cache:
+                self._visible_agent_cache[ego_state.time_us] = self._compute_mask(ego_state, observations)
                 
         output_buffer = SimulationHistoryBuffer(ego_state_buffer, \
                             deque([self._mask_input(ego_state.time_us, observations) for ego_state, observations in zip(ego_state_buffer, observations_buffer)]), \
@@ -41,14 +55,16 @@ class AbstractOcclusionManager(metaclass=ABCMeta):
         pass
 
     def _mask_input(self, time_us: int, observations: DetectionsTracks) -> DetectionsTracks:
-        assert time_us in self._masks, "Attempted to mask non-cached timestep!"
+        """
+        Occludes observations at timestep time_us based on cached occlusions.
+        """
+
+        assert time_us in self._visible_agent_cache, "Attempted to mask non-cached timestep!"
         assert isinstance(observations, DetectionsTracks), "Occlusions only support DetectionsTracks."
 
-        mask = self._masks[time_us]
+        mask = self._visible_agent_cache[time_us]
         tracks = observations.tracked_objects.tracked_objects
 
         visible_tracks = [track for track in tracks if track.metadata.track_token in mask]
 
         return DetectionsTracks(tracked_objects=TrackedObjects(visible_tracks))
-
-
diff --git a/nuplan/planning/simulation/occlusion/range_occlusion_manager.py b/nuplan/planning/simulation/occlusion/range_occlusion_manager.py
index 9f1f8cf131ca0d63cf5707ffc42558e6c5a74d96..99a09fcee12aa19619f03073f22fa6af69a50e71 100644
--- a/nuplan/planning/simulation/occlusion/range_occlusion_manager.py
+++ b/nuplan/planning/simulation/occlusion/range_occlusion_manager.py
@@ -1,13 +1,29 @@
 from nuplan.common.actor_state.ego_state import EgoState
-from nuplan.planning.simulation.observation.observation_type import DetectionsTracks, Observation
-from nuplan.planning.simulation.occlusion.occlusion_manager import AbstractOcclusionManager
+from nuplan.planning.scenario_builder.abstract_scenario import AbstractScenario
+from nuplan.planning.simulation.observation.observation_type import DetectionsTracks
+from nuplan.planning.simulation.occlusion.abstract_occlusion_manager import AbstractOcclusionManager
 
 
 class RangeOcclusionManager(AbstractOcclusionManager):
+    """
+    Range occlusion manager. Occludes all objects outside of a given
+    range of the ego.
+    """
+
+    def __init__(
+        self,
+        scenario: AbstractScenario,
+        range_threshold: float = 25
+    ):
+        super().__init__(scenario)
+        self.range_threshold = range_threshold
+
     def _compute_mask(self, ego_state: EgoState, observations: DetectionsTracks) -> set:
         not_occluded = set()
         for track in observations.tracked_objects.tracked_objects:
-            if (ego_state.center.x - track.center.x) ** 2 + (ego_state.center.y - track.center.y) ** 2 <= 500:
+            if ((ego_state.center.x - track.center.x) ** 2 + \
+                (ego_state.center.y - track.center.y) ** 2) ** 0.5 <= self.range_threshold:
                 not_occluded.add(track.metadata.track_token)
 
-        return not_occluded
\ No newline at end of file
+        return not_occluded
+    
\ No newline at end of file
diff --git a/nuplan/planning/simulation/simulation_setup.py b/nuplan/planning/simulation/simulation_setup.py
index 944d06dd4951a6c51031fff6d8a4ad9c7a2810e4..03b3d39eefef9ce0131d6719efb46f909d2f416d 100644
--- a/nuplan/planning/simulation/simulation_setup.py
+++ b/nuplan/planning/simulation/simulation_setup.py
@@ -3,7 +3,7 @@ from dataclasses import dataclass
 from nuplan.planning.scenario_builder.abstract_scenario import AbstractScenario
 from nuplan.planning.simulation.controller.abstract_controller import AbstractEgoController
 from nuplan.planning.simulation.observation.abstract_observation import AbstractObservation
-from nuplan.planning.simulation.occlusion.occlusion_manager import AbstractOcclusionManager
+from nuplan.planning.simulation.occlusion.abstract_occlusion_manager import AbstractOcclusionManager
 from nuplan.planning.simulation.planner.abstract_planner import AbstractPlanner
 from nuplan.planning.simulation.simulation_time_controller.abstract_simulation_time_controller import (
     AbstractSimulationTimeController,
diff --git a/test_notebook.ipynb b/test_notebook.ipynb
index c13fd6b7135b9d32bf7365d681cf74af2b737cf0..022d06cf2e9a705d37d33b71a0159052853c349b 100644
--- a/test_notebook.ipynb
+++ b/test_notebook.ipynb
@@ -26,7 +26,7 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/tmp/ipykernel_11668/4095267831.py:5: DeprecationWarning: Importing display from IPython.core.display is deprecated since IPython 7.14, please import from IPython display\n",
+      "/tmp/ipykernel_4691/4095267831.py:5: DeprecationWarning: Importing display from IPython.core.display is deprecated since IPython 7.14, please import from IPython display\n",
       "  from IPython.core.display import display, HTML\n"
      ]
     }
@@ -190,32 +190,32 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "2023-11-24 15:55:34,469 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:19}  Building WorkerPool...\n",
-      "2023-11-24 15:55:34,470 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:101}  Worker: Sequential\n",
-      "2023-11-24 15:55:34,470 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:102}  Number of nodes: 1\n",
+      "2023-11-28 10:52:47,443 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:19}  Building WorkerPool...\n",
+      "2023-11-28 10:52:47,444 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:101}  Worker: Sequential\n",
+      "2023-11-28 10:52:47,444 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:102}  Number of nodes: 1\n",
       "Number of CPUs per node: 1\n",
       "Number of GPUs per node: 0\n",
       "Number of threads across all nodes: 1\n",
-      "2023-11-24 15:55:34,470 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:27}  Building WorkerPool...DONE!\n",
-      "2023-11-24 15:55:34,470 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:32}  Building experiment folders...\n",
-      "2023-11-24 15:55:34,470 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:35}  \n",
+      "2023-11-28 10:52:47,444 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:27}  Building WorkerPool...DONE!\n",
+      "2023-11-28 10:52:47,444 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:32}  Building experiment folders...\n",
+      "2023-11-28 10:52:47,445 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:35}  \n",
       "\n",
-      "\tFolder where all results are stored: /home/sacardoz/nuplan/exp/exp/simulation/closed_loop_reactive_agents/2023.11.24.15.55.34\n",
+      "\tFolder where all results are stored: /home/sacardoz/nuplan/exp/exp/simulation/closed_loop_reactive_agents/2023.11.28.10.52.46\n",
       "\n",
-      "2023-11-24 15:55:34,472 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:70}  Building experiment folders...DONE!\n",
-      "2023-11-24 15:55:34,472 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:52}  Building AbstractCallback...\n",
-      "2023-11-24 15:55:34,472 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:68}  Building AbstractCallback: 0...DONE!\n",
-      "2023-11-24 15:55:34,472 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:49}  Building simulations...\n",
-      "2023-11-24 15:55:34,472 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:55}  Extracting scenarios...\n",
-      "2023-11-24 15:55:34,473 INFO {/home/sacardoz/nuplan-devkit/nuplan/common/utils/distributed_scenario_filter.py:83}  Building Scenarios in mode DistributedMode.SINGLE_NODE\n",
-      "2023-11-24 15:55:34,473 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:18}  Building AbstractScenarioBuilder...\n",
-      "2023-11-24 15:55:34,484 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:21}  Building AbstractScenarioBuilder...DONE!\n",
-      "2023-11-24 15:55:34,484 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:35}  Building ScenarioFilter...\n",
-      "2023-11-24 15:55:34,485 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:44}  Building ScenarioFilter...DONE!\n",
-      "2023-11-24 15:55:34,503 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:76}  Building metric engines...\n",
-      "2023-11-24 15:55:34,527 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:78}  Building metric engines...DONE\n",
-      "2023-11-24 15:55:34,527 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:82}  Building simulations from 1 scenarios...\n",
-      "2023-11-24 15:55:35,102 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:142}  Building simulations...DONE!\n"
+      "2023-11-28 10:52:47,446 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:70}  Building experiment folders...DONE!\n",
+      "2023-11-28 10:52:47,446 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:52}  Building AbstractCallback...\n",
+      "2023-11-28 10:52:47,446 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:68}  Building AbstractCallback: 0...DONE!\n",
+      "2023-11-28 10:52:47,446 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:49}  Building simulations...\n",
+      "2023-11-28 10:52:47,447 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:55}  Extracting scenarios...\n",
+      "2023-11-28 10:52:47,447 INFO {/home/sacardoz/nuplan-devkit/nuplan/common/utils/distributed_scenario_filter.py:83}  Building Scenarios in mode DistributedMode.SINGLE_NODE\n",
+      "2023-11-28 10:52:47,447 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:18}  Building AbstractScenarioBuilder...\n",
+      "2023-11-28 10:52:47,460 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:21}  Building AbstractScenarioBuilder...DONE!\n",
+      "2023-11-28 10:52:47,460 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:35}  Building ScenarioFilter...\n",
+      "2023-11-28 10:52:47,462 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:44}  Building ScenarioFilter...DONE!\n",
+      "2023-11-28 10:52:47,506 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:76}  Building metric engines...\n",
+      "2023-11-28 10:52:47,534 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:78}  Building metric engines...DONE\n",
+      "2023-11-28 10:52:47,535 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:82}  Building simulations from 1 scenarios...\n",
+      "2023-11-28 10:52:48,385 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:142}  Building simulations...DONE!\n"
      ]
     }
    ],
@@ -285,7 +285,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "id": "e6c22f5f",
    "metadata": {},
    "outputs": [
@@ -320,7 +320,7 @@
      },
      "metadata": {
       "application/vnd.bokehjs_exec.v0+json": {
-       "server_id": "8c2d162af4db4c04b446e01209c9a53a"
+       "server_id": "53399aadd95b44a497b381fa7f8c6958"
       }
      },
      "output_type": "display_data"
@@ -329,71 +329,79 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "2023-11-24 15:56:35,057 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,057 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,058 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'tutorials/media/nuplan_flow.svg'. Is this a 'parquet' file?: Could not open Parquet input source 'tutorials/media/nuplan_flow.svg': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,058 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,059 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,059 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'docs/Makefile'. Is this a 'parquet' file?: Could not open Parquet input source 'docs/Makefile': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,059 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,059 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet file size is 0 bytes\n",
-      "2023-11-24 15:56:35,060 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'tox/requirements_pythonlint.txt'. Is this a 'parquet' file?: Could not open Parquet input source 'tox/requirements_pythonlint.txt': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,060 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,060 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,060 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,061 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,061 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,061 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,061 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,062 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,070 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'nuplan/BUILD'. Is this a 'parquet' file?: Could not open Parquet input source 'nuplan/BUILD': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,071 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from '.git/HEAD'. Is this a 'parquet' file?: Could not open Parquet input source '.git/HEAD': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,072 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,072 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,072 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,073 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,073 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,073 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,074 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'nuplan_devkit.egg-info/PKG-INFO'. Is this a 'parquet' file?: Could not open Parquet input source 'nuplan_devkit.egg-info/PKG-INFO': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,075 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  'planner_name'\n",
-      "2023-11-24 15:56:35,075 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,075 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,076 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet file size is 0 bytes\n",
-      "2023-11-24 15:56:35,076 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,077 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,077 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,077 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,078 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from '.github/ISSUE_TEMPLATE/bug_report.md'. Is this a 'parquet' file?: Could not open Parquet input source '.github/ISSUE_TEMPLATE/bug_report.md': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,079 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
-      "2023-11-24 15:56:35,089 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/simulation_tile.py:172}  Minimum frame time=0.017 s\n"
+      "2023-11-28 10:53:54,443 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,444 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,446 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'tutorials/media/nuplan_flow.svg'. Is this a 'parquet' file?: Could not open Parquet input source 'tutorials/media/nuplan_flow.svg': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,447 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,447 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,447 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'docs/Makefile'. Is this a 'parquet' file?: Could not open Parquet input source 'docs/Makefile': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,448 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,448 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet file size is 0 bytes\n",
+      "2023-11-28 10:53:54,448 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'tox/requirements_pythonlint.txt'. Is this a 'parquet' file?: Could not open Parquet input source 'tox/requirements_pythonlint.txt': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,449 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,450 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,450 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,450 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,451 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,453 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,453 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,454 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,454 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,454 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,462 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'nuplan/BUILD'. Is this a 'parquet' file?: Could not open Parquet input source 'nuplan/BUILD': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,467 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from '.git/COMMIT_EDITMSG'. Is this a 'parquet' file?: Could not open Parquet input source '.git/COMMIT_EDITMSG': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,468 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,468 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,469 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,469 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,470 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,470 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,471 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'nuplan_devkit.egg-info/PKG-INFO'. Is this a 'parquet' file?: Could not open Parquet input source 'nuplan_devkit.egg-info/PKG-INFO': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,473 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  'planner_name'\n",
+      "2023-11-28 10:53:54,474 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from 'henry_experiments/pretrained_checkpoints/gc_pgp_checkpoint.ckpt'. Is this a 'parquet' file?: Could not open Parquet input source 'henry_experiments/pretrained_checkpoints/gc_pgp_checkpoint.ckpt': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,475 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,475 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,475 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet file size is 0 bytes\n",
+      "2023-11-28 10:53:54,476 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,476 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,476 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,477 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Error creating dataset. Could not read schema from '.github/ISSUE_TEMPLATE/bug_report.md'. Is this a 'parquet' file?: Could not open Parquet input source '.github/ISSUE_TEMPLATE/bug_report.md': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,477 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140}  Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n",
+      "2023-11-28 10:53:54,489 INFO {/home/sacardoz/nuplan-devkit/nuplan/planning/nuboard/base/simulation_tile.py:172}  Minimum frame time=0.017 s\n"
      ]
     },
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "Rendering a scenario: 100%|██████████| 1/1 [00:00<00:00,  5.00it/s]\n",
+      "Rendering a scenario: 100%|██████████| 1/1 [00:00<00:00, 44.32it/s]\n",
       "WARNING:bokeh.core.validation.check:W-1000 (MISSING_RENDERERS): Plot has no renderers: Figure(id='1005', ...)\n",
-      "INFO:tornado.access:200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:8888&resources=none (::1) 1055.84ms\n",
       "INFO:bokeh.server.views.ws:WebSocket connection opened\n",
       "INFO:bokeh.server.views.ws:ServerConnection created\n",
-      "INFO:tornado.access:101 GET /ws?id=583b91c1-44e7-4030-9ddc-acb743fb59ea&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.75ms\n"
+      "INFO:tornado.access:200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:8888&resources=none (::1) 1240.23ms\n"
      ]
     },
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "2023-11-24 15:56:36,101 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344}  200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:8888&resources=none (::1) 1055.84ms\n",
-      "2023-11-24 15:56:36,116 INFO {/home/sacardoz/nuplan-devkit/tutorials/utils/tutorial_utils.py:266}  Done rendering!\n",
-      "2023-11-24 15:56:36,278 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344}  101 GET /ws?id=583b91c1-44e7-4030-9ddc-acb743fb59ea&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.75ms\n"
+      "2023-11-28 10:53:55,651 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344}  200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:8888&resources=none (::1) 1240.23ms\n",
+      "2023-11-28 10:53:55,661 INFO {/home/sacardoz/nuplan-devkit/tutorials/utils/tutorial_utils.py:267}  Done rendering!\n",
+      "2023-11-28 10:53:55,662 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344}  101 GET /ws?id=bc2a9004-8c61-4fce-94eb-6c0fad2158fa&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.62ms\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "INFO:tornado.access:101 GET /ws?id=bc2a9004-8c61-4fce-94eb-6c0fad2158fa&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.62ms\n"
      ]
     }
    ],
    "source": [
     "from tutorials.utils.tutorial_utils import visualize_history\n",
     "if runner.simulation._occlusion_manager:\n",
-    "    runner.simulation._history.occlusion_masks = runner.simulation._occlusion_manager._masks\n",
+    "    runner.simulation._history.occlusion_masks = runner.simulation._occlusion_manager._visible_agent_cache\n",
     "visualize_history(runner.simulation._history, runner.scenario, bokeh_port=8888)"
    ]
   }