GPT tut interaction 20110530 second edit: Difference between revisions

From BanghamLab
Jump to navigation Jump to search
No edit summary
No edit summary
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[Tutorial on the interaction function details|Back to tutoral on the interaction function details]]
[[Tutorial on the interaction function details|Back to tutoral on the interaction function details]].<br><br>
The green comments have not been removed in this copy - to allow you to see the context in which the new code has been placed.<br><br>
The green comments have not been removed in this copy - to allow you to see the context in which the new code has been placed. If you copy this function we recommend removing all the comments that you no longer need to see.<br><br>
There are two submodels. The first has isotropic growth and the second has anisotropic growth. The choice of submodel (1 or 2) is made on the line  highlighted in RED.<br><br>  
There are two submodels. The two are the same except that the first has isotropic growth (see lines shown in <span style="color: Magenta">magenta</span>) and the second has anisotropic growth (see lines shown in <span style="color: MediumBlue">MediumBlue</span>). The choice of submodel (1 or 2) is made on the line  highlighted in RED.<br><br>  
<span style="color: CornflowerBlue">Section 1</span>
<span style="color: CornflowerBlue">% Section 1</span>
    function m = gpt_tut_interaction_20110530( m )
function m = gpt_tut_interaction_example_20110601( m )
        <span style="color: Green">%m = gpt_tut_interaction_20110530( m )</span>
<span style="color: Green">%m = gpt_tut_interaction_example_20110601( m )</span>
        <span style="color: Green">%  Morphogen interaction function.</span>
<span style="color: Green">%  Morphogen interaction function.</span>
        <span style="color: Green">%  Written at 2011-05-30 09:42:07.</span>
<span style="color: Green">%  Written at 2011-06-02 14:55:46.</span>
        <span style="color: Green">%  GFtbox revision 0, .</span>
<span style="color: Green">%  GFtbox revision 3554, 2011-06-02 12:30:52.789869.</span>
   
   
        <span style="color: Green">% The user may edit any part of this function between delimiters</span>
<span style="color: Green">% The user may edit any part of this function between delimiters</span>
        <span style="color: Green">% of the form "USER CODE..." and "END OF USER CODE...".  The</span>
<span style="color: Green">% of the form "USER CODE..." and "END OF USER CODE...".  The</span>
        <span style="color: Green">% delimiters themselves must not be moved, edited, deleted, or added.</span>
<span style="color: Green">% delimiters themselves must not be moved, edited, deleted, or added.</span>
   
   
        if isempty(m), return; end
    if isempty(m), return; end
   
   
        fprintf( 1, '<span style="color: Green">%s found in %s\n', mfilename(), which(mfilename()) );</span>
    fprintf( 1, '<span style="color: Green">%s found in %s\n', mfilename(), which(mfilename()) );</span>
   
   
        try
    try
            m = local_setproperties( m );
        m = local_setproperties( m );
        catch
    catch
        end
    end
   
   
        realtime = m.globalDynamicProps.currenttime;
    realtime = m.globalDynamicProps.currenttime;
   
   
  <span style="color: CornflowerBlue">Section 2</span>
  <span style="color: CornflowerBlue">% Section 2</span>
        <span style="color: Green">%%% USER CODE: INITIALISATION</span>
<span style="color: Green">%%% USER CODE: INITIALISATION</span>
   
   
        <span style="color: Green">% In this section you may modify the mesh in any way whatsoever.</span>
<span style="color: Green">% In this section you may modify the mesh in any way whatsoever.</span>
        if (Steps(m)==0) && m.globalDynamicProps.doinit <span style="color: Green">% First iteration</span>
    if (Steps(m)==0) && m.globalDynamicProps.doinit <span style="color: Green">% First iteration</span>
            <span style="color: Green">% Zero out a lot of stuff to create a blank slate.</span>
        <span style="color: Green">% Zero out a lot of stuff to create a blank slate. </span>
            <span style="color: Green">% If no morphogens are set in the GUI it may be useful to</span>
        <span style="color: Green">% If no morphogens are set in the GUI it may be useful to</span>
            <span style="color: Green">% zero some arrays by uncommenting the following.</span>
        <span style="color: Green">% zero some arrays by uncommenting the following.</span>
            <span style="color: Green">% m.morphogens(:) = 0;</span>
        <span style="color: Green">% m.morphogens(:) = 0;</span>
            <span style="color: Green">% m.morphogenclamp(:) = 0;</span>
        <span style="color: Green">% m.morphogenclamp(:) = 0;</span>
            <span style="color: Green">% m.mgen_production(:) = 0;</span>
        <span style="color: Green">% m.mgen_production(:) = 0;</span>
            <span style="color: Green">% m.mgen_absorption(:) = 0;</span>
        <span style="color: Green">% m.mgen_absorption(:) = 0;</span>
            <span style="color: Green">% m.seams(:) = false;</span>
        <span style="color: Green">% m.seams(:) = false;</span>
            <span style="color: Green">% m.mgen_dilution(:) = false;</span>
        <span style="color: Green">% m.mgen_dilution(:) = false;</span>
   
   
            <span style="color: Green">% Set up names for variant models.  Useful for running multiple models on a cluster.</span>
        <span style="color: Green">% Set up names for variant models.  Useful for running multiple models on a cluster.</span>
            m.userdata.ranges.modelname.range = { 'MODEL1', 'MODEL2' };  <span style="color: Green">% CLUSTER</span>
        m.userdata.ranges.modelname.range = { <span style="color: Magenta">'NoPolariser'</span>, <span style="color: MediumBlue">'WithPolariser'</span> };  <span style="color: Green">% CLUSTER</span>
              <span style="color: Crimson">m.userdata.ranges.modelname.index = 2;</span>                      <span style="color: Green">% CLUSTER</span>
        <span style="color: Crimson">m.userdata.ranges.modelname.index = 2;</span>                      <span style="color: Green">% CLUSTER</span>
        end
    end
        modelname = m.userdata.ranges.modelname.range{m.userdata.ranges.modelname.index};  <span style="color: Green">% CLUSTER</span>
    modelname = m.userdata.ranges.modelname.range{m.userdata.ranges.modelname.index};  <span style="color: Green">% CLUSTER</span>
        disp(sprintf('\nRunning <span style="color: Green">%s model %s\n',mfilename, modelname));</span>
    disp(sprintf('\nRunning <span style="color: Green">%s model %s\n',mfilename, modelname));</span>
        switch modelname
   
            case 'MODEL1'
    <span style="color: Green">% More examples of code for all iterations.</span>
                <span style="color: Green">% Set up the parameters (e.g. mutations) for this model here.</span>
            case 'MODEL2'
                <span style="color: Green">% Set up the parameters (e.g. mutations) for this model here.</span>
            otherwise
                <span style="color: Green">% If you reach here, you probably forgot a case.</span>
        end
   
   
        <span style="color: Green">% More examples of code for all iterations.</span>
    <span style="color: Green">% Set priorities for simultaneous plotting of multiple morphogens, if desired.</span>
    <span style="color: Green">% m = leaf_mgen_plotpriority( m, {'MGEN1', 'MGEN2'}, [1,2], [0.5,0.75] );</span>
   
   
        <span style="color: Green">% Set priorities for simultaneous plotting of multiple morphogens, if desired.</span>
    <span style="color: Green">% Set colour of polariser gradient arrows.</span>
        <span style="color: Green">% m = leaf_mgen_plotpriority( m, {'MGEN1', 'MGEN2'}, [1,2], [0.5,0.75] );</span>
    <span style="color: Green">% m = leaf_plotoptions(m,'highgradcolor',[0,0,0],'lowgradcolor',[1,0,0]);</span>
   
   
        <span style="color: Green">% Set colour of polariser gradient arrows.</span>
    <span style="color: Green">% setup a multiplot of the following morphogens</span>
        <span style="color: Green">% m = leaf_plotoptions(m,'highgradcolor',[0,0,0],'lowgradcolor',[1,0,0]);</span>
    <span style="color: Green">% m = leaf_plotoptions( m, 'morphogen', {'V_PROFILE1','V_PROFILE2','KAPAR','S_LEFTRIGHT'});</span>
   
   
        <span style="color: Green">% setup a multiplot of the following morphogens</span>
    <span style="color: Green">% to plot polariser on the A side and resultant areal growth rate on the B side:</span>
        <span style="color: Green">% m = leaf_plotoptions( m, 'morphogen', {'V_PROFILE1','V_PROFILE2','KAPAR','S_LEFTRIGHT'});</span>
    <span style="color: Green">% m = leaf_plotoptions( m, 'morphogenA', 'POLARISER', ...</span>
    <span style="color: Green">%                      'outputquantityB', 'resultantgrowthrate', ...</span>
    <span style="color: Green">%                      'outputaxesB', 'areal' );</span>
   
   
        <span style="color: Green">% to plot polariser on the A side and resultant areal growth rate on the B side:</span>
    <span style="color: Green">% monitor properties of vertices must be done here - so that it reports newly equilibrated levels</span>
        <span style="color: Green">% m = leaf_plotoptions( m, 'morphogenA', 'POLARISER', ...</span>
    <span style="color: Green">% m=leaf_profile_monitor(m,... % essential</span>
        <span style="color: Green">%                     'outputquantityB', 'resultantgrowthrate', ...</span>
    <span style="color: Green">%        'REGIONLABELS',{'V_PROFILE1','V_PROFILE2'},... % essential</span>
        <span style="color: Green">%                     'outputaxesB', 'areal' );</span>
    <span style="color: Green">%         'MORPHOGENS',{'S_LEFTRIGHT','S_CENTRE'},... % optional  (one element per REGIONLABEL)</span>
    <span style="color: Green">%         'VERTLABELS',false,'FigNum',1,'EXCEL',true,'MODELNAME',modelname); % optional (file in snapshots directory')</span>
<span style="color: Green">%%% END OF USER CODE: INITIALISATION</span>
   
   
        <span style="color: Green">% monitor properties of vertices must be done here - so that it reports newly equilibrated levels</span>
<span style="color: CornflowerBlue">% Section 3</span>
        <span style="color: Green">% m=leaf_profile_monitor(m,... % essential</span>
<span style="color: Green">%%% SECTION 1: ACCESSING MORPHOGENS AND TIME.</span>
        <span style="color: Green">%         'REGIONLABELS',{'V_PROFILE1','V_PROFILE2'},... % essential</span>
<span style="color: Green">%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.</span>
        <span style="color: Green">%        'MORPHOGENS',{'S_LEFTRIGHT','S_CENTRE'},... % optional  (one element per REGIONLABEL)</span>
        <span style="color: Green">%         'VERTLABELS',false,'FigNum',1,'EXCEL',true,'MODELNAME',modelname); % optional (file in snapshots directory')</span>
   
   
    if isempty(m), return; end
   
   
        <span style="color: Green">%%% END OF USER CODE: INITIALISATION</span>
    setGlobals();
    global gNEW_KA_PAR gNEW_KA_PER gNEW_KB_PAR gNEW_KB_PER
    global gNEW_K_NOR gNEW_POLARISER gNEW_STRAINRET gNEW_ARREST
    dt = m.globalProps.timestep;
    polariser_i = gNEW_POLARISER;
    P = m.morphogens(:,polariser_i);
    [kapar_i,kapar_p,kapar_a,kapar_l] = getMgenLevels( m, 'KAPAR' );
    [kaper_i,kaper_p,kaper_a,kaper_l] = getMgenLevels( m, 'KAPER' );
    [kbpar_i,kbpar_p,kbpar_a,kbpar_l] = getMgenLevels( m, 'KBPAR' );
    [kbper_i,kbper_p,kbper_a,kbper_l] = getMgenLevels( m, 'KBPER' );
    [knor_i,knor_p,knor_a,knor_l] = getMgenLevels( m, 'KNOR' );
    [strainret_i,strainret_p,strainret_a,strainret_l] = getMgenLevels( m, 'STRAINRET' );
    [arrest_i,arrest_p,arrest_a,arrest_l] = getMgenLevels( m, 'ARREST' );
    [id_a_i,id_a_p,id_a_a,id_a_l] = getMgenLevels( m, 'ID_A' );
    [id_b_i,id_b_p,id_b_a,id_b_l] = getMgenLevels( m, 'ID_B' );
   
   
  <span style="color: CornflowerBlue">Section 3</span>
  <span style="color: Green">% Mesh type: circle</span>
         <span style="color: Green">%%% SECTION 1: ACCESSING MORPHOGENS AND TIME.</span>
<span style="color: Green">%         centre: 0</span>
        <span style="color: Green">%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.</span>
<span style="color: Green">%      circumpts: 48</span>
<span style="color: Green">%      coneangle: 0</span>
<span style="color: Green">%        dealign: 0</span>
<span style="color: Green">%         height: 0</span>
<span style="color: Green">%       innerpts: 0</span>
<span style="color: Green">%     randomness: 0.1</span>
<span style="color: Green">%          rings: 6</span>
<span style="color: Green">%         version: 1</span>
<span style="color: Green">%         xwidth: 0.2</span>
<span style="color: Green">%         ywidth: 0.2</span>
   
   
        if isempty(m), return; end
<span style="color: Green">%            Morphogen  Diffusion  Decay  Dilution  Mutant</span>
<span style="color: Green">%            -------------------------------------------------</span>
<span style="color: Green">%                KAPAR        ----    ----      ----    ----</span>
<span style="color: Green">%                KAPER        ----    ----      ----    ----</span>
<span style="color: Green">%                KBPAR        ----    ----      ----    ----</span>
<span style="color: Green">%                KBPER        ----    ----      ----    ----</span>
<span style="color: Green">%                KNOR        ----    ----      ----    ----</span>
<span style="color: Green">%            POLARISER        0.01    0.1      ----    ----</span>
<span style="color: Green">%            STRAINRET        ----    ----      ----    ----</span>
<span style="color: Green">%              ARREST        ----    ----      ----    ----</span>
<span style="color: Green">%                ID_A        ----    ----      ----    ----</span>
<span style="color: Green">%                ID_B        ----    ----      ----    ----</span>
   
   
        setGlobals();
        global gNEW_KA_PAR gNEW_KA_PER gNEW_KB_PAR gNEW_KB_PER
        global gNEW_K_NOR gNEW_POLARISER gNEW_STRAINRET gNEW_ARREST
        dt = m.globalProps.timestep;
        polariser_i = gNEW_POLARISER;
        P = m.morphogens(:,polariser_i);
        [kapar_i,kapar_p,kapar_a,kapar_l] = getMgenLevels( m, 'KAPAR' );
        [kaper_i,kaper_p,kaper_a,kaper_l] = getMgenLevels( m, 'KAPER' );
        [kbpar_i,kbpar_p,kbpar_a,kbpar_l] = getMgenLevels( m, 'KBPAR' );
        [kbper_i,kbper_p,kbper_a,kbper_l] = getMgenLevels( m, 'KBPER' );
        [knor_i,knor_p,knor_a,knor_l] = getMgenLevels( m, 'KNOR' );
        [strainret_i,strainret_p,strainret_a,strainret_l] = getMgenLevels( m, 'STRAINRET' );
        [arrest_i,arrest_p,arrest_a,arrest_l] = getMgenLevels( m, 'ARREST' );
        [id_plusorg_i,id_plusorg_p,id_plusorg_a,id_plusorg_l] = getMgenLevels( m, 'ID_PLUSORG' );
        [id_negorg_i,id_negorg_p,id_negorg_a,id_negorg_l] = getMgenLevels( m, 'ID_NEGORG' );
        [id_a_i,id_a_p,id_a_a,id_a_l] = getMgenLevels( m, 'ID_A' );
        [id_b_i,id_b_p,id_b_a,id_b_l] = getMgenLevels( m, 'ID_B' );
   
   
        <span style="color: Green">% Mesh type: circle</span>
<span style="color: Green">%%% USER CODE: MORPHOGEN INTERACTIONS</span>
        <span style="color: Green">%          centre: 0</span>
        <span style="color: Green">%      circumpts: 48</span>
        <span style="color: Green">%       coneangle: 0</span>
        <span style="color: Green">%        dealign: 0</span>
        <span style="color: Green">%          height: 0</span>
        <span style="color: Green">%        innerpts: 0</span>
        <span style="color: Green">%      randomness: 0.1</span>
        <span style="color: Green">%          rings: 6</span>
        <span style="color: Green">%        version: 1</span>
        <span style="color: Green">%          xwidth: 0.2</span>
        <span style="color: Green">%         ywidth: 0.2</span>
   
   
        <span style="color: Green">%           Morphogen  Diffusion  Decay  Dilution  Mutant</span>
<span style="color: Green">% In this section you may modify the mesh in any way that does not</span>
        <span style="color: Green">%            -------------------------------------------------</span>
<span style="color: CornflowerBlue">% Section 4</span>
        <span style="color: Green">%                KAPAR        ----    ----      ----    ----</span>
<span style="color: Green">% alter the set of nodes.</span>
        <span style="color: Green">%                KAPER        ----    ----      ----    ----</span>
        <span style="color: Green">%                KBPAR        ----    ----      ----    ----</span>
        <span style="color: Green">%                KBPER        ----    ----      ----    ----</span>
        <span style="color: Green">%                KNOR        ----    ----      ----    ----</span>
        <span style="color: Green">%            POLARISER        ----    ----      ----    ----</span>
        <span style="color: Green">%            STRAINRET        ----    ----      ----    ----</span>
        <span style="color: Green">%              ARREST        ----    ----      ----    ----</span>
        <span style="color: Green">%          ID_PLUSORG        ----    ----      ----    ----</span>
        <span style="color: Green">%            ID_NEGORG        ----    ----      ----    ----</span>
        <span style="color: Green">%                 ID_A        ----    ----      ----    ----</span>
        <span style="color: Green">%                 ID_B        ----    ----      ----    ----</span>
   
   
    if (Steps(m)==0) && m.globalDynamicProps.doinit  <span style="color: Green">% Initialisation code.</span>
        <span style="color: Green">% Put any code here that should only be performed at the start of</span>
        <span style="color: Green">% the simulation, for example, to set up initial morphogen values.</span>
       
        <span style="color: Green">% m.nodes is the set of vertex positions, an N by 3 array if there</span>
        <span style="color: Green">% are N vertices.  Row number K contains the X, Y, and Z</span>
        <span style="color: Green">% coordinates of the Kth vertex. To obtain a list of the X</span>
        <span style="color: Green">% coordinates of every vertex, write m.nodes(:,1).  The Y</span>
        <span style="color: Green">% coordinates are given by m.nodes(:,2) and the Z coordinates by</span>
        <span style="color: Green">% m.nodes(:,3).</span>
   
   
         <span style="color: Green">%%% USER CODE: MORPHOGEN INTERACTIONS</span>
         <span style="color: Green">% Set up a morphogen promoter (_p suffix) region where x values are minimum</span>
        <span style="color: Green">% id_prox_p(m.nodes(:,1)==min(m.nodes(:,1)))=1;</span>
        <span style="color: Green">% if the morphogen level (_l suffix) is to be used in this iteration </span>
        <span style="color: Green">% set the level using the morphogen activity (_a suffix).</span>
        <span style="color: Green">% id_prox_l=id_prox_p * id_prox_a; % when a mutation is specified in the GUI </span>
        <span style="color: Green">% the activity (_a) is set to zero</span>
   
   
         <span style="color: Green">% In this section you may modify the mesh in any way that does not</span>
        <span style="color: Magenta"> id_a_p(m.nodes(:,1)<-0.03)=1; <span style="color: Green">% setup region for A where identity factor A is represented by id_a_p</span>
<span style="color: CornflowerBlue">Section 4</span>
         id_b_p(m.nodes(:,2)<-0.01)=1; </span><span style="color: Green">% setup region for B</span>
         <span style="color: Green">% alter the set of nodes.</span>
       
        <span style="color: Green">% One way to set up a morphogen gradient is by ...</span>
        <span style="color: Green">% Setting up a gradient by clamping the ends (execute only once)</span>
         <span style="color: MediumBlue">P((m.nodes(:,1)<-0.05)&(m.nodes(:,2)>0.03))=1;
        m.morphogenclamp( P==1, polariser_i ) = 1;
        m = leaf_mgen_conductivity( m, 'POLARISER', 0.001 );  <span style="color: Green">%specifies the diffusion rate of polariser</span>
        m = leaf_mgen_absorption( m, 'POLARISER', 0.1 );    <span style="color: Green">% specifies degradation rate of polariser</span></span>
   
   
         if (Steps(m)==0) && m.globalDynamicProps.doinit  <span style="color: Green">% Initialisation code.</span>
         <span style="color: Green">% Fixing vertices, i.e. fix z for the base to prevent base from moving up or down</span>
            <span style="color: Green">% Put any code here that should only be performed at the start of</span>
        <span style="color: Green">% m=leaf_fix_vertex(m,'vertex',find(id_prox_p==1),'dfs','z');</span>
            <span style="color: Green">% the simulation, for example, to set up initial morphogen values.</span>
            <span style="color: Green">% m.nodes is the set of vertex positions, an N by 3 array if there</span>
            <span style="color: Green">% are N vertices.  Row number K contains the X, Y, and Z</span>
            <span style="color: Green">% coordinates of the Kth vertex. To obtain a list of the X</span>
            <span style="color: Green">% coordinates of every vertex, write m.nodes(:,1).  The Y</span>
            <span style="color: Green">% coordinates are given by m.nodes(:,2) and the Z coordinates by</span>
            <span style="color: Green">% m.nodes(:,3).</span>
   
   
            <span style="color: Green">% Set up a morphogen promoter (_p suffix) region where x values are minimum</span>
        <span style="color: Green">% To cut the mesh, set a temporary morphogen to 1 in places to cut</span>
            <span style="color: Green">% id_prox_p(m.nodes(:,1)==min(m.nodes(:,1)))=1;</span>
        <span style="color: Green">% seams=zeros(size(P));</span>
            <span style="color: Green">% if the morphogen level (_l suffix) is to be used in this iteration</span>
        <span style="color: Green">% seams(indexes to places to cut)=1;</span>
            <span style="color: Green">% set the level using the morphogen activity (_a suffix).</span>
        <span style="color: Green">% m=leaf_set_seams(m,seams);</span>
            <span style="color: Green">% id_prox_l=id_prox_p * id_prox_a; % when a mutation is specified in the GUI</span>
            <span style="color: Green">% the activity (_a) is set to zero</span>
   
   
            id_a_p(m.nodes(:,1)<-0.03)=1; <span style="color: Green">% setup region for A where identity factor A is represented by id_a_p</span>
    end
            id_b_p(m.nodes(:,2)<-0.01)=1; <span style="color: Green">% setup region for B</span>
   
<span style="color: CornflowerBlue">% Section 5</span>
    <span style="color: Green">% Second way to generate a gradient</span>
    <span style="color: Green">% generating (+) and sinking (-) a diffusing signal (in this case polariser)</span>
    <span style="color: Green">% m.mgen_production( :, polariser_i ) = + 5*s_spur_p - P .* id_dist_p;</span>
   
   
            <span style="color: Green">% One way to set up a morphogen gradient is by ...</span>
    <span style="color: Green">% Monitor growth by scattering discs that deform over time (c.f. inducing biological clones)</span>
            <span style="color: Green">% Setting up a gradient by clamping the ends (execute only once)</span>
    <span style="color: Green">% (CARE - if the canvas is flat ensure that Plot:Hide Thickness is true, </span>
            P((m.nodes(:,1)<-0.05)&(m.nodes(:,2)>0.03))=1;
    <span style="color: Green">% because a quirk of the Matlab z-buffer means that they can get hidden by mistake)</span>
            m.morphogenclamp( P==1, polariser_i ) = 1;
    <span style="color: Green">%    if (340>realtime-dt) && (340<realtime+dt) % discs to be added at realtime==340</span>
            m = leaf_mgen_conductivity( m, 'POLARISER', 0.01 )<span style="color: Green">%specifies the diffusion rate of polariser</span>
    <span style="color: Green">%        m = leaf_makesecondlayer( m, ...  % This function adds discs that represent transformed cells.</span>
            m = leaf_mgen_absorption( m, 'POLARISER', 0.1 );     <span style="color: Green">% specifies degradation rate of polariser</span>
    <span style="color: Green">%            'mode', 'each', ...  % Make discs randomly scattered over the canvas.</span>
    <span style="color: Green">%            'relarea', 1/16000, ...  % Each discs has area was 1/16000 of the initial area of the canvas.</span>
    <span style="color: Green">%            'probpervx', 'V_FLOWER', ... % induce discs over whole canvas (V_FLOWER is 1 over whole canvas)</span>
    <span style="color: Green">%           'numcells',4500,...%number of discs (that will become ellipses)</span>
    <span style="color: Green">%            'sides', 6, ...  % Each discs is approximated as a 6-sided regular polygon.</span>
    <span style="color: Green">%            'colors', [0.5 0.5 0.5], ...  % Default colour is gray but</span>
    <span style="color: Green">%            'colorvariation',1,... % Each disc is a random colour</span>
    <span style="color: Green">%            'add', true ); % These discs are added to any discs existing already</span>
    <span style="color: Green">%   end</span>
   
<span style="color: CornflowerBlue">% Section 6</span>
    <span style="color: Green">% Directives for creating latex representation directly from Matlab code</span>
    <span style="color: Green">% not fully implemented yet but will use @@ directives</span>
    <span style="color: Green">% @@at t</span>
    <span style="color: Green">% @@before t</span>
    <span style="color: Green">% @@after t</span>
    <span style="color: Green">% @@between t1 t2</span>
   
   
            <span style="color: Green">% Fixing vertices, i.e. fix z for the base to prevent base from moving up or down</span>
<span style="color: CornflowerBlue">% Section 7</span>
            <span style="color: Green">% m=leaf_fix_vertex(m,'vertex',find(id_prox_p==1),'dfs','z');</span>
<span style="color: Green">%     % If you want to define different phases according to the absolute</span>
<span style="color: Green">%    % time, create a morphogen for each phase and modulate </span>
<span style="color: Green">%    % expressions using the morphogen</span>
<span style="color: Green">%     % like.  For example:</span>
<span style="color: Green">%    if (realtime < 10)  % first growth phase</span>
<span style="color: Green">%        f_firstgrowth_p = 1;</span>
<span style="color: Green">%    else</span>
<span style="color: Green">%        f_firstgrowth_p = 0;</span>
<span style="color: Green">%    end</span>
<span style="color: Green">%    if (realtime >= 10) % second growth phase</span>
<span style="color: Green">%        f_secondgrowth_p = 1;</span>
<span style="color: Green">%    else</span>
<span style="color: Green">%        f_secondgrowth_p = 0;</span>
<span style="color: Green">%    end</span>
<span style="color: Green">%</span>
<span style="color: Green">%    % If you want one morphogen to affect others only during a certain</span>
<span style="color: Green">%    % phase, write something like:</span>
<span style="color: Green">%</span>
<span style="color: Green">%    mgen_a_p = f_firstgrowth_p .* (various terms); % will zero except in firstgrowth</span>
   
   
            <span style="color: Green">% To cut the mesh, set a temporary morphogen to 1 in places to cut</span>
  <span style="color: CornflowerBlue">% Section 8</span>
            <span style="color: Green">% seams=zeros(size(P));</span>
    <span style="color: Green">% Code common to all models.</span>
            <span style="color: Green">% seams(indexes to places to cut)=1;</span>
    <span style="color: Green">% @@PRN Polariser Regulatory Network</span>
            <span style="color: Green">% m=leaf_set_seams(m,seams);</span>
        end
<span style="color: CornflowerBlue">Section 5</span>
        <span style="color: Green">% Second way to generate a gradient</span>
        <span style="color: Green">% generating (+) and sinking (-) a diffusing signal (in this case polariser)</span>
        <span style="color: Green">% m.mgen_production( :, polariser_i ) = + 5*s_spur_p - P .* id_dist_p;</span>
        <span style="color: Green">% Monitor growth by scattering discs that deform over time (c.f. inducing biological clones)</span>
        <span style="color: Green">% (CARE - if the canvas is flat ensure that Plot:Hide Thickness is true,</span>
        <span style="color: Green">% because a quirk of the Matlab z-buffer means that they can get hidden by mistake)</span>
        <span style="color: Green">%    if (340>realtime-dt) && (340<realtime+dt) % discs to be added at realtime==340</span>
        <span style="color: Green">%        m = leaf_makesecondlayer( m, ...  % This function adds discs that represent transformed cells.</span>
        <span style="color: Green">%            'mode', 'each', ...  % Make discs randomly scattered over the canvas.</span>
        <span style="color: Green">%            'relarea', 1/16000, ...  % Each discs has area was 1/16000 of the initial area of the canvas.</span>
        <span style="color: Green">%            'probpervx', 'V_FLOWER', ... % induce discs over whole canvas (V_FLOWER is 1 over whole canvas)</span>
        <span style="color: Green">%            'numcells',4500,...%number of discs (that will become ellipses)</span>
        <span style="color: Green">%            'sides', 6, ...  % Each discs is approximated as a 6-sided regular polygon.</span>
        <span style="color: Green">%            'colors', [0.5 0.5 0.5], ...  % Default colour is gray but</span>
        <span style="color: Green">%            'colorvariation',1,... % Each disc is a random colour</span>
        <span style="color: Green">%            'add', true );  % These discs are added to any discs existing already</span>
        <span style="color: Green">%    end</span>
  <span style="color: CornflowerBlue">Section 6</span>
        <span style="color: Green">% Directives for creating latex representation directly from Matlab code</span>
        <span style="color: Green">% not fully implemented yet but will use @@ directives</span>
        <span style="color: Green">% @@at t</span>
        <span style="color: Green">% @@before t</span>
        <span style="color: Green">% @@after t</span>
        <span style="color: Green">% @@between t1 t2</span>
<span style="color: CornflowerBlue">Section 7</span>
        <span style="color: Green">%    % If you want to define different phases according to the absolute</span>
        <span style="color: Green">%    % time, create a morphogen for each phase and modulate</span>
        <span style="color: Green">%    % expressions using the morphogen</span>
        <span style="color: Green">%    % like.  For example:</span>
        <span style="color: Green">%    if (realtime < 10)  % first growth phase</span>
        <span style="color: Green">%        f_firstgrowth_p = 1;</span>
        <span style="color: Green">%    else</span>
        <span style="color: Green">%        f_firstgrowth_p = 0;</span>
        <span style="color: Green">%    end</span>
        <span style="color: Green">%    if (realtime >= 10) % second growth phase</span>
        <span style="color: Green">%        f_secondgrowth_p = 1;</span>
        <span style="color: Green">%    else</span>
        <span style="color: Green">%        f_secondgrowth_p = 0;</span>
        <span style="color: Green">%    end</span>
        <span style="color: Green">%</span>
        <span style="color: Green">%    % If you want one morphogen to affect others only during a certain</span>
        <span style="color: Green">%    % phase, write something like:</span>
        <span style="color: Green">%</span>
        <span style="color: Green">%    mgen_a_p = f_firstgrowth_p .* (various terms); % will zero except in firstgrowth</span>
<span style="color: CornflowerBlue">Section 8</span>
        <span style="color: Green">% Code common to all models.</span>
        <span style="color: Green">% @@PRN Polariser Regulatory Network</span>
         <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
         <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
        <span style="color: Green">% @@GRN Gene Regulatory Network</span>
    <span style="color: Green">% @@GRN Gene Regulatory Network</span>
         <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
         <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
        <span style="color: Green">% @@KRN Growth Regulatory Network</span>
    <span style="color: Green">% @@KRN Growth Regulatory Network</span>
         <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
         <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
   
   
  <span style="color: CornflowerBlue">Section 9</span>
  <span style="color: CornflowerBlue">% Section 9</span>
        <span style="color: Green">% Code for specific models.</span>
    <span style="color: Green">% Code for specific models.</span>
        switch modelname
    switch modelname
  <span style="color: CornflowerBlue">Section 10</span>
  <span style="color: CornflowerBlue">% Section 10</span>
            case 'MODEL1'  <span style="color: Green">% @@model MODEL1</span>
        <span style="color: Crimson">case 'NoPolariser</span><span style="color: Green">% @@model MODEL1</span>
                <span style="color: Green">% @@PRN Polariser Regulatory Network</span>
            <span style="color: Green">% @@PRN Polariser Regulatory Network</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                 <span style="color: Green">% P(:) = ...  % @@ Eqn xx</span>
                 <span style="color: Green">% P(:) = ...  % @@ Eqn xx</span>
                <span style="color: Green">% @@GRN Gene Regulatory Network</span>
            <span style="color: Green">% @@GRN Gene Regulatory Network</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                <span style="color: Green">% @@KRN Growth Regulatory Network</span>
            <span style="color: Green">% @@KRN Growth Regulatory Network</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                 <span style="color: Green">% kapar_p(:) = 0;  % @@ Eqn xx</span>
                 <span style="color: Green">% kapar_p(:) = 0;  % @@ Eqn xx</span>
Line 250: Line 237:
                 <span style="color: Green">% kbper_p(:) = 0;  % @@ Eqn xx</span>
                 <span style="color: Green">% kbper_p(:) = 0;  % @@ Eqn xx</span>
                 <span style="color: Green">% knor_p(:)  = 0;  % @@ Eqn xx</span>
                 <span style="color: Green">% knor_p(:)  = 0;  % @@ Eqn xx</span>
                kapar_p(:) = id_a_l .* inh(1,id_b_l); <span style="color: Green">% growth rate</span>
                <span style="color: Magenta"> kapar_p(:) = id_a_l .* inh(1,id_b_l); <span style="color: Green">% growth rate</span>
                 kaper_p(:) = kapar_p; <span style="color: Green">% isotropic growth</span>
                 kaper_p(:) = kapar_p; <span style="color: Green">% isotropic growth</span>
                 kbpar_p(:) = kapar_p; <span style="color: Green">% same on both sides of the sheet</span>
                 kbpar_p(:) = kapar_p; <span style="color: Green">% same on both sides of the sheet</span>
                 kbper_p(:) = kapar_p; <span style="color: Green">% same</span>
                 kbper_p(:) = kapar_p; <span style="color: Green">% same</span></span>
                 knor_p(:)  = 0;      <span style="color: Green">% thickness not growing</span>
                 knor_p(:)  = 0;      <span style="color: Green">% thickness not growing</span>
  <span style="color: CornflowerBlue">Section 11</span>
  <span style="color: CornflowerBlue">% Section 11</span>
            case 'MODEL2'  <span style="color: Green">% @@model MODEL2</span>
        <span style="color: Crimson">case 'WithPolariser</span><span style="color: Green">% @@model MODEL2</span>
                <span style="color: Green">% @@PRN Polariser Regulatory Network</span>
            <span style="color: Green">% @@PRN Polariser Regulatory Network</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                 <span style="color: Green">% P(:) = ...  % @@ Eqn xx</span>
                 <span style="color: Green">% P(:) = ...  % @@ Eqn xx</span>
                <span style="color: Green">% @@GRN Gene Regulatory Network</span>
            <span style="color: Green">% @@GRN Gene Regulatory Network</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                <span style="color: Green">% @@KRN Growth Regulatory Network</span>
            <span style="color: Green">% @@KRN Growth Regulatory Network</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                 <span style="color: Green">% Every equation to be formatted should end with an at-at Eqn N comment.</span>
                 <span style="color: Green">% kapar_p(:) = 0;  % @@ Eqn xx</span>
                 <span style="color: Green">% kapar_p(:) = 0;  % @@ Eqn xx</span>
Line 269: Line 256:
                 <span style="color: Green">% kbper_p(:) = 0;  % @@ Eqn xx</span>
                 <span style="color: Green">% kbper_p(:) = 0;  % @@ Eqn xx</span>
                 <span style="color: Green">% knor_p(:)  = 0;  % @@ Eqn xx</span>
                 <span style="color: Green">% knor_p(:)  = 0;  % @@ Eqn xx</span>
                 kapar_p(:) = id_a_l .* inh(1,id_b_l); <span style="color: Green">% growth rate</span>
                 <span style="color: MediumBlue">kapar_p(:) = id_a_l .* inh(1,id_b_l); <span style="color: Green">% growth rate</span>
                 kaper_p(:) = 0.1*kapar_p; <span style="color: Green">% anisotropic growth</span>
                 kaper_p(:) = 0.1*kapar_p; <span style="color: Green">% anisotropic growth</span>
                 kbpar_p(:) = kapar_p; <span style="color: Green">% same on both sides of the sheet</span>
                 kbpar_p(:) = kapar_p; <span style="color: Green">% same on both sides of the sheet</span>
                 kbper_p(:) = 0.1*kapar_p; <span style="color: Green">% also anisotropic</span>
                 kbper_p(:) = 0.1*kapar_p; </span><span style="color: Green">% also anisotropic</span>
                 knor_p(:)  = 0;      <span style="color: Green">% thickness not growing</span>
                 knor_p(:)  = 0;      <span style="color: Green">% thickness not growing</span>
            otherwise
        otherwise
                <span style="color: Green">% If this happens, maybe you forgot a model.</span>
            <span style="color: Green">% If this happens, maybe you forgot a model.</span>
        end
    end
<span style="color: CornflowerBlue">% Section 12</span>
<span style="color: Green">%%% END OF USER CODE: MORPHOGEN INTERACTIONS</span>
   
   
  <span style="color: CornflowerBlue">Section 12</span>
  <span style="color: Green">%%% SECTION 3: INSTALLING MODIFIED VALUES BACK INTO MESH STRUCTURE</span>
        <span style="color: Green">%%% END OF USER CODE: MORPHOGEN INTERACTIONS</span>
<span style="color: Green">%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.</span>
    m.morphogens(:,polariser_i) = P;
    m.morphogens(:,kapar_i) = kapar_p;
    m.morphogens(:,kaper_i) = kaper_p;
    m.morphogens(:,kbpar_i) = kbpar_p;
    m.morphogens(:,kbper_i) = kbper_p;
    m.morphogens(:,knor_i) = knor_p;
    m.morphogens(:,strainret_i) = strainret_p;
    m.morphogens(:,arrest_i) = arrest_p;
    m.morphogens(:,id_a_i) = id_a_p;
    m.morphogens(:,id_b_i) = id_b_p;
   
   
        <span style="color: Green">%%% SECTION 3: INSTALLING MODIFIED VALUES BACK INTO MESH STRUCTURE</span>
<span style="color: Green">%%% USER CODE: FINALISATION</span>
        <span style="color: Green">%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.</span>
        m.morphogens(:,polariser_i) = P;
        m.morphogens(:,kapar_i) = kapar_p;
        m.morphogens(:,kaper_i) = kaper_p;
        m.morphogens(:,kbpar_i) = kbpar_p;
        m.morphogens(:,kbper_i) = kbper_p;
        m.morphogens(:,knor_i) = knor_p;
        m.morphogens(:,strainret_i) = strainret_p;
        m.morphogens(:,arrest_i) = arrest_p;
        m.morphogens(:,id_plusorg_i) = id_plusorg_p;
        m.morphogens(:,id_negorg_i) = id_negorg_p;
        m.morphogens(:,id_a_i) = id_a_p;
        m.morphogens(:,id_b_i) = id_b_p;
   
   
        <span style="color: Green">%%% USER CODE: FINALISATION</span>
<span style="color: Green">% In this section you may modify the mesh in any way whatsoever.</span>
   
   
        <span style="color: Green">% In this section you may modify the mesh in any way whatsoever.</span>
  <span style="color: CornflowerBlue">% Section 13</span>
    <span style="color: Green">% If needed force FE to subdivide (increase number FE's) here</span>
  <span style="color: CornflowerBlue">Section 13</span>
    <span style="color: Green">% if realtime==280+dt</span>
        <span style="color: Green">% If needed force FE to subdivide (increase number FE's) here</span>
          <span style="color: Green">% m = leaf_subdivide( m, 'morphogen','id_vent',...</span>
        <span style="color: Green">% if realtime==280+dt</span>
          <span style="color: Green">%      'min',0.5,'max',1,...</span>
        <span style="color: Green">% m = leaf_subdivide( m, 'morphogen','id_vent',...</span>
          <span style="color: Green">%      'mode','mid','levels','all');</span>
        <span style="color: Green">%      'min',0.5,'max',1,...</span>
    <span style="color: Green">% end</span>
        <span style="color: Green">%      'mode','mid','levels','all');</span>
<span style="color: Green">% Cut the mesh along the seams (see above)</span>
        <span style="color: Green">% end</span>
    <span style="color: Green">% if m.userdata.CutOpen==1</span>
        <span style="color: Green">% Cut the mesh along the seams (see above)</span>
    <span style="color: Green">%    m=leaf_dissect(m);</span>
        <span style="color: Green">% if m.userdata.CutOpen==1</span>
    <span style="color: Green">%    m.userdata.CutOpen=2;       </span>
        <span style="color: Green">%    m=leaf_dissect(m);</span>
    <span style="color: Green">%    Relax accumulated stresses slowly i.e. 0.95 to 0.999</span>
        <span style="color: Green">%    m.userdata.CutOpen=2;</span>
    <span style="color: Green">%    m = leaf_setproperty( m, 'freezing', 0.999 );</span>
        <span style="color: Green">%    Relax accumulated stresses slowly i.e. 0.95 to 0.999</span>
    <span style="color: Green">% end</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'freezing', 0.999 );</span>
  <span style="color: Green">%%% END OF USER CODE: FINALISATION</span>
        <span style="color: Green">% end</span>
   
        <span style="color: Green">%%% END OF USER CODE: FINALISATION</span>
   
   
    end
end
   
   
   
   
    <span style="color: Green">%%% USER CODE: SUBFUNCTIONS</span>
<span style="color: Green">%%% USER CODE: SUBFUNCTIONS</span>
   
   
  <span style="color: CornflowerBlue">Section 14</span>
  <span style="color: CornflowerBlue">% Section 14</span>
    function m = local_setproperties( m )
function m = local_setproperties( m )
        <span style="color: Green">% This function is called at time zero in the INITIALISATION section of the</span>
<span style="color: Green">% This function is called at time zero in the INITIALISATION section of the</span>
        <span style="color: Green">% interaction function.  It provides commands to set each of the properties</span>
<span style="color: Green">% interaction function.  It provides commands to set each of the properties</span>
        <span style="color: Green">% that are contained in m.globalProps.  Uncomment whichever ones you would</span>
<span style="color: Green">% that are contained in m.globalProps.  Uncomment whichever ones you would</span>
        <span style="color: Green">% like to set yourself, and put in whatever value you want.</span>
<span style="color: Green">% like to set yourself, and put in whatever value you want.</span>
        <span style="color: Green">%</span>
<span style="color: Green">%</span>
        <span style="color: Green">% Some of these properties are for internal use only and should never be</span>
<span style="color: Green">% Some of these properties are for internal use only and should never be</span>
        <span style="color: Green">% set by the user.  At some point these will be moved into a different</span>
<span style="color: Green">% set by the user.  At some point these will be moved into a different</span>
        <span style="color: Green">% component of m, but for the present, just don't change anything unless</span>
<span style="color: Green">% component of m, but for the present, just don't change anything unless</span>
        <span style="color: Green">% you know what it is you're changing.</span>
<span style="color: Green">% you know what it is you're changing.</span>
   
   
        <span style="color: Green">%    m = leaf_setproperty( m, 'trinodesvalid', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'trinodesvalid', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'prismnodesvalid', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'prismnodesvalid', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'thicknessRelative', 0.020000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'thicknessRelative', 0.020000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'thicknessArea', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'thicknessArea', 0.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'thicknessMode', 'physical' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'thicknessMode', 'physical' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'activeGrowth', 1.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'activeGrowth', 1.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'displayedGrowth', 1.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'displayedGrowth', 1.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'displayedMulti', [] );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'displayedMulti', [] );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'allowNegativeGrowth', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowNegativeGrowth', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'usePrevDispAsEstimate', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'usePrevDispAsEstimate', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'perturbInitGrowthEstimate', 0.000010 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'perturbInitGrowthEstimate', 0.000010 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'perturbRelGrowthEstimate', 0.010000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'perturbRelGrowthEstimate', 0.010000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'perturbDiffusionEstimate', 0.000100 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'perturbDiffusionEstimate', 0.000100 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'resetRand', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'resetRand', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'mingradient', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'mingradient', 0.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'relativepolgrad', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'relativepolgrad', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'usefrozengradient', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'usefrozengradient', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'userpolarisation', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'userpolarisation', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'thresholdsq', 0.000841 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'thresholdsq', 0.000841 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'splitmargin', 1.400000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'splitmargin', 1.400000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'splitmorphogen', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'splitmorphogen', '' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'thresholdmgen', 0.500000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'thresholdmgen', 0.500000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'bulkmodulus', 1.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bulkmodulus', 1.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'unitbulkmodulus', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'unitbulkmodulus', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'poissonsRatio', 0.300000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'poissonsRatio', 0.300000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'starttime', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'starttime', 0.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'timestep', 0.010000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'timestep', 0.010000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'timeunitname', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'timeunitname', '' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'distunitname', 'mm' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'distunitname', 'mm' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'scalebarvalue', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'scalebarvalue', 0.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'validateMesh', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'validateMesh', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'rectifyverticals', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'rectifyverticals', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'allowSplitLongFEM', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowSplitLongFEM', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'longSplitThresholdPower', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'longSplitThresholdPower', 0.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'allowSplitBentFEM', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowSplitBentFEM', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'allowSplitBio', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowSplitBio', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'allowFlipEdges', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowFlipEdges', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'allowElideEdges', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowElideEdges', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'mincellangle', 0.200000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'mincellangle', 0.200000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'alwaysFlat', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'alwaysFlat', 0.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'flattenforceconvex', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'flattenforceconvex', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'flatten', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'flatten', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'flattenratio', 1.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'flattenratio', 1.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'useGrowthTensors', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'useGrowthTensors', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'plasticGrowth', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'plasticGrowth', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'totalinternalrotation', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'totalinternalrotation', 0.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'stepinternalrotation', 2.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'stepinternalrotation', 2.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'showinternalrotation', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'showinternalrotation', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'performinternalrotation', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'performinternalrotation', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'internallyrotated', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'internallyrotated', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'maxFEcells', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'maxFEcells', 0 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'inittotalcells', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'inittotalcells', 0 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'bioApresplitproc', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bioApresplitproc', '' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'bioApostsplitproc', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bioApostsplitproc', '' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'maxBioAcells', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'maxBioAcells', 0 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'maxBioBcells', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'maxBioBcells', 0 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'colors', (6 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'colors', (6 values) );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'colorvariation', 0.050000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'colorvariation', 0.050000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'colorparams', (12 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'colorparams', (12 values) );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'freezing', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'freezing', 0.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'canceldrift', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'canceldrift', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'mgen_interaction', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'mgen_interaction', '' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'mgen_interactionName', 'gpt_tut_interaction_20110530' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'mgen_interactionName', 'gpt_tut_interaction_example_20110601' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'allowInteraction', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowInteraction', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'interactionValid', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'interactionValid', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'gaussInfo', (unknown type ''struct'') );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'gaussInfo', (unknown type ''struct'') );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'stitchDFs', [] );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'stitchDFs', [] );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'D', (36 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'D', (36 values) );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'C', (36 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'C', (36 values) );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'G', (6 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'G', (6 values) );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'solver', 'cgs' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'solver', 'cgs' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'solverprecision', 'double' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'solverprecision', 'double' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'solvertolerance', 0.001000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'solvertolerance', 0.001000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'solvertolerancemethod', 'norm' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'solvertolerancemethod', 'norm' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'diffusiontolerance', 0.000010 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'diffusiontolerance', 0.000010 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'allowsparse', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowsparse', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'maxIters', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'maxIters', 0 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'maxsolvetime', 1000.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'maxsolvetime', 1000.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'cgiters', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'cgiters', 0 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'simsteps', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'simsteps', 0 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'stepsperrender', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'stepsperrender', 0 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'growthEnabled', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'growthEnabled', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'diffusionEnabled', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'diffusionEnabled', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'flashmovie', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'flashmovie', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'makemovie', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'makemovie', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'moviefile', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'moviefile', '' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'codec', 'None' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'codec', 'None' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'autonamemovie', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'autonamemovie', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'overwritemovie', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'overwritemovie', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'framesize', [] );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'framesize', [] );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'mov', [] );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'mov', [] );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'jiggleProportion', 1.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'jiggleProportion', 1.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'cvtperiter', 0.200000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'cvtperiter', 0.200000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'boingNeeded', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'boingNeeded', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'initialArea', 0.031326 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'initialArea', 0.031326 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'bendunitlength', 0.176992 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bendunitlength', 0.176992 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'targetRelArea', 1.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'targetRelArea', 1.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'defaultinterp', 'min' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'defaultinterp', 'min' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'readonly', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'readonly', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'projectdir', 'D:\ab\Matlab stuff' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'projectdir', 'D:\ab\Matlab stuff' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'modelname', 'GPT_tut_interaction_20110530' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'modelname', 'GPT_tut_interaction_example_20110601' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'allowsave', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowsave', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'addedToPath', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'addedToPath', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'bendsplit', 0.300000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bendsplit', 0.300000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'usepolfreezebc', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'usepolfreezebc', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'dorsaltop', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'dorsaltop', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'defaultazimuth', -45.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'defaultazimuth', -45.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'defaultelevation', 33.750000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'defaultelevation', 33.750000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'defaultroll', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'defaultroll', 0.000000 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'defaultViewParams', (unknown type ''struct'') );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'defaultViewParams', (unknown type ''struct'') );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'comment', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'comment', '' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'legendTemplate', '%T: %q\n%m' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'legendTemplate', '%T: %q\n%m' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'bioAsplitcells', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bioAsplitcells', true );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'bioApullin', 0.142857 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bioApullin', 0.142857 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'bioAfakepull', 0.202073 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bioAfakepull', 0.202073 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'interactive', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'interactive', false );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'coderevision', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'coderevision', 0 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'coderevisiondate', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'coderevisiondate', '' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'modelrevision', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'modelrevision', 0 );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'modelrevisiondate', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'modelrevisiondate', '' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'savedrunname', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'savedrunname', '' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'savedrundesc', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'savedrundesc', '' );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'vxgrad', (108 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'vxgrad', (108 values) );</span>
        <span style="color: Green">%    m = leaf_setproperty( m, 'lengthscale', 0.200000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'lengthscale', 0.200000 );</span>
    end
end
   
   
  <span style="color: CornflowerBlue">Section 15</span>
  <span style="color: CornflowerBlue">% Section 15</span>
    <span style="color: Green">% Here you may write any functions of your own, that you want to call from</span>
<span style="color: Green">% Here you may write any functions of your own, that you want to call from</span>
    <span style="color: Green">% the interaction function, but never need to call from outside it.</span>
<span style="color: Green">% the interaction function, but never need to call from outside it.</span>
    <span style="color: Green">% Remember that they do not have access to any variables except those</span>
<span style="color: Green">% Remember that they do not have access to any variables except those</span>
    <span style="color: Green">% that you pass as parameters, and cannot change anything except by</span>
<span style="color: Green">% that you pass as parameters, and cannot change anything except by</span>
    <span style="color: Green">% returning new values as results.</span>
<span style="color: Green">% returning new values as results.</span>
    <span style="color: Green">% Whichever section they are called from, they must respect the same</span>
<span style="color: Green">% Whichever section they are called from, they must respect the same</span>
    <span style="color: Green">% restrictions on what modifications they are allowed to make to the mesh.</span>
<span style="color: Green">% restrictions on what modifications they are allowed to make to the mesh.</span>
   
   
    <span style="color: Green">% For example:</span>
<span style="color: Green">% For example:</span>
   
   
  <span style="color: CornflowerBlue">Section 16</span>
  <span style="color: CornflowerBlue">% Section 16</span>
    <span style="color: Green">% function m = do_something( m )</span>
<span style="color: Green">% function m = do_something( m )</span>
    <span style="color: Green">%  % Change m in some way.</span>
<span style="color: Green">%  % Change m in some way.</span>
    <span style="color: Green">% end</span>
<span style="color: Green">% end</span>
   
   
    <span style="color: Green">% Call it from the main body of the interaction function like this:</span>
<span style="color: Green">% Call it from the main body of the interaction function like this:</span>
    <span style="color: Green">%      m = do_something( m );</span>
<span style="color: Green">%      m = do_something( m );</span>

Latest revision as of 21:11, 2 June 2011

Back to tutoral on the interaction function details.

The green comments have not been removed in this copy - to allow you to see the context in which the new code has been placed. If you copy this function we recommend removing all the comments that you no longer need to see.

There are two submodels. The two are the same except that the first has isotropic growth (see lines shown in magenta) and the second has anisotropic growth (see lines shown in MediumBlue). The choice of submodel (1 or 2) is made on the line highlighted in RED.

% Section 1
function m = gpt_tut_interaction_example_20110601( m )
%m = gpt_tut_interaction_example_20110601( m )
%   Morphogen interaction function.
%   Written at 2011-06-02 14:55:46.
%   GFtbox revision 3554, 2011-06-02 12:30:52.789869.

% The user may edit any part of this function between delimiters
% of the form "USER CODE..." and "END OF USER CODE...".  The
% delimiters themselves must not be moved, edited, deleted, or added.

    if isempty(m), return; end

    fprintf( 1, '%s found in %s\n', mfilename(), which(mfilename()) );

    try
        m = local_setproperties( m );
    catch
    end

    realtime = m.globalDynamicProps.currenttime;

% Section 2
%%% USER CODE: INITIALISATION

% In this section you may modify the mesh in any way whatsoever.
    if (Steps(m)==0) && m.globalDynamicProps.doinit % First iteration
        % Zero out a lot of stuff to create a blank slate.  
        % If no morphogens are set in the GUI it may be useful to
        % zero some arrays by uncommenting the following.
        % m.morphogens(:) = 0;
        % m.morphogenclamp(:) = 0;
        % m.mgen_production(:) = 0;
        % m.mgen_absorption(:) = 0;
        % m.seams(:) = false;
        % m.mgen_dilution(:) = false;

        % Set up names for variant models.  Useful for running multiple models on a cluster.
        m.userdata.ranges.modelname.range = { 'NoPolariser', 'WithPolariser' };  % CLUSTER
        m.userdata.ranges.modelname.index = 2;                       % CLUSTER
    end
    modelname = m.userdata.ranges.modelname.range{m.userdata.ranges.modelname.index};  % CLUSTER
    disp(sprintf('\nRunning %s model %s\n',mfilename, modelname));
    	
    % More examples of code for all iterations.

    % Set priorities for simultaneous plotting of multiple morphogens, if desired.
    % m = leaf_mgen_plotpriority( m, {'MGEN1', 'MGEN2'}, [1,2], [0.5,0.75] );

    % Set colour of polariser gradient arrows.
    % m = leaf_plotoptions(m,'highgradcolor',[0,0,0],'lowgradcolor',[1,0,0]);

    % setup a multiplot of the following morphogens
    % m = leaf_plotoptions( m, 'morphogen', {'V_PROFILE1','V_PROFILE2','KAPAR','S_LEFTRIGHT'});

    % to plot polariser on the A side and resultant areal growth rate on the B side:
    % m = leaf_plotoptions( m, 'morphogenA', 'POLARISER', ...
    %                      'outputquantityB', 'resultantgrowthrate', ...
    %                      'outputaxesB', 'areal' );

    % monitor properties of vertices must be done here - so that it reports newly equilibrated levels
    % m=leaf_profile_monitor(m,... % essential
    %         'REGIONLABELS',{'V_PROFILE1','V_PROFILE2'},... % essential
    %         'MORPHOGENS',{'S_LEFTRIGHT','S_CENTRE'},... % optional  (one element per REGIONLABEL)
    %         'VERTLABELS',false,'FigNum',1,'EXCEL',true,'MODELNAME',modelname); % optional (file in snapshots directory')
%%% END OF USER CODE: INITIALISATION

% Section 3
%%% SECTION 1: ACCESSING MORPHOGENS AND TIME.
%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.

    if isempty(m), return; end

    setGlobals();
    global gNEW_KA_PAR gNEW_KA_PER gNEW_KB_PAR gNEW_KB_PER
    global gNEW_K_NOR gNEW_POLARISER gNEW_STRAINRET gNEW_ARREST
    dt = m.globalProps.timestep;
    polariser_i = gNEW_POLARISER;
    P = m.morphogens(:,polariser_i);
    [kapar_i,kapar_p,kapar_a,kapar_l] = getMgenLevels( m, 'KAPAR' );
    [kaper_i,kaper_p,kaper_a,kaper_l] = getMgenLevels( m, 'KAPER' );
    [kbpar_i,kbpar_p,kbpar_a,kbpar_l] = getMgenLevels( m, 'KBPAR' );
    [kbper_i,kbper_p,kbper_a,kbper_l] = getMgenLevels( m, 'KBPER' );
    [knor_i,knor_p,knor_a,knor_l] = getMgenLevels( m, 'KNOR' );
    [strainret_i,strainret_p,strainret_a,strainret_l] = getMgenLevels( m, 'STRAINRET' );
    [arrest_i,arrest_p,arrest_a,arrest_l] = getMgenLevels( m, 'ARREST' );
    [id_a_i,id_a_p,id_a_a,id_a_l] = getMgenLevels( m, 'ID_A' );
    [id_b_i,id_b_p,id_b_a,id_b_l] = getMgenLevels( m, 'ID_B' );

% Mesh type: circle
%          centre: 0
%       circumpts: 48
%       coneangle: 0
%         dealign: 0
%          height: 0
%        innerpts: 0
%      randomness: 0.1
%           rings: 6
%         version: 1
%          xwidth: 0.2
%          ywidth: 0.2

%            Morphogen   Diffusion   Decay   Dilution   Mutant
%            -------------------------------------------------
%                KAPAR        ----    ----       ----     ----
%                KAPER        ----    ----       ----     ----
%                KBPAR        ----    ----       ----     ----
%                KBPER        ----    ----       ----     ----
%                 KNOR        ----    ----       ----     ----
%            POLARISER        0.01     0.1       ----     ----
%            STRAINRET        ----    ----       ----     ----
%               ARREST        ----    ----       ----     ----
%                 ID_A        ----    ----       ----     ----
%                 ID_B        ----    ----       ----     ----


%%% USER CODE: MORPHOGEN INTERACTIONS

% In this section you may modify the mesh in any way that does not
% Section 4
% alter the set of nodes.

    if (Steps(m)==0) && m.globalDynamicProps.doinit  % Initialisation code.
        % Put any code here that should only be performed at the start of
        % the simulation, for example, to set up initial morphogen values.
        
        % m.nodes is the set of vertex positions, an N by 3 array if there
        % are N vertices.  Row number K contains the X, Y, and Z
        % coordinates of the Kth vertex. To obtain a list of the X
        % coordinates of every vertex, write m.nodes(:,1).  The Y
        % coordinates are given by m.nodes(:,2) and the Z coordinates by
        % m.nodes(:,3).

        % Set up a morphogen promoter (_p suffix) region where x values are minimum
        % id_prox_p(m.nodes(:,1)==min(m.nodes(:,1)))=1;
        % if the morphogen level (_l suffix) is to be used in this iteration 
        % set the level using the morphogen activity (_a suffix).
        % id_prox_l=id_prox_p * id_prox_a; % when a mutation is specified in the GUI 
        % the activity (_a) is set to zero

        id_a_p(m.nodes(:,1)<-0.03)=1; % setup region for A where identity factor A is represented by id_a_p
        id_b_p(m.nodes(:,2)<-0.01)=1; % setup region for B
        
        % One way to set up a morphogen gradient is by ...
        % Setting up a gradient by clamping the ends (execute only once)
        P((m.nodes(:,1)<-0.05)&(m.nodes(:,2)>0.03))=1;
        m.morphogenclamp( P==1, polariser_i ) = 1;
        m = leaf_mgen_conductivity( m, 'POLARISER', 0.001 );  %specifies the diffusion rate of polariser
        m = leaf_mgen_absorption( m, 'POLARISER', 0.1 );     % specifies degradation rate of polariser

        % Fixing vertices, i.e. fix z for the base to prevent base from moving up or down
        % m=leaf_fix_vertex(m,'vertex',find(id_prox_p==1),'dfs','z');

        % To cut the mesh, set a temporary morphogen to 1 in places to cut
        % seams=zeros(size(P));
        % seams(indexes to places to cut)=1;
        % m=leaf_set_seams(m,seams);

    end
    
% Section 5
    % Second way to generate a gradient
    % generating (+) and sinking (-) a diffusing signal (in this case polariser)
    % m.mgen_production( :, polariser_i ) = + 5*s_spur_p - P .* id_dist_p;

    % Monitor growth by scattering discs that deform over time (c.f. inducing biological clones)
    % (CARE - if the canvas is flat ensure that Plot:Hide Thickness is true, 
    % because a quirk of the Matlab z-buffer means that they can get hidden by mistake)
    %    if (340>realtime-dt) && (340<realtime+dt) % discs to be added at realtime==340
    %        m = leaf_makesecondlayer( m, ...  % This function adds discs that represent transformed cells.
    %            'mode', 'each', ...  % Make discs randomly scattered over the canvas.
    %            'relarea', 1/16000, ...   % Each discs has area was 1/16000 of the initial area of the canvas.
    %            'probpervx', 'V_FLOWER', ... % induce discs over whole canvas (V_FLOWER is 1 over whole canvas)
    %            'numcells',4500,...%number of discs (that will become ellipses)
    %            'sides', 6, ...  % Each discs is approximated as a 6-sided regular polygon.
    %            'colors', [0.5 0.5 0.5], ...  % Default colour is gray but
    %            'colorvariation',1,... % Each disc is a random colour
    %            'add', true );  % These discs are added to any discs existing already
    %    end
    
% Section 6
    % Directives for creating latex representation directly from Matlab code
    % not fully implemented yet but will use @@ directives
    % @@at t
    % @@before t
    % @@after t
    % @@between t1 t2

% Section 7
%     % If you want to define different phases according to the absolute
%     % time, create a morphogen for each phase and modulate 
%     % expressions using the morphogen
%     % like.  For example:
%     if (realtime < 10)  % first growth phase
%         f_firstgrowth_p = 1;
%     else
%         f_firstgrowth_p = 0;
%     end
%     if (realtime >= 10) % second growth phase
%         f_secondgrowth_p = 1;
%     else
%         f_secondgrowth_p = 0;
%     end
%
%     % If you want one morphogen to affect others only during a certain
%     % phase, write something like:
%
%     mgen_a_p = f_firstgrowth_p .* (various terms); % will zero except in firstgrowth

% Section 8
    % Code common to all models.
    % @@PRN Polariser Regulatory Network
        % Every equation to be formatted should end with an at-at Eqn N comment.
    % @@GRN Gene Regulatory Network
        % Every equation to be formatted should end with an at-at Eqn N comment.
    % @@KRN Growth Regulatory Network
        % Every equation to be formatted should end with an at-at Eqn N comment.

% Section 9
    % Code for specific models.
    switch modelname
% Section 10
        case 'NoPolariser'  % @@model MODEL1
            % @@PRN Polariser Regulatory Network
                % Every equation to be formatted should end with an at-at Eqn N comment.
                % P(:) = ...  % @@ Eqn xx
            % @@GRN Gene Regulatory Network
                % Every equation to be formatted should end with an at-at Eqn N comment.
            % @@KRN Growth Regulatory Network
                % Every equation to be formatted should end with an at-at Eqn N comment.
                % kapar_p(:) = 0;  % @@ Eqn xx
                % kaper_p(:) = 0;  % @@ Eqn xx
                % kbpar_p(:) = 0;  % @@ Eqn xx
                % kbper_p(:) = 0;  % @@ Eqn xx
                % knor_p(:)  = 0;  % @@ Eqn xx
                kapar_p(:) = id_a_l .* inh(1,id_b_l); % growth rate
                kaper_p(:) = kapar_p; % isotropic growth
                kbpar_p(:) = kapar_p; % same on both sides of the sheet
                kbper_p(:) = kapar_p; % same
                knor_p(:)  = 0;       % thickness not growing
% Section 11
        case 'WithPolariser'  % @@model MODEL2
            % @@PRN Polariser Regulatory Network
                % Every equation to be formatted should end with an at-at Eqn N comment.
                % P(:) = ...  % @@ Eqn xx
            % @@GRN Gene Regulatory Network
                % Every equation to be formatted should end with an at-at Eqn N comment.
            % @@KRN Growth Regulatory Network
                % Every equation to be formatted should end with an at-at Eqn N comment.
                % kapar_p(:) = 0;  % @@ Eqn xx
                % kaper_p(:) = 0;  % @@ Eqn xx
                % kbpar_p(:) = 0;  % @@ Eqn xx
                % kbper_p(:) = 0;  % @@ Eqn xx
                % knor_p(:)  = 0;  % @@ Eqn xx
                kapar_p(:) = id_a_l .* inh(1,id_b_l); % growth rate
                kaper_p(:) = 0.1*kapar_p; % anisotropic growth
                kbpar_p(:) = kapar_p; % same on both sides of the sheet
                kbper_p(:) = 0.1*kapar_p; % also anisotropic
                knor_p(:)  = 0;       % thickness not growing
        otherwise
            % If this happens, maybe you forgot a model.
    end
% Section 12
%%% END OF USER CODE: MORPHOGEN INTERACTIONS

%%% SECTION 3: INSTALLING MODIFIED VALUES BACK INTO MESH STRUCTURE
%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.
    m.morphogens(:,polariser_i) = P;
    m.morphogens(:,kapar_i) = kapar_p;
    m.morphogens(:,kaper_i) = kaper_p;
    m.morphogens(:,kbpar_i) = kbpar_p;
    m.morphogens(:,kbper_i) = kbper_p;
    m.morphogens(:,knor_i) = knor_p;
    m.morphogens(:,strainret_i) = strainret_p;
    m.morphogens(:,arrest_i) = arrest_p;
    m.morphogens(:,id_a_i) = id_a_p;
    m.morphogens(:,id_b_i) = id_b_p;

%%% USER CODE: FINALISATION

% In this section you may modify the mesh in any way whatsoever.

% Section 13
    % If needed force FE to subdivide (increase number FE's) here
    % if realtime==280+dt
         % m = leaf_subdivide( m, 'morphogen','id_vent',...
         %       'min',0.5,'max',1,...
         %       'mode','mid','levels','all');
    % end
% Cut the mesh along the seams (see above)
    % if m.userdata.CutOpen==1
    %    m=leaf_dissect(m);
    %    m.userdata.CutOpen=2;        
    %    Relax accumulated stresses slowly i.e. 0.95 to 0.999
    %    m = leaf_setproperty( m, 'freezing', 0.999 );
    % end
%%% END OF USER CODE: FINALISATION

end


%%% USER CODE: SUBFUNCTIONS

% Section 14
function m = local_setproperties( m )
% This function is called at time zero in the INITIALISATION section of the
% interaction function.  It provides commands to set each of the properties
% that are contained in m.globalProps.  Uncomment whichever ones you would
% like to set yourself, and put in whatever value you want.
%
% Some of these properties are for internal use only and should never be
% set by the user.  At some point these will be moved into a different
% component of m, but for the present, just don't change anything unless
% you know what it is you're changing.

%    m = leaf_setproperty( m, 'trinodesvalid', true );
%    m = leaf_setproperty( m, 'prismnodesvalid', true );
%    m = leaf_setproperty( m, 'thicknessRelative', 0.020000 );
%    m = leaf_setproperty( m, 'thicknessArea', 0.000000 );
%    m = leaf_setproperty( m, 'thicknessMode', 'physical' );
%    m = leaf_setproperty( m, 'activeGrowth', 1.000000 );
%    m = leaf_setproperty( m, 'displayedGrowth', 1.000000 );
%    m = leaf_setproperty( m, 'displayedMulti', [] );
%    m = leaf_setproperty( m, 'allowNegativeGrowth', true );
%    m = leaf_setproperty( m, 'usePrevDispAsEstimate', true );
%    m = leaf_setproperty( m, 'perturbInitGrowthEstimate', 0.000010 );
%    m = leaf_setproperty( m, 'perturbRelGrowthEstimate', 0.010000 );
%    m = leaf_setproperty( m, 'perturbDiffusionEstimate', 0.000100 );
%    m = leaf_setproperty( m, 'resetRand', false );
%    m = leaf_setproperty( m, 'mingradient', 0.000000 );
%    m = leaf_setproperty( m, 'relativepolgrad', false );
%    m = leaf_setproperty( m, 'usefrozengradient', true );
%    m = leaf_setproperty( m, 'userpolarisation', false );
%    m = leaf_setproperty( m, 'thresholdsq', 0.000841 );
%    m = leaf_setproperty( m, 'splitmargin', 1.400000 );
%    m = leaf_setproperty( m, 'splitmorphogen',  );
%    m = leaf_setproperty( m, 'thresholdmgen', 0.500000 );
%    m = leaf_setproperty( m, 'bulkmodulus', 1.000000 );
%    m = leaf_setproperty( m, 'unitbulkmodulus', true );
%    m = leaf_setproperty( m, 'poissonsRatio', 0.300000 );
%    m = leaf_setproperty( m, 'starttime', 0.000000 );
%    m = leaf_setproperty( m, 'timestep', 0.010000 );
%    m = leaf_setproperty( m, 'timeunitname',  );
%    m = leaf_setproperty( m, 'distunitname', 'mm' );
%    m = leaf_setproperty( m, 'scalebarvalue', 0.000000 );
%    m = leaf_setproperty( m, 'validateMesh', true );
%    m = leaf_setproperty( m, 'rectifyverticals', false );
%    m = leaf_setproperty( m, 'allowSplitLongFEM', true );
%    m = leaf_setproperty( m, 'longSplitThresholdPower', 0.000000 );
%    m = leaf_setproperty( m, 'allowSplitBentFEM', false );
%    m = leaf_setproperty( m, 'allowSplitBio', true );
%    m = leaf_setproperty( m, 'allowFlipEdges', false );
%    m = leaf_setproperty( m, 'allowElideEdges', true );
%    m = leaf_setproperty( m, 'mincellangle', 0.200000 );
%    m = leaf_setproperty( m, 'alwaysFlat', 0.000000 );
%    m = leaf_setproperty( m, 'flattenforceconvex', true );
%    m = leaf_setproperty( m, 'flatten', false );
%    m = leaf_setproperty( m, 'flattenratio', 1.000000 );
%    m = leaf_setproperty( m, 'useGrowthTensors', false );
%    m = leaf_setproperty( m, 'plasticGrowth', false );
%    m = leaf_setproperty( m, 'totalinternalrotation', 0.000000 );
%    m = leaf_setproperty( m, 'stepinternalrotation', 2.000000 );
%    m = leaf_setproperty( m, 'showinternalrotation', false );
%    m = leaf_setproperty( m, 'performinternalrotation', false );
%    m = leaf_setproperty( m, 'internallyrotated', false );
%    m = leaf_setproperty( m, 'maxFEcells', 0 );
%    m = leaf_setproperty( m, 'inittotalcells', 0 );
%    m = leaf_setproperty( m, 'bioApresplitproc',  );
%    m = leaf_setproperty( m, 'bioApostsplitproc',  );
%    m = leaf_setproperty( m, 'maxBioAcells', 0 );
%    m = leaf_setproperty( m, 'maxBioBcells', 0 );
%    m = leaf_setproperty( m, 'colors', (6 values) );
%    m = leaf_setproperty( m, 'colorvariation', 0.050000 );
%    m = leaf_setproperty( m, 'colorparams', (12 values) );
%    m = leaf_setproperty( m, 'freezing', 0.000000 );
%    m = leaf_setproperty( m, 'canceldrift', false );
%    m = leaf_setproperty( m, 'mgen_interaction',  );
%    m = leaf_setproperty( m, 'mgen_interactionName', 'gpt_tut_interaction_example_20110601' );
%    m = leaf_setproperty( m, 'allowInteraction', true );
%    m = leaf_setproperty( m, 'interactionValid', true );
%    m = leaf_setproperty( m, 'gaussInfo', (unknown type struct) );
%    m = leaf_setproperty( m, 'stitchDFs', [] );
%    m = leaf_setproperty( m, 'D', (36 values) );
%    m = leaf_setproperty( m, 'C', (36 values) );
%    m = leaf_setproperty( m, 'G', (6 values) );
%    m = leaf_setproperty( m, 'solver', 'cgs' );
%    m = leaf_setproperty( m, 'solverprecision', 'double' );
%    m = leaf_setproperty( m, 'solvertolerance', 0.001000 );
%    m = leaf_setproperty( m, 'solvertolerancemethod', 'norm' );
%    m = leaf_setproperty( m, 'diffusiontolerance', 0.000010 );
%    m = leaf_setproperty( m, 'allowsparse', true );
%    m = leaf_setproperty( m, 'maxIters', 0 );
%    m = leaf_setproperty( m, 'maxsolvetime', 1000.000000 );
%    m = leaf_setproperty( m, 'cgiters', 0 );
%    m = leaf_setproperty( m, 'simsteps', 0 );
%    m = leaf_setproperty( m, 'stepsperrender', 0 );
%    m = leaf_setproperty( m, 'growthEnabled', true );
%    m = leaf_setproperty( m, 'diffusionEnabled', true );
%    m = leaf_setproperty( m, 'flashmovie', false );
%    m = leaf_setproperty( m, 'makemovie', false );
%    m = leaf_setproperty( m, 'moviefile',  );
%    m = leaf_setproperty( m, 'codec', 'None' );
%    m = leaf_setproperty( m, 'autonamemovie', true );
%    m = leaf_setproperty( m, 'overwritemovie', false );
%    m = leaf_setproperty( m, 'framesize', [] );
%    m = leaf_setproperty( m, 'mov', [] );
%    m = leaf_setproperty( m, 'jiggleProportion', 1.000000 );
%    m = leaf_setproperty( m, 'cvtperiter', 0.200000 );
%    m = leaf_setproperty( m, 'boingNeeded', false );
%    m = leaf_setproperty( m, 'initialArea', 0.031326 );
%    m = leaf_setproperty( m, 'bendunitlength', 0.176992 );
%    m = leaf_setproperty( m, 'targetRelArea', 1.000000 );
%    m = leaf_setproperty( m, 'defaultinterp', 'min' );
%    m = leaf_setproperty( m, 'readonly', false );
%    m = leaf_setproperty( m, 'projectdir', 'D:\ab\Matlab stuff' );
%    m = leaf_setproperty( m, 'modelname', 'GPT_tut_interaction_example_20110601' );
%    m = leaf_setproperty( m, 'allowsave', true );
%    m = leaf_setproperty( m, 'addedToPath', false );
%    m = leaf_setproperty( m, 'bendsplit', 0.300000 );
%    m = leaf_setproperty( m, 'usepolfreezebc', false );
%    m = leaf_setproperty( m, 'dorsaltop', true );
%    m = leaf_setproperty( m, 'defaultazimuth', -45.000000 );
%    m = leaf_setproperty( m, 'defaultelevation', 33.750000 );
%    m = leaf_setproperty( m, 'defaultroll', 0.000000 );
%    m = leaf_setproperty( m, 'defaultViewParams', (unknown type struct) );
%    m = leaf_setproperty( m, 'comment',  );
%    m = leaf_setproperty( m, 'legendTemplate', '%T: %q\n%m' );
%    m = leaf_setproperty( m, 'bioAsplitcells', true );
%    m = leaf_setproperty( m, 'bioApullin', 0.142857 );
%    m = leaf_setproperty( m, 'bioAfakepull', 0.202073 );
%    m = leaf_setproperty( m, 'interactive', false );
%    m = leaf_setproperty( m, 'coderevision', 0 );
%    m = leaf_setproperty( m, 'coderevisiondate',  );
%    m = leaf_setproperty( m, 'modelrevision', 0 );
%    m = leaf_setproperty( m, 'modelrevisiondate',  );
%    m = leaf_setproperty( m, 'savedrunname',  );
%    m = leaf_setproperty( m, 'savedrundesc',  );
%    m = leaf_setproperty( m, 'vxgrad', (108 values) );
%    m = leaf_setproperty( m, 'lengthscale', 0.200000 );
end

% Section 15
% Here you may write any functions of your own, that you want to call from
% the interaction function, but never need to call from outside it.
% Remember that they do not have access to any variables except those
% that you pass as parameters, and cannot change anything except by
% returning new values as results.
% Whichever section they are called from, they must respect the same
% restrictions on what modifications they are allowed to make to the mesh.

% For example:

% Section 16
% function m = do_something( m )
%   % Change m in some way.
% end

% Call it from the main body of the interaction function like this:
%       m = do_something( m );