clc; clear all; close all; clear classes
% *************************************************************************
% Simulation of the module model for configuration B (rectangular box) 
% takes about 4 min.
%
%   Copyright (C) 2015  Florian Raudies, 05/02/2015, Palo Alto, CA.
%   License, GNU GPL, free software, without any warranty.
% *************************************************************************

addpath('./DotWorld');

rng(4); % Set the seed value for the random number generator.
% Initialize the camera, cube box, and the module model.
camera      = SphericalCamera([0;0;1;0],[0;1;0;0],[0;0;0;0],...
                              360/180*pi,120/180*pi,0,0,0,0,5,10^4);
cube        = Cube([-75 -2.5 -75 75 47.5 75],[3 3 3]);
GroundA     = cube.getGroundSegment();
configA     = Scene(cube, camera);
P1          = cube.getPoints();
opt.nStep   = 5;
opt.Ground  = GroundA;
% Create the module model here because of the change of the cube, which
% would influence the width/length parameters inside the module model.
mm          = ModuleModel(configA, opt);

% Change the cube for configuration B.
[cube DeleteIndex]  = cube.resizeX([-50 50]); % Configuration B.
GroundB             = cube.getGroundSegment();
configB             = Scene(cube, camera);
P2                  = cube.getPoints();
opt.nStep           = 5*10^4;
opt.Ground          = GroundB;
opt.DeleteIndex     = DeleteIndex;
mm.resetScene(configB, opt);

tic
mm.simulate();

rmpath('./DotWorld');

PosGt           = mm.getPosGt;
VelZGt          = mm.getVelZGt;
OmegaYGt        = mm.getOmegaYGt;
PosEstByVel     = mm.getPosEstByVel;
PosEstByAng     = mm.getPosEstByAng;
SpikePosForVel  = mm.getSpikePosForVel;
SpikePosForAng  = mm.getSpikePosForAng;

opt.NumPx = [41 27]; % Discretization for firing rate maps.
[gsVelVCO, SpikeRateVelVCO, gsAngVCO, SpikeRateAngVCO] ...
    = mm.calculateGridScores(opt);

mm.calculateGridCellFiringWithAttractorModel();

[gsVelAtt, SpikeRateVelAtt, gsAngAtt, SpikeRateAngAtt] ...
    = mm.calculateGridScores(opt);

toc

save('SimConfB', 'PosGt', 'PosEstByAng', 'PosEstByVel', ...
    'VelZGt', 'OmegaYGt', 'SpikePosForVel', 'SpikePosForAng',...
    'gsVelVCO', 'SpikeRateVelVCO', 'gsAngVCO', 'SpikeRateAngVCO',...
    'gsVelAtt', 'SpikeRateVelAtt', 'gsAngAtt', 'SpikeRateAngAtt');