· web viewfig s1. traces of figure 3b from the main manuscript, with each trace separated for...
TRANSCRIPT
Supplementary Data
Fig S1. Traces of Figure 3B from the main manuscript, with each trace separated for easy review. Stimulating (0.5Hz for 4 beats) a quiescent cell initiates complex behavior and automaticity. There are 4 stimulated pulses at the beginning of each trace, followed by an unstimulated period. Spontaneous activity appears in some traces. Note that there are large changes in the action potential shape and duration.
Fig S2. Traces of Figure 3D from the main manuscript, with each trace separated for easy review. There is no stimulation, all action potentials are spontaneous activity. Note the highly variable in frequency, diastolic potential, overshoot and shape.
Fig S3. Traces of Figure 3E from the main manuscript, with each trace separated for easy review. Pacing (0.25Hz for 4 beats) a spontaneously active cell produces a more consistent after-hyperpolarization potential and changes spontaneous activity.
Figure S4. Traces of figures 5 from the main manuscript, with each trace separated for easy review. (A) APs stimulated at a cycle length of 4s. Intrinsic automaticity caused some APs to be very shortened, and some stimuli occurred during repolarization from a preceding spontaneous beat. Stimuli are indicated with arrows. Note that some stimuli occur prior to complete action potential repolarization. (B) Same cell, with 1 µM BayK8644. BayK8644 caused calcium loading which terminated spontaneous activity. Stimulated APs showed abnormal behavior with severely shortened repolarization and little evidence of regenerative depolarization. (C) Same cell as (A,B) but with electronic expression of IK1,synthetic. The AP has normal spike and dome morphology, and consistent APD90. These traces were recorded before application of BayK8644, and before trace B. (D) Same cell as in (A,B,C), with IK1,synthetic and 1 µM of BayK8644.
Figure S5. We tested the hypothesis that lack of IK1 could be responsible for the noted changes by removing IK1 from the Luo-Rudy model of the guinea-pig ventricular myocyte. A: Action potentials elicited by a stimulus at a frequency of 1 Hz. In the absence of stimulation, the cell is quiescent. B: When IK1 is set to zero, the resting membrane potential is elevated, and spontaneous action potentials are observed. The spontaneous action potentials have a slow upstroke, a more rounded shape, smaller amplitude, and a slightly longer duration. C: Action potentials from A and B on a faster time scale, for easy comparison.
Supplementary Methods
The in silico interface has the following connections:
1. Analog In #1 from the Digidata 1322A (cell membrane voltage) goes to both the input
Channel 0 of the PCI board (High: 37, Low: 18) and the outputs “10 Vm” of the clamp
amplifier.
2. The output from the PCI board (Signal:9, Ground:19) is connected to Input B of a filter
(902LPF by Frequency Devices) through a potentiometer. This is the scaled IK1,Synthetic
3. Digidata 1322A Analog out #0 (standard stimulation input) goes to Input A of the filter.
4. The output from the filter goes to “Ext. Command” of the clamp amplifier. This is the sum
of scaled IK1,synthetic with the standard stimulation input.
The signal transfer process is controlled by a C program (shown below) written in Microsoft
Visual Studio 2010. The program reads in the input (membrane potential) to the PCI board,
uses an equation to calculate the corresponding IK1 current, and writes it out to the output of the
board.
#include "cbw.h"
#include <iostream>
#include <conio.h>
/* Prototypes */
void ClearScreen (void);
void GetTextCursor (int *x, int *y);
void MoveCursor (int x, int y);
using namespace std;
int main(int argc, char* argv[])
{
/* Variable Declarations */
int Row,Col;
int Row2,Col2;
int BoardNum = 1;//0;
int UDStat = 0;
int ULStat = 0;
int Chan;
int Gain = BIP10VOLTS;
WORD DataValue = 0;
DWORD DataValue32 = 0;
float EngUnits;
float current_IK1;
float EK = -90.0; //K+ Nernst potential
double HighResEngUnits;
float RevLevel = (float)CURRENTREVNUM;
BOOL HighResAD = FALSE;
int ADRes;
int Options = 0;
float GK1 = 1.0; //conductance of IK1;
float Glinear = 0; //conductance of the linear current.
/* Declare UL Revision Level */
UDStat = cbDeclareRevision(&RevLevel);
cbErrHandling (PRINTALL, DONTSTOP);
/* Get the resolution of A/D */
cbGetConfig(BOARDINFO, BoardNum, 0, BIADRES, &ADRes);
/* check If the resolution of A/D is higher than 16 bit.
If it is, then the A/D is high resolution. */
if(ADRes > 16)
HighResAD = TRUE;
/* set up the screen */
ClearScreen();
printf ("Generating IK1...\n");
printf ("Press any key to quit.\n\n");
/* get the A/D channel to sample */
printf ("Enter the channel to display: ");
scanf("%i", &Chan);
/* get the conductance for IK1 */
printf ("Enter the conductance for IK1: ");
scanf("%f", &GK1);
/* get the conductance for the linear current */
printf ("Enter the conductance for the linear current: ");
scanf("%f", &Glinear);
/* get the reversal potental of K+ */
printf ("Enter the reversal potential for K+ (EK): ");
scanf("%f", &EK);
printf ("\n\nThe raw data value on Channel %u is: ", Chan);
GetTextCursor (&Col, &Row);
printf ("\nThe voltage on Channel %u is:......... ", Chan);
GetTextCursor (&Col2, &Row2);
/* collect the sample from the channel until a key is pressed */
while (!kbhit())
{
/*Parameters:
BoardNum :number used by CB.CFG to describe this board
Chan :input channel number
Gain :gain for the board in BoardNum
DataValue :value collected from Chan */
if(HighResAD)
{
UDStat = cbAIn32 (BoardNum, Chan, Gain, &DataValue32, Options);
UDStat = cbToEngUnits32 (BoardNum, Gain, DataValue32, &HighResEngUnits);
ULStat = cbAOut (BoardNum, Chan, Gain, DataValue32);
MoveCursor(Col, Row);
printf ("%6u ", DataValue32);
MoveCursor(Col2, Row2);
printf ("%.5f ", HighResEngUnits);
}
else
{
UDStat = cbAIn (BoardNum, Chan, Gain, &DataValue);//read in input
UDStat = cbToEngUnits (BoardNum, Gain, DataValue, &EngUnits);//change it to voltage
EngUnits = 10*EngUnits;
current_IK1 = GK1*((10.0*EngUnits)-EK)/(1+exp(0.0896*((10.0*EngUnits)-EK)));//calculate current IK1
current_IK1 = current_IK1 + ((Glinear/20)*((10.0*EngUnits)-EK));//add a linear component to IK1
ULStat = cbFromEngUnits(BoardNum, Gain, current_IK1, &DataValue);//change current to output count
ULStat = cbAOut (BoardNum, Chan, Gain, DataValue);//send to output
MoveCursor(Col, Row);
printf ("%6u ", DataValue);
MoveCursor(Col2, Row2);
printf ("%.2f %.2f ", EngUnits, current_IK1);
}
}
}
/***************************************************************************
*
* Name: ClearScreen
* Arguments: ---
* Returns: ---
*
* Clears the screen.
*
***************************************************************************/
#define BIOS_VIDEO 0x10
void
ClearScreen (void)
{
COORD coordOrg = {0, 0};
DWORD dwWritten = 0;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE != hConsole)
FillConsoleOutputCharacter(hConsole, ' ', 80 * 50, coordOrg, &dwWritten);
MoveCursor(0, 0);
return;
}
/***************************************************************************
*
* Name: GetTextCursor
* Arguments: x,y - screen coordinates of new cursor position
* Returns: *x and *y
*
* Returns the current (text) cursor position.
*
***************************************************************************/
void
GetTextCursor (int *x, int *y)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
*x = -1;
*y = -1;
if (INVALID_HANDLE_VALUE != hConsole)
{
GetConsoleScreenBufferInfo(hConsole, &csbi);
*x = csbi.dwCursorPosition.X;
*y = csbi.dwCursorPosition.Y;
}
return;
}
/***************************************************************************
*
* Name: MoveCursor
* Arguments: x,y - screen coordinates of new cursor position
* Returns: ---
*
* Positions the cursor on screen.
*
***************************************************************************/
void
MoveCursor (int x, int y)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE != hConsole)
{
COORD coordCursor;
coordCursor.X = (short)x;
coordCursor.Y = (short)y;
SetConsoleCursorPosition(hConsole, coordCursor);
}
return;
}
Magnitude of IK1,synthetic
The same magnitude of IK1 was used for all experiments. This makes for simplicity in application and aspects such as quickly distinguishing between atrial and ventricular cells. However, it has been shown in humans and in animal models that atrial and ventricular IK1 channels differ in channel properties and molecular correlates. For many studies, the equation can be optimized for cell specificity. The form of the equation can be given algebraically as:
IK 1=G1¿
The total size of the current is generally changed by the analog trim pot and the G1 and G2 change the respective sizes of the rectifying and linear components.
Changing the G1:G2 ratio changes the negative slope region and the total outward current able to be passed at positive potentials. The K1 parameter is very sensitive and can be used to independently adjust the negative slope region of IK1. Based on the data in human cells from Koumi et al.1 the following adjustments could be made:
In general, atrial cells have a smaller overall current density than ventricular cells and a larger component of outward potentials and a more shallow negative slope region than the equation values used.
In contrast, ventricular cells have a larger overall current density than atrial cells (in the inward direction) and a smaller relative component of outward potentials and a more steep negative slope region than the equation values used.
Supplementary References
1. Koumi S, Backer CL, Arentzen CE. Characterization of inwardly rectifying K+ channel in human cardiac myocytes. Alterations in channel behavior in myocytes isolated from patients with idiopathic dilated cardiomyopathy. Circulation Jul 15 1995;92:164-174.