Good questions. They raise many important points.
tcp wrote:For many points I have uncertainties especially the point whether I should introduce a cd specific totalpump or not.
Before one writes any code, it is essential to have a clear conceptual model. The conceptual model provides the rational basis for the code that is to be written.
The conceptual model of ca accumulation that served as the basis for the original cdp.mod includes a membrane-bound transport mechanism (a "pump"), and a single buffer. The geometry of diffusion exploits radial symmetry by representing the intracellular space as a set of concentric compartments; mobile species can move radially or longitudinally between adjacent compartments, but not circumferentially. The only mobile species is free ca. The equations that describe it are specified by reactions that are written in the KINETIC block. Omitting rate constants and scale factors related to surface/volume ratios for the sake of clarity, here are the reactions.
Code: Select all
~ ca[0] << (-(ica - ica_pmp_last)*PI*diam/(2*FARADAY))
specifies the contribution of calcium fluxes through the membrane (except for the flux generated by the pump itself) to the ca in the compartment just beneath the cell membrane.
Code: Select all
FROM i=0 TO Nannuli-2 {
~ ca[i] <-> ca[i+1]
}
specifies radial diffusion, and the LONGITUDINAL_DIFFUSION statement near the top of the KINETIC block instructs NMODL that ca may move between adjacent compartments along the length of a section, and may cross between adjacent segments of connected sections.
Code: Select all
~ ca[0] + pump <-> pumpca
~ pumpca <-> pump + cao
specifies the pump mechanism.
Code: Select all
FROM i=0 TO Nannuli-1 {
~ ca[i] + Buffer[i] <-> CaBuffer[i]
}
specifies buffering of ca by the single buffer.
To add a second _immobile_ buffer it is only necessary to add another reaction that specifies how this new buffer binds ca. And that gives you a new conceptual model.
If the new buffer is to be _mobile_, then you need to include a new set of reactions that specify the exchange of free and ca-bound buffer between adjacent compartments. So the equations for radial diffusion are now
Code: Select all
FROM i=0 TO Nannuli-2 {
~ ca[i] <-> ca[i+1]
~ Buffer_cb[i] <-> Buffer_cb[i+1]
~ CaBuffer_cb[i] <-> CaBuffer_cb[i+1]
}
and there will also have to be new LONGITUDINAL_DIFFUSION statements for Buffer_cb and CaBuffer_cb.
Implementation of the new conceptual model with NMODL is quite straightforward. It's just the old NMODL code plus a few additional statements. First among these new statements, of course, are the new buffering reactions, which introduce new STATEs that must be declared (the concentrations of free and bound buffer in each compartment). And, of course, the new diffusion reactions.
But there are also many other details. If there was a CONSERVE statement for the original buffer, it's probably a good idea to do the same thing for the new buffer. Also, the new buffer has its own rate constants, its own "total amount", its own diffusion constant(s) (at least 1 if it is mobile, and definitely 2 if there is a difference between the mobilities of free and bound buffer) etc.. All of these things must be specified by new parameters, assigned variables, etc..
I am not sure if it is necessary to introduce a TotalPump_cb
What do you think? Does the pump interact directly with the new buffer or not?
Code: Select all
CaBuffer_cb[Nannuli] (mM) <1e-7> : different shells for the cb buffer, could I use the same?
The new conceptual model is the same as the conceptual model for the original cdp.mod, with one exception: each compartment contains two buffering species. So if there are Nannuli compartments, there must be that same number of variables to hold the corresponding values of Buffer_cb, and another set of variables to hold the values of CaBuffer_cb.
"How many compartments should there be for the new buffer?" Don't even think of trying to use different numbers of compartments for the different mobile species. Choose a spatial grid that is fine enough to take care of the species with the highest mobility, and use that for all of them.
Code: Select all
COMPARTMENT i, diam*diam*vrat[i] {ca CaBuffer CaBuffer_cb Buffer Buffer_cb}
Good.
Code: Select all
LONGITUDINAL_DIFFUSION i, DCa_cb*diam*diam*vrat[i] {ca}
Not quite. You want to say
Code: Select all
LONGITUDINAL_DIFFUSION i, DBuffer_cb*diam*diam*vrat[i] {Buffer_cb Ca_Buffer_cb}
assuming of course that Buffer_cb and CaBuffer_cb have the same mobility. If they have different mobilities, you'll need separate diffusion constants and LONGITUDINAL_DIFFUSION statements for the bound and free buffer.
Code: Select all
~ ca[i] <-> ca[i+1] (DCa_cb*frat[i+1], DCa*frat[i+1])
This is incorrect. The mobility of free ca is DCa. It is not affected by the presence of buffer. There is only one equation that describes the movement of free ca and it has nothing to do with any buffers at all. If ca is going to hitch a ride on a mobile buffer in compartment 1, and diffuse into adjacent compartment 2 where it then dissocates from the mobile buffer, it is the CaBuffer_cb combination that moves, not ca. The whole process involves the following steps:
ca[1] + Buffer_cb[1] -> CaBuffer_cb[1]
CaBuffer_cb[1] -> CaBuffer_cb[2]
CaBuffer_cb[2] -> ca[2] + Buffer_cb[2]
These steps are embedded in the set of reactions I outlined above. They are _NOT_ equivalent to
ca[1] -> ca[2] (DCa_cb*frat[2])
Code: Select all
FROM i=0 TO Nannuli-1 {
dsqvol = dsq*vrat[i]
~ ca[i] + Buffer[i] <-> CaBuffer[i] (k1buf*dsqvol, k2buf*dsqvol)
~ ca[i] + Buffer_cb[i]<->CaBuffer_cb[i] (k1buf_cb*dsqvol, k2buf*dsqvol) : buffering reaction for cb
}
Yes.
Be sure to check your new mod file with modlunit.