Tutorial on retaining residual strain and cutting

From BanghamLab
Jump to navigation Jump to search

Back to tutorial pages

Note
Crimson: code relating to submodel selection
MediumBlue: code to tell plotter to put morphogens on their respective A and B sides
RosyBrown: code for setting up the seam and cutting the mesh
When the system is arrested (ARRESTTIME=50) there is no further growth and the seams are cut. (The dummy morphogen f_seams is used to specify the nodes that will be divided into two, unconnected nodes - by declaring the morphogen in the GUI it is easy to check that the cuts will be in the right place. There is a plot option to allow the seams to be seen.)

% Section 1
function m = gpt_retainstrainandcut_20110603( m )
%m = gpt_retainstrainandcut_20110603( m )
%   Morphogen interaction function.
%   Written at 2011-06-03 14:38:33.
%   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 % First iteration
        m.userdata.ranges.modelname.range = { 'NORESIDUALS', 'FULLRESIDUALS' };
        m.userdata.ranges.modelname.index = 1;
    end
    modelname = m.userdata.ranges.modelname.range{m.userdata.ranges.modelname.index};
    switch modelname
        case 'NORESIDUALS'
            % Set up the parameters (e.g. mutations) for this model here.
            StrainRetention=0; 
        case 'FULLRESIDUALS'
            % Set up the parameters (e.g. mutations) for this model here.
            StrainRetention=1; 
        otherwise
            % If you reach here, you probably forgot a case.
    end
    % override the GUI and plot the two growth rates on the different sides
    % this line must be commented out if you want to watch the residual
    % strain build up and decay (Plot output value, Residual growth, Areal)
    m = leaf_plotoptions( m, 'morphogenA', 'KAPAR','morphogenB', 'KBPAR');
    % There is a bug in the code that colours in the mesh and colourbar
    % The work around is to click the Monochrome tick box off and on again
    % likewise the Auto color range
    % For this example it is best to turn off the auto color range
    
%%% 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_sidelines_i,id_sidelines_p,id_sidelines_a,id_sidelines_l] = getMgenLevels( m, 'ID_SIDELINES' );
    [id_topcap_i,id_topcap_p,id_topcap_a,id_topcap_l] = getMgenLevels( m, 'ID_TOPCAP' );
    [id_botcap_i,id_botcap_p,id_botcap_a,id_botcap_l] = getMgenLevels( m, 'ID_BOTCAP' );
    [f_seam_i,f_seam_p,f_seam_a,f_seam_l] = getMgenLevels( m, 'F_SEAM' );

% Mesh type: capsule
%         basecap: 1
%      baseheight: 1
%       baserings: 5
%      circumdivs: 12
%          height: 0.2
%      heightdivs: 16
%      randomness: 0.1
%          topcap: 1
%       topheight: 1
%        toprings: 5
%         version: 1
%          xwidth: 0.2
%          ywidth: 0.2

%            Morphogen   Diffusion   Decay   Dilution   Mutant
%            -------------------------------------------------
%                KAPAR        ----    ----       ----     ----
%                KAPER        ----    ----       ----     ----
%                KBPAR        ----    ----       ----     ----
%                KBPER        ----    ----       ----     ----
%                 KNOR        ----    ----       ----     ----
%            POLARISER       0.002    ----       ----     ----
%            STRAINRET        ----    ----       ----     ----
%               ARREST        ----    ----       ----     ----
%         ID_SIDELINES        ----    ----       ----     ----
%            ID_TOPCAP        ----    ----       ----     ----
%            ID_BOTCAP        ----    ----       ----     ----
%               F_SEAM        ----    ----       ----     ----


%%% 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  % 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.
        % Force global variables to zeros to make debugging more reliable
        m.morphogens=zeros(size(m.morphogens));
        m.seams=logical(zeros(size(m.seams)));
        m.polfreeze=zeros(size(m.polfreeze));
        m.mgen_production=zeros(size(m.mgen_production));

        % Caps
        id_topcap_p(m.nodes(:,3)>0.17)=1;
        id_botcap_p(m.nodes(:,3)<-0.17)=1;
        % Sidelines
        indx=find(abs(m.nodes(:,1))>0.08);
        indy=find(abs(m.nodes(:,2))<0.02);
        id_sidelines_p(intersect(indx,indy))=1;
        % Seams along which the capsule will be cut (not the bottom cap)
        inds=[find(id_sidelines_p>0.5);find(id_topcap_p>0.5)];
        f_seam_p(inds)=1;
        m=leaf_set_seams(m,f_seam_p);
        % Seams will be cut when this flag is set to 1 - see see FINALISATION code
        m.userdata.CutOpen=0;
    end
    
% Section 5
    % Code common to all models. (the different strain retention is setup
    % in the initial routines above)
    strainret_p=StrainRetention.*ones(size(strainret_p));
    ARRESTTIME=50;
    if m.userdata.CutOpen==0 % Grow the silique
% Section 6
        % Code for specific models.
        % @@PRN Polariser Regulatory Network
        % Every equation to be formatted should end with an at-at Eqn N comment.
        m = leaf_mgen_conductivity( m, 'Polariser', 0.002);% diffusion constant
        m = leaf_mgen_dilution( m, 'Polariser', false );% it will not dilute with growth
        m = leaf_mgen_absorption( m, 'Polariser', 0);  % it will not decay everywhere
        P(id_topcap_l>0.5)=1;
        m.morphogenclamp(id_topcap_l>0.5,polariser_i) = 1;
        P(id_botcap_l>0.5)=0;
        m.morphogenclamp(id_botcap_l>0.5,polariser_i) = 1;
        % having clamped the values at each end and allowed POL to diffuse
        % diffusion will occur automatically and produce a linear gradient
        kapar_p=0.01; % Specified growth on the inside
        kbpar_p=0.001; % Much less specified growth on the outside
        kaper_p=0.2*kapar_p; % anisotropic growth (grows lengthwise)
        kbper_p=0.2*kbpar_p;
        if realtime>ARRESTTIME
            m.userdata.CutOpen=1;
        end
    elseif m.userdata.CutOpen==1
    else % relax the cut silique
        kapar_p=0;
        kbpar_p=0;
        kaper_p=0;
        kbper_p=0;
        knor_p =0;
        m = leaf_setproperty( m, 'freezing', 0.9 );
    end
% Section 7
%%% 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_sidelines_i) = id_sidelines_p;
    m.morphogens(:,id_topcap_i) = id_topcap_p;
    m.morphogens(:,id_botcap_i) = id_botcap_p;
    m.morphogens(:,f_seam_i) = f_seam_p;

%%% USER CODE: FINALISATION

% In this section you may modify the mesh in any way whatsoever.
    if m.userdata.CutOpen==1
        m=leaf_dissect(m);
        m.userdata.CutOpen=2;        
        m = leaf_setproperty( m, 'freezing', 0.999 );
    end
%%% END OF USER CODE: FINALISATION

end


%%% USER CODE: SUBFUNCTIONS
% Here you may add any functions of your own, that you want to call from
% the interaction function, but never need to call from outside it.
% Whichever section they are called from, they must respect the same
% restrictions on what modifications they are allowed to make to the mesh.
% This comment can be deleted.