%% CODE WRITTEN BY BASABDATTA SEN BHATTACHARYA AND IS A PROPERTY OF THE
%% UNIVERSITY OF ULSTER, NORTHERN IRELAND, UK. PLEASE CITE THE ARTICLE IN
%% WHICH THE WORK WAS FIRST PROPOSED WHEN USING THIS CODE. THE CITATION
%% DETAILS ARE AVAILABLE IN THE README.TXT FILE IN THIS FOLDER.
function myinput_ver1(block)
%Simulate extrinsic input to a cell population
setup(block);
%endfunction
function setup(block)
%Dialog parameters are, in order, mean, variance, time of simulation (msec), flag
% There is an option to give a constant input to the model, in which case
% the flag will be 0 with a constant input at mean value.
%Else, if flag=1, the input will be a random
% noise with assigned mean and standard deviation.
block.NumDialogPrms = 4;
block.DialogPrmsTunable = {'Tunable','Tunable','Tunable','Tunable'};
% Register number of ports
block.NumInputPorts = 0;
block.NumOutputPorts = 1;
% Setup port properties to be inherited or dynamic
block.SetPreCompOutPortInfoToDynamic;
% Override output port properties
block.OutputPort(1).DatatypeID = 0; % double
block.OutputPort(1).Complexity = 'Real';
block.OutputPort(1).Dimensions = 1;
block.OutputPort(1).SamplingMode = 'Sample';
block.SampleTimes = [0.004 0]; %% MODEL SAMPLING TIME
block.RegBlockMethod('PostPropagationSetup', @DoPostPropSetup);
block.RegBlockMethod('InitializeConditions', @InitConditions);
block.RegBlockMethod('Update', @Update);
block.RegBlockMethod('Outputs', @Output);
block.RegBlockMethod('Terminate', @Terminate);
function DoPostPropSetup(block)
%% Setup Dwork
block.NumDworks = 3;
% Dwork(1) holds the noise vector
block.Dwork(1).Name = 'noiseVector';
block.Dwork(1).Dimensions = block.DialogPrm(3).Data;
block.Dwork(1).DatatypeID = 0;
block.Dwork(1).Complexity = 'Real';
block.Dwork(1).UsedAsDiscState = true;
% Dwork(2) holds each element of the noise vector
block.Dwork(2).Name = 'noiseVectorEl';
block.Dwork(2).Dimensions = 1;
block.Dwork(2).DatatypeID = 0;
block.Dwork(2).Complexity = 'Real';
block.Dwork(2).UsedAsDiscState = true;
% Dwork(3) is a counter
block.Dwork(3).Name = 'currentIndex';
block.Dwork(3).Dimensions = 1;
block.Dwork(3).DatatypeID = 0;
block.Dwork(3).Complexity = 'Real';
block.Dwork(3).UsedAsDiscState = true;
%endfunction
function InitConditions(block)
%% Initialize Dwork
block.Dwork(3).Data = 0;
mean_noise=block.DialogPrm(1).Data; %%noise mean
variance_noise=block.DialogPrm(2).Data; %% noise variance
std_noise = sqrt(variance_noise);%% noise std. dev
simlen=block.DialogPrm(3).Data; % simulation time in milliseconds;
% so for 1 minute, the entry will be 60000
flag = block.DialogPrm(4).Data; %% decision for constant input (flag=0) OR noisy input (flag=1)
if (flag == 0)
block.Dwork(2).Data = mean_noise;
elseif (flag == 1)
r= randn(1, simlen);
R = (((r-mean(r)) ./ std(r)) .* std_noise) + mean_noise;
block.Dwork(1).Data = R;
block.Dwork(2).Data = block.Dwork(1).Data(block.Dwork(3).Data+1);
end
%endfunction
function Output(block)
block.OutputPort(1).Data = block.Dwork(2).Data;
%endfunction
function Update(block)
if (block.DialogPrm(4).Data==1)
x= block.Dwork(3).Data;
x=x+1;
if (x>length(block.Dwork(1).Data))
return;
else
block.Dwork(2).Data = block.Dwork(1).Data(x);
block.Dwork(3).Data = x;
end
end
%endfunction
function Terminate(block)
%endfunction
%endfunction setup