02_user_tutorials:exercises:exercise:start
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| 02_user_tutorials:exercises:exercise:start [2026/09/28 09:55] – barley1965 | 02_user_tutorials:exercises:exercise:start [2026/09/30 21:38] (current) – barley1965 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Sources, sinks and assimilate transport in a virtual plant ====== | ====== Sources, sinks and assimilate transport in a virtual plant ====== | ||
| - | //Master 2, specialties | + | //Master 2 BV, specialties |
| ===== Learning objectives ===== | ===== Learning objectives ===== | ||
| Line 8: | Line 8: | ||
| * explain how a functional–structural plant model (FSPM) links **light interception → photosynthesis → transport → growth of sinks**; | * explain how a functional–structural plant model (FSPM) links **light interception → photosynthesis → transport → growth of sinks**; | ||
| * identify, in real model code, where each of these processes is computed and which organs act as **sources** or **sinks**; | * identify, in real model code, where each of these processes is computed and which organs act as **sources** or **sinks**; | ||
| + | * explain the difference between the **potential** growth of an organ and its **actual** growth when sugar is limiting; | ||
| * run a model experiment rigorously: **predict, run, observe, explain**; | * run a model experiment rigorously: **predict, run, observe, explain**; | ||
| - | * modify the model to represent a situation from your own field (a pest or disease, or seed/fruit set); | + | * modify the model to represent a situation from your own field (a pest or disease, or fruit and seed set); |
| * critically judge what a model does and does not represent. | * critically judge what a model does and does not represent. | ||
| Line 17: | Line 18: | ||
| ^ Part ^ Content ^ Time ^ | ^ Part ^ Content ^ Time ^ | ||
| - | | 0 | Setup: open and run the model | 10 min | | + | | 0 | Setup: open and start the model | 10 min | |
| | 1 | The biology in brief | 10 min | | | 1 | The biology in brief | 10 min | | ||
| | 2 | The model at a glance | 15 min | | | 2 | The model at a glance | 15 min | | ||
| - | | 3 | Run and observe | + | | 3 | Observe the reference run | 15 min | |
| | 4 | Reading the code: production, transport, use | 25 min | | | 4 | Reading the code: production, transport, use | 25 min | | ||
| | 5 | Virtual experiments | 25 min | | | 5 | Virtual experiments | 25 min | | ||
| | 6 | Your specialty: plant health **or** seed science | 15 min | | | 6 | Your specialty: plant health **or** seed science | 15 min | | ||
| | 7 | Synthesis | 5 min | | | 7 | Synthesis | 5 min | | ||
| - | | (Bonus) | Connect transport to fruit growth | + | | (Bonus) | Let organs catch up: developmental plasticity |
| ---- | ---- | ||
| Line 34: | Line 35: | ||
| - The model code is in the file '' | - The model code is in the file '' | ||
| - In the toolbar of the 3D view you will find buttons for the **public** methods of the model. Here there is one: '' | - In the toolbar of the 3D view you will find buttons for the **public** methods of the model. Here there is one: '' | ||
| - | - To reset the plant to its initial state, use the reset/" | + | - To reset the plant to its initial state, use the reset button (this executes the '' |
| - | - Click '' | + | - Click '' |
| - | Three charts open automatically: | + | Four charts open automatically: |
| ^ Chart ^ What it shows ^ | ^ Chart ^ What it shows ^ | ||
| | //Light intercepted by canopy// | total light absorbed by all leaves during the last hour | | | //Light intercepted by canopy// | total light absorbed by all leaves during the last hour | | ||
| - | | //Canopy photosynthesis// | + | | //Canopy photosynthesis// |
| | //Fruit growth// | size of every fruit over time (one series per fruit) | | | //Fruit growth// | size of every fruit over time (one series per fruit) | | ||
| + | | // | ||
| **Colour code in the 3D view** (false colours, for display only): | **Colour code in the 3D view** (false colours, for display only): | ||
| * Leaves: colour depends on the light they absorbed. | * Leaves: colour depends on the light they absorbed. | ||
| - | * Internodes: colour depends on their sugar content | + | * Internodes: colour depends on their sugar content. |
| * The brown floor is made of light-absorbing tiles; bright tiles receive more light. | * The brown floor is made of light-absorbing tiles; bright tiles receive more light. | ||
| - | The '' | + | **The XL Console.** Messages from the model appear here. You can also type queries |
| + | <code java> | ||
| + | ((* Example1.Fruit | ||
| + | ((* Example1.Fruit | ||
| + | count((* Example1.Fruit *)) // number of fruits | ||
| + | </ | ||
| ===== Part 1 – The biology in brief (10 min) ===== | ===== Part 1 – The biology in brief (10 min) ===== | ||
| Line 65: | Line 72: | ||
| ^ Module ^ Role ^ Important attributes ^ | ^ Module ^ Role ^ Important attributes ^ | ||
| | '' | | '' | ||
| - | | '' | + | | '' |
| | '' | | '' | ||
| - | | '' | + | | '' |
| - | | '' | + | | '' |
| | '' | | '' | ||
| | '' | | '' | ||
| Line 77: | Line 84: | ||
| <code java> | <code java> | ||
| public void grow () { | public void grow () { | ||
| - | run(); | + | run(); |
| lm.compute(); | lm.compute(); | ||
| absorbAndGrow(); | absorbAndGrow(); | ||
| - | if (time % 24 == 0) { | + | |
| - | | + | |
| - | transport(); | + | transport(); |
| - | } | + | // } |
| - | } | + | |
| updateChart(); | updateChart(); | ||
| time++; | time++; | ||
| Line 90: | Line 97: | ||
| </ | </ | ||
| - | **Q4.** | + | **Q4.** |
| ==== 2.3 How the plant is built ==== | ==== 2.3 How the plant is built ==== | ||
| Line 98: | Line 105: | ||
| <code java> | <code java> | ||
| Bud(r, p, o), (r < 10 && p == 0 && o < 3) ==> | Bud(r, p, o), (r < 10 && p == 0 && o < 3) ==> | ||
| - | RV(-0.1) Internode(0.1, | + | RV(-0.1) Internode(0.1, |
| [ RL(BRANCH_ANGLE) Bud(r, PHYLLOCHRON, | [ RL(BRANCH_ANGLE) Bud(r, PHYLLOCHRON, | ||
| [ LFA(1) Leaf(0.1, 0.07, 0, 1, 0, r) ] // leaf | [ LFA(1) Leaf(0.1, 0.07, 0, 1, 0, r) ] // leaf | ||
| - | RH(GOLDEN_ANGLE) RV(-0.1) Internode(0.1, | + | RH(GOLDEN_ANGLE) RV(-0.1) Internode(0.1, |
| Bud(r+1, PHYLLOCHRON, | Bud(r+1, PHYLLOCHRON, | ||
| </ | </ | ||
| Line 109: | Line 116: | ||
| **Q6.** When '' | **Q6.** When '' | ||
| - | ===== Part 3 – Run and observe (15 min) ===== | + | **Q7.** Only the first two internodes of the main stem ('' |
| - | Reset the model and run it for about **300 steps** (≈ 12 days). Observe | + | ===== Part 3 – Observe |
| + | |||
| + | Look at your run (about 600 steps). | ||
| Fill in: | Fill in: | ||
| Line 117: | Line 126: | ||
| | Step at which the first flower appears | | | | Step at which the first flower appears | | | ||
| | Step at which the first fruit appears | | | | Step at which the first fruit appears | | | ||
| - | | Number of fruits | + | | Number |
| + | | Final size of each fruit (console query) | ||
| | Shape of the fruit growth curves (linear? S-shaped? all the same?) | | | | Shape of the fruit growth curves (linear? S-shaped? all the same?) | | | ||
| - | | Where are the internodes | + | | Sugar distribution in the internodes: at which ranks is it highest? | | |
| | Which leaves absorb the most light? | | | | Which leaves absorb the most light? | | | ||
| - | **Q7.** Do all flowers become fruits at the same time? Why not? (You will find the rule in Part 4.4.) | + | **Q8.** The internode sugar chart shows the highest sugar content in the **middle** ranks, |
| ===== Part 4 – Reading the code: production, transport, use (25 min) ===== | ===== Part 4 – Reading the code: production, transport, use (25 min) ===== | ||
| Line 140: | Line 150: | ||
| '' | '' | ||
| - | * **Q8.** What is the value of CER in darkness (ppfd = 0)? What does a negative value mean for the leaf? | + | * **Q9.** What is the value of CER in darkness (ppfd = 0)? What does a negative value mean for the leaf? |
| - | * **Q9.** What value does CER approach when ppfd becomes very large? Sketch the curve. | + | * **Q10.** What value does CER approach when ppfd becomes very large? Sketch the curve. |
| - | * **Q10.** The function '' | + | * **Q11.** The function '' |
| In '' | In '' | ||
| Line 148: | Line 158: | ||
| ==== 4.2 Transport ==== | ==== 4.2 Transport ==== | ||
| - | The method '' | + | The method '' |
| + | |||
| + | <code java> | ||
| + | const float LEAF_EXPORT | ||
| + | const float D_PHLOEM | ||
| + | const float FRUIT_UNLOAD = 0.1; // unloading into the fruit per hour | ||
| + | </ | ||
| **Rule 1 – between a leaf and the internode that carries it** | **Rule 1 – between a leaf and the internode that carries it** | ||
| <code java> | <code java> | ||
| - | lf: | + | lf:Leaf -ancestor-> itn: |
| - | | + | |
| - | float exportable | + | if (!sink |
| - | float r = DIFF_CONST * exportable; | + | float r = LEAF_EXPORT * lf[as]; |
| - | lf[as] -= r; | + | lf[as] -= r; itn[as] += r; |
| - | } else if (itn[as] > 0.01 && lf[age] < 10) { // young leaf: IMPORT | + | } |
| - | float exportable | + | |
| - | float r = DIFF_CONST * exportable; | + | float r = LEAF_EXPORT * itn[as]; |
| - | lf[as] += r; | + | lf[as] += r; itn[as] -= r; |
| } | } | ||
| } | } | ||
| </ | </ | ||
| - | **Rule 2 – between two successive internodes** | + | **Rule 2 – between two successive internodes** |
| <code java> | <code java> | ||
| - | i_top: | + | i_top: |
| - | float r = DIFF_CONST | + | float r = D_PHLOEM |
| i_bottom[as] :+= r; | i_bottom[as] :+= r; | ||
| i_top[as] | i_top[as] | ||
| Line 174: | Line 190: | ||
| </ | </ | ||
| - | **Rule 3 – from an internode | + | **Rule 3 – from an internode |
| <code java> | <code java> | ||
| - | itn: | + | itn: |
| - | | + | float r = FRUIT_UNLOAD |
| - | | + | itn[as] :-= r; |
| - | itn[as] :-= r; | + | |
| - | } | + | |
| } | } | ||
| </ | </ | ||
| - | // | + | // |
| - | * **Q11.** At what age does a leaf switch from sink to source in this model? Why do leaves keep a reserve of 0.01? | + | * **Q12.** When does a leaf switch from sink to source in this model? Why is a criterion based on leaf **size** closer to the biology than one based on leaf **age**? |
| - | * **Q12.** In Rule 2, can sugar move **upwards** as well as **downwards**? | + | * **Q13.** In Rule 2, can sugar move **upwards** as well as **downwards**? |
| - | * **Q13.** Compare Rule 1 (export) and Rule 2. Does the export of a mature leaf depend on how much sugar is already in the internode? Is that consistent with the Münch model? | + | * **Q14.** Does the export of a mature leaf (Rule 1) depend on how much sugar is already in the internode? Is that consistent with the Münch model? |
| - | * **Q14.** In Rule 3, which quantity drives | + | * **Q15.** In Rule 3, the flux into the fruit depends on the **difference** between |
| - | ==== 4.3 Use: maintenance | + | ==== 4.3 Use: potential |
| - | * Internodes | + | Internodes and fruits |
| - | * Leaves grow following a logistic | + | |
| - | * Fruits grow in the '' | + | <code java> |
| + | itn: | ||
| + | itn[age]++; | ||
| + | | ||
| + | float potential = logistic(INT_MAX_LENGTH, | ||
| + | float demand = potential | ||
| + | float f = (demand | ||
| + | itn[length] += potential * f; // actual growth | ||
| + | itn[as] | ||
| + | } | ||
| + | </ | ||
| - | **Q15 – Detective question.** Look closely at the fruit block. Where does the variable | + | The fruit block is identical, with '' |
| - | **Q16.** Does leaf growth depend on the amount of sugar in the leaf? (Read the comment in the code, then read the code itself.) | + | * **Q16.** Explain in your own words what '' |
| + | * **Q17.** The potential growth depends only on the organ' | ||
| + | * **Q18.** Growth **consumes** sugar (last line). Using your answer to Q15, explain why this consumption is what makes sugar flow towards growing organs. | ||
| + | * **Q19.** An internode needs '' | ||
| + | * **Q20.** Does **leaf** growth depend on the amount of sugar in the leaf? (Read the comment in the code, then the code itself.) | ||
| ==== 4.4 Fruit set ==== | ==== 4.4 Fruit set ==== | ||
| <code java> | <code java> | ||
| - | fl: | + | fl: |
| - | | + | { float sugar = itn[as]; println(" |
| - | { float sugar = lf[as]; } | + | if (sugar > FRUIT_SET_THRESHOLD) ( {noFrts++;} Fruit(0.01, 1, 0.1, noFrts) ); |
| - | if (sugar > 0) ( {noFrts++;} Fruit(0.01, 1, 0.1, noFrts) | + | |
| - | else (fl); | + | |
| </ | </ | ||
| - | **Q17.** In words: under which condition does a flower become a fruit? | + | **Q21.** In words: under which condition does a flower become a fruit? |
| ===== Part 5 – Virtual experiments (25 min) ===== | ===== Part 5 – Virtual experiments (25 min) ===== | ||
| Method, for **each** experiment: | Method, for **each** experiment: | ||
| - | - Write your **prediction** //before// running (effect on fruit number, fruit size, internode | + | - Write your **prediction** //before// running (effect on fruit number, fruit size, internode |
| - | - Change **one** value only, save (the model resets), run 300 steps. | + | - Change **one** value only, save (the model resets), run to step 600. |
| - Record the result, then **restore the original value**. | - Record the result, then **restore the original value**. | ||
| - | Every group does **E1**, plus **two** other experiments | + | A run takes several minutes, so the experiments |
| - | ^ Exp. ^ What to change ^ Where ^ | + | ^ Exp. ^ What to change ^ Question behind it ^ |
| - | | E1 | '' | + | | E1 | '' |
| - | | E2 | Lamp power: | + | | E2 | '' |
| - | | E3 | Sink–source transition: leaf age '' | + | | E3 | '' |
| - | | E4 | Maintenance respiration | + | | E4 | Lamp power: '' |
| - | | E5 | Transport every hour instead of 24 rounds once a day: in '' | + | | E5 | '' |
| - | | E6 | Phyllochron: | + | | E6 | Sink–source transition: '' |
| + | | E7 | '' | ||
| Results table (one line per run): | Results table (one line per run): | ||
| - | ^ Exp. ^ Value ^ Prediction ^ Nb fruits | + | ^ Exp. ^ Value ^ Prediction ^ Nb fruits ^ Mean fruit size ^ Internode sugar profile ^ Plant height / internode length |
| | Ref | – | – | | | | | | | | Ref | – | – | | | | | | | ||
| - | | E1 | 0.02 | | | | | | | | ||
| - | | E1 | 0.0002 | | | | | | | | ||
| | | | | | | | | | | | | | | | | | | | | ||
| | | | | | | | | | | | | | | | | | | | | ||
| - | **Q18.** Was any result the opposite of your prediction? | + | **Q22.** Which experiments changed **fruit size**, and which changed **fruit number**? Why are these two responses controlled by different parts of the model? |
| + | |||
| + | **Q23.** Was any result the opposite of your prediction? | ||
| ===== Part 6 – Your specialty (15 min) ===== | ===== Part 6 – Your specialty (15 min) ===== | ||
| Line 250: | Line 278: | ||
| At the top of the file, next to the other constants, add: | At the top of the file, next to the other constants, add: | ||
| <code java> | <code java> | ||
| - | const float APHID_RATE = 0.02; // fraction of internode sugar taken per transport round | + | const float APHID_RATE = 0.02; // fraction of internode sugar taken per hour |
| float aphidSugar = 0; // total sugar taken by the aphids | float aphidSugar = 0; // total sugar taken by the aphids | ||
| </ | </ | ||
| Line 263: | Line 291: | ||
| </ | </ | ||
| - | Print the total at each step: add '' | + | Print the total at each step: add '' |
| - | **A2. Defoliation by a leaf disease.** Remove all leaves of rank ≤ 4 at step 150. Add this rule in '' | + | **A2. Defoliation by a leaf disease.** Remove all leaves of rank ≤ 4 at step 200. Add this rule in '' |
| <code java> | <code java> | ||
| - | lf:Leaf, (time == 150 && lf[rank] <= 4) ==> ; | + | lf:Leaf, (time == 200 && lf[rank] <= 4) ==> ; |
| </ | </ | ||
| Line 273: | Line 301: | ||
| **Questions: | **Questions: | ||
| - | * **QA1.** Which intervention reduced fruit set / fruit growth | + | * **QA1.** Which intervention reduced fruit number or fruit size the most? Was the position of the aphid colony important? Why? |
| * **QA2.** Which of A1, A2, A3 reduces the //source//, which adds a //sink//? Why is it useful for a plant pathologist to make this distinction? | * **QA2.** Which of A1, A2, A3 reduces the //source//, which adds a //sink//? Why is it useful for a plant pathologist to make this distinction? | ||
| - | * **QA3.** What would you need to add to the model to represent | + | * **QA3.** What would you need to add to the model to represent |
| ==== Track B – Seed Science and Plant Propagation ==== | ==== Track B – Seed Science and Plant Propagation ==== | ||
| - | **B1. Fruit thinning.** Remove every second fruit at step 250. Add this rule in '' | + | **B1. Fruit thinning.** Remove every second fruit at step 360. Add this rule in '' |
| <code java> | <code java> | ||
| - | fr:Fruit, (time == 250 && fr[no] % 2 == 0) ==> ; | + | fr:Fruit, (time == 360 && fr[no] % 2 == 0) ==> ; |
| </ | </ | ||
| - | Compare the size of the remaining fruits with the reference run. | + | Compare the final size of the remaining fruits with the reference run. |
| - | **B2. Fruit abortion | + | **B2. Fruit set threshold.** |
| - | **B3. Competition among fruits.** In the fruit block of '' | + | **B3. Variable developmental speed.** In the reference plant, all branches develop in step, so all fruits have almost |
| **Questions: | **Questions: | ||
| * **QB1.** Is there a trade-off between the number and the size of fruits? Show it with your results. | * **QB1.** Is there a trade-off between the number and the size of fruits? Show it with your results. | ||
| - | * **QB2.** In real plants, the first-set fruits | + | * **QB2.** In B3, do early-set or late-set fruits |
| * **QB3.** A seed producer wants large, uniform seeds. Based on the model, what would you advise, and what is missing from the model to give a reliable answer? | * **QB3.** A seed producer wants large, uniform seeds. Based on the model, what would you advise, and what is missing from the model to give a reliable answer? | ||
| ===== Part 7 – Synthesis (5 min) ===== | ===== Part 7 – Synthesis (5 min) ===== | ||
| - | * **Q19.** Draw a diagram (boxes and arrows) of the sugar flows in the model **as it is coded**: production → stocks → transport → use. Mark any place where sugar appears | + | * **Q24.** Draw a diagram (boxes and arrows) of the sugar flows in the model: production → stocks → transport → use. Mark every place where sugar enters |
| - | * **Q20.** List two strengths and two limitations of this model for studying source–sink relations. | + | * **Q25.** List two strengths and two limitations of this model for studying source–sink relations. |
| - | ===== Bonus – Make fruits grow on the sugar they actually receive | + | ===== Bonus – Let organs catch up: developmental plasticity |
| - | For fast groups | + | For fast groups. At present |
| - | Modify the fruit block in '' | + | Hints: |
| - | - the fruit computes | + | - Give '' |
| - | - it converts potential growth into a **sugar demand** (introduce a constant, e.g. '' | + | - In the internode block, use '' |
| - | - it grows only as much as its stock '' | + | - At the end of the block, let development advance |
| + | - The function | ||
| - | Then repeat experiment E1. Do the results now match your original predictions? | + | Compare the internode lengths along the main stem with the reference run. Where does the change have the largest effect? |
| ===== Before the exam ===== | ===== Before the exam ===== | ||
| This exercise is not handed in, but the questions above cover the kind of reasoning expected in the exam: explaining source–sink relations, reading a simple model rule, and predicting and interpreting the outcome of a virtual experiment. Keep your answers and tables as revision notes. | This exercise is not handed in, but the questions above cover the kind of reasoning expected in the exam: explaining source–sink relations, reading a simple model rule, and predicting and interpreting the outcome of a virtual experiment. Keep your answers and tables as revision notes. | ||
| + | |||
02_user_tutorials/exercises/exercise/start.1790589358.txt.gz · Last modified: by barley1965
