public void InitializeICP()
        {
            GameObject modelFragment, staticFragment;

            GetModelAndStaticFragment(out modelFragment, out staticFragment);

            Settings settings = Settings.Horn(ICPFragments.transform);

            registerer = new ICPRegisterer(
                modelFragment: modelFragment,
                staticFragment: staticFragment,
                settings: settings
                );
            Ticker.Receiver.Instance.SendMessage(
                methodName: "OnMessage",
                value: new Ticker.Message.InfoMessage("Using " + settings.name + " to determine the registration."),
                options: SendMessageOptions.RequireReceiver
                );

            //Note these objects do not receive the ICPStarted message.
            registerer.AddListener(ICPFragments);
            registerer.AddListener(this.gameObject);

            StepButton.Registerer = registerer;
            PlayButton.Registerer = registerer;
            StopButton.Registerer = registerer;

            ToggleICPModeInGUI(true);
        }
        private IEnumerator <object> ExecuteRunGUI(Run run)
        {
            currentRunNumber++;
            isCurrentRunFinished = false;

            string message = string.Format("Starting run number {0} with fragment {1}.",
                                           currentRunNumber, run.id);

            //Notify the user via the ticker and via the debug log
            Ticker.Receiver.Instance.SendMessage(
                methodName: "OnMessage",
                value: new Ticker.Message.InfoMessage(message)
                );
            yield return(null);

            // Load ModelFragment
            GameObject modelFragment = fragmentImporter.Import(run.modelFragmentPath, prefabPath: ExperimentRunner.ExperimentFragmentPrefabPath);

            yield return(null);

            // Run ICP
            ICPRegisterer icp = new ICPRegisterer(staticFragment, modelFragment, run.ICPSettings);

            icp.AddListener(this.listener);

            while (!icp.HasTerminated)
            {
                icp.PrepareStep();
                yield return(null);

                icp.Step();
                yield return(null);
            }

            // Export Current Position of the ModelFragment
            fragmentExporter.Export(modelFragment, run.GetOutputPath(this.outputDirectory));
            yield return(null);

            // Delete the ModelFragment
            modelFragment.GetComponent <FragmentDestroyer>().DestroyFragment();

            isCurrentRunFinished = true;
        }