Files @ 6bcb69712a0e
Branch filter:

Location: EI/VirtualLeaf/src/perl/make_xmlwritecode.pl - annotation

Roeland Merks
In response to referee's comment:

"However, (although it is probably not important for model developers), I was
still unable to load the model ‘Meinhardt 1976 with growth’ example from the
‘Models’ drop down menu, I got the ‘Fatal error’ message ‘stepwise underflow in

rkqs, with h=0.000000 and htry = 0.100000’. The model did work when I selected
the Meinhardt model in both the Models and the File -> Read leaf menus together,
it would be preferable if the models loaded from the Models menu worked

automatically. I am not sure that the update referred to in the author’s
response permits the loading of ‘My First Model in Virtual Leaf’ from the
‘Models’ drop down menu; I only got a cell that wiggled."

I made the following changes:

- meinhardt_plugin now reads "meinhardt_init.xml" by default
- changed the name of 'My First Model in Virtual Leaf’ to '0: Empty model template (does nothing)' to make it clear that the wiggle cell is the intended behavior for this model example.
- Added default parameter files for Tutorial1A-D and Tutorial2 to prevent variable behavior depending on the last parameter settings used.


--
user: Roeland Merks <roeland.merks@cwi.nl>
branch 'default'
added data/leaves/tutorial1_init.xml
added data/leaves/tutorial2_init.xml
changed data/leaves/auxin_growth.xml
changed data/leaves/meinhardt_init.xml
changed src/TutorialCode/Tutorial0/tutorial0.cpp
changed src/TutorialCode/Tutorial1A/tutorial1A.h
changed src/TutorialCode/Tutorial1B/tutorial1B.h
changed src/TutorialCode/Tutorial1C/tutorial1C.h
changed src/TutorialCode/Tutorial1D/tutorial1D.h
changed src/TutorialCode/Tutorial2/tutorial2.h
changed src/build_models/meinhardtplugin.h
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
782330072e62
782330072e62
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
782330072e62
782330072e62
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
782330072e62
782330072e62
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
782330072e62
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
782330072e62
782330072e62
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
21afbd2a2c01
79f94eaa3b9e
21afbd2a2c01
79f94eaa3b9e
21afbd2a2c01
79f94eaa3b9e
21afbd2a2c01
79f94eaa3b9e
21afbd2a2c01
21afbd2a2c01
782330072e62
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
79f94eaa3b9e
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
79f94eaa3b9e
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
21afbd2a2c01
79f94eaa3b9e
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
79f94eaa3b9e
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
21afbd2a2c01
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
782330072e62
#!/usr/bin/perl

#
# $Id$
#
#  This file is part of the Virtual Leaf.
#
#  The Virtual Leaf is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  The Virtual Leaf is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with the Virtual Leaf.  If not, see <http://www.gnu.org/licenses/>.
#
#  Copyright 2010 Roeland Merks.

# Store essential model source code in XML files, so the exact model
# used for the geometry can be retrieved later on The crucial model
# description is in the files "reactions.h" (or similar) and leaf.cpp
# (or similar).

# First we should retrieve the name of the main code (i.e. leaf.cpp or
# so), and the version of reactions.h that we include there.

# We can get this from the project file (possibly called "LeafGrowth.pro")

# If more than one project file found, issue an error

open prlist, "ls *.pro |";

@projectfiles = ();
while (<prlist>) {
    chomp;
    push @projectfiles, $_;
}

if ($#projectfiles > 0) {
    print stderr "Oops, I found several project files: ";
    for $p (@projectfiles) {
	print stderr "$p ";
    }
    print stderr "\n";
    print stderr "Please make sure you have only one, and try again\n";
    exit(1);
}

if ($#projectfiles < 0) {
    print stderr "No project files found. Please add a project file.\n";
    exit(1);
}

$project = $projectfiles[0];

print stderr "Using project file \"$project\"\n";

# extract TARGET and REACTIONS from project file

open pfile,"<$project";
my @targets = ();
while (<pfile>) {
    if (/^[ \t]*TARGET/) {
	my @line = split(/=/);
	my $target = $line[1];
	chomp $target;
	$target =~ s/[ \t]//g;
	push @targets, $target;
    }
    if (/^[ \t]*REACTIONS/) {
	my @line = split(/=/);
	my $reaction = $line[1];
	chomp $reaction;
	$reaction =~ s/[ \t]//g;
	push @reactions, $reaction;
    }
}


if ($#targets > 0) {
    print stderr "Too many targets found: ";
    for $t (@targets) {
	print stderr "$t ";
    }
    print stderr "\n";
    exit(1);
}

if ($#targets < 0) {
    print stderr "No targets found in project $project\n";
    exit(1);
}

$target = $targets[0];

print "Target is $target\n";

if ($#reactions > 0) {
    print stderr "Too many reactions found: ";
    for $t (@reactions) {
	print stderr "$t ";
    }
    print stderr "\n";
    exit(1);
}

if ($#reactions < 0) {
    print stderr "No reactions found in project $project\n";
    exit(1);
}

$reaction = $reactions[0];

print "Reactions header is $reaction\n";

$mainsource = $target.".cpp";

# extract "reactions" source from mainsource
# assuming that the header file name starts with "reactions_"

#open sfile, "<$mainsource";
#
#while (<sfile>) {
#  if (/^[ \t]*\#include/) {
#    chomp;
#    my @line = split(/\#include/);
#    my $header = $line[1];
#    $header =~ s/[\t ]//g;
#    if ($header =~ /reactions/) {
#      $header =~ s/[\"\<\>]//g;
#      push @headers, $header;
#    }
#  }
#}
#
#if ($#headers > 0) {
#  print stderr "Oops, more than one reactions header found: ";
#  for $h (@headers) {
#    print stderr "$h ";
#  }
#  print stderr "\n";
#  print stderr "Don't know what to do now... Please rename a header in $mainsource, so only one will start with \"reactions\"\n";
#  exit(1);
#}
#
#if ($#headers < 0) {
#  print stderr "Oops, no reactions header found in $mainsource.\n";
#  print stderr "Please make sure the name of your reactions header starts with \"reactions\"\n";
#  exit(1);
#}
#
#$reactions = $headers[0];



# now generating xmlcode to write the contents of these files (hard coded in the executables)

open xmlsrc, ">xmlwritecode.cpp";

print xmlsrc <<END_MARKER;
// Automatically produced by perl script \"make_xmlwritecode.pl\". DO NOT EDIT

#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xpath.h>
#include <libxml/xmlreader.h>
#include "xmlwrite.h"


void XMLIO::XMLWriteLeafSourceCode(xmlNode *parent) {

// Embed the code in our xml file, so we can reconstruct the model we used to produce it ... 

END_MARKER

sub construct_string_constant_from_file {

    my $fname = shift;
    my $str = "";
		
    open srcfile, "<$fname";
    while (<srcfile>) {
	chomp;      
	s/\\/\\\\/g;
	s/\"/\\\"/g;
	s/\&/\&amp;/g;
	$str.=$_."\\n";
    }
    $str .= "\";\n";
    return $str;
}

print xmlsrc "xmlChar *sourcecode = (xmlChar *)\"".construct_string_constant_from_file( "$mainsource" );
print xmlsrc <<END_MARKER2;
xmlNodePtr xmlcode = xmlNewChild(parent, NULL, BAD_CAST \"code\", sourcecode);

{
    xmlNewProp(xmlcode, BAD_CAST "name", BAD_CAST \"$mainsource\");
}

}

void XMLIO::XMLWriteReactionsCode(xmlNode *parent) {

END_MARKER2

print xmlsrc "xmlChar *sourcecode = (xmlChar *)\"".construct_string_constant_from_file( "$reaction" );
print xmlsrc <<END_MARKER3;
xmlNodePtr xmlcode = xmlNewChild(parent, NULL, BAD_CAST \"code\", sourcecode);

{
    xmlNewProp(xmlcode, BAD_CAST "name", BAD_CAST \"$reaction\");
}

}

END_MARKER3

# finis