function out = RunSimulation(SIMPARAMS)
% set the path to the simulation files
addpath(pwd, [pwd '/Simulation']);

% these are currently redundent parameters that may be required again when
% I put the cortical pulse code back into the simulation 
SIMPARAMS.CTX_state = [1 1 0 0 0 0 0 0];
SIMPARAMS.initCTX = rand(2);

% check the parameter types before calling the c++ funciton
checkStriatumInputs(SIMPARAMS);

% Run the simulation - using original version: as per NN model 
% Run the simulation - using version striatum_RK2_B: no scaling of synaptic input by 1/ts
[out.t, out.Vms, out.Vfs, out.STms, out.STfs, out.VMS, out.UMS, out.VFS, out.UFS, out.VFSGAP, out.MSGLU_AMPA, out.MSGLU_NMDA, out.MSGABA, out.MSSEQ, out.FSGLU, out.FSGABA, out.FSSEQ, out.RecordChan_MS] = ...
    striatum_RK2(SIMPARAMS.sim.tstart,SIMPARAMS.sim.tfinal,...
    SIMPARAMS.sim.dt, ...
    SIMPARAMS.physiology.MSparams,SIMPARAMS.physiology.FSparams,...
    SIMPARAMS.physiology.Eglu, SIMPARAMS.physiology.Egaba, SIMPARAMS.physiology.ts_glu_AMPA, SIMPARAMS.physiology.ts_glu_NMDA, SIMPARAMS.physiology.ts_gaba, SIMPARAMS.physiology.tau_fsgap, ...
    SIMPARAMS.sim.MSspikebuffer, SIMPARAMS.sim.FSspikebuffer, ...
    SIMPARAMS.sim.initVms,SIMPARAMS.sim.initUms,...
    SIMPARAMS.sim.initVfs,SIMPARAMS.sim.initUfs,SIMPARAMS.sim.initVgapfs,...    
    SIMPARAMS.sim.SpikeEventQue_MS,SIMPARAMS.sim.SpikeEventQue_FS, ...
    SIMPARAMS.sim.SpikeEventQue_MS,SIMPARAMS.sim.SpikeEventQue_FS, ...
    SIMPARAMS.initCTX, ...
    SIMPARAMS.sim.Iinj_MS,SIMPARAMS.sim.Iinj_FS,...
    SIMPARAMS.net.Cctms, SIMPARAMS.net.Cctms_b, SIMPARAMS.net.Cctms_d, SIMPARAMS.net.Cctms_w, ...
    SIMPARAMS.net.Cmsms, SIMPARAMS.net.Cmsms_b, SIMPARAMS.net.Cmsms_d, SIMPARAMS.net.Cmsms_w, ...
    SIMPARAMS.net.Cfsms, SIMPARAMS.net.Cfsms_b, SIMPARAMS.net.Cfsms_d, SIMPARAMS.net.Cfsms_w, ...
    SIMPARAMS.net.Cctfs, SIMPARAMS.net.Cctfs_b, SIMPARAMS.net.Cctfs_d, SIMPARAMS.net.Cctfs_w,  ...
    SIMPARAMS.net.Cfsfs, SIMPARAMS.net.Cfsfs_b, SIMPARAMS.net.Cfsfs_d, SIMPARAMS.net.Cfsfs_w, ...
    SIMPARAMS.net.Cgapfs, SIMPARAMS.net.Cgapfs_b, SIMPARAMS.net.Cgapfs_w, SIMPARAMS.net.Pgapfs, ...
    SIMPARAMS.CTX_state, ...
    SIMPARAMS.net.CHAN1_MS, SIMPARAMS.net.CHAN1_FS, SIMPARAMS.net.CHAN2_MS, SIMPARAMS.net.CHAN2_FS, ...
    SIMPARAMS.input.CTX.N_MSSEG, SIMPARAMS.input.CTX.r_MSSEG, SIMPARAMS.input.CTX.alpha_MSSEG, ...
    SIMPARAMS.input.CTX.N_FSSEG, SIMPARAMS.input.CTX.r_FSSEG, SIMPARAMS.input.CTX.alpha_FSSEG, ...
    SIMPARAMS.physiology.glu_ratio, SIMPARAMS.physiology.DA, ...
    SIMPARAMS.sim.RecordChan_MS, ...
    SIMPARAMS.input.PULSE.P, SIMPARAMS.input.PULSE.Nctx_ms, SIMPARAMS.input.PULSE.Nctx_fs, SIMPARAMS.input.PULSE.ts_spks, ...
    SIMPARAMS.input.Selection.Pt, SIMPARAMS.input.Selection.Pch, SIMPARAMS.input.Selection.Phz, ...
    SIMPARAMS.sim.RANDSEED, ...
    SIMPARAMS.sim.logfname);

% trim off the access numm entries
out.STms = out.STms(find(out.STms(:,2)>0), :);
out.STfs = out.STfs(find(out.STfs(:,2)>0), :);