Difference between revisions of "GPT tut interaction 20110530 on creating"

From BanghamLab
Jump to navigation Jump to search
(Created page with 'function m = gpt_tut_interaction_20110530( m ) %m = gpt_tut_interaction_20110530( m ) % Morphogen interaction function. % Written at 2011-05-30 09:42:07. % GFtbox revision …')
 
Line 1: Line 1:
function m = gpt_tut_interaction_20110530( m )
+
<span style="color: CornflowerBlue">'''This file is output automatically on clicking Panel: Edit in a newly saved project. '''<br>
%m = gpt_tut_interaction_20110530( m )
+
Once the file has been edited save it in the usual way from the Matlab editor.  The project as whole can be saved under a different name using Panel: Save as. This will automatically create a new copy of the current interaction function, but with the new name and in the new project directory.<br><br>
%  Morphogen interaction function.
+
The code has been divided into Sections to help with the tutorial.<br><br>
%  Written at 2011-05-30 09:42:07.
+
'''Section 1 Automatic'''</span>
%  GFtbox revision 0, .
+
    function m = gpt_tut_interaction_20110530( m )
 +
    %m = gpt_tut_interaction_20110530( m )
 +
    %  Morphogen interaction function.
 +
    %  Written at 2011-05-30 09:42:07.
 +
    %  GFtbox revision 0, .
 +
    % 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;
 +
    %%% USER CODE: INITIALISATION
 +
<span style="color: CornflowerBlue">'''Section 2'''</span>
  
% The user may edit any part of this function between delimiters
+
    % In this section you may modify the mesh in any way whatsoever.
% of the form "USER CODE..." and "END OF USER CODE...". The
+
        if (Steps(m)==0) && m.globalDynamicProps.doinit % First iteration
% delimiters themselves must not be moved, edited, deleted, or added.
+
            % 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 = { 'MODEL1', 'MODEL2' };  % CLUSTER
 +
            m.userdata.ranges.modelname.index = 1;                      % CLUSTER
 +
        end
 +
        modelname = m.userdata.ranges.modelname.range{m.userdata.ranges.modelname.index};  % CLUSTER
 +
        disp(sprintf('\nRunning %s model %s\n',mfilename, modelname));
 +
        switch modelname
 +
            case 'MODEL1'
 +
                % Set up the parameters (e.g. mutations) for this model here.
 +
            case 'MODEL2'
 +
                % Set up the parameters (e.g. mutations) for this model here.
 +
            otherwise
 +
                % If you reach here, you probably forgot a case.
 +
        end
 +
        % 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
 +
<span style="color: CornflowerBlue">'''Section 3 Automatic'''</span>
 +
    %%% SECTION 1: ACCESSING MORPHOGENS AND TIME.
 +
    %%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.
  
    if isempty(m), return; end
+
        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_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' );
 +
    % 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        ----    ----      ----    ----
 +
    %            STRAINRET        ----    ----      ----    ----
 +
    %              ARREST        ----    ----      ----    ----
 +
    %          ID_PLUSORG        ----    ----      ----    ----
 +
    %            ID_NEGORG        ----    ----      ----    ----
 +
    %                ID_A        ----    ----      ----    ----
 +
    %                ID_B        ----    ----      ----    ----
  
     fprintf( 1, '%s found in %s\n', mfilename(), which(mfilename()) );
+
     %%% USER CODE: MORPHOGEN INTERACTIONS
  
     try
+
     % In this section you may modify the mesh in any way that does not
        m = local_setproperties( m );
+
     % alter the set of nodes.
    catch
+
<span style="color: CornflowerBlue">'''Section 4'''</span>
    end
 
 
 
    realtime = m.globalDynamicProps.currenttime;
 
 
 
%%% 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 = { 'MODEL1', 'MODEL2' };  % CLUSTER
 
        m.userdata.ranges.modelname.index = 1;                      % CLUSTER
 
    end
 
    modelname = m.userdata.ranges.modelname.range{m.userdata.ranges.modelname.index};  % CLUSTER
 
    disp(sprintf('\nRunning %s model %s\n',mfilename, modelname));
 
    switch modelname
 
        case 'MODEL1'
 
            % Set up the parameters (e.g. mutations) for this model here.
 
        case 'MODEL2'
 
            % Set up the parameters (e.g. mutations) for this model here.
 
        otherwise
 
            % If you reach here, you probably forgot a case.
 
    end
 
   
 
    % 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:
+
        if (Steps(m)==0) && m.globalDynamicProps.doinit  % Initialisation code.
    % m = leaf_plotoptions( m, 'morphogenA', 'POLARISER', ...
+
            % Put any code here that should only be performed at the start of
    %                     'outputquantityB', 'resultantgrowthrate', ...
+
            % the simulation, for example, to set up initial morphogen values.
    %                     'outputaxesB', 'areal' );
+
            % 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
 +
            % One way to set up a morphogen gradient is by ...
 +
            % Setting up a gradient by clamping the ends (execute only once)
 +
            % P=id_prox_p;
 +
            % m.morphogenclamp( ((id_prox_p==1)|(id_dist_p==1)), polariser_i ) = 1;
 +
            % m = leaf_mgen_conductivity( m, 'POLARISER', 0.01 );  %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
 +
<span style="color: CornflowerBlue">'''Section 5'''</span>
  
    % monitor properties of vertices must be done here - so that it reports newly equilibrated levels
+
        % Second way to generate a gradient
    % m=leaf_profile_monitor(m,... % essential
+
        % generating (+) and sinking (-) a diffusing signal (in this case polariser)
    %         'REGIONLABELS',{'V_PROFILE1','V_PROFILE2'},... % essential
+
        % m.mgen_production( :, polariser_i ) = + 5*s_spur_p - P .* id_dist_p;
    %         'MORPHOGENS',{'S_LEFTRIGHT','S_CENTRE'},... % optional  (one element per REGIONLABEL)
+
        % Monitor growth by scattering discs that deform over time (c.f. inducing biological clones)
    %         'VERTLABELS',false,'FigNum',1,'EXCEL',true,'MODELNAME',modelname); % optional (file in snapshots directory')
+
        % (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
 +
<span style="color: CornflowerBlue">'''Section 6'''</span>
  
%%% END OF USER CODE: INITIALISATION
+
        % 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 1: ACCESSING MORPHOGENS AND TIME.
+
<span style="color: CornflowerBlue">'''Section 7'''</span>
%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.
+
    %    % 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
 +
<span style="color: CornflowerBlue">'''Section 8'''</span>
  
    if isempty(m), return; end
+
        % 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.
  
    setGlobals();
+
        % Code for specific models.
    global gNEW_KA_PAR gNEW_KA_PER gNEW_KB_PAR gNEW_KB_PER
+
        switch modelname
    global gNEW_K_NOR gNEW_POLARISER gNEW_STRAINRET gNEW_ARREST
+
<span style="color: CornflowerBlue">'''Section 9'''</span>
    dt = m.globalProps.timestep;
+
            case 'MODEL1'  % @@model MODEL1
    polariser_i = gNEW_POLARISER;
+
                % @@PRN Polariser Regulatory Network
    P = m.morphogens(:,polariser_i);
+
                    % Every equation to be formatted should end with an at-at Eqn N comment.
    [kapar_i,kapar_p,kapar_a,kapar_l] = getMgenLevels( m, 'KAPAR' );
+
                    % P(:) = ...  % @@ Eqn xx
    [kaper_i,kaper_p,kaper_a,kaper_l] = getMgenLevels( m, 'KAPER' );
+
                % @@GRN Gene Regulatory Network
    [kbpar_i,kbpar_p,kbpar_a,kbpar_l] = getMgenLevels( m, 'KBPAR' );
+
                    % Every equation to be formatted should end with an at-at Eqn N comment.
    [kbper_i,kbper_p,kbper_a,kbper_l] = getMgenLevels( m, 'KBPER' );
+
                % @@KRN Growth Regulatory Network
    [knor_i,knor_p,knor_a,knor_l] = getMgenLevels( m, 'KNOR' );
+
                    % Every equation to be formatted should end with an at-at Eqn N comment.
    [strainret_i,strainret_p,strainret_a,strainret_l] = getMgenLevels( m, 'STRAINRET' );
+
                    % kapar_p(:) = 0; % @@ Eqn xx
    [arrest_i,arrest_p,arrest_a,arrest_l] = getMgenLevels( m, 'ARREST' );
+
                    % kaper_p(:) = 0; % @@ Eqn xx
    [id_plusorg_i,id_plusorg_p,id_plusorg_a,id_plusorg_l] = getMgenLevels( m, 'ID_PLUSORG' );
+
                    % kbpar_p(:) = 0; % @@ Eqn xx
    [id_negorg_i,id_negorg_p,id_negorg_a,id_negorg_l] = getMgenLevels( m, 'ID_NEGORG' );
+
                    % kbper_p(:) = 0; % @@ Eqn xx
    [id_a_i,id_a_p,id_a_a,id_a_l] = getMgenLevels( m, 'ID_A' );
+
                    % knor_p(:)  = 0;  % @@ Eqn xx
    [id_b_i,id_b_p,id_b_a,id_b_l] = getMgenLevels( m, 'ID_B' );
+
            case 'MODEL2' % @@model MODEL2
 +
<span style="color: CornflowerBlue">'''Section 10'''</span>
 +
                % @@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
 +
            otherwise
 +
                % If this happens, maybe you forgot a model.
 +
        end
 +
<span style="color: CornflowerBlue">'''Section 11 Automatic'''</span>
  
% Mesh type: circle
+
    %%% END OF USER CODE: MORPHOGEN INTERACTIONS
%          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
+
    %%% SECTION 3: INSTALLING MODIFIED VALUES BACK INTO MESH STRUCTURE
%           -------------------------------------------------
+
    %%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.
%                KAPAR        ----    ----      ----    ----
+
        m.morphogens(:,polariser_i) = P;
%                KAPER        ----    ----      ----    ----
+
        m.morphogens(:,kapar_i) = kapar_p;
%                KBPAR        ----    ----      ----    ----
+
        m.morphogens(:,kaper_i) = kaper_p;
%                KBPER        ----    ----      ----    ----
+
        m.morphogens(:,kbpar_i) = kbpar_p;
%                KNOR        ----    ----      ----    ----
+
        m.morphogens(:,kbper_i) = kbper_p;
%            POLARISER        ----    ----      ----    ----
+
        m.morphogens(:,knor_i) = knor_p;
%            STRAINRET        ----    ----      ----    ----
+
        m.morphogens(:,strainret_i) = strainret_p;
%              ARREST        ----    ----      ----    ----
+
        m.morphogens(:,arrest_i) = arrest_p;
%          ID_PLUSORG        ----    ----      ----    ----
+
        m.morphogens(:,id_plusorg_i) = id_plusorg_p;
%            ID_NEGORG        ----    ----      ----    ----
+
        m.morphogens(:,id_negorg_i) = id_negorg_p;
%                ID_A        ----    ----      ----    ----
+
        m.morphogens(:,id_a_i) = id_a_p;
%                ID_B        ----    ----      ----    ----
+
        m.morphogens(:,id_b_i) = id_b_p;
  
 +
    %%% USER CODE: FINALISATION
 +
<span style="color: CornflowerBlue">'''Section 12'''</span>
  
%%% USER CODE: MORPHOGEN INTERACTIONS
+
    % In this section you may modify the mesh in any way whatsoever.
 +
        % 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
  
% In this section you may modify the mesh in any way that does not
+
     %%% END OF USER CODE: FINALISATION
% 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
 
 
 
        % One way to set up a morphogen gradient is by ...
 
        % Setting up a gradient by clamping the ends (execute only once)
 
        % P=id_prox_p;
 
        % m.morphogenclamp( ((id_prox_p==1)|(id_dist_p==1)), polariser_i ) = 1;
 
        % m = leaf_mgen_conductivity( m, 'POLARISER', 0.01 );  %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
 
     end
   
 
    % 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
 
   
 
    % 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
 
  
%    % If you want to define different phases according to the absolute
+
     %%% USER CODE: SUBFUNCTIONS
%    % time, create a morphogen for each phase and modulate
+
<span style="color: CornflowerBlue">'''Section 13 Semi-automatic'''</span>
%     % 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
 
  
     % Code common to all models.
+
    function m = local_setproperties( m )
     % @@PRN Polariser Regulatory Network
+
    % This function is called at time zero in the INITIALISATION section of the
        % Every equation to be formatted should end with an at-at Eqn N comment.
+
     % interaction function.  It provides commands to set each of the properties
     % @@GRN Gene Regulatory Network
+
     % that are contained in m.globalProps.  Uncomment whichever ones you would
        % Every equation to be formatted should end with an at-at Eqn N comment.
+
    % like to set yourself, and put in whatever value you want.
     % @@KRN Growth Regulatory Network
+
     %
        % Every equation to be formatted should end with an at-at Eqn N comment.
+
    % 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.
  
     % Code for specific models.
+
     %   m = leaf_setproperty( m, 'trinodesvalid', true );
     switch modelname
+
    %    m = leaf_setproperty( m, 'prismnodesvalid', true );
        case 'MODEL1' % @@model MODEL1
+
    %    m = leaf_setproperty( m, 'thicknessRelative', 0.020000 );
            % @@PRN Polariser Regulatory Network
+
    %    m = leaf_setproperty( m, 'thicknessArea', 0.000000 );
                % Every equation to be formatted should end with an at-at Eqn N comment.
+
    %    m = leaf_setproperty( m, 'thicknessMode', 'physical' );
                % P(:) = ... % @@ Eqn xx
+
    %    m = leaf_setproperty( m, 'activeGrowth', 1.000000 );
            % @@GRN Gene Regulatory Network
+
    %    m = leaf_setproperty( m, 'displayedGrowth', 1.000000 );
                % Every equation to be formatted should end with an at-at Eqn N comment.
+
    %    m = leaf_setproperty( m, 'displayedMulti', [] );
            % @@KRN Growth Regulatory Network
+
     %    m = leaf_setproperty( m, 'allowNegativeGrowth', true );
                % Every equation to be formatted should end with an at-at Eqn N comment.
+
    %    m = leaf_setproperty( m, 'usePrevDispAsEstimate', true );
                % kapar_p(:) = 0; % @@ Eqn xx
+
    %   m = leaf_setproperty( m, 'perturbInitGrowthEstimate', 0.000010 );
                % kaper_p(:) = 0; % @@ Eqn xx
+
    %   m = leaf_setproperty( m, 'perturbRelGrowthEstimate', 0.010000 );
                % kbpar_p(:) = 0; % @@ Eqn xx
+
    %    m = leaf_setproperty( m, 'perturbDiffusionEstimate', 0.000100 );
                % kbper_p(:) = 0; % @@ Eqn xx
+
    %   m = leaf_setproperty( m, 'resetRand', false );
                % knor_p(:) = 0; % @@ Eqn xx
+
    %    m = leaf_setproperty( m, 'mingradient', 0.000000 );
        case 'MODEL2' % @@model MODEL2
+
    %    m = leaf_setproperty( m, 'relativepolgrad', false );
            % @@PRN Polariser Regulatory Network
+
    %    m = leaf_setproperty( m, 'usefrozengradient', true );
                % Every equation to be formatted should end with an at-at Eqn N comment.
+
    %   m = leaf_setproperty( m, 'userpolarisation', false );
                % P(:) = ... % @@ Eqn xx
+
    %    m = leaf_setproperty( m, 'thresholdsq', 0.000841 );
            % @@GRN Gene Regulatory Network
+
    %    m = leaf_setproperty( m, 'splitmargin', 1.400000 );
                % Every equation to be formatted should end with an at-at Eqn N comment.
+
    %    m = leaf_setproperty( m, 'splitmorphogen', '' );
            % @@KRN Growth Regulatory Network
+
    %    m = leaf_setproperty( m, 'thresholdmgen', 0.500000 );
                % Every equation to be formatted should end with an at-at Eqn N comment.
+
    %   m = leaf_setproperty( m, 'bulkmodulus', 1.000000 );
                % kapar_p(:) = 0; % @@ Eqn xx
+
    %   m = leaf_setproperty( m, 'unitbulkmodulus', true );
                % kaper_p(:) = 0; % @@ Eqn xx
+
    %   m = leaf_setproperty( m, 'poissonsRatio', 0.300000 );
                % kbpar_p(:) = 0; % @@ Eqn xx
+
    %   m = leaf_setproperty( m, 'starttime', 0.000000 );
                % kbper_p(:) = 0; % @@ Eqn xx
+
    %   m = leaf_setproperty( m, 'timestep', 0.010000 );
                % knor_p(:) = 0; % @@ Eqn xx
+
    %   m = leaf_setproperty( m, 'timeunitname', '' );
        otherwise
+
    %    m = leaf_setproperty( m, 'distunitname', 'mm' );
            % If this happens, maybe you forgot a model.
+
    %    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_20110530' );
 +
    %    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_20110530' );
 +
    %    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
 
     end
 +
<span style="color: CornflowerBlue">'''Section 14'''</span>
  
%%% END OF USER CODE: MORPHOGEN INTERACTIONS
+
    % 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.
%%% SECTION 3: INSTALLING MODIFIED VALUES BACK INTO MESH STRUCTURE
+
     % Remember that they do not have access to any variables except those
%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.
+
     % that you pass as parameters, and cannot change anything except by
    m.morphogens(:,polariser_i) = P;
+
     % returning new values as results.
     m.morphogens(:,kapar_i) = kapar_p;
+
     % Whichever section they are called from, they must respect the same
    m.morphogens(:,kaper_i) = kaper_p;
+
     % restrictions on what modifications they are allowed to make to the mesh.
     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;
 
 
 
%%% USER CODE: FINALISATION
 
  
% In this section you may modify the mesh in any way whatsoever.
+
    % For example:
  
     % If needed force FE to subdivide (increase number FE's) here
+
     % function m = do_something( m )
     % if realtime==280+dt
+
     %   % Change m in some way.
        % m = leaf_subdivide( m, 'morphogen','id_vent',...
 
        %      'min',0.5,'max',1,...
 
        %      'mode','mid','levels','all');
 
 
     % end
 
     % 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
 
 
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_20110530' );
 
%    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_20110530' );
 
%    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
 
 
% 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:
 
 
% function m = do_something( m )
 
%  % Change m in some way.
 
% end
 
  
% Call it from the main body of the interaction function like this:
+
    % Call it from the main body of the interaction function like this:
%      m = do_something( m );
+
    %      m = do_something( m );

Revision as of 10:31, 30 May 2011

This file is output automatically on clicking Panel: Edit in a newly saved project.
Once the file has been edited save it in the usual way from the Matlab editor. The project as whole can be saved under a different name using Panel: Save as. This will automatically create a new copy of the current interaction function, but with the new name and in the new project directory.

The code has been divided into Sections to help with the tutorial.

Section 1 Automatic

   function m = gpt_tut_interaction_20110530( m )
   %m = gpt_tut_interaction_20110530( m )
   %   Morphogen interaction function.
   %   Written at 2011-05-30 09:42:07.
   %   GFtbox revision 0, .
   % 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;
   %%% USER CODE: INITIALISATION

Section 2

   % 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 = { 'MODEL1', 'MODEL2' };  % CLUSTER
           m.userdata.ranges.modelname.index = 1;                       % CLUSTER
       end
       modelname = m.userdata.ranges.modelname.range{m.userdata.ranges.modelname.index};  % CLUSTER
       disp(sprintf('\nRunning %s model %s\n',mfilename, modelname));
       switch modelname
           case 'MODEL1'
               % Set up the parameters (e.g. mutations) for this model here.
           case 'MODEL2'
               % Set up the parameters (e.g. mutations) for this model here.
           otherwise
               % If you reach here, you probably forgot a case.
       end
       % 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 Automatic

   %%% 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_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' );
   % 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        ----    ----       ----     ----
   %            STRAINRET        ----    ----       ----     ----
   %               ARREST        ----    ----       ----     ----
   %           ID_PLUSORG        ----    ----       ----     ----
   %            ID_NEGORG        ----    ----       ----     ----
   %                 ID_A        ----    ----       ----     ----
   %                 ID_B        ----    ----       ----     ----
   %%% USER CODE: MORPHOGEN INTERACTIONS
   % In this section you may modify the mesh in any way that does not
   % alter the set of nodes.

Section 4

       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
           % One way to set up a morphogen gradient is by ...
           % Setting up a gradient by clamping the ends (execute only once)
           % P=id_prox_p;
           % m.morphogenclamp( ((id_prox_p==1)|(id_dist_p==1)), polariser_i ) = 1;
           % m = leaf_mgen_conductivity( m, 'POLARISER', 0.01 );  %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.
       % Code for specific models.
       switch modelname

Section 9

           case 'MODEL1'  % @@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
           case 'MODEL2'  % @@model MODEL2

Section 10

               % @@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
           otherwise
               % If this happens, maybe you forgot a model.
       end

Section 11 Automatic

   %%% 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_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;
   %%% USER CODE: FINALISATION

Section 12

   % In this section you may modify the mesh in any way whatsoever.
       % 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 13 Semi-automatic

   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_20110530' );
   %    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_20110530' );
   %    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 14

   % 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:
   % 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 );